今日はReproでの最終出社日。思い返せば 30 歳も過ぎてから Ruby とどう関わっていくかという人生だった。
MacRuby (2010年~)
暇つぶしに Mac OS X のアプリを作ってみようかと思い立った時に出会ったプロジェクトだった。 今のように Swift や clang というコンパイラもなく、 Objective-C 言語というとにかく []
を書きまくらないとならずどうにもなじめなかった。もともと趣味で Ruby はさわっていたのでそれでアプリが作れたら良いのにと思っていたところで、渡りに船的にさわり始めたのがきっかけだった。
私がさわり始めたころはちょっとしたコードを書いてもすぐにクラッシュするような感じで、ちまちま「こういうコードを書くとクラッシュするんだけど何でだろう?」とプロジェクトの issue に書き連ね、気がついたら「こういう風に直すと動くようになるんだけど」とパッチを投稿してた。当時 Apple に在籍していたプロジェクトリーダの Laurent Sansonetti さんやメンバーとワイワイやってたのが懐かしい。
MacRuby がある程度動くようになると、メンバーのひとりが CocoaPods を MacRuby で作り出していた。bundler は既に存在していたが私が普段使ってなかったせいで、最初見たときにはこれが一体何なのか分からなかったが、しばらくたってから本当にスゴイ人達は世の中変えていくんだなと思った。
RubyMotion (2012年〜)
MacRuby をリードしていた Laurent Sansonetti さんが会社を立ち上げて iOS アプリを Ruby で作っていけるようにツールを整備していくというときに声を掛けて貰い参加した。パートタイムで手伝ってくれる方をあわせてもせいぜい 5 名くらい。RubyMotion を通じて知り合う世界中の developer さん達から日々刺激を受けながら、毎日 RubyMotion が出力するバイナリーコードと格闘していた。
RubyMotion 自体は Ruby のソースコードをコンパイルして iOS 向けのバイナリーを出力するコンパイラとツール群。Objective-C で書いたアプリと遜色のない速度で動作していた。
残念ながら 2014年あたりで Swift が発表されて風向きがかわり、Swift 3.0 がリリースされたあたりで会社の収益が完全にとどこおり解散することになった。
Ruby コミッター (2017年〜)
MacRuby / RubyMotion は内部的に CRuby 1.9 をベースに Objective-C の framework を読み込んで利用できるように拡張していた。そのおかげで CRuby のコードは隅々まで読んでいて(parse.y は謎すぎて理解できなかったが)、RubyMotion ではバイナリーコードを読みながら ABI の調整したりパフォーマンスチューニングしていた知見をもとに CRuby のパッチをいくつか投下してたらコミッターに誘われた。
ユビレジ (2017年〜)
iPad のレジアプリを作っている会社で、RubyMotion のユーザーだった youchan さんに誘われて join した。面接の時に「Objective-C と Ruby はわかるけど、Ruby on Rails はやったことないけどだいじょぶ?」「直ぐ覚えてくれれば大丈夫」とか言われた。
技術顧問だった amatsuda さんに無理難題を言われて、1週間で登壇ネタの仕込みと資料作りをしたのは一生忘れない。
来週末、発表しないといけないことをさっき技術顧問から聞かされた・・・。死にそう
— Watson (@watson1978) 2018年9月7日
このころになると本格的に、Rails 以外で Ruby エンジニアをこのコミュニティに引き込むにはどうしたら良いものかと考えるようになっていた(理由は後述)。RMagick をデータ処理のビジュアライゼーション環境にもっていきつつ、Ruby でデータ処理や科学計算みたいな分野に進めたいと思うようになっていた。
このころ rmagick の他に、それを使用した gruff というグラフ作成ライブラリのメンテナも引き受けたりした。 github.com
ユビレジは、軽減税率の対応をすませたときにやりきったなと思い転職した。
Repro (2020年〜)
Repro が機械学習を扱っており、「Ruby でデータ処理や科学計算みたいな分野」と方向性が合いそうだったので入社した。残念ながら、業務でそういったことにふれる機会がないまま機械学習自体がいったん close になってしまった...。
粛々と業務に向き合いつつ、通りすがり的にライブラリの改善なんかを個人的にやっていた。
コロナ禍の制限が解除されて直ぐくらいに Oj の作者が「日本に行くので会おうよ」と言われ飲みに行った。もうすぐ70歳の可愛らしいおじいちゃんで、私も頑張ろうとエネルギーをもらった。
在籍中に Apple が M1 Mac を発表したので Developer Transition Kit に申し込んで市場に M1 Mac が出回るまえに個人的に気になることを検証したりもしていた。
developer transition kit を頼んでみた。
— Watson (@watson1978) 2020年6月26日
Ruby の ffi gem が M1 Mac でまったく動作しなかったので粛々と調査したりパッチ書いたりして、多くの方が M1 Mac を利用する頃にはある程度動くようにした。(CocoaPods とか ffi gem に依存してたり) github.com
Repro ではピーク時に 1分間におよそ 400 万通近くのプッシュ通知を配信しており、大量のイベントデータがサーバへ送られてくる(プッシュ通知以外のイベントデータも別途送られてくる)。それらを捌くために高度に分散処理がされており Kafka がデータ処理の基盤に据えられている。在籍期間の 1/3 くらいは Kafka と Java 言語に向き合っていたように思う。また、データ格納には分散型の KVS である Cassandra なども使われている。
Cassandra と Ruby 間のやり取りがボトルネックになっているコンポーネントがあったので、パフォーマンス改善のために gem も作っていた。導入しきる前に離職することにしてしまったが...
今後
Rails 以外のところから Ruby コミュニティに参加したわけですが、異端児的な私を温かく迎えてくれる環境でした。Ruby を通じてたくさんのすごいエンジニアの方々と出会うことができたのですが、今後もそのような方々と出会っていきたい。Rubyist と会話するのがすごく刺激であり、いろいろな方と出会いたい。なかには、Ruby でキーボードのファームウェア作ってしまうような方だったり、Switch のゲームにこっそり Ruby 仕込ませておいて任天堂に怒られちゃうようなかただったり。そのような方と出会うために Ruby が多様性(Rails 以外のキラーコンテンツができることを願っている)に富むと良いと思っており私も微力ながらそのような活動をしてきた。(Ruby 以外のコミュニティに参加する元気はない。おっちゃんなので)
次の職場はきまってない。とりあえず、3月末までの有休消化期間をだらだらしながら、次はどういった活動をしようか考えようと思っている。