Diverse developer blog

株式会社Diverse(ダイバース) 開発者ブログです。

弊社エンジニア3人がDroidKaigi 2019に登壇します

id:kikuchy です。

先日DroidKaigi 2019のセッション採択者に通知のメールが送られました。

結果、弊社Diverse(ダイバース)からは、三人のエンジニアが登壇する事となりました! 🎉㊗



以下、登壇する三人の発表内容と意気込みです。
DroidKaigi 2019のセッション選びの参考にしてください。



id:samukei は「PWAでここまで出来る」というタイトルで発表します。

PWAはWebアプリの開発者がスマートフォンアプリケーションも開発できるという可能性を秘めた技術です。

PWAを知らない方には知ってもらうきっかけに、PWAを知っている人にもこんなことまでできるアプリケーションを作れるんだ!
と感じてもらえるようなセッションにしたいと思っています!



id:kmnmn は「実践Lottie」というタイトルで発表させていただきます。
私が担当しているプロダクト Poiboy にて実際にLottieを使って得たメリットやデメリット、デザイナーさんとのやりとりなども含めて共有できたらと思います。



id:kikuchy は『All About Test of Flutter』というタイトルで、
Flutterアプリ開発で必要になるであろう自動テストの始め方をお話します。

にわかによく名前を聞くようになったFlutter。
業務でも使用される例もちらほらと聞こえるようになり、普及してきた様子が伺えます。

しかし、テストは書かれているでしょうか?
また、Flutterアプリケーションに対するテストの知見は一般化されているでしょうか?

私のセッションの内容だけで自動テストを書き始められるようになっていただくのを目標にお話をしたいと思います。



また、DiverseではDroidKaigi 2019へのスポンサー参加を計画しています。

↓ちなみに前回のDroidKaigi 2018では同人誌を頒布して、すぐに当日頒布分がなくなってしまうほどの人気をいただきました!


今回もスポンサー参加の暁にはスポンサーブースで面白いことをできるように画策しておりますので、ぜひ記憶にとどめておいていただければと思います。

DroiKaigi登壇者がたくさん所属する環境で開発をしてみたい方は @kikuchy または他の弊社エンジニアへ、お気軽にDMやリプライをください!
まずはご一緒にご飯を食べにいきましょう!!

書籍『Androidテスト全書』を弊社社員が執筆しました

『Androidテスト全書』のJUnit 5の章(7章)を執筆しました id:kikuchy です。
クラウドファンディング出資者への発送が一段落し、『Androidテスト全書』の一般販売がはじまりました。

peaks.cc


白山さん外山さんと平田さんがすでに概要やそれぞれのエピソードを語ってくださっております。

ここではkikuchyの視点から、本の概要、kikuchyの担当章の解説と裏話をお伝えします。お付き合いください。


本書の概要

  • 第1章 テスト入門
  • 第2章 ユニットテスト実践入門
  • 第3章 ユニットテスト応用編
  • 第4章 UIテスト (概要編)
  • 第5章 UIテスト (Espresso編)
  • 第6章 UIテスト(Appium編)
  • 第7章 JUnit 5
  • 第8章 CI/CD

この1冊で、現在のAndroid開発環境に自動テストを取り入れるためのノウハウすべてが揃います。
なぜなら、テストに必要な概念の説明から、ツールの基本的/応用的な使い方、最新動向、テストを育てて役立てる仕組みまで解説されているからです。

「自動テストいれたいよな〜〜」と考えながらもどうしたら良いのか詳細なイメージが付いていなかった、
ユニットテストはできたけれどUIテストに挑戦してみたい、
そんなあなたに特におすすめの一冊に仕上がっています。


7章 JUnit 5について

kikuchyは7章を担当しました。

Javaを使ったプロジェクトの自動テストには、すでにJUnit系最新のJUnit 5が使用されるようになっています。
が、Androidの界隈では未だにJUnit 4が主流です。

本章ではその理由と、AndroidプロジェクトでJUnit 5を使用できるようにするandroid-junit5 Gradle Pluginを紹介しています。
さらに、JUnit 5で導入された新機能、そして中でも使用頻度が高いであろうパラメタライズドテストについて、ライブラリの使用方法を(Andoridで動かす際の注意事項を含めて)詳しく解説しています。

特にandroid-junit5については日本語で詳細に解説した初めての文章になっていると自負しています。



裏話

ことの成行

発起人の白山さんからお誘いいただきまして執筆に参加させていただきました。

以前にAndroid Test Night #1にて『JUnit5とAndroidのテスト』という発表をしたときの資料をご覧になって、ご連絡くださったようでした。

どんなきっかけでお声掛けいただくか、わからないものですね。
なるべく外部発表などで露出の機会を増やしておくのが、エンジニアの成長戦略の一つとして有効なのだなと再確認した瞬間でもありました。

嬉しかったこと

執筆途中、JUnit 5の新機能の一つ @Tag アノテーションによるテストケースの実行制御が、android-junit5で期待したとおりに使用できないバグを見つけました。
issueを立てて報告したところ、リポジトリオーナーのmannodermausさんがすぐに修正(といってもほぼ新機能追加)をしてくださいました。

以前、Android Test Night #4では「報告した」というお話だけしたのですが、なんと直していただけた、という後日談です。

世界が良くなることに本以外の場所でも貢献できたというのが、個人的に嬉しいエピソードの一つでした。

ありがたいこと

PEAKSのみなさまには誤字脱字修正などで大変お世話になりました。
私は誤字脱字が多く、特に英語のスペリングを間違うことが多いので、あの原稿の中から探し出してくださって本当に感謝しています。

ひつじさん(日高さん)には編集の際に特にお世話になりました。
技術書向きな書き方になおしていただくのを始め、話の順序の入れ替えや、コラムレベルをどうするかなどご相談に乗っていただきました。ありがとうございます。

共著者の白山さん、外山さん、平田さん、堀江さんには相互レビューを始め、途中で励ましていただいたり、様々な部分でお世話になりました。ありがとうございます!



なお、この本の7章は弊社の業務の一部として執筆されました。
平たく言いますと、業務時間を使って執筆をしております。

こうしたことが許可される会社に興味がある方は、@kikuchyならびに弊社Diverse(ダイバース)社員へDMやメンションなどでお声掛けください!

『マッチングサービスの裏側Night』を開催しました

id:kikuchy です。気の利いた時候の挨拶が思いつきませんでした。

去る9/28に、記念すべき初めてのDiverse主催の勉強会を開催しました!
その名も『マッチングサービス開発の裏側Night』!! 🎉 🙌🎊㊗

diverse.connpass.com


マッチングサービス業界のみなさま、他の会社が何を考えてプロダクト作ったり運営したりしているか知りたくないですか?

マッチングサービス業界外のみなさま、こうしたサービス運営の裏側ってどうなっているのか知りたくないですか?

そんな要望をマッチングさせ、マッチングサービス開発の裏側を知ることができる勉強会を開催することとなりました。


始めは25人定員として募集を開始したものの、予想以上の参加者の伸び率だったために、急遽増枠を行いました。
最終的に(直前のキャンセルを除けば)枠はいっぱいになり、実にたくさんの方に起こしいただくことができました。

参加してくださった皆様、ありがとうございます!!


以前からお声掛けさせていただいていたマッチングエージェントさんからも、エンジニアさんお二人にご登壇いただくことができました。

内容は以下のように非常に多岐にわたっています。

  • サービスレベル目標
  • 残されたレガシーシステムの扱い
  • 組織拡充
  • iOSアプリ開発
  • キャリア観
  • Firebase
  • ストアレビュー
  • 業界用語

たくさんの方に楽しんでいただけた一方で、テーマを絞って話を聞きたいというお声も頂戴しました。



id:SAMUKEI は「老舗マッチングサービスとの付き合い方」というレガシー環境との付き合い方についてお話しました。

speakerdeck.com

運営実績の長いサービスの抱えている様々な課題をどのように解決していくか?といった観点の話となります。
その中でも解決に向かいつつある「オーパーツ化したツール」にフォーカスしたやっていき💪を話しました。
他の課題も解決した際にはまた話したいと思います。


@imaizume は「チュートリアル実装の『そこどうしてる?』 Poiboyではこうしてる!」というタイトルで、Poiboy iOSのチュートリアル実装に関するお話をさせていただきました。

speakerdeck.com

チュートリアルの実装における画面定義の分割や、コーチマークの実装で悩んだことのある方もいらっしゃるのではないでしょうか。
今回の発表では、Poiboyでのチュートリアル実装における見解を、コード例と共に述べさせていただきました。
またチュートリアルのデバッグで、現在Poiboyが行っている取り組みについてもご紹介させていただきました。
Poiboyに限らず、各サービスにはそれぞれ最適なチュートリアルがあると思いますので、皆様のアプリにおける実装でもご参考になれば幸いです。




@bomneko_attack は「旅のおわりとはじまり」と題してDiverseに所属し、YYCの開発に携わっている経緯についてお話しました。
所属することになったきっかけはスマホアプリ開発未経験でも開発したくて異動を受け入れてくれるところを探した結果であってマッチング業界に対する興味ではなかったですが、それでも元気にやってます、という内容です。(スライドは一身上の都合により非公開にさせていただきます、)

10年以上運営しているサービスであるため歴史の積み重ねから来る技術的負債がたくさんあり、それを返済しないとサービスの健全な成長を阻害してしまうのでこれから解決していきたいというやっていき💪宣言をしました。マッチング業界にダイレクトな興味がなくてもたくさんのユーザ様にご利用いただいてるサービスに携わってみたい、技術的なチャレンジがしたいなど別の観点の興味から入ってみるのも良いのではないでしょうか!



@giiiita は 「アプリ向けにPopupを爆速実装」というテーマでFirebaseの機能の中の一つ"In-App Messaging"についてお話しました。
スライドに関しましては実演が含まれている内容だったため非公開にさせていただきます。

PoiチームではFireStoreやCloudFunctionsなどすでにいくつかのFirebase機能を使用しているのですが、個人的に注目していた機能についてどういった機能で何が出来るのかについて説明させていただきました。

デザイン面のカスタマイズに条件が付くのを懸念していたのですが、
最近の更新で柔軟にデザインがカスタマイズ出来るようになったのでよりアプリに組み込めるようになってきたのではと思っております。

今後もFirebaseの機能で何か共有出来るものがあれば発表したいと思います!


id:kmnmn は「アプリのレビューが0.1アップした話」をさせていただきました。マッチングアプリのセンシティブなアプリレビューにおいて、エンジニアがした施策とサポートの方に対応いただいた施策に関する話です。
スライドに関しましては口頭ベースで伝えるような簡素なものなので非公開にさせていただきました。
アプリのサービスを行うに伴いどのようにレビューを上げていくかは、様々な企業や個人の方も悩まれているのではないかと思います。
レビュー施策で新しい発見や失敗をした際にはまた共有できたらなと思います。


id:kikuchy は業界用語についてお話しました。

docs.google.com

技術に関係のないテーマではありますが、チームメンバーとコミュニケーションをとって開発を行う上で用語は重要です。
今回はいくつかの用語について、独断と偏見を交えながら解説を行いました。
ご笑納いただけましたら幸いです。

またいつか機会があれば、紹介しきれなかった用語も解説したいと思います。
(特に聞きたいものがあれば@kikuchyに言ってください!)


さて、記念すべき第1回を終えたマッチングサービス開発の裏側Nightですが、早速Diverseの手を離れ、マッチングサービスのエンジニアコミュニティに引き継がれました。

待望の第2回は、11月の中旬〜末に、サイバーエージェントさんで開催されます!
テーマは「クライアントアプリ開発」です。

実はクライアントアプリをテーマにした、マッチングサービスエンジニアによる勉強会のアイデアは弊社以外のところからもあがっており、それを受けて合流することと相成りました。

きっと次回は今回以上の濃ゆい話が聞けるのではないか…という予感があります。
お楽しみに!


これからも、Diverseでは業界の魅力や知見を広めるための活動をしてゆきます。
少しでも興味が湧いた、という方は公式アカウントをフォローしてください!

社内向け資料『KotlinとJavaができる人向けDart速習』を公開しました

id:kikuchy です。

Flutter Meetup #4のときに発表した資料で言及していた、『Dartを学習する人向けの社内資料』を公開しました!

qiita.com


主に現在同じチームで開発しているAndroidもiOSもWebもできるエンジニアに向けて書いたものですが、前提条件に書かれたエンジニアの方なら軽く読んでいただけるものになっているかと思います。


本来はこのブログで公開する予定だったのですが、ここに掲載するにはいささか長過ぎるため、目次が出るQiitaでの公開となりました。
Qiitaアカウントをお持ちの方はいいねをお願いします。

何かと忙しくて公開に向けた作業ができていなかったのですが、やっと公開できました。
関係各所の皆様、ありがとうございます!


DiverseはこれからもOSSコミュニティに還元する活動を続けてゆきます。
OSSコミュニティにフレンドリーな環境でお仕事をしたい方、Flutterでマッチングアプリの開発をしてみたい方は @kikuchy または他の弊社エンジニアへ、お気軽にDMやリプライをください!
まずはご一緒にご飯を食べにいきましょう!!

GDG DevFest 2018 Tokyoで、FlutterをKotlinで書きたいという気持ちのあらわれをお話しました

Flutter Meetupで登壇したその週末にもGDGに登壇しました id:kikuchy です。
準備が大変すぎて大変でした。


GDG DevFest Tokyoは、Google関連のテクノロジを扱ったコミュニティが集まって開催されているカンファレンスです。
毎年開催されており、私は昨年に続き2回目の登壇となりました。
推薦してくださったShibuya.apkのみなさま、ありがとうございます!


https://tokyo2018.gdgjapan.org/tokyo2018.gdgjapan.org



今年は30分の発表枠をいただき、『KotlinでFlutterを書きたい』というタイトルでお話しました。

docs.google.com

現在、私が開発に携わっているyoubrideという婚活サービスでは、クライアント開発にFlutterを採用することが決まっています
が、Flutterの開発言語はDartです。
Kotlinに慣れたAndroidエンジニアの方には少々言語機能が物足りないのではないでしょうか。

私もDartの言語機能に物足りなさを感じたりストレスを感じたりしたので、FlutterをKotlinで開発できないかを検討しました。
その結果がこちらのスライドになります。


現状、KotlinでFlutter開発をするために考えられる手段がいくつかあり、そしてそれぞれに高いハードルがあります。
今の私の知識とスキルではそのハードルを簡単には乗り越えられずまだまだ研究が必要そうでした。
現状、わかっていることを公開して、同じ志の人を増やせないか、というのが、このスライドのテーマでした。


Ask the Speakersのコーナーにもたくさんの方に来ていただけまして、
Kotlin on Flutterの実現に関する議論をする事ができました。

一番有力なのは、やはりFFI経由でDartのライブラリをKotlinから使用することでした。
現状のFlutterではDartランタイムから直接FFIを使用することができませんが、もしかしたら可能にする方法があるのではないか、また、需要を説明してFlutter開発陣に機能を追加してもらうことはできないだろうか、というご意見をいただきました。

また、この手の話題は英語でも公開することを勧めていただきました。
Flutter開発に関わるGooglerの方々は結構Mediumを見ていることが多く、簡単にでも書けば反響があるのでは、ということです。
時間を見つけて、Mediumでも発信していきたいところです。


Flutterでマッチングアプリの開発をしてみたい方は @kikuchy または他の弊社エンジニアへ、お気軽にDMやリプライをください!
まずはご一緒にご飯を食べにいきましょう!!

Flutter Meetup #4をホストしました&発表しました

Flutter Meetup #4のホストをしました、 id:kikuchy です。

Flutter Meetupは比較的新しい、マルチプラットフォームフレームワークFlutterの勉強会です。
第4回目になる今回も、Flutter開発スキルを更に向上できるような充実した内容でした。

flutter-jp.connpass.com



発表については、Flutterをプロダクション導入するに至った経緯とその過程で検討したことなどをお話させていただきました。

docs.google.com

弊社のオンライン婚活サービスyoubrideでは、現在Androidクライアントの改修が計画されています。
そこにチームが現在抱える問題も一緒に解決すべく、Flutterの導入が検討され、本決まりになった、というお話です。

人的リソースはそうそう簡単に確保できるものではありません。
ただ、今いる開発メンバーにスキルがあれば、マルチプラットフォームフレームワークを使う、という選択肢を取ることも可能です。

この選択がどうなるか、究極的なところはわかりません。
もしかすると、将来的にFlutterが流行らなくなってメンテナンスコストや採用コストが高く付くことになるかもしれませんし、そもそもプラットフォーム依存の機能を要求されることが多くなって狙い通りに開発・保守コストを下げることができないかもしれません。

それでも今は、Flutterの未来を信じて、改修を進めたいと思います。
結果がどうなるかは、今後もこのブログをご覧になってお確かめください 😉



開催について。

実はrkowaseさんからFlutterのMeetupを開催したいというお話を伺ってからしばらく経ってからの開催でした。
「しばらく経って」というのが重要です。
なぜなら、そのしばらくの内に親会社がミクシィからIBJに変わってしまったからです!!!

そのためイベントの開催ではいろいろな困難がありました。
困難の一例は、こんなツイートに現れてしまっています。


困難にお付き合いくださいましたミクシィ関係者の皆様、弊社Diverseのお手伝いいただきました皆様、この場を借りてお礼申し上げます。🙇


Flutterでマッチングアプリの開発をしてみたい方は @kikuchy または他の弊社エンジニアへ、お気軽にDMやリプライをください!
まずはご一緒にご飯を食べにいきましょう!!

ROPPONGI.swift #5 にて標準ライブラリだけでスロットゲームを実装した話をしました

こんにちは、完全食COMPを始めてもうすぐ1周年、PoiboyグループiOSエンジニアの @imaizume です。

先日VISITS Technologies株式会社さんにて行われたROPPONGI.swift #5にて、半年ぶりの勉強会登壇をさせていただきました。

visits.connpass.com

 

今回の発表内容は今夏Poiboy内のキャンペーンで表示したスロットゲームの実装についての話になります。

speakerdeck.com


スロットゲームといえば、回転する複数(通常は3つ)のドラムロールが横に並び、ボタンを押して絵柄を止めるゲームのことです。
アプリの画面内で現実世界と同じスロットゲームのUIを実装するとなると様々な要件が発生します。
例えば無限スクロールや中心線での停止、回転速度の調整などです。

様々な実装方法が考えられた中で、自分は最終的にほぼUIScrollviewのみで実装しました。
その詳細についてはSlideShareの方をご覧いただきたいのですが、
無限スクロールは同じリール(絵柄の並びのパターン)を複数用意することで瞬間的にスクロール位置を戻して実現したり、回転速度についてはsetContentOffsetをよしなに設定することで安定した速度を実現しました。

また最終的には、UIScrollViewを継承したクラスを定義しUI更新の処理をカプセル化することで、意外にもシンプルに実装をまとめることができました。
なお発表タイトルに「ほぼ」とあるのは、3つある全てのドラムロールの停止を待って同期的に次のアクションを呼び出す必要があったことから、この部分だけPromiseKitに依存しているためでした。
しかしその結果としてリールや回転数等をパラメータで与えるだけで思った通りの動きを実現でき、理論上何個でもドラムロールを増やすことができる実装となっています。

そのため現在、この実装をライブラリ化して外部に配布することも検討しています。
なお今回の実装はゲームを開始する時点で停止位置やアタリ判定結果は決まっている前提のため、実際のユーザーのアクションで回転を止めるのにどう対応するのかが課題となっています。

スロットゲームを行った結果、キャンペーン期間中はトラブルもなく無事に終了し、ユーザーのアプリ内でのアクションを増加させることにも成功しました。
また今回の実装は時間こそかかったものの、チームメンバーの応援のもと様々な実装にトライできた結果でもあります。

自分の所属するPoiboyに限らず、Diverseには仲間のチャレンジを応援し良いプロダクトを作っていく土壌があります。
そんな組織やチームに興味を持った方は一度お話ししてみませんか?
ぜひ私 @imaizume はじめ、弊社エンジニアへぜひお気軽にご連絡いただければと思います。