batchのブログ

知見の備忘録

CA Tech Dojo Androidアプリ(Kotlin)編に参加してきた

f:id:batch08:20190817234145p:plain

タイトルにある通り,8/5~8/16までCyberAgentさんのサマーインターンに参加していたため,最近ブログ更新が滞っておりました.


まじで最高だった.



絶対この先忘れられないというか,忘れることが難しいくらいの笑いあり涙ありのエモいインターンだった.


自分のための備忘録としてはもちろん,Androidわからないなりに自分はこうやったみたいなことをOUTPUTとして残そうと思います.単純にOUTPUTしないで自分の中で本インターンシップの経験をINPUTだけで終わらせて,後で「なにしたんだっけな」と思い出せないと辛いしもったいないと思いました.

このインターンシップを,この素敵な会社を少しでも多くの人に知ってほしいという気持ちも込めて書きます.



文字数が1万文字を超えてしまいすごい量の記事になってしまいましたが,自分がこのインターンでやったこと,感じたことなどはできるだけ全て書いたつもりです.
量も量なので,興味のある方だけ読んでいただければと思います.こんな人もいるんだな程度に.



序論-インターンシップに参加するまでの経緯-

インターンシップに申し込むまでの経緯をここでは書きます.

なぜこの企業にインターンシップを申し込んだか

なぜこの企業のインターンシップに申し込んだかという理由は,数多くの周りの技術力がある優秀な先輩方がCyberAgentさんに入社していたため,ずっとどんなところだろうと気になっていました.
また,AbemaTVを始め数多くの有名なプロダクトを生み出しているあんな会社でインターンできたらやべえなという憧れみたいなのもありました.

個人的な話でいうと,今年の12月で終了してしまうAmeba Piggは中学時代に狂ったように友達とやっていました.学校終わった後も「じゃあPiggでね!」みたいな感じが当たり前の時代でした.Piggで友達と話したり当時付き合っていた彼女と部屋に鍵をかけてイチャイチャ2人で話していたりと青春時代に大変お世話になったサービスでした.そんなこともあり,思い入れ深い企業でもありました.

なぜCyberAgentから用意されているインターンシップの中からTech Dojo Androidアプリ(Kotlin)編を選んだか

僕は今まで,Processingから始まり,C言語Java,Swift,JavaScript,Goなど様々な技術を触ってきました.故に,「得意な技術はなんですか?」と聞かれた時に,自信を持って「これです!」と言えるものがなく,就活までにはそれをつくりたいとずっと思っていました.

そこで,先日参加したハッカソンでFlutterでアプリを作り,Material Designに惹かれて自分の興味が出てきたAndroidアプリ開発を人材不足してるらしいし,今後はやっていこうかな・・・?と思ってすこし触っているところでした.



そこで学内で行われたイベントや自分で調べて本インターンシップの存在を知り
www.cyberagent.co.jp



募集要項を確認
f:id:batch08:20190817234217p:plain







募集対象を見て

f:id:batch08:20190817234536p:plain







これは行くしかないと思いました.




ちょうど,申し込みをするくらいの時期に自分の中で,

  • 毎日GitHubに草生やそう
  • 人が読むということは二の次で,技術的にもなんでもいいから後で自分が振り返れるようにまずは備忘録としてどんどんブログ書いてこう

などしていて,かなり自ら行動するOUTPUTを意識して積極的にやっている時期で,本インターンシップも,「別にお金かかるわけじゃないし申し込みだけでもするか」「CyberAgentとか周りの優秀な先輩も行ってて自分なんかがいくとこじゃなさそうだけど学生のうちにそういうとこ行ってボコスカにやられて挫折を味わっとこう」という気持ちからOUTPUTとして行動しようと思い,申し込みました.



きっと以前のままの僕だと「CyberAgentかあ,絶対技術ごりごりで自分が関わるような世界じゃない,やめとこう」とか思って申し込んでなかったと思います.

選考について

選考はまず,ESを出して面接を受けて合格という流れでした.
先程も言ったとおり,OUTPUTを積極的にやっていこうと思っている時期でESにはブログのURLも載せ,面接では人事の方(僕らのアイドルななさん(@utsu_nana))が実際にブログに目を通して下さっていて,「CAもそういう自分からアウトプットしていく文化大切にしている会社ですごい合っていると思いますよ」と言われてその場で合格を頂いて参加するという流れになりました.

ほんとにOUTPUTは大切.INPUTだけでは周りの現実世界は何も変わらない.
実際本インターンシップもOUTPUTして他の人に見えるようなことをしていなかったら受かってなかったと今でも思っています.



本編-インターンシップでやってきたこと-

インターンシップでは,初日に「こういうアプリをこのインターンではつくりますよ」というような課題を与えられて初日から開発がスタートするというものでした.

参加したのは,16人.


f:id:batch08:20190818172255j:plain
最終発表後の様子



最初は緊張で全く話さなかったメンバーでしたが,今となってはみんな友達以上の関係です.僕はそう思っています.
たった2週間の間だけ一緒にいたメンバーでしたが,今後忘れることは絶対にないです.



インターンシップは4人ごとにテーブルが分けられて,それぞれのテーブルに1人ずつメンターさんがつくという感じでした.


僕がいたテーブルを担当したメンターさんはぐみお(@gumioji)さん.19卒でCyberAgentに入社した方で,歳も近く本当に最高のメンターさんでした.
接している感じ全く新卒感がなく,尊敬できる最高のメンターさんでした.


テーブルによってまちまちでしたが,メンターさんは常にいるというわけではなく,業務の合間に数時間程度来て下さり,わからないことがあったら質問できるという感じでした.



実際に与えられた課題はこんな感じ

  • 自分の情報(名前,GitHubアカウント,Twitterアカウント)を入力する画面があって自分の情報を含んだQRを発行する
  • 他人のQRを読み取って,リストに追加して見れるようにする.このとき外部のQRコードリーダーアプリから自分のアプリを呼び出すようにする
  • リストには読み取った情報を表示して,何かしらの方法で他人のGitHubTwitterのページにWebViewで表示できるようにする

最終的なOUTPUTとして,初めて真面目に作ったAndroidアプリで恥ずかしい気持ちもあるのですが,作ったものを特別に見せたいと思います.



テーマはCyberAgent



myapp



アプリアイコンはメンターのぐみおさんのアイコンに.
基本的な色もCyberAgentのロゴの色コードを抽出して使い,起動画面やリスト表示などにAbemaくんを多用しました.
テーマでも言ったCyberAgentはそこにとどまらず,上のTabLayout,リスト表示のRecyclerViewのアニメーションはそれぞれ,CyberAgentで現在も活躍されているogaclejapanさん,wasabeefさんがつくったライブラリを用いてテーマであるCyberAgentを実現しました.
github.com
github.com



個人的に,RecyclerViewのitemにCardViewを使ったあたりがかわいいUIになってお気に入りです.自分の情報を入力するEditTextの部分は自分がもとから好きで興味があったMaterial Designを適用してhintとerrorをいい感じに表示するようにしたとこも気に入ってるところ.

同じライブラリや,同じアニメーションを使っている人が他に誰もいなかったのでアイデンティティを出せたかなと思っています.



インターンの詳細な内容

ここからは後で自分が見返した時に,「あの時の自分そんなことしてたんやなあ」と思い出したいので,インターンシップでやったことを技術的な実装のことや,印象に残ったことなどを時系列順に詳細を書きます.

1日目

どっきどきでAbema Towersへ.
最初はみんな緊張していて全然弾けた感じはありませんでした.
課題が発表されてからはゴリゴリ開発を始めました.
基本的なAndroid Studioの使い方,Activityの遷移の仕方,EditTextの使い方などはインターンシップ前に予習しており,初日は特につまづきもしなかったので他の人ともあまり話さずゴリゴリ開発していました.

このときから周りでちらほらFragmentというワードが出てたりしたのですが,この時僕はまだちょろっと触ったことある程度であまり良くわかっていなく,いきなりそこに手を出してずっと動くものが手元にない状態が起きるのが不安に思ったのでまずはActivityから始めることに.
あとで時間があればFragmentをしっかり調べて移行しようと考えていました.

この自分自身のレベルを把握して,できるところから手を出しステップアップする工程を選択したのが最終的にすごい評価されて良かった.

夜は,たまたまエレベーターで会ったインターン生2人とご飯に行って打ち解けた.
2人とも文系大学にいる人で今年4月からとか半年前くらいからプログラミング自体を始めて,Javaを触った流れでAndroid始めたらしい.「プログラミングはほんとゲームみたいで楽しいよなあ」とか言っててなんかプログラミング始めた4年前を思い出して新鮮な気持ちにもなりました.いい刺激でした.

2日目

この日も,もくもく開発してた.
ランチは11Fの食堂でうつわに入ればもりもり入れられるカレー食べました.めちゃめちゃ美味しかった.それと,同じ階にローソンがあって東京の暑いところで外でなくてもコンビニ行けるのやばと純粋に思いました.周りは一面ガラスで外が見えて開放的な空間でうちの大学みたいでいいなあと思いました.

3日目

この辺で課題で出された仕様を半分くらい終えた段階で,他にこんな感じにしたいなあという課題で出された以外のことがポンポン浮かんだので忘れないようにissueに書いて優先順位つけて管理しようと思ってやり始めました.
これも最終的にメンターさんやエンジニアの方にめちゃめちゃ評価されてやってよかった.
この日のランチは僕らのアイドル人事のななさんと外食して,めちゃめちゃオシャレなお店でパスタ頂きました.美味しかった.

4日目

ここらへんでかなりインターン生同士は打ち解けてました.もう既にインターン生13人くらいで飲み会やったりして平日で明日もあるのに二次会とかまでして飲んだりしてました.
実装面では周りでちらほらMVVMとかっていう言葉が飛び交っていて,Dojoでそんな単語が出てくると思ってなかったので,結構ビビりました.
名前聞いたことあるくらいしかなかった自分にはレベル高いなあしか思ってませんでした.
一応気になって理解できるように調べ始めはしました.
この日のランチは実際にCAでAndroidエンジニアとして働いているogaclejapanさんを始め強いエンジニアの方とお話ししながら食べました.
このインターンシップの課題を考えたのもogaclejapanさんだそう.

5日目

このへんで出された課題の仕様が完成し,あとはActivityでやっているとこを全部Fragmentに置き換えようかなとかRecyclerViewを使ったリスト表示が結構ダサかったのでCardView使っていい感じにしたいとか色々issueに書き起こしてました.
本当はDBの非同期処理をCoroutines使ってやりたいなとか,かなり汚いコードを書いてたのは自分でもわかってたのでMVVMとかにいい感じに適用させたいなとかもissueに書いてたのですが,結局調べるだけ調べて概念は理解して実装はインターン後にやることにしました.

この日のランチは同じテーブルの4人とメンターのぐみおさんと行きました.他のテーブルのメンバーもメンターさんとそれぞれランチに行っていて,ぐみおさんが「あのテーブルはいいとこいっとるな」とか言ってましたが,僕らのテーブルが恐らく1番お値段的にも内容的にもいいとこ行ってましたよ…

めちゃめちゃおいしかったです。連れて行ってくれてありがとうございました。


休日の間

インターン中の休日は祝日もあり,三連休ありました.
ここで色々実装しようかなとか考えていたのですが,ほとんど何も進みませんでした.
ここで初めて,実際に会社に行って同じくらいのレベルのみんなと教え合ったり集中して開発していた環境が最高の環境だったことに気づきました.
1人での開発は全然集中できず,ただ天気の子見に行ったり休日満喫して終わってしまいました.

6日目

RecyclerViewをいい感じにしようとしていて,CardViewをRecyclerViewに入れようと色々やっていました.
休日の間にxmlの今までよくわかっていなかったConstraintLayout,LinearLayout,FrameLayoutなどの意味を完全に理解したので,CardViewの中のComponentは全てxmlを直接書いてLinearLayout使って仕上げました.ここでもAbemaくんを使ってCyberAgent感を出しました.周りのみんながGitHubAPI叩いてアイコン画像を取ってきて設定していて自分もやろうと思ったのですが,周りと被るのが嫌だなと思ったのと充分満足いくかわいいデザインに仕上がっていたのでこのままでいきました.
LinearLayoutで作ったCardViewのレイアウトはこんな感じ

f:id:batch08:20190818010259p:plain
f:id:batch08:20190818010312p:plain

たしか,このへんでMVVMのことやDataBindingのこと,LiveDataのことCoroutinesのことなどを調べて理解しようとしていて公式ドキュメントを漁って読んでたのですが全然色々理解できず,時間だけを溶かしてしまった感じがしてちょっと病んでました….

7日目

ActivityをFragment化しようと思って色々調べてました.
周りのみんなは結構Fragment使っていて,BottomNavigationViewを使っているイメージだったので自分は違う感じで行きたいなと思い,TabLayoutを使うことにしました.
そこで調べていると,先日ランチでお話したogaclejapanさんが作ったSmartTabLayoutを見つけて「絶対これ使って最終日の発表で本人の前で使いましたって言いたい」と思いました.
最終日の懇親会でも本人とお話したのですが,数年メンテナンスがされていなく,UsageもJavaで書かれていて自分にとっては使うのが結構しんどかったです.自分のアプリに組み込むまでも恐らくなんだかんだ6時間以上くらいは迷走し,リポジトリを舐め回すように眺めて試行錯誤の末,自分のアプリに組み込むことができました.
でも本当は,TabのところにTab名だけでなく,アイコンも入れたかったのですが自分には高度すぎて断念しました…


お昼は新卒のAndroidエンジニアの方とランチをしたのですが,印象に残ったのがマッチングエージェントでタップル誕生を開発しているエンジニアの方でした.
なぜマッチングサービスの部署に行こうと思ったのか聞いたころ,自分が作ったサービスで人が出会って結婚まで行ったらすごい嬉しいし夢ですみたいなことを言っていて思っていた数十倍素敵な理由が返ってきてすごい感動しました.
僕はマッチングサービス系は「出会い系アプリ」というイメージが凄く強く,なにか一歩距離を置いてしまっている感じがあってアプリもインストールしたことがなかったのですが,「出会うはずのなかった人同士を繋ぎ合わせるアプリ」へと印象が変わってUI面でも勉強したいと思いインストールしちゃいました.
みんなも是非使ってみてください.素敵なアプリです.
tapple.me



実装の話に戻ると,メンターのぐみおさんが「EditTextのとこデフォルトだとダサいよな」という話をしていて自分がもとから興味があったMaterial Designを使ったEditTextの実装方法があることを教えてくれたので夜にホテルでそれを実装しました.これもxmlいじるだけですぐにできるかなと思ったのですが,Qiitaを見てそのままやるだけでは実装できず,ごちゃごちゃxmlファイルやkotlinファイルいじって試した末なんとかできました.
あれはほんとにいちいちEditTextの上とかに何を入力するか示すTextViewを表示しなくてもhintがいい感じにアニメーションで動いて表示できるのでレイアウトがシンプルになってとても良いです.

8日目
このあたりでFragment化ができて,RecyclerViewにもCardViewをいい感じに適用できていたのですが,RecyclerViewをスクロールしたときに動きが単調で,あたかも最初からセットされていた画像が流れてくるだけみたいでイマイチだなと思っていたのでスクロールしたときのアニメーションをつけたいなと考えていました.
自分で調べてみたものの,実装方法がよくわからなかったのでメンターのぐみおさんに聞いたみたところ,CyberAgentで働いているwasabeefさんが作ったrecyclerview-animatorsを教えてもらい,このときに「テーマはCyberAgentにして,UIも使うライブラリもCyberAgent感をもりもりに詰め込んで最後発表しよう」と決断しました.wasabeefさんのライブラリもREADMEが全部英語で書かれており,理解に苦しみましたがなんとか自分のアプリに組み込めてogaclejapanさんのライブラリも含め,CyberAgentをもりもりに詰め込むことができました.wasabeefさんのライブラリは最近つくられたもので,Kotlinで書かれていたのでわかりやすかったです.

この日のランチは人事と外食part2で,ごってぃ(@masagotty)さんと一緒にランチしました.
ななさんによると,色んな学生をそこに連れて行っているというおすすめのお店らしく,肉とチーズが美味しいお店でした.
そこで,牛カツカレーとただのチーズケーキではない(めっちゃおしゃれな名前してたけど横文字すぎて忘れてしまった…)を食べさせていただきました.どちらもおいしかったですが,甘党の僕にはチーズケーキが最高に美味しかったです.ありがとうございました.

最終日

この日は最終発表とその資料作りで時間を使ったのでほとんどなにも開発はできませんでした.実装する時間は2時間ほどあったのですが.アプリのアイコンの変え方がわからずずっと苦戦して時間が吸い取られました.どうしてもアプリのアイコンをぐみおさんのアイコンにしたかった…
でも最後には変え方がわかって変えられてよかったです.

そして最終発表は,ライブラリこういうの使いましたって書くスライドでogaclejapanさんが聞く前でogaclejapanさんのSmartTabLayout使いましたって言ったときに会場で少しウケてアピールして良かったなと思いました.


そして最終発表が終わった後,優秀だった人には賞が渡されることになっており1人優秀賞に選ばれました.選ばれた彼は1日目の夜に一緒にご飯に行った2人のうちの1人で,所属が文系の学部で半年程前からプログラミング自体を始めたのにも関わらず,設計を意識して開発していたりモダンなライブラリをふんだんに使っていて本当にすごいと思いました.成長スピードが半端じゃない.僕も見習わないと.

その発表が終わった後,優秀賞とは別にピックアップしたい人がいるということで特別賞が用意され,見事それに選ばれてしまいました.
周りは今ままでSwiftがっつりやってきた人や,サーバーサイドがっつりやってきた人などすごい人ばかりで,全く自分がなにか賞をもらうほどに浮き出ていたとは思っていなかったので本当に驚きました.
大学に入ってから個人でなにか賞をもらうような人前で目立つことがなかったので,本当にいい思い出となり自分の自信にも今はなっています.

f:id:batch08:20190818223857j:plain
発表後の懇親会の様子


インターンシップを終えた今,自分が考えたこと

まず,インターン中の実装は設計なんか考えておらず,とてつもなく汚いコードを書いて,Kotlinの文法もわかっていない状態でした.
そんな自分が本インターンシップに参加した16人の中で特別賞に選ばれた理由としてメンターのぐみおさんがおっしゃっていたこととしては,「GitHubでissueをたててその中で優先順位をつけて自分がやるべきことをリスト化した上で順番に実装していく進め方がとても良かった」「最初から自分のレベルを把握していきなりFragmentから実装するのではなく,Activityから入りレベルを上げるようにFragmentに変えていく流れが良かった」「これからも同じ流れで開発続けると伸びそう」とのことでした.


僕は,日常的に読みたいビジネス書を読んだり,研究したり,開発したり,英語勉強しようかなとか思ったり,見たい映画見たりなど,やりたいことがたくさんあり,それを忘れてしまう事も多いです.そこで,普段からTrelloでTodo管理をする癖があり,それに似たような感覚で今回やりたいことを忘れないようにissueに起こしただけなので,自分の中では評価されるようなことをした実感は全くありませんでした.
なので受賞された時は正直,ただissue立ててcloseしてただけでいたってそんな難しいことはしてなかったんだけどなあ…と思っていました.
でも懇親会のときに実際に他のエンジニアの方にも話を聞いたのですが,自分の進め方をOUTPUTとして残しておくことはあとで自分が振り替えれるという意味でも,チーム開発する面では新規メンバーが参入してきたとき,どういう進め方でプロジェクトを進めているのかすぐにわかるという意味でもすごい大切なことらしい.

自分が当たり前だと思ってやったことは,仕事で開発をする上ではすごい大切なことだったということを色んなエンジニアの方と話すことで理解することができました.
インターンを終えて,実は自分は結構重要なことをしてたんだなと思う反面,それが自分の中で当たり前と思ってやったことなのでまだまだ自分にはやれる,伸びしろしかないなと思いました.


インターン中,3連休は先程も書いたとおり,1人ではあまり集中できませんでした.
しかし,連休が明けてからは「CAの人がつくったこのライブラリを絶対使いたい」という気持ちが強かったり,またそれを実装できたりと時間を忘れて開発していました.
大学の周りの優秀な先輩でも同じようなことを言っている人がいて,今までは自分には体感できていないことだったのですが,今回のインターンに参加してみてAndroidアプリ開発が自分にとって時間を忘れてやってしまうような楽しい技術だと気づくことができました.


序論でも書いたようにずっと自信を持って「これが得意です」と言える技術が実際の就活の時までに欲しいと考えているときに本インターンに参加しました.これからは就活の時に「得意な技術はAndroidアプリ開発です」とドヤ顔で言えるように引き続きAndroidアプリ開発を続けて行こうと思っています.

謝辞

インターンシップ全体をまとめてくださった人事のななさん,お世話になりました.
インターン中は開発に専念しつつ,社内見学,作業中にBGMかけたいなど僕らインターン生がしたいと言ったことは全て叶えてくれたと思います.不満はひとつもなかったです.ありがとうございました.今回のインターンでCAさんが恐らく期待している,Androidエンジニアの普及に精一杯応えていきたいと思います.
そして,メンターのぐみおさん.本当に本当に汚いコードだったのにもかかわらず,細かいとこまで見てコードレビューしてくださり,ありがとうございました.また,リポジトリのissueにまで目を通して頂き,結果だけでなく開発の進め方まで見て評価して頂き本当に感動しました.今回褒められた部分は個人の開発であっても継続して癖として続けていきます.

なにより,CyberAgentさん.得意な技術が1つもなく,Tech ChallengeやTech Jobに申し込みをするのをためらっていた僕にここまで成長できるインターンシップを用意して頂きありがとうございました.


最後まで読んでくれた方ありがとうございました.
僕みたいに自分に得意な技術がなかったり,自信を持って言えるような能力がないような学生が実際にインターンシップ申し込んで行動できたりなどしたら大変嬉しく思います.
また,少しでもCyberAgentさんに興味を持ってくれたら今回のインターンシップの恩返しが少しでもできるかなと思うのでそれも嬉しいです.