読者です 読者をやめる 読者になる 読者になる

メソッド屋のブログ

米マイクロソフト DevOps エバンジェリスト 牛尾の日記です。ソフトウェア開発の上手なやり方を追求するのがライフワーク。本ブログは、個人の意見であり、所属会社とは関係がありません。

「検討」は無駄である - リスクや間違いを快く受け入れる第2の習慣

仕事の習慣・考え方を変え生産性や新しい技術の導入を米国並みに加速する「8つの習慣」のうち「リスクや間違いを快く受け入れる」に関して考察した。具体的な実践プラクティスに関して言及してみたい。

f:id:simplearchitect:20170116001908j:plain

最初の習慣は次のブログで紹介してみた。

simplearchitect.hatenablog.com

リスクや間違いを快く受け入れる

f:id:simplearchitect:20170116002322j:plain

  • リスクを背負うことは推奨されている
  • 間違いを厳しく批判したり懲罰したりしない
  • 失敗から学ぶ態度
  • Fail Fast(早く失敗する)
  • 実験が推奨されている
  • 全員に「現状維持」や「標準」を要求せず、臨機応変が推奨される
  • 非難や恐怖感の無い環境

この習慣は、日本人の我々にとってかなり難易度の高いものである。なんとなく言葉では分かっているつもりでも、海外で働いていると、自分の想像の範囲を超えていた。ということは、この習慣が身につけば相当かっこいいかもしれない!

間違いや失敗に対するイメージの違い

マイクロソフトのインターナショナルチームで働いていて気づいたことだが、同僚や上司がよく「Miserably Failed(惨めに失敗した)」という言葉を頻繁に使っていることだ。日本では「決して失敗は許されない」というプロジェクトが過去にも多々あった。しかし、人間なので、いくら失敗が許されない状況だろうが、どんなにしっかり準備しようが、「失敗」は発生するのだ。日本だと、例えばこってこてに炎上して、お客さんが激怒し、中身もボロボロなのに、納期と予算を守ったという理由で「成功」したということになっているプロジェクトをいくつも見てきた。文化的にも失敗したら「切腹」したり、「左遷」されたりと、悲惨な目にあうので、日本の社会では「失敗した」ということをとても言いづらい。だから、多くの人は失敗しなさそうな無難な方に流れてしまう。本当にこれはもったいないことだ。

f:id:simplearchitect:20170116014642j:plain

 一方、インターナショナルチームで気づいたことだが、失敗とか、間違いとかで怒られたことは無いといっていい。失敗したり、間違いに気づいた後に、本社に「フィードバック」をすると、「フィードバックをありがとう!」と大変感謝される。そして、誰がやってもうまくいくようなことを実施しても誰も評価してくれない。例えば今、お客さんの本番環境をお客さんとハックして改善する「ハックフェスト」という取り組みをやっているが、そこでいつも言われていることは「お客さんの最も難しい問題を解いてこい」と言われている。つまり、この世のどこにも情報が落ちていないような問題解決をやること。これが評価されるのだ。誰かが失敗しても、黙ってることもないし、失敗しても「あいつはだめだ」とか言ってる人を見たことがない。だからすごくチャレンジしやすく感じる。

   だから、より難しいことへのチャレンジも大変気楽にできる。むしろチャレンジしないほうが、将来が不安だ。だから、成功しようが、まずはやってみて、早くフィードバックを得て、早く間違いを修正していく。この考えはアジャイルや、リーン、DevOps に全て共通する考え方だ。だって、普通人間は間違うんだもの。

最も恐ろしい事

この「リスクや失敗」を恐れる性質は、生産性の面で劇的な問題をもたらしている。失敗したくないので、ともかく慎重になるのだ。慎重に時間をかけたから失敗を減らせるわけでもないし、時間をかけている間にライバルは次に進んでしまう。

 前にもブログに書いたことがあるが、私が米国でお客さんとディスカッションをしていて一番驚いたことがある。リックを1つだけ背負ったにいちゃんが、私とDamien に会いに来た。彼は私とDamienと1時間ぐらい話をしたあと。「うん。やろう」と言って、500人規模のハックフェストをその場で決定して帰っていった。

f:id:simplearchitect:20160424220436j:plain

 日本で同じことが起こるとすると、まず、ベンダーが提案して、顧客がそれを見て、Excelで質問票を作り、、、といったやり取りを数か月行って、結局やっぱりやめたみたいなことがしょっちゅう起こる。これはベンダーにとっても顧客にとっても大きな損害だ。時間だけが過ぎて、工数を使って結局何も生み出せていない。ノーバリューなのだ。1時間で物事が決まって、実際にハックフェストを実施すると、本番環境でいろいろ起こるような検証が数日で出来てしまう。今の時代はExcelで質問票を作っている場合ではないのだ。それをしている暇があったら、実際にハックをして確認したほうが100倍確実だろう。今の時代、いろいろ検討ばかりして、さっさと「やらない」ことが最大のリスクになってくる。   f:id:simplearchitect:20170116015220j:plain

 そして、こういうことが起こると、恐ろしいことに失敗確率が増える。卓上でいくら検討しても、実際やってみないとわからない。卓上でやっていたら、結局市場に出したらどういう反応が返ってくるか、本当にそのテクノロジーは適切に動作するか?というフィードバックは、結局実施するまでわからない。だから、失敗確率が高くなる。だから少なくとも変更がやりやすいソフトウェアは、アジャイルのような早く実装して、早くフィードバックを得る方法が採用されている。さらに、機能しているものを変更して失敗するリスクがあるものを避ける傾向も強くなる。現状維持だ。

同じ失敗ばかり繰り返す人は?

じゃあ、まったく進歩せず、同じ失敗ばかりを繰り返す人はどうするんだ?と思うかもしれない。それはごもっともだ。その解答は「評価」だと思う。他の習慣で、「従業員への信頼」という習慣がある。人に対してごちゃごちゃ細かいことは言わない。最初に会社と合意したゴールつまり大まかなKPIを達成していたら、失敗しようが、人より不器用だろうが何だろうがいいのではないだろうか?その人を信用しよう。

 できないのなら、評価のタイミングで KPIが達成しないので、給料が下がったりクビになる。ただそれだけの話だ。だから、評価はそのタイミングでよくて、失敗は結果論であるので、それよりも「フィードバック」を得たかを気にしよう。私のパートナーのクロスカルチャーの専門家のロッシェルさんがこういう話をしてくれた。米国では、プロジェクトが中止になったら、プロジェクトが成功したのと同じようにパーティをする会社があるらしい。なぜなら、その失敗から「学ぶ」ことが出来たからだ。

 この「習慣」は生産性に非常に影響してくるものだ。逆にいうと、これを身に着ければ、簡単にライバルに差をつけることができる。 じゃあ、この「習慣」を獲得するにはどういう方法があるだろうか?

「リスクや間違いを快く受け入れる」プラクティス

  1. 成功・失敗より「フィードバック」を歓迎するムードを作る
  2. 「検討」をやめて「実証」する
  3. 「早く失敗」できるように考える

それぞれについて解説してみよう。マネジメント、チーム、プロダクトオーナ(チームに出すリクエストをきめる人)のロールがある場合、どういった順番で重要なプラクティスだろうか?

対象者

  • 上位マネジメント
  • プロダクトオーナ
  • チーム

 これもほぼ全員だが、誰かが、誰かの「失敗」を責めるケースが多い順に考えてみた。

1. 成功・失敗より「フィードバック」を歓迎するムードを作る

 最初のプラクティスだが、チームメートや部下が成功したら当然喜んであげたい。失敗して、フィードバックしてくれたら、失敗する方法がわかったのでこれは大きな進歩なので、感謝しよう。失敗して「怒る」ということはあなたと対等である人を「子ども扱い」しているのと同等だ。そういう気持ちはわかるが、「怒る」という選択肢はなくして、「フィードバック」を促進するようにムードを作ろう。  たとえば、メールで、成功の報告を見たら、みんなで「おめでとう」のメールを返そう。メールで、失敗とそのフィードバックをしてくれたら「感謝」のメールを返そう。マネージャなら、本人の評価はあくまで約束したKPIの達成の可否であり、小さな成功や失敗ではない。そういうことを明確にしていこう。このムード作りは、上位マネージメントの方から仕掛けていただくほうがいいかもしれない。

f:id:simplearchitect:20170116015629j:plain

2. 「検討」をやめて「検証」する

 あなたがユーザ企業や上司ならば、パワーポイントに書かれた大量の資料を要求したり、完全無欠の検証を期待するより、時間をかけず、さっさと「検証」してフィードバックを得るようにしよう。人間未来は予測できない。例えば、あなたがユーザなら、ベンダーに「提案」を依頼すると、例えば私が大手のSIに勤務しているときは、提案書を作るのに何人もの人が数週間もかけて作っていた。しかし、正直に言うと今の時代、大量に検証しても制度が低いし、マニュアルに「出来る」と書いてあっても実際作ってみるとできないなんてことはしょっちゅうある。その工数は、あなたがそのベンダーに発注したときにOnされてね返ってくる。Lose-Loseの関係だ。

f:id:simplearchitect:20170116015435j:plain

 そんなのよりも、クラウドの時代でさらに加速したが、実際に作ってみるほうがよっぽど早い。そして、過去と比べると圧倒的に早くできてしまう。だから、ああでもない、こうでもないと検討するのではなく、実際に作ってみる「ハックフェスト」などを通じて、動くもので検証しよう。  ほかにもあの機能を実装するべきか、この機能を実装すべきかと検討している暇があったら、実際に実装して、ベータテストで実際のお客様で試してデータを取ろう。思ってもない結果になるかもしれない。  今の時代最もリスクなことは「何もしない」ことだ。検討している暇があったら、今すぐ実装して試してみよう。データをとろう。

f:id:simplearchitect:20160403015344j:plain

 例えばアーキテクチャやツールが数種類あってどれにするか決めあぐねているパターンがある。それを意思決定するのは簡単だ。答えは「どちらでもいい」ので趣味で選べばよい。なぜなら、圧倒的に差があるのなら、決めあぐねるはずがないので、どっちを選択しても大差ないということなのだ。  また、昔と違って、ツールやサービスの単価は高くない。1つのツールで失敗したら次のにさっさと乗り換えればいい。つまり比較検討など無駄だ。それより早く前に進もう。実践の経験を積み重ねるほうがよっぽど貴重なことだ。

3. 「早く失敗」出来るように考える

 これも、2.に近いが、近代の開発では、「フィードバックが遅い」というのが致命的な問題になる。例えばウォータフォール時代だったら、要件定義をして、設計をして、実装して、テストをする頃になってやっと実物のアプリを作るので、ここで、いろんな問題が発覚することが多い。つまり、実際の「フィードバック」を受けるまでの時間が長い。これが問題だ。早く試して、失敗して、フィードバックを受けて早く方向修正する。早く正しい方向性を見つけていく。最初から「正しい方法」がわかっている人は今の時代に存在しない。リスクがあったらさっさと手を付けて、失敗してフィードバックを得よう!

いかがだっただろうか?もっといいプラクティスがあるかもしれない。私もまずは3つをピックアップしてみた。もしもっといいものがあれば是非シェアしていただければ大変うれしく思います。次回は「不確実性を受入れる」についてお話いたします。

 

Scrum / DevOps の導入を加速するグローバルマインドセット ~8つの習慣 その1 ~

クロスカルチャーの専門家Rochelle Koppさんと一緒に考案した 新技術の導入を加速させるための「8つの習慣」をまとめ上げた。この習慣を習得することで、米国と同じようなスピードで新しいことに対応したり、生産的になることができる。今回はその一つ目の習慣について解説してみた。

f:id:simplearchitect:20170114230815j:plain

今回、日本最大級のアジャイル開発のイベントの一つである Scrum Gathering Tokyo で先のRochelle さんと一緒に「8つの習慣」を初めて発表させていただいた。

2017.scrumgatheringtokyo.org

 「8つの習慣」は日本での Agile / DevOps をはじめとする最新技術やプロセスの導入を米国並みのスピードにすることを目指している。Agile や DevOps を開発した人は西洋の人なので、西洋文化の上に成り立っている。だから、日本の文化の上でそれらを使うと、どうもうまくいかなかったり、効率が悪くなってしまう。

 そこで、米国並みのスピードでの技術導入や、本質的な導入を目指す方のために、「8つの習慣」を考案した。 Agile / DevOps の導入を本質化し、加速するための西洋文化のマインドセットだ。日本人は「生産性」が悪いせいでグローバル的には大変損をしていると思う。それさえ何とかなれば、日本人の文化の良さを生かして、ソフトウェアの世界でも輝ける存在になると私は信じている。重要なことは、西洋を崇め奉りたいわけではなく、日本文化と西洋文化の考え方を「選択可能」にすることだ。

docs.com

 ただ、講演では時間が45分なので、すべてを解説する時間がなかった。まずは「興味を持ってもらう」ということをターゲットにしたので、「実際どうすればいいかわからない」だろうとう反省がある。今後ロッシェルさんとビデオを公開して「8つの習慣」をより学びやすくするつもりだが、このブログでも不定期に「8つの習慣」が何で、具体的にどういうことをすれば導入できるかについて解説していきたい。

「8つの習慣」を理解する方法

「8つの習慣」は「マインドセット」なのでなかなかに理解が難しい。ただ、一番簡単な方法がある。米国人、もしくは、西洋人のチームに参加して1年も一緒に仕事をするといい。そしたら簡単に彼らのマインドセットを体験できるし、その破壊力を体験できるはずだ。そして、彼らが「人として優れている」とかではなく、我々でも十分できる「習慣」のために生産性がいいことを体験できるので、簡単にマネできると思う。

f:id:simplearchitect:20170115000533j:plain

 ただ、問題は、そういう環境にいる人は国内にはあまりいないということだと思う。だから、そういう人のために、国内にいても、そういうことを学べる方法はないだろうかとロッシェルさんと一生懸命考えたものだ。もちろんまだ出来たてなので、まだまだの部分はあると思うが、それでも改善を進めながら、技術導入を本当に加速したいと思っている人がにお役に立てればと思う。

「8つの習慣」

f:id:simplearchitect:20170114230526j:plain

  1. Be Lazy 
  2. リスクや間違いを快く受け入れる
  3. 不確実性を受入れる
  4. サーヴァント・リーダーシップ
  5. セルフマネジメントチーム
  6. 従業員への信頼
  7. 個人の自信
  8. 階層関係のパワーバランス

これがロッシェルさんとディスカッションして整理した、「8つの習慣」だ。我々がAgileやDevOpsをうまく導入するために必要な西洋のマインドセットを整理してみた。 今回は最初の習慣である Be Lazy から具体的にどういうことをすれば、導入できるのかということに関して考察してみたい。

Be Lazy

この習慣は、スクラムや、リーンの世界でもよく言われており、アジャイル以降の開発で大変重要なポイントになっている。このブログでも何回か取り上げているが、一言でいうと「より少ない時間で価値を最大化するという考え」だ。この考えを学ぶにはエッセンシャル思考という本を読むのが一番おすすめだ。

Be Lazy を達成するための習慣

  • 望んでいる結果を達成するために、最低限の努力をする。
  • 不必要や付加価値のない仕事をなくす(過剰準備含む)
  • 簡潔さを目指す
  • 優先順位をつける
  • 時間や費やした努力より、アウトプットと生産性に重点を置く
  • 長時間労働しないように推奨する
  • 会議は会議の時間内で効率的かつ生産的に価値を提供する

このBe Lazy の一覧を見ると、たいていの人は「当り前じゃないか?」と思うのではないだろうか?そこに落とし穴がある。例えば「優先順位をつける」という項目について考えてみよう。よくスクラム等で言われる言葉で「バックログに優先順位をつけて、優先順位の高いものに集中しよう」ということがある。この言葉を聞いて、私のような日本人の人にイメージされるのは次の図の左のようなイメージじゃないだろうか?

f:id:simplearchitect:20170114231310j:plain

リストに上がっているタスクが5つぐらいあるけど、「全部できないから、優先順位をつけて、どうしてもできないのは無理だから実施しないようにしよう。でも時間が許せば全部実施したい。」ところが、同じ言葉に対して、海外のメンバーを観察していると、右のようなイメージをもっているようだ。「最初の1個をピックアップしてやったら他はやらない。その1つのフォーカスする」ぐらいの感じだ。

f:id:simplearchitect:20170115002010j:plain

 こういう場面はインターナショナルチームにいるとしょっちゅう目にして、そのたびに驚いていたが、例えば、バリューストリームマッピング(上記の図をプロジェクトメンバで作成しプロジェクトの無駄を発見するセッション)を、同僚のデビッドとやった時に、彼は「リリースマネージメント」というDevOpsプラクティスの一つしかアドバイスしなかった。帰りの車で彼に聞いた「私から見たら、それ以外にもDevOps プラクティスである Automated Testing もできていないし、承認作業多いのでビジネスプロセスも変えないといけないし、ほかにも沢山あるじゃない。なんで一つだけしか言わなかったの?」と聞いたら「だって、沢山言ってもそれができるかな?まず大切なことは一番インパクトのある一つを確実にすることが大切なんだ」と彼は言っていた。

f:id:simplearchitect:20170114232530j:plain

 我々はすぐに「あれも、これも」やらないといけないと思ってしまうが、「すべき」より、「実際にできるキャパ」を考えるほうが生産性的には有用だ。2-8の法則でも、20%の仕事が80%の価値を生むのだから、20%をしっかりやるとよくて、100%全部やろうとするから工数もかさむし、アップアップになってしまう。

 我々の傾向としては、100個のタスクがあったら、100個やろうとする。たけど、本当に重要なのは20%程度だろう。そういう知識があっても、20%のタスクが終わって80%の価値がでても、残りの80%の仕事をして完璧を目指してしまう。でも、彼らを観察していると、20%のタスクを終えて、80%の価値をだしたら、残りの80%はやらずに、次の80%の価値を生む20%の新しいタスクに取り組む感じだ。そうすれば、100%の仕事をしたケースに比べて、40%の工数で160%の価値を持つ仕事ができることになる。

 ざっくりとしたイメージで言うと、彼らが無理なく生産性が高い理由は、こういう理由だ。つまり、実施すべき「物量」が少なく「価値」が高いものを如何に作っていくか?の工夫を常日頃からしているのだ。

simplearchitect.hatenablog.com

 彼らが優秀とかではなく、「やることを減らすか?」ということに注力している。多くの人は、例えば多くの機能を速く実装することはよいことと思わないだろうか?本当は「悪」である。なぜなら、統計によるとソフトウェアの機能のうち40%ぐらいしか使われない。だから、100%を全力でつくったら、60%が使われない。しかも、その60%でバグが発生したら直さないといけないし、60%もコードベースが多くなるので、変更があった時にコードを読む量がさらに増えてしまう。

 つまり、「やることを減らす」ことは大変素晴らしいことなのだ。ところが我々の感覚からすると、全部やらないのは、何となく悪いことに感じてしまう。だから、いまある手続きや、やり方を「減らす」のは苦手だ。だけど、重要なことは「価値」であるのと同時に、「減らすこと」自体は非常に価値がある。

f:id:simplearchitect:20170114232730j:plain

 例えば、マイクロソフトに在籍している間に2回報告システムが変わった。どんどん手続きが「楽」になっていっている。ミーティングも毎週だったものが、2週間に1回になったり、1年に4回あったレビューが少なくなったりとか平気で起こっている。そうすれば、それに使っていた時間が他の優先順位が高いことに使えるのだ。  しかし、「価値」というものはよくわからないものだし、どうして「より短い時間で、価値を最大化する」ことができるだろうか? 次のようなことを実施してはいかがだろうか?

Be Lazy プラクティス

いくつかセルフチェック出来そうなプラクティスを考えてみた

1. ひとつだけピックアップする
2. 時間を固定して、出来ることを最大化する
3. 過剰な「準備」と「後でやる」をやめる

我々は西洋系の人と比べて、完璧主義の傾向が強いと思う。重要なもの、そうでないものも同じ感じで「ピカピカ」に磨いてしまう。だから時間がかかってしまう。ただしこれは、いい点も悪い点もある。例えば西洋の人は「ピカピカ」に磨く能力が我々に比べてない気がする。我々に問題なのは重要じゃないこともピカピカに磨いて工数をつかってしまうことだ(例えば、文章を書くときにExcelの細かいレイアウトまでこだわるとか)。これをやめたら、生産性が上がって、西洋の人と生産性で競争できる上、重要なことだけ「ピカピカ」磨いてやれば、ものすごい競争力になるはずだ。だからまずは、見習うところは見習うほうがいいのでは?というのが私の考えだ。

対象者

スクラムや DevOpsチームでの使用を想定するとすると、本プラクティスをマスターしておくとよい人は次の人だ。

  • プロダクトオーナ
  • 顧客
  • チーム
  • 上位マネジメント

つまり、全員が該当する。ストーリの優先順位づけや、機能のどれを実装するか否かという場面で非常に生産性に影響する。だから、プロダクトオーナや、顧客が特に深く理解している必要がある習慣だ。もちろんチームメンバも、本当に必要な機能、そして不要な機能をプロジェクト全員で見つけだすために、重要になってくる。また振り返りを行い、プロセスの改善を実施するときも如何に「楽」をしてより高い「価値」を生み出せるか、何を「やめる」かをディスカッションするための基本的なマインドセットとなる。

 さて、これらのプラクティスについて解説してみよう。

1. ひとつだけピックアップする

   これは、インターナショナルチームで周りの人を観察して彼らのように出来るようにマネして実施しているプラクティスだ。私は優先順位をうまくつけるのが彼らに比べて本当に苦手だ。あれも、これも大切に見えてしまう。だから、そういう時は、思い切って、一番重要なのはどれか?と考えてそれだけやろうと考えるようにすると、ちょっとマシになってきた気がする。最終的に3つピックアップするケースでも、まず最初の1つだけピックアップする癖をつけている。そのあと残りの2つをピックアップしている。

 自分がやるべきと思っていることをスルーするのは恐怖があるが、結局それを受け取った人もたくさんだと理解できないのだ。最大でも3つぐらいだろう。一番重要な「ひとつだけ」ピックアップする癖をつけると、時間が無くなった時も、少なくとも「一番重要」なことは実施できている状態になれる。

f:id:simplearchitect:20170114232851j:plain

 そうしていくと、「やらないといけない」と思ったことをやらなくても、結局問題にならないことがわかってくる。どうでもいいことを10やるより、1番重要なことを時間をかけてしっかりやったほうが大抵のケースはうまくいくし、沢山のことをいっぺんにやっても、本人はやった気になるけど、忙しいだけであんまり成果が出ていない感覚になる。

 すべてのケースで「ひとつだけピックアップ」が通用するわけではないが、「ひとつだけピックアップ」のプラクティスを3回繰り返せば3つピックアップできる。しかし、重要なのは、10個のうち2個しかやらないことは決して悪ではなく、そっちのほうが「バリュー」として効果的なことを「体感」し、「やらないこと」の恐怖を克服するのがこのプラクティスの目的だ。是非お試しあれ。

2. 時間を固定して、出来ることを最大化する

 「すべき」思考で考えると、どうしても、時間を「延長」してしまいがちだ。彼らを観察していると、「すべき」から時間を計算するのではなく、「時間」は固定して、その中で価値を最大化するという行動をとっているように感じる。

 例えばロッシェルさんと打ち合わせをするときも、時間が延びることはほぼなく、「あれも、これもやらないといけない」とお互い思うのだが、この2時間で出来る範囲のなかで、「最大にバリューが出ることにフォーカスをすると、これと、これなので、今日はこの2つだけやろう。」すべきことを全部こなそうというより、時間が最大の制約なので、この時間内に確実にできる数に絞って、最大の成果を出せることに集中する。みなさんも、なんも準備できていなけど、明日プレゼンだとかいう場面はないだろうか?その時のイメージを思い出すといいかもしれない。多分無理なものはあきらめてバッサバッサと作業を切り捨てているはずだ。それを無理ない個数に絞り込んでやるイメージだ。

f:id:simplearchitect:20170114233009j:plain

 だから、「きれいなドキュメント」なんかは作っている暇は当然なく、「やる事」の数を減らして時間内にできるようにして、やったらよさげなこともばっさばっさと切り捨てて、その場で出来るだけ早く意思決定するようにせざるを得なくなる。  「まだ完璧じゃない」「抜けてることがあるかもしれない」ことが最初は怖かったが、「抜けている」ようなことは大抵対して重要じゃないのだ。抜けていて困ることもあるかもしれないが、それは、何かを実施したら、フィードバックを得られるので、「心配」せず「実施」してしまえばいい。

 例えばこの「8つの習慣」も完璧かは知らないが、世に出して、フィードバックを受けたほうが悩んでるよりよっぽど生産的だろう。

3. 「準備」「持ち帰り」をやめてその場で解決する

 ポイントとしては、何かの作業、例えば会議をしているときに、「会議の場」のみで完結するように訓練することだ。彼らを観察していると、ざっくりしたアジェンダはあるが、準備に時間をかけて会議に臨むということはしない。さらに、会議が終わった後に「宿題」とか「もちかえって検討」とかそういうことがない。つまり、会議に出たら「会議の時間内だけで完結」する。これは大変生産的だ。  日本の会議のときは、会議の前の準備があって、会議が終わった後も、検討したり、議事録を書いたりいろいろしないといけない感じだった。

f:id:simplearchitect:20170114233258j:plain

 インターナショナルチームを観察していると、彼らは常に「会議の場」だけで完結される。議事録もその場でOneNoteにとって共有される。  例えばロッシェルさんとのプレゼンテーションの会議をしているときも、「ここと、ここを修正して後で直しておきます」ということはせず、その場でプレゼンを修正する。そしたら終わった後に時間を取らなくていい。そして、会議の時間の間にロッシェルさんに共有する。意思決定も、持ち帰って検討しますではなく、間違っててもいいので、その場で意思決定してこうしようと決める。

 昔のブログエントリで書いたが、こういうことを元から実践している人がいる。ソニックガーデンの倉貫さんだ。私がコンサルタントの時、彼と仕事をした時の一言は忘れられない。

牛尾さん。会議の準備をしないでくださいね。無駄だから。そうではなくて、会議の時間を価値の高いものにしましょう。  

kuranuki.sonicgarden.jp

 彼との会議は常に生産的で、その場ですべてを解決するスタイルだった。会議の前にも、後にも時間は不要だった。もし、どれぐらい「準備」をしなくてもいいのか?がわかりづらいなら、いっそ準備「なし」でどの程度できるか体験してみるといいだろう。そして、出来るだけ「会議の時間内」のみで完結できるように頑張ってみる。そうすれば、思ったより「できる」ことに気づくのではないだろうか?  できない場合は、きっと、「余計なこと」を頑張っている可能性が高いので、会議のゴールに不必要なものを減らしていく練習をするとよいだろう。

おわりに

 これらの3つのプラクティスは、もちろん簡単ではないとは思うし、実際の例を見ないとなかなか理解できないかもしれない。「どれぐらい」ができている状態かわかりずらいかもしれない。

 だけど、これらを「意識」してみて、「実践」していると、だんだん上達してくるし、こういったことが「出来ている」人を目にするとアンテナが立っているので「あーこれぐらいできればいいんだ!」という気付きを得やすくなる。少なくとも意識して「実践」してみるだけで、かなり変わってくるはずだ。

次回は「リスクや間違いを快く受け入れる」習慣について書いてみたいと思う。

「知らないこと」を恐れないマインドセットが技術導入を加速する

先日、米マイクロソフトの Redmond キャンパスで行われたマイクロサービスのハックフェストに2週間ほどサポーターとして参加してきた。 そこで気づいた日本との技術導入の差の秘密について気づきをブログに書き留めておこうと思う。

f:id:simplearchitect:20161202162159j:plain

 ハックフェストというのは、お客様のガチの環境もしくはそれに近い環境/テーマで行うハッカソンだ。

例えば DevOps の文脈であれば、自動化したら効率化されそうな部分に関して、マイクロソフトの製品チーム、エバンジェリストがサポートしながら、お客様自身が我々と一緒にハックをして、実際にお客様の環境を自動化してしまうようなイベントだ。 Hello Worldチュートリアルレベルではないので、お客様の環境が本当に自動化されてリードタイムが短縮されたり、我々にとっても、現場の難しい問題を知り、それに対してソリューションを作ることができるので、スキルアップまでできるので私は大変気に入っている。マイクロソフトはこのイベントをプッシュして展開している。

 さて、今回のイベントは、米国、カナダ、欧州のマイクロソフトのパートナーを集めてマイクロサービスのハックフェストを実施していた。ほとんどのパートナーは、Service Fabric というマイクロソフトの激アツのマイクロサービスの PaaSサービスを試していた。

azure.microsoft.com

 私が驚いたことに、Service Fabric はまだ出てそんなに経っていないというのに、ガンガンに使ってたり、基幹業務系に使っていたり、通常はクラウドサービスなのに、オンプレに自らインストールして使っていたりとそのレベルの高さに本当に驚かされた。

 彼らとディスカッションをしても、正直相当レベルが高かった。普通にBoundary Contextとか、Conways's Lawとか、DDDとか普通に知っていて当然のように活用している。一体この差はなんなのだろうか?今回は、2回 x 5日間のハックフェストを体験して気づいた彼らの新しい技術に対するマインドセットをシェアしたい。

準備不足からくる不安を感じる

正直このハックフェストが始まる前に、私は相当準備をしていった。Service Fabric はとても便利だが、マイクロサービスの基盤なので、しっかり理解しようとしたら相当いろいろ学ばないといけない。 私は事前に自分でコードを書いたり、CI / CD パイプラインを作ってみたりしていた。そうでないと、私はハックフェストで役に立つはずがないから。しかも、相手の会社さんは毎日のようにプロダクションでService Fabricを使い倒しているパートナーさんもたくさんいる。しかも、日本より技術的に進んでいる米国でのハックフェストなので、正直いうと通用するか相当自信が無かった。自分の準備が十分かどうかわからないままハックフェストがスタートした。

Julien 衝撃のひとこと

f:id:simplearchitect:20161202164843j:plain

初回のハックフェストは、DevOpsチームからは私のみの参加だったが、2回目のハックフェストでは、Julienという同僚が参加をしてくれていた。その時に、私が彼に「来てくれてありがとう!ちなみにService Fabricどれぐらいやったことあるの?」と聞いた時の彼の返答は衝撃だった。彼は自信満々にこういった。

やったことないよ。

 えええええーーーーこんなガチのハックフェストなのに!そういえば、日本であったBot frameworkのハックフェストの時に来日した、むっちゃ技術力の高いEricに、Bot frameworkの経験を聞いた時も「やったことないけど、今日やるわ」だった。当時は彼は死ぬほど優秀だから、できちゃうんだろうなと思っていた。もちろんJulienは最高に優秀だけど、難易度の高く、ユニークなマイクロサービスのPaaSにノー準備で挑むってどういうことだろう?すごい度胸だ。彼もむっちゃ優秀なんだなと思っていた。

docs.botframework.com

準備を全くしなかった人の成果

 初日が終わって、彼はとてもエキサイティングしていた。彼はハックフェストのおかげで、IaCを使った、ADのセキュアクラスタの構成も体験できたし、CI/CDパイプラインもできてとても良かったと言って喜んでいた。  ガラス越しに彼がサポートしているチームの部屋を見ると、彼が堂々と、ディスカッションしている様子が見れた。後日談だが、彼のサポートしたチームはDevOpsの要素で素晴らしい成果を上げていた。この時点でも、私は単に彼が優秀だと思っていたのだが、あることで考えが変化していった。

f:id:simplearchitect:20161202171954j:plain

Jason の提案

私は 幾つかのチームをサポートしたのち、最後にJasonというエバンジェリストのいるパートナーのルームを支援していた。このチームは、パートナーが作っており、リリースされているプロダクトを、Service Fabricで動かしてみるというガチハックをしていた。担当の彼はMVPで相当レベルが高い。

f:id:simplearchitect:20161202165104j:plain

私はCI/CD を支援する予定だったが、まだ、彼がマルチパートのデバッグで苦労しているので待ちの状態だった。そんな時、Jsonは彼にこういった。

「俺に見せてよ。一緒にデバッグしよう」

 製品のコードを書いているのは、彼だし、Jsonがコードのことを知っているはずもない。自分は「は?」という気分だった。そして、「これが原因じゃないか?」と言って彼と一緒に原因を探り始めた。彼が「知っているはずもない」ことについて。    その姿を見て、Eric, Julien, そして、Jsonの行動に関してあることを思いついた。彼ら、米国の技術者がいろいろできるのは、すでに準備して勉強しているからではなくて、「知ってようが、知っていまいが、とにかく躊躇せず一緒にやってみるから」じゃないだろうか?

 そう思った私は、Jsonと一緒に彼のデバッグを手伝うことにした。コードを読んだり、インターネットを調査したりして一緒に取り組んだが、問題を解決したのは、彼らより、もっとコンテキストやその技術を知らない「私」の仮説だった。彼も、Jasonもとても喜んで我々はハイタッチした。もちろん私も、完璧にそのコードを理解したわけではないが、他の3人とディスカッションしながら進めることで、そういった仮説にたどり着くことができた。みんなの勝利だ。

私の仮説は

彼らは、もともと、「知っていた」から優秀なのではなく、準備ができてようが、知ろうが知るまいが、果敢に本番環境に近い環境で、実際に適用してやってみて、そこから学んでいるから優秀になるスピードが速いのでは?

ということだ。確かに、検討をいくら重ねても実力はつかないし、結局のところ本番環境で発生する問題には対応できない。

「とにかくやってみる習慣」がスピードを生む

私は、まず調べて、理解してできるとわかってからやるというステップを踏む癖がある。日本の多くの企業もそうじゃないだろうか?その技術が十分に使い物になって、本番でも本当に問題なく使えるということがわかって導入する。そして、あのケースはどうだろうか?このケースはどうだろうか?と思考をめぐらす。

一方、彼らを観察しているともっと単純に考えているように感じる。この新しいテクノロジーを使うと、この問題が解決しそうだからまず適用してみる。ぐらいのノリで、単純に考えてそれを実行する。実行すると決めたら、そこのマニュアルがなかろうがバグを踏もうが、回避策を考えて実際やってみてそこから学んでいく。あれこれ検討していると、時間だけ過ぎていくが、その間はノーバリューだ。しかも、長い間検討したからといって、良い回答につながるかはわからない。

だから、まず「こうだったら、難しい」「ああいう時は上手くいかない」ということを考える前に、まず適用してみて、そこから学びを得ているように感じた。早く実践して、そこから学んで方向修正をしていく方が結局早い。DevOpsのプラクティスにも、Testing in production という考えがあることを思い出した。

www.itproguy.com

この2つの思考スタイルにいい悪いは特にない。ただ、おそらくソフトウェア産業においては後者のスタイルのほうが圧倒的にスピードが出やすいだろう。なぜなら、現在のソフトウェアは、バージョンアップや、新しいサービスの出現のスピードが非常に早い。だから、それが本当につかえるか調査しているうちに次のバージョンが出てしまう。

「知らないこと」を「悪」にしない空気が重要

 彼らは何をするにもあまり準備をしない。そして、時間内で如何に成果を出すかに集中する。だから、彼らは「知っている、知らない」とか「準備できている」とかは、さほど重要ではなく、それぞれのメンバーが貢献できるところで貢献して、全員で成果を達成するという感覚が強いように感じる。誰がどんなスキルをどれだけ持っているとかはあまり誰も気にしない。 だから、私が知らないことがあっても、一回も不平不満を言われたことがない。

f:id:simplearchitect:20161202165612j:plain

 ただ一つ言えるのは「知らないけど、一緒にやってみましょう」は非常に評価されるということだ。今の時代、たとえマイクロソフトに勤めていても、そのサービスの全容を把握するのは一人の人間では不可能だろう。  これはマイクロソフトだけではなく、一つのサービスの全容を一人の人間が把握するのは無理になってきていると思う。一人のスキルですべてカバーすることも。  日本だと、プロが「知らないこと」があると、批判の対象になりやすいが、これは恐れを生んで、必要以上の準備につながっていると思う。だから、「知らないこと」があっても、当然であるという空気作りも重要と思えた。

日本では、「知りません」というのは勇気がいるが、向こうのメンバーを観察していると、本当は多少知っていることでも、「知らない」と簡単にいうのだ。「知らない」のは何も恥ずかしくない。ただ、彼らはそれでもその場で問題を解決しようとする。 助けを求めたり、人に聞いたり、お客さんと一緒にハックしたり。持ち帰りをせず、その場で解決しようとする。

「知らないこと」にアタックすることで成果が出やすくなる

f:id:simplearchitect:20161202165419j:plain

 ハンズオンやレクチャーの形式というものは、結局のところある人の知識がある人に移転することでしかない。ハックフェストは一つの例だが、誰かが一方的に物事を知っている事を準備するのではなく、とにかく集まって、みんなの頭脳を結集して、問題を解決するスタイルだと、二人分の知識どころか、二人が知らなかった部分にもトライすることになる。そうすると、その時間内で二人が従来持っていた以上の知識を獲得することになる。これはとても効率的だ。

  新しい技術の獲得、適用に関してもこういう性質が関係しているかもしれない。実は新しい技術の初速のキャッチアップは日本の方が最近は優れているように感じる。例えばマイクロソフトの大きなイベントがあっても、次の日にはすでにまとめサイトができあがっている。これは早すぎる。

しかし、そのあとにその技術を本当に使われるか?となるとそうはならない。一方米国では、初速ははやくないものの、自分たちのアタックしたい問題にそれをともかく使おうとする。リスクの検討をがっつりするのではなく、これを試してみようとおもったら、とにもかくにもやってみる。

 そして、知らないことにチャレンジしていくと、実際の問題に対応しているので複雑で難しユースケースにも対応していくことになるので経験が積まれる。さらに、自分がわからない状況でもどうやって問題を解決していけばいいか、その場でどうやってバリューを出していけばいいか?という訓練ができることになる。

 米国では、技術者は基本コンピュータサイエンスを出ているというのもあるが、それよりも、あれこれ考えず素直に「ともかくやってみる」 作戦によって、たくさんの工数をかけることなく、効率よく新しい技術を獲得してスキルアップしていっている気がする。

日本でどうやってスピードアップをしていくか?

f:id:simplearchitect:20161202170728j:plain

言葉だけは知っていたが、日本人の性質として語られるものに「不確実性の忌避」というものがある。不確実なものを嫌う性質だ。今回の体験で、文化の専門家が語る「不確実性の忌避」の性質の具体例を自分で体験できた気がした。自分はチャレンジングな性質だと思っていたがその自分がしっかり「不確実性の忌避」の性質をしっかり持っていたのだ。  こういう日本の「文化」に基づく、スピードの遅さに対処する方法としては、私は「西洋文化インストール」と言っているが、彼らの考え方を理解するところから始めるといい。大抵それは、彼らが優秀だからできることではなくて、それが理解できれば日本でも全然実践可能なものばかりだからだ。だから、チームで、マインドセットに関してチーム内でシェアして、チームがそれを気に入ればその考えで作業を進めると楽なことが多くなるだろう。

doc.co

例えばこんなマインドセットでどうだろう?

「Just Do It」

  • 自分の仕事に自分が主体性を持つ
  • 知らないことは悪ではない
  • 知らないことでも、自分のできる範囲で他の人を助ける
  • 準備しすぎていないか?、何をやらなくてもいいだろうか?を自己に問いかける
  • 例外をあれこれ考えず、単純に新しい技術をまず本番適用し、本番から学ぶ

これは、DevOpsのマインドセットにもつながる内容だ。このマインドセットは結構難しい。可能であれば米国の開発チームと一緒にはたらくと日本人でも、この辺りの感覚がわかるようになる。  次善策としては、皆さんのチームに、上記のマインドセットをグランドルールとして開発を進めてみるのはどうだろうか?

「知らないこと」のハックフェストが怖くなくなった

私もこのことに気づいてから、スタイルを変えるようになった。このハックフェストが終わった後Redmondのエバンジェリストチームの同僚が「Tsuyoshiお前、NodeJS強いか?」と言われた。今までだと「イヤーごめん、強くないわ」と言っていたところをこういってみた「さわったことあるよ。そこまで強くないけど。何が問題?」と言ったら「君の助けが必要だ」といって彼のオフィスに連れていかれた。 どうも認証周りがうまく動かないみたいだ。私は一緒にコードを読んで、とあるコールバックの部分の記述についてアドバイスしたらそれが正解だった。私はNodeJSなんて触ったことぐらいしかないし、彼はむっちゃいけてる技術力のあるエバンジェリストだけど、自分が知っているか、知らないかは気にせずとにかく彼を助けてみた。

f:id:simplearchitect:20161202171214j:plain

すると、自分もHello Worldレベルじゃない、NodeJSのコードを読む機会に恵まれたし、彼は早く問題を解決することができた。会議に出ても、自分が現状で持っているものを活用し、知らないことも、相手に聞く、相手と一緒に考えるなりして、その場でその問題を解決するような方向性に変えているが、結構かなりいい感じな気がしている。

「知らないこと」を恐れず、楽しむ習慣

その後「知らなくても」一緒にハックする習慣をつけると、その後の顧客からも常に喜んでもらえるようになった。「本当に生産性が高かったよ!」と。私はただ、知らなくても、知っていても一緒に「問題解決」を「その場」でしようとしているだけだが、これがかなりの効果とスピードを生んでいるようだ。自分のレベルが変わったわけじゃない。以前は「知らない」状況は非常に怖かったが、今は「知らないこと」が来ても成果が出せることがわかってきたので、逆に「知らないこと」がやってくると嬉しくなってくるようになった。

f:id:simplearchitect:20161202171057j:plain

おわりに

 こちらに来て何度も思っていることだが、彼らは日本より進んでいるし、技術力も総じて高いと思うが、個人の個体差が大きいわけじゃ 決していない。本の小さな「習慣」や「考え方」がちょっとだけ違うだけで差がついているだけだ。これは非常にもったいない。先ほど書いた日本の「準備を入念 に行う」「例外ばかりをたくさん考えてしまう」マインドセットは、時間をかけて精緻なことをしたいときは非常に役に立つだろう。 実際私がハックフェストや、同僚の問題を解決できたのは日本人のこの性質な気がする。  こういう日本人が、彼らの「速さ」の原因になっているちょっとしたマインドセットを獲得すれば、ガンガンに世界でも同じように活躍できるようになると思う。だから、私もいろいろ試して調査して、そして個人的に気づいたことをシェアしてきたいなと思っている。 

ハックフェストの成果として、Service Fabric のデプロイメント戦略について書いておいたの蛇足だが記載しておきたい。

blogs.technet.microsoft.com

Serverlessconf 最高でした!ーAWSな人に贈る、最も簡単に分かる Azure の Serverless

10/1に、ServerlessConf 出店ブース始め、会場におられる方も、AWSを利用されている方がほとんどだった様子だったので、講演では、AWSを普段使っておられる方を想定して、お話しをしました。ただ、盛り上がった一方、詳細なアーキテクチャが知りたかったとか、AWSのλとの違いがわからなかったというご意見をいただきましたので、そういうフォローアップ記事を書いてみようと思いました。

f:id:simplearchitect:20161005075246j:plain

 個人的には、Serverless は、Microservicesの次のパラダイムぐらいの勢いがありますが、どのような利用がされているかのアイデアとその未来を知りたくて参加しました。ちなみに、スポンサーセッションと思われていますが、一応、スポンサーセッションではなく、サブミッションを出しています。本イベントは、非常に熱気があり、学びも多く、素晴らしいイベントでした。こんなにも素晴らしいイベントをこんなにも早く日本でも開催いただいた、主催の吉田さんに本当に感謝です!

では、早速、AWSな人に贈る Azure のServerless のお話し、そして最後に、私が感じたServerless の未来についてお話ししてみたいと思います。

1. 講演概要

 講演の概要は、9/26-30 まさに直前に行われたMicrosoft Igniteでの発表の資料を中心に、いくつかのデモを加えて行われたものです。講演資料はこちらになります。講演資料は、当日、日本人と海外の方が両方おられたので、英語の資料で、日本語で講演というスタイルにしました。

2. Azure Functions (AWSのλっぽいもの)

Azureでの、Serverless のサービスは、Azure Functions というサービスです。一緒に講演した、佐藤(NEO)直生さんが、当日早速 Getting Started 等のURLを整理したブログを書いてくれたので共有したいと思います。

azure.microsoft.com

[ServerlessConf Tokyo] Serverless Patterns with Azure Functions (Azure Functionsでのサーバーレス パターン)satonaoki.wordpress.com

 このサービスは、元々 Azure で使われていた、WebJobs という仕組みが元になっています。何らかのトリガーをきっかけに、バッチ等 の小さなプログラムを動かすこの仕組みは、Serverless のAzure Functions を動作させるためには最適な仕組みでした。

f:id:simplearchitect:20161005075738j:plain

azure.microsoft.com

 AWS のλに相当する Azure Functions は Azure の PaaS 基盤である App Service の上に構築された仕組みで、Web Appsをはじめとした、例えばWebのPaaSを使っていれば、そこにサーバーを新たに建てることなく、バッチを実行することができました。  そして、C#はもちろんの事、様々な言語で動作します。中身は現在のところ、Windowsサーバーがベースとなった、Windowsの技術がバックグラウンドにあります。ただ、このWebJobsを創るためには、そこまで大変ではありませんが、ちょっとめんどくさい部分があったのは事実でした。

2.1. トリガ

 Azure Functions では、Severless を実現するため、この仕組みをつかって、そもそもの Web Appsすらも起動することなくこのサービスを利用可能にしました。想定するシナリオとしては

f:id:simplearchitect:20161005075949p:plain

  • Timer
  • Data Processing
  • Webhook + API

 それに加えて、Blobストレージ(S3相当)へファイルをアップロードする、Queueにメッセージを投げるなどのきっかけを元に、プログラムを実行します。結果は、Blob(S3相当)、HTTP, ServiceBus (SQS相当)、データベース、通知のハブや、SendGrid, Twilio へのサポートをテンプレートレベルでサポートしており、他のものも自分でコードを書けば何とでもなります。

2.2. インプット / アウトプット

インプット、アウトプットのリソースとしては、様々なサービス、プロトコルと連携します。下記の図がわかりやすいと思います。

f:id:simplearchitect:20161005081743j:plain

Azure Functions の画面では次のようなイメージでインプット、アウトプットを設定できますし、設定ファイルでももちろん設定できます。

f:id:simplearchitect:20161005081302p:plain

f:id:simplearchitect:20161005081321p:plain

2.3. 言語

使用できる言語は、C#, Node.js, F#, Python, PHP, 等、、、と書いています。他にもBashや、Cmd、PowerShell等も動作するみたいですし、私の同僚は、Goを動かすものを書いていました。

github.com

2.4. プログラム構成

 これはC#の例ですが、下記のようなプログラム構成になっており、run.csxがC#のファイルです。function.json が設定ファイル。そしてproject.json は、nugetパッケージ(npm や、Ruby gemsの様なもの)を取得するために使えるファイルです。

function.json

{
  "bindings": [
    {
      "name": "myBlob",
      "type": "blobTrigger",
      "direction": "in",
      "path": "pictures",
      "connection": "pooryou_STORAGE"
    }
  ],
  "disabled": false
}

project.json

{
  "frameworks": {
    "net46":{
      "dependencies": {
        "Microsoft.ProjectOxford.Face": "1.2.1.2"
      }
    }
   }
}

今回私がデモで使用したソースコードは、簡単ですが、GitHubにあげておきました。より細かい情報は、佐藤さんがPowerPointの資料に書いてくれています。より細かいプログラム構造(nodeの場合)、使える言語、トリガの種類などです。

github.com

2.5. AWS λと比較したメリット

ブースにいるときにAWSを普段使っておられる方から、「ここはAzureのほうがいいね!」と言っていただいたポイントがいくつかあったので、それを共有しておきたいと思います。私も深くAWSの事を知っているわけではありませんが、あくまでブースに来ていただいた人から学んだことですので、細かいミスなどはご容赦ください。また、そういうものがあれば本ブログをリンクして是非皆様のブログでフォローしていただければと思います。

これは個人的な意見ですが、ざっくりうと「すべてをコントロールしたい人は AWS」、「レールに乗って楽したい人は Azure」というイメージを持っています。  もちろん、Azure でも、Linux/Windows の IaaSとかは使えますが、Azureの面白さはやっぱり、PaaSや、SaaSだと思います。またこの辺りは別のポストでお話ししてみたいので、割愛します。

Azure Functionsに絞ると、ざっくりいうと次の通りです。

  • わかりやすいGUI
  • 様々なトリガ、イベント
  • プログラム構造の透明化
  • デバッグ機能の充実
  • Azure の機能との連携
  • API Gateway不要

2.5.1. わかりやすい GUI

統一されたわかりやすい GUIは、Azure の良さの一つです。 Azure Functions の場合は、結構 Azure で操作する、エディタがなかなかイケています。なぜなら、このエディタはかのエリック・ガンマが作成した、Visual Studio Online の技術が使われているからです。彼もマイクロソフトの一員です。結構これだけでも、自分的にはうれしい!

f:id:simplearchitect:20161005083911p:plain

2.5.2. 様々なトリガ・イベント

Serverless の選定要素の一つを現在実現されているもののみで考えると、どれぐらいいろいろな、トリガや言語に対応しているか?というのがキーになると思います。Azure Functions では、Blob(S3相当), Timer, IoT/EventHub, Webhook, http, Queue(SQS相当), SaaS SendGrit, ServiceBus等のトリガに対して、C#, Node, Bash, PowerShell, Python, PHP等多くの言語に対応しています。

f:id:simplearchitect:20161005081743j:plain

2.5.3. プログラム構造の透明化

 λでは、サーバレスのコードを書くとそれが、どういう形で格納されているかわかりません。一方 Azure Functions では、先に説明 した通り、構造が明確であり、サーバーレスですので、しばらくしたら寝てしまいますが、サーバーぽいものの中にどのように格納されている かが、KUDOというツールで見ることができます。また、パッケージマネージャ(npm, nuget)等も、使えるというのも利点です。

2.5.4. デバッグ機能の充実

 デバッグも先のKUDUを使ってログを見たり、コマンドをたたいてみたりということができて大変便利です。

f:id:simplearchitect:20161005153506p:plain

2.5.5. Azure の機能との連携

 これはあまり比較のメリットではありませんが、Serverless の場合、いかに楽にnano serviceを書けるのががポイントになると思います。そのケースで、Azure はいろんなサービスがあり、Azure Functions と連携しているのでこれはラクチンです。

2.5.6. API Gateway不要

 AWSAPI Gateway に相当する httpのトリガが用意されていますので、API Gatewayの様なものを設置する必要がありません。つまりそこに課金もされません。

もちろん、λの利点もあると思いますので、このようなメリットデメリットを考慮して皆様の環境で便利なほうを是非ご利用ください!先行されておられるAWSさんと比較してもなかなかのものですね。(2016/10/3時点の情報)

 ちなみに、ブースの会場で、AWSの方と話したのですが、「競合とかなんとかいうより、Cloudをもっと多くの人に使ってほしいですよね」という素敵な話されていて、本当にその通りだなと思いました。DevOps もそうですが、競合とかそんなパイを食い合うようなセコい話ではなくて、もっと多くの人がCloudを使うようになれば、みんなHappyになってくると思います。

3.デモンストレーション

 当日じっくり解説する時間がなかったので、こちらのデモの内容とコードを公開しておこうと思います。このデモは、Unityと、Cognitive Service という、マイクロソフトのAIの研究の成果を使ったAPIサービスを利用しています。

f:id:simplearchitect:20161005084400p:plain

github.com

弊社の藤本氏が作成した、Interactive いちゃLoveゲームというUnityで作られたゲームが元になっています。このゲームは、Cognitive Service のEmotion APIという人の顔の感情を読み取るAPIを使っています。ゲームをやっている人の感情に合わせてゲームの反応を変えるというデモンストレーションです。スペースバーを押すと、PCのカメラで画像を撮り、それを、Emotion APIにRESTベースで送付して感情分析をして、キャラクターの振る舞いを変更しています。  キャラクターデザインと、ボイスは、ちょまどさんが担当しています。

 この面白いゲームの詳細を知りたい人は、次のブログポストで説明されています。

qiita.com

 私の方では、このゲームに対して、プレイヤーの属性を分析したいと思ったので、写真を撮った後に、それをBlobストレージ(S3相当)にアップし、それをトリガーに、Azure Functions(λ相当) を起動しています。Functionsで、Cognitive ServiceのFace APIをコールして、プレイヤーの年齢、感情、顔の輪郭、ひげの位置などの情報を分析して、それをSQLサーバーに送付しています。このFACEAPIを使うと、社員をいくつか覚えさせると、その人かどうかの判別を行うこともできます。  最後に、PowerBIというBIサービスにその情報を連携させて、分析を行うというデモでした。実際に、Serverless アーキテクチャを使うと、簡単に実装できたのでとても楽しかったです。パターンとしては、ある意味王道的な使い方ですが、本当にさっくり作ることができました。これは楽です!

f:id:simplearchitect:20161005084732j:plain

ご興味がある方は、ソースコードを置いておきましたので、ご参照ください。実は佐藤さんは、更に凄いCognitive Service を使い倒したデモを用意していましたが、時間の関係でお見せできませんでした。

4. Azure の関連情報

さて、AWSを使ったままでも使える、Cognitive Service 等の情報を共有しておきたいと思います。 Cognitive Service に関してはエバンジェリストの大森彩子さんがいい資料をたくさん作ってくれています。紹介したもの以外にも動画をリアルタイムに解析したり、画像/文章の感情分析したり、言語解析したり、翻訳したりとむっちゃ凄いサービスになっているので、個人的にも熱いサービスですが、REST-APIを呼ぶだけなので簡単に使えます。 次のような情報が日本語でもあるようです。

1. Cognitive Services の機能紹介などは MSDN Blog

blogs.msdn.microsoft.com

2. 実装方法など具体的な手順、コードなどは Qiita

qiita.com

3. 説明資料 (PPT)

docs.com

最初のステップとしては、以下の記事がおすすめです。

a. Cognitive Service でできることをざっと知りたい人向け (from ①)

「人間にとって “自然な” アクションの実装 ~ Microsoft Cognitive Services を始める前に」

blogs.msdn.microsoft.com

b. エンジニアで実際にコード書いて理解したい人向け (from ②)

人工知能パーツ Microsoft Cognitive Services を使った表情分析アプリを作ろう!」 Emotion API × JavaScript

qiita.com

Emotion API × Bot Framework (C#)編 qiita.com

Azure Functions のサンプル等

真壁さんがこんなサンプルとその解説を書いてくれています!

Azure Functionsで運用管理サーバレス生活(使用量データ取得編) · re-imagine

まだ仕掛ですがこんなものもある様子

github.com

もちろん、プレゼンテーション資料にもたくさんリンクをつけていますので、Azure Functions 自体の資料もお楽しみください。

5. Serverless に感じる未来

マーチンファウラー氏の、Serverless アーキテクチャで有名なサーバーレスですが、日本語では、会場にも来てブースをサポートしてくれていたデプロイ王子こと廣瀬一海さんの記事が私はわかりやすくて好きです。

japan.zdnet.com

今回のサーバーレスカンファレンスでも、いろいろ面白い事例や使い方が出てきてとても面白かったのですが、Nano Serviceという言葉もある通り、マイクロサービスとのつながりもとても強く感じました。

個人的な意見では、現在マイクロサービスの環境がたくさん出ています。例えば、DC/OSは、データセンタOSと呼ばれて、クラスタ自体をまるで1台のサーバーかのように扱い、リソースのアロケーションをしてくれたりします。大変未来的で私は大好きなプラットフォームですが、残念ながら現時点では、せっかくリソースを最適化してくれていますが、使わなくても、使っても、VMを上げておく必要があります。 デプロイ後もVMの存在を意識する必要があります。

現在のアーキテクチャでいうと、IaaS, Container, PaaS, Serverless の順番にどんどんやることが減っており、よりプログラムに集中できる環境ができています。ただ、現時点では、Serverless は、サーバーを立てるまでもないものや、グルーコード、イベントの処理などの簡単なもに対するユースケースがうまく行きそうです。

 しかし、ちょっと先の未来を見ていくと、DC/OSみたいなサービスは本来、VMの存在は忘れてリソース配置をしてくれるものだと思いますし、PaaSもできれば、VMの境目を意識しなくていいような状態になったとしたら、凄く楽で便利な世界が広がると思います。  つまり、それは思いっきりサーバーレスの世界で、サーバーレスで出来ることが、PaaSと、現時点でのサーバーレスで出来ることの間が縮まって、PaaSと見分けがつかなくなるときに、本当にサーバーレスの凄い世界がやってくる気がします。しかも、それは、たぶん数年とかからない気がします。私が知らないだけですでにそういうものが存在するかもしれませんが。

 また、Ito Naoya さんのパネルもすごく面白いお話しでしたが、最後に、「この事例は、本当は、Actorを使うとうまくいくと思う」という話をされておられました。個人的に、マイクロソフトの出しているものでも最もホットなものとして、Service Fabricというのがあります。 これ激アツです。これは、マイクロサービスのPaaSというとんでもないもので、もともと、Azureの各種サービスに使われていた基盤を公開したものです。Stateless/Stateful のサービス、そして、Actorをホストしてくれます。Stateful / Actor に関しては、デプロイするとサーバーに対して、レプリカを自動で組んでくれて、VMがダウンしたとしても、メモリを共有しているので、処理がそのまま継続して実行されたります。つまり、Netflixさんがやっているような、カオスモンキーを使うようなFault Injectionをぶちかませる基盤が最初から手に入る感じです。実際に、Service Fabric には、そのようなChaos Testing のAPIが最初から組み込まれています。

 そして、Actorをガンガンにサポートしています。次のゲームとかを見ると基盤の凄さが伝わるかもしれません。余談ですが熱くなってしまいました。

f:id:simplearchitect:20161005153957p:plain

web.ageofascent.com

このように、Azure も個人的には激熱なテクノロジーがたくさんあって、むっちゃ楽しいです。是非皆さんもよかったら楽しんでくださいね!

最後に

主催の吉田さんが、世界に向けて、日本のServerlessの盛り上がりを記事にされておられます。素晴らしいです!

read.acloud.guru

これは単に宣伝ですが、Azure が気になる方はこんなイベントもあります!

microsoft-events.jp

「それ、アジャイルできてへんのちゃいますか?」チェックリストの公開

 DevOps を導入して、リードタイムの短縮などの効果を出したい時に、前提条件となっている「アジャイル」がまだ導入できていないケースが多い。そういったケースでは、まずアジャイル導入のご支援をすることもよくある。

f:id:simplearchitect:20160923161901j:plain

 そういった支援に入ると、「アジャイル導入前提」で構成されたはずのプロジェクトであっても、全然「アジャイル」のポイントを外しているというケースは珍しくない。更に問題なことに、「アジャイルをできます!」と言っているベンダーさんを連れてきても、全然ポイントを外しているというケースすら珍しくない。今回のブログではそういったケースでも、簡単に確認できる、「アジャイルになっていないかもしれない簡単なチェックポイント」を対策付きでいくつかご紹介しよう。  スプリントの中で、ウォータフォールを実施するのではない。それはミニウォータフォールというバッドプラクティスだ。

1. 進化型設計ができていない

 アジャイル開発を実施するということは、単に繰り返し型で開発すればいいものではない。アジャイルは「変化に対応する」ことが大きな目的の一つになっている。スプリントや、イテレーションで繰り返し型の開発を行う場合、繰り返し型で開発を行って、変化があっても、メンテナンスを実施しやすいコードベースをキープしないといけない。  そうでなければ、早晩、プロジェクトはメンテ不可能になって破たんする。スプリントを通して、変化を受け入れても、メンテ可能な状態を保つには、十分な自動実行できるユニットテストが書かれている事、変更があったときに、それが自動で検査されること、そして、設計が「変化前提」の方式になっているということが重要だ。

 こういったアジャイルにおける「テクニカルプラクティス」やその「マインドセット」を学ぶには、Extreme Programming を学ぶのが一番おすすめだ。更に高度なテクニカルプラクティスを学ぶには、DevOps のプラクティスを学ぶとよい。

 アジャイルは世界的にスクラムが最も流行っているが、スクラムの作者も、「テクニカルプラクティス」を軽視しているわけではない。確か、Ken Schwaber がQ&Aでこんなことを言っていた。

Q: スクラムを採用しているが、エンジニアリングがちゃんとできないメンバーだったらどうなりますか?

A: うん。10倍のスピードでものができるよ。ただしゴミだけどね。

 スクラムを回していても、ソフトウェアを開発しているケースでは、「テクニカルプラクティス」を無視してしまうと、非常に危険なこと になる。

1.1. テスト駆動開発

 まず、最初におすすめしたいのが、テスト駆動開発(Test Driven Development) もしくは、振る舞い駆動開発(Behavior Driven Development) で開発するのをおすすめしている。最先端での議論では、TDDは死んだと言っている向きもあり、すべてをそれで開発しなくてもいいが、このいづれかの開発スタイルが「やろうと思ったら出来る」ということは絶対的に重要だ。だから、これが「できない」と言っているアジャイルベンダーは「エセ」といっても差し支えない。変更があったら当然テストが必要だが、変更が当然のアジャイルで、変更の度に全量手動テストなんてやってられないだろう。

 十分な単体テストを書こうと思うときに、後追いで、ユニットテストのコードを書くと死ぬほど難しく、複雑になる。本番のコードは甘くないのだ。じゃあどうする かというと、少しだけ先に「テストコード」を書いて、テスト実行。エラーになったのを確認してから、本番コードを数行実装、テストを実行してパスしたら、次のテストコードの実装を少しだけ、、、更に、コードが重複したら「リファクタリング」という方法でコードの設計を改善する。  このようなステップを踏んで開発をすると、常にテストコードが十分な状態で無理なく開発を進めることができる。イメージがわきやすいようにビデオを作成したので、参考にされるとよいかもしれない。15分程度だ。

docs.com

1.2. 進化型設計 

   次に進化型設計アジャイル以前の世界の設計の考え方は、Big Desgin Upfront という設計の方法だ。時間をかけて分析、設計を行って、そのあと実装やテストに入る方法だ。一方、アジャイル以降は、進化型設計と言われる方法をとっている。ソフトウェアエンジニアリングの技術、例えばデザインパターンなどの知識が変わるとかそういう話ではないが、設計の進め方が変わる感じだ。これは、次のようなパラダイムの変更が影響している。

f:id:simplearchitect:20160923162637p:plain

この図はExtreme Programmingから紹介された概念だ。1つの変更に対してどの程度変更のコストがかかるか?という図になっている。ウォータフォール開発時代は、一つの変更に対するコストは、後のフェーズに行けば行くほど指数関数的に高価になってしまっていた。例えば要件定義フェーズで問題を発見したら、要件定義書を直すだけだが、テストフェーズで発見したら、実装をおなして、設計書を書き直して、要件定義書を、、、といったように非常に高くついてしまう。  だから、要件を固めよう!ということを一生懸命やっていたのだ。一方アジャイルの世界では、テスト駆動開発などで適切に自動テストが書かれており、継続的インテグレーションにより、それが常時結合されて、テストされており、なおかつ、「進化型設計」を用いて、変更が簡単にできるのであれば、開発の後半になっても一つの変更に対するコストがあまり変わらないという状態を創れるようになった。

f:id:simplearchitect:20160923163844j:plain

Big Design Upfront で設計している場合、最初の設計で想定していない変更が入ると、どんどん設計は崩れていく。そもそも、設計に長く時間をかけても、現在のソフトウェアは実装するまで本当のところがわからないケースが多いため、実装せずに設計するのは相当に難しいことだ。一方、進化型設計は、テスト駆動等を用いて、テストがある状態をキープしているので、変更を行っても、おかしくなったらすぐわかるし、DRY(Don't Repeat Yourself)をはじめとしたマインドセットでコードが作られていると、1箇所変えるだけで変更ができるので、こういった、コストカーブが実現できるようになる。だから変更に強くなる。

 ということは、そういうことをしていなかったら、いくらアジャイルっぽくスプリントを回したところで、ソフトウェアはその変更に耐えられなくなってしまう。だから、テスト駆動などの方法を学んで、常にクリーンコードを書くことを実践しないと、あなたのコードベースは遅かれ早かれメンテ不能に陥ってしまう。

マーチンファウラー氏の進化型設計のページ

 こういったことは、ツールをいくら導入しても解決できない。これは「開発の習慣」だから、本を読んでもすぐにできるわけでもない。じゃあどうするかというと、本当に「テスト駆動などの開発習慣を何年も当然として実施できる」メンバーを開発チームに入れるのだ。これは数カ月でもいい。本で読んでもすぐわからないかもしれないが、そういう「イケメン」と一緒に開発をすると、「あーこうだったのか!」と簡単に理解できる。ただ、こういう「技術イケメン」は普段あなたがお付き合いしているベンダーにはいないかもしれない。実際問題として、できないベンダーでも受注するために「できます!」というケースもあるし、自分が「できない」ことに気づいていないベンダーさんも多い。これを、一人で見分けるのは最初は難しいかもしれないが、シンプルな方法としては、アジャイル系のイベントに参加して、スポンサーセッション以外で登壇している人を捕まえて、その人に、「テスト駆動をホンマにできる人紹介してくれませんか?」とお願いしてみよう。そしたら、本当にそういうことができるベンダーさんを教えてくれるだろう。アジャイルができる人は、ちょっと話をしたら、誰がちゃんとできるかもわかるものだ。   もしくは、t-wadaという男を見つけて、彼にしっかりとした対価をお支払いするのがいいかもしれないw (注:TDDと言えばt-wadaと言われる日本のテスト駆動の大家ですw)

twitter.com

もちろん私に聞いてもらっても結構だ。

1.3. スプリントはミニウォーターフォールではない

 よくある誤解で、スプリントの内部はウォータフォールになっているというのがある。実際はそうではない。進化型設計で開発すると、「要件ー>分析・設計ー>実装ー>テスト」という順番で物事は進まない。

f:id:simplearchitect:20160923170842j:plain

先ほどのテスト駆動開発だって、そもそも実装の前にテストであり、実装をした後にリファクタリングで「設計」変更を行う。進化型設計とは、常に設計をしているような状態だ。実際に実装してから、ユーザさんに見せると、「あーイメージが違うよ」となるかもしれない。それは要件を確認している行為だろう。  つまりアジャイルの開発では、要件、分析、設計、実装、テストはいったり来たりする感じで開発されるので、シーケンシャルに流れるものではない。だから、もしそうなっていたら、ミニウォータフォールと呼ばれるバッドプラクティスに陥っている可能性が高い。これも、先ほどの「良い開発習慣を持った人をチームに雇う」ことが最も良い解決策だと思う。 

2. ビルドが中心になっていない

 次によくありがちな状態としては、開発のスケジュールが決まっていて、機能1を第一スプリントで、機能2を第二スプリントで、、というような形態になているケース。

f:id:simplearchitect:20160923164229j:plain

これは何が問題か?というと、アジャイルの考え方では、「動作するアプリケーションで物事を判断する」ということがある。例えば、機能1ができて、機能2ができてから、機能3を作ってやっとお客様に見せて価値があるとかいうスケージュールになっている場合が多い。でも、それだと、第三スプリントが終わるまで、仕掛品を作り続けていることになり大変危険だ。アジャイルの場合は、最初のスプリントから、価値の出る単位で、開発していこう。別に「最終製品」のクオリティが実装されていなくてもいい。 最初のうちに必要なのは、価値の出る単位ものが、つながってビルドとなっているかだ。仕掛品は、つなげてみるまで結局本当にできているかはわからない。だから小さくてもいいし、機能がフルに実装できてなくていいので、つながっているものを創っていく。最初に作ったものがそのまま本番に使われると考えるよりも、最初のものは、アーキテクチャ的だったり、仕様的だったり、どれが正しいかを探索する実験のようなものだ。工数をかけず、さっとつなげて、ビルドをつくって、そこからフィードバックを得よう。だから、がっつり機能1、機能2を実装していくなんてことは、本当にそれでよいかわからないものに対して多大な工数をかけていくことに他ならない。 それは大変アジャイルの世界では危険な行為なのだ。まずそれがそのプロジェクトにとって「正しいか」を確かめよう。最小の工数で。

3. 予定の機能の実現がMUSTになっている

 さらによくあるのが、予定の作業をすべて実装しようとしているケースである。アジャイルでやったからといって、自動的にウォーターフォールに対して生産性が強烈にアップするだろうか?ポイントは、「無駄なことをやらない」ことだ。すべての機能実装を100%やって、それを劇的に早める方式などない。

f:id:simplearchitect:20160923171235j:plain

 しかし、実際のところ、機能のうち、本当に使われるものは、40%未満だ。それを考えると、使われない機能を実装しないだけで、生産性は倍になる。多くの人は、「たくさん早く実装する」ことがよいと思っているかもしれないが、ポイントは、「やらないことを見つける」事だ。そのためにアジャイルでは「スプリント」をつかって学びを得て、いかに少ない工数で、より高い価値を提供するかを追求している。ものをたくさん生産したらたくさん価値が出るわけではない。だから、最初に予定している機能を100%実装するということは、無駄を大量に実装していることになり、そんなことをしたら、アジャイルで開発しても全然価値が出ないことになる。

 たくさん機能を実装したら、たくさん価値が出るという考えを捨てることから始めよう。

simplearchitect.hatenablog.com

 こういう「マインドセット」は、プロジェクトの開始前に関係者にプレゼンテーションなどをしてシェアするのをおすすめしている。後出しじゃんけんになると、反発してくる人も多く出てくるが、始まる前で、かつアジャイルを導入しよう!と会社で決めているならば、皆さん喜んで学ぼうとしてくれる。アジャイルコーチを採用して、こういう事を最初の段階から共有するようにしよう。「シンプルさ」に関するマインドセットもExtreme Programming から来たものだ。

Do The Simplest Thing That Could Possibly Work

You Arent Gonna Need It

Once And Only Once

4. マネージャーの指示でチームが動いている

 最後のアンチパターンとしては、マネージャの人が、スプリントでの実施内容を決めていたり、マネージャの指示にしたがって、メンバーが動いているようなケースだ。

f:id:simplearchitect:20160923164915j:plain

アジャイルの場合は「自己組織チーム」といわれる考えでチームを運用する。チームに技術的決定や、タスクの分割、割り当て、見積もり、、などなど大きく権限を与えて彼ら自身が考えて判断するようにする。DevOps の時代でもそれが進化したフィーチャーチームという考えになる。そこには開発チームだけではなく、Opsのメンバ、テスター、プロダクトオーナーも含まれる。そういうチームにがっさりと権限を与えて、彼ら自身に判断してもらいながら、プロジェクトを遂行させる。  普段プログラムを書いていない人が、現在の流れのはやい技術の世界で正確な指示が出せるはずもない。諦めて、彼らに任せよう。もしかすると、受け身なメンバーを見ていると、任せるのが不安かもしれないが、任せて、メンバーも慣れてくると、生き生きと自分で考えて行動するようになってくる。最初のしばらくの辛抱だ。  そうやって、自己組織チームができてくると、上の人が判断していた時代と比べても、圧倒的に早く生産的でイノベーティブになることができる。

 任せる方法がわからない場合は、やはりアジャイルコーチをやとって、自己組織チームを構成するようにするとよい。組織的にそれが現在はできないって? 上に掛け合って実現しちゃえばいい。人事制度がって?変えればいい。やらなければ、生産性が相当わるくなって、チームがやらされムードに支配されてあまり生産的でもイノベーティブにもならないだけだ。

5. 日本の「常識」で考えている

 最後に、私の自戒も込めて。我々はどうしても、制約事項を「日本の常識」で考えてしまい、「これはできない」とか判断してしまいがちだ。しかし、アジャイルは西洋の人が考えたものなので、西洋の人の考え方を学べば、もともとどういう概念でそれが提唱されたか、どういう前提条件があるのかが非常に理解しやすくなる。

 これに関しては今すぐおすすめの解決策はなく、私のブログを読んでぐらいしかないのだが、現在Rochelle Koppさんという専門家の方と共に、そういった考え方を学びやすくする取り組みを始めている。しばしお待ちを。

おわりに

自分の経験ベースではあるが、日本の現場におけるアジャイルアンチパターンとその対策についてまとめてみた。より多くの人が、アジャイル開発を実施して、実際にそのメリットを享受できればという思いでまとめてみた。基本的には、ツールや方法を表面上インストールしてもたいした変化は期待できない。重要な事は、本質を理解しすること、それから、良い開発の習慣を身につけることだという理解を持つこと。考え方や、習慣はすぐには身につかない。だからこそ価値があり、効果がある。

少しでも皆さんの参考になれば幸いである。

アジャイルを創ったアリスターのひとこと

f:id:simplearchitect:20160911181258j:plain Fig1. アリスターとXPJUGの仲間 2002年

How I saved Agile and the rest of the world

アジャイル開発」そして「オブジェクト指向」などに多大な貢献をしたアリスターコバーンさんが、最近こんな記事を公開した。

Alistair.Cockburn.us | How I saved Agile and the Rest of the World

アジャイル」が広まりだした2000年当初、アリスターは、Kent Beckと共に日本に来てくれた。本でしか見たことがない、想像上の偉人のように感じていたアジャイル界の大物の来日は衝撃的だった。当時は外タレの来日は非常にまれだった。これはテクノロジックアートの長瀬さんそして、XP JUGのコミュニティの貢献が大きかったと思う。しかも、東京だけではなく、関西に来てくれたのだ。

 当時、アジャイルの世界は今のようにScrumが最も普及したものではなく、Extreme Programming という手法が全盛だった。ソフトウェアエンジニアリングの世界でも大上段で複雑なプロセスが主流で、エンジニアリングらしく、「誰がやっても同じ結果が出る」ということを目指したプロセスがほとんどだった。Extreme Programming は、プロセスより個々の「人」に注目した方法で、ペアプログラミングや、テスト駆動開発継続的インテグレーションなどマインドセット、技術の両面で世界に衝撃を与えた。私も大好きなExtreme Programming だが、常にどんな時でも使えるというものではなかった。

アリスターコバーンがくれたもの

 アリスターコバーンは、「クリスタル」シリーズと呼ばれる方法論を発表していた。彼の考え方は「すべてにあう一つの方法論は存在しない」という考えであり、クリスタルシリーズは、クリスタルオレンジ、クリスタルイエロー、クリスタルクリアーと様々なケースに合わせて考えられたものであり、私が最初に大変お世話になった「アジャイルプロジェクト管理」は非常に実践的で、大変参考になった一冊だった。

books.rakuten.co.jp

更に世の中のアジャイル本の中でも最もディープな内容を持ったものの一つが、「アジャイルソフトウェア開発」だ。人やプロジェクトは異なるという彼の考えの結果生まれた本書は、人やソフトウェアの開発に非常に深い知見を与えてくれる。

books.rakuten.co.jp

それ以外にも、ユースケースの書籍の中で、自分的に最も完成度が高く実践的な「ユースケース実践ガイド」も彼の書だ。この一冊でほかは読まなくていいぐらいの完成度とオリジナリティだ。

books.rakuten.co.jp

アジャイル開発宣言

そんな多大な貢献をした彼は、「17人のライトウェイトな方法論」をそれぞれ作っていた人を集めて、「アジャイル開発宣言」をまとめ上げた。今回の記事はその経緯と、17人それぞれがどういう人なのかを紹介している。そして

What I hope you see is that the Agile Manifesto was the product of 17 people from different schools and backgrounds. No one person is responsible for the words we came up with – it is clear that it was the product of all 17 people. The addition or removal of any 1 person would have changed the outcome, something we recognized and discussed at the end of that meeting.

貼り付け元 http://alistair.cockburn.us/How+I+saved+Agile+and+the+rest+of+the+world

日本語訳例

私があなたにアジャイルマニフェストに対してどういう風に考えてほしいか?というと、アジャイルマニフェストは、17人の違った知見、バックグラウンドを持った人のプロダクトということだ。誰かが「アジャイルマニフェスト」という言葉を思いついて責任を持ってるとかではない。一つだけはっきりしているのは、17人全員のプロダクトであるということだ。もしたった一人の人が減ったり、増えたりしても、我々がそのミーティングで、認識してディスカッションした結果は違ったものになっていただろう。

アリスターのひとこと

彼が以前日本に来たがっていたときに、こんなことを言っていた。

I'm not famous enough in Japan. (私は日本ではそんなに有名じゃないから)

私はとてもびっくりした。彼よりアジャイルで有名で、業界に貢献した人は誰がいるのだろう?私は彼にこう答えた。

あなたは、アジャイルの父じゃないか?私は信じられないよ。

かれはこういった。「アジャイルは私のものではない。17人の人々によって生まれたものだ。17人の成果なんだよ。」と。そんなことをこの記事を読んで思い出した。

アジャイルの本当の理解のために

現在アジャイルというとScrumが有名で、Extreme Programming が次に来る。現在DevOps の世界が来ているが、Scrumで世界に受け入れられたアジャイルが、DevOpsの時代になり、Extreme Programmingのようにクラウドとともにテクニカルプラクティスが戻ってきた感を受ける。

しかし、私がアジャイル導入にかかわっていつも感じるのが「アジャイル開発の根本の考え方」みたいなものがあまり浸透していないことを感じる。アジャイルは、Scrumと、Extreme Programmingを指す言葉ではない。クリスタルシリーズ、FDD、DSDM等様々な手法があり、それぞれの手法からいろいろな学びを得ることができた。アリスターのいう通り、すべての状況にフィットするものなどないのだ。

でも、我々にはアリスターがいた。講演をしてくれて、日本に来て、一緒にたこ焼きを食べて、いろんなことを直接教えてくれた。そんな彼が日本に来たいのに来れない現状を何とかできないだろうか?

我々がアリスターに出来ること

私にできることはたぶんブログを書いたりすることぐらいかもしれない。しかし、彼は私がエンドースしたいという理由を除いても未だ素晴らしく魅力的なのだ。  最近の彼は、アドバンスドアジャイルマスタークラスを定期的に開催して非常に高い評価を得ている。そして、ICAgile というオープンで本質的な認定をリードしたり、ハートオブアジャイルというより「人」に踏み込んだカンファレンスを開催している。

www.tabar.com.au

Heart of Agile | Rediscovering the heart and spirit of agile

books.rakuten.co.jp

Alistair.Cockburn.us | Alistair Cockburn

 個人的にもアドバンスドアジャイルマスタークラスは最高に受けてみたい。アジャイルの「入門」を終えた皆さんも本物かつ現役でインパクトを出し続ける「アジャイルレジェンド」に日本にもう一度来てもらう機会を作りませんか?

彼が「日本では有名ではない」という状態はもったいなすぎるよね!

おまけ

最後に私も興味ありありの、Advanced Agile Master Class のコース概要に関して日本語訳をつけておこう。前からこれはホンマ出たい!ちなみに、参加者のコメントを見るとガチで凄そう!

Advanced Agile Master Class with Alistair Cockburn

Modern “expert” agile practitioners have mastered the practices – but not why they work, not how to adjust practices to situations, not how to approach new and surprising situations, not how to apply agile practices to non-software projects, not how to incorporate results from other fields back to their own projects, not how to tailor the practices to different organizational cultures. This advanced course from industry guru Dr. Alistair Cockburn addresses those areas.

In this discovery-filled course,

  • Learn why agile works, in software or outside of it,
  • Learn how to articulate and deal with the weaknesses in agile development,
  • Test yourself and your partners with the Test-Driven Carpaccio exercise.
  • Learn to reduce risk and maximize results by viewing design as a Knowledge Acquisition activity.
  • Practice backing up your recommendations with solid theory, not just an appeal to authority,
  • Learn how to plan and track larger, more complicated projects using Story Mapping or Blitz Planning (time permitting),

. . . and most of all

  • Come face-to-face with yourself, your strengths and your weaknesses, as you confront one situation after another with equally inquisitive classmates.

アドバンスドアジャイルマスタークラス

最近の熟達したアジャイル実践者は、「プラクティス」をマスターしているでしょう。しかし、なぜそれがうまくいくかはわかっていないかもしれません。どうプラクティスを特定の状況に当てはめるかはわからないかもしれません。また、新しくて、驚くべき分野にどう適用できるのか、ソフトウェア以外の分野にどう適用するのか、他の分野のプロジェクトに戻った結果との協調や、他の組織文化へのテーラリングなのについてもわからないでしょう。このアドバンスドコースは、この産業のグルであるアリスターコバーンが次の分野について教えてくれます。

次のような発見に出会うかもしれません

  • なぜアジャイルがうまくいくか、ソフトウェアそして、それ以外で
  • アジャイル開発に熟達し、その弱点を扱う方法
  • 自身とパートナーをテスト駆動カルパッチョエクササイズでテストする
  • リスクを減らして、結果を最大化する。知識によってデザインを見ることによって。スキルを高めるアクティビティ
  • 確固たる理論で、あなたの推薦事項をバックアップする練習。単に権威に対してアピールする方法ではなく。
  • 大きくてより、複雑なプロジェクトを計画して、トラッキングする方法。ストーリマッピングと、ブリッツプランニングを使って(時間があるなら)

・・・そして、より重要なこと * あなた自身に向き合うこと。あなたの強さ、弱さ。敵対する一つの状況から、別の状況に対峙する。同じように興味をもっているクラスメートと

次回は11/15 - 17 メルボルンみたいですね。

www.tabar.com.au

英語鎖国で深刻なのは情報入手のスピードじゃないと思う

エンジニアに英語が必要と言われて久しい。技術情報を早く入手するためには、英語を使えないといけないからとあるがこれは本当なのだろうか?自分的な気づきがあったので、その考察をシェアしたい。

f:id:simplearchitect:20160906194626j:plain

 エンジニアに英語が必要と言われている。いろんなことが言われているが、情報の入手のスピードが遅くなるという意見がある。個人的にはこの意見はある意味微妙な意見だと思う。 最近だと例えば最新技術に関する海外イベントがあったとしても、翌日、早ければ当日の間に誰かがまとめブログをアップしてくれたりする。もっと時間がかかったとして、2カ月程度後に誰かが書いた日本語の情報でそのことを学んだ ところで、大勢に影響はない。 また、日本語で出ている書籍は確かに翻訳のタイムラグがあるが、海外の人も主だったすべての本を読んでいるわけではないし、日本語になったものを着実に勉強しても、勉強の知識としては、相当なエンジニアになれるはずだ。 では、なぜ?

日本人の英語アレルギー

日本にいると、英語の拒否っぷりにすがすがしい気分すら覚える。私は英語でもブログを書いているが全く読まれないし、それどころか、Facebook に英語でポストするだけで、「いいね」はほとんどつかない。もちろん、英語のMeetupには絶望的に人がいないし、海外の人と会議をしても全くしゃべらない人も多い。

f:id:simplearchitect:20160906200438j:plain

一方、ネイティブじゃなくても、他国の人は英語がむっちゃくちゃでもとにかくしゃべってコミュニケーションを取ってくる。昔、今のインターナショナルチームに入った時に、最初は同僚がしゃべりまくるスカイプコールがつらくて、Damien に自分は英語がうまくないからといった時がある。そしたら彼はこういった。

Tsuyoshi は英語がうまいよ

私は明らかに同僚より全然聞けていない感じがする。しかし、それは、Damienが気を利かせたわけではないということに気づいた。彼らの中には文法とかぐっちゃくちゃの人もいる。それに比べると私のは相当ましということなのだろう。彼にとってはそう聞こえようだ。  私がどうこうではなく、本来高度な教育を受けている日本人は平均して、英語はわるくないのかもしれない。ところが、圧倒的に英語を「敬遠」する人が多いように感じる。  私は厚かましいたちなので、あまり遠慮はしないたちだが、同僚と働いている中で「英語」を避けることの本当の大きな問題に気が付いてきた。

インターナショナルチームでの苦悩

 インターナショナルチームでは楽しくやらせていただいているが、一つだけ心苦しいことがある。自分のチームに対してバリューが出せていないのだ。私の純粋なチームには「英語ネイティブ」はいない。だけど、彼らは全員英語で仕事をしている。それは、対お客様に対してもだ。もちろんイベントの資料もそうだ。だから、彼らは自分が作った資料やアセットをチームに共有すると、他のチームメンバーがとても喜ぶ。英語でデモをするコードを作ったら超喜ばれる。  ところが、日本だけが、日本語で書かないとお客様や、イベントでは見向きもされない。だから、私がどんだけ一生懸命資料を作ったところで、それは日本限定であり、チームには貢献できない。

 他にもある。私のチームで、PartsUnlimited という、Hello Worldレベルではない DevOps のハンズオンラボをGitHub 上で公開している。今期の戦略に合わせて、その内容を修正/追加しないといけない。

github.com

 ところが、私は日本側の準備(日本語化)をするので手一杯だ。しかも、そのプロジェクトに貢献したところで、日本では英語だから全く役に立たない。だから、メンバーには言わないけど、いつも心の中でメンバーに申し訳ないという気持ちを 持っている。

世界コミュニティは、特にハードルが高くない

日本にいると、「世界挑戦」という言葉があるとおり、「世界」は凄いところで世界に出ていくのはハードルが高いというイメージがある。ところが、他国のメンバーや、他国の友達をみているとそんなことは全くない。私の友達のポーランドの マリアは、16歳のころからモデルをして、他の国を渡り歩いていた。

f:id:simplearchitect:20160906200801j:plain

ほかのイギリスの語学留学時代の友達も、英語が下手でもなんでもその人が他の国で働くこと自体にハードルを感じている人はいない様子だった。  実際にインターナショナル環境で働いてみると、彼らが圧倒的に優秀とかではない。世界にも優秀な人そうでない人もいる。MLBは、本当に世界の超一流が集まっているのでハードルは高いが、普通の仕事はそうではない。日本はそうでも ないが、海外に行くと、他の国の人々を頻繁に見かける。

f:id:simplearchitect:20160906202133j:plain

 しかし、問題は、ソフトウェア開発だと平均すると、日本のレベルははっきり言って相当低いと言わざるを得ない。世界が凄いのではなく、日本がしょぼいのだ。これはなぜだろう?

世界コミュニティに貢献できないことがもたらす問題

 英語を避けることによって、最も問題なのは、世界コミュニティに参加できなくなることだ。私が「インターナショナルチームでの苦悩」で書いたことは、日本の縮図である気がする。

f:id:simplearchitect:20160906204906j:plain

 例えば何かの仕事を一緒にするときに、日本以外の国は、英語でも突撃して、世界コミュニティがやっていることに対して「貢献」をする。それはブログかもしれないし、コードかもしれない。講演をして、アイデアをシェアするのもその一つだ。  実際にアジャイルカンファレンスに出かけると、スピーカーが「ネイティブ」とは限らない。普通に講演しているし、ブログや書籍も英語でガンガンに書くし、例え英語がしょぼくても、英語でガンガンにコミュニケーションを取って、その場でバリューを出して貢献しようという姿が感じられる。

 ところが、日本だと、「英語での最新情報を早く入手したい」という意識はあれど、「貢献しよう」という人は相当少ない。もし、それを、「世界コミュニティ」のメンバーから見たらどう感じるだろう。何の貢献もしないけど、情報だけを欲しがる 「クレクレ君」に見えるのではないだろうか?私は少なくとも、みんなにいろんなことをしてもらっているのに、もらう一方だと相当肩身が狭いので、貢献をしたいという気持ちになる。誰が「クレクレ君」と一緒に仕事をしたいと思うだろうか?

 その為には、英語のレベルがどうや、こうや、と言っている暇があったら、世界コミュニティに「貢献」を始めたほうがいい。気軽に始めるのは、ソフトウェアだと、Issueを送るとかPull Requestを送るでもいい、ブログでもいい。なんでもいいけど あれだけ情報をもらっているのだから、こちらもシェアしないのは相当イケていないと思う。

 我々はどれだけ日本語で情報発信したところで、日本国内の人にしか役に立たない。素晴らしいアイデアをもらっている世界コミュニティーには何の貢献もできていないのだ。情報だけをゲットしておいて、自分の成果は、自分だけで享受なんてなんとも虫がいい話じゃないか?

翻訳業にパワーを割くのをやめよう

 また、他にも問題がある。世界コミュニティに「貢献」することは、単に親切だからとかではなく、自分が欲しいものを作った時に、他にも同じ問題で困る人がいるようだったら、それを単にシェアすると、その人が助かる。特に成果物がコピーできる ソフトウェアはそういうものだ。そして、「貢献」によって作り上げられた成果物は、みんなでシェアすることができる。  例えば、ハンズオンラボをみんなで作ったら、URLをシェアして、お客さんに渡してあげると喜んでもらえてバリューが出る。しかし、日本だとその成果が翻訳されるのを待つしかなく、それをお客さんに渡しても、英語のままだと全く喜ばれない。しかも、文化的背景もあり、向こうでうれしいものがこちらでもうれしいかはわからない。

f:id:simplearchitect:20160906205220j:plain

だから、多くの日本人の人は「翻訳業」に多くの工数を使っている。しかし、ソフトウェアはバージョンアップするものなので、その保守はどうしたらいいのだろうか? そんなことをしている間に世界コミュニティのメンバーは、協力・貢献して、どんどん成果をシェアしていってその恩恵をうけて生産性が向上していくことになる。翻訳を鍛えるよりハックを鍛えよう!

フィードバックを受けられない問題

それだけではない。世界コミュニティに参加できないことの問題として、フィードバックを受けられない問題がある。それは、最初の英語力のレベルとかそういう問題ではない。

 例えば、ブログを書いたら反応があるし、コードで貢献したら、コードがイケてないと受け入れてもらえない。そういう過程を経て世界の人がどういうレベルなのかを肌で感じることができる。また自分に足りないことはどこだということも、試行錯誤を繰り返す中でだんだん明らかになってくるだろう。世界の中で働くことで自分が世界で働くには何が足りないかが明確に見えてくる。

blogs.technet.microsoft.com

しかし、日本のサイロに閉じこもって、日本国内だけで思考していると、そういうフィードバックを受けることはできない。以前のポストでも書いたが、海外の人はAgileでもDevOps でもコンセプトを誤解していることが非常に少ない。それは、ロジカルに、抽象的に考えることが得意な傾向があるからではないか?と以前のポストで書いたが、そのほかにも「フィードバック問題」があるかもしれない。

simplearchitect.hatenablog.com

 我々は、数年後だが、翻訳本を入手できるし、ブログで最新技術を紹介してくれる日本語ブログを書いてくれる人もいる。だから「情報」だけでは、「5年とか、8年」と言われる日本の遅れは説明できない。問題はそこではなく、実際にプロジェクトで実施する レベルに到達する程度に本に書いてあることを理解するためには、やってみて、失敗して、フィードバックを受けたり、経験者とディスカッションする必要がある。日本だと、せいぜい狭い日本人コミュニティの中でしかこれができない。日本人の中だけだと、 すべを日本人の常識や、日本人の現在の状況だけで物事を判断しがちになってしまい、結果として、魔改造が「正」として横行するケースもあるように思う。

channel9.msdn.com

 今は海外に行くハードルは高くないので、海外カンファレンスに行けば、本を書いている著者と直接話すことができる。そうじゃなくても、海外のカンファレンスに来ている人々と、ディスカッションをしてみることで、他の国の人がどの程度のアジャイルを実践しているかがわかる。そういう、インタラクションを通じて、「肌感覚」みたいなものはわかるのだと思う。

 これが、日本だと、「海外だからうちは関係ない」となりがちだが、日本は大したプレイヤーがいないから、と日本市場になだれ込んで来たらどうするのだろうか?今は「鎖国」だから、そうはなっていないが、少しづつ、文明開化を足音が聞こえてきている気がする。 私のおすすめは、日本にいても、世界コミュニティの一員という視点で考えてみるのがいいのではないだろうか?

どうやって、世界コミュニティに進出するか?

 世界コミュニティに進出する方法は、基本単に進出すればよい。特にそこに準備は必要ない。英語があったほうがいいとは思うが、「〇〇ができるようになってから」というタイミングは永遠に来ない。じゃあ、どうやって、日本にいたままそれを達成するか? 現在の私のおすすめは、「英語のMeet up」に参加するというものだ。もちろんすべて英語だ。

f:id:simplearchitect:20160906201054j:plain

www.meetup.com

 英語がわからない不安が当然あると思うが、ここでは、「英語がわかる」を目的としていない。英語勉強にはモチベーションが重要だ。全く英語を使う必要がない人と、月に1回でもいいので、英語をしゃべれないと何もできない環境にやってきて、「次こそやってやる」 と思うのと、どちらが英語が上達しそうだろうか? 今の時代「英語を学ぶ方法」はいくらでも転がっている。それよりも、パッションが最も重要だ。遊び系がよければ、完全英語のコメディショーも面白くておすすめだ。

itpro.nikkeibp.co.jp

東京で行けるガチ英語コメディショー: Improvazilla Main Stage Show

日本ではなく、世界コミュニティに貢献する

私は日本人のためだけに仕事をするのをやめよう。日本人に対して仕事をするのをやめるという意味ではなく、世界コミュニティの一員として貢献していこうと考えている。たくさん失敗もすると思うが、そうしていくと、「世界平均」ぐらいの実力は身につくかもしれない。  私は、本当に重要なノウハウというのは、人の中にあると思う。本やビデオで習得するのは限界がある。だから、マイクロソフトでも、講演やデモを中心としたスタイルから、ハックフェストといって、お客様の社内でハッカソンをしてお客さんと一緒に最も難しい問題を解くことを支援するという動きに変わってきている。

f:id:simplearchitect:20160906205517j:plain

 これは、おそらく、講演やビデオは、いくらでもオンラインで見れる。だから、本当の価値は、それぞれの人の中に潜むノウハウなので、ディープな知識を移転し、かつ、実際にコードを共同で書いて問題を解決するのが、最も成果(リードタイム短縮など)を出しやすい。だから そういうスタイルを本社も押しているのだろう。そのためにも、自分がまず世界コミュニティの一員になれるように頑張ってみて、そこで世界平均ぐらいのレベルを獲得してみたい。

 だから、「世界コミュニティに参加しよう!」思っている人を今後は積極的にご支援していきたいと思っている。それが、私のビジョンである「日本をUSと同じスピードで技術やプロセスを導入することができる国にする」ことには必要な気がしている。