はじめまして。東京農工大学工学府の安井です。株式会社MonotaRO (以下モノタロウ) のTechインターンシップに参加したレポートをお届けします。
簡単な感想の要約
いわゆるTL; DR (Too Long; Didn't Read)ってやつです。
- バックエンド、フロントエンド、データ分析の3グループで実施
- 基本は2人1組になってペアプログラミングで進めた
- 仮想的な環境で完結ではなく、本番環境へのリリースを目的とした体験ができた!
- 設計、実装、テストそれぞれで社員さんにレビューを頂いて、可読性や保守性などの観点から見直すことができた
- インターンシッププログラムに割り当てられた資金が潤沢で、遠方(東京)からでも経済的な負担なく参加できた (つよい)
インターンシップ全体のスケジュールと印象
今回のインターンは5日間で行われました。僕が所属したAPIグループの流れと全体の流れを合わせると下のような日程で進んでいきました。
1日目: イントロダクション、会社紹介、顔合わせ
2日目: 新APIの設計
3日目: APIの設計(続き)、実装
4日目: APIの実装(続き)、テスト項目の洗い出しと実装
5日目: インターン生の成果発表会、倉庫の見学
ほかのインターンでも似たような日程になるかと思います。1日目にイントロダクション、2日目以降に作業、5日目にまとめ、という感じですね。
スケジュールだけを見ると一般的なインターンシップと似ている点が多くありますが、モノタロウのインターンでは、実際の業務の短縮版といった印象のプログラムが組まれています。省略しましたが、2日目以降はAPIグループの朝会(毎朝行われる情報の共有や確認を行う会)や定常監視(異常が起きていないかチェックする作業)、リリース作業への立ち会いも行いました。インターンには直接関係のないものですが、実際の業務の流れを掴むことができました。
参加人数は5人と、数十人規模で行われるイメージとは違って比較的少ない人数での実施でした。初日にインターン生全員が集まったときには「えっこれだけ???」と思いましたが、少人数でやるおかげで、インターン生への経済的な支援やインターン生同士の交流がよくできたのかなと思います。インターン生は、APIグループ (バックエンド) のほかにも、Webページの表示を改善するフロントエンドや、今までに集積された大量のデータを処理して解析するデータ分析の3グループ (2人グループ×2+1人グループ) に分かれ、それぞれで作業をします。
インターンを行ったモノタロウの本社は兵庫県尼崎市にあるのですが、関東などの遠方からの参加でも全く問題ありませんでした。むしろ関東からの参加者の方が多いくらいでした。遠方からの参加者にも経済的な支援が手厚く、ここがあまり稼ぎのない学生には嬉しいポイントです。僕の現住所は東京なのですが、東京駅と新大阪駅の間を新幹線 (運賃は学割適用) で移動するとして交通費が支給されました。その上、尼崎市内のホテルの提供やホテルの最寄り駅からオフィスの最寄り駅までの往復運賃まで支給されました。そのため、来年度以降でもインターンの参加には何ら心配することはないかと思います。
会社の印象
オフィスの雰囲気ですが、1フロアに多くの部署がパーティションで明確に区切られずに存在しているので、開放感があります。もちろんすべての部署が1つの部屋に入っていて、ほかの部屋がないというわけではありません。会議室や休憩室などは別途用意されています。
一般的なオフィスチェアで作業している人もいれば、バランスボールに乗りながら作業している人もいて、自分流の働き方ができることが見て取れました。キーボードひとつを取っても、特に特徴のない一般的なキーボードから、RealForceなどの高級キーボードまで、さまざまなキーボードを使っている人が見られました。社内ツールとしてSlackが用いられているのですが、カスタム絵文字がめちゃくちゃ多いので、さらにカジュアルな雰囲気が感じられました。
APIグループでの体験
先程から何度か述べていますが、僕はAPIグループに所属して業務の体験を行いました。APIグループでは、本番環境への新APIリリースを目標に、設計・実装・テストの3工程を2人1組で実施していきました。それぞれの工程ではメンターさんや社員さんからのレビューを受けて、レビューをもとにそれぞれの項目を見直すことができました。開発言語はPython3 (2系ではないという意味です。以下、単にPythonとします) です。Pythonは普段から研究や個人のツール作成に使っているので、基本的な構文から習得し直す必要性はありませんでした。
1日目
1日目にはAPIグループの社員さんと顔合わせをして、インターンシップの日程の確認やシステムの概要について教えていただきました。また、支給されたパソコンのセットアップやAPI開発のための仮想マシンの環境設定を行いました。
Pythonのチュートリアル的なものもあったのですが、今回APIグループに所属されたインターン生 (2人) はどちらもPythonを扱ったことがあったのでささっと終わりました。当初の予定ではPythonに慣れていない人もいるという仮定のもとで課題設定されていたそうですが、想像より慣れているとのことだったので、作成する新APIの機能を拡張して実装することとなりました。
2日目
2日目からは設計を始めました。設計では、新APIの外部設計や内部設計を行いました。
外部設計はAPIの入出力を決める部分で、リクエストパラメータやレスポンスフィールドの形式、想定する値を決めます。例えば、IDは数値で10桁まで、日時はYYYY-MM-DD hh:mm:ss形式で送られてくるものとする、などです。
内部設計は外部設計の仕様を満たすためのクラスやメソッドの役割を考えます。例えばクラスAはリクエストパラメータのチェックを行う、クラスBはパラメータをもとにデータベースから情報を取得する、などです。
一通り設計を終えたのち、メンターさんにレビューしていただきました。レビューでは、どういった入力のときにどういった出力が出るか、クラス・メソッドの役割が複雑となりえないかといった事項について話し合って、理解・納得しつつ修正を加えていきました。
3日目
3日目は設計の見直しと、設計をもとに新APIの実装を始めました。実装を進める中で、設計で修正が必要な部分が出てくる可能性もあります。必要に応じて設計の見直しをしながら、実装を進めていきました。
実装は40分~1時間程度を目安に2人で交代しながら行っていきます。いわゆるペアプログラミングというもので、1人がコーディングを行っているところをもう1人が見て、疑問の提起や改善の提案を行います。疑問といっても、小さなスペルミスや空白の有無などのごく小さい問題から、クラスの設計に関わる問題まで幅広く扱います。
個人の場合は自分流のスタイルでコーディングができますが、今回は社内のコーディング規約に沿って書く必要があります。基本的な部分は普段のコーディングスタイルと似ていましたが、細かい部分 (UTF-8でのエンコーディング表記など) で異なる部分があるようでした。
ほかにも、すでに膨大な量のコードがすでにあるので、過去のコードを参考にしながら仕組みを理解して実装をしていく必要があります。例えばデータベースへの接続でも、サードパーティ製のライブラリをそのまま使うのではなく、すでに用意されているクラスを利用しての実装となります。こうすることでほかのコードとの整合性が取れる上、既存のクラスの改良がそのまま新しいクラスにも反映されます。さらに、データベースの接続情報を個別に書く必要もないので、ヒューマンエラーも減らせます。
4日目
4日目は3日目に行った実装の続きとテストを行いました。テストはそれまでに実装したクラスやメソッドの動作を確かめます。今回は全体を通してのEnd-to-end (E2E) テスト、メソッドの単体での動作を確認する単体テストを実施しました。
今回は単体テスト担当とE2Eテスト担当を分けてテスト項目の洗い出しを行ったので、どのテストを単体テストあるいはE2Eテストで実施するかを考える必要がありました。例えば、パラメータの処理ができているかのチェックはダミーデータを与えればよいため単体テスト、データベースへ接続して期待通りの結果が返せているかのチェックはメソッド単体では行えないためE2Eテスト、などのようにして切り分けていきます。
僕は単体テストの担当だったので、テスト項目と、それぞれの項目の入力値と想定される出力の洗い出しを行った後にテスト用のスクリプト (unittestを使うものです) を作成して、メソッドの動作を確認していきました。
この日の最後にはある程度テスト用のスクリプトが完成したのですが、いざ走らせてみると大量のエラーが……。メソッドの動作がどうという問題ではなく、単にテストの動作確認を行わないままコーディングを続けてしまったのが原因です。
5日目
5日目は、4日目に残ったテストコードの完成を目指しての作業と、午後にある成果発表会のための資料作成を行いました。APIグループでのインターンシップはここで最後となります。
テストコードの完成に向けては、unittestの実行を繰り返しながら、求める出力 (またはエラー) が得られるようにコードを修正していきました。幸い、20分くらいで修正作業は終わりました。
資料作成は、まず2人が別々にインターンで体験したこと、学んだことなどをスライドにしていきました。作成したプレゼンは正午ごろにAPIグループ内で共有して、フィードバックをもらいました。フィードバックで「ペアプログラミングで1つのものを作ったのだから、別々に発表するより1つにまとめて発表したほうがいい」との意見を受けて、午後の発表会前の時間に2人のスライドを統合+内容の追加修正を行いました。
成果発表会では社員さんに多く集まっていただいて、インターンでやったこと、学んだこと、考えたことなどを共有しました。技術者の方が多いだけに、こういう入力を入れるとどうなるの、とか、どういう利用方法を想定しているの、といったように技術者目線での質問を多くいただけました。作っているものがAPIなので、その利用者はフロントエンドエンジニアの方や、同じくAPIを作るエンジニアの方であることがほとんどだとは思いますが。
僕たちが行う作業はこれで終わりですが、その後にモノタロウの倉庫を見学する機会がありました。倉庫見学では物流システムがどのように構築されているか、どのような工夫点があるかなどを伺いました。倉庫だけあって建物はとても大きかったですし、この物流を支えているシステムの一部に貢献できたと思うと少し感動しました。
おわりに
今この文章を書いているの時期はインターンが終わってから2週間程度経ったくらいなのですが、趣味でやっているプログラミングや研究室で使うツールの開発でインターンの経験が活きていると感じます。例えばクラス・メソッドの役割は単一にするべきとか、単体テストを行うことによって意図しない動作を (全部は防ぎ切ることはできませんが) 抑止することができるなどの知見があるので、より可読性・保守性に優れていると思えるようなプログラムが書けるようになっています。
何年も前からやっているインターンシッププログラムではないと聞きましたが、社員さんや会社からのサポート体制はほかの会社のインターンシッププログラムに劣らないどころか優れている点も多いと思います。インターン担当の人事の方や所属したグループのメンターの方はもちろん、インターンにあまり関わっていない社員さんでも「調子はどうですか~?」といったように声をかけていただいたこともありましたし、会社からは (前述しましたが) 交通費やホテルなどの面で大きなサポートがありました。あまり業務経験がない人や、関東から関西への移動はちょっと…と考えている人でも不安になることも無いと思います。
最後になりますが、インターンに行きたいけどどこに行きたいかは決まっていないとか、1dayインターンには申し込んだけどもう少し長めのインターンにも行ってみたいと思っている人にもおすすめのインターンシップです。バックエンドやフロントエンド、データ分析といった多様な分野をカバーしている上に、モノタロウの事業に興味がある人ならば会社についても知ることができるのでいい経験になると思います。