Gunosy Tech Blog

Gunosy Tech Blogは株式会社Gunosyのエンジニアが知見を共有する技術ブログです。

新卒入社したサーバーサイドエンジニアは1年でなにをしてきたか

はじめに

こんにちは。datadog-trace-agentを血管中にぶちこんで体のメトリクスを取りたい625です。最近はvtuberが好きすぎてvtuberになりました。

昨年4月にGunosyに入社し、サーバーサイドエンジニアをして働き始め1年が経って書いていたコードも世の表に出たので入社から1年何をしてきたかについてお話します。

(この記事は同期の田口くんが書いたこの記事↓のオマージュです。) tech.gunosy.io

田口くんのように社のいろいろなサービスに携わったりはしていませんが、ざっくりと大きな単位でサーバーサイドエンジニアとして、どんな1年を過ごしたかがわかれば幸いです。

サーバーサイド開発に慣れる 4月〜10月

まずはサーバーサイド開発のイロハのイを学ぶべく、グノシー(アプリ)のサーバーサイドで大きなAPIの一部を切り出したりしつつ、その時発足したグノシーのインフラ基盤をeksに移行する😺さんチーム*1にいました。

😺さんチームの中では主にeks移行に向けてグノシーのバックエンドのAPIをDocker化とかをしてました。 既存のコードをがっっっつり読む良い機会になりましたが、Docker化しつつもサーバーサイドの機能は増えていくのでそれらに追従しながらやっていくのは大変でした。このときは既存のコードをそのまま動くように動かしていたので基本的に同じくサーバーサイドの人々やSREの方々とコミュニケーションをとることが多かったです。😺さんチームのみんなででっかいエンターボタンを押してトラフィックを流したりしたのは面白かったですね。

あの時に作ってしまった FIle Changed 172 みたいなPull Requestはもう二度と作りません…。

ポイント機能の開発 11月〜1月

この時期はグノシーのサービス開発チームこと🐧さんチームで最近世に現れたグノシーポイントのバックエンドの一部を作っていました。 グノシーポイントはいくつかのマイクロサービスからできていて、そのうちの一つを丸々書いていましたが、ポイント機能ということで、不正な状態にならないようにするのがハチャメチャに大変で楽しかったです。リクエストは再送されるかもしれないしネットワークは唐突に壊れるかもしれないしサーバーも何かが起きて唐突に死ぬかもしれないのは日頃から重々承知ですが、ポイントまわりでは特に気を使ってコードを書きました。この時期はiOS/Androidのエンジニアの方々、QAの方々とコミュニケーションを取ることも増えてきました。 実際のリリース日はめちゃくちゃ不安で夜も眠れませんでしたが、何事もなく無事にリリースされ、大きな障害もなく第一弾のキャンペーンが終わったのでホッとしつつ、これからもこの調子で何事もなく動いていてくれればと祈るばかりです。

ラジコのコンテンツのトライアル配信 3月

gunosy.co.jp

株式会社Gunosy(本社:東京都港区、代表取締役社長:竹谷祐哉、以下 Gunosy)は、2020年7月1日(水)より、情報キュレーションアプリ「グノシー」(以下「グノシー」)のiOS版にて、「ラジコ」タブを新設し、トライアル配信を開始いたしました。株式会社radiko(代表取締役社長:青木 貴博、所在地:東京都中央区)が運営する「ラジコ」で提供されている一部コンテンツが聴取可能です。

というわけでこれまた🐧さんチームでグノシーのアプリとラジコの橋渡しをするものを作っていました。認証や放送局等の情報をいい感じにグノシーから使えるようにシュッとするようなことをしていました。何をどこまでするのかの話から実装方針を決めてterraformで構成を書いてAPIのスキーマを書いてスキーマの相談をして、コードを書いてクライアントから実際に呼ばれて変なところがあったら教えていただいてQAチェックをもらって世に出て…と世に出るまでが終わると達成感を感じてしまいますが、実は世に出てユーザーの方々に触ってもらってからも新たな始まりなので面白いですね。

最近

🐧さんチームで引き続きサーバーサイドの開発や既存機能/環境の改善をやっています。 特に最近好きなのは週に1日、既存のコードやその他諸々開発の上で改善したほうが良いなと思うところを粛々と改善できる改善デーです。 日頃は時間が取れないけど変えたほうが良いよなといった部分を書き直したりする時間なのですが、過去のgoにはこの機能がないのか等歴史に思いを馳せる事があったりツール周りでdeprecatedになっているものを粛々と潰していったり新しいツールをいれてみたり、何故かたまにおきるエラーの原因を探るためにコードの海にもぐったり…と面白いことが多いです。ただ時間の溶ける速さは異常です。

最後に

空白の2月があったりしますがまだ世に出ていない何かを作っていてこれもそのうち世に出るのでお楽しみということで…。 入社後1年という短い間に、多くの技術に関わることができ多くの学びがありました。 1年前はgoやterraform、ci、envoy、fluent、docker、k8s、awsまわりのほぼほぼ何もかも触ったことがない状態だったのも驚きです。 最近は趣味でvueやfirebaseやunityも始めてしまったのでこれまた大変な日々が続くなぁという気持ちですがやっていきの精神でやっていきます。

みなさんに少しでもGunosyのサーバーサイドで働くイメージを掴んでいただけていれば幸いです。

おまけ

最近goを書いていてバグらせたので戒めにバグるgoを再現したコードを置いておきます! aws-sdk-goのbatchなrequestとかでポインタをappendしていく機会とかたまにありますよね。ハマったことがあったり、ループでの変数の扱いに慣れていると下記のコードがバグるとすぐわかりますが、パット見だと正しく動きそうな雰囲気を醸し出せているのではないでしょうか。ループの中でポインタを扱う時に何も考えずとも、こういったバグを産まないように指が動くまで今後も武者修行を続けたいと思います!

(どうしてもバグが見つけられなかったとき、答え合わせのために背景色で何がバグなのか書いておきます。ループの各イテレーションでは同一のmが使われるのでmのアドレスをとっても全部同じものになってしまうというあるあるでした!)

play.golang.org

package main

import (
    "fmt"
)

type Message struct {
    Key  string
    Body string
}
type BatchInput struct {
    Body *string
    ID   *string
}

func main() {
    messages := []Message{
        {
            Key:  "key1",
            Body: "message1",
        },
        {
            Key:  "key2",
            Body: "message2",
        },
    }

    batchInput := make([]BatchInput, 0, len(messages))

    for _, m := range messages {
        input := BatchInput{
            ID:   &m.Key,
            Body: &m.Body,
        }
        batchInput = append(batchInput, input)
    }

    for i := 0; i < len(batchInput); i++ {
        fmt.Println(*batchInput[i].ID == messages[i].Key)
        fmt.Println(*batchInput[i].Body == messages[i].Body)
    }
}

*1:グノシーの開発では部署とはまた違う概念でどうぶつの名前をつけたチームを結成しています。本記事で出てくる😺さんチーム、🐧さんチームの他に🐢さんチームや🦁さんチーム、🐘さんチームもあります。そのうちどこかの記事で🐢さん🦁さん、🐘さんチームの話もでてくるかも?