実際の現場に現れる負債とかクソコードとか呼ばれるものは、簡単にできるはずのものが何十にも不必要な複雑性でラップされた成果物(標準ライブラリ相当の実装を自前で全部書いていて、かつエッジケースでバグだらけ、とか)であることが多い。しかし一方で、そもそもの実現したいこと・あるべき仕様のレベルである程度複雑性が仕方ないケースに対して、最短ルートで立ち向かったものが技術的負債扱いになってしまうこともある。
かつて、某データフォーマットプロトコルで外部のアイデンティティプロバイダとデータ連携を行う機能を開発したことがあった。
さすがに1からRFCに沿って自分で全部作るのはおかしいに決まっているので、Githubで使えそうなOSSライブラリを探していたのだが、その際に見つけたものは90%は欲しい機能があるものの残り10%ほど必要な機能が足りていなかった。そこまで使えるなら、あとは自分らでフォークして足りない機能足したらええやん!と思ってフォークして使うことにしたのだが、最終的に自分以外で誰もそのOSSのコードの細かいところを理解できる(あるいはしたい)人がおらず、ちょっとした技術負債っぽい扱いになってしまった。
自分からすれば、そもそもOSSのライブラリがベースでコードも公開されているし、ハイレベルなコンセプトも全部英語だけどRFCに書かれているし、どう動くかもユニットテストを見れば分かるやん!と思っていた。けれども、結局自分以外の組織のメンバーが自分と同じことを再現性高くやれないのなら、それはいくら技術力を発揮してもないことと同じか…と思わされる出来事は、これに限らず何度かあった。
この手の組織だと、仮に中途採用でずば抜けて技術力のある人がチームに入ってきたとしても、他の人から見てその人が何をやっていて何がすごいか全く分からん…の状態になってしまうし、誰もその人のコードの品質担保ができない。そしてなにより、その人自身の成長にも繋がらない。
鳴り物入りで入ってきた優秀なエンジニアが、入社してしばらくすると「すごいって聞いてたけど、なんか大したことないな...」と思われてしまう話はよく耳にするが、それも環境がその人のトップスピードを抑え込んでしまっているケースが往々にしてある予感がしている。ソフトウェア開発がチームで行われる仕事である以上、数人だけトップスピードが出せていても広い視野で見ると解決されない物事は多い。あらゆる組織が大きくなるにつれてピラミッド上の構造をとる以上、マジョリティをコントロールするという意味でも技術レベルのボトムラインを引き上げるほうがインパクトは大きい。
技術レベルのボトムラインが低く、それなりの雰囲気が組織のスタンダードになっていると、自ずとソフトウェアの品質傾向もそれなりのものになる。いくらコードレビューだとか設計レビューで誰かが警察的な予防をするにしても、人力でやっている以上そこには限界がある。誰かが部分的に品質を上げようと思っても、その他大部分は雑なわけで「別に品質に拘んなくてもよくない?」となってしまう人の気持ちはすごくよく分かる。人間誰しも、周りがやらなくて済んでいることは自分もやりたくない。
組織の中でこの振れ幅が大きくなると、不要なルールやドキュメンテーション、いろんなレベル感に配慮した一貫性のないコードやコミュニケーションが生まれてくる。いや、もちろんドキュメントやその他諸々のアグリーメントは多かれ少なかれ必要になるが、少なく回るならそれに越したことはない。早い段階でこの手の問題を予防するには、やはり一番には採用プロセスでのクオリティー担保だし、そのベースにあるのが組織のカルチャー醸成だったりするのではないかと個人的には解釈している。
個人的な体感として、そのへんの求人サイトに転がっているWeb系のシニアレベルのエンジニアの大半においては、深ぼってみると実はソフトウェア設計やコーディングのスキルはもはや評価の対象にならないもの(というか、あって当たり前)であり、どちらかというと先に書いたような組織の技術レベルのブレ幅をいかに小さくするか、複雑性に耐えられる下限値をいかに上げていくかを考えてリーダーシップをとることのほうが、公にはしないが最終的には求められがちな能力な気がしている。
とはいえ、ここまでカバー範囲が広がってくると、そもそもそれはソフトウェア・エンジニアとしての職務に含まれるのか?という気もしてくるので難しい。コードだけ書きたいという人もいるだろうし。また、こういう仕事を誰がメインでやるべきかというのもよく分かっていない。テックリード、エンジニアリングマネージャ、VPoEらへんの誰かっぽいのは分かるが、具体的な細かい技術的な話からふわっとした抽象度の高い組織の雰囲気作り的なものまで、求められるレイヤが広そうではある。
かつ、この手の仕事はやりたいと思えない人にやらせると急に精神的に参ってしまったりすることもあるので、そういった意味でも難しさがある。