B-Teck!

お仕事からゲームまで幅広く

【雑記】31歳になりました/転職します

31歳になりました

(昨年の記事)
【雑記】30歳になりました。 - B-Teck!

振り返り

といっても5/4が誕生日なので、31歳になってから既に1ヶ月が経っています。
ちょうど転職の選考を受けていたので、この辺が落ち着いたら書こうかなと思っていたら1ヶ月経ってしまいました。
昨年の誕生日は、負荷の高い仕事が終わるか終わらないかのタイミングでかなり疲弊していましたね…。
結局あのダメージから回復するのにほぼ1年かかってしまった気がします。
アレ以降もちょっとダウンしかけた場面もあったんですが、前回の教訓から学んでどうにか乗り越えられました。
早めにアラートを上げたり、ダメコンによって致命傷に至らないようにするなどの動きが出来たので少しは成長出来たのかなと。
30歳を迎えるにあたってキャリアとか人生について思い悩む時期が割とあったんですが、昨年末あたりにはだいぶ落ち着いてきた感があります。

技術

今年に入ってから急に業務では初めての技術に触れる機会が増えました。

  • Go
  • Python
  • Node.js
  • Vue.js (+TypeScript)

これまでの知識で多少ショートカットできるとはいえ、なかなかヘビーな体験でした…。
数が多くなってしまったのもあり、細かくそれぞれに踏み込むことが出来なかったのも少し残念です。
とはいえ、「仕事で触った」とは言えるようになったので、あとは伸ばしていくだけなのかなという気も。

転職

振り返りを書いてるとどうしても仕事の話になりそうなんですが、その辺は転職の話として書こうと思います。
この記事を書いている今日が最終出社日で、7月から次の会社で働きます。

仕事を辞めるに至ったきっかけ

(前回の転職記事)
【雑記】退職します - B-Teck!

  • 4月に長く携わっていたプロダクトから離れることになった
  • 全く新しいプロダクトに携わる中で、外も含めて視界を広げていいのではと思った
  • サーバーサイドを手広くやるという感じだったので、今後の自分のキャリアに悩んでいた
  • 技術をよりゴリゴリやっていける環境に身を置きたかった

という感じでした。
不満や不安によるネガティブな要因より、新しいことをやってみたくなったみたいな方が近いのかもしれないです。
実際、今でも現職も、人や文化も、プロダクトも大好きなんですよね。
前回の転職では早く辞めたい!という感じでしたが、今回は寂しいとか現実感ないな、という感覚が強いです。
他人事みたいですけど、「離れるのが残念」と思えるような会社で働けたことは、人生の中でもかなり良かったことなのかなと思います。

学んだこと

現職では、何も知らなかった自分にすごい速度でいろいろな知識や体験がインストールされました。
3年半しか働いていなかったんですが、体感では前職の数倍濃密な時間が過ごせたと思います。
主なものをピックアップするなら

  • サービス開発の難しさ・面白さ
    • 施策・改善のループを回して、より良いものを作っていくこと
    • 渾身の機能がふるわず悲しんだりすること
  • チームや組織の中での開発
    • 人は正論だけでは動かないということ
    • チームで協力してモノづくりをする感覚
    • コミュニケーションの難しさと大切さ
  • 学びの姿勢
    • 社内勉強会などでの登壇
    • 知的好奇心が旺盛な人たちとの交流
    • たくさんのコードを見て学ぶ機会があったこと

という感じでしょうか。
前職では一切なかった、裁量を持って技術とアーキテクチャを決められるというのが純粋に嬉しかったです。
入社半年の自分が、2018年当時あまり事例のなかったServer Side Kotlinの導入を進めさせてもらえたのは本当にすごかった。

転職活動

前回は転職エージェントを使ったんですが、今回は積極的に転職活動はしていませんでした。
LAPRAS(ラプラス) - じぶんの得意や実績を、瞬時に分析。 を利用して自分のポートフォリオを作りつつカジュアル面談を受けてみるといった感じです。

  • 4月中旬ごろにカジュアル面談を受け始める
  • GWを挟みながら選考を進め、5月末に内定(GW除いて正味3週間ほど?)
  • 半月ほど開発と引継ぎ業務を行い、今日に至る

異動したばかりなのもあり、持ち物が少なかったのもあって、思いの外スムーズに最終出社まで来たなぁという感じです。

次の仕事の話

次もサーバーサイドをメインにやりますが、主に触るのは初体験のScalaになりそうです。
というわけで、今必死に勉強しています。
それ以外にもフロントやDB、クラウドにも目を向ける余地がありそうなので、これまでの知識と合わせて、手を動かせる領域が増やせたらいいなと思っています。
Kotlinはひとまず趣味プロダクトで触っていく感じになりそうなんですが、今のところ一番好きな言語なので忘れないようにしていきたいです。

感想

次の職場はカジュアル面談から選考までオンラインで進み、入社後も当面はフルリモートでの勤務になりそうです。
現職でも週の半分がリモート勤務になっているのもあって、人と会わないままに決まり、毎日が過ぎていく感覚の中での転職なので、まだ現実に気持ちが追いついていないなと思ってます。
全然明日で最後って感じがしないんですよね。
有給消化期間でうまく自己をキャリブレーションしていかないとなという感じです。

おわり

主に転職の話になってしまいました。
まぁ人生において相当にインパクトのあるトピックなので当然といえば当然かも。
年末の振り返りとか、32歳になったときの記事で良い振り返りができるよううまく毎日を歩んでいきたいですね。

新しく繋ぐ縁やこれからも続いていく縁などあると思いますが、引き続き仲良くしてくれると嬉しいです。

【GAS】claspでTypeScriptを使ってユニットテストもする

前回からの続き
blog.beatdjam.com

claspはデフォルトでTypeScriptに対応していて、作成した.tsファイルを含んだ状態でpushすると自動でトランスパイルしてくれる。
せっかくなのでTypeScriptを導入した上でローカルでユニットテストを実行できるようにした。

claspのプロジェクトでTSを扱えるようにする

まず、GASの型情報を取得する。

$ npm i -S @types/google-apps-script

次に、tsconfig.json を作成する。

{
    "compilerOptions": {
        "lib": [
            "es2019"
        ],
        "experimentalDecorators": true,
        "esModuleInterop": true
    }
}

これで、ローカルで編集する際にGASの型情報を参照した上で、ES2019環境で書くことができるようになった。

ユニットテストを動くようにする

実体としては普通のTSのプロジェクトなので、普通にJestを導入する。

$ npm i jest @types/jest ts-jest -D

jset.config.js でテスト周りの設定をする。
今回は src 配下にファイルを置いているのでそのように指定した

module.exports = {
    "roots": [
        "<rootDir>/src"
    ],
    "testMatch": [
        "**/__tests__/**/*.+(ts|tsx|js)",
        "**/?(*.)+(spec|test).+(ts|tsx|js)"
    ],
    "transform": {
        "^.+\\.(ts|tsx)$": "ts-jest"
    },
}

あとはtestMatchにマッチするようなファイル名でテストを書いて実行してやれば良い。

$ npx jest

不要ファイルの除外

ここまでの手順で、管理する必要がなかったりGASに上げる必要のないファイルが出来たりする。
claspはgitのように .claspignore を設定することで任意のファイルを除外できる。
今回はこのように設定したが、拡張子がjsのファイルも残す場合は書き足す必要がある。

**/**
!src/*.ts
src/*.test.ts
!appsscript.json
coverage/*

一応 .gitignore もこんな感じにしてる

node_modules
.idea
coverage

注意点

一度GAS側に反映されたファイルは $ clasp pull するとjsになって落ちてくる。
TSで書く場合はGitで管理して、オンラインエディタ上で編集を行わないほうが良さそう。

まとめ

  • TS自体は書いて $ clasp push したら動く
  • ローカルで書くなら型情報入れる必要がある
  • ユニットテストとかは普通のTSのプロジェクトとして手元で入れれば良い
  • GAS側に一度反映したファイルはJSになるので注意

今回の作業に使ったリポジトリはこれです。
GitHub - beatdjam/anniversary-notifier

【GAS】claspの環境構築

nodeのインストール

  • nodebrewを入れる
$ brew install nodebrew

下記を利用してるシェルの設定に書いてPATHを通す

export PATH=$HOME/.nodebrew/current/bin:$PATH
  • nodeをインストールして設定する
# インストール可能なバージョンを確認
$ nodebrew ls-remote
$ nodebrew install-binary <version>
$ nodebrew use <version>
  • 下記でバージョンが確認できればインストール完了
$ node -v

claspのインストール

インストールはnpmコマンドで行う

$ npm i @google/clasp -g

インストール完了後、下記のコマンドを入力するとブラウザでログインを求められる。
実行するとホームディレクトリにトークンが保存された.clasprc.jsonファイルが作成される。

$ clasp login

claspでプロジェクトを管理する

初期状態ではGoogle Apps Script APIが無効になっており、プロジェクトの操作が出来ない。
Apps Script の設定画面での使用をオンにする。

clone

helpを打ってみるとこんな感じ。

-> % clasp clone --help
Usage: clasp clone [options] [scriptId] [versionNumber]

Clone a project

Options:
  --rootDir <rootDir>  Local root directory in which clasp will store your project files.
  -h, --help           output usage information

ここで言う scriptId はプロジェクトの編集画面のURLの下記の部分。

  • 旧エディタ https://script.google.com/d/<scriptId>/edit

  • 新エディタ https://script.google.com/home/projects/<scriptId>/edit

任意のディレクトリで下記コマンドを実行するとソースを取得できる

$ clasp clone <scriptId>

push

cloneしたディレクトリをGASに反映するときはgitと同じようにpushする。

$ clasp push

この時pushの対象となるのは下記のみ

  • 拡張子が .gs
  • 拡張子が .html
  • ファイル名が appsscript.json

status

push対象のファイルはstatusコマンドで確認できる

$ clasp status

まとめ

claspを利用する手順は

  • nodeを入れる
  • claspを入れる
  • Google App Script APIの利用を許可する
  • claspでログインして認証する
  • プロジェクトをcloneする

思ってたより簡単に導入できた。
作成したディレクトリはGitでも普通に管理できるのでGAS上だけで管理してたファイルをちょっとずつGitで管理できるようにしていきたい