はてなキーワード: 関数型言語とは
新卒一括採用は、総合職として採用されることが多いため、特殊な専門を持つ人材では、以下の問題をかかえている。
そんな時、稀なケースではあるが、キャリア採用の枠を新卒で受ける道を検討してみるのも良いかもしれない。
ぼく自身、そのルートで現在の会社に入社して、そこそこ幸せにやってる。やりがいと、給与面や余暇のバランスがとれたいい塩梅の仕事で、結果的にふつうに就活するよりは良かったなと感じた。
なので「レアケース」な就活の一例として、似たような境遇の誰かのために、ぼくがたどってきた変な道のりを記しておく。
ぼくはこれまで、バイオインフォマティックスという分野で研究を続けてきた。
Bioinformaticsの字のごとく、情報と生命系の融合分野である。そこで学んだことはたくさんあるけど、ニッチだ。例えばヒトの遺伝子情報ってFastqっていう謎の拡張子で表現されて、数Gバイトのテキストで収まる、とか。
学部時代は、研究室でヘルスケア系のデータ分析のアルバイトをしていた。そこでデータサイエンスの基礎は築けていたと思う。
あとは、Erlangという関数型言語で分散処理のフレームワークを作るベンチャーでのアルバイト経験もあったっけな。これは、マチアプで知り合った女の子が留学したいというので、留学経験のある先輩Aに会わせたところ、その友人Bを介して紹介されたという不思議な縁だった。
恋は実らなかったけれど、面白い巡り合わせだった。ちなみに、その言語はもう全く書けない、、
学歴としては、W大学を卒業後、某国立大学の修士課程を修了している。
就職活動では、競技プログラミングで水色にぎり届かないくらいの緑になったり、応用情報技術者試験を取得したりと、武器は整えたつもりだった。
しかし、「就活はお見合いだ」という本質を見落としていたためか、正直なところ最初は苦戦した。
データサイエンティストやエンジニアとして就活を進めてみる。技術の質問に答えても、生物系の研究を話すと「さすがにもっと違うところあるんじゃない?」と面接官から遠慮されてしまい、ことごとく有名な企業とはマッチしなかった。
一方で製薬系の企業に行くと、エンジニア的な部分がどうも仕事内容とマッチしなかった。バイオの知識はある程度あったが、研究は薬に直接関連しているようなものではなかったし。
つまり、中途半端にどちらもできてしまうが故に、どちらからもフラれるという悲しい状況に陥ってしまったのだ。
「じゃあ、両方必要としているところがあればいいじゃないか」——そう考え、会社ではなく「仕事内容」で探し始めた。LinkedInで、自分の研究分野に関係がありそうなキーワードを片っ端から打ち込んで検索する日々。
すると、とある会社でSNP(一塩基多型)に関連したプロジェクトの募集を見つけた。大学院卒以上が条件で、求められるスキルはアルバイトや研究でほぼ身につけていたため、「これはいけるかも?」と直感。かなり興味があったので、フラれることを前提にダメ元でアタックしてみることに。
コーディングテストはなんとかクリア。一次面接を経て、あとは通常とは異なる採用経路だったり、面接が英語だったりして大変だったが、気がついたら内定を掴むことができた。
そのプロジェクトにアサインされ、半年ほど業務に携わった後、取引先の内部でのイザコザに巻き込まれて、プロジェクトはなんと消滅してしまった。そのために会社を選んだのにもかかわらず!笑
コロナ禍だったし、ひとりぼっちの在宅勤務で「俺は……クビか?」と強い不安に襲われて、ベッドでうなされていたっけ。
ぼくは別のプロジェクトにアサインされることになった。それは、「強化学習を使った推薦アルゴリズム」のチーム。学んだことがない領域だったけど、いいことも沢山あった。
新卒でほぼ一人でプロジェクトを抱えていたピン芸人みたいだった時期と比べ、指導してくれるテックリードもいたし、社内ではそのプロジェクトの重要度が高かった。それは本当によかった。いい位置にいれている、ということのよさを、ぼくは数年働いたうちに何度も痛感したから。
その後、メンターをはじめとする様々な人が入れ替わったが、結局その分野の仕事に約5年間携わることになった。
もう、バイオインフォマティックスを研究としてやっていた期間とほぼ同じくらいの長さだ。この分野に転向してからも、小さな論文をなんとか書くことができ、キャリア的にはもうそちらが専門になってしまった。
全く後悔がないと言えば嘘になるが、人生とはそんなものだろうと割り切っているつもりだ。学生時代の専門をそのまま続けている人など、ごく稀だろう。半分くらいは専門が繋がっているのだから、きっとまだ幸せなのだろう、と自分に言い聞かせている。
自分がいきたい方向に突き進むんじゃなくて、風にまかせてみるのも、また人生の選択のひとつなのかもしれない。乗っていくうちに、風に乗るのが好きになっていくこともある。
今振り返ると、ぼくが応募した年にしか、その部署でバイオ関連の募集はなかった。一年遅くても、早くてもだめ。巡り合わせがよかった。
そんな幸運を掴めたのも、思い切ってLinkedInの募集を眺めてみる、という蛮行を起こせたからだと思う。
だからこそ、ニッチな専門性を持つ人には、一般的な新卒としての就職活動に加えて、思い切って「ヘンな就活」をしてみるのも良いのかもしれない、と伝えたい。
JavaもAtCoderもCCNAもLPICも基本情報も別にレガシーではないだろ。ただの基礎で全部現役
レガシーってのはもう使われていないものをいう。このへんをレガシーって言うのはモダンな技術の理解もあやふやなんじゃないか。逆にモダンな技術がどう動いてると思ってんだ
元増田が就活で弱いのは即戦力スキルが欠けてるからで、基礎そこそこありますって言われても即戦力部分を教えるのは高コストでビジネススキルゼロで高リスクだから忌避する。基礎スキルは普通に重要
Javaわかれば関数型言語もいけるしスクリプト系の言語もいけるし低レイヤーにもピボットできる。デザインパターンやInterfaceの学習もJavaなら容易。AtCoder緑なら基本のデータ構造とアルゴリズムはわかっててコードリーディングも速い。データベースの理解も速いだろう。データベースはB木の応用だからな。LPIC持ってりゃDockerの理解は一瞬だろう。CCNA持ってるならAWSでVPC構築できる。元増田が欠けてるのはこのへんの応用全般とIT系ビジネスの流れ全部。勉強のルート自体は表層的ではないので正しい。むしろ基礎が欠けてる奴があまりにも多すぎる。
自分が面接官なら元増田は正直にスキル不足と言って落とすが、少なくとも平均以上に学習しているという労力は買う。実務経験1年でそこらへんのジュニアは抜くだろうからな。ただその1年の教育を自分のチームで請け負いたくはないので落とす。
ChatGPT 4o
この文章の主張は、「バグを減らすために for 文を避け、map や filter を使うべきだ」というものだが、これは一面的な見方とも言える。
確かに、関数型プログラミングの恩恵を受ける場面は多く、副作用を減らし、データの不変性を維持することでバグを減らせる。しかし、for 文が全て悪いわけではなく、状況によっては適切な選択肢になる場合もある。
また、「How だとか What だとかどうでもいい」という主張には疑問が残る。アーキテクチャや設計方針を軽視しすぎると、長期的な保守性や拡張性に問題が生じる可能性があるため、バランスが重要だ。
Claude3.0
総括:
この記事は実践的な観点から重要な指摘をしていますが、やや極端な主張も含んでいます。プログラミングパラダイムや技術の選択は、以下の要素を総合的に判断して行うべきです:
Gemini 2.0
for文よりもmapやfilterなどの高階関数を使う方がバグが減るという記事の主張には概ね賛成です。ただし、for文が完全に不要というわけではなく、オブジェクト指向でもカプセル化を用いてデータの書き換えを制御できます。TypeScriptは型のチェックだけでなく、Classを用いたオブジェクト指向プログラミングも可能です。
3AIにだいたい共通している主張
・関数型言語の目的の一つにバグを減らすというものがあるというのは同意
・letを使わない(厳密には副作用の排除)はバグを減らす効果がある
・悪いのはfor文ではなく副作用だが、可変な変数が必ずしも悪いとは限らない
・TypeScriptの型チェックを使うとバグが減る
業務システムずっとやっているが、静的型信者が言うような型違いを代入してしまうバグや、関数型信者が言うような変数再代入によるバグってあんまり頻繁に出会った記憶がないんだよな。
ちなみに動的型言語も静的型言語も両方実プロジェクトで経験ある(その中間的なキャストだらけのC言語とかも)。
関数型言語は実務では経験なくて、JSやTSに宣言的な書き方が増えてきたのを見てきた程度。
それよりも昔はメモリリークに悩まされたし、昔も今もロジックの間違いやレアな業務の考慮漏れがバグのほとんどという実感がある。
で、それらを防ぐために、シンプルでロジックを追いやすくIDEのデバッガで確認しやすいコーディングスタイルが推奨されるようになる。
そうなると式よりも文が扱いやすく、mapよりもforだし、三項演算子よりもif文だし、メソッドチェーンのようなのもあまり使わなくなる。
静的型の人は、レアな業務が考慮漏れされないように代数データ型として業務を定義しろって言うだろうけど、それはもう全部型ワールドで設計し直すことになるので導入コストが高すぎる。
真面目に議論するなら、お好み焼きをクラスとするかも怪しくなる。
オフトピだがね。
オブジェクト指向が栄華を極めたあの時代、責任、関心、主体性、凝集、アイデンティティ、is-a has-a、… 研究者やギーク、仙人らによって、あらゆる説明がされたが、結局、オブジェクト指向は現実世界を捉える人間の感覚の応用でしかなかった。
「モノ」と思える奴をクラスにすればいい。
それ以上でも以下でもなく、あとはプログラミングの構造を整理するために有効に使えるケース・バイ・ケースの妥協点を探すことになる。どうモデリングすべきかの議論は収穫が少ない。いや、極めれば霧の向こうで信じがたい洞察を垣間見れる可能性はあるにはあるが…、しかし多人数でソフトウェアを維持管理するのが正解だと分かった今、属人性を排除するためには霊感を説明するよりシンプルに留めるのがベスト・プラクティスだ。
プログラマーの関心が関数型に移ったのは、そういう経緯もある。数学をバックグラウンドに持つ関数型言語をバックグラウンドにする方が、ミーハーな技術屋連中の興味を引けた。
別に関数型言語だろうがオブジェクト指向言語だろうが業務によって使い分けるけど
普通に考えると型付けの関数型ならバグが少なくなりそうなのに実際には全くそんなこと無い
観察したことがある感じだとオブジェクト指向的に状態を整理するようなことが苦手で
それが嫌でオブジェクト指向から逃げて関数型を主張してくるので
例えば商品として服と靴があったとして、カートに入れたら服は税込みなのに靴は税抜きになってたりする
ちなみにオブジェクト指向をやたら主張してくるやつはバグは少ないけど開発がめちゃくちゃ遅い
俺の考えた最強のデータ構造を模索し続けるし他人にもそれを求めるのでめちゃくちゃ面倒くさい
服と靴を買うだけのサイトなのに「靴磨きのサービスを追加する場合は?」みたいなことを考え始める
何事もほどほどがいいと思う
コーンフレークじゃなくて、Haskellだとして、全体のネタを書き直してくださいっていう指示した結果
ボケ&ツッコミ「お願いしますー ありがとうございますー」
ツッコミ「あー ありがとうございますー ねっ 今Githubでスターをいただきましたけどもね」
ボケ&ツッコミ「ありがとうございますー」
ツッコミ「ねー 有り難いですよ ほんとにね」
ボケ「入れておきましょう」
ボケ「いきなりですけどね うちのオカンがね 好きなプログラミング言語があるらしいんやけど」
ツッコミ「プログラミング言語の名前忘れてもうて どうなってんねそれ」
ツッコミ「分からへんの? いや ほな俺がね おかんの好きなプログラミング言語 ちょっと一緒に考えてあげるから どんな特徴ゆうてたかってのを教えてみてよ」
ボケ「あのー関数型言語で、型システムが強力で、遅延評価するやつやって言うねんな」
ツッコミ「おー Haskellやないかい その特徴はもう完全にHaskellやがな」
ツッコミ「すぐ分かったやん こんなんもー」
ツッコミ「いやそうやろ?」
ボケ「オカンが言うには 将来の夢はそれで書かれたOSを使うことやって言うねんな」
ツッコミ「あー ほなHaskellと違うかぁ Haskell製のOSなんてまだ無いもんね」
ボケ「そやねん」
ツッコミ「HaskellはOSを作るのには向いてへんからなぁ」
ボケ「そやねんな」
ツッコミ「な? Haskell側もOS開発に任命されたら荷が重いよあれ」
ボケ「そやねんそやねん」
ツッコミ「Haskellってそういうもんやから ほなHaskellちゃうがなこれ」
ボケ「そやねん」
ツッコミ「あれほなもう一度詳しく教えてくれる?」
ツッコミ「Haskellやないかい モナドは確かに難しいねんHaskellの でも俺はね あれはHaskellの良いところやと思うねん 俺の目は騙されへんよ 俺騙したら大したもんや」
ボケ「まあねー」
ツッコミ「ほんであれよー いざ使ってみたらね モナドのおかげでコードがスッキリするねん 俺は何でもお見通しやねんから Haskellのモナドなんて」
ツッコミ「そうやろ」
ボケ「オカンが言うには プロダクションで使うにはまだ早いって言うねんな」
ツッコミ「ほなHaskellちゃうやないかい プロダクションでHaskell使ったら 上司がひっくり返すもんね Haskellはねー まだ研究段階やから実務では使いにくいねん」
ボケ「そやねんそやねん」
ツッコミ「な? Haskell使ってみたらだんだん罠が見えてくるから 最後ちょっとだけ避けてまうねんあれ」
ボケ「そやねんそやねん」
ボケ「そやねんな」
ツッコミ「Haskellちゃうがな ほな もうちょっとなんか言ってなかった?」
ボケ「学生の頃 なんでみんな憧れるんか分からんかったらしいねん」
ツッコミ「Haskellやないかい 学生の頃はHaskellとOCamlとLispに憧れるんやから あとSmalltalkも憧れたな Haskellそんなもんよ」
ツッコミ「そうやろ」
ボケ「オカンが言うには 関数型プログラミングの教科書に必ず載ってるっていうねん」
ツッコミ「ほなHaskellやないかい 教科書のサンプルコードにHaskellのコードが出てこんわけないやん」
ツッコミ「Haskellはね 関数型プログラミングの王道中の王道やねん」
ツッコミ「Haskellや絶対 ほな ほなもうちょっとなんかゆうてなかったか?」
ツッコミ「Haskellやないかい Yesodとかあるやろ な? RubyとかPythonの次はHaskellが来るって言われてるねん 俺はそう思うよマジで Haskellや絶対」
ツッコミ「そうやて」
ボケ「オカンが言うには ジャンルでいうたら数学やっていうねん」
ツッコミ「ほなHaskellやないかい ジャンルで数学言うたらHaskellしかあらへんやん な? Haskellは数学の理論がベースになってるんやで ラムダ計算とか圏論とかな」
ボケ「そやねんそやねん」
ツッコミ「ほなHaskellに決まりやないかい ほなもうちょっとなんかゆうてなかった?」
ツッコミ「Haskellやないかい Haskellは変数が不変やから 変数に感謝するのは当然やねん ね? 状態変更せんと安心して使えるからな」
ボケ「そやねんそやねん」
ツッコミ「Javaとかの変数は裏切るからアカンねん Haskellの変数は一生そばにおってくれるから最高やで」
ボケ「でも分かれへんねん」
ツッコミ「分からへんことない おかんの好きなプログラミング言語はHaskell もぉ」
ボケ「でもオカンが言うには Haskellではないって言うねん」
ツッコミ「ほなHaskellちゃうやないかい オカンがHaskellではないと言うんやから Haskellちゃうがな」
ボケ「そやねん」
ツッコミ「先ゆえよ 俺がラムダ計算の説明してる時どう思っててんお前」
ツッコミ「ホンマに分からへんがなこれ どうなってんねんもう」
ボケ「んでオトンが言うにはな」
ツッコミ「オトン?」
最近コンピューターサイエンスがプログラマーに必要か否かみたいな話が上がっているが、そもそもコンピューターサイエンスって何だよ。どこまでの範囲をさしてんの?
ググって出てきた情報を整理しただけなので詳しい人、補足・訂正よろしく!
https://www.acm.org/binaries/content/assets/education/cs2013_web_final.pdf
CS2013はACM/IEEE-CSによるカリキュラム標準。
ACM(計算機協会)はコンピュータ分野全般の国際学会、IEEE-CSはIEEE(米国電気電子学会)の中にあるテクニカルソサエティ。
https://www.ipsj.or.jp/12kyoiku/J07/20090407/J07_Report-200902/4/J07-CS_report-20090120.pdf
J07-CSは一般社団法人情報処理学会がCC2001CSをベースにアレンジを加えたカリキュラム標準。今はCS2013を反映したJ17-CSがあるらしいけどその辺は良く分からん。
https://www.ipa.go.jp/files/000024060.pdf
J07ーCSから抜粋。CS2013と比較するとナレッジエリアがあったり無かったり。