ツイッターで久しぶりに糞コードの話を見かけたので、僕の知る最悪の糞コードの話を書いておこうと思う。
そのコードはGeneric Programmingによって実装されていました。クラスはきちんと整理されており、テンプレートを最大限に活用したコードは必要最小限の記述となっています。整然とひとつの思想によって実装された素晴らしいコードでした。いくつかの致命的な問題を除いては・・・
一つ目の致命的な問題は、このプロダクトがWindows向けであり、開発環境にVisual C++を使用していたことです。当時のVC++コンパイラにはバグがありました。複雑なテンプレートを定義すると、コンパイラがジェネラルプロテクションエラーを起こして終了してしまうのです。
知っていれば回避可能な、実用上は問題ないバグをBy Design(仕様)と称していた時代の話です。コンパイラのバグが近日中に修正される可能性はありません。この問題を根本的に解決するには、プログラムの根幹を構成しているGeneric Programmingを、互換性を維持し挙動を変えることなく取り除く・・・・って、ほぼリメイクですヤン!
実際には既にリリースしてしまっているので互換性維持は絶対、修正や機能追加は待ったなし、そんな大規模修正できません。影響の少なさそなところからGeneric Programmingを取り除き、VC++が落ちない程度までテンプレートの使用量を減らしては、修正をするって作業に明け暮れたのでした。
一つ目の・・・と書いたからには二つ目以降もあるわけで、DLLの引数としてクラスを何の考えもなく受け渡してる。それもDLL側で確保して呼び出し元で解放させたり。C++はコードや変数がどのようにメモリ上に展開されるかは仕様として定められていません。したがってクラスを引数として受け渡そうとするなら、全てのモジュールを同じコンパイラ、同じヘッダファイル、同じコンパイルオプションでビルドするのが必須です。ちょっと直すだけでも全モジュールをビルドし直して置き換えないと動作を保証できないという困難さ。
このコードを書いたエンジニア、どうやらJavaのスペシャリストであったようです。JavaのプログラマとしてOOな設計やコーディング技法には精通しており、その技をしっかりと使いこなしていました。でもC++固有の言語仕様には非常に疎く、おそらくはほぼ初心者。newしてもdeleteを呼んでいる場所が全くない。C++の言語仕様上の地雷をことごとく踏み抜いてく、そんなクソースでした。