概要
転職エージェントは、本当にスゴ腕なのか!?──偽エンジニアを見抜けるか試してみた がツイッターのタイムラインで上がってきたので興味が湧きました。
これは未経験者は必ず読んだ方がいい
— かずきち (@kazukichi3110) 2018年12月10日
営業ちょっと出来れば簡単に潜り込めちゃうってこと
エージェントに限らず、現場の採用担当もこのレベルです
現場入ってから辻褄合わせれば文句も出ない
転職エージェントは、本当にスゴ腕なのか!?偽エンジニアを見抜けるか試してみた https://t.co/LIbRXEvtnl
転職エージェントが豪腕エンジニアを見抜けるかはさておき、この記事では実際に転職の面談の流れが紹介されていた。
私は今でこそ4年くらいフリーランスとして活動しているが約1年ベースで現場を渡り歩いたので現場の数だけ面談を通ってきました。
そこで今回はフリーランスの案件に携わる時の人事の方から質問を受ける問いをまとめたいと思う。
もちろん私のメインはiOSエンジニアなのでiOSの案件の面談です。
ワロタw
— Tamappe@iOS_Dappsエンジニア (@tamapppe) 2018年12月10日
これのiosエンジニア版の一問一答方式の面談質疑応答なら全然文章化できる。
転職エージェントは、本当にスゴ腕なのか!?──偽エンジニアを見抜けるか試してみた https://t.co/ONyIzyooI2
面談時によく聞かれる質問
これまでに携わってきたプロジェクトと職務経歴について説明してください
こちらは自分が作成した職務経歴書を元にして自分が今まで経験してきたプロジェクトの内容について説明します。全部が全部を説明するのではなくアピールしたいプロジェクトを3つほどピックアップして職務経歴書には書かなかった事(書けない事)を伝えます。
メインで伝える事としては
- プロジェクトの規模感(iOSエンジニアx名、Androidエンジニアx名、サーバーサイドエンジニアx名のプロジェクトでiOSエンジニアを担当)
- 開発環境について(チケット管理、CI、その他ツールなど)
- github-flowやgit-flowなどどんな開発スタイルを経験してきたか
- そのプロジェクトを通して経験した知見、つらみ、教訓
- そのメンバーで自分が発揮できたバリューの内容
- タスクの取り組み方
これまでに使ってきたフレームワークは具体的にはどういったものを使ってきましたか?
iOSエンジニアでしたらどのようなライブラリ管理ツールを使ってきたのか(CocoaPodかCarthage)
RxSwiftでの開発経験はありますか?
こちらは開発でRxSwiftを導入しているプロジェクトの場合に聞かれます。
基本、私は「はい、経験があります」と伝えますがこの質問は色々と恐怖を感じます。
というのはプロジェクトによっては「トレンドだから使ってみたい」といった理由で採用されたりする事があってメンバーのスキルセットによっては後々の技術的負債となるケースがあったからです。
ちなみにAndroidのRxJava・RxAndroidに関してはとても便利なのでAndroidでRxを採用しているところにハズレはありませんでした。
これまでにgithubやQiitaで情報発信してきましたか?
技術レベルが一定以上の会社に関してはほぼ聞かれました。
こちらは「今は情報発信はしていませんがゆくゆくは情報発信をしていきたいです」という前向きな姿勢を見せたらいいのかと思います。
私の場合は趣味アプリは他人に見せたくないのでプライベートリポジトリで管理している関係でgithubの方は答えにくかったりしますが、「プライベートリポジトリで開発しています」という風に伝えてました。
パブリックリポジトリは基本ゴミしかありません(汗)。
最近のiOSのトレンドや興味を持っている技術について教えてくれませんか?
RxSwiftとFlutterとブロックチェーンですと答えます。(Flutterは触ってみたいけど人生の時間が足りません。)
ブロックチェーンをGoと言い換えたりしていますが、「なぜにGo?」という反応が多かったのでブロックチェーンと答える習慣がつきました。
テストコードを書いた経験はありますか?(リファクタリングをした経験はありますか?)
- UITest・UnitTestを書いた経験がなかった時期
テストコードは書いたことはありません。すみません。
- 今(どっちも経験ずみ)
UnitTestの経験はありませんでしたが、UITestの経験はあります。UITestのきっかけはリリースのたびにデグレ・バグが発生するプロジェクトがあった時に精神安定剤としてUITestを使って画面のスナップショットを取るようにしました、と回答しています。
ここは特にテストコードの経験がなくても大丈夫ですが、あれば加点のポジティブQuestionという印象があります。
ただiOSアプリの場合はそもそもテストコードがない事が多いのでテストコードを書かなくてもいい文化がありますね。
寧ろ、テストを書く理由の方が大事な印象があります。
UITestが本当に必要だと思ったプロジェクトは1クラス2000行以上は当たり前、1メソッドにつき200行の処理が書かれているソースコードを見たりした時は流石にテストが必要だなと実感します。
弊社は過去の負債が沢山あってリリースの度にクラッシュバグが多発していてそれを軽減させたいのですが、それは可能でしょうか?
こちらは本当は「不可能です!」と素直に答えたいですがそれはプログラマの意地で「できなくはありませんね」と答えてしまいます(笑)。回答への繋げ方としては逆にどうしたらデグレやバグが多発しないようにリファクタリングしていくのかのプロセスを提示できればOK。
リファクタリングのやり方としては様々なアプローチを考えられると思いますが、
- MVCでもMVVMでも何でもまずは
Modelから攻めます。 - Modelのユニットテストを書きます。
- Modelのユニットテストのテンプレが出来上がったら共通クラス・メソッド
Utilityクラスを攻めます。 - スパゲティコードの原因の多くはUtilityクラスはメソッドを叩いている「だけ」のメソッドが多いので
返り値を返すメソッドに無理やり直します。 - メソッドは無理やりin(input)とout(output)で分けるように心がけます。
- Modelクラスがある程度スマートになってくれば
ViewModelになるように心がけます。 - DBなどを使っていたらデッドロックにならない方にスレッドに気をつける
-
ViewModelが終わったらView->Controllerの順番に攻める - Swiftを使っていたらprotocolを使ってprotocol extensionで切って1ファイルあたりの行数を減らす
- protocol extensionでクラス間が疎結合になると思うからUITestがしやすくなる
2-3の過程でAPI側のparameterとかアウトプットの仕様が分かってくるため精神安定剤としてドキュメントを作成します。
UITestまで持っていけたらfastlaneとかを使って自動キャプチャーまで持っていければ合格点!
とかいった説明になります。
サーバーサイドもやっていただく可能性がありますが大丈夫ですか?
サーバーサイドの言語によって変わります。
バックエンドにPHPかRailsを採用していたら見る事ができますがそれ以外のフレームワーク・言語でしたら学習コストがかかると思います。
Goの場合はチャレンジしてもいいのでしたら私頑張って学習しますのでぜひやらせてください。
と伝えます。
APIの通信を実装した経験はありますか
今の時代API通信を実装できないと仕事になりませんので大丈夫です。
AFNetworkingだろうがAlamofireだろうがAPIKitだろうがURLSessionによる直書きだろうが対応できます。でもGETとPOSTはどちらを使う傾向の開発スタイルでしょうか、と逆に質問しています。
-> サーバーサイドの会話が始まります。
- 【Swift】URLSessionまとめ
- iOSでライブラリに頼らず、URLSessionを使ってHTTP通信する
- 【Swift4】URLSessionを利用してApiClientを実装してみるその1【URLSessionとstruct, Codable】
これまでにとても苦労したことやハマったこと、大きな失敗をしたことについて教えてください
これは結構プロジェクトの機密情報に関わってきますので記載に困ります(面談時であればクソだった案件でどこがどういう風にクソだったのかを伝えるだけ)。
一つあげるとしたら、CoreDataを使用したらプロジェクトで前任のプログラマが実装した部分で新しい機能追加してリリース後にデグレが発生してそこがデットロックしてアプリが固まってしまうバグが非常に大変でした。
- An async/await example that causes a deadlock
- performBlock vs. performBlockAndWait
- ManagedObjectContext performBlock(AndWait) deadlock
現役のiOSエンジニアに見せるとだいたい発狂します。
一応デバッグ方法はありますので頑張れます。ですが、Realmとか別のDBで作り直した方がいいです。
あとはAppleのアプリ内課金(レシート問題)でのトラブルネタは結構トピックにできていいです。
Androidの開発経験はありますか?やってみたいですか?
開発経験はあります。ぜひやってみたいです。iOS・Android両方触りたいですしKotlin書きたいです。
iOS開発でも誰にも負けないと言える分野やスキルはありますか?
UnitTestやAPI周りの実装です。あとはドキュメント作り(Confluence職人)、コーディング規約作りもやります。
Swiftならvarよりletですよね。Immutable大事ですよね。
あとは仕様をまとめるスキルです。
ここだけはどうしても苦手、という分野について教えてください
デザイン周りかもしれません。1px辺りの調整が苦手だったりします。
まあ、でも対応できますので特にありませんね、あー、でもCoreDataのデッドロックとか辛いですよね。
弊社ではコードレビューを導入していますが共同開発の経験はありますか?
今までレビューのなかった現場はありませんでしたので全部先輩エンジニアにレビューされましたしレビューしていました。一人でもフルスクラッチで開発できますが共同開発の方が経験が多いです。iOSエンジニアが合計1-4人規模のアプリ開発に携わっていました。LGTM貰うまでマージできない文化でしたね。
GitHubのIssueやPull requestで頻出する英語の略語達
itunes Connectを使ったことはありますか?(アプリのリリース作業をしたことはありますか?)
アプリのリリース経験はもちろんあります。自分で趣味アプリも開発していますのでリリースしていました。
(と伝えてこのタイミングで自分のアプリを見せます。)
弊社のプロジェクトはAutoLayout / SizeClass / Anchor を使っていますがそれを使った経験はありますか?
全部、経験があります。SizeClassは1つの現場だけ経験しましたが、StoryboradやxibファイルがあるプロジェクトではAutoLayout、コードベースでの設計の場合はAnchorを使って実装していました。
などが参考資料ですけど面談中にリンクを貼ることができず・・・。
これまでにどのような設計のプロジェクトに携わってきましたか?
これまでに携わってきたプロジェクトと職務経歴について説明してくださいと同義。
これまでに課金システムを実装した経験はありますか?
あります。ただ、これはXXX系プロジェクトの時にアプリ内課金が実装されていたアプリのメンテで使用していました。
課金周りはユーザーのお金に関わりますので慎重に対応していた記憶があります。
これまでにソーシャルシェアログインの実装経験はありますか?
あります。だいたいはfacebookとTwitterログインはSDKを使って実装してきました。
それにアプリ内課金が絡んだ時は結構実装大変ですよね。
これまでの経験で辛かった経験があったかとそれはどんな経験でしょうか?
ここだけはどうしても苦手、という分野について教えてくださいと同義です。
逆にあなたの強みを教えてください。
iOS開発でも誰にも負けないと言える分野やスキルはありますか?と同義です。
面談で人事やエンジニアの方から「質問はありますか」と聞かれた時に使える確認した方がいい質問集
UIのデザインはStoryboardなどのファイルを使用した開発でしょうか。それともコードだけの開発でしょうか。
チケット管理は何でやっていますか?
開発体制(エンジニアとデザイナーの人数)について教えてください
デザインは重視されるプロジェクトでしょうか。
デザインのファイルはPhotoshopのファイルでしょうか。エンジニアも画像の書き取りをする必要がありますか?
パソコンはiMacでしょうか。ノートパソコンでしょうか。
リリーススケジュールは決まっている感じでしょうか。(1/week or 1/2week or 1/month or at random ?)
開発体制はアジャイル開発でしょうか。スクラムを導入していますか?
ライブラリ管理はCocoapodでしょうか。Carthageでしょうか。
使っているライブラリの個数について教えてください
クラッシュ解析は何を使っていますか?
プロジェクトの設計スタイルについて教えてください
サーバーサイドの言語は何でしょうか。Ruby? PHP? C# ?
アプリの画面は1storyboardスタイルでしょうか。それとも分割せずに一つのstoryboardで開発されてますか?
通信系のライブラリは何を使用されてますか?
こんな感じのやり取りをだいたい30分から1時間耐えればエンジニアとして現場に進めることができます。