2015年4月24日金曜日

関数型プログラミングを料理の仕方でたとえてください




関数型プログラミングを料理の仕方でたとえてください 【OKWave】

関数型プログラミングを料理の仕方でたとえてください。
作る料理はなんでも構いません。
料理の一般的なレシピというのは、手続き型プログラミングで
たとえることが可能だと思っています。



インスタント、冷凍食品コーナーにいきましょう。

インスタント、レンジ用単品素材や完成品が売ってあるので
それを必要なだけ組み合わせたり分解したりしてチンしたり、お湯を注ぎます。

レンジは8台以上あり、お湯もたっぷり用意されてるので、
全部いっぺんに調理できます。

えっ、レンジ失敗しましたか?
湯切り忘れて麺伸びちゃいました?
大丈夫、冷凍食品はいくらでもあるので前の状態からやりなおせます。



しかしそれだけでは新しい料理が作れません。

そこであなたの役目は料理ではなく
新しいインスタント冷凍食品開発となります。


食品開発のポイントとして、
おいしいラーメンに塩と醤油の小袋を2つつけてはいけません。
最初から塩ラーメンと、醤油ラーメンの2つを開発してください。
その方が売れます。

できれば、日清のカップヌードルのように
「最初から『かやく』がふりかけらていて小袋さえない」方が
食べる人の手間や袋を捨てる処理が要らなくなるので
商品も人気が出るでしょう。


小袋がたくさんある方が便利で誰のニーズにも
応えられる用に思えますが、
それはたくさんの問題を引き起こしコストも跳ね上がり
なおかつ売れません。

なるべく小袋のない商品開発を目指してください。



日清 カップヌードル 77g×20個
日清 カップヌードル 77g×20個

2015年4月11日土曜日

脳ではなく腸を作る


最近プログラミングを学んでいる。

バグを少なくし拡張できるプログラミングとはなにかと調べると
オブジェクト指向、MVC、
ストラテジー、ステート、オブザーバーパターン、
関数型言語、モナド、循環的複雑度、
Reactive、flux、ためしてガッテン、、、

などなどおぼろげな知識に触れ、
なんとなく認識を間違ってたなという雑感のメモ。


脳のシナプスのようにメッセージを送る?


学び始めた時、プログラムというのは
現実の社会や世界のように小さな自立生命体が役割を持ち
お互いに影響しあって、
世界のバランスは見えざる神の手によって
自然と調整されるものなのかと思っていた。

だから自立生命体としての簡潔で完結な「脳」を作っていけばいいと。
脳細胞のシナプスのように
必要な箇所へ四方八方にメッセージを送るものがプログラムなのだと。

、、この考え方では判断基準を各個体がもたないといけなく、
いくら完結なメッセージでもスパゲッティのように入り乱れて難しい。


富豪的プログラミング?


また、昔の何億倍もハードウェアの性能が上がってるのだから
富豪のように100倍や1000倍贅沢にぶん回していいのかと思ったら
モバイルでもクラウドサーバーでも無駄に電気を使う訳にいかないそうだ。

小さく少メモリの方がスマホの電源に優しく、
クラウドサーバーは従量制なので料金に直接響く。
プログラムはひとつのことに最適化されてるほうがいい。


兵士は自分で判断すべきか?


兵士は命令に対して即座に動かないと全体が危険にさらされることになるので
情報は上におくる必要があるけど、
兵士自身はif文やfor文で判断する脳を持たなくていい。
それぞれのプログラムもいつか滅びゆく小さな恐竜ぐらい
条件分岐がなくてかまわない。

もちろん、国という単位では何に最適化すべきかという答えがなく
会社という単位でもイノベーションで
市場そのものがなくなる恐れがあるから
最適化されすぎない多少の遊びがあったほうがいい。

しかしプログラムはひとつのことをうまくやる以外のことは必要ない。
拡張したければひとつのことをうまくやる部品を
直列や並列にくっつけていけばよく
ifやforで脳を大きくする必要はない。


脳ではなく「腸」を作る


腸は栄養を分解、合成、吸収、排泄するだけの器官だ。
諸説あるが、1000種類以上の細菌が、100兆個以上いると言われている。
まだ科学で判別のついてない細菌もたくさんあり、
個人個人で持ってる種類すら違う。

食べ物というデータを
1000種類のプログラムと、100兆のスレッドで
「分解」「合成」「吸収」「排泄」しているわけだ。


「腸」が「脳」を動かす


腸は食べ物はもちろんのこと、
空腹にも、体内のホルモンにも、病にも、感情にも反応する。
外的環境で腸内の活動や、細菌バランスが変わることで
様々な影響(表現)がありその要求を脳に送る。
ゆえに腸が脳を動かしてるともいえる。


食べ物が肛門まで流れていく処理を作る



腸は食べ物(データ)を処理するだけで人生の記憶(状態)などはもたない。

細菌が住んでるある程度の並びはあるが、
食べ物の流れは肛門まで一方向である。

腸のメッセージは、四方八方ではなく脳にだけ送られる。
脳は海馬(メモリー)に状態として保存する。

逆流して食べ物(データ)を脳で消化するようなことはない。


状態の記憶と分岐判断は脳、データ処理は腸だが、
主従関係にすると実は腸(データ)が主で、脳(状態分岐)が従となる。
普通に考えると脳が思考の出発点で、
プログラムで最初に作る場所だと勘違いしやすい。


あえて早く作ろうとしない


 とはいえ小さく素早く作る場合、
腸が状態をもって即断即決したほうが短く速いコードになる。
わざわざ脳と腸に分けてプログラムするのはめんどくさい。
一見それは正しく見え、その早すぎる最適化で人は道を間違う。

小さなプログラムで十分な場合は、
それで完結してるので脳とか腸とか考える必要もないが
ほんとに速度が命のゲームではその最適化が必要なこともある。
(ただほとんどの場合、そこまでの速度が必要な企画や仕様を疑った方がいい。)

それは腸内に細菌ではなく寄生虫(バグ)を飼うようなもので、
その子は大きくならないし、物覚えも悪いから
ゆめゆめ育てようとは思わないことだ。

それがプロトタイプなら、プロトタイプを拡張するのではなく
悪夢を見たくなければ1から作りなおすほうがいい。

1000種類の寄生虫を飼いならすのは不可能だが、
1000種類の、状態を持たない細菌を飼うのは可能だ。
1万種類以上でも大丈夫だろう。


脳プログラミングにNo! 腸プログラミングでいい便強。


もちろん脳を作ることも大事だが、
腸が腸であるために脳を設計するから
自然と脳の負担が減るのであって、
脳のために腸を作ろうとすると
脳で処理できなくなった負担を減らすため
必要悪な寄生虫をたくさん生み出す結果になる。
 
作るのは脳ではなく腸だ。

腹で感じろ。