こんにちは!ムームードメインエンジニアのkimromiです。GMOペパボでは毎年Webエンジニア向けのインターンシップが行われていますが、2017年初めて福岡支社にてインターンシップが開催されました!2017年9月6日から9月15日までの8日間に渡るインターンシップに参加してくれた学生さん3名の記録を綴ります。
ムームードメイン
ムームードメインはRuby on Railsでの開発を進めているところもありRubyやRailsのスキルをもった学生さんに来ていただき、チーム開発の中で新規機能を調査から実装まで完了させてもらう内容のインターンシップを実施しました。
取り組んだ課題
選考面接の中で
- インターネットで世の中を変えてみたい
- WEBサービスのインフラ側がどのように動いているか知ってみたい
- チーム開発をどのように行なっているか知りたい
という声を聞いていたので、まずは「これは自分がリリースした機能です!」といえるような機能を世の中にリリースしてもらいたいと考え、フロントエンド、サーバーサイド共に修正が必要な課題をチームのエンジニア全員で考え設定しました。ムームードメイン内のRuby on Railsリポジトリ内で修正できるよう先日リリースしたショッピングカート化に絡めた機能追加をしてもらいました。
また、普段の開発チームの雰囲気を感じてもらいたかったのでいつもと変わらない流れで開発を進めました。
- 開発する機能について調査しGitHubのissueにまとめる
- タスクを細分化し工数を見積もる
- 細分化したタスクをチームのかんばんに張り出す
- 毎日エンジニアが行なっている夕会で進捗確認や困ったことを相談する
- プルリクエストを小さい単位で出しチームでコードレビューをする
メンターとしては作業に詰まったときに相談を受けたり実際にペアプロしたりと状況に合わせてサポートしました。インターンシップ専属で時間を使うわけではなく業務と並行させることで学生さんに普段の仕事の雰囲気を感じてもらえたかと思います。
笑顔でコードをガリガリ書く学生さん。楽しそうにコードを書いているのが印象的でした。
リリースした機能
こちらがインターンシップ生が実装した機能です!(リリースはギリギリ間に合わず後日リリースしました。。)
ムームードメインのログイン画面にFacebookログイン機能を追加しました!
インターンシップ中の様子
開発作業の他にも、初日にはムームードメインならではのドメインについての講義や現在のインフラ構成などを説明しました。3日目にはディレクターやデザイナーを交えた今後のムームードメインを考えるミーティングに参加してもらい、エンジニアリングだけではない広い視点や未来を考えるような体験をしていただきました。また最終日にはChefのハンズオンでサーバーをたててRuby on Railsのアプリが動くまで一緒に動かしたり、KPTで8日間のふりかえりを行い今後のTryを考えたりと少しでも多くのことを学んでもらうようにしました。
初日のドメイン講義、インフラ構成説明などの様子。顔がこわばり気味。
メンターの@litencattに教わりながらワイワイ。
まとめ
8日間という短い期間の中、機能をリリースできる段階まで実装できたことは素晴らしいと思います。可能であればインターンシップ期間中に機能リリースしたかったですが、それ以外の部分でもチーム開発や日々の運用業務をしているエンジニアの姿を見たり、ペアプログラミングを通してエンジニアの実装方法を目の当たりにしたりと学ぶ点は多かったようで安心しています。もう少し期間がながければインフラ側まで踏み込んだ開発までやっていけるようになると思いますので、次回また機会あれば更に良いインターンシップにしていきたいと思っています。メンター側にとっても、学生さんがミーティングで積極的に発言している姿や楽しそうに話したりSlackにコメントしたりする姿を見て、たくさんのパワーをもらい学びや気付きもあるインターンシップになりました。
ヘテムル
次に、ヘテムルでは「実際に使われているサービスに触れ、チーム開発でのプログラミング手法を学びたい」という学生さんに来ていただきました。「使われているサービス」というのは、言い換えると「ユーザーに提供する価値のあるサービス」でもあります。そこで今回は、インターンシップで開発するものを指定せずに、その価値について一緒に考えていくところからスタートを切ることにしました。
インターン最終日、学びをLTで発表する学生さん。
取り組み
はじめに、UXデザインプロセスのカスタマージャーニーマップとユーザーストーリーマッピングを活用して、学生さんと一緒に課題の特定と解決のアイデアを考えました。つぎに、スクラム開発をベースにアイデアをプロダクトバックログ、スプリントバックログへと展開しました。
カスタマージャーニーマップがようやく完成してわいわい。
開発の段階に入ってからは、学生さんの要望にもあったようにチーム開発を意識してもらえるように努めました。過去のプルリクエストを参考にコードレビューの進め方を紹介したり、ペアプログラミングで技術的なフォローも行いました。また、サービスがエンジニア職だけでなく職種を横断した一つのチームで運営されていることもあわせて感じてもらえたらと思い、チーム全体の朝会やミーティングにも参加してもらいました。
夕会で、インターンシップの成果を話している様子。
まとめ
日数の限られたインターンシップ期間ではありましたが、学生さんにも意図をお伝えした上で、数日を要してユーザーの課題解決について考えてもらいました。せっかくのインターンシップですので、できるだけコードを書いてもらって技術修得を促すことは大切なことです。ですが、ユーザーファーストでプロダクトを考え抜くという視点も、「実際に使われているサービス」だからこそ感じてもらえる貴重な経験になるのではないかなと考えた末でした。学生さんにとって、今後の役に立つインターンシップになってくれていたら非常にうれしく思います。学生さんの積極的な取り組みのおかげで、メンターとしてもとても楽しく充実した8日間になりました。インターンシップお疲れさまでした!
mruby枠 (ペパボ研究所 & ロリポップ!マネージドクラウド)
また今回は、mruby枠として、mrubyへのやっていきを強く感じる 学生さん をお招きし、主にミドルウェア〜OSの少し上のあたりの層をmrubyでハックしていただく、という概要のインターンを実施しました。
初日にいきなり自己紹介LTをしている学生さん。
課題その1: Nginxモジュールの作成
最初の三日間の課題として、ペパボ研究所の主任研究員でありngx_mrubyの作者でもある @matsumotory 直々に、簡単なNginxモジュールの作成の演習を行いました。以下のようなアジェンダです。
- 一般的なWebサーバの座学。代表的な実装、マルチプロセス、マルチスレッドなどのアーキテクチャについて、レースコンディションなどの留意点他
- Nginx自体の内部設計や、拡張の仕方の座学。モジュールの開発環境の整備
- その後、Nginxのモジュール ngx_memory_leak_killer の設計と実装
今回の課題はngx_mrubyの実装自体の理解につなげるものでしたので、きっと今後学生さんより何かしらの改善のプルリクエストがくるのではないかと期待しております。
なお、学生さん自身による、Nginxモジュール作成演習の記事を以下に紹介します。
@matsumotory の熱い視線を受けながらの実装。なかなかできない体験です。
課題その2: mrubyによる自作コンテナ実習
次の週の課題として、技術基盤チームの @udzura をメンターに、 ロリポップ!マネージドクラウド のバックエンドでも利用されているmruby製のLinuxコンテナランタイム Haconiwa の改善を行うことにしました。
最初に、コンテナ自体に慣れていただくために、Haconiwaに同梱された hacorb
という、コンテナに必要な機能が一通り組み込まれたmrubyバイナリを利用し、Rubyのスクリプトでコンテナを作っていただく演習を行いました。
コンテナを実装するための座学に使ったホワイトボードの写真を共有します。
コンテナのつくりかた pic.twitter.com/0LeDbKTBTw
— chikuwait (@chikuwa_IT) 2017年9月11日
結果的にファイルシステムとNamespaceの分離、vethを使った分離されたネットワークの作成、cgroupの制限、Capabilityの変更を実現した簡単なコンテナ実装を作ることができました。具体的な手順やコードなどについては学生さんからのブログをお待ちください。
課題その3: Haconiwa組み込みのmrubyのバージョンアップ
ここまで行ってきたシステムプログラミング演習の集大成(?)として、残りの日は、Haconiwa組み込みのmrubyのバージョンアップをしていただきました。
Haconiwaとその関連するmrbgemsがターゲットとするmrubyのバージョンは、バージョン1.2.0より少し先のコミットのものを使っており、バージョン1.3.0以降に含まれるような変更点をキャッチアップしきれていませんでした。そこで、バージョンアップに必要な変更箇所の調査と、その対応のプルリクエスト作成を課題としてお願いしました。
関連するmrbgemsへの対応プルリクエストは例えば以下のようになります。
変更点として、以下の2点を中心に対応すればいいことがわかりました。
mrb_int
の定義が変更し、mrb_get_args()
の引数などでは明示的にmrb_int/*mrb_int
型を利用しないと想定しない動きになることがある- 配列を表現する
RArray
構造体の構造に変更があった- 場合により、
ARY_EMBED_P
などのマクロでどの構造を使っているか判定しないといけない
- 場合により、
最終日には、その時点でのmasterのmrubyを利用するようにしたプルリクエストをHaconiwa本体に作成し、CIを通過させることに成功しました(時間の関係で @udzura も手を動かしていますが、基本的な調査は学生さんが行っています)。もう少し細かい検証ののち、マージする予定です。
一方今後の課題としては、Haconiwaが依存しているmruby-threadの実装は現在のmrubyの内部実装に踏み込み過ぎていて、上述したような内部の構造体の変更などに弱いため、バージョンのキャッチアップの上で障壁になりがちであることも見えてきました。より可搬性のある、mrubyの標準的なAPIのみを使うようなpthread関連のmgemを作る必要があるかもしれません。
@udzuraの隣でレベルの高いやっていきを実現している様子。
まとめ
今回はご本人が普段ハックしている BitVisor のようなOSのさらに下の層ではなく、OSより上のコンテナやミドルウェアに触れていただきました。システムプログラミングに共通で必要な知識や心構えという点で、多くのことを持って帰っていただけたのではないかと思います。
また、作成したものをオープンにしたり、幾つかのOSSプロジェクトにプルリクエストを出したりなど、単にコードを書くだけでなくアウトプットをしてコミュニティに貢献していくような動きもすることができました。こういった動きもぜひ継続していただければと思います。
全体的に、メンターとして対応した私たちも刺激を受けるインターンとなりました。
福岡の美味しい食べ物
福岡にはたくさん美味しい食べ物もたくさんあるので、社員と美味しいものを食べにいきました。
牛さがり丼の最高なかりんこでランチ。
福岡支社の福利厚生でいけるHabit。
歓迎会はタコスが最高な黒田で。
福岡の神社で行われている大きなお祭り放生会にも。
ペパステの大きなスクリーンを使ってのスプラトゥーン大会でワイワイ(?)
最終日の送別会は田しゅうのもつ鍋でフィニッシュ!
まとめ
たくさんのものを学んでいただきながら美味しいものを食べて飲んでの8日間はあっという間でした。何か一つでも今後のエンジニア生活の糧にできるものを持って帰っていただけたなら幸いです。学生さん、メンターの方々、その他関係者の皆様お疲れ様でした!!!