Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
レガシー回避のPHP開発術/avoid_php_legacy
Search
Ryo Tomidokoro
June 24, 2023
Technology
16
12k
レガシー回避のPHP開発術/avoid_php_legacy
PHPカンファレンス福岡2023
Ryo Tomidokoro
June 24, 2023
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
5
670
集中して作業する技術/how_to_work_deeply
hanhan1978
61
41k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
10
9.4k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
3.6k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
4.7k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
5
2k
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
hanhan1978
12
5.5k
Laravel Collectionの計算量を調べてみた2023/laravel_collection_time_complexity_2023
hanhan1978
1
1.4k
PHP で学ぶ Cache の距離の話 / study_cache_with_php
hanhan1978
7
2.2k
Other Decks in Technology
See All in Technology
スタートアップで取り組んでいるAzureとMicrosoft 365のセキュリティ対策/How to Improve Azure and Microsoft 365 Security at Startup
yuj1osm
0
240
開発生産性向上! 育成を「改善」と捉えるエンジニア育成戦略
shoota
2
460
Google Cloud で始める Cloud Run 〜AWSとの比較と実例デモで解説〜
risatube
PRO
0
120
pg_bigmをRustで実装する(第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
shinyakato_
0
110
オプトインカメラ:UWB測位を応用したオプトイン型のカメラ計測
matthewlujp
0
200
TypeScript開発にモジュラーモノリスを持ち込む
sansantech
PRO
2
650
効率的な技術組織が作れる!書籍『チームトポロジー』要点まとめ
iwamot
1
100
能動的ドメイン名ライフサイクル管理のすゝめ / Practice on Active Domain Name Lifecycle Management
nttcom
0
240
React Routerで実現する型安全なSPAルーティング
sansantech
PRO
2
280
クレカ・銀行連携機能における “状態”との向き合い方 / SmartBank Engineer LT Event
smartbank
2
100
ゼロから創る横断SREチーム 挑戦と進化の軌跡
rvirus0817
3
280
生成AIのガバナンスの全体像と現実解
fnifni
1
210
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
169
14k
The Invisible Side of Design
smashingmag
298
50k
Thoughts on Productivity
jonyablonski
68
4.4k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Typedesign – Prime Four
hannesfritz
40
2.4k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
KATA
mclloyd
29
14k
Embracing the Ebb and Flow
colly
84
4.5k
Transcript
@hanhan1978 レガシー回避のPHP開発術 保守性の高いアプリケーションを作る方法 2023-06-24 PHPカンファレンス福岡
@hanhan1978 • 富所 亮 • 所属 株式会社カオナビ BackEnd Re-architecturing Team
(BERT) • 職業 バックエンドエンジニア • ブログ https://blog.hanhans.net • Yokohama North AM https://anchor.fm/yokohama-north-am 2
レガシーとはなにか? 3
4 レガシーの定義
5 “レガシーコードとは、単にテスト の無いコードです。”
6 “毎日実行され、過去の意思決定をもと にのがれようのない影響を及ぼし続ける が、なんの活力もないようなコードがあ る。それを丁寧な言葉で「レガシー」と呼 ぶ。”
7 “保守または拡張が困難な既存のプ ロジェクトなら、なんでも「レガシー」 (legacy)と呼ぶことにしている”
8 “創業期の資金不足や人材不足によっ て生じたコード上の課題全般を、広義 のレガシーコードと定義”
まとめると 9
• テストが無い • 活力が無い • 保守・拡張が困難 10
11 これらの性質が一つでもあればレガシーなのか?
12 白黒はつかない All or Nothing ではない。
13 • レガシーではない部分(計画的に設計・実装) • レガシーな部分(涙を飲んだ部分)FIXME, TODOなど • レガシーな部分(知らなかった、未認識) 実際にはアプリケーション内に良い箇所・悪 い箇所が混在する
14 思考停止は危険 全体をまとめてレガシーと表現してしまうと 「さあ!フルリニューアルだ!」という話にしかならない
15 場合によっては フルリニューアルは合理的な判断だが 大抵の場合はコストがかかりすぎる → かつ、その組織で1から作ってレガシーになったのよね?
16 場合によっては フルリニューアルは合理的な判断だが 大抵の場合はコストがかかりすぎる → かつ、その組織で1から作ってレガシーになったのよね? 歴史に学べ!!!
17 この登壇内でのレガシーの扱い
18 • テストが無い • 活力が無い • 保守・拡張が困難 これらを「レガシーな性質」と呼ぶ。
19 アプリケーション内にある「レガシーな性 質」の割合に目を向ける 全体を包含して、思考停止しないこと
20 レガシーな性質≒技術的負債 ただ、このままだと解像度が低い
21 • 自然には少なくならない • 時間とともに勝手に増える レガシーな性質の特性
22 「改善しないと、改善されないんだよ?」 ねぇ知ってる?
23 レガシーな性質を減らす活動をしないとい けない
24 レガシーを回避するとは?
25 ソフトウェア開発の目的はレガシー回避で はない
26 • テストがあり • 活力があり • 保守・拡張が容易 これらは必ずしも必須ではない
27 プロダクトアウト+カスタマーサクセスが目 的 -> みんなでアジャイル
28 ただし レガシーな性質を放置すると 目的達成の足を引っ張るようになる
29 現状、達成されていることにも目を向けましょ うね。 ところで
30 • 希望 • 利益 • 人々の生活 • ビジョン これらを達成できていないものはレガシーにも
なれていない
31 • 希望 • 利益 • 人々の生活 • ビジョン これらを達成できていないものはレガシーにも
なれていない 良い面にもきちんとフォーカスを 当てましょう
32 なるようになって、今がある
33 ソフトウェアが達成したい目的はそれぞれ 作られてきたコンテキストも様々
34 そのソフトウェアを作ってきた歴史がある 作ってきたチームがある 経済活動をしてきた結果として今がある
35 そのアプリケーションに不満があるかもし れない 体制に不満があるかもしれない やり方に不満があるかもしれない
36 それはそれで、ある種安定した状態 単純に、レガシーな性質を悪とみなして活 動しても、うまくいかんぞ!
37 無計画な開発による意図しない副作用 https://www.coastalwiki.org/wiki/Human_causes_of_coastal_erosion
38 テストがないことが普通の場所で、テスト があることを普通にしようとするのは、不 自然な行為 (サバンナをのぞく)
39 現状維持しがち • 今はこれで動いているんだから • 今までこれでやってきたから • 変更するのは大変だから 正常性バイアスとの戦い
40 ”当たり前”を変える必要がある
41 例 • リファクタリング • PHPStan対応 • Accessibility対応 • フレームワークのバージョンアップ
• プログラミング言語のバージョンアップ • CIの速度改善
42 ここまでのまとめ
43 • レガシーはソフトウェアの性質 • なるようになったものは変わりづらい
44 レガシーな性質を減らすには、そもそもレガ シーを生み出す既存の流れ全体に抗う必要 がある。 局地戦で改善できるほど甘い相手ではない
ソフトウェアはどうやって作られるか? 45
46 0 -> 1 のフェーズ
47 • リリースが命 • 動くことが最優先
48 色々とない • 金がない • 開発者がいない あるのは達成したいこと
49 目先の対応が求められる > 個社対応
50 • 人材も環境も不十分 • ドメインが安定していない 「レガシーコードとの付き合い方」における課題はこ のフェーズで大量に生み出される
51 1->10のフェーズ
52 ちょっと余裕がでてくる • 開発者の採用にお金を使える • 安定したドメインが出来てくる 商売になる黄金パターンが生まれてくる
53 ソフトウェアの状態 まだ、ビッグリライトをする余地がある
54 技術的負債の要因とその効果 Software Architecture Metrics / Oreilly & Associates Inc,
2022
55 技術的負債の要因とその効果 Software Architecture Metrics / Oreilly & Associates Inc,
2022 リプレースで一気に負債を返済
56 • 事業成長が求められる • 機能がどんどん追加される このフェーズの先には、リプレース作戦を取るの が非現実的になるくらいに、システムの横のサイ ズが増える
57 このフェーズで、「リリース優先なので...」 を連発すると、改善の難易度がバク上が りする
58 技術的負債の要因とその効果 Software Architecture Metrics / Oreilly & Associates Inc,
2022 リプレースが非現実的になるほど、機 能が増えて、複雑度が増す
59 10->100 のフェーズ
60 市場をある程度押さえてきた状態 さらに市場を取りに行くために、採用にコストを かけてチームを増やす 組織も大きくなる。
61 • どんどん機能が増える! • リプレースは、非現実的になる。 • レガシー解消のコストも大きい • 結局リリース優先の圧力は強い 単純に、影響が大きすぎる&同時並行で開発してい
るものが多すぎて改善活動を諦めだす
62 リプレースが出来ないならどうする?
63 【一発逆転】銀の弾丸を探す現実逃避 • サービス分割 • 一部機能をSaaSに寄せる • マイクロサービス?? • モジュラーモノリス
• Rustで書き直す
64 いわゆる茹でガエル
65 • なんかCI重いな? • なんか開発に時間かかるな • なんか色々面倒くさいな こんなことをひしひしと感じているフェーズ
66 積み上がるレガシーを肌で感じる ビジネスとしての成功と、開発効率のバラ ンスを上手にとる必要がある
67 ここまでのまとめ
68 ソフトウェアは、社会を良くするという動機を持って 誕生して、だれかの役に立つことで、経済活動が なりたつようになって、どんどん開発が進んで行く
69 レガシーな性質は、普通に開発しているだけで 積み上がっていく。 そして、改善活動はソフトウェアの開発プロセ ス上は優先度の高くない活動。
ソフトウェアの各フェーズで何が積み上がるのか? 70
71 0 -> 1 のフェーズ
72 知識不足によるインフラ面、ソフトウェア設 計面の負債 とにかく最速で作って動かすことが重視さ れている
73 反面、そのときのモダンなスタックで作られてい るので、経年劣化は起きてない。 ソフトウェアの中身や、インフラ構成(カネがな い)で「とにかくリリース優先」の影響を受ける
74 総じて、レガシーな性質は少なく、打ち手 は多いが、やる人がいない、指摘する人 がいない
75 例 • フロントエンドの人しかいないので、全部 Firebase • ベンチャー優遇の、謎SAASを使っている • ノーコードのツール類を組み合わせたキメラ構成
76 1->10のフェーズ
77 開発者が増える。このフェーズで、インフラのうま い載せ替えなどをすると、負債は一気に減る。 例 コンテナ化、イミュータブルインフラストラク チャー化など
78 技術的負債の要因とその効果(再掲) Software Architecture Metrics / Oreilly & Associates Inc,
2022
79 ソフトウェア自体が機能数が少ない状態なの で、大胆な施策も取りやすい。 このタイミングで、機能開発全振りにしてしま うと、大胆な施策が取りにくくなる
80 単純にデータ量も少ないので、色々やり やすい 一方で、セカンドシステム症候群にとらわ れる可能性
81 負債解消のゴールデンタイムであるため、 アレもコレもと欲が出る
82 例 • 俺たちの考えた最強のインフラ(最強ではない • 俺たちの考えた最強のアーキテクチャー(最強ではない • 俺たちの考えた最強の.... (最強ではない •
プログラミング言語変更 (変更できない
83 一見して、簡単に倒せそうなサイズ感に見 えてしまうため、きちんとやろうとしすぎる
84 結果として、拡張性のないアーキテクチャーが出 来上がったり、一品物のカスタマイズインフラが出 来てしまい、採用に困るような名品が作られる
85 10->100 のフェーズ
86 基本的には 1->10 のフェーズと同じだが、ビジ ネスドメインの安定がさらに進む 会社の各組織が大きくなり、コミュニケーションコ ストが上がる。
87 失敗したときのコストが、内外に対して上がる このあたりまでにレガシーな性質が解消されずに残っ ている場合、追加で時の試練を受け始める
88 例) • ソフトウェアのバージョン問題 • フレームワークのバージョン問題 • OSのバージョン問題 • 問題のあるデータベース設計
• 取り返しの付かない仕様ハレーション
89 時間経過によって、モダンの概念が変わってくる 仮想サーバー -> コンテナ化 分散システム -> マイクロサービス
90 今やるなら当然コレという方式がでてきてお り、何もしてなかったからレガシーになりました という状態
91 若手優秀層は、隣の芝生は青いな〜っとな る。 つねにデバフを食らっている状態
92 このフェーズでは、チーム数や関連する人間 の数も増えている いかなる改善を行うにもコストが大きい
93 チーム内合意では不十分で、横断的合意が 必要となる 新規加入するメンバーのオンボーディングが 問題になるのもこの頃
94 加入するメンバー数が多いので、教育に携わる メンバーも増やす必要がある EM的なポジションが不在 or EM的な性質を 持ったメンバーがいなくなると、フォローが減る
95 とにかく、問題が多いので、ソフトウェアのレガシー な性質に対する関心も低い チーム内で上手くやることが大事になる レガシーな性質もサイロ化
なぜ、改善されないのか? 96
97 > 改善活動を行わない限り、メンテナンスコストは 上がる 当然ですが、開発にはコストがかかります。コストの 大半は人件費 開発は、つまり開発者を金で雇って、ソフトウェアに 変更を行うこと
98 開発コストに、改善活動は含まれるか? スクラム開発では、スプリント内に、チームが 主体的に改善活動を意図的に取り入れている チームもありますが、大半のチームは、そんな 余裕はありません。 受託では......
99 質とスピード
100 質とスピードは両立する https://speakerdeck.com/twada/quality-and-speed-2022-spring-edition
101 質とスピードは両立する https://speakerdeck.com/twada/quality-and-speed-2022-spring-edition それが出来るチームならな!
102 大半のチームは、質とスピードの境地に達して いない せいぜい、APoSD における戦術的プログラ マーと同じ状態 複雑性は上がるけど、とりあえず要件は満た す
103 ほとんどの会社において、とりあえず要件は満たす という開発チームが必要最低限のレベル すくなくともリリースが出来るなら、経営陣としては問 題なく見える
104 ほとんどの会社において、とりあえず要件は満たす という開発チームが必要最低限のレベル すくなくともリリースが出来るなら、経営陣としては問 題なく見える ソフトウェアのやばさは、目に見えにくい
105 チームの基本行動
106 ディレクション チームリード デザイナー QC プログラマー • インフラ • バックエンド
• フロントエンド • アプリ いわゆる開発チーム チームトポロジーにおけるストリームアラインドチーム
107 場合によっては、ここにマネージャーというさらに 高次のマネジメントを行う人がいたり、スクラム やっている場合は、スクラムマスターやPOがいる
108 さて、このチームだけで、レガシーを促進せず に開発がやれるか? ほとんどの場合、このチームはメンテナンスコ ストを足す方向に開発します。
109 改善は、このチームの第一目的ではない このチームは、顧客に価値を提供するために機能 開発を行う OSのアップデートとか、脆弱性対応は優先度として は一段下がる
110 技術的負債の要因とその効果 Software Architecture Metrics / Oreilly & Associates Inc,
2022 負債がたまる方向にしか行動しない
111 チームにおこる変化
112 上手くいっているチーム
113 機能開発は行えるチームが、仮にうまくまわっ ていたとする 収益があがるので、企業はさらに投資を行う。 さらに市場を取りに行く。
114 投資をすると、会社は開発者を採用してチームを増 やして、開発を複数並行では実行する。問題はその やり方。
115 よくあるパターンは、チーム解体
116 バラして増やす
117 バラして増やす やったぜ!3倍のアウトカム! (とはならない)
118 TeamB, TeamC の2つのチームが新設 当初のチームは解体されている 同じスピードでの開発は期待できない
119 増えた2チームは、同じスピード、少なくとも同じ 品質で開発することが、投資した側からは期待さ れる 実際には人間関係の再構築 役割の再定義などが起こるので、当初の効率は下がる
120 チームにおこる変化2
121 • メンバー離脱 • メンバー同士の相性問題 • 評価への不満 買い手市場であるエンジニアは、自分が適切に評 価されていないと感じると、すぐに転職する
122 PHPの主戦場であるインターネット業界で は、平均勤続年数は4年前後 https://web-camp.io/magazine/archives/77694
ここまでの話のポイント 123
124 みんなの大好きなクリーンアーキテクチャーの話も、イ ミュータブルインフラストラクチャーの話も、アジャイルも スクラムも出てきません。オブジェクト指向とかも知りま せん。
125 そんなものに関係なく サービスの成長と共にソフトウェアはレガシーな 性質を貯める方向に成長していく
126 ところで レガシーな性質が溜まりすぎるとどうなるか?
127 Bobおじさんの著書 Clean Craftsmanship には、倫理 の話がでてくる。 つまり、プログラマーが匠としての意識、高い倫理を保 たず、テストも書かず、現状が悪化するにまかせた場 合、どうなるか?
128 例 1. Volkswagen の改ざんソフトウェア 2. HealthCare.gov におけるパフォーマンス問題 3. Knight
Capital の誤発注による倒産
レガシーを積み上げにくくする 129 メモ、ここから30分かかる
130 全てに先立つ意識 顧客中心主義 ソフトウェアだけを見てはいけない。良い価値提供 という北極星を忘れないように。
131 それって、精神論? いやいや、誰も技術を軽んじたりしてない。極端 に考えるのはNG
132 https://mtx2s.hatenablog.com/entry/2023/04/26/230917
133 証明できるのか?
134 プロジェクトを改善をした状態、改善をして ない状態で、それぞれ計測しないと、改善 の効果は証明できない? そんなこと不可能では?
135 マインドチェンジ 正常性バイアスとの正しい向き合い方
136 > 改善を止めようとするなら現状維持のメ リットをださないといけない
137 Q レガシーな性質を保持し続けるメリット を教えてください? A 無いなら改善が必要だよね?
138 戦略面の打ち手
139 チームを大切に Team First
140 うまくいっているチームを解散させない 改善を活動内に含むことができるような強い チームがこの世でもっとも大切 -> まじで解散させるのはサイコパス
141 教育施策 1. オンボーディングの充実 2. ドメイン知識の共有・促進化策 3. チーム横断のコミュニケーション施策
142 組織変更 機能開発を主とせず、横断的にDevOpsを行 うチームの結成なども候補にはあがる
143 ただ、職能組織でワークしてないからって、横 断的組織を作ったら即座にワークするわけで はない。人による。 チームトポロジーより > 職能集団はサイロ化する。
144 ただ、職能組織でワークしてないからって、横 断的組織を作ったら即座にワークするわけで はない。人による。 チームトポロジーより > 職能集団はサイロ化する。 横断的組織もサイロ化する危険
145 採用 平均勤続年数が4年という世界線 採用した人が4年経過する前に、新しい人を採用 できないと開発が回せません。
146 まとめ
147 1. うまくいっているチームを解体しない 2. プロだって、成果を出すには、時間がかかる 3. 自主的な横断施策を行う人材を、大切にする
148 組織変更だけはうまくいかない 結局は人なので、横断的活躍をするラジカル なメンバーが内部に存在してくれる必要があ る。
149 戦術面でのうちて
150 視野を広くもつこと • 🙅フロントエンドなのでバックエンドわからん • 🙅バックエンド専門なのでインフラわからん • 🙅インフラなのでアプリケーションはわからん
151 問題は職能内に閉じないので、個人が自 分の専門領域に閉じこもると解決が難しく なる。
152 自分しか対応できるひとがいないという状 況だったら、何が出来るか? -> 「出来ない」で蓋を閉じないで、自分の 領域の横に手をのばすことが大切 精神論ではない。最善を尽くせ!
153 レガシーな性質が溜まりにくいアプリケー ションの基本
154 12 Factor APP まだまだ当たり前になっていない。 先進的というよりは、それに従うことで、自然と 運用・保守し易いアプリケーション+インフラ環 境になるというイメージ
155 https://12factor.net/ja/
156 https://12factor.net/ja/
157 計算機科学の知識 • アルゴリズム • 空間計算量、時間計算量 • プログラムがどのように実行されているのかの知 識
158 バグとは? 積み上がったスタックの経路上で、想定外 の状態が混入した結果
159 Why Programs Fail / Morgan Kaufmann 2009
160 Why Programs Fail / Morgan Kaufmann 2009 型がついていると状態を確定し やすい
早めの型付けで安心
161 Working out loud 問題はまず認識されることが必要なので、 大声で叫べ!
162 https://blog.studysapuri.jp/entry/2018/11/14/working-out-loud
163 Slackが活発で、小さいやり取りが多い チームはコミュニケーションの問題が少な い(経験談)
164 テストは書け テスト書くこと自体というよりは、テストを書きや すいコードに自然になるというのがポイントです。
165 テスト書く -> 終わりではない TDDでコードを改善するための、最初の 一歩がテストコード みんなもサバンナで暮らそうな!
166 コレ一冊で、とりあえず現場では困らなくなる
167 その先はコレ!みんなで付録Cの話をしよう!
168 設計視点を持つ 🙅ただコードを書けば良いという意識
169 • 一貫性を保てているか? • 理解しやすいか? • 変更しやすいか? • 場当たり的な対応をしていないか? •
名前付けは妥当か? 将来のために出来ることはたくさんある!
170 クリーンアーキテクチャーや、DDDにつ いての私見 -> 特効薬ではない。トップダウン・アプ ローチとして使うとむしろ毒
171 発想法からの指摘
172 まず課題がある 次に解決策がある 課題を見ずに解決策を当てはめるのは🙅
173 設計力をあげるには? ちょうぜつ本を読め!APoSDを読め! 視野を広く!
174 相談する コミュニティを頼って! PHP Slack PHPerRoom に、野生のPHPerがいるぞ!
175 サーベイ系 ちょっと真面目な技術選定の話
176 この回、超おすすめ
177 広く世間に知識を求めて 少し良い技術選定が出来るように
カオナビ での取り組みを紹介 178
179 チーム横断課題への取り組み
180 CTO室
181 https://speakerdeck.com/kaonavi/growth-ready-engineering-team
182 レビューマスター
183
184
185 設計レビュー
186
187 BERT設計相談会
188
189 教育・採用への取り組み
190 カタリバ (社内勉強会)
191
192 kaonavi Tech Talk
193
194 エンジニア採用
195
196
197 アーキテクチャー施策
198 Architecture Decision Record
199
200 Package by Feature
201
202
203
204 Feature Toggle
205
206 その他、細かい施策
- PHPUnit - PHPStan - E2Eテスト - メトリクス取得 - 書籍購入制度(ホンダナ)
207
208 今後目指したいこと
209 GQM
210 https://ieeexplore.ieee.org/document/5010301
211 https://blog.hanhans.net/2023/05/29/gqm/
目的指向 -> 企業のパーパスなどとすり合わせしやすい -> ただの数字から目的思考のメトリクスへ 212
213 まとめ
- レガシー化させないことは目的じゃない - 目的はもちろん達成する - かつ、レガシー化させない 214
215 https://speakerdeck.com/soudai/learn-from-predecessors
216 救いがないと感じたとき、私は石切工が岩石を叩くのを見に行 く。おそらく100回叩いても亀裂さえできないだろう。しかしそれで も100と1回目で真っ二つに割れることもある。私は知っている。 その最後の一打により岩石は割れたのではなく、それ以前に叩 いたすべてによることを。 Pounding the rocks
217 レガシーから目をそらすな!
@hanhan1978 相談・指摘・その他 下記のTwitterアカウントにどうぞ 218