見出し画像

仮実装はいつまでも残る

ここ1年ほど、仕事で大人数が関わるゲームの開発に、プログラマとして携わっている。
人生で、この規模の人数がいる開発に関わったことがないので、日々学びだらけ。

今の仕事で一番感じているのは「仮実装は悪」だということ。かつて自分が/誰かが用意した仮実装が、後々になって牙をむくというケースが続発している。

本記事中での「仮実装」の定義

本記事中で言う「仮実装」とは、

  • 動いているところを見せるために作る、バリデートなど本来必要な処理を抜かした、いい加減な実装

  • 時間がない中書いた、リファクタリング必須の醜いコード
    のことを指す。
    要は、「後で直す必要があることがわかりきっているコード」のこと。

テスト駆動開発(TDD)における、テストを通すだけに用意する実装のことは、今回取り扱わない。(テスト駆動開発したことないので分からない…)
TDDユーザーには申し訳ないが、仮実装以上にしっくりくる名称が思い浮かばなかったので、許してほしい。

仮実装の功罪

仮実装をしたときは、まともなエンジニアならその瞬間は「いつか直そう」と思うはず。しかし、日々の業務に悩殺され、そのうち忘れ去られる。そのままうっかりリリースしてしまったら、大惨事を引き起こしてしまう恐れがある。

後からプロジェクトに合流したスタッフが、仮実装を仮実装と気づかず利用してしまうケースがある。こうなってしまうと最悪だ。プロジェクト全体に質の悪い仮実装が再生産され続け、いずれは手に負えなくなる。
そうしてプロジェクト全体のコード品質が落ちると、「このクオリティでいいんだ」と皆が判断し、正式な実装のクオリティも下がってゆく。

とはいえ、仮実装は必要悪であるケースも多数ある。

例えば、マイルストーンの〆直前に、どうしてもこの機能を入れたいという要望があったとする。リリース品質の実装をするには時間がかかり〆には間に合わない。だが、コード中に数値をハードコーディングすればすぐに実装出来て、動いているところを見せられる。
こういうケースなら、仮実装はすべきだ。

ゲーム開発は、試行錯誤の回数がクオリティに直結する。ゲームデザイナーの試行錯誤を増やすために、プログラマが仮実装ですばやく開発するのは、よくあることだ。

でも、その仮実装がリリースまで残ってしまったら……
プログラマが仮実装をする時は、それを将来に無くすための施策も同時にすべきだ。

仮実装がリリースされるのを防ぐ対策を考えてみた。

仮実装をリリースに含めないための方法

そもそも仮実装をしない

仮実装なんてしなければノー問題。もし仮実装をしようものなら、コードレビューの段階で絶対に弾く。
しかしながら、現実はそうもうまくいかない。
試行錯誤のための仮実装は許容されるべきだし、そもそも最初から「仮実装を認めない」完璧主義の開発スタイルは、失敗一直線なことは、多くのプログラマが理解していることだろう。

TODO: コメントを残す

コード中に、TODOコメントのような形で「ここは後から直しますよー」と分かるような印を残しておく、古くからある手法。
正しい形式でコメントを書けば、Visual StudioなどのIDEに備わる機能で、リスト表示できる。

しかし、TODOコメントはしばしば見逃される。
なぜかというと、TODOコメントが書いてあるコードは、他人から見ると不穏な香りがするからだ。「触らぬ神に祟りなし」と見なかったことにされる。

TODOコメントは、無いよりは遙かにマシだが、「リリースに仮実装を含めない」という大目的を達成するには不十分だろう。

仮実装があれば、それを直すタスクを作る

正気なソフトウェア開発なら、JiraやRedmineなどのプロジェクト管理ツールを使っているだろう。
仮実装を作ったら、「必ず」それを直すというタスクを作成するようにすれば、誰からも忘れられた仮実装が生まれることはなくなるだろう。

とはいえ、これはめちゃくちゃめんどくさい。仮実装を作ったらすぐにプロジェクト管理ツールを開きタスク(チケット)化する。開発中の脳をタスク作成の脳に切り替えるのは、なかなか辛い。
故に、プロジェクトに関わるプログラマ全員にこの「タスク作成」のルールを守ってももらうのは困難だ。「仮実装を直す」タスクが全て無くなった(Done)から、もう仮実装はないなんて、とても言えない。

意図的に関数名を長くする

自分がたまにやる手法。
仮実装を作ったら、その関数名を意図的に長くする。そうすると、その仮実装を利用した人が「これはリファクタリングした方がいい」と感じる。それで仮実装が残っているという問題意識を広めることができる。
プログラマの「リファクタリングしたい欲」を逆手に取った手法。

まとめ

色々考えてみたが、「仮実装をリリースに絶対含めない」ようにする、最高の手法は見つからなかった。
プロジェクト全体で、

  • 適当な理由のない仮実装はしない

  • もし仮実装をしたなら「それを直す」タスクを見える化する

  • ボーイスカウトのような「来たときよりも美しく」姿勢を持って、コードを美しくし続ける
    姿勢をコードレビューを通じて浸透させていくしかないのかも。

いいなと思ったら応援しよう!