@h5y1m141さんに誘って頂いて、
@hitomi_twさんや
シロさんと一緒に、RubyGemsのソースコードリーディング勉強会『GemJam』を行いました。
今回は最近仕事でソースコードを読む時間が増えてきて、苦労していたのでソースコード・リーディングのモチベーションアップやコツを調べつつ、いつもRailsでお世話になっていた『ActiveSupport』 のソースコードリーディングに挑戦してみました。
プログラムのモチベーション
これは経験談からくる話なので、これが正解という話でないっす。どちらかと言うと、今までエンジニアとして経験してきた中で、僕個人はこう思っていますという観点で書きました!
プログラミングは継続する事が一番大切
プログラミング経験ゼロだが180日で180個のウェブサイトを作るプロジェクトがゴールまであとわずかに
プログラミング経験0のデザイナさんが、毎日1つサイトを作っていったお話です。最初はテキストとリンクが並ぶだけのサイトでしたが、少しずつゲームやチャットなどが作れるようになっていきます。
今知っている知識だけで、作れるWebサイトを作っていく。そして、自分の知っている2つの知識を組み合わせたり、1つずつやりたいコトをGoogleに教えてもらうくらいが、挫折せずに続けられると思っています。
個人的に学生さんらにプログラムを教えた事はありますが、プログラムが出来るようになるために一番大切なことは『継続』することだと感じています。
そういった意味で、RailsやRubyは覚える事が少なくて、始めやすいし、ライブラリを組み込むだけでどんどん機能が実装できるのでプログラムを始めたばかりの人にもおすすめです。
じゃあ、なぜソースコードを読むのか?
僕は1人の力には限界があると思います。たった一人で本当に価値のあるソフトウェアを作るのは本当に難しいことだと思います。だから、価値のあるソフトウェアを作っていくためには、他のエンジニアと一緒にプログラムを作る必要があると考えています。
そのためには、他の人のソースコードの意味を理解したり、他の人にわかりやすいプログラムを書く必要があり、言い換えるとソースコードを読むこと、読みやすいソースコードを知ることが重要だと思います。
オススメのドキュメント
まつもとゆきひろのハッカーズライフ:第10回 ソースを読もう - ITmedia エンタープライズ
Rubyの製作者、まつもとゆきひろさんが2007年に書かれていた記事を見つけました。まつもとさんのソースコードを読むモチベーションがしれて面白い記事でしたので、良ければぜひご覧になってみてください。
ソースコードの読み方
今回『ActiveSupport』 のソースコード・リーディングをしてみたので、その時の僕の手順を紹介します。(もしもっといい方法をご存知の方がいれば是非コメントお願いします)
(1) コードを効率よく読むためのツールを準備する
まず、オススメのエディタは『RubyMine(などのJetBrains製のエディタ)』です。理由はメソッドのドリルダウンがデフォルトの設定で簡単に行えるからです。1ヶ月無料なのでよかったら是非試してみてください!
次にプロジェクトフォルダ直下で、Gemfile作成して以下の様に追加。
1 2 3 4 5 6 7 8 9 10 | |
以下のコマンドを実行して、Gemをインストール。
1 2 3 4 5 | |
(2) 実際に動かしてみる
例えば、sample.rbを作成して以下のようにコードを記入。
1 2 3 4 5 | |
これを実行するとactive supportの機能である2日前の日付を取得する事ができます。
1 2 | |
(3) デバッガの準備
次に今回はデバッカを書いて実際に2.daysのメソッドにどんな風に動いているのかを見れるようにします。
まずは、vendor/bundle/ruby/2.1.0/gems/activesupport-4.2.0/lib/active_support/core_ext/numeric/time.rb
を開いて、daysメソッドに以下を追加。
1 2 3 4 | |
そしてもう一度以下のコマンドを実行すると今度は、binding.pryを書いた地点で停止します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
あとはちょっと変更して見て動かしたりしてみてください。
どんなふうにソースコードを読み進むべき?
手始めにどんなふうにソースコードを読んでみたらいいかをいくつかのサイトを調べながら考えてみました。 アイデアレベルですが、よかったらぜひソースコード・リーディング試してみてください!
* 普段関わっていたり、仕事に役立つコードを読んだり、コメントを書く * 興味のある分野や機能を持ったソースコードを読む * 全体を読む必要はない。面白そうなところをつまみ食いして、先人の知恵を学べばいい * ちょっと変更して動作させてみる * バグがないか探してみる
ActiveSupportの面白い機能
『ActiveSupport』の 便利機能を調べつつ、その部分のソースコードを読んでみました。今回知らなくって、後で使えそうだった機能を中心に紹介します!
Benchmark.ms
Benchmark.msはブロックを渡すとブロックを評価して実行時間を計測します。
(Benchmark.realtimeのラッパーです)
1 2 3 | |
cattr_accessor
attr_accessorはインスタンス変数へのアクセッサを提供するメソッド。
cattr_accessorは、クラス変数へのアクセッサを提供するメソッド。
1 2 3 4 5 6 7 8 | |
descendants
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Hash.except
1 2 3 4 5 | |
Time#change
1 2 3 4 | |
ここの記事が大変参考になりました!
RailsDoc - 広島Ruby勉強 #032 - Rails のソースコード読んだので面白そうなところを紹介する – ActiveSupport CoreExt編 その1
pry詳解
今回ソースコードを読んでいて、改めてpryの素晴らしさに感動しました。ということでpryに関する記事を見つけたので詳解です。
pryの使い方解説
- Pryコマンドまとめ - Qiita
- Ruby の 定番対話ツール pry 徹底攻略 | Normal Input #pry #ruby - Qiita
- Ruby の 定番対話ツール pry 徹底攻略 #pry #ruby - Qiita
- Ruby - 今更聞けないpryの使い方と便利プラグイン集 - Qiita
- pry-docでカジュアルにRubyのソースコードを読む - Qiita
- Pryが真の力を発揮してくれる19個のコマンドとコマンドの自作方法 - 酒と泪とRubyとRailsと
pryの動作原理の解説
GemJam勉強会アウトプット
@hitomi_twさんがActiveSupportのconcernを使いつつ、Backlog APIへのアクセスメソッドを調べて発表してくれました。その際のソースコードをQiitaに公開して頂けたので紹介です!
GitHubでMergeされたらBacklogもRailsで自動更新する - Qiita