凡人は論理的思考すべし
登 大遊 (Daiyuu Nobori)さんの論理的思考の放棄というエントリが時を超えて話題になった。
これは氏の類まれな才能あってなされることで、僕を含む凡百のプログラマはこれを読んで(あるいはタイトルだけ見て内容すら読まずに)論理的思考を放棄してプログラムを書くのは危険である。
当該エントリおよび氏の過去のエントリを拝読する限りにおいて、氏が才気あふれるソフトウェア技術者であることは自明であるように思われる。氏が筑波大学に入学しソフトイーサ社を立ち上げる過程を軽妙に綴った次のエントリなどは、ユーモアに溢れ、優れた技術者は文章もうまいのかと嘆息してしまった。
また僕が普段から敬愛する素晴らしいエンジニアによる証言も氏の大きな才能を裏付けている。
ちなみに、大学1年生の時でも、登さんのコーディング能力というか速度はかなり圧倒的でした。確か、POPクライアント(だったか)をどれだけ速く実装できるか勝負をした覚えがあるのですが、登さんがCで私がJavaだったのに(ライブラリレベルで有利だったのに)、そこそこ差をつけられて敗北した記憶。
— Kota Mizushima (on a diet) (@kmizu) 2020年6月14日
天才プログラマーがトレンド入りしてて、誰やろとおもったら登さんやった。大学院の後輩で、周りにもたくさんすげー奴らがいて俺プログミングできないなーと思って仕事し始めたら案外自分できるやんってなった思い出。
— 広木 大地/ エンジニアリング組織論への招待 (@hiroki_daichi) 2020年6月14日
本題に入る。多くのプログラマにとって論理的思考は必要である。というか、当該エントリを拝読する限り、表現方法が異なるだけで論理的思考を放棄していないようにすら思われる。冒頭で触れたように、タイトルだけ見て中身を読んでいない人は一度最後まで当該エントリを読んで欲しい。
まず、だいたいこういうソフトウェアがあればいいなあとか、このような機能を付ける必要があるなとかいった、とても抽象的なことを思い浮かべる。この際、「絶対に論理的に考えないこと」が必要である。論理的に少しでも考えてしまうと、途中までうまくいっても、それが壊れてしまい、最初からやり直しになるので注意する。感覚的な思考でもってこれを行うのである。
次に、だいたいイメージができたところで、心の中に、ソフトウェアの設計図やデータ構造といったものを思い起こす。ここで注意するのは、「絶対に論理的に考えて設計をしないこと」である。徹底して、感覚的な思考でもって設計する。
彼がここで言っているのは抽象化である。コンピュータの論理にとらわれず、まず実社会で実現したい形を思い浮かべ、実装の細部に気をそらされることなく設計せよと主張しているように思われる。氏のエントリを拝読するに、低レイヤの理解と実装力にめっぽう強みがありそうであるから、氏が指す論理的思考とはCPU命令と一対一で紐づくアセンブリレベルの命令列、あるいは仮にもう少し高次元の想定だとしても、libcのシステムコールレベルでの論理をもって「論理的思考」とおっしゃっているのではないかと拝察する。
そも、ソフトウェアコンポーネントを高度に抽象的な概念として捉えて設計することは、僕の語彙では「論理的思考」である。表現方法が違うだけなのだ。氏は当該エントリで
ここで「論理的な思考」の定義を細かくすることはしない。そもそも、細かく定義しようとすること自体がすなわち「論理的な思考」である (論理的に、厳密に定義しないので、あなたの頭の中で、「論理的な思考」というイメージを自在に思い浮かべれば良い)。
と明言しているので、彼の考える論理的な思考と世間一般でそれと考えられている論理的な思考に乖離があったとして、何ら不思議でない。
折しも、次のようなエントリが先ごろ話題となった
曰く、プログラミング時には脳内で数学や論理を思考するときに活性化する部分ではなく、むしろ会話時と同じような部分に活性化がみられたという記事である。
これは個人的な経験にも近い。僕はプログラミングのロジックを読む・組む際に、そこに流れを意識している。このような名前のコンポーネントがあり、このようなAPIが外部に公開されているのだから、このように使われることを想定されているのだろう。このChange Setsで、これまで別のExecutorでパラレルに実行されていた処理が単一のExecutorに積まれるように変更されたということは、これは順序に意味があるということなのだろう。挙げるときりがないが、多くのプログラマはこのように処理の流れにストーリーを感じているはずだ。なので、熟練のプログラマの差分は名前、処理、コミットの単位にすら強いメッセージを感じるし、自分が何を書いているのかも理解していないプログラマの差分はレビュワーにもひどく読みづらい。もうお分かりかと思うが、この一連の流れは論理的思考そのものである。
論理は、自分たちが思いも寄らない状況に置かれた際の道しるべとなる。巨大なプロジェクトに突然放り込まれたとき、難解なバグに対峙したとき、我々はまずどこかに取っかかりをみつけ、それから論理の流れを追って二分探索してゆく。凡人は論理的思考を絶対に放棄してはならない。
最後に、僕も彼の境地にいつか達してみたいという思いはある。なかなか、頭の中で大きな設計ができた後も、
コンピュータの前に座って、キーボードの上に両手を置けば、後はあまり考える必要はない。自動的に手がキーボードを打ち、プログラムを入力して完成させてくれる。
とはいかない。どのくらい書けばここに至るのか。精進をつづけたい。