「がんばりすぎない設計判断を支えるリファクタリングとリアーキテクティング(仮)」
by 和田卓人
【オンライン開催】銀座Rails#34@リンクアンドモチベーション - connpass
2021.06.18
オファーレター
お題ですが、「Railsエンジニアのためのソフトウェア設計入門」的なものをと考えておりまして、
Railsしか触ったことがないエンジニアが、設計に対して視野を広げるために、
何を学んでいったら良いかの指針を得られる内容だと嬉しいなぁ思っております。
お願いしようと思ったきっかけは、
最近現場の若手のエンジニアの方が、Railsを触りつつも、
DDDやマイクロサービスなどのキーワードに触れ、
設計というものについて意識が高まっていることを感じておりまして、
そんな中texta.fmややさいちさんのお話(前回の銀座Rails本編や懇親会)から、
ぜひ和田さんにお話頂けたらなと思った次第です。
講演録
生煮えの新作講演
テスト駆動開発は出てくるよ
依頼内容
若手のエンジニアに発想のヒントとなるような、抽象度高めの、色々なところにポインタを張ったような話を
前提
ITは事業のコアになった
ソフトウェアがハードウェアのおまけだった時代の終わり
人によってはこれをDXと呼ぶ
ところてん(@tokoroten)
なんとなく、DXという言葉に対しての引っかかりが理解できてきた気がする
「デジタル」という言葉に「アジリティ」という意味が含まれていないので、
「変更容易性の高いソフトウェアによるアジリティの獲得」というDXの本質がソフトウェアエンジニア以外には伝わってない感じなんだな
https://twitter.com/tokoroten/status/1385826623451111424
変更容易性の高いソフトウェア→?→アジリティの獲得
パスが遠いので、つなぐための材料を提供する
『Emergent Design: The Evolutionary Nature of Professional Software Development』
この本を題材に過去に公演したことがある
Emergent Design - ObLove 2009 summer
at オブジェクト倶楽部
創発的設計
仕様の変更や、既存の仕様のより深い理解、また新たな技術、よりよいアイデア、環境の変化などに適応してシステムを変化させるプロセスである
Code Qualities →?→Emergent Design
組み上げたピラミッド
ソフトウェア業界は様々なピラミッドを生み出している
ソフトウェア開発に関するピラミッド
https://gyazo.com/525b0d880b2c6d29a5460182842651ac
コードの質
「質とスピード」
保守性
テスト容易性
理解容易性
変更容易性
叡智、原則、プラクティス、病理学
ユニットテスト、リファクタリング、パターン
テスト駆動開発、パターン駆動開発
創発的設計
保守性の低さがもたらすもの
ひとつひとつの変更に余計な時間がかかる
内部品質への投資の損益分岐点は一か月以内に現れる
病理学
悪かった部分の振り返り
ex. 凝集度不足
気づき方
名前をつけるのが難しい
長いテストコード
長いプロダクトコード/メソッド
もやっとしたものに名前をつけて整理する
パターンへつなげる → アンチパターン
リファクタリングへつなげていく→コードの不吉な臭い
叡智
単なる知識ではなく、知恵とか英知と言われる領域
スター・ウォーズへの参照
I should think that you Jedi would have more respect for the difference between knowledge and... heh heh heh... wisdom
Wisdom
先人の知恵
巨人の肩
c2.com(C2 Wiki)
FLOSS
原則
『アジャイルソフトウェア開発の奥義』
SOLID原則
『Clean Code アジャイルソフトウェア達人の技』も参照
『達人プログラマー 第2版』
DRY
KISS
Law of Demeter(デメテルの法則)
プラクティス
スタイル、名前、道具
『プログラミング作法』
ユニットテスト
『Developer Testing』
Testability
Observability
Controllability:テスト対象の動かしやすさ
Isolability
Deployability
Smallness:対象が十分に小さいこと
Singularity
Level of abstraction
Efficiency
Reuse
『実践ソフトウェアエンジニアリング』
実行円滑性
観測用意性
制御
XX(後で書く koma.icon
リファクタリング
リファクタリング(名)
外部から見たときの振る舞いを保ちつつ、理解や修正が簡単になるように、ソフトウェアの内部構造を変更させること
『リファクタリング 既存のコードを安全に改善する(第2版)』
「理解や修正」:保守性に直結する
保守性を上げていくこと
後からでも保守性をじわじわと上げていくというアプローチを可能にする
安全にリファクタリングをする仕組みが必要
ユニットテストにつながる
リファクタリング(動)
一連のリファクタリングを行って、外部から見た振る舞いの変更なしに、ソフトウェアを再構築すること
パターン
語彙、形式、共有
共通した形に名前をつけて、カタログ化して、学べるようにしていく
カタログ化して暗記するだけだと知識止まりで、叡智にならない
『パターン、Wiki、XP』
他にも
『オブジェクト指向における再利用のためのデザインパターン』
『ソフトウェアアーキテクチャ ソフトウェア開発のためのパターン体系』
『アンチパターン』
『プログラムデザインのためのパターン言語』
『エンタープライズ アプリケーションアーキテクチャパターン』
『パターンによるソフトウェア構成管理』
『Java言語で学ぶデザインパターン入門』
例:Facade
かつては、設計の最初から導入するものだった
現在では、パターンはリファクタリングのターゲットになった
『パターン指向リファクタリング入門 ソフトウエア設計を改善する27の作法』
状況に応じて、その時々の保守性を最善にするための手段を提供してくれるもの
パターンとリファクタリングはつながる
49. GoFデザインパターンとDI + リファクタリング (後編) w/ twada | fukabori.fm
at fukabori.fm
テスト駆動開発
『テスト駆動開発』
TDD Boot Campでの動画
https://www.youtube.com/watch?v=Q-FJ3XmFlT8
ユニットテストとリファクタリングを組み合わせて、繰り返し、回転させるもの
付録C 訳者解説:テスト駆動開発の現在
パターン駆動開発
おすすめ書籍は『Design It!』
アーキテクティングやリアーキテクティングに世界を繋いでいく
アーキテクト様がプログラマとは別にやっているという時代ではない
プログラミングから連続したところにアーキテクティングがある
TDDをYAGNI原則に則って厳格に行うならば、3イテレーション目でアーキテクチャが破綻するであろう
by James Coplien
James Coplien vs Robert C. Martinのプロレス
TDDとアーキテクチャについての論争
いつどれだけやるのがいいのか?:スイートスポット
『Making Software』
ソフトウェアの規模
変更の頻度
創発的設計
『新装版 リファクタリング 既存のコードを安全に改善する』のKent Beckの寄稿
※ 『リファクタリング 既存のコードを安全に改善する(第2版)』にはない
技法の列挙は、始まりにすぎません。それは、通り抜けなければならない関門です。技法なしには、実際に動くプログラムの設計を行えません。技法があってもできないことには変わりませんが、少なくとも出発はできます。
こうしたすべてのすばらしい技法が、なぜ始まりにすぎないのでしょうか。その理由は、これらを使うべきとき、使うべきでないとき、始めるべきとき、やめるべきとき、進むべきとき、待つべきときを、皆さんはまだご存知ないからです。リファクタリングに寄与するのはリズムであって、個々の音符ではないのです。
それを実際に体得したと実感するのはどんなときでしょうか。それは、皆さんが諦観 (calm down)を身につけ始めたときでしょう。それは、誰かの書いたコードがどんなにぐちゃぐちゃでも、それを改善し、進化し続けるようにできるという、絶対的な自信を感じるようになるときです。
『達人プログラマー 第2版』
20年の時を経て
アジリティーというものは、現実の世界やソフトウェア開発の世界の双方において、変化に対応する、すなわち何らかの行動に出た後で遭遇する未知なる物事に対処するということなのです。
(p.334)
達人プログラマ Dave Thomas が Asakusa.rb で話するというので聞いてきた
『レガシーソフトウェア改善ガイド』
リエンジニアリングの3つの選択肢
リファクタリング
リアーキテクティング
式年遷宮の仕組み
20年で一周するように作り替える
全体のシステム(系)を破壊せずに新たに作り直すか?という観点
Parallel Change戦略
『モノリスからマイクロサービスへ』のストラングラーアプリケーション
ビッグ・リライト
『達人プログラマー 第2版』
よい設計の本質:Easier To Change (ETC)
(引用転記間に合わず)
koma.icon MCETMECを想起
アジリティの本質
優れた設計によって変更が容易になる..(引用転記間に合わず).p.336
変更容易性の高いソフトウェア→アジリティ
ようやく繋がった
TDDは、設計のひらめきが正しい瞬間に訪れることを保証するものではない。しかし、自信を与えてくれるテストときちんと手入れされたコードは、ひらめきへの備えであり、いざひらめいたときに、それを具現化するための備えでもある。(p.83)
『テスト駆動開発』を翻訳していて一番印象に残ったフレーズ
本人の言及
Takuto Wada(@t_wada)
#ginzarails での講演を(かなり時間オーバーして)終えました。まだふわふわした生煮えの講演にお付き合いくださいました皆様、誠にありがとうございました……!
https://twitter.com/t_wada/status/1405862233112866819