リモートワークのコツ

所属している会社が全社レベルの在宅勤務中で、現在3週間目である。僕はその前から割と自宅で仕事をしているので、リモートワークするコツを書いておく。

普段と同じルーティーンで生活する

在宅勤務だと通勤がないため、ギリギリまで寝て、起きたらそのまま仕事ということがあるかもしれない。しかし、個人的にはいつもと同じルーティーンで行動するのが良いと考えている。僕の場合は朝食をちゃんと食べてシャワーを浴びて、髭剃りなどをする。オフィスに行く日と同じ行動をすることで、自宅にいても仕事モードに切り替えることができる。在宅勤務だと1on1やミーティングでビデオカンファレンスを使うことが多い。家で仕事をしているからといって、休日のような見た目だとお互い気も入らないし、音声だけだとコミュニケーションに必要となる情報が落ちてしまい、仕事がやりにくくなると考えている。

歩き回る

在宅勤務していると思ったより動かない。ずっと座って仕事をしていると体が鈍るし疲れ切ってしまう。そこで、意識して立ったり少し歩いたりしている。AppleWatchだと定期的に歩行を促してくれるので、それを使うこともある。コーヒーを買いにコンビニやカフェまで散歩することもある。リモートワークだとPCの前に張り付いていないといけない気がしてくるが、オフィスにいても少し散歩したりコンビニに行ったりはするので自宅でも同じようにすれば良いと思う(離席していることがわかるようにしておくとGood)。

Slackで雑談する / 反応速度を上げる

リモートワークだと、どうしてもコミュニケーションの量は減る。他愛のない雑談からアイデアが生まれたり、気分転換になったりすることもあるだろう。そこで、少しだけ意識してSlackで雑談をするようにしている。とはいえ、Slackで会話ばかりしていても仕事は進まない(特にコードを書くような仕事はそうだね)ので、メリハリが大事だろう。

また、SlackやGithubでメンションをもらった時の反応速度は意識して上げるようにしている。リモートだと状況が見えないので、気づいていないのか、気づいてるけど後に回しているのかなどがわからず不安になる可能性があるかもしれない。ミーティングなどでどうしても手が空いていない時を除き、まずは返信して見ていることを伝えることが大事だと思い、出来るだけ早く反応することを心がけている(できないことも多いけど)。

作業環境を整える

作業用のデスクとチェアを専用に用意して、生活空間からは見えにくい場所に置いている。リモートワーク云々とは別に、個人的にコードを書いたり現像したりと作業するときに使うために用意していたものを使っている。また、ビデオカンファレンスもやりやすいよう、カメラから見える範囲に生活空間が含まれないようにも工夫している。

オフィスと同等レベルの作業環境を整えようとするとかなり金銭的な負担も大きい(まずスペースが必要だし、デスクにチェア、モニター、ネット回線など色々必要となるだろう)ので誰にでも薦められるものではないが、参考となれば幸いである。

おわりに

他にもコツがあれば書き足していこうと思う。あなたのリモートワークのコツは何ですか?

「Kubernetesで実践するクラウドネイティブDevOps」のレビューをした

2020年2月19日に「Kubernetesで実践するクラウドネイティブDevOps」という書籍が発売されるのだが、レビュアーとしてお手伝いした。レビューとはいえ、雑誌ではない商業誌に関わったのは初めてなのでいい経験ができたと思う。ぜひ読んでみてください。

Kubernetesで実践するクラウドネイティブDevOps
John Arundel Justin Domingus
オライリージャパン
売り上げランキング: 1,870

GolandのSplitterをキーボードからリサイズする

Goland、というかJetbrainsIDEはデフォルトだとSplitterのリサイズをするにはマウスを使うしかない。しかし、Tab Shifter というプラグインを使うとSplitterのリサイズをキーボードからできるようになる。

僕はキーマップを以下のように変更していて、Tmuxのresize-paneと揃えている。これによりTmuxを使っている時とGolandを使っている時で同じ体験を得ることができる。

Stretch Splitter Down⌥ z
Stretch Splitter Left⌥ ,
Stretch Splitter Right⌥ .
Stretch Splitter Up⌥ a

なお、このキーマップは https://github.com/ssh0/dotfiles/blob/master/tmux/tmux.conf を参考にした。

Go製ソフトウェアのCIやリリースをGithubActionsで行う

Go で書いた CLI ツールのリリースは GoReleaser と GitHub Actions で個人的には決まり を読んで、自分もどうやっているのか書いておこうと思ったので書く。

CIでテストを実行する

これはまあ、素朴にやる。テスト自体はMakefileに隠蔽しておくと手元でもCIと同じテストを実行できて便利。

---
 name: CI
 on: [push]
 jobs:
 
   run_test:
     name: Go Test
     runs-on: ubuntu-latest
     steps:
 
       - name: Set up Go 1.13
         uses: actions/setup-go@v1
         with:
           go-version: 1.13
         id: go
 
       - name: Check out code into the Go module directory
         uses: actions/checkout@v1
 
       - name: Run Test
         run: |
           make test

タグを打ってリリースする

masterブランチに対してタグを作成すると、Actionsで自動的にリリースされるようにしている。

 ---
 name: Release
 on:
   create:
     tags:
       - v*.*.*
     branches:
       - master
 
 jobs:
   release:
     name: Release on GitHub
     runs-on: ubuntu-latest
     steps:
       - name: Check out code
         uses: actions/checkout@v1
 
       - name: Validates GO releaser config
         uses: docker://goreleaser/goreleaser:latest
         with:
           args: check
 
       - name: Create release on GitHub
         uses: docker://goreleaser/goreleaser:latest
         with:
           args: release
         env:
           GITHUB_TOKEN: ${{secrets.GORELEASER_TOKEN}}

リリースにはGoReleaserを使っている。これはtakaishi/kelmの.goreleaser.yaml。バージョンの埋め込みなども行なっている。

 # This is an example goreleaser.yaml file with some sane defaults.
 # Make sure to check the documentation at http://goreleaser.com
 before:
   hooks:
     # you may remove this if you don't use vgo
     - go mod download
     # you may remove this if you don't need go generate
     - go generate ./...
 builds:
   - env:
       - CGO_ENABLED=0
     ldflags:
       -X github.com/takaishi/kelm/config.Version={{.Version}}
 archive:
   replacements:
     darwin: Darwin
     linux: Linux
     windows: Windows
     amd64: x86_64
 checksum:
   name_template: 'checksums.txt'
 snapshot:
   name_template: "{{ .Tag }}-next"
 changelog:
   sort: asc
   filters:
     exclude:
       - '^docs:'
       - '^test:'
 brew:
   github:
     owner: takaishi
     name: homebrew-fomulas
   commit_author:
     name: goreleaserbot
     email: goreleaser@carlosbecker.com
   description: "CLI tool to Generate and insert markdown's table of contents"
   homepage: "https://github.com/takaishi/kelm"
   install: |
     bin.install Dir['kelm']
   test: |
     system "#{bin}/kelm"

このように、環境ごとのアーカイブファイルやチェックサム、チェンジログを作ってくれる。Homebrew用のfomulasも更新する機能があって便利。

コンテナイメージをビルドする

ソフトウェアによってはコンテナイメージをビルドしたいことがある。この場合も、ActionsでビルドしてDockerHubにプッシュしている。これはtakaishi/openstack-sg-controller の例。

 ---
 name: Docker Image CI
 on:
   push:
     tags:
       - v*.*.*
 env:
   DOCKER_HUB_TOKEN: ${{ secrets.DOCKER_HUB_TOKEN}}
 jobs:
   build:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v1
       - name: Build the Docker image
         run: |
           tag=$(echo ${{ github.ref }} | sed 's/refs\/tags\///g' | tr -d '\n')
           docker login -u rtakaishi -p $DOCKER_HUB_TOKEN
           docker build . --file Dockerfile --tag rtakaishi/openstack-sg-controller:${tag}
           docker push rtakaishi/openstack-sg-controller:${tag}

タグの作成はlinyows/git-semvを使っている

linyows/git-semv というgit pluginがあって、これを使ってタグを作っている。major/minor/patchのタグ作成以外にもpre-releaseタグの作成ができたりして便利。

課題:リリース時にChangeLogをどう作るか

今の方法だとコミットログが羅列してあるだけなので、ちょっと読みにくいかなあと思っている。また、PullRequestがある場合はそちらの情報を表示したい。CHANGELOGファイルに自動追記されると変更を追いかけやすくて嬉しいと思うが、どうやるのがいいのか悩み中である。

OpenPolicyAgentを使ってSecurityGroupを検査する

OpenStackのSecurityGroupで危なそうなものをチェックしてSlackに通知する https://github.com/takaishi/sg_inspector というツールを以前作ったのだが、最近チェックする条件を増やしたくなったのでOpenPolicyAgentを使ってチェック条件を記述できるようにしてみた。OPAを使うことでポリシーをツールの外に出すことができ、より汎用的に実装できるのが利点。しかし、ポリシーの記述にRegoという言語を使う必要があり、学習コストが必要という課題もあった。Rego自体でテストの記述も可能なので、検査ロジックとデータ、テストをツールの外に出せるのは良いですね。

コードは https://github.com/takaishi/sg_inspector/blob/v0.0.7/openstack.go#L98-L116 あたり。ひとまず、Goでポリシーファイルなどを読み込んで検査するあたりの書き方はわかったので今後活かせそうなものがあれば取り組んでいきたい。