iOSDC2017 で Xcode Source Editor Extension について発表してきました

9/15から9/17まで行われたカンファレンス iOSDC2017 にスピーカーとして参加してきました。
カンファレンス会場のWi-Fiのパスワードが `iwillblog` だったので、パスワード打ち込んでしまった都合上ブログを書きます。

発表内容

この発表に出てきたテクニックはすべて、以下のリポジトリで動作するデモアプリ(Extension)として確認できます。

https://github.com/takasek/XcodeExtensionSample

CfP振り返り

iOSDCは、一人いくつでも提出できるCfPの中から当日のセッションが採択されるというシステムになっています。というわけで自分も数撃ちゃ当たる戦法でいくつかCfPを提出しました。

☝️これが大本命でした。WWDC以降、各種振り返り勉強会で意図的にCodableネタを発表したり、Qiitaで「Swift4のCodableに対応した、独自のDecoder(CSVDecoder)を実装してみよう」という記事を書いたりして、その集大成にできたらなあと思っていました。

☝️続いて、割と個人的にこだわりの強いネーミングという分野で知識を整理しておきたいなと思って提出したのがこれ。
まあ2個提出すれば満足ではあったんですが、なんとなく3つくらい出した方が収まりが良さそうな気がして、おまけでもうひとつ、ネタ枠のCfPも出してみることにしました。

正直「今年のWWDC2017では何の新発表もなかった」と言いたいだけ…あっ嘘です、なんでもありません。
ともあれ、どういうわけか実際に採択されたのはこのCfPでした。いや、正直Xcode Source Editor Extension、作ったことないんですけど……。

勉強会駆動勉強

とはいえ採択されたからには、価値のある発表にしなきゃいけません。割と自分は頻繁に勉強会で発表している方の人間ですが、そのモチベーションは9割がた「勉強するきっかけになるから」です。

このツイートは本当にその通りで、今回も、発表内容の3倍の勉強に吸い込まれていった時間は50時間は超えています。これこれ、このきっかけが欲しかったんよウヒヒ。もともとhammerspoonとかKeyboard Maestroとかで作業工程をハックするのが好きなので、Xcode Source Editor Extensionにも手を出してみたかったというのは本当です。

50時間で世界最先端に駆け上る

先述したように、Xcode Extensionの実装経験は正直なところゼロでした。発表できるレベルになるためにはまず調査から始めなければいけません。とはいえやれることは明快です。

  1. 公式の資料を見る
  2. 先人のソースを見る
  3. 自分で試行錯誤して見る

参照すべきWWDCの該当のビデオやドキュメントの数は多くありません。幸い、Xcode Source Editor Extensionのフレームワークそのものは単純でした。

基本がわかったら、あとはGitHubに転がっているExtensionのソースを漏れなく追いかければ、理屈上は、ネットで辿り着ける最先端のレベルには駆け上がれるはずです。Extensionに必ず含まれるクラス名 `XCSourceEditorCommand` でGitHubを検索して、めぼしいリポジトリを片っ端からcloneしました。おかげで、一人だけでは思いつくことができないトリッキーなアイデアをいくつも盗めました。

あとは、自分でやるだけ。ここから先は最先端の領域です。走れば走っただけ、ネットのどこを探しても見つからない独自のノウハウをカンファレンスで提供することができます。誇らしいですね。

そうやって出来上がったのが、今回の資料です。
おかげさまで、今春のtry!SwiftにてApple Watchのテクい知見で会場を湧かせたぎぎにゃんにも評価いただけるような内容に仕上がりました。

構成

今回、Xcode Source Editor Extensionそのものの紹介だけで終わらせるつもりはありませんでした。導入だけのチュートリアルは検索すれば色々見つかりますので。必然的に、発表の焦点は「Extensionだけでは実現できない障壁をどう乗り越えるか」に絞られます。
とはいえ、そもそもExtension自体がほとんどの聴衆には馴染みのないものですから、基本的な説明も省けません。結果、スライドはどう頑張っても100ページから削れない目算になりました。

15分という短い時間で、聴衆を置いてけぼりにしないように100ページを駆け抜けるにはどうしたらいいか。

まず、発表の流れを物語仕立てにしました。導入でかつての自由な世界を印象付け、対比するようにExtensionの現状を(不自由めに)紹介し、後半ではそこからの脱出を一気呵成に描く構造です。
コードの詳細を理解してもらうことは諦め、必要であれば情報へのアンカーだけ置くように努めました。発表用資料ではソースコードの書かれたページはすべて省き、SpeakerDeckへアップロードする資料は別バージョンとして、そちらにソースコードを含めました。「それが技術的に可能である」とさえ伝われば、あとはサンプルプロジェクトを見て詳しい実装に辿り着けるでしょうから。
逆に、少し本筋から外れるとしても「デバッグの方法」などの「知らなきゃ分からない」要素は削らないようにしました。

また、後半のスピードを阻害しないように、伏線張りを意識しました。後半の展開に必要な要素、例えば

  • ExtensionはSandboxによって安全性が確保されている
  • ExtensionはAppに同梱されている

などは、前半のうちに聴衆の印象に残るようさりげなく強調しておくようにしました。

常に最高速でトークが進むことがないよう、ブレイクになるページは意識的に確保しました。特に、聴衆が理解に時間のかかるであろうポイントでは「えっ今のどういうこと」という聴衆の気持ちを代弁するページを作り、一旦立ち止まれるように計らいました。

そして最後に、以上の目的(特に共感面)を阻害しない、あるいは助けになる場合は、積極的にウケを狙っていくようにしました。スベるかもしれない? それなら「わかる人にはわかる」程度の表現に留めればいいのさ!
ちなみに、「壁があったら登るのがエンジニア」「どう登るのか」は、TachibanaKaoruさんのtry!Swiftでの発表が元ネタです。

そして本番

内容がこれ以上削れないと分かったら、あとは喋るセリフを切り詰めるしかありません。
てことで、今回はかなりしっかり台本を用意し、冗長な部分は単語単位で削っていきました。1ページ目のタイトルや自己紹介も、いらんやろって思ったので飛ばしました。
本番では大抵緊張で早口になるとは聞いていましたが、実際、練習では15分20秒が限界だったタイムが、本番では14分程度に縮まり、やれると思ってなかった仕込み(Extensionを使ってXcodeから資料公開ツイートするデモ)までやれました。
お客さんも思ったより多く来てくれたし、ウケも取れました。Twitterの反応を見ても、狙いはことごとく拾ってもらえたようです。よかった……。
ただ、セッション終了後の休憩時間に設けられたQ&Aの存在をうっかり忘れておりまして、次の次の休憩時間にスペースに行ったけど手遅れでした。もし足を運んでくれた方いらっしゃったらごめんなさい……アフターフォローはTwitterにて!😣

発表してよかったこと

  • 皆に褒めてもらえた。ビバ承認欲求!
  • Extensionを作ったことのある人に声をかけてもらえた。ExtensionをRunしても黒いXcodeにプロセスの確立に失敗することがあるんですが、これ、自分だけじゃないんだなと心強くなりました。
  • Xcode8以前のPluginに詳しい人にも声をかけてもらえて、仕組みについて理解を深められた。やっぱり情報って発信すればするほど集まってくるものだなあ!
  • あともちろん、普通にXcode Source Editor Extensionについて勉強するきっかけになれた。勉強するだけでなく、今後ストアやGitHubにもExtension公開していきたいです。(実はiOSDC前に公開できたらカッコよかったんだけど、リジェクト食らってるところです……)

iOSDC全体について

運営と参加者の距離、参加者同士の距離が近いのが何より良いカンファレンスでした。冷房の効きなども、Twitterにつぶやけばすぐに反映してくれる、そんな気軽さ。
「カンファレンスはコミュニケーション」という説明がオープニングでなされていたのですが、運営スタッフの皆さんも参加者もそれを意識して実現しようとしている、そんな空気が心地よかったです。
パックマンルール最高。

来年もまたこの雰囲気を維持・強化していけたら素敵だなと思いました。

余談:採択されなかったCfPの今後

こちら、俺コン(10/210/3)に拾ってもらったのでそっちで発表するよ! よろしくね!