見出し画像

遅いコンピューターがほしい!

某月某日

とあるプロジェクトでクライアントのチームが書いたコードをレビューしていたら、forループの中にDBへのアクセスが複数書いてあったので気になって実行速度を計測してみてくださいと依頼した。

昨年からやっているプロジェクトではこのチームを教育することも僕が担当しているので、いつもはゆるい僕が少し厳し目に見ているチームなのである。

修正前と修正後で実行速度はそれほど変わりませんでした、という報告が来て、どうやらそのエンジニアはそこをそれほど問題視していないようだった。

現代のコンピューターはとにかく速い。速すぎる!とさえこの老兵には思えてしまう。
CPUも速いがハードディスクがSSDになってしまったことでディスクアクセスがとにかく速く、データベースもありえない速度でデータをディスクから読み出して結果を返してくるようになった。
これだと自分のプログラムが遅いのか速いのか、若いエンジニアが気づく機会がないのだろうなと今回の件で思った。

ちょうどそのチームのエンジニア全員と週1回やっているZoom会議があったので、そこで、
forループのなかにDBアクセスが書いてあるとなぜおじさんエンジニアは心配になるのか?
をゆっくり時間をとって説明した。

昔はディスクアクセスが遅く、DBアクセスというのは時間のかかる処理だったこと。
今我々がasync/awaitで書いているところのawaitの意味はWait。昔であれば本当に待ちだった。
いまはawait関数やクロージャーのコールバックは瞬時に返ってくるが、もともと長い処理をうまく処理するための仕組みであり、
awaitがあるところは気をつけて、それがループの中にあったらそのループは何回ぐらいループするのかを常に頭に思い浮かべてからコードを書いてください、と説明した。

もう一度その箇所のコードを一緒にレビューしたら、ループをせずに、1つのDBクエリのなかで条件を変えれば一度にクエリできそうなものだったので、そうすることを提案した。
もちろんシンプルな条件で1件のデータをクエリするほうが速いが、
プログラムをループさせて複数件を読み出すよりもデータベースマネージメントソフトウェアが複数件を読み出す処理のほうがアルゴリズムもコードも最適化されていて速いということを説明した。

どれだけ速くなるのか、遅くなるのか、現代のコンピュータが速すぎて実演できないのが歯がゆいおじさんエンジニアであった。

AWSに、1990年代のコンピュータレベルのマシーンイメージがあったらいいのにな。

続く


この記事が気に入ったらサポートをしてみませんか?