第2回実践iOSアプリ開発モブプログラミング会についてまとめ


吹く風もどことなく夏めいてきました。@yimajo です。
2018.5.12(土)にiOSアプリ開発をモブプログラミングをする会を開きまして、その報告を書いておこうと思っております。

この文章は、次の第3回目を開催した際に参加を迷う人がこの記事を読むことを想定しています。もしくは、モブプログラミング会を開催してみたい人のために何かしら参考になるように心がけています。

今回も会場は表参道のSansan株式会社さんの13Fスペースをお借りしました。土曜日のお昼から大変感謝です。

今回のモブプログラミング会のテーマ

Swiftでconnpassのイベント検索APIを使ってイベントを検索しブックマークしたりするアプリを作って、その中でasync/awaitを使う。というのが今回のテーマでした。

なぜasync/awaitかというと、クリス・ラトナー氏によるSwift Evolution プロポーザルの下書きにSwiftでのasync/awaitについて書かれていて、それ使ってみたいじゃないですか、先取りしてみたいじゃないですか、というのが発端です。

もちろん、今すぐSwiftのasync/awaitが使えるわけではないので、async/awaitが使える軽量なPromiseのライブラリHydraを使うことにしました。

参加人数

参加人数は次のとおりです

  • 応募

    • ドライバー枠3人
    • モブ枠1(行けるか自信ないけど勢いで参加したい勢、もちろんキャンセルするときはキャンセル処理する枠)2人
    • モブ枠2(積極参加勢、ドライバーがいなかったらドライバーやってみても良い枠)3人
  • 当選

    • ドライバー3人
    • モブ枠1: 2人
    • モブ枠2: 3人
  • 当日実際に参加した人数(参加率100%のドタキャン0でした...!)

    • ドライバー3人
    • モブ枠1: 2人
    • モブ枠2: 3人

なぜモブ枠を分けたかというと、勢いで参加登録したい人と、モチベーション高くて忘れずに参加してくれる確率の高い人を分けたかったというのが理由です。これは参加人数が多い時にブログ枠/Tweet実況枠とかを用意するのと似ていますね。ブログ書いてくれたりツイート実況してくれるというのはありがたいことで、同じようにドライバーになってもいいと参加してくれることもとてもありがたいです。

ただ、抽選方式にしてしまったので参加が確定するまで時間がかかってしまったのが申し訳ない感じがありました。ドライバーになっていいというモブ枠の人なら、先着順で申し込んですぐに参加が決まったほうが予定が立てやすいはずで、これは今後改善出来ればと思います。

振り返り

やってて気づいたこと

conpassのAPIを使うだけでは、非同期はその通信のみであり、async/awaitをそれほど使えないので、ATNDのAPIも呼び出すことにし、結果をまとめて表示することにしました。それだけではまだ足りないので、それぞれのイベントのAPIのレスポンスにあるイベントページのURLにアクセスし、HTMLをキャッシュ化するというお題を急遽付け加えてやってみました。

お題をまとめると

  • connpass, ATNDのイベントの両方アクセスする
  • 結果の中からイベントURLを取得する
    • そのURLにアクセスしてHTMLを取得してキャッシュ化する

というものですね。

URLからHTMLを取得してキャッシュ化しておくというのが少しやっかいですね。

まずHydraはall関数があり、concurrencyで並行処理するmaxを決められるのですが、今コードを見返すと次のような感じでした。


async { _ in
    /* 省略 */
    let promises = events.map(getHtml) // イベントのURLからHTMLを取得する[Promise <(html: String, url: String)>]
    let htmlTexts = try await(all(promises, concurrency: 4))
    htmlTexts.forEach { (html, url) in
        self.cache.setObject(html as NSString, forKey: url as NSString)
    }
}.catch { /*省略*/ }

このコードは、「URLからHTMLを取得する処理」を最大4つまでとしていますが、キャッシュ化するのはその処理が終わった全てをまとめて行っているんですね。

このやり方とは違うやり方の処理をチューニングする案として、「URLからHTMLを取得する処理」をconcurrency: 4にするのではなく、「URLからHTMLを1件取得したらそれを保存する処理」をconcurrency: 4でやったほうが良かったかもしれません(コードを書いてる途中ではそうだったかも)。もしそうだとしたら、正しく動いているにも関わらずチューニングする箇所があり、async/awaitもコードレビューでどこまで見るかというポイントになるのではないかと思っています。

つまり、async/awaitがSwiftの言語仕様に入った場合、最初からうまくやるのは難しいです。処理する量が多くなる場合は直感的に効率を追求してさらに実行して効率的かどうか確認する必要が出てくるのでしょう。

開始時間と開場時間

開始時間設定に開場時間を設定してしまったのが失敗かと思いました。

connpassではイベントの開始時間を設定できるのですが、基本的に会場に入れる時間というのが必ず存在するもので、その時間をconnpassの開始時間に設定してしまうと、会場に入れますよという時間に間に合うように頑張って来てしまう人と、イベント内容に書かれているタイムテーブルどおりの本当の開始時間丁度に来る人に分かれてしまうんですね。

大抵自分はタイムテーブルの時間をチェックしてぎりぎりに行ってるような習性があるため、connpass開始時間設定を開場時間にしておけば、遅れても大丈夫だし良いだろうと思ってしまってました。

ですので、開始時間は本当に開始時間に設定して、イベント内容のタイムテーブルで会場に入れる時間を書いておくのがいいと思います。

懇親会はコードを見ながら

ありがたいことに、今回はスポンサーのSansan株式会社さまから会場だけでなく夜ご飯と飲み物の提供もしていただけることになりました。おかげで会場でソースコードを表示しながらご飯を食べて意見を交換するという懇親会が可能になりました。

前回は外に食べに行って酒を飲みすぎたもので、あまりコードについて話せなかったため、今回はテーマを掘り下げつつ懇親会ができたんじゃないかなと思います。

自己紹介はすぐにしないが、しないままでは自己紹介するのを忘れてしまう

開始と同時に自己紹介をせずに懇親会で自己紹介をするほうがいいんじゃないかと思ってるんですが、懇親会始めてしまうと食べ物が並ぶので自己紹介するの忘れてしまう。もっといいタイミングがあるんじゃないかというのを模索中です。

ドライバーはコードを書く前に自己紹介できたら心理的に安心して良いのかもしれません。

自己紹介考えるのは難しい

いつも思うんですが、そもそも自己紹介が得意という人は少ないのではないかと思います。何を説明すれば自分の紹介になるのか全く見当がつかなくて、手探りで思いついたことを話すのでとりとめもなくなってしまう。なので、運営の自分があらかじめ知ってる人ならばその人のことをもう少し説明するっていうのが良さそうかなと思いました。まあ例えば「この人はポッドキャストやってる方です」とかそういうのがあれば、本人の口からきっかけを聞きたくなるわけです。そういうふうに好奇心が湧くような自己紹介ができるように最初に考えておくのがいいかもしれません。

まとめ

モブプログラミング会は発表が必要な勉強会ではないので、事前に資料を作ってくる必要がないというのはやはりコストが低くて良いです。手探りでライブラリなどを使ってみる、そして周りの人がドキュメント読んで手探りでアドバイスするので案外なんとかなるものです。さらに言うと、そのときのやり方が悪かろうが仕事でやる時にもっとうまく設計できれば全然問題ないわけです。

次回やると良さそうなテーマは

  • RxSwiftでTodoもしくはconnpass&ATNDのイベント検索アプリを作る
  • ReactiveCocoaでTodoもしくはconnpass&ATNDのイベント検索アプリを作る

とかが良さそうですが、

  • Swift for Tensorflow
    • カメラロールの画像の中から笑顔の写真を見つける、等
  • サーバサイドSwift
  • connpass&ATNDのイベント検索できるmacアプリを作る

などであれば変化球が効いてて面白そうです。