pixivのサマーインターンに参加しました
こんにちは、マヤミトです。今夏のインターン参加ブログ3本目です。
pixivのサマーインターンに参加させていただきました。
インターンの概要
この夏実施するインターンシップは、大きく分けて3つのコース(全17コース)を用意し、本番環境のAPIを叩き、レビューをうけながら、実際に普段から社員が行っている業務にチャレンジすることができます。 技術の習得やチーム開発を通じて「圧倒的猛者になる」ことはもちろん、ピクシブの開発環境や社風を体験することが出来るインターンシップとなっています。
ということで、自分はpixiv Sketch(Android)でお世話になりました。インターンのタイミングもこちらに合わせていただけるということで、9/23 ~ 10/2に参加してきました。
やったこと
- 軽いバグの修正
- 画像フィルターの追加
- リファクタリング
画像フィルターの追加
pixiv Sketchでは投稿する画像にフィルターをかけることができます。
フィルターの実装にはandroid-gpuimageというライブラリが使われており、今回のインターンではGPUを使った処理をしてみたいという話をメンターの方にしていたということもあり、いくつかフィルターを追加で実装することになりました。
さて、android-gpuimageにはいくつかフィルターが予め用意されていますが、もちろん欲しいフィルターがあるとは限りません。今回も、実装した3つのフィルターのうち、2つはライブラリ側で用意されていなかったのでフィルターを自作する必要があったのですが、その場合シェーダー(GLSL)を書く必要があります。自分はシェーダーを書くこと自体が初めてだったのですが、ライブラリ内部のソースコードなどを参考にしつつ実装しました。三角関数や物理などの学校の授業で習うような知識が実際に活きたコードを書けたので難しかったですが楽しかったです。機能がリリースされるのを楽しみにしています。
リファクタリング
複雑な状態を持つ画面のViewModelをリファクタリングしました。もともとは1つのdata classに全てのパラメータをnullableかデフォルトでゼロ値をもつpropertyに持たせる実装になっていたのですが、どのような操作のときにどのpropertyにどのような値が入るのかわかりにくい、毎回nullチェックをするのが面倒など、今後この画面をいじる時に負債となって辛そうということで、リファクタリングさせてもらえることになりました。
まずは既存の実装の状態のフローを洗い出し、Kotlinのsealed classを用いて状態ごとに型を分けました。複数の状態で共通するパラメータもあれば、特定の状態でしか扱わないパラメータもあります。状態ごとに型を分けることにより、型チェックとスマートキャストを用いて簡単に扱えるようにしました。
今回注意した点として、ViewModelの外に公開するメソッドとパラメータ、状態のフロー自体にはなるべく手を加えなかったことがあります。既存の状態のフローには無駄な部分などがあったかもしれませんが、そこまで変えてしまうと予期せぬバグが紛れ込む可能性があり、インターンの日数も残り少なかったこともありそこはあえてほぼそのままにしました。リファクタリングをしていると理想の設計を追い求めたくなる気持ちが出てきたりもしますが、現実はそう簡単に行くわけではありません。今回は現実的な落とし所を意識しました。
インターンを振り返って
「圧倒的猛者になる」 という文字列がインターンの募集のページなどにありましたが、今回自分がやったことを振り返ると
- バグ修正
- 機能追加
- リファクタリング
と、8日間にしてはなかなか頑張ったほうなのではないでしょうか。これは猛者といっても過言ではない(ほんまか???)。
軽い冗談はさておき、実際インターンの8日間は大変充実していましたし、こちらのやってみたいことや興味のあることは言えば柔軟に対応してくれたので、このインターンを通じて圧倒的成長できるのは間違いないと思います。もしこれを読んでいる人で興味を持った人は(もし来年もあれば)ぜひ応募してみてください。
pixivで働いてみた感想ですが、オタクがエンジニア以外にも多く、自分もオタクなのでオンラインながらに大変居心地が良かったです。特にSketchはチームの雰囲気がよく、Slackのチャンネルが活発で雑談も多く(もちろん皆さんちゃんと仕事してます!)、インターン生の自分でも発言する心理的な敷居が低くてチームの皆さんとのコミュニケーションが積極的にできました。業務に関わることも関わらないことも気楽に話すことができたので、8日間だけのインターンながらにチームの一員のような気持ちで楽しく働くことができました。
8日間があっという間に過ぎ去る濃密で楽しいインターンでした。ありがとうございました!
DMM GUILDに参加しました
こんにちは、マヤミトです。9/7 ~ 9/18に開催されたDMM GUILDに参加させていただきました。
インターンの概要
DMMの各サービスが実際に抱えている様々な技術的な課題に取り組み、Issueを解決してポイントを稼ぐクエスト型のインターンでした。Issueにはestimate(ポイント)が設定されており、難易度が高いものほど高いestimateが設定されていました。
Issueに設定されたポイントとは別に、「Thanks!ポイント」というものもあり、こちらはインターン生同士で助け合った時に助けてもらった側が助けた側にポイントをあげられるというものでした。
去年のDMM GUILDとは違い、今回はオンライン開催でしたが、インターン用のDiscordが用意されており、そこでインターン生同士や社員さんと通話しながら作業をしたり、交流会などをしたりしました。2週間のフルリモートインターンでしたが、充実したコミュニケーションが行えたと個人的には感じます。
やったこと
実際のサービスに関わることなので詳細は伏せつつ書いていきます。
Android
- 画面のクラス図を書いた設計から実装まで
- EncryptedSharedPreferencesの導入と既存のSharedPreferencesの置き換え
- CI周りのスクリプトの整理
Go
- APIの実装
Node.js
- 既存のAPIのエラーハンドリング周りの修正
他のインターン生との助け合い
- AndroidでチェックボックスのあるRecyclerViewのバグの修正の手助け
- 設計の相談に乗る(Go, Android)
- JavaScriptの参照まわりの挙動に起因するバグの修正の手助け
- SwiftでのDIの相談に乗る
結果
残念ながら優勝は逃しましたが(ke-taくんおめでとう!)、一番多くのThanks!ポイントを獲得した人に贈られる「TOP Thanks!賞」と、estimateの小さいIssueを数多くハントした人に贈られる「コツコツIssue解決賞」のダブル受賞をしました!
インターンを振り返って
フルリモートで実際に業務に取り組む形のインターンは初めてでしたが、Slackにtimesを作っていたのとインターン用のDiscordがあったおかげで、コミュニケーション面での辛さは個人的にはあまり感じませんでした。むしろ他のインターン生に話しかけたりとかはオフラインよりも気軽にできました(まあこれは僕が対面コミュ障というのもあるかもしれませんが…)。僕はDiscordの作業部屋にほぼ常駐して詰まったところを他のインターン生に助けてもらったり、逆に他のインターン生の相談に乗ったりしました。
Thanks!ポイント制度は、インターン生同士の交流を促進する狙いで今年のGUILDから導入されたそうですが、実際にこの制度のおかげで気軽にインターン生同士で助け合うことができたように思います。他の人の手を止めて相談に乗ってもらうのはどうしても心理的抵抗があるものですが、相手にポイントをあげることができるというのは相手にもリターンがある分相談する側の心理的抵抗が減り、される側もポイントが稼げるということで気持ちよく相談に乗ることができたと思います。
自分はIssueハント型のインターンに参加するのは初めてでしたが、DMMの様々なサービスの中身を見ることができたのはとても面白かったです。また、Android以外のIssueに取り組んだり他の人の実装の相談に乗ったりして、自分のソフトウェアエンジニアとしての総合的な体力を試すことができたのではないかと思います。ここ1年ほどはAndroidやKotlinに限らず様々な技術に挑戦していたのですが、それらは無駄ではなかったと感じました。
フルリモートでしたが、非常に濃くてあっという間な2週間でした。楽しかったです。ありがとうございました!
DeNAのサマーインターンに参加しました
こんにちは、マヤミトです。 8/29, 30に開催されたDeNAさんのサマーインターンに参加させていただきました。(ブログ書くのが遅くなって申し訳ない…)
インターンの概要
クソアプリ伸びしろのあるアプリを期間内で最高のアプリに仕上げるという内容でした。去年も同じような感じだったそうです。
例年と違う点として、期間が2日間と短くなり、昨今のコロナ禍の事情でオンライン開催でした。
参加までの経緯
申し込み
去年のインターンの参加者のブログを読んでいて、面白そうだし今年もやるなら申し込むか〜という軽い気持ちでエントリーしました。
面接
エンジニア面接が2回ありました。1回目は今までやってきたことだったりKotlinに対する愛を語ったりしていたらいつの間にか終わっていたという感じでしたが、2回目はGMailのアプリを見ながらこのアプリがどのように作られているか想像して答えるという結構ハードな内容でした。自分が覚えている範囲だと
- メール一覧画面のレイアウトの構成
- メールを選択するとどのような処理が走るか
- ツールバーがどのように実装されているか
これらを聞かれて(テンパりながら)答えた記憶があります。Androidアプリ開発の知識がかなり要求される面接でした。AndroidでDeNAのインターンに参加したい人は、一人でAndroidのネイティブアプリを作り切る経験と知識はあったほうがいいかもしれません。
キックオフイベント
インターンの1ヶ月前にキックオフイベントがオンラインであり、そこでチーム分けが発表されました。参加者20人を、
の5つに分け、それぞれクライアントサイドとサーバーサイドが2人ずつという構成でチーム分けが発表されました。
チーム分けの他には技術要件などが発表され、特にクライアントサイドは細かくライブラリなどの指定もありました。
チーム分け発表後のチーム懇親会でZoomを通してチームメンバーとの顔合わせをし、当日に向けてのやっていきを高めていました💪
インターン1週間前
DeNAからインターンに必要な物品が入ったダンボールが届きました。
自分はAndroidのチームなので例のクソアプリの入ったAndroid端末が届くと聞いていましたが、中を開けるとスマホ以外にも食料(レトルトのカレー、ハンバーグ、牛丼、うなぎ)やビール、おやつ、メッセージカードなどが入っていて驚きました(中身の写真撮り忘れた…😭)。特に驚いたのはメッセージカードで、インターン参加者ひとりひとりに向けて全員分を用意したそうで、愛を感じました。
インターン用のスマホが届いたことで、参加者で集まってお触り会をしました。見た目は普通のチャットアプリでしたが、
- チャットアプリのくせにリアルタイムでチャットが更新されない
- チャットルームやチャットの内容などのデータを全件取得しているような挙動をする(おそらくページネーションなどを一切していない)
- 細かいUI/UXが悪い
など、なかなかのクソっぷり伸びしろをかなり感じました。チームメンバーで集まってHackMDに問題点や改善案を書き出して当日に備えるなどしていました。
インターン当日
いよいよ課題の詳細が発表されました。自分達インターン参加者はDeNAのエンジニアという設定を与えられ、以下のようなシチュエーションで課題に取り組むことになりました。
- コロナ禍の中、DeNAはチャットアプリを新規事業で立ち上げた
- このアプリは巣ごもり需要のなかで一定のユーザーを獲得したものの、突貫で作ったこともあり様々な問題が発生し、昨晩からメンテに入っている
- もともとDeNAの別事業で働いてた4人のエンジニア(つまり参加者)は急遽この事業にアサインされ、メンテ作業に参加する
- 明日夜にオンラインで開催される大型フェスのコミュニケーションツールとして採用されることが決定しており、このままだと予想される負荷に耐えることができない
- 10000発言/秒、10万人同時接続に耐えられるように改修してほしい
- UI/UXも改善してほしい
完全に「ヒエ〜〜〜〜〜」となりながらも2日間のインターンが始まりました、
なお、実際にDeNAではこのような状況はありえないらしいです。安心してください。
まずチームのZoomで話し合って問題点などを洗い出し、
- ページネーションの実装(サーバー、クライアント共通)
- ポーリングによるリアルタイム更新の実装(サーバー、クライアント共通)
- 負荷対策
- UI/UX改善
これらを中心に、「現状が満たしていない最低限のチャットアプリとしての機能を実装しつつ、フェスに向けて負荷対策などをする」という方向性で取り組むことになりました。
去年と課題はほぼ同じだったようですが、去年よりも期間が1日少ない中、Android側は
- ページネーションの実装
- ポーリングによるリアルタイム更新の実装
- もともとなかったログアウト機能とアカウント情報画面の実装
- AndroidらしいUI(BottomAppBarなど)に変更
これらを自分ともう一人のチームメイトの2人で実装していきました。もう一人のAndroidの方が大変優秀で、自分が苦手なUI/UXまわりの改善をかなりやっていただきました。自分はロジックまわりの改善をメインに担当し、いい感じで役割分担できたかなと思います。チャットのリアルタイム更新をなめらかに実装できなかったのが個人的に悔いが残った部分でした。もっと精進します……
サーバー側は惜しくも想定された負荷の対策までは間に合わなかったのですが、ページネーションやリアルタイム更新に必要なAPIをほぼバグなく実装してくださり、デモも問題なく動かせて非常によかったです。
結果発表では、Webフロントのチームが優勝でした。負荷対策とUI/UXの改善、フェス向けの機能改修などがバランス良くなされていました。
どのチームも課題の捉え方と改修の方向性に差があり、発表を聞いていて大変面白く、また参考になりました。
まとめ
非常に濃い2日間でした。残念ながら優勝は逃したものの、出来上がった成果物には自分達なりの個性が出ていたと思いますし、2日間でやれることはやった感があって満足でした。レベルの高い参加者やメンターの方々からエンジニアとして刺激を受けて、もっと精進しようという気持ちになりました。今回の経験を活かし、Androidエンジニアとしてさらなる高みを目指したいと思います。
最後に、参加者のみなさん、メンターのみなさん、そして一緒に頑張ったチームのみんな、ありがとうございました!
リクルートのインターンに行ってきました
こんにちは、マヤミトです。会津大学のB3(インターン参加時点ではB2)です。
春休みの間、リクルートのインターンに参加させていただきました。
参加までの経緯
申し込むまで
2019年の10月に、リクルートの人事とエンジニアの方が会津に来てご飯を食べながら会社についての話やインターンの紹介などをゆるい雰囲気でするイベントがあり、そこに参加しました。
エンジニアは会津大学OBの id:mic_psm さんが来てました。僕の所属する研究室のOBでもあります。
食事をしながらインターンの話を聞いていると、
とのことで、ちょうどサーバーサイドKotlinでインターンしたいな〜と考えてた僕はその会が終わったあとすぐさまインターンの申し込みをしました。
コーディングテスト
アルゴリズム、SQL、正規表現、APIの叩き方など、プログラミングのそこそこ幅広い知識の求められるコーディングテストだったように思います。SQLはけっこう解けたのですが、正規表現でテストケースのなかでいくつか通せないものがあったりしました。APIを叩くのが一番簡単だと思います。 僕はなぜか初歩的なミスに最後まで気づかず、1回も叩けないまま終わってしまいましたが。めちゃくちゃ凹んだ。
人事面談
普段やっていることなどを聞かれたと思います。僕は趣味開発のことや大学のサークル活動のことについて話しました。普段から頑張ってる人なら人事面談は問題ないでしょう。
余談ですが、このときビデオ通話が不調で映像がうまく映っていなかったのですが、すぐさま電話での面談に切り替わり、対応が柔軟だと感じました。
エンジニア面談
お題として与えられたサービスについて、設計やシステムの構成などを10分くらいで考え、面談をしてくださるエンジニアの方からの質問に答えるといった感じでした。自分はAndroidアプリの設計を考え、大雑把な画面遷移図などを描きながらアーキテクチャの解説をしたり質問に答えたりしました。緊張しましたが楽しかったです。面談終了後もKotlinの話で盛り上がったりしました。
インターン参加決定
12月下旬に連絡が来るとは聞いていたものの、20日を過ぎてなかなか来ないのでこれは落ちたかなーと思っていたら、12/25に連絡が来ました。思いがけないクリスマスプレゼントになりました。
メンターの方との顔合わせ
ビデオ通話でしたが、メンターのエンジニアの方との顔合わせと参加するチームと案件の説明がありました。サーバーサイドでKotlinを使っているだけでなく、CI/CDにDroneを使っていたりと、面白いチームだなと思いました。
ここでいくつかインターンでやることを話し合い、インターンに対する期待感を高めていました。
インターンの概要
Recruit Internship for Specialist 2020 エンジニアコース
期間: 第2ターム(3/2 ~ 3/27)
内容: サーバーサイドKotlin
やったこと
詳細はNDAに触れそうなので省きますが、ロギング周りのタスクと、いくつかプロジェクトの改善系のタスクをやりました。改善系のタスクは
- build.gradleの改善
- Kotlinのバージョンを上げる
- Gradleのバージョンを上げる
- ビルドスクリプトのkts化
- buildSrcを用いたライブラリ管理の一元化
- ktlintの導入
- CIでlint結果をDangerで自動コメント
- Kotlinのコードのリファクタリングと改善の方針の提案
こんな感じのことをやりました。
予め決められていたタスクをやったというよりは、自分が実際にソースコードを読んだ上で感じた問題点などから提案したりメンターさんと話し合って柔軟にやっていった感じです。今までのKotlinの経験をフルに活かすことができたように感じます。
ランチ
京橋や東京駅周辺のおいしいランチに毎日連れて行ってもらいました。
個人的なお気に入りの写真を載せます。
毎日美味しいランチご馳走さまでした!。圧倒的感謝🙏🙏🙏
インターン中のイベントなど
インターン期間中、インターン生向けに様々なイベントが開かれました。社員さんにキャリアについて聞くことのできる会や、インターン生同士の交流を目的とした会、社員さんやインターン生の登壇するLT会などがありました。
社員さんと交流する機会が多く設けられており、キャリアについてや技術について直接話を聞くことができました。リクルートでの働き方やエンジニアの雰囲気を掴むのに良かったです。
個人的に楽しかったのはLT会です。自分もKotlin/JSの入門という誰得な内容で登壇しました。社員さんのLTはインフラの話やモバイルアプリ開発の話など様々な分野の内容が聞けて面白かったです。LT後にモバイルアプリの話で登壇したエンジニアの方とAndroidアプリ開発などの話で盛り上がったりしました。
新型コロナウイルスの対応について
2月くらいから日本でも感染者が出てきたことにより、様々な技術系イベントやインターンが中止になりました。リクルートのインターンも、出社が強制ではなくリモートワーク可になったり、最終日の成果発表会もリモート参加可にした上で細かく区切って3密を避けるなど、様々な対策がされていました。
リモート可なのはもちろんインターン生だけでなく、社員さんもリモートで仕事している人をチーム内外で見かけました。ビデオ会議に美少女アバターで参加する人が一定の割合いたのが面白かったです。
インターンを振り返って
今回のインターンは大学に入ってから3回目のインターンでしたが、あえて普段やっているAndroidではなく、サーバーサイドKotlinで挑戦してみました。実際にインターンで業務でやってみて、いままで自分に足りていなかったサーバーサイドの知識が身につきましたし、Androidとは違った難しさを感じたりしました。一方で、今まで学んできた設計やKotlinの知識はサーバーサイドでも十分通用すると実感しました。自分の持っているKotlinの知見をどうチームに共有しコードを改善していくかを考え行動したのは、今後のエンジニア人生でも活きる貴重な経験だったと思います。
終わりに
今回、世の中が新型コロナウイルスで大変なことになっている中でのインターンでしたが、そんな状況だったからこそリクルートの会社としての対応力や社内のエンジニアがどのように働いているのかを内側から見ることができたので、ある意味でリクルートを深く知ることのできたいいインターンだったと個人的には思います。もちろん、それは人事の方やメンターの方、僕を受け入れてくださった部署のみなさんのおかげです。大変な時期のインターンで苦労も多かったと思いますが、おかげさまで楽しくインターンを終えることができました。リクルートの皆さん、ありがとうございました。
完全オンラインでLT会を開いた備忘録
こんにちは、マヤミトです。
4/15と4/18に完全オンラインでLT会を開いたので、やったことなどをメモかねて雑に振り返ります。
なぜオンラインで開催したか
完全に新型コロナウイルスのせいです。
自分は会津大学のZliという技術系LTサークルの代表をしています。4月になり、大学に新入生も入ったところで新入生歓迎LT会を開こうとしたのですが、大学側からリアルで集まるタイプのサークル活動を全面的に禁止されているという事情があり、今回参加者全員リモートのLT会を開くことになりました。
どのように開催したか
YouTube Liveで配信しました。登壇者は配信者にハングアウトでスライドを画面共有し、配信者側のPCでウィンドウキャプチャをしてYouTubeに流しました。
アーカイブが残っているので、どんな様子だったか気になる方は見てみてください。自分自身慣れていないLT配信だったのでところどころ見苦しい点があると思いますが、今回得た知見を生かして次回以降さらに良くしていこうと思います。
配信に使ったソフトやサービスなど
配信ソフト: Streamlabs OBS
画面共有: Google ハングアウト
配信プラットフォーム: YouTube
配信の様子
スライドの下に登壇者のTwitterアカウントとスライドのタイトルを、スライドの右にYouTube Liveのコメントを表示させています。
配信画面の構成は学生LTさんのアーカイブを参考にしました。
反省・感想
- 事前にちゃんと登壇者の情報を整理すべきだった
直前になって登壇することになった人が何人かいたこともありますが、LTのスライドの下に写す登壇者のTwitter IDやアカウント名、アイコンなどを予め準備しなかったため、登壇者の交代がスムーズにいきませんでした。事前に配信ソフト側で登壇者ごとに画面の準備をしておくとスムーズだと思います。
- 遅延が大きかった
低遅延設定を忘れていたため、配信と数秒のラグがありました。LT中はまだ良いのですが、コメントで質問を受付たりするときに若干のやり辛さを感じました。
- 登壇者全員で事前に接続確認などをすべきだったかもしれない
登壇者が裏でYouTubeで配信を開いてると、音声がループして聞こえてしまう問題が何回か起きました。事前に軽いリハーサルや接続確認を一人一人していれば防げたと思います。
- LT自体はわりと問題なかった
わりと大きな懸念であった完全オンラインでもいつものLTのような雰囲気で楽しくできるかどうかでしたが、LT自体は普通にプロジェクターに繋げるか画面共有するかの違いですし、YouTube Liveのチャットのおかげで視聴者側も盛り上がってる感が出てました。
まとめ
完全オンラインLT、自分としては慣れていないこともあってところどころスムーズに進まない部分もありましたが、参加者の皆さんの協力もあり、楽しく開催することができました。
新型コロナウイルスの影響はまだまだ続きますが、Zliはオンラインで様々なイベントをやっていきたいと思います。これからもZliをよろしくお願いします。
2019年を振り返る
早いもので2019年も終わりですね。年越しまであと1時間を切ったところでこれを書いています。 雑に1年を振り返ってみたいと思います。
どんな1年だったか
ちょうど1年前、年明けにこんなツイートをしてました。
2018年はいろいろな物に触れて学ぶ1年だったので、2019年はどんどんアウトプットして成果を出していきたいですね
— マヤミト (@yt8492) 2019年1月1日
アウトプットして成果を出すという観点で、今年は自分でもわりと頑張れたんじゃないかなと思います。
アウトプット
今年はイベントへの企画や参加を多くしたような気がします。
夏には日本大学工学部の友人と合同でLT会を開きましたし、クリスマスイブにははこだて未来大学と合同LTをしました。
技術書典にも、僕が発起人となってZliで参加しました。
設営完了しました!!#技術書典7 pic.twitter.com/RZ6iYQhEqD
— うじまる🐔 (@uzimaru0000) 2019年9月22日
外部のLTイベントや勉強会への登壇も積極的にしました。
インターン
春休みはサイバーエージェントのインターンに参加させていただき、TappleのAndroidアプリ開発に関わらせていただきました。
夏休みはDMMのインターンに参加させていただき、AquizのAndroidアプリ開発に関わらせていただきました。
この2つのインターンで得た知識と経験は、間違いなく今の自分の力になっています。お世話になったみなさんには改めてお礼を言いたいと思います。ありがとうございました。
技術
今年は興味ベースでいろんな技術を試しました。去年まではAndroidメインだったのがサーバーサイドKotlinにも手を出したり、JVM言語仲間であるScalaを学んだり、GCPやAWSを軽く触ってみたり。ただ、やはりAndroid以外の分野は知識が中途半端な気もするので、来年はさらに深く学んでみたいと思います。特にサーバーサイドまわりの知識を充実させたいです。
今年の反省と来年の抱負
アウトプットに関しては今年は結構頑張れたんじゃないかなと自分なりに思います。考えるより行動の精神でいろんなことをしました。ただ、わりと単独行動も多かったので、もっと同期や後輩をいろんな勉強会やハッカソンにつれていけばよかったと少し後悔しています。
来年は、アウトプットは継続しつつ、どんどん周りを巻き込んでいきたいと思います。Zliの代表にもなりますし、周りに良い影響を与えられる人でありたいと思います。