機略戦記

Maneuver warfare

R: 複数のvectorやfactorに対してすべての組み合わせを列挙する関数なんだっけ

結論

expand.grid()

解説

library(dplyr)
library(tidyr)

week <- c('月', '火', '水', '木', '金', '土', '日')
am_or_pm <- c('AM', 'PM')

expand.grid(week=week, am_or_pm=am_or_pm) %>%
  arrange(week, am_or_pm)

こうすると、

   week am_or_pm
1    月       AM
2    月       PM
3    火       AM
4    火       PM
5    水       AM
6    水       PM
7    木       AM
8    木       PM
9    金       AM
10   金       PM
11   土       AM
12   土       PM
13   日       AM
14   日       PM

こういう結果が得られる。

R: factor型の変数から「次のlevelのfactor」を得たい

課題

> week <- factor(c('月', '火', '水', '木', '金', '土', '日'), levels=c('月', '火', '水', '木', '金', '土', '日'))
> week
[1] 月 火 水 木 金 土 日
Levels: 月 火 水 木 金 土 日
> monday <- week[1]
> monday
[1] 月
Levels: 月 火 水 木 金 土 日

こういう前提の時に、変数mondayからを得たい。

結論

こうすると取れる。

> week[as.numeric(monday) + 1]
[1] 火
Levels: 月 火 水 木 金 土 日

感想

  • mondayas.numeric(数値にする)って概念的におかしい気がするので、なんかもうちょっと別の書き方ができないものか。

全体最適を行うためには「部分非最適」を受け入れる必要がある

大体の仕事は、いくつかの機械や人、あるいは組織が連携して働いて最終的な成果(製品とかサービスとか)を作る。

このような仕事において、最終的な成果を増やすためには、「改善を行って効果がある部分」と「ない部分」がある事を認識する必要がある。それを分かっていないと改善するつもりで悪化させてしまう事になる。

そのような場合がある事を、いくつかの例とその背後にある原則を使って説明する。

例え話その1: あるパン工場

あるパン工場の生産ラインを想像してみよう。

  1. 小麦粉と水をまぜ、そこにイーストを入れる。
  2. 温めて生地を発酵させる。
  3. パンの形に成形する。
  4. 焼く。
  5. 包装する。
  6. 箱詰めする。

6つの加工機器を経て、パンが完成する一連の工程である。

これらの工程は、以下のように順番に行う必要がある。

1 → 2 → 3 → 4 → 5 → 6

先ほどのパン工場について、1〜6それぞれの工程が処理できる量は異なるものと仮定しよう。つまり、「1. 小麦と水を練る機械は1時間あたりパン110個分の生地を練れる」「4. パンを焼く機械は1時間あたり100個のパンを焼ける」とかだ。

あなたはこのパン工場の生産速度を改善したいものとする。
あなたならどんな基準で改善すべき工程を選ぶだろうか?

さて、このパン工場の1〜6の工程には、改善するとパンの生産量が増える工程と、改善してもパンの生産量が増えない工程とがある。

例えば、2.生地を発酵させる機械が1時間辺り100個分しか処理できないのに、1.小麦と水を練る機械が1時間あたり150個分の生地を練れるようになってもパンの生産量は増えない。2.生地を発酵させる機械の前に発酵待ちパンが積み上がっていくだけである。1時間で150個分練って、100個分しか発酵させられないので、1時間で50個ずつ発酵待ちの生地が溜まっていく。

あるいは、4. パンを焼く機械が1時間あたり120個しか処理できないのに、5. 包装する機械が1時間あたり180個処理できるようになってもパンの生産量は増えない。5. 包装する機械は1時間の内、累計40分だけパンを包装し、残りの時間はパンが焼けるのを待つことになる。

このように、パンの生産量はパン工場どこを改善しても増えるという訳ではないこのような想定の時、パンの生産量を増やすのは、1〜6の中で最も遅い工程に対する改善のみである。

例え話その2: ピクニックに行く小学生達

  • 小学1年生〜6年生までの小学生が1人ずつ、計6人でピクニックに出かけたとする。
  • それぞれが歩く速度は以下としよう。
1年生さん < 2年生さん < 3年生さん < 4年生さん < 5年生さん < 6年生さん
  • ピクニックに出た6人の小学生が皆で一本道を進む時、このピクニック隊が進むスピードはもっとも足が遅い小学生によって決まる。6年生さんが、ちびっこマラソンで3kmを10分で走れる俊足の小学生であっても全く関係ない
  • ピクニック隊全体の速度を上げたい時、いくら6年生さんが歩くスピードを早めても意味が無い。
    • 1年生さん〜5年生さんが置いてきぼりになって隊列が伸びるだけである。
    • 全体のスピードがあるのは、1年生さんが歩くスピードが上がった時だけである。
  • だから、やるべき事は、1番遅い1年生さんの荷物を、その他の小学生さんが肩替わりしてあげる事である。例えば6年生さんが1年生さんの荷物を持ってあげる。こうすれば全体のスピードが上がる。

この時、荷物を肩替わりした6年生さんのスピードは、「6年生さんだけが歩く時」より遅くなるが、それは、全体のパフォーマンスに全く悪影響を与えていない。むしろ、全体のスピードは上がっている。全体を最適するためには部分の非最適を許容しなければならない。

強度と重さ

左右から引っ張られる1本の鎖の紐を想像しよう。「この鎖の強度を決めるのは、鎖の最も弱い部分である。それ以外を強化しても全体の強度は上がらない

ここまで見てきた様々な例のように、「改善した時、システム全体に効果が出るのはボトルネックの部分のみ」という原則に支配される事象を「鎖の強度世界」と呼ぼう。

一方、別の原則が支配する世界もある。例えば「鎖の重さ」だ。これは、全体のどこを重くしても、鎖全体の重さが増す。このような原則に支配される世界を鎖の重さ世界と呼ぶこととする。

大抵の仕事は鎖の強度世界

「鎖の強度世界」「鎖の重さ世界」この違いを産むのは何であろうか。それは、「システムを構成する各要素が連動するかどうか」である。複数の要素が連動して動き、全体として何か役割を果たす。だからそれらの要素の中にボトルネックが生まれ「鎖の強度世界」の原則が働くようになる。相互作用が無ければ「鎖の重さ世界」のように単純な累積によってパフォーマンスが決まる。

大抵の仕事は「鎖の強度世界」の原則に従う、最終成果物を作るまでに複数の物や人が連動しない仕事というのは少ない。

ソフトウェア開発方法論や生産管理への適用

さて、「鎖の強度世界」という世界観に基づいた方法論は様々ある。 (というか、これこそが様々な生産活動の方法論に共通する一般法則なのでは無いかと私は思う)

根本は同じ「ボトルネックへ集中せよ」である。(ただし、「何がボトルネックなのか?」という考え方はぜんぜん違うが…)

「鎖の強度世界」ではボトルネックへの投資だけが価値を持つ。逆に、ボトルネック以外への投資を絞っても全体のパフォーマンスは落ちない。むしろ、ボトルネック以外への投資を絞り、ボトルネックへ再投資することが全体のパフォーマンスの向上に繋がる。

だから、「あらゆる非効率を許さない」というスタンスは、個別最適化であり、全体最適を損なう考え方なのである。

「あらゆる非効率を許さない」というスタンスは、「生地を発酵させる機械が満タンなのにどんどん生地を練る行為」であり、「6年生さんを全速力で走らせる行為」であり、「クリティカルパスを気にしない行為」であり、「価値あるストリーの優先順位を気にしない行為」であり、どうしようもなく間違っている行為なのである。

https://www.amazon.co.jp/%E3%82%B6%E3%83%BB%E3%82%B4%E3%83%BC%E3%83%AB-%E3%82%A8%E3%83%AA%E3%83%A4%E3%83%95-%E3%82%B4%E3%83%BC%E3%83%AB%E3%83%89%E3%83%A9%E3%83%83%E3%83%88-ebook/dp/B0081M7YEE/ref=dp_kinw_strp_1www.amazon.co.jp

相手に合わせて言い方を変える

「ある製品のソースコードのあるモジュールのがクッソ汚くて直さねばならない」という話を、

  • 収支責任者には「機会損失なので直すべきです」
  • PMには「リスク要因なので直すべきです」
  • エンジニアには「技術的負債なので直すべきです」

みたいに言い方を変えて伝えると伝わりやすい。

それぞれに立場にそれぞれのKPI (評価指標) があるので、「相手が重視しているKPIから見てどうなのか?」という情報を伝える。

余談

そもそも、それぞれが立場を超えて全体の最適を考えて行動できると理想的ですね…。 つまり、自分が持つKPIとその他の人が持つKPIについて考え、そのトレードオフを考慮したり、2つ以上のKPIを両立させる方法を考えて行動したい。

冗長性は「無駄」であると同時に「備え」でもある

バナナの危機

バナナはそんなに好きな果物では無かったが、最近良くバナナを食べるようになった。 私達が慣れ親しんでいる種のバナナが近いうちに流通しなくなる可能性があるからだ。なくなると聞くと惜しくなる。

何が原因でバナナが流通しなくなる可能性があるというのか。
原因は「新パナマ病」というバナナの伝染病だ。

バナナがかかる病気とは?|バナナの立役者たち|ドールバナナの歴史を紐解く|バナナはドール

現在、食卓に流通しているバナナには種がない。 もともと、原種のバナナには種があったが、品種改良によって種がほとんどないバナナが開発された訳だ。これが現在おもに流通している「キャベンディッシュ種」という種類のバナナだ。

この種のないバナナは、株分けによって増やされる。交配を行わずに増えるのでクローンみたいな物であり遺伝的多様性が極端に少ない。

だから、単一の病気によって全滅してしまうリスクも極端に高い。
そのリスクが「新パナマ病」という形で現実のものになろうとしている。

前述の通り、今食卓に流通しているバナナは「キャベンディッシュ種」という種類だが、 20世紀中頃までは「グロスミシェル種」という別の種が流通していたそうである。

このグロスミッシェル種というのは、「弾力があって、クリーミー」で現在流通しているキャベンディッシュ種より美味しかったらしいが、パナマ病という単一の病気で壊滅的な被害を受け、現在はほとんど流通しなくなってしまったらしい。

何か出来ることはあったのか

種のないキャベンディッシュだが、種がある原種のバナナと交配することで、数十万本に1粒の割合で種が出来るらしい。このような方法でキャベンディッシュの亜種をあらかじめたくさんの種類増やしておけば、中には新パナマ病に対して耐性があるバナナがあったかも知れない。

しかし、そのような手間をかけてバナナの遺伝的多様性を確保しようとした人は居なかったようである。

バナナの危機と冗長性

株分けで増える種のないバナナは、品質のばらつきが無く効率的に生産できただろう。 つまり、冗長性が無い。そして、その冗長性の無さは単一の病気による全滅というリスクと表裏一体である。

「冗長性は無駄であると同時に備えでもある」という事を実感した。

冗長性が削られていくメカニズム

  • 「効率的に生産できるか?」という短期的な利益についての指標は定量化しやすい一方、
  • 「バナナから遺伝的多様性が失われている状態を放おっておけば、単一の病気による全滅のリスクはどのくらい高まるか?」という長期的な利益(損失)についての指標は定量化しにくい。

遠い未来ほど不確実性が高くなるので、物事全般について「短期は定量化しやすく、長期は定量化しにくい」という原則が働く。

この原則と、数値にもとづいた理性的な意思決定が組み合わさると冗長性はどんどん削られていく。

例えば、バナナ生産企業において、経営陣に対して、以下のような2つの提案が行われたとしよう。

  1. 「バナナの遺伝的多様性を高め病気による全滅のリスクを回避するために、1億本のバナナをすりつぶして1000個の種子を手に入れ、それを育てましょう!!! 『その施策で病気による全滅のリスクをどのくらい減らせるか?』ですって? それは…定量的には何とも言えません。でも、だいぶ良くなるでしょう」という意見と、

  2. 「そんな施策にお金を使うより農場を広くして生産量を増やしましょう。XXXXXドルの投資で生産量が年間X%向上するので、X年で投資がペイできます。」という意見があれば、

数値に基づいて理性的に判断すれば間違いなく後者の意見が選ばれる。 しかし、そうして理性的に判断して冗長性を削っていった結果、バナナは今、全滅の危機に瀕している。

そして、この現象はバナナに限らずどこででもよく起きうる問題である。

まとめ

  • 冗長性は無駄であると同時に備えでもある
  • 短期は定量化しやすく長期は定量化しにくい
  • 数値に基づいて理性的に判断すると、定量化しにくいものは定量化しやすいものより軽視されやすい

以上がそろうと、短期を重視して冗長性を削りまくる事になり、最終的には長期的利益をそこなって破滅する。

数値に基づいた理性的な判断を超える何かが必要である。

ポケモンGOが面白いのは現実と仮想が接続されるから

7/22にポケモンGOがリリースされて以来、4日間ほど遊んで見て、このゲームは面白いと感じた。 なぜそのように感じたのか自分なりに考えてみたので、考えたことをメモしておく。

ポケモンGOで遊ぶと画面の外と中とが相互に影響を与える事が実感できる

  • 画面の外で何かすると、画面の中に影響を与える
    • 画面の外で歩くと、画面の中でキャラクターも移動する。
    • 画面の外でうろうろすると、画面の中ポケモンが登場する。
    • 画面の外で渋谷に移動すると、画面の中にたくさんのポケスポットが映る。
  • 画面の中で何かすると、画面の外に影響を与える。
    • 画面の中でポケスポットにルアーを設置すると、画面の外で人が集まってくる。
    • 画面の中でポケスポットを巡っていると、画面の外で自分が住む街について詳しくなる。
    • 画面の中ポケモンを捕まえまくっていると、数日後に画面の外で体重が減り、お通じが良くなり、体調がよくなる。

このように、画面の外の行動が画面の中に影響を与え、画面の中の行動が画面の外に影響を与えることで、画面の外と中が接続されたように感じる。
ここでは「接続」と言う単語を、画面の外と画面の中が相互に干渉可能な地続きの世界になったように感じられる事という意味で使っている。

ここで言う、画面の外とは別の言い方をすれば現実であり、 画面の中とはフィクションであり仮想である。

ポケモンGOは現実と仮想が相互に影響しあうようにする事によって、現実と仮想を接続するような効果を生んでいるように感じる。

この体感は新鮮だし楽しい。特に「画面の中、仮想、フィクションの世界で何かすると現実に影響を与えられる」という体感に、今までに無い新鮮さを感じた。

現実と接続された仮想は、単体で存在する仮想よりもずっと魅力的だ。物語の中に入り込んでプレイするようなものだからだ。

この現実と仮想が接続される体感が、ポケモンGOの面白さの根幹なのではないだろうか?

もちろん、ポケモンを育成したりコレクションしたりする楽しみや、ダーツのような偶有性をもったモンスターボール投げ、レアなポケモンが出てこないかドキドキしながら歩きまわったり、卵を孵化させたりするという予感に対してドキドキを感じる面白さも有ると思うが、そういった王道的なゲームの面白さを、現実と仮想の接続感が大幅に高めてくれているように感じる。

似た体感: 仮面ライダープリキュア遊戯王

この「現実と仮想が接続される体感」に対して理解を深めるために、別の事例が無いか考えてみた。
仮面ライダー」と「プリキュア」と「遊戯王」がそれに近いかも知れない。

ある日曜日にTVをザッピングしていて仮面ライダーが目に止まった。 そして、僕は、仮面ライダーが変身に使っている道具に非常に興味を惹かれた。

その道具が「非常に玩具として製造しやすそうな形」をしていたからだ。 樹脂で出来ていて、金型でプレスしやすそうで、着色の工程が簡単そうな、飲み込んだり、目に刺さったりしにくそうな、でも玩具っぽくなくて格好良さを感じる形をしていた。

これはきっと、玩具を手にとった子供が、よりリアルに道具の存在を感じられる事によってより高い価値を玩具に感じられるようにする(ひいては玩具の売上を上げる)ために、劇中に登場する道具を、玩具として再現しやすい形にあらかじめ工夫してデザインしてあるのだろう。

プリキュアの劇中に出てくるガジェットも、遊戯王に出てくるトレーディングカードもそのような工夫が感じられる。

この仕掛は、先ほどの「現実と仮想が接続される体感」という視点で捉えると、「仮面ライダー」というフィクションの世界と現実が玩具によって接続される事を期待したユーザー体感設計と言える。

似た体感: 宗教

さらに、類似する物が無いか考えてみた。 もしかすると、宗教は、この「現実と仮想が接続される体感」が強いかも知れない。

  • 現実で何かした事が、超越的な世界(天の国とか)に影響を与える。
    • 現実で罪を犯すと、罰が記録される。
    • 現実で善行を行うと、徳が貯まる。
  • 超越的な世界での出来事が、現実に影響を与える。
    • 超越的な世界で超越的な存在の怒りを買うと、現実の世界に祟りがある
    • 超越的な世界で何かが起きると、現実の世界で奇跡が起きる。

祟や奇跡の原因を、「超越的な世界での出来事の結果」とする事で現実と超越的な世界に接続をもたらそうとしている。

まとめ

人生を改善するには正味作業時間を増やすしかない

年末なので内省的になった*1結果できたエントリです。生暖かい視点でご覧ください。

正味作業とは、作業全体のうち「価値を付与することに貢献した部分」のことである。
これはトヨタ生産方式に含まれる諸概念の内の一つだ。

これは「ボールペンに対しキャップをはめる」という作業を例に、どこが正味作業でどこが正味作業では無いものかを説明した図です。

f:id:Shinya_131:20151225231935p:plain

※ 引用: http://www.chusanren.or.jp/jms/pdf/jms_combook_sample6.pdf

1978年に出版された書籍: トヨタ生産方式では、次のように説明されていた。

  • これからは低成長の時代である。
  • だから原価を減らさねば利益は出ない。
  • そのためには正味作業以外のものをとことん無くしていく必要がある。

そのためのシステムが、「在庫量*2を制約するカンバン」であり、「意思決定を自動化する自働化」であり、「非ピークタイム時の"待ち"が発生しないようにする平準化」である。

この総稼働時間に占める正味作業時間の割合を増やそうとするというアプローチは、製造現場において大変有効であることが分かり、爆発的に普及し、 製造現場を超えてさまざまな領域に適用された。たとえばソフトウェア開発手法であるアジャイルを形作る源流の一つとなった。

なるほど、チームの人数が増えるにしたがってコミュニケーションパスが指数関数的に増え、規模の拡大=リスクとも言えるソフトウェア開発において、この考え方は有効だろう。規模の拡大に強い制約がある状態で産み出せる価値の量を増やす事ができるアプローチだからだ。*3

「規模(総稼働時間)の拡大に強い制約があるケース」についてどんな実例があるか考えていたところ、その一つに 人生 があげられるのでは無いだろうか。というアイディアが浮かんだ。

寿命はアンコントローラブルである。2倍、3倍に伸ばすことなど出来ない。
人生においてコントローラブルなのはその内容だけである。
人生を改善する方法は、その正味作業が占める割合を増やすことしか無いのではないか。

このエントリを書いている時間は人生の正味作業なのか。あの人と会う時間は人生の正味作業時間なのか。会議をしている時間はどうか。あのホットコーヒーを飲んでる時間はどうか。あの本を読んでいる時間はどうか。

そういう視点で自分の行動を点検して無駄を省いていくという事が、今の自分には徹底して不足していると気づいた。

また、何が正味作業なのかを定義するためには何が価値なのかを定義しなければいけない。自分にとって人生の価値とはなんなのか。という問いが発生した。

(以上です。オチはありません。)

www.amazon.co.jp

*1:そもそも年末だけ内省的というのが平準化の観点から見てダメ

*2:在庫は正味でない作業をたくさん発生させる

*3:また、ソフトウェア開発においては、「誰にも使われない機能の開発に工数を割いてしまう」といった過ちが起きやすいという面からもこのアプローチが有効なのだと思われるが略。