ミクシィでインターンした話

2021年の8/16から9/10までDive into mixi GROUPというインターンシップでmixiグループのminimo事業部にてiOSエンジニアとしてインターンした記録です。

ミクシィのオフィスから見えるG社

ミクシィのオフィスから見えるG社

tl;dr

ミクシィは最高なので全員応募しましょう!

選考

2021年の夏にインターンする先をさがしていたところ、ミクシィのインターンの募集を見つけて応募しました。

書類選考通過の連絡が来て一安心した後、面接の連絡が来ました。今回のインターンシップでは人事の方との面接、社員の方との技術面接、配属候補の組織の方との面接のプロセスがありました。

技術面接までは問題なく進んだのですが、最後の配属先候補の方との面接ではあまり候補の組織とのマッチがないので不合格ということになってしまいました。

ただその後で、技術面接をしていただいた社員の方が所属していたminimoで再面接していただけることになりました。そしてminimoのエンジニアの方との面接ののち、無事に合格をいただき、minimoでのインターンが決定しました。

最初に落ちた時は割と凹みましたが、結果的に自分とあった組織でインターンすることができよかったなとも思います。またインターンとはいえ配属先候補とのマッチをしっかり選考過程で考慮されるのは、お互いの時間を最大限有効に使うという意味でとても良いなと思いました。


環境・待遇

【期間】
2週間以上から応相談
※ サービスによって異なりますので、面接時に確認させていただきます
※ 開始日は、毎月1日か16日のいずれかになります
【勤務時間】
10:00~19:00(休憩1時間)
【時給】
時給 2,500円
引用元

時給に関して

大学生が応募でき、エンジニア内での職種の制限がないインターンシップの中ではかなり高い方なのではないかなと思います。

インターンシップの期間に関して

自分の都合に完全にあわせていただきました。一つ注意しなければいけないのは入社日が毎月1日か16日だという点です。終わりの時期がずらせない場合は面接の時期によっては二週間近くインターン開始できないまますぎてしまう可能性もあるので、なるべく早く応募して選考プロセスを開始するのがいいと思います。

リモートワーク

今回のインターンシップ中は基本的にリモートで業務を行いました。渋谷スクランブルスクエアのオフィスに行く機会が少なかったのは残念でしたが、それでも綺麗なオフィスに何度か行くことができよかったです。ミクシィでは事業部ごとにリモートワークの方針を決めており、minimoでは週一出社が推奨されていたので僕もそれにしたがい基本的に週一でオフィスに出社していました。他の事業部のインターンの方はまた別のルールで出社していたりと柔軟に対応されている印象でした。


インターン期間中に驚いたこと

研修

入社手続きが済んだ後に、オンラインでのハラスメント、コンプライアンス等に関しての研修がありました。その量が意外と多くて個人的に驚いたことを覚えています。研修項目が多いというのは必ずしも良いこととは限りませんが、僕はミクシィという会社が持つ価値観を知ることができる良い機会だったなと思います。

エンジニア以外の各チームについての紹介ミーティング

minimoのチームにジョインした後でまずエンジニアを束ねる立場の方との1on1があり、minimoのエンジニア組織についての説明を受けました。ここまでは自分の予想の範囲内でしたが、その後でエンジニアリングとは関係ない他のチームについて各組織のリーダーの方達から一対一で説明を受けました。インターンに対してここまで時間を割いているのがすごく意外でしたが、それによりminimoという事業やチームについて深く理解することができ、インターンの経験がより良いものになったなと思います。


インターン期間中に取り組んだこと

二つのタスクをメンターの方々と一緒に進め、それと同時にiOSアプリのコードベースのリファクタリングを行いました。

タスク①:誤ったログアウトを防止する

前提

  • minimoのiOSアプリはAppleの審査の都合上、実際の登録プロセスを経ずに「ログアウト」する動線が存在していました。

課題

  • 「ログアウト」と名乗っているがアカウントを他のSNSアカウント、メールアドレス等に連携していない時は実質アカウント削除と同等の処理になっていました。
  • アカウント未連携だと、ここでログアウトしてしまうと、ポイントなどが失われてしまう状況。
  • この事象に伴うサポートも一定数発生していた。
  • 古いデザインのリプレイスが途中までになっていた。

行った改善

  • 「ログアウト」を押すとアラートが出るように変更し、同時にアカウント連携を促すように変更。
  • ログアウトを押した時も、再確認をするようにアラートを追加。
  • Google Analyticsとの連携を実装。
  • アカウント管理画面のデザインを新規のものにリプレイス。

タスク②:予約詳細画面の一部ユーザビリティ改善

課題

  • 予約詳細画面のユーザビリティにiOSとAndroidに差異がある。
  • 予約後、サロンへのアクセスを調べる方法が不足している。

行った改善

  • 予約詳細画面に直接、地図アプリを開く動線を追加で実装。

リファクタリング

first(where: ... )を使うように変更

minimoのiOSアプリのコードベースの中には

1 .filter { ... }.first

を利用している部分がいくつかありました。これは不必要に配列の全要素をループで見に行くことになるので、常に最悪ケースの時間がかかることになります。これを

1 .first(where: ... )

に置き換えることで条件に一致する値が見つかったらループから抜けるので、パフォーマンスの向上が望めます。

不要な.stringの削除

minimoではSwiftGenを使って文字列のリソースを管理していました。ただそのSwiftGenの生成物を利用する際に

1var str = L10n.something.string

のような呼び出し方をしている部分がいくつか見受けられました。この場合L10n.somethingのみでリソースにアクセスできているのになぜ.stringを経由しているのか疑問に思い調べていくと、そもそもこのstringをminimoアプリで利用していたOAuthSwiftというライブラリが実装していたString型の自分自身を返すだけのextensionということがわかりました。無意味にコードを冗長にしているだけだったので、.stringの部分を削除する対応を取りました。

カスタムSwiftlintルールを追加

上記の.stringを追加してしまう問題は作業時に意識するだけでは防ぎきれないと思ったので機械的に防げるようにしたいと思いました。minimoアプリではSwiftlintが導入されていたのでSwiftlintのカスタムルールという機能を利用して上記の.stringを利用しようとしたらワーニングが出るようにしました。カスタムルールは正規表現を使って追加するので偽陽性が出ないようにということを強く意識して正規表現を組みました。


追記

Swift Developers Japanにて、外部ライブラリが提供するextensionの利用を禁止したい場合は外部ライブラリをインポートする専用の新たなライブラリを作って@_implementationOnlyを利用して実装が引き継がれないようした上で、必要なインターフェースのみを公開するという方法を教えてもらいました。


使われていないリソースを削除

生成された文字列リソースを見ていく中でいくつか使われていないが残ってしまっているものがあることに気づいたので、それらを削除することにしました。その際にPeripheryというツールで自動検出することに挑戦しましたが、minimoアプリでは一部Objective-Cで書かれたコードがあり、それらからの呼び出しは検出できないのでそこを確認する必要があり、あまり恩恵を受けることができませんでした。

不必要なself.を取り除く

Swiftではプロパティにアクセスする時など多くの場合でselfを省略することができます。また最近ではSwiftUIを使う時にselfを省略しやすくなる変更が加えられていたりします。minimoのiOSアプリのコードでも新規に追加されるコードではselfはできる限り省略することになっていましたが、以前に追加されたコードはそのようになっていなかったので省略可能なselfを取り除く変更を行いました。

SwiftFormatredundantSelfというルールがあったのでこういうものに早く気づいて利用できていればもっとよかったかもしれないです。

感想

約一ヶ月間という短い期間ではありましたが、minimoでとても楽しく実際のサービス開発に関わりながら、アプリ開発についてさまざまな学びを得ることでき、とても有意義なインターンシップをすることができたと思います。

コロナ禍ということもありインターンシップ期間中はリモートでの勤務がほとんどでした。それでも自分のタスクではなかなか関わることのない職種の方とのランチする機会を設けていただりと、人事の方々やメンターの方などminimoチームの方々のサポートのおかげでたくさんのことを吸収できました。

See Also