先週で社会人4年目が終わり,今週から社会人5年目になりました.3年目で新卒入社した金融の会社を辞め,今は2社目に1年半弱在籍しています.振り返りをしておきたいと思います.
ちなみに私は社会人になってからプログラミングをはじめたので,プログラミング歴=社会人歴です.
できるようになったこと
テックリードになった
職位はそうなりました.前々からやりたいと思っていたのでよかったと思います.
うちのチームは,私とは別にエンジニアリングマネージャー的な人がいます.面談や全体の開発方針などはその人が決める構図です.なので,私は技術導入の責任と,製品の品質に対する品質,障害時の説明責任を負っています.
1からアプリケーションを作ってリリースできるようになった
アーキテクチャを1からデザインして,なおかつそれを実装する業務に関してはこれまでもやってきました.なのでとくに伸びてはいません.
一方で,実際に AWS に EC2 を立てて本番リリースする部分や,CircleCI を設定して CI/CD できるようにするといった部分は,3年目まではほとんどやってこなかったのであまりできませんでした.
4年目ではチャンスに恵まれ,CI/CD 周りの仕事をできました.今年習得したスキルの中でもっとも大きかったです.
関数型プログラミングに明るくなった
社内で Scala の cats 勉強会が開かれたのが大きかったです.cats には関数型プログラミングの説明兼 cats の使い方ガイドみたいな本があるのですが,その本を通して関数型プログラミングの手法を用いたアプリケーションのデザインを磨けました.
私は Java 出身でしたので,どうしてもデザインが Java によってしまっていました.それは Scala を使う上では決して悪いわけではありません.しかし,関数型プログラミングを勉強していくうちに,そこによく登場する手法を用いると,より安全で可読性の高いコードを書けると気づきました.ただ,実際のアプリケーションにどう適用したらよいのか,いまいちイメージがついていませんでした.
cats の本を通して,その本に掲載されているふんだんな実用例をもとに,おおよそデザインに関するエッセンスを掴めました.
Pros/Cons を考えながら技術選定できるようになった
今まではあまり深く考えずに好きなものを好きなだけ使うor自前で作ってしまえ,といったスタンスだったのですが,だいぶ技術選定の際に理性を働かせられるようになりました (笑).
技術選定にはいくつか基準があると思いますが,たとえば:
- チームのスキルセットを鑑みて,ここまでのレベルは扱えるだろうと予想して技術を使う
- あるいは,チームのスキルセットとあるべき姿を照らし合わせて,ここのスキルセットはチームメンバーに欲しいからあえてこの技術を使おう/やめておこう
- ライブラリのリリースノートを見て,どの単位でリリースしているのかや,そもそもちゃんと説明責任を果たす作者なのかを確認して,このライブラリを使おう/やめておこう
- Issue/PR に対する作者の対応を見て,このライブラリを使おう/やめておこう
- そのプログラミング言語の日本におけるコミュニティの対応状況や盛り上がりを見て,使おう/やめておこう
- 今後5年くらいは,こういう流れになっているだろうから,この技術を使おう
- 採用市場にこの技術を扱えるエンジニアが多い(あるいは,これから増えてくる)から,この技術を使おう
こういったことを考えながら,技術選定できるようになってきたかなと思います.もちろん,その技術を好きではあるものの,実際に使用するのは封印しなければならない技術もあります.Rust とか.我慢がきくようになったともいいますね (笑).
低レイヤーの話がかなりわかるようになった
実際に自分でいくつかコンパイラを実装しました.また,会社のゼミ中にネットワーク周りの調査や実装を行いました.それによって,低レイヤーの知識に実感が伴うようになりました.
知識にはいくつかの習熟段階があります.まず,本を読んで概念を理解すること.次に,実際に使ってみて概念を肌感で覚えること.最後に,自身の中で得た知識を体系的に整理し,人に教えること.
これまで低レイヤーの知識に関しては,本を何冊か読んで「概念的には知っている」状態の知識がほとんどでした.しかし,いくつか手を動かしたことによって実感を伴いました.引き続きやっていきです.
Go 言語を書けるようになった
これはちゃんとアプリケーションのリリースまで含めてやったので,書けるといっていいはずです (笑).
最近,弊社にインターンに来る子や新卒の子が,ハッカソンやインターンシップ中に Go 言語を多く使うようになってきました.中には8割の参加者が Go 言語を使用したインターンシップもありました.
当時,私自身はあまり Go 言語に関心がなく (というのも,Go 言語の代替で使える言語をいくらか使えるので),今後も触る予定がなかったのです.しかし Go 言語をあまり触っていないがために,インターンシップの評価者として入ったとき,的確な評価を下せず歯がゆさを感じる場面がありました.なので時間を取って勉強してみました.1週間くらいでかなり書けるようになりました.
その後,新規事業で Go 言語を使う機会が訪れました.プロダクションでも無事 Go 言語を使えました.
ただ,普段は使わないので最新情報のキャッチアップが課題ですね.もっとも,優先度は高くないのでタイムラインで見たものをチラッと見る程度で十分だとは思いますが.
Rust 関係での登壇
いくつかしました.Rust は触り始めてからもう2年近く経ちますね.昨今は国内・海外ともに採用事例が増えてきている上に,Reddit を見ていると Rust はよくバズっているので,注目度の高まりを肌で感じられるようになってきましたね.
コンテナのうれしさがわかるようになった
いろいろ苦労しましたがやっと.これまで,私の所属しているプロダクトにはコンテナがほとんど採用されていませんでしたが,いくつか機会があって導入しました.
やろうと思っていたけどなかなか手が伸びなかったもの
Linux そのものに関する話
アプリケーションエンジニアとしての時間が長いので,普段から macOS x IDE で大半の作業を行います.なので用意されているコマンド,OS の仕組み等々込で Linux が結構苦手でした.
前職は Windows だったため,転職当初はほとんど Linux をよくわかっておらず,障害時などにとくに困っていたのですが,1年半経ってある程度操作には慣れたように思います.しかし,まだ周りのエンジニアを見ているとその平均的な水準には届いていないかなと思っています.
が,あまり関心が向かないのか,ほとんど手をつけられませんでした.
アルゴリズム
概念的には理解できるけど,いざ実装する・使いこなして問題を解くとなるとちょっと苦手ですね….慣れていないだけだと思います.
これも去年何冊か本を買っては見たものの,結局関心が向かないのかなんなのかで,あまり目を通せませんでした.
ただアルゴリズムはやっておかないとこの先外資系に行きたい場合などに苦労することになりそうなので,まとまった時間をとって勉強しておきたい.TopCoder をやるなどして強制的にやらないといけない環境に置いたほうがよいかもしれません.
AWS の認証,ネットワーク周り
何度か体系的に知識を得て整理しようと思っていたのですが,結局関心が向かないのかなんなのかでやっていません.が,ついに今週体系的な知識の必要性を感じる場面があったので,これに関してはようやくモチベーションが湧いてきました.やります.
データ分析・SQL
やれば楽しいに決まっているし,実際チャンスもたくさんあるチームなのでやろうと思えばやれる!と1年くらい思っていましたが,食指が動きませんでした.毎年新卒のデータアナリストが入ってくるたびに簡単な練習問題を出しているので,今年は私もそれに参加させてもらおうかなと思っています.
あと SQL はいまだにあまり伸びてない.ORM 畑育ちなので,生の SQL はまだ抵抗がありますね.これも,新卒のデータアナリストと一緒に勉強しようかなと思います.
5年目で手を伸ばそうと思っているもの
仕事面
理想像はいるの?
これ,私と一緒に働いている方は驚くかもしれませんが,同じ部署内にいます.その人と比べて自分に足りないところはおおよそ次の通りかなと思っているので,何年かかけてのんびり力を伸ばせていけたらいいなと思っています.
伸ばしたいスキル
- Linux,シェル: 基礎教養だと思うので.
- 分散処理関係の話にもう少し詳しくなりたい←漠然としているのはまだ何があるかわかっていないからです
- AWS のネットワーク,認証周り: 概念の整理と理解,ならびにどこをどう編集したら自分のやりたいことが実現できるかをスムーズに手順立てできるところまで.
- データを前処理して Python で可視化するところまでできるようになりたい.
プライベート
プログラミングやコンピュータそのものが好きだとこの4年目を通して気づいたので,それ関連をプライベートでも進めていきたいと思っています.