2022年学んだ技術

Mapbox Japan Advent Calendar 25日目の記事です。今年学んだ技術を書いていこうかなと思います。技術というかコンセプトやツールを多く学んだ1年だったかもしれません。ただそれらも「Technology」に括ってよいはずなので、メモしておきます。

Go

ISUCON の本選の実装を担当した関係で、今年一番学んだ言語は Go でした。

Go そのものはほとんどはじめて利用しました。数年前に少しだけ当時所属していたプロダクトのコードを修正するために利用したことはありましたが、1から全面的に利用したのは初めてでした。

まず環境を構築するところからはじまり、プロジェクト作成、基礎文法の習得、ISUCON 専用のライブラリの使い方を覚えました。

プロジェクトの作成をするために、cargo のように簡単にテンプレートを用意できるといいなと思って、Go の練習も兼ねて下記のようなツールを作ってみました。このツールの作成の過程では Cobra というコマンドラインツールを簡単に作ることができるパッケージを利用しました。

ISUCON 本選での実装の詳細などは下記の記事にまとめました。

評判通り文法のキャッチアップと一通りコードが書けるようになる(つもりになれる)までは早かったですね。体感だと Swift を覚えたときとそんなにスピード感は変わりませんでした。

一方で、覚えた後さらに特定の機能、メソッドやパッケージの細かいローカルルール(ワークアラウンド)を覚える旅がはじまり、むしろそちらの方が難しかったかもしれません。ゼロ値の挙動などは、そういう仕様があると知らないとそもそもデバッグすら困難だなと思いました。

というわけで、Go の学習コスト(この言葉嫌いですが)が、他のプログラミング言語と比較してとりわけ低いとは思いませんでした。ある程度使える気持ちになるまでは早いが、その後は結構覚えることが多そう。ただ、早い段階では難しさはやってこないので、挫折しにくいプログラミング言語かもしれませんね。

OS

オペレーティングシステム、です。昔 Writing OS in Rust を読んで作ったことはあったのですが、改めて教科書を読み直してみました。より理解が深まった気がします。

下記の本は今年発売されたものですが、コンテナなどの話題もキャッチアップできていい本でした。

余談ですが今年は大学で使われるような教科書を買ってきて何分野か読むことにハマっていました。教科書は意外とコスパがよく情報も網羅的なので、特定のトピックを学びたいとなった際に何冊か読むのが好きです。今はリレーショナルデータベースの教科書を読もうとしています。

日本語の教科書か英語の教科書かでいうと両方利用するとよいと思います。日本語の教科書はコンパクトに情報がまとまっていることが多く、その分野について概略を日本語の教科書で掴んだ後に英語圏の教科書を読むとよいと思います。

アルゴリズム

アルゴリズムの勉強を今年は多くしていました。

私がけんちょんさんの記事のファンということもあり、数年前に買って途中で中断していたけんちょん本をまずは年初にやりました。書籍のコードは C++ で書かれていましたが、Python に書き直してみました。

最初はコーディング面接のために始めたアルゴリズムの勉強ですが、さまざまなアルゴリズムを勉強するにつれてだんだんおもしろくなってきて、いつの間にか毎日何かしらの問題を解いている状態になってきました。とくにおもしろいなと思ったのがパズルを解く際にアルゴリズムの知見を使えるという点で、下記の本は少し流し読みした程度ですがおもしろかったです。

将来的にはこうしたアルゴリズムを使って業務で直面する問題をスマートに解決するみたいなことをしてみたいなと思っています。最近だとスプラトゥーンの対抗戦の日程調整マッチングが大変でしたが、これは実は安定結婚問題で、Gale-Shapley で解けるんじゃないかと思ってせっせか実装していたりします。このように普段の意外と生活でも役に立てられる話なので学んでいて楽しいです。

AB テストと統計的因果推論

今の仕事で AB テストの基盤を扱うことになったので、再び最近勉強し直していました。データサイエンティストではないため直接実務で扱うことはないのですが、基盤を作る以上、たとえばデータモデリングなどをする際にドメイン知識が必要になるので、きちんと勉強してみています。

前職がそれなりに AB テストなどを盛んにやっていた関係でキーワードは知っていたので、それに沿った本を買って読んでいました。最近ですと下記2冊でしょうか。

因果推論は前職でとても熱く語られていた印象で、飲み会の席などで概要を聞いてはいました。因果関係は哲学的には古くて新しいテーマで、因果関係の同定ができるのだとしたら相当すごい発明だなと思いました。ヒューム周りの話とかどうするんだろうとか。が、体感的には因果推論という言葉が正しいくらいの感覚でしょうか。

私も一応大学の副専攻で統計学が必要だったので授業で取ったのですが、そのとき「相関しているかどうかまではわかるけれど、因果関係まではわからない」みたいなことを授業の最初の方で習った記憶があります。それとは隔世の感があります。広告のように大量のデータがあるからこそ成せる業。

Verilog と自作 CPU

大学の教科書らしき本で面白いものがあって、それに取り組んでいたので Verilog を使いました。いわゆる論理回路を実装して CPU を作り、専用のアセンブラを作り、その上で C 言語のサブセットを動かしてしまおうというような内容です。

昔 Chisel で RISC-V の CPU を作ったことはあって、その時に HDL の基礎的な概念は抑えていたのですらすら入ってきました。個人的には Scala で HDL するのは、まず言語がリッチすぎてコンパイルが遅いし、 IDE もそれなりにメモリを食うし、そもそもビルドツールがあんまり好きじゃないというのがあって、Chisel はそこまで熱い気持ちは抱きませんでした。

Verilog は専用の言語ということはあり、Verilog だけ覚えればあとはなんとかなってしまうというのは大きいかもしれません。Chisel の場合は Scala を覚えつつ、さらに HDL の利用経験がない場合は、そちらのお作法も覚えなければいけません。それと比較すると、覚える量は少ないかもしれません。

一方でそこまで開発環境が整っている感じがしておらず、VSCode の Language Server はあまりちゃんと動いている印象がないです。これはセットアップの問題かもしれませんが、ツーリング周りはちょっと厳しいかも、と知人から聞いてはいたので、この辺りは課題なのかもしれません。そこまで詳しくないので、適当なことを言っていたらすみません。

来年

アルゴリズムは引き続きやっていると思います。数理最適化に手を出せたらやってみたい。最近は過去の貯金を切り崩して仕事をしているので、何か新しいことにチャレンジしたい。

この記事が気に入ったらサポートをしてみませんか?