やる気がストロングZERO

やる気のストロングスタイル

いちエンジニアから見た、AIによるシステム開発の現状

以前、「判断する仕事」はAIに代替されずに残ると思ったという記事を書いた。それから8ヶ月ほど経ったので改めて現状について、あくまでいちエンジニア視点で書いてみる。
※ 時代が進むと当時の考えを忘れてしまうので。。

2026年10月現在の状況

AIの使い方は人によって幅があり、ベストプラクティスらしいものも見えない。今はまだ混沌とした状況に感じる。

私としては、今はコードの多くをAIに書いてもらう。ただ、大きな実装を丸ごと任せず、局所的に書かせて細かく議論しながら組む。自分のイメージと違えば直してもらい、提案の利点を理解できれば採用する。小さなつまずきが減り、実装はかなり速くなった。

まだ、「判断」「責任」は人に残っていると感じる。私の場合、何を作り、どの案を採用するかは自分で決めるし、問題が起きたときの責任も負う。一方、「AIもこう言っている」と添えると意見が通りやすかったり、「AIにも意見を出してもらった?」と聞かれたりする。AIの方が信頼されているように感じる場面もある。

世の中は、もっとAIを使ったシステム開発を目指している

私のやり方は、書く作業だけをAIに移した状態に近い。一方、世の中はもっと広い範囲の開発をAIに任せようとしているように見える。人は「何を作るべきか」「どうなれば完成か」という仕様に集中し、実装はAIに任せて開発を10倍、100倍と速くする。AIDD(AI駆動開発)という言葉も聞くようになり、その実現を求められているような圧も感じる。

AIDDとは何か?実現可能なのか?

ただ、何が達成されればAIDDなのか、いまいち分からない。「これからはAIDD」という話は見つかるが、どこをゴールにしているのだろう。

AIが実装を速くできるようになり、今はチェックがボトルネックに見える。『ザ・ゴール』で読んだ記憶があるが、全体のスループットはボトルネックに制約される。AIの力も借りるとしても、人がチェックする限り、実装だけ速くなっても開発全体は10倍にならない。

ならばAIDDは、人の関与、特にチェックにかける時間を減らそうとしているのかもしれない。

しかし私は、AIを使うようになってチェックの時間が増えた。以前は書きながら理解していたが、今はチェック時に理解から始める。この時間を減らせるのだろうか。

人が責任を負う以上、何に責任を負うのかは確認したい。AIDDはその時間まで減らす話なのか。あるいは「壊れたらすぐ検知して直せばいい」という発想に変わるなどして、事前に理解すること自体が重要でなくなるのか。よくわかってない。

AIゴリ押し実装

AIによって実装が簡単にできるようになった。

その結果、要求仕様を見直さないまま、要求されたものをそのまま実装できてしまうようになった。この状況を個人的に危惧しているので書く。

AIゴリ押し実装とは

「こういう機能が必要なので実装してほしい」と要求が降りてくる。その要求どおりの仕様のままAIに実装を任せて、できてしまう。これを「AIゴリ押し実装」と呼ぶことにする。

問題は、要求仕様をそのまま実装しているところにある。

要求仕様はたいてい過剰で、矛盾もある。矛盾は実装の途中でAIから指摘される。すると、その矛盾にパッチを当てる形で条件分けが仕様に足され、仕様も実装もさらに複雑になっていく。

つまり、もともと過剰で複雑なものが、実装しながらもっと複雑になっていく。

これまでは、それが実装段階での破綻やスケジュール遅延という形で表面化していた。AIだと、そのまま実装できてしまう。

実装できたならいいのでは?

AIの時代になっても、複雑さが悪であることは変わらない。

複雑だと問題が指数関数的に増える。問題が増えれば、当たり前だがさまざまなリソースを食い潰す。実装が終わった時点がゴールではない。

どうあるべきか

仕様を必要最低限になるまで議論・調整する。実装が極力シンプルになるように、仕様を定義しなおす。

これは実装の都合で仕様を歪めるという話ではない。たいていのことはシンプルに解決できるので、頭をフル回転させてその道を見つけ出す、ということである。

このことは以前ここでも書いた。

https://techblog.lycorp.co.jp/ja/20260407a

techblog.lycorp.co.jp

目的を理解し、目的を達成できる最も簡易な手段を検討する

まとめ

AIによって実装の難易度が下がり、実装コストを以前ほど考えなくてよくなった。

いい面もあるが、同時に「実装量を少なくしたいから仕様を整理する」というモチベーションが薄くなってしまった。仕様を洗う工程は、AIが実装してくれる時代でも必要である。

異動時におけるエンジニアの生存戦略メモ

この春からチームを異動した。

2022年の入社以来、約4年間ずっと担当していたシステムから離れることになった。前チームでは新規システムの構築も自分が主導したため、システムの仕様やドメイン知識については誰よりも深く理解しており、「無双に近い状態」で業務をこなしていた。そのため、当時の個人的な課題は「後任の育成」や「他チームとの連携による総合力の最大化」といったフェーズへとシフトしていた。

そんな中、今回の異動により、別チームでまったく新しいシステムを担当することになった。ちなみに異動の理由は会社都合であり、自分から希望したわけではない(ただ、事前のヒアリングで「興味がある分野だ」と答えてはいた)。

新しい環境になったことで、システムへの理解度はゼロになり、メンバーも変わったため積み上げてきた信頼も一度リセット。まさに「ゼロからの再出発」となった(ただし、転職と比べればリセット率は低いが)。

現在、新たな環境で絶賛奮闘中であるが、自分なりの「キャッチアップのノウハウ」をいくつか書き残しておこうと思う。


リセットされるものと残るもの

このような異動や転職においては、完全にリセットされてしまうものと、環境が変わっても手元に残るものがある。

リセットされるもの①:システム知識

まず、完全にリセットされてしまうのが「システム知識」である。

前述の通り、以前のシステムはほぼ完全に掌握していたため、あらゆる業務を短時間で処理できた。問い合わせ対応ひとつとっても、大半のパターンは経験済みのため調べるまでもなく回答できたし、その場で分からなくても「どこをどう調べれば答えに辿り着くか」の型が見えていた。機能追加にしても、要求仕様を聞いた時点で実装方法が脳内に浮かび、「これなら1週間あれば対応できるな」といった見積もりが即座に可能だった(もちろん、ときには頭を悩ませるパターンもあったが)。

しかし、環境が変わればこれが全く通用しなくなる。

問い合わせを受けても、そもそも「何を聞かれているのか」が分からない状態からのスタートになる。まずは有識者に質問の意図を尋ね、調査の方針を示してもらう。そこから自力で調査を進めるわけだが、コードの意図が掴めなかったり、歴史的経緯が理解できなかったりと、いくつものハードルにぶつかる。どうにか「おそらくこうだろう」という自分なりの結論に辿り着いた後、再び有識者に「こう判断したのですが、認識は合っていますか?」と確認を取り、ようやく回答に至る。

ここで心苦しいのは、有識者に確認を取っている時点で、相手にも同じ調査(ただし自分より遥かに効率的ではあるが)を強いてしまっている点だ。この段階では、チームの業務負荷軽減に貢献できているとは言い難い。

機能追加も同様である。そもそもの既存機能を知ることから始めなければならない。ソースコードを読み解いて設計思想を理解し、「ここに新機能を組み込もう」と目星をつける。しかし、そのままでは綺麗にはめ込めず、事前リファクタリングが必要なことに後から気がつく。当初出した見積もりを修正させてもらうか、それが許容されなければ死ぬ気でカバーすることになる。

リセットされるもの②:信頼貯金

そして、もうひとつリセットされてしまうのが「信頼貯金」である。これも地味に痛い。

以前のチームでは、日々の業務を通じてコツコツと積み上げてきた信頼があった。「彼なら上手くやってくれるだろう」という周囲の安心感があれば、多くのプロセスをショートカットでき、あらゆる業務のスピードが上がる。

例えば、何か新しい提案をしてプレゼンをするとき、資料の完成度がそれほど高くなく、説明が多少たどたどしくても、「ああ、そういうことがやりたいのね」と意図を汲み取ってもらいやすい(ただ、これは単なる信頼だけでなく、お互いの思考の癖――『この人はここを気にするよね』など――を理解しているからでもある)。結果として、「いいんじゃない、やってみたら?」とスムーズにGoサインが出やすい。

しかし、信頼貯金がない状態では、同じプレゼンをしても「説明のたどたどしさ」がそのまま「本人の未熟さ」として受け取られてしまう。その結果、意見を通すまでに多くの時間を要することになる。 ただ、どちらかというとこれは「信頼がないから余計に時間がかかる」というよりは、「本来ならそれだけステップを踏むべき物事が、信頼貯金があることである程度ショートカットできていた」と捉えるべきなのだろうとは思う。

残るもの:経験から得た「判断基準」

では、すべてが失われるのかというと、決してそんなことはない。やはり「経験」は確実に残る。

その対象は多岐にわたる。プロジェクトが上手く回っていたときの成功体験も、泥沼化して苦労した経験も、チームが変わり扱うシステムが変わったところで消えはしない。それらはすべて、新しい環境で物事を進めるための強力なベース(判断基準)になる。

例えば、新しいチームで業務を進める中で、何かしらの「やりにくさ」や「辛さ」を感じたとする。 過去の経験という比較対象があるからこそ、その違和感を放置せず、客観的に分析することが可能になる。「以前の環境ではこのプロセスで苦労しなかった。では、当時と今とでは何が違うのか?」と問いを立てられるのだ。

  • 当時の手法を、そのまま今の現場に適用できるか?
  • それとも、現在のチーム固有の事情があり、そのままでは適用できないのか?

こうした分析を走らせたとき、全く同じ形とはいかないまでも、過去の知見の多くは今の現場にも応用が利く。つまり、新しいシステムを前にして知識はゼロであっても、「課題の解決策をはじめから知っている」というケースがあったりする。

ただし、注意する点があり、 いくら過去の経験から導き出した「正論」であっても、新参者がそれを立て続けにぶち上げるだけでは、既存のチームメンバーには受け入れられない。事情を知らずにただ正論を振りかざしても、反発を招くだけになる。

だからこそ、手法の導入は少しずつ、慎重に行わなければならない。 まずは現在のチームの対話に耳を傾け、現在のやり方に至った過去の歴史や経緯をしっかりとヒアリングする。その上で、メンバーの心情に寄り添いながら、全員で新しい方向へ向かえるように関係性を調整していく。


リセットされてしまったものを取り戻す

システム知識のキャッチアップ

では、リセットされた「システム知識」をどのように最速で取り戻していくか。現在進行形で実践しているアプローチを整理する。

1. 待たずに、自分から動いて疑問を解消する

最低限のオンボーディング(受け入れ研修やドキュメント読み込み)が終わったら、あとは自分で疑問点を見つけて能動的に聞きに行く。

「忙しいメンバーの時間を奪うのは申し訳ない」という心理的ハードルは誰しも感じるものだ。しかし、自分が投げかけた質問をきっかけに、既存メンバーの間でも「実はそこ、曖昧だったんだよね」と再確認の場になることも少なくない(そう自分に言い聞かせるだけで、ずいぶんと質問しやすくなる)。

逆の立場で考えれば、自分が知っている領域を他人に説明するのは、案外悪い気がしないものである。だからこそ遠慮しすぎず、ただし時間を割いて対応してくれる相手への感謝の気持ちだけは、とにかく全力で伝えるようにしている。

2. AIを壁打ち相手にする

有識者の時間を無限に奪うわけにはいかないため、ドキュメントの読み込みやコードの壁打ちには積極的にAIを活用する。 まずはシステム全体のアーキテクチャやドメインの全体像をAIと共に掴み、大枠のロードマップを頭に叩き込む。その上で、実際の業務(タスク)をこなしながら、周辺の細かい仕様をディテールへと落とし込んでいく。

当然、新しい知識はすぐに忘れるし、ときには誤解したまま覚えてしまうこともある。しばらくの間は、自分の理解をこまめに有識者と答え合わせし、知識の解像度と精度を一歩ずつ上げていくプロセスが不可欠だ。

3. 「アラート周り」をハブにして理解を深める

新環境でのドメイン理解を効率化するハックとして、「アラート(エラー通知)周り」をキーにしてシステムを紐解くアプローチは非常に有効だと感じている。

アラートが設定されている場所=「過去に問題が起きた場所」であり、「運用上の急所」である場合が多い。 問題が発生しやすいクリティカルな部分から優先的にコードや仕様を理解していくことで、メリハリのある、かつ実戦に即したキャッチアップが可能になる。

信頼を再度獲得する

信頼とは一朝一夕では得られない。 小さな約束や期待を裏切らずコツコツと積み重ねたり、皆が苦しんでいる時に一緒に苦しんだり、皆が喜んでいる時に一緒に喜んだりして、いつの間にか得られているものである。

しかし、システム知識がゼロの最初期においては、信頼の基盤となる技術的貢献がそもそも難しい。 そのため、まずは誰にでもできる「雑務」や「オペレーション」から自分の役割を見つけてしていく。

例えば、会議のファシリテーターを買って出る、ミーティングの場をセッティングする、議事録を率先して引き受ける、といったことだ。自分はまだ技術的な貢献は難しくても、こういった雑務を引き受けることによって、ドメイン知識を持つ有識者たちが彼らにしかできないコア業務に集中できるようになる。これこそが、初期段階においては立派なチーム貢献(価値)となる。

また、このアプローチはチームのためだけでなく、「自分の精神衛生を守る」という意味でも極めて有効である。

最初期はどうしてもチームメンバーに負担をかけてしまう。それは仕方のない過程だと割り切りつつも、貢献のない状態がある程度続くと、どうしても自分の存在価値に疑問を感じるようになり、大きなストレスを抱え込んでしまう。

どんなに小さなことでも「自分が役に立てる場所」を見つけることで、自分で自分を認められるようになり、しっかりと今やるべきことにフォーカスできるようになる。


ミドルエイジ特有の「高い期待値」という壁に対応する

基本的にはここまで述立ててきたアプローチを徹底すればよいのだが、ある程度の年齢やグレード(レイヤー)に達している場合、それだけでは足りない。なぜなら、周囲からの初期期待値が高いからだ。 マネジメント層からはもちろん、現場のメンバーからも「それなりの給与をもらっているのだから、さぞ有能なのだろう」という無言のプレッシャー(期待の目)を背負うことになる。

とはいえ、どれほど経験があろうとも、新しい環境に放り込まれた直後は「何も分からない」からのスタートである事実に変わりはない。ここに、自己の現実と周囲の期待との強烈なギャップが生じ、苦しむことになる。

もちろん周囲も鬼ではないため、最初の1ヶ月ほどはオンボーディング期間として温かく見守ってくれる。 しかし、2ヶ月、3ヶ月と経ってもなお「まだ色々と教わっている最中でして……」というスタンスのままだと、次第に厳しい目で見られ始める。 現実問題として、その短期間で大規模なシステムのすべてを把握することは不可能に近い。だが、ミドルエイジたるもの、その限られた「分かる範囲」の中で、何かしらそれなりの成果(プレゼンス)を示していく必要がある。

では、知識ゼロの状態から最速で成果を出すにはどうすればよいか。 その突破口として有効なのが、「ドメイン知識(深いシステム知識)がなくても手を出せる業務改善」である。

システムそのもののリファクタリングや機能改善には、膨大かつ詳細な知識が必要となるため、初期段階では手が出せない。しかし、チームが日々行っている「業務プロセス」や「定型業務」の非効率さについては、システムの中身を深く知らなくとも、これまでの他社経験や汎用的なスキルだけで違和感に気づき、より良いやり方を見出せることが多い。

(こうした業務改善の余地が残っているのは「達成難易度が極めて高いから」というわけでもなく、往々にして、改善のために周囲を巻き込む「パワー」や「時間」を割く余裕が、日々の運用に追われて捻出されていないだけなケースが多かったりする)

チームから仕様を教えてもらう一方で、自分からはこうした業務プロセスの負債を回収していく。この「ギブ&テイク」を成立させることで、周囲の期待に応えてバリューを示しつつ、本当のシステム知識をじっくり身につけるための「猶予期間(打席に立ち続ける権利)」を自ら勝ち取るのだ。

ただし、この業務改善を推進する際にも、やり方には細心の注意を払わなければならない。 ここでも「積み上がっている信頼貯金の量」が成否を分ける。まだ信頼が十分にない状態で「ここ、非効率なので変えましょう」と正論を指摘しても、既存メンバーからは感情的に受け入れられにくい。

また、一見非効率に見えるプロセスも、自分がまだ知らない「過去の痛烈な失敗」や「外せない大人の事情」があってその形に落ち着いている可能性も十分にある。 だからこそ、ここでも自分の意見を強行するのではなく、まずは全員の意見や歴史的な事情をしっかりとヒアリングして理解する。その上で、「このアプローチに変えれば、皆の負担がこれだけ減る」というメリットを丁寧に共有し、合意形成をしながら進めるのが、ミドルエイジに求められる成熟した進め方である。


キャッチアップ時に襲われる「不安」とどう向き合うか

新しい環境での立ち上げ期、特にミドルレイヤー以上の人間を最も苦しめるのは、技術的な難しさそのものよりも、内面から湧き上がる「自分はもらっている年収分の価値を、いま出せているだろうか?」という強い不安(焦燥感)である。

結論から言えば、最初期に一時的なビハインドを負ってしまうのは仕方のないことだ。扱うシステムは決して簡単ではなく、相応の複雑さや歴史があるのだから、すぐにトップスピードで走れるわけがない。

また、これまでのキャリアで培ってきた汎用的なスキルやマインドなど、「経験から滲み出る価値」も確実に提供できているはずである。しかし、厄介なのは「その価値が、評価者や周囲にまで表面化(可視化)するにはどうしても時間がかかる」という点だ。

自分の中では価値を出している実感が(たとえ雑務や業務改善であっても)あったとしても、特に自分と少し距離のあるマネジメント層や他チームから見たときに、それが正しく見えているかどうか別問題である。

だからこそ、中盤以降は「自分の価値を、分かりやすくパッケージにして外に見せていく工夫」が必要になってくる。

「自分がチームに加わったことで、何がどう良くなったのか」 これを独りよがりな自慢ではなく、客観的な事実やチームの生産性向上という形(パッケージ)にして、意識的にアピールしていく。例えば、先述した業務改善の成果をドキュメント化して共有したり、仕組みとして定着した実績を定例会で報告する、といった行動だ。

最後は、自分を信じる力に尽きる。 焦って一発逆転の大技を狙うのではなく、チーム内で「少しずつ、難易度の高い仕事」へとステップバイステップで挑戦を続けてしていくこと。その打席を愚直に踏み続けていれば、いずれ必ず周囲のドメイン理解に追いつき、活躍できる日がやってくる。

会社のTechBlogに記事を書いた「システム設計・開発の実践Tips」

また会社のTechBlogに記事を書いた。

techblog.lycorp.co.jp

(※ 2度目。以前はこれを書いた。巨大サイズデータ処理に対して省メモリで立ち向かう)

はてブのテクノロジータブにも一時期掲載されたりして嬉しかった。

b.hatena.ne.jp

会社のTechBlogに載せるってなると、文章や内容にも気を使うのでしんどいけど、リーチが全然ちがいますな。

「判断する仕事」はAIに代替されずに残ると思った

--- 追記ここから ---
(と思って一度書いたけど、その後「いや、AIがいい感じの判断を提示してくれるところまでは行きそうだな。。」って思い始めた。)
--- 追記ここまで ---

AIがどこまでできるようになってくるのかずっと考えていて、以前に以下の記事も書いた。

yaruki-strong-zero.hatenablog.jp

今回、なんとなく自分としては腑に落ちた考え方を見つけた気がするのでそれについて書いてみる。

結論から書くと「今のAIだとどこまでいっても判断する仕事は代替されずに人に残る」である。
これは「今はできないだけ」ではなく、仕組み上「できるようにはならない」だと思っている。

AIツールが存在するのに、僕に質問が飛んでくる現実がある

最近でもAIはものすごく日々進化していて、便利になるシーンも増えたと思うが、いまだに「この対応の進め方、案1と案2があるんですけど、どっちがいいすかね、、?」みたいな相談が飛んでくる。

社会人経験も10年単位で積んでいるとサクッと回答できたりする。

人単体が10年やそこらで得た知識など、AIの抱えている知識とくらべれば無いにも等しいと思うが、それがAIでは解決できずに僕に聞いてくるところが不思議な感覚があった。

なぜそんなことが起きているのかを考えた。

AIは精度の高い判断・決断ができない

AIは物事の重要さを決めることができない、ということなのかと思う。

一般的なことであれば判断できる。
例えば「同じことをできる2つの関数があるが、このシーンだとこの関数を使うべき」みたいなやつ。

しかし、今まさに自分(人間)の周りで起きている事象に対し、何が重要なのかの情報は持っていない。 その材料が圧倒的に少ない。 そして、全てをAIに渡すことはできない。非構造化データが多すぎる。

さらに、渡せたとして、それぞれの事柄に重要度をつけることができない。 「どの事柄がどれくらい重要なのか」の設定を人が渡してやらねばならないが、そもそもこれ自体が判断である。

少し理論の飛躍っぽいが、人が自発的にこれをできてAIができないのは、AIが個として生命活動を行なっているわけじゃないことによるのかなと考えている。 
人はこの重みづけを、死のリスクを避けることを源泉としておこなっているのではないかと考えている。

人が行なっている判断を大量に学習させれば精度の高い判断を模倣できるようになるか?

以下理由で不可能だと思っている。

・学習機会が少なすぎる。
下した判断が正解だったのかどうか、判明するのは割と先の未来だし、しかも正解だったのかどうか明確にわかるわけではない。

・良い判断かどうか?の定義がない。ケースバイケースすぎる。
アグレッシブな判断が結果的成功して良い判断とされることもあれば、失敗して良くない判断とされることもある。
人は、いろんなやつがいろんな立場でそれぞれが判断することで群生として成立している気もしてきて、そうなると優秀さのベースは「人であること。ユニークさも持ち得ること」あたりになるように思えた。

(ユニークさを持ち、個であることが可能なAIってのが出てきたらどうなるのか、も考えてみたい)

精度の高い判断・決断が求められる仕事は人に残る

上記の理由により、精度の高い判断・決断が求められる仕事は人に残ると思う。

以前より「AIにより、人はより高いレイヤーの仕事に注力するようになる」ってよく耳にしていたけど、結局これはその通りであったと思った。
前は「人にはできるがAIにはできない」の境界がわからず、今のAIの進化速度を見てると経営レイヤーだってAIに置き換わるんじゃ無いのか?とか思ってたけど、経営こそ判断・決断の本丸なのでAIに置き換わることはない。

エンジニアはどうか?

エンジニアには「精度の高い判断・決断が求められる仕事が存在するか?」ということだが、存在する。

以下、いい感じにAIにまとめてもらった。

実現可能性の検討と価値の最大化(要件定義)

アイデアを「動くシステム」に変えるには、技術の限界を知った上での交通整理が必要です。

技術的な目利き: 今の技術で「できること」と「できないこと」を切り分け、アイデアの核となる重要部分を、実現可能な形へ落とし込みます。

トレードオフの最適化(バランスの決定)

システム開発の本質は、相反する要素(コスト・納期・品質・リスク)の狭間で最適解を見つけることです。

AIの限界: AIは周辺状況(ビジネスフェーズ、予算、組織の技術スタック)の「重要度」を理解できません。

人間の役割: 「いい感じで」という曖昧な要求に対し、エンジニアの知識を用いて「何を優先し、何を犠牲にするか」のバランスを決定します。AIからの問いかけ(「どうしますか?」)に対し、最終的な意思決定を下すのは人間です。

「運用」を見据えたリスクの重み付け

「作って終わり」ではないシステムにおいて、AIには決定的に欠けている視点があります。

■ AIにできない判断

AIは「今、何を優先すべきか?」という動的な状況判断ができません。

稼働中のシステムにおける各種リスク(性能、セキュリティ、保守コスト)の重み付けができず、運用の継続性を担保できません。

■ エンジニアの役割

現場の状況に照らし合わせ、「今この瞬間に、どのリスクを許容し、どこを死守すべきか」を判断します。

運用フェーズで発生する予期せぬ事態に対し、エンジニアがその知識で優先順位を決定します。

「正しさ」の定義とデグレの防止

AIによる修正やスクラップ&ビルドが容易になったとしても、その品質を保証するプロセスはより困難になります。

AIによる修正のリスク: 問題を潰すための修正が、未知の箇所でデグレ(品質低下)を引き起こす可能性があります。

エンジニアの目: AIが「大丈夫」と言ったとしても、その根拠が技術的に妥当か、既存仕様を壊していないかを判断するには、深いエンジニアリング知識が不可欠です。「正しさ」を定義し、責任を持って「デグレしていない」と言い切れるのはエンジニアだけです。

おわりに

日々Xで有象無象のエンジニア不要論が流れてくるので、毎度毎度「マジか!?」とアテンションとられて疲弊してきた。
一旦ここで区切りをつけて、心穏やかにkaggleに取り組みます。

OSSコミッターになれるかと思ったけど諦めた話

自分の経験からGeminiにブログ記事に起こしてもらった。
いつも、文章を自分なりの精一杯にいい感じにまとめるの時間かかるから助かるかも。
ただしなんかAIっぽい文体になる。自分の過去記事とか参照してもらってるハズだけど。。

きっかけは、よくある社内要件

自分の会社で AWS S3 を使う必要が出た。
ただし社内ネットワークから直接は出られず、独自認証付きの Proxy を経由する必要があった。

Proxy には
「HTTP Header に特定のトークンを付けて送る」
というタイプの認証がかかっている。

aws-sdk-java には Proxy 設定はあるが、
Proxy リクエストに任意の HTTP Header を付ける拡張ポイントは用意されていない。


「ヘッダ1行足すだけ」だと思っていた

やりたいことは単純だった。
Proxy リクエストにヘッダを 1 行足したいだけ。

fork してコードを追い、
該当箇所に手を入れたら普通に動いた。

S3 にもつながったし、
社内要件としてはこれで完全に満たせた。


せっかくなら PR を出そう、と思った

どうせなら本家に PR を出そうと思い、
今回の修正を整理し始めた。

やったことを抽象化すると、
「HTTP Header にトークンを付けるタイプの認証」を
Proxy に設定できるようにした、という話になる。

Bearer 認証も Basic 認証も、
この枠組みで表現できる。

自分としては、割と綺麗な設計だと思っていた。


「Bearer 認証に対応しました」と言っていいのか?

しかし
「Bearer 認証に対応しました」と OSS として名乗ることを考え始めて、立ち止まった。

Bearer 認証の使われ方には幅がある。
単に固定ヘッダを送るだけのケースだけじゃないっぽい。

自分の修正は、
「ヘッダトークンを送れれば十分」という前提に強く寄っている。


自分の要求と、認証という仕組み全体

自社用途としては問題ない。
実際、これで困っていない。

ただ、OSS として認証機能に手を出すなら、
自分の要求だけを満たせばいい、という話ではない。

認証がどう使われ、
どこまでを責務として扱うべきなのかを把握した上で、
その中でベストな実装を選ぶ必要がある。

そこまで含めて説明できないと、
「対応しました」とは言えない。


結局、今回は出さなかった

将来の拡張や責務の線引きまで考えると、
このままではたぶんマージされない。

そう思って、今回は PR を出すのをやめた。

コードは書けた。
動く。
要件も満たしている。


自分の改修と、OSSの改修は別物だった

「自分の都合だけを満たす改修」と
「OSS の機能として提供する改修」は、
思っていた以上に別物だった。

今回は、それに気づいた、という話。

事前検証はしっかりやりますという話

機能を開発・リリースするとき、確認・検証はしっかりやるよ、という話を書く。
当たり前だけど、割と泥臭く頑張ってるのでその辺り書いてみる。

開発中: 不確定要素はできるだけ時間的余裕があるうちに潰す

機能開発の中で、不確定具合が高い物事ってのがあったりする。
「これどうなんだろうな〜、どうやってやるんだろうな〜うまくいくのかな〜」って感じのやつ。
こういうのはハズした時に見積もりに与える影響がでかいので、なるべく早く確認しに行って、不確定具合を低くするように努める。

自動テスト: 既存で用意されているテストは気休めでしかないと思ってる

既存で自動テストが用意されてたりするが、自分が用意したものでもないし今回の自分の変更を100%担保してくれるテストは存在しないと思ってる。
実際内容見てみると意外とザルなテストだったりもする。

「今回のリリース、不具合は出ません!」と言い切れる状態を作るために、自分で必要なテストは用意する。
その際、できる限りパターン網羅できるテストを用意する。
パターン網羅ができるように、そもそもの機能の作り方も工夫する。

手動テスト: テスト方法は自分で考える

手動テストも実施したりするが、全パターンをテストするのは現実的に不可能な状況が多い。

そういう時は自分で「ここが確認できてれば大丈夫かな?」ってポイントを考えて、 そこをテストするいい方法がないかを考える。
あらかじめ用意されている手順などは存在しない。

あるデータが必要であればなんとかデータを用意するし、深夜時間帯でしかテストできないなら、深夜時間帯にテストする。 気軽にテストできない状態が嫌なので、mockを差し込めないか検討するし、一時的にコードを書き換えて再現できないかを考える。

書いてみると当たり前だが、簡単に「これはもうぶっつけ本番で行くしかないね」とは言わず、割としぶとくずっと事前確認する方法を考えている。
この点について、今まで僕よりしぶとく考えている人は見たことない。しぶとければいいってもんでもないかもだが、そのおかげで不具合を未然に防げている事実はあると思う。