天の月

ソフトウェア開発をしていく上での悩み, 考えたこと, 学びを書いてきます(たまに関係ない雑記も)

アジャイルカフェ@オンライン 第26回に参加してきた

agile-studio.connpass.com

こちらのイベントに参加してきたので、会の様子と感想を書いていこうと思います。

会の概要

木下さん天野さん家永さんのお三方が、アジャイルに関する色々な悩みに関して話をしていく会です。

今日のテーマは、「アジャイルチームの成長はどう評価する?」でした。

会の様子

テーマに対する前提

今回もやや広めのテーマということもあり、まずは前提を揃えるところからスタートしました。以下、前提として話されていたことを記載していきます。

  • 評価者は、チーム自身, ステークホルダー, スクラムマスター, アジャイル推進者
  • なぜ評価したいかのモチベーションは、評価者自身の指導力を確かめたいというモチベーションや、チームが成長しているかを判断したいというモチベーション、チームの成功やプロダクトの成功に導きたいというモチベーションが挙げられる。

どうやって評価するか?

続いて、state of agileのレポートに記載されているアジャイルの意義に基づいてどう評価するか?という話を聞いていきました。*1

「コラボレーションが増えた」の観点で評価したい場合
  • スクラムイベントやモブ&ペアワークでの発言量
  • 協働して仕事している時間
  • チームから出てくる提案の数
  • ステークホルダーとの会話時間
「ビジネスニーズに合致した開発ができている」の観点で評価したい場合
  • プロダクトバックログの変更頻度*2
  • プロダクトの売上
  • プロダクトのユーザー数
  • レビューのフィードバック数
  • リリース頻度
  • ユーザーがほしいと思ってから使えるようになるまでの時間

会全体を通した感想

指標と言っても、単一的な指標ではなくて複数の観点から指標が考えられていたのがよかったです。

また、教科書にかかれているような話だけではなく、お三方がコーチをしてきて実際に計測をしていてうまくいったような指標の話が多く含まれていたのも、イベントに参加してよかったと思えるようなポイントの一つでした。

*1:state of agileのレポートに記載されている、アジャイルをやっていてよかったという話で上位に上がってきているニーズごとにどのような評価が考えられるか?という話をしていきました

*2:ニーズが変わっていくのが自然なので、多くなるのが理想

『ソフトウェアテストをカイゼンする50のアイデア』読書会を聴く会に参加してきた

connpass.com

こちらのイベントに参加してきたので、会の様子と感想を書いていこうと思います。

今日はP25の「主な利点」からスタートしました。

最大のビジネスリスクとは?

P25の「主な利点」の部分は具体的な例とかがないとなかなか難しいね、という話が出ていました。

ただ、最大のビジネスリスクかどうかはわからないものの、動いているものがある場合は、「絶対XXだよ」と言ってくれると考えやすくなった反論もしやすくなるかもね、と咳さんは言っていました。
また、「絶対」を必ず冒頭につけると「え、絶対じゃないかも...?」と疑えるようになるのもありそうだよねーとmiwaさんもお話してくれました。

一方で、「最大のビジネスリスクを示す」という記述は引っかかるよね、ということで、そもそも最大のビジネスリスクってなんなのかがわからないというお話がありました。

グループとは?

「それを機能させる方法」の「必ず、いくつかのグループに分けて...」のグループはメンバーにあたるのか、ステークホルダーにあたるのか、どちらなのか?という議論がありました。
miwaさんは、開発者などプロダクトを作る人全部が当たりそうだと話をしていて、yoshitakeさんもステークホルダーではないんじゃないの?と捉えたそうですが、それだとこれまでの例で出ていた話の文脈や使い方からはずれるのに違和感があるという話が出ていました。

「常にある/決してない」はドメイン知識のキャッチアップに使う話なのか?

「常にある/決してない」はあまりドメイン知識のキャッチアップに使うイメージはなくて、バグがあるかを洗い出すときに自分たちが常にやっていることに近いイメージがあると咳さんが言っていました。

誤解されやすいリスト

yoshitakeさんからは誤解されやすいリストを作るならそもそも仕組みを直せばいいのでは?という話がありました。
一方で咳さんは、仕組みを直せばいいという外部仕様の話というよりも、「こういうことを期待しがちだけど実はこっちのを期待した方がいいんだ」という話に聞こえるということで、*1仕組みを直すことができない話だと理解しているということです。

加えて、誤解されやすいリストを作って誤解をなくせるというのは最大の誤解だよね、という発言も咳さんからありました。(この部分を読んでいるときに出た話ではないのですが、咳さんからは「誤解って避けるものなんだー」という発言もありました)

テストをやるのは将来?

主要なシナリオを保存してテストを将来やりましょうという話がありましたが、将来やるんじゃなくてすぐにやったほうがいいし、将来やろうとしたときには熱量がなくなってしまうのでは?という話もありました。

咳さんmiwaさんのチームでは将来にとっておくのではなく今すぐやろうとするし、仮にすぐできなくても、いつにやるのか?どんな準備を今からするのか?という話になるということです。(将来やろうというのは気になって気になってしょうがない)

Ideaを通して読んだ感想

「常にある/決してない」全体を通して、受託開発×ドメイン知識が少ない状態で使えそうなIdeaだったね、という話が出ていました。

全体を通した感想

今日も楽しい話をたくさん聞くことができたのですが、「常にある/決してない」の使い所や活用方法を色々考えられたのは、特に面白かったです。

今回はブログには書けないけど参加していた人だけ聞ける面白い話も幾つかあったので、書いてある話が気になる方はぜひ参加してみてください!

*1:例えばクラッシュはしちゃいけないものだと考えがちだけど、ドメインによっては誤った情報が保存されるならクラッシュしてほしいとい...

#RSGT2023 のプレゼンを同時視聴したり、アジャイル系の相談したりに参加してきた

distributed-agile-team.connpass.com

今週も分散アジャイルチームの会に参加してきたので、会の様子と感想を書いていこうと思います。

「エセ自己組織化」症候群から脱却し、約束を守るプロフェッショナルなアジャイルチームになるには -アジャイル時代のマネジメント進化論-の同時視聴

confengine.com

まずはこちらの発表を聞いていきました。

自己組織化に関連すると発表者の方々が考えられている文献を紹介してくれていたり、実際に社内でこれまでにない指標で計測をしてその結果を公開してくださっているのは非常にありがたかったのですが、どういう理由やどういう文脈でそれぞれの文献を紹介してくれているのかがわからず、話のつながりを今ひとつ理解することが自分にはできませんでした。(冒頭でも「今回は時間がないと思います」と話されていたので、時間の都合上このような発表になったのは仕方なかったのかなあとは感じました)

だったら WF でやればいいぢゃない! 〜 ところでホントに WF をご存知ですか? 〜の同時視聴

confengine.com

続いてTommyさんの発表を見ていきました。

本人も言っていたように、プレゼンというよりもエンタメという感じがすごくするプレゼンで、ウォーターフォールにまつわる色々な知識を色々な角度から話しつつも、しっかり笑いに昇華させようという姿勢が節々に見えて、楽しく聞ける発表でした。

個人的にはところどころにあったカレーの写真がどういう理由でチョイスされているのか?がすごく気になったのですが、そのあたりもTommyさんの術中にはまっているのかな?という気がしましたw

最後はTommyさん本人からの解説があって、「色々な発表を聞いているけど、一番面白いのはオレやな」と言っていたのは煽りなしに純粋にかっこいいなあと思って聞いていました。

運用業務とスクラムは本当に組み合わせにくいのか?プロダクトオーナーから見た2つのプロダクトを担当するチームでの試行錯誤の軌跡とこれから / Is there chemistry between Operation work and Scrum? - Path of trial and error in our team -の同時視聴

confengine.com

続いて、nakoさんの発表を同時視聴していきました。

分散アジャイルチームの皆さんは、がしがしと突っ込んだフィードバックもしていくスタイルなのですが、称賛のコメントが止まらない発表で、個人的にもプレゼンの見本とも言えるような発表でした。

プレゼンの構成*1、思考の過程が見事に追うことができる内容、話す言葉の淀みなさや話のテンポ、スライドの構成...本当に完成度が高くて、ほとんど練習せずにぶっつけでこのプレゼンができているのは本当にすごいなあと思いました。

また、Tommyさんに続き、セッションの同時視聴終了後はご本人からの裏エピソードが聞くことができて、楽しかったです。(ほとんど練習せずに挑んでいるという話も裏エピソードを話す会で聞きました)

全体を通した感想

今日は、待っていましたとばかりにみたいセッションが提出されていて、2倍速で聞いても深夜までかかるスケジュールが組まれており、参加者の皆さんにとって待望の会だったんだなあと感じました笑

途中離脱で3本しか聞けませんでしたが、分散アジャイルチームの同時視聴の楽しさをじっくりと味わえたので、すごく満足度が高い会でした!

*1:最初にしっかりと前提やスコープを揃えた上で一貫した話をし続けていたり、濃淡がきれいになっていたり...

大人のソフトウェアテスト雑談会 #143【楽しかったねRSGT2023】に参加してきた

ost-zatu.connpass.com

今週もテストの街葛飾に行ってきたので、会の様子と感想を書いていこうと思います。

コミュニケーションは習わない

Twitterなどをみると驚くほど理解能力が低いリプライをしている人がたまにいて怖くなるという話から、コミュニケーションを習うことがないのでしょうがない面もあるという話が出ていました。

コミュニティの同質性

コミュニティの同質性が高すぎると、あまりにも馬鹿なアイデアが出てもそれを止める人がいて危なくなるという話を、葛飾らしい放送ギリギリの実例や調査結果で話をしていきました。

日本人が主語になる場合

海外の人と仕事をしていると、「日本人って...」というような話をよく聞くけれど、これは自身が変えたくない現実を対象にして話をしている場合が多いという話を聞いていきました。

変えられないことに理由をつけるのは簡単なので、普遍的な事情(例えば年齢や人種など)を理由にしているときは、変化をしたくないと思っているときのエッジ行動の一つとも言えるよね、という話も出ていました。
自身の努力不足と向き合っている場合はまだいいけれど、努力不足に何かしらの理由がついていると危ないのでは?ということです。

方言

の話や北海道弁の話など、方言の話を聞いていきました。
方言の「おささる」や「しらんけど」などは、責任を手放す利点があるよね、という話が出ていました。

知らんけどは便利なんです、知らんけど。とkobaseさんが言っていたのが個人的には面白かったですw

アニメ談義

葛飾恒例のアニメ談義がされていきました。今日は以下のアニメなどが紹介されていました。

magmix.jp

www.youtube.com

www.youtube.com

nights.sega.jp

chainsawman.dog

Ryoさんはチェンソーマンのおかげで難読本の翻訳ができるようになったということでした。

地域のアイデンティティと変な(?)方言

名古屋と三河って違うの?という話から、神奈川と横浜くらい違う、尼崎と大阪くらい違う...その地域に馴染みがある人からするとどれくらい変わってくるのか?の話を聞いていきました。

その後は変な(?)方言の話になり、各地域の様々な方言を聞くことができました。

全体を通した感想

話題のチョイスや移り変わりの速さが久しぶりに葛飾っぽさ全開で、楽しかったです。

ほどほどに学びがある話と葛飾でしか聞けない楽しい話が混じっていたのも印象的でした。

BPStudy#185〜フロントエンドの開発スタイルの変遷とFlutterに参加してきた

※一部ニュアンスが違う部分がありましたので、1/26に修正しました。

bpstudy.connpass.com

こちらのイベントに参加してきたので、会の様子と感想を書いていこうと思います。

会の概要

以下、イベントページから引用です。

フロントエンドが好きじゃなかった私が、Flutterに出会ったことでモダン・フロントエンドに傾倒していく経緯を、WIndows Form, WPF, iOS, Androidの開発を体験した中で感じた「フロントエンドの開発スタイルの変遷」を添えて、お話します。2020年のGW開けからやり始めて「おおお、Flutterすげえええ」となったワケをアツくご説明します。

「Favomatch」というマッチングアプリを開発した中で感じたFlutterの可能性・Flutterアプリの開発のTips等も紹介しつつ、今後Flutterをやろうとしている・もしくはFlutterでアプリを作っていらっしゃる皆さんへ、少しでも参考になる情報が出せればと思います!

登壇資料

speakerdeck.com

会の様子

登壇資料の通りではあるのですが、ざっくりとメモを書いておきます。

フロントエンドの開発スタイル

フロントエンドの開発スタイルとして、GUI型, HTML型, ALL CODE型の型に関してそれぞれ紹介がありました。

GUI

2005-2015年位に流行ったもので、Windows Form, UIkitなどが代表例。再利用性と拡張性の観点で非常につらいことが多い。(UIをツリー構造を使わずに管理する必要がある, if文で表示の差し替えができない, スタイルの共通化が困難, メタレベルのコンフリクトが発生する...)

Windows Formは絶対配置でパーツを作る原始的なやり方。レスポンシブルにならない。イベントハンドラ(コードビハインド)なので、Privateな関数が生成されることになり、やはりコードの再利用性が低い。

UIkitは画面遷移図のようなStroyboardを使い、Storyboardに配置されるUIと関連付けるためにIBを活用する必要がある。*1コードにはかなり癖があり、ViewControllerのライフライクルに合わせてコードを書く必要があるので非常に面倒くさい。
更に、単純な画面遷移を書くのに専門用語や複雑な仕組みを多数覚えないといけない。*2

Auto Layoutの制約もかなり面倒くさい。

HTML型

GUI型のつらさを解消するために開発されたもので、WPF, Android(View), JQuery(html/css)などが代表例。UIがテキストで定義されたのは大きな進歩だったが、ViewModelとViewを追っかけするのはコードが読みにくいというデメリットはある。

WPFXAMLを用いて、データの更新を伝搬させることでUIを更新することを実現する。Bindingを経由することでUI/Model双方向で更新することが可能であり、再利用性はGUI型と比較して高くなっている。
GUi型であったイベントハンドラのデメリットを解消するために、Commandという仕組みを用いて、ViewとViewModelの密結合を解消する。
ただしお作法が面倒くさく、MVVMフレームワークを活用したりしないとすぐにカオスなコードができあがってしまう。

Android(View)は、おおまかに言えばWPFとそこまで変わらない。
onCreateViewがライフライクルメソッドになっていて、ここでイベントハンドラの定義を書く。
ただ、onCreateViewを使ってちまちま書いていくのが辛いというのはあって、ButterKnifeライブラリでアノテーションを用いてViewとバインドできるようにすることが多かった。

ALL CODE型

ロジックやバリデーション、スタイルがすべてコードで書けるため、極めて表現力が高い。Flutter, React, TS, Swift UI, Jetpackなどが代表例。(FlutterはReactの影響をかなり受けている)

UIは最新の状態によって常に描画されるのでUI自体は不変(immutable)であるという思想から考えられた宣言的UI(UI=f(state))がとにかく画期的で、UIで担保しなければいけない動きがすぐに頭に入るメリットがある上、コードなので表示の切り替えもif文で制御可能。
宣言的UIにより、データの更新をUIに伝搬してリビルドすれば、ビューを変化しないまま画面を更新することができる。

Flutterにはまったきっかけ

続いて、今日の登壇者だったござ先輩がなぜFlutterにはまったのか?という話をしてくれました。

ござ先輩は、wasabeefさんのリポジトリに出会ったことで、モダンフロントエンドのエッセンスを一気に学べることができたということで、今までの常識が覆るような衝撃を受けたということです。

github.com

Flutterの状態管理

時間がなくてざっくり駆け足ではありますが、Flutterの状態管理に関して説明がありました。

StatefulWidget

setStateの仕組みを用いることで、WidgetをまたいだUI更新が難しいのが難点。

RiverPod

双方向なデータ更新が可能でキャッシュ可能な特徴がある。

パターンマッチがDartの言語仕様でないので、Whenメソッドを用いたパターンマッチを実現するfreezedが重宝されている。

Flutter Hooks

ReactのHooksにインスパイアされたもので、関数単位で状態管理できる心地よさを覚えるとなぜか知らない間に使いたくなってしまう魔力がある。

Flutterのチャット

flutter_chat_ui, flutter_firebase_chat_coreを使ってござ先輩は実装をされたそうです。
UIのカスタマイズはやりやすいが、バックエンドはflutter_firebase_chat_coreと組み合わせて自分でやる必要があるということでした。

Flutterの広告

admobを使うのがおすすめということでした。

注意点として、UIをビルド→広告を読み込むという実装にすると、広告を読み込む間(1秒)にユーザーが離脱してしまう体験談が挙がっていました。

Flutterのアプリ内課金

まともに実装しようとすると非常に面倒くさい上にベストプラクティスが存在しない領域なので、RevenueCatというアプリ内課金やサブスクのマネジメントSaaSにおとなしく頼ったほうがよいと思っているということでした。

FlutterのLint

monoさんのLintを使いましょうということです。

pub.dev

Firebase

続いて、Firebaseの説明がありました。

Cloud Firestore

Cloud Firestoreは卒業生を多数生み出してしまっているということで、どういう部分がきついのか?という話がありました。以下、箇条書きできついポイントを書いていきます。

  • 比較演算子の利用は1つのフィールドのみ
  • IN句に入れられる要素は10個まで
  • 1つのドキュメントに入るデータは1MBまで
  • 集計関数が存在しない(最近count関数がリリースされるような状態)
  • Select文すらない
  • 制約が強すぎてKVSだけでデータモデリングするのはめちゃくちゃ難度が高い
チャット設計

ユーザー・ルーム・メッセージの3つを使って設計するということです。

セキュリティルール

直接クライアントからデータをCRUDするコードを書く前提になっているということでした。
RBACを期待していると痛い目に遭うので注意してほしいそうです。

Firebase Cloud Messaging

PUSH通知を送ることができるもので、アプリを作る際に必須と言っても過言ではないということでした。

鬼門はバックグラウンドリスナーだということで、iOSでは特に苦戦されたそうです。*3

認証周り

Firebase AuthenticationでSMS/電話番号/メール認証を組み込むことができるということで、比較的簡単に実現ができるというお話でした。

なお、ハマるときは大体コード以外*4に問題があるということで、コードを読んでいくのではなく、SDKへの知識/理解を深めることが先決になるというお話もありました。
ハマったときは、コードではなく、まずドキュメントを全部見て、その後にGithubのIssueを見るのが重要だということでした。

Test

まず、Widget Testでテスタビリティを上げるために、外部接続をWidgetから直接書くようなことは絶対にしない方がいいというお話がありました。

モック化はMocktailを使うと実現できるということですが、Fakeクラスでも充分なんじゃないのか?と思えるそうです。

Widget Testはイベントが適切に動くか?という正常系のデグレ確認に使うもので、UIのデザインレベルのデグレを拾うのにはあまり適していないということでした。

モバイルアプリ開発の難しさ

次に、モバイルアプリ開発のフロントエンド部分の難しさについてお話がありました。以下のような部分が難しさとして挙がっていました。

  • リリースする際はAppStoreなどを経由する必要があるため、即時修正が難しい
  • 実行時例外が発生すると即動かなくなる
  • 端末依存の不具合がある。100人中2人だけ動きません、とかが普通に起きる

モバイルアプリ開発の面白さ

難しさのあとは面白さの話がありました。以下のような部分が面白さとして挙がっていました。

  • コンポーネントを適切に作れば開発者体験とUXを向上できる
  • ヒトの導線を設計する面白さがある
  • アップデートが早い
  • Flutterに関しては、自分の常識が変わって、初めてプログラミングを始めたときのような気持ちで触れた

フロントエンド開発に慣れるために

最後に、フロントエンド開発に慣れるために必要だと思うことについて話がありました。

抽象的な概念のキャッチアップ

似たような言葉でも違う思想を扱っていたりするので、言葉を鵜呑みにせずに、言い換えて自分の言葉で説明できるようにする必要があるということです。

思想を理解する

思想のアップデートが次々に行われる(node→deno, webpack→viteなど)ため、ここに慣れることが重要だということでした。なお、FutterはWebアプリと比べればそこまでアップデートが早くないのは救いだということです。(ただし人気ライブラリはIssueが多い分頻繁にアップデートが入るので注意)

会全体を通した感想

ござ先輩の熱がこもった発表で、楽しく発表を聞くことができました。
歴史の部分から入り、Flutterはどのあたりがこれまでと比べると画期的で面白いのか?という順序で説明をしてくれたので、これまでいまいちありがたみがわかっていなかった部分が、如何にありがたいものなのか?というのが理解できてよかったです。

*1:Windows Formと同じ

*2:数年前の話なのでもっと今はモダンになっている可能性あり

*3:FirebaseAppDelegateProxyEnabled=falseにしないとバックグラウンドリスナーがiOSでは動かなかった

*4:つまり設定

0→1システム開発のPMが経験してきた"PJの進め方"を聞いてみよう【開発PM勉強会vol.17】に参加してきた

peer-quest.connpass.com

こちらのイベントに参加してきたので、会の様子と感想を書いていこうと思います。

会の概要

以下、イベントページからの引用です。

学びが多い!とご好評いただいている #開発PM勉強会 の第17回目!

今回は、新規事業やイノベーション創出を支援する事業共創カンパニー 株式会社Relic様 のテーマ協賛で、ゼロイチのシステム開発PM事例を共有します。

本編では実際に新規事業のシステム開発を牽引しているPMやエンジニア経験者の方々からのLTと、 後半には皆さんからの質問に答えるパネルディスカッションも実施します。

顧客の要求をヒアリングしながら新規システム開発に奮闘する皆さんに向けて、 学びになるノウハウがたくさん聞ける会にしますので、お楽しみください♪

会の様子

レガシーSier社員がアジャイルにDX企画・実装してみた

最初にますださんから、前職でアジャイル経験がほぼ0のメンバーたちが社内のDX企画を任されて実装までE2Eで行った話を聞いていきました。

最初はフレームワークを見様見真似で活用するところからのスタートだったということですが、多様性がある人達が境界なく協力できたことでメンバー全員がDXや企画に対してモチベーション高く開発ができたということでした。

年齢差が離れていても境界なく協働できたのは、メンバーに「スキ」があったのがよかったということで、ある程度弱みが見えるからこそコミュニケーションが取りやすかったのでは?ということです。

コスプレUXで仮説立案がうまくいく

立ち上げたい新規事業の人に「コスプレ」することで、仮説数を増やし、最小コストでできるだけ開発せずに仮説を検証することができるという話でした。

具体的には、インプット(ひたすら知識を詰め込む)→アクション(実際に現場に足を運ぶことで雰囲気を感じる)→イメージ(実際に買い物をしたり「ごっこ遊び」をする)→レビュー(自身の知識を専門家にレビューしてもらう)というステップを踏むということです。

このステップを踏むことで、自分の知識が生きた知識に昇華するだけではなく、実際にニーズがあるのかや世の中に既に何かしらの解決策が存在するか?が分かるということで、失敗を高速にできるようになったということでした。

新規事業におけるプロダクト開発の難しさとRelicで実施していること

最初に、新規事業におけるプロダクト開発の難しを2つの軸で言語化してくれました。

  • 時間も予算も少ない中で、何も決まっていない中で要件定義定義をして作り切ることが難しい
  • 新規事業として市場に受け入れられない

の2点がプロダクト開発では難しいと考えられているということでした。

一点目の「時間も予算も少ない中で、何も決まっていない中で要件定義定義をして作り切ることが難しい」に関しては、事前にかなり細かいヒアリングをするということで、現在の検証フェーズ/検証ポイント, 正式にリリースするまでのマイルストーン, 外部サービス連携, 最終チェックフロー, リリースの定義, 初期リリース後どのように予算を確保するのか?...などを詳細に聞くようにしているそうです。

二点目の「新規事業として市場に受け入れられない」に関しては、価値を届けるプロジェクトと価値を探すプロジェクト*1にまず分類して、どちらのプロジェクトかどうかでアプローチを変えるということでした。
また、新規事業で特にありがちな価値を探すプロジェクトに関しては、

  • 本当に必要なもののみを開発する
  • 費用対効果を考える
  • 開発チームも事業状況を理解する

の3点を意識しているということです。*2

自社プロダクトのPMばかりをやっていた私がクライアントワークのPMをやって気がついたこと*3

クライアントワークのPMをやってみて自社プロダクトのPMと感じたGapを、

  • 工数の余裕は少ない(自社プロダクトでは一定の余裕がある)
  • 要件定義において共通言語の構築からやっていく必要がある(自社プロダクトでは隣の人に気軽に話しかけるところからスタートできる)
  • 納品よりもプロダクトの価値提供(自社プロダクトと同じでプロダクトの価値提供が重要)

の3点から説明してくれました。

まず、工数の余裕はクライアントワークをしているとどうしても少なくなるため、そういった余裕が少ない状況だからこそより精緻に適切に見積もりをして、なぜこのような工数になっているのかを説明することが重要だというお話でした。

次に、要件定義における共通言語の構築ですが、ここでは要件定義三種の神器(画面一覧、ワイヤーフレーム、業務フロー)を活用しているということです。

最後に、プロダクトの価値提供に関しては、「新規事業におけるプロダクト開発の難しさとRelicで実施していること」の発表であったように、詳細なヒアリングシートを活用しているということでした。

パネルディスカッション

発表のあとはパネルディスカッションがありました。以下、質問と回答を一問一答で書いていきます。

休みは取れているのか?
  • 休みは結構取れている(全員)
価値を届ける/価値を探すプロジェクトはリリースまでどれくらいかかるのか?
  • 価値を届けるプロジェクトは3〜6ヶ月が多い。価値を探すプロジェクトは、長くても1〜2ヶ月以内に終わる。
突発的な割り込みによってスケジュールが圧迫する場合どうするのか?
  • 基本的にはスコープを削る
顧客の課題が痛みであると言えるようなポイントは?
  • お金を払いたいかどうか、あるいはお金をどれくらい積んでもいいから解決したいと思っているか?
アンケートで課金したいと答えても実際には答えてくれない場合が多いのだがどのような聞き方をするとよいのか?
  • 今お金を出していることと比較してもらって、どれくらいお金を払えるかを聞いてみる
PMとPLを分業するためのコツは?
  • そもそも分業しないようにすることも多い
  • 業務に関連するシステム群を束ねて統括を置いて、その下にPMを置くみたいなのはやる
仕様確定をどうユーザーに意識させるか?
  • 時期は必ず言う
  • 仕様確定の後に仕様変更が来たときに無理に突っぱねることはしない。これは断るなあというものでも、一度は受け止めて検討する。
POとして成長するためのキャリアパスや勉強するためのコツは?
  • まずはディレクターをやる。ただ、出身によって変えるようにしている(エンジニア出身なら開発系など)
  • エンジニア出身のPOだと縮こまっちゃう感覚はある。(あらかじめ決まっている価値を届けるなら別)
  • 色々な観点があるので難しい。色々なドメイン、色々な本を読んでみるのが重要だと思っている。

会全体を通した感想

色々な業種のPOやPMの方がどのような考え方をしているのか?というのが分かって面白かったです。

特に皆さんがどういう現場を多く経験してきたのか?という部分に関しては、学びになる点が多く参考になりました。

*1:アンケートや仮説によって価値が定義されているものはこちらに含まれる

*2:価値を届けるプロジェクトに関しては今回の発表では時間の都合上説明が割愛されました

*3:当初の予定からタイトル変更があった関係もあって正確なタイトルをメモできませんでした

強いて言えば「集約どう実装するのかな、を考える」会に参加してきた

architect-club.connpass.com

こちらのイベントに参加してきたので、会の様子と感想を書いていこうと思います。

会の概要

以下、connpassページからの引用です。

をテーマに、

  • どういう実装パターンがあるのか?
  • IDDDの本では「集約」を小さくして対応しろ、と言っているが、「集約」ってそんな実装都合で変える概念でいいんだっけ?
  • 「純粋」なものだけをドメイン層としようと頑張れば頑張るほど、ドメイン層が骨粗鬆症にならない?
  • イミュータブルデータモデル視点で見れば、もう少し場合わけして考えれそう。

みたいな、ことを議論したいと思います。

会の様子

導入〜よくあるアイテム追加処理〜

何かしらボタンを押すと商品がAPI EndPointに飛び、認証情報を読んだ上で何かしら処理をすることが多いよね、という話からスタートしました。

この時、よくあるユースケースだと、

  1. ユーザのカートが存在するか確認
  2. 商品のバリデーション(Idが実在する商品でなければユーザに通知して終了)
  3. カートに商品と数量を追加(上限を超える値ならばユーザーに通知して終了)
  4. カートの内容を保存

というようなケースをたどることが多いものの、上記3の上限値が数十万件だった場合*1、メモリにロードすることは非現実的で、この場合どういう設計をするのがよいのか?というのが問題提起として挙がっていました。

ドメインモデルのトリレンマ

続いて、Khorikovさんの記事を参考に、ドメインモデルのトリレンマの説明がありました。

enterprisecraftsmanship.com

の記事に書いてある通り、

の3つすべてを数十万件のアイテム追加処理で満たすことは難しいという話で、上記の中から何かしら一つは犠牲にしないといけないよね、ということでした。*2

トリレンマの具体的な実現方法

トリレンマが具体的にどのように起こるかについて説明がありました。

なお、具体的なコードはkawashimaさんのGithub上にあるので、そちらを参照くださいとのことです。(ただし急いで作ったコードなので直す必要がある部分がちょこちょこあるとのこと)

github.com

完全性+性能を取る場合

完全性と性能を取る場合は、性能の観点からアイテムを追加するために全部のアイテムをロードすることができないため、Read/Writeのモデルを分けてしまうやり方や遅延ロードで実現するやり方*3が考えられるという話が出ていました。

この場合、簡単なものに複雑な仕掛けを作ることになり、アンチドメインモデル貧血症の観点でよろしくないコードになるということです。

純粋性+性能を取る場合

ドメインオブジェクトにDBアクセスを含めないようにする場合は、ドメイン層が外界とやり取りしなくなるため、ドメインロジックがユースケース層に染み出すというお話がありました。

この場合、テスタビリティが上がったように見えてユースケースからテストしないと実際の品質保証観点では無意味になってしまうということです。

完全性+純粋性を取る場合

こちらは具体的な実現方法の説明はありませんでした。(理想論でしかなく業務では使い物にならないため)

トリレンマから分かる教訓

結局、完全性と純粋性の両方を完全に満たすことはできず*4、美しい完全な解決策はないということがわかるという話がありました。

ただ、ここは品質特性上、顧客の利益に直接影響するところではないため、そこまで気にしすぎないほうがよいということです。

高凝集

ここまでの話を前提として、性能を保った状態で少しでも完全性と純粋性のメリットを享受する方法はないのか?という話に移りました。

完全性を取りに行ってドメインモデルが貧血症起こさないように設計すると高凝集になるかと言われるとそれは怪しいということが、kawashimaさんのscrapboxの記事をもとに説明がありました。

scrapbox.io

上記のことから、高凝集を目指すなら複雑さを紐解く必要が出てくる(異なる振る舞いをするものは異なるものとしてみなすべき)と言えるよね、という話がありました。

gihyo.jp

architect-club.connpass.com

aki-m.hatenadiary.com

ドメイン貧血症の解決策で勘違いしがちなこと

ドメイン貧血症の解決策を考える時、どこで定義するかの議論になることが多い*5ですが、同一かどうかの区別*6が重要ではないか?という話がありました。

このことから、何かしらの型があったときに、その型自身に#isValid()を持たせるのはその型がvalidでないことを暗に示しているため、型Aとは別にVaildな型Aの概念を持たせる方がいいだろうということです。(Type Safety Back and Forthでも失敗可能性を後ろに持っていくように話がされている)

Domain Modeling Made Functional

「複雑さ」が異なるものを別の型で表現するという話から、関数型プログラミングドメインモデリングをするというDomain Modeling Made Functionalの話がありました。

「カードの山札」がシャッフルされているかどうかなどで、同じ構造(山札)でも異なる型として表現されているという例が説明されていきました。

www.amazon.co.jp

併せて、冒頭で説明があったアイテムをカートに追加する処理のコード例でも、具体的にどのように実装をしていくといいのかの説明がありました。

martin fowlerのドメインモデル貧血症

kawashimaさん的には、martin fowlerが言っているドメインモデル貧血症の話だけだと、ふるまいが違うクラスが同じクラスとして実装される傾向にあり、複雑さを解消できていないため、そういった部分はバグの温床になるリスクがkawashimaさんの経験上は多いという話がありました。

会全体を通した感想

実際のコード例を組み合わせながらドメインモデルとか集約の話を聞くことができて面白かったです。
前回の複雑さの話とのつながりを感じられて、楽しい時間をすごすことができました。

*1:例えばスタジアムの座席数を管理するようなユースケースの場合

*2:純粋性と完全性をとると性能が悪化する。純粋性と性能を取るとコードの変更容易性が低下する。完全性と性能を取るとテストがしにくくなる

*3:ただし、意図しない場所で遅延ロードされて実行が遅くなるといった事故が起きやすいという欠点があるのでkawashimaさん的にはおすすめできない

*4:性能に課題があるシステムは使いもににならないため

*5:サービス層に定義しすぎるとNG...

*6:「複雑さ」が異なるものを型で表現する。重複が許されるユーザーと重複が許されないユーザーは別の概念として扱う