oinume journal

Scratchpad of what I learned

2020年8月までの振り返り

ずいぶんと振り返りをサボってしまったので、頑張って7ヶ月分を書く

2月

この頃は各国のコロナの感染者数を毎日チェックしていた気がする。

そしてコロナの影響で2月終わりから在宅勤務、英語でカッコよく言うとWFHというヤツに会社が全体的に移行した。仕事的にはGitHub Actionsを使って何かいろいろ自動化しようとしていて、そんなに切羽詰まっている感じではなかった気がする。

3月

新型コロナの影響で3月〜5月に行く予定だったライブやフェスがことごとく延期もしくは中止になり、個人的な趣味を奪われてしまって、仕事で溜まったストレスが発散できなくなった。仕事はプロジェクトが炎上し始めたのと、WFHになったおかげでこの月から労働時間が著しく増えた気がする。

4月〜6月

保育園から「在宅勤務の家庭は登園を自粛して欲しい」という状態になり、子供の面倒を家で見ながら仕事をするというとてもストレスフルな状態になった。そして仕事ではプロジェクトが炎上し始め、さらにSoftware Designの原稿の締め切りがGW明けとバッティングして苦しい状況だった。

仕事では4月にProductivity Teamなるものを立ち上げ、炎上プロジェクトに対して人を増やすと言うアンチパターンにアンチテーゼを投げかけた。自分一人でやっていたものに対してチームで取り組めるようになったので、自分はリーダー業務に徹して実作業はチームメンバーにお願いすることになるのだが、子供の面倒をみなくてはいけないという状況においてはこれはかなり良かった。

というのは、子供が家にいるととにかく集中して作業することができない。奥さんが見てくれる時間もあるとはいえ、となりの部屋で叫び声が聞こえてくるとどうしても気になってしまう。なので、集中力が必要なタスクは深夜または早朝にやるようにして、昼間はSlackでのやりとりやMTGに終始するようにした。ただし、労働時間は平常時の1.25倍ぐらいになっているにもかかわらず、アウトプットはほぼ変わらない OR 下がっているという状態で、この期間が精神的にも肉体的にも一番つらかった。

7月

保育園の登園自粛が解除され、平日昼間も集中できる時間が増えた。また、炎上プロジェクトもなんとかリリースが終わり、自分はもう退職することが決まっていたので引き継ぎを徐々に始めた。

リリースしたとはいえ、リリースがむしろスタートであり、特にリリース直後のオンコールはつらかった。未知の問題のアラートが多発し、過去のSlackのログなどを漁ってなんとか対応するというやり方で逃げ切った感がある。途中からOperation Reportなるものを作るようにしたおかげで、過去にどういう対応をしたのかなどがわかりやすくなり、手間はかかるがこの仕組みはやって良かったと思う。

8月

8/14が最終(物理)出社日だった。オフィスに珍しく10人ぐらい人がいたので集合写真を撮ったりした。会社のアカウント類は本来は最終出社日で無効化されるはずが、なぜか1週間ぐらい無効化されてなかったのでSlackは毎日のように見ていた。

退職エントリーというやつを人生で初めて書いたところ、反響がすごくてこれだけでTwitterのフォロワーが200人ぐらい増えたw メルカリ/メルペイのブランド力というヤツはすごいなーとあらためて思う。

買ったもの

Dell 4Kモニター 27インチ USB Type-C モデル

この半年の中で買ったものの中ではこれが満足度が一番高い。このモニタからMacBookが充電できるし、場所もそこまで取らない。23.8インチと迷ったけど1万円しか違わなかったのでこっちを購入。

Galaxy Buds+

3月〜7月はとにかくオンラインの会議が多くて、AirPodsだと充電が持たなかったので購入。バッテリーは11時間確かにもつし、音もなかなか良いので気に入っている。難点はBluetoothが弱くて満員電車など人が多いところだと混戦して音が飛んでしまうことがある。この点ではAirPodsに軍配が上がるけどそれ以外では重宝している。

Kuman 3.5インチ HDMI 小型モニター 480*320 ラズベリーパイ向け

もともとラズパイは32インチのテレビにつなげていたのだけど、そのテレビをメルカリで処分してしまったので代わりに購入。ターミナルの文字が視力検査ばりに見えないけど、安くてコンパクトだったのでまぁ良いかという気がしている。

個人的な取り組み

今まで通勤中にやっていたこと・習慣がWFHになったため全て消え去ってしまった。特に英会話はオフィスでやっていたため、家でやる時間も習慣も根付かなかった。とりあえずなんとか家でも習慣作りをしていかないと。WFHはあと1年ぐらいは続くと思うので、これは今後の課題。

  • 英語: ほぼやれてない。英会話をする時間がないのでiKnowで単語や文章を発音することだけ毎日やっている
  • アルゴリズム: 全然やれてない

Gatsby + Firebase Hostingでプロフィールサイトを構築する

GatsbyFirebase Hostingを使って自分のプロフィールサイトを構築したのでそのメモ。

前提

  • サイトの中身はGitHubリポジトリで管理
  • https://github.com/santosfrancisco/gatsby-starter-cvがプロフィールサイト向けだったのでこれを使った
  • GitHub Actionsでmasterブランチにpushされたら自動的にFirebase Hostingに反映されるようにした
  • 今回は一つのGitHubリポジトリで複数のサイトをホスティングしたかったので、サブディレクトリを作成した。以下のような構成になっている。
    • lampetty-net-sites (リポジトリルート)
      • www (今回構築するプロフィールサイト)
      • xyz (別のサイト)

準備

  • GitHubリポジトリを作っておく
  • NodeJSをインストールしておく

Quick Start | Gatsbyに沿って以下を実行する。

(on repository root)
npm install -g gatsby-cli
gatsby new www https://github.com/santosfrancisco/gatsby-starter-cv

これで www ディレクトリ配下にサイトの静的ファイルが生成される。次にこれをFirebase Hostingにデプロイする。

Firebase Hostingのセットアップ

(on repository root)
npm install -g firebase-tools
firebase login
firebase init

今回は一つのリポジトリと一つのFirebaseプロジェクトで複数のサイトのファイルをホスティングしたかったので、以下のファイルを作成した。

https://firebase.google.com/docs/hosting/multisites に沿ってFirebaseの設定を行い、以下のようなファイルを作成した。

firebase target:apply hosting www lampetty-net-sites

firebase.json

{
  "hosting": [
    {
      "target": "www",
      "public": "www/public",
      "ignore": [
        "firebase.json",
        "**/.*",
        "**/node_modules/**"
      ]
    }
  ]
}

.firebaserc

{
  "projects": {
    "default": "<PROJECT_NAME>"
  },
  "targets": {
    "<RESOURCE_NAME>": {
      "hosting": {
        "www": [
          "<RESOURCE_NAME>"
        ]
      }
    }
  }
}

最終的にデプロイは以下のように行う。

firebase deploy --only hosting:www

GitHub Actionsの設定

以下のような感じでnode_modules配下をキャッシュすることでビルド時間を短縮している。

まとめ

静的サイトを構築するのは簡単

メルカリ/メルペイを退職します

いわゆる退職エントリーというヤツです。表題の通りで、10月をもって4年3ヶ月勤めたメルカリ/メルペイを退職します。思い返せば、退職エントリーというものをブログに書くのは初めてです。少し緊張してます。

だれ?

oinume です。Goが好きなBackend engineerです。

何をやっていたのか?

2016年5月に入社してからやってきたことを書き出すと以下のような感じです。メルカリ→ソウゾウ→メルペイと、気付いたらチームごと会社を異動しており、様々なプロジェクトに携わりました。一つの会社の中でこれだけたくさんのことをやったのは初めてで、様々な経験を積ませてもらい、とても刺激的でした。

  1. ID Platform Teamでメルカリや周辺サービスのアカウントの統合 @メルカリ
    • この記事でID Platform Teamについて詳しく説明されている
  2. メルカリ月イチ払い(現メルペイスマート払い)の立ち上げ @ソウゾウ
  3. メルカリNOWの立ち上げ @ソウゾウ
  4. ID Platform Teamでmicroservice内の認証・認可を司るAuthority Serviceの開発・運用 @メルペイ
    • この記事で軽くAuthority Serviceが説明されてる
  5. メルカリ月イチ払いをメルペイスマート払いにリニューアル @メルペイ
  6. メルペイスマート払いのモノリス→microserviceへの移行 @メルペイ

最も思い入れが強かったプロジェクト

どれもこれもやりがいの多い仕事だったのですが、一番思い入れが強いのはメルカリ月イチ払いの立ち上げです。これはメルカリの中で使える「後払い」の機能だったのですが、当時は後払いというとお金を借りるというイメージがあり、あまり良くないイメージがありました(今でもまだあるかも)。しかし、以下のようなUXの良さがあったため、たくさんの人に使われる機能になりました。

  • クレジットカードが作れなかったりする若い人向けに後払いの機能を提供することで欲しいものがすぐに購入できる
  • コンビニ払いを使っていた人が後払いを使うことで売り手側の入金待ち状態が減らせる

さらに、この後払いの機能がメルペイスマート払いとリニューアルすることで、メルカリ以外の店舗でも使えるようになり、かつ機械学習による与信枠(クレジット)の付与ができるようになりました。

最後はメルペイスマート払いのBackendのTech Leadをやらせてもらい、VPoEのhidekさんとなぜか腕相撲をするまでになりました(違

メルカリ/メルペイの良いところ

プロダクトの人だけではなく、コーポレートの人もお客様のことを常に考えているプロフェッショナルの人が多かったです。どうしてもプロダクトの部分にフォーカスされることが多いですが、人事・PR・BizDev・CS・プロダクト開発の部署がとにかく一体となっていることがこの会社の強みだと思います。周りの人が頼りがいのある人が多く、「この人だったらやりたいことだけ伝えておけばなんとかしてくれる」ということが多かったです。そんな人達に助けられながらどんな時も仕事を前に進めることができたので、本当に感謝しかありません。

また、技術面では #tech-golang や #tech-gcpなどの技術系のSlack channelが活発で、例えばGCP関連で質問があったら #tech-gcp に軽く質問をすると詳しい人がすぐ回答してくれます。何かしらその道のエキスパートがいるので、これはエンジニアとしては最高の福利厚生だと思います。

なんで辞めるの?

もう少し小さな会社で事業を伸ばすフェーズに立ち会いたい、というのが一番の理由になります。日本には主にDX(Digital Transformation)の面で、たくさんの「未開の地」があり、様々な分野で圧倒的に成長の余地があると思っています。なお、これを書いている時点ではまだ転職先は決まっていませんが、おそらくこの「未開の地」を切り開くスタートアップに行くと思います。

※9/2時点で2社からオファーをもらっているので、どちらかに転職することになると思います。

さいごに

もう40歳を超えて脂の乗りまくった年齢になってきたので、そろそろ真面目に今後のキャリアのことを考えたほうがいいかなと思いつつも、やはりプロダクト開発が好きなので生涯現場でコードを書いていきたいです。

次もGoをメインでやっていきたいと思っているので、私を知っている人は勉強会などで会った時にはぜひ声をかけてもらえればと思います。

go testを並列で動かして速くする

はじめに

アプリケーションが大きくなってくると、テストを並列で実行しないとどんどんgo testの実行時間が長くなってしまい、いわゆる「CI待ち」というものが発生してしまう。この記事は自分用のメモだが、テストを少しでも速くしたいという人のための記事。おそらく会社の誰かがもっと丁寧な説明のブログ記事を書いてくれるはず。

go testを速くする方法

方法としては以下がある。それぞれ細かく説明していく。

  • go test実行時に-pオプションを使う
  • Test関数にt.Parallelを入れる

go testの実行方法

go testコマンドでは大きく分けて以下の2つを行っている。

  1. .go, _test.goをコンパイルしてバイナリを生成
  2. 生成したバイナリの実行(=テストの実行)

この時 go test ./... のように実行するとパッケージごとにバイナリを生成してテストを実行する。-pフラグはこのパッケージごとのコンパイルとテスト実行の並列数を設定するもので、デフォルトではGOMAXPROCSの数になっている。

t.Parallel

上では-pによってパッケージごとのテストの実行を並列にすることができると説明したが、同じパッケージ内のTest関数は直列で実行されている。これを並列で実行したい場合はどうするのかというと、(*T).Parallelを使えば良い。これを入れることで「そのTest関数は並列実行できる」ということを伝えられる。

まとめ

  • パッケージごとのテストのコンパイルと実行を並列にしたい場合は-pを指定する(デフォルトはGOMAXPROCS(
  • t.Parallel()の呼び出しがあると、そのTest関数は並列で実行される