NSBlogger

意識高いブログ

iOSアプリエンジニアのための面接質問集100選

f:id:Kamekiti:20161224033950p:plain

はじめに

こちらはiOS その2 Advent Calendar 2016の12月24日の記事です。
iOSアプリエンジニアが採用面接時に聞かれることってなんだろうと思い、ひねり出した100個の質問です。
ゼロベースで考えるのはさすがに困難だったので、以下に挙げられている記事をだいぶ参考にしました。

これらで紹介されているものは、実際にコードを見て応えるものもありますのでぜひご参考ください。
また、他の言語や環境に関する面接質問集も載っているので、興味のある方は覗いてみてはいかがでしょうか。

上記の参考文献をもとに、オリジナルも含めた面接質問集をジャンルごとに分けてまとめました。
Answerは自分自身の回答もありますし、それっぽいことを載せているものもあります。
詳細を書きすぎると長文になるので、できるだけ簡潔にまとめました。
質問に対して関連してそうな記事やサイトも載せていますのでご参考ください。

ただのiOSクイズになっちゃったなぁと感じてます……。
回答に大きな間違いがありましたら、こっそり教えてください。

アプリの設計

Q1. ライブラリはどのように管理していますか。

CocoaPods、Carthageで管理。Carthageに対応しているものはCarthageを利用。
今後はSwift Package Managerで管理していく予定。

Q2. どのようにして循環参照を防ぎますか。

Objective Cでは、ヘッダーファイル内での多重importを防ぐために@classを利用。(ヘッダーの循環参照)
Block構文(Closure)内ではselfをweakでキャプチャして利用。(メモリの循環参照)
※それぞれ何の循環参照かを明記しました。コメント欄にてご指摘ありがとうございます。

Q3. viewDidLoadからviewDidAppearまでの間で、どのタイミングでAPI通信を行うことが望ましいか。

画面を構築する際に一度だけデータ取得を行うのであれば、viewDidLoadで通信を開始。
結果がViewに影響する場合は、通信完了後にViewのレイアウト更新が必要になるかもしれない。

Q4. UITableView / UICollectionView のパフォーマンスを低下させない工夫を挙げてください。

セルの再利用や画像を非同期で取得したり、Viewを重ねすぎないことでパフォーマンス劣化を防ぐ。
Viewのlayerを使った処理は高負荷になりがちなので、drawRect:で描写をするのも手。

Q5. UITableViewControllerで画像を表示させる際に考慮すべき点は何か。

メインスレッドで画像のダウンロードを行わず、非同期で取得。
セル再利用時にセットされている画像をリセット。

Q6. セキュアにデータを端末内に保存するにはどのようにすればよいでしょうか。

セキュアなデータはHTTPSで通信し、Keychainに保存。

Q7. バグの発生を防いだり検知するためにシステマティックに行っていることを教えてください。

SwiftLintで一貫したコードが書けるように自動チェック。
CIでPull Requestを監視し、マージ後の状態でUnit TestおよびUI Testを実行。
エラーが発生した場合はSlackで通知し、Pull Requestはマージできないように制御。

アプリの問題解決

Q8. 正常に処理されているはずなのに描写が更新されません。何が原因だと思われますか。どのようにすれば解決できると思いますか。

Viewの更新がメインスレッドで行われていない可能性あり。
View更新の部分のみメインスレッドで処理させる。

Q10. クラッシュレポートが届きました。対処方法を教えてください。

クラッシュレポートからクラッシュしているクラスやメソッドを割り出し、実際にクラッシュを再現させる。
クラッシュした端末のバージョンや残メモリも同時にチェック。
クラッシュが再現できたらその箇所を修正する。

Q11. 「バッテリー消費がひどい」とレビューに書かれました。どのようにしてバッテリーの消費量を調査しますか。

アプリを一定時間使ってみてiOSの設定から消費電力を確認。
他のアプリに比べ極端に減りが早い場合は要修正。
Xcodeデバッグ中にバッテリーの消費具合が確認できるので、全体の動作を行いながら消費電力が大きい箇所を特定する。

Q12. バッテリーの消費量を抑えるためにはどうすればよいでしょうか。

ネットワーク通信は消費電力が高いので、ネットワーク通信を抑える。
画像は最適なファイルサイズに圧縮してからダウンロード。APIへの通信回数を少なくする。

Q13. Viewのデバッグはどのように行っていますか。

XcodeのView Debuggingを利用。Revealを利用。

Q14. Storyboardがコンフリクトしてしまいました。どう解消しますか。

まず相手の修正内容を聞き、自分の修正内容と比べる。
修正範囲が大きい方をベースにもう片方の修正をStoryboard上で手動追加。

Q15. どういった制約下でAutolayoutが崩れますか。Autolayoutを崩れないようにするためにはどのような制約をつければよいでしょうか。

横幅・縦幅、水平方向・垂直方向の位置、これら4つが定まらない場合、AutoLayoutは必ず崩れる。
この4つを意識し、制約が確定したViewを基準として制約を付与していく。

Q16. APIの開発が遅れた場合、アプリ開発にどんな影響が生じますか。それをどのように解決しますか。

通信まわりの処理が実装できない。
あらかじめ指定したデータを返すサーバを用意するかローカルにレスポンスデータのサンプルを用意して読み込ませる。

Q17. Appleの審査でリジェクトされたことはありますか。もしあればその理由と対処方法を教えてください。

はい。アプリで利用していない情報を登録時に入力させていたので、除外しました。

Q18. リリース後のアプリに致命的なバグが見つかりました。どのように対処しますか。

バグを修正して再度審査へ。特急審査を使うのもあり。
バグの修正に時間がかかる場合は、前のバージョンをアーカイブし、審査へ。

Q19. APIがメンテナンスに入りました。アプリはどのように振る舞うのが理想でしょうか。それはどのような仕組みで実現できますか。

API通信が必須のアプリならアプリも利用できないようにロックさせる。
APIがメンテンナンスを意味するレスポンスを返した場合にメンテナンスモードを発動させる。

Q20. アプリのA/Bテストを行いたいという要望がきました。どのような仕組みで行いますか。

外部に置かれたファイルでAとBの割り振りの割合を設定できるようにする。
アプリ内にAとBの処理を記述、割合の設定に従って分岐させる。
同じユーザには同じ処理を毎回行わせる必要があるため(A/Bがころころ入れ替わらない)、どちらの情報を出すかを保持しておく。

Q21. pchファイルはどのような使い方をしていますか。

Pre Compile Headerはコンパイル前に読み込まれるので、アプリ全体で利用する定数やクラス、マクロの処理を記述すると便利。
※コメント欄にて、定数やマクロの記述は依存関係が混沌となるのでバッドプラクティスだとご指摘いただきました。

Q22. Schemeはどのように活用していますか。

デバッグ用やステージング用など環境ごとにビルド設定を変える。

Q23. アプリのBeta配布にどのようなサービスを利用していますか。Beta配布時に工夫していることはありますか。

Test Flight、Deploy Gate。
リリースされているアプリと共存できるようにするため、別Identifierで配布。
本番環境用とステージング環境用の2種類を配布。アイコンも変えることでひと目でどの環境のバイナリか把握できるようにしている。

知識

Q24. MVCアーキテクチャについて説明してください。それに代わるアーキテクチャがあれば教えてください。

Model View Controller。MVP, MVVM。

Q25. NSNotificationCenterとDelegateの使い分けを説明してください。

NotificationCenterはブロードキャスト、Delegateは指定されたクラスへ通知。

Q26. UIWebViewとWKWebViewとSFSafariViewControllerの違いを説明してください。

UIWebView 初期のWebView、Safariとはレンダリングの仕方が異なり、バグが多く安定しない。
WKWebView iOS8以降から使えるWebView、Safaritoレンダリングの仕方がほぼ同じで、UIWebViewより高機能で安全。
SFSafariViewController Safariと同等の機能を提供するが、カスタマイズが不可能。

Q27. - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier reuseIdentifierは何のためにありますか。これを使うメリットは何でしょうか。

セルの再利用。
セルを毎回作成するとメモリが不足してしまうので、画面上から消えたセルを次に表示させるセルに再利用する。
メモリ使用量の効率化および高速な処理が可能になる。

Q28. UIApplicationStateで管理されるiOSの状態(Active, InActive, Background)をそれぞれ説明してください。

Active アプリがフォアグラウンドにあって動かせる状態
InActive アプリがフォアグラウンドにあるが動かせない状態(たとえば通知センターやコントロールセンターを表示しているとき)
Background アプリがバックグラウンドにある状態(ホーム画面や他のアプリがフォアグラウンドにきている)

Q29. Method Swizzling とは、その活用方法について。

メソッドの中身を後から書き換えられる。
コンパイル済みの静的なライブラリの中身を変更したいとき(セキュリティ問題が発覚し修正したいが元のソースが手に入らないなど)や、特定のiOSのバージョンでメソッドを書き換えたいときなど。

Q30. AutoLayoutとAutoresizingMaskの使い分けについて教えてください。

AutoresizingMaskのほうがAutoLayoutに比べシンプルな制約しか設けられない。
AutoLayoutを利用した場合、コードからFrameの操作は基本的に行うべきではなく、制約を修正して調整する。
AutoresizingMaskを利用した場合は、Frameの操作は柔軟に行える。

Q31. カテゴリとは、その有用性について。

既存のクラスを拡張することが可能。既存クラスに便利なメソッドを追加して汎用的に利用したい場合に使う。

Q32. Protocolとは何か、どのような場面で利用するか。

汎用的な定義を行い、それを適合させたクラス内で具体的な実装を行う。

Q33. KVO(Key-Value-Observing)を利用するとどのようなことが実現できるか。

ある値が変化した瞬間にイベントをキャッチできる。
ある値が変化し、それに連動させて別の処理を行いたいときなどに利用。

Q34. iOSでマルチスレッドを実現させるための仕組み、コーディングの仕方を教えてください。

dispatch_async, NSThread, NSOperationQueue

Q35. Responder Chainとは何か、その仕組みについて。

タッチされたときのイベントの伝播。一番上に乗っているViewからどんどん下に伝搬していく。
あるViewでキャッチされたらその後のViewには伝搬しない。
最後までキャッチされなかった場合は破棄される。

Q36. Handoffとは何か、どのようにしてiOS, macOS, watchOS, tvOSとやりとりするか

別の端末やアプリとシームレスに連係する仕組み。
同じWifi配下に接続された端末が同じiCloudにログインし、Bluetoothが有効である場合に連係できる。

Q37. iOSのアプリ内に展開される ~/Documents, ~/Library, ~/tmp これらのディレクトリはどのように使い分けますか。

Documents iTunesのバックアップ対象、ユーザが閲覧できる情報
Library iTunesのバックアップ対象、アプリ側で保持したいデータを置く、ユーザが直接閲覧しない情報
tmp 一時的に保持したい情報を置く、iOSが任意のタイミングで削除できる

Q38. Provisioning Profileとは何か

証明書情報に加え、インストールできる端末やアプリの情報が記載されている。ビルド時に必要。

Q39. Bitcodeは何に利用されますか。

Bitcodeを有効にしているとビルド時の中間ファイルをApple サーバ上へ保持できる。
将来的にAppleサーバ側でビルドし、各端末に最適なバイナリを提供する際に利用される予定。

Q40. どのようなアプリがリジェクト対象になるのでしょうか。

アダルト系、ギャンブル系、クラッシュが頻発するアプリ、非公開APIを利用しているアプリ、外部のコードが実行できるアプリ、アプリ内で利用するコンテンツをApp内課金以外の方法で購入できるアプリなど。

Q41. App Storeランキング(ダウンロード数)で上位にあがっているアプリを教えてください。それはどんなアプリでしょうか。

SNOW、LINE、Instagramなど。自撮り&加工アプリ、メッセージアプリ、写真SNS

開発経験

Q43. 言語ごとの開発経験を教えてください。

Objective C 3年、Swift 1年

Q44. Staging環境は利用していますか。どのような場面で利用していますか。

QAテスト中に利用。実際のデータでは再現できないケースに利用。

Q45. 今まで開発に携わったアプリを教えてください。また、その中で何をメインに開発しましたか。

ほぼすべての設計および実装。

Q46. プロトタイプを作成したことはありますか。何を目的にどのようなプロトタイプを作成しましたか。

ユーザインタビューにてUI/UXの調整のために作成。ネイティブで実装。

Q47. いま携わっているプロジェクトで、企画からリリースまでのフローについて教えてください。あなたはその中でどの工程に携わっていますか。

ディレクターが企画をし、アイデアをもとにデザイナーがデザインを作成。必要に応じてエンジニアもプロトタイプの作成を行う。
ある程度仕様が決定した後、アプリの設計を行い、それをもとに実装。リリース前にQAテストを行う。
プロトタイプの作成〜設計、実装までを担当。

Q48. デザイナーとどのように関わっていますか。

Sketchで作成されたファイルを納品していただき、Zeplinで確認。その後のやりとりはZeplinのコメント機能で。

Q49. フレームワークを作成したことはありますか。フレームワークを開発する上で苦労した点を教えてください。

より使いやすく汎用的なものにしあげるため、インタフェースまわりの設計にこだわった。

Q50. Universal Appを開発したことはありますか。Universal Appを開発する上で工夫した点を教えてください。

iPhoneiPadで利用できる共通処理を一元化。
Storyboardも使いまわし、iPhoneiPadで差分が大きくならないようにした。

Q51. Objective Cで書かれたプロジェクトをSwiftに移行したことはありますか。移行の際に苦労したこととその解決策を教えてください。

そのクラスがObjectiveCから利用される可能性がある場合は、Swiftでしか利用できない機能を外部から使うような設計は避けた。
Swiftのコンパイルが先にはしるので、Swift内でエラーが発生した場合、付随するObjective Cのコードもエラーになり、原因特定に時間がかかった。

Q52. いま携わっているプロジェクトはどの程度Swiftで実装されていますか。

3%, 100%

Q53. MVC以外のアーキテクチャを採用したことはありますか。採用したことによるメリットとデメリットを教えてください。

MVPで実装することで、ModelとViewを分離することができた。
PresenterはViewとModeに対し、Interface越しにやりとりするので、仕様の変更にも対応しやすい。

Q54. 最新のiOS SDKを使って開発をしたことはありますか。最新のiOSを使ってみて気になる機能や改善はありましたか。

高機能になったWidget

Q55. 次期OSのBeta版を利用したことはありますか。なぜ利用しましたか。

次期OS対応のための影響調査。

Q56. Appleにバグレポートを提出したことはありますか。どのようなバグを発見しましたか。

iOS10で特定条件下でUIFontのBoldが効かないバグを提出。

Q57. Apple WatchGoogle Glassなどスマートフォン以外のデバイスのアプリを開発をしたことはありますか。どんなアプリを開発しましたか。

Apple Watch, Pebble

Q58. Storyboardを使ったことはありますか。Storyboardを使うメリット、デメリットを教えてください。

メリットはAutolayoutやFrameの設定が直接コードでかくときより楽に行えること。
デメリットはコンフリクトした場合にマージできないこと、修正の差分をみただけでは修正内容を完全に把握できないこと。

Q59. AutoLayoutを使ったことはありますか。

全StoryboardでAutoLayoutを利用。

Q60. SizeClassesは使ったことはありますか。SizeClassesとは何でしょうか。

端末の画面形状によって画面内のレイアウトを変更すること。

Q61. ローカライゼーションを行ったことはありますか。気をつけた点を教えてください。

アラビア文字のようなRTLにも対応。UIViewを反転させて実現。

Q62. Ondemand Resourceは使ったことがありますか。何に利用しましたか。

ゲームアプリ内のコンテンツを分割して配布するために利用。
一度に大量のデータをダウンロードせずに必要なデータを随時提供することが実現できた。

Q63. Core Graphics, Core Animationを利用した実装を行ったことはありますか。どのようなものを作成しましたか。

リアルタイムにダウンロードの進捗具合を反映させるローディングにCore Graphicsを利用。
60fpsで描写され、なめらかなアニメーションを実現できた。

Q64. お気に入りのライブラリを教えてください。なぜ気に入っていますか。

Kingfisher。
軽量の画像ダウンロードライブラリで、カスタマイズも柔軟に行なえ、複雑な処理が少なく使いやすい。

Q65. iOSを新しいバージョンに対応したことはありますか。その中で最も苦労したバージョンとその理由を教えてください。

iOS6 -> iOS7。フラットデザインに切り替わることで、大幅なデザイン修正があった。
それに伴い既存のロジックもリファクタリングする必要があり、約一ヶ月の時間を要した。

Q66. チーム開発を行ったことはありますか。何人のチームで、自分はどのような役割でしたか。

3人のチームで、皆iOS/Androidの開発が行える。自分はiOSの開発に注力。

Q67. 特急申請したことはありますか。なぜ行いましたか。

はい、売上に繋がる致命的なバグが発生したため。

Q68. iOS Human Interface Guidlineは読んだことはありますか。その中で印象に残っているものを教えてください。

アプリケーションの定義の仕方について。
どのようにアプリを定義していけばよいのかの指針、UIをリニューアルする際の注意点が参考になった。

言語(Objective C, Swift)

Q69. Objective CとSwiftのProtocolの違いはどこにありますか。

Objective CのProtocolはそこに定義されている内容を実装してもよいししなくてもよいという仕様。
SwiftのProtocolは必ずそこに定義されている内容は実装しなければならない。
また、SwiftのProtocolは拡張することができ、デフォルトの実装を用意することができる。
さらにGenericsにも使うことができ、汎用性が高い。

Q70. プロトコル指向プログラミングとはどういった概念でしょうか。

Protocolを定義し、その機能を提供したいクラスや構造体に対してProtocolを適合させて実装していくスタイル。
こうすることで、どのクラスがどんな機能をもっているかが明確になる。
クラス継承と違い、他のクラスとの依存関係もなく、融通がききやすい設計が実現できる。

Q71. 言語的な視点で、Objective Cに比べSwiftの良い点をひとつ説明してください

Objective Cでは、コーディング時にnilの存在をあまり強く意識することはなかったが、
それゆえnilが原因で知らぬ間にバグが生まれることがあった。
Swiftから登場したOptional型のおかげでnilに対する制御がコーディング時点で意識できるようになった。

Q72. propertyの修飾子、weakとstrongの違いを説明してください。

strongは強い参照を意味し、オブジェクトの所有権を得る。
strongの参照がなくなるまではそのオブジェクトは解放されない。
お互いのオブジェクトを強い参照することで起きうるのが循環参照(メモリリーク)。
これを回避するためにweak(弱い参照)を利用する。
weakは他のstrongの参照がなくなった場合、自身をnilにすることでオブジェクトを解放させる。

Q73. propertyの修飾子、atomicとnonatomicの使い分けについて説明してください。

nonatomic状態だと意図しないタイミングで書き込みがされる。
atomic状態だと書き込み要求された順番に正しく処理がなされる。(書き込み中はロックされる)
※逆になっていたので修正しました。2017/01/03
コメント欄にてご指摘ありがとうございます。

Q74. retainとcopyの違いを説明してください。

retainはメモリ領域を参照すること。copyはメモリ領域を複製し、新しい参照を与えること。

Q75. Swiftのアクセスコントロール(open, public, internal, fileprivate, private)について説明してください。

open 別モジュールからも呼び出せ、継承やオーバーライドも可能
public 別モジュールからも呼び出せるが、継承やオーバーライドは不可能
internal 同モジュール内なら呼び出せる
fileprivate 同ファイル内なら呼び出せる
private 同スコープ内なら呼び出せる

Q76. Designated Initializer(指定イニシャライザ)とは何か

必ず実行されるイニシャライザ。
自前でイニシャライザを作った際、指定イニシャライザを必ず実行される処理にしないといけない。

Q77. selectorとは何か、どのようにして呼び出すか。

メソッドはコンパイル時に内部表現に変換される。この内部表現がセレクタと呼ばれ、SEL型で定義される。
コード内から直接SEL型を扱うことも出き、Objective Cでは@seledtorで定義が可能。
`@selector("test")`を定義し、`perform`すると`test`メソッドが呼び出される。
この仕組みを利用すればコンパイル後に外部から動的にメソッドを切り替えることができる。

考え方

Q78. 様々なエラーが想定されますが、エラーハンドリングはどのように行っていますか。

Errorクラスを継承した独自のクラス内で独自のエラーを定義している。
Domainやエラー情報などを一元管理。

Q79. バージョニングはどのように行うのが理想だと思いますか。

1.2.3

1 メジャーバージョンでiOSの最低サポートバージョンをきったときにあげる
2 マイナーアップデート時に更新する
3 緊急のバグ修正などのHotfix用

Q80. ライブラリを選定する際の基準を教えてください。

インターフェイスの充実さ。

Q81. WebViewはどのような場面で利用するのが最適だと思いますか。

APIに対応していない情報を一時的に提供するもの。メイン導線にはWebViewを使うべきではない。

Q82. Viewを作成する際、StoryboardやXibを使ったり、直接コーディングすることがありますが、どういった基準でそれぞれを使い分けていますか。

画面はStoryboardで作成し、使い回しがきくViewはXibで作成する。

Q83. コードレビューはしますか。どのような観点でレビューしますか。

まず動作確認を行う。ビルドが通るかどうか、実際に動かしてみたときの動きの確認。
レビュー時はクラス構成および各クラスやメソッドが提供する機能が正当であるかどうかをチェック。
パフォーマンスが落ちるような処理をしていないかもチェック。

Q85. アプリを開発する際に一番こだわること(気をつけていること)は何ですか。

UI/UXが正しいかどうか、画像のダウンロードや描写の速度などパフォーマンス。

Q86. どこでアプリ界隈の情報を収集していますか。

外部の勉強会、カンファレンス、Swift公式サイトなど。

Q87. アプリ開発中で一番楽しい時間はいつですか。

UIまわりの細かい処理を時間をかけてじっくり作り込んでいるとき。

Q88. SwiftにおけるClassとStructureの違いは

クラスは参照型、構造体は値型。構造体は継承できない。

テスト

Q89. Unit Testは書いていますか。Unit Testを書く際のルールなどがあれば教えてください。

Viewの細かいUIについてのテストは行わない。無理して書きすぎないようにする。壊れにくいテストにする。

Q90. プライベートメソッドはテストしていますか。どのようにテストしていますか。

Objective Cの頃は、Private Methodsにアクセスする手段があったので書いていたが、
Swiftでは書いていない。InternalのメソッドのみUnit Testする。

Q91. UI Testは行っていますか。UI Testを行う上で工夫した点があれば教えてください。

各要素に正しくアクセスできるようIdentifierを付与。
通信やアニメーションのラグを考慮するために、何も動作させない時間を随所に配置。

Q92. CIサービスは何を使っていますか。構築する上で苦労した点を教えてください。

Jenkins, Bots, fastlane。
Xcodeがバージョンアップする際に毎回設定し直す必要あり。
また、ローカルでビルドが行えるがCIではうまく動かないという事象が多々発生。
解消するためにGemやPodsのバージョンを統一、ライブラリもすべてGit配下で管理。
Provisioning Profileの読み込みミスも多々起きうるので、同じくGit配下で管理。

運用

Q93. 開発フローの中で自動化している部分を教えてください。

Pull Requestを送信→CIがマージ後の状態でUnit Testを開始、その結果を通知。
Releaseブランチに対してコミット→CIがUnit Testを実行→アーカイブ→Deploy GateおよびiTunes Connectへアップロード。

Q94. 解析ツールは導入していますか。解析した情報はどのように利用していますか。

Fabricを導入。クラッシュ率が高まったら通知。クラッシュした原因の解読材料として利用。

Q95. リリースしたアプリの現在のレビュー(星の数)を教えてください。

4、4.5

Q96. 今までレビューに書かれた内容で印象に残っているものはありますか。

PCにあってアプリにない機能の実装要望
ネガティブなレビューだと、自社サービスに対する単なるクレーム

Q97. レビューの評価を挙げるために工夫していることはありますか。

一定の期間アプリを利用したユーザに対して、「評価してください」のポップアップを出す。
この機能を組み込んだことで、ポジティブなレビューがかなり増えた。

その他

Q98. 最近の新機能で実装してみたいものはありますか。

新しくなったWidgetや通知、3DTouch、Spotlight検索。
ニューラルネットワーク系のライブラリを使った何か。

Q99. アプリ開発でよく利用するツールやサービスはありますか。

Reveal、Gapplin、Sketch、Origami、Charles

Q100. iOS SDK内で一番好きなクラス(API)は何ですか。

UIView。安心する。Viewのベースとなっており、Viewまわりの基本機能がすべて使えカスタマイズも容易。
Viewの生成だけでなくアニメーションも定義も行えるところ。

おわりに

🎄メリークリスマス🎄
良いお年を。