20年モノの巨大Webサービスの開発継続戦略 - ミドルウェアのバージョンアップとの向き合い方
by
penguin045
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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バージョンアップは改善じゃないと意識 ● 生き残れば一旦勝利とする ● 意外と簡単に済むこともある ● 相手をよく知って、有利に戦う