新卒2年目エンジニア。サステナブルな開発者になるためには、何をするべきか考えてみた。
一年を振り返って
プログラマになって1年経ち、記憶を辿れば、辛酸を舐め散らかしたことしか思い浮かびません。
カスみたいな設計をしたせいで終わらないレビュー。そのせいで他エンジニアの時間を溶かす自分。
1年ほど経って、やっとよちよち歩きできるレベルになりました。
タスクを確認して、見立てをつけて、必要であればタスクを分解して(PRを分ける)、慎重にコードを書き、セルフレビューし、PRを作成し、試験項目を作成し、レビューで指摘された箇所を修正する。そんなことを繰り返していたら、自分なりに満足できるコードを書けるようになりました。
難しい開発業務もほとんど一人でこなせるようになり、最終的にレビューで返ってくるコメントでは、致命的な設計ミスに関することは少なくなりました。
心理的にも、実力的にも一段落しました。少しでも暇になると、人間は哲学的だったり、概念的なことについて考え始めるらしいです。僕も人間なので、より抽象的なことを考ます。最もよく考えることは、これから開発者としてのキャリアをどう築くかについてです。
凄腕エンジニアから学ぶ、これからの開発者が学ぶべきもの
たかが一年の開発経験でキャリアについて論ずることについて、滑稽に思う人もいるでしょう。確かにそうです。一年坊の解像度なんてものは、笑い物にしかなりません。「とある技術について、自分は何も知らない」ということさえも知らない状態なんですから。知見が浅すぎて、存在すら知りません。
これからお話しすることは、とある老練な(決して老けてるという意味ではない)エンジニアのお言葉にインスピレーションされて、僕が拡張したものです。
さて、まず、その老練なエンジニアの素晴らしいお言葉をみてみましょう。
miyagawa
こちらの記事は、テックポッドキャストでお馴染みrebuildのパーソナリティであるmiyagawaさんの、キャリアに関する記事です。具体的なキャリアは記事をご覧ください。
ここで僕が注目したのは、キャリア関連記事のあるあるセクションである”若者に一言” 欄です。
数学とコンピューターサイエンスの基礎を学べと。次にこちらです。
英語を勉強しろ。ということでした。
hak
こちらもrebuildでお馴染みのhakさんです。twitterで、以下のようにツイートしてました。
miyagawaさんと、ほぼ同じことをおっしゃっています。
40代に最前線で働いているソフトウェア開発者の教えは単純でした。大学教授のようなことをおっしゃっておりました。「CSと英語を学べ」とのことです。
何を学ぶか、何を仕事にするか
キャリアの話をするはずなのに、学びの話をしてしまいましたが、これらが切っても切れない関係にあることを皆さんご存知でしょう。Androidエンジニアになるためには、Android StudioでJava・Kotlinを使って開発手法を学ばないといけないのです。
先ほど、老練なエンジニアの方々は、一貫してコンピューターサイエンスの基礎と、英語を学ぶことを奨励していました。ではここで、もっと具体的に考えてみましょう。コンピューターサイエンスの基礎とは、なんでしょうか?
一般的な解釈では計算機科学・計算機工学全般のことを指すでしょう。基本的なディジタル回路の構成要素から、いかにして加算器や減算器が作られるのか。また、それを使って、いかにしてレジスタを、ALUを作るのか。そして、それらがいかにしてCPUを構成するのか。次のレイヤーに行けば、アセンブラやコンパイラ、OSなどあります。高レイヤーにはユーザーインターフェースや、人工知能もあります。計算機科学だと、情報理論や、グラフ理論、アルゴリズムとデータ構造もありますね。
大学でソフトウェアを専攻していない自分からすると、気が遠くなるほど膨大で、とても全て学べそうにありません(僕は電気電子工学を専攻していました)。
そこで勉強対象を、以下のように絞ることにしました。
アルゴリズムとデータ構造
オペレーティングシステム
TCP/IPなどの通信について
HTTPとWEBブラウザ
データベースとSQL
セキュリティ
テストやコードの書き方なども、もちろん学びますが、それはコンピューターサイエンスの基礎ではありません。プログラミング言語についても書きませんでした。言語そのものを学ぶことはもちろん重要ですが、それは手段だと思います。手段としてのプログラミング言語は、仕事を通じて知らない部分があればその都度、探します。ソフトウェアとしてのプログラミング言語についてはまた後で、という意味です。
…さて、ここまで読んだ、ほとんどのソフトウェア開発者の皆さんはこう思ったでしょう。 「そんな基礎的なこと勉強するの、当たり前だろ」と。
ほんとそうなんです。当たり前なことなのです。ですが、これらの一つ一つは、掘ってみると気が遠くなるほど深いものです。渋川よしきさんの『Real World HTTP 第2版』で痛感しました。あ、俺は何も知らなかったんだな、と。仕事をしながらキャッチアップできることなんて、ほんの一部なんだな、と。
当たり前の技術であるからこそ、より広く使われており、広く使われるからこそ深いのではないのでしょうか。僕たちが、意識していない部分についての勉強だからこそ、今仕事で使っている技術の解像度が上がるのではないのでしょうか。そうすることによって、今までとは違う環境・違う職場でも素早くキャッチアップして、その熟したスキルを存分に振る舞うことができるのではないでしょうか。
僕はそう思います。縁の下の力持ちになる知識を学ぶことによって、より技術に対する解像度を高めていきたいです。
実は、上に挙げた勉強項目、ほとんど勉強済み(本を読んだ程度ですが)なんですよね。唯一途中で諦めたものがOSです。難しくて….🥺。渋川よしきさんの『Goならわかるシステムプログラミング』で勉強します。