ヤフー株式会社は、2023年10月1日にLINEヤフー株式会社になりました。LINEヤフー株式会社のコーポレートサイトはこちらです。
当ページに記載されている情報は、2023年9月30日時点の情報です。

2016.10.12

ヤフーのiOS黒帯エンジニア西磨翁が登壇! ~Yahoo! JAPAN MeetUP#2~

こんにちは!人財採用部の干場です。
去る9月7日、第2回目となる「Yahoo! JAPAN MeetUp」を開催しました!
ヤフーには、ある分野に突出した知識とスキルを持っている第一人者を、「黒帯」として認定する制度があるのはご存じでしょうか?今回のイベントテーマ「iOS」の黒帯エンジニアである、西磨翁も登壇した本イベント。一人10分間のライトニングトーク(LT)と、大盛り上がりだった交流会の様子をレポートします♪

実務未経験者がヤフーで生き抜く術とは?

今回LTで発表したのは4名。最初の発表者は中島知。トークタイトルは、「実務未経験エンジニア、ヤフーで生き抜く」。2016年2月に中途採用でヤフーに入社し、現在、Yahoo! JAPANアプリという大規模な開発プロジェクトに所属しています。

この開発プロジェクトは編集・企画、フロントエンド、バックエンドの技術者などを含め、200名の大所帯。2週間に1回のペースで、新機能の追加やUXの向上などをリリースします。

中島はヤフーに入るまで、仕事としてアプリの開発に携わったことはなく、大学卒業後、40名ほどの小さな企業で、セキュリティ製品(脆弱性診断ツール、ベネトレーションテスト)の営業を行っていました。

その後、半年間海外に留学して英語とプログラミングを学び、2つのiOSアプリのリリースを経験、ヤフーに入社。研修課題を通して、Git-Flowを学びます(Commit、Push、Conflictの解消など)。

最初の案件として担当したプロジェクトは入社4ヶ月目。先輩のサポートを受けながら、UML図の作成やテスト会社とのやりとりまで担当し、開発を進めていったといいます。

転機となったのは、6月のある日。Apple社の開発者向けイベント「Worldwide Developers Conference(WWDC)」に行きたいと手を挙げたところ、それが実現。ほぼ未経験でありながら新しい技術を収集してくるというミッションを任されます。

WWDCでは、セッションを聞くことに加え、Appleやさまざまな企業のエンジニアとも話せたことから、営業の経験や英語のスキルが生かせる仕事ができるようになったという中島。

さらに今後は、社内の勉強会、定例会の開催とりまとめや、リリース業務のとりまとめ、開発管理ツールの導入検討、マーケティング施策作りなどで自分のスキルを発揮したいと語りました。

たとえば、ヤフーが毎年開催している「Hack Day」。これは24時間で開発をして90秒で発表するというハッカソンですが、プロジェクトメンバーとして運営にも参加しており、ハックやプログラミングを伝えていくことも自分の役割だと思っているそうです。

ヤフーでは、自分の得意なコトを生かす働き方ができるし、自分の興味があることにどんどんチャレンジできる土壌もある。すごい人ばかりなので毎日刺激があり、開発者にとって非常に魅力的な職場であると締めくくりました。

アプリのユニバーサル化の実現する方法とは?

2人目の発表は、Yahoo!ショッピングのiOSアプリやApple TVのアプリなどを担当している林和弘の、「ユニバーサルアプリの理想と現実」。アプリのユニバーサル化、画面サイズによるデザインの違いについて話しました。

画面サイズの多様化に対応するため登場した、Adaptive UIという考え方。WWDC 2014でiOS8以降のモダンな開発方法として提案されました。WWDC2016では、Adaptive UIのアプリ開発への活用について説明するセッションが行われています。

セッションでは、View同士の相対的な間隔やサイズの比率を設定することで、レイアウトを決定させることができるAuto LayoutというiOS6から使える機能や、スクリーンサイズの違いを抽象化するSize Classなど、Adaptive UIを支えるUIKitの仕組みを紹介。

これらの仕組みを合わせると、一つのViewControllerを使いながら、違った画面を見せるというアプリを作ることができ、Appleが推奨する「型」にはまった形でAdaptive UIが実現します。しかし、実際で関わるアプリはさらに複雑で、さまざまな問題があるもの。そこで、サービスの事情に合わせた、次の様なプラスアルファの工夫が必要です。

●ポイント1:控えめな変更で本質的な違いにとどめること
サービスを提供し続けられるプロダクトを目指す。大原則としてiPhoneとiPadでコードを共有し、極力全デバイス・OSで機能仕様を統一、見た目だけを変える。

●ポイント2:UITableViewからUICollecitionViewでの実装へ変更すること
UICollecitionViewを使用すると、UITableViewよりレイアウトの自由度が高くなる上、複雑な画面をセルに分離できるようになる。

●ポイント3:ViewやViewControllerから画面サイズ依存のコードを切り離すこと
WWDC2016で推奨された方法で、ViewControllerごとにDesign Objectを用意し、stuctやenumを効果的に使いながら、環境の違いをDesign Object内にカプセル化する。

Adaptive UIにより、システム上の定義とデザイナー・ディレクターから見た定義の違いを吸収できるようになります。

エンジニアとしては、iPhone、iPadで同じ機能・サービスの継続的な提供を目指すこと。そのためにはできる限りAppleの強いたレールに乗ることも必要です。

そこから外れる場合は、本質的な変化のみを作ること。そして、iPhoneとiPadの違いをどこに出すか考えること。あまり独自路線に凝ると、将来かなり苦しむので避けることだと語りました。

再申請せずにリリース済みアプリからバグを取り除く方法

3番目の発表者はヤフオク!を担当している山下真一郎で、タイトルは「アプリを再申請せずにリリース済みのアプリからバグを取り除くことができるたった一つの方法」。

これまでヤフオク!はObjective-Cで書かれていましたが、それをSwiftに書き換えるというプロジェクトが発足しており、山下はそのマネージャーを務めています。

ヤフオク!の課題は、星1レビューがなくならないこと。星1レビューの理由の8割は、不具合やクラッシュ。つまり想定外の不具合があると、星1レビューとなってしまい、たとえすばやく対応しても、リリースされるまでは星1レビューは出続けることになります。

そこで、まずは不具合が少ない状態にすること。Appiumというツールを使ってUI自動テスト、ユニットテストを行い、さらに申請の1週間前は画面を徹底的に使いこむ一斉テストを実施。

しかし、iOSは審査が通らないと反映できないため、すぐに不具合を修正し、反映することはできません。また、ユーザーに更新をしてもらう必要もあります。もちろん、アプリ側で強制アップデートを促すことは可能ですが、ユーザーの反発が強くなるので、採用していません。

ほかに方法がないか探したところ、イスラエルの「Rollout.io」というサービスを発見。このサービスを使うと、Appleの再審査を待つことなく、不具合を修正できます。

どんな挙動の変更もできる強力なサービスで、SDKはCocoaPodsでインストールが可能。今回使ったのはObjective-C版で、Swift版もあるものの、現在のSwift版は機能がまだそろっていません(※ 2016年9月末には機能がそろう予定)。ヤフオク!と同じような課題を抱えている方は、ぜひお試しを!

ログ送信処理をソースコードから消す方法

最後の発表者は、iOS黒帯エンジニアの西磨翁。タイトルは、「大量のログを送信処理からサヨナラする」。西はヤフオク!アプリを担当しており、「本気ではじめるiPhoneアプリ作り」という著書もあります。

そもそもなぜログを送信するのかというと、その理由はプロダクトの課題を見つけるのに便利だから。どこでログが途切れたかを見れば、それは一目瞭然です。

では、どんなときにログを送るのかというと、ボタンをタップしたとき、画面を遷移したとき、セルをタップしたときなど。

iPhoneアプリエンジニアとしては、ログの編集処理ロジックを書くよりも、ビジネスロジックに集中したいというのが本音。理想は、ボタンをタップし、画面遷移したら勝手にログが落ちるようになること。

では、どうすればソースコードからログの処理が消せるのかというと、ログ送信する処理を実装したUIButtonを継承したUILogButtonを作るという手もありますが、これも有意義な解決方法ではありません。

そこで、西がおすすめしたのは、iOSの機能を駆使し、Objc RuntimeとSwiftの力を借りるという方法。ちなみにObjc Runtimeは、SwiftやObjective-Cよりもっとコアなところに寄ったライブラリです。

今回は、以下のObjc Runtimeを使ってログを勝手に落とすようにしました。

・Objc_getClassList(クラスの一覧を取得)
・class_addMethod(メソッドを追加する)
・class_getInstanceMethod (インスタンスメソッド取得)
・method_exchangeImplementations(メソッドの入れ替え)

どのように書けばよいか、ライブコーディングしながらソースコードも紹介。

ログの定義を外に出す(JSONファイル)。タップボタンが呼ばれる前に、sendActionという関数が呼ばれるが、その前後にlog_sendActionというオリジナルメソッドを差し込んでいます。

元々のsendActionの処理と差し替えたいlog_sendActionの処理の定義をclass_getInstanceMethodを使って取り出し、その後に、class_addMethodでlog_sendActionを追加して、method_exchangeImplementationsで入れ替えます。log_sendActionが呼ばれると、JSONファイルで設定した値が読み込まれます。

続いて、TableViewの例を紹介。先と同様に、オリジナル処理を差し込むことで対応します。didSelectRowAtIndexpPathのところで、original SelectRowAtIndexPathの処理をJSONファイルに書くことで、勝手にログが落ちるようになります。

そしてプロトコルの実装は、UITabloeViewのところで行い、Objc_getClassListの引数にプロトコルを入れると、このプロトコルを実装しているクラスをすべて検索できます。見つかったクラスに対して、let SwzzledSelectorが定義した型だと処理。自由自在にログを差し込むことができます。

ログ送信処理の識別子はJSONファイルの中で記述。accessbilityIdenetifierはUITなどの識別子にもなるので、これを実装していればUITestingにも使えます。

「こんなことやっていいのか」と考える人もいると思いますが、もちろん、動作を理解した上で使いこなすことが大事。怖い気持ちもあるかもしれませんが、ぜひソースコードからログ出力処理を追い出すことにチャレンジしてほしい、と締めくくりました。

さらに、交流会に参加するヤフー社員として、大西智也と平松亮介2名が自己紹介をも行いました。

休憩をはさんで交流会も実施され、アプリ開発エンジニア同士、みなさん大変話が盛り上がっていましたよ!

「エンジニアはお寿司」というスタッフのこだわりも!

Yahoo! JAPAN MeetUP レポートはいかがでしたか?毎月開催する予定ですので、ヤフーの技術に興味がある、社員と話してみたい、聞いてみたいことがある!という人は、ぜひお気軽にご参加ください♪

関連記事

このページの先頭へ