世界を動かす技術を、日本語で。

優れたエンジニアを育む要素は、優れたエンジニアリング組織を作る (2024)

概要

  • ソフトウェア開発は 科学と工学の境界 に位置する独特な分野であることを指摘。
  • ビジョンとエンジニアリング の関係は一方向ではなく、相互に影響し合う関係であることを強調。
  • 抽象化層の利用 が創造性と理解にどのような影響を与えるかを考察。
  • 組織構造 における抽象化とサイロ化の弊害を論じる。
  • 深い理解が 高品質な成果物 やイノベーションの鍵であると結論付ける。

ソフトウェア開発における科学と工学の境界

  • ソフトウェア開発者は 自らを「ソフトウェアエンジニア」と呼ぶ が、大学の学位は多くが 「コンピュータサイエンス」 である状況を指摘。
  • 科学(サイエンス)工学(エンジニアリング) は本来異なる分野であることを確認。
  • ソフトウェアは 完全に理解された計算機という人工の宇宙 の中で行われるため、工学的側面が強いように見えることを説明。
  • 物理学や生物学のような科学分野は 未知の理解を追求する のに対し、ソフトウェアは 既知の要素を組み合わせる工学的作業 であるという見解を紹介。
  • しかし実際には、ソフトウェア開発もまた 発見の連続 であることを主張。

ビジョンとエンジニアリングの相互作用

  • ソフトウェア開発においては ビジョンとエンジニアリングが双方向に影響し合う ことを強調。
  • 例として、初期の コンピュータグラフィックス におけるカラーサイクリング技法を紹介。
    • Indexed color system を本来の用途とは異なる形で活用し、 想定外のアニメーション効果 を生み出した事例を説明。
  • 深い技術理解が 新たなビジョンや発見 をもたらすことを示唆。
  • 理解と創造 が相互に作用することで、革新的な成果が生まれることを確認。

抽象化層と創造性の関係

  • ソフトウェア開発では 抽象化層(abstraction layer) の利用が一般的であることを説明。
    • 例: RDBMS、HTTPライブラリ、ゲームエンジン などの抽象化層を活用することによる効率化を確認。
  • 抽象化層を 「理解の省略記号」 として使う場合と、 「ブラックボックス」 として使う場合の違いを指摘。
    • ブラックボックス的利用は 創造性や品質の低下 を招くリスクがあることを強調。
  • 抽象化層が増えることで 量産は進むが、質や独創性は必ずしも向上しない 現象を指摘。
    • 例:ゲームエンジンの普及によりゲーム数は増加したが、 高評価作品の割合は増えていない ことを確認。

組織構造と抽象化の弊害

  • エンジニア組織の拡大に伴い、 自律型チーム(autonomous teams)階層型組織(hierarchical organization) の議論があることを説明。
  • どちらの組織論も ビジョンとエンジニアリングの一方向的関係 を前提としていることを指摘。
  • チームのサイロ化や抽象化は、 組織内のブラックボックス化 を招き、 洞察やイノベーションの阻害要因 となることを強調。
  • Skypeのモバイル対応 を例に、組織のサイロ化が 迅速な変革や創造的対応を困難にする ことを示唆。

深い理解と高品質な成果物

  • ソフトウェア開発や組織運営において、 深い理解が創造性や高品質な成果物の源泉 であることを再確認。
  • 抽象化やブラックボックス化に頼り過ぎることで、 本質的な理解や創造性が損なわれる危険性 を警告。
  • 理解と創造性のバランスを意識的に保つこと の重要性を提案。

Hackerたちの意見

映画製作者はカメラの詳細な作り方を理解しなくても素晴らしい映画を作ることができるし、カメラの仕組みを知っていることと出来上がった映画の質との間には予測可能な関係はあまりないと思う。この文は、単一のポイントを支持するために二つの異なることを混同している。一つは正しいが、もう一つはそうではない。映画製作者が素晴らしい映画を作るために「カメラの作り方」を知る必要はないのは正しい。しかし、映画製作者は確かに「カメラの仕組み」を知っている必要がある。レコボタンの位置を知っているというペダンティックな意味だけでなく、偉大なバイオリニストが自分のバイオリンの仕組みを知っている必要があるのと同じように(でもバイオリンの作り方は知らなくてもいい)。カメラは映画の芸術的な道具であり、それをうまく使うためにはレンズの選択、絞り、シャッタースピード、露出、焦点面、照明、フレーミングなどを理解して、望む芸術的な結果を得る必要がある。この文のもう一つの混乱の可能性は、「映画製作者」という包括的な用語で、実際の例がカメラの操作に狭く焦点を当てていることだ。映画を作るためにカメラをどう使うかを決めるのは一般的に撮影監督の責任だ。時には特別なスキルを持つ監督が自分自身で撮影監督を務めることもあるが、役割やスキルセットは作曲家とバイオリニストのように大きく異なる。

この点で混乱している人は、YouTubeのWolfcrowによる「なぜ[映画]は今でもビリオンダラーに見えるのか」という動画を見てみるといいかも。映画アーティストがカメラの仕組みを知らなくてもいいという考えは笑えるよ。カメラだけじゃなくて、フィルムの種類、処理方法、レンズ、照明、そしてそれらすべての相互作用や撮影対象についても。素晴らしい映画には細部への注意がすごい。

バイオリンの話が出たから、最近の発見をシェアするね。ピアノ(グランドピアノみたいなやつや、最近の電子ピアノも含めて、洗練された鍵盤アクションメカニズムを持ってるやつ)は、双方向のフィードバックを提供するように作られてるんだ。鍵を押すときのフィードバックがあって、ペダルに足を置くと感じる低音の振動もある。この二つが組み合わさることで、楽器との「関係」を築くのに役立つんだけど、まだ自分では一つも作れないんだよね。

あなたのコメントはエンジニアリングの優位性の罠にはまってるね。確かに、カメラ(や他の多くの機器)の仕組みを理解する必要があるけど、異なる調整可能なパラメータが完全に直交していないからなんだ。> カメラは映画の芸術的な道具で、うまく使うにはレンズの選択、絞り、シャッタースピード、露出、焦点面、ライティング、フレーミングなどを理解して、望ましい芸術的結果を得る必要がある。これが重要な文だよ。もしフィルムカメラの出力を完璧に模倣するデジタルカメラがあったら、70年代の「映画製作者」にデジタルカメラを渡せば、同じ品質の映画を成功裏に作ることができるだろう。確かに、焦点距離が被写界深度に影響を与えることを理解する必要はあるけど、結局は出力をコントロールすることが大事なんだ。システムの内部の仕組みを理解する必要は本当にないんだ。理解すべきは、どのパラメータが出力にどのように影響を与えるかだけなんだ。>> カメラの仕組みを知っていることと、結果的な映画の品質の間には予測可能な関係はあまりないかもしれない。確かに、通常はその関係を理解してうまく使うためにある程度の技術的理解が必要だけど、道具の内部の仕組みを完璧に理解しても、良い職人になるとは限らない。重なる部分はあるけど、それだけなんだ。良い映画を作るためには、映画製作の部分をしっかり理解する必要がある。だから、技術的な知識が映画の品質に直結しないという観察があるんだよね - それは必要だけど、十分ではない基準なんだ。

ソフトウェアを作る人たちは一般的に自分たちをソフトウェアエンジニアと呼ぶ。エンジニアはプロセスに従い、物事を測定する。もし開発者が物事を測定していないなら、大抵はそうじゃないから、彼らはエンジニアリングをしていない。少なくとも、何か新しいことをしているなら、彼らは書いている。それ以外は、ただタイピングしているだけ。ソフトウェアはたくさんのタイピストを雇っている。優れたエンジニアを選びたいなら、二つの特性を見極めればいい:誠実さと持続力。誠実さは自分以外の世界への意識で、知性とは負の相関がある。誠実さがあれば、規律ある勤勉さが見つかる。少しの知性を加えれば、複雑な指示に従って高い精度を達成できる人も得られる。創造性は持続力と高い知性の子供だ。創造性はプロセスの多くのバリエーションを試し、観客や指標に対して質を慎重に見極めることで達成される。もし一群の道化師を雇ったら、サーカスができる。

ソフトウェアはたくさんのタイピストを雇っている。私たちは多くの強力なタイピストを持っている。

創造性には持続力と高い知性以上のものがあると思う。DockerやTerraformはどう?超シンプルなアイデアで、私が見る限り、持続力の結果でもなく、特に知的に負担のかかる発明でもなかった。創造性には公式があるとは思わない。時には起こるし、時には起こらない。

これは本当に馬鹿げた意見だね。もし、もっと伝統的なエンジニアの友達が既存の部品のドキュメントをもとに計画を立てるのに一日かけたら、急にエンジニアじゃなくなるの?サプライヤーのところに行ってプローブを持ってデータシートを全部やり直せって期待してるの?

価値があると思うものがウェブサイトにあるのに、著者がそのウェブサイトをWayback Machineから除外しているのを見るのはちょっとイライラする。これじゃ、コンテンツを信頼できる方法で簡単に保存できない。自分でホストして、見つけるための解決策を作らなきゃいけない。

もし役に立つなら、私が本当に楽しんでいて、また見返したい記事を見つけたときにやることを教えるね:Googleドライブにこれ用のフォルダを作って、軽いカテゴライズのためのサブディレクトリをいくつか作って、そこに記事のPDFコピーを保存してる。将来的にウェブサイトが消えちゃう心配もないし、検索もしやすいよ。

Pocketみたいなものはどう? https://getpocket.com/home

前半は、このエッセイが「ソフトウェア開発は実際に発見に満ちている」と言っているので、ソフトウェアエンジニアリングは科学のようだと主張しているが、「与えられたビジョンを実現するために、計算の複雑なシステムから利用可能なものを組み合わせて組み立てるというエンジニアリングの実践」ではない。これは非常に理解が乏しい。すべてのエンジニアリングは発見に満ちている。電気エンジニアは、同じタスクを異なるリソース使用とパフォーマンスのトレードオフで行う新しい回路を常に発見している。土木エンジニアも建物で同じことをしている。などなど。> ソフトウェア開発は抽象化レイヤーに依存する利点がある.... 他のすべてのエンジニアリング分野もそうだ。すべての新しい機械が最初の原則から作られていると思うの?> 計算は非常に複雑で、これらのインターフェースは決して完璧にクリーンではない... 著者はこれが計算に特有のものであるかのように暗示している。おそらく、彼らは複雑なアナログ回路を一連のコンポーネント回路を組み合わせて作ることを試みたことがないからだ。

ソフトウェア開発者のエゴと傲慢さが出てるよね。組織内での人材管理についてはほとんど何もないし、エンジニアをロボットみたいに扱って、著者が言ったことを疑わずに従うと思ってる。

私はEEや土木エンジニアが支配する会社でソフトウェアエンジニアとして働いてるけど、理論的には間違ってないけど、著者の意見にはすごく共感する。土木エンジニアは大体計画を立てて、その計画に従おうとするけど、予期しない問題に適応しすぎるのは失敗のサインだよね(計画はコストのほんの一部だから驚くことじゃない)。ソフトウェアエンジニアリングでは逆のことが言える:大規模なデザイン先行プロジェクトは大抵失敗する。私の経験では、リーダーシップに進化した土木エンジニアにその違いを説明するのはかなり難しいよ。

[複雑さ...] 著者はこれがコンピュータに特有のものであるかのように示唆しているみたい。コンピュータのユニークな部分は、物理ベースのエンジニアリングよりも複雑さがはるかに高く、早く成長できることだよね。物理的な制約を受けないから、共有されたコードやデータの間のNN関係がすぐに手に負えなくなるんだ。物理的な領域で複雑なものを作るのは難しいし、基本的にはシンプルなものを作るよりも多くの作業が必要になる。共通の課題は、達成した複雑さを小さな物理的空間(エンジンベイみたいな)に収めるか、複雑に見える大きなインスタレーションに展開することが多い。でも、物理ベースのエンジニアリングの多くのものは本質的には難しくないけど、実際に信頼できる形で機能するものにするのは難しい。コンピュータの領域で複雑なものを作るのは、むしろデフォルトの提供物だよね。プログラムに物を組み合わせるだけで、典型的な新人インターンのように、すぐにほとんど機能するものができるけど、結果的な相互作用があまりにも絡み合ってしまって、誰もその複雑さを理解できなくなる。シニアレベルのソフトウェアエンジニアリングは、主に複雑さの管理に関するもので、そこから残ったものを使って製品を作ったり、技術を発展させたりすることができると言えるかもしれない。抽象化が好きな理由は、複雑さを減らして物事を管理可能にしてくれるから。抽象化がなければ、ソフトウェアエンジニアリングに進展はなかっただろうね。もしアナログ回路を構築するなら、複雑さの観点からはソフトウェアシステムを書くのと同じくらいのレベルになるから、回路をある程度管理可能な形で設計するためにソフトウェアを書く必要があるんだ。これがソフトウェア自体が書かれる方法だよ。

すべてのエンジニアリング分野には、それぞれ独自の発見のフレーバーがあるよね。特に、知られていることや過去に行われたことの境界近くで作業しているときは。

本当のチャンスは、「標準」として受け継がれてきた慣習に縛られていないことを理解するところにある。著者には同意するが、Moxieは外部資金を求めるなら、実際にはほとんど慣習に縛られていることを見落としている。ほとんどのVCや投資家が従うことを期待している慣習だ。普通の資金調達ルートを超えることも可能だが、道はかなり狭くなる。しかし、AI駆動の企業が流行し、小さな組織が大きなことをするという認識が強まるにつれて、VCたちの考え方も変わるかもしれない。

MoxieはSignalのMoxieだってことは注目に値するね。彼はアナーキストでもあるし、お金のためにやってるわけじゃないと思う。数十億ドルの企業がその基盤となるソフトウェアを使ってることも注目すべきだね。彼は経験豊富で成功したビジネスを築いてきたってことを言いたいんだ。VCの資金調達なしでもね!だから違いがあるんだ:お金を生む高品質な製品を作ることが目的なのか?それとも製品を売って高収入を得ることが目的なのか?個人的には、エンジニアの仕事は製品に集中することだと思う。お金はビジネスの人たちの領域だし。ビジネスの人たちとエンジニアの間の対立は健全だよ。バランスを生むからね。私たちの仕事は製品を最高のものにすることで、彼らの仕事はそれを売ること。私たちが仕事をしないと、彼らは人々が買う限りゴミを売るのを喜んでやるよ。そして、VCは自分たちの出口を過ぎたら君や会社のことなんて気にしないからね。製品を本当に大事に思ってるなら、それは健全じゃない。でもお金の方が大事ならそれでいいよ。

シェアしてくれてありがとう!この文脈で「科学」と「工学」の意味の違いについて考えたことがなかったよ。前に同僚と自分たちをどう表現すべきかについて話したことはあるけど、実際の職業名の観点ではなかったな。君が言ってたブラックボックスのアナロジー、すごく好きだよ。最近出会ったコンウェイの法則を思い出させてくれた。

これはSignalを作ったMoxieだよ。[0] 彼がちょっとナイーブだって言われてるから指摘してるんだ。でもMoxieはVCなしで非常に成功した会社を築いてきたし、その技術は多くの大手テック企業に使われてる。いくつかはシグナルプロトコルを使ってるし、オープンソースソフトウェアを作る成功した非営利団体なんだ。もし大金を稼ぐことが目的なら、彼のアドバイスは最適じゃないかもしれない。でも高品質な製品を作ろうとしてるなら、良いアドバイスだと思う。どちらを優先するかによるね:利益かお金か。もちろん両方持つこともできるけど、いざとなったら、製品のために利益を犠牲にするか、利益のために製品を犠牲にするか、どっちになる?個人的には、エンジニアとしては製品に集中すべきだと思う。利益はビジネスの人たちの領域だから。私たちの間の対立は良いもので、バランスを生む。エンジニアが過剰に製品を支配すると、展開が遅くなって他のエンジニアにしかアピールできなくなる。ビジネスの人たちが過剰に支配すると、壊れたゴミを売ることになる。どちらの状況も良くないけど、どっちの側にいたい?[0] https://signal.org/ [note] Signalを嫌うのが人気なのはわかるけど、実際に議論してるのは技術的なことだからね(エンジニアリングが多すぎる側を見て)。壊れてるわけじゃないんだから。

なんで人々はSignalを嫌うの?

シグナルは良いエンジニアリングではないけど、まあまあ decent なチャットアプリなだけで、長い歴史があるんだ。友達が使ってるから、俺はそれを使ってるだけだよ。実際のビルドは検証できないから、すべてのセキュリティ主張はマーケティングに過ぎないし、悪化させることもある。安全性の数値は変わるし、誰もそれを検証しようとはしない。ランダムな人が電話番号で追加されて、検証なし(signalgate)とかね。こんなメッセージングアプリを作るのは、シングルユーザーアプリの世界で「TODOを作る」みたいなもんだ。どれが人気を得るかは、エンジニアリングスキルとは全く関係ないよ。

「利益」ってビジネスの人たちだけのものじゃないし、天文学が望遠鏡だけの話でもないと思う。非営利団体を運営するのにもビジネススキルが必要だし、「営利」ビジネスや他の組織を運営するのにも同じことが言えるよね。目標が「利益を上げる」ことじゃないかもしれないけど、コスト管理はどんな組織にも欠かせない。結局、優先順位のバランスが大事なんだよ。お金にばかり集中しすぎると、ビジネスを壊してしまったり、顧客に迷惑をかけるリスクがある。従業員もあなたのビジネスに依存しているから、その責任もあるしね。

個人的には、エンジニアとしての私たちの焦点は製品にあるべきだと思う。利益はビジネスの人たちの領域だよ。これはテック界で最も馬鹿げたアイデアだ。こんなアドバイスは聞かないでほしい。キャリアを始めたばかりなら、ただ単にウィジェットのコーディングをより良くすることに集中するのはやめてほしい。顧客のことを考えて、彼らが解決しようとしている問題に関心を持ち、その問題を解決するためにどうやって利益を上げるかを一緒に考えるべきだよ。全てのコードは使い捨てで、全てのコードは無価値。顧客の本当のニーズや欲求、痛みのポイントを解決することが、真の価値の源なんだ。

これが重要な段落のようだね:> 明らかに、物事は変わる必要がある。ほとんどすべてが変わる必要がある。でも、各チームが必要とする変化は、他のすべてのチームが必要とする変化に依存している。製品のビジョン自体は、エンジニアリングから相互に関連し、双方向に情報を得ているけど、もし組織内の誰もが他の部分をブラックボックスの抽象レイヤーとして見ているなら、そんな変化は起こらないと思う。基本的には:本当に優れた製品を作るためには、組織の各メンバーが他のメンバーが何をしているかについての洞察を持つ必要があるんだ。

ビジョンとエンジニアリングが一緒に進化する時が最高のものが生まれるってことに完全に同意するよ。俺が見た中で最もクリエイティブな突破口のいくつかは、誰かがトップダウンの計画を実行するのではなく、システムを深く理解していて、より良い方法に気づいたから生まれたんだ。

イノベーションはほぼ常にボトムアップだけど、最終的にはそれを包み込む企業の構造の中で硬直化するんだ(Skypeがいい例だね)。ビジョンとエンジニアリングの関係についてあまり考えたことはないけど、初期段階のエンジニア主導の企業が業界を破壊する強力な潜在能力を持つ理由がわかるね。新しいスタートアップの破壊の波が来る準備が整っているのかな。ビジョンとノウハウを持った少数の人々が、実際に既存の企業を困惑させる方法でイノベーションを起こす手段を持っているんだ。技術セクターが同じパターンやプラクティスに収束する勢いは、見逃された機会を見つけるビジョナリーなエンジニアたちのチームに対して非常に脆弱に見える。クリエイティブな破壊は本当に美しいものだね。

ゲームを作るのが簡単になったことで、確かに数は増えているけど、高評価のゲームの数(この場合はmetacriticで記録されたもの)は、時間とともに増えているようには見えないね。ある意味、レビューアーがつける評価やその感情はゼロサムゲームで、ほとんどのものは同じ期間内の他のものと比較されて評価されるからね。