新卒・中途採用におけるコードチェックの実施とチェック時の観点について（株式会社ゆめみサーバサイドの場合）

# はじめに
採用試験としてコードチェックを導入している会社はまだまだ少ないのですが、実際にコードチェックを導入するにあたっては以下のような問題があります。
* そもそもコードチェックは必要なの？
* コードチェックの目的は何？
* どんな問題を出題するのが適切なの？難易度は？
* コードチェックで何をみればいいの？得点だけ？
* 応募者へのフィードバックは何をすればいいの？

これらの問題は企業の体制や、規模感、どういう人材を募集しているのか？によって答えはまちまちで正解は無いのですが、株式会社ゆめみにおける一例を紹介できればと思います。

# 株式会社ゆめみ（以下、弊社）とは
2000年創業の、受託中心の社員数300名弱（※2022年8月現在）Web開発企業です。
2022年現在、エンジニアほぼ全員がフルリモートで自宅から作業しています。
現在、離職率は業界全体から観ても非常に低い状態ではあるものの、まだまだエンジニアを絶賛募集中です。

# 弊社の採用試験におけるコードチェックの位置づけについて
弊社では、採用の窓口は iOS開発/Android/フロントエンド/バックエンド/インフラ とそれぞれ分かれているのですが、それぞれのチームにおいて入社試験としてコードチェックを実施することになっています。
弊社におきましては、残念ながら新卒の方であったとしてもゼロからすべてを教育するだけの体制が整った企業ではないため、このコードチェックはある程度重要な位置づけを持ったものとなっています。

ただし、出題される問題、出題形式、回答形式、時間、採点の際の評価観点等はチーム毎の裁量により決めることができますので、それぞれ各チームが重要と思う指針にもとづいて決定、実施をしています。

この記事ではサーバサイドエンジニア採用におけるコードチェックのサンプル問題や、採点観点などを整理したものを記載します。
※他のチームの試験などは記事末尾に記載

# サーバサイド採用試験の流れ
Web上で試験を実施します。
* 担当より試験用のURLを送付させていただきます。
* 1週間以内の好きなタイミングにて、担当より送付させていただいたURLから試験を実施してください。(※期間は調整可能です)
    * 受験中随時、準備されたテストケースを実施することでテストの通過率を確認することができます。
    * ※エッジケースの試験など、一部の試験は受験者には結果が見えないものもありますのでご注意ください。
* 試験終了後、テストケースの通過率がある一定以上の方については、弊社エンジニアによるコードレビューを実施します。
    * コードレビューを実施したコードに関しては全員に**評価したポイント** と **改善ポイント** をフィードバックします。
    * 評価ポイントおよび改善ポイントに関してはコードレビュー時の観点をエンジニアの間で共有することで、指摘内容にブレが出にくいようにしています。


# 【本題】採点の際の評価観点
弊社サーバサイドエンジニア募集のコーディング試験では、競技プログラミング的な難易度の高い問題に対してどう回答するかのエレガントさはそこまで重視しません。
むしろ、実際に業務で使われるような特徴を持ったコードをどう構築するかを評価ポイントとして重要視しています。

* データ整合性、安全性の観点
    * 通常プログラムはそのプログラム単体では利用されず、入力されるデータも他のプログラムにより生成されることが多いが、そのデータが急に変更されたときなどに破壊的な問題を起こさないか

* 可読性の観点
    * 一度書いたコードは本人の手を離れる前提で、他人にすぐ引き継げるコードとなっているか。
    * オーバエンジニアリングになることで可読性を逆に下げることになっていないか。
    * コードのメンテナンス時や、障害発生時に常に仕様書とセットで入手可能とは限らないが、ソースコードを読むだけで仕様が過不足なく表現されているか

* 将来のメンテナンス性の観点
    * 中長期に渡って使い続けられる可能性があることを意識されているか。
    * 要求仕様の一部が今後変更される可能性があるが仕様変更に対して柔軟に対応できるか。大きなリファクタリングを必要としないか。
    * テストを書きやすいコードとなっているか。（※試験の解答としてはにテストコードの実装は不要です。）
    * 入出力対象のデータ形式が将来的に変わる可能性があるが、局所的に仕様を変更しやすいか。

上記を踏まえて例えば『要求仕様中の一文により通常行うべきチェックや例外処理を省略する』ようなケースにおいてはその旨を記載しておく必要があると考えます。

但し、問題文に記載された要求仕様を満たすという前提で、自分はこのコード中で何を重視したかを別途コメントやアピールポイントに記載されていた場合においては、コードがそれを体現できているかを確認した上で、その観点での評価します。
* 評価観点を調整するアピールコメントの例
    * この問題文からは使い捨てのコードであると判断し、とにかく実装速度を優先しました。
    * 実行時のステップ数が少なくなることを最優先としています。
    * 実行時のメモリ使用量を最小化することを優先しました。

# サーバサイド採用試験試験の概要
## 試験の難易度について
試験時間の中で上記の観点を意識したリファクタリングに時間を使うことができるようにするため、あまり複雑な仕様を持った問題は出題していません。
また、試験中に各言語のリファレンスを調べながら回答を行うことは自由です。

## 試験内容
プログラミング問題1題と、SQL問題数題をそれぞれ指定時間内に回答していただきます。

### プログラミング問題 1題
* 制限時間は200分
* 指定された仕様に基づいたコマンドラインプログラムをコーディングしていただきます。
* 言語は以下の中から選ぶことができます。(※コードレビュー可能なエンジニアの調達状況により変動することがあります。)
    * C, C++, Java, JavaScript, PHP, Python3, Ruby, Go, Rust
    * ※ Python3など、弊社の通常の開発においてはあまり使われていない言語も含まれていますが、まずは応募者の方が習熟された言語において、上記の観点を満たしたコードを記載する事ができるかどうかを観ています。

※ プログラミング問題のサンプルにつきましては弊社サイト[【新卒・中途採用】サーバーサイドエンジニア応募者向けの模試](https://www.yumemi.co.jp/serverside_recruit "【新卒・中途採用】サーバーサイドエンジニア応募者向けの模試") に公開しています。
※ 2022年6月17日、こちらのページのサンプル問題を利用して、その場で回答してもらった上で弊社エンジニアによるコードレビューを実施する1dayインターンを開催いたしました。学生さんにも概ね好評だったようです。
https://job.tracks.run/challenges/yumemi-24-01

### SQL問題 数題
* 制限時間は90分
* 予めこちらで用意したDB上に作成された複数のテーブルの親子関係に気をつけていただきながら、以下の操作をするSQLなどを作成していただきます。
    * 指定されたデータの抽出
    * データ集約を含むデータ抽出
    * データの更新・追加・削除作業など

# 関連ページ
弊社では、以下のチームでは模試ではなく、実際に利用されるコーディング試験そのものを公開しています。
こちらも是非御覧ください。

以下、Qiita記事として公開
* [ゆめみの Android の採用コーディング試験を公開しました](https://qiita.com/blendthink/items/aa70b8b3106fb4e3555f)

以下、[ゆめみオープンハンドブック](https://notion.yumemi.co.jp/)（弊社の情報公開サイト）内で公開
* [iOSコードチェック課題](https://notion.yumemi.co.jp/c3130140e6f0470aa232e5a299405600)
* [フロントエンドコーディング試験](https://notion.yumemi.co.jp/0e9ef27b55704d7882aab55cc86c999d)
* [Flutterコードチェック課題](https://notion.yumemi.co.jp/9e183dfba8094f92bdb9b4b1e9a6992d)