ハローワールド。
2021年に触った技術の振り返りや2021年に触った技術に触発され、私的には激動だった2021年を技術という形で振り返ってみようと思い、細々とまとめてみます。ブログらしい記事でいいんじゃないでしょうか。
下記の記載はすべて私自身の意見です。
2021年の大雑把なまとめ
技術を振り返る前に、どんなことやってたのかなぁという振り返りです。
大きく分けて前年度に当たる1~3月、転職前の4月~8月、転職後の9~12月で使っている技術は全然違ったかなぁと思います(いや、1月~8月まではやってること一緒だったんですがね)。
転職前、最後の仕事はFlutterによるスマホアプリの開発でした。バックエンドはPlayFramework(ただしJava)で、どちらも開発していたので、今まで触れたことのない部分を一気に触れた気がします。
また、やれAWS、GCP、Azureといったクラウドの概念なんて捨て去っているので、オンプレで云々といった部分も多少はやっていました。僕のメインはインフラでしたが、このプロジェクトではそこまでその部分をちゃんとやっていたわけじゃないです。
転職後は完全にTypeScript1本槍になりました。フロントエンドはReact(Next.js)で、バックエンドはExpressで記載しています。
インフラはGCPを利用しておりその関係でBigQueryを触る際にSQLを触る・未だに僕は手短に大量の言語処理を行う際はRubyを書く・など、TypeScript以外に触れる機会はないわけではないんですが、数としては1%にも満たないでしょう。
前半で触った技術
本章は転職前に触っていた技術についてまとめています。
Java
Java Silverの模試みたいなのを解いてみて(前職では積極的にSilverの資格は取ってね、というスタンス)、ノー勉で合格点を取れる程度のJavaの知識はありますが、まともな開発は初めて行いました(ちなみにJava Silverは持ってません。仮に取るならRuby Goldの方を先に取る)。
とりわけ、Databaseとの連携部分が既存のORMなどを利用せずほぼ全てJavaの機能とフルスクラッチで書かれた処理だったので、大変ながらもいい勉強になりました。
その処理はJavaのリフレクションを利用しており、Rubyのメタプログラミングに近いこの書き方を見てちょっと感動したのと、Javaのこと全然知らないなぁと思ったのは覚えています[1]。
また、本格的に取り組んだからこそより知れた部分もあります。例えば、Javaのthrows
は結構好きな構文[2]なんですが、throwsを記載しなくてもいい例外があるので(Exeption
は書かなきゃ行けなくて、Error
は書かなくてもいいとかだとは思います)その部分はちょっと気持ち悪いなとか。
PlayFramework
Java/ScalaのWebフレームワークです。個人的には以前調査した時には悪くないフレームワークだなぁと思っていました。
いざ触ってみると
- 日本語版のドキュメントがだいぶ前のもの
- 英語版ですら実際のコードや動作と乖離している
- マイナーアップデート(たしか2.3から2.4とか、2.5とか2.6)の前後で大きなBreaking Changeが発生
などなど、基本的な機能はともかく、ライブラリとしてはだいぶ致命的な統制のなさがあって困った記憶はあります。ただでさえJavaの情報が少ないのに、2.4で使えたのが最新の2.8では使えませんでしたというのが後を立ちませんでした。一応Webフレームワークとしてセキュリティ的な観点で消えたなどのパターンがほとんどだとは推測しますが、いささか初学者には厳しい環境でした。
一応最後の点に関しては、Play Framework1はJavaでPlay Framework2がScala中心ということで、いわばAngularJS1とAngular2以降のように(またはPython2とPython3とかRuby1とRuby2)大きなアップデートをしているので、実質的にマイナーアップデートがメジャーアップデートなのかも知れません。
Javaではこれを利用しないのが懸命だとは思います。Scalaではいいかも知れません。
Dart
Flutterを利用する際に利用した言語です。個人的にはあんまり好きな言語じゃなかったのは確かです。
型付言語なのに、デフォルトだと型による制約がクソ雑魚だったり、構文がいまいち噛み合ってなかったりと、あまりいい印象ではなかったです。また、ちょうどプロジェクトの最中にnull sound safety
という機能、いわゆるNull Safety
が入ってきて、割とそのあたりでも苦労をした覚えがあります。細かいことを書くとめちゃめちゃ書けますが、一応この辺で。
ただ、私自身がJavaScriptではなく(転職前も)TypeScriptを主戦場としていた事による色眼鏡を通して評価しているからというのも事実で、純粋なJavaScriptと比べたら十分な強さを持っていると思います。そういう意味でもTypeScriptはJavaScriptの自由度の高さ(のメリット)と漸近的な型付けによる(心理的)安全性の比重がとても高いんだな、と思わせてくれた言語でもあります。
一応サーバーでも動くらしいですが、Dartをサーバーサイドで採用しているところってどれくらいあるんでしょうね。一応Flutterを使っているならメリットを享受できると思うのでそこまで少なくないと思いますが、全く聞かない気がします。
Flutter
Flutterに触りだしたのは2020年の10月頃でした。ちょうど僕はVue3とReactを天秤に書けてReactのほうが良いと判断し、Vue一辺倒の個人開発からReact主体に移りだした時期だと思います(結局あんまり書きませんでした)。
Flutterは宣言的UIであり、これはReactもそうですね。Reactに関しては、とりわけ関数型コンポーネントしか書いたことがなかったので、宣言的UIに対する無知加減はそこまでなく、Flutterに関してもそこまで理解の難しい概念ではなかったです。
だからこそ、Reactと比べてしまうのです。まだFlutterはエコシステムが完成していない段階だと思っており、そのせいで特に状態管理は未だ跳梁跋扈していた時期だったと思います。一応当時はProviderパターンというものが主流ではありましたが、ReactではReact Hooksというものが出てきており、Flutterにもhooksのようなライブラリが登場していました。一層最適解を探している段階、という状態だったことを記憶しています。
またReactはWebのコンテキスト上に乗っており(あくまでReact DomとかJSXとかを使って、という話です)、htmlとcssという土台の上にReactが乗っているからこそ、React自体は処理というただ一点に打ち込むことができます。マークアップのスキーマはさておき、例えば左に少し間を開けたかったらmargin
を設定すればいいだけですし、フレキシブルに並べたかったらdisplay
をflex
にすれば良くて、縦に並べたかったらflex-direction
をcolumn
にすればいいしのです。
Flutterはそういった構造や見た目もすべてFlutterで表現しなければいけません。例えば、隙間を開けたいときはPadding
Widgetで隙間を開けたいWidgetを囲まなければいけませんし、フレキシブルに並べたかったらExpanded
かFlexible
で対象を囲み、縦に並べたかったらColumn
で囲う必要があります。
FlutterのWidgetの構成のほうが好みに合う、という人もいるので単純な好みの話かもしれません。私自身は、Button
WidgetとMargin
Widgetが同じWidgetという土俵に立っているのがあまり好きではない、という立場です。これは、htmlでセマンティクスな構造が好きかどうか、みたいな話に通じるかも知れません。
ただ、開発者体験はめちゃめちゃ良くて、そこはさすがだなと思いました。ちょっとiOSのビルドとAndroidのビルドは面倒ですが、それはどんな場合でも面倒なので。
vs Excel
前職はSIerでした。ステレオタイプなSIerとは言いませんが、それでもExcelはありえないほど使われていました[3]。
Excelでの管理は別に賛成派ではないですが、たしかに(会社内の人であれば)誰でも開けるのは強みで、ちゃんと表計算ツールとして使うのであればExcelは強いです。
色々あってFlutterのアプリですが、マスタデータをソースコード内にハードコードする(設定ファイルという言い方をして上司を言いくるめてました)暴挙に出ており(そして発端に関しては僕もちょっと噛んでいるのでなんとも言えない)、データベースでの管理ができませんでした。なので、マスタデータをExcelにまとめて、それをソースコード化したいという需要は僕の中にありました。
ただ、Excelの機能だと色々不十分なところもあり、セキュリティ的にもVBAを書きたくない僕の思い的にもマクロを有効化したくなかったです。結局PowershellでExcelのデータを読み取って云々、というスタンスを取りました。よく考えたらPowershellを管理するのだれやねんという話ですが、まぁそこまで難しいコードではないので誰でもできると期待しています。
Powershellは.NET系のライブラリは何でも使えるという特性があり(Excelは.NET用のAPIがある)、簡単にソースコードをイジれるので採用しました。ただ肝心のAPIは本当に情報がなくて、それっぽい関数を実行してみてはああでもないこうでもないと弄くり回した覚えはあります。VBAと一応同じようなAPIはしているのですが、引数の渡し方とかちょっと違う部分があったので。
ただ、大変申し訳なくもこのプロジェクトの後釜に任命された同期は僕のPowershellをいじっています。このExcelしかない社会に潤いを与えてくれているので、闘ってよかったとは思っています。
電子署名
1月~3月は、特にマイナンバーカードとの対決でした。色々紆余曲折していましたが、DigestInfoとだけ言われた私への手向け歌とか電子署名について一歩踏み込んで知るみたいな記事を記載するぐらいにはちゃんとやってました。
この頑張りを分かってもらえる人が多くないのはツラミポイント。
以前からこの辺の知識がなかったわけではないですが、特にDigestInfoは割と詳しくなったと思います。
後半で触った技術
転職後は打って変わってイケイケWeb企業なので、何から何まで違います。
TypeScript
2月が終われば転職して半年ですが、この半年TypeScript以外を書いた記憶が本当にありません。
やはりTypeScriptは個人的にはかなり収まりの良い言語で、JavaScriptの自由奔放さの良い部分はそのまま、型による制約で凡ミスを抑えてくれたり、エディタによるサジェストなどの開発者体験の向上という部分はかなり高い満足度があります。
別にTypeScriptを愛しているから転職したわけじゃないですが、たまたまバックエンドもフロントエンドもTypeScriptしかないチームに配属されたので、こうなりました。
その一方でガッツリチームで・仕事で開発するのは(Javaと同様)初めてなので、色々知れたし、色々不便だと思う部分も増えたなぁという感想。
TypeScript単体では、個人開発でも全然高いレベルまで学べていたんだなと思う一方、エコシステムはやはり仕事で開発する上でないとわからないところもあったなぁと思います。
例えばRenovateやmonorepoなんて言葉は転職してから知りました。
React
フロントエンドはReact・Next.jsを利用しており、転職前までは正直そこまでReact書いていたわけではないのですが(あんまり個人開発をしていなかった)、勉強していた分すんなり入れています。後、社内用ツールみたいな立ち位置なので見た目に高いこだわりが無いのと、僕に割り振られている処理がほぼ裏のドメイン処理なので、そこまで書いてないのはありますが。
React自体はv16.8のReact Hooksという弾丸を授かった後に勉強をしだしたので、まだClass-basedなコンポーネントが残る現状のソースコード、読みづらい部分がある。昔からReact触っていた人からしたらこういう人がいるんだなぁと思われるでしょうし、私自身もVue3しか知らない人がいたら同じような驚きを持つ気がします。Vue3は正式版になってから1か月と立ってないけど……。
SuspnedやServer-side RenderingやNextのSSR Streamingなどどんどん新機能が追加されていく中、なんとか追いかけていけているなぁと思っています。
Express
バックエンドはExpressで動いてます。Swaggerを使っているのですが、Express用のSwaggerがまーアップデートされず、お困り状態。
最近はExpressのミドルウェアを書きました。Rack Middlewareを書いたことがあるので、そんなに難しいものでもないなぁと思いながら書いてました。ただ、これ今年の話なので、2021年とはちょっと無関係かも。
OpenAPI・Swagger
あんまり対した使い方をしたわけではないですが、初めて触りました。
感想としては、ちょっとプロジェクトが大きいとファイルデカすぎて吐いちゃうので、ファイル分割とかできないのかなぁ、という感じです。調べてないですが。
GCP
チームによって使っているインフラが違うのですが、私のチームはGCPを利用しています。個人的にはAWSより好きです(個人開発でTerraformのお世話になることないし)。
今までGCPはApp EngineとFirebaseしかまともに使っていませんでした。チームではBigQueryやCloud Function、Cloud Tasksなど色々(そこまで多くはないですが)使っています。別のチームではCloud Runなども使っており、個人的に今気になっているのもCloud Runです。
Firestore
GCPの中で、昨年最も仲良くなったのは間違いなくFirestoreです。仲良くなったけど、いまいち僕の思ったとおりには動きません。
DBにはFirestoreを利用していますが、現状めちゃめちゃそこがボトルネックになって全体の処理が遅くなっています。Firestoreが遅いわけではありませんよもちろん。アルゴリズムとかそういうった部類の話です。
昨年から今年にかけてその部分をめちゃめちゃ頑張って修正していました。具体的にいうと、トランザクション周りで一日10000件ぐらいエラーしていた処理を100件以下まで落としました。トランザクション周りで失敗するとエラく時間がかかってしまうため、今年は更に仲良くなっていきたい所存です。
Datadog
Datadogというサービスを使ってWebサービスのモニタリングを行っているのですが、こいつがめちゃくちゃ便利で感動しました。
例えばリクエストの中のFirestoreとのやり取りがどれぐらい時間かかったかなどを表示できるのでめちゃめちゃ便利。DataDogがなければ調査はできなかったと行っても過言ではないです。
触った技術、というよりかは感動したサービスに近いです。同義語はRenovate。
Slack
これも触った技術ではないですね。
前職はよくわからんチャットツールがありましたが、基本的にはメールか、部署によってはなぜかSkype[4]、人によってはIP Messanger。2年前、とある企業に出向しましたが、そのときはMicrosoft Teams(全社)とSlack代替のツール(部署)とIP Messanger(部署全体・実質)でした。
(Skypeはともかく)Teamsは便利でしたが、やはりSlackはめちゃめちゃ便利ですね。絵文字めっちゃ定義しまくってます。最近のお気に入りは「超絶理解」(昔からの口癖です)の絵文字です。
特に、僕の経験した2社と違ってツールが統一化されていることが一番良かったと思います。無駄に分けるぐらいなら全部メールでいいと思うし、SlackだけにするとかTeamsだけにする、というのが一番だと思いました。
まとめ
去年は転職という人生最大レベルのイベントこそありましたが、TypeScriptめちゃめちゃ書いた年でもありました。
このままだと私自身がTypeScriptの終焉とともに人生が死ぬので、別言語を趣味枠で採用したい2022年ですね。
候補としては第一候補にRustで、第二候補にgo。死ぬほど暇ならTLS1.3かQUICのクライアント作ってます。多分無理。
今年はどんな技術に触れる年となるでしょうか。
大変だった、という文言は恐ろしいまでに裏があります。まずこのライブラリの問題点として、更新処理(insertやupdate)などでSQLインジェクションが必ず発生していたので、それを僕の方で修正しました。このライブラリは元となるプロジェクトで利用されており、そっちはライブラリに更に手が入っていたため別の修正を入れ、結果的にライブラリのソースコードに差分が発生しちゃいました。更に2つ目の問題点として、トランザクションの概念が死んでいたので、同時にアクセスされたらちょっと困っちゃうみたいな現象が発生していました。それ起因でバグが発生していたのですが、元のプロジェクトでは力づくで修正。僕はまだリリースまで時間があったのでスマートにトランザクションの処理を追加したりしていました。なので、元のライブラリとの互換はギリあるものの、ソースコードが6割ぐらい違うという自体に。 ↩︎
Javaのメソッドなどで利用できる構文で、このメソッドはどんな例外を吐くかを記載できる ↩︎
中にはWebサービスみたいなエクセルもありました。エクセルのボタンを押すと、障害報告のテンプレートが表示され、障害報告の内容を記載して保存するとマスタがアップデートされる。マスタの行をクリックすると障害報告の記載が表示される、とか。ここまで来るとExcelの強さに驚くばかりです。 ↩︎
ちなみに個人向け利用のSkypeを社内の連絡用で使うのは利用規約的に問題ありません。 ↩︎