mongolyyのブログ

開発(Javascript, Typescript, React, Next.js)や開発手法(スクラム, アジャイル)、勉強したことについて色々書ければと。

「ちょうぜつソフトウェア設計入門」を読んだ

はじめに

メーカーのコーポレート部門でテックリードとして働いてるモンゴルです。
今回はXで話題になっていた「ちょうぜつソフトウェア設計入門」を読みました。感想を書いていこうと思います。

感想

設計原理、原則に一歩近づけた

各章、例えば、クリーンアーキテクチャで4層構造が説明されますが、経緯、その根本にある原理が書いてあって腹落ちしやすかったです。
筆者がこれまで、設計概念を抽象的にとらえて理解していたんだなと感じ、ただただすごいと感じました。

自分の印象に残ったのは、安定度の話です。
安定度が高いもの、普遍的なものを中心とすることで、変更しやすいソフトウェアが開発できる。
そして中心にモデルを置き、その外側に人側がやりたいことに関するレイヤー、使用する技術に関するレイヤーを置くという依存関係にすることで安定度が高くなると理解しました。

オブジェクト指向の理解が深まった

今まで、「カプセル化、継承、ポリモーフィズムが実装可能であればオブジェクト指向だー」くらいの雑な理解でした。
本書を読んで、「オブジェクト指向は複雑なプログラムの設計に対峙した人間が理解しやすいようにメタファーを与えて整理しようとした試み」ということを初めて知りました。

この前提に立つと、ただやみくもに継承を使うということは発生しない思いました。
また、「業務分析、ビジネス分析をしたときに整理した考え方を設計、開発に生かすために存在するんだ」という意識が高まり、分析、設計、開発は連続性をもって取り組むと良さそうとも思いました。

情報のモデリングの中で、現実そのものを表すのではなく、恣意的に分析した部分的な断面という表現も印象に残りました。
ただやみくもに分析するのではなく、顧客価値、事業価値を見据えて分析することで価値のあるモデリングができるんだと思いました。

テスト駆動開発が設計手法だということを改めて理解できた

以前、研修でTDDはテストの手法ではなく設計の手法だということを聞いたことがありました。
その時は例もなかったのでしっくり来ていなかったのですが、本書はサンプルコードがあり、テストしやすくすることで、抽象化が発生し、その結果、単一責任原則、オープンクローズド原則などが保たれやすくなると理解しました。

逆にBDDについて、TDDと似た印象を持っていましたが、本書を読んで違う結果が得られる、長所が違うということも学べました。

おわりに

本当はもっと書きたかったのですが、字数もそこそこいったのでこの辺にしたいと思います。
Xでの話題通り、めちゃくちゃ良書でした。いい意味で表紙詐欺、タイトル詐欺でした。(笑)
章立てが秀逸で、扱っているテーマは広範囲のはずなのに、しっかり流れがあって筆者の言いたいことが伝わってきたのがすごかったです。

クリーンアーキテクチャ本やエヴァンス本を読んで、もやもやしている若手におすすめの本でした。

「ふりかえり」でうまくいっている兆候とは

はじめに

メーカーのコーポレート部門でテックリードとして働いているモンゴルです。
最近若手のスクラムマスターと話しているときに、自分が思ったことがあったので、備忘録として残しておこうと思います。
ちなみに、スクラムマスター時代にこんなことが完璧にできたかといわれると、そうでもないのですが、自分を棚に上げて書きたいと思います。
本記事は、スクラムマスターがふりかえりのファシリテーターをしているという前提で書きます。

若手スクラムマスターの参考になれば幸いです。

私が考える、うまくいっているふりかえりの兆候とは?

自分が思いつかないアイデア、意見が出ている だと思っています。
スクラムマスターとしては皆の能力を引き出し、コラボレーションを生み、チームでないと得られない視座、視野の考えが得られるようにリードし、サポートするというのがあると思っています。

極端な話、ふりかえりをやった結果が、毎回スクラムマスターが想像しうる範囲内で収まるのであれば、一人でやっていることと変わらず、スクラムマスターが1時間とって整理してもいいのでは、と思っています。
意見が収束することばかりを目指すのではなく、手が付けられねーぜーくらいにしてもOKな心の余裕を作れるといいと思います。

じゃあどうするか?

「いや、そんなこと言ったって難しいじゃん」といわれるかもしれないですが、個人的には次の3つを気をつけると変わると思っています。

  • 俯瞰した視点で話の流れを見る
  • 違う視点で意見、アイデアを見る
  • 自分たちは気づけていない、言語化できていない何かがある と考える

それぞれについて、深掘っていきます

俯瞰した視点で話の流れ、内容を見る

俯瞰していくと、場の流れが見えてきます。
議論の流れに集中できると、細かい話に行きすぎたり、変な方向に進んでいるときに、その状況を認知、「一旦止める」というアクションがとりやすくなります。

俯瞰して場の流れを見るためにできることは、「自分は意見を持たない。意見を持っても言わない」ことだと思います。
自分が意見を出すと細かい話に頭が持っていかれるので全体が見えなくなります。
なので、「通りがかりの人ですけど」くらいの気持ちで、ファシリテートするといいと思います。

そもそも、ファシリテーターなので、公平な立場で会議を導くというのが役割ですよね?

違う視点で意見、アイデアを見る

アジャイルコーチはだったらどう見るか?先輩スクラムマスターだったらどう見えるか?POはどう見えるか?マネージャーからはどう見えるか?ステークホルダーからどう見えるか? 違った視点で見ることで、新たな角度からの問いかけ、多様な観点のアイデアを誘発できます。

じゃあ、「この人たちの視点をどう取り入れるか?」ですが、積極的に本人に聞いてみる、FBをもらうというのが手っ取り早く、効率がいいと思います。
怖いと思いますが。
ただ、これをやらないといつまでたってもその人たちと視座はあわず、周りからすると「自分にベクトルが向いている。自分たちにベクトルが向いている」と思われます。

あの日ハッカーに憧れた自分が、「ハッカーの呪縛」から解き放たれるまで - Speaker Deck

つまり、いつかは避けられないルートであり、早めに当たって仲良くなっている方が気楽じゃんと私は思っています。

また、これはスクラムマスターだけが背負う必要もなく、チームメンバーに役割を背負ってもらうことでもできますよね?

agile-monster.com

自分たちは気づけていない、言語化できていない何かがある と考える

チームメンバーに対して、HRTの原則に則って接していくと良いと思っています。

  • 謙虚
  • 尊敬
  • 信頼

自分が意見しなくてもうまく回っていくと信頼できてますか?どうやったら信頼できるようになりますか?を自問自答できていますか?

また、謙虚という言葉に関しては、今までの自分たちのプロセス、運営、考え方に対して謙虚であるか?もっといい方法ないですか?と、常に問い続けていきたいです。

これに関しては、技術選定でも同様のことがいえると思います。もっと良いものがあるに違いない。もっと進めようと追及する姿勢、行動がプロダクトの成長、チームの成長、個人の成長につながってくると思います。

mongolyy.hatenablog.com

悪手の中に良手が潜んでいると思って広い心、幅広い視点で物事を見るのも重要だと思っています。
良手の中の良手は誰でも思いつくことであり、それがやれていないということは、「その手はそこまで良い手ではない」 もしくは 「ふりかえる必要もなく、やりなよ」ということかもしれません。

おわりに

思った以上に長くなったのでこの辺にしようと思います。
こういうことが気になった方は、「チーム・ジャーニー」という本にめっちゃ良きことが書かれていておすすめなのでぜひ読んでみてください!

「ソフトウェアアーキテクチャ・ハードパーツ」を読んだ

はじめに

メーカーのコーポレート部門でテックリードとして働いてるモンゴルです。

今回は「ソフトウェアアーキテクチャ・ハードパーツ」という本を読みました。

以前、読んだ「進化的アーキテクチャ ―絶え間ない変化を支える」と、同じ著者であり、具体的な例が出ているという噂を聞いたので読んでみました。

mongolyy.hatenablog.com

感想

「進化的アーキテクチャ」で腹落ちできていなかった部分が理解できた

「進化的アーキテクチャ」では「アーキテクチャ量子」の概念がよくわかっていませんでした。

アーキテクチャ量子」の特定については、「独立してデプロイ可能か?」が観点になってくること、特定するメリットとして、アーキテクチャ毎に可用性、スケーラビリティ、アジリティを変えられるというのがあると理解しました。

アーキテクチャ量子」を適切に分割すると、小さいチームで扱えるようになって機動性はあがるんだろうなくらいの認識でしたが、本書を読んで、ビジネス的競争力が必要なところを識別して、適切に力をかけられるというのはありそうだと感じました。

また、本書を読む前は「適応度関数は何に対して設定すればいいんだ?」ともやもやしていました。 本書を読んで、「アーキテクチャ量子」の特定、モジュールの分割、サービスの分割を通して、そのモジュール、サービスにおいて大事な要素が特定でき、それを統制するための適応度関数を作れば良さそうということもわかりました。

ADRいいねって思った

本書を通じて学んだのは、「技術的意思決定について、トレードオフを明らかにし、議論し、決定していく、その過程をADRにまとめる」という技術に対する真摯な姿勢でした。
この姿勢を体現するためにもADRを作るという規律が役に立ちそうだと理解しました。

コンテキストによって技術的な意思決定は変わってくると思っています。 これが分からないことによって、統一感のないアーキテクチャになったり、新メンバーの認知負荷を生むと思うので、ADRを作ることでコンテキストと意思決定を明確にしたいなーと思いました。

おわりに

対話形式で話が進んでいくので、読み物として読みやすかったです。

個人的には、トレードオフを分析する15章が好きでした

進化的アーキテクチャ ―絶え間ない変化を支える」や「ソフトウェアアーキテクチャの基礎 ―エンジニアリングに基づく体系的アプローチ」(後者は読んでないですが)で取り上げられた考えが出てきて、具体的に実践する場面を描いた本になるので、これらを読んでもっと知りたいと思った方におすすめです!

「フロントエンド開発のためのセキュリティ入門」を読んだ

はじめに

メーカーのコーポレート部門でテックリードをしているモンゴルです。
最近はフロントエンド開発をメインにやっていることもあり、今回、「フロントエンド開発のためのセキュリティ入門」を読んだので感想を書いていこうと思います。

感想

ブラウザが守ってくれている

次のような機能は本書を読んで知りました。

  • 許可されたHTTPメソッドを含むリクエストが飛ばないようにプリフライトリクエストが事前に飛ぶ場合がある
  • 異なるオリジンで許可されていないレスポンスについてはJSに渡さないという制御が入っている
  • サイドチャネル攻撃から守るために、レンダリングプロセスがドメインごとに独立している

安全なWebアプリを作るためにはユーザー側が安全なWebブラウザを使っていることが前提になるし、一般公開されたサイトの場合は脆弱性を含むブラウザからのリクエストに対して最悪な事態にならないように設計する必要があるなということが分かりました。

ReactでもXSSは気をつける必要がある

Reactを使っているとXSS対策が組み込まれていて、 dangerouslySetInnerHTML を使わない限り気にする必要はないと思っていました。
しかし、本書を読んでjavascriptスキームのXSSはコンソールで警告が出るものの、機能的に防いではいないということを知りました。

azukiazusa.dev

クリックジャッキングなども防げるという理由から、私がよく使うNext.jsを使う場合、理由がない限りCSPは設定した方が良さそうだと感じました。

nextjs.org

おわりに

ハンズオンがあったのがすごくよかったです。
個人的にはただ文字を追うだけだと、ちゃんと理解できず想像で補完しながら読むことが多かったので助かりました。

ハンズオンがあってわかりやすいので、フロントエンド開発をしているエンジニアの方は、自分が分かっていない項目だけでいいので読むことをお勧めします。

AWS Certified Database – Specialtyの合格体験記

はじめに

メーカーのコーポレート部門でソフトウェアエンジニアをやってるmongolyyです。
今まで数年間RDSを使用して業務をしており、体系的に学びたいと考えていました。 そんななか、今回「AWS Certified Database – Specialty」という資格を取得したので、その合格体験記を書いていこうと思います。

AWS Certified Database – Specialty って何?

概要

AWSのデータベース関連のサービスを使用した設計、移行、運用のための知識を有することを示す資格です。
前提となる資格はありませんが、「AWS Certified DevOps Engineer - Professional」を保持していると、キャッチアップは楽なように思いました。
詳しくはこちらをご覧ください。

aws.amazon.com

試験内容

試験時間は3時間で、65問です。750/1000点で合格です。
私が受けた時は2時間程度で終わり、759点でした。(めっちゃギリギリ

どうやって勉強したか?

勉強時間

7時間程度
次の点から、勉強量は少なくて済みました。

  • 普段RDSを使用していること
  • AWS Certified DevOps Engineer - Professional」を保有しており、AWSのデータベース系サービスについては一通り理解していること

また、AWSの再試験受験キャンペーンが開催されており(現在は終了済み)、落ちてもいいやーという気持ちで受験しに行きました。

勉強したもの

次の本を読みました。
知識編と練習問題の二部構成になっており、知識編は知らないサービス辺りを重点的に、練習問題は一通り解いてわからなかったことを公式ドキュメントを調べるなどして理解を深めました。
練習問題の解答の説明が丁寧でかなり良かったです。

おわりに

今回の試験勉強により、今までちょっとふわふわしていたNoSQLのインデックスの位置づけが理解できてよかったです。
引き続き精進していきたいと思います。

アジャイル開発におけるドキュメント管理で思うこと

はじめに

メーカーのコーポレート部門でエンジニア兼スクラムマスターをやっているモンゴルです。

mongolyy.hatenablog.com

の続きを書いていこうと思います。
前回は次のことを書きました。

  • ドキュメントを作ることで対話が生まれ共通認識を作ることは大事ということ
  • 環境によって整備できていない現場、整備されていなくても成立している現場があったこと

今回はアジャイル開発においてどういうドキュメントが必要なのか?どうやってメンテナンスしていくか?ということを書いていこうと思います。

TL;DR

  • イテレーティブにソフトウェア開発をしていくときに重要なのは認知負荷の低さ
  • CIで統一感を作り、認知負荷の低さを保持していく
  • 自動化できないところをドキュメントを使用しながら認知負荷を下げていく
    • 継続的にメンテナンスしていく仕組み作りも考える
  • その時点で共通認識を作るための、ドキュメントも重要
    • その時点でしか使われないと割り切って作っていく

ソフトウェアを作るにあたって大事なこと

継続して開発されるソフトウェアを開発するうえで大事なのは、認知負荷が低いソフトウェアにし続けることだと考えています。
アジャイルな開発では、検証、実験、ということで今まで考えていない仕様が追加されることがあります。
また、プロジェクトが続けば人の入れ替わりもあると思います。

ここで重要なのが認知負荷の増加を抑えるかです。
カオスに向かっていく、ソフトウェア開発の中で認知負荷の増加を抑えるためには、次のような要素があると考えています。

  • 一般的な概念、思想を取り入れて設計されていること
    • 新しく入ってきたメンバーも、既知であったり、知らなかったとしても学習資材があるので学習コストが低くなります
  • 設計やコードに統一感があること
    • コアなメンテナがいて、その人がリーダーシップを発揮することが重要だと考えています

ただし、上記を実践しようとしたときに、ドキュメントを作り、人がレビューで指摘しながら、認知負荷を低く保っていくことになりますが、限界があります。
そのために必要なのがCIです。

CIで認知負荷を低くする

テストを書く

テストは期待する挙動が書かれているので、仕様書となりえます。
これによって、何が想定された挙動なのか把握できるため、認知負荷増加を抑えます。
というか、想定された挙動が分からないと、一からコードを読んだり、関係者に聞く、実際に動かして確かめるなどが必要であるため、認知負荷が爆増します。

GitHub Actionsで色々仕込む

Linterでチェックして、統一感のあるコードを書くのが重要です。場合によってはコードの依存関係をチェックする自作のツールを作るといいでしょう。
適応度関数を導入し、そのソフトウェアで重要な指標を定め、それを定期的に計測していくことも重要です。
「適応度関数とは?」という方は次の書籍がおすすめです。

mongolyy.hatenablog.com

また、設計書の類、例えばER図の生成も可能だと思います。

devblog.thebase.in

自動化の前提となるところ、自動化できないところをドキュメントを使用しながら認知負荷を下げていく

自動化にも限界があると思います。そういう箇所について、ドキュメントを作っていくといいと思っています。
ただし、継続的にメンテナンスされるドキュメントを作っていくために、メンテナンスすべきドキュメントとしないドキュメントを分けることが重要だと思っています。
次の記事のように、継続的に仕分けをするプロセスなどを検討するといいと思います。

zenn.dev

ドキュメントで共通認識を作る

上記は運用ルールやアーキテクチャ図など、現時点でのHowやWhatを説明するイメージで書いていましたが、人に説明するために、複数のHowを整理したり、過去のWhyを残しておいて共通認識を作ることも重要だと思っています。
例えばADRです。

blog.studysapuri.jp

意思決定は後から追いづらく、「何故かこうなっている」ということになりがちなので、方針だけでなくその経緯も見られるようにしておくと良いでしょう。

また、前回記事にも書きましたがドキュメントを作るだけでなく、それをもとに会話するというのが重要だと考えています。
その時点でしか使われないかもしれませんが、会話が起きれば目的達成だと私は思うようにしています。
メンテナンスされないことは悲しいですが、ポジティブにとらえて割り切って作っていくのもありだと思います。

おわりに

偉そうに書きましたが、あくまで私はこう考えるという話です。
皆さんの置かれている状況によっても、「どういう点に気をつける必要があるか?」という点は変わってくると思います。
皆さんが、持続可能なドキュメント管理を考えるときの一つの参考になれば幸いです。

スクラムにおけるドキュメント管理で思うこと ~序文~

はじめに

メーカーのコーポレート部門でエンジニア兼スクラムマスターをやっているモンゴルです。

皆さんはドキュメントを書いてますかー?
私は、「ドキュメントは作るけど、認識共有のためのその場限りのものしか作らない。設計書といわれるものも極力作らない。ソースとテストコードが全てやー」という偏った考えを持っています。
私と同じタイプの方もいると思うのですが、一方、「ちゃんとしたドキュメントがないなんておかしい!設計書がこんなにないなんて途中からJOINした人に不親切だ!!」という人にも遭遇します。

今後も、私と異なる考えをもつ方と遭遇した時のために、私はこう思ってるよーを表明しやすくするために、考えを整理しておこうと思います。
案外長文になりそうなので、私が遭遇する問題と本編を分けて書いていこうと思います。
私見が満載ですが、考え方の一つとしてこれを読んだ方のお役に立てれば幸いです。

また、今回はスクラムを導入している場合を想定して書いていこうと思います。

私の思考の前提 その1

ドキュメントを作ること自体は問題ないと思います。
むしろ、私自身はUMLとか好きだったりもするので、ドキュメントをたたき台として議論して共通認識を作ることはいいことだと思っています。

UML モデリングのエッセンス 第3版 (Object Oriented SELECTION)」や「エリック・エヴァンスのドメイン駆動設計」でもドメインエキスパートとドキュメントをベースに対話することが重要だと書かれており、私も共感しています。

mongolyy.hatenablog.com

mongolyy.hatenablog.com

で、だいたい私が揉めるのは次の二点

  • なぜこのドキュメントがないんだー問題
  • それを作るのはいいけれど、メンテナンスは誰がすんのさ問題

この二点について思っていることを書いていこうと思います。

なぜこのドキュメントがないんだー問題

「今まで必要性を感じた人がいなかったか、作るスキル、時間、ガッツがある人がいなかったから無い。
気づいてくれて、ありがとう。
あなたが必要だったら、あなたが作ればええやん。 チームのタスクとして取り組みたいなら、次のスプリントでバックログに積めばよろしいやん。」

と、冷たいかもしれませんが、思ってます。

ここで考え直す人もいますし、残念ですが指摘するだけで、私の反応を無視する人もいます。
ただ、ここで揉めるのがなんでもかんでもドキュメントを作ろうとする人です。
これが次につながってきます。

それを作るのはいいけれど、メンテナンスは誰がすんのさ問題

作るのは全然Welcomeなんですが、そこそこの頻度で改訂されないと陳腐化するドキュメントです。
改訂されないドキュメントはwikiの検索のノイズになってくるので非常に厄介な存在です。
また、チームメンバーが陳腐化していることに気づかずにリファレンスにすることで、ミスリードされる場合もあります。

スクラムの場合は、頻繁に機能が追加、変更、削除されるので、ドキュメントへの影響は、ウォーターフォールと比べて大きいです。

個人的に、チームの合意を得ずに安易に作っていいものと、安易に作らない方が良いものを分けるとしたら、次のように考えています。

  • 安易に作っていいもの
    • 改訂されにくい。陳腐化しにくい。陳腐化しているかもしれないと察せられるもの)
    • 例えば、
      • 技術調査の結果報告
      • 採用技術の意思決定の議事
    • スクリプトSQLチートシート
  • 安易に作らない方が良いもの
    • 改訂されやすい。陳腐化しやすい。初見で陳腐化しているのか判断がつきにくいもの
    • 設計書のようなかっちりした体裁のドキュメント
    • 例えば
      • クラス設計書
      • テーブル定義書(簡易的なER図だけで十分な時がある)

私の思考の前提 その2

私自身の育った環境の影響も大きいと思います。

  • SIer時代、ドキュメントに誤りがあったり、変更し忘れて結果として誤りになっているものの修正に追われた経験
  • パッケージソフト開発会社時代、メンテナンスされるドキュメントは開発環境構築手順と開発Tipsくらいしかなかったが、みんなソースコードとテストコードを読んで、開発普通にできていた
  • Webベンチャー時代、同じくドキュメントはほとんどなかったが、Dockerやmigrationなどの仕組みで開発環境構築すら、かなり簡単なものになった

以上より、しっかりしたドキュメントがあった時の負の感情、メンテナンスされるドキュメントがほとんどない場合の成功体験、ツヨツヨなエンジニアだったら、設計書とか読まずともソースとテストを読めばわかるでしょという偏見があるというのも大きいと思います。

次回予告

長くなったので、一旦区切りたいと思います。
次回は、私の考える二つの方向性の紹介とその比較をしていきたいと思います。

  • ドキュメントを作る、メンテナンスが定期的に行われる環境を作る
  • ドキュメントを作るが、その場での認識共有のみで使用する。記録は残すが、マスターとはしない

次回をお楽しみに!