世界を動かす技術を、日本語で。

シニア開発者が専門知識を効果的に伝えられない理由

7時間前原文(nair.sh)

概要

  • シニア開発者には「新しいもの好き」と「複雑さ回避派」の2タイプが存在
  • ビジネスには「不確実性削減」と「安定性維持」という2つのループがある
  • シニア開発者は複雑さによるリスクを避けるが、他部門はスピード重視
  • コミュニケーションのズレはこのループの違いから生じる
  • AIの登場で「スピード」と「スケール」のシステム分離が重要に

シニア開発者の2つのタイプ

  • チームに入ると、 2種類のシニア開発者 に出会う傾向
    • 新しいツールや事例を持ち込むタイプ
      • 「このツール面白い」「他社はこうしてる」「HackerNewsで見たベストプラクティス」
      • 業界経験豊富、コミュニケーション力はあるが、自分とは合わない人も
    • 最小限主義・回避型タイプ
      • 「本当に必要?」「やらなかったら?」「今は我慢できる?」
      • 複雑さを極力避け、既存のものを再利用・減らすことを重視

複雑さを恐れる理由

  • シニア開発者が最も恐れるのは 複雑さ(Complexity)
    • 特殊ケース、if文、DBテーブル追加、新コンポーネントなどを極力減らす
    • システムへの追加は、 複雑さ増大=リスク増大 を意味
  • 責任を持つ立場になると、誰もが複雑さの怖さを理解するようになる

ビジネスの2つのループ

  • 企業活動は 2つのループ で説明可能
    • 第1ループ:不確実性削減
      • マーケター、営業、プロダクトマネージャー、CEOなどが所属
      • 目的は市場での学習とフィードバック獲得
      • 最大の敵は 不確実性(Uncertainty)
      • スピードが最優先、どんどん試して市場から学ぶ
    • 第2ループ:安定性維持
      • 顧客がつき始めた後のフェーズ
      • サービスの継続・保証・安定運用が主目的
      • シニア開発者はここで活躍、 複雑さ=安定性低下 を警戒

コミュニケーションのズレ

  • 2つのループが同時進行し、 問題意識の違い がコミュニケーションの障壁に
    • ビジネス側は「不確実性削減=スピード重視」
    • シニア開発者は「複雑さ回避=安定性重視」
  • シニア開発者が複雑さの話ばかりすると、他部門には響かない

シニア開発者のコミュニケーション改善策

  • 他部門の「不確実性削減」に寄り添う表現が重要
    • 「もっと早く試せる方法は?」 と提案
      • 「quicker」でスピードを意識
      • 「something」で代替案を示唆
      • 「try」で完璧でなくてもOKという柔軟性
  • 最小限で試し、既存のものを再利用する姿勢
    • 例:Google Formsでアンケート、既存UIにボタン追加、1つの指標だけで分析
    • 「ケーキが欲しい?サンドイッチにローソクを立てればOK」

AIによる影響と新たな課題

  • AIの登場で「複雑さ回避」の意義が問われる
    • AIは高速に多くを構築できるが、「責任」を持たない
    • システムの可読性・保守性・拡張性・安定性が損なわれやすい
    • スピード重視の結果、安定性が大きく犠牲に

「スピード」と「スケール」のシステム分離

  • 解決策として システムの分離(デカップリング) を提案
    • Speed版システム
      • AIやジュニア開発者、他部門が自由に実験・市場検証
      • 可読性や安定性は二の次、とにかく早く試す
    • Scale版システム
      • シニア開発者主導で安定性・可読性・拡張性を重視
      • Speed版でうまくいったものだけを選抜し、堅牢に実装
  • フィクション作家の「初稿」と「編集」作業の関係に近い
  • 「3日でSpeed版、6週間でScale版」など、 両者のニーズを満たす提案 が可能

まとめ

  • シニア開発者は「複雑さ管理」だけでなく「不確実性削減」への貢献を意識
  • AI時代は「スピード」と「スケール」を分離し、両者のバランスを取る設計が重要
  • シニア開発者=編集者的視点の価値がより高まる時代

Hackerたちの意見

シニア開発者として、私は一律の意見が本当に嫌いです。実験者と同じくらい、以下のような失敗も見てきました。

「本当にそれが必要なの?」 「これをやらなかったらどうなるの?」 「今はなんとかなる?後で重要になったら考えようか?」 システムも製品もそれぞれ違うので、CTスキャナーのファームウェアを作るなら、新しいことに挑戦するアプローチは、100クライアントのCRUD SaaSとは全然違います。熱心でオープンなシニアがシステムを抜け出せない角に追い込むこともありますが、PHP5があれば十分だと言う人もいます。

いわゆるサバイバー・バイアスです。あるVPが、以前の会社でうまくいったからという理由でエラスティックサーチを使うように命じました。結果的に、私たちにも合っていました。VPの言うことを聞いて技術的な決定を下し、エラスティックサーチを使いましょう。

実は私も似たようなことを言いに来ました。

ああ、ベイビー、これが私のシニア開発者だ。避ける人、減らす人、リサイクルする人。彼らはできるだけ開発を避けたがります。これが良い時もあれば、改善を積極的に試みるのが最善の方法である時もあります。良いシニアは、その時を見極めることができるのです。

OPが伝えようとしているメッセージを見落としているかもしれないよ。強調された特性は、すべてより良い安定性につながるからなんだ。

同意する。文脈が重要だよね。シニア開発者としては、複雑さやリスク、利点と欠点を理解する必要がある。ビジネスサイドも理解しないと。スタートアップか、すでにキャッシュカウの大企業かで、製品のコア機能を変更する際の影響は全然違うから…文脈、文脈、文脈だよ。

同じこと考えてたけど、再度その部分を読み返して気づいたことがある:>「はい、はい、もちろんこれは単純化されています。アイデアを明確に伝えるために、極端な例を挙げているのです。」全てのことに言えるけど、黄金の中庸が適用されるって、この記事が主張してると思う:>「'スピード'バージョンのシステムでうまくいったことといかなかったことが、'スケール'バージョンのデザインに影響を与えています。」

私が見た中で、プロトタイプが実際のプロダクションに進むことが多いです。書き直し?みんなが「これが昇進したらゼロから書き直す」と約束したことが何度かありましたが、結局実現しませんでした。記事では責任やアカウンタビリティに触れていますが、リスクを取る人にはそれがありません。定義上そうです。クレイジーなアイデアを持って、急いで出して、クライアントが食いつくことを期待します。そして利益を得ます。どうやって機能させるか、スケールさせるか、コストが売価を超えないようにするかは、もうあなたの問題ではありません。右側のループ。最近人気のある2社は、これを極端に進めました。何かを早く出荷して、線形にしかスケールしないので資金を調達します。成功した企業、無数のユーザー、その中にはお金を払う人もいます。誰が悪いのか?シニア開発者か、単に「それはどう持続可能なの?」と尋ねる合理的な人か?そういう人は解雇されるので、残った人は信じる者になります。

みんなが「これが昇進したらゼロから書き直す」と約束したことが何度かありましたが、結局実現しませんでした。古い名言:「一時的なハックほど永続的なものはない。」

だからこそ、十分に経験のあるエンジニアリングリーダーシップが必要なんだよね(ICリーダーシップと管理の両方)。もしエンジニアが非技術的なステークホルダーの言うことを何でも従うなら、責任の空白ができて、いつかは大惨事が起きる。最もCYAが下手な人が責められることになるよ。一方で、ほとんどのビジネス問題は、十分に視野を広げて「なぜ」をたくさん聞けば、ひどい一方通行の扉を通らずに合理的に解決できる。もちろん、どこでもエンジニアリングがそれを許可されるわけじゃないけど、許可されないところでは、経験豊富な人たちを維持できなくなる。彼らは自分の判断が評価される場所に行くだけだから。時には技術的負債がビジネスにとって正しいこともあるけど、十分に経験のあるエンジニアは、常に逃げ道を作ることができる。でも、システムの純粋さをビジネスの問題よりも優先することはできない。システムはビジネスによって支払われているから、それを見失ったら、影響力の基盤を失ったことになる。

だから、チームの誰も聞いたことがない言語で書かなきゃダメなんだよね。

何度かみんなが約束したのを思い出すよ。「これが昇進したら、ゼロから書き直す」って。でも、結局そんなことはなかった。なんでそんなことするの? もし需要を満たしてて、必要な機能もあって、実際には再構築する必要がない「プロトタイプ」があるなら、なんでそんなに時間と労力をかけるの? それは意味がないよ。プロトタイプや「概念実証」であることは、実際の問題を列挙できないなら本質的には関係ない。私は、技術的負債に悩まされてるチームと一緒に働いてるけど、彼らはそれが大きなリスクで、作業を遅らせるって文句を言ってる。でも、私たちのインシデントログを見ると、あまりインシデントはなく、プロダクションでリスキーなコードを実行してるせいで起きたものもない。リスクレジスターにも「このコードは古くてゴミで、過去のEOL依存がある」なんて項目はないし、どのチームも技術的負債がどのように、またはどれだけ彼らを遅らせているかを具体的に説明できたことはない。だから、誰もが「影響がない問題を直すのに時間を使ってほしくない」と驚くべきではない。逆に、あるチームはアプリを立ち上げる前に数ヶ月かけてリファクタリングしてた。彼らはそれを作った後、「もっと良くできる」と決めて、立ち上げ前にほとんどを再作成するのに多くの時間を費やした。彼らが自分たちの作品が気に入らないから、すべての価値が遅れたんだ。そして、当然リーダーシップチームはそれに怒って、今では信頼がほとんど残ってない。チームとステークホルダーの間で仕事の納品について良い会話が必要だけど、それがないと誰も幸せになれない。もしそれが起こらないなら、ステークホルダーが常に勝つことになる。

この問題は確実にAIコーディングエージェントが登場する前からあったけど、彼らによって悪化しているかもしれない。記事は「一つは捨てるつもりで計画しろ」という古いアドバイスで締めくくられてる。もちろん、私も『神話の人月』を読んだけど、どうやって意思決定者を納得させる?

最初のPoCが予想外に本番に入った後、私はPoCを作るのをやめて、MVPを作り始めた。最初に見せるものがすぐに本番に入る準備ができているわけではないけど、最初から本番に入ることを前提にPoCを作って、作業中に本番に持っていく計画を立てるようにしてる。

本当に優秀なシニアは、今の会社の文化がどうなっているか、5年後にどうあるべきかを見極めて、適応しながら進んでいきます。5人のスタートアップは、余計な複雑さをコストにする必要はないかもしれませんが、500人の企業は、その複雑さが必要になることがあります。なぜなら、すべてのビジネス決定に対して二次的な影響を軽減する必要があるからです。「常に複雑さを避ける」という白黒の話ではなく、「意味があるときに複雑さを追加する」ということです。さらにその問いには多くのニュアンスがあって、時にはビジネスがあと数ヶ月生き残る必要がある場合もあります。

そうそう、優先順位と透明性があれば、人々が問題を解決するために使うべき変数を変えられるんだよね(もしそうできないなら、仕事が下手ってこと)。嵐が来るまでに2時間あったら、「水が溜まりすぎて、排水できなくなるかな?」って考えるはずで、建築について考える余裕なんてないよ。俺が見てる問題は、管理側がどれだけお金があるかとか、実際のタイムラインについて話さないで、ゲームみたいにやってること。貢献してる人たちが重要な瞬間の前に去っちゃうのを恐れてるから、みんなその状況の中でバカな決定をし続けて、結局新しい仕事を探す羽目になるんだよね。

避ける人、減らす人、リサイクルする人。こういうタイプの人は、チームや会社によっては孤立することがあります。私が見つけた最善の方法は、追加された複雑さがエンジニア以外にどう影響するかを伝えることです。ただし、インセンティブやトレードオフを理解する必要があります。時には損失を受け入れる方が良いこともあります。同じリーダーとしばらく一緒にいる幸運があれば、声を上げつつ妥協する数回があなたに有利に働くでしょう。その複雑さがあなたが説明したように彼らを痛めつけるとき、信頼を得ることができます。私の経験では、提案された解決策は、あまり複雑でない解決策になることは稀です。迅速なMVPは、いつまでも残る傾向があります。顧客が何かの製品や機能を使い始めると、ピボットするコストが上がります。実験したいなら、セグメントでやりましょう。

一番いい戦略は、顧客の視点から自分の主張を構築することだね。

「これによって、クライアントWが文句を言っているこの問題に対して、Yのユースケースをサポートする機能をX日で展開できるようになる。」 こんな感じの主張は、 「将来的な拡張性のためにZをやるべきだ。」 「Zは最終的に新しいプラットフォーム機能を可能にするかもしれない。」 「Zはユニットテストがしやすい。」 ビジネスの文脈では、今までの経験からすると成功する可能性がかなり低いと思う。

私の経験では、回避者や削減者、リサイクラーは、私のアイデアを避けて、自分のアイデアをやりたがるんだよね。

複雑さは、もし単一の測定可能な次元に還元できるなら、解決空間のいくつかの要因の一つに過ぎません。他にも、メンテナンス性、スケーラビリティ、信頼性、レジリエンス、アンチフラジリティ、拡張性、多様性、耐久性、合成性などの特性があります。すべてが当てはまるわけではありません。解決空間におけるトレードオフについて話すことができるのは、シニア開発者とスタッフ以上の開発者の違いの一つだと考えています。

これらの多くの要素は、複雑さによって直接影響を受ける。

ジュニアが何かの任意の側面を見たときの第一印象としての「複雑さ」は、常に悪いもの、過剰で悪いものだ。システムの開発を次の10人年にわたって簡単かつ迅速に進めるための「複雑さ」は、素朴なアプローチが真っ直ぐ進むときに、実際には脇道にそれることを意味する。亀とウサギの話だね…最初の2週間で急いで成果を上げようとする衝動(簡単に取れる成果、目に見える勝利、MVP!)が、未熟な設計や開発中のメンテナンスの必要性によって、ますます勢いを失うのが不思議でしょうがない。数週間「速く」進んでいたのに、結局スケジュールが6ヶ月遅れたってことだ。

一番大事な要素の一つを見逃してるよ:使いやすさ。

トレードオフ!これが重要だと思う。プログラマーじゃない人は、トレードオフがないと思ってるけど、プログラマーはデザインのあらゆる側面がトレードオフだって気づくべきだよね。

AIがあっても、ジュニアとシニアの間には明確な違いがあるよね。思いつく限りのことは、問題を避けることとは関係ない。ある程度、5人以上のエージェントが異なるプロジェクトで働くのは、5人以上のチームをリードするのと似てる。スキルはうまく転用できるし、シニアはエージェントが何をしているのか理解して、それをレビューしたり挑戦したりできる。ジュニアはしばしばそれができない。そして最後に、シニアはビジネスや問題の領域について深い理解があるから、AIをより効果的に正しいものを作る方向に導けるんだ。

私が気づいたのは、コミュニケーションを取ったり自分の専門知識を共有したりする意欲が、ジュニアの開発者にはあまり求められないことが多いってこと。一般的に、開発者はメンターを見つけることに興味がないと感じる。彼らはあなたのLinkedInプロフィールを見ないし、あなたを知識や専門知識の可能なソースとして見ていない。だから、業界で30年の経験があっても、共有する相手がいないってわけ。

まさに俺の経験そのもの。君の言い方は俺よりも外交的だね、ハハ。若い人たちは、情報や知識が他の人から得られるってことを知らないか、知りたくないみたい。若さの傲慢さが100倍って感じだよね。ポケットやデスクにスパコンがあって、「すべて」を知ってるAIがいるのに。今、教師ってどんな感じなんだろう。君のAIはオフィスの人間関係をどう説明するの?CTOの意見は?最近の障害や学びについて話す(その詳細はブログにはあまり載ってないけど)?彼らは知識と事実だけが必要だと思ってて、歴史や政治、コミュニケーションなんていらないと思ってる。AIやGoogle検索は彼らを挑戦したり、押し出したり、反対したりしないから、それが心地よくて、学びよりも魅力的なんだと思う。

これが今の仕事での私のフラストレーション。無駄が多くて、誰もそれを避けようとしない。経験の浅い開発者が「AIマジック」を使ってURLバリデーターを置き換えようと提案した。私は、キャッシュされたファジーマッチの解決策(AIで事前に入力されたもの)を提案したけど、誰も気にしなかった。今、AIモデルが突然却下されて、システムが壊れちゃった。全システムを再検証しなきゃならない。私より昇進した若い開発者が、修正方法の文書を作ろうとした。「ねえ、ダン、手伝ってくれない?」って言ってきた。彼は、文書を書いて会議を開くことで昇進したんだ。合理的に物事を進めるのではなく。今、彼は私の仕事を使ってリーダーシップを示そうとしてる。誰も気にしない。私がより良い解決策を提案すればするほど、経験の浅い開発者にとっては脅威になる。大体のことはうまくいってるから、マネージャーは気にしない。もっと良い方法があったかもしれないけど、無駄と戦うのは疲れるし、ただ良いコードを書きたいだけなんだ。

他の州で仕事を始めたのは、面接官の一人が非常に優れたシステム管理者で、彼から学びたかったからなんだ(最初の仕事、スタートアップで、システム管理に自分を追い込んでしまったので、学ぶために頼れる人があまりいなかった)。もちろん、私が着いた直後に彼は辞表を出した。後任を見つけたからね。だから、私にはあまりうまくいかなかった。

あなたが出会った後輩たちは、自立することに執着してるのかな?それとも自分のアイデアにプライドを持ちすぎてる?先輩たちの経験の中には、肉体的なレジリエンスもあると思う。業界に入った時と比べて、別に賢くなったわけじゃない。ただ、 trenches(戦場)にいることに慣れただけ。自分の心理をどう扱うか、簡単そうに見えることが実はそうじゃないこと、そしてひどいこともそうじゃないことを学んだ。これを後輩に詳しく説明できるけど、彼らが実際にその地雷原に立つまでは、あまり意味がないんだよね。

あなたが専門家かもしれないけど、一般的なルールとして言えるのは、みんな「専門家」が自分の「専門知識」をシェアしたがるのにうんざりしてるってこと。実際、「専門家」が「専門知識」をシェアしたいという需要は、供給に比べて桁違いに少ない。どこかに「専門家」の話を聞いてお金をもらうビジネスがあると思う。彼らは自分のことを良く思えるし、ウィンウィンだよね。だから、もし人々があなたを「専門家」と見なさず、あなたに答えを求めないなら、あなたは単に「専門家」として認識されていないか、観察可能で否定できない証拠(資格じゃなくて、ソフトウェアのことね)が必要な高いハードルがあるんだ。競争も激しいし、「専門家」だと思っている人が多すぎるから、明確な「専門家」の証拠を示さないと認識されないよ。

HNがあるから、ここにはいつも誰かいるよ、友達 :)

だから、30年の業界経験があるのに、共有する相手がいないってわけじゃない。マジで。こんなにたくさんの知識や専門性を持っているのに、ほとんどの人が興味を持たないか、他の人に伝えようとすると嫌われるのが辛い。最近は、組織の知識には価値がないみたいだから。

専門知識の最も重要な部分は、彼らの内部の「世界モデル」から来ていて、それから切り離せないんだ。普通の無自覚な人は、何でも言葉にできると思っていて、一度言葉が発せられたら、言った人の意図が読者に伝わると信じている。唯一の難しさは、言葉を知らなかったり、曖昧さを誤解したりすることだと思ってる。この開発者に「コミュニケート」して他の人に専門知識を伝えるというリクエストは、この信念に基づいている。でも、この信念が間違っているから、専門知識を伝える試みは決して完全には成功しない。事実の知識は言葉でうまく伝えられるから、専門知識を伝えることには常に部分的な成功がある。でも、すべての知識がどうつながっているかの固まった相互接続の世界モデルは、伝えられない。AIは事実を知っている点では圧倒的だけど、驚くほど正しい洞察を得るためにそれを利用する方法はまだない。「世界モデル」から来るその神秘的な正しさが「専門知識」なんだ。その部分は伝えられないから、他の人が同じ専門知識を身につける手助けをするしかない。専門知識を伝えることは、どこに行って何を学ぶべきかのヒントを与えることだけど、読者はそれを内面化するために努力しなきゃいけないし、学ぶべきことを学ぶ機会を提供する正しいプロジェクトが必要なんだ。それは単なる移転行為じゃない。

それはとても上手く言ったね。

じゃあ、エンジニアリングの問題だ。ジュニアを10倍育てる方法を考えてみて。

だから、私は詩でしかコミュニケーションしないんだ。複雑さは君が思ってるほどじゃないから、ちゃんと聞いてみて。

https://en.wikipedia.org/wiki/Tacit_knowledge

良いところは、LLMがこの問題を解決するために、すべてを言葉にできると仮定して、世界を納得させることだね。

何か見落としてるかもしれないけど、「左」と「右」のループは、同じことを指す少し違う言葉に思える。会社は(提供 | サービス)を(市場 | ユーザー)に提供して、(フィードバック | 支払い)を受け取る。サービスはオファーそのもので、ユーザーベースは市場そのもので、支払いはフィードバック信号そのものだよね?編集 - 元のコメントを拡張して追加したいのは、著者のポイントは私には分からないかもしれないけど、これらのラベルの一方で物事をフレーミングすることが、「複雑さ」と「不確実性」のどちらを減らす要素として使われるかに対応しているかもしれないってこと。これらのラベルを慎重に選ぶことは、プロダクトオーナーとの優先順位の戦いで「シニア」開発者の説得力に相関するかもしれない。それに対する私の反応は、「多分?」(肩をすくめる)私は職業としてコピーライターではないけど、言葉には気を使ってるし、もしかしたらちょっとオタクっぽくなったかも。

会社は既存のサービスを既存のユーザーに対して提供して、対価を得ている。会社は現在の市場で現在および潜在的なユーザーに新しいサービスの可能性を提供して、その新しいサービスがどれだけ価値があるかのフィードバックを得ている。

ティーザーの引用のダブル・エンタンドルに引っかかって、著者がコピーライターだってことが皮肉だなと思った。>>「AIエージェントはソフトウェア開発の未来です。もう開発者は必要なくなります。ビジネスの進行を遅らせることはありません。」> で、私にとってコピーライターとして、ここで起こっていることは、同じメッセージが二つの異なるオーディエンスに対して二つの異なる意味を持っているってこと。これを「遅い開発者がいなくなれば、もっと早くなる」と解釈するべきか、「私たちはもはや開発者に遅れさせられることはない。AIエージェントと一緒に遅くなることができる」と皮肉的に解釈するべきか、判断がつかない。複雑さが増すにつれて、後者の解釈の方が大規模プロジェクトには合ってる気がする。