『リーダブルコード』を読み終えての感想
リーダブルコードを読んでの読書感想文です。
Amazon.jp : リーダブルコード―より良いコードを書くためのシンプルで実践的なテクニック (オライリー・ジャパン)
概要 〜Hello Readable World !〜
この本は大きく分けて4部の構成でリーダブルで美しいコードを書くための手法やテクニックについて書かれています。
第1部は変数や関数名の付け方やコメントの付け方など、私のような経験のない者でもすぐに実行できそうな「表面上の改善」です。
第2部が「ループとロジックの単純化」です。ロジックというからには小難しいプログラミングの話になってしまうのかと思いましたが、そんなことはなく三項演算子やdo while, go to文、グローバル変数はロジックが複雑になるから使わないようにしましょうといった話でした。ただ使うなと押し付けるのではなく使わないほうがよい理由がはっきりと書かれているので自然と受け入れることができます。また簡単な名前で式を説明することでコードを文書化する(説明変数)手法が紹介されていてなるほどと納得する考え方でした。そして、変数を複雑化させないために変数の数はできるだけ増やさないほうがよいという考え方は、ハッとする気づきだった。当たり前のことではあるが当たり前のことを体系化し意識することがとても重要なのだと感じました。
第3部が「コードの再構成」です。何も考えなしに実装を進めると大抵コードは肥大化していってしまう。それを考えもなしに分割し、どの関数がどの関数を呼び出しているかの依存関係が分からなくなり、ローカル変数名とグローバル変数名が衝突し、完全に袋小路に嵌り込む(;´Д`)
そして、この第3部では、そんなこともあろうかと救世主ばりに解決策を提示してくれます。具体的には、汎用部分の切り出し方、1度に一つのタスクを関数などのまとまりにする、関数ロジックを3行ほどで簡単に説明できるようにするといった手法が紹介されています。
第4部はテストコードのリーダブル手法とそれまでに紹介されたノウハウを活かした具体的な実装をテーマとして取り上げた実践的な内容です。
実践 〜ひと目で尋常でないコードだと見抜いたよ〜
かねてより自分のコードには漠然とした汚さを感じていました。しかし、なぜ自分のコードが汚いと感じるかが理解できませんでした。
それではここで私の汚コードを振り返って見ましょう。 以下にリーダブルコードを読んで気づいた直近に私の書いたJSコードの汚さの原因を挙げてみました。
何も考えずに変数や関数に抽象的な名前をつけている。1つのプログラム内でキャメルケースやスネークケースが入り乱れていて、名前の付け方を何も考えていないことがよく分かる(´・_・`)
グローバル変数を考えなしに使っていて、変数が行方不明に陥っている(゚ロ゚;)
- 目を凝らさないとどんな機能を持った関数なのかよく分からない
- 似たような機能を持つ関数が乱立している
- 3重ループのようなネストの深い文があり、配列のどこにアクセスしているのかがよく分からなくなっている
リーダブルコードを読んだことによって、モヤモヤしていた不快感を具体的に気づき見抜くことが出来ました。少し進歩です。
では、次に解決策を挙げてみましょう。
- できるだけローカル変数を利用し、スコープを小さく保つ
- 関数名を熟考し具体的につける。シソーラスを活用する
- 駆動開発をする前にプログラムの流れを書き出し、機能別に必要な関数を挙げていく
- 自分の考えをコメントとして残す
- 行数が増えてもネストは浅くし、目に優しくする
たぶんこれだけでは完璧なコードになったわけではないでしょう。すぐにこの本に書かれていること全てを実行するのは不可能だし、その必要もないと思います。大切なのは綺麗なコードを書くことを常に頭に置き、習慣化していくことです。紹介されているテクニックから必要だと思うものを使っていけば少しづつではあっても綺麗なコードになっていくのではないかと思います。
まとめ 〜やればわかる!!やらなければ一生わからん!!〜
シンプルで分かりやすく、理解しやすいコードは「美しいコード」です。美しいコードはメンテや拡張、リファクタリングがしやすい。実際にそのような完成された美しいコードを見てしまうと、このコードは熟練したセンスや勘のような自分にはないものを持っている人にしか書けないんだと思い込み、美しいことは理解できるけど真似出来るわけないと落ち込んでしまっていましたorz
しかし、この『リーダブルコード』では職人芸のような完成されたコードも実は1つ1つはそれほど複雑ではない手法や小さいテクニックの積み重ねによるロジカルな集合体であることを具体例を交えて紐解いてくれています。1つ1つは小さく真似できますが、多くの考えを組み込むことで職人技のようなそう簡単には真似できない美しいコードが出来上がっていることを教えてくれています。そして自然と美しいコードを書けそうな気分にさせてくれます。
ただ、気分になっているだけでは何の意味もありません。実際にリーダブルなコードを書けるようにならなければいけません。そうしなければ役立たずとマサカリを投げられ死ぬだけですorz たどたどしくとも実践していくことこそ大切です。はじめは引き出しや要領がない分、よく考え悩まなければいけない時間が多く大変です。しかしその考え抜く時間を少しづつ積み重ねることが経験を積むということであり、それがセンスや勘と呼ばれる本質的な理解へとつながっていくのではないかと思います。
SF映画『バック・トゥ・ザ・フューチャー2』では主人公たちが劇中で30年後の未来へ行くシーンがあり、先日その未来2015年10月21日が実際にやってきました。どれくらい映画の世界観が現実のものになっているかが話題になっていました。今から30年後に思いを馳せると自分が寝ている間にコードが完成している夢のような世界が待っているかもしれません。しかし、何年経とうと「悩み」「考え」「最適化」していくというサイクルは要領のよい人工知能やアンドロイドには真似出来ない気がします。アンドロイドには書けないリーダブルな美しいコードを30年後の自分が書いていることを夢見て、今後のコードを積み重ねていきたいと思います。
JSでボタンを押すと音が鳴る実装
ボタンを押すと音声が流れるサンプルです。
HTML
<!-- ボタンの設置 --> <input type="button" value="再生" onclick="ring()"> <!-- 音声ファイルの読み込み --> <audio id="tts"> <source src= "audio/sample.mp3" type="audio/mp3"> </audio>
JavaScript
<script type="text/javascript"> function ring(){ document.getElementById("tts").load(); document.getElementById("tts").play(); } </script>
HHVMで性能テストもどきしてみた
HHVMをせっかくインストールしてみたので、今回は本当にHHVMは通常のPHPよりも速いのかの性能テストをしてみました。
環境
MacAirにVagrantで以下の環境を構築して比較を行ってみる。
- ubuntu14.04 + nginx + HHVM(Hackコード)
- ubuntu14.04 + apache2 + php5.5
(より本番環境を想定するとローカルサーバーは良くないのでは(・・?))
ソースコードはあんまりいいものが思いつかずFizzBuzz問題を使用することにした。
ループ回数を100, 10000, 1000000回で実施した。
<?php for($i = 1; $i < 1000000; $i++){ if($i % 15 == 0){ print("FizzBuzz\n"); }else if( $i % 3 == 0){ print("Fizz\n"); }else if( $i % 5 == 0){ print("Buzz\n"); }else{ print($i."\n"); } }
Hackのコードは冒頭の<?php
の部分を<?hh
に変更するだけでよい。
Apache Bench
ab - Apache HTTP server benchmarking tool - Apache HTTP Server Version 2.4
Apacheをインストールするとデフォルトでくっついてくる
サクッとお手軽に負荷テストができるApache Benchというものがあるので今回はこれを使う。
AB(Apache Bench)の使い方
ab -n リクエストの総数 -c クライアント数(ユーザー数)
ab -n 100 -c 100 http://192.168.33.10/hello.php
結果の見方
結果はこんな感じで返ってくる。それぞれの意味合いは以下のようになる。
結果 | 説明 |
---|---|
Concurrency Level | クライアントの数、-cの後の値が返ってくるはず |
Time taken for tests | 接続時間 |
Complete requests | 成功したリクエストの数 |
Failed requests | 失敗したリクエストの数 |
Requests per second | 1秒当たりに処理できるリクエスト数 |
Time per request(mean, across all concurrent requests) | 1リクエスト当たりの処理時間 |
Concurrency Levelを徐々に増やしていき、Failed requestsが発生した時点がそのサーバーの処理限界ということになる。
測定結果
HHVMと通常のPHP環境それぞれにFizzBuzzのループ回数を増やしていき、以下のコマンドを5回づつ実施した。
ab -n 250 -c 250 http://192.168.33.10/fizzbuzz.php
それぞれのRequests per secondの結果を以下に示す。
100ループ
HHVM + nginx | PHP + apache2 | |
---|---|---|
1回目 | 507.72 | 548.80 |
2回目 | 506.23 | 543.82 |
3回目 | 509.12 | 542.11 |
4回目 | 505.88 | 546.89 |
5回目 | 507.35 | 544.71 |
平均値 | 507.26 | 545.27 |
同じくらいかどちらかというと通常のPHPの方が処理速度が速いことが分かる。
1万ループ
HHVM + nginx | PHP + apache2 | |
---|---|---|
1回目 | 564.48 | 230.76 |
2回目 | 565.06 | 232.59 |
3回目 | 564.84 | 228.59 |
4回目 | 562.77 | 231.54 |
5回目 | 558.20 | 236.23 |
平均値 | 563.07 | 231.94 |
通常のPHPがループ回数を100倍したことにより処理速度が1/2以上落ち込んでいる。一方で、HHVMの方は100ループの時よりも100000ループの方が処理速度が変わらないどころかちょっと速いという謎の結果になった。
100万ループ
HHVM + nginx | PHP + apache2 | |
---|---|---|
1回目 | 572.52 | 2.62 |
2回目 | 558.95 | 2.64 |
3回目 | 570.53 | 2.65 |
4回目 | 567.62 | 2.67 |
5回目 | 559.75 | 2.83 |
平均値 | 565.87 | 2.68 |
ここまでループ回数を増やすとHHVMの方が圧倒的に速い。200倍以上速いことになっている。それとHHVMの特徴として目につくのはループ回数を増やしても性能がほとんど変化していないということである。
HHVMを使ってみた
HHVMをインストール、実行してみた時の備忘録。
HHVM(Hip Hop Virtual Machine)とは(?_?)
ヒップホップとか名前からしてふざけている気がするけど、HHVMはFacebookが開発を行っているプロジェクト。レガシーPHPコードをHHBC(Hip Hop Byte Code)に変換してVM(仮想マシン)上で実行して爆速化しようぜということ。たぶん。
HHVMインストール
今回はubuntu14.04にインストールを行った。
レポジトリを追加してインストールする。
sudo apt-get install software-properties-common sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449 sudo add-apt-repository 'deb http://dl.hhvm.com/ubuntu trusty main' sudo apt-get update sudo apt-get install hhvm
nginxをインストール
apache2でもできるみたいだけどFastCGIが標準でついていなくて面倒臭そうなので、チュートリアルに従ってnginxをインストールする。
sudo apt-get install nginx
ローカルホストにアクセスして以上のように表示されれば成功。
nginxの設定
以下のシェルスクリプトを実行するといい感じにnginxとhhvmが関連付けられるみたい。
sudo /usr/share/hhvm/install_fastcgi.sh
HHVMの設定
nginxのドキュメントルート/usr/share/nginx/htmlに、中身もファイル名も空の.hhconfigファイルを作成する。
sudo touch .hhconfig
.hhconfigを作成したディレクトリで、hh_clientを実行する。
hh_client
nginxとhhvmを再起動させる。(インストールが完了した時点で勝手に起動している)
sudo service nginx restart sudo service hhvm restart
そして以下のようなHackファイルを作成する。
info.php または info.hh
<?hh echo phpinfo();
ローカルホストにアクセス。
上記のように表示されれば成功。HHVMではphpinfo()を出力させるとHipHopと表示されるだけ。
ベンチマーク取る実験はまた今度。
Hack言語
ちなみに先ほど作成したファイルのHackとはHHVM上で実行できる言語。と言っても基本的にはPHPコードの冒頭を<?php
を<?hh
に変更するだけでよい。但し、完全に互換性を持っているわけではない。HTML中に埋め込むことも出来ない。ファイル拡張子は.php
または.hh
。