この広告は、90日以上更新していないブログに表示しています。
同書の感想記事の6章〜最後までと全体です。
と定義してこれらを論ずる章。
大抵の人間は線形に、時系列に物事を考えてしまうので切り離して考える。並行性を向上させるためにワークフローを分析する。すると同時に並行処理できる処理、何かに時間が掛かっている間に他の処理を行う並行処理ができる箇所が見つかったりする。言語ではElixir
のコンパイラーが並列処理を行える。
レストランの陳列棚にパイが残り1個の状態で、2つのテーブルの客がウェイターにこれを注文した処理を例にdさう。普通にコードで表現するとアトミック(原子性)のある処理ができない。
ある時点で誰か1人しか占有できないものを「セマフォ―」と呼ぶ。これをロックして処理、異常終了を含め終了したらアンロックする処理が必要。RDBならトランザクションが使えるが、共有できるリソースでは常にこの問題が起こる可能性がある。無秩序なエラーはよく並行処理が原因で起こる。
局所的で固有の状態を持った独立した仮想プロセッサーが「アクター」で、個別のメールボックスを持ち、メッセージが来たらそれを1つづつ処理するイメージ。一方通行で応答はしない。より汎用的なプロセッサーが「プロセス」。
JavaScript
のNact
ライブラリを使うと、このアクターを使った並行処理が実現できる。言語ではElixir
の元になったErlang
がアクターを実装している。
どんな立場の誰でも自由に、内容も自由で事件の手がかりを書いていけるホワイトボードのイメージ。ワークフローを協調させるにはこのホワイトボードのコンセプトが使える。
この章は難しかったです……! 復習せねば。
コーディングは機械的な作業ではなく常に熟考が必要な作業であり、常に気を配って作業して災害を避け、うまくやっていこうという章。
プログラマーとして経験を積んでいくと暗黙知が貯まり、無意識からの本能的な警告が生じることがある。ここから何かを得ようという話。
「爬虫類脳」という表現が日本語だと分かりにくいですが、本能から来る直感のようなものも信じようという話ですね。自分も気分転換をしたり帰りの電車とか家とか休日にハッと思いついたり、次の日頭がクリアな状態で再開したら朝イチですぐ問題が解決したりしたことが何回もあります。
ラバーダックの話もいろんな本に出てきます。新人研修で話を聞く役の先輩とかマネージャーになるとこのアヒル役によくなります。
ja.wikipedia.organd-engineer.com
幸運やいきあたりばったりに頼る、たまたまうまく動いていたような偶発的プログラミングはよくない。慎重なプログラミングを選ぶ。
自分も今思うと駆け出しのころはこの偶発的プログラミングをやってたんじゃないかな……と顧みるところであります(切腹)。
様々な人と一緒に仕事をすると相手のスキルも様々なのですが、確かに今自分で書いている実装部分の説明ができない人、バグ修正があてずっぽうの人というのも中にはいます。
ここの演習問題がトリッキーで、答えを見たときにハッとしました……!
O記法で表すことができる。O(n2)であればそのソートは2の2乗に比例して時間が掛かる。データが2倍なら処理時間4倍。
O(1)
配列の要素アクセスや簡単なステートメント実行。O(log n)
対数のバイナリーサーチ。ループ内でデータを二分割してくようなロジック。O(n)
線形のシーケンシャルサーチ。ループの中にループがあったらm*nになる。O(n log n)
クイックソートやヒープソートの平均時間。入力を分割して操作し最後に結合させるような分割統治法。O(n^2)
選択ソートや挿入ソートが2乗。O(n^3)
2つの行列の積が3乗。O(C^n)
巡回セールスマン問題、集合分割。アルゴリズムのオーダーを見積り、実際に検証すること。最高速が常に最善ではない場合もある。また最適化は作業の前半にやるものではない。
出たー、アルゴリズムの話。演習問題にRust
まで出てきて本格的です。あまり使わないので高校数学を復習せねば……ぐぬぬ……という気持ちになりました。
ソフトウェア開発のメタファーはビルの建築よりもガーデニングが相応しい。即ちすべてが設計図通りに順調に進むのでなく、より有機的で日々の変更が大きい。コーディングの過程で日常的にリファクタリングを行っていく。
DRY
原則を守ったり直交性を高めたり、パフォーマンスを上げたり。詳しくはこちらも2版が出ている名著「リファクタリング」へ。本書では最近のIDEは自動リファクタリングの機能がだいたい付いていることも注釈で触れています。
テストの利点はバグを見つけることではなく、テストについて考えて書いている時にあるというのが本書の主張。
(DbC)
の契約に対するテストだと考えてみると良い。こちらも詳しくは「テスト駆動開発」へという感じで、テストを掘り下げています。こういう話を読むたびにTDDやってなくてゴメンナサイ...(切腹)というお気持ちになりますが、テストを意識してコーディングするとよいというのは同感です。
契約による設計。そして処理結果の不変性。この2つを見つけたら「プロパティー」と呼び、それらを使ってテストを自動化できる。Pythonを使ったユニットテストの例を紹介。
テストメソッドを書いていくことでそのメソッドの動きがが明らかになる...ということなのでしょうか。「プロパティ―」という用語の意味含め、本項はちょっと理解しきれませんでした。
本書第一版の頃から世界は大きく変わり、セキュリティ対策はかなり重要になった。
本項だけはなんだかセキュリティの本を読んでいるようでした。「アタックサーフェス」という言葉は日本ではあまり使わない気がする(情報処理安全確保支援士の資料では聞いたことがないような……)のですが、Attack Surface Analyzer
というツールもあるし英語だとより一般的なのでしょうか。
名前付けはとても重要。人間の脳は単語を目にすると他の感覚より先に知覚情報で理解する。
i
やj
を使うのはFORTRAN
時代からの伝統で、プログラミング言語の入門書に使わないよう書いてあるのは誤り。また言語のコミュニティごとにキャメルケースとスネークケースなど違いがあるので尊重する。Easy To Change
原則に反していることになり設計に問題があるのを疑う。様々なプログラミングの原則で最重要とされている名前重要の話ですね。本書では色のついたひらがなが列挙されていて、人間が知覚情報に強く影響されるのが実際に分かるようになっています。
プロジェクト立ち上げ時の話。
自分が欲しいものを正確に認識している人はいない。
予想以上に難しいコードのような難解なパズルに直面したら、答えがどこか他のところにないか考えてみる。「ゴルディアスの結び目」
本項にパズルが載っているのですが、これが答えを見るとなるほど……これが本当の枠か! となります。(自分はこれ解けませんでしたw)
ユーザーと緊密に働くと良い。ペアプロやモブプロをすると、低水準のコード詳細の事柄と高水準の事側で脳を分担できてより創造的な作業ができる。短い時間で交代するとよい。一人ぼっちでコーディングに取り組んではいけない。
ぼっちプログラミングはいけないという話でした……!
Agile
は名詞ではなくものごとの進め方を表す形容詞である。形式化したアジャイルやツールや肩書を持つ人々も増えてきた。
広まるにつれて形骸化や誤解があった中、アジャイルの原点に立ち戻った方がよいという話はUncle Bobさんの『CleanAgile』にも似たような話がアツく語られています。アジャイルソフトウェア開発宣言のその場にいた人々は同じような想いを抱えているのかなあと感じました。
Clean Agile 基本に立ち戻れ (アスキードワンゴ)
プロジェクト進行中に関わる最終章。
知的で強い意志と意見を持ち独立心が強いプログラマーのチームは、猫の群れに喩えられる。大人数でなく10-12人までの小規模で安定したチームでやっていくこと。達人からなるチームは以下に留意している。
「猫の群れ」というメタファーは1985年のワシントンポストマガジンから続いているそうです。確かにプログラマーは猫っぽいかも……よくTwitterで「にゃーん」とか言ってるし!(それは違う)
ある島に文明人が来て飛行機で交易したていろいろな素晴らしい品々を提供したが、やがて去って行った。品も住民たちはココナッツの殻で飛行場や管制塔を真似してそっくりのものを作ったが動作せず、文明人たちは帰ってこなかった。中身が伴っていない形を真似ただけものものを「カーゴカルト」と呼ぶ。
目に映りやすいことに投資して作ることで魔法のような結果が呼びこまれると期待してしまう現象が、プログラミングの世界でも良く起こる。注意しなければならない。
この「カーゴカルト」の話は時々見聞きします。本書は普遍的に価値を持つ本らしく表面的な流行を追いかけることに強く警鐘を鳴らしていますが、気を付けねばと思います。
人類史上実際に起こったカーゴカルトの現象の中のひとつには、第2次世界大戦時代に日本軍と交戦していた連合国側がメラネシアの島々に落としていった余った軍事物資が原因になったものもあったそうで、事実は小説より奇なりだなあと思います。
技術スタックなどに関係なく、すべてのチームが必要とする最も基本的なスターターキットは以下の3つだと見出した。
同種のバグを一緒に見つける話は、ジャパニーズトラディショナルな現場だと「横展開」とか「ヨコテン」でよく実施されているような気もします。
自分もこのスターターキットなるものはある程度実施しているのですが、テストコードによる自動テストや完全な自動化はまだまだだな……むむむ、と思うことしきり。
重要な目標はこれである。プロジェクトが完了した後の一定期間を心安らかに過ごせるにはどうしたらいいか考えると良い。
ソフトウェア・デベロッパー、ソフトウェア・エンジニアであってもあなたの本当の肩書は、「問題の解決者」である。
達人プログラマーはチャレンジを受け入れ、作ったものに責任と誇りを持つ。あなたの作品に署名しよう。
しかしコードの所有権は個人ではないので、傲慢になったり偏見を持ったりしてはいけない。
名前があることでしっかり作られていることを確認できるようなプロの仕事をするのが達人プログラマー。
誇りあるプロフェッショナルとしてものづくりをしよう……と最後に相応しい話でした。そして後書きでは追加のTipsとして世の中に害をなすようなものは作らない、極悪なことを実行できるようにしない、そして最後は
これはあなたの人生だ、皆と共有し、祝福し、生み出していくこと。そして思いっきり楽しむこと!
という100個めのTipsで締めくくられています。なんというエモく爽やかな読後感……!
第1版の原書が1999年、日本語版が2000年。僕が新装版を読んだのはもっと後で自身のキャリア後期なのですが、その時もかなり感銘を受けて影響された記憶があります。そして第2版が2020年。
時代を超えて通用する普遍的な事柄や精神的なことも扱った本ですが技術スタックは刷新されており、キーワードだけですがTwitter
やAmazon S3
が出てきたり、登場する言語ではRuby
、Python
、JavaScript
が増えた印象。Go
とRust
、マニアックにElixir
も時々顔を出します。成功企業の例でNetflix
が出てくるあたりに時代を感じます。
僕も達人プログラマーには程遠くてもそれなりにキャリアを積み重ねてきましたので、そうそうここは実践してるのよね、という所もあれば、この真理は駆け出しの頃は分からなかったけど今だと分かるようになったのよね、というところもあり。
このへん実践できてない……とかやっぱりわからん! とか数学勉強しなおしてきます! とか平伏や切腹したくなるところもあり。各章セクションそれぞれについて様々な感想を持ちました。すべての読者にとってそうでしょう。
全般を取り扱っているので組込・Webやフロントエンド・バックエンドなどなど立場にこだわらず、エンジニアリングに関わる全ての人にお勧めできます。各セクションも基本はあまり長くないエッセイ形式なので、一部分だけでも気軽に読むことができます。新人のうちから読むのもプログラマー・エンジニアの姿勢について多くを得ることができ、中堅・ベテランにもまた異なった形で得るものがあるでしょう。
副題に「熟達に向けたあなたの旅」とあるように、旅の途中で折に触れてまた読み返したくなる、エンジニアリングの本棚に必ず置いておきたくなる本でした。
日本でも世界でも多くのエンジニアが称賛し、各所のお勧め技術書にもたびたび名前が挙がる名著のひとつです。間違いなくお勧めです。
オーム社のぺージ。登場時にはてブ400超えと大きく注目を浴びました。達人出版会のページもはてブ多し。
各所の感想記事を集めてみました。
引退した元TRPGゲーマー。COBOLでもなくPL/Iの金融系レガシー紙駆動開発から脱出→国産メーカー系総合ITベンダーのITエンジニア。所謂SIerのSEだけど仕事はほぼソフトウェアエンジニア/ソフトウェアアーキテクトとして、Web開発でコードを書いたり技術を追ったり時々イベントに行ったり、楽しいエンジニアリングを目指しています。Views are my own.
お気軽にどうぞ~
リンク集:https://lit.link/iwasiman
AIイラスト関連の活動はこちら↓
https://www.chichi-pui.com/users/iwasiman/
https://pixiv.me/iwasiman
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。