20年モノの巨大Webサービスの開発継続戦略 - ミドルウェアのバージョンアップとの向き合い方
by
penguin045
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
#phpcon ©2021 RAKUS Co., Ltd. 20年モノの巨大Webサービス の開発継続戦略 - ミドルウェアのバージョンアップとの向き合い方 - やなせ たかし
Slide 2
Slide 2 text
#phpcon 自己紹介 なまえ:やなせ たかし MailDealerというサービスを開発しています ややこしいことを中心に設計したり実装したり 好きな言語:Scala コンパイラが優秀なのと、型システムの温度感がちょうどいい 趣味:楽器/茶・コーヒー/香/自転車/… 節操なくたいてい沼にハマる
Slide 3
Slide 3 text
#phpcon セッションの前に ● 本セッションはレガシーシステムネタです ● 開発者としてベストなノウハウを提示するものではありません ● 現実と戦う方法をお話します ● ゴールは、今を生き延びることです ● 「ミドルウェア」は長いので、「MW」と表記します ● 内容にはフィクションを含みます
Slide 4
Slide 4 text
#phpcon お品書き ● 開発はずっと続いていくもの ● MWのバージョンアップがつらい理由 ● 開発を継続するための戦略 ● 事例紹介 ● まとめ
Slide 5
Slide 5 text
#phpcon 開発はずっと続いていくもの この章で話すこと ● なぜずっと続くのか ● 開発は何を求められているのか
Slide 6
Slide 6 text
#phpcon なんで開発は続いていくの?
Slide 7
Slide 7 text
#phpcon ビジネスの一部だからです
Slide 8
Slide 8 text
#phpcon なぜここでビジネス? ● サービスが売れるかどうかは、企業(組織)の生存に直結する ○ 企業の関心ごとはサービスが持っている「価値」 ● 企業は存続に命を懸けるもの ○ 利潤追求のためには当然企業の存続が前提 → つまり、サービスも売れ続けなければいけない
Slide 9
Slide 9 text
#phpcon サービスの持つ「価値」
Slide 10
Slide 10 text
#phpcon お金を稼ぐ力
Slide 11
Slide 11 text
#phpcon ユーザーにとっても「価値」があるから
Slide 12
Slide 12 text
#phpcon 開発と「価値」 開発という仕事を「価値」を軸に考えてみます ● 価値を増やすための開発 ○ ビジネスを成長させる ○ 新機能や機能向上が目に見えてわかる ● 価値を落とさないための開発 (改善) ○ サービスの価値は上がらない ○ 脆弱性対応、MWのバージョンアップやリファクタリングが該当
Slide 13
Slide 13 text
#phpcon こんな経験はありませんか? ● なかなかリファクタリングできない ○ そんな暇あったら新機能の一つでも作れば? ● 技術的負債のことをわかってもらえない ○ それをしてなんになるの? ● いつまでも化石のようなシステムを保守している ○ いい加減作り直したほうが早い
Slide 14
Slide 14 text
#phpcon なんでこんなことが起きるのか ● すぐにコストを回収できない ● コスト外のメリットの可視化が難しい ● 開発組織への信用の低下
Slide 15
Slide 15 text
#phpcon すぐにコストを回収できない ● ユーザーにわかる変化がない ○ ソースがきれいになっても、それ自体は見えない ○ 大幅な高速化など、わかりやすいものは受け入れられやすい ● 改善している間は、新規の価値を生み出していない ○ これは機会損失だととらえられても仕方ない
Slide 16
Slide 16 text
#phpcon コスト外のメリットの可視化が難しい ● すぐにコストを回収できない ○ 当たり前だけど ● 将来的な価値の算出・評価は困難 ○ ともすればただのポジショントークにしかならない ○ 本当に工数がいままでの半分になるの? ○ 本当に不具合件数がN%下がるの?
Slide 17
Slide 17 text
#phpcon 開発組織への信用の低下 ● 積み重ねの恐ろしさ ○ 過去十数年分の技術的負債 ○ 何度も過ぎる納期 ○ 年々増加する不具合 ● 開発組織以外からはつらさが見えにくい ○ 専門分野以外は誰しもそのようなもの ○ 開発組織もゆでガエルになっているケースもありうる
Slide 18
Slide 18 text
#phpcon 組織全体としてのお気持ち ● 開発組織に余裕がない、開発が上手くいっていない ○ 曰く、リファクタリングすれば取り戻せるらしい ○ 開発速度、品質も向上するらしい ○ それらしい見積もりはあるが、コスト回収は数年、売上には影響しない ● しかも、抜本的な改善の間は新機能の開発が滞る ○ その間に競合に差を付けられるかも ● それならば「価値」の向上を優先したい
Slide 19
Slide 19 text
#phpcon 改善のハードルは高い ● 組織は「価値」の向上を優先したい ○ 「価値を下げない」ための期間は「価値」を向上するチャンスを奪う ○ 改善は「価値」に直結せず、すぐにコストを回収できない ○ そもそも改善のメリットを評価できない ● 実は組織全体の問題 ○ システムの疲弊のリスクが安く見積もられている ○ こまめに改善できる組織はレガシーシステムになりにくい
Slide 20
Slide 20 text
#phpcon 例外があります
Slide 21
Slide 21 text
#phpcon MWのバージョンアップ
Slide 22
Slide 22 text
#phpcon MWバージョンアップと「価値」 ● やらないと明確に「価値」が下がる ○ 修正されない脆弱性を突かれて情報流出 ○ そもそも売れなくなる ● つまり「やらないときの損失」がわかっている ● 損失を回避することで「価値」がうまれる
Slide 23
Slide 23 text
#phpcon つまり必要になったということ ● レガシーシステムの現場ではよくあるのでは ● 改善そのものの価値が認められたのではない点に注目
Slide 24
Slide 24 text
#phpcon MWのバージョンアップがつらいわけ この章で話すこと ● つらいこと ● 逃げられないこと
Slide 25
Slide 25 text
#phpcon 前章のおさらい ● 「価値」とはお金を稼ぐ力 ● 開発リソースは「価値」の向上に使いたくなりがち ● コードをきれいにすることは「価値」を向上させない ○ と思われている ○ 少なくとも簡単に見積もれない ● 改善は、差し迫った損失を避けるモチベーションで承認される ○ そして私たちはそれを改善のチャンスと誤解しやすい
Slide 26
Slide 26 text
#phpcon よくあるつらみ ● 影響も規模も大きすぎて途方に暮れる ○ 全ソースが対象なんて当たり前 ● 問題が大きいのに期間が短い ● 過去の作業の経験がのこっていない ○ 数年に一度だったりするため ● ソースの改善個所が多すぎてあれもこれも不安になる ● つらいプロジェクトになりそうで怖い
Slide 27
Slide 27 text
#phpcon 認識のギャップに気づく ● 今必要なのは「MWのバージョンアップ」 ○ 抜本的な改善じゃないんですよね ● だから、大きなコストはかけられない --------- ここにギャップがある ----------- ● 開発チームの眼前には問題が山積みのソースコード ○ 長年積み重なった技術的負債 ● せっかく直せるのに・・・
Slide 28
Slide 28 text
#phpcon もう手遅れなんだ・・・けど ● 今もそのレガシーシステムは「価値」を生み出している ○ これは紛れもない事実 ● どうしたってEOLはやってくるし、そこからは逃れられない ● 今ある諸問題は、これまで解決できなかったもの ○ 同時に対応するには荷が重すぎる
Slide 29
Slide 29 text
#phpcon とりあえず生き残る
Slide 30
Slide 30 text
#phpcon とりあえずでいいから生き残る システムが生きていれば・・・ ● ご飯が食べられる ○ 少なくともいきなり路頭に迷うことはない ● 今回の知見が手に入る ○ 役に立つ経験になるはず ● 次のバージョンアップまでの時間が手に入る ○ その間に手を打つ
Slide 31
Slide 31 text
#phpcon 開発が続けばチャンスは来る ● チャンスとして生かせるかは組織に依存する ○ あきらめも必要かもしれない ● とはいえ改善させてもらえるよう努力は必要 ○ 今のままでは厳しいことを開発組織外にも理解してもらう ■ システムが限界なので直したい ■ 長年の技術的負債で開発が厳しくなっている
Slide 32
Slide 32 text
#phpcon 開発を継続するための戦略 この章で話すこと ● MWバージョンアップを乗り切る戦略 ● 具体的な作戦立案 ● 相手を知る
Slide 33
Slide 33 text
#phpcon まずは言葉の定義から ● 戦略 ○ 組織の目標達成へ向けた大局的・長期的な視点での計画 ● 作戦 ○ 戦略をどのような手段で実行するか ○ 戦い方・シナリオとも言い換えられる ● 戦術 ○ 作戦遂行の具体的手法 ○ 勝ち方とも言い換えられる
Slide 34
Slide 34 text
#phpcon 戦略
Slide 35
Slide 35 text
#phpcon 戦略 ● 大局的な視点で策定される ○ たとえば企業単位、サービス単位 ● 上位の組織の戦略に縛られる ○ 今回のケースだと、「価値」の向上を第一とする ● 今ケースで考える戦略は、開発チームとしてのもの ○ 好き勝手はできない
Slide 36
Slide 36 text
#phpcon 戦略を考える必要性 ● 開発チームとしては上位の戦略に従う ○ だから選択できる戦略はそう多くない ○ それは普段もそう変わらないはず ● 規模が普段と違うので、開発チーム全体の戦略を考える ○ 基本的には「普段通り」やるのがベスト ○ しかし、規模の見積もりが難しい
Slide 37
Slide 37 text
#phpcon 条件を検討する 前提 ● 開発は継続する ● 「価値」の低下は避ける 自分たちの現状 ● リソースに余裕はない ● 長年の問題が山積している
Slide 38
Slide 38 text
#phpcon 戦略立案 ● 普段の開発 ○ 組織の戦略である「価値」向上を進める ○ いつも通り進める ● NWのバージョンアップ ○ 組織の戦略を妨げないようにしないといけない ○ 普段の開発への影響を最小に抑える
Slide 39
Slide 39 text
#phpcon 作戦立案
Slide 40
Slide 40 text
#phpcon 状況整理 チームの状況 ● リソース・時間に余裕がない ● 通常開発も並行しているため、それを止められない システムの状況 ● 長年の問題が山積している ● 影響範囲が広く、テストが大量に必要
Slide 41
Slide 41 text
#phpcon 大まかな方針 ● 人的リソースは効率的・効果的に使う ○ 最小限のメンバーでバージョンアップをやり切る ○ テストは過大な工数が必要なので、工夫が必要 ● 通常開発を止めない ○ 「バージョンアップ」に関する作業は最小限に
Slide 42
Slide 42 text
#phpcon 作戦立案 通常開発への影響を最小限に抑えるためにどう戦うか? ● バージョンアップ作業は最速で終わらせる ● 修正は最小化する ● 並行している開発案件をバグの洗い出しに活用する ● 出た不具合はバージョンアップ担当メンバーが逐次修正
Slide 43
Slide 43 text
#phpcon 作戦立案 バージョンアップ作業は最速で終わらせる ● 通常の開発を止める時間を最小化するため ○ バージョンアップ中の作業が止まると、チーム全体が止まる ○ 時間がかかるほど影響が大きくなるので重要
Slide 44
Slide 44 text
#phpcon 作戦立案 修正は最小化する ● 修正箇所が多いと普段の開発と衝突しやすい ○ 大きな変更ほど追加の修正が困難に ● バージョンアップ以外の修正に囚われることを避ける ○ 改善の気持ちになっているがぐっとこらえる ○ 限られた期間を有効に活用する
Slide 45
Slide 45 text
#phpcon 作戦立案 並行している開発案件をバグの洗い出しに活用する ● リソースの有効活用 ○ もちろんテストはするが、全ソースの全パターンなんてテストできない ○ レガシーシステムは思い切りもある程度いる ● 修正による影響の周知 ○ 挙動の変更などを身をもって知ってもらう
Slide 46
Slide 46 text
#phpcon 作戦立案 出た不具合はバージョンアップ担当メンバーが逐次修正 ● リソースの有効活用 ○ 知識も豊富なはず
Slide 47
Slide 47 text
#phpcon 相手を知る
Slide 48
Slide 48 text
#phpcon 相手を知る ● 具体的に戦術を考えるには、相手を知ることが重要 ● 未知の相手は怖いが、既知の相手は対処法を考えられる ○ たとえ大量でも無限より有限のほうがいい ○ この時点で戦術が不要になることもままある ● 問題はなるべく分割するべき ○ 複数の問題を一度に解決するのはつらい ○ シンプルなほうが解決しやすい
Slide 49
Slide 49 text
#phpcon 事例紹介 この章で話すこと ● PostgreSQLの事例 ● PHPの事例 ● PHPで実際に使った戦術の紹介
Slide 50
Slide 50 text
#phpcon PostgreSQL
Slide 51
Slide 51 text
#phpcon PostgreSQL ● 9.6 => 13 へバージョンアップ ○ oidの廃止がかなり痛手で、戦々恐々としていた ● 戦術を立てるために、対象を見極める ○ 結果想像以上に影響が少なく、あっけなく終わった ● 開発チーム全体を活用した不具合検出は有効だった
Slide 52
Slide 52 text
#phpcon PHP
Slide 53
Slide 53 text
#phpcon PHP ● 7.3 => 8.0 ● ゆるふわPHPには厳しい挙動の変更が多い ● 曖昧な比較、引数の型の厳格化・・・・ ● 冗談じゃなく、まともに動かない自信しかなかった
Slide 54
Slide 54 text
#phpcon 作戦のおさらい ● バージョンアップ作業は最速で終わらせる ● 修正は最小化する ● 並行している開発案件をバグの洗い出しに活用する ● 出た不具合はバージョンアップ担当メンバーが逐次修正
Slide 55
Slide 55 text
#phpcon PHP ● まずは対象を見極める ○ 範囲は非常に多いが、ロジックを全部見直すような影響はなかった ○ 挙動の変更などはできるだけ”なかったこと”にすればいけそう ● 必要な修正はほとんど置換できるようにした ○ そのため、一瞬で修正して並行で開発しているメンバーに展開できた ● 個別でプログラムを修正したのは数えるほど ● ここでもチーム展開後のバグだしが有効だった
Slide 56
Slide 56 text
#phpcon PHPで取った戦術 ● 調査・設計には時間をかける ● 範囲の広い修正作業は一度に終わらせる ● バグ報告のフローにPHP8起因のバグかの判断を追加
Slide 57
Slide 57 text
#phpcon PHPで取った戦術 調査・設計には時間をかける ● 影響範囲の見積が間違っていれば大変なことになる ● 不要な修正(念のため・・・)は避けたい ○ 設計・テストも大変 ○ 後続の戦術全体を間違える可能性もある ● 全工数のうち6割は使ったのでは
Slide 58
Slide 58 text
#phpcon PHPで取った戦術 範囲の広い修正作業は一度に終わらせる ● 挙動変更はすべてラップする ○ PHP7との挙動差がないように ● ラップ関数の適用は自動でできるように ○ PhpStrom の構造置換はとても便利 ● 個別対応が必要なケースはやむなし ○ 余裕があるならPHP7で動くコードはこまめにマージしてもいいかも ○ ケースバイケースなのでいろいろ言えない
Slide 59
Slide 59 text
#phpcon PHPで取った戦術 バグ報告のフローにPHP8起因のバグかの判断を追加 ● 真っ先に行い、バージョンアップ担当者が判断した ● 他の開発メンバーに調査させないように ○ とくにPHP8を知らない人もいるし、個別に調べるのは無駄が多い ● 修正方針も立てられるので、効率が良かった
Slide 60
Slide 60 text
#phpcon まとめ
Slide 61
Slide 61 text
#phpcon まとめ ● 開発を続けるのは絶対条件 ● MWバージョンアップは改善じゃないと意識 ● 生き残れば一旦勝利とする ● 意外と簡単に済むこともある ● 相手をよく知って、有利に戦う