弥生開発者ブログ弥生開発者ブログ2015-10-02ソースコードを読むときの3つのステップはじめにはじめまして。お盆明けからMisocaでインターンをしているhmryuです。Misocaにジョインする前は、個人でサービスを作ったり、研究でプログラムを書いたりしていました。一方で、チームで開発する経験はあまりなく、Misocaにジョインした始めの頃は慣れないことばかりでした。中でも、他人の書いたソースコードを読んで理解することが、一番大変だったかもしれません。そこで今回は、機能追加・変更を加えるためにソースコード*1を読む上で、僕が大切だと感じた3つのステップについて書きたいと思います。機能とソースコードの対応を調べるまず、自分が変更を加える機能がどんなもので、どこに実装されているのか理解する必要があります。実際にサービスを動かして、どんな機能なのかを確認します。その後、その機能がソースコードのどの部分に対応するのかを調べます。メール送信について調べる場合は、実際の画面を開きformタグのaction属性を調べて、config/routes.rbと照らし合わせることで、呼ばれているアクションを特定します。...ここでは、MailsControllerのdistributeアクションが呼ばれていることがわかりました。処理全体の流れを追う次に、実際にどのような処理がされているのかを把握するため、ソースコードを読んでいきます。メール送信の処理を読んでいくケースを考えてみます。メール送信のアクションは以下のように実装されています。endend読んでみると、distributeアクションの中で、Misoca::Mail::Distributeのインスタンスが生成され、callが実行されていることがわかります。ここの中でメール送信をしていそうなので、アプリ全体からMisoca::Mail::Distributeが定義されている場所を探します。このとき、アプリ全体の構成を把握しておくと、作業が捗ります。Architecture*2で構成されており、Misoca::Mail::Distributeのようなクラスはapp/misoca以下に[グループ名]/[名前].rbをという名前で保存するとルールが決まっています*3。endendMisoca::Mail::Distributeのcallでは、find_documentでメール送信する文書を探しています。その後、Misoca::Mail::DocumentDistributorのインスタンスが生成され、build_to_mailが実行されていることが分かります。このような感じで、どんな処理がされているのかを調べていきます。複雑なときなどは、調べていて混乱しないように、下記のような簡単なメモを書いておいたりします。ここでは、疑問に思ったことなども簡単に書いておきます。上記の流れ以外にも必要に応じて、コールバックやフィルタなども気にしておくようにしています。変数やデータベースの中身を見るソースコードを読み進める中で、「この時点でこのオブジェクトはどんな状態になっているのか?」「これが実行された後、このモデルのレコードは増えているのか?」といった疑問が出てきます。一通り流れを把握したら、変数やデータベースの中身を調べてみます。僕は、pryというGemを使っています。github.comソースコードの任意の場所にbinding.pryと記述すると、その時点でプログラムの実行を一時停止することができます。#endサーバーを起動させていたコンソールを一時停止した状態で、変数やデータベースの中身を見ることができて、とても便利です。2この例では、build_to_mailでMailのレコードが増えていることが確認できました。まとめ今回は、ソースコードを読むときの3つのステップについて書きました。働き始めて1ヶ月くらいですが、Misocaのインターンでは、様々なことを学べています。早く成長して、学んだ知識や技術をこのブログで還元できればと思っています。*1:MisocaがRailsで実装されているので、ここでは、Railsのソースコードを読むことを想定しています。Light*3:Misocaでは、アプリの仕様などがesa.ioにまとめてあります。RubyKai...2018-08-27LIFFアプリ作ってみましたMisoca開発チームのnao(@enda531)です。涼しくなってきたかな...2017-06-16MisocaのCI構成まとめこんにちは。4月からMisocaにjoinしました、tkykです。弥生は第23回Quesに協賛します。引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。