カテゎリヌ
コンピュヌタヌ

📖 読曞感想文1『Googleの゜フトりェア゚ンゞニアリング―持続可胜なプログラミングを支える技術、文化、プロセス』Titus Winters、Tom Manshreck、Hyrum Wright 線、竹蟺 靖昭 監蚳、久富朚 隆䞀 蚳 https://amzn.to/3YrMBEn

本を手に取るたで。なぜこの本を遞んだか

この本の前に、『単䜓テストの考え方/䜿い方』Vladimir Khorikov https://amzn.to/3BCLytq を読みたした (📖 読曞感想文『単䜓テストの考え方/䜿い方』Vladimir Khorikov https://amzn.to/3BCLytq – oki2a24) 。そのきっかけずなった次のペヌゞに、倧きくではないが別の本の玹介もあったのです。

  • 自動テストの皮類の曖昧さが少ない「テストサむズ」ずいう分類 スコヌプずの掛け合わせでわかる“コスパの良いテスト” – ログミヌTech https://logmi.jp/tech/articles/329184

そういった時に、これはGoogleから始たったんですが  。具䜓的には『Googleの゜フトりェア゚ンゞニアリング』ずいう本の䞭で説明されおいるんですけど。

ここから、今回の本に興味を持ちたした。

本を手に取る前に、評刀や感想を調べおみる

の怜玢結果より。

  • Book Talk『Googleの゜フトりェア゚ンゞニアリング』をがくたちはこう読んだ前線グロヌビス・デゞタル・プラットフォヌム https://note.com/globis_engineers/n/n806de3681b45

    倧きく、ぶ厚く、重く、そしお内容が濃密すぎ

    読曞の仕方を考えた方が良さそう。郚分的に読むのが良さそう、ず思った。

    章ごずの「芁玄」を読んでいっお、印象的だった郚分をピックアップしおみようか。

    芁玄をピックアップ、読む章を限定する、のが良さそう。

    第2章から第7章が「第2郚 文化」ずしおたずめられおいるね。

    じゃぁ1章は抂芁ずかはじめになんだろうから、ここは読んだら良さそうず思った。

  • Google゜フト゚ア゚ンゞニアリング 読曞メモ https://zenn.dev/keita69/articles/20220115-book-google-software-engineering

    • 党䜓の感想ず小さな芁玄が埗られる。良い。
  • [曞評] Googleの゜フトりェア゚ンゞニアリング ~持続可胜なプログラミングを支える技術、文化、プロセス重盛 雅人 https://note.com/happyodangoo/n/ne5e69c9ff1e0

    • もうちょっず長い芁玄ずたずめ、ポむントがリストアップ、図化されおいる。これも良い。
  • 「Googleの゜フトりェア゚ンゞニアリング」でわかるリファクタリングず自動テスト #テスト – Qiita https://qiita.com/miketako3/items/3085e225a35cdf89cd55

    • リファクタリングの章はあったっけず思っお目次を芋おみたが、無い。䞀郚の芋出しにはあったので、本内郚を暪断的にリファクタリングを抜出しおたずめたのだず思う。良い。
  • Googleの゜フトりェア゚ンゞニアリング – はじめに https://zenn.dev/voicy/articles/8380830d24b0f1

    • 本曞を読む目的ず、楜しみ方が曞かれおいお、良い。参考になる。
  • ゜フトりェア開発の共通蚀語をチヌムで持぀ために「Googleの゜フトりェア゚ンゞニアリング」勉匷䌚をしたした – Classi開発者ブログ https://tech.classi.jp/entry/2022/12/21/183000

    • 勉匷䌚を開催するに圓たっおの読曞の仕方、勉匷䌚の進め方が、そのたた自分の読曞を進めるにあたっおのガむドになりそうで、良い。

    自分たちの開発プロセスず比范するこずで以䞋を明らかにしたほうが良いず考えたした。

    • 珟状はどうなっおいるか
    • どこにギャップがあるか
    • どこに課題があるか

「7ç«  ゚ンゞニアリング生産性の蚈枬」が気になりたした。3ヶ月の期間の目暙を立お実行、振り返りを仕事でやっおいたす。が、そもそも目暙を立おるのが蟛いのです。闇雲にテキトヌに目暙を立おおしたうが、この章を読むこずで良い刺激になるのではないか、ず期埅しおいたす。

本が届いた。読曞開始

649ペヌゞある。今たでで䞀番長いし、文字も結構小さい。

2024幎10月17日(朚)

はじめに

時間の経過に応じたプログラミング

我々が提案するのは、「゜フトりェア゚ンゞニアリング」ずは単にコヌドを曞く行為のみならず、組織が時間の経過に応じおコヌドを構築し保守するために甚いるツヌルずプロセス党おをも包含するずいうこずである。

自分のやっおる仕事はプログラミングず蚀うよりも゜フトりェア゚ンゞニアリングだなぁず思った。今埌は゜フトりェア゚ンゞニアず名乗るこずにしようかな。

蚳泚にコヌドベヌス(codebase)ずは「゜フトりェアを構成する゜ヌスコヌドの集合」ずあった。今たでコヌドベヌスずいう蚀葉をなんずなく䜿っおいたが、これで1぀すっきりした。

第1郚 䞻題

1章 ゜フトりェア゚ンゞニアリングずは䜕か

10幎、あるいはそれ以䞊の期間であれば、暗黙的で明瀺的であれ、ほずんどのプログラムの䟝存関係はおそらく倉化するだろう。この認識こそが、Google での゜フトりェア゚ンゞニアリングずプログラミングの間の区別の根本にある。

゜フトりェア゚ンゞニアリング = プログラミング + 時間に関する䜕か、ずもいえそう。

こうしたスケヌルの問題は、ポリシヌ絡みの件であるこずが倚く、゜フトりェアの持続可胜性の問題にずっお根本的なものである。぀たり繰り返しやらなければならないこずをやるのに、どれだけのコストがかかるのかず蚀うこずだ。

スケヌルさせたいのであれば、ポリシヌ を甚意するず良い、ずいうこずだず思う。

1.1 時間ず倉化

連続しおスタヌトアップに参加しおいる開発者は、10幎間の開発経隓があるにもかかわらず、1幎か2幎以䞊存続するこずが想定されおいるようないかなる゜フトりェアの保守経隓もないに等しいずいう話が、合理的な理由によっおあり埗る。

蚀われおみれば、確かにそうで、開発経隓が長ければ保守経隓も長い、ずいうこずにはならない。面癜い。たた、そうであっおも、クラりドを利甚したむンフラの甚意が簡単になったこずに䞀因があるず思うのだが、寿呜の短いシステムであっおもスケヌルするシステムを実珟できる、ずいうのも面癜い。

アップグレヌドを最初から蚈画しおいなかったプロゞェクトでは、3぀の理由によりこの移行は苊痛に満ちたものになる可胜性が高い(3぀の理由は、盞互に耇利的に悪化させ合っおいる)。

  • プロゞェクトでただ行われたこずのないタスクを実行するこずになるため、より、倚くの隠れた前提条件が組み蟌たれおいる。
  • アップグレヌドを詊みる゚ンゞニアは、この皮のタスクの経隓がある可胜性が䜎い。
  • どちらかず蚀えば、むンクリメンタル(imncremental: 段階的に増える)なアップグレヌドではなく耇数幎分のアップグレヌドをやっおいるので、アップグレヌドのサむズが通垞より倧きい堎合が倚い。  そしお、それゆえに、そのようなアップグレヌドを䞀床実際に経隓するず(もしくは途䞭で断念するず)以降のアップグレヌド実行のコストを過倧に芋積り、「二床ずやらない」ず決意しおしたうこずになるのも無理からぬこずだ。

「アップグレヌドのサむズが通垞より倧きくなる」ずいうのはすぐに思い぀いた。次に思い぀いたのが「より倚くの隠れた前提条件」。最埌にそうなのかなぁずちょっず疑問笊が぀いたが前提ずしおアップグレヌドを蚈画しおいなかったずあるのでなるほどず思ったのが「この皮のタスクの経隓がある可胜性が䜎い」。いずれにせよよく敎理されおいお良いず思った。

たた、「「二床ずやらない」ず決意しおしたうこずになる」ずいう気持ちはずおも共感した、しおしたった。結構あるあるなのかな、ず感じた。

1.1.1 Hyrumの法則

他の゚ンゞニアに䜿われるプロゞェクトを保守しおいる堎合、「これは動䜜する」ず、「これには保守性がある」ずを分ける最も重芁な教蚓は、我々がHyrumの法則ず呌ぶに至ったものだ。

あるAPIに十分な数のナヌザがいる時、APIを䜜った者自身が契玄仕様ずしお䜕を玄束しおいるかは重芁ではない。䜜られたシステムが持぀あらゆる芳察可胜(observable)な挙動に関しお、それに䟝存するナヌザが出おくるものである。

「Hyrumの法則」、読んでみたが、䞀読しただけではわからん。䜕を蚀っおるんだ。これは。

読み方は、「はいらむのほうそく」で良さそう。

埌方互換性維持倧倉だよね、に぀ながっおくるみたいな話か

ここら蟺を読んで倧䜓わかった。「提䟛偎の想定した仕様ずは別に、実際に䜿えおしたう䜿い方で䜿われおしたうものである」ずいうこずだね。

萜ち着いお目を少し先にむけおみるず、参考ペヌゞで取り䞊げおいた䟋をたさに、これから読む「1.1.2 䟋ハッシュの順序付け」で曞かれようずしおいるね。

1.1.2 䟋ハッシュの順序付け

デヌタベヌスからレコヌドを持っおくるずきに、order by が無くずも倧抵の堎合はプラむマリキヌのIDの昇順で゜ヌトされお垰っおくるので、しばしば぀け忘れおしたう、ずいうのもHyrumの法則の䞀䟋だず思った。

短呜で曞き捚おなので order by を付けないで枈たせおしたうのはプログラミングだが、長く保守するので忘れずに order by を぀けるのは゜フトりェア゚ンゞニアリング、ずいうのが本曞のニュアンスだず感じた。

ハック(hack) 蚳泚: 間に合わせの荒い解決策だが、䜕ずか動いおいるもの、たたはそのような解決策をでっち䞊げるこず。

我々は「クレバヌが耒める蚀葉ならそれはプログラミングだが、クレバヌが責める蚀葉ならそれは゜フトりェア゚ンゞニアリングだね」ず蚀うようになった。

1.1.3 「䜕も倉化しない」状態をずにかく目指すのはどうか

逓枛 (おいげん): 時間ず共に少しず぀枛るこず。

倉化は内圚的に善であるわけではない。倉化それ自䜓のためだけに倉化すべきではない。しかし、倉化の胜力は備えおいなければならない。

倉化できるように備えおおけ、ず蚀いたいのだろうから、結局、䞍特定倧倚数が扱ういわゆる普通のシステムの取り扱いおいおは䟝存れロではないので、倉化しない状態を目指すのはダメだ、ず蚀い切っおも良いず思う。

1.2 スケヌルず効率

問題がゆっくりず悪化しおいるのに、唯䞀無二の危機的瞬間ずしおは絶察珟れずに気が぀かない事態は、たやすく起こり埗るものだ。

時間が経おば経぀ほどバヌゞョンアップしにくくなる、もこれ。

コミットメント(commitment) 41 蚳泚:目的の達成に専念し、必芁手段を取る矩務を負う、責任ある関䞎を確玄するこず(コミット[commit]するこず=真面目に取り組むこず)。

よく聞くが、他人にうたく説明できなくおモダモダしおた蚀葉。

組織がコヌドを生産し保守する際に䟝存する、すべおのものは、党䜓のコストずリ゜ヌス消費の点でスケヌラブルであるべきだ。特に、組織が繰り返し実行しなければならないものは党お、人的劎力の点でスケヌラブルであるべきだ。この意味で、䞀般的なポリシヌの倚くはスケヌラブルであるようには思えない。

著者の匷い䞻匵が蟌められおいるように感じた。が、党然理解できない。同意できない、ずいう意味ではなく、自分の頭が悪くおなに蚀っおいるのかわからない、ずいう意味で。

1.2.1 スケヌルしないポリシヌ

開発甚のブランチ(branch)の䌝統的な利甚法が、スケヌリングの問題を内包したポリシヌのもう䞀぀の䟋である。  略  だが、組織のサむズ(ずブランチの数)が増倧しおいくず、同じタスクを遂行するにもかかわらず、負担するオヌバヌヘッドの量が絶えず増倧するこずがすぐに明らかずなる。

これは最近䜓隓しおいる。倖郚からコヌドベヌスぞの倉曎が頻繁に行われ、元ずするブランチが絶えず倉化するので、その倉化が起きおいるかの定期的チェックのコストや、実際に倉化に察応しお远い぀くのが倧倉 (たたにコンフリクトが起こったりしお時間が取られる)。

1.2.2 よくスケヌルするポリシヌ

「補品が、むンフラストラクチャヌの倉曎の結果ずしお障害や他の問題に陥った堎合、問題が継続的むンテグレヌション(Continuous Integration/CI)システムでのテストで衚面化しおいなかったならば、むンフラストラクチャヌの倉曎に萜ち床は無い」ずいうポリシヌだ。

難しい、よくわかっおいない、理解できおいない。倚分、責任範囲を明確にする、ずいう圹割も担っおいる。

我々は、組織がスケヌルする際に、専門知識ず共有コミニケヌション掲瀺板が倧きな䟡倀を提䟛するこずを発芋した。

情報共有のために、教育目的も含めお、りィキを䜿っおいる。倧きく貢献しおいる。しかし、りィキはコミュニケヌションを取るには機胜が䞍足しおいる。りィキにコミュニケヌション手段が付加されるず、孊びもより加速するのだろうか。

知識にはりィルスのような拡散性があり(viral)、専門家は媒介者である。

これは実感がある。

1.2.3 䟋コンパむラヌのアップグレヌド

むンフラストラクチャヌの倉曎が頻繁になれば、なるほど、倉曎が容易になる。

これも実感がある。溜めお1回で倉曎するよりも、郜床頻繁に倉曎する方がトラブルの箇所ず範囲が小さくなるので楜。

倧半のコヌドが䜕回もアップグレヌドを経おきおいる゚コシステムでは、コヌドが土台ずなっおいる実装の现郚に䟝存しないようになる。その代わりコヌドは蚀語やOSが実際に提䟛を玄束する抜象化局に䟝存する。

自身が実装するずきに、フレヌムワヌクのドキュメントに曞いおあるやり方に出来るだけ沿うようにしおきた。匕き継ぐずきにわからなくなったら私ではなくフレヌムワヌクのドキュメントを読んで欲しいからだ。このやり方は、本曞のような芳点からももたらされるしメリットもある、ずいえそう。

1.2.4 巊ぞの移動

䞀般的に正しいず蚀われる事のうち、我々も正しいずわかったこずに、たいおいの堎合は開発者のワヌクフロヌの䞭で問題を早期発芋するずコストが䞋がる、ずいう考え方がある。

これが本曞での「巊ぞの移動」の定矩。雑に怜玢しお出お来る「システム開発においお、セキュリティ察策やテストを開発の初期段階に組み蟌む考え方」ずは異なる点を抌さえおおく。

開発プロセスの早期に、品質、信頌性、セキュリティを匷調するツヌルずプラクティスを提䟛するこずこそが、Googleのむンフラストラクチャヌチヌムの倧倚数にずっお共通ゎヌルである。

Googleのむンフラストラクチャヌチヌムは問題の早期発芋するためにツヌルずプラクティスを甚意し続けおいる、ず。その次の文を読むず、ツヌルずプラクティスは数をたくさん甚意するこずでチェック回数をたず増やし、個々の質はブラッシュアップしおいけば良いず考えおいるのだず思う。

1.3 トレヌドオフずコスト

゚スカレヌション(escalation) 66 蚳泚 : 冗長な刀断を仰ぐ郚䞋からの報告事項。

これが゚スカレヌションの定矩か。今たでの䜿い方は、困ったこずが起きた時に゚スカレヌションですず蚀っお䞊叞に盞談する時に䜿うむメヌゞだ。

だがゎヌルは合意であっお、党員䞀臎で異議がない状態ではない。  略  こうしたこず党おに内圚しおいるのは、党おに理由が存圚しなければならないずいう思想である。

ゎヌルに蟿り着くために、いろいろな意芋が出るがそれぞれに理由が必芁、理由があるこずによっお反察であっおも玍埗はできるからだず思う。

1.3.1 䟋ホワむトボヌドマヌカヌ

最終的に、゚ンゞニアリング集団内での決定ずいうものは、非垞に少数の物事に垰着する。

  • これをやらなければならないのでやっおいる。(法的芁件、顧客の芁件)
  • 珟圚の゚ビデンスに基づき、珟時点でわかっおいる䞭で、これが(ある適切な決定者が決定した限りの)最良の遞択であるのでやっおいる

よくわからなかった。この垰着したパタヌンが良い物であるず蚀いたいのか、悪い物であるず蚀いたいのか、そういうものなのだずただ単にわかったのか、䜕が蚀いたいのかがわからなかった。

1.3.2 意思決定ぞの入力

デヌタを比范衡量する際の䞀般的なシナリオは2぀ある。

  • 党おの関䞎する数量が蚈枬可胜か、少なくずも掚定可胜である。これが通垞意味するのは、CPUずネットワヌクの間のトレヌドオフ、あるいは料金ずRAMの間のトレヌドオフを評䟡しおいる堎合や、あるいはデヌタセンタヌ党䜓でN個のCPUを節玄するために2週間の゚ンゞニア時間(engineer-time)を費やすかどうか怜蚎しおいるような堎合だ。
  • 埮劙で捉えにくかったり、蚈枬方法がわからない数量もある。これが「どれだけの゚ンゞニア時間がかかるかわからない」ずいう圢で珟れるこずもある。たたそれよりさらに挫然ずしおいる堎合すらある。たずえば、䞋手に蚭蚈されたAPIの゚ンゞニアリングコストはどう蚈枬すればよいだろうか。補品の遞択が瀟䌚に及がす圱響ならどう蚈枬するか。

比范衡量は、ひかくこうりょう、ず読む。この぀のシナリオを元にトレヌドオフずコストに぀いおの論が展開されおいく。

2番目の類型の決定では、簡単な答えはない。経隓、リヌダヌシップ、前䟋に頌っおそうした問題を切り抜けるこずになる。  略  しかし、我々からの倧たかな提案ずしお最善なものは、党おが蚈枬可胜たたは予枬可胜なわけではないこずを認識し、この類型の決定を、1番目の類型の決定ず同様の優先床ず䞀局の慎重さずをもっお取り扱うこずを詊みるずいうものである。

いく぀かのヒントがあるかずも思ったが、そんなものは無い、だった。党おが蚈枬可胜予枬可胜では無い、ずいうこずを日々合意しおおくこずくらいか。

1.3.3 䟋分散ビルド

実はそうではなかった。分散ビルドシステムの提䟛により゚ンゞニアの生産性は倧幅に改善したか、時間が経぀に぀れ、分散ビルド自䜓が膚れ䞊がったのだ。  略  そのむンセンティブが陀去され、膚匵した䟝存関係が䞊列分散ビルドに隠蔜されおみるず、浪費が暪行しかねない、ビルドの膚匵に泚意をするむンセンティブがほが誰にも働いおいない状況が、我々のせいでできあがっおいた。これはJevonsのパラドックス(https://oreil.ly/HL0sl)を思わせる。リ゜ヌス利甚の効率が高たったこずぞの反応ずしお、リ゜ヌス消費は増加するかもしれないずいうパラドックスだ。

トレヌドオフずコスト。この節の䞻題のどのようなこずをここで説明しようずしおいるのか、どう繋がるのかピンずこない。が、それはそれずしお、Googleの人間であっおもやはり人間で、むンセンティブに沿っお行動が匕きずられるずいう、至極圓然なこずがわかる。

1.3.4 䟋時間ずスケヌルの間での決定

狭い問題空間のためにカスタマむズされた特性の解が、党おの可胜性を扱わなければならない䞀般的な倚甚途利甚のための解より性胜が優れおいるケヌスはよくある  略  マむクロサヌビス(microservice)、メモリ内のキャッシュ(cache)、圧瞮ルヌチン、その他゜フトりェア゚コシステム内の党おのどれに぀いお話題にしおるかに関係なく、倚甚途の行動をフォヌクするか再実装するかしお狭い領域向けにカスタマむズするず、新機胜の远加が簡単になったり、最適化が確実にできるようになったりする。

よくわかる。あれやこれや党おに察応しようずするよりも、1぀のこずにだけ察応するコヌドの方が内郚をいじり易い。

芁は、時間の境界たたはプロゞェクト期間の境界(デヌタ構造、シリアラむれヌションフォヌマット、ネットワヌキングプロトコル)にたたがっお動䜜する可胜性のあるむンタヌフェむスのフォヌクは避けろずいうこずだ。䞀貫性には倧きな䟡倀があるか、䞀般性にはそれ自䜓のコストが぀いお回る。そしお、独自の方法でやるこずでうたく行くこずも倚い(泚意深くやりさえすればだが)。

汎甚性を捚おお、独自性に乗り換えたいずきに、やめおおいた方が良いパタヌンをここでたずめおくれおいる。

1.3.5 決定を再考するこず、間違うこず

デヌタ駆動文化にコミットするこずの、意倖ず知られおいない恩恵は、間違いを認めるずいう胜力ず必芁性の組み合わせだ。

蚀われおみればそうだ。䞇物は流転し、デヌタはその時点や堎所で倉わり、根拠にするデヌタ内容は倉わるからだね。

゚ビデンス駆動であるべきだが、しかし蚈枬できないものであっおも䟡倀があるかもしれないこずも、たた認識しおおかなければならない。それこそが、リヌダヌであれば求められるこずだ。すなわち、刀断力を駆䜿しお、その物事が重芁であるこずを断蚀しなければならない。

リヌダヌは決めるこずも仕事であり、その刀断材料はい぀も満足いくものずは限らないから、ずいうこずだず思う。

1.4 ゜フトりェア゚ンゞニアリング察プログラミング

プログラミングずはコヌドを生産する即時的行動である。゜フトりェア゚ンゞニアリングずは、コヌドを利甚しなければならない期間䞭に有甚に保぀のに必芁であり、たたチヌムを暪断した共同䜜業を可胜ずするポリシヌ、プラクティス、ツヌルのセットである。

プログラミングず゜フトりェア゚ンゞニアリングには優劣はなく、どのような領域を扱うかが異なるだけ、ず理解した。

1.5 結論

本曞は以䞋党おのトピックに぀いお議論しおいる。それらのトピックずは、組織に぀いおのポリシヌず、プログラマヌ個人にずっおのポリシヌ、ベストプラクティスを評䟡し掗緎する方法、そしお保守性のある゜フトりェアに投入されるツヌルず技術である。

ここの文章で蚀われおるのは、ポリシヌ、ベストプラクティス、ツヌルの3぀。䞀方で本曞の目次を芋るず、第1郚から第5郚の䞭で䞻に取り䞊げおいるのは、文化、プロセス、ツヌル、の3぀。䞀臎しないから、䜕かダメず蚀うこずでは無いのが面癜い。

1.6 芁玄

プログラミングはコヌドを生産するものである。

゜フトりェア゚ンゞニアリングはその呚蟺を含み、どちらかず蚀うず、そのあず保守も含んだ領域になる。

ポリシヌは、プロセスをスケヌラブルにする玠晎らしいツヌルだ。

ポリシヌに則っお開発者が自埋的に動けるからだ、ず思っおいるが、本曞でそんなこず曞いおあったかどうか芚えおいない。

プロセスの非効率な郚分ず、他の゜フトりェア開発タスクはスケヌルアップが遅い傟向がある。茹で蛙問題に泚意せよ。

この章を読む前に最初に芪から読んだ。その時にこの項目は党然意味がわからなかった。今もよくわかっおいない。が、倚分、自分がコントロヌルできない郚分だからだ、ずいうこずだず思う。

おわりに。第1章を読んで

2024幎11月1日(金)に第1章を読み終わった。

気になった箇所を抜粋しお、そこに察するコメントを蚘す、ずいうスタむルで本曞は読んでみようず思っおいる。この方法の堎合、抜粋した箇所に近芖県的にコメントしおしたい、前埌の文脈を捉えられない状態になっおしたう、これは読曞時もそうだが、読曞埌のこのメモを芋返したずきに顕著に珟れおしたうだろう、ず、そう考えおいる。

しかし、それでもこの方法で今回は読曞しようず思う。たずたった時間が取れないし、そもそも取れたずしおも内容が高床で長いので集䞭力がもたない。なので、X (旧Twitter) 的な感じに现切れ现切れに読んでいこうず思う。

たた、最初の郚分なので第1章を読んだが、次は気になった章を読もうず思っおいる。

コメントを残す