この前、とあるプログラマではない人に「プログラムが書けると何ができるようになる?」と聞かれた。

その時は、やろうと思えばなんでもできる答えたが、その後ちょっと考えて、但し無限の時間と無限の計算機資源があればと付け加えた。

チューリング完全な言語を使いノイマン型コンピュータに命令させれば、停止するコードが書ければどんな計算だってさせることができる。しかし、現実的には有限のコンピュータリソースに、有限のストレージに、有限のネットワーク帯域しかない。その制約の中で、現在あるところの技術を組み合わせることで、 実際に に何かを「できる」ようにする、というのはエンジニアリングの本質だと思うし、その中でいかに性能が出て保守性が高いコードを書くかというのが、ソフトウエアエンジニアの腕の見せ所だと思う。

(ソフトウエアに限った話ではないとは思うが)ソフトウェアエンジニアの仕事は泥臭く、制約が多い窮屈な中でコードを書かなければならないと感じる。それは僕らが実現しようとしていることが、今この世界の複雑さに影響を受けながら、現実の今ここにある問題を解こうとしていることの証左だと思う。

なのでそれは受け入れるべき制約だとは思うが、その窮屈さに毎日触れているといやになってくるかもしれない。そんな時は、この現実に存在するある制約が外れたときにどんなことが「できる」ようになるのか考えると楽しい。

今の100倍core数が増える、ネットワークが100倍早くなる、メモリが100倍に増える。もしくはCPUが現在の1/100のコストになる。そんなようなことが起こった未来では僕らはどんな言語でプログラミングしているのか。どんなシステムアーキテクチャを採用してサービスを運営しているのか。などを想像してみると、次にどんなコードを書くべきかアイディアが湧いたり、モチベーションが出てきたりするかもしれない。

少なくとも自分はそんな気がする。