技術の罠:「完璧なコード」が誰の役にも立たないとき
こんにちは。海外でC#とWPF(Windows Presentation Foundation)を武器に、デスクトップアプリケーションの設計開発をしている一介のエンジニアです。
今日はちょっと、耳の痛い話をしようと思います。でも、これは過去の自分に向けて言いたかったことでもあり、もしあなたが今、「技術力さえあれば最強だ」と思っているなら、きっと役に立つ話になるはずです。
1. コードを書く快感という「麻薬」
正直に白状しましょう。僕はコードを書くのが大好きです。
特にC#のような型安全で強力な言語を使っていると、万能感に浸れる瞬間ってありますよね?
複雑な業務ロジックを美しいクラス設計でカプセル化できたとき。
WPFでViewとViewModelがバインディングで完璧に同期し、UIが生き物のように動いたとき。
PrismやMVVMパターンを駆使して、依存関係注入(DI)がバチッと決まり、テスト容易性が確保された疎結合な設計が完成したとき。
「……美しい。」
Visual Studioの画面を見つめながら、自分の書いたコードに陶酔する。コンパイルが通り、すべての単体テストがグリーンに点灯した瞬間のあのドーパミン。エンジニアなら誰しも経験があるはずです。「この設計は芸術だ」とすら思う瞬間。
私たちは往々にして、この「作る過程」そのものを目的にしてしまいがちです。
新しいライブラリを試したい、流行りのアーキテクチャパターンを導入したい、もっと効率的なアルゴリズムで書き直したい。
これらはエンジニアとしての健全な探究心であり、成長の源泉です。それを否定するつもりはありません。
しかし、海外に出て、よりシビアな「ビジネスとしてのソフトウェア開発」の現場に身を置くようになって、ある残酷な事実に気づかされました。
それは、**「どれだけ技術的に完璧なコードでも、間違った問題を解いていたらゴミと同じである」**という事実です。
2. 「正解」を出す優等生エンジニアの限界
日本で働いていた頃の僕は、いわゆる「仕様書通りのものを作る」ことに関してはプロフェッショナルであろうとしていました。
PM(プロジェクトマネージャー)やデザイナーから降りてきた要件定義書を読み込み、それをいかにバグなく、パフォーマンス良く、保守性の高いコードに落とし込むか。そこに全精力を注いでいました。
「このボタンを押したら、非同期でデータを取得して、グリッドに表示する。その際、例外処理はこうして、ログはこう吐く」
この「How(どう実現するか)」の部分において、技術的な最適解を出すことがエンジニアの価値だと信じて疑いませんでした。
実際、それは間違いではありません。バグだらけのシステムなんて誰も使いませんから、技術的な品質(Technical Excellence)は必須条件です。
でも、ここには致命的な「死角(Blind Spot)」があります。
それは、**「そもそも、その機能は本当に必要なのか?」**という問いがすっぽり抜け落ちていることです。
私たちはしばしば、目の前の技術的な課題(パズル)を解くことに夢中になりすぎて、そのパズルを解くことが誰のどんな幸せに繋がるのかを忘れてしまいます。
例えば、「超高速で動作する検索機能」を作ることに技術的な情熱を燃やしたとしましょう。インデックスの貼り方を工夫し、クエリを最適化し、キャッシュ戦略を練り上げる。結果、0.01秒で検索結果が出る素晴らしいモジュールが完成しました。
しかし、もしユーザーが本当に求めていたのが「検索」ではなく、「毎日使うお気に入りのデータへのショートカット」だったとしたら?
その0.01秒の検索機能は、技術的には「傑作」かもしれませんが、プロダクトとしては「無用の長物」です。
3. 海外で見せつけられた「Outcome」への執着
海外のエンジニアたち、特にシニアレベル以上の人たちと働いていて驚いたのは、彼らのコードに対する執着の「薄さ」と、結果(Outcome)に対する執着の「濃さ」のギャップでした。
彼らは平気で言います。
「その機能、WPFでゴリゴリ自作するんじゃなくて、既存のライブラリにあるこれ使えば? 見た目は80点だけど、今日リリースできるよ」
「リファクタリング? 今はユーザーが離脱しているこのフローを直すのが先だ。コードが汚くても、動けば価値検証はできる」
当時の僕はショックを受けました。「おいおい、プライドはないのか? そんなスパゲッティコードをプロダクトに入れる気か?」と。
でも、結果を出していたのは彼らの方でした。
彼らは知っていたのです。コードは資産(Asset)ではなく、負債(Liability)になり得るということを。
コードを書けば書くほど、バグの温床は増え、保守コストは上がり、変更への柔軟性は下がります。だからこそ、「コードを書かずに問題を解決できるなら、それがベスト」という発想を持っています。
一方、僕は「いかに美しくコードを書くか」という競技に参加していました。
彼らは「いかにビジネスの問題を解決するか」という競技に参加していました。
戦っているフィールドが違ったのです。
この認識のズレこそが、エンジニアとしてのキャリアを停滞させ、どれだけ勉強しても「使えない高給取り」になってしまう原因、すなわち「エンジニアの死角」です。
4. あなたは「何を作るか」を知っているか?
よく引用される話ですが、ある調査によると、ソフトウェアの機能の6割以上は「ほとんど、あるいは全く使われていない」というデータがあります。
私たちが徹夜して、頭を抱えて、命を削って書いたあの美しいMVVMのコードの半分以上が、誰にもクリックされていないかもしれないのです。
想像してみてください。
最高級の食材(技術スタック)を使って、最高の包丁捌き(コーディングスキル)で、見た目も美しい料理(機能)を作った。
でも、お客様が食べたかったのは「ハンバーガー」だったのに、私たちが自信満々で出したのは「懐石料理」だったとしたら。
お客様は一口も食べずに店を出ていくでしょう。
その時、厨房で「でも、この出汁の取り方は完璧なんですよ!」と叫んでも虚しいだけです。
今の私たちは、まさにその状態に陥りかけていないでしょうか?
海外での経験を通じて僕が学んだのは、C#の言語仕様の隅々まで知っていることよりも、WPFのレンダリングパイプラインを暗記していることよりも、もっと大切な能力があるということです。
それは、**「解決すべき正しい問題を見極める力」**です。
これは「要件定義はPMの仕事だから自分には関係ない」という話ではありません。
開発の現場にいて、技術的な実現可能性を一番理解しているエンジニアだからこそ、プロダクトの方向性に口を出さなければならないのです。
「その仕様だと実装に2週間かかりますが、本当にやりたいことが『ユーザーへの通知』だけなら、OS標準のトースト通知を使えば30分で終わりますよ。浮いた時間で、もっと重要なこちらの機能をブラッシュアップしませんか?」
こう言えるかどうかが、単なる「コーダー」と、市場価値の高い「エンジニア」を分ける分水嶺になります。
このブログ記事では、私が海外で痛感した「技術力だけでは超えられない壁」の正体と、それをどう乗り越えていくかについて、具体的なエピソードを交えてお話ししていきます。
綺麗なコードを書くことは素晴らしいスキルです。でも、それ「だけ」では、これからの時代、特にグローバルな環境や変化の激しいビジネスの現場では、残念ながら生き残れません。
では、私たちは具体的にどう思考を変えればいいのか?
次章からは、そのための具体的な「視点の転換」について掘り下げていきます。
WPFのデータテンプレートセレクターを実装する前に、まずは「何を作るべきか」を選択する思考法(Selector)をインストールしましょう。
視点の転換:「How」の迷宮から脱出し、「Why」という羅針盤を持て
前章では、「完璧なコードでも、間違った問題を解いていたら意味がない」という話をしました。
「そんなの当たり前だろう」と思った方もいるかもしれません。しかし、私たちエンジニアの日常は、驚くほどこの「当たり前」を見えなくさせる引力に満ちています。
なぜなら、私たちの評価軸、教育、そしてプライドのすべてが「How(どう実現するか)」に最適化されているからです。
1. エンジニアは「How」の専門家として育てられる
少し、私たちのキャリアを振り返ってみましょう。
新人研修で何を習いましたか? アルゴリズム、データ構造、オブジェクト指向、デザインパターン。これらはすべて「How」の道具です。
「この配列をソートするにはどうすれば速いか?」「このクラス間の依存をどう切ればテストしやすいか?」
私たちは、与えられたパズル(仕様)を、いかにエレガントに、効率的に解くかというトレーニングを何年も積み重ねてきます。
Stack Overflowで検索するときも、QiitaやZennの記事を読むときも、探しているのは常に「How to implement…(~の実装方法)」ですよね。
この習慣は、私たちの脳を「解決策(Solution)」偏重に作り変えます。
会議で「新しい機能が欲しいんだよね」と言われた瞬間、脳内で勝手にVisual Studioが起動し、「あ、それならWPFのDataTemplateSelectorを使って、ViewModelでコレクションを管理して、Rxでイベント購読すれば…」と、実装のパズルを解き始めてしまう。
これが危険なんです。
この瞬間、私たちは「なぜその機能が必要なのか(Why)」や「そもそもそれはユーザーにとってベストな解決策なのか(What)」という問いをすっ飛ばして、「どう作るか(How)」の迷宮に全力疾走してしまっているのです。
2. 「正しく作る」ことと「正しいものを作る」ことの致命的な違い
ピーター・ドラッカーの言葉をもじった有名な格言があります。
「やるべきでないことを、効率よくやることほど無駄なことはない」
ソフトウェア開発において、これは「誰も使わない機能を、バグ一つなく完璧なアーキテクチャで実装すること」を指します。
以前、私が担当したプロジェクトでこんなことがありました。
クライアントから「業務データの複雑なフィルタリング機能が欲しい」という要望が来たんです。
「ユーザーは、日付、担当者、金額範囲、ステータス、さらには部分一致のキーワード検索…これら全てを組み合わせて検索したいはずだ」と。
僕は「腕の見せ所だ」と思いました。
C#のLINQを駆使して動的にクエリを生成するビルダークラスを作り、WPF側ではExpanderを使ったリッチなUIコンポーネントを設計しました。
MVVMパターンを厳守し、単体テストのカバレッジは90%以上。パフォーマンスもインデックスをチューニングして爆速。コードレビューでも「Beautiful logic!」と絶賛されました。
技術的には、まさに「Excellence(卓越)」でした。
しかし、リリース後、ログを見て愕然としました。
ユーザーが使っていたのは、デフォルトで表示されている「今日のタスク」ボタンだけ。
あの複雑怪奇なフィルタリング機能は、一度もクリックされていませんでした。
なぜか?
現場のユーザーは、電話対応に追われていて、チマチマと検索条件を入力している暇なんてなかったんです。彼らが欲しかったのは「今すぐやるべき仕事」がワンクリックで見えることだけでした。
僕の書いた「完璧なコード」は、数週間の工数という莫大なコストを会社に支払わせた挙句、ディスク容量を圧迫するだけの「技術的負債」になりました。
「正しく作る(Building it right)」ことには成功しましたが、「正しいものを作る(Building the right thing)」ことには壮大に失敗したのです。
3. 技術的優秀さが「あだ」になる瞬間
ここで残酷なのは、**「技術力が高いエンジニアほど、この罠に深くハマりやすい」**ということです。
なぜなら、技術力があれば「何でも作れてしまう」からです。
複雑な要件が降ってきたとき、未熟なエンジニアなら「技術的に難しいです」と音を上げるかもしれません。しかし、優秀なエンジニアは「できますよ(キラッ)」と答えてしまう。WPFの描画ツリーをハックしてでも、黒魔術的なリフレクションを使ってでも、実現してしまう。
「実装できる」という能力が、「実装すべきか」という判断を曇らせるのです。
また、私たちは「コードの美しさ」を愛するあまり、汚い現実を受け入れられないことがあります。
ビジネスの現場では、往々にして「泥臭い解決策」が正解になることがあります。
「WPFでゼロからカスタムコントロールを作る」よりも、「Excelに出力してユーザーに加工してもらう」方が、圧倒的に安上がりで、ユーザーも慣れていて喜ぶかもしれない。
しかし、エンジニアとしてのプライドが邪魔をします。
「Excel連携なんてレガシーでダサい。俺のWPFスキルでモダンなUIを提供してやる」
このエゴが、プロジェクトをデスマーチへと誘います。
技術的な卓越性(Technical Excellence)は、ビジネスの目的達成のための「手段」であって、「目的」ではありません。しかし、私たちはしばしば手段を目的にすり替えてしまいます。
4. 仕様書は「神の啓示」ではなく「ただの仮説」
日本の開発現場、特に受託開発の文化が強いと、仕様書や要件定義書は「絶対遵守の命令書」のように扱われがちです。
「仕様書に書いてある通りに作りました。使われないのは仕様を決めた人の責任です」
かつての僕もそう思っていました。
しかし、海外の、特にアジャイルな開発現場では、仕様書(Requirement)は**「現時点での仮説(Hypothesis)」**に過ぎないと捉えられています。
PMもデザイナーも神様ではありません。彼らも手探りで「たぶんユーザーはこれを求めているはず」と考えているだけです。
その仮説に対して、最も技術的なリアリティを持ってフィードバックできるのは誰か?
エンジニアしかいません。
「そのUIだと、描画コストが高すぎて動きがカクつきます。ユーザー体験を損なうので、もっとシンプルなリスト表示にしませんか?」
「そのデータ構造だと、将来的な変更に弱いです。今のフェーズではハードコードでいいので、まずは需要があるか検証しませんか?」
このように、「技術的な制約」と「ビジネスの価値」を天秤にかけ、仕様そのものに異を唱えること。
これこそが、これからの時代に求められるエンジニアの役割です。
しかし、多くのエンジニアはここで口をつぐみます。
「面倒な奴だと思われたくない」「言われた通り作る方が楽だ」「責任を取りたくない」
その沈黙の結果、世の中には「誰も使わないリッチなシステム」と「燃え尽きたエンジニア」が量産され続けています。
5. 「コードを書かない」という勇気
「コードの行数は、バグの数と比例する」という言葉があります。
極論を言えば、最高のエンジニアリングとは、コードを一行も書かずに問題を解決することです。
既存のツールを組み合わせる、運用フローを変える、あるいは「その機能は不要です」と説得する。
これらは、Visual Studioを開いてガリガリとC#を書くことよりも、はるかに高い視座と勇気を必要とします。
今、AI(GitHub Copilotなど)の台頭により、「How」の部分、つまりコードを書くこと自体のコストは劇的に下がっています。
かつて熟練の職人芸だった「MVVMパターンのボイラープレートコード」なんて、AIが一瞬で生成してくれます。
そんな時代に、私たちがまだ「綺麗にコードを書くこと」だけにアイデンティティを置いていたらどうなるでしょうか?
「仕様通りにコードを書くマシーン」としての価値は、限りなくゼロに近づいていきます。
だからこそ、私たちは視点を変えなければなりません。
IDE(統合開発環境)の画面から顔を上げ、モニターの向こう側にいるユーザーを見つめるのです。
「How」の迷宮から抜け出し、「Why」という羅針盤を手にするのです。
では、具体的に明日からどう動けばいいのか?
いきなりPMに喧嘩を売れというわけではありません(笑)。
次の章では、私が海外の現場で揉まれながら身につけた、**「使われるプロダクトを作るためのエンジニアの立ち回り」**について、実体験ベースのエピソードをお話しします。
「君の機能は素晴らしい。でも…」と言われたあの日の衝撃が、僕を変えるきっかけでした。
海外の現場:「君の機能は素晴らしい。でも、誰も使わないよ」と言われた日
理論はもう十分ですね。ここからは、僕の古傷をえぐるような実話をしましょう。
あれは、僕が今の海外の会社に転職して半年ほど経った頃、ある在庫管理システムの刷新プロジェクトでの出来事でした。
日本で培った技術力には自信がありました。「日本のエンジニアは品質が高い」という評判を背負い、「WPFのスペシャリスト」としてチームに参加していた僕は、ここで一発、度肝を抜くような成果を出してやろうと息巻いていました。
1. 渾身の傑作:「神グリッド」の誕生
担当したのは、倉庫内の在庫移動を管理する画面でした。
要件は「複数の倉庫間で、商品を移動させる計画を立てやすくしたい」という、ふんわりしたものでした。
僕は考えました。「ユーザーは数千の商品データを扱う。普通のDataGridじゃ重すぎるし、使い勝手も悪い。よし、Excelのような操作感で、かつドラッグ&ドロップで視覚的に在庫移動ができる、最強のUIを作ろう」と。
そこからは技術的恍惚の時間です。
WPFの標準コントロールではパフォーマンスが出ないので、描画ロジックをカリカリにチューニングしました。
VirtualizingStackPanelをカスタマイズし、数万行のデータでもスクロールはヌルヌル。
マウスのドラッグ操作に合わせて、半透明のゴーストアイテムが追従するリッチなアニメーション。
バックグラウンドでは非同期で検証ロジックが走り、移動不可な倉庫の上にカーソルが来ると、赤く光って警告する。
さらに、MVVMパターンを崩さないよう、Behaviorsを使ってイベントを綺麗にViewModelへ流すという、コード設計上の美学も貫きました。
週末もカフェにこもってコーディングしました。楽しくて仕方がなかったからです。
2週間後、完成したその機能を、僕は心の中で「神グリッド」と呼んでいました。
バグはゼロ。単体テストも完走。見た目もモダンで美しい。
「これを見たら、現地のエンジニアもPM(プロダクトオーナー)も、スタンディングオベーション間違いなしだ」
そう確信して、意気揚々とスプリントレビュー(デモ会)に臨みました。
2. 静まり返った会議室と、冷酷な一言
会議室には、PMのトム(仮名)と、実際に倉庫管理をしている現場リーダーのサラ(仮名)、そしてチームメンバーが集まっていました。
僕は大きなモニターに「神グリッド」を映し出し、デモを始めました。
「見てください。この大量のデータが、一切のカクつきなくスクロールできます。そして、この商品を掴んで、こちらの倉庫へ…ほら、ドロップするだけで移動計画が完了です。どうです? クールでしょう?」
僕は得意満面でした。
しかし、期待していた「Wow!」という歓声は聞こえませんでした。
沈黙が流れます。
最初に口を開いたのは、現場リーダーのサラでした。彼女は眉間にしわを寄せ、困惑した顔でこう言いました。
「……綺麗だけど、これ、いつ使うの?」
僕は耳を疑いました。「え? 在庫移動の計画を立てるときですよ。直感的でわかりやすいですよね?」
サラは首を横に振りました。
「あのね、私たちが在庫移動の計画を立てるときは、本社から送られてくるCSVリストを見るの。そのリストにある品番をシステムに打ち込んで、『確定』ボタンを押すだけ。画面上で商品をドラッグして悩んだりしないわ。毎日2000件処理するのに、いちいちマウスで掴んでられないのよ」
PMのトムが続きました。彼は残酷なほど冷静でした。
「技術的にはすごいね(Technically impressive)。でも、サラたちが欲しいのは、バーコードリーダーで連続スキャンできるシンプルな入力ボックスと、一括処理ボタンだけだ。このリッチなグリッドは、**Over-engineered(過剰品質)**だし、使いづらい」
そして、トドメの一撃が放たれました。
「君の機能は素晴らしい。でも、誰も使わないよ(No one will use it)。だから、この機能はリリースから外そう(Drop it)」
3. 「Output」と「Outcome」の決定的な違い
頭を殴られたような衝撃でした。
2週間の熱狂。週末の努力。あの美しいコード設計。ヌルヌル動くアニメーション。
それら全てが、「Drop(ボツ)」の一言で否定されたのです。
僕は反論しようとしました。
「でも、将来的にビジュアルな管理が必要になるかもしれません! 今実装しておけば、後で楽になります!」
トムは僕の目を見て、静かに言いました。
「Output(成果物)とOutcome(成果)を履き違えるな。
君は素晴らしいコードという『Output』を出した。それは認める。
でも、それがビジネスに何の価値ももたらさないなら、『Outcome』はゼロだ。
会社は君のコードの行数にお金を払っているんじゃない。解決した課題の価値にお金を払っているんだ」
その瞬間、恥ずかしさで顔が熱くなりました。
僕は「ユーザーのため」と言いながら、実際には「自分の技術力を誇示するため」にコードを書いていたことを見透かされていたのです。
日本の現場なら、もしかしたら気を使って「すごいね、とりあえず裏メニューとして残しておこうか」と言ってくれたかもしれません。
しかし、海外の現場はシビアです。ROI(投資対効果)に合わない機能は、保守コスト(負債)になるだけなので、容赦なく切り捨てられます。
その日の午後、僕は泣く泣くgit rmコマンドを打ち込みました。
あの「神グリッド」のファイルたちが、ターミナルから消えていく様を見ながら、僕はエンジニアとして一度死んだのだと思います。
4. 価値観のコペルニクス的転回
この敗北体験は、僕の仕事のやり方を根本から変えました。
それまでの僕は、仕様を聞くとすぐに「どう実装するか(How)」を考え、PCに向かっていました。
しかし、この日以来、僕は「コーディング恐怖症」のような状態になりました。
「また無駄なものを作ってしまうんじゃないか?」という恐怖です。
その恐怖が、僕を「対話」へと向かわせました。
コードを書く前に、PMのトムや現場のサラのところへ行き、徹底的に聞くようになったのです。
「なぜこの機能が必要なの?」
「これがないと、具体的にどんな困りごとが起きるの?」
「もし、システムを作らずにExcelマクロで解決できるとしたら、それでもシステムが欲しい?」
最初は、英語でのコミュニケーションに自信がなく、億劫でした。コードを書いている方が楽でした。
でも、「無駄なコードを書いてボツにされる痛み」に比べれば、拙い英語で恥をかく痛みなんて大したことありません。
すると、面白いことが起き始めました。
サラと話しているうちに、「実はシステム改修なんていらなくて、運用ルールを少し変えるだけで解決する」ということが分かったり、「僕が3日かかると見積もっていた機能が、既存機能の使い回しで1時間で終わる」ことが判明したりしたのです。
僕は、**「コードを書かないことで、問題を解決した」**のです。
トムはそんな僕を見て、ニヤリと笑って言いました。
「おいおい、今週はコミット数がゼロじゃないか。サボってるのか? ……冗談だよ。君のおかげで、無駄な開発費を使わずに済んだ。Good job.」
その時、初めて理解しました。
あぁ、これか、と。
「エンジニアの仕事はコードを書くことではない。エンジニアリング(工学)の手法を用いて、価値を最大化することだ」
コードはそのための「最後の手段」に過ぎない。
本当に優秀なエンジニアは、コードという「凶器(バグの温床)」を振り回す前に、もっと安全で確実な方法を探すのだと。
5. ターニングポイント:技術者から「プロダクト開発者」へ
この失敗談は、僕にとってのイニシエーション(通過儀礼)でした。
もしあなたが今、「仕様通りに作ったのに評価されない」「技術的には正しいはずなのに文句を言われる」とモヤモヤしているなら、それはかつての僕と同じ「神グリッド」の罠にハマっているのかもしれません。
海外のエンジニアたちが、なぜあんなに議論好きなのか。なぜ「No」と言うのか。
それは彼らが怠慢だからではなく、**「コードを書くことのリスク」**を肌感覚で知っているからです。
「神グリッド」を葬り去ったあの日、僕は「C# WPFコーダー」を辞めました。
そして、「技術を使ってビジネスを勝たせるパートナー」としてのキャリアを歩み始めました。
次章、最後の「結」では、この痛い教訓を元に、具体的にこれからのエンジニアがどう行動を変えればいいのか。
明日から実践できる「生存戦略」と、技術力を本当の意味で「武器」にするためのマインドセットについてお話しします。
IDEを閉じて、現場へ行こう。話はそれからです。
生存戦略:IDEを閉じろ。そして、プロダクトを「エンジニアリング」せよ
「君の機能は素晴らしい。でも、誰も使わない」
あの日、PMに言われた言葉は、今でも私の胸に刻まれています。しかし、それは決して呪いの言葉ではなく、私を「ただのコーダー」から「真のエンジニア」へと進化させるための祝福の言葉でした。
最終章となる今回は、私がその痛い失敗から学び、実践している「生存戦略」をシェアします。
C#やWPFの技術書には載っていない、しかし現場で生き残るためには必須のスキルセットです。
1. 行動変容:「How」の前に「Why」を5回繰り返す
トヨタ生産方式の「なぜなぜ分析」は有名ですが、これはバグ原因の究明だけでなく、仕様の妥当性確認にも使えます。
私は新しいタスクが降ってきたとき、すぐにVisual Studioを開くのをやめました。代わりに、PMやユーザーに対して「なぜ?」を問いかける時間を設けました。
Before(以前の私):
「CSVエクスポート機能が欲しい」→「了解です!非同期で高速に書き出すクラスを作ります!」(即コーディング)
After(今の私):
「CSVエクスポート機能が欲しい」→「なぜCSVが必要なんですか?」
「Excelで集計したいから」→「なぜ集計するんですか?」
「毎月の売上報告書を作るためだよ」→「なぜ手動で作ってるんですか?」
「既存のレポート画面が見にくいからさ」
ここで真の問題が発覚します。
ユーザーが本当に欲しかったのは「CSV」ではなく、「見やすい売上報告」だったのです。
結果として、私はCSV出力機能を実装するのではなく、既存のレポート画面のレイアウトを少し修正(XAMLを数行変更)するだけで対応しました。
工数は10分の1。ユーザーの手間もゼロ。バグのリスクも激減。
これが「エンジニアリング」です。
「言われた通りに作る」のは下請けの仕事ですが、「言われたことの真意を汲み取り、ベストな解を提案する」のがプロのエンジニアの仕事です。
技術的に高度なことをするのではなく、「技術を使わずに済む方法」を探すことに、技術知識を使ってください。
2. プロトタイプ思考:「完璧な100点」より「動く30点」
「神グリッド」の失敗の最大の原因は、フィードバックをもらうのが遅すぎたことでした。2週間も一人でこもり、完成品を持って行ったのが間違いでした。
海外の現場、特にアジャイルが浸透している環境では、**「Fail Fast(早く失敗せよ)」**が鉄則です。
今は、WPFで真面目に実装する前に、まずは「紙とペン」、あるいは「PowerPoint」や「Figma」で画面イメージを作り、ユーザーに見せに行きます。
「こんな感じの画面で、ここをドラッグするイメージなんだけど、どう思う?」
これなら作成時間は30分です。
もしそこで「いや、ドラッグなんてしないよ」と言われても、ダメージはゼロです。「OK、じゃあやめよう」で済みます。
さらに、コードを書く段階になっても、最初は汚いコードで構いません。
「とりあえず動く(Works like a prototype)」状態で触ってもらう。
例外処理もログ出力も後回し。まずは「体験」を検証する。
そこで「これ使えるね!」となって初めて、リファクタリングを行い、アーキテクチャを整えます。
「作り込み」は、価値が証明されてから。
この順序を守るだけで、手戻りのコストは劇的に下がります。
完璧主義なエンジニアほど、「汚いコードを見せるのは恥ずかしい」と思いがちですが、使われない完璧なコードを書く方が、ビジネス的にはよっぽど恥ずかしいことです。
3. 共通言語を持つ:ビジネスドメインの専門家になれ
エンジニアが「ビジネス視点」を持つための最短ルートは、**「ユーザーと同じ言葉(ドメイン言語)を話すこと」**です。
私が倉庫管理システムを担当していた時、最初は「非同期処理が~」「レイテンシが~」と技術用語ばかり使っていました。これでは現場の人たちと心の距離は縮まりません。
そこで、物流用語を必死に勉強しました。「ピッキング」「棚卸し」「リードタイム」「SKU(最小管理単位)」。
会議で「このクエリのパフォーマンスが…」と言う代わりに、「ピッキング作業のピークタイムに、ハンディターミナルのレスポンスが落ちると、トラックの出荷に間に合いませんよね?」と言うようにしました。
すると、相手の目の色が変わります。
「こいつは俺たちの仕事を理解している」と信頼されるようになります。
一度信頼されれば、技術的な提案も通るようになります。
「この機能はシステムを複雑にするので、業務フローの方を変えませんか?」という提案が、「あいつが言うなら検討してみよう」になるのです。
プログラミング言語(C#)だけでなく、**ビジネス言語(Business Domain Language)**を習得してください。それが、あなたの技術力をテコ入れする最強の武器になります。
4. AI時代のエンジニアの価値
今、GitHub CopilotやChatGPTなどのAIが進化し、「コードを書く」ことの価値は暴落しています。
仕様さえ明確なら、AIは人間より速く、正確なコードを書きます。
「WPFのDataGridのスタイル設定」なんて、AIに任せれば一瞬です。
では、私たちエンジニアは不要になるのでしょうか?
いいえ、逆です。
「何をAIに書かせるべきか」を決める能力が、これまで以上に重要になります。
AIは「How(実装方法)」は教えてくれますが、「Why(なぜ作るか)」「What(何を作るか)」は決めてくれません。
「この機能は本当にユーザーを幸せにするのか?」
「この仕様はビジネスのROIに見合うのか?」
「ここはあえてシステム化しない方がいいのではないか?」
この判断を下せるのは、現場の文脈(コンテキスト)を理解し、人間の感情やビジネスの力学を理解している人間だけです。
これからのエンジニアは、コードを書く「作業員(Typist)」から、プロダクトの価値を設計する「建築家(Architect)」へとシフトしなければなりません。
コードはAIに書かせればいい。
あなたは、問題を定義し、解決策をデザインし、チームを導くことに集中してください。
5. 結論:技術を愛し、技術に溺れるな
長くなりましたが、私が伝えたかったことはシンプルです。
技術を愛してください。
C#の新機能を追いかけ、WPFのレンダリングの仕組みを深掘りし、美しいアーキテクチャを探求し続けてください。その情熱こそがエンジニアの原動力です。
しかし、技術に溺れてはいけません。
技術はあくまで「道具」です。
その道具を使って、誰のどんな課題を解決するのか。その「目的」を見失わないでください。
かつて「神グリッド」を作って鼻をへし折られたあの日の自分に、今ならこう声をかけます。
「その情熱は素晴らしい。でも、モニターの中から出ておいで。ユーザーの隣に座って、彼らの仕事を見てごらん。そうすれば、本当に書くべきコードが見えてくるから」
IDEを閉じろ。そして、現場へ行こう。
あなたが書くべき最高のコードは、ユーザーの笑顔(とビジネスの成功)のためにあるはずです。
さあ、明日からは「要件定義書」を鵜呑みにせず、「なぜ?」と問いかけるところから始めてみましょう。
Good Luck.

コメント