blog.syfm

徒然なるままに考えていることなどを書いていくブログ

一年を振り返り… (2024)

仕事

今年は初めての転職をした。前々から同じ会社で何年も所属することに対して漠然とした不安があり、在籍年数を重ねるに連れそれが大きくなっていた。新卒 3~4 年あたりでやめる人の気持ちがわかった気がするw

新しい職場での適応はかなり苦労した。ドメインがかなり違っていたのに加え、そのドメインが非常に複雑だった。当然実装も複雑で前職とはまた違った質の難しさがあった。前職でメルカリ ハロの開発チームにいたときはそこまでキャッチアップに苦労しなかったのでここは予想外だった。直接的なきっかけはよくわかっていないけど入社半年くらいのときに一気にブレイクスルーした実感があり、今はある程度自信を持って楽しく開発できている。

やっぱりある程度同じ場所にとどまり続けるとどんどん淀んでいってしまうのでこうやって環境を変えたり、知らないことを知りにいくのって大事だなぁと思った。仕事以外でも言えることなので改めて意識したいな。

技術

転職しても Go をメインで書いているのでそこは変わらないものの、いまの会社では Web フロントエンドも開発するので Vue や Nuxt を仕事で書く機会ができた。実は仕事で Web フロントエンドを書くのは初めてなので大変なこともあるけど、プログラミング初めたてのころはフロントエンドが好きだったので抵抗感は全然ない。画面がどんどんできていく様を見るのは楽しい。

読んだ・読んでいる本

  • 効率的な Go
  • 脳に収まるコードの書き方
  • フロントエンド開発テスト入門
  • SQL アンチパターン (再読)
  • MySQL 8 Query Performance Tuning
  • エンジニアが学ぶ会計システムの「知識」と「技術」
  • データモデリングドメインを駆動する

まだ読めてないけど Tidy First? やこれから発売される マルチテナント SaaS アーキテクチャの構築も面白そうなので読むぞ!

旅行

福岡・大分・熊本

太宰府天満宮 (改修中のすがた)

妻のご両親に会いに地元の福岡へ。車で福岡や大分、熊本などたくさんの場所に連れて行っていただいた。ごはんが美味しいし、自然豊かで温泉もたくさんあるし本当に良いところ。また行きたいな〜。

伊香保

6 年ぶりくらいに伊香保に旅行に行った。行って初めて気づいたけど伊香保のあらゆる店舗で水曜日が定休日に設定されているっぽく、水曜日だった初日はほとんどの店がやっていないという想定外の事態だった。もともと外出メインにするつもりではなかったのでギリギリセーフだった。宿は前回泊まった宿の姉妹宿にしてみた。この系列宿はごはんがおいしくて満足度高い。

益子

GW にやっていた陶器市に参加するために益子へ。さまざまなお店が出店していて、同じ益子焼でも作家ごとに特徴が全然違っていて見ているだけでも楽しかった。もともと狙っていた作家さん以外にも偶然の出会いがたくさんあり、充実の収穫だった。益子以外でも陶器市があるようなので他のところも気になる。

京都

ユーフォ 3 期があり、エモくなった勢いで聖地巡礼も兼ねて京都に行った。宇治に行くのはかなり久々だったけど変わっていなくて安心した。3 泊 4 日くらいで枠を取って、初日だけ聖地巡礼の予定を入れ、その他は白紙にしていたけど行きたいところが多すぎて全然時間が足りなかったw京都住みたいな〜〜

草津

忘年旅行でつい最近行った。コロナ前に計画していたものの白紙になっていた旅行だったのでようやくといった感じだった。なんだかんだ草津に行くのは初めてだったけど、めちゃ寒くて会津を思い出した。温泉の硫黄臭に関しては地元のいわき湯本温泉が一番臭いと思っていたけど、草津のそれは同じかそれ以上でかなり良かった。

観たアニメ

ベストは思い出補正も含めて空の境界 未来福音。泣いた。
今年も全然開拓できていなかったけどたまたま目に入ったダンダダンが面白くてマンガも最新話まで全部読んだ。

プレイしたゲーム

今年プレイした龍が如くはそのどれもが面白かった。9 や Lost Judgment の続編も待ってます!!
なんだかんだペルソナも初めてプレイした。途中まで真が一番好きだったけど後半で芳澤がトップになってしまった

今年も何事もなく元気。年取らないでくれ〜〜〜〜〜

人生

特になにもなく穏やかだった…と思ったら大晦日に妻が食中毒 or インフルっぽい症状でダウンしてしまい波乱の年末年始となった。おせち料理を二人でつくる予定が狂ったり、予約していた年越しそばを食べられずに年を越すことになったり、残念なこともあったけれど一旦症状が改善しつつあるので本当に良かった。来年の大晦日にはネタにできるであろう...!来年は健康的な一年にするぞ

一年を振り返り… (2023)

仕事

今年の前半は引き続きメルペイに在籍していた。マイクロサービスの技術的負債を解消するプロジェクトをメインで進めると同時に新規のプロダクト機能開発のサポートを中心に進めていた。また、チームではテックリードの移行があり、現テックリードだった自分から別のチームメンバーへの引き継ぎなども進めていた。

後半になるとチームを異動し、メルカリハロの開発に関わり始めた。今までのチームが自分も含めて新卒が多いチームだったのに対し、このチームは新規事業なだけありシニアレベルのエンジニアしかおらず非常に刺激がある毎日になっている。自分としても比較的得意なアプリ内の決済系機能の開発をリードしており、やりがいがあるなぁと感じている。2024 年初春にローンチ予定なので今の時期が一番忙しいけれど良いプロダクトを届けられるようにやっていくぞ 💪

about.mercari.com

技術

チームを異動したことで新しいアーキテクチャ、新しい技術スタックとなった。プログラミング言語などの根幹の部分は大きく変わっていないが、モジュラモノリスを取り入れていたり、GraphQL を BFF として採用していたり、DB に PostgreSQL を使っていたりと今までプロダクションで採用していなかった技術も取り入れられている。

プライベートでは引き続き GraphQL や React、Next.js などを使ったり、ISUCON の練習時に eBPF に興味を持ったりしていた (まだほとんど学べていないが…)。また、久しぶりに Go で静的解析ツールを書いたりもしていて、analysis パッケージや go/types パッケージの便利さを再認識した。

OSS

今年はほとんど活動できなかったに等しい。なかなかモチベーションが保てない時期が多く、悩ましい問題。去年からなにも動きがないが、どこかでまとまった時間を取って今後の方針を考えたい。

読んだ本

今年読んだ中では単体テストの考え方/使い方が一番良かった。

  • 単体テストの考え方/使い方
  • システム設計の面接試験
  • Production Ready GraphQL
  • スタッフエンジニア マネジメントを超えるリーダーシップ

旅行

そこまで多くなかったけどちょこちょこ行っていた。本当は ISUCON 旅行も予定していたけど紅葉の時期 & 直前で予約しようとしていたので宿の空きがなく断念した…。

浜松

高校の友人らと行った。二日目はあいにくの天気だったが浜松餃子を食べられたので良かった。 オルゴールミュージアムが結構面白かった。

川越

ドラクエコンサートが川越だったのでそのついでに寄った。 すごくよさそうな飲み屋も多かったので飲み目的でもまた行きたい。

会津

大学の友人らとの旅行。ひさびさに会えた友人もおりとても良かった。 また、学生時代に無限に行っていた店にも行けたので満足!

博多・天神

会社で福岡出張があり、そのついでに観光した。 博多や天神の雰囲気が京都に似てるなーと思い、はてなインターン時代を思い出した。 本場のとんこつラーメンも食べられた。

観たアニメ

ガルパンの継続戦よかった。また、空の境界矛盾螺旋を劇場で観ることができて大満足。

プレイしたゲーム

植物

結構増えた。今年買ったなかでは大型アルバ、モンソニア ペニクリナム、笹の雪がお気に入り。 冬の間の置き場所が悩ましい問題が出てきた。

すっかり大きくなり、体重も 5kg 台に突入した。変わらず元気なので今後もずっと元気でいてほしい。 小さかった頃の写真を見るとめちゃめちゃ小さくて見るたびにびっくりする。

人生

特に大きなできごとはなかったが、結婚式のかわりにフォトウェディングを行った。
こういった出来事は初めてだったが自分とは思えないような立派な写真を取ってもらえたので嬉しかった。また何かの節目にこういった写真を取ってもらいたいなー。

終わりに

今年は比較的おだやかな一年だったとは思いつつも、仕事の変化があったりとずっと続けてきたことが変わった一年でもあった。自分は変化に弱い傾向があるので適度に休みつつ、自分のペースで進められたらなと思う。 来年も良い年であることを祈りたい。

ISUCON13 に参加した

毎年恒例の ISUCON に参加してきた。メンバーは毎年恒例 @acomagu & @natumn 今回はノベルティが欲しかったのもあり個人スポンサーになってみた。

結果としては最高スコアで 56180 点を出すことができたが、再起動試験に失敗し fail でした…。

事前にやったこと

今年はあらゆるものを自動化しようとしていて、具体的には以下のことをしてみた。

  • Ansible: もともとだいぶ前から Ansible で初期セットアップを自動化していたけど、今回はさらにいろんな設定を追加してみた
    • ツール群のインストール
    • Netdata のセットアップ
      • まったく使わなかったが…
    • Cloud Profiler/Cloud Trace で使うクレデンシャルまわりの設定
    • Slack 通知用の設定
    • MySQL のユーザ作成・権限追加
    • nginx のログフォーマットを LTSV に変更
  • コード自動修正ツール: ソースコードに対してこのツールを実行すると以下の設定や実装を自動的に追加・修正してくれる
    • 特定の関数やメソッドを context に対応しているものへ置き換える
    • request context を各関数・メソッドへ渡すようにする
    • サーバ起動時に Cloud Profiler/Cloud Trace 関連の設定、エージェントをスタートさせる
    • ベンチ実行後に自動的に slow query や alp の解析結果を Slack に通知させる

どれもやってよかったけど、特に Cloud Profiler/Cloud Trace や Slack 通知周りが便利で競技中はほとんど手動で計測を行うことはなかった。ただ、後述するように準備の時間が十分にとれていなくて競技時間中にツールを修正したりしていたのが痛かった…。

当日やったこと

当日は @ktr の自宅に集まり、猫に見守られながら参加していた。

競技開始直後

  • 各メンバーが ssh してサーバに入れるか確認
  • サーバで起動しているアプリケーションの設定確認
  • Ansible 実行
  • コード自動修正ツールの実行、メトリクスやトレースが取れているかの確認
  • ソースコードのバックアップ
  • 当日マニュアルおよびアプリケーションマニュアルを読む

このあたりを分担してやっていった。自分は Ansible 担当でほとんど自動化されていたのでその間にマニュアルを読んでいた。ただ、その後に実施したメトリクスやトレースの設定が一部うまく動いておらず修正にわりと時間を費やしてしまった。

昼ごろまで

  • アプリケーションのアクセスログを切る
  • アプリケーションのログレベルを上げる
  • MySQLinterpolateParams=true を設定
  • MySQL を2つめのインスタンスへ分離する
  • users テーブルに icon_hash を保持する
  • ボトルネックとなっているクエリに対してインデックスを貼る

今までは後半になってから複数台構成へ移っていたが、自分たちはインフラに対して比較的不慣れだったのでほぼほぼ初手で複数台構成へ変えることにした。とりあえずアプリと DB は間違いなく分けるだろう、ということで 2 台構成としており、今回はほとんどハマらず移行することができた。

あとは毎回やっている設定を行ったり、明らかなボトルネックを潰したりといった感じで午前中は終了。だいたい 6600 点くらいだった。

午後

  • 一通りコードに目を通して改善できそうな箇所にコメントをつける
  • Redis で user、livestream、ngword をキャッシュする
  • トランザクションが不要な箇所の修正
  • NG ワードチェックをクエリではなくアプリケーションだけで行う
  • タグを DB ではなくアプリ内のメモリに持つ
  • アイコンを nginx から配信する
  • PowerDNS をやめてオレオレ DNS に切り替える

とにかく N+1 が多かったのでそのあたりを順番にキャッシュしていった。また、すべての DB アクセスでトランザクションが貼られていたのでコードリーディングしつつ本当に必要なところだけに絞っていった。

アイコンについては If-None-Match の仕様があることが分かっていたのでそちらの仕様を利用するか、nginx から静的に配信するかで迷ったけど最終的に nginx からの配信とした。ただ、nginx の設定にドハマリし、1 時間くらい溶けたのでこの方針が良かったのかはわからない…。

また、このあたりの修正が終わったあたりで水責め攻撃による PowerDNS の負荷がボトルネックになってきていたので改善に着手し始めた。DNS の運用経験も PowerDNS の知識もまったくなかったので、チームで話した結果、Go で簡易的な DNS サーバを書くのが一番効率的かつ不確実性が低そうという結論になった。この方針はかなりうまくいき、30~40 分くらいで完全に置き換えることができた。

ここまでで 24000 点くらい。

ラスト 45 分

  • MySQL の binlog を止める
  • nginx のログを止める
  • アプリケーションのログを止める
  • メトリクスやトレースを取るのをやめる
  • 残っていたスロークエリ用にインデックスを貼る

基本的に最終ベンチに邪魔なものはすべて止めていった。早めに終わったのでアプリケーションコードに変更を加えないで済むスロークエリの改善を行っていた。支配的なボトルネックではないと思いこんでいたので、多少スコアが伸びればいいなーくらいの気持ちだったが、なんとこれがめちゃめちゃ効いてスコアが倍くらいになったw

一番最後のベンチで最高点を出して競技終了。

終わりに

最終的に上位 30 位に入れるスコアだったのに fail してしまったのはとても残念 😇 時間がギリギリになっていたのと、おそらく大丈夫だろうという憶測で再起動チェックをしなかったのは最大の反省点かなぁと思う。

他にもツールがうまく動かなかったことや nginx の設定でハマったことで無駄に時間をかけてしまっていたところや、結局 3 台目のインスタンスを使わなかったところも反省点。このあたりは次回までにちゃんと対策したり・戦略を考えておきたい。

とはいえ今回の ISUCON もめちゃめちゃ楽しかった!競技が終わってからもしばらく ISUCON のことを考えていたくらいなので来年こそは良い成績を残したいなー。毎年一緒に出てくれる友人たちにも感謝 🙏

運営に関わった皆様ありがとうございました。

追記

インスタンスを構築していた友人によると fail の直接的な原因は自作 DNS サーバを systemd に登録していたものの、スタートアップ時に自動起動する設定になっていなかったとのこと。こういう凡ミスを避けるためにも再起動試験は必須ですね 😇