夏休み技術習得祭り第二弾、Yahoo! Japanのインターンに行ってきました。
Yahoo!が主催している技術系のイベントであるMixLeapに何回か参加したことがあるのでオフィスのミーティングスペースには行ったことがあったのですが、実際にオフィスの中に入ったのは初めてでした。
どんなことやったのか書いていきます!
基本情報
期間: 五日間
給料: 1200/h
コース: サービスプラットフォーム
やったこと: 業務内容を実際に担当、サービスプラットフォームのチームに所属する
インターン生の人数: 大阪だけだと6人、一つのコースに2人所属していた
選考
-
書類選考?
-
コーディングテスト
-
面接
最初に書類選考があった気がします。ちょっと記憶が曖昧です。
コーディングテストはよくあるやつです。プログラミングコンテスト系の、言語が色々選べるやつ。
難易度はめちゃめちゃ難しいということはなく、データ構造とアルゴリズムに関しての知識があれば解ける問題でした。
それなりに勉強していて、落ち着いて変なところで詰まらなければパスできるはずです。
僕は変なところで詰まって一番簡単なケースだけなぜかグリーンにならずに提出したのを覚えています笑
終わった、と思っていましたがなんとか合格できていたみたいです。
その次は社内のエンジニアとの面談があります。それぞれ希望を出したコースのエンジニア二人と面談します。
そこで聞かれることは正確には覚えていませんが、
-
コーディングテストの出来
-
作ったプロダクトの説明
-
どんなコードを普段書いているか
-
プラットフォームを選んだ理由
などでした。Yahoo!でしか聞かれなかったことはありませんでした。
一般的な面接だったと思います。
ただ、Yahoo!インターンシップ選考で一つ注意なのは自分のできる言語でコースは選んだ方がいいです。
インターンは業務に実際に関わるので使ったことのない言語を一から調べる時間はありません。
インターン生がタスクを終わらせることができなかったから超怒られる、
ということはありませんが一週間という短い時間の中で成果を出すために慣れている言語を扱っているコースを選ぶのが無難だと思います。
僕はPHPを長期インターンで触っていたのでそれが募集要項に書かれていたサービスプラットフォームを選択しました。しかし実際に携わったのはVue.jsでしたが、、、
ともあれどんなチームでも温かく迎えてくれるので、技術力が不安だから、、、という理由で諦める必要は全然ないです!積極的に応募していきましょう!!!
あとは僕4回生で就活控えていないのですが受かったので、どんな学年の方でも選ばれるチャンスはあります!
他のインターン生について
インターン生は僕の他には5人いました。
同じプラットフォームコースでは、
超偶然なんですが以前に働いていたTECH::CAMPと言うテクノロジースクールの教え子がインターン生として選ばれていました。
何にも知らない頃にFizzBuzzから教えていたので成長に超驚きました。
それ以外だとデータサイエンスコースでは女性の方が参加されていました。
その方は女子大でデータサイエンス系の研究室に所属しているそうです。
全員女性の研究室、、、夢を感じますよね
他のデータサイエンスの方は大阪大学の修士の学生でこのかたも同じく機械学習を専門にやっているみたいです。
やっぱり機械学習系は数学的な知識が必要ということもあり、大学で研究していないと厳しいようです。
アプリケーション開発コースでは修士の一回生が二人でした。
どちらも独学でアプリ系の言語を開発されていたそうです。
技術的なレベルはデータサイエンス系を除けばそこまで高くなくても選ばれるのではないでしょうか?
どういう基準で選ばれているのかはわかりませんが、ゴリゴリに開発してました!みたいな人はいなかったので、標準的な技術力があれば十分戦えると思います。
枠が少ないので、同時期に応募してくる学生のレベル次第といったところですね。
まあ技術力が高いに越したことないのでしっかり勉強して臨みましょう!
インターン内容
Yahoo!でのインターンはかなり多くのことを経験させていただきました。それらを項目ごとに見ていきます。
やったこととしては
- スクラム開発を体験
- 1ON1面談
- 業務に携わる
の三つが挙げられます。
それぞれ説明していきます。
スクラム開発を体験
チーム内でアジャイル開発の手法の一つであるスクラム開発を体験することができました。
スクラム開発とは、Wikipediaから引用すると
スクラム(英: Scrum)は、ソフトウェア開発における反復的で漸進的なアジャイルソフトウェア開発手法の1つである。この方法論は「柔軟かつ全人的なプロダクト開発ストラテジーであり、共通のゴールに到達するため、開発チームが一体となって働くこと」とされる。この方法論は、製品開発における伝統的な、シーケンシャルなアプローチとは大きく異なる。
と書かれています。
乱暴にスクラム開発を説明すると今いろんなところで取り入れられている人気の開発手法です。
このチームのスクラムはスプリントと呼ばれる何回も繰り返される一つの工程を一週間で行います。
なので一週間いた僕は開発、まとめ、レビュー、調整の全てがどんな風に行われているのかを知ることができました。
プロダクトオーナーやスクラムマスターなどチーム開発でなければ登場しないエンジニアではない役割の方もいらっしゃって興味深かったです。
長期インターンで企業の方で働かせてもらっているのですが、タスクを個人で消化する形を取っていたので、チーム開発は経験したことがありませんでした。今回初めて本物のチーム開発を体験することができてとてもいい経験になりました。
(注)スクラム開発はチームごとにやっているかどうか別れているので、必ず実施されているかどうかはわかりません。
1 ON 1ミーティング
Yahoo!の方が実際にやられている1ON1ミーティングに参加させていだだきました。
このミーティングはYahoo!の伝統とも言える制度でこれに関する本も出版されているほどです。
詳しくは https://diamond.jp/articles/-/144403 が参考になりますのでご覧ください
このミーティングは一週間に一回上司の方とのミーティングをします。
そこで勤務内容などについて話し合い良かった点などを話し合い内省します。
そして来週以降の目標設定なども行います。ここでは120%の努力で達成できる目標を立てることが求められました。しかし重い雰囲気ということはなく、雑談、最近困ったことなどをヒアリングしていき話を進めていきます。
インターン生の場合は毎日メンターの方と面談します。そして初日に決定した目標の達成ができているか、また達成するためには次の日何をすべきなのかを話し合います。
僕の場合の目標は
エンジニアとして働く際に、どんなことを重要なのかが、何を重要にしていくのかが自分の中で固まっていない。なので色々なエンジニアと面談して何を大事にしているのかを聞く。そしてその内容を振り返り自分の中で重要だと思う項目を決定する。
定量化の目標として一日一人のエンジニアと話をすること
という目標がありました。この目標はインターンが始まる前に自分で決めてフォームで提出します。
目標を達成するためにメンターさんにはめっちゃ多くの方と面談する機会を作っていただきました。
そして話をした後に、どんな気づきが得られたのかなどを聞かれるのでそれに答えていきます。
本当に多くの方と面談する機会を頂きました、これがめっちゃ良かった。
実際にエンジニアとして働かれている方の生の話を聞くことは普段の学生生活ではなかなかありません。
しかし、インターンとしてYahooに入ると、社員の方が社内でしか話さない「Yahoo社員としての話」を聞くことができます
今回の機会ではそのチャンスを最大限利用し色々な方と話すことができました。
いろんな話を聞く中でそれぞれが仕事に対する違うモチベーション、考え方を持っていることを知れました。
多種多様な考え方があり、その中で自分がどんな働き方をしたいのかを考えるきっかけになりました。
Yahoo!社員の方は本当にみんな親切で聞いてくれたことに対して真摯に回答してくれます(本当)。
インターンは技術的な学びも目的の一つとしてありますが、中の雰囲気を知ること、社員の方との交流も重要な目的の一つです。
その点ではYahoo!インターンは本当に価値のあるものでした。今まで多くのインターンを経験しましたが、この満足度は一番大きかったです。
何をやったのか
インターンの内容は就業型でチームに入り実際の業務タスクをこなす形でした。
僕の入ったチームはサービスプラットフォームにあるチームです。
サービスプラットフォームでは複数のYahoo!サービスで使用されている基盤システムの運用、開発を行っています。
僕のチームでは基盤システムの中でも画像配信に関係しているプロダクトを扱っているチームでした。
Yahoo!で表示されている大体の画像は僕のチームが運用しているシステムで配信されます。
これからYahoo!で表示される画像を見るたびにチームの方々のことを思い出すでしょう(遠い目)
僕はそこで開発されている新しい画像配信システムの開発に従事することになりました。
与えられるタスクは事前に決まっているわけではなくチームの中にいるメンターと話をして決定します。
担当したシステムはフロントがVue.jsで書かれていました。Vue.jsを使っての開発経験があるのでフロントエンドを担当することになりました。
残っているタスクを見してもらうと、新機能の開発など色々残っていましたが、
もともと知っている技術をただ使うだけではチャレンジにならない!というお言葉をいただき残っているタスクの中から選択するのを中断することに。
メンターと話のする中で担当システムのサーバー側がDDD(ドメイン駆動開発、後術する)を使った設計に取り組まれていることを聞いていました。
設計は取り組んだことがない、と話したところ、
フロントサイドのコードは実装が終了しリファクタリングの期間に入っていることを知りました。
そこでフロントのコードをDDDを使ってリファクタリングする。というタスクを担当することに決定しました。
僕自身DDDは長期インターンの開発現場で使われていることもあり存在自体は知っていましたがあんまりよくわかっていない&自分で設計したことない で初めての体験でした。なので結構興味があり、是非やらしてください!ということになりました。
作業手順
お題も決まったところで作業が始まりました。どんなことやったのかかいつまんでお伝えします。
- DDDとは何かを知る
- 設計
- 実装
- 発表
こんな流れで開発は進んでいきました。
それぞれについて説明していきます。
こっから先はちょっと細かい話、詳しい話になるのでインターンの概要を知りたいだけの方は飛ばしていただいた方がいいと思います!
DDD(ドメイン駆動開発)について
まずDDDもほとんど名前しか知らないような状態だったので、理解することからはじめました。
DDDとは、またWikipediaから引用すると
ドメイン駆動設計(英: Domain-driven design, DDD)とはソフトウェアの設計手法であり、「複雑なドメインの設計は、モデルベースで行うべき」であり、また「大半のソフトウェアプロジェクトでは、システムを実装するための特定の技術ではなく、ドメインそのものとドメインのロジックに焦点を置くべき」であるとする。この名称は、 Eric Evans が同名の著作で用いた。
こんなものみたいです。
ドメインというのは、アプリケーションで焦点を当てている関心ごとです。
ユーザーはアプリケーションで行いたい要求があります。それを実現するための手段としてアプリケーションの機能を使いますよね?
なのでユーザーの最大の関心はデータベースの構造や画面の表示方法などではなく、ドメインに関することなんです。
そのドメインを中心にしてプロダクトを設計する手法がDDD(ドメイン駆動設計)です。
ドメイン駆動開発をすることによって生じるメリットは色々あるのですが、
- エンジニアが機能ではなく機能を使うユーザーにまで視野を広げることができる
- 視野を広げることでエンジニア自身がプロダクトを改善しやすくなる
などのメリットが挙げられます。
最近はユーザーが要求している要件が複雑になる(ドメインモデルの複雑化)が起きているために、よりドメインに注視して開発をしなければならなくなりました。
なのでドメイン駆動開発が注目を浴びています。
とまあ大枠はこんな感じです。どんなアーキテクチャを使用するのか、など色々ありますがそれはここでは割愛させていただきます。
DDDはエリックエヴァンスという方が提唱された設計手法であり、そのかたが書いた本がバイブルになっています。
500ページある辞書みたいな技術書なので興味がある方は是非、、、
僕は二日目に渡されましたがそっと脇に寄せました。
設計
そして概要を掴めたら、設計に入っていきます。
僕が入った段階では開発は終わっており、小さなバグを取り除いている状態でした。
なのでもうすでにある程度完成しているプロダクトがあるのでそのプロダクトの一画面を中心としてドメインの抽出を行います。手順としては
- ユースケースの設定
- ドメインモデルの作成、それをクラス図に落とし込む
- Vueに入れるディレクトリ構成の設計
- データフローの決定
の流れになります。
一番初めはユーザーがその画面でどんな動作をするのか?を記述するユースケースを確認しました。
一つのページでもユーザーができることは複数個あります。それらを一つ一つ確認していきます。
例を挙げるなら、
- 画像一覧を取得する
- 画像の詳細情報ページを開く
と言ったものです。これら一つ一つにユーザーの関心ごとが含まれています。
そしてユースケースを元にしてドメインモデルを作成します。繰り返しになりますがドメインとはユーザーの関心ごとのこと。
それらを扱うユースケースから、どんなドメインが存在しているのかを洗い出します。それが終わったらその情報を元にクラス図を作成します。これが終わるとデータベーススキーマができます。
この段階で一般的なDDDの手順はひと段落です。
次にどんなディレクトリ構成でVueにDDDを取り入れていくかを決めます。
Vueのディレクトリ構成は元々のVue-cliで作成されるディレクトリ構成が元になっています。
なのでDDDに適した構成に変更してあげる必要がありました。
「ComponentはViewの一部なので、Adapterに入れて、Storeは状態管理するRepositoryになるのか???」
こんな感じでメンターの方と相談しながら構成を決めていきました。
VueでDDDしているような記事をあまり見なかったのでベストプラクティスがわからず手探りの状態でした。
最後に決定したユースケースを表現するためのデータの流れを決定します。
VueではVuexと呼ばれる状態管理のコアシステムが存在するのでそれを利用してどういう風にデータの受け渡しをするのかを決めました。
ここでJavascriptに型がないことが災いして「Domainディレクトリに書くことなじゃん、、、」とかの問題が発覚しました。
一週間という時間の制限もありTypescriptを導入することもできず、その場しのぎ的な設計になってしまいました、、、
ともあれこれで全ての設計が完了したので、ここから実際にコードを書き始めました。
設計をしてこなかったこともあり、メンターと相談しながらあれこれ決めていくのはすごく楽しかったです。
エンジニアの楽しさもいろいろあるなと感じました。
実装
実装、と言ってもすでに動くコードはあるので先ほどの設計で決めたディレクトリ構成で動くようにパスを書き換えるとか、
ユースケースで行う動作をより抽象化した形で表現するために別クラスで包んだり、みたいなことが主な作業内容でした。
設計に焦点を当てていたということもあり、実装自体は1日で終了しました。
発表
最後に発表用のスライドを作成し、社員の方の前で発表します。
他のインターン生同士で発表しあって軽い感じで終わるのかなと思ったのですが、
なぜか他コースのインターン生はおらず自分が所属しているプラットフォームのインターン生1人と
プラットフォームの社員の方が参加していました、、、
自分より詳しい人に対して発表するのって超嫌ですよね、平静を保つよう意識しましたが、結構語尾が揺れました。
でも絞られると言った感じではなく、何事もなく終了、一週間の予定を全てクリアしました。
一瞬で終わったインターン期間でしたが、結構疲れました、まあ成功してよかった。
こんな感じで僕のYahoo!インターンシップは終了となりました。
終わりに〜
チームの方が本当に気さくな方ばっかりでいっつもご飯に連れて行ってもらいました。
本当に感謝の念がつきません。
そして発表を終えた最終日、懇親会へ向かう途中
「タピオカ飲んだことないんですよ」
と言ったらなぜかタピオカ奢っていただきました笑
人生初タピオカがまさかこんな形になるなんて、、、
タピオカマスターがいたのでその方オススメの商品を注文
底にあるタピオカ上手に吸えませんでした。氷抜いたほうが良いんですね、どうでもいいか
あと暇な時間あったので卓球しました。
タピオカ飲んで卓球したかったら是非Yahoo!のインターン応募しましょう。
Yahoo!インターンで良かったところ
最後にYahoo!インターンの良いところをまとめて終わりにします。
まとめると
- 本当に多くの人と話ができる
- 社内の雰囲気を知れる
- 自分が知っているサービスに関わることができる(かもしれない)
の三つだと思います。
一つ目は多くの人と話ができることです。
これは1ON1面談の仕組みが大きいです。何もなくても毎日一人社員の方と話をする時間が設けられています。
そこから自分の興味にしたがって色々な方との面談がセッティングされます。
Yahoo!は社員数もかなり多いのでいろんなバックグランドを持っている方がいます。
その中には自分が興味を持っている分野や経歴を持っている方がだいたいいます。
その人にいろんな質問ができるのは社員数が多く、人と話せる仕組みをもつYahoo!のインターンの特徴的な所だなと思います。
二つ目は社内の雰囲気を知れる所です。
これはどのインターンに行っても同じかもしれませんが、僕はYahoo!のインターンで強く感じました。
就業型ということで実際にチームに入るからかもしれません。
そして本当の業務上の問題を話し合っている現場に入ることができます。
どんな人間がいて、どうやって仕事が回っているのかを知ることもできますし、問題に対してどうやって解決策を考えているのかを身近に体験することができます。
聞くだけではわからない全体的な雰囲気を感じることができます。
これは会社ごとに結構雰囲気が違うので自分の行きたい会社には是非インターンで雰囲気を掴んでおくことをオススメします。
三つ目は実際に使っているサービスに関わることができる(かもしれない)ことです。
僕はサービスプラットフォームなのでユーザーと直接やりとりをするサービス担当ではありませんでしたが、僕らのチームの隣ではYahoo!天気のチームが存在していて毎日議論する姿を目にしていました。
就業型の魅力の一つですが、思い入れのあるプロダクトに実際に参加することができます。
自分はYahoo!天気めっちゃ使っているのでこんな風に作られているんだな、という事がしれて面白かったです。
自分が利用しているサービスを開発できることは多くのサービスを提供していて、多くのユーザーが利用しているYahoo!で強く現れる特徴かなと感じました。
一週間という短い期間でしたが色々なことを経験することができて大満足のインターンシップとなりました。
終わりに
こんな形で僕のYahoo!のインターンは終わりました。
前回のLINEのインターンと連続だったのでちょっと疲れました。
全く手をつけていない研究が恐怖です、、、
次週は大学で開かれたデータサイエンティスト育成講座であるAiBiC Spiralと呼ばれる集中授業があります。
これもインターンみたいに缶詰で技術学べるので結構楽しみです。
その模様も今後記事にします!
大学生まだまだ夏休みなので夏休み満喫しましょう!
それでは!