2020年の技術的な振り返り
これは何?
2020年の振り返りを綴ったポエムである。酒の肴にでもどうぞ。
触った技術
触った技術スタックは以下にまとめている。業界歴6年目だが、これだけの数の技術スタックに触れたのは初めてだった。
やったこと
主に0→1のwebアプリケーション開発におけるクラウドインフラ~サーバーサイドを広く薄くやった感じでした。
1.業務
1-1. CI/CDを含めたクラウドインフラ環境の構築(通年)
CI/CD含めてゼロ状態からアプリケーションをECSに乗っける仕組みを用意し、TerraformでIaC化も一通りやった。構成は一般的なwebアプリケーションのためのものでありこれ以上無いくらいシンプルだが、今までEC2ベースでしか仕事してこなかった自分にとっては大きな経験になった。
この他、IoTから飛んでくるデータの受け口を改良したり、データをクラウドインフラ関連でタレ流れてた無駄な費用の削減($1k/monthくらいの削減)やったり、CIの高速化などもやったりもした。
おかげさまでクラウドインフラ周りで幅広い技術に触れられた。今まではサーバーサイドエンジニアとしての仕事が中心で時々クラウドインフラちょっとだけ触る程度だったが、この経験によってクラウドインフラ周りへの関心がグッと高まった。
1-2. Scala x DDDでAPI実装(4~7月)
ScalaとDDDの両方で初心者だった(今でも初心者だが...)ことに加えて担当した機能がまぁまぁ複雑だったこともあり、中々にエキサイティングな経験だった。
Scalaスゲー!モナドすげー!って毎日言ってた気がする。
DDDに関しては絶対的な答えがない中での模索が多く、議論が耐えなかった。「早くコードを書きたいが、そもそもこれが決まらなかったらあるべき方向へすら走り出せないよね」っていうことが多々あり、如何に設計が大事かということを学んだ。
以下の情報に助けられたので、気になる方はどうぞ。
1-3. Golang x AWS LambdaでAPI実装(8月~12月)
担当するプロダクトが変わると共に技術スタックも変わった。ここではAmplify x AppSync構成のwebアプリケーションであり、バックエンドのリソースはAWS Lambda(以下、Lambda)を使うことが多かった。Lambdaのデプロイ周りではserverless frameworkを使い、プログラミング言語はGolangを採用した。
Golangはここで初めて使ったが、お手軽に静的型言語を使えるという点で良かった。一方で小難しい計算やループ処理を書き始めると記述量が増えるので、そういったケースではあまり向いていないと感じるのが正直なところだった。
1-4. (ナンチャッテ)プレーイングマネージャー(10月~12月)
秋頃から大きめの機能開発があり、それに伴ってまとめ役が必要になってきた。一応チーム内で自分が一番実地経験があったこともあり、流れで自分がナンチャッテなまとめ役を(気がついたら)やっていた。
やったこととしてはざっくり以下
- タスクの洗い出し
- POの提示した要件を満たすためにやることを洗い出してメンバーにアサイン
- daily scrumや振り返りなどの開催やファシリテーション
- スプリント終わりに振り返りを開催して各自の出来た点や改善したい点を話し合う場を設けた
- 忙しい中では「自分がどんなことを学んだのか」、また「今後より改善したいことはなにか」といったことを忘れてしまいがちなので、スプリント終わりにそういったことを振り返った
- スプリント終わりに振り返りを開催して各自の出来た点や改善したい点を話し合う場を設けた
- リリースに向けた進捗の確認や問題の洗い出し
- daily scrumとは別に、開発全体の進捗や問題点の洗い出しや共有など
- ペアプロ/モブプロで自分の知見を共有
- 新しい技術スタックをペアプロで一緒に使って勘所を共有したり
- 設計の壁打ち相手
前職は上司と自分の2人で開発をやっていて"チーム開発"というほどの経験はあまり無かったので、自分としては今までに経験したことのない分野に挑戦できたのではないかと思う。一方でフツーにコード書きながら仕事の全体調整やってると色々と大変なので、今後はもう少し若手メンバーを表に出てやっていってもらえるように工夫しようと思う。
2. 個人活動
今年はOSS活動を少しやってみた。
メチャクチャ小さな対応だが、自分でも出来ることがありそうだったのでOSSにPR送ってみた。OSSへのコミットに対して多少心理的なハードルが下がった気がしなくもない。
技術的アウトプットを作ろうとして幾つかコードを書いた。
DDDに関しては記事も書いた。
気づいたこと
1. 特定技術を触る/動かすだけならそんなに難しい話じゃない
日々便利なツールが世に出回るわけなのだが、それらに共通することは「利用者が使いやすいように既にかなり加工されている」ことである。例えばクラウドインフラ周りであれば、ネットワークのことやサーバーのことなんて知らなくてもEC2やRDSを建ててられるのだ。
そう、「取りあえず動くもの」というのは意外とすんなり用意できてしまうのである。
問題は「その後どうするの?」というところである。産み落とされたあとはもちろん継続的な機能追加/変更が出てくるだろう。サービスが伸びてくると色々な障害だって出てくる一方でサーバーをそう頻繁に落としてはいられない。
繰り返しになるが、プログラミング言語もクラウドインフラもその他各種ツールも、それらを使うことそれ自体はそれほど難しいことでない(提供者が使いやすいようにお膳立てしてくれてるのだ)。難しいのはそれらを使ってどうやって拡張性のあるソフトウェアを作り続けていくかというところである。
その辺りを考え始めると、やはりオブジェクト指向,アルゴリズム,データ構造などの、いわゆるコンピュータ・サイエンス周りの知見が必要になってくるんだろうなぁと思う。
今年一年の0→1経験の一つの成果としては、「結局は基礎力が大事」ということだろう。
2. 継続にこそ価値がある
上記の話とも似ているが、始めることよりも継続することのほうが難しいと思った。社内用のちょっとしたツール一つとっても、開発すること自体はそれほど難しくない。難しい(という言い方が適切かどうかは微妙だが)のは継続していくことである。要は、利用者の声に耳を傾け、あるべき姿に向けて改良を重ねていくことである。
プロダクトっていうのは(それがどんな小さなものであっても)作ったら作りっぱなしではなく、継続的に改善を重ねてより良い方向に向かっていかなくてはならない。利用者に価値を提供し、利用者からの声を聞いてさらなる改善を重ねることにこそ意味があると思う。
0→1の経験を通して、ゼロからなにか作ることに対する心理的ハードルは随分下がったので、来年は継続的な改善に着目していきたいと思う。
3. 絶対的な正しさなんてものは無い
DDDでのアプリケーション開発を通して一番の学びとして、「テストの回答のように、"こうすれば正解"なんてものは存在しない」ということだった。そんなテンプレのような回答ってのはツールの使い方にくらいしか当てはまらず(いや、ツールの使い方にすら当てはまらないかもしれないが)、チーム内で議論して 自分たちなりの正解
を見つけていくしか無い。
特にDDDの世界では、「一度決めたことはそのまま未来永劫変わらない」といったことはなく、常に改善が行われていく。名前や意味が変わることは多々あるだろう。これと同じように、ソフトウェア開発やチームビルディングにおいても「今回皆で議論して決めたから、これで万事オッケー」なんてことはないんだ。時が流れるに連れて忘れることもあるだろうし人も増えてくるだろう。既述の内容とも被るが、決めたらオシマイではなく、改善して磨き続けていくことに価値があるのだろう。
*怪文書は以下にもあるので、興味ある方はどうぞ。
来年
来年はクラウドインフラ周りを中心に仕事をしていこうと思う。
まとめ
今年一年色々なことを経験した。来年も生き延びよう。
Discussion