こんにちは! LIFULLエンジニアの吉永です。
本日はエンジニアの自己研鑽について、自分はどんなことをやってきたかを紹介します。
ソフトウェアエンジニアを目指している人や、ソフトウェアエンジニアとして今後のキャリアプランに悩んでいる人の参考になれば幸いです。
私については、以前noteへ投稿した下記の記事に自己紹介と略歴が記載されているので、宜しければご参照ください。
アジェンダ
自己研鑽の方法と変遷について
私は2007年4月にソフトウェアエンジニアとしてのキャリアをスタートし、2015年3月までは放送機器の組込ソフトウェアエンジニアとして働いていました。
思い返してみると、自己研鑽の為のインプット手法や内容がだいぶ変わってきたので、それぞれの年代ごとにざっくりと内容をまとめます。
2007年~2009年頃
新卒で配属されてからの3年間はひたすら先輩の作成したプロダクトのコードや設計資料を読み漁り、ドメイン知識を身に付けることに重きを置いてました。
よって、自己研鑽もドメイン知識に役立つ事柄が多く、例えば書籍で言うとマスタリングTCP/IPの入門編と応用編、C言語による標準アルゴリズム事典などを購入して読んでました。
当時は組込ソフトウェアエンジニアなので、メインの開発言語はC言語、組込機器でもネットワークに接続することが必須となり、システムインテグレーターの方々が放送システムに採用する際にSNMPによるステータス監視に対応できているか?ファームウェアアップデートなどのメンテナンスはFTPやHTTPを用いて、ネットワーク越しにできるように考慮されているか?などが求められており、パケットキャプチャソフトでTCP/IPパケットをキャプチャして、デバッグ時にどちら側の問題かの切り分けをする必要もあり、これらの知識を得る為にネットワーク知識をつけました。
また組込機器はROMサイズがかなりシビアでC言語のサードパーティーライブラリを採用することが難しく、世の中一般的にはOSSで公開されている、枯れた技術でも自分たちで実装する必要(例えばJPEG画像のデコードとかトゥルータイプフォントの展開処理とか)もよくあったのでアルゴリズム事典のコードを参考にしたり、玄人の書いた難解なコードも読み解けるようにしていました。
また、チーム内でトレンド情報にアンテナを貼ろうという施策を実施していた時期は毎日チームメンバーが日替わりで気になったIT系のニュース記事をメールで共有していたので、IT系のプレスリリースはこの頃から良く見るようになっていたと思います。
2010年~2014年頃
この頃辺りから組込機器だけでなく、Windows GUI開発を行う機会も増え、Windows GUI開発ではVisual C++というMSが独自に作ったC++ベースの言語を使っていたので、学生時代に少しだけ勉強して、雰囲気で理解したつもりになっていたオブジェクト指向についてを再度勉強しなおしていました。 なので、独習シリーズのC++/Java/C#と独習UMLを購入して良く読んでいました。
結果的にはC++で開発する時だけでなく、組込機器の開発時にC言語でもオブジェクト指向を意識してプログラミングできるようになっていたり、UMLのアクティビティ図やステートマシン図、コンポジット構造図はWindows GUIだけでなく、組込機器の設計資料などにも採用するようになりました。
※それまではわりとフリーフォーマットで図を描いていて、フローチャートぐらいしか規定された図がなかったのでUMLである程度のフォーマットを規定してくれていることが先輩方からも好評でした。
あとは2014年頃にAndoroidとiOSのアプリをプライベートで作成したりして、直接当時の業務と関りはないが、色々な知見を得るってこともやったりするようになりました。
2015年~2019年頃
2015年4月からはWebアプリケーションエンジニアに転身したので、インプット方法はそれまでの書籍メインから、Webで検索するというのがメインになっていきました。
※組込系はそもそも環境依存系の問題なので、ググっても情報が見つからないことが多く、Windows GUIもその当時は既にC#がメインの開発言語になっており、C++関連の情報はヒットしても古い情報ばかりみたいな感じだったので・・・
2016年からは新入社員向けのプログラミング研修講師をやるようになったことで、インプット中心だった自己研鑽ですが、プライベートでのアウトプット機会が増えていきました。
講師をやるうえで、自分が理解していることを目の前にいる受講生にどのようにして伝えたら分かりやすいだろう?この人はどんな個所でつまずいているんだろう?ということを考えるようになったので、アウトプットして、自分で見返してみることで客観的に見れるようになっていったと思います。
アウトプットの代表的なものでいうと、Webで新しい言語に取り組む際によくやっていたのは、学生時代に作ったLinuxで動作するGUIのオセロアプリケーションをその習得対象の言語で書きなおし、言語の基本的な書き方を習得するようになりました。
上のリンクは個人のGitHubアカウントですが、色々な言語でオセロを実装しています。 コードは正直、自分で見返してみてもイマイチなのですが、手っ取り早くその言語に慣れるのに都合がよかったので、この手法をよくとっていましたね。
2020年~現在(LIFULLに入社してから現在)
LIFULLに入社してからは資格取得奨励制度があり、会社としても資格取得を応援してくれているので、IPAのスペシャリスト試験を受験して資格を取得することにも取り組むようになりました。
IPAのスペシャリスト試験は自分自身の理解度の確認、理解したつもりだった事柄を再度復習できることから、継続的に取り組んでいます。
下記はその取り組みの結果です。
- 2020年10月・・・情報処理安全確保支援士試験 合格
- 2021年04月・・・ネットワークスペシャリスト試験 不合格
- 2021年10月・・・データベーススペシャリスト試験 合格
- 2022年04月・・・ネットワークスペシャリスト試験 不合格
勉強方法は始業前か終業後に30分~60分くらい参考書を読んだり、過去問を解いたりを試験の2ヶ月前くらいから継続的に行うようにしています。
ネットワークスペシャリスト試験が自分としては難関なのですが、諦めずに来年もまた受験しようと思っています!
また、LIFULLに入ってからはエンジニアの発信を組織が奨励してくれていることもあり、Qiitaに投稿する機会が増えました。
Qittaにアウトプットすることで自分自身の備忘録にもなり、普段の業務で作成する設計資料類を作成するスピードが向上した気がするので、アウトプットを定期的に行うことはとても良いと思います。
まとめ
インプットは大事だがアウトプットも重要なので、学んで満足の状態からは早めに脱した方がいいと思います。
私自身、組込エンジニア時代はインプット中心であり、業務外でのアウトプット機会はあまりありませんでした。
今思うとこの頃にもアウトプットをしていたら、きっとインプットした内容をより早く深い理解の状態へ持っていくことができていたのではないかなと思います。
ソフトウェアエンジニアは常に勉強をし続け、自己研鑽することを求められますが、大事なのは質や量よりも、継続していくことだと思っています。
私自身気分が乗らない日もありますし、毎日勉強し続けているわけではありませんが、継続するコツは、自身のキャリアビジョンを解像度高く持っておくことだと思います。
ゆくゆくはこういうスキルを身に付けたい、こんなエンジニアになっていたい、などなるべく具体的なイメージを持ち、そのイメージと現在の自分とのギャップを埋める為に必要なことは?というように思考できると、おのずと行動に繋がっていくと思いますので、ご自身の将来像を具体的にイメージしてみてください。
ちなみに私のキャリアビジョンは、抽象度が高い状態の内容では「あいつに任せとけばなんとかしてくれる」と周囲から思ってもらえるエンジニアになりたいでして、新卒研修受講後の決意表明で上司や先輩に宣言しました。
これは今でも私のベースにありますが、もう少し具体的なキャリアビジョンとしては、自分自身のスキルや知見は引き続き身に付け続けていくが、得た物をチームメイトにもフィードバックしていき、チームメイトだけでなく将来エンジニアになりたい人のサポートができるような縁の下の力持ち的な役割と、開発チームを牽引していくテックリード的な両面の働きができるエンジニアになりたいと思っています!
最後に
最後まで読んでいただきありがとうございます。
LIFULLでは共に成長できるような仲間を募っています。
よろしければこちらのページもご覧ください。