他人の作ったシステムの移植や、
途中からヘルプで入る案件を経験して「?」と思うことはないだろうか?
- 環境やある条件に依存するコードが直書き
- 変数名と違う内容が入っている変数
- コピペによる二重化
- 他プロジェクトのファイルのコピーによる無駄な変数
一つずつ考えて行こう。
まず「環境やある条件に依存するコードが直書き」。
そういうコードを最初から書いてあればあきらめるのだけど、
共通変数や環境に依存する処理を取りまとめているクラスファイルなどがあって、
移植する時はここを直せば行けますよーと言われつつ…ダメじゃん、みたいなこと。
事前に聞いていた話から見積もるコスト通りに行かず、
どこが原因なのか調査、修正が必要になって、実際の作業量に大分差が出てくる。
「変数名と違う内容が入っている変数」
これも結構悩む。人のコードに手を入れる時に、
変数名を見ながら直感的にこれは○○だと思っていたら、実は全然違うもの。
name って書いてありながら年齢が入っていたりとか…。
おそらく何かしらのコードのコピーか流用で、変数名をそのまま使ったんだろうけど、
後で読む時には非常に困る!せめて変数名くらいは修正して欲しいなぁと。
「コピペによる二重化」
「ここのファイルにこういう処理書いてあるから、同じようにすれば動くよ。」
と言ってみたところ、その処理をコピーして違うコードに貼ってしまうこと。
でもそこに将来修正が入るだろうと予測できる場合、
共通処理を書き出してどこか一箇所にまとめておいておくべき。
後日修正した際に、「えっ、そっちも直さなくちゃいけないの?」ということを無くしたい。
その場凌ぎで急ぎで対応してしまう気持ちもわからなくはないけど、
将来のミスの可能性を未然に摘み取っておきたい。
「他プロジェクトのファイルのコピーによる無駄な変数」
これも以外に困る。「この変数は何に使っているんだろう?」と悩んでしまう。
定義してあるけど使っている場所がわからないとか。
さらにその変数が重要な意味を持つ名前だともっとことが深刻だ。
全部のファイルをgrepして変数名を探してみて、
使ってないことを確かめた後意味がないものとわかってコメントアウトしてみて、
一通り動作検証した後に削除。
こんな無駄な手順を踏みたくないので、
全くプロジェクトに関係ない変数や処理は、コピーして来た時点で削除しておいて欲しいところ。
いくつか挙げてみたけど、
どれもひと手間かければ簡単に防げること。
そういうところで問題が出るとすごくもったいないな、と思う。注意すれば防げたことだから。
あと、不思議とこういうモラルのないコードは伝染しやすい。
きちんと書かれているコードの案件に他人が入った場合、
それを汚しちゃいけない!という気持ちが働くようなのだけど、
ぐちゃぐちゃなコードの案件に途中から入る人は、
何も気にせずコードを汚し続けることになる。
これは書籍「達人プログラマー」にも書かれていることだけど、
以前ニューヨークの治安が悪かったころ、
犯罪多発地域に車をしばらく放置しても何もなかったそうだが、
その車の窓を割っておくと、またたく間に各種部品が盗まれていったらしい。
そして、その治安を向上させるために採った作戦が、
軽犯罪を徹底的に取り締まることと、地下鉄の落書きを消すことだったそうだ。
その結果、一気に凶悪犯罪の発生率が低下していったらしい。
同じことが、コードにも言えるんだよね。
未然に小さな問題を取り締まっておけば、
大きな問題が発生する可能性を一気に下げられる。
とりたてて特殊な技術があるわけではなくても、
こういうことに気を使って、モラルのあるコードを書く人。
途中から案件に入る際には、それまでの意図を理解してコードを書いてくれる人。
一緒に仕事をすると、この人と組むとやり易いな、と思うわけで、
そういう人って、実は凄い良いプログラマーじゃないかなと思うわけです。