ドメイン知識のキャッチアップの際に行ったこと
こんにちは!こんばんは!
dely株式会社にて、クラシルリワードの開発を行っている、iOSエンジニアのtakkyです!
少しずつ涼しくなり、サウナ後の外気浴が心地の良い季節になってきましたね!!
先日、行きつけのサウナでサウナ→水風呂→外気浴を7セットしてしまいました!(非推奨なので、おすすめしません。)
小噺はさておき、今回は、『ドメイン知識のキャッチアップの際に行ったこと』についてお話ししたいと思います!
概要
9月初旬にCA.Swiftで登壇した際に話した、『ApplovinとKarteを用いた ナーチャリング動画配信システムの実装について』でも「理解度の浅いドメイン知識のキャッチアップ」について少し触れました。その際にドメイン知識のキャッチアップについて、どのような方法を実践したのか気になるという声をいただいたことと、私自身弊社に入社してもうすぐで半年ということもあり、ちょうど良い機会なので、言語化しておきたいと思いこの記事を書くこととしました。
想定読者
- 転職したことで、全く違う分野のサービスのエンジニアになることになった方
- 社内で新たにサービスを立ち上げる際に、特定の領域の専門知識が必要になった方
- 新たな領域のPM職についた方
などなど、『新たに専門知識のキャッチアップが必要になった方』 にご参考にしていただけると考えています!
『ドメイン知識』の定義についての確認
まず、ドメイン知識という言葉自体聞いたことありますか?🧐
wikipediaでは、以下のように定義されています。
ドメイン知識(ドメインちしき、英: Domain knowledge)または領域知識は、はっきり限定された、ある専門分野に特化した分野の知識であり、一般知識またはドメイン独立の知識と対比される。この用語は、例えばプログラミングの一般知識と共に製薬業界に関するドメイン知識を有するソフトウェアエンジニアについて説明したりする目的で、より一般的な分野に関してしばしば用いられる。ドメイン知識を有する人物はしばしばその分野の専門家と見なされる。
引用元: wikipediaより
要は、その特定の専門分野に特化した知識のことです。
私が話すドメイン知識の習得に関しては、今回はこちらの定義に則って説明したいと思います。
そもそもなぜドメイン知識をキャッチアップしたかったのか?
そもそもなぜドメイン知識をキャッチアップしたかったのかを改めて言語化しておきましょう。
- 私自身のバックグラウンド的にも配属されたアプリの仕様に関しての知識はほとんどなかったため
- 弊社では、PoCを繰り返してサービス開発を行うことがほとんどなので、ジョイン初期から爆速かつ正確なサービス作りが求められそのためにはドメイン知識が必須になるため(PoCの説明はこちら)
- (以下でも話しますが、)私が開発しているアプリ内に様々な機能があり、エンジニアは別チームのコードレビューの際にある程度別チームが開発している機能についても知っておいた方が良いため
弊社で必要とされるドメイン知識について
実際に行ったことを話す前に、開発組織の形態について、ご説明させてください。
まず、開発組織について現在クラシルリワードでは、機能開発チームと横断チームに分かれており、機能開発チームでは職能別でチームを作り、機能開発を行っています。
ストリームアラインドチームに近しい形式で、チームが動いています。そして、原則として機能開発チーム内で施策や開発プロセスを全て完結するようにしています。(詳しくは以下)
引用元: クラシルリワードの開発体制について created by funzin san より
機能開発チームに関しては、機能別で(技術改善チームのようなチームを含めると)現在7つほど存在し、さまざまな機能が開発されています。アプリの根幹知識についてはどのチームでも必要ですが、各チームで求められる知識が多少異なるということになります。
そのようなクラシルリワードの開発組織としての特性を理解した上で、ドメイン知識を習得する方法がいかに必要かがわかると思います。
また、私自身が業務を行う上で、求められる具体的なドメイン知識については、以下がありました。
- クラシルリワードiOSアプリ周りの開発業務・設計の知識
- クラシルリワードアプリの機能や全体設計についての知識
- 所属しているアフィリエイトスクラムチームで扱うアフィリエイト案件の特性やその仕組みについての知識
- Bizチームが行うクラシルリワードでの広告運用業務やの知識
- ユーザーの動向を分析するクエリを作成するためのDB周りの知識
入社して全てを並行してキャッチアップしながら、開発業務も並行して行うのは今までもあまりなかった経験なので、全てが勉強になりました!
行ったこと
長くなりましたが、背景としては上記のようなことがありました。
本題の実際にキャッチアップする際に行ったことや心掛けていたことについて話します!
とにかくアプリを触って仕様について理解する
アフィリエイトスクラムチームとしてどのような機能を提供しているかや、アプリ自体の仕様についてのキャッチアップを行うためにアプリをとにかく触ってみました。自社サービスを触ることがざっくり機能の仕様やドメイン知識について知ることの第一歩だったかと思います。
当たり前かもしれませんが、自分が開発するサービスを自分が触らないのであればユーザーがどのような行動をしているのかや何を期待しているのかについても知ることができないので、ドメイン知識を深める以前にこちらに関しては日頃から実施しました。
また、自社のサービスのみを触るのではなく、競合サービスと位置付けられているサービスについても可能であれば、触って機能差分などを確認したりしていました。
タスクのドキュメントを率先して作成する
各スプリントで実装することはプランニングというチームごとの会議で決まります。
基本的には、プランニングで決まったことを1週間で実装し切るのですが、その際に実装する箇所のドキュメント作成を自ら率先して作成することを心がけて、アフィリエイト機能周りの実装についての知識をキャッチアップしました。意図としては、『ドキュメントを作成できる==機能について理解している状況』 であり、ドメイン知識のキャッチアップに近づくことができると考えたからです。
最初のうちは「ドキュメント書いてほしい!」と言われても、何をどの程度書けばいいか分からず、手が止まり右往左往して非常に困っていましたが実装に関わるメンバーに確認しながら、なんとか形になってきて今ではすぐに手を動かし完成させて、要件定義はすぐに済むようになりました!
失敗を恐れず・分からないことを分からないとはっきり言ってしまうことで、既存実装の仕様をすぐに理解できるようにもなりました!
独り言スレッドを立てて言語化してみる
弊社はSlackでやり取りをする文化が根付いており、Slackを色んな場面で活用しています。
その中でも自分は毎朝その日やることを誰でも見れるスレッドに言語化して全てのジャンルの知識について発信していました。
例えば、「調査して分かったこと」や「こうした方が良さそうなこと」をスレッドに連ねていき、このスレッドに仕様についてわからないことを書いたりすると、その領域に関して詳しい誰かがたまに反応してくれたりして、解決したりします。
「わからないけど、相手の時間を取ってまで聞くまでもなさそうだな」ということに関しては、積極的にスレッドにメモしていく感じで投稿して、以下でも出てくる相談にすぐに移行できるようにする側面でも非常に有益でした。
そのスレッド自体も消えるものでもないので、「そういえば以前こんなことで困ったよな?」などの疑問があれば、そのスレッドに戻って確認すれば過去の自分やチームメンバーが教えてくれたりもします。
とにかく言語化してみて課題や問題、わからないことを可視化して1つずつ解決していました。
(※この日は、特に他の方からメンションが来たりはしていませんが...💦)
躊躇せずコミュニケーションを取ってみる
聞いた方が早いというときは躊躇わずに聞きましょう。新規でジョインしたメンバーであれば尚更そんな場面が多いかと思います。なので、調べられることはある程度調べてそれでもわからない時は、「調べたこと」「分かったこと」「分からなかったこと」「ゴール」などざっくり言語化できるようにしてから潔く質問しましょう!(その際に上記のスレッドに言語化しておくことは、相手に相談する際の整理に大変役立つと思います!)
もちろん何でもかんでも、すぐに「教えてください!!」は厳禁なので、最低限自分でできることは調べてから質問すれば、相手も嫌な顔はしないはずです!
また、Google人工知能チームが推奨している15分ルールにもある通り、個人で悩んでも答えが出ないことも多々あると思います。
質問をする際も、「こんなこと聞いていいのかな?」などの恥ずかしい気持ちは最初あったのですが、やはり思い切って聞いてみることでモヤモヤが解消されて、時間を無駄に過ごすこともなくなると思います!
ペアプロ
エンジニアの方限定にはなってしまいますが、ペアプロを行いながらコードベースで使用やドメイン周りの知識をキャッチアップするという方法も有用だったかと思います。この方法では、iOSの仕様周りやクラシルリワードiOSアプリの設計を中心に学びました。しかし、まだ何もキャッチアップできていないドメイン知識や理解度が浅い箇所を対象としたペアプロに関しては、返ってかなり時間をとってしまうと思います。
なので、既に実装し終えた箇所を後日改めて復習する意味も兼ねて、ペアプロするなどのやり方を取ると、コードとドメイン周りの復習にもなりますし、深い理解のあるメンバーからの助言からコードのリファクタリングを行うことができる可能性も出てきます。
ドメイン知識のキャッチアップで行ったことの比較
自分の感覚的な話にはなってしまい、恐縮なのですが行ったことの効果と速度について、以下の図にしてまとめておきます!
横軸はドメイン知識のキャッチアップの効果が早かったかどうかで、縦軸は理解度が深いかどうかです!
どの方法が良かったなど完全に切り離しては評価できませんが、可能であれば並列でいくつか実行しながら、自分に合う方法でドメイン知識のキャッチアップができれば良いかなと思います!
まとめ
いかがだったでしょうか?
自分自身は入社当時は、本右も左も分からない状態で、実装を行うこともあり実装の初速がかなり遅く不安になることもありました。しかし、一周回ってジョインして少しの間は焦らずにドメイン知識をキャッチアップしながら、目の前のことを着実に行っていくことが結局のところ近道になるのだなと改めて実感できました!
また、初速を過度に期待しすぎないスクラムチームメンバーのスタンスにはかなり助かりました!
今後も爆速でインプットとアウトプットを継続して、行っていきたいと思います!
参考資料
Discussion