(※この記事の会話や例は、事実に基づかない説明用のフィクションです)
チームに新人が入った際の、最初のコードレビューでのやりとり
先輩「インスタンス変数ではなく
let
を使ってください」
後輩「他のコードはインスタンス変数を使ってますよ」
先輩「既存のコードは問題があるので真似しないでください」
後輩「ハァ!?他のコードってのは、先輩が書いたコードですよ!?それを真似しただけなのに何で叱られなきゃならんのですか!?やってられませんよ!!」
さすがに、こんなに激しくキレる人は稀ですが、
初心者は既存のコードを真似すればOK
優秀なプログラマーは、常に良いコードを書く(悪いコードが書かれたのは、プログラマーが劣っていたから)
と、素朴に信じている人はそこそこいるようで、「そうではない」と訂正した経験が何度かあります。皆さんもあるのではないでしょうか?
しかし、よく考えると**「なぜ既存のコードを真似してはいけないのか」**を文章にしたものは見たことがなかったので、そこで思考の整理がてら書き起こしてみました。
なお、この記事で言いたいのは**「既存のコードに囚われず常にベストのコードを書いてください」**ということで、むやみに先輩を疑えと言いたいわけでも、自分の過去の過ちを糊塗したいわけでもありません。
理由1:「チャンネル回し」とか言ってた
プログラミングの常識は時代と共に変わります。
言語のレベルでは、例えば今ではどの言語にも for x in list
のような「リストの要素を走査するfor文」がありますが、90年代には無い言語も多くありました。
コーディングのレベルでは、「早期return」は現在では常識ですが、「returnは関数の最後に1回だけ書くべき」という説が'90年代ごろまでは幅を効かせていました。
そんなわけで、当時としては真面目に当たり前に書いたのに、今から見るとベストではない書き方になっていることはよくあります。
理由2:紅顔の美少年だった
5年前にコードを書いた時は、先輩は5歳若かった。
今はKotlin界のデストロイヤーと呼ばれている先輩も、そのコードを書いた時には、まだ未熟なJava1年生だったのです。コード品質が低くとも無理はありません、
「あの先輩のことだから、この奇っ怪なコードにも意味があるに違いない!!」と思い込まずに、素直に「なぜこうしているんですか」と聞きましょう。
理由3:現場はマンションの一室だった
既存のコードが書かれた当時、会社のシェアは何%だったでしょうか?
ベンチャー・小規模企業がシェアを獲得するにはスピードが大変重要です。そして、急ぐ時には**品質が犠牲にされがちです。**不具合があっても致命的でなければリリースしたし、可読性なんか問題ではなかったのです。
(質とスピードはトレードオフではないという話もありますが、昔はトレードオフだと信じられていました)
理由4: フフフ・・・それは残像だ
最後に。忘れがちですが商用のコードは複数人で開発しています。
git blame
で俺の名前が出たとしても、それはインデントを変えただけで、オリジナルのコードを書いたのは3年前に辞めたクソ野郎なので、俺を責めるのはやめろください。
キレないで
以上のように、なぜ既存のコードがクソ(なこともある)のか説明しました。
ところで、記事冒頭の会話文のように既存コードを真似しているのを指摘するとキレる人が時々います。キレるパターンには2種類あるようです。
まず、自信が無い人のキレるパターンはこんな感じ:
「ここでは
let
を使ってください」
「私は既存のコードを真似しただけなんです!! 私は入社1年目の初心者なんですよ!? そんなに言わなくてもいいじゃないですか!?」
まず、コードレビューはあなたの人格を責めているのではありません。あくまでコードの問題や、あなたの誤解を指摘しているのです。だから、たくさん指摘されたからと言って、凹む必要はありません。
(レビュワーがコミュ障で言い方がムカつくというケースは別の問題です)
一方で「初心者であること」は、コードがクソであることの言い訳にはなりません。製品にクソコードが組み込まれてしまうのは、あなた1人の問題ではないからです。いやしくも職業プログラマーなら、常にベストのコードを書くように務めてください。
また、自分の技量が不足していると感じているなら、上司と交渉して、コードを書く前に入門書を読む時間を確保したり、先輩に教わる機会を設けたりしてください。上司も、初心者がいきなりコードを書けるとは思っていないので、Noとは言わないはずです。
キレないで
もう一方のキレるパターンは、自信がありすぎる人のもので:
「ここでは
let
を使ってください」
「才能ある俺様が、わざわざお前のクソコードに合わせてインスタンス変数を使ってやったんだぞ!? それに文句つけてんじゃねーよ!!」
このパターンではレビュワーもキレ出して収拾がつかなくなりがちなので、キレないでください。
クソコードが今そこにあるのは、上述のような様々な経緯があるのです。そこの事情を慮ってあげてください。また、**ソフトウェア開発の成果は、個人個人ではなく、チーム・組織に属するものです。**あなた個人に能力があるかどうか、それ自体には意味はありません。チーム全体のアウトプットを向上させることに能力を注いでください。
むすび
繰り返しになりますが、この記事で言いたいのは**「既存のコードに囚われず常にベストのコードを書いてください」**ということで、むやみに先輩を疑えと言いたいわけでも、自分の過去の過ちを糊塗したいわけでもありません。
また、この記事はまともな職場を想定しています。時空の歪みが発生している職場では別の対処をしてください。