機雷がなんだ! 全速前進!

SEというかプログラマというか、日々のエンジニア生活の中で体験したことなどを中心に書き残しています。

*[本]「地図が語る感染症の歴史」: Atlas historique des diocèses

近所の図書館へ別の本を借りに行ったら気になって手に取って読んでみました。

books.rakuten.co.jp

読んでみて印象に残った点を中心に以下に書き留めておきます。(返却前メモ)

本書の構成

本の構成は、下記のような章立てになっています。

<構成>
序文
6 感染症と場所
■パンデミックの惑星
12 新石器革命の毒入りギフト
16 古代の疫病
20 中世における黒死病
23 コロンブス交換、微生物の交差
26 蚊の帝国
29 コレラーー現代の感染症の原型
32 スペイン風邪の衝撃
35 根絶の夢
39 エイズー幻想の終焉

■感染症の探索者ーー疫学の視覚文化
44 悪い空気
48 症例をカウントする
51 地図の魔法
54 流行曲線
57 ネットワークとクラスター
61 ウイルスの追跡ーー遺伝子配列の貢献

■流行の領域ーー政治地理学的考察
66 地中海における検疫と交易
69 コレラと帝国の時代における検疫
72 植民都市における感染症と人種隔離
75 東ヨーロッパにおける戦争、ナチおよびチフス
79 アフリカにおける眠り病との植民地戦
82 国際開発問題としての感染症
86 グローバル安全保障問題としての感染症
89 新型コロナ禍での世界のロックダウン

■ロックダウンの場ーー監禁から自己の発見へ
94 サナトリウムにおける近代的生活
97 衛生学者のユートピア
100 ハンセン病施療院列島
103 隔離された生活ーーニューヨークのチフスのメアリー
106 パリのクロード=ベルナール感染症病院
109 出会いの場、管理の場
112 ニューヨークとパリ、エイズの都
115 感染症と語り

■病原性の環境
120 中央アフリカにおけるHIVの環境史
123 生物多様性の危機と感染症の危機、20世紀と21世紀
126 脱工業化社会の感染症
129 環境病としてのライム病
132 感染症と交差性ーーイル=ド=フランスの例
135 感染症の傷ーートラウマと記憶

おわりに
138 感染症を別のアプローチで

印象に残った点

印象に残ったフレーズや共感できた点などを以下にメモしておきます。

パンデミックの惑星

新石器革命の毒入りギフト

【Page:13】

"ジャレド・ダイアモンドの言葉をかりれば、感染症は「家畜からの致命的な贈り物」なのである。"

より広範な生態系の変遷

【Page:13-14】

"しかし、感染症は家畜化だけがもたらした悲劇的な結果ではない。動物への曝露(疾病や健康状態の原因と推定されるものに生体がさらされること)以上に、都市化が決定的な要因である。理論的には、麻疹ウイルスのように感染力が非常に強く、生存者に強い免疫力を生み出すウイルスは、感染する可能性がある対象者、つまり一度も曝露したことのない人々が十分にいるという条件でのみ、人間集団の中で存続することができる。"

根絶の夢

期待はずれの根絶計画

【Page:36】

"世界保健機関(WHO)は、薬剤治療やワクチン接種によって、媒介昆虫や病原体を標的にした根絶キャンペーンを数多く展開してきた。これらのキャンペーンのほとんどは失敗に終わっている。1980年に宣言された天然痘の根絶は、唯一の傑出した成功例であり、これは、2世紀にわたって使用されてきたワクチンの単純さと、動物病原巣をもたず無症候性感染を引き起こさない理想的な標的であるウイルスの生物学的特性とに負うところが大きい。"

*[本]「「技術書」の読書術」: 達人が教える選び方・読み方・情報発信&共有のコツとテクニック

近所の図書館で借りれたので何となく読んでみました。

www.shoeisha.co.jp

序盤は本屋での本の選び方などが書かれていて自分のコンテキストにあまり合っていないように感じたので、いきなり読むのやめようかと思いましたが、そのまま一旦読み進めてみると、共感できる部分も多く、結果としては読んで良かったと思えました。人それぞれ、読書の仕方は違うと思いますし、各自でいろいろな工夫をしていると思いますが、この本には、これまで私が自分なりに工夫してきた要素も含まれており(共感)、その手もあったかと気付かされる点もありました(発見)。

 

本書を読んでみて印象に残った点を中心に以下に書き留めておきます。(返却前メモ)

印象に残った点

印象に残ったフレーズや共感できた点などを以下にメモしておきます。

第1部 選び方

1-1 あらゆる手段で本を見つける!書店の歩き方からITツールの活用法まで

▶ 図書館の活用 ~貴庁な本に出会う~

新しい技術が登場する中での図書館の価値とは
技術の歴史を知ることができる

【Page:52】

"メインフレーム ←ダム端末での操作"

「ダム端末」とは「馬鹿な端末」の意味であり、頭を使う処理はホストコンピュータ(メインフレーム、ミッドレンジコンピュータ、ミニコンピュータなど)が行い、端末側は「自分では考えない」(頭脳が無い、処理をしない)ことに由来する。

ダム端末 - Wikipedia

期限があるから積読になりにくい

"図書館を使う別のタイプのメリットとして個人的に感じるのは、「期限」の重要性です。夏休みの宿題ではありませんが、期限が決められていないとダラダラと過ごしてしまい、最後に焦ってしまう人は少なくありません。

 本でも同じで、…(後略)"

column 図書館の探し方

【Page:54】

"図書館を検索できる便利なサービスとして「カーリル」があります(図1-1-13)。カーリルでは蔵書の貸出状況を検索できるだけでなく、現在のいち情報から近くの図書館を探すこともできます。APIも提供されているため、自分で作ったプログラムに蔵書検索などの機能を取り入れることもできます。"

カーリル | 日本最大の図書館蔵書検索サイト | カーリル

1-2 世界が広がる!貪欲に本を求めれば、出会うはずがない本にも出会える

▶ 悪書・良書を気にする必要はない

良書を選び続けるのは不可能
①一般に悪書・良書といわれている本が、あたなにとってもそうとは限らない
②悪書との出会いを避けられない

【Page:60-61】

"(前略)最も避けるべきことは読書そのものを止めてしまうことです。悪書を否定する暇はありません。いくら否定しても悪書はなくなりませんし、立場によって考え方が違うのです。そういったノイズを気にせずに読書を続け、本とうまく付き合うようにしてください。"

▶ レベル感の合った本を選ぶ

マッチ度の見極めは大切だが、柔軟にとらえよう

【Page:62】

"(前略)技術の習得という観点でいえば、自分のスキルから見て少しむずかしい本であれば効果的に学習できます。たとえば「半分くらいは知らないが、読めばなんとかなりそう」、「2割ぐらいはすごく難しそう」といった印象を受ければ、ちょうどよいレベルといえるでしょう。"

▶ 英語の技術書という選択肢

英語の技術書を入手するには
②海外出版社の直販やサブスクを活用する

【Page:74】

"(前略)Packt(https://www.packtpub.com/)は技術書専門の出版社です。"

 

 

第2部 読み方

2-1 比べて、使い分ける。時間を無駄にせず理解を深める

▶ 「『3』の発想」 ~1つのテーマで3冊の本を読む~

発想や技術を連鎖させる工夫
入門書、専門書、逆引きの3通り読む

【Page:84】

"本に限らず、いろいろな場面で使える方法として「3」という数字を使って考える方法があります。『「3」の発想』(芳沢光雄著)という本があり、「物事がドミノ倒し現象のようにつながっていく性質を理解するには、『2』の発想ではなく『3』の発想が大切」だと書かれています。そして具体的に、次のような例が挙げられています。

「2」の発想の場合、積み木でいえば、Aが倒れかかってくればBも倒れてしまう。接し合う歯車でいえば、Aが回ればBも回る、ということである。Aの運動が、Bに影響する。2つの関係だから、その先に思考が及ぶことはない。AとBの完結した世界である。

 一方、「3」の発想を考えてみると、積み木でいえば、3つ存在することである。まず、Aが倒れかかってくればBも倒れる。Bが倒れれば、次にあるCも倒れてしまう。ドミノ倒しの最小、「A→B→C」の連鎖である。「A→B」となり、「B→C」となれば、多分「C→D」と人は考える。完結しない世界、連鎖する世界、である。

つまり、2つではその間の関係しか見えないけれど、3つ考えればそこから先に発想が広がっていくのです。これは本を読むときにも同じことがいえると考えられます。"

▶ 読書にかける時間 ~本の価値を時給換算する~

サンクコストの考え方を取り入れる(それを読むのは「いま」なのか?)
合わない本に時間をかけてもしかたがない

【Page:100】

"本を買うと、必ず最後まで読まないと気が済まない、という人がいます。これは著者としては非常にありがたいことではありますが、本のすべての内容がその人の役に立つことはほとんどありえません。本の中のほんの一部であっても、それが役に立てば十分なことも多いです。

 私の場合、少し読んでみて合わない本は「いまの私には合わなかった」と考えてざっと流し読みしてしまいます。このときに考えているのは「サンクコスト」の考え方です。サンクコストは「埋没費用」と訳され、すでに発生して取り消しできない費用のことで、これに引っ張られて合理的な判断ができないという文脈で使われる言葉です。"

本同じ本を何度も読む
1度目はざっと流し読みをする
2度目は手を動かしながら読む
3度目はノートにまとめながら読む

▶ 数学書の読み方 ~文系・理系それぞれのアプローチ~

理系である程度数学を知っている人が学ぶとき
パラシュート勉強法を使う

【Page:122】

"(前略)パラシュート勉強法は、必要になったときに、必要になった分だけを学ぶ本法で、『「超」整理法』の野口悠紀雄氏が提唱する方法です(図2-1-10)

 たとえると、「山の頂上に立ちたい」と思ったとき、登山のグッズを揃えて、事前に綿密な計画を立てて準備をし、一歩一歩登ることも大切ですが、そもそも登山をする必要があるのかを考えるのです。飛行機に乗って、途中で飛び降りてパラシュートで山の頂上に立つ、というのでも目的は達しています。"

▶ 積読のか手法 ~優先順位を設定する~

同時並行で読む or 1冊ずつ片づける?
積読は解消しない

【Page:127-129】

"(前略)結論からいうと、積読は解消しません。(中略)本が増え続けないようにするためには、本を周りに置いておくだけではなく、読まなくてはいけません。このとき、「同時並行で読む本」と「1冊ずつ片づける本」に分けることができる(後略)。"

同時並行で読む本

"(後略)多くの本がこちらに分類されます(後略)"

1冊ずつ片づける本

"(後略)代表的なものが雑誌で、手に入れた日に全部目を通してしまいます。雑誌はとにかく鮮度が重要だと思っているので、できる限り早く読みたいのです。(中略)そのほかには、友人に紹介された本もこの分類に入ります。「この本いいよ」と紹介された本は、ほかの本よりもできるだけ早く読むようにしています。その理由は、感想を返すためです。(後略)"

2-2 ルール無用。精読、多読、乱読し、読書の枠を超えてゆけ

▶ 読書にルールなし

目的を達成できれば読み方はなんでもいい
長期間を経た再読について
①過去にレベルが高いと感じた本を再読する
②過去に学び終えた本を再読する
③過去に学び終えた本を再読する

【Page:134-136】

▶ 読書の枠を超えて学習を加速する

従来の読書の枠から外れてみよう
場所を問わない
エスカレーターで読書する
食事中に読書する
旅行中に読書する
ジャンルを問わない
媒体を問わない

【Page:137-141】

▶ マーキング読書法で脳に刻み込む

具体的な印のつけ方

【Page:154】

"

ページの角を折る:角を折り曲げることによってしおり代わりにすることをドッグイア(角折れ)という。主にページをマークする目的に使える。

"

▶ 電子書籍のメモやノートを取る

Kindleにおけるメモ

【Page:171】

"Kindle本はリフロー形式と固定レイアウト形式の2種類があります。リフロー形式はテキストのまま管理する方式、固定レイアウト形式はページを1枚の画像のように管理する方式です(図2-2-15、図2-2-16)。前者は小説、後者は写真集や雑誌をイメージするとわかりやすいでしょう。

 それぞれの形式によって、Kindleアプリでのメモ機能を使い分ける必要があります。"

第3部 情報発信&共有

3-1 成長のチャンスはアウトプットにあり

▶ アウトプットは最大の成長 ~講演や勉強会でスキルアップ~

間違いに気づくためにアウトプットは不可欠

【Page:224】

ブログに書く

【Page:227-229】

"勉強会などで発表するのは少しハードルが高い、という場合には、ブログという手もあります。ブログに書くことも発表資料を作成するのと同じように、頭を整理できるメリットがあります。ブログは「記録として残る」という特徴もあります。後から見直したときに恥ずかしい部分もありますが、いつ、どのようなことを自分が考えていたのかを振り返ることができます。

 ブログを書くにはインプットが足りない、と思っている人がいます。「もうちょっと勉強しないと書けない」、「文章の書き方も勉強しよう」と思っていると、いつまで経っても書けません。学ぶべきことはいつもたくさんあり、文章は書かないとうまくなりません。

 つまり、図3-1-1の左側のループから、右側のループに変える必要があるのです。多くの人にとって、そのきっかけの1つが「とりあえずアウトプットする」ことです。

 

「もうちょっと勉強しよう」ということろが「とりあえずアウトプットする」に変わっただけですが、そうすると不足している部分や、学んでおきたいことがはっきりします。わからないことそのものもアウトプットすることで、他の人からフィードバックをもらえます。アウトプットすることで、自分にわかっていない部分があるのを他人に気づいてもらえるのです。こうなると、図3-1-1-2のようなループが回り始めます。

 

ここで大事なのは、アウトプットばかりにならないことです。自分が知っている知識、これまでに学んできたことには限りがあるので、アウトプットを続けていると出せるものがなくなってきます。インプットが枯渇すると、成長が止まってしまうのです。

 これを防ぐためには、外部との接触の機会を増やすことが有効で、勉強会などはそのいい機会だといえます。インプットとアウトプットの時間や内容について、常にバランスを意識するよう心がけましょう(自戒も込めて)。"

▶ 発信するテーマの選び方 ~「自分ならこうする」を発信する~

人によって違うのはいいこと
3日後の自分は他人

【Page:230】

"プログラミングでは「3日後の自分は他人」という考え方があります。"

3-2 アウトプットも「遅すぎる」ことはない

▶ たくさんアウトプットしよう

文章を上達させるための「三多」

【Page:246】

"(前略)「三多」とは中国の欧陽脩(おうようしゅう)という歴史学者が提唱した、文章を上達させるための3つの条件です。

①「看多(かんた)」:多くの本を読むこと

②「做多(さた)」:多くの分を作ること

③「商量多(しょうりょうた)」:多く工夫して推敲すること

を指します。

 ①はインプット、②と③はアウトプットに対応します。簡単に述べれば、上達したければたくさんのインプットとアウトプットが必要ということです。三多の中では③が最も軽視されがちですが、これがうまくいかないと「インプット→アウトプット→改善」のサイクルが完成しません。常に③を意識しておき、①に活かしてください。"

アウトプットの結果をきにしない
アウトプットに遅いということはない

【Page:246-248】

▶ いつでもどこでもアウトプット

アイデアが浮かぶ場面「三上」と「4B」

【Page:249】

"(前略)欧陽脩の三多という言葉を紹介しましたが、彼は三上(さんじょう)という言葉も残しています。三上は文章を考えるのに都合のよい3つの場面のことであり、

①「馬上(ばじょう)」:馬に乗った移動中

②「枕上(ちんじょう)」:布団で寝ているとき

③「厠上(しじょう)」:トイレの中

を指します。

 現代では「創造性の4B」という言葉があります。4Bはアイデアが生まれる4つの場所や場面のことであり、

① Bathroom:風呂場

② Bus:移動中

③ Bed:寝室

④ Bar:ほろ酔い中

を指します。

 よいアイデアであっても忘れてしまっては意味がありません。対策として、いつでもどこでもメモするしくみを確率化しておくことが重要な課題になります。"

▶ レビューの有効性

レビューもアウトプットの1つ

【Page:255】

"(前略)たとえば、ネット上でレビューを投稿したり、家族や友人に口頭で本を紹介したりするのも立派なアウトプットの1つです。"

(最後に)気になったこと

ひとつだけ気になったのが書籍のタイトルの「技術書」という表現でした。自分も含めてIT系に関わりがある人にとっては「技術書」といえばコンピュータ書のことだと(技術書典、技術書博なんてのもありますし)すぐに察しがつくと思うのですが、そうでないコンテキストの人がタイトルの「技術書」という表現を見て、どう受け取るんだろうか?🤔…と。実際に本を読めば分かる話ではありますが、看板に偽りなし、という観点において紛らわしくないのだろうかと思いました。

🔔CHSH不等式の破れを確認してみた🔔(Special Thanks to ICEPP)

東京大学素粒子物理国際研究センター(ICEPP)の研究者が選定・執筆しGithubで公開している量子コンピューティングを手を動かして学びたい方のための入門教材「量子コンピューティング・ワークブック(qc-workbook)」なるものを知りました。

詳細は上記のページに記載されているのでそちらを読んでもらえれば良いと思いますが、QiskitというPythonライブラリでプログラムを記述して作成した量子回路をIBM Quantum (IBMQ)の量子コンピュータで実行できるというものです。

こちらのワークブックで量子コンピュータに触れるための最初の実習に2022年ノーベル物理学賞で話題(🔔ベルの不等式の破れ)となったCHSH不等式の破れを確認する」というものがあり、Jupyter NotebookにPythonのサンプルコードを写経するだけで量子コンピュータにおいて量子力学的状態、特に「エンタングルメント」が実現しているか検証することができると書かれています。

もしかしてGoogle Colaboratoryでも簡単に動かせるんじゃないか?

と思って、実際に試してみた結果を以下に記録しておきます。

やったこと

基本的にはワークブックの流れに身を任せればOKなのですが、一応やったことの流れをざっくりと書いておくと以下のような感じです。

 

<ざっくりとした流れ>

1.Google Colaboratoryで新規ノートブックを作成する

2.作成したノートブックでQiskit をセットアップする(以下コマンドを実行)

!pip install qiskit qiskit-ibm-runtime jupyter qiskit-aer qiskit[visualization]

3.Qiskit が実行できることを確認する(Qiskit で Hello world

4.IBM Quantum Platformで新規アカウントを作成する

5.作成したアカウントでログインして API Token を確認して控えておく

6.ワークブック「CHSH不等式の破れを確認する」のサンプルコードを上から順にノートブックへコピペして実行していく(※注:「回路を実機で実行する」で先程の API Token を __paste_your_token_here__ にセットして実行すること)

実際に実行した結果を含むノートブックは作業記録としてGithubに置いてあります。

github.com

実行結果

実際にIBMの量子コンピュータの実機へリモート接続して実行結果を取得するのですが、世界中で共有されているコンピュータの空き状況の間で実行されるせいか2000回のショット数で20~30分くらい待ちました。しばらく実行状態が続いても焦らず待ちましょう。

所感

以前から量子力学や量子コンピュータには少しだけ興味があって書籍ブルーバックスやYoutube動画を見たりしながら知的好奇心を満たしていましたが、その程度の興味があれば、誰でも簡単に実際に量子コンピュータを使って検証することができてしまいます。かつてアイザック・ニュートンが「巨人の肩の上に立つ」という言葉を用いたのはもう数百年前のことだそうですが、現代では良くも悪くも情報が民主化され誰もが簡単に巨人の肩の上に立つことができるようになったことについては個人的には良い時代になったなと感じます。論文なんかもネットで検索して簡単に翻訳して読めますしね。(とはいえ何事にも光と影の両面があるのでもちろん悪い面もあるとは思います)

3大CSPのコンテナ系マネージドサービスの技術要素を整理しておく(備忘用)

せっかく調べたのでガッツリした記事を書こう書こうと思っていたけれど、なかなかまとまった時間が取れず時間ばかりが過ぎ去っていった結果もう記憶も薄れてしまいました(笑)これ以上記憶が薄れるともう【無】でしかないので、もう肩肘を張らずにいま覚えていることをとりあえず書き残しておくことにします。

各社のコンテナ系マネージドサービスの技術要素

3大CPS各社(Amazon Web Service、Google Cloud、Microsoft Azure)が提供するコンテナオーケストレーションを含むコンテナ系マネージドサービスの技術要素を調べてざっくりまとめたのが以下の表です。

KEDA:Kubernetes-based Event-Driven Autoscaling

イベントをトリガーとしてKubernetesのデプロイを管理することを目的としたCRD

Dapr:Distributed Application Runtime

分散アプリケーション(マイクロサービス)を構築するためのランタイム

Microsoftが先導するオープンソースのプロジェクト

Envoy:

クラウドネイティブアプリケーション向けに設計されたオープンソースのエッジおよびサービスプロキシ

所感

Google Cloud、Microsoft Azureがコンテナオーケストレーションのベース技術がKubernetesなのに対してAWSは独自開発したECSになっています。KubernetesはオープンソースなのでAWSだけが独自路線を走っているようにも見えますが、そもそもKubernetesはGoogleが独自開発したBorgがベースとなっているのでGoogle Cloudのベース技術がKubernetesなのは当然そうなりますよね。そしてMicrosoft Azureは、オープンソース化されていて、事実上コンテナオーケストレーションのデファクト・スタンダードとなっていたKubernetesを採用した、といったところでしょうか。🤔

そしてCSP各社のPaaSやFaaSなどのもっと抽象化されたコンテナ系マネージドサービスは、各社が採用したこれらのコンテナオーケストレーションの基盤上に構築されていることも併せて覚えておきたいところです。

参考

現時点で覚えている範囲の参考情報も一応記載しておきます。

 

Kubernetes and Cloud Native Security Associate (KCSA) 試験に合格しました【四冠】🐳🐳🐳🐳

先日(12/12)Kubernetes and Cloud Native Security Associate (KCSA) 試験に合格しました。英語受験が嫌すぎて日本語で受験できるまでしばらく待っていたのですが、一向に発表される気配がないので諦めて英語で受験しました。

実は前述した理由で今回受験するにあたりとっても腰が重かったのですが、社内の若者が先駆けのファーストペンギンとして受験して合格を勝ち取っていたのが良い刺激になりました。感謝です。参考として刺激をくれた彼のブログのリンクを以下に掲載しておきます。

kisama2000.cloud

Kubernetes認定資格

現在ではLinux Foundationが認定するKubernetesの認定資格は、次の5種類(KCNA/KCSA/CKA/CKAD/CKS)があります。2020年11月にCKS、2021年11月にKCNA、2024年2月にKCSAの認定試験が追加されており、ここ数年におけるKubernetesニーズの高まりを感じます。また、

2024 年認定有効期限ポリシーの変更 - Linux Foundation - トレーニング

で重要なポリシー変更の発表があったとおり、2024年4月1日から全ての認定期間が24ヶ月(2年)に変更されている点にも注意が必要です。

略称 正式名 概要

KCNA

KCNA-JP

  • Kubernetes and Cloud Native Associate(KCNA)
  • 認定Kubernetesクラウドネイティブアソシエイト(KCNA-JP)
Kubernetesと広範なクラウド ネイティブ エコシステムに関する基本的な知識とスキルを証明する(有効認定期間:2年間

KCSA

  • Kubernetes and Cloud Native Security Associate(KCSA)
  • 認定Kubernetesクラウドネイティブセキュリティアソシエイト (KCSA)
Kubernetesクラスタのベースラインセキュリティ設定を理解し、セキュリティ制御の強化/テストと監視/脅威と脆弱性の強化に参加し、コンプライアンス目標を達成できるスキルを証明します(有効認定期間:2年間

CKA

CKA-JP

  • Certified Kubernetes Administrator (CKA)
  • 認定Kubernetes管理者  (CKA-JP)
Kubernetes管理者の責任を遂行するスキル、知識、および能力を備えていることを保証する(有効認定期間:2年間

CKAD

CKAD-JP

  • Certified Kubernetes Application Developer (CKAD)
  • 認定Kubernetesアプリケーション開発者 (CKAD-JP)
ユーザーが Kubernetes 用のクラウドネイティブ アプリケーションを設計、構築、デプロイできることを証明する(有効認定期間:2年間

CKS

CKS-JP

  • Certified Kubernetes Security Specialist (CKS)
  • 認定Kubernetesセキュリティスペシャリスト (CKS-JP)
Kubernetesの熟練した実践者(CKA認定が必要)であり、コンテナベースのアプリケーションやKubernetesプラットフォームの構築、デプロイ、ランタイム時のセキュリティを確保するための幅広いベストプラクティス能力を実証する(有効認定期間:2年間

試験対策

今回の試験対策で実践した内容は(ほぼ)次の2つだけです。 

1.Kubernetes Security KCSA Mock Exam

こちらの問題集(約300問)を数日前くらいから毎日100問ずつ解きました。

こちらのWebアプリは無料で模擬試験っぽく利用できて非常に良いのですが、間違えた問題を何度も復習するには都合が悪かったのでGithubの問題が記載されているJSONファイルをダウンロードしてExcelへ転記していい感じに加工して利用しました。

2.Udemy(※有償:¥3000 → 1500yen)★50%OFF!

こちらの問題集を、前日に、ひととおり解いて間違えた問題を見直しました。

試験当日

これまでの試験(CKA/CKAD/CKS/KCNA)と同様に、自宅の自分のPCから受験する方式です。例のごとく PSI Secure Browser という試験用のクライアントツールをインストールして試験を行います。個人的には、これまで何度も受験してきているので試験前の準備(クリアデスク、クリアスクリーンなど)は慣れたものでしたが、身分証明書(今回はパスポート)の提示の仕方が少し変わっていました。これまでは、試験官に対してWebカメラ越しにリアルタイムで手持ち提示していましたが、今回は試験準備操作の中で身分証明書を撮影してセルフチェックしたものが提出できるようになっていました。そのため、試験官から「見にくいから、やり直し!」みたいな指摘をチャット(しかも英語)でされて焦るというようなことがなく、これは良い改善だな、と感じました。

試験結果

これまでとは違って受験後すぐにメールで試験結果が通知されました。英語が苦手すぎることもあいまって今回は1回目は【73/100】で不合格。2回目は【79/100】でギリギリの合格でした。やはり、英語だと問題文の意図を理解するのに時間がかかりますし、回答の選択肢の英文にも若干長めなものがあり、そちらの理解にも少し時間がかかりました。

所感

これで漸くKubestronautが見えてきたかな?それにしても英語の試験は勉強も受験も疲れます。やっぱり今後はできるだけ日本語で受験したいです(笑)お疲れ様でした🙇

*[本]「アーキテクトの教科書」: 価値を生むソフトウェアのアーキテクチャ構築

いくお先生のXのポストを見てなんとなく気になったので購入して読んでみました。

www.shoeisha.co.jp

概要

今日のソフトウェア開発を取り巻く状況をふまえてつつ、アーキテクチャの重要性やアーキテクトの必要性について分かりやすく解説されています。また、ソフトウェアが実際のビジネスシーンで使われ続けていく中で、アーキテクトとして注意すべきポイントについても解説されています。ソフトウェア開発の全体像を把握しつつアーキテクトとしての基本的な知識を得る(または再認識する)ことが主な狙いであるため、アーキテクチャあるいはアーキテクトの特定の領域を深くを掘り下げるものではありませんのでご注意ください。

感想

書籍のタイトルに「教科書」という文言が入っているとおり、ソフトウェア開発の全体をざっくりと把握しつつ、ソフトウェアのアーキテクトとして必要な基本的な知識を体系的に把握するには良い本だと思えました。情報として既知のものも多かったですが、これまで個別に学んできた事柄(点)同士を繋げて全体像を意識してある程度体系的に理解できた気がします。書籍の紹介ページにも記載されているとおり「これからアーキテクトを目指す方」「アーキテクトとしての経験が浅い方」「駆け出しのITエンジニア」「ソフトウェアアーキテクチャの基礎知識を学びたい方」「自分の知識や経験の棚卸しをしたいアーキテクト」といった用途に適していると思えました。

これまでに読んだ書籍(例:『ソフトウェアアーキテクチャの基礎』など)からの引用も多く、内容の整合性も取れていることから混乱することなく内容を理解できました。また、最近読んだ書籍『ドメイン駆動設計をはじめよう』との関連も多く、読む時宜という点でも、ちょうど良かったかもしれません😀

 

本書を読んでみて印象に残った点を中心に以下に書き留めておきます。

印象に残った点

印象に残ったフレーズや共感できた点などを以下にメモしておきます。

1章 アーキテクトの仕事

1.1 現代のソフトウェア開発をとりまく環境

▶ DX(デジタルトランスフォーメーション)とその課題

【Page:29】

"DXという言葉はバズワード化してしまい、定義が曖昧なままに濫用されることも少なくありませんが、経済産業省が2020年に公表した『DXレポート2(中間取りまとめ)』によると、三つの段階に分けて考えることができます。

  • デジタイゼーション(Digitization):アナログ・物理データのデジタルデータ化 
  • デジタライゼーション(Digitalization): 個別の業務・製造プロセスのデジタル化 
  • デジタルトランスフォーメーション(Digital Transformation):組織横断/全体の業務・製造プロセスのデジタル化、“顧客起点の価値創出”のための事業やビジネスモデルの変革"

▶ DX時代のIT戦略

【Page:31-33】

"取るべき方針は、SoESystem of Engagement:顧客との繋がりを強化するITシステム)とSoRSystem of Record:企業活動に関わる情報を記録するためのITシステム)とで異なってくるでしょう。"

SoRの領域

"SoRの領域では、これまで以上にERP(Enterprise Resources Planning:企業の経営資源を統合管理する手法やソフトウェア)やSaaS(Software as a Service:クラウド上でサービスとして提供されるソフトウェア)の活用が進んでいくでしょう。(中略)これからのDX時代においては、ERPの標準機能をそのまま活用し、自分たちの業務プロセスを業界のベストプラクティスに合わせていく「Fit to Standard」の考え方が重要となります。(中略)一方で、SoR領域の中でも自社の事業活動に競争優位をもたらす業務も存在します。たとえば、ロジスティクスの会社において、競合他社よりも効率よく早く商品配送を可能とする業務の仕組みなどです。そのようなコアとなる業務に関しては、個別のシステムを開発してERPと連携させるという判断は理にかないます。"

市民開発

"昨今のIT人材不足を背景とし、非IT人材である業務部門の従業員による「市民開発」の機運も高まっています。RPA(Robotic Process Automation:人間がパソコン上で行う定型的な業務処理を記録し自動実行する仕組み)ツールや、マイクロソフト社のPower Platformに代表されるローコードツール、ノーコードツールの発展も後押しとなっています。"

1.4 アーキテクトとは

▶ アーキテクトの定義

【Page:41-43】

ITスキル標準V3でのITアーキテクト

"情報処理推進機構(IPA)がまとめた『ITスキル標準V3 2011』では、ITアーキテクトの職種を以下のように説明しています。

  • ビジネス及びIT上の課題を分析し、ソリューションを構成する情報システム化要件として再構成する。
  • ハードウェア、ソフトウェア関連技術(アプリケーション関連技術、メソドロジ)を活用し、顧客のビジネス戦略を実現するために情報システム全体の品質(整合性、一貫性等)を保ったITアーキテクチャを設計する。
  • 設計したアーキテクチャが課題に対するソリューションを構成することを確認するとともに、後続の開発、導入が可能であることを確認する。
  • また、ソリューションを構成するために情報システムが満たすべき基準を明らかにする。さらに実現性に対する技術リスクについて事前に影響を評価する。

また、当該職種は「アプリケーションアーキテクチャ」「インテグレーションアーキテクチャ」「インフラストラクチャアーキテクチャ」の専門分野に区分されるとされています。"

情報処理技術者試験でのシステムアーキテクト

"同じIPAが管轄する情報処理技術者試験の区分の一つであるシステムアーキテクト試験(SA)では、その業務と役割を以下としています。

  • 情報システム戦略を具体化するための情報システムの構造の設計や、開発に必要となる要件の定義、システム方式の設計及び情報システムを開発する業務に従事し、次の役割を主導的に果たすとともに、下位者を指導する。

"

アーキテクトの主要な職務

"企業のIT戦略を実現するための最適なアーキテクチャの設計ならびに実現がアーキテクトの主要な職務となります。

 そのため、アーキテクトは単に技術トレンドに目を向けるだけではなく、企業の事業活動のビジョンやミッション、それに基づく経営戦略やIT戦略を正しく理解した上で、業務部門の人たちと円滑にコミュニケーションを取ることが求められます。"

1.6 アーキテクトに必要な脂質

▶ アーキテクトが備えるべき能力や考え方

【Page:51-53】

設計力、コーディング力

抽象化能力

ビジネスの理解

好奇心

完璧主義よりも合理主義

"(前略)ソフトウェアのアーキテクチャの同様で、すべての項目で満点を取れるアーキテクチャは存在しません。課題に優先順位をつけて取り組み、ほどほどに良いアーキテクチャを目指すべきです。アーキテクチャは目的ではなく手段であると認識し、合理的な判断を下すこともアーキテクトの役目です"

 

2章 ソフトウェア設計

2.1 ソフトウェア開発プロセス

▶ ソフトウェア開発のアクティビティ

【Page:61】

■実装・テスト

"(前略)注意が必要なのは、V字モデルにおける工程の分け方や名称はまちまちであり、統一された標準モデルはないということです。たとえば、「単体テスト」がプログラム単位なのか、画面単位なのか、はたまた機能単位なのかは企業やプロジェクトによって異なります。

 重要なのは、自分たちのプロジェクトで採用する開発プロセスに合わせて、適切なテスト計画を立てることです。また、ウォーターフォールかアジャイルかに関わらず、早い段階からテストを行うシフトレフトのアプローチも有効です。"

2.2 ソフトウェア設計の抽象レベル

▶ 四つの抽象レベル

【Page:63-64】

⋯■クラス設計

■コンポーネント設計

"(前略)コンポーネントという言葉はよく使われますが、その定義はまちまちで、文脈によって異なる意味で使われることもあります。一例としてSWEBOK V3.0では以下のように定義されています。

ソフトウェア・コンポーネントとは、独立した単位であり、明確に定義されたインターフェースと依存関係を持ち、独立して構成・配置することができる。

Spring Framework のようなDIコンテナで管理対象となるようなものが、まさにコンポーネントです。"

■モジュール設計

"(前略)モジュールとはコンポーネントの集合体です。"

■アーキテクチャ設計

2.3 ソフトウェアの設計原則とプラクティス

▶ SOLID原則

【Page:71】

■SRP:単一責任の原則

"とてもシンプルな原則ですが、悩ましいのは役割をどの粒度で捉えればよいかという点です。極端な話、それぞれのクラスが一つのinstance variableと一つのメソッドだけで構成されるまで分割すればよいかというと、そういうことでもありません。"

【Page:83】

■DIP:依存関係逆転の原則

"DIPは、SOLIDの他の四原則よりも抽象レベルを上げて考える必要があります。DIPは、コンポーネントやモジュール分割をする際の依存関係について定めたものだからです。"

▶ その他のポイント

【Page:88】

■二種類のロジック

"(前略)「値引きや発送料込みの注文金額の計算を行う」処理は、注文オブジェクトの振る舞いとして実装されるでしょう。このように業務の知識やルールを表すものが中核ロジックです。ビジネスロジックの中でもドメインロジックと呼ばれます。

「注文金額を計算し、決済手段の有効性が確認できたら、在庫を引き当てた後、注文を登録する」という一連の流れは、注文登録サービスの振る舞いとして実装されます。このように業務処理の手順を表すものが処理フローロジックです。ビジネスロジックの中でもアプリケーションロジックと呼ばれます。処理フローロジックは複数のオブジェクトを適切に協調させる調整役と捉えることができます。"

【Page:89】

■二種類のロジック

"(前略)このようにソフトウェアはフラクタル構造を取っていると見ることができます。"

2.4 設計パターン

▶ デザインパターン

【Page:92】

"「生成に関するパターン」「構造に関するパターン」「振る舞いに関するパターン」の三つの分類で、合わせて23のパターンが存在します。"

▶ アーキテクチャスタイルとアーキテクチャパターン

【Page:94】

■アーキテクチャスタイル

"ソフトウェアのソースコードの編成の仕方や相互作用についての「包括的な構造」と定義されます。全体的な方針を定めるコンセプトであり、アーキテクチャパターンの上位機に位置付けられる抽象度の高いものと考えてください。"

■アーキテクチャパターン

"「特定の解決策を形成するのに役立つ低レベルの設計構造」と定義されます。アーキテクチャの方針を具体的なコードに落とし込んでいく際に適用するパターンであるため、2.2節で挙げた四つの抽象レベルでいうと、モジュール設計やコンポーネント設計にあたるところまでをカバーします。

 

3章 アーキテクチャの設計

3.1 アーキテクチャ設計の概要

▶ アーキテクチャの定義

【Page:100】

"

アーキテクチャ

 環境におけるシステムの基本的な概念や特性が、その要素や関係、および設計と進化の原則に具体化されたもの

(中略)本書では、アーキテクチャを図3.1.1に示す四つの側面で捉えます。

  1. アーキテクチャによって達成スべきこと:ビジネス要求、機能、品質特性
  2. 設計判断:比較評価マトリクス、ADR
  3. システムの形状:アーキテクチャモデル
  4. 文書・規約・ガイドライン:アーキテクチャ記述、開発規約、(自動化された)チェック

"

3.2 アーキテクチャドライバの特定

▶ アーキテクチャドライバとは

【Page:106】

"アーキテクチャを検討する上で重要な考慮事項のことを、アーキテクチャ上重要な要求またはアーキテクチャドライバと呼びます。"

3.3 システムアーキテクチャの選定

▶ サービス分割

【Page:106】

■Sagaパターン

"(前略)ところで、Sagaパターンを実現するには、左記の例の注文処理サービスのようにサービス間の調整役を置くオーケストレーションという方式と、調整役は置かずに各サービスが自律的に相互調整を行うコレオグラフィという方式があります。関係するサービスの数が少なく単純なケースを除いて、オーケストレーション方式を採用した方がよいでしょう。第2章で設計のポイントとして述べたとおり、処理フローロジックを担う役割は明確に分離した方が全体の見通しがよくなるからです。"

3.4 アプリケーションアーキテクチャの選定

▶ レイヤードアーキテクチャ

【Page:146】

"(前略)この問題点を解決する方法として、依存関係逆転の原則(DIP)を適用したレイヤードアーキテクチャの亜種と言えるものが考え出されました。オニオンアーキテクチャ、ヘキサゴナルアーキテクチャ、クリーンアーキテクチャなどです。これらのアーキテクチャは厳密には細かな差異はあるものの、主目的とコンセプトは同一で、アプリケーションにおいて最重要であるドメイン層を中心に据えることです。"

3.5 アーキテクチャの比較評価

▶ 比較評価マトリクスによるトレードオフ分析

【Page:160】

"

(Column)

アーキテクチャプロトタイピング

アーキテクチャ上の選択肢を比較評価するにあたっては、社内外の様々な情報源から収集した情報を活用しますが、机上の検証だけでは結論を導けないことがあります。たとえば技術的なリスクの解消に確信を持てない場合や、パフォーマンスに関するリアルなデータを収集したい場合などです。

 その場合は実際にコードを書いたり、ツールを触ってみたりするなど技術検証を行います。検証項目が多岐にわたる場合、それらを確認できるようなサンプルのアプリケーションを作ることがあります。

"

3.6 アーキテクチャの文書化

▶ アーキテクチャ記述

【Page:163】

"(前略)ADRは個々の設計判断を記録し共有することを目的とした軽量な文書ですが、アーキテクチャ全体を説明する文書も作成する必要があります。この文書は、アーキテクチャドキュメント、アーキテクチャ記述(SAD:Software Architecture Description)、アーキテクチャ説明書などの名称で呼ばれるものですが、本書ではアーキテクチャ記述という表記に統一します。"

▶ アーキテクチャモデル

【Page:171】

■C4モデル

"経費精算のケーススタディを題材に作成したシステムコンテキスト図の例を図3.6.5に示します。"

 

4章 アーキテクチャの実装

4.2 仕様書の標準化

▶ 設計書の標準化

【Page:188】

"(前略)一方で、どんなプロジェクトでも作成した方がよい設計書があります。ER図やテーブル一覧、テーブル定義書といったデータベースに関わる設計書です。"

4.3 ユースケース駆動のアーキテクチャ実装

▶ ユースケースの実装

【Page:195】

"(前略)ドメインを中心に据えるというクリーンアーキテクチャの思想からするとエンティティ層とユースケース層から取り掛かるのは筋が通っているのですが、アプリケーション基盤の観点ではこの層に用意すべき共通機能は多くないため、あまりそれにこだわる必要はありません。筆者の場合、早い段階で画面が表示されることを確認したいので、まずはコントローラー周辺(①)から着手することが多いです。"

4.4 アプリケーション基盤の実装

▶ トランザクション制御

【Page:211】

■トランザクション制御の実装方法

"(前略)もう一つは宣言的トランザクションです。処理内に直接トランザクション制御を記述するのではなく、設定ファイルやアノテーションを用いてトランザクションのスコープや振る舞いを定義する方法です。"

 

5章 品質保証とテスト

5.1 アーキテクトと品質保証活動

▶ テストタイプ

【Page:233】

"(前略)各々の品質特性に対して適切なテストを実施することで、開発したソフトウェアが品質基準を満たすことを検証します(図5.1.11)。"

5.2 機能テストの自動化

▶ ユニットテスト

【Page:240】

"(前略)もし他のユニットへの依存がある場合、実際の依存先ユニットを模倣して振る舞うテストダブルと呼ばれるユニットテストで代替します(図5.2.3)。図のBarStubクラスがBarクラスを代替するテストダブルです。

(Column)

テストダブル

  • スタブ(Test Stub)
  • スパイ(Test Spy)
  • モック(Mock Object)
  • フェイク(Fake Object)
  • ダミー(Dummy Object)

"

▶ インテグレーションテスト

【Page:245】

"(前略)ユニットテストとE2Eテストとの間の粒度のテストは、すべてインテグレーションテストと言えます。ですので、ユニットテストにおけるユニットの定義をプログラムの最小単位とする方法だと、二つ以上のプログラムを統合して行うテストがインテグレーションテストです。振る舞いの単位とする方法ならば、二つ以上のコンポーネントを統合するテストがインテグレーションテストです。"

▶ E2Eテスト

【Page:250】

■E2Eテストの特徴

"

(Column)

振る舞い駆動開発(BDD)

(前略)BDDでは、フィーチャー(ユーザーストーリーなどで定義される、ユーザーにとって意味のあるまとまった振る舞い)の実装に入る前に、フィーチャーの仕様を受け入れ条件という形で明確化します。

"

■ユニットテストのポイント

"(前略)なお、メソッド呼び出しの検証を行うための、テストダブルとしてスタブではなくモックを用います。

(中略)処理フローロジックの正しさはユニットテストで検証するのではなく、より上位のテスト(インテグレーションテストやE2Eテスト)に任せた方がよいというのが筆者の意見です。

(中略)筆者の経験上、テスト駆動開発やテストファーストで開発を進めると自然と90%を超えるカバレッジに到達するので、90%以上は一つの目安となる数値だと思います。"

■E2Eテストのポイント

"E2Eテストは作成コストと実行コストが大きいため、品質保証のためと言ってテスト数を増やし過ぎると、開発生産性やそのほかの品質特性を下げる要因となってしまいます。從って、E2Eテストの目的と範囲は明確にしておく必要があります。

(中略)

(Column)

テストコードへの投資

(前略)散らかったテストコードは技術的負債であり、プロダクションコードの品質低下や、プロダクトの開発速度の低下などの大きな問題を生み出す要因となります。ですから、テストコードにも必要な投資を行って負債化を防ぐべきなのです。

 テストコードの可読性や保守性を高めるためには、次の三つを意識するとよいでしょう。筆者は頭文字を取ってテストコードのSOSと呼んでいます。

  • 構造化されている(Structured)
  • 整理されている(Organized)
  • 自己文書化されている(self-documenting)

"

5.3 パフォーマンステスト

▶ パフォーマンステストの全体像

【Page:262】

"パフォーマンステストは、システムが性能効率性という品質特性を満たしていることの検証を目的としたテストです。パフォーマンステストは、検証の観点によってさらにいくつかのテストタイプに別れます(図5.3.1)。

(中略)

 筆者の経験上、パフォーマンステストの全体のリード役はアーキテクトが担うことが多いです。計画の立案からテストの準備、テストの実行、問題発生時の解決策の検討など、各局面において広範囲に及ぶ技術知識が求められるため、アーキテクトが主導するのが効果的だからと言えるでしょう。"

▶ 負荷テスト

【Page:266】

"負荷テストでは、業務のピーク時にシステム全体として所定のパフォーマンスが達成されることを検証します。そのため、単機能性能テストがチューニングを含めて完了していることが前提条件となります。少なくとも、負荷テストシナリオに含まれる機能については単機能性能テストが完了していなければなりません。"

 

6章 アーキテクトとしての学習と成長

6.1 アーキテクトとして成長するために

▶ アーキテクトの人材像

【Page:277-288】

"(前略)アーキテクトはアーキテクティングを専門領域とするスペシャリストであると同時に、ソフトウェアエンジニアリング全般の知識や経験を有するジェネラリストであることが求められます。

(中略)

アーキテクトという職種を選択し、その専門領域としてアーキテクティングを深耕していくためには、その土台として、IT技術やソフトウェアエンジニアリングに関する幅広い知識や経験を有することが必要となります。

 その上で、アーキテクティングに関する手法を学び、実際の業務で経験を積んでいきながら、アーキテクティングという中心の柱を太くしていきます。"

▶ 成長の道筋

【Page:280】

■基礎技術の習得

"(前略)すべての項目で一定水準に達しないとアーキテクトの仕事が始められないというわけではなく、当然得意分野や苦手分野もあるでしょうが、遅くともアーキテクトとしての修行期間中には足りていない箇所を補っていく必要があります。"

【Page:280】

■業務知識とソフトスキルの習得

"(前略)ソフトスキルはとても重要です。素晴らしい技術力を持っていたとしても、それをうまく発揮して、システムやプロダクトがもたらす価値へ変換できなければ意味がありません。技術力をいかんなく発揮し、ユーザーや顧客へ価値を届ける素晴らしいソフトウェアを開発することでビジネスに貢献する力を、技術貢献力と呼ぶことにします(図6.1.4)。技術貢献力は、アーキテクトが有する技術力とソフトスキルの掛け算です。技術力を最大限に活かすためにはソフトスキルの強化が欠かせません。

 ソフトスキルの源泉はリーダーシップです。リーダーシップとは、自分に求められた役割と責務を理解し、正しいゴールを設定して主体的に行動する意志のことです。チームリーダーやサブリーダーといった体制上の役割名を与えられているかどうかとは無関係に、プロジェクトに参加する全員がそれぞれのリーダーシップを発揮するべきです。"

▶ 仕事との向き合い方

【Page:282】

"アーキテクトとしてのキャリアアップと、アサインされる仕事の内容とがうまくマッチしていることが理想的ですが、実際にはそう都合よくいかないこともあります。おそらくみなさんのマネージャーは、個々人のキャリア志向と組織の目標達成とのバランスを取った最適な人員配置を試みているはずですが、時には本人の希望に沿わないアサインをお願いしなければならないこともあります。

 そのような場合でも、決して後ろ向きになってしまわないことです。スペシャリストであると同時にジェネラリストであるアーキテクトにとって、幅広い知識と経験は大きな武器となるものです。おおよそどんな仕事でも無駄になることはありません。幅を広げるチャンスを得られたと前向きに捉え、その仕事を通して何を見出すか、どんな力を身につけるかを考えることが生産的だと言えます。"

6.2 効果的な学習方法

▶ インプット

【Page:284】

■書籍

"多読によって様々な分野の情報を幅広く知ることもよいのですが、活用可能な知識としての質を高める上で重要なのは、良書を見つけ、良書を繰り返し読むことです。読書術に関する有名な書籍『本を読む本』では、良書の内容は一度読んだだけで到底理解できるものではなく、分析的に何度も読む必要性を説いています。

分析読書とは、取り組んだ本を完全に自分の血肉と化するまで徹底的に読み抜くことである。

"

▶ アウトプット

【Page:287】

■読書マップ

"読んだ書籍の内容を自分なりに整理し、要点をまとめることによって、理解を深める効果と記憶定着の効果を得ることができます。"

*[本]「ドメイン駆動設計をはじめよう」: ソフトウェアの実装と事業戦略を結びつける実践技法

なんとなく参加した増田さんのオンラインセミナで話を聞いて気になってしまったので購入して読んでみました。

www.oreilly.co.jp

概要

サブタイトル「ソフトウェアの実装と事業戦略を結びつける実践技法」に「実践」という言葉が含まれているとおり、事業で利用するシステムやソフトウェアの全てに対して理想的に設計&実装するのではなく、市場において競争優位を生み出す事業の中核となるドメインを見極めて、限られた経営資源を戦略的に集中させることを目的としています。単なる技術的なハウツー本ではなく、事業を理解して勝負どころや費用対効果を見極めて方法論を適切に使い分けるという点に主眼が置かれているのが特徴です。

感想

これまで、ドメイン駆動設計に関する書籍は「エリック・エヴァンスのドメイン駆動設計」をはじめ様々な書籍が発売されてきましたが、なんとなく敷居が高く理解も難しいものが多かったように思います。それらと比較すると、本書は大きく立ち往生してしまうこともなく、一気に本を読み進めることができました。本を読む前に前述のオンラインイベントで翻訳者である増田さんの話を聞いていたことも大きかったかもしれませんが、それを差し引いて考えてみても、これまでの書籍よりも相対的に読みやすく、より実践的な内容になっていると思えました。

参考

 

本書を読んでみて印象に残った点を中心に以下に書き留めておきます。

印象に残った点

印象に残ったフレーズや共感できた点などを以下にメモしておきます。

第Ⅰ部 設計の基本方針

1章 事業活動を分析する

1.2.2.3 変わりやすさ

【Page:11】

"前にも書きましたが、中核の業務領域は頻繁に変更されます。1回の開発で簡単に解決できる課題なら、おそらく競争優位の源泉にはなりません。そういう解決策では、競合他社がすぐに追いつくでしょう。ですから、中核の業務領域を対象にしたソフトウェア開発は、創発的な活動になります。さまざまな実装方法を試し、改善し、最適化することが必要です。もっといえば中核の業務領域のソフトウェア開発に「完了」はありません。企業は中核の業務領域を常に革新し進化させます。その変化はソフトウェアへの機能追加だったり既存機能の最適化だったりします。どちらの方法でも、中核の業務領域を持続的に発展させていくことが、競争優位を維持するために絶対に必要です。"

1.2.3 変わりやすさ業務領域の境界を明確にする

【Page:13】

"業務領域の特徴をしっかりとらえ、中核一般補完の三つのカテゴリーに分類することは、ソフトウェアを開発する時のさまざまな設計判断にかなり役立ちます。"

1.2.3.3 重要なところに焦点を合わせる

【Page:17】

"業務領域は設計判断をやりやすくするための道具です。どの組織でも、ソフトウェアが関係しない業務機能が競争優位の源泉となっていることが少なからずあるでしょう。たとえば、さきほど検討した宝飾品メーカーのデザイン業務です。業務領域を探す時は、ソフトウェアに関係しない業務を識別できれば、取り組んでいるソフトウェアシステムが対象とする業務領域に集中できます。"

1.4 業務エキスパート

【Page:21】

"業務エキスパート(ドメインエキスパート)とは、ソフトウェア開発の対象となっている業務領域の活動に精通した人たちです。ソフトウェア開発者がモデルを作成しプログラムを書こうとしている対象業務の込み入った内容を熟知している人たちです。別の言い方をすれば、業務エキスパートは対象領域について信頼できる情報源です。業務エキスパートは要求を分析し整理する専門家ではありません。システムを設計する専門家でもありません。業務エキスパートは業務領域の活動の代弁者です。"

2章 業務知識を発見する

【Page:25】

"この章で学ぶのは、意図を適切に伝え、知識を共有するためのドメイン駆動設計の基本的な道具である同じ言葉(Ubiquitous Language)です。"

2.3 意図の伝達

【Page:27】

"ソフトウェア開発プロジェクトが失敗した原因を調査した報告書によれば、効果的な意図の伝達は、知識の共有とプロジェクトの成功に不可欠です。"

2.4 業務で使う言葉

【Page:30】

"同じ言葉業務で使う言葉です。この点はきわめて重要です。同じ言葉に含まれるのは業務用語だけです。技術用語を含めてはいけません。(中略)同じ言葉の目的は、業務エキスパートの頭の中にある事業活動についての知識や考え方を、わかりやすく整理することです。"

2.6.1 モデルとは何か

【Page:32】

"

モデルとは、現実のモノや出来事を簡略化した表現です。特定の側面を意図的に強調し、一方で、それ以外の側面を意図的に除外します。モデルは用途を限定した抽象化です。

ーーレベッカ・ワーフスブラック

モデルは現実世界のコピーではありません。現実世界の仕組みがどうなっているかを理解するための作り物です。"

2.6.2 効果的なモデル

【Page:33】

"モデルには必ず目的があります。役に立つモデルはその目的にそった内容だけを表現します。たとえば世界地図に地下鉄の駅は不要です。一方で地下鉄の路線図からは正確な距離を知ることはできません。どの地図もその目的に合致する情報だけを提供します。この点はきわめて重要です。(中略)モデルは抽象化です。抽象化とは、複雑さをうまく扱うために、課題解決には必要としない詳細を取り除き、課題解決に必要な部分を抜き出す活動です。"

3章 事業活動の複雑さに立ち向かう

3.1 異なるモデルの混在

【Page:41】

"「あらゆることに手を出すと、どれもちゃんとできないという格言があります。一つの大きなモデルは、すべてを表現できそうです。しかし、最終的には、どんな用途にも役に立ちません。こういう大きなモデルは何をやるにしてもやっかいです。当面の用途に不必要な大量の詳細を取り除き、本当に必要な情報を発見することはたいへんです。そもそも、こういう大きなモデルを常に最新の状態に保つことはできないでしょう。"

3.2.2 同じ言葉の定義(改良版)

【Page:44】

"区切られた文脈(Bounded Context)によって同じ言葉(Ubiquitous Language)の定義が完成します。ドメイン駆動設計の「同じ」言葉は組織全体で統一した言葉を使うという意味ではありません。同じ言葉は広い範囲で通用する共通言語ではありません。

そうではなく、同じ言葉が通用する範囲は、区切られた文脈の境界の内部に限定されます。"

3.3.3 業務領域と区切られた文脈の対応

【Page:49】

"一つの業務領域であっても課題が複数あれば、別々のモデルを作るほうがよいでしょう。業務領域と区切られた文脈の対応を一対一に限定してしまうと課題解決の柔軟性が失われてしまいます。一つの業務領域に一つのモデルという固定観念は持たないでください。"

4章 区切られた文脈どうしの連係

4.1.1 良きパートナー

【Page:61】

"良きパートナーの関係で連係するには、二つのチームが協力することに習熟し、目標の達成に強い意欲を持ち、頻繁に同期を行うことが必要です。技術的には、それぞれのチームが継続的インテグレーションを頻繁に実施することで、連係に関わる問題の発生を最小にします。

良きパートナーの関係は物理的に離れたチームどうしでは難しかもしれません。同期や意図の伝達にいろいろな工夫が必要になるでしょう。"

4.1.2.3 モデルを共有するかどうかの判断

【Page:63】

"モデルを共有するかどうかは慎重に判断してください。モデルの共有は、やむを得ず使うことがある例外的な連係方法です。たとえば、物理的に離れている、あるいはチーム間で組織の利害関係が衝突している場合です。このような状況では、良きパートナーのような、円滑な意図の伝達と協力体制は期待できません。"

第Ⅱ部 実装方法の選択

5章 単純な業務ロジックを実装する

5.2.2 アクティブレコードをいつ使うか

【Page:85】

"アクティブレコードも本質的にはトランザクションスクリプトです。アクティブレコードの主たる目的はデータベース操作の最適化です。ですのでアクティブレコードの用途は、CRUD操作と入力値の妥当性検査のような、比較的簡単な業務ロジックに限定されます。

つまりアクティブレコードを使うのは、トランザクションスクリプトと同じく、以下の場合です。

  • 補完的な業務領域
  • 一般的な業務領域用の外部サービスとの連係
  • 区切られた文脈どうしを連係する時のモデルの変換

(中略)しかし、私は「貧血」とか「アンチパターン」という否定的な扱い方は避けたいと思います。アクティブレコードは一つの手段です。どんな手段でもそうですが、使い方によっては役に立つはずです。

🐦️ここで説明しているアクティブレコードは設計パターンです。ORMフレームワークのActive Recordではありません。設計パターンとしてのアクティブレコードは、マーチン・ファウラーが『エンタープライズアプリケーションアーキテクチャパターン』(翔泳社)で紹介しました。この設計パターンの実装方法の一つとして後から生まれたのがフレームワークとしてのActive Recordです。この本で説明しているのはアクティブレコードという、設計の考え方です。特定の実装方法を取り上げているわけではありません。

"

7章 時間軸でモデルを作る

【Page:117】

"イベント履歴式ドメインモデルでは、イベントソーシングを使って集約の状態を管理します。つまり、集約の状態を永続化するのではなく、集約の状態が変化したことを業務イベントで表現し、業務イベントの履歴を「真実を語る唯一の情報源」(the source of truth)として永続化します。"

7.1 イベントソーシング

【Page:117】

"

フローチャートを見てもテーブルを見ないと何もわかりません。テーブルのデータを見ればフローチャートを見る必要はありません。

ーーフレッド・ブルックス(邦訳『人月の神話』ピアソンエデュケーション、2002年

"

7.1.3 真実を語る唯一の情報源

【Page:126】

"イベントソーシングを実現するには、オブジェクトのすべての状態変更をイベントとして表現し、永続化することが必要です。永続化されたイベントが「真実を語る唯一の情報源」(the source of truth)となります。つまりイベント(event)ソーシング(sourcing)です。"

7.2 イベント履歴式ドメインモデル

【Page:130】

"「イベント履歴式ドメインモデル」という用語にした理由

「イベントソーシング」ではなく「イベント履歴式ドメインモデル」という用語にした理由を説明させてください。状態の遷移をイベントで表現するイベントソーシングは、さまざまな状態管理に適用可能です。イベントソーシングの適用対象は、ドメインモデルの部品である集約の状態管理に限定されません。そのため、集約のライフサイクルの状態管理にイベントソーシングを使っていることを明示するためには、イベント履歴式ドメインモデルという長い用語のほうが好ましいと考えました。"

7.2.2 欠点

【Page:132】

"イベント履歴式ドメインモデルは、業務ロジックを実装する究極のやり方であり、できるだけこの方法を使うべきだと思うかもしれません。もちろん、こういう単純な味方は「事業活動の視点で設計判断する」という原則から外れます。"

8章 技術方式

8.2.3 データアクセス層

【Page:142】

"データアクセス層は、永続化の仕組みと接続する機能を提供します。もともとは、データベースを指していましたが、プレゼンテーション層の場合と同様に、現代のシステムではデータアクセス層の責務は広がっています。"

第一に、NoSQLによる永続化方式の革新と急激な普及によって、一つのシステムで複数のデータベースを利用することが一般的になってきました。(中略)

第二に、従来のデータベースだけが情報を格納する媒体ではありません。たとえば、クラウドベースのオブジェクトストレージ(AWSのS3やGoogle Cloud Storageなど)を使ってシステムのファイルを保存したり、メッセージ通信基盤を介してプログラム間の通信を制御したりできます。

さらには、このレイヤーでは、プログラムの機能を実現するために、外部のさまざまな情報源と連係します。つまり、外部システムのAPI、あるいはクラウドのマネージドサービスとして提供される、翻訳、株式市場データ、音声転写などとの連係です。"

8.2.6 レイヤードアーキテクチャをいつ使うか

【Page:148】

"補足:レイヤーとティアの違い

レイヤードアーキテクチャはN層(N-Tier)アーキテクチャとしばしば混同されます。そしてその逆もまた然りです。この二つの方式は似ていますが、レイヤー(Layer)とティア(Tier)は異なる概念です。つまり、レイヤーは論理的な境界です。ティアは物理的な境界です。レイヤードアーキテクチャのすべてのレイヤーは、同じライフサイクルで変化します。つまり、レイヤーの集合が単一のユニットとして実装され、進化し、デプロイされます。"

9章 通信

9.1 モデルの変換

【Page:163】

"区切られた文脈はモデル、つまり同じ言葉の境界です。"

9.2.2 サーガ

【Page:175】

"サーガとは、開始から終了まで長く続く業務プロセスです。「長く続く」という意味は、必ずしも時間の絶対的な長さではありません。秒単位で終わるサーガもあれば、年単位で続くサーガもあります。重要なのはトランザクションの視点です。つまり、多数のトランザクションで構成される業務プロセスがサーガです。

[訳注]サーガはもともとは北欧神話の壮大な英雄物語のこと。転じて、複数の状態管理を大がかりに行う仕組みを指しています。"

第Ⅲ部 ドメイン駆動設計の実践

10章 設計の経験則

10.1 経験則

【Page:188】

"同じ言葉を一貫して使うために、区切られた文脈を広く区切ることも、狭く区切ることもできます。では、区切られた文脈の「最適な大きさ」とは何でしょうか。この問いかけは、区切られた文脈とマイクロサービスがしばしば同一視されることを考えると、特に重要です。区切られた文脈はできるだけ小さく区切るべきでしょうか。私の友人であるニック・チューンは、次のように言っています。

サービスの境界を決める時に役に立つわかりやすい経験則がたくさんあります。「大きさ」はもっとも役に立たないものの一つです。

区切られた文脈の大きさを決めてからモデルを作ってはいけません。役に立つのは逆のやり方です。つまり、モデルを作ってから区切られた文脈の大きさを決定します。"

10.4 技術方式の選択

【Page:192】

"どの技術方式を選択するかの経験則にもとづく判定方法は図10-4のとおりです。

図10-4 技術方式の判定方法
10.5 テストの基本方針

【Page:194-195】

"業務ロジックの実装方法とシステム構築の技術方法がわかれば、テスト方針を選択するための経験則としても使えます。テスト方針の三つの選択肢を見てみましょう(図10-5)。

図10-5 テストの基本方針

(中略)テスト方針の判定方法は図10-6のようになります。

図10-6 テスト方針の判定方法

11章 設計を進化させる

11.4.1 良きパートナーから利用者と供給者の関係へ

【Page:210】

"良きパートナーはチーム間の意図の伝達と協力がきわめてうまくいっている場合に成り立ちます。しかし時間がたつにつれて、うまくいかなくなるかもしれません。たとえばどちらかの区切られた文脈を遠く離れた別の拠点のチームが開発することになった場合です。そういう開発体制の変化は、チーム間の意図の伝達にマイナスに働きます。良きパートナーの関係を、利用者と供給者の関係に分類される三つの方法のどれかに変えることが現実的でしょう。"

11.6 システムの成長

【Page:211】

"システムの成長は、ソフトウェアが健全である証(あかし)です。機能の追加が続くのは、システムがうまくいっている証拠です。そのシステムは利用者に価値を提供し、さらなる要求に応え、競合プロダクトと対抗できています。しかしソフトウェアの成長は、よいことばかりではありません。開発規模が大きくなるにつれ、そのソフトウェアは大きな泥団子になってしまうかもしれません。

大きな泥団子は、その場しのぎの設計で、だらしなく、いいかげんで、つぎはぎだらけになったスパゲティコードのジャングルです。無秩序に機能を追加し、手っ取り早いやり方で修正を繰り返してきたことの、何よりの証拠です。

ーーブライアン・フートとジョセフ・ヨーダー

システムが無秩序に成長し、大きな泥団子になってしまうのは、機能を拡張する時に設計を再検討していないからです。成長することで、コンポーネントの境界が膨張し、ますます機能がそこに追加されます。"

12章 イベントストーミング

12.1 イベントストーミングとは何か

【Page:217】

"イベントストーミングとは、業務プロセスのモデルを迅速に作ることを目的に、関係者が集まって、ブレインストーミングスタイルで進めるローテクな手法です。ある意味で、イベントストーミングは、業務知識を共有するための戦術的なツールと言えるでしょう。イベントストーミングをやる時は、最初に、モデルの対象とする範囲、つまり探求する業務プロセスを決めます。参加者は付箋を使って、業務の進行過程で発生する一連の業務イベントを時系列に並べながら、対象としている業務プロセスを探求します。そして、アクター、コマンド、外部システムなどの要素を少しずつ追加しながらモデルを拡張します。業務プロセスの仕組みを説明できるところまで要素がそろったら、イベントストーミングは終了です。"

12.1 イベントストーミングをいつ使うか

【Page:229】

"イベントストーミングは、次のように、さまざまな目的で実施できます。

  • 同じ言葉の構築
  • 業務プロセスのモデル化
  • 新しい業務要件の探求
  • 失われた業務知識の修復
  • 既存の業務プロセスの改善方法を探る
  • 新しいチームメンバーへのガイダンス

イベントストーミングをいつ使うかに加え、いつ使ってはいけないかも、重要なことなので、ここで触れておきます。イベントストーミングは、探求する業務プロセスが単純だったり明白だったりする場合には、うまくいかないでしょう。たとえば、流れ作業のように、興味をひくような業務ロジックや複雑さを伴わない領域です。

13章 現実世界のドメイン駆動設計

【Page:235】

"

チーム全員がドメイン駆動設計を熟知し、最初から全員が役に立つモデルの探求に全力をつくし、当然のことながら、全員が同じ言葉を忠実に使っています。プロジェクトが進むにつれ、区切られた文脈の境界が明確になり、その境界は事業活動のさまざまなモデルをしっかりと保護しています。事業戦略と整合した実装方法が選択され、コードベースは体系的に整理されています。つまり、ソースコードが同じ言葉を語り、モデルの複雑さをうまく扱うための技法があちこちにちりばめられています。

残念ながら、これは夢物語です。目を覚ましましょう。

こういう理想的な状況でドメイン駆動設計に取り組めるとしたら、それは宝くじに当たったようなものです。もちろん、そういう可能性はゼロではありません。しかし現実には難しいでしょう。残念なことですが、多くの人は、ドメイン駆動設計を適用できるのは、新規の開発案件でドメイン駆動設計に熟達したメンバーがそろっている場合、という理想的な条件を満たしていることが必要だと誤解しています。皮肉なことに、ドメイン駆動設計が大きな効果をもたらすのは、すでに稼働しているソフトウェアに取り組んだ場合です。つまり、事業への貢献が実証されていて、積み重なった技術的負債と膨れ上がった設計の乱雑さを刷新する必要があるシステムこそ、ドメイン駆動設計で取り組む価値がもっとも高いのです。偶然にも、多くの技術者が取り組んでいるのは、このような、変更がやっかいで危険な大きな泥団子のコードベースです。

ドメイン駆動設計についてありがちな誤解に「すべてかゼロか」に二極化思考があります。ドメイン駆動設計のすべての技法を使うことがドメイン駆動設計であり、一部の技法だけを使うのはドメイン駆動設計ではない、というとらえ方です。そんなことはありません。ドメイン駆動設計のあらゆる側面を理解することは簡単なことではありません。ましてや、すべての技法を習得して実践することは、おそらく不可能でしょう。幸運なことに、すべての技法を取り入れなくても、ドメイン駆動設計は価値を生み出します。このことは、ドメイン駆動設計を既存システムに適用する場合は特に重要です。既存システムの修正や拡張に取り組んでいる場合、限られた時間の中であらゆる技法を取り入れることは不可能です。"

13.2 設計改善の基本方針

【Page:239】

"この機会に「システム全体を一から書き直し、すべての設計とコードをきれいにしよう」という挑戦が成功することは、ほとんどないでしょう。そして、そういう技術視点のシステム再構築を経営陣が支持することは、まずありえません。

既存システムの設計を改善する安全なやり方は、「大きな絵」を描き、「小さく始める」ことです。エリック・エヴァンスが書いているように、大規模なシステムのすべてをうまく設計することはできません。それが現実です。ですから、どこを重点的に改善するかを戦略的に判断しなければなりません。この戦略的判断の準備として、システムを複数の業務領域に切り分けます。その境界は、コードベースを物理的に分割するような、本格的な区切られた文脈である必要はありません。そうではなく、論理的な境界(名前空間、モジュール、パッケージなど)と業務領域の境界を対応させるところから始めます。"

第Ⅳ部 他の方法論や設計技法との関係

14章 マイクロサービス

14.3.3 業務領域

【Page:268】

"マイクロサービスを設計する経験則として、区切られた文脈集約よりもバランスがとれているのは、サービスの境界を業務領域に合わせる方法です。第1章で学んだように、業務領域は、細分化された事業活動であり、さまざまな業務活動が相互に連動します。業務領域は、企業が競合他社と競争するために必要となる、事業活動の構成要素です。事業活動の観点では、業務領域は事業が提供するサービス、つまり事業として何をするのかを説明するものであり、サービスをどのように実現するかは説明しません。技術的な観点では、業務領域は強い関連性を持った一貫したユースケースの集合です。つまり、事業活動の同じモデルを使い、同じデータもしくは密接に関連するデータを処理し、機能的に強く関係します。

(中略)

多くの場合、ユースケースの集合を小さな単位に分割すると、公開インターフェースが複雑になり、モジュールとしては浅くなります。これらの理由から、業務領域に合わせてマイクロサービスの境界を設計することは、安全な選択肢です。

マイクロサービスの境界を業務領域に合わせることが無難な経験則です。ほとんどのマイクロサービスによってはそれが最適解です。"

15章 イベント駆動型アーキテクチャ

15.1 イベント駆動型アーキテクチャとは?

【Page:276】

"簡単に言えば、イベント駆動型アーキテクチャとは、システムのコンポーネント間で、イベントメッセージを非同期でやりとりする技術方式です。他のコンポーネントのエンドポイントを同期式で呼び出すのではなく、コンポーネントは、業務領域で何か変化が起きたことを他のコンポーネントに通知するために、イベントを発行(publish)します。他のコンポーネントはシステムで起きた変化をイベントとして購読(subscribe)し、そのイベントに応じた動作をします。第9章で説明したサーガは、典型的なイベント駆動型アーキテクチャです。

イベント駆動型アーキテクチャとイベントソーシングの違いをはっきりさせておきましょう。第7章で検討したように、イベントソーシングは、状態の変化を一連のイベントとして補足する方法です。

イベント駆動型アーキテクチャとイベントソーシングは、どちらもイベント(出来事)に注目します。しかし、二つの方式は異なる考え方です。イベント駆動型アーキテクチャはサービス間の通信方法です。一方で、イベントソーシングはサービス内部の実装方法です。イベントソーシングのイベントは、サービスの内部状態の変化(イベント履歴式ドメインモデル集約の状態の変化)を表現します。イベントソーシングは事業活動の複雑さを把握するための方法です。システムの他のコンポーネントと連係することを意図した方法ではありません。"

15.2 イベント、コマンド、メッセージ

【Page:277】

"イベントはメッセージの定義と似ています。しかしこの二つは同じではありません。イベントはメッセージです。しかし、メッセージの種類はイベントだけではありません。メッセージは、イベントとコマンドの二つに分類できます。

  • イベント:すでに起こった変化を表現したメッセージ
  • コマンド:これから実行すべき操作を表現したメッセージ

イベントは過去に起きた何かです。それに対しコマンドはこれからやるべき何かを示します。イベントとコマンドのどちらも非同期メッセージとして送信されます。"

15.3.6.1 最悪のケースを想定する

【Page:289】

"アンドルー・グローブが書いたようにパラノイア(病的な心配性)だけが生き残ります(邦訳『パラノイアだけが生き残る』日経BP社、2017年)。イベント駆動型システムを設計する時は、この考え方を指針にしてください。

  • ネットワークはかならず遅延する
  • サーバーはもっとも都合が悪い時に故障する
  • イベントは順番通りには届かない
  • イベントは重複する

そして忘れてはいけません。こういう障害が起きるのは、決まって休日が祝祭日です。

イベント駆動型アーキテクチャの「駆動」が意味するのは、システム全体が、メッセージが確実に届くということに依存しているということです。ですから「うまくいくだろう」という期待は捨ててください。何があっても、イベントが確実に届く仕組みを工夫してください。"

16章 データメッシュ

16.1.2 特性テーブル

【Page:297】

"このように特性を高度に正規化する理由は、分析計システムでは柔軟な検索が必要だからです。この正規化が、業務系モデルと分析計モデルのもう一つの違いです。業務系モデルでは、業務的に必要な検索を特定できます。分析系モデルでは、必要な検索パターンを予測できません。分析担当者はさまざまなやり方でデータを検索します。将来どんな検索をするのかはわかりません。そのため、高度に正規化しておいて、検索、絞り込み、そして異なる特性をまたがる事実データのグルーピングを必要に応じて動的に行うことを支援します。"

16.2.2 データレイク

【Page:304】

"さらに言えば、データレイクはスキーマレスです。つまり、取り込むデータに対して構造的な制約がなく、データの品質が保証されません。そのため、データレイクのデータは、ある程度の規模になると、かなり乱雑な状態になります。データレイクは、情報の発生源からのデータの取り込みは簡単ですが、データの利用は難しくなります。あるいは、よく言われることですが、データのレイク(湖)がデータの「沼」になります。沼のようにカオスになったデータの意味を解釈し、価値のある分析データを抽出するデータサイエンティストのしごとは、桁違いに複雑になります。"

結びの言葉

【Page:313】

"ドメイン駆動設計の探求を追えるにあたり、本書の最初で引用した、次の言葉に立ち戻りたいと思います。

課題の合意なしに解決方針の話をしても無意味である。解決方針の合意なしに実現手段の話をしても無意味である。

ーーエフラット・ゴールドラット・アシュラグ

この言葉こそ、この本で探求してきたドメイン駆動設計の本質です。

最後に

【Page:319】

"最後に一言。同じ言葉をつかって開発できているか、いつも気にかけてください。疑わしい時はイベントストーミングをやってみましょう。幸運をお祈りします。"