ソフトウェアエンジニアリングへの幻滅
ネットでこの記事を見かけて、ソフトウェアエンジニアなら誰もが一度は読むべきだと思った。一部の主張はやや過激すぎるきらいがあるものの、概ね僕も同意している。
為什麼軟體那麼「慢」?
冒頭で著者は、自動車や飛行機、建築といった分野は今日まで発展し、すでに一定のパターンが確立されていると述べている。飛行機の翼や形状のデザイン、機能などはほぼ大同小異であり、その発展の成果は誰もが認めるところだ。
僕も最近、なぜこれらの分野ではうまくいくのに、ソフトウェア開発では状況がますます悪化しているように思えるのかを考えていた。MacBook ProやiMacで npm install を実行するたびにファンが全開で回る音が聞こえ、Web開発はまるで基礎がグラグラな砂の城の上に構築されているかのようだ。フロントエンドで使えるフレームワークや状態管理ツールは、すでに数え切れないほど乱立している。
だが、ソフトウェア開発を飛行機などの例と比較するのは少しアンフェアかもしれない。飛行機(旅客機の場合)は、乗客を迅速かつ安全にA地点からB地点へ運ぶことを目的に設計されている。家は人々に頑丈で耐久性のあるシェルターを提供するためにある。どちらも極めて明確な目的があり、時代の変化によって目的が大きく変わることもあまりない。
しかしソフトウェアではどうだろうか?イテレーションが速いため、それだけ多くの可能性が生まれる。Webページの当初の目的は単に情報を閲覧することだったかもしれないが、今では動画を見たり、音楽を聴いたり、近況を投稿したり、画像をアップロードしたり、ゲームをプレイしたりと、ほぼ何でもありだ。ハードウェアの進化とテクノロジーの進歩によって、僕らはブラウザひとつで多種多様なことができるようになった。
また、JavaScriptの原罪とも言うべきものもあるだろう。極めて短い期間で作られたプログラミング言語が、今や世界で最も人気のある言語へと発展したのだから、おそらく生みの親自身も予想していなかったに違いない。
Javaを引き合いに出してJavaScriptを皮肉るのは、少々アンフェアだと僕は思う。Javaには独自のVM、ランタイム、JDKなどがある。一方、Web開発において僕らは百花繚乱のブラウザに依存せざるを得ず、だからこそBabelやWebpackといったツールの出現につながったのだ。
この視点から見ると、「ハードウェアは速くなったのに、ソフトウェアは遅くなった」と一概に言い切ることもできないように思える。まさか20年前にブラウザ単体でこれほど多くのことができたとでも言うのだろうか?20年前のソフトウェアと現在のソフトウェアの機能性や複雑さは同じだと言うのだろうか?
コンピュータのユーザーとして、僕らにはまだ極限までシンプル化されたソフトウェアが必要なのかもしれない。ユーザーが必要なときにいつでも、機能が削ぎ落とされたブラウザ(履歴やダウンロード、devtoolなどがないもの)を使えるようにするために。
著者はまた、現代のWebページが信じられないほど肥大化していることにも不満を漏らしている。Gmailですらスムーズにスクロールできず、Slackアプリはもはやリソースモンスターだと。この点については僕自身も少し気になっていて、なぜこれほどリソースを消費するのだろうか。裏でElectronが使われていることは知っているが、なぜElectronを使うとここまでリソース消費が激しくなってしまうのか?
僕自身は、ElectronがGUIにもたらした可能性に対して前向きな姿勢を持っている。Electronがリソースを食いすぎると文句を言う人も多いし、それは今後改善されるべき点だと思うが、SlackやVS Codeを見れば、Electronを用いた非常に成功した事例であることは確かだ。
著者はさらに不満を続け、テキストエディタに言及する。42年前に開発されたEmacsのテキスト入力レイテンシのほうが現代のテキストエディタよりも小さく、3Dゲームが16ms以内に何百万ものポリゴンをレンダリングできるというのに、なぜ単純なテキスト編集でそれができないのか、と。
現在使っているラップトップは一応MacBook Proだが、低スペックなマシンを使っているユーザーも大勢いるはずだ。自分が高性能な環境を使っているからといって、全ユーザーも同じだなどと楽観的に思い込むべきではないし、ユーザーが低スペックなデバイスを使っていることを責めるなどもってのほかだ。これは疑いようがなく、SlackやVS Codeが占有するリソースを見て、僕自身も驚いた。
著者が挙げたもうひとつの問題、We’re stuck with itについて、僕は非常に共感している。どう実装されているかをあまり気にしないエンジニアが増えている。遅い?構わない、ビジネス要件は満たした。仕組みが分からない?構わない、ライブラリを適当に当てはめればいい。こうした場当たり的でいい加減な姿勢は、プロのエンジニアが持つべきものではない。それはエンジニアリングではなく、ただの怠慢だ。
最近、このことをますます痛感している。確かに今はツールが十分に揃っており、半端な理解でもそれなりのプロダクト(Webサイト)を作れてしまう。しかし、細部へのこだわりや原理に対して、ますます探求しなくなっていると言える。これは僕にとって好ましい兆候ではないため、常に背後にある仕組みを理解するよう自分を戒めている。多くの場合はそれほど難しくない(OSは本当に難しいけれど QQ)。
今年はしっかり基礎に立ち返るつもりだ。プログラミング分野における三大ロマン「OS、コンパイラ、グラフィックス」。グラフィックスに関しては2017年にWebGLを学んだ際すでに痛めつけられたので、残る2つの領域であるOSとコンパイラが、おそらく今年最大の課題になるだろう。
関連記事
- エンジニアの面接にどう備えるか テック業界の面接対策はいつだって骨の折れるものだ。面接で最も人を落胆させるのは、権力関係が極めて一方通行になりがちな点にある。応募者の立場では相手の本当の基準を読み取るのは難しく、面接が終わった後は自分を疑ってしまいがちだ。今回はそのあたりについて話してみよう。
- 人生観を変えた言葉 ファインマン、チャップリン、そして映画『ひゃくえむ。』。劣等感を抱えていた少年から誰かを助けられるようになるまで、僕に最も深い影響を与えた思考と生き方についての共有。
- 独立したウェブサイトを持つN個のメリット ショート動画やSNSが全盛のこの時代に、なぜわざわざ時間をかけて自分のブログを運営するのか?約10年間ブログを書き続けてきた僕の考えを共有する。
- 筋トレ(ウエイトトレーニング)の記録と感想 ここ最近の筋トレの振り返りと感想をシェアする。