はじめに
こんにちは、こふです。
ピクシブ エンジニア職インターン | pixiv SPRING BOOT CAMP 2023に参加してきたので、書ける範囲で色々お伝えします。
また、本記事の内容はピクシブ株式会社さんの社員さんに内容を確認頂いた上で公開しています。また、本記事の具体的な内容に関するご質問は一切お答えできません。具体的なお名前なども挙げません。
応募したきっかけ
春休みに普段のバイトとは違う何かをしようと思い探していたところ Twitter で流れてきたので応募してみました。加えて、参加時期を選べるため、大学や家の予定がない時を選んで参加することができるようでした。
8 日間のインターンと聞くと、短いと思われがちです。しかし、長期的な成果(長期のプロジェクトの完了など)は出せなくとも、短期的な成果(いくつかの課題の解決)を出すことは可能ではと思っていました。
また、ピクシブがどんな会社で、どんな方がいて、どんな開発プロセスで、どんな開発環境で、どんなコードが書かれているかを、自分の目で見て体験できる良い機会になると感じました。
話を聞いたりネットで見た情報だけでは分からないことが世の中たくさんありますよね。よって、応募することとしました。
pixivision コースを選んだ理由
まず、問題大ありだと思いますが僕はピクシブ株式会社さんのことを知りませんでした。どうもイラスト投稿サービスの会社らしい、と検索して知りました。
逆に「ピクシブのこのサービスじゃないと嫌だ」ということはないので、それぞれの説明文を読みつつ自分にとって良いコースを合理的に検討しました。
今の自分だけではできないが、助けを借りればできるかもしれないことが良いと感じてました。このケースが一番力がつく可能性が高いと思われます。
また、個人ではできないことを会社で経験することに価値があると感じていたため、歴史あるプロダクトのコースを選定しました。古くから開発され、保守運用する機会はそうないですし、技術的に(新機能を作ったり新サービスを作るより)非常に難しいと思っています。
また、フロントエンドは個人開発以外で前向きにやる気持ちがなかったので、サーバーサイドをメインで取り組めそうなコースにしました。申し込み時点では 2 つのコースを選ぶ(結局は 1 つにのみ参加)です。
片方は難易度的に絶対に無理だろうが可能であれば参加したいコース、もう 1 つが(実際に参加した)自分のスキルセット的に合格可能性がわずかにあるかもしれない pixivision コースを選びました。CMS の裏側にも興味があったので、pixivision コースに参加したい思いは、より強くなりました。
応募・面接
書類選考の ES は就活の ES とは異なり簡易的なものです。自分の関連アカウント・ブログ・過去に作った何かしらの成果物を 4 つほど添付しました。また、1 つだけ成果物・経験について長文でアピールする箇所もありました。
書類通過の連絡があったので日程調整の上、面接をすることになりました。面接では、コースを担当するメンターの方とお話をします。
過去に作ったもの・開発したものについてお話し、そこから質問を受ける形式です。最後に逆質問をしました。作ること・作った結果自体というより、そのプロセスを重視されました。質問が転々とせず、自分の発言を理解した上で深く質問していただきました。
コーディングテストも行いますが、いわゆる競技プログラミングではなく、実務に近いスクリプトを書くものでした。書ききれなかったので、正直言うと落ちたと思っていました(正解を書くことも大事ですが、プロセスを見ると言われていたため、可能性は 0 でないと淡い希望を持っていましたが)。
また、メンターさんの技術レベルの高さがインターンのページ・面接からヒシヒシと伝わってきたので、学び取れることが必ずあるはずと思っていました。
結果的に参加できる連絡がきました。PHP
経験は無かったですが、大きな問題とはならなかったようです(当然、事前に学習する必要はありますが・・・)。
参加にあたり準備したこと
PHP
が使われるので、PHP
の基礎文法だけネット上のチュートリアルで勉強しました。事前にメンターさんとやり取りして、使われる静的解析ツール・参考となるブログ記事も教えていただきました。
PHP
を勉強していて感じたことは、他の言語を使っていれば、あまり学習に苦労はしない言語だいうことです。クセは案外なく(基礎文法は)案外素直でした。
勉強したとは言っても 2、3 日で、その合計時間は 6 時間です(計測していたので正確)。環境構築から、良さげな教材の選定、どこを勉強するかなどの検討も含めた時間です。PHP を学ぶ: 初心者と上級者向けというサイトの基礎・中級を取り組みました。
なぜ勉強時間が長くないかと言うと、新たに何かを開発するのではなく、既存サービス・コードに対して開発を行うためです。そのため、コードを読んで理解することができれば(加えてメンターさんのサポートもあるため)勉強しすぎる必要はないと思っていました。しすぎても活かせない場面は非常に多いです。
結果的に、PHP
の文法のみで質問することは、あまりありませんでした(オブジェクト指向を意識してコードを書くことは、質問し丁寧に教えていただき非常に助けられましたし、勉強になりました)
ちなみに開発チームの都合でオンライン参加となったので、荷物の準備などはありませんでした。いただいたノベルティのうち、パーカーは勤務中の全体挨拶や最終発表では必ず着ていました。着やすい素材だとも感じました。外で着るのは、会社名載っていてあれなので、家で着回す予定です。
Day1~8 について述べる
順に述べます。
Day1
人事の方と参加にあたり色々お話し、コンプライアンスに関する研修を受けました。
そして、メンターさんにサポートいただき貸与 PC の設定から開発環境の構築を行いました。詳細は伏せますが、長期的に動いているサービスなので、初めて目にするタイプの開発環境もありました。
そして、1 つ目のタスクを与えられ、進めることとしました。あと、自宅のルーターの不具合で Discord が使えないことがあり、時間が少し無駄になってしまいました。
Day2
全社会という、いわゆる全社の朝礼で自己紹介の挨拶をしました。中途で入られる方、インターンやアルバイトで新たに入る方が、全社の朝礼で挨拶をするのが基本のようです。事前に話してほしい内容などは共有されているので、話す内容を少し考えていました。
全社会用の Slack チャンネルも用意されており、リアルタイムに感想・リアクションがされていて良い意味でびっくりしました。
内容としては普段のバイト先でも参加している全社の朝礼に近かったため、いわゆる普通の会社の全社朝礼と内容は近いと思います。
1 つ目のタスクを進めていましたが、既存のコード把握やコーディング規約がたくさんあり、思ったより時間がかかってしまいました。しかしながら、難易度的には低く、複数のコードを読むことになったので後のタスクをこなす上で良い機会になりました。
Day3
1 つ目のタスクを終えたので、メンターさんにレビューいただき、本番環境にデプロイしていただきました。次に行うタスクについてメンターさんと話し合いました。そこで僕の希望を伝えました。それは、個人ではできないこと・既存のものを壊さずに改善することです。
そうお話した上で、2 つ目のタスクを決定しました。最終的なタイトルだけお伝えすると、pixivision の記事パーツ移行のためのバッチ処理とその基盤準備です。
Day4
2 つ目のタスクの事前調査を丁寧に行いました。きちんと調査しないと実装中にやり直しが発生するためです。合計 2 時間弱行っていたような気がします。
その上でメンターさんと事前調査の内容、方針について話し、確認や質問をしました。より良い方法や、実装の上で意識すること、できれば良いと思うことなどを教えていただき、事前調査・準備を完了しました。
後半は実装メインで、途中に分からない箇所や相談すべき箇所の相談を適宜行いました。
一通り動くコードは完成しましたが、決して良いコードではありませんでした。PHP
の interface を使って実装することで、具体的な処理内容を開発者に委ねることができ、かつ単体テストもしやすい設計となる点のアドバイスとサンプルコードをいただきました。
よって、翌週からコードの改善をすることにしました。
Day5
週明けです。良い実装に切り替えるべく、奮闘しました。この日は Interface の定義とその具体的な実装で終わったと思います。
バッチ処理として用意するエントリーポイントの PHP
ファイルから実行のメソッドを呼び出し、さらに共通処理から具体的なメソッドを呼び出し、検証環境で動作することは確認でき一安心しました。
Day6
ここから、テストコードの本格的な実装を行いました。単体テストのカバーする範囲について丁寧にメンターさんに教わり、それを満たすためのテストコードを書くことにしました。
ここで interface を使った実装が生きてきました。メンターさんの伝えたかったことを実感でき、良い設計とは何かを知ることができました。メソッドのモックなどを適宜しつつ、この単体テストで保証すべきことの複数パターンをテストしました。PHPUnit
を使いました。
Day7
前日に書いたテストコードと、同時並行で進めていた関連コードの MR(マージリクエスト)のレビューをしていただきました。一部を修正した上で、昼過ぎに本番環境にデプロイ・動作確認をしていただき大まかな作業は終了しました。
つまり、この期間で取り組んだ大きいタスクが本番環境で動作したことになります。
安堵感と達成感の両方を感じることができ、最終日前日にも関わらず、やりがいを感じました。余った時間で最終発表で話す内容と、スライドの準備を行いはじめました。これは完全に学生に依存する部分なので、丁寧に作成し、成果を発表しようと意気込みました。
Day8
最終発表日です。
自分の興味のある職種の方と面談をさせていただきました。自分の思うことや疑問点についてお話し、たくさんの回答を得られました。長期的にどうなりたいかを再度考えるキッカケになったと共に、楽しく仕事をされていることを実感しました。
やはり、現場で働かれている方との意見交換以上のことはないですね。
そして、最終発表のスライドづくりの詰めと、発表練習をしました。
10 分程度の発表なので、長時間であっても聞いていて飽きない構成で、分かりやすいスライドとなるよう工夫をしました。10 分で発表するための練習も行い、適宜修正を加えました。
最終発表を行いました。時間は目安のちょうど 10 分で、終えることができました。今回は無かったですが質疑応答と、メンターさん・エンジニア統括さん・CTO さんから講評をいただき、最後に挨拶をして発表を終えました。
また、最後に人事面談を行い、春インターンシップの全ての過程を終えることができました。
おわりに
社内の技術レベルの高さ、ワイワイしている良い雰囲気など、身を持って体験できました。既存システムのレガシーなコードの改善など、技術的に難しいこともたくさん行われていました。
また、開発チームの MTG などからもサービスをより良くしたい方がたくさん集まっていることが分かり、良い会社さんだと思いました。ちなみに残業などはしていません。
人事の方、メンターさん、面談していただいた方、他にも裏側でサポートいただいた皆様、8 日間ありがとうございました。