【まさに神業】卓越したプログラマーが預言者である理由3選
30年以上プログラミングをしている、ムンペイです。
自分の経験を文字に残しておこうと思いnoteをしたためています。
サムライアプスというサークル活動もしています。
さて、私の好きな名言があります。
これはまさに卓越したプログラマーが行っていることだと思います。
どうしてそうなのか、深掘りしてみます。
1.どこまでできるかわかっている
卓越したプログラマーは、使うハードウェアでどれくらいのことができるかわかっています。
このCPUで、このメモリの容量と速度で、このストレージの速度で、このネットワークで、このグラフィック能力で、このI/O性能で・・・。
これならば、このくらいのことを実現できるはずだと高い精度で予測がつくのです。
たとえば、あるプロジェクトで高性能な画像処理アルゴリズムを実装する必要がありました。その際、CPUはできるだけ演算処理に割り当てるために、メモリコピーはDMA(Direct Memory Access)で並列実行しました。
場合によっては、ハードウェア選定へのアドバイスや、性能上のカベ(ボトルネック)を解消するための新しいハードウェア設計にコメントすることさえあるでしょう。
背景には、コンピューターアーキテクチャへの深い造詣があります。
2.どうすればできるかわかっている
卓越したプログラマーは、予定している機能や性能を、どういうプログラムを書けば達成できるかわかっています。
たとえば、計算が1マイクロ秒あたり何回といった性能要件が重要ない場合、C++言語を使い、よく使うデータはキャッシュに残してメモリアクセスを減らしつつ、計算はパイプライン効率を高めるためにループアンロールを何回しておけばいいだろう、と言ったことを、予め計画してからプログラミングします。
また、ウェブフロントエンドのUIを作る場合は、ネットワークのレイテンシ、APIサーバーでの処理時間を、それらのブレ幅まで考察し、ユーザーにとって快適にするには、非同期APIとして設計するのが良いだろう、どうせ時間のブレが大きいからサーバーサイドはPythonで書いても十分だろう、と言ったことを、予め計画してからプログラミングします。
これを達成するには、ハードウェアの知識に加え、複数のプログラミング言語の知識も必要です。具体的には、言語がどんな課題を解決するためのものか(言語のゴール)、その方針をどのように達成しているか(言語のコンセプト)、と言ったことです。
システム、フロントエンド、バックエンド、グラフィック、など、各分野ごとに1つ以上、そのような言語を用意できると良いでしょう。
とはいえ、どれもプログラミング言語という意味では共通点も多いです。1つの言語を深くマスターしていれば、他の言語の理解に応用が利くでしょう。
3.奇跡を起こすことができる
卓越したプログラマーは、巧妙な技を楽しみます。アルゴリズムのような数学的なものもありますし、データ構造のようなコンピュータサイエンスもあります。また、バイナリハックと呼ばれるマジックのような技もあります。このような巧妙な技を駆使して出来上がったプログラムは、奇跡のようにしか見えないでしょう。
卓越したプログラマーならもちろん、これらは予め計画に入っています。ハードウェアの性能の限界をどのように引き出すかという課題を達成するには必要なことなので当然です。
アウトプットを意識してインプットする
卓越したプログラマーは、常に勉強しています。情報に対するアンテナを広く張り、興味があることを深堀する情報、興味を広げる情報を取り入れます。
さらに、卓越したプログラマーは、それをいつか使ってやろうと思っています。こんなおもしろい技を知ったなら、今後のプログラムで使って周りに自慢しようと思っています。使ったプログラムを、見てほしいと思っています。
卓越したプログラマーは、プログラミングが大好きです。コンピュータが大好きです。ですので、卓越したプログラマーになりたい人は、まずは好きになることから始めてみるといいと思います。
プログラミングを好きになるためには、まず小さなプロジェクトの完成体験を重ねるのがおすすめです。興味のある分野で小さなアプリケーションやゲームを作成し、プログラミングのマジックを体験するといいでしょう。自然と、自分のアイデアを形にしてみたくなってきます。
では、完成体験ってどうすればいいのかって?そうですね、その話はまた別の機会に・・・。
これにて御免!