2024年の振り返り


はじめに

あけましておめでとうございます。
本来ならば、年末に振り返りを書くべきなのですが、今年は年末に書く時間が取れなかったため、年明けに振り返りを書くことにしました。

このブログサイトを開設した2024年3月から、今日までに学んだことを振り返ります。

学んだこと

3月

人生初のブログサイトを開設しました。
この時期は4月の新社会人前の最終調整として勉強をしていた記憶があります。
まだ配属先が決まっていなかったので、とりあえず個人エンジニアと言えばなブログサイトを作成しました。
主な学びとしてはAstro, SSR, Cloudflare, TailwindCSSですね。

Next.jsでのアプリ開発でフロントの基本は理解していたのですが、レンダリングについては深く意識したことがありませんでした。
Astroで強制的にSSRを意識することになったため、その辺りの理解が深まりました。
このときの理解が後のPPRServer Islandsなどに繋がります。

またこのとき初めてヘッドレスUI、TailwindCSSに触れました。あいにくこの辺はまだまだ理解が浅いです。今ならばMUI baseを使うと思いますが、正直個人ブログだとヘッドレスUIは持て余しちゃう気がします。そんなに多くのコンポーネントを使わず、いそぐ理由もないので、chatgptと協力してReactで好みのUIを作る方があっている気がします。

またサイト運営といえばなSEOについても触れました。lighthouseでのスコア改善やGoogle Search ConsoleGoogle Analyticsの設定などを行いました。この辺を使うとブログ運営している感がありますよね。

4月

新卒研修が始まりました。基本的な情報学的なものから、sql, java, html, cssなどをやりましたが、基本的には復習でした。

この時期は理解度テストがあったので、そのために記憶を意識しつつ、他の同期特に未経験者に教えることが多かったです。

Javaもほぼ未経験だったのですが、似た言語を知っていたため、そこまで苦労はしませんでした。
このときはどちらかといえば歴史の勉強という感覚でした。

5月

引き続き新卒研修が続きました。研修は慣れてきて、個人的な勉強をする時間が増えました。
3月に学んだことから派生して、PPRやそれに活用されるSingle Source of Truthについてが気になっていました。MongoDBを使っていたので、MongoDBのChange Streamsを使って状態管理をすることを考えていました。後で知ったのですがChange Data Capture(CDC)という名前がついていました。
それから、研修で触れていたSpring BootでServer Sent Eventを使ってシンプルな状態管理ができないかと考えていました。この時ついでにhttp2についても調べました。
…まあhttp1に対してhttp2だとドメインあたりに同時に開けるストリーム数が増えて便利だということくらいしか覚えていませんが。

6月

研修まとめとしてチームでのプロジェクトがありました。
この辺りはJWTやSSO、OAuth2について学びました。マイクロサービスという概念が同期内で流行っていたので、それ繋がりですね。
チームプロジェクトとしては無難なClean ArchitectureにSpring Bootと基本的なものに落ち着きましたが、それでも十分楽しめました。

7月

配属が決まり、本格的なバックエンドエンジニアとしての人生が始まりました。
とはいえすぐに業務が始まるわけではなく、まずは配属先研修がありました。
商材に対する理解やより業務に近い技術を学びました。

Java Silverという資格を取りましたが、まあうん、といった感じです。基本的には復習でした。
このときは教科書を同期内で確認し合いながら読み進めていました。

8月

引き続き研修としてPostgresDBの資格、OSS DB Silverの資格を取りました。
これは結構難しく、最初に試験問題を見たときは「これは無理」と思いましたが、何とか合格できました。Java Silverよりも圧倒的に暗記量が多かったです。
あまり暗記ものには肯定的でなく、見ればいいじゃんという考え方なので、試験勉強中は辛かったのですが、終わってみれば、非常に便利な知識が増えたと思います。
今でもちょくちょくpsqlを使うのですが、安心感があります。

9月

配属先での業務が始まりました。
最初に振られたタスクはDB関連のパフォーマンスのチューニングでした。
結論から先に書くとマルチテナント環境でのため、Row Level Securityことが原因のバグにあたりました。

Numeric is not leakproof

Numeric is not leakproof

Numeric functions are not marked as leakproof in pg_proc.dat It cause unexpected behavior in case of using row-level security: create …

Numeric is not leakproof

https://www.postgresql.org/message-id/13a01430-672d-c73c-7abe-0b70e9e8aa01%40postgrespro.ru

発生条件が限定的で、再現しないだろうとのことでこれに対しては対応しませんでしたが、Postgresでのマルチテナント、デバッグ、RLS、の知識が増えました。

デバッグについては条件をずらしたSQLの実行計画を比べることで、どこで問題が発生しているかを特定しました。とはいえまさかRLS×Numericときのみ発生するなんて思わなかったので、途中別のことが原因であると勘違いもしつつですが。
これが原因だろう→もう少しテストしてみる→いや違った…ということを繰り返していました。

また個人の勉強としてはPHPを勉強していました。フレームワークなしのVanilla PHPでどれだけモダンなアプリケーションを作れるかということを考えていました。
Web Components, Shadow DOM, Custom Elements, などを主に学びました。

10月

gitのcommit messageのプレフィックチェクのためのHooksやコードレビューのためのラベルというチーム開発のためのものを新たに得ました。

またモジュラーモノリス、マイクロサービスについても学びました。というのも当時はまだモノリスでしたが、今後機能追加が増えることを考えて、モジュラーモノリスにすることをチームで考えていました。
マイクロサービスは過剰で、通信や整合性の問題があるため、モジュラーモノリスがベストだという結論に至りました。このあたりでCDCやOutbox Pattern, SAGA, イベントソーシングについても学びました。

GitlabからGithubに移行するタスクを任されたのでGithub Actionsについても学びました。

GitHub CI/CD実践ガイド ――持続可能なソフトウェア開発を支えるGitHub Actionsの設計と運用

GitHub CI/CD実践ガイド ――持続可能なソフトウェア開発を支えるGitHub Actionsの設計と運用

本書はCI/CDの設計や運用について,GitHubを使ってハンズオン形式で学ぶ書籍です。GitHub Actionsの基本構文からスタートし,テスト・静的解析・リリース・コンテナデプロイなどを実際に自動化していきます。あわせてDependabot・OpenID Connect・継続的なセキュリティ改善・GitHub Appsのような,実運用に欠かせないプラクティスも多数習得します。 実装しながら設計や運用の考え方を学ぶことで,品質の高いソフトウェアをすばやく届けるスキルが身につきます。GitHubを利用しているなら,ぜひ手元に置いておきたい一冊です。

GitHub CI/CD実践ガイド ――持続可能なソフトウェア開発を支えるGitHub Actionsの設計と運用

https://gihyo.jp/book/2024/978-4-297-14173-8

上記の本を読みつつ、先行して移行していたチームがいたので、それを参考にしつつ移行しました。
CI, CDについてはある程度理解していたのですが、このタイミングで新たにQodanaのような静的解析ツールやoctokovのようなカバレッジツール、RenovateやDependabotのような依存関係管理ツールについて知りました。
これらはもともと自分のチームには導入されていなかったのですが、せっかくの移行のタイミングなので、導入を提案しました。

11月

Java, Spring Boot環境でのテスト実装をしました。テスト自体は研修で習ったので知っていたのですが、このときは実行速度についてを特に意識していました。

もとのコードはカバレッジは高いものの実行時間は15分と長く、テストサイズやunitとintegrationの分離ができていないことが原因であると考えました。

Googleのテストピラミッドについても学びました。いかにしてsmallテストであるunitテストを増やすか、mediumテストであるintegrationテストを分離してテストタイミングをずらすかを考えていました。
なるべくSpringBootのテスト機能を使わず、MockitoやJUnitなどでPure Javaでテストを書くことを意識するように、チームドキュメントの作成、効果検証などを行いました。
これまではテスト作成というとカバー範囲を十分に満たすものを書くことが重要だと思っていましたが、このときに始めてテストの速度も重要だと気づきました。
私のチームにはQAがおらず、まだまだ改善の余地があるため2025年も引き続き取り組んでいきたいと思います。

テストの分割は影響範囲が広いため、まだ本番への運用はできていませんが、テストの実行時間は5分に短縮される予定です。
テストの分割はラベルという機能を使うのもそうですが実行対象のディレクトリを指定することでも可能で、今回は後者を採用しました。

12月

新機能開発として主にDDDにで開発を行いました。
今までなんとなくドメインエキスパートがきれいに境界を引いて、適切にディレクトリ分割をするものくらいの理解でしたが、このときは本格的に学びました。
ドメインエキスパートからドメインについての情報を引き出し、それを元にドメインモデルを作成し、それを元にアプリケーションサービスを作成するという流れですね。
このときユビキタス言語の重要性から、コード上でのDomain Service, Aggregation Root, Entity, Value Objectの違いについてや、ドメインモデル貧血症やビジネスロジックとの混在について実例を交えて学ぶことができました。

DDDについてチーム内で合意形成中なので2025年も引き続き取り組んでいきたいと思います。

ドメイン駆動設計 モデリング/実装ガイド - little-hands - BOOTH

ドメイン駆動設計 モデリング/実装ガイド - little-hands - BOOTH

本書は、初めてDDDを学ぶ方、もしくは実際に着手して「難しい!!」と感じているエンジニアの方を対象とした、ドメイン駆動設計(以下、DDD)についての解説書です。 近年、ソフトウェアのレガシー化が社会的に問題になっていると言われています。 DDDはレガシー化への対策として非常に有用なものですが、日本語で出ている書籍「エリック・エヴァンスのドメイン駆動設計」や「実践ドメイン駆動設計」は非常に重厚かつ難解で、初学者が実用に到達するまでには長い時間と試行錯誤が必要なのが実情です。 そこで本書では、迷子になりがちな「DDDの目的」や「モデル」の解説からはじめ、

ドメイン駆動設計 モデリング/実装ガイド - little-hands - BOOTH

https://little-hands.booth.pm/items/1835632

上記の本が非常に参考になりました。

個人的な範囲ではAPI GatewayやSemantic HTML, CSSについて学びました。
API Gateway導入による、価値創造のビジネスロジック実装に専念できるようになることの重要さや、Konnectで簡単にデプロイ、レートリミットが行えるのは非常に便利だと感じました。

Semantic HTML, CSSについては、今までTailwindCSSを使って書かれていたこのブログサイトを、Pure CSSで書き直しHTMLタグを意味のあるものにしました。
Semantic CSSというとclass名を意味のあるものにするということが多いようですが、私は意味のあるHTMLタグに対して直接スタイルを当てることで実現しました。
というのもAstroではデフォルトでScoped CSSが使われているため、class名を意味のあるものにする必要はなく、HTMLタグに直接スタイルを当てることができるからです。そのため、divやspanなど意味の無いタグを使わない限り、classを使わずにスタイルを当てることができます。

また並行してデザインシステム・デザイントークンについても学びました。
TailwindCSSの機能として有名なのがこのデザインシステムだと思いますが、variableや最近のCSSの機能を使って、デザインシステムを構築することができるということを知ったので試しにやってみました。このあたりはnuejsに非常に影響されています。

Standards first web framework

Standards first web framework

**New**

Standards first web framework

https://nuejs.org/