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

システム思考

概要

  • ソフトウェア開発には 進化的アプローチ設計主導アプローチ の2大流派が存在
  • 進化的手法は 早く始めやすい が、複雑性と依存関係の管理が課題
  • 設計主導手法は 全体最適化が可能 だが、 初期コストと調整負荷 が高い
  • 依存関係の扱い方 が両者の根本的な違い
  • バランスの取れた中間案 が理想だが、実践例は少ない

ソフトウェア開発における「進化」と「設計」アプローチ

  • ソフトウェア開発には 2つの主流アプローチ が存在
    • 進化的アプローチ :小さく始めて徐々に機能追加
    • 設計主導アプローチ :事前に詳細な仕様を策定し構築
  • 進化的手法は スタートアップのような起業家精神 に近い
  • 設計主導手法は 高層ビル建設のような工学的手法 に近い

大規模システムの進化的成長の実例

  • 大企業内で 3000以上のシステム が50年かけて進化
  • 多様な 技術スタック・ベンダー が混在
  • 全体として見れば 不安定なシステム群 となる
  • システム数を減らせば データ・セキュリティ・運用の問題 が大幅に減少
  • 複雑性は1/10以下 に圧縮可能な可能性

依存関係と複雑性管理

  • 両流派の根本的な違いは 依存関係の扱い方
  • 進化的手法: 依存関係を後回し にし、まず開発を優先
  • 設計主導手法: 依存関係を事前に設計 し、全体最適を目指す
  • 設計主導は 調整・コミュニケーション負荷 が高く、短期的には進化的手法が速い
  • 依存関係を後で解決するとコスト増、修正や調整が困難化

技術的知識とキャリアパスの影響

  • 最新技術の変化経験不足 が設計主導型の障壁
  • 多くのエンジニアは 実務経験5年未満
  • 進化的プロジェクトは楽しい が、スケールすると ストレス増大
  • 設計主導型はストレスが少なく、着実な進行 が可能

両者のメリット・デメリット

  • 進化的手法: 早期開発・柔軟性・少ない会議 が魅力
    • だが、 大規模化で破綻リスク技術的負債の増大
  • 設計主導手法: 品質・信頼性・再利用性向上
    • だが、 初期設計・調整コスト が高い

バランス型アプローチの模索

  • 理想は中間的なバランス型
    • 依存関係を意識しつつ、進化的開発と設計主導を組み合わせ
    • リリースごとに振り返り・リファクタリング を実施
    • イテレーションの大きさ も状況に応じて調整
  • スピードと品質のトレードオフ を意識
  • 進化的手法は動的だが混沌としやすい
  • 設計主導手法は安定だが初動が遅い
  • 両者の適切な使い分け定期的な見直し が重要

結論

  • 大規模システム開発 では、部分ごとに 進化的手法と設計主導手法を使い分け
  • 無秩序な進化はコスト増大過度な設計も機動力低下
  • 最適なバランス探求継続的な改善活動 が成功の鍵

Hackerたちの意見

「機能する複雑なシステムは、必ず機能する単純なシステムから進化してきたことがわかる。逆の命題も真であるようだ:ゼロから設計された複雑なシステムは決して機能せず、機能させることもできない。動作する単純なシステムから始めなければならない。」ガルの法則

ほんとそれ。

ああ、セカンドシステム効果とそこから学んだ教訓だね。

よく引用されるけど、実際に厳密に正しいのか疑問だな。「機能する」の定義を合理的に考えた場合ね。機械工学では確実に当てはまらないよ。

みんなこれを誤解して、物置から超高層ビルを段階的に作れると思ってるんだよね。

ここで重要なのは「ゼロから」という部分だと思う。通常、新しい(2番目、3番目、何でも)システムを古いものに置き換えるとき、前の設計の良い部分と悪い部分を考慮に入れるから、もはやゼロからではないんだ。それが成功を可能にするんだよ(少なくとも私の経験では、たいてい成功した)。

このコメントを追加するためにここに来たよ。 https://en.wikipedia.org/wiki/John_Gall_(author)#Gall's_law

一部のシステムは、その複雑さに完全にコミットする必要がある。単純な形ではうまく機能しないこともあるからね。多くの文脈において、「システム思考」は、より単純なサブシステムに還元できないシステムの設計について明示的に述べられていることが多い。時には、全てを受け入れなければならないこともあるよ。いくつかのタイプのソフトウェアでは、運用プロトタイプを構築するコストが、実際のコードを書くコストに漸近的に収束する現象もあるんだ。(これは、プロトタイプを構築することで納品リスクが大幅に減少すると思っている管理職に説明するのがいつも楽しいことだよ。)

ソフトウェア開発には、本当に大きくて複雑なものをどう作るかについての二つの主要な考え方がある。 > 最近では、徐々に複雑さを進化させていくのが一般的な考え方だ。小さく始めて、どんどん追加していく。 > もう一つの考え方は、すべての複雑さを事前に完全に理解した大規模な仕様を作成してから構築するというものだ。AIが人々のソフトウェアの作り方に面白い変化をもたらすと思う。実装そのものではなく、仕様を作成し、反復する方向に進むだろう。ある意味、仕様はソフトウェアの最もコンパクトな定義だ。1行あたりの知識密度は、どのプログラミング言語よりも高い。これにより、仕様は読みやすく、考えやすく、反復しやすくなる—AIや仲間と一緒に。オープンソースプロジェクトが、実装ではなく仕様に完全に依存するようになるのを想像できる。これらの仕様は議論され、人々がプルリクエストの代わりに考えを寄せることができる。アイデアが具体的であればあるほど、実際の仕様に「マージ」される可能性が高くなる。メンテナは、「アイデアのマージリクエスト」をレビューし、仕様を更新する前にAIアシスタントと議論する方が、コードをレビューするよりも簡単だろう。仕様はソフトウェアの実装と同様にバージョン管理でき、実行中のバージョンや安定版リリースを持つことができる。プラットフォーム固有の注意点やライブラリの推奨をリストした付録を含めることもできる。良い仕様があれば、開発者はどんな言語でも自分のツールを作れる。新しいバージョンの仕様を取得し、現在のものと比較して、AIに差分を実装させたり、自分に必要なことや不要なことを議論させたりできる。似たように、自分の要件で仕様を「パッチ」する方が、既製のソフトウェアを修正するよりも簡単だろう。面白い時代だね。

オープンソースプロジェクトが、仕様に完全に依存するようになるのを想像できる これは本当に良い観察だね、君の予測は当たると思う。これにはSaaSに対する影響がある。お金を節約するためにvibecodeが必要な例のSaaSを想像できる。今それが不可能な理由は、Claudeができないからではなく、君が提案したように、正しい仕様を得るのが大変だからだ。よく書かれた仕様は、そのソフトウェアのドメインにおけるベストプラクティスだけでなく、法的なコンプライアンスの面倒くさいことも含まれている。適切なモジュール化された仕様があれば、もっとvibecodedなSaaSが見られるようになると思う。全体的に、君の予測は本当に強いと思う。

これに関するアイデアに興味がある。仕様のための異なるコンパクトなDSLを考えたことがあるけど、構造化されていないもの(ファイル固有の所有権の境界を超えた)は、私にはうまく機能している。

アイスバーグは、主に仕様だよ[0]。どんなデータが保存され、どのようにやり取りされるかを正確に定義している。コミュニティはまず仕様変更について広く議論する。最近のクロスプラットフォームSQL UDFについてのものを見てみて[1]。まだ大規模なLLM駆動の言語実装は見ていないけど、確かに可能だと思う。LLMにJavaの実装を必要な言語に翻訳するように指示する方が簡単だろう。vibe-codedな言語は、企業のデータに大きなダメージを与える可能性がある。[0] https://iceberg.apache.org/spec/ [1] https://lists.apache.org/thread/whbgoc325o99vm4b599f0g1owhgw...

ここにはテンプレートやマクロライブラリに関する考え方の類似点がある。一つの問題は、動作する参照実装がない仕様は、成功裏にコンパイルされたことのないプルリクエストと本質的に同じだということ。一般化は良いけど、結局のところ実際にやってみることからは逃れられない。C++のテンプレートでこの問題に直面したことがある。以前にテストされていない型をテンプレートに投げると、新しい面白い方法で壊れることがある。

ウェブを出発点として見ることができるよ: https://html.spec.whatwg.org/#history-2 > WHATWGは、いくつかのコア原則に基づいていて、(..) 仕様は、実装が互いにリバースエンジニアリングなしで完全な相互運用性を達成できるほど詳細である必要がある。だけど、私の経験では、仕様以上のものが必要だよ。実装は単に仕様を実装するものではなく、仕様がどのように実装されるかに関する多くのアーキテクチャ的選択の結果でもあるからね。それに、詳細な仕様があってもAIは追加の指導が必要なんだ。例えば、数週間前にCursorがウェブ標準と共有WPTテストスイートにアクセスできる何千ものエージェントを解き放ったけど、その結果は全くの無意味だった。だから、未来はむしろ仕様のロシアの人形のようになるかもしれない。高レベルのシステム記述から始めて、システムの各部分のより詳細な仕様でサポートする。これがコード自体にまで及ぶこともある。既存のアーキテクチャパターンは、そうしたパターンのバリエーションとして機能をコーディングするための仕様を提供する。だから、システムが新しいことをする必要があるときは、そのためのコードパターンを提供しなければならない。AIはその強みに relegated されるんだ。既存のパターンを適用することにね。TLA+にはリファインメントの概念があって、これは私が上で説明したロシアの人形のようなものだけど、TLA+の仕様にのみ適用される。ここにそのアイデアを説明する引用があるよ: 仕様と実装の間に根本的な区別はない。私たちは単に仕様を持っていて、その中には他の仕様を実装するものもある。JavaプログラムはJVM(Java Virtual Machine)プログラムの仕様と見なすことができ、これはアセンブリ言語プログラムの仕様と見なすことができ、これはコンピュータの機械命令の実行の仕様と見なすことができ、これはレジスタ転送レベル設計の実行の仕様と見なすことができる、という感じだよ。出典: https://cseweb.ucsd.edu/classes/sp05/cse128/ (第1章、最後のページ)

どこかにバランスの取れた道があるはずだけど、何十年も経っても正式なバージョンには出会ってないな。すごくシンプルだよ。バランスの取れた道は、あなたが作っているもののライフサイクル中に要求や前提がどれだけ変わるかに直接依存してる。エンジニアリングは、未来の変化を予見できる範囲でしか役に立たない。そこを超えると進化が必要になる。あなたがその大企業の複雑さについてコメントできるのは、50年前にそれらのものが形を成し始めた未来に立っているからだよ。もし50年前に設計していたら、同じ複雑さに終わっていたはず。自然の答えは、統合して圧縮すること。地球に落ちたものは、時間とともに重さの大きな圧力によって固い岩に圧縮される。すべての複雑さや特徴は平坦化される。企業も、事前の大規模なエンジニアリングデザインによってではなく、時間の経過に伴う圧力によって似たようなダイナミクスを経験するんだ。

タイトルが誤解を招くと思う。著者は「システムについて考えている」けど、これは https://en.wikipedia.org/wiki/Systems_thinking についてではないよ。

100%。知らない分野から新しいことを学ぼうと思ってここに来たけど、代わりに小さなイテレーションと大きな設計についてのコメントを見つけて、ちょっと退屈だなと思った。

ソフトウェア開発の現実についての知恵がたくさん詰まった投稿だね。彼らが言おうとしている核心は、アジャイル(または類似の)プラクティスが、全体のシステムがすでに機能していて非常に大きいときに、小さなシステムを大きなものに統合するための間違ったアプローチだということ。プロセスの早い段階で難しい問題に対処することを強いられると、最終的により良い結果が得られるという主張には同意するけど、すでに使用されている巨大なシステムのリライトを適切に計画するのは実質的に不可能だという現実を無視していると思う。すべての重要な詳細を理解し計画するには長い時間(数年?)がかかるけど、その間にリライトしたいシステムは進化していて、あなたが完成したと思っていた計画の一部はもはや正しくない。要するに、ゴールポストがどんどん移動するんだ。この観点から見ると、ストラングラーフィグパターンは、これらのリライトのための実用的なアプローチかもしれない。すべてを前もって理解するのは不可能だから、今の時点で合理的に理解できることを理解して、それに基づいて行動し、機能して価値を追加するものを提供し、そしてまた繰り返す。問題は、十分に大きなシステムの場合、これには数十年かかることで、ほとんどのソフトウェアアーキテクトはそれを見届けるために一つの会社に長く留まらないってこと。最後に言いたいのは、フルタイムのソフトウェア開発者になって数年しか経っていないけど、「コードを書く」ことは仕事の中で最も簡単な部分の一つだということ。難しいのは、どのコードを書くべきかを知ることで、これには他のソフトウェア開発者や(おそらくもっと重要な)ビジネスプロセスが実際にどう機能する必要があるかを理解している非技術的な人々との効果的なコミュニケーションのスキルが必要なんだ。素晴らしいソフトウェア開発者になりたいなら、これをうまくやる方法を学んでね。

「コードを書くこと」は仕事の中で最も簡単な部分の一つだ。難しいのは、どのコードを書く必要があるかを知ることだ。この考えには大いに賛同するよ。私の意見では、これが大規模な事前設計がリスクが高い理由だ。

事前に全ての複雑さを考慮した大規模な仕様を作成してから、それを実装する。> そんなことは一度も起こったことがないし、これからも起こらないよ。君は全知全能じゃないからね。全てを把握できるほど賢くても、要件は常に変わる。だけど、飛び込む前に良い計画を立てることには価値があると思う。多くのソフトウェア関係の人はすぐに飛び込むのが好きで、計画を立てる人たちを最初に全てを把握しようとしているように描写するのをよく見るよ。(計画できないってことがわかるから、飛び込む姿勢を強化してるのかな)良い計画は、仕様変更を防ぎ、トラブルに備えるのに役立つ。基本的には、起こりうる問題を考えて書き出して、優先順位をつける。それが必要なら、意思決定者に質問を持ち上げる。いくつかの小規模なテストを試してから、実装に進む。でも、実装していく中で、見落としていたことが必ず出てくるよ。永遠に計画することはできないし、未知の未知を解決することは実装しない限りできないけど、良い準備はプロセスをスムーズにする。エンジニアが橋を建てる前に計算する理由はこれだよ。計算が完璧な表現だからじゃなくて(一般的な信念とは裏腹に、静的じゃない)、計画が実装よりも安くて、計画があれば変更を追跡しやすく、どれだけ道を外れたかを判断しやすくなるから。人々が全てを計画してLLMに渡せばいいと思っているのも不思議だよ。マネージャーが君に仕事を割り振るとき、必要なことを全て知っていると思ってるの?もちろん、そんなことはない。半分は実際の要件を把握することなんだから。

そうだね、でも2000ページの仕様書を書いた2年後の統合テストでは、実際にはうまくいかないんだよね。アーキテクトから開発者に渡されて。

事前に全ての複雑さを考慮した大規模な仕様を作成してから、それを実装する。> そんなことは一度も起こったことがないし、これからも起こらないよ。君は全知全能じゃないからね。全てを把握できるほど賢くても、要件は常に変わる。私はこの記事に出てくる「戦いの傷を持つ20年以上のベテラン」の一人で、現在は多国籍企業の大規模プロジェクトに取り組んでいる。そこでは、全てを事前に指定し、JIRAで計画し、見積もりを出し、次のマイルストーンの契約を結ぶ前にガントチャートを設定する必要がある。このプロジェクトに18ヶ月取り組んできたけど、予期しない問題や最後の瞬間の変更、不完全な仕様のせいでマイルストーンが順調に進んだことはゼロ回だよ。こうした厳格な構造の中で納品しなければならないエンジニアたちには頭痛の種が増えていて、今や管理側もそれに気づいて、上層部にもっとアジャイルで反復的なアプローチが必要だと説得しようとしている。事前の仕様がソフトウェアの複雑さの全ての解決策だと主張する人は、実際の経験がないか、実際のエンジニアリングから遠く離れていて、何を話しているのかわからないんだと思う。

多くのソフトウェア関係の人はすぐに飛び込むのが好きで、計画を立てる人たちを最初に全てを把握しようとしているように描写するのをよく見るよ。私のアプローチは、特に多くの未知があるプロジェクトの場合、すぐに飛び込んでプロトタイプを作ろうとすることだ。その後、数回イテレーションを重ねる。もし小さなものであれば、数回のイテレーションで良い結果が得られる。もしもっと大きなものであれば、ここで計画を立てる価値が出てくる。多くの問題がすでに浮き彫りになっていて、問題がはるかに良く理解されているから。

ベント・フリューブイェルグの本「How Big Things Get Done」は、このスレッドで挙げられた懸念にしっかり答えてくれてるよ。ここで答えて、あちこちに返信を散らかさないようにするね。

でも、飛び込む前に良い計画を立てることには価値があると思う。特に、_良い_計画に重点を置いてね。ほとんどの「計画」はひどくて、その名前に値しない。 事前に明確にして、JIRAで計画するのは良いアプローチだね。仕様はその計画の一部であるべきだし、実行中に必要に応じて適応する準備は必要だけど、変更を避けるために仕様を良くする努力も大事だよ。ただし、君が言った「事前の仕様」は、計画を立てる前に書かれた可能性が高いから、それは悪いアプローチだね。それは「計画」と呼ばれる何かの一部として書かれたもので、実際の計画とは関係ない。そうなると、その仕様は完全にフィクションだよ。 提供された見積もり もしこのプロジェクトが特別でない限り、見積もりもフィクションだと思うよ。 ガントチャートの設定 ガントチャートはモデルであって、計画ではない。モデルは良いもので、プロジェクトに対する洞察を与えてくれる。でも、モデルを計画と混同しちゃいけない。計画を立てるために必要な小さな断片の一つに過ぎないし、ガントチャートは計画を立てるために必要な多くのモデルの一つに過ぎない。 次のマイルストーンの契約にサインする前に それは良いことだね。契約にサインするのは取り返しのつかない決定だから。計画が終わる前にサインすべき契約は、プランナーを雇うための契約だけだよ。 事前の仕様が解決策だと主張する人 さっきの話を見てみて。堅固な事前の仕様は通常、計画ではなく、純粋なフィクションだよ。 特に多くの未知があるプロジェクトの場合、私のアプローチはすぐに飛び込んでプロトタイプを作ることだね。これを計画と呼ぶか「飛び込む」と呼ぶかは用語の違いで、アプローチの違いではない。重要なのは、問題を理解するために実験しているけど、取り返しのつかない決定はしていないことだよ。この本の用語を使うと、君は_計画_しているのであって、_実行_しているわけじゃない。 2000ページの仕様書が書かれ、建築家から開発者に渡された後 もし2000ページの仕様が書かれている間に開発者に渡されていなかったら、それは計画の一部ではなく、純粋なフィクションだよ。その仕様に基づいてソフトウェアを開発しようとするのは計画の一部だね。

PRINCE2とSSADMを見てみてほしいな。あるいは、元のロイスの論文を読んでみて - https://www.praxisframework.org/files/royce1970.pdf は、このアンチパターンを「ウォーターフォール」と明示的に呼ぶために書かれたものだよ。(ロイスはこれをアンチパターンとしてマークしていることに注意してね。)このことについては、https://www.ebiester.com/agile/2023/04/22/what-agile-alterna... で少し話したけど、方法の歴史についても触れているよ。今やこの議論はほぼ70年続いているんだ。グレース・ホッパーやジョン・モークリーがUNIVACプログラムについて議論していたのは間違いないよ。

こんなことはこれまで一度も起こったことがないし、これからも起こらないだろう。君は全知全能ではないからね。たとえ君がすべてを理解するのに十分賢くても、要件は変わってしまうよ。私の今までのベストプロジェクトは、主にウォーターフォール型のもので、A4の仕様書が50〜60ページくらいあった。その多くをクライアントと一緒に作成したんだ。すべての計画と同様に、実施中に多くのことが変わったけど、同じ機能を実装する方法を見つけて、約15ページ分を削減する自動化を実現したよ。さらに、実際にコードを書き始める頃には、必要な回答が必要だった質問のほとんどがすでに出ていて解決できていたし、ドメインが技術にどう変換されるかについてのエッジケースも知っていたから、全体の仕組みや見た目も分かっていたんだ。これに対して、プロジェクトに参加して手伝うように頼まれ、進行中の開発の真っ只中に飛び込むと、特定のシステムやチームが過去数週間や数ヶ月間に焦点を当てていたさまざまなことについてあまり知らないことが多いよね。 もし彼らが本当に大きなシステムをいくつか持っていたら、彼らの問題の多くは消えてしまうだろうというのは簡単に想像できるよね。データ、セキュリティ、運用、品質、アクセスの間の不整合は、すべての切り離されたプロジェクトで大きかったんだ。あるシステムは最新だったけど、別のシステムは古くて、うまく機能しているものもあれば、ほとんど機能していないものもあった。システムが少なくなれば、自ら引き起こした問題の多くは消えてしまうだろうね。また、これを思い出させるのが https://calpaterson.com/bank-python.html 特にこの部分: バーバラには複数の「リング」、つまり名前空間があるけど、デフォルトのリングは銀行全体の単一のグローバルオブジェクトデータベースに近いものだ。デフォルトのリングからは、取引データや楽器データ(上記のように)、市場データなどを引き出すことができる。日常的に使用される

この記事の大部分には同意しないけど、この部分は目立ったね。> イテレーションのサイズは重要だ。小さければ、それは盲目的に前に進んでいるからだ。盲目的に前に進んでいないなら、イテレーションはもっと長くなるべきで、それがより効果的だ。君は盲目的に進んでいるわけじゃなくて、(動作するソフトウェア + 小さな変更)から(変更を含む動作するソフトウェア)に移行しているんだ。そして繰り返す。問題があれば、すぐにそれを学ぶことができる。私にとって、それは盲目的に進むのとは正反対だ。> 各イテレーションの後に立ち止まって確認するべきだ。誰が毎回のイテレーションの後に確認していないの?これはアジャイル/リーン/DevOps/XP/Scrumの基本的な原則の一つだ。この一文が著者のこのテーマに関するコメント能力を大きく下げている。> 人々がコードを書く速度が速くなるほど、クリーンアップが必要になる。クリーンアップを避ける時間が長くなるほど、基本的に指数関数的に悪化する。危険なテンポは、大規模な仕様設計プロジェクトでも小さなイテレーションでも起こり得る。実際、慎重な小さなイテレーションで作業することで、現実的なテンポを管理するのに役立つ。なぜなら、私たちは生産に入れられる速度以上には進めないことを知っているからだ。同じ段落で挙げられたひどい結果は、賢明でない実践に起因していて、小さなイテレーションサイズとは関係ない。

その通り - これが良いアジャイルが目指すところなんだ。ユーザー向けの機能を可能な限り小さいサイズで実装すること(これも重要)。この二つがあれば、問題や質問を最速のフィードバックループで特定できる。実際、「大きなイテレーション」は、著者が言及する全ての問題が最初に現れるところだと主張できるよ!

警告、この投稿は、皆さんがスタッフレベルの仕事で知っておくべき「システム思考」については触れていないよ。ここでは事前設計のためにこの用語を使っているんだ。もっと一般的な現代の意味では、システム思考は関係や全体に関するもので、部分を孤立させるのが伝統的な工学アプローチとは違うんだ。システム思考の基礎的な資料の多くはサイバネティクスに基づいているけど、これは伝統的な工学を補完するもので、より自然な複雑さの境界を特定し、混乱や偶発的な複雑さを避けるために使われるんだ。グレゴール・ホープの「Architect Elevator」は、この視点の変化がなぜ重要で、柔軟性に投資することが不確実性のあるときに重要なのかを理解するのに良い出発点だと思うよ。この記事の定義を受け入れなければならない場合もあるけど、もっと現代的な定義を受け入れることで、働きやすい場所での仕事を得るのに役立つよ。この記事で示されているような偽の二項対立は、やるべきソフトな作業があることへの警告だね。このスレッドで機械工学について言及している人たちは、資料を検討することで最も利益を得るかもしれない人たちだと思う。これが君のニーズにとっての前進の道かどうか、ぜひ見てみてほしいな。

ウォーターフォールの仕様は、宣伝通りに機能したことはないよ。1980年代と90年代は、DOD-497の数キロバイトの文書が仕様を決定するために詳細に分析されていたけど、成功の3つの主要な次元(時間、品質、コスト)のいずれにもほとんど近づかなかった。一方で、アジャイル(大文字のAで)は、文書の儀式がJIRAチケットやTシャツの儀式に置き換わっただけで、あまり変わらなかったね。

  1. 理論上は素晴らしいけど、実際には違うことが多いよね。理論と実践の間には違いがある。
  2. もし彼らがこのように構築された成功した大規模システムの有名な例を挙げていたら、私はこの主張にもっと耳を傾けたかもしれない。でも、逆に、私は多くの失敗例を簡単に挙げられるよ:FAAの高度自動化システム(1980年代)、IRSの税システム近代化(1990年代)、UK NHSのIT国民プログラム(2000年代)。
  3. ウォーターフォールとアジャイルは連続体だよ。誰もすべてを計画するわけじゃないし、誰も計画されたアーキテクチャなしに進めるわけじゃない(たとえそれが一人の頭の中だけでも)。連続体のどこにいるかは、問題の性質(すべての要件が知られているか?)、チームの性質(彼らはこれを以前にやったことがあるか?)、成功の基準(これに命がかかっているか?)によるんだ。
  4. 建物を建てることへのアナロジーは不完全だよ。大規模になると、ソフトウェアは都市のようなもので、成功した都市はすべて徐々に複雑さを進化させてきたんだ。誰かが太平洋の島に100万人のアーコロジーを建てるまで、また戻ってきてほしいな。
  5. 一部の博士が「ドクター」と呼ばれることに敏感であるように、一部のソフトウェアエンジニアも「本物のエンジニア」と呼ばれることに敏感だよね。そんなことを考えるのはやめよう。ソフトウェアエンジニアとして私たちがやっていることは非常に価値があり、世界を文字通り変えている(通常は、でも必ずしもそうではないけど)。私たちがやっていることが「エンジニアリング」かどうかを心配するのをやめて、私たちが得意なこと、つまり地球上に存在したことのない複雑なシステムを構築することに集中しよう。