株式会社withのサーバーエンジニアってどんなことをやっているの？

# はじめに
株式会社withでサーバーエンジニアをやっています、hayaton(最近太ったのでちょうどいいニックネームになりました) といいます。今年で人生２回目の前厄に入るぐらいの年齢です。

改めて自己紹介したいとは思いますが、この記事に書くと汚れてしまうので、別の機会に自己紹介させてください。

こちらの記事では、
採用ピッチにある、「withサーバーエンジニアの業務内容」について、エンジニア目線で少し深掘りする記事です。

https://speakerdeck.com/enito/with-sabasaidotimupitutizi-liao?slide=3

# withサーバーエンジニアの業務内容について

## まずは現在のチーム構成の紹介

withで働いているサーバーエンジニアは、一言で言えば、****フルスタック気味なエンジニア****の集まりです。
そして、チーム内にはセクションが無いチームとなっています。

****フロントエンド・バックエンド・SREとかの分割をよく見るけど、なぜwithでは分割されていないの？****:thinking:

と思う方もいるかも知れません。
このあたりについては、

- 少数精鋭である。
- メンバーの技術キャッチアップの障壁になりえるのが嫌で分割が無い。

という背景があると考えており、あえて分割が無いチームにしているのかなと思っています。

## 業務内容の話
さて、そのチームのエンジニア達は実際にどんな業務をやっているのか？について掘り下げていくと、ピッチにもある以下の７項目となります。
（以下に書かれているもの以外もあります）

- モバイルアプリ向けのWeb APIの開発
- ブラウザ向けWebサイトの開発
- データベース設計・チューニング
- AWS/GCPを使ったインフラ設計
- インフラのセキュリティ設計と構築
- サーバーリソースの監視・改善
- データアナリスト向けのデータ抽出・転送処理の実装

個々に簡単にご紹介していきます。

### 1. モバイルアプリ向けのWeb APIの開発
アプリ版withが使うAPIのことを指します。
withでは、`Rails`と相性がいい、****RESTを採用したAPI方式****となっており、仕様は`Swagger`のファイルを使って管理しています。
クライアントエンジニアと開発を進める必要がある場合は、まずはAPI仕様書を作成し、クライアントへその仕様書を共有します。
その後、仕様に沿って開発作業に入っていく。
といった流れになります。

### 2. ブラウザ向けWebサイトの開発
withでは、アプリがご利用いただけないお客様向けに、ブラウザでもサービスのご提供をしています。
基本的にはアプリと同じ機能が搭載されていますが、一部の機能は実装されていません。
開発をする前に、デザイナーが`Figma`上でデザインを作ってくれるので、それをベースにHTML・SCSS・JavaScriptを駆使して実装していきます。

### 3. データベース設計・チューニング
クエリのチューニング（EXPLAIN見ながら）だったり、既存のスキーマの構成変更や、
状況に合わせてパーティション切ったりなどのDB関連の作業も個々に担当していきます。

### 4. AWS/GCPを使ったインフラ設計
現状用意しているインフラ以外を使う必要が出てきた場合に、発生します。
どのようなサービスを利用しつつ、どのような構成で採用すべきかを検討や検証をして、設計していきます。
withでは`AWS`/`GCP`を使っていることが多いのですが、状況によっては他クラウドサービスを利用することも有りえます。
`AWS`/`GCP`だけで実装するという方針よりかは、 ****広い視野をもって、適切なサービスで機能を実現していこう。**** という方針です。
※ 何気に ****Google Cloud 認定 Professional Cloud Architect**** はチームの半数が取得しています。

また、 ****インフラはコード化する。**** という方針の元、現在は`Terraform`を導入しています。
（私が入る前は`Chef`を使っていたらしいです。ただ私は`Chef`を使ったことは有りません。）

`Terraform`を導入することで構成情報をバージョン管理ツールで管理できるので、過去の遍歴などがたどりやすくなっています。

### 5. インフラのセキュリティ設計と構築
定期的に第三者機関の脆弱性診断を受けており、もし何かしら見つかった場合は即対応するというスタンスで継続的に実施しています。
また、アプリケーションなどで発生した脆弱性等の場合は、同じような脆弱性を生まないように、診断結果をチームに共有し、個々のメンバーが開発時に意識しながら、開発していくという取り組みも実施しています。

### 6. サーバーリソースの監視・改善
`CloudWatch`、`New Relic`、`PagerDuty`を使って監視・改善などを実施しています。
※ `PagerDuty`のデフォルトのアラートって正直ビビりますよね。

### 7. データアナリスト向けのデータ抽出・転送処理の実装
`データウェアハウス`（withでは`BigQuery`を採用）にデータを流し込むまでの環境作り・メンテナンスを実施しています。
※ 要約するとデータパイプラインの構築・運用になります。

### +α 自分の案件以外のPullRequestのReview
GitHubのPullRequestベースで開発をしており、開発完了後、QAに品質チェックをお願いする前にかならずReviewを実施しています。Reviewの座組としては、
- ソース管理者１名（シニアエンジニア）
- 別のメンバー１名（固定化しないようにしている）

二人以上を最低人数として行うルールとなっており、
全員のReviewが通らないと品質チェックに依頼できないフローとなっています。

この作業が有ることで、自分が担当していない案件のコードを見る機会が強制的に発生するため、学びも多いです。
また、それらを通じてwithシステムの理解が深まり、エンジニア間の自社システムの理解力の差が生まれないような取り組みとなっています。

## 結構担当領域広いよね？
上記の内容を読んでいただくと、担当領域が広くて、しんどそうと素直に思われるかもしれません。
確かに項目として書き出すと結構あるのですが、個々の作業自体はそこまで大きいものは多くありませんし、「AWS/GCPを使ったインフラ設計」とかは、頻繁に発生するわけでは有りません。

また、
- 開発作業に詰まったり
- 設計や実装を相談したい

となっても、チームのエンジニア全員が相談に乗ってくれるので、経験が浅い人でも担当することが可能ですし、 ****やりたいという意思を尊重したアサインをする文化**** の考えの元で業務が進んでいるので、エンジニアとして技術の幅を広げていきたいと思っている人にとっては最良な環境かなと思っています。

## その他
### GitHub Copilotの試験導入
先日から`GitHub Copilot`が全社（エンジニアだけですけど）で試験導入されました。
私的には、開発効率が著しく向上していると感じています。

いままでコーディングに時間をかけていたところを、コーディングだけじゃない、違う領域にもチャレンジができるような取り組みになっていると感じます。
## 終わりに
 ****幅広いスキルを持ったエンジニアとして成長していきたい！**** と思う人がもしいらっしゃればぜひ弊社の採用サイトを見ていただければ幸いです。

# withサーバーチームでは新しい仲間を大募集中です！
https://enito.co.jp/careers/

https://hrmos.co/pages/enito/jobs/0002023

https://speakerdeck.com/enito/with-sabasaidotimupitutizi-liao