やまぐ雑記。

SIerからこんにちは。趣味グラミングはよそでやってます

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にデータを登録する
    (以下省略)

引数を贅沢に使った美味しいスパゲティです。私は食べませんが。

ストレス、ストレス、ああストレス!!

ああ、思い返すだけでもストレスが溜まってしまうようなコードたちです。

炎上しているプロジェクトほど、こうした邪悪なコードを見かけます。

どうすれば、炎上したままこうしたコードを減らせるでしょうか?

まだ、完璧な答えは持っていません。悪い答えと、ちょっとマシな答えはあります。

悪い答え

  • コーディングチェックリストを運用する。
    • だいたい形骸化してやらなくなるか、やったことにする
  • きちんとレビューをする。
    • そんな余裕があったらとっくにやっている。

ちょっとマシな答え

  • 機械的なチェック、例えばcheckstyleFindBugsを使う。
    • 完璧ではないが、レビューするよりは大分コストが小さく済む。
      (個人的には「Javaの一般的な命名規約だとか、"参照型変数"くらいは知っててよ…!」という思いではある)
  • チェックリストをほんの数項目だけ用意する。
    • 頻出部分を厳選して用意して、まず60点を目指す。
  • レビューは諦めるが、たまにコードを見て直接本人と話す
    • 「本人のスキル向上(教育)」という側面で、レビューまではいかないけどちょっとでもやる。
  • リーダブルコード(オライリー本)をそっと置いておく。
    • 「この本で読んだ内容なんですけど」と言うとすんなり受け入れてくれたり、興味を持ってくれたりする。

完璧な答え

あったら教えろください。


余談: 「三現主義」

富士通の行動指針には、こういうセクションがあります。

三現主義 … 現場・現物・現実を直視して行動します

「レビューをちゃんとしろ」「チェックリストをちゃんと運用しろ」「ちゃんと」「ちゃんと」…
…現場を見ていれば、こんなセリフはとてもじゃありませんが言えません*1

作業量を増やさずに、品質を上げる。
または、品質を維持したまま、作業量を減らす。

こういう考えをもって、じゃあ、何ができるだろうか? と考えるようにしないと、いつまでも溝は埋まらないままです。

*1:言っている方は非常に多いですが…