ぱと隊長日誌

ブログ運用もエンジニアとしての生き方も模索中

デブサミ2019夏「【A-1】愛されるプロダクトをつくるエンジニア組織とは」聴講メモ

はじめに

Developers Summit 2019 Summer (Developers Summit 2019 Summer)
愛されるプロダクトをつくるエンジニア組織とは――「テクノロジー」「開発プロセス」との緊密な関係
スピーカー:及川 卓也 [Tably]
の聴講メモです。

Twitterのつぶやきがtogetterでまとめられています。併せてご参照ください。
デブサミ2019夏【A-1】愛されるプロダクトをつくるエンジニア組織とは――「テクノロジー」「開発プロセス」との緊密な関係 #devsumiA #devsumi - Togetter

【参考】としている個所は私が挿入しています(補足や参考資料など)。登壇者の講演内容ではありませんので、その旨ご了承ください。

聴講メモ

個人で起業した。
Tably – テクノロジーによる課題解決と価値創造

現在は技術・製品・組織を軸にコンサルティングを行っている。
製品という軸では、どうしたらプロダクトをユーザが使ってくれるかを考えている。力を入れている分野でもある。
技術・製品のいずれも人が重要となる。組織の大きさに合わせて一緒に課題を考えていく。例えば、スタートアップであれば採用戦略を一緒に考える。大きくなった組織であれば評価なども一緒に考えている。

(及川さんは)愛されるプロダクトという視点で考えるようになった。

Product Manager Conference 2018 のテーマは「愛されるプロダクトを創ろう」だった。
プロダクトマネージャー・カンファレンス 2018

リーン開発の用語で MVP (Minimum Viable Product) が有名だが、海外では MLP (Minimum Lovable Product) が広まりつつある。


【参考】

MVPとMLPの違いを端的に説明した記事がありました。
もうMVPでは通用しない。これからはMLP(Minimum Loveable Product)の時代だ! - 小さなごちそう

MLPを用いたデザイン手法を採用している、Goodpatch Berlin の Boris Jitsukata 氏へのインタービュー記事はこちらです。
MLP(Minimum Lovable Product)を用いたプロダクトデザイン手法 | Goodpatch Blog

なお、"loveable" と "lovable" のどちらが正しいスペルか?ですが、「小学館 ランダムハウス英和大辞典第2版」では両方掲載されており、同じ意味であるとしています。ここではスペルチェッカーの結果なども踏まえ、"lovable" を採用しました。


"ALL THINGS MUST PASS" はタワーレコードの繁栄と衰退を描いた映画だ。
米国タワーレコードのドキュメンタリー映画『オール・シングス・マスト・パス』DVD発売 - TOWER RECORDS ONLINE

今や、レコード屋が減っている。アナログ(レコード)からデジタル(CD)へフォーマットが変わった。次に、iPod, iTunes のような携帯の時代が来て、さらにサブスクリプションの聴き放題が現れた。このように価値が 所有 → 利用 → 体験 へと変化していった。

若い方はお金を持っていることに価値がなくなってきている。昔は「いつかはクラウン」と言われた時代があった。だが、今は車の所有に対する価値が減っている。所有より体験のサービス化の時代になっている。

この価値観の変化はウェブの存在、そしてスマートフォンがさらに後押しした。

ウェブコンテンツにお金を払うという感覚が無い。少なくとも入口ではお金がかからない。だから、マネタイズを考える必要が出てきた。
この考えが(及川さんが働いていたころの)マイクロソフトの時代にはなかった。製品を売ればよかった。だが、Googleの時代にはウェブでどう収益化すればよいかを考えるようになった。

製品は売ったらそこでユーザとのつながりが切れる。でもサブスクリプションやアプリ内課金は使い続けてもらわないといけない。そのためにはユーザに好きで使ってもらわないといけない。ユーザの選択肢は膨大。だから愛されないといけない。

スマートフォンアプリを出せば使ってもらえるというのは幻想だった。認知してもらい、インストールしてもらい、起動してもらい、使い続けてもらい、紹介してもらわないといけない。
これをAARRRモデルという。


【参考】
AARRRモデルについての説明があります。
グロースハックに重要なAARRRモデルで最も勘違いされがちなこと | リブノバ

不確かなものを確かにする。
同世代でも価値観が違う。マスをターゲットに売るという手法が通用しない。

仮説を立て、素早く検証することを繰り返す。これがリーンの考え方だ。
スタートアップは成功するまでに資金枯渇のリスクがある。それまでに良いトラクション、つまりユーザ獲得の証拠が必要となる。例えば、物を作らず仮説を立ててユーザヒアリングを行う、ペーパーモデルを作って試してもらう、など。

アジャイルとは設計と実装を一体化し、手戻りを許される制御された環境下でサイクルを繰り返すことだ。

DevOpsについて。開発と運用の関係は開発プロセスの進化によって変わってきた。
Windowsなら工場出荷に向けたリリースが終われば、次の製品プランニングまで一息つける期間があった。
だが、Googleでは全く変わった。ユーザーの利用状況がリアルタイムにわかる。使われていない機能があればそこから仮説検証を繰り返して改善していく必要がある。

Windowsのようなエンタープライズ製品はユーザの話を聞きたくてもシステム担当者を介することになり、エンドユーザーに直接ヒアリングすることができなかった。
DevOpsではユーザの利用状況をヒアリングしながら開発サイクルを回す。

日本は真面目に型を学ぼうとする。
Microsoftウォーターフォールを極めたような会社だった。Googleであっても完全にアジャイルしていたわけではない。ここから言えるのは型が重要なのではなく、その中にある魂ということだ。

今やプロダクトは事業と等しくなっている。
また、エンジニア・デザイナー・マーケティング・サポートなどのマトリクス型チームになっている。

プロダクトマネージャーはプロダクトの成功に責任を持つ。「何(WHAT)を」作るかを決定する。「何故(WHY)」「いつ(WHEN)」作るかも決める。
プロダクトマネージャーはプロダクトチームのCEOといえる。ただし、人事権はない。チームの糊のような存在であり、足りないことは何でもやる。
プロダクトマネージャーはプロダクトの成功に責任を持つ。技術に精通している必要はあるが、作り方を決めてはいけない。それはエンジニアの責任になる。
プロダクトマネージャーは高い志が必要だ。

エンジニアリングマネージャーは自分が製品に貢献するより、組織として貢献することを優先する。

エンジニアはプロダクトを技術的に実現することに責任を持つ。「どうやって(HOW)」に責任を持ち、アイデアを実現させる。

プロダクトマネージャー・エンジニアリングマネージャー・エンジニアは別の職種だ。他の職種に移るのは異動に等しい。
職種を明確にするのをジョブ型雇用という。
これまでの日本はメンバーシップ型雇用だった。今はジョブ型雇用へ徐々に移行している。


【参考】
ジョブ型・メンバーシップ型の一つの定義として資料から引用します。

「ジョブ型」:職務、労働時間、勤務地が原則限定される。欠員補充で就「職」、職務消滅は最も正当な解雇理由。欧米アジア諸国すべてこちら。日本の実定法も本来ジョブ型。
「メンバーシップ型」:職務、労働時間、勤務地が原則無限定。新卒一括採用で「入社」、社内に配転可能である限り解雇は正当とされにくい。一方、残業拒否、配転拒否は解雇の正当な理由。実定法規定にかかわらず、労使慣行として発達したものが判例法理として確立。

https://www.kantei.go.jp/jp/singi/keizaisaisei/bunka/koyou_hearing/dai1/siryou2.pdf


上位エンジニアの役割にテックリード(TL)がある。後輩の育成や採用への協力など。
エンジニアだが、例外的にエンジニアリングマネージャーの一部を兼務することがある。少数のメンバーをマネジメントするなど。

マネージャーはエンジニアを評価せねばならず、そのためには技術のバックグラウンドも必要となる。


【参考】
講演では職能別組織・事業部制組織・マトリックス組織の話が出ていました。以下の資料が参考になります。
http://www.waseda.jp/sem-inoue/file/org2011/(17)Functional&divisional2011.pdf

ジョブディスクリプションを作成したほうがよい。やるべきことを文章化する。
ただ、最初は抜け漏れが起こりやすい。なので、リバースエンジニアリングのように、今やっていることから書き出すことも組み合わせたほうがよい。

多能工か単能工か。
全ての業務を少しでも経験することが必要だ。例えば運用経験が開発に生きてくる。

スクラップ&ビルド。壊れないシステムではなく、すぐに復旧できるシステムを目指す。

ドキュメントもよいが、陳腐化するリスクがある。それよりもコードで記述する。

身の丈に合わない開発をすると運用できなくなるケースがある。
そうしたものを省いていった結果がSaaSなどにつながる。

マイクロサービスは各サービスを好きに作って良いというわけではない。共通基盤や規律をベースに作る。自由というより柔軟性だ。
そこからプロダクトとして何を産み出せるかを考えないといけない。

プロダクトマネージャーは事業サイドと開発サイドの調整役ではない。事業サイドと開発サイドの間に対等な関係を作らねばならない。

愛されるプロダクトのため、プロジェクトマネージャーが企画を温めるだけでなく、チーム全員が考えないといけない。

コードの1行ごとに事業やユーザに対してどんな価値を生み出すかを考えないといけない。エンジニアの自己満足ではいけない。

発表スライドより。

コードの向こうにユーザーを見る

「事業部門に属するメンバーの職務は、全員がまったく同じであります。それは製品を出荷することです。コードを書くことでも、テストをすることでも、仕様書を書くことでもありません。製品を出荷することが仕事なのです。コードを書こうなどと考えることすら避けるべきでしょう。コードを書かずに稼げるのであれば、是非そうしたいものであります。」
Microsoft VP Chris Peters氏

「自分が書いているコードの価値がどこにつながるのかを考えてみようということです。社内のスタッフの作業が効率化するとか、ユーザーに違う体験を与えられるとか。必ず何かにつながっている。目標を決める時に、その技術を使うことでどんな価値につながるのかを考えてもらうようにしています。」
WAmazing 共同創立者 CTO 舘野祐一氏

日本のエンジニアにはユーザにプロダクトを愛してもらいたい、という情熱が少ない。
自分の製品を使ってもらえてうれしいという体験をしてほしい。それがエンジニアのパッションにつながる。

ユーザに愛し続けてもらえるプロダクト作りを目指して欲しい。

Database Concurrency Control Papadimitriou 読書会 第3回 議論メモ

勉強会について

Database Concurrency Control Papadimitriou 読書会 第3回 - connpass の議論メモです。

自分のメモをベースにまとめています。発言の聞き間違い、解釈違いの可能性があることをご了承ください。

特記の無い引用は本で議論した箇所を示しています。

Theory of Database Concurrency Control

Theory of Database Concurrency Control

今回は以下の本も参照しています。

組合せ最適化 第2版 (理論とアルゴリズム)

組合せ最適化 第2版 (理論とアルゴリズム)

[memo]は私のメモです。勉強会で議論された内容ではないことにご注意ください。

APPENDIX

Algorithms and Complexity

"instance" の定義は以下を参照のこと。

定義 15.7 決定問題 (decision problem) は、多項式時間で決定できる言語 X とその部分集合 Y ⊆ X の対 Ρ = (X, Y) として定義される。X の要素を Ρ のインスタンス (instance) という。Y の要素が yes-インスタンス (yes-instance) であり、X\Y の要素が no-インスタンス (no-instance) である。
組合せ最適化 第2版 理論とアルゴリズム 15.3 PとNP

directed graph を adjacency list (隣接リスト)で表現し、決定性チューリングマシンによって非循環であるかを判定できるかを考えていく。

Figure 1.3(a) を adjacency list で表現した例が以下に示されている。
v1(v2,v4);v2(v3);v3(v4);v4(v2)


[memo]
隣接リスト - Wikipedia

"Instances are represented as strings over some alphabet." は以下の説明に対応する。

以下では、入力は2進文字列として一定の効率的な符号化がなされているものと仮定する。もちろん、ときにはこのアルファベットに別のシンボルを加えて拡張することもある。
組合せ最適化 第2版 理論とアルゴリズム 15.3 PとNP

directed graph でインプットの無い node を削除していき、node が全て無くなれば非循環であり、削除できる node が見つからなければ循環がある。
このアルゴリズムは Proposition 1.1 と対応している。

Proposition 1.1: A directed graph is acyclic if and only if its vertices can be ordered so that for all arcs the tail comes before the head.


[memo]
このアルゴリズムを Figure 1.3. の adjacency list に適用します。
adjacency list のいずれの () にも含まれていない node を削除していきます。

Figure 1.3(a)
v1(v2,v4);v2(v3);v3(v4);v4(v2);
v2(v3);v3(v4);v4(v2);
⇒これ以上は削除できないので循環有りと判定されます。

Figure 1.3(b)
v1(v2,v4);v2(v3,v4);v3(v4);
v2(v3,v4);v3(v4);
v3(v4);
⇒全て削除できたので循環無しと判定されます。



NP-Completeness


[memo]
比較的信頼度が高いと思われるWikipedia及び大学のサイトで公開されているNP完全に関した資料を集めました。

言葉の定義はWikipediaで確認できます。

NP (Non-deterministic Polynomial time)
NP - Wikipedia

非決定性チューリングマシン (Non-deterministic Turing machine, NTM)
非決定性チューリングマシン - Wikipedia

NP困難 (NP-hard)
NP困難 - Wikipedia

NP完全問題 (NP-complete problem)
NP完全問題 - Wikipedia

充足可能性問題 (satisfiability problem, SAT)
充足可能性問題 - Wikipedia

Wikipediaの説明の補足として以下の資料が参考になります。
※所属は資料に記載の時点となります。

アルゴリズム入門(7)(問題の複雑さ)(京都大学・宮崎 修一)
http://www.lab2.kuis.kyoto-u.ac.jp/~shuichi/algintro/alg-7s.pdf

P, NP, NP 困難, NP 完全(東京大学・田浦 健次朗)
https://www.eidos.ic.i.u-tokyo.ac.jp/~tau/lecture/computer_software/gen/slides2/10-np-complete.pdf

計算複雑性にまつわる 10 の誤解(電気通信大学・岡本 吉央)
http://dopal.cs.uec.ac.jp/okamotoy/PDF/2013/complexity10confusions.pdf



The problem with these two algorithms is that they are too inefficient; both require a number of steps that is an exponential function of the length of the input.

inefficient = exponential と対応している。

NP complete の問題でも特殊なケースに限定し、2SATの問題にする(2SATは NP complete でない)、という手もある。

NP complete といえれば、現状で効率の良いアルゴリズムが見つかっていないともいえる。つまり、問題に真正面から取り組むのではなく、別の道を探すための理由となり得る。

2.1 INTRODUCTION

Certainly that any serial schedule is correct

順に実行したものが correct だとしている。

A schedule is correct if it is equivalent to a serial schedule.

では順に実行したスケジュールと何をもって比較して正しいと判断するのか?

2.2 FINAL-STATE SERIALIZABILITY

Definition 2.1: Let s and s' be schedules. We say that s and s' are final-state equivalent if
(a) They involve the same transactions, and
(b) For each interpretation I = {(D,Fi)} of s (which is at the same time an interpretation of s' by (a) above) and all choices X ∈ Πx∈EDx of initial values for each entity in E we have s(I,X) = s'(I,X).

(a) s と s' でオペレーションが同じ。
(b) D は domain。F は function。X は初期値。I は P8 Definition 1.3 を参照のこと。


[memo]

Definition 1.3 はエルブラン・セマンティクスに対応している。
step a が R(x) であれば、a の直前に書かれた W(x) の ws(I,X) と等しい。
write がなければ最初の初期値を読む。
write がそれまでの read に依存している。

Database Concurrency Control Papadimitriou 読書会 第2回 議論メモ - ぱと隊長日誌


"augmented schedule of s, denoted ŝ" とはスケジュール s にトランザクション A0 と A を追加したものだ。A0 は各エンティティの初期値を設定し、A は最後に各エンティティを read する。

MV だと r は単一バージョンのみ read 可能、もしくは全てのバージョンを read 可能と考えることができる。ここで全てのバージョンを read 可能とすると、MV では成立するが 1V では破綻する。この互換性の無さが悩ましい。

Hadoop で実現しているような大きいレイテンシーでの理論はあるが、数百コアの Rack Scale Architecture のような低レンテンシーで使える理論がない。


[memo]
RSA(Rack-Scale-Architecture) - 急がば回れ、選ぶなら近道


(a) If ai and aj are steps in the same transaction with i < j, ACTION(ai) = R, and ACTION(aj) = W, then we add the arc(ai,aj) to A. These arcs denote dependencies within the same transaction.
(b) IF ai and aj are steps in different transactions, with ACTION(ai) = W, ACTION(bj) = R, ENTITY(ai) = ENTITY(bj), and ai is the last step in ŝ before bj which writes ENTITY(ai), then we add the arc(ai,bj) to A. These arcs denote dependencies across transactions.

(a) 同一TXの write はそれ以前の read に依存しているので、read → write に線を引く。
(b) 異なるTX間では最後に write されたものを read するため、write → read に線を引く。

Finally, from D(s) we construct the directed graph D1(s) by deleting all nodes of D(s) from which no step of A can be reached.

D(s) は全て含む。D1(s) は最後 (A) まで到達しなかったノードを除く。

TX理論では write がそれ以前の read に依存するとしているが、実際には依存が無ければそれを分けて考えることができるはず。例えば同じTXで w(x) が r(x) のみに依存し、w(y) が r(y) のみに依存しているとすれば、この2つは別の処理をしているとみなすことができる。
(1) r(x) → w(x)
(2) r(y) → w(y)
だが、これを2つに分けて理論で扱うのは難しいので、
r(x)r(y)w(x)w(y)
のように1つのTXでまとめているのではないか?

オンラインのDBにおいて、FINALとはいつなのか?SILOであれば40msの間隔でFINALを定義できる。

関連記事

The Theory of Database Concurrency Control - nikezono
中園さんの読書メモ。

Database Concurrency Control Papadimitriou 読書会 第2回 議論メモ

勉強会について

Database Concurrency Control Papadimitriou 読書会 第2回 - connpass の議論メモです。

自分のメモをベースにまとめています。発言の聞き間違い、解釈違いの可能性があることをご了承ください。

特記の無い引用は本で議論した箇所を示しています。

Theory of Database Concurrency Control

Theory of Database Concurrency Control

[memo]は私のメモです。勉強会で議論された内容ではないことにご注意ください。

1.2 THE MODEL

Schedules

スケジュールは複数のトランザクションをまとめたもの。log や history と呼ばれることもある。


[memo]
Schedule と History を区別する場合もあります。詳細は以下の記事を参照ください。
History - nikezono

if A = a1a2a3a4 and B = b1b2b3 are transactions, then s = a1b1b2a2a3a4b3 and s' = b1b2a1b3a2a3a4 are schedules.

s も s' も subsequence (A, B) の順は維持している。

If s is a schedule involving the transactions A1, ... , Ak, then an interpretation I of s is a k-tuple of interpretations Ij = (D, Fj), all with the same choice D of domains for the entities.

read や write は F で定義できる。Definition 1.2 を参照のこと。
Dに添字がないのは各エンティティの取り得る値が固定と言うこと。

Definition 1.3 はエルブラン・セマンティクスに対応している。
step a が R(x) であれば、a の直前に書かれた W(x) の ws(I,X) と等しい。
write がなければ最初の初期値を読む。
write がそれまでの read に依存している。

read せずに write することをエルブラン・セマンティクスでどう表現するのか?read しているけどその結果を無視すると解釈するのはどうか?もしくは r1, ... , rk の k が0である空集合とすればよいのでは?


[memo]
エルブラン・セマンティクス(Herbrand Semantics)理解メモ - ぱと隊長日誌

read せずに write することについては初期値と同様に表現できると考えています。
つまり、
Hs(w0(x)) = f0x()
この式で表せることになり、「k が0である空集合」と考えて良いのではないかと思われます。


トランザクション間に依存関係があるときはどうするのか?前回(Theory of Database Concurrency Control Papadimitriou 読書会 第1回ノート - Yabu.log)の "hidden restrictions と Transaction chopping" の議論にあったように、そのようなトランザクションは一つにまとめなければいけない。
アプリが consistent を保証しなければいけない。これについてはDBが面倒をみない。"each transaction is correct" とはそういう前提がある。

nested transaction が実現可能であれば、SAVEPOINT は不要になる。ネストしたトランザクションの commit は pre-commit のように扱われる。最も外側のトランザクションが rollback されたら、全て rollback となる。

ネスティッドトランザクションとは,トランザクションをネストさせることができるモデルです。トランザクションをネストさせると,部分的なロールバックができます。一つの大きなトランザクション処理を幾つかの処理単位に分割し,ある処理単位が失敗した場合に,その処理単位だけを部分的にロールバックして代替処理を行い,全体のトランザクションをコミットさせます。このため,部分的な障害をトランザクション全体に影響させないようにできます。
(中略)
サブトランザクションロールバックすると,先祖のトランザクションの意思に関係なく,そのサブトランザクションで行った処理はロールバックされます。サブトランザクションがコミットした場合,その時点では実際にコミットするかロールバックするかは決定されないで,そのサブトランザクションの先祖の意思にゆだねられます。すべての先祖がコミットすればそのサブトランザクションもコミットされますが,先祖のうち一つでもロールバックした場合はそのサブトランザクションロールバックされます。したがって,あるトランザクションが完了(コミットまたはロールバック)するには,そのすべての子トランザクションが完了していなければなりません。

トランザクションモデル

神林さんの実体験として、数分程度で終わる処理なら一気に実行し、ダメなら rollback してやり直す。でも、数時間単位でかかる処理なら中間状態を保持しておき、ダメならそこに戻したりする。全体を rollback すると時間がかかりすぎたりするため。

単一のトランザクションとはスケジュールの特殊なケースだ。

アプリがトランザクションの実行する順序を守りたいなら、それはアプリが保証しなければならない。DBは関知しない。

"all serial schedules" とは正しい状態が複数あることを指している。実行のたびに結果が変わることもありうる。

Schedulers

スケジューラの仕事は correct schedule を作ること。最も単純なのは全てのトランザクションをためておき、シリアルなスケジュールにすればいい。ただ、これは最悪のケース。
では、良いスケジューラとは何か?実測ではなく、理論的に定式化したい。papa本5章で評価の指標と仕組みが示されている。

CPUも命令の実行順の最適化をしており、パフォーマンスの良し悪しを評価できるが、その定式化はなされていなさそう。

APPENDIX

Graph Theory

degree とは node(もしくは vertex)につながっている線の数といえる。

vertex を sequence に辿ることを walk(もしくは chain)と呼ぶ。

cycle とは walk の始点と終点が同じこと。

f:id:pato_taityo:20190521225459p:plain
cycle の例
f:id:pato_taityo:20190521225219p:plain
cycle でない。ただし、undirected graph(方向がない)であれば cycle である。

papa本では cycle の定義がなされている。他の本では cycle について言及する時にも cycle の定義がなされていないことがほとんど。グラフ理論の本ですら回れば cycle、ぐらいの定義だったりする。

walk で同じ点に戻ってくることをノット(結び目)という。


[memo]
デッドロック検出におけるknotとcycleの違いについて - Yabu.log

Proposition 1.1
directed graph が acyclic であれば vertices を order できる。また、order 出来る場合が acyclic である。

ただ、神林さんはここで order の定義が無いことを気にしている。例えば vertex が1つしかないと order できないが、これを定義していない。

可能性のある order 全てを表現する記法を考える難しさ。
f:id:pato_taityo:20190521230206p:plain
order の可能性として 1→2→3 もしくは 1→3→2 があるとする。これを 1<(2,3) と表現することは出来るかも知れない。でも、分岐したり合流したりを繰り返したときに全パターンを表現しきれない。

簡潔データ構造を使えばリストで DAG (Directed acyclic graph) に近いことを表現できる。ただし、このデータ構造は最初から order を全て与えられていなければいけないなど、制約もある。

数学での理論は order が全て与えられた前提となっている。TXのようにちょこちょこと追加されるケースに対しての理論は無いかもしれない。