コーディング面接練習サイト「Pramp」を使ってGAFAの面接に挑む

# はじめに
**コーディング面接**というものをご存知でしょうか？
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470270/1799f5bf-728f-f5f7-35db-229866fe28c6.jpeg" width="500">


コーディング面接とはGAFAなどをはじめとする海外のTech系企業などで広く行われている面接で，データ構造やアルゴリズム，システムデザイン等の知識を問うものです．
[面接 - Google](https://careers.google.com/intl/ja_jp/how-we-hire/interview/#interviews-for-software-engineering-and-technical-roles)

Googleで行われるようなコーディング面接は，

- 45分程度の時間内に
- データ構造やアルゴリズムの基礎に関する問題を
- 面接官と話し合いながら（多くの場合英語で）
- ホワイトボードにコードを書いて解く

といった特徴があります．

データ構造とアルゴリズムの問題自体は，[Cracking Coding Interview](https://www.amazon.co.jp/%E4%B8%96%E7%95%8C%E3%81%A7%E9%97%98%E3%81%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%8A%9B%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B%E6%9C%AC-%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E9%9D%A2%E6%8E%A5189%E5%95%8F%E3%81%A8%E3%81%9D%E3%81%AE%E8%A7%A3%E6%B3%95-Gayle-Laakmann-McDowell/dp/4839960100/ref=sxbs_sxwds-stvp?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&cv_ct_cx=%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E9%9D%A2%E6%8E%A5&dchild=1&keywords=%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E9%9D%A2%E6%8E%A5&pd_rd_i=4839960100&pd_rd_r=4a0bb728-2a26-4059-b57f-a91f9db99c36&pd_rd_w=noInX&pd_rd_wg=zYEjp&pf_rd_p=061436e1-e06b-4002-8259-a4784cf8d96f&pf_rd_r=883CYZ1T8V8EWKBBR67P&psc=1&qid=1588489219&s=english-books&sr=1-1-c03f761f-6f93-450c-9c1a-00281a3cf99c)のような書籍や[Leetcode](https://leetcode.com/)のようなサイトを使って練習を積むことができます．

しかしコーディング面接の最大の特徴は「**面接官とコミュニケーションを取りながら**」問題を解くことです．これは一人で本を読んで問題を解いたり競技プログラミングに取り組むのとはまた違った訓練が必要となります．またGAFAのような海外Tech企業を受ける場合は面接が英語で行われる場合も多いため，「**自分の考えを英語で説明する**」力も求められます．

それではどのように対策するのか．

もしコーディング面接の経験がある知り合いがいるなら，その人に模擬面接をしてもらうこともできますが，「そんな知り合いいないよ！」という方も多いと思います．しかし世の中は便利なもので，面接の練習ができるサービスがいくつかあります．

そのうちの１つで，かつ日本国内で無料で使えるのが**Pramp**です．

Prampについて日本語で説明した記事があまりなかったので，(私も5回ほど使ってみた程度ですが)簡単に紹介していきたいと思います．

# Prampとは

![pramp](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470270/6e2027ba-f43e-afa2-8de1-d21919150b7f.png)


https://www.pramp.com

Prampとはコーディング面接練習用のサイトで，無料で登録・利用することができます．面接対策をする世界中の人が使っており，コミュニケーションは基本的に英語で行われます．

最大の特徴は，利用者が**面接官と候補者両方の役割を交代して行う**ことです．
Prampには専門の面接官がいるわけではなく，面接の練習をしている利用者同士が自動的にマッチングされ，半分ずつの時間でお互いに問題を出し合います．
面接官を体験することで学ぶことも多く，面接への理解が深まるというメリットがある一方，面接官をやる分の負担が増えたり，あまり面接官が得意でない候補者とマッチングして面接がうまくいかない可能性があるというデメリットもあります．

「わざわざ面接官役なんてやりたくない！」という方もいると思います．気持ちはわかりますが，私が調べた限り無料の面接練習サイトはこれしかなかったので仕方ありません．

# Prampを使ってみる

## 登録
まず，[サイト](https://www.pramp.com)に行ってみます．
<img width="500" alt="スクリーンショット 2020-05-03 16.47.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470270/f95dcd86-f4bd-8fb5-d0c2-dcf9c4a3b426.png">

「Start Practicing」を押すと，名前とアドレス等を入力する画面になるので，入力するとメールが届きます．メールのリンクをクリックします．

<img width="500" alt="スクリーンショット 2020-05-03 16.51.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470270/e7d823ae-8af4-47b3-febd-eff61099e34e.png">

その後進んでいくと，住んでいる地域，現在のスキル，使用する言語などを入力します．これらの情報はあとでプロフィールから変更できるので適当でも構いません．

<img width="500" alt="スクリーンショット 2020-05-03 16.52.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470270/8984dbfe-2772-3bda-312b-5f8076320290.png">
<img width="500" alt="スクリーンショット 2020-05-03 16.53.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470270/cb505542-afb7-a1ff-1227-4250a68462d8.png">
<img width="500" alt="スクリーンショット 2020-05-03 16.53.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470270/55ae1451-cada-d9b9-c53f-d2a5f137d21d.png">
<img width="500" alt="スクリーンショット 2020-05-03 16.53.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470270/0a0a09ea-4e86-0694-c49d-766eb4f588fa.png">

最後に練習の日程を聞かれます．「もう日程を登録するの？」と驚くかもしれませんが，これをしないと先に進めません．あとで変更，キャンセルができますのでとりあえず適当に選んでください．

<img width="500" alt="スクリーンショット 2020-05-03 16.53.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470270/45115a17-6180-15ef-0a2d-ca7208b8081e.png">

これで登録完了です！ダッシュボードに面接の日程が表示されていると思います．

<img width="500" alt="スクリーンショット 2020-05-03 16.54.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470270/4c869032-2252-2e7e-357a-7ee84107a937.png">

## 練習日程を決める

続いて練習日程を決めていきます．

ダッシュボードの「Start a practice session」をクリックすると，まず問題の種類を聞かれます．

<img width="500" alt="スクリーンショット 2020-05-03 16.53.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470270/b69052a0-10e0-9f67-2178-c88fc767ce02.png">

一般的なコーディング面接向けの練習であれば「Data structure and algorithms」で良いと思います(私もそれしかやったことがありません)．

次に日程を聞かれます．

<img width="500" alt="スクリーンショット 2020-05-03 16.53.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470270/60c98eff-1bd0-95d8-56a8-86b1061bae46.png">

日程カレンダーは2時間おきに時間を選択できます．
カレンダーにはところどころ色が付いている時刻がありますが，どうやら緑色->黄色->無色の順でマッチングしやすい時間帯のようです．ただ私の経験上，無色の時刻を選んでもマッチングできなかったことはないのであまり気にしなくていいかもしれません．

予定はダッシュボードで確認できます．変更，キャンセルしたいときは予定の横のボタンで行うことができます．
なお，予定を決めたからといって既に面接相手が決まっているわけではなく，開始時刻になってからマッチングが行われる仕組みのようなので，遠慮なく変更，キャンセルして大丈夫だと思います．

## 面接準備

面接のスケジュールを立てると，横に「Question You'll ask」という項目が現れます．これはあなたが面接官役のときに相手に出題する問題です．Prampでは出題する問題があらかじめ決められているので自分で考える必要はありません．面接の前にこの問題を予習しておき，面接官としてうまく振る舞えるように準備しておきます．
なお，初回はこの問題を自分で選ぶことはできません．3回くらい練習をすると，過去に相手から出題された問題の中から次に出す問題がランダムに選択されるようになるので，（キャンセルと再選択を繰り返せば）好きな問題を選べるようになります．

問題をクリックすると次のような画面になります．

<img width="500" alt="スクリーンショット 2020-05-03 17.31.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470270/1f9604bc-524a-98ff-6cf4-89b6e31dc985.png">

右側に「Question」「Hints」「Answer」の欄があり，問題文とヒント，答えを見ることができます．解答者からは問題文のみを見ることができ，ヒントと解答は見られません．面接前にこの問題を理解し，必要なら相手にヒントを与えられるようになっておきましょう．

このエディタでは，基本的には指定の入力に対し正しい出力を返す関数を実装すれば良いです(Leetcodeと似ています)．
下の「Run Code」は好きな入力で挙動を確認できます．関数を実装したらprint文などを使って出力を確認できます．
<img width="500" alt="スクリーンショット 2020-05-03 17.39.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470270/cb5bcfba-44af-56df-d589-a307adc513cd.png">

一方「Run tests」は用意されたテスト入力に対し正しい答えを返すかジャッジが行われます．全てパスすると緑色に，ミスがあると赤色になります．
<img width="500" alt="スクリーンショット 2020-05-03 17.43.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470270/1cdd9df3-1d5f-9a64-cdee-fb27868a7244.png">

## 面接開始

予定の時刻の5分前になると，ダッシュボードのスケジュールの横に「Join session」というボタンが現れます．そこをクリックすると，マッチング待機画面になります．

経験上遅くとも開始予定時刻から5分以内にはマッチングができ面接に移ります．面接の様子はPramp公式がYoutubeにあげているのでそちらを見た方が雰囲気がつかめると思います．

[Pramp - YouTube](https://www.youtube.com/watch?v=S2VfJh8J0gc&t=214s)

デフォルトはカメラでお互いの顔が見える状態ですが，カメラをオフにして音声のみにすることもできます(私は基本的に音声のみで練習していました)．
自分と相手どちらがはじめに問題を解くかは自動的に割り振られます．問題文は表示されているので，まずはそれを読むところから始め，相手とコミュニケーションを取りながら問題を解いていきます．解き終わったら左上の「Swap roles」のボタンで解答者を交代します．
解答時間の目安はお互い30分ずつです．1時間経っても練習を続けることはできますが，2時間経過すると自動的に終了となるようです．

なお，うっかり予定していた練習をすっぽかしてしまった場合も特に罰則などはないので安心してください．

## 面接後

お互いの練習が終了したら面接を終了します．終了後は相手へのフィードバックを記入する画面に移ります．相手のコーディングスキルやコミュニケーションスキルに付いて簡単に評価を書きましょう．

終了後はダッシュボード上で，自分が解いた問題と相手からのフィードバックを確認することができます．

<img width="500" alt="スクリーンショット 2020-05-03 18.41.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470270/cb851483-8c21-3a7d-35cb-bf76e82afe5a.png">

フィードバックはこのような形で見ることができます．大抵皆さん優しいので星３つか４つくれます．

<img width="500" alt="スクリーンショット 2020-05-03 18.40.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470270/b9bbfd71-418f-2256-6e0f-88520fccb7b8.png">


また，「Request Intro」というボタンがあるのですが，双方がこれを押すとマッチングした相手の連絡先を知ることができるようです．素晴らしいスキルを持った相手だったら情報交換してみるのもいいかもしれません．

# 感想
- 日本でPrampなどの練習用サービスを使うのは，かなり面接準備を進めてきた人が多いと思いますが，海外では初学者も使っている裾野の広いサービスのように感じました．例えば私がマッチングした人の中には「Dynamic Programmingをほとんど知らない」と言っていた人もいたので，「レベルが高すぎるのではないか」という不安はあまり感じなくて良いと思います．

- 少なくとも私が解いた問題はそこまで難しいものはありませんでした．感覚的には **「Leeetcodeのmediumの中でも簡単なほうの問題」**くらいの難易度が多かったです．

- **英語でコミュニケーションを取るという点においてはかなり練習になりました．**私は英語ペラペラではないため聞き取れない時も多かったですが，具体例で説明してもらったりしながらなんとか理解していました．本番の面接も英語の場合は，こういった練習をやっているかやっていないかで精神的な負担がかなり違うと思います．

- 大切なのは「まだスキルが十分でないからやめておこう」と思わないことです．スキルが十分でないから練習するのであり，わからないことがあったり詰まったりするのは当たり前なので，とりあえず一度やってみるのはありだと思います．


**皆さんもPrampを初めてGAFAの面接突破を目指してみてはいかがでしょうか！**