グロースハッカー目指してみる

過去の経歴を捨て、グロースハッカーを志す事にしたアラサー男子。果たして明日はあるのか!?

今更ながら「関数型」という概念に触れて戦慄を覚えている。こんなにクールな考え方があるとは。

お久しぶりです

スタート早々更新が止まって依頼、半年ぶりの更新です。 なんでこんなに間が空いてしまったのか、振り返ってみると結構謎です。 何かこれ以外のアウトプットがあったかといえばそれは(ほとんど)なく、さりとてインプットをしていたかというとそうでもない……。 いや、仕事は確かに忙しかったし、そこでたくさんのインプットとアウトプットをしてきたので、全然無駄な半年では無かったと思っていますが。

きっかけ

それはそれとして、タイトルの話です。 私、名古屋のこわい人たちとは近いような遠いような位置にいまして、「関数型プログラミング」という言葉は聞いたことはあったし、興味もあったわけです。 さりとて、Haskell勉強会に参加したりする事もなく、独学で勉強する事もなく今日まで来ていました。 私自身、「グロースハッカー」というポジションを目指していても(いるからこそ?)、データマイニングやマーケティングの勉強はしても、実装技術についてはもう今更良いかな、と考えていた節もあります。 (一応、手続き型プログラミングはできるつもりでいたので、良いかなと)

ところが先日、社内で技術陣が使っているチャットでこんな記事が流れてきていました。

※1 Qiitaですので、読むには登録が必要です ※2 内容は後日書籍化されるそうです、というかQiitaの方が書籍の冒頭を公開したものになります

副読としてはこちらもあります。

これらを読んで、私は一発で「関数型」という概念のファンになってしまいました

論理を記述するという、クールな方法

従来の、というか現在主流となっている手続型プログラミングは処理の手順を記述します。 一方で、私の理解したところでは、関数型プログラミングとは論理を記述するという方法論の様です。 劇中の登場人物「セキヤ」君も相当衝撃を受けていましたが、これには私も強い衝撃をうけました。 この二つは、明確に、概念が違うのです。

(以下は私の解釈ですが、ここが違う、ということがあればお手柔らかにお願いします(^^;)

手続型ではプログラマはベビーシッターであり翻訳家であった

手続型では、コンピュータに対して手取り足とり、何をどうすれば良いのか教えてあげます。 一つ一つ丁寧に、どこのメモリから値を取り出して、その値に何をして、どこのメモリへ格納するのか。 私は高専時代にマイコンのプログラミングもやっていましたので、その感覚が強くわかります。 コンピュータを、何の知性も持たず、人間に言われた事だけを超高速に、誤りなく実行してくれる存在として捉え(本当に誤らないかは別の問題ですが……)、人間が導いてあげるのです。まるで、赤子に対して物事を教えるがごとく。

これは副読記事の方にも言及があるように、コンピュータが文字通りただの「計算機」だった頃の延長にあります。 コンピュータのリソースは有限で、貧弱で、それを人間が職人芸でチューニングし、動かしていました。 プログラマとは翻訳家であり、自然言語マシン語へいかにうまく変えるかが、プログラマのスキルであったのだと思います。

関数型ではプログラマはコンピュータと対等な友人であり、科学者にもプロデューサーにもなれる

関数型では、コンピュータに対して手取り足とり、何をどうすれば良いのか教えてあげません(隠蔽されている内部的な実装は置いておくとして)。 足し算をしたいなら「足し算をしろ」、素数を数えたいなら「素数を数えろ」としか言いません。 それはあたかも、コンピュータを知性ある友と認め、普段同僚にするが如く「そんな感じでやっといて」とお願いしているように見えます。 もちろん、関数型の流儀に従った自然言語の翻訳は必要ですが、手続型とは雲泥の差です。

そうして、翻訳という作業が極端に軽くなることで、プログラマはより本質的な「論理」に気を配ることができるようになります。 論理とは計算ではなく、物事の成り立ちの本質です。関数型では、そこに気を配り、最適化し、より正しい論理を得ようとすることもできそうです。 論理を拠り所として新たな論理を得る。そのような行為は、元来研究者、ないしは科学者が行ってきた事であり、プログラマであっても、そこに到達できるのではないでしょうか。

さらに、別の可能性として、論理が必要になる「目的」まで思考を及ばせることもできます。 なぜこの論理を選んだのか、なぜこの論理が必要なのか、そうした事を考え出した時、その答えを得るためには「何のためにこのプロジェクトは存在しているのか」という問いに答えなけばなりません。 「何のために」「誰のために」「なぜ」、こうした思考はプロデューサーのそれでしょう。

もちろん純粋に、関数型プログラミング言語を用いて極めて高い生産性を発揮する、という超プログラマになる事も可能です。

それで私はどうしたいのか

一言。Haskellやろうと思います。 将来的には関数型の思考でデータマイニングができれば、ベストでしょうが、まあ実際のところ実用的にはいかほどのものか、やってみないとわかりませんし。

まとめ

今日はあまりに強い衝撃を受けたため、筆を取らざるを得ませんでした。 関数型プログラミングは、これまでとは発想法が違います。 コンピュータはもはや手取り足取り導いてあげるべき存在ではなく、もっと概念のレベルで対話が可能になっていたのです。 SF作品などでよくある「 AIがプログラムを自動生成する」シチュエーションは、関数型なら比較的早く実現できるのかもしれません。

個人的には、これまでプログラミングをやったことがない、すでに挫折してしまった、という人ほど関数型に向いているのではと思います。

この概念と出会い、理解するのがあと5年早ければ、僕は人生の着地点を今と違えていたかもしれません。

蛇足

こんなパラダイムが30年も前からあるというのに、フローチャートを可視化し、繋ぎ合わせて作っていくモデルベースを採用した業界があるらしい。 (追記)もっともあちらは組み込み系故、いつまでもギリギリのリソースでの開発を強いられる訳で、致し方ない面もあるとは思いますが。