ソフトウェアエンジニアとして仕事を通じて成長するコツを書く。
前回、やや抽象的な話を書いたので、今日は実際に自分がやってきて 効いた具体的 な方法を紹介する。
若手やこれから伸びたいエンジニアに届けば嬉しい。
仕事をしていれば「知らない」は日々出てくる。ミーティングで出た用語、ログに出てくるオプション、ドキュメントに書かれている概念……。
それを放置せず、すぐ軽く調べて日報やメモに残す習慣をつけるだけで、1〜2ヶ月後の地力が大きく変わる。
特に自分の職責に直接関係しそうなキーワードは深掘りしたい。
Linuxコマンドを知らなければまず man を読む。試しに打つ。挙動を確かめる。
自分が普段使っているコマンドのオプションや、ツールの公式ドキュメントを「最初から最後まで」通して読んだことはあるだろうか。もし無いなら、今日から一つずつ始めてほしい。費用対効果が高い習慣だ。
man cat を開いて、知らないオプションを見つけたら実際に使う。ここまでで及第点。
さらに一段成長するコツは「このオプションはどんな場面で便利か」を探すこと。
例えばcat -n なら行番号を付与する。では行番号があると何が嬉しいか?を考える。
- ログ調査で位置を共有しやすい
- コードレビューや差分確認で指摘しやすい
- 自作ツールでも「位置を参照したくなる」ユースケースに気づく
こうやって “使われる文脈” まで紐づけると、自然と再利用できるし、設計の視野も広がる。
プログラマーとしての基礎体力は 読んだソースコードの総量 と相関があると感じている。
日常使っているコマンドやツールのソースを読むのは最高の入り口だし、実務にも直結する。
これは自分が若い頃に @zaki_hmkc さんに教えてもらった方法で、まずは小さく目的が明確なOSS(cat, more など)から入ると良い。
Linuxコマンドを読めば文字列処理や低レイヤの知識が自然と身につく。
フレームワークやライブラリを読めば設計・アーキテクチャの解像度が上がる。
他にも cat はC、bat はRustで書かれている。
自分が学びたい言語で書かれた小さめのコマンドを入口にするのは良い戦略だ。
慣れてきたら、Redmineのようなチケット管理系OSSを読むのもおすすめだ。
Webアプリエンジニアに必要な実装のバリエーションがそろっている。
ある程度一定Webアプリケーションの経験があるならISUCONの過去問に挑戦してみるのも良い。
同じ仕様で複数の言語で実装されているので他の言語を学ぶときにも参考になるし、Webアプリケーションのチューニングなども勉強になる。
ISUCONに参加したことがないなら、まずは最新の過去問から始めるのが良い。
本選と予選が別れている過去問の場合は予選をやると良い。
ソースコードを読むだけでなく、コードを書くことも同じくらい重要 だ。
どうやって書く量を増やすか。自分がやってきて効果があった順に並べると次の通り。
- 自分に必要なツールを作る
- 読んだツールを別言語で作り直す(車輪の再発明)
- Webアプリケーションを作る
1. 自分に必要なツールを作る
最もおすすめな方法は自分に必要なツールを作ることだ。
ちょっとした自動化スクリプトでもいい。
過去に自分は Backlog の API を叩いて esa に転記するツールを作った。
これくらい小さくて良い。
色んなツールを作っていく中で HTTP、認証、JSON、エラーハンドリング、リトライ、ログなど自然に身につく。
自分が利用者なので「もっとこうしたい」という改善欲が湧き、技術の引き出しも増え、仕様を想像・圧縮する力も鍛えられる。
最近では saga-cli という LLM に問い合わせる CLI を作った。当初は OpenAI API を叩くだけだったが、次のような仕様を追加していった。
- プロンプトパターンを増やしたい
- 他社モデルも試したい
と様座に拡張していくうちに LLM 周辺の理解が深まった。
最初からリッチな仕様を狙うと挫折しやすい。UIは割り切り、まずは自分の困っていることを解決させる機能を完成させる。使っている中でUIを改善したくなったらその時に作り込めば良い。
また同様にインフラコストが低い形(CLI、Chrome拡張機能、シンプルなモバイルアプリなど)だと始めやすい。
2. 読んだコードを別言語で同じツールにする
作りたいものが思いつかないなら 車輪の再発明 をやるのが良い。
例をあげると、 cat を Python で、jq 的なフィルタを Go で実装するなどだ。
また一度作った自作ツールを別言語で作り直すのも良い。仕様検討の負荷がゼロなので純粋に言語やフレームワーク習得に集中できる。
同じ仕様、同じ言語でモダンフレームワークへの置き換え、デプロイフロー刷新なども同様に学習効率が高い。
いきなり多くの学習を詰め込むより、一つ一つ学習のポイントを絞って進める方が躓きにくく、成功体験が積みやすい。
3. Webアプリケーションを作る
ある程度 読む/小さく作る に慣れ、あなたがWebアプリケーションに関わるエンジニア *1 なら一通りを作ってみることをオススメする。
フロント、バックエンド、DB設計、認証、ストレージ、デプロイ、ドメイン、SSL証明書、メール……横断的に一気に鍛えられる。
前述したRedmine クローンは学びが多いが機能量が多く負荷も高い。
そこで機能が少ないWebアプリケーションが良い。
ブログツール内製も定番だが、個人的には Dropbox / Google Drive 風のシンプルなファイルアップローダーを推す。
理由は次のようなWebアプリケーションで使われる技術を一通り触るからだ。
- ストレージ操作
- 認証/権限
- UI(一覧・プレビュー)
- バックエンドAPI
- ちょっとした非同期処理
ISUCONも一通りの技術を触る良い機会なのだがすでに完成しているので、参考にしつつ、自分で作り直す。などでも良い。
ドメイン取得・DNS・SSL・メール設定など最初は面倒に感じるが、ここでも 知らないと向き合う 姿勢を貫けば、自走する力が成長する。
成長の核心は 読む、書く、問題を解く を淡々と回すこと。
その最初の一歩としてまずは今日使ったLinuxのコマンドを調べてソースコードを読むところから始めてほしい。
そうやった毎日の小さな積み重ねが、大きな自力の差になっていく。
このイベントで本記事の内容について話す
Webフレームワークのhonoの作者である @yusukebe さんとのパネルディスカッションも予定。
オフライン参加なら質問も懇親会もぜひ。