2022年の振り返り

この記事は筆者の[ソロ　Advent Calendar 2022](https://qiita.com/advent-calendar/2022/panda) 25日目の記事です。最後の記事になりますので2022年の振り返り的なものをして本年を締めようかと思います。

:::note warn
本記事は筆者が思ったことを雑に書き連ねるポエムです。間違ったこととかそれおかしいやろみたいなことがあるかもしれませんがその際はコメントください。
:::


# 2022年開始時のスキル感
一応今年始まったくらいでのスキルセット的なものを箇条書き
- Java(母国語) 1年半くらいSpringで開発してた
- Ruby ポートフォリオ作るのに書いてたけどもはや書けないレベル
- JavaScript Springで管理画面全部作る時のJQueryとReactも書いてたけど2022年時点ではだいぶ古い書き方してたと思う。つまりほぼ素人
- AWS　管理画面ポチポチ。RDS, EC2, lambda, S3あたりを触ったことある程度。つまり雰囲気

# 2022年触ってきた技術

## Kotlin
2月に転職してサーバーサイドKotlinで開発することになったので1から学習したけどJavaからなのでそんなにつまづくことはなかった。拡張関数とかスコープ関数とかラムダの書き方が少し慣れるまで時間がかかったけど慣れたらこれらないと開発できない。拡張関数すぐ書きがち。もうJavaには戻れない。KotlinというかKotlinプロジェクトにおける周辺ツールやライブラリ、フレームワークの検証とかやっぱり情報が他の言語と比べると少ない気がしていて、ここら辺の記事をよく書いた1年だった。具体的にいうとKotest, mockk, testcontainers, ktorとか。Springのアノテーションが雰囲気で使ってるのとSpringのクラスを拡張していろいろ頑張るのが辛い時あって、あとローカルで起動が遅いのも地味にストレスで脱Springしたくなって他のフレームワークを検証してみたりした。以下はKotlinでJavaのマイクロフレームワークのquarkusを使ってみた記事。

https://zenn.dev/jy8752/articles/593dc0dbeffced

## gRPC
これも業務で使うことになったので1から学んだ感じ。マイクロサービスで利用とかではないのと、そんなにゴリゴリにprotoファイル書いたわけではないけど普通に使えるようにはなった。マイクロサービス的なアーキテクチャでサーバー間通信するとなるとgRPCが採用されることが多いと思うので経験できてよかった。gRPCをやってよかったなと思うのが所謂スキーマファーストで開発できるのがすごい楽だなと思ったところ。結局サーバーで用意したAPIをフロントが使う時にあれがない、これいらないとかのやり取りが発生するので先にスキーマ定義を作成して、フロントに見てもらってから作るのが手戻り少なくていいなと思った。protoはサーバーでもフロントでも共通的に使うのでなんか共通言語があるみたいな感じでやり取りがやりやすいのもいいなと感じた。

あと、gRPCの話でもないのだけど　APIのドキュメントを**可能な限り自動更新される**ように用意するのが大事だなと思った。更新されないドキュメントほど役に立たないものはないというのをすごい見てきたのと、都度メンテナンスしなければならない辛みもわかるので**可能な限り**です。スキーマファイル見てもらうのが結局正解なんだけどprotoファイル見てくださいで終わらすのも不親切だし、ドキュメント作り込むのもあれだし、なんかswagger的なのとかgRPCにもあるのかいろいろ調べて```protoc-gen-doc```でドキュメントを生成するのが良さそうだったのでCIに組み込んでprotoのリポジトリが更新された時にドキュメントも自動で更新されるようにしてみた。これはこれでprotoファイルを作り込む必要があるけど別でドキュメント管理するよりは遥かにマシだと思っているのでgRPCの開発をすることがあれば個人的には導入したいと思っている。

https://zenn.dev/jy8752/articles/2e77da36cae0c3

## Go
今プログラミング言語でやるべきはGoとTypeScriptだと思っていて、Kotlinのキャッチアップが落ち着いてきた時から個人的に書いていた。TODOアプリ作ったり、[ent.](https://entgo.io/ja/docs/tutorial-setup)を使ってDB処理書いたり、こちらの[エキスパートたちのGo言語](https://www.amazon.co.jp/%E3%82%A8%E3%82%AD%E3%82%B9%E3%83%91%E3%83%BC%E3%83%88%E3%81%9F%E3%81%A1%E3%81%AEGo%E8%A8%80%E8%AA%9E-%E4%B8%80%E6%B5%81%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89%E5%BF%9C%E7%94%A8%E5%8A%9B%E3%82%92%E5%AD%A6%E3%81%B6-Software-Design-plus/dp/4297125196)という技術書をやってみたり(これはレベル高かったのでまたレベルが上がったらもう一度読み直したい..)とりあえず、Goに慣れるという意味で何か手元でプログラム書くときはGoを選択するようにしていた。

## TypeScript
上述の通りGoとTypeScriptは早めに触っておいた方がいいなと思った2022年だったのとJavaScriptは業務で書いてきたけどTypeScriptは書いたことがなかったので[プロを目指す人のためのTypeScript入門](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AETypeScript%E5%85%A5%E9%96%80-%E5%AE%89%E5%85%A8%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%8B%E3%82%89%E9%AB%98%E5%BA%A6%E3%81%AA%E5%9E%8B%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%BE%E3%81%A7-Software-Design-plus/dp/4297127474)で入門しました。こちらは入門書として書かれているのでTypeScript初めてでも理解しやすかったですし、内容も充実していてとても勉強になりました。基本的にはサーバーメインだけどフロントも一応書けるよくらいにはなっておきたくてReact, Next, React Nativeなどのフレームワークを触った。(業務で使いそうになったのでVue3も少しやった)


あとTypeScriptじゃないけどフロントつながりでFigmaもUdemyで基本操作くらい学んだ。Figmaはスキルとして定着したかは微妙だけど最悪自分でFigmaでプロト作るイメージ湧いたのでやってよかったと思う。たまにサーバー一筋でフロント周辺の技術を避けるような発言をする人をネットでも現実でも見かけるけど(気持ちはわかる、それくらい、フロントの話題についていくのは大変)フロントやデザインへの理解があった方が仕事はやりやすい気がするし、話もスムーズだと思うのでFigmaみたいなデザインツール触ってみるのはおすすめ。

あとは、後述するけどweb3のキャッチアップが業務的に必要でいろいろチュートリアルとか手元でいじったりとかしていたけどweb3.jsとかethersとかどうしてもJS周辺にライブラリがあるのでそれでTypeScriptを書くことが多かったのでweb3もTypeScriptも勉強になって二度美味しい状態。

あとあと、滑り込みでこのアドベントカレンダーでDenoも入門できた。ずっと触りたいと思っていたので最後に触れてよかった。

## Web3
たまたまで予想外だったけど業務でブロックチェーン関連のプロジェクトを担当することになり、本当に何もわからないところからキャッチアップをはじめた。徐々に情報も増えてきた印象があるけどとりあえず手当たり次第にチュートリアルをやってわからない単語をひたすらググるみたいなことをやってた気がする。Solidityでコントラクトを実装して、hardhatやTruffleでテストネットにデプロイして、web3.jsやethersでmetamaskと接続したり、トークンの取得をしたり、トランザクション実行したりをなんか繰り返しいろんなところでやった気がする。チュートリアルはOpenSeaとかalcamyとかhardhatとか。web3関係はドキュメントが追いついてないのが多くてかなり読みづらい時があったりとか、チュートリアルが古かったりとか全然あって、結構心折れそうになった。夏くらいが一番やってたけど今見たら結構変わってるのも多かった。

あとは、ひたすら情報取集した。twitterのブロックチェーン界隈のエンジニアの方とかクリプト民っぽい人を片っ端からフォローして情報を得るようにしていた。わからないなりにも目に入るようにしているとなんとなく今何が話題なのかとかなんとなくわかってくるし、今のweb3界隈の雰囲気感もなんとなくわかってくる、気がする。

podcastとか勉強会もなるべく聞くようにしていたけど直近の東京web3ハッカソンはめちゃくちゃ刺激的で勉強になった。web3やりたくなる。

とりあえず、巷で騒がれているweb3やNFT、DAOみたいなバズワードが何を指しているのかとそれらを作るための基本技術みたいなことは学べた2022年だった。以下はweb3関係で今年書いた記事。

https://zenn.dev/jy8752/articles/a33b6a58ee638b

https://zenn.dev/jy8752/articles/4801c60aab3d3e

## そのほか
あとはインフラが致命的に自信なかったのでTerraformを[実践Terraform](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Terraform-AWS%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A8%AD%E8%A8%88%E3%81%A8%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-%E6%8A%80%E8%A1%93%E3%81%AE%E6%B3%89%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%88NextPublishing%EF%BC%89-%E9%87%8E%E6%9D%91-%E5%8F%8B%E8%A6%8F/dp/4844378139)で入門したりした。(めちゃくちゃいい技術書。わかりやすい。)、k8sが何なのかいまいちわかってなかったのでUdemyで入門したり(これもめちゃくちゃわかりやすくてよかった。）

# 2023年触っていきたい技術
## Go
Kotlinは一旦置いておいて2023年はしばらくGoに全振りしたい。マイクロサービス、gRPC、k8sなどが絡んだプロジェクトにおいてGoがやはり真っ先に選択肢に上がってくると思うし、新規で何か作るけど言語は何にしようとなった時にGo以外が微妙に見えてしまう。Kotlinでもいいのだけど使うならSpring以外を使いたいところ。
あとはフロント開発の割合が多ければサーバーでもTypeScript使うメリットはありそう。そういう意味でもGoとTypeScriptをやっておいて損をすることはないと思う。

あとはweb3をやっている時にJVMの経験が活きる場面がほとんどなかった。ethereumクライアントではgethという物があるが、これはCLIだけでなくコードでも扱えるクライアントだけれどもGo製になっている。Cosmos SDKというブロックチェーンが存在するがこれもGoでチェーンを作成することができる。これからの新技術においてそのエコシステムにJVM系の言語がくることはなく、しばらくはGoもしくはRustとかがくるのかなと感じているのでその準備をしていきたい。

ただGoは難しい。KotlinにあるものがGoには何もない。

あと、Rustはやらない。Goの立ち位置をRustが奪うとは今の所思わないのでキャッチアップのコストが高すぎる気がする。wasmがいろんなところで今後より使われていきそうな気がするのでそうなってきたらやるかも？とりあえず、今はGoとかの方が優先。

## TypeScript
今年はGoよりもTypeScriptの方が触れたのと、一通りフロント、サーバーのTypeScriptでの開発イメージがついたので2023年度はGoの方が優先。ただ、CloudflareのようなCDNサーバーでのエッジコンピューティング的な盛り上がりがあったように観測しているのだけれど、そこについて全くキャッチアップできていないので2023年はそこらへんをやりたい。実際に本番運用されるようになってくるのか、きているのかはわからないけどいつかは来ると思っているので、早めに触っておこうと思う。

余裕があればもう少しTypeScriptの習熟度を上げたい。普通にかけはするけど複雑な型構造の作成や利用になると自信がない。

## web3(flow)
2022年のweb3の国内での盛り上がりを十分に観測することができた。2023年もこの盛り上がりはまだ続くと思ってるのだけど、作りたいものがない。何か作るとなるトークンとかDaoが絡んだDappsを作成しようとなろのだけど**トークンを使う意味**とか**それは本当にDaoなのか**とか本当に自立していて分散的なアプリケーションを作る構想ができない。そんなこと言ってないで何か作れよと思われそうだけど急に腰が重くなってきたので一旦web3はいいかなと思っていたところ、**flow**の存在を知る。

なぜflowかというと目先のcryptoユーザーをターゲットにせず、デジタルコンテンツを当たり前のように所有する時代を目指してflowチェーンやcadenceの開発を着実に進めているところが非常に共感できたから。将来Dappsが当たり前になって、Daoとかも普通に浸透していて、walletもPayPay使うくらい当たり前になって、仮想通貨もポイントチャージするくらいに世の中に浸透するかどうかは来たらいいなとは思うけど、来るかは正直わからない。でも、**NFTが実現するデジタルコンテンツを所有する未来は一番イメージができた**というか実現できそうだなと感じた。特にアニメとかアイドルとかコレクター文化のある日本では。

Cadenceという独自言語を開発しているのも魅力的に感じた。最初は「独自言語はハードルが高いな」とか「Solidityやった方が汎用性高そう」みたいなことを思っていたけど、Solidityを書くのがあんまりしっくりこなくて、ブロックチェーン特有の注意しなくちゃいけない点とか、とりあえずOpenZeppelin使う見たいなのもあってあんまり理解してないで書いてる感じがあんまり楽しくなかった。(あくまで筆者の感想です。)なので、Goで開発できるCosmosSDKに惹かれたこともあったけど、web2の言語でチェーンやコントラクトを実装するにはフレームワークに従って開発する必要があり、これもあまり理解できず難しいなと感じていた。そんな時に、Cadenceの**スマートコントラクトという新しい概念を実装しようとするのだから既存の言語じゃ無理でしょ、だから、Cadenceを開発したんだよ**みたいなことを確かおっしゃていた気がしてとても共感ができた。

個人レベルで何か作るにもmintサイトとかNFTは作りやすいなとも感じたので2023年も引き続きweb3は追っていこうと思っていてCadenceで色々コントラクトを書いてみたいなと思ってます。

# その他
上記で書いたのは最近のトレンド的なものだけどやっぱりエンジニアとしての地力みたいなのが足りないなとも感じた2022年でした。DB設計とかあんまり実務でちゃんとやってきてないし、パフォーマンスチューニングとかも雰囲気でしかわからない。linuxのコマンドも基本的なものしかわからないので、よくみる```awk```を使ってパイプで繋いだコマンドとかも書けないし正直よくわかってない。linuxのコマンドとかはdockerファイルを書いたりとか、CI組んだりとかDevOpsだったり、インフラ的な領域になった時にやっぱりもう少し使えた方がいいなと感じている。

なので、**DB**や**シェルスクリプト**などの学びも2023年は早めにやりたいなと思っています。あと、kubernetesももう少し触りたい。あとマイクロサービスが実際どんなアーキテクチャなのかわかってないので何か1冊技術書読みたい。

# アドベントカレンダーをやった感想
ノリでカレンダーを作成して、始めたけど思っていた3倍くらい大変だった。正直完走できないかもと思ってたので完走できただけよかった。記事的にはTODOに入れていたいつかやろうリストを放出した感じでやろうと思っていたことがギリギリで一気に放出できてリストがスッキリ。

今年やったこと来年やることをざっくり整理できたのもよかったなと思う。

記事の内容的には筆者がやりたかったことを書いただけなのであまり有益ではなかったかもしれないけど年末にまとめてアウトプットするのはいいなと思ったので来年も何かしらの形でやろうとは思いました。

とりあえず25日完走できましたー（パチパチ）
読んでいただいた方々、ありがとうございました。このアドベントカレンダーでQiitaデビューもできたのでQiitaでも今後機会があれば記事を書いていきたいと思います！お疲れ様でした！