くるのプログラミング記録

プログラミングの感想とか解説とか。

業務5年目終わりメモ。

5年目が終わった。もう完全にテックリードエンジニアです!


4年目終わり。
ningenme.hatenablog.com
3年目終わり。
ningenme.hatenablog.com
2年目終わり。
ningenme.hatenablog.com


プロダクト全体のアーキテクチャ検討に奮闘し続けた一年かな。



以下5年目までの技術スタック。


DB・データストア・ストレージ

oracle
mysql
aurora
redis
s3
kafka
msk

(触らなかったもの)
postgres
aws sqs
cassandra
memcached
dynamo
solr


今年はkafkaがめちゃめちゃ印象にある一年。自分のチームでイベントドリブンでやりたい要件が出てきて、kafka導入した。
初めてdbを触ったときのような難しさがあってめっちゃワクワクした。今も完全理解ってわけではないけど、ある程度把握はできた気がする。
ちなみに本番運用はこれからなので、まだ痛い目見れていない。
kafka自体の良さは結構感じれるものの、周辺のエコシステムが微妙に弱い感じがした。mskのiam対応言語が少なかったり、公式cliちょっと使いにくかったり。
まあでも自分のエンジニアリングパワーで解決すべきことではあるので、まだまだパワー不足だなと思った。
dbとかはあんまりノウハウ増えてないけど、自分の好きなstateの遷移を明確にするデータの持ち方とか、データのライフサイクルとimmutableを意識した設計とかが活きてくる場面がかなり増えて、こういう設計しておいて良かったなあというのを感じれた。普段から理論的に良いと自信持って設計してるものの、価値を感じれるのって1,2年スパンかかったりするので、この辺経験できてるのは僕の中の体験としてとても良い。
自分の設計に成功体験を、ね。


言語

rust
Kotlin
Java
typescript
go
c++

(触らなかったもの)

groovy
php
javascript
python

今年は新言語開拓なし!ただrustを可能な限り書いていた。
自チームのメインの言語に採用とかは流石に無理だけど、小さいアプリケーションとか、競技プログラミングとか、趣味開発とか、こまごました場面で意識的にrust書いてた。楽しい。
web api も batch も cli も書いてみたので、rustである程度やりたいことができる感は出てきた。今年はしっかりしたwebアプリを1つ作りたい気持ち。



フレームワーク

Axum (new)
Spring Boot
Junit
Next
React

(触らなかったもの)
Spock
Laravel
Fuel
Symfony
Vue
ReactNative

rustでaxumに触れたぐらい?かな。それもまあopenapi generatorとの噛み合わせが良さそうだから採用しただけで、深いところ理解できてない。
フレームワークへの興味は年々減っちゃうなあ。


CI/CD・IaC

terraform
cloud formation
github actions

(触らなかったもの)
code build / code deploy / code pipeline
ansible
screwdriver
chef
jenkins
concourse

ansible触る機会無くなって書き方忘れてきた。terraformある程度最初に書くと保守性いいし新規のソースも少なくて、メンテ最高だなってのを感じれた1年。いい意味でキャッチアップ少なく簡単にインフラ管理できるね、やっぱ手でリソース作るのは悪。PRで僕と握手!


コンテナ・インスタンス

K8S
ECS
ec2
docker

(触らなかったもの)
EKS
OpenStack
pivotal cloud foundry


趣味開発k8sが1年以上ぬるっと動いてて良い。k8sへの抵抗も無くなったし、ecs高いし、身の回りのプロダクトは業務でもecsなくしたいな。コスト気になりすぎる。


ネットワーク

CloudFront
Route53
ELB
nginx

(触らなかったもの)
apache
Kong
Amazon API Gateway



ほか

let's encrypt (new)
connect
newrelic
sonarqube
openapi generator
mybatis generator
aws step functions
Jmeter
pt-online-schema-change
grafana

(触らなかったもの)

prometheus
splunk


let's encrypt 初めて触った。便利〜。




技術スタックという目線だと今年も差分少なめ。rustとkafkaぐらいかな。

今年一年は、自分以外の人やチーム、全体アーキテクチャなどを考える場面がかなり多かった。コストとか将来性とか、マクロな視点で考えないといけない課題が多くて、なかなか大変。パフォーマンス出すには今までやってきてない技術とか知見、考え方が必要だなと感じた。
マイクロサービスのtobeがどうなっているか、は難しくないなと感じるけど、tobeのマイクロサービスへどう変化させるか、はかなり難しいなと感じる。自分の手の届かない部分が多くて、でもみんなのメンタルモデルを変えたり、組織のあり方も変えたりとかを考えないと、技術やアーキテクチャだけでは実現できない場面が多い。
難しいね。


イベントは今年度も引き続き出てた。findyさんに招待いただいて多くのlistenerの前で発表できたのは楽しかった。

モジュラモノリス徹底解剖vol.2〜実践者から学ぶLunch LT〜 - connpass


PRレビューとかは相変わらず結構やってる、今年度も1000ぐらい見てるかなあ。


あと今年度は、自分のチームのメンバーに新卒の方が加わったのでスキトラもかなり意識した。技術を伝えるというより思想を伝えることをかなり意識してる。
技術なんて僕はすぐ抜かされちゃうし、できるだけ高速道路を走ってもらいたいなという思いが強くなっちゃうなとここ一年感じた。



他の人をtrustできる領域を増やして、マクロなエンジニアリングをしていくのが今の自分のミッションかなと感じる。
マクロばっかりやって、小さいエンジニアリングができなくなるのは避けたいので、そこはかなり意識しておきたい。

手を全く動かせないマネージャーやおじさんが嫌いという1年目の頃からの尖った気持ちを忘れずに、自分にも刃を常に向けて、精進。




6年目は、エンジニアブログ出したいなと思っているのと、イベントも出たいね。

自分の身の回りぐらいなら技術力誰にも負けないぐらいの気持ちにはなってきてて、コンフォートゾーンにいる感覚が強くなってきたので、ある程度のことを成し遂げたら少し破壊的な動きもしたいなと感じる。自分に対するカオスエンジニアリング。


強くなりた〜〜い。

2024目標メモ。

まず去年の目標から。

ningenme.hatenablog.com


2023目標
▶ ・問題を解く(ライブラリ盆栽しましょう)
 一昨年よりは相対的に多くratedとか出れた気がする。
 盆栽は結局そこまでやれてないけど、ソート可能セグメント木書いたのが一番大変だったかな https://ningenme.github.io/compro-library/
▶ ・技術ブログを書く
 昨年のブログ数は4本。。。。 https://ningenme.net/blog
▶ ・英語を勉強する
 英会話教室に3,4ヶ月いってた。が、ちょっとプライベートでお金を他に使いたい用事が出てきたのでやめちゃった。英語力向上せず!
▶・ 仕事の時間を減らす
 どうだろう?残業は今ほぼしない気もしてる。たまにめっちゃプログラミング楽しくてずっとやってる日もあるか。。まあでも可処分時間は増えてる気がする。



ほかにやったこと
・結婚した。
 


・ISUCONに出た。
 
・イベント登壇した
 findy.connpass.com
 line.connpass.com
・転職した(してない)
 
・飯を結構作った (夏ぐらいから結構自炊してる)
 
・自分用の精進ツールを作った (昔一回作ったやつをgo + next jsでリコードした)
 https://ningenme.net/compro-category/category


 

2024目標
競技プログラミングを続ける (rated出るのと、少しの盆栽)
・技術ブログを書く
・webの勉強を続ける (今年はrustをやり続ける一年にしたい)

これぐらいかなあ。少ない。
webと競プロと人生をやるだけのライフスタイルがここ数年でかなり馴染んでいる。
なんか新しいことした方がいい?
いや今で十分楽しいよなあ。楽しいのが一番。変に新しい目標持たなくていいかなって思えてる今がかなり良い気がする。

すごいエンジニアと仕事すると楽しいよって話。

こんにちは、webエンジニアの くる です。

タイトル通りなんですが、すごいエンジニアと仕事すると楽しいよって話です。
当たり前だろ、と言われるとそうなんですが、思うところがあったので書いていく。




普段、開発をする中で、なかなか一人で業務が完結することはないかなと感じます。
ロールにもよりますが、一番ジュニアなエンジニアのロールだったとしても、チームリードのエンジニアやマネージャーと会話したり。
もしリードのエンジニアなら、マネージャーや他チームのリードと話したり。
また、マネージャーのロールなら、より上位のマネージャーやオーナー、また他のエンジニア以外の部署のステークホルダーと話したりと。



普段一人で開発は完結してます、って人は一旦スルーで。(そういう環境になっちゃうフェーズもたまになくもない...)


この記事では、そういう他人と仕事をする中での、特に技術パートに偏った話を前提とします。



ということで本題。「すごいエンジニアと仕事すると楽しい!」
当たり前じゃん?と言われるとまあそうなんですが、どっちかというとすごいエンジニアと仕事できる時間は貴重、みたいなニュアンスかも。

すごい、もなかなか雑な表現なんですが、何でもできるようなリードエンジニア、シニアエンジニアのようなイメージでもいいですし、何か一つの技術のことに特化してる人でもいいと思います。その分野が特に自分にとって強くない領域なら尚更。


そういう人と仕事すると楽しい。理由は簡単で、自分一人では得られないインプットがあるから。っすね。
未知の技術とか知らない概念ってそもそも触れることがないまま気づかなかったりすることが多いから。ここら辺が個人開発とか独学だと苦しい時が多いなーって感じます。(何でもキャッチアップしたりアンテナ張れるぜって人はまあ一人で完結できるかもですが)


じゃあ技術的にすごい人が全然いないのか、というとこれは難しい問題。twitterとかみてるとたくさんいる気もする。でも技術用語並べたりしてるだけでそんなにすごくない人もいるし、ソースコード実は全然書けない人もいたりしそう。でも逆も然り。発信してないだけですごい人もめちゃめちゃいる。マジでめちゃめちゃいる。

ここで、結局一緒に仕事したりコミットしたりするレベルで近くないと、真に他人の技術力を感じ取るのは難しいなあと思う部分があります。
同じチームで同じプロダクトを開発できるぐらいの距離がベストですね。この距離で感じ取る他人の技術力ってのが一番信用できるなと感じます。勝手に他人の技術力を測るなよって話はもちろんなんですが。。


じゃあ、同じチームで同じプロダクトで、ってなると、年間で直に接することができる人数って、まあまあ限界があるんですよね。
少ないチームだと1チーム3人とかもあると思いますし、多くても10人とかかなあ。それ以外もあるよ、って言われたらありえるだろうけど、それは多分コミュニケーションそこまでしない人とかがチーム内にいそう。そうなるとまた技術を真に感じ取れる距離かって言われたら難しいかも。

他チームですごい人、とかはもちろん目立つので同じチームじゃなくても全然気づけるのですが、じゃあそういう人から得られるものが多いかというと、多いけど同じチームじゃないとやっぱり解像度とか違うよなって思うところがあります。


ということで、何が言いたいかというと、「同じチームで技術力のあるすごいエンジニアと一緒に仕事できる機会は貴重」って話です。
チームとして一緒に開発できる人の数には一定の限界があるし、チームをコロコロ変えるのも現実は難しい部分もあるので、「同じチームにいる」って状況はとても貴重だなあという感じです。


すごいエンジニア、って表現に関しては、これは単にベテランの人と仕事できるのが貴重、ってよりは、自分目線で、この人から得られるものが多い。と感じれるかどうかかなーとは思います。超主観。でも主観でいいのです。
ベテランでもコード汚い人もいるし、1年目でも魂のこもったコード書く人もいます。経験が薄くても、「あ、この人にはいつか抜かされるな」って感じる人とかも全然いるので、そういう人から得られるものもかなり多いと思います。


そういう人と一緒に開発できる時間、これがかなり大事で、かつ安定して手に入れられるものでもないかな、と思うので、大事にしていくのがいいって話でした。




ちなみにこれを達成するだけなら、自分にとって少し背伸びした会社に頑張って入る、とかがいいのかな、と感じます。自分が一番チーム内で相対的にジュニアだと確率的にはいい人と巡り会えることが高まるかなとは思います。



ただ、単に自分よりキャリアのある人、シニアの人と仕事をすればいいっていうわけではないかなーと思うところはあります。
自分も業界に初めて入った時から数年は自分が一番ジュニア側でしたが、先輩に対して「数年したら同じ目線で話をできそう」みたいに思う場面もありましたし、真にすごいなあと感じれるタイミングというのはめっちゃ多いわけではないかなという感じです。(リアルで知り合いの方に対してはめっちゃ生意気ですみません、あくまで主観なので...)
もちろんこの人すげーって思いながら仕事することも多いですし、概念を学んで感動するタイミングもめっちゃあります。

大事なのは自分のエンジニアリング観として心の底からすごいって思えるかどうかかなーっていう主観かなと。



ちなみに、個人的にはすごいエンジニアと同じチームで開発できている間は、転職とか異動を踏みとどまってもいいかもしれない、と思う部分もあります。
転職とか異動をすると基本チームが変わっちゃいますよね。給料とかポジションが上がるのも大事ですが、一方で今自分がすごいと思えるエンジニアのような人と新しい場所で仕事をできるか、っていうと不安定だなと。それぐらいにはすごいと思える人と仕事をするってのは貴重かなと感じます。もちろん給料とかも伴わないとモチベが難しいので、結局動く時は動くんですが。




ってなわけで「すごいエンジニアと仕事すると楽しいよ」って話でした。





私事としては、僕は今8人ぐらいのチームのリード兼マネジメントで、一応シニア側のロールをしてますが、とても楽しくやれてます。
毎日自分の知らないことをみんなに教えてもらう日々。

自分も他人にいろんなinputをできるようなエンジニアになっていきたいですね。

おしまい。

ISUCON13 参加記録

こんにちは、webエンジニアの くる です。

くる、amanekoくん、タコス君の3人構成のチーム「たこたこ」で先日行われたISUCON13に参加しました。
そのときの感想。

先に結果だけ書くと、スコアは13,119点で、全然でした。残念。
isucon.net


2日前ぐらい?
ちょうどいい感じの祭日があったので、3人で練習をしようと決めていた。12:00~16:00ぐらいで軽く調整。
3人でISUCONに出るのは去年ぶり2回目で、若干役割みたいなのができてた

タコス: PM太郎。ソース書かない。pprofとかdbのslow query出したりとか、環境構成的なところやってくれる。
amaneko: adhocに色々動いてくれる。シェル書くときはamanekoくんが一番多い。あとはソース修正などなど。
くる: 人力CI。あとはソース修正などなど。

ざっとこんな感じ。

練習日は、「ISUCONって何してたっけ」「ssh久々すぎる。コンテナ世代すぎて触らん」「AWSの使い方わからん」「pprofどうやってたっけ」「人力CIやるにあたってのPAT (personal access token) のpermittion謎」
みたいな感じで、何もわからんムーブになってたが、まあいけるやろって感じで練習を終えた。良い感じ。
去年はこれを当日に言ってたので、だいぶ改善である。

タコスけ君が今年は、dbだけじゃなくてnginxのログからエンドポイントの統計情報みたいなの出してくれる準備もしてた。


当日
10:00に何とかみんな集合。始める。

開始してインスタンス周りの準備はとりあえずタコスの仕事。僕は待ちながら、githubのrepositoryを空で作ったり準備してた。
インスタンスが出来上がってsshできるようになったら、僕はとりあえず1号機のwebappをgit化する準備を。
タコス君は何やってたかよくわかってないけど、多分なんか準備してた。

amaくんは、とりあえずdbにindex貼るのを初手でやってくれてた。
最初1時間ぐらいでとりあえず人力CIの準備が出来上がり、ama君がindex修正をマージして最初のベンチ。この時点で1時間ぐらいで5000点ぐらいだった。
去年と違ってタコス君がインフラに専念する感じで分業して、dbとかnginxの準備もできてたので、かなりスムーズだった。

初期initにdbのtableの再構築内の最初ちょっと気づかなかったのをスッと直したぐらい。



ここからはひたすら改善。

amaくんが N+1っぽいところのsql直したり、僕が全取得してselectしてるところを直したり。

12:00ぐらいで色々直して、この時点で10248点で 12 位になった。嬉しい。

このあと3000点しか上がらないとは思いもしなかった。。





この辺でやっと当日マニュアルを真面目に読んで、ドメイン的な側面を理解し始めたりしてた。投げ銭システムらしい。
昼過ぎからはもうちょいシビアに得点狙おうということで、大きい改善点を探した。

とりあえずインスタンスを1台しか使ってなかったので、分散させようということに。
2号機をdb専用にするタスクが、色々あってくる担当になった。結構手こずってしまった。
dbに新しいユーザー作って、port開けて1号機から繋げるの確認したらenvの値書き換えるだけなんだけど1時間ぐらいかかっちゃった。なんか微妙に躓く。オンプレ不慣れすぎて不甲斐ない。

このあと、powerDNSってやつ使ってる別のテーブルがあるのにも気づいた。全然仕組みわかってなくて、とりあえずこれも分散させたらいいんじゃね?とか言ってこれのdbの向き先を3号機にした。
ベンチ動かしたらエラーになって、戻すか、と思って戻しても。。直らなくなってしまった。。。

ここでかなりハマってしまった。。

結局当日マニュアルを読み直してリセットできるコマンドを見つけて解決するけど、これで1時間ぐらい潰しちゃった気がする。
https://gist.github.com/kazeburo/bccc2d2b2b9dc307b5640ae855f3e0bf#dns%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6


治ったものの、dns触るのはちょっと知識不足すぎるということで一旦やめようという感じに。
残りはアプリケーションの修正をしていく。


残り3時間ぐらいで、点数差も開いてきて、dns分離しないとやっぱり厳しそう?みたいな流れになってきた。
dnsの向き先変えてリセット試してもエラーになるから、なんか違うんだろうなと思ってたところで、pdns用のconfってenv.shと別にあるんじゃね?ということにやっと気づく。
etcかどっかの下を漁って、pdns系の設定値を見つける。

https://hobby.sugio-garden.com/ja/node/3 のブログを見つつ、gmysql-hostを変えればいいんやな、うんうん。と設定を足し込むも、設定が変わらない。。
再起動のやり方が悪いかな、と思い色々試すも、全然うまくいかない。
30分ぐらいして、設定ファイルのさらに一個下のディレクトリに、gmysql-hostだけ上書きするconfigがあった。気づかなかった。。。。

これも直して何とか分散できた。
ただdnsのdbの向き先変えただけなのと、pdnsの設定とか全然変えてなかったので、そんなに点数上がらなかった。
13000点ぐらいフィニッシュ。。。


僕がdbとdnsやってる間二人も色々改善してくれてたけど、午後からはちょっとうまくヒットしなかった感がある。残念。上振れしてたら20000点ぐらい行ったかなって感じもあった。8時間の動き方が難しい。。

ってな感じで、フワーっと終わったisuconだったが、去年よりは本質的な部分に取り組めた気がするので、まあよかった。楽しかった。初手の動き出しはかなり洗練された気がする。



アプリケーションを読むのは速度も上がるし全体掴むのも業務で慣れてはくるけど、インフラの全体理解を爆速でやるのは全然だなーと感じさせられてしまった。dnsとかわかってないのも、普段から触ってない領域に弱すぎるって感じで悲しい。僕が普段やってることはアプリケーション領域だけなんだなあとわからされた。


amanekoくんとソース読みつつ、修正内容を二人で把握しつつ、分担して直してるときは楽しかった。ハッカソンっぽい。


タコス君のintellijが謎すぎて、必要なimportも削除してPR出してきてて最悪だった、ウケてた。





今の業務で使う技術力、みたいなのはそこそこついてるかなって感覚が自分の中であったけど、ピュアな技術力は全然だなとISUCONで改めて感じた。コンフォートゾーンにいると気づけないねえ。




といった感じで雑な参加記でした。運営の皆様ありがとうございました。来年も出たいね。おしまい。

業務4年目終わりメモ。

4年目が終わった。もう完全にシニアエンジニアです!

3年目終わり。
ningenme.hatenablog.com
2年目終わり。
ningenme.hatenablog.com


コードレビューし続けた一年。

以下4年目までの技術スタック。


DB・データストア・ストレージ

oracle
postgres
mysql
aurora
redis
s3
aws sqs
(触らなかったもの)

cassandra
memcached
dynamo
solr


今年は永遠にoracle触ってた。dockerでoracle作るときのノウハウとかが無駄に蓄積された気がする。
あとはmysql 8も結構。5.7の時の認識改めないとね。syntaxとか色々便利になってるの気づいてなかった。
redisも前より使う量増えた。spring data redisが優秀すぎる。


言語

rust (new)
kotlin
Java
typescript
go
c++

(触らなかったもの)

groovy
php
javascript
python
bash

毎度ながら言語を並べるの不毛感あるけど。ね。
kotlin最高って言いながら仕事してた。趣味開発でrustとgoをかなり使い始めたのが進歩。
なんか今年も新しい言語触りたいなあ。goはnot for meということがわかってきたので一旦区切りつけたい。
rustはちゃんと書けるようにしておきたいので継続。

言語をいろいろ触るといろんな思想がinputされて楽しいというのがあるよね。
goのIFの考え方とかはjavaでも応用してもいいかなってちょっと思ったり最近。



フレームワーク

Spring Boot
Junit
Next
React
(触らなかったもの)

Spock
Laravel
Fuel
Symfony
Vue
ReactNative

FWに対する気持ちが0になっていってる。やばい。
spring-boot 3.0は結構触った。楽しいね。



CI/CD・IaC

terraform
cloud formation
github actions
code build / code deploy / code pipeline
ansible
(触らなかったもの)

screwdriver
chef
jenkins
concourse

github actions様様。なんでもできる。なんでも書ける自信もついたので超楽しいね。


コンテナ・インスタンス

K8S(new)
ECS
EKS
ec2
docker
(触らなかったもの)

OpenStack
pivotal cloud foundry

K8Sがnewというのは何かというと、master nodeとかworker nodeそのものをセットアップするところを今年初めてやった。
趣味開発ecsが高すぎてオンプレk8sに全部移行した。ecs便利だけど高いよね。業務でも使うとき結構気にしてしまう。


ネットワーク

CloudFront
Route53
ELB
apache
nginx
(触らなかったもの)

Kong
Amazon API Gateway
進歩なし!ネットワークは黒魔術!

ほか

connect (new)
newrelic
sonarqube
openapi
mybatis generator
aws step functions
Jmeter
pt-online-schema-change
grafana

(触らなかったもの)

prometheus
splunk

grpc上位互換であるところの Connect · Simple, reliable, interoperable. A better gRPC. を触ってた。楽しいし便利。
あとは便利なものなんか学んだかなあ、なんか既存のテックスタックでかなりやり過ごしてしまった一年な感じがする。





技術スタック、みたいな観点だと差分小さめかな?ちょい悲しい。でも技術自体はまだまだ伸びを感じた一年。

4年目はactivityとしてはいろいろやった気がする

  • テックリード (テックリードって定義なんだろね、難しい。とりあえずあらゆる人からjavaとspringと業務ナレッジの質問が飛んでくるようになった)

 - プロダクトそのものとか、今後のアーキテクチャの方針とか、そういうの考えることが増えた。視座だけ上がりおじさんにならないように気をつけないとね。
 - コードレビュー去年1000PRぐらいはみてるんじゃないのかな、色々見すぎて僕の思想があらゆるところに蔓延ってしまってる。

  • チームマネジメント (PMの人がいなくなりリードと兼務しつつやることに)
  • イベント登壇 (2回も話せて楽しかった、来月も話すよ)

 - 重要なのは「先を見据えた柔軟なアーキテクチャ構成」 3チームの並列開発を実現したモジュラモノリスの採用 - ログミーTech
 - 【オフライン開催】LINE KYOTO 交流会~マイクロサービスと周辺技術~ - connpass

  • recruitement系の活動
  • インターンメンター (講義とかハンズオンやったり)
  • ossにコミットしてた (本当に少しだけ)


今の会社も入る前はついていけるか不安だったけど、今は全然いける気持ちになれたね。よかったよかった。
ダーニングクルーガー曲線?でいうと最初の山のピークのところにいる気がする。ふんふん。気持ちだけは前のめり。



自戒も込めて、手を動かさないエンジニアを揶揄し続けれるように
シニアとか言われるようになっても、手を誰よりも速く動かし続けていきたいね。

2023目標メモ。

まず去年の目標から。

ningenme.hatenablog.com

2022目標
AtCoderレート2000
 できてない。それどころかratedすら出れていない。。(去年も同じこと言ってた)

・問題を解く(というかコンテストに出る)
 うーんこれすらできてない。ライブラリ盆栽すらしなかった一年。激サボり。

・技術書を読む
 これはそこそこ。また今度まとめる。

・資格をとる(デスペかAWSソリューションアーキテクトの何か)
 全然やってなかったね。AWSの知識あるうちに取らねばと思いつつ虚無をしてた。

・goのcliをとりあえずちゃんと機能作ってリリースする
 これは別のアプリケーションに興味が移ってしまって頓挫。うーん。

・英語の勉強をする
 ポツポツ話す機会を設けつつ、微妙。

・貯金をする(奨学金辛すぎるね)
 人生パートで使う用事が結構出てきててそれどころではなかった。。


うーん目標に掲げたことは何もできてなくてだめ。。。。。


ほかにやったこと
・仕事。仕事仕事。
 去年はマジで仕事に追われた一年だった。仕事の幅はかなり広がった。マネジメントが増えた。採用とかインターンとかの開発以外の仕事とかも増えた。自分のチームの開発を推進していくのはまあ面白いように感じる。
 時間を仕事に振りすぎた感はあるので今年はセーブしておきたいね。

・人生パート
 結婚に向けて色々準備してた。大変だね。これみんなやってるのかあ、凄いって日々感じる。

・給料上がった
 嬉しい


去年は仕事面でかなり進歩があったものの、それ以外は全然な一年だった。反省。

2022目標
・問題を解く(ライブラリ盆栽しましょう)
・技術ブログを書く
・英語を勉強する
・仕事の時間を減らす


これぐらいでいいかな。
頑張りすぎず、程よく日常パートを楽しみつつ技術力を向上させる感じの一年にしたいね。

isucon12 参加記

タコス、amaneko、くる の3人でチーム「タコタコ」で参加。

  • 1年前

3人でisucon予選出たいなと言いつつ誰も予選登録できず終了。参加が難しい。

  • 今年 6月11日

今年も、3人でisucon予選出たいなと言いつつ誰も予選登録できず終了......かと思われたがタコス君が登録できてた。えらい。僕は寝てました。何もしないまま参加登録完了!
持つべきものは早起きできるエンジニアだね。うんうん。

  • 6月16日

タコス太郎が招待urlとかを貼ってくれる。チームメンバーとして認証するための設定とかがあるらしい。
僕はLINEを無視していた。

  • 6月18日

無視してたら怒られた。タコス君からクビ宣言をくらう。悲しい。

なんとか登録完了。

  • 7月2日

この間も僕はLINEをずっと無視していた。気付いたらタコス君が登録確認用のec2インスタンスを立ててた。
えらい。さすがマネージドサービス。EaaS (engineering as a service) のタコス君ですね。



俺は負の工数を産んでるらしい。泣いた。
モンハンで忙しいから仕方ないね。うんうん。

黒塗りはモラルのない悪口だったので削除......(コンプライアンス!)

  • 7月5日

また解雇宣言くらってた。カスPM。
俺はこの頃はハンターランクだけが全てになっていた。
(古田くんとは僕のこと)

  • 7月16日 (1週間前)

さすがに練習をすることに。(今更)

過去問をやる。

言語なににするか〜、ってとりあえず困る。

くる: java, kotlin, php
タコス: java, python
amaneko: go, typescript


三人の最大公約数がなさそうだったので、goでやることに。

go何もわからん。pprofというやつがあるらしい。dynatraceとかnewrelic的なものととりあえず認識。便利そう。
amanekoが詳しい。タコスがハンズオン。俺は見るだけ。動いてるっぽい。良いね。


sshとかその辺確認し直して終わり。


過去問は下記のリポジトリ参考にしていました。感謝です。
github.com

  • 7月23日 (当日)

9時半。起きる。参加成功。

9時40分ごろ。とりあえずgithubで空リポジトリを作る。
3人ともコミットできるかのパーミッションを確認。



10時開始。
タコス:とりあえず配られたテンプレートのcloud formationでインスタンスを作成。
sshを3人で確認。

くる:goのソースをgit管理。master push!!


ドキュメント読む。amanekoくん読むのが早い。一緒に読み始めたはずなのに色々ディスコにリンク貼ってくれる。


くる:ciあったほうがいいかなあと思い、goのbuildだけでも確認するactionを組む
タコス:pprof導入


タコス:とりあえずappとdbのインスタンスを分離。失敗。
amaneko:タコスの間違いを見つけ修正PRを出す。神。スーパーエンジニア。

app側の疎通先の設定は変えたものの、ec2 -> mysqlの疎通がうまくできず最初困る。ネットワークを疑うがセキュリティグループはあってると俺が連呼。
結局mysql側でローカルからのみ受け付ける設定が入ってたから、ってだけだった。初歩的。マネージドに慣れすぎてこういうの爆速で倒せないね、うんうん。

mysqlログインするスクリプトとか、goを再起動するスクリプトとかを amanekoくんがいつの間にか作ってた。すごい。スーパーエンジニア。


なんか大した改善もないまま、準備だけやって12時近くになったので昼になる。
パスタを作る。美味しいパスタ作った俺。

3人がご飯食べてる間は、休憩時間に。
自分は飯食べながら暇だったので張れそうなindexを貼るPRをひたすら作っていく。


13:00ぐらい

実装を3人で読んで方針決め。
ERを読んでリレーションの確認。schemaspy使えばよかった感。

この辺から俺が人力CIになる。
PRがされたら、俺が git pullして appを再起動。ベンチマーク投げる。までをひたすらやってた。
ITドカタにも仕事を与えてくれる現場に感謝。さしみたんぽぽにもやりがいを。


インフラを露骨に変えて頑張るよりは、ドメイン知識を掴んでアプリケーション改善で頑張る方向に。


まず目をつけたのは、view_historyを使ったロジックがあるがそこがかなり無駄そう。
参照したユーザの情報を全部積む履歴のテーブルがあるが、その参照ロジックは各ユーザ最初のアクセスの時間だけが必要で、他は不要っぽい感じだった。

なので最初にinsertしたデータだけ見れば良いので、修正。insert -> insert ignore的な修正を。

ここで、pkがサロゲートになってたので、pkを変更するためにddlも修正。
ここで初めて、mysqlの初期データが存在することに気づく。これどうしようかなーと思いつつ、この対応はくる太郎の方で適当にやっておいてと言われたので、勝手に僕がsqlで移行。

-- rename
RENAME TABLE visit_history TO tmp_visit_history 

-- createすること

INSERT IGNORE INTO visit_history (competition_id, player_id, created_at, updated_at) 
SELECT competition_id, player_id, created_at, updated_at FROM tmp_visit_history ORDER BY created_at


select count(*) from (select distinct competition_id, player_id from tmp_visit_history) as tmp;


結構改善した感があったが+1000点程度。






次に僕がcompetitionテーブルのindex追加を行う。

CREATE TABLE competition (
  id VARCHAR(255) NOT NULL PRIMARY KEY,
  tenant_id BIGINT NOT NULL,
  title TEXT NOT NULL,
  finished_at BIGINT NULL,
  created_at BIGINT NOT NULL,
  updated_at BIGINT NOT NULL,
  INDEX `tenant_id_idx` (`tenant_id`)
);

アプリが落ちる。ベンチが0点になる。
タコスくんに「あー障害報告ですねこれは。」って無限に言われる。カス。

ここで、mysqlじゃなくてsqliteということに気づく。そして文法がおかしいことに気づく。というかsqlite?え???ってなる。
db2個あることに初めて気づいたよね。失態。3人とも気づかないまま結構時間経ってた。やべー。

sqliteの文法を、ぐぐりながら適当にマージして動作確認。ベンチ戻ったが500点ぐらいしか増えなかった。



sql周りを俺が一人で修正してる間に、amaneko、タコスは二人でずっと調査とかしてた。
俺はもうpprofよくわからん、タコス君が頑張っとる。

そしてamaneko君がロック周りを治す。謎のPRが出てくる。
俺は聞いてなかったのでよくわからんけどタコス君がマージしてた。

それがすごい改善になったらしく + 10000点。amaneko神。スーパーエンジニア。



競技中一番盛り上がったね。ここ。

この改善以外でも、goのsyntaxわからんとこ出てくるたびに聞いてた。



この時点で15:00とか16:00ぐらい?残り時間そこまでなくなってきてた。




全体でユニークなpkを発行しているdispenseIDで、謎の処理があったので、amanekoくんがそこをuuidに変えたりしてみたが、点数が変わらず。残念。。


次にcsv入稿周りに目をつけてた。
とりあえず、sql発行回数がやばそうだったので僕がバルクインサートに変える。+500点ぐらい。


rownum周りの参照系が無駄なロジックが多そうだった。
ソースを読むと、csv入稿時にレコードがcsvの何行目にあったかのrownumを保存しているのだが、pkがかぶったときはrownumが大きい方の値しか使っていなかった。
insert時に rownumが大きい方だけが生き残るように、mapでデータを作るように僕が修正。
ただここはベンチがあまり上がらず。。。残念。。



この辺で17:30とかになってたので、機械的にindex張れるところだけ僕が修正して。終わり。

14000点ぐらいでfinish。最後20分ぐらいは壊れるのを恐れてもうやめた。


全体的に僕とamaneko君で実装してた。タコスは指示出すだけ。
手を動かさんPMはカス!!!




PRをこまめに作って、常に正常系の振る舞いを保つって意識が良かったね。業務仕草。
revertもめちゃめちゃやった。動作戻ったか不安でベンチ回しまくり。






初参加で52/698 位はまあまあ良かったかな?と話していた。来年もやりたいね。もう少し場慣れして本戦行ける回を引きたい。

点数の推移はこんな感じ。





全体的に、改善がわからんというよりは時間との勝負だった。意外。もっと何もやることなくなる感じかと思っていた。
3年ぐらいエンジニアリングの真似事してきた知識が少しは発揮できてる感じはした。嬉しいね。



エンジニアリング、楽しいね。うんうん。仕事ではできないようなダイナミックでドラスティックでスピーディな開発をできたのが楽しかった。
最近こういう開発できてないなあ。要件定義と設計とコードレビューばっかり。なんとかしないとね。





isuconマジでマジで楽しかったです。運営・スポンサーの皆様ありがとうございました!!!!

そういえば運営が弊社だったのは結構ギリギリで気づいてびっくりした。一参加者になっちゃったけど、来年も主催なら何か投げ銭程度でも手伝えることしたいね。