Rubyist近況 Advent Calendar 2021: 近況報告 + 今年一番お世話になったメソッドにお礼を言いたい

Rubyist近況 Advent Calendar 2021 12日目の記事です。
昨日は@miyohideさんのRubyもJavaも楽しく学ぶ でした。


近況ということで2021年を振り返ってみたいと思います。

仕事

現職で働き始めて3年が経ちました。
変わらず英語塾で学習管理システムのバックエンド開発を担当しています。

昨年 (2020年) 達人プログラマーエクストリームプログラミングClean Agileと立て続けに素晴らしい書籍を読んだため、この経験を仕事で活かせないかな〜と思い今年からカリキュラムチームの定例ミーティングに参加させてもらうようになりました。
より現場に近いカリキュラムチームと一緒に仕事をするようになったことで、(今更ですが) システムだけではなくお客様に提供するサービス全体を自分 (たち) の作るプロダクトとして考えることができるようになった、というのが自分にとっての今年一番大きな進歩ではなかったかなと振り返っています。
開発の進め方にも自分の中に軸のようなものが生まれたように思います。

また、ちょうど一年くらい前に開発チームメンバーが3人増えて賑やかになりました。
一方ご時世柄もあり全員リモート勤務なので、お互いが何をやっているのかわからない状況が発生しないよう、メンバーや上司の発案で毎日雑談タイムを設けたり、毎週技術書の読書会をしたり、週次で皆の動きを振り返ったりしています。
ただコミュニケーションの方法は人それぞれだし、そもそも自分自身もあまり得意な方ではないので、今より更に良くできる余地はありそう。
とはいえ、一緒に働く人たちと上司がいつも本当にniceなおかげで楽しく仕事しています。
前述のカリキュラムチームも含め、周りの人々からは引き続き学ぶことばかりです。

今現在はこれからのサービス展開に向け、これまで経験した中でも一番大がかりな仕事の真っ最中です。
これはまだしばらくかかりそうなので、来年も引き続きがんばります。

仕事以外

憧れのRubyKaigiに登壇しました!!!!
というのが今年一番大きな出来事です。

coe401.hatenablog.com

詳しくは↑の記事に書いたので、ここではそれ以外のことを…

  • 3月、Fukuoka.rb 200回 LT大会 (#202)で喋りました
  • 2~4月くらい、プログラミングElixirをお供にElixirの勉強をしていましたが、わたしにはまだ早すぎた感がありました
    • ただ、おかげでRubyのパターンマッチにちょっと親近感が湧きました
    • なお、プログラミングElixirはまえがきとあとがきも最高でした…
  • 4月、1月から読み始めたLinuxプログラミングインターフェース(1604ページ)を読み終えました
    • これを読んで何かを作ろうという段階ではないのですが、困ったらとりあえずこの本、というお守り代わりにしようと思っています
    • 2021年の目標は「LPIを読む」だったので達成できて嬉しいです
  • しばらく趣味の喫茶店を控え目にしていたのですが4月、感染状況の様子を伺いつつ銀座のカフェ・ド・ランブル行きました
    • Asakusa.rbでおすすめしてもらいました
  • 5月、キッズドアのマンスリーサポーターになりました
    • わたしは自分自身が子育てに関わっていないので、自分の周りの親御さんたちの奮闘を (主にTwitterで) 陰ながら応援するくらいしかできないのですが、その分世の中のお子さんたちへ、わずかながらでも自分にできることができたらいいなと密かに思っています
  • 5~6月、マスタリングTCP/IP 入門編を読み直したら学びしかなくてびっくりしました
    • 今年は一年通じてずっとTCP/IPプロトコルスタックのことを考えていましたが、一方で全然専門的な領域に入っていくまでに至っておらず、その点については若干焦りもあったりしています
  • 6~9月、RubyKaigiの準備で記憶がない…
  • 9月以降はRubyKaigiの余韻にひたりつつdRubyに入門していました
  • 10月、2019年から運営として関わっていたTama.rbが最終回を迎えました
  • さらに10月、Kaigi on Rails 2021に一参加者として参加しました (重言)
    • 今年の貴重なRuby (Rails) 関連のイベントだったので、楽しくお話を聞いたり登壇される方の応援をしたり懇親したりしました
  • 10月以降、感染状況が少し落ち着いているので、今のうちということで週末に趣味の喫茶店に出かけたりしています
    • 出かけた先の街をぶらぶら散歩するのが最近の趣味です。川にも行きました
    • 気づいたら上京して3年を超えていましたが、半分自粛生活だったので全然実感がなく、いまだにどこに行ってもおのぼりさん状態です
  • 11月、大江戸Ruby会議09 出前Editionにこれまだ一参加者として参加しました (重言2)
    • 最っっっ高のイベントでしたね
    • Asakusa.rb 第634回 (キリ番) ミートアップ開催おめでとうございます
  • 12月、Ruby3.1リリースを前に話題のRuby関連技術書(研鑽Rubyプログラミング β版プロを目指す人のためのRuby入門[改訂2版])が2冊も出版され、それぞれ楽しく読んでいます
  • 今年いつの間にかFukuoka.rbのconnpassページの管理者に追加してもらっていました
    • Fukuoka.rb 第234回 (キリ番) ミートアップ開催おめでとうございます
  • 今年 (も) 上記した本含めてたくさん本を読みました。そのうち多くの本を周りのRubyistの人々におすすめしていただきました
    • その節は本当にありがとうございました
    • 特に@udzuraさんと@takkanmさん!!
      • 他にも「この本はxxさんが良い本と仰っていたな〜」という記憶を頼りに本当は一冊一冊紹介したいくらいなのですが、さすがに書ききれなくなってしまうので控えます
  • 今年も相変わらずAsakusa.rbとFukuoka.rbによくいました。他の地域Rubyコミュニティミートアップにもたまにいます

ということであっという間に思えて実は色々あった今年も相変わらずRubyでお仕事をし、Rubyコミュニティにいて、Rubyが好きです。
RubyRubyistの人々には2021年もたくさんお世話になりました。
プログラマとして過ごす生活の中で自分が本当に好きだなと思える言語や言語コミュニティがあるというのは幸せなことだなと思います。

そんな訳でせっかくなので、今年自分が書いたRubyプログラムの中で一番お世話になったメソッドにお礼を言うことにしました。

といっても、業務も含めて実際に書いたコード全てを集計して一番お世話になったメソッドを見つけるのはさすがに大変です。
わたしは毎日「その日新しく知ったこと」をtilというリポジトリにまとめているのですが、この中には練習のために書いてみたコードや写経したコード、イベントのために書いたコードなども入っています。
なので今回はこのtilリポジトリ内のコードを対象に集計することしました。

github.com

要件は次の通りです。

  • 今年初め(1月1日)からこの日記を書いた12月3日までの間に更新されたファイルを対象に、各ファイル内で実行されているメソッドごとの実行回数を集計する
  • その中でも特にお世話になった (リポジトリの中で実行回数が多かった) メソッドを20個、降順に取得する
  • 明示的にソースコード中で呼び出したメソッドだけではなく、Ruby自身がコードの裏側で実行しているメソッドも対象に含める

ただし、そのままでは実行が難しかったものがあったのでいくつか条件をつけました。

  • 無限ループが含まれるコードがあるため、実行時間が5秒以上かかったファイルは例外を上げて次の処理に移る
  • 特定の条件付きで実行することを想定して書かれているコードがあるため、実行時に例外が発生した場合は例外を上げて次の処理に移る

集計のために書いたスクリプトは以下の通りです。

til/counter.rb at master · shioimm/til · GitHub

require 'timeout'

files   = ARGV
counter = Hash.new { 0 }
trace   = TracePoint.new(:call, :c_call) { |tp|
  counter["#{tp.method_id} (#{tp.defined_class})"] += 1
}
$stdout = File.open(File::NULL, 'w') # ファイル実行中の出力を抑制する

files.each do |file|
  f = File.open(file, 'r')

  begin
    Timeout.timeout(5) {
      trace.enable { eval f.read }
    }
  rescue StandardError, LoadError
  end

  f.close
end

$stdout = STDOUT # 出力を元に戻す

most_used_methods_20 = counter.sort_by { |_method, count| count }.reverse.first(20)

pp most_used_methods_20.to_h

(もっと良い方法があるかもしれないので、識者の方に突っ込みをいただきたいです…)

取得したメソッドのうち、一番お世話になったメソッドには次の通りお礼を言います。

# ...
puts "#{most_used_methods_20[0][0]}、本年は大変お世話になりました。\n来年もよろしくお願いします。"

早速実行してみました。

$ find ~/til -name *.rb -newermt '20210101' | xargs ruby ~/til/activities/20211212_rubyist_advent_calender/counter.rb

すると、次のように結果が出ました。

{"+ (Integer)"=>3131838,
 "up (Counter)"=>40000,
 "synchronize (Thread::Mutex)"=>21471,
 "method_added (Module)"=>3054,
 "-@ (String)"=>2560,
 "initialize (Thread)"=>2046,
 "new (#<Class:Thread>)"=>2046,
 "sleep (Kernel)"=>1775,
 "wait (Thread::ConditionVariable)"=>1767,
 "sleep (Thread::Mutex)"=>1767,
 "data (Gem::StubSpecification)"=>1468,
 "file? (#<Class:File>)"=>1372,
 "% (String)"=>1316,
 "chr (Integer)"=>1312,
 "+ (String)"=>1260,
 "to_s (Symbol)"=>1182,
 "rand (Kernel)"=>1068,
 "write (IO)"=>970,
 "=== (Module)"=>895,
 "current (#<Class:Thread>)"=>871}

ということで、2021年わたしが一番お世話になったメソッドはIntegerの+でした!
おそらくこのファイルの実行によって数が増えたものと思われます。
https://github.com/shioimm/til/blob/master/practices/ruby/concurrency/benchmarks/20210131_bench.rb

その他のメソッドについても、今年前半に勉強していたスレッドプログラミング関連のものが多そうです。

ベンチマークスクリプトの中で使用していたメソッドなのでだいぶチート感がありますが、お世話になったことに変わりはないので+には早速お礼を言いました。

+ (Integer)、本年は大変お世話になりました。
来年もよろしくお願いします。

以上、「Rubyist近況 Advent Calendar 2021: 近況報告 + 今年一番お世話になったメソッドにお礼を言いたい」でした。
明日は@s01さんです。

それでは皆さん楽しいクリスマスをお過ごしください🎄🍰