職業柄、プログラミング言語や、マークアップ言語等のコードを毎日のように書いているし、目にするけど、やっぱり「美しいコード」と「美しくないコード」がある。

個人的には「美しいコード」の条件は「無駄が少なく、可読性が高い」だと思っている。逆に「美しくないコード」はそれ以外。

「美しいコード」のメリットと「美しくないコード」のデメリットに関しては、敢えて書く必要もないと思うので省略。

この「美しいコード」を書くためには、例えば以下のような方法があると思う。

  • データ構造とアルゴリズムの学習
  • 「美しいコード」をたくさん見る

「データ構造とアルゴリズムの学習」っていうのは、基礎の部分ですが、かなり差が出る部分だと思います。

「美しいコードをたくさん見る」っていうのは、多分一番よく言われる事で、これが一番重要。さまざまな状況に通用する、優れたものにより多く触れるのが上達への近道的なものだと思います。天才でない限り、誰にでも当てはまると思われる。要するに、何が優れていて、どこが自分と違うのかを考える機会が多ければ多い程、学習効率が良く、上達が早いということだと思う。

しかし、個人的にはコレ以外にも結構重要な要素だと思っている事がある。

それは「英語」。英語のセンスというか、正しく英語を使いこなせるっていうのがかなり重要な要素だと思う。

場合によっては、日本語でコードを書く人もいるかもしれないけど、変数名やメソッド名(関数名)は大抵は英語(アルファベット)で書くはず。にもかかわらず、文法や英単語の持つニュアンス等を無視した単語の使い方をするような人が書いたコードが読み易いはずがないと思う。たとえそれがどんな優れたアルゴリズムでも。

例えば、直訳?というか、日本語的発想の変な英語。具体例は思いつかないので割愛するけど、英語圏の人とか多少英語が分かる人からすると気持ち悪いと思う。私が「英語分かる人」という訳ではないけど、私にも分かる簡単な英語でも結構変な使い方をする人がいるので、感覚は分かるつもり。普通に「ん?」ってなって止まる。

あと単語を省略して使う時も気をつけた方が良いと思う。英語できない人程変な省略の仕方をする。「それ何だよ...」って思うし、そこで止まる。そもそも、str(String)や、arg(Argument)みたいにかなり一般的なもの以外は省略しない方が無難だと思う。

この他にも色々細かいモノはあると思うけど、大抵「美しいコードをたくさん見る」の範疇だと思うので敢えて書かない。(インデントとか、check***という直感的に分からないメソッド名ではなくis***とかhas***とかにすべき等)

そういえば、マークアップ言語というかHTMLに関して触れていなかった。

基本的に私が書くHTMLにはインデントはない。プログラミング言語ならサブルーチン化すれば、そんなに深い入れ子にはならない。(普通、深い入れ子構造になるのは何かがおかしいに違いないと思うけど。)しかし、HTMLはツリー構造なので、深い入れ子になりがちで、インデントしてると逆に見づらいと感じるので。あと何より修正したりする際にインデントを意識するのが面倒。

それが本当に見やすいのか?と疑問に思われると思いますが、私はインデントの代わりに、固まりを意識できるように適当な箇所に空行を入れるようにしている。多分、HTMLの構造が分かっていれば、それで十分だと思っているので。そもそもそんなに入れ子にしないけど。

あと、HTMLにもid名(id属性値)やclass名(class属性値)で英語を使うことが多いと思うけど、その時もやっぱり変な用法や、変な省略だと分かり難いし、CSSにまでコメントを書かないと意味が分からないこともあると思うので、やっぱり英語は重要。これに関しては意味が分からないと何の為に付けているのか分からない。多分、「CSSのセレクタに使うため」なんだろうけど、それはNG。

とりあえずこんな感じですが、殆ど英語分からない日本人同士では、正しい英語だと逆に分かり難い等と文句を言う人もいるかもしれないけど、「それはお前が悪いだけで、他の人には一切害はないはず。」と言いたい。職場にそういう人の方が多いとかそんな事はどうでもいい。レベル低い方に合せて何が嬉しいんだ、と。

まぁ、こんな事を偉そうに書いていても、実際私が「美しいコード」を書いているかと言われると怪しいと思う。でも、多少気をつけているので、まだマシではあると思う。英語できる訳じゃないので、必ず「英和 ***」とか「和英 ***」でGoogle検索して確認するし!

おまけ

余談ですが、テスト用ロジックで、「何でわざわざこんな処理入れなきゃならないんだ」と思いながら書いたロジックの中で日本語の変数を使った事がある。

詳しくは忘れたけど、変なループが必要で、インデックス用の変数に「哀」とか。

for (int 哀 = 0; 哀 < ***; 哀++) {
//(何らかの処理)
}

ささやかな抵抗というか、嫌な事でも楽しんでやるための工夫というか。どうせ自分しか見ないので遊んでみました(笑