電池冷蔵庫

除雪のない世界に行きたい

笑っちゃうくらい腹が立った同僚のプログラミング

 ここに書いてあることは全部フィクションですぞ!

なんかコードが減ってる

 ある日の業務中、ふとした瞬間に「あったはずの処理がない」と気づきました。

before

# わしの記憶の片隅にあるコード
result = sugoi_results.first

 元々はこういう感じで、複数の値が帰ってくる処理 sugoi_results があり、その1つ目(あるいはnil)を取り出すという処理でした。ごく平凡なRubyのコードですね。

after

# 最新のコード
result = sugoi_results

 おかしいですね。 result = results という時点で3回くらい発狂しそうです。とにかくおかしいです。

 というのは、このプロジェクトはRSpecで管理しているので、コードが欠損すれば自動的に検出できるはずなんです。それが壊れていないということは、何かおかしなことが起こっています。そこで暗い気持ちでGit履歴を見ます。すると…

def sugoi_results

  results = []

  # ...
  # すごい処理
  # ...

  # ↓ここから増えてたコード

  if results.size == 2
    results.first
  else
    results
  end

  # ↑ここまで増えてたコード
end

 わかりますか? これ。この衝撃。

 実は業務上、冒頭の利用箇所では results が2個の配列になるだろうなーという暗黙の了解があったんです。だから、どうせfirstつけるし、2個のときはあらかじめsugoi_results内部でfirstつけたろ!ということらしいです。

# sugoi_resultsの出力結果は… だいたい配列!

[]
[1]
1  # <- だけどここだけ要素1つ!
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 5]

何がダメなのか

 すごくつらいですが、一応書きます。

名前から想像できない動作がダメ

 results と複数形なのに、2個の時だけ1個になる(?)なんて絶対わからないです。皆さんのプログラミング言語にそんな哲学的な関数ありますか? 同僚をだまし討ちにするのはよくありませんね。

汎用性ないのがダメ

「オレ、2個の要素が2個とも欲しいなあ」という人はどうすればいいんでしょうか。わざわざ results という関数として独立して公開されているからには、他にも利用者がいるはずです。同僚の顔色を伺いましょう。

意味わかんないのがダメ

 致命的だなあと思うのは「意味わかんない」ところですね。なんでこんな改変したんだ?という思考過程が全く見えない。仮に見えても全力却下ですが、こういうことをやると全般的な信用の問題になってきます。

つまり

 ちゃんとプログラムを英語として読んでから書きましょってこと!

追記

 原題「笑っちゃうくらい腹が立った初心者のプログラミング」ですが、この想像上の同僚が初心者かどうかは定かでないので「笑っちゃうくらい腹が立った同僚のプログラミング」に改題しました。