2021年の目標
今年でプログラマーに転職して1年が経つので、目に見える結果を出していきたい。プログラムを読む量も書く量も足りていないので、今年はたくさん読み書きしていく。
- AtCoder: レート 400 (茶色)以上になる
- コンピュータ・ネットワークの仕組み: RFC 793 を実装する
- 個人開発: iOS/Web アプリを作って公開して運用する
- ブロックチェーンの仕組み: 簡単なブロックチェーンを自分で作る
- 会計ソフト: 簡単な会計ソフトを自分で作って公開する
3月で32歳になるのだが、35歳くらいまでに健康で文化的な最低限度の生活ができる程度のプログラミング能力を身につけたい。
AtCoder
2020年3月頃に競技プログラミングの AtCoder を始めたのだが、Twitter を眺めていたら半年で心が折れてしまった。Rating は下記の通り。
メンタルが回復してきたので今年はコンテストへの参加を再開しようと考えている。茶コーダーになりたい。今の Rating が 324 なので +76 積む必要がある。しばらくは過去問を解いてリハビリしようかな。
コンピュータやネットワークの仕組み
プログラムを書いていると、「この裏側では何が起きてるんだ?」と不思議に思うことが多い。
例えば「HTTP リクエストを送りレスポンスを解析して○○する」みたいなプログラムは各言語の標準ライブラリ等を使えば簡単に実現できるが、それらが実際に中で何をしているかは理解していなくても動いてしまう。
その中でもネットワーク関連は全く分からなくて好奇心を刺激されたので、年末に「ネットワークはなぜつながるのか」という本を読んでみた。普段当たり前のように使っているコンピューターの裏でこんなことが起きていたのか〜と驚きの連続だった。
特に印象が強かったのは TCP/IP の仕様で、データを分割しながら迅速に欠損なくやり取りするために様々な仕様が定められており(たとえば TCP ヘッダの ACK や SYN、ウィンドウ制御の仕組みなど)且つ普段はそれを意識せずとも使えるということだった。
今年は RFC 793 を参考に TCP の実装に取り組みながら理解を深めたい。全部実装するのは厳しいので、自分が満足するところまでやる。
余談:
私は異業種からの転職で、それも31歳からのスタートなので同世代から大幅な差をつけられている。プログラミングを仕事にしている人が当然持っているような知識や情報が不足しているので、問題が起きたときに解決する手がかりすら掴めないこともままある。そういうとき、コンピューターやネットワークの知識を専門や大学、実務で身につけている人を羨ましく思うことがある。
下記のブログでも同じような話があったが、読んでいて自分の力不足にかなり危機感を感じた(この方も異業種からの転職だが結構すごい)。
このような焦燥を解消するにはプログラムを読んで書いていくしかないと考えているので、時間があれば TCP 以外のプロトコルを RFC を読みながら自分で実装したり OS やブラウザにも手を出してみたい。プログラムを書くネタはいくらでもあるので後は書くだけです。
個人開発
年末に React Native と Expo を触っていたのだが、余りに簡単に iPhone で動くアプリが作れてしまうので感動してしまった。Facebook は神。
去年は React アプリを TypeScript で書いたりしていたのだが、全体の設計や TypeScript の設定、開発ツール周りは自分が参入するタイミングで整えられており自分で触ることがほぼ無かった。自分一人で設計から開発、運用まで手を動かす経験は今後プログラマーとして働く上で重要になると考えたので、個人開発でそれに取り組んでみることにした。
アプリは React Native で iOS/Web 向けを作り、サーバー側は Firebase(もしくは AWS Amplify)を使う。Android は時間とお金に余裕ができたらやってみたい。題材としてはブックマークアプリを作ろうと考えている。
ブロックチェーン
「ブロックチェーン」という単語は知っていて取引所でビットコイン等を買ったことはあるが、実際に触ったことは一切なかった。しかし、最近さまざまなユースケースを見かけるようになってきた。
元々は経理の仕事をしていたので、下記のような多企業間での債権債務の計上や消込をするという用途には関心を持っている。
まずは仕組みを理解するために bitcoin.org で公開されているビットコインの論文を読みながら自分で実装してみようと考えている。これも RFC 793 と同じで自分の満足するところまでやる予定。
会計ソフト
プログラミングを始める前は主に経理の仕事をしていて、様々な会計ソフトを使ってきた。その中で業務の(半)自動化に取り組んだ。
会計業務の自動化というと freee や MF クラウド会計のような、入出金明細等のデータから会計仕訳の生成を自動化するソフトが注目される。それらにデータを連携させるソフトも多い。私自身もいつも大変お世話になっている。
一方で、「自分だったらこういうのが欲しい!」と思うこともあった。会計処理が大量にあると、仕訳のデータが期待通りに入っているかチェックするのが大変になる。事前に会計処理の型(借方や貸方の勘定科目や債権債務を分類するメタデータをまとめた構造体のようなもの)を定義しておいて様々なクライアントから送られたイベントを入り口で validate するような仕組みが会計ソフト側に欲しくなることがあった。
この方式には他にもメリットがあって、多様なイベントとそれらから生じる債権債務との関係を会計ソフトでモデル化できる。言い換えると、現在の会計ソフトでは債権債務関係を変動させるイベントと会計処理の関係が仕訳を境目に分断されていることが多い。両者を結びつけようとすると、表計算ソフトでごにょごにょするみたいなことになるので面倒くさい。
自分で簡単な会計ソフトを作って公開し継続的にメンテナンスしていくことで自分の課題を解決しつつプログラミングの練習にもなると考えたので、まずは手を動かしてやってみることにした。
まとめ
自分が興味を持ったものを自分で作って動かしてみることで仕組みを理解し基礎体力をつけることに注力したい。
それがプログラミングでお金をもらい続けることに繋がるし、楽しくプログラムを書けるようにもなると考えている。