ぱろっと・すたじお

技術メモなどをまったりと / my site : http://parrot-studio.com/

リーダブルなコードを書く前に必要なこと

仕事であまりにもひどいコードばかり見るはめになったので、
今さらこの本について書くわけですが・・・

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

間違いなく名著だと思いますし、ぜひ読んだ方がいいと思います

一方で軽く矛盾を感じるのは、この本をあえて読もうと思う人は、
「きれいなコード」に関心がある人であり、
少なくとも「読めるコード」を書いているのではないかと

実際には「もう一歩手前」があると思いまして、
もっとシンプルに、「これができればとりあえず読む気にはなる」という、
原理的な部分はないのかな・・・と

結論からいうと・・・

"母国語(国語)という「言語」を学べ"

・・・ということなんじゃないかと思います

これは仕事で感じていることなのですが、
全く構造的でないコードを書く人のドキュメントは、
やはり論理的でなく読みづらい、というのがあります

「プログラミング」は数学的な論理を構築する世界ですが、
その数学すら、国語に依存しています
国語がわからない人に問題は読めないし、証明は書けません

母国語で書いた「文章」が他人に理解されない時点で、
それを「翻訳」したコードは他人に理解されるはずもありません
意図が説明できないのに、「わかる」なんてありえませんからね(´-ω-)

そもそも、「コードを読めばわかる」のは、
(広い意味で)「文章」として成立している場合に限ります
文章として破綻しているコードは説明・意訳なしに読めません*1

だいぶ「アジャイル」という言葉が浸透しましたが、
ウォーターフォール」という手法が間違っていたわけではありません
時代の流れで適用分野が狭くなっただけです

「まず母国語で設計を書く」という行為自体は問題ないと思います
ただ面倒な文書フォーマットに落とすのが無駄なだけで、
「まず言葉や文章で書く・考える」ことは大事でしょう

これはやる人が多いと思うのですが、
コードを考える際に、まず日本語で処理を書いて、
それをコードに落とし込むという手を良くやります

class ActionBase

  def execute
    # 事前処理
    # 本体
    # 後処理
  end

end
class ActionBase

  def execute
    begin
      # 事前処理
      before_action

      # 本体
      action
    ensure
      # 後処理
      after_action
    end
  end

  private

  def before_action
    # 権限チェック
    # DB接続
    # ...
  end

  def after_action
    # リソース解放
    # ...
  end

  def action
    # 継承クラスで実装
  end

end

「言葉」や「文章」で書いたものを、
そのままコードに落とし込みつつ詳細化していくわけです

それを最適化・効率化したのが「テストファースト」の概念であり、
言葉をそのままテストコードに落とし込むことで、
「母国語からプログラム言語への翻訳」が妥当であるかが確認できます


もう一つ、プロとして大事なことがあります
これは先ほどの本でも繰り返し述べられていますが、
「俺様の考える華麗な文章」はいりません

「自分以外の誰かがその文章を読んで意味がわかるか?」が最重要で、
「俺様の書いた華麗な文章を読めない方が悪い」はプロの発想ではありません

限度はあるとはいえ、たとえそれが「一般的に最適」ではなくても、
「自分の環境*2で可能な最大パフォーマンス」を考えるのが、
「プロ」としての仕事です

先日、「コードにも思いやりが必要である」というプレゼンを拝見しましたが、
「読みやすく書く」というのは「他者への思いやり」であり、
「他者とつながろうとする意思」なのだと思います


あなたのコード、「日本語でおk」になってませんか(´・ω・)?

*1: 逆にいえば、「文章として書けること」が「(プログラム)言語」であることの要件なのかもしれません その意味で、「HTML」は言語ではなく、「JavaScript」は言語なのでしょう もちろん「意図」を伝える道具は「文章」だけではなく、「図表」等もあるわけで、HTMLはこっちなのだと思います

*2: 仕事場・チーム