デバッグ奮闘記 ~処理の流れを把握するのが大切編~

Railsのコードが読めなかった頃、ひたすらブレークポイントを置いてデバッグをしていた時期がありました。

前よりはエラーを読んで原因に対処したり、適切にブレークポイントを置いてデバッグできるようになりましたが、その紆余曲折を自分のたくさんの失敗は棚に上げてまとめていこうと思います。

どこから処理は始まるんだろう?

デバッグをするためには、自分が確認したい処理がどこに定義されているかを把握することが重要です(よね?)

先述のように自分はコードが全然読めなかった頃、処理がどこに書いてあるかを見つけられなくて何が分からないかもわからなくて質問もできないレベルでした。 その頃はとりあえずブラウザから操作を実行して流れてきたログを読みながら処理が書かれているファイルを見つけるという先輩からドン引きされそうな?やり方をしていました。

Railsの処理がどういう流れで実行されているかを分かってなかったので、ログを見るしか手掛かりを得られなかったためです・・・。

ひたすらログを読み続けた結果、例えばブラウザのURLが/users/#{id}/editとなっていたら、users_controller.rbやuser.rbというように対応関係になっているファイルがあることにやっと気がつき、controllerが見つけられればそこからエディタのメソッドジャンプで定義元に飛ぶことができるということを理解しました。

前置きが長くなりましたが、デバッグブレークポイントを置いてメソッドの中身を見ていくためには、何よりもまず処理が実行される起点を明らかにすることを目指すことが第一ステップです。

もしもRailsではなく素のRubyのコードだった場合もこれは同様です。

必ず処理の起点となる実行ファイルがあって、そこから何らかのメソッドが呼ばれて最終的なアウトプットまで流れているはずです。

コードのボリュームにもよりますが、起点となるファイルが見つけられたら、正しいかは一旦置いておいて、どんな流れでファイルが実行されているかを書き出してみるのも良さそうです。

処理の中身を見ていく

処理の起点が見つけられたら、具体的な実装内容を見ていきます。

ここで活躍するのがデバッガーです。

このブログでは個々のデバッガーを説明しませんが、

など手段はいくつかあります。

デバッガを使う目的は目視で表面上のコードを読んでも分からないより内側の部分を処理の実行を一時停止しながら確認していくことです。

デバッガで処理を停止させることで、ターミナル上で変数の中身を確認したりメソッドを実行してどんな結果が返ってくるかを確認することができます。

ここで、ブレークポイントを置いているのにデバッガが停止しない・・・!ということがあると思います。

そんな時は、ブレークポイントの代わりにppを入れて、何か値をログに出力してみることがおすすめです。

ログに何も出力されない場合は

などの可能性が高いです。

この場合はまた処理の起点に戻ってメソッドジャンプなどを利用して、実行の流れを確認します。

ログにエラーが出ている場合

ここまではシンプルにコードの流れを追うイメージでデバッグのやり方を見てきました。

機能追加をする際の調査などではなく、開発中にエラーが出てピンポイントでデバッグをしたいことも多いと思います。

その場合は、エラーの1行目を読むことが大ヒントになります。

ログにエラーが出ている場合、

  • 1行目が具体的なエラーの詳細
  • それ以降はバッグトレース

という構成になっています。

例えば、以下は私の自作サービスのコードでわざとタイポしてエラーを出した際のログになります。

// エラーの1行目が大切
18:06:04 web.1  | NoMethodError (undefined method `sav' for #<Subscription id: nil, name: "ヨガのサブスク", payment_date: "2023-07-07", fee: 7000, my_account_url: "https://example.com/user", subscribed: true, cycle: 1, created_at: nil, updated_at: nil, user_id: 3>
// おかしなメソッド名を参照しようとした場合にタイプミスの可能性を考慮して正しい名前を提案してくれる
18:06:04 web.1  | Did you mean?  save):
18:06:04 web.1  |   
// ここからバックトレース
18:06:04 web.1  | app/controllers/subscriptions_controller.rb:18:in `create'

1行目にNoMethodErrorと出ていますね。 savなんてメソッドはないと怒られています。

1行目に具体的なエラーメッセージが出ていればそのメッセージを調べて対処ができます。

また、バックトレースはプログラムが実行されてエラーが発生するまでの処理の流れを示してくれます。

今回はピンポイントでエラーを発生させたため1行しかありませんが、複数行出力される場合もあります。

その際はバックトレースの上にいく程エラーに近く、下に行くほどエラーから遠いことを意味していて、基本的にはログのエラーの1~3行目あたりから対処すべき内容の当たりをつけることができます。

タイポなどではなくメソッドの中を見ないと分からない場合は、このバックトレースをヒントにエラーで落ちている箇所にブレークポイントを置いて変数の中身をチェックしたり意図しない分岐に入ってしまっていないかなどを確認することができます。

テストが失敗する場合

テストコードがあってテストが失敗する場合は、テストの実行結果からヒントを得て原因を辿っていきます。

テストコードがある場合、必ず期待値と実行結果があり、それが一致しない場合に失敗に至ります。

テスト結果を確認するとどのテストが落ちていて、その期待される結果と実際の結果を比較して出力してくれるため、そこからコードを追っていきます。

例えば以下はmodelのバリデーションをチェックするテストコードですが、テストが落ちています。

it 'subscription name must be 50 characters or less' do
    long_name_subscription = build(:subscription, name: 'a' * 51)
    long_name_subscription.valid?
    expect(long_name_subscription.errors[:name]).to include('は50文字以内で入力してください')
  end
Failures:

  1) Subscription subscription name must be 50 characters or less
     Failure/Error: expect(long_name_subscription.errors[:name]).to include('は50文字以内で入力してください')
       expected [] to include "は50文字以内で入力してください"
     # ./spec/models/subscription_spec.rb:29:in `block (2 levels) in <top (required)>'

Finished in 0.08305 seconds (files took 0.87932 seconds to load)
18 examples, 1 failure

出力結果のexpected ~以降を読んでみると[]が表示されていて、そもそもエラーが発生していなさそう?と当たりをつけられます。

当たりをつけたら処理が実装されているmodelのファイルを確認しにいき、バリデーションが適切に定義されているかを調べます。

例のようにピンポイントで原因がわかればいいのですが、そうではない場合、やっぱりどこから処理が流れてきていてどんな結果を求められているかを整理することが大切です。

その上でブレークポイントを置いて原因を探っていきます。

まとめ

デバッグ奮闘記と題して、今回は処理の流れを意識することに重点を置いて書いてみました。 (〇〇編ということは続きがあるかも?) 闇雲にブレークポイントを置いたりログを眺めているとだんだん辛くなってきます。 そんな時は今回書いたように処理の起点はどこなのかを再確認して、実行の流れを手書きで書いていくなどアナログなやり方も良かったりします。

ここに書いたのは自分の経験ベースによる部分が大きく、ツッコミどころがあるかもしれないです。 その際はぜひコメントなどで教えていただけると幸いです。

また、自分はこうしている!という情報やこれを聞いてみたい!などあれば、その辺りも是非教えていただけると嬉しいです。

RuboCopのLSPを使ったらとても便利だった

フィヨルドブートキャンプのDiscordにRuboCopでLSPが標準搭載されたお知らせがありました。

koic.hatenablog.com

そもそもLSPが何かも分かってなく・・・気になったため早速インストールして使ってみました。

LSPとは

qiita.com

language serverとは、IDEが必要とするプログラムのプロジェクト ソースを解析して情報を提供する機能を、サービスとして実現するものです。language serverがサポートされたIDEでは、型やメンバーの自動補完、変数やメンバーの定義参照、変数やメンバーの利用箇所の検索、コードの自動フォーマット、コードのエラー分析や修正案の提示といった、さまざまな機能を実現できます。

docs.rubocop.org

Offense detection and autocorrection are performed in real-time by editors and IDEs using the language server.

違反の検出と自動修正は、言語サーバーを使用してエディターと IDE によってリアルタイムで実行されます。

つまりRuboCopのLSPを利用するとリアルタイムでコードの自動フォーマット、コードのエラー分析や修正案の提示などができるということのようです。

VSCodeで早速使ってみた

github.com

自作サービスのリポジトリのRuboCopのバージョンを上げて早速使ってみました。

$ bundle update rubocop

バージョンアップができたらVSCode拡張機能からRuboCopをインストールします。

インストール後にうまく動かない場合はVSCode側の設定の確認も必要かもです。 以下に設定手順が書いてあるため、自分は一通りVSCodeの設定を確認し、再起動したら使うことができました。

marketplace.visualstudio.com

インストールができたらRuboCopのDocに書いてある手順通りにLSPを起動します。

追記:koicさんからコメントをいただき、こちらはVS Code extension から呼ばれるため、都度起動は不要でした。

$ rubocop --lsp

プロセスの状況は以下で確認できます。

$ ps aux | grep rubocop
user             17414   0.0  0.2  5557716 144376   ??  Ss    4:48PM   0:02.13 /Users/user/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/bin/rubocop --lsp

自作サービスのコードで意図的に余計なスペースを入れたり、endを削除して保存した結果、VSCodeのターミナルの「問題」のタブに警告内容がすぐに出力されました!!

また、問題があるファイルはVSCode上でファイル名が赤くなり、エラーがあることにすぐに気がつくことが可能です。

ターミナルで定期的に

$ bundle exec rubocop

を実行しなくて済むのはすごく便利!!

まとめ

私はRuboCopを実行し忘れてPRを作成して、CIで問題に気づくというやらかしを定期的にやってしまいます・・・ RuboCopのLSP機能でリアルタイムに問題に気がつけることは開発をする上でとても良い体験だなと思うため、今後も活用しながら開発に取り組みたいと思います!

なりたいエンジニア像をマインドマップで整理してみた

少し前に「自分の働く軸」について真面目に考えた(ちょっと暑苦しい)ブログを書きました。

maimux2x.hatenablog.com

最近はここから一歩進んで、自分がどんなエンジニアになりたいのか、どんなふうに働きたいのかをウンウン考えています。

まだうまく言語化できていないため、甘い部分が満載ですが記録として残しておこうかなと思います。

マインドマップでキーワードを洗い出す

ツッコミどころ満載感がありますが、あまり深く考え込まず興味のあるキーワードをマインドマップ形式で挙げていきました。

そうすると

  1. 言語として興味があるもの、深く突き詰めていきたいもの
  2. 考え方の土台として突き詰めていきたい分野
  3. 開発手法について

みたいな感じで分類ができそうなことが分かりました。

言語として興味があるもの、深く突き詰めていきたいもの

これは一番キーワードが厚く出てきたのはやっぱりRubyでした。

Rubyのベースが「ストレスなくプログラミングを楽しむこと」とあるように、やっぱり書いていて楽しい。

最近はなぜ「楽しい」のかもちょっと深掘りしたくて、るりまを読み込んだり内部実装(理解はしてない)とかにも興味を持ったりで、Rubyという言語そのものへの関心が一段と強くなっているのを感じています。

他の言語としてはRubyほど深く学べていないこともあって、キーワードがあまり出なかったのですが、

  • TypeScript
  • React
  • Go
  • C

などに興味があって、実務で触れる機会が多くなるであろうと想定されるJS関連の勉強を厚めにしています。

GoとCは触りたいという興味ゆえにリストに上がっているけど、本当に浅い部分でしか手が出せていない。

考え方の土台として突き詰めていきたい分野

これは6月に集中的に取り組むと決めているCSとアルゴリズムのことです。

1ヶ月で学べることなんて限られているので、本当に基礎を触っている状況ですが、CSやアルゴリズムを意識したパフォーマンスと質の良いコードを自分なりに書けるようになりたいと野心?を抱きながらちょっとずつ勉強しています。

Ruby Kaigiで買った研鑽Rubyプログラミングを毎日数ページずつ読んでいると、トレードオフという言葉が何度も出てきてCSの観点に通ずるものがあって読んでいて面白い。 あと、サンプルコードがかっこいい(今の自分から見た感想)

今は仕事から離れて純粋に学びたいことに集中できるご褒美期間だと考えているので、学生に戻った気分で仕事に直結するかは分からないけど自分の考え方の土台になってくれそうな分野をしっかり吸収したいなと思って取り組んでいます。

開発手法について

ここは自分がPMを経験していたことによる部分が大きいです。

プロジェクトを良い形で進行させたいという気持ちがとても強く、働いていた時もそれが自分の中での優先順位として常に上位にありました。

どういう進め方が良いかというのは状況によりけりだと思うので、言葉にするのが難しいのですが、

  • コミュニケーションを丁寧にとる
  • 言うべきことを論理的に説明する
  • 言わなくていいことは言わない
  • 自分が背中を見せる
  • 楽しむ
  • 譲ってはいけない部分を明確にし、すり合わせを怠らない

とか結構マインド的な部分が多くて、これをもっと理論に乗せた形で言語化・仕組み化したいな〜と漠然と思っています。

(上につらつら書いていたことが全て自分は実践できていたとは言えない・・・)

まとまらないまとめ

うまくまとまっていない為、何が言いたいのかよく分からないブログになっていますが、現段階でマインドマップにキーワードを挙げて自分がなりたいエンジニア像を言語化するならば以下のイメージです。

  • ビジネス寄りの目的思考として(なりたいエンジニア像)
    • 一人で3人分のコードを書けるくらいの開発スピード
    • 品質の高いコードを書ける
    • パフォーマンスを意識したコードが書ける
    • お客様ときちんと会話ができて合意を得ながら開発ができる
    • チームビルディングもやる
  • 自分の探求として
    • CS寄りの勉強
    • OSS

先輩エンジニアの皆さんのお話もいろいろ聞いてみたい。

チェリー本第7章の改札機の例題に機能追加をするモブプロを開催した

昨年Rubyの勉強に入りたての頃、FBC卒業生のふーがさんが主催するりんどく.rbという輪読会に参加していました。

自分が初めて参加した時、ちょうどチェリー本の第7章の例題である改札機のプログラムにSuicaを使う場合の機能追加のモブプロをやっていました。

fuga-ch85.hatenablog.com

1年経って、FBC内で開催されているチェリー本輪読会に改めて参加をしているのですが同様にチェリー本題7章を読んでいる段階です。

改札機の例題を終えたタイミングで1週間お休みの期間があったため、ふーがさんがやられていた機能追加のモブプロを改めて自分で開催してみることにしました。

計3日かけて開催したため、ふーがさんのブログとリポジトリを参考にどのように進めたかをまとめておきたいと思います。

Day1

初日はいきなりコードを書くことはせず、Suicaとは何か の認識を参加メンバー同士で合わせるところから行いました。

HackMDというドキュメントツールを使ってみんなでSuicaの詳細を書き出していきました。

例えば以下のように箇条書きで書いていきました。

  • お金をチャージできる
  • チャージしたお金で電車に乗れる
  • チャージした金額が足りないと改札から出られない
  • Suicaにお金が入っていないと改札に入れない
  • Suicaを使って買い物ができる

書き出した後は、まずは参加者同士で共通している部分を抽出していきました。

その上で今回の機能追加で実現したい ゴール は何かを話し合いました。

今回は以下をゴールに設定しました。

  • Suicaで乗車と降車ができること

そのため、みんなで書き出した「Suicaとは」の中でどの要素が実装に必要かを考えて、要件に入れる入れないを決めていきました。

最終的に実装の要件に置いたものは以下になります。

  • チャージできる
    • 手動チャージ◎
  • 電車に乗れる
    • 0円だと改札に入れない◎
  • 乗車時に残高が減る
    • どのタイミングで減る?
      • 降車時

最後にTDDで実装をするために考えられるシナリオをまとめました。

合計8シナリオをテストしながら実装する形になりました。

シナリオ

シナリオ1(1区間)

  • Suicaの残高が1000円
  • 梅田で入場し、十三で出場する
  • 期待する結果:出場できる
  • 期待する結果2:残高が840円になる

シナリオ2(1区間・残高不足)

  • Suicaの残高が100円
  • 梅田で入場し、十三で出場できない
  • 期待する結果:出場できない
  • 期待する結果2:残高が100円のまま

シナリオ3(1区間・チャージする・境界値1)

  • Suicaの残高が0円
  • 160円をチャージする
  • 梅田で入場し、十三で出場できる
  • 期待する結果:出場できる
  • 期待する結果2:残高が0円になる

シナリオ4(1区間・チャージする・境界値2)

  • Suicaの残高が0円
  • 159円をチャージする
  • 梅田で入場し、十三で出場できない
  • 期待する結果:出場できない
  • 期待する結果2:残高が159円のまま

シナリオ5(2区間)

  • Suicaの残高が190円
  • 梅田で入場し、三国で出場する
  • 期待する結果:出場できる
  • 期待する結果2:残高が0円になる

シナリオ6(1区間)

  • Suicaの残高が160円
  • 十三で入場し、三国で出場する
  • 期待する結果:出場できる
  • 期待する結果2:残高が0円になる

シナリオ7(残高0円)

  • 入場できない

シナリオ8(チャージ)

  • マイナスの金額はチャージ不可

Day2

二日目はついに機能追加の実装に入りました。

今回は私自身がモブプロ開催が初めてだったため、自分で進行役とドライバーを務め、参加者みんなで意見を出し合いながら実装をしていく形にしました。

TDDで進めることにしたため、一番初めのクラスやメソッドが定義されていない段階でテストがちゃんと落ちた瞬間にみんなで「よかった!」みたいに喜んだのがちょっと印象的でした。

まずはシナリオを実現するテストを書いて、テストが落ちたらどうやって実装するかをみんなでワイワイ会話しながら試行錯誤しました。

Day1に出したシナリオに沿ってDay2は以下の実装を行いました(大元のサンプルコードは省略)

# lib/suica.rb

class Suica
  attr_accessor :balance, :stamped_at

  def initialize(balance)
    @balance = balance
  end

  def stamp(name)
    @stamped_at = name
  end
end
# lib/gate.rb

def enter_by_suica(suica)
    suica.stamp(@name)
  end

  def exit_by_suica(suica)
    fare = calc_fare(suica)

    suica.balance -= fare
  end
# test/gate_test.rb

def test_umeda_to_juso_by_suica
    suica = Suica.new(1000)
    @umeda.enter_by_suica(suica)
    assert @juso.exit_by_suica(suica)
    assert_equal 840, suica.balance
  end

  def test_umeda_to_juso_by_suica_when_balance_is_100
    suica = Suica.new(100)
    @umeda.enter_by_suica(suica)
    refute @juso.exit_by_suica(suica)
    assert_equal 100, suica.balance

  end

Day2はテストシナリオ2の途中で終わりました。

Day3への宿題として、Suica残高から運賃を引いた際にマイナスの金額になってしまう問題を考えることになりました。

Day3

三日目は前回の宿題であったSuica残高から運賃を引いた際にマイナスの金額になってしまう問題を考えることからスタートしました。

問題自体はみんなで話し合ってスムーズに解消できました!

その後、残高から運賃を引く処理をGateクラスが持つべきかSuicaクラスに持たせるべきかを一度立ち止まって考えました。 (実装当初はGateクラスが減額の処理を行なっていた)

最終的にはSuicaクラスで減額用のメソッドを実装する形で進めたのですが、その理由は以下になります。

  • 今回のゴールはSuicaで電車に乗れること
  • 仮にSuicaで買い物をする機能を追加する場合にGateクラスが減額処理まで行なっていると、買い物時はその処理を呼び出せない

今回のゴールは「Suicaで乗車と降車ができること」なため、Gateクラスで処理をしてしまうことも可能ではありましたが、各クラスの責務を整理してSuicaクラスで実装することにしました。

TDDはペースが掴めるとスムーズに進められる&既存の処理を修正した際にテストが通るか落ちるかでチェックができ、それをモブプロを通じてみんなで共有できたことがとても良い体験でした。

最終的なコードは以下のリポジトリに反映させました。

github.com

まとめ

今回、機能追加のモブプロを通じて、みんなで意見を出し合いながら開発をすると

  • 自分にはない視点が得られる
  • 意見を出し合いながらコードを見直すことでだんだん良いコードになっていく流れを共有できる
  • ワイワイ楽しい!

など一人でコードを書いているだけだと得られない経験ができました!

参加してくださったFBC生の方もありがとうございました!

また頃合いを見て別のテーマでモブプロを開催したいなと思っています。

5月の振り返り〜気づいたら色々やっていた

フィヨルドブートキャンプで学習真っ只中だった時は必ず日報を書いていたのが、自作サービスをリリースして何も書かなくなってしまい、どこかしらに記録をしておきたいな〜と思い1ヶ月の振り返りを書くことにしました。

自作サービス

フィヨルドブートキャンプの卒業課題である自作サービス。

4月末に提出はしていて、いただいたフィードバックを参考にゴールデンウィークはずっと修正をしていました。

不安になったり焦ったり喜んだり感情がジェットコースターのように変化しながら取り組んだ自作サービス・・・

数週間経って冷静に振り返るとやっぱりWebサービスを作っていくプロセスはやりがいがあるなというのと、エンジニアとしてjoinできる現場にご縁を見つけてチームで何か作る経験をもっとやりたいなと思いました。

maimux2x.hatenablog.com

チーム開発

フィヨルドブートキャンプで約4ヶ月取り組んでいたチーム開発。

github.com

合計で12個ほど担当していました。

自分は自作サービスと並行してチーム開発に取り組んでいたため、最後のPRがマージされたのは自作サービスのリリース後、つまりフィヨルドブートキャンプを卒業してからという謎なタイミングになってしまったのですが、メンバー同士のレビューや実際に稼働しているFBCのサービスに対してPRを出して開発・リリースをしていく流れはとても楽しかったです。

前にチーム開発と自作サービスのどちらが楽しいですか?みたいな質問を見かけた気がするのですが、どっちも楽しかった!(&ハマって辛かった時もあった)なという感じです。

RubyKaigi

これはもう、とにかく現地に行ってよかった。

技術に対するモチベーションが刺激されまくって、帰ってきてからも振り返ると色々取り組みまくっていました(後述)。

maimux2x.hatenablog.com

RailsGirlsのドキュメント更新

RubyKaigiから帰ってきて、まず取り組んだのがRailsGirlsのドキュメント更新作業です。

RubyKaigi参加前はひたすら自分で翻訳してPRを出していたのですが、一緒にやりませんか?とフィヨルドブートキャンプ内とブログで呼びかけたら本当にたくさんの方が協力してくださり、とても嬉しかったです。

maimux2x.hatenablog.com

OSS活動の入り口にもなるし、RailsGirlsに今まで馴染みがなかった方とかにも関わるきっかけになったんじゃないかと勝手に振り返っています。

自分はRailsGirlsを経て勉強している身ではなく偶然ドキュメント作業に関わるご縁をいただいた次第で、なんで継続的にドキュメント作業をやっているのかというと、RailsGirlsのガイドはRailsチュートリアルだと取り組むのがちょっと難しいというレベル感の方とかが始めに読むと入ってきやすいのではと思っていて、学習初期は中々Webサービスの開発の流れを知れる情報に辿り着けないため(自分がそうだった)、ちょっとでも学習の助けになるんじゃないかと思った部分があるからです。

シンプルでわかりやすい内容なため、身近にプログラミングに興味がある方がいたらぜひガイドをシェアいただけると嬉しいです。

railsgirls.jp

LT発表

フィヨルドブートキャンプ内でRubyKaigiの振り返りを話すイベントがあり、そこでLTをしました。

テーマは「カンファレンスを120%満喫するために種をまこう!」にしました。

RubyKaigiに現地参加するにあたって自分がどんなことを意識して事前に行動したかを話したのですが、発表後に様々な感想をいただけて嬉しかったです。

speakerdeck.com

ただ、ちょっと反省している部分もあり、計画を立てて行動したのは事実だけど得られるメリットだけを考えて行動したわけではなく、結果よりも自分の中にやりたいというモチベーションがあった、それぞれの取り組みを楽しんでいた、関わってくださる方への感謝・・・諸々伝えきれなかったな・・・と感じたりしています(考えすぎ?)

反省点はあくまで自分が発表後に思ったことで、そういった部分も含めて伝えられるように今後も意識していきたいと思いました。

CS50の動画で学習中

ハーバード大学が提供しているコンピュータサイエンスとプログラミング技術を紹介するコースで日本語字幕付きの動画が無料で閲覧できます。

前から存在は知っていたのですが、フィヨルドブートキャンプでの学習がひと段落したタイミングで特定のプログラミング言語の学習から少し離れて、開発全般に関わる課題解決の考え方みたいな部分をもっと鍛えたいなという思いがあって見始めました。

cs50.jp

今はまだレッスン4のあたりで序盤なのですが、段階を経てとても分かりやすく・面白く解説されていてコンピューターサイエンスの基礎に触れるにはとても良い内容だと感じています。

アルゴリズムと数学の勉強

CS50の動画での学習に関わる部分ではあるのですが、RubyKaigiに参加して処理速度の改善だったりアルゴリズム的な考え方をもっと深掘りたいなと思いました。

あまり数学は得意ではないのですが、フィヨルドブートキャンプの卒業生にアルゴリズムの本でよかった一冊を教えてもらって、数式と睨めっこしながら勉強中です。

数式や考え方でわからない部分はYouTubeで数学の講義を見てみたり、chatGPTを使って調べながら腰を据えてやっています。

コードを書く部分でもうまく取り入れたいと思って、AtCoderの問題を解いたりもしています。

ルービックキューブにはまる

RubyKaigi後にTwitterルービックキューブを楽しまれている方を何名か見つけ、面白そう!と思ってやり始めたら見事にハマりました! 気がつくとずっとやってしまうため、程々の距離感で揃え方を身につけていますw

現状、安定的に完全一面が作れるようになってきた!

まとめ

5月は自作サービスのリリース、フィヨルドブートキャンプの卒業、RubyKaigiという大イベントがたくさんあってかなり濃い1ヶ月でした。

こうして書き出してみるとKaigi effect?なのか、思った以上に色々やっていて充実していたな〜と思います。

6月は少し落ち着いてCS50の講義視聴とアルゴリズムの本を読み進めることをメインに勉強は頑張ろうと思っています!

あと、梅雨なので紫陽花見にいきたい!

Rails Gilrsのドキュメント更新一緒にやりませんか?

4月から少しずつRails Girlsの英語のドキュメントを日本語にしていくお手伝いをしています。

▼英語版ガイド guides.railsgirls.com

▼日本語版ガイド railsgirls.jp

日本語版について、まだ未翻訳の部分が残っていたり、CSSやJSも見直せそうな箇所があったりするため、一緒に更新作業をやりませんか〜という思いを込めて手順をまとめておきます!

リポジトリをforkする

github.com

ローカルにcloneする

$ git clone https://github.com/自分のアカウント名/railsgirls.jp.git railsgirls
$ cd railsgirls

issueを立てる

何について対応をするかが分かるようにissueを立てます。

github.com

ブランチを切ってローカルで修正する

$ git checkout -b ブランチ名

localhostで確認する

修正が完了したら以下のコマンドを実行します。

localhost:4000にアクセスして、ブラウザ上で修正内容を確認します。

$ bundle exec jekyll serve --watch

コミットする

$ git add .
$ git commit -m 'コミットメッセージ'

remoteにpushする

$ git push origin <ブランチ名>

PRを作成する

issueのリンクを貼って作業内容を簡潔に記載します。

翻訳の相談やフィードバックはRails Girlsのslackでやりとりが可能です!

※もしも直近でslackへのご参加を希望される方は自分にTwitter経由でDMをいただけると幸いです。招待リンクをお送りします!

まとめ

もし更新作業に興味がある方がいましたら、お気軽にTwitter等で話しかけてください!

Railsでアプリを作成する一連の流れの基本を知ることができるドキュメントなため、現在Railsを学習中の方で学んだ内容を整理するのにも良い機会だと思います〜!

RubyKaigiに初めて現地参加した

2023年5月11日〜13日の三日間、長野県松本市で開催のRubyKaigiに初めて現地参加してきました。

発表内容はほとんど分からなかったけど、現地参加して良かったというのが終わった後のシンプルな感想です。

帰りの新幹線を待っている間にざーっと振り返りをまとめておく。

発表について

最初に書いた通り、発表内容全体をきちんと理解できたものはないです!

もちろん部分的に分かるとかはありましたが、90%は???でした。

分かることを聞くのではなく、分からないことだらけなんだな~という気持ちを受け止める前提で参加しました。

それもあってか、発表を聞き終えた後は自分はこれからどんな風にRubyと関わっていこうかみたいなワクワクした気持ちが生まれています。

3日目の最後に正規表現マッチングについて発表されていたFUJINAMIさんと帰り道が偶然一緒になり、少しだけお話しできました。

今の自分は正規表現をどう書くかみたいなところに視点が行ってしまい、マッチングの処理なんて考えたこともなかったのですが、RubyKaigiに参加することで、Rubyの様々な機能がどんな人たちによってどんな風に実装されているのか、どんな風に試行錯誤されているのかを知ることができ、それが一番の収穫だったんじゃないかなと思いました。

(正規表現、ひたすら苦手意識しかありませんでしたが処理の部分のお話を聞いてFUJINAMIさんの発表スライドを分からないなりに読み直したり、苦手で終わらせないようにしようと少しやる気が湧きました)

オフラインでたくさんの方々とお話できた

私はオンラインでプログラミングを学習してきたため、ネット上でやり取りはあったけれどRubyKaigiで初めましての方がたくさんいました。

フィヨルドブートキャンプの受講生や卒業生、メンターの方々、コミュニティでお話したことのある方々…たくさんの方に直接お会いすることができました。 また、遠い存在だと感じていた登壇者の方々にも勢いで話しかけることができました!

(前職の開発チームメンバーとも再会できて嬉しかった!)

特に、私はRubyKaigiの前日にフィヨルドブートキャンプの卒業課題である自作サービスをリリースして卒業したばかりで、このタイミングでお世話になったメンターの方々に直接お礼をお伝えできて良かったです。

一年後に向けて

来年のRubyKaigiは沖縄開催と発表されました。

願わくばエンジニアになって参加している自分でありたい。

今回のRubyKaigiに参加して、たくさんの発表を聞いて、たくさんの方とお話して、改めて今後のことを考え目標も持つことができました。

まずはキャリアチェンジという目標の実現、生きているコードにたくさん触れて自分も開発を続けることを頑張っていきたいと思います。

自作サービスのリリースとRubyKaigiの終了が同じタイミングだったのでバーンアウトが心配でしたが一晩明けて冷静に気持ちを整理できたので、日常に戻ってコツコツやれることを積み上げていきます!