プログラマー2年目の振り返り話


3 月末で会計の仕事からプログラマーに転職して 2 年が経つので、この記事の続きを書く。

大きな進歩は無かったものの、今後の長期的な指針を得られた一年だった。

仕事

仕事では Node.js / TypeScript / GraphQL / React 等を使った Web アプリケーションの開発に関わっていた。GraphQL は使い始めた当初は全く何が起きているか理解できなかったものの、問題にはまって解決することを繰り返していたら朧げながら掴めてきた。

その中でも graphql/dataloader のコードを読んだことはとても勉強になった。詳しくはこのブログにメモを書いたのだが、簡潔で短いコードながら GraphQL のパフォーマンス向上にとって重要な問題を解決している。

graphql/dataloader は Batch と Cache という 2 つの単純な機能で構成されているが、自身が何に責任を果たすかが明確なので GraphQL 新人の自分でも理解しやすかった。一定期間内のリクエストの Batch 処理と結果の Cache は graphql/dataloader がやってくれて、 Batch で実行する処理の内容や Cache インスタンスのカスタマイズはユーザーが自由に行える。

React については最低限の見た目でとりあえず動作する画面なら自分で作れるようになったが、日常的に触るようなよくできたアプリケーションの画面を作るのは難しく非常に困っている。昨年も書いたが CSS が特に難しい…

TypeScript はクライアント側でもサーバー側でも使っているが、同じチームの方が整備した compilerOptions で書くことにより型定義による開発効率の高さを実感できた。

サーバーエンジニア

仕事でビールサーバーの分解洗浄をしていたのだが、その任を解かれたので「サーバーエンジニアです」という鉄板の自己紹介ネタが使えなくなった。会社の経理とか労務的な仕事も引き続きやっている。

仕事で問題にはまる話

普段は在宅勤務で一人でプログラムを書いているのだが、問題にはまりこんで詰まることが多かった。印象的だったのがこれ。

TypeORM の Entity 定義で、 DBMS 側で日付を扱う date 型のカラムに対して Date 型を指定したとき、実際には string にマッピングされているという仕様がある。自分が書くプログラムでは当然 Date 型が入っているとみなしていたので、何故ここでエラーになるんだ…と詰まってしまった。理由や背景が分かれば確かにその仕様で納得できるのだが、自分の偏見(date 型は Date 型にマッピングされているに違いない…)が邪魔して答えに辿り着くのに時間を要した。

次に印象的だったのが、ローカル環境(macOS)でテストが成功するのに CI 環境(GitHub Actions)だと失敗するという事件だった。これが起きる原因はいろいろあり得るのだが、自分が出くわしたのはファイル名の大文字小文字の区別によるものだった。

最近?の macOS のファイルシステムでは大文字小文字を区別しない(Case insensitive)ため、テストコード等で大文字のファイルを小文字でファイル名指定しても読んでくれるが、 CI では Ubuntu を使っていて大文字小文字を区別する(Case sensitive)ので通らなかった。ローカルではテストが成功していたので原因が分からず、解決に時間がかかった。

これは問題の切り分け方がよくなかったと思っていて、ローカルでテストが成功している => CI 環境に”問題”があると考えて見当違いの箇所を調べまくっていた。しかし、人間はよく嘘をつくが CI は嘘をつかない。

これを反省して、「テストが成功している」という事実をもって盲目的にコードを信頼するのではなく「そのテストが具体的にどういった順序で動作し何を証明しようとしているか」を一つ一つ追っていくのが重要だと考えるようになった。そしてローカルの開発環境と CI 環境を揃えるのは大事だ。

反省点

一人で悩む時間が多く、生産性は高くなかった。

何が分からないか分かっている時は「これ分からないんですけど…」と詳しそうな人に聞けるが、そもそも自分が何を理解していないのかを理解していないという状況が多かった。

基礎を固めて適切な質問ができるようになりたい。

個人

何かを作っては途中で辞めるのを繰り返しているのだが、Slack の新しいプラットフォームで使える簡単な用語集を作ってみたら多くの人(…といっても数百人だが)に見ていただいて嬉しかった。

https://github.com/lyohe/swords

これはドキュメントを読みながら 2-3 日で作ったやつで、傲慢な言い方だが「このレベルのアウトプットでも見てくれる人いるんだ」と元気が出た。Deno の体験も素晴らしかった。Slack 社の方にも見ていただいたようで嬉しい。

https://twitter.com/seratch_ja/status/1463322556786614277

技術的な勉強ではないが、個人的にオープンソースのビジネスモデルに興味があって GitLab や HashiCorp など様々な会社の財務諸表を読んでみた。

どの会社も面白いのだが、何よりソースコードを公開してビジネスをやっている会社がこんなにあって市場にも評価されているんだなという印象が強く残った。この記事には書ききれないくらいたくさんの会社を見つけた。

OSS の会社以外にも、気になる会社の決算をすぐ読めるので経理の仕事をやっていてよかった。

技術的な勉強

ここ一年で読んだ技術書としては Real World HTTP が最も印象的で、このブログにもまとめ記事を書いた。

この本は読んだ後もことある度に開いているし、これからも読み返すと思う。HTTP の仕様が歴史を交えて紹介されていて、今の仕組みが何故こうなっているのか背景を学ぶことで関連技術の理解にとても役に立つ。XMLHttpRequest は何が XML なんだよと思っていたが、この本で理由を知った。

新しい言語としては、 Ruby にちょっとだけ手を出して Rails チュートリアルをやってみた。Web アプリケーション開発 RTA という印象で、とにかく驚くほど早く動くものができるのでそりゃ流行るだろうなと感じた。

あとは Rust の TRPL と呼ばれている入門書や Go のチュートリアル A Tour of Go 等もやってみた。

新しいプログラミング言語に手を出した理由としては JavaScript/TypeScript に加えてもう一つくらい言語を身につけたいと考えていたからで、いろいろ試した結果として今のところ最有力候補が Go になっている。文法や基本的な仕組みがとてもシンプルで、学び始めてからちょっとしたツールを作るまで短くてすむのが非常によかった。

競技プログラミングは 1 年目に半年で挫折して以来ほぼやっていないのだが、そろそろ重い腰を上げて週末のやつに出ていきたい。これ去年も書いてた気がするのでかなり腰が重い。特に目標は立てず、一種のゲームとして楽しみたいと考えている。

反省点

様々な分野に手を出してみたものの、どれも中途半端になってしまった。使える時間は限られているので、3 年目は核となる一つの目標に集中していきたい。

プログラマーとしての心がけ

2 年も働いているので、最近は駆け出しエンジニアですという言い訳もできなくなってきた。仕事については、以下を気をつけるようにしている。

  • 嘘をつかない

動作確認しましたと言ったらちゃんとやっている。何か聞かれたら知っていることだけを答える。知らないことは知らないと言う。自信のないことは自分の認識を述べた上で自信がないと説明する。

  • 聞く前に調べる

誰かに質問する前に、ドキュメントでもコードでも誰かのブログでも調べられることは調べて自分の認識を構築する。用意されているチュートリアルは全てやる。エラーメッセージやログをよく読む。

  • 層を意識する

目の前のプログラムは何に責任を持つのか、その上下にはどのような責任の層が重なっているか、自分はどの層を把握しているか、または把握していないか、外部のパッケージは何に責任を持つか、エラーはどの層で起こっているのか等、手を動かしながら自分の認識と整合性を確認していく。

全て完璧とは言えないときもあるが、心がけとして忘れないようにしたい。

3 年目の目標

仕事ではやる気を維持しつつ、引き続き様々な技術や知識、メンタルモデルを身につけていきたい。

個人での活動については複数のことに同時に取り組めないのがはっきり分かったので、目標を一つに絞りたい。3 年目の目標は「自作の会計ソフトウェアを作ること」で、そのアルファ版を出すことを目標とする。完成したら OSS として公開したい。

既存の(勘 ○ 奉行や弥 ○ 会計のような)財務会計ソフトウェアを再実装するというよりは、自分が過去に会計の仕事をしていたとき困っていた課題である「ソフトウェアが生成するデータと財務諸表との interface」に集中しようと考えている。

プログラマーに転職した理由がこの「自分で自分の課題を解決する会計ソフトを作りたい」なのだが、そろそろ作り始められそうな気がしてきた。この会計ソフト…というか interface で生きていけるだけの金を稼げるのが理想的だが、まずは作って誰かに使ってもらわないと話にならないので公開することを目標としたい。

最後に

最近読んだこの記事が印象的だった。分野は違えど、自分もこのような道を進みたいと考えている。

3 年目もやっていきます。