
はてなキーワード:関数型言語とは
・受験を控えたN高2年
・小1でPCを親から授かるというとてつもない恵まれた環境に育つも
・四次元幾何学にはまったくせに多胞体を一つも発見できなかった、エキゾチック球面の存在も証明できなかった
・巨大数論にはまった癖にローダー数とバシク行列システムの定義を解き明かせなかった
・遺伝的プログラミングと古典的画像処理ベースでDQNを上回る強化学習モデルを発見できなかった
・それどころかプログラムを作るプログラムすら作れなかった(理論上今のAIとはまた違う形で必ずできると信じていた)
・こんな馬鹿げたことばかりやっていたせいで小学生時代まともにプロダクトを世に出せなかった
・数学もITも無理だと悟ってからSCPに逃げ4年も費やすも結局共著の一つしか記事を残せない
・SCPの派生コミュの管理委託をほっぽいて逃げたせいで初代/3代目管理者に迷惑どころではない孤独感や罪悪感、遺恨を植え付ける
・許してもらえたのに結局彼の夢を壊すことを言ってしまい今度こそ縁が切れ彼を鬱にする(今でさえ創作にトラウマを抱えているらしい)
・その後自動作曲の研究にどハマりし、某SunoAIの元ネタ(の一部)の論文共著に参加するが、貢献度が低かったのも相まってカンファレンスに登壇できなかったしポトフォにも書ける立場にならなかった
・その後Xenharmonic・現代音楽の研究にどハマりしDeflate圧縮率の標準偏差やコルモゴロフ複雑性の概念を使い「良いメロディを定量的に計る単位」を考案するが真面目に研究せず興味を失ったため論文にできない
・なんだかんだ今でさえ単著論文を一つも書けていない(無能なラン先輩でさえ11歳で原子論文書いて大学院にお呼ばれされたのに!)
・なんだかんだ今でさえ大学数学コンプできていない(圏論と逆数学が難しい)
・世界史替え歌MADを作っていたことがあるが制作者側のコミュニティで問題を起こし動画全消しして逃げた
・↑の自動プログラミングをなんだかんだ諦められなかったので競プロでテストをしようとしてBANされた
・フリーランスとして仕事をするが、何度も依頼の納期を伸ばして怒られた
・親を殴った
・その借金を返す目的で稼いだバイト代を株を自動化しようとして溶かした
・弟にネットでガイジと呼ばれ晒されたことがある(今は仲は良好)
・これら全ての過ちを重ねた今でさえSNSというレッドオーシャンでうまくやることができていない(アクティブユーザーが数ヶ月単位で何度も3桁と1桁を行き来する、私のガイジムーブが露呈しMisskeyで炎上する)
新卒一括採用は、総合職として採用されることが多いため、特殊な専門を持つ人材では、以下の問題をかかえている。
そんな時、稀なケースではあるが、キャリア採用の枠を新卒で受ける道を検討してみるのも良いかもしれない。
ぼく自身、そのルートで現在の会社に入社して、そこそこ幸せにやってる。やりがいと、給与面や余暇のバランスがとれたいい塩梅の仕事で、結果的にふつうに就活するよりは良かったなと感じた。
なので「レアケース」な就活の一例として、似たような境遇の誰かのために、ぼくがたどってきた変な道のりを記しておく。
ぼくはこれまで、バイオインフォマティックスという分野で研究を続けてきた。
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
総括:
この記事は実践的な観点から重要な指摘をしていますが、やや極端な主張も含んでいます。プログラミングパラダイムや技術の選択は、以下の要素を総合的に判断して行うべきです:
Gemini2.0
for文よりもmapやfilterなどの高階関数を使う方がバグが減るという記事の主張には概ね賛成です。ただし、for文が完全に不要というわけではなく、オブジェクト指向でもカプセル化を用いてデータの書き換えを制御できます。TypeScriptは型のチェックだけでなく、Classを用いたオブジェクト指向プログラミングも可能です。
3AIにだいたい共通している主張
・関数型言語の目的の一つにバグを減らすというものがあるというのは同意
・letを使わない(厳密には副作用の排除)はバグを減らす効果がある
・悪いのはfor文ではなく副作用だが、可変な変数が必ずしも悪いとは限らない
・TypeScriptの型チェックを使うとバグが減る
業務システムずっとやっているが、静的型信者が言うような型違いを代入してしまうバグや、関数型信者が言うような変数再代入によるバグってあんまり頻繁に出会った記憶がないんだよな。
ちなみに動的型言語も静的型言語も両方実プロジェクトで経験ある(その中間的なキャストだらけのC言語とかも)。
関数型言語は実務では経験なくて、JSやTSに宣言的な書き方が増えてきたのを見てきた程度。
それよりも昔はメモリリークに悩まされたし、昔も今もロジックの間違いやレアな業務の考慮漏れがバグのほとんどという実感がある。
で、それらを防ぐために、シンプルでロジックを追いやすくIDEのデバッガで確認しやすいコーディングスタイルが推奨されるようになる。
そうなると式よりも文が扱いやすく、mapよりもforだし、三項演算子よりもif文だし、メソッドチェーンのようなのもあまり使わなくなる。
静的型の人は、レアな業務が考慮漏れされないように代数データ型として業務を定義しろって言うだろうけど、それはもう全部型ワールドで設計し直すことになるので導入コストが高すぎる。
現状の言語でちょこっと今風の設計を取り入れたらバグが減りますよ、みたいな感じでは全然ない。
真面目に議論するなら、お好み焼きをクラスとするかも怪しくなる。
オフトピだがね。
オブジェクト指向が栄華を極めたあの時代、責任、関心、主体性、凝集、アイデンティティ、is-ahas-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ちゃうがな」
ボケ「そやねん」
ツッコミ「先ゆえよ 俺がラムダ計算の説明してる時どう思っててんお前」
ツッコミ「ホンマに分からへんがなこれ どうなってんねんもう」
ボケ「んでオトンが言うにはな」
ツッコミ「オトン?」