エンジニア4年やってきて感じるのは「そろそろエンジニアになりたい」
今日は、ソフトウェアエンジニアとしてのキャリアに関する話をば。
未経験エンジニア(ソフトウェアエンジニア)の方の参考になればと思います。(末尾に、今勉強してる本など載せてます)
私は2017年に、情報系のバックグラウンドが無い状態でソフトウェアエンジニアになり、ここ2年間はAndroid開発を中心としてます。
エンジニアになった背景や簡単な略歴は以下の記事をご参照ください。
で、早いものでエンジニアとして仕事を始めてから早4年が経過しようとしているのですが、最近強く感じるのが、「そろそろエンジニアになりたい」ということです。
むむ、既にエンジニアとして仕事してるのにどういうこっちゃ、と思われるかもしれませんが、より正確に言語化してみると、「そろそろ(コンピューター自体やAndroidの仕組みをしっかり理解した上で、なんとなくではなく理屈に基づいてプログラムを書ける)エンジニアになりたい」と表現できそうです。
というのも、これまで僕は主にAndroidエンジニアとして働いてきましたが、「なんとなくでプログラミングしている」と感じることがめちゃくちゃ多いからです。
例えば、Android開発していてエラーに遭遇し、そのエラーを調べる時に、「こうすりゃいいよ」というワークアラウンドは分かっても、「結局何が原因で、なぜそうすれば直るのか」が理解できないことが沢山あります。エラーに限らず、「なんか期待通りに動かなくて、ネットで見つけた方法に従ったらなんか動いた」というというのが、エンジニアなりたて当初に比べたらかなり減りましたが、今でも変わらず沢山あるんですね。
そして、「なんか分からんけど動いた」は個人プロジェクトならまだしも、仕事としてプログラムを書いていると、様々な問題があります。
例えば、「なんか分からんけど動いた」コードは、そのコード差分をレビューしてもらうためのプルリクエストの時に、レビュアーが困ります。幸運にも、対応した自分が分からなくてもレビュアーがその原因や修正内容について理解していれば「これはこういう理由で〜」など解説つきで取り込んでもらえるかもしれませんが、レビュアーも分からない場合、どうレビューして良いか分からないんですよね。ホントにそれで解決するのか、他に副作用はないのか判断ができない。直面している問題自体は解決できたしても、想定していない他の問題が起きるかもしれないし、その影響範囲もわからない。そもそも、そんなエラーが出るような実装の仕方自体に問題があるのかもしれない。そして、そうしたその場凌ぎで書かれたコードは、将来のチームメンバーが見ても理解不明で改修に困る可能性がある。なので、正直、他の方からのプルリクエストで「なぜか分からないけれどもこうすると動きました」という修正があると、(本人は一生懸命調べてくれて時間的にもしょうがないんだと思いますが)無責任に感じてイラっとしますし、自分は他のレビュアーも将来の改修者もイラっとさせたくないと思っています。だけど、私自身も同じようなプルリクエストを作ってしまうことが結構あり、それがとても悔しい。
流石に、全てを理解して一切の疑問もなくプログラミングできるようになるのは現実的ではないですが、「きっとこういう理由で期待通りに動かなくて、ということはこうすれば期待通り動くはずだ」と自分なりにしっかり根拠を持って修正できるようになりたいですし、その根拠の確からしさをちょっとずつ上げていきたい。
ただ、そうなるためには、Androidプログラミングの入門書を読んだり公式ドキュメントに従って書いたりしながら実戦で経験を積みまくるだけではダメで、「なぜAndroidが動くのか」さらには「なぜコンピューターが動くのか」などの、プログラムが動いている基盤部分をしっかり理解することが必要だと感じています。
そうした、ソフトウェアエンジニアとしての基礎が足りないという自覚が「自分はまだまだエンジニアとして名乗れない」という気持ちにさせていて、それが単純に悔しいですし、チームメンバーのためにも、もっともっと勉強して、「そろそろエンジニアになりたい」と感じています。
最後に、自分なりに基礎を身につけるために最近読んでいる本や勉強していることをご紹介します。どれも、まだまだ今の私には難しいですが、少しずつ解像度が上がってきている感じがあり、楽しいです。(一番感じているのは、学校に通ってイチから体系的にしっかり学び直しをしたい)
皆さんのお勧めがあれば、ぜひ教えてください。
コンピューターの基礎
・プログラムはなぜ動くのか
・TCP/IPの絵本
・Linuxの絵本
・入門者のLinux 素朴な疑問を解消しながら学ぶ
・ふつうのLinuxプログラミング
・コンピュータシステムの理論と実装
・基本情報技術者 合格教本 (今期受験予定)
・CS50's Introduction to Computer Science (オンライン授業)
Android関連の基礎
・Androidを支える技術〈Ⅰ〉──60fpsを達成するモダンなGUIシステム
・Androidを支える技術〈Ⅱ〉──真のマルチタスクに挑んだモバイルOSの心臓部
・Javaパフォーマンス
この記事が気に入ったらサポートをしてみませんか?