@h5y1m141さんに誘っていただいて、
@hitomi_twさんや
shiro615さんと一緒に、RubyGemsのソースコードリーディング勉強会『GemJam』を行いました。
今回は最近仕事でソースコードを読む時間が増えてきて、苦労していたのでソースコード・リーディングのモチベーションアップやコツを調べつつ、いつもRailsでお世話になっていた『ActiveSupport』
のソースコードリーディングに挑戦してみました。
(12/28 12:10) 勉強会のアウトプットを更新しました。全員アウトプットしたのはすばらしいです
🎉 プログラムのモチベーション
これは経験談からくる話ですので、これが正解ということでないッス。どちらかというと、今までエンジニアとして経験してきた中で、僕個人はこう思っていますという観点で書きました!
プログラミングは継続することが一番大切
プログラミング経験ゼロだが180日で180個のウェブサイトを作るプロジェクトがゴールまであとわずかに
プログラミング経験0のデザイナーさんが、毎日1つサイトを作っていったお話です。最初はテキストとリンクが並ぶだけのサイトでしたが、少しずつゲームやチャットなどが作れるようになっていきます。
今知っている知識だけで、作れるWebサイトを作っていく。そして、自分の知っている2つの知識を組み合わせたり、1つずつやりたいコトをGoogleに教えてもらうくらいが、挫折せずに続けられると思っています。
個人的に学生さんらにプログラムを教えたことがありますが、プログラムができるようになるために一番大切なことは『継続』することだと常々実感させられます。
じゃあ、なぜソースコードを読むのか?
僕は1人の力には限界があると思います。たった一人で本当に価値のあるソフトウェアを作るのは本当に難しいことだと思います。だから、価値のあるソフトウェアを作っていくためには、ほかのエンジニアと一緒にプログラムを作り込む必要があると考えています。
そのためには、ほかの人のソースコードの意味を理解し、ほかの人にわかりやすいプログラムを書く必要があります。言い換えるとソースコードを読むこと、読みやすいソースコードを知ることが重要だと思います。
オススメのドキュメント
まつもとゆきひろのハッカーズライフ:第10回 ソースを読もう - ITmedia エンタープライズ
Rubyの製作者、まつもとゆきひろさんが2007年に書かれていた記事を見つけました。まつもとさんのソースコードを読む際の動機を垣間見えるおもしろい記事でしたので、良ければぜひご覧になってみてください。
🐡 ソースコードの読み方
今回『ActiveSupport』
のソースコード・リーディングをしてみたので、そのときの僕の手順を紹介します。(もしもっといい方法をご存じの方がいればぜひコメントお願いします)
(1) コードを効率よく読むためのツールを準備する
まず、オススメのエディタは『RubyMine(などのJetBrains製のエディタ)』です。理由はメソッドのドリルダウンがデフォルトの設定で簡単に行えるからです。1ヵ月無料なのでよかったらぜひ試してみてください!
次にプロジェクトフォルダ直下で、Gemfile作成して以下のように追加。
source 'https://rubygems.org' |
次のコマンドを実行して、Gemをインストール。
# Gemを追加するためのディレクトリを作成 |
(2) 実際に動かしてみる
たとえば、sample.rb
を作成して次のようにコードを記入。
require 'pry' |
これを実行するとactive supportの機能である2日前の日付を取得することができます。
bunlde exec ruby sample.rb |
(3) デバッガの準備
次に今回はデバッカを書いて実際に2.daysのメソッドにどんな風に動いているのかを見れるようにします。
まずは、vendor/bundle/Ruby/2.1.0/gems/activesupport-4.2.0/lib/active_support/core_ext/numeric/time.rb
を開いて、daysメソッドに以下を追加。
def days |
そしてもう一度次のコマンドを実行すると今度は、binding.pry
を書いた地点で停止します。
bunlde exec ruby sample.rb |
あとはちょっと変更して見て動かしたりしてみてください。
どんなふうにソースコードを読み進むべき?
手始めにどんなふうにソースコードを読んでみたらいいかをいくつかのサイトを調べながら考えてみました。
アイデアレベルですが、よかったらぜひソースコード・リーディング試してみてください!
* 普段関わっていたり、仕事に役立つコードを読んだり、コメントを書く * 興味のある分野や機能を持ったソースコードを読む * 全体を読む必要はない。面白そうなところをつまみ食いして、先人の知恵を学べばいい * ちょっと変更して動作させてみる * バグがないか探してみる
🍄 Active Supportのおもしろい機能
『ActiveSupport』の
便利機能を調べつつ、その部分のソースコードを読んでみました。今回知らなくって、あとで使えそうだった機能を中心に紹介します!
Benchmark.ms
Benchmark.ms
はブロックを渡すとブロックを評価して実行時間を計測します。
(Benchmark.realtimeのラッパです)
require 'active_support/all' |
cattr_accessor
attr_accessor
はインスタンス変数へのアクセッサを提供するメソッド。cattr_accessor
は、クラス変数へのアクセッサを提供するメソッド。
require 'active_support/all' |
descendants
require 'active_support/all' |
🚕 ハッシュ。except
require 'active_support/all' |
😼 Time#change
require 'active_support/all' |
ここの記事がたいへん参考になりました!
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勉強会アウトプット
GemJamという勉強会を行いました
@h5y1m141さんが、GemJamを作った背景や、今回調べたことについてブログにまとめていただけました。4人位のコードリーディングや読書会的な勉強会って結構おもしろいと実感しました。あと、みんなが終了後1-2日でちゃんとアウトプットしているのはほんとうにすばらしいです!
GemJamという勉強会を行いました - TitaniumMobile勉強記
GitHubでMergeされたらBacklogもRailsで自動更新する
@hitomi_twさんがActive Supportのconcernを使5つ、Backlog APIへのアクセスメソッドを調べて発表してくれました。その際のソースコードをQiitaに公開していただけたので紹介です!
GitHubでMergeされたらBacklogもRailsで自動更新する - Qiita
配列からハッシュを作成/Active Supportでハッシュの一部だけ取り出す
まだ、プログラムの実務経験はないそうですが、短い時間でアウトプットや発表なんかをしっかりしてくれて、自分の初心者のころと比べると雲泥の差ですばらしいと感じました。ぜひプログラムを楽しんでください^^
🚌 参考リンク
- ソースコードを読むための技術
- ソースコードを効率よく読むには(1) - プログラマyasuhoの隠れ家
- プログラムのソースコードの読み方のコツ最近他人の書いたプログラム… - Yahoo!知恵袋
- 小山博史のJavaを楽しむ(10):【新人なるプログラマーへ】ソースコードを読みましょう (1/2) - @IT
👽 変更来歴
(12/28 12:10) 勉強会のアウトプットを更新