技術的負債
#設計 #設計原則
原義
https://bliki-ja.github.io/TechnicalDebt/
【翻訳】技術的負債という概念の生みの親 Ward Cunningham 自身による説明
カミナシ社の執行役員 CTO に就任しました
"技術的負債とは何か"についてこの記事であらためて論じることはしませんが、
(1) 設計や実装の当時に最適解と考えていたものが
(2) 時間の経過とともに最適ではなくなった結果
(3) その最適と現状との間に生まれる差分である
と僕は考えています
https://scrapbox.io/files/6406be411572a9001ce87782.png
https://gyazo.com/3a58c7e2f674ccbbc3ac1ae99ea56656
カミナシでの技術的負債返済プロジェクトとその決断 / Beyond tech debts at Kaminashi
技術的負債は開発者体験を悪化させる
https://scrapbox.io/files/6406c91c5fc1d5001c7fa15a.png
https://twitter.com/dennotai/status/1727083733189337307
ヤフーでは、約20年分の技術的負債を数年間かけて返還しきる超苦しいPJを最近終えますた。。
そこで得た
・技術的負債の一括返済は絶対やらない(辛過ぎる)
・"定期的な小出し返済"を遵守する
の2点を組織ルールとして組み込みました。
DXしていく全て企業で基本ルールにする事をオススメします。 https://scrapbox.io/files/656361cfa95c7a001bd2725f.png
DX: Developer Experience (開発体験)は重要だ
クソコードはエンジニアを貧乏にする
どうやって技術的負債の雪だるまを生み出し、それを返済してきたか - 5年半越しの設計論
技術的負債とどうやって戦うか
技術的負債と戦わずにマネジメントする
バランスシートで考える技術的負債
技術的負債への後悔と返済
「技術的負債」への処方箋と「2つのDX」
カレーライスのルーとライスを混ぜるのは簡単ですが、混ぜた後に白い米とルーを分ける作業は容易ではありません
質とスピード
https://scrapbox.io/files/640695fe0f79fd001b9aeab9.png
https://scrapbox.io/files/64069774f6d15f001b5bf5be.png
https://scrapbox.io/files/640697f40ad259001b82225d.png
https://gyazo.com/eea88db1a0a6cbe5b14ba1ff47c6fa1c
https://scrapbox.io/files/6406983853b382001cc8482d.png
脳死で「負債」と言わずに、その経緯や現状分析を通して正しい定義と目標設定で向き合うべきという話
現状分析して、ゴールを見据えて、チェックポイントをたてる
@sugimoto_kei: 「DX(Developer Experience)」って、本当に消費者気分な言葉だよね。
@sugimoto_kei: 「変更容易性」と「技術的負債」ってことば、使うのを止めた方がいい。計測出来ないのに計測できそうな衣装をまとっている。ものがわかったような気分にさせる欺瞞的な言葉だと思う。
@sugimoto_kei: ファウラーがいう技術的負債は、リリースまでの時間がないときに、意図して積むもの。巷で言われている技術的負債は本当にそれなのか?単にスキル不足で積まれているような気がする。ここにも意味のズレがある。都合のよい方にズラされている。
@sugimoto_kei: パッと見にはなんでこんな複雑なコードになってるんだ、こうすれば簡単だろうと感じても、実際にやってみると、隠れた要件があって、簡単にはいかない場合もある。
でもそれは、修正しようとしたからわかることで、やってみなければ、いつまでもわからないかも。
@sugimoto_kei: ひとによって違うしね。弊社のコードは、僕にとっては変更容易だが、新しく加わったメンバーにとっては決してそうではない。どちらも正しい。
「変更容易性」「技術的負債」という同じ言葉を使っても意見が合わない。コードの属性ではなく、コードベースと各人の関係性の問題だからだ。
この視点は示唆深い。確かになと思ったkoushisa.icon
それは、修正しようとしたからわかることで、やってみなければ、いつまでもわからないかも。
コードベースと各人の関係性の問題だからだ。
複雑性保存の法則
可読性、理解容易性、正しさへの迷いは作業者のバックグラウンドに依存する
要件がデカいとどうリファクタリングしても別に実装が小さくなるわけではない
@nfujita55a: んで、「技術的負債一掃」を旗印に、本当は必要な機能や仕組みが吹っ飛ぶ、までがワンセットね。
私も「技術的負債」ってワードが飛んできたら、いやいや待て待ての人。
@nfujita55a: 「あなたのお給料、その技術的負債が生み出してますよ」ってことを無視して、技術的負債(とそれが生み出された背景・経緯・要求)を取っ替えればみんなハッピーと考える人いますなぁ。
※あの資料の作者=無視する人はではありません
@times_gon: 僕が開発者体験とか技術的負債という言葉が嫌いなのは「生産性」とか「再設計」みたいな言葉で表現できる問題を何故か一緒くたにしたジャーゴンで馴れ合って「あいつらは分かってねえ」みたい態度で経営者と対話する気がない技術者の傲慢さが垣間見えるから
@shimpeiws: 技術的負債というワードが出るたびに、
「それは負債ではなく必要なライブラリ更新ですね」
「もとの品質がイマイチだったコードの書き直しですね」
とこの記事を貼りながら警ら活動をしてるんですが、もはやオリジナルと違う意味の方が一般化してしまってる感はありますよね
https://t.co/QowkwaE8w3
ソフトウェアエンジニアリングサバイバルガイド: 廃墟を直す、廃墟を出る、廃墟を壊す、あるいは廃墟に暮らす、廃墟に死す
https://scrapbox.io/files/6417bce42a347a001b838b2d.png
https://scrapbox.io/files/6417bd74d76c4d001c04cca6.png
@fuuuuuta21: 「業務が忙しくて、人材育成に時間を使えない」という話を聞くたびに、「人材育成に時間を使わないから、業務が忙しいのでは?」説を思いますし
退職者が出た時に、自社のマネジメント改善のシグナルかもしれないのに、「組織の新陳代謝」として簡単に片付け、無学習でGOはどうかと思います。
https://pbs.twimg.com/media/FtQp4_caMAAQPiC.pnghttps://pbs.twimg.com/media/FtQp4_facAAsz1G.pnghttps://pbs.twimg.com/media/FtQp4_haYAI3xvq.pnghttps://pbs.twimg.com/media/FtQp4_ZaIAAg5H1.png
@tanakahisateru: 下手で安いプログラマーを雇ってやっつけで開発しても、それで商売が成り立てばいい、という流れで生まれた技術的負債もあるだろうけど、その負債の選択はそもそも経営者の判断なんだから、いくら開発者が奮起してそれを負債だなんとかしなきゃと言っても意味がなくて、もう経営やるしか手がないのでは
@wonderful_panda: その場しのぎのコードは必ず負債になる、それは全くその通りだな。
だがオレは、その負債を返すのがオレじゃないって可能性に賭けるぜ!
@sinsoku_listy: なんか昔にツイートしたけど、技術的負債を積みながら分かりやすい成果を生んで、その成果をアピールして転職した方が合理的という話があってな…
技術的負債は経営判断(責任の在り処はトップにある)というのは一理ある #エンジニアリングの経済性
契約形態や開発組織の構造によっては無理ゲーな場合もあり、諦めるのも合理的だ
「どうせ責任とるのは上なので、いまの責任範囲で割り切ってサッと作ってシュっと去る」みたいな
戦略の失敗は戦術で補うことはできない
業務委託エンジニアと直接雇用エンジニアの最大の違い
だからと言ってそれを免罪符に書き捨てなコードを量産してはならんが
だれかがオーナーシップ持たないと解決できない
まあ、問題が見える化されづらいところから分断が起こっていることと推測する
ウォーターフォール型だとそうなりがちなのかもしれない
意思決定のレイヤが複数重なっていて、末端では太刀打ちしようがない(時すでに遅し)
見えないステークホルダもいたりする
過剰な分業によるオーナーシップ欠如
こういう文脈では小さいチームが向いてる
フィーチャーチームで、WIP制限を設ける
要件定義や仕様定義やQAもチーム分けせずに、小さいチームで完結させる
デザインは特権であるべきではない
QAは特権であるべきではない
開発者はフルスタックである必要はないが、チームはそうあるべき
→Stream aligned
→モジュラモノリス
根本的に複雑な組織課題
Stream alignedやアジャイルの適用条件に「全員がプロフェッショナルで越境できる」や「能動的に学べる」そして最後に「人事権」の壁がある
全体を見れる人が少なかったり、複雑性の問題で分業せざる得ないというのもある
なぜゲーム作りをまるごと理解できる人が増えないのか?
困難は分割せよ(サブドメイン分割)
@Kory__3: 「未来予知は不可能なので、可能な限り誠実にメンタルモデルをそのまま落とすことが後々の様々なコストダウンに繋がる」というどこで得たのか全然わからない謎の直感があって、これがここ数年の僕のプログラミング経験の中では驚くほどとてもうまく機能している
@Kory__3: 言語をより深く知ること、抽象的な理論を学ぶこと、形式を直感の永続化として重んじること、Premature Optimization を避けることは全部この謎の原理によって動機付けされている
@k1_c_: 必要に迫られて速さを追求した結果やむを得ず質が悪くなってしまったコードって実はこの世にあんまり存在しないくて、単に技術レベルが低いかだらしなさの結果なんだよな
「綺麗なコードを書くために勉強しながら開発してたら遅くなる」ってだけで、「綺麗なコードを書いてたら遅くなる」って話ではない
こんな話は何十年もの間無限に繰り返されている話なんだけど、ここで真になにが言いたいかというと、日頃の素振りがだいじということ
@fushiroyama: Twitterがゆっくりとしかし確実に壊れていっていることに残念ながら驚きはないというか、非常に複雑なソフトウェアの面倒を見る人を減らして急な機能追加をすると「分かりやすい大爆発」を起こすのではなくて「あちらこちらから無視できない水漏れが起こる」みたいな壊れ方をするんですよね
世界最高峰のTech Giantsが世界最高峰の頭脳を世界最高峰の報酬でかき集めて作られているものは鬼怒川温泉の崖に作られた無理な建て増しのような状態になっているというのは案外外からは想像しづらいと思うけど、僕がかつていた会社も多かれ少なかれそうだったし他の会社も似たようなものだと思う。
これは当事者のPMや経営陣からすら見えづらいことなんだけど、中の開発者はみんな知ってることだと思う。例えば機能Aがあって、これをBに変えるとする。理想的にはある一箇所を変えるだけですべてが切り替わる。こんなの簡単だと誰もが思う。でも実際はそうではない。同じフラグが2箇所にあったりする
これは極端な例だけど、ある状態機械があって状態変更を次々に伝播させていくときにbroadcastのような仕組みが多段になっているケースがあって、しかもラグや失敗があるのを表面からはリトライやsleepで隠しているようなロジックが普通にあったりする。こういうのが「水漏れ」である。
#水漏れ,_割れ窓
@fushiroyama:比較的大きくてもキレイなコードは本当に優れた技術者が独りとか2-3人で書いてる方が圧倒的に実現可能性が高くて、反対に数百人で開発してるソフトウェアは「クソコード」と「マシなクソコード」しか存在しない。
しかしこれはsarcasmではなくて、大規模ソフトウェア開発とは取りも直さず、停まることを許されないなかで走り続けながらクソをマシなクソに直しながらそれでも未来永劫走り続けることです。これこそが大規模開発の腕の見せどころなのですね。
@fushiroyama: もちろんみんなコーディング規約に則って、ユニットテスト書いて、コードレビューを通して、QAの末に皆の所に届くんですね。それでもバグるんですね。皆で何とか水漏れに蓋しながらコードを少しでもマシなクソにしながらそれでも走り続けるしかないんですね。これが大規模開発なんですね。
スタートアップで戦い抜いてきたRailsアプリをどう直す? 既存Railsアプリを攻略する時にCTOが見ているポイント
https://scrapbox.io/files/6407f5f9d23455001bf95efd.png
#OODA
ハードシングスを引き起こしたHype Driven Development(HDD)
正しく開発したスタートアッププロダクトの初期設計は、正しく成長した未来からは壊れた設計にみえてしまう
koushisa.icon
1つの事実に対して解釈は複数生まれる
「技術的負債」の解釈は立場の数だけ存在するし全て間違っていない
正解はないけど間違えはある
要因を振り返ると、大体は以下に収束する
1. なにがあってもリリース最優先
2. 知識不足からくる戦略ミス
3. コードのオーナーシップ欠如
4. 経年劣化
リリース最優先は事業としては間違っていない
プロダクトを一分一秒でも早くリリースしたい
リリースしないとユーザーの反応を観測できない
早くリリースして、OODAループを早く回すことでデータが集まる
観測したデータを事業としての大きな意思決定に役立てる
リリース最優先の状況では開発者の「対象理解」、「解決策の検討」、「学習」の時間が削られる
メンタルモデル乖離につながる
設計意識が薄いということについて
大事なのは開発と事業双方向の目線で中長期的な大きな優先順位をどう考えるか、ということ
瞬間風速的な開発も大事だし、持続可能な開発も大事
事業的な視点で戦略的に抱える負債はむしろプラスに働くと考える
WIP
https://www.notion.so/scrapbox-b561610d3e4e4f6abe56ef873e76c19a#209b8b645ab34b28bcf392622df877ec
エンジニアとしての心構え
あらゆるコードは書いたそばから過去のものになる
ETC原則
変更容易性など幻想
なるべくコードを書かないで済むように、視座を高めて上流で手を打つ
戦略の失敗は戦術で補うことはできない
生殺与奪の権を他人に握らせるな
最初から150%くらいの努力で抑制する