SIerで、どうすれば邪悪なコードを減らせるのか?
※多少ぼかしていますが実話です。
邪悪なコードたち
こういうコードに遭遇することがあります。
private boolean customerName() { boolean returnValue = false; // 姓がnullでない かつ 名がnullでない のとき、trueとする // 当てはまらない場合、falseとする if (this.SEI != null && this.MEI != null) { returnValue = true; } else { returnValue = false; } return returnValue; }
- customerNameというメソッド名で処理が想像できない。
- returnValue変数の存在意義がよくわからない。
- コメントは必要だろうか。条件式を日本語化しただけのように見える。
- SEI, MEIは定数なのだろうか。
- else節でfalseを代入する必要はあるだろうか。
頭が痛くなります。
あるいは、こんなコードに遭遇することもあります。
public String 顧客情報を登録する( String 姓, String 名, String 姓カナ, String 名カナ, SeibetsuEnum 性別区分, String 生年月日, String 郵便番号, String 都道府県, String 住所_1, TelEnum 電話番号_1_種類, String 電話番号_1, TelEnum 電話番号_2_種類, String 電話番号_2, … (あんまり長いので省略) … String 勤務先名称, String 勤務先所属, String 勤務先役職, String 勤務先郵便番号, String 勤務先住所 ) { // 引数の情報を使ってDBにデータを登録する (以下省略)
引数を贅沢に使った美味しいスパゲティです。私は食べませんが。
ストレス、ストレス、ああストレス!!
ああ、思い返すだけでもストレスが溜まってしまうようなコードたちです。
炎上しているプロジェクトほど、こうした邪悪なコードを見かけます。
どうすれば、炎上したままこうしたコードを減らせるでしょうか?
まだ、完璧な答えは持っていません。悪い答えと、ちょっとマシな答えはあります。
悪い答え
- コーディングチェックリストを運用する。
- だいたい形骸化してやらなくなるか、やったことにする。
- きちんとレビューをする。
- そんな余裕があったらとっくにやっている。
ちょっとマシな答え
- 機械的なチェック、例えばcheckstyleやFindBugsを使う。
- 完璧ではないが、レビューするよりは大分コストが小さく済む。
(個人的には「Javaの一般的な命名規約だとか、"参照型変数"くらいは知っててよ…!」という思いではある)
- 完璧ではないが、レビューするよりは大分コストが小さく済む。
- チェックリストをほんの数項目だけ用意する。
- 頻出部分を厳選して用意して、まず60点を目指す。
- レビューは諦めるが、たまにコードを見て直接本人と話す
- 「本人のスキル向上(教育)」という側面で、レビューまではいかないけどちょっとでもやる。
- リーダブルコード(オライリー本)をそっと置いておく。
- 「この本で読んだ内容なんですけど」と言うとすんなり受け入れてくれたり、興味を持ってくれたりする。
完璧な答え
あったら教えろください。
余談: 「三現主義」
富士通の行動指針には、こういうセクションがあります。
三現主義 … 現場・現物・現実を直視して行動します
「レビューをちゃんとしろ」「チェックリストをちゃんと運用しろ」「ちゃんと」「ちゃんと」…
…現場を見ていれば、こんなセリフはとてもじゃありませんが言えません*1。
作業量を増やさずに、品質を上げる。
または、品質を維持したまま、作業量を減らす。
こういう考えをもって、じゃあ、何ができるだろうか? と考えるようにしないと、いつまでも溝は埋まらないままです。
*1:言っている方は非常に多いですが…