ninjinkun's diary

ninjinkunの日記

Kindle Unlimitedにカラマーゾフの兄弟があった

5冊分 (782+756+864+1080+684) / 980 = 4.25 なので4ヶ月で読み切れば元が取れる。普通に読んでいくと2ヶ月くらいかかるので、言うほどお得でもない。普通に買う方が良いかもしれない。

光文社古典新訳文庫がたくさんあるのは良さそうに見える。

スマートフォンアプリ開発における共創的な開発チーム

先日、一休.comを運営する株式会社一休の社内テックトークで『スマートフォンアプリ開発における共創的な開発チーム』というタイトルでお話しさせていただいた。元々、ずっと考えてきたエンジニアとデザイナーのコラボレーションというテーマを言語化してみたいと思っていたのだが、そこに丁度Fablicでの現場の体験を話して欲しいという依頼があったので、絡めた内容でスライドを作った。

しかしこの言語化する作業が想像以上に大変で、週末を二回潰して準備をした。結局今まで勉強したポインタになる書籍を紹介することで、なんとなくバックグラウンドについては察してもらうというスタイルになった。

タイトルも迷って何パターンか書いてみたのだが、最終的には「共創的」という耳慣れない言葉を採用した。本当は「Collavorativeな開発チームでのアプリエンジニアの役割」とかの方が言いたいことに近い気もするが、これはこれで何だかわからないので見送った。

Fablicで使っている手法について紹介したが、自分が入社する前からあったものもあるし、自分が関わって開発したものもある。これらは当然ながらFablicの開発チーム全員の成果であることを強調しておきたい。

とりあえず、現時点で勉強してきたこと、実践してきたことが詰め込まれた発表になったと思う。良い機会を頂いた一休の皆さんに感謝したい。

結構がんばって資料を作ったので、YAPC::Asia Hachioji 2016mid in Shinagawa(飛び入り予定)やpmjp.slack.comオフ会#4でもこの話をしようかと思っています。

iOSとAndroidでReduxを使うサンプルを作った

Flux(とその実装としてのRedux)は中〜大規模のWebクライアントに向いている設計だと思っているので、具体性を出すためにサンプルとしてTwitterクライアントを作ってみた。iOS版はRIDEと同様にReSwiftを使い、Android版はReSwiftを写経したJava版Reduxライブラリを作って同梱している(用途があれば切り出してもいいかも)。

簡易な実装なので、UITableView、RecyclerViewとの同期問題、アニメーションの問題などは積み残しになっている。

普通にアプリケーションを作る場合に比べてFluxはコード量が増える傾向にあるが、一人で簡単なものを作っているだけではFluxのうまみもなく、実装は結構だるかった。開発に1ヶ月以上かかる場合や、チームが2人以上の場合などであればペイすると思う。

影響力の武器を読んだ

影響力の武器[第三版] なぜ、人は動かされるのか

有名な本らしく、同僚から薦められたので読んでみた。人が騙されたり、冷静に行動できなくなる現象を解説した本である。セールスやマーケティングで用いられている人間の行動に関する知見が、社会心理学実験の結果を用いて説明される。

確かにとても面白い本で、自分は読んで良かったと思うのだが、同時にこんな知見が流通している世界に住んでいたのか…と唖然としたというか、少し辛い気持ちになった。もちろん騙す知見を流通させる目的の本ではなく、知っていれば騙されるのも防げるというスタンスで、防衛法も書かれている。

プロダクトマネージャーに関心がある自分としては、4章「権威--導かれる服従」に書かれていた、権威や上司には自動的に従ってしまう社会的な特性があるという部分が印象に残った。プロダクトマネージャーは開発チームの上司ではなく、人事権も持っていないことが特徴であると言われている。この知見を元に考えると、プロダクトマネージャーに権威を持たせないことで、メンバーの自律的な行動を引き出すという目的もあるのかもしれないと思った。


設問への回答

内容を覚えておこうと思って、各章の章末にある設問「内容の理解」へ回答を作ってみた(暇なのか?と言われると言葉に詰まるが…)。折角書いたので、以下に自分のメモとしてコピペしておく。ネタバレも含まれる。

第1章 影響力の武器

  • Q1. 動物に見られる固定的動作パターンとはどのようなものか。このような行動パターンは人間行動のいくつかのタイプとどの様な点で類似しているだろうか。またどのような点で異なっているだろうか。

  • A1. 動物の固定的動作パターンとは行動を始める際にある特定、単一のシグナルがきっかけになっているものである。具体的には七面鳥の母鳥が雛を認識する条件は、ピーピー鳴くことだけであって、他の条件はほぼ考慮されない。
    このような行動パターンは、人間の行動の内、少ない指標だけを使って自動的に行動するパターンに類似している。
    異なっている点としては、動物のパターンは生得的なものが多いのに対し、人間のパターンは成長期に学習するものが多い点である。また人間が用いる刺激が多種にわたる点も異なっている。

  • Q2. なぜ、人間の自動的反応はこれほど魅力的なのか。また、なぜそれほど危険なのか。

  • A2. 自動的反応は少ないエネルギーと時間で正解にたどり着ける点が、複雑化していく世界に順応するためには大変魅力的である。一方で、深い考察なしに行動してしまう場合が多いので、詐欺などに悪用されることが多い点で危険である。

第2章 返報性--昔からある「ギブ・アンド・テイク」だが……

  • Q1. 返報性のルールとは何か。私たちの社会では、なぜこのルールが強力に作用するのか。

  • A1. 返報性のルールとは、他人が何かをこちらに施したら、自分は似たような形でそのお返しをしなくてはならないというルールである。
    このルールによって人間の活動を広げるに辺り、コミュニティを作って互いに協調して作業したり、異なる集団と交易することが可能となった。このルールが強力に作用するのは、このルールがこうした人間の社会化のための基礎的な条件になっており、深く浸透しているためである。

  • Q2. 承諾誘導の専門家が利用する、返報性のルールの三つの特徴とは何か。

  • A2.

    1. このルールは非常に強い力を持っている
    2. このルールは望まない相手からの望まない行為であっても作動してしまう
    3. このルールは不公平な交換を助長する場合がある

  • Q3. リーガンの研究では、このルールの三つの特徴がどの様に描き出されているか
  • A3. リーガンの研究においては、第一の特徴の発現としてコーラを渡された被験者は二倍もチケットを購入してしまった点が挙げられる。また、第二の特徴では、実験者がコーラを買ってくることは特に被験者から期待されておらず、いわば好意の押し売りであったにも関わらず、被験者達はルールにはまってしまった。第三の特徴では、コーラを渡した参加者はコーラ一缶以上のもうけを出しており、等価な交換が成立していない。

  • Q4. 「拒否したら譲歩」法では、承諾率を高めるために返報への圧力がどの様に利用されているか。
  • A4. 相手が譲歩すると、施しを受けとったことになり、返報性のルールが働くため、こちらも譲歩して相手の好意に応えようとしてしまうため。

  • Q5. 「拒否したら譲歩」法を使うと、受け手はなぜ (a) 同意した内容を実行し、 (b)将来も進んで親切な行為を行おうとするのか。

  • A5. 最終的な合意に参加したという意識が高まり、責任感が生まれるため。また、この方法の受け手は満足度も高まるため、将来もよい顧客となる。

第3章 コミットメントと一貫性--心に住む小鬼

  • Q1. 多くの状況で、なぜ人は一貫性を保ちたいと思い、また一貫していると見られたいと思うのだろうか。
  • A1. 一貫性には私たちの文化の中で高い価値が置かれており、一貫した行動を取ることで論理性、合理性、安定性、誠実さが高く、人格者や知者と見なされるから。

  • Q2. 多くの状況で、なぜ人はかたくなな一貫性でさえ望ましいと思うのだろうか。
  • A2. 一貫性を保つことで、問題についてそれ以上考えなくてもよくなり、楽に生きられるため。

  • Q3. コミットメントが、本人の自己イメージや将来における一貫した行動に影響を及ぼす原因となる要素を四つあげよ。
  • A3.
    1. 行動を含む
    2. 友人知人に知られる
    3. 努力を要する
    4. 自分がそうしたかったのだと思える

  • Q4. なぜ書き記す形のコミットメントが非常に効果的なのか。
  • A4. まず、書き記す形のコミットメントは害がない譲歩に見えるので、相手に行わせることが簡単である。そしてコミットメントの証拠が残り、さらにその証拠を人に見せることもできるために効果的である。
    人は書かれたものは筆者の本心が反映されたものだと思い込む傾向がある。たとえ本心に反して書かされていると知っていてもこのバイアスは有効である。このため、周囲の人間に書き記したものを見せることで、周囲の人間からの見方を変化させ、本人の自己イメージにも影響を与えることができる。

  • Q5. 「承認先取り法」というテクニックと「自分を支える柱を築く」という言葉の関係を述べよ。
  • 承認先取り法とは先にアンケートに答えさせるなどのコミットメントを引き出すことで、その後の判断を有利になる方向に誘導するテクニックである。このテクニックを使うことにより、まず相手に自分を支える柱を築かせて、その後に柱自体を取り去ってしまっても、対象者はすでに築かれた柱により自分の判断を正当化させているので、判断を変更することは難しくなる。

第4章社会的証明--真実は私たちに

  • Q1. 社会的証明の原理について説明し、録音された笑い声を使うと、お笑い番組に対する観客の反応がどのように変わるかを社会的証明の原理に基づいて述べよ。
  • A1. 社会的証明の原理とは、自身の考えが他の人の考えや行動に影響を受けることを言う。特に自分の意見に自信が無いときは他人行動から影響を受けやすい。 お笑い番組ではこの社会的証明の原理から、笑い声が入ると面白いと感じてしまう。特に面白いかの判断がつかない微妙な場面では笑い声の効果が高い。

  • Q2. この世の終わりを主張する教壇のメンバーは、彼らが予言した最後の審判の日が明らかな誤りとなってから、新たな改宗者を求め始めた。なぜか。
  • A2. 教団のメンバーは自分たちの最後の審判が誤りであったという事実に直面し、自分たちの信念が危機に陥ったのを感じ取っていた。そのため、信者を増やすことにより社会的証明を打ち立てようとした。

  • Q3. 個人が社会的証明に最も影響されてしまう二つの要員とは何か。これら二つの要員が強力に作用したガイアナのジョーンズタウンの状況はどの様なものだったか。
  • A3. 二つの要員とは、不確かさと類似性である。不確かさとは確信が持てないときや、状況が曖昧な場合である。類似性とは、自分と似た他者の行動から大きく影響を受けることを言う。 ジョーンズタウンの事件では、服毒自殺を推奨されるという不確かな状況がだった。また現場が南米のガイアナという交流できる他者が居ない僻地であったため、周りの信者から類似性の影響を受けやすい状況にあった。結果として先鋭的な信者が服毒自殺を行った後で、社会的証明の影響で周りの信者も次々自殺する結末になったものと思われる。

  • Q4. 集合的無知とは何か。それは緊急事態に居合わせた人々にどのような影響を及ぼすか。
  • A4. 集合的無知とは、緊急事態に居合わせた際に、どう行動するかという不確かな状況で、周囲の人々の行動から社会的な証拠を引き出そうとするときに起こる。周囲の人々の行動を観察してそれに倣おうとするものの、その人々もまた周りの行動を参考にしようとしているため、結果的には大多数が傍観者になることを選択する結果になってしまう。この現象は人口密度が高い都市部ほど起こりやすい。

  • Q5. 都市のありふれた生活場面で、緊急時に居合わせた人々の介入を拒むものは何か。
  • A5.
    1. 都市の方が騒々しく、変化が激しいため、自分が遭遇した事件の緊急度を確かめるのが難しい
    2. 都市の方が多くの人が居るため、事件に遭遇した際も他の人が周りに居る確率が高い
    3. 都市の方が知り合いの住民の割合が低い

  • Q6. ウェルテル効果とは何か。それは広く報道された自殺記事と、その後の飛行機事故や自動車事故による死亡者の急増との奇妙な関係をどのように説明するのか。
  • A6. ウェルテル効果とは、ゲーテの「若きウェルテルの悩み」が出版された後に、主人公ウェルテルの自殺を真似して自殺者が増加した現象を指す。 このウェルテル効果を現代に当てはめると、自殺が広く報道された際、同効果により自殺願望が高まった人々が意図的な事故を引き起こし、結果として死亡者数が増えることが説明できる。

第5章 好意--優しそうな顔をした泥棒

  • Q1. 「ハロー効果」とは何を意味する言葉か。それは個人の身体的魅力と他者の目から見たその人の魅力全般との関係を説明するのに、どのように役立つか。
  • A1. ハロー(後光)効果とは、ある人が望ましい特徴を一つ持っていることによって、その人に対する見方が大きく影響を受けることを言う。身体的魅力がある人は、この効果によりその人の他の能力(知性、才能、誠実さなど)も高いと見られがちである。結果としてそのような人は対人関係や社会の中で大きな影響を持つことが出来る。

  • Q2. 私たちには、自分を好きだと言ってくれる人(つまり、お世辞を言う人)に好意を感じる傾向がある。また、自分はあなたと同じだと言ってくれる人(つまり、類似した人)を好む傾向もある。後者に関して、類似した他者に対して私たちが自動的にイエスと言う傾向があることを示す証拠はどの様なものがあるか。
  • A2. 保険会社のセールス記録を調べた研究では、年齢、宗教、喫煙の習慣がセールスマンと似ていると客が保険の契約をしやすい傾向があった。 別の研究では、調査を依頼する調査者の名前を受取人の名前に似せると、調査に応ずる人の割合がほぼ二倍になった。 また、さらに別の重い肝臓病の患者リストから手術を受ける順位付けをする実験では、被験者は同じ政党の支持者を先に選んだ。 セールスマンの研修プログラムでははこの傾向を利用して、姿勢、雰囲気、話し方を客に合わせる様に教育している。

  • Q3. 集団間の対立の増大や現象に関する一連の研究が、少年達のサマーキャンプの際に行われた。対立が生じた後、それを弱める効果があったのはどの様な手続きか。また役に立たなかったのは、どのような手続きか。
  • A3.トラックのエンジンがかからない、水道が止まるなどの危機を演出し、共同作業をさせて困難を克服させた場合には対立が弱まった。一方、一緒に居る時間を増やすためにピクニックや催し物を企画した際は対立は弱まらなかった。

  • Q4. 栄光にあずかりたがる傾向(栄光浴)とはどのようなものか。この傾向はどの様な条件、どの様な人々に最も生じやすいか。
  • A4. 栄光浴とは勝利したスポーツチームや政党、有名人などとの関係を強調することにより、自分の優位性を証明しようとする傾向である。著者によれば、このような傾向を持っているのは自分について自己否定的なイメージを持っており、自分一人の力では物事の達成は得られないという見方をしている人々である。具体例としては、バンドのグルーピーやステージママなどが挙げられる。

第6章 権威--導かれる服従

  • Q1. 「実験参加者が相手を傷つけるのを拒まなかったのは、権威者に服従しようとする強い傾向があったからである」というミルグラムの議論を支持する証拠の中で、最も説得的なものはなんだと思うか。
  • A1. 最も説得的な証拠は、実験の参加者の役割を入れ替え、研究者が実験の中止を命じ、参加者の仲間が継続を命じた場合は全員が実験を中止したことである。このことにより、参加者は実験の継続を求められた際に、相手の権威に強い影響を受けていたことがわかる。

  • Q2. 自分の行動に対して権威が及ぼす影響を私たちがどの程度自覚しているかについて、ミルグラムの研究が示しているのはどの様なことか。あなたの考えを支持する証拠をあげよ。
  • A2. 実験の結果から、権威の影響を私たちは意識はしているものの過小評価しがちであるということが言える。社会化の中で埋め込まれた権威に対する服従という行動は、行動を自動化するという観点からは有用だが、危険も存在する。 職場でも、上司が命令という形で現場に指示を出すと、それに対して意見を言ったり決定を覆すことが難しくなる。自分の経験からも、上司が自分より若い場合や、経験が浅い場合、つまり権威が少なく見える場合には意見が言いやすいという傾向があると思う。

  • Q3. 本章で紹介した研究に寄れば、最も影響力のある権威のシンボルは何か、三つあげよ。また、これらのシンボルのうち少なくとも二つについて、それらがどのように作用したか、あなた自身の体験から例を挙げよ。
  • A1. 本章で紹介されている権威者のシンボルは、肩書き、服装、自動車である。 自分自身の肩書きによる権威を感じた経験としては、相手の名刺にPh.Dと書かれていると、相手の話を聞く前から相手を専門家、知識人として扱ってしまう経験が挙げられる。また服装による影響としては、警察官のような格好をした警備会社の職員が見ている前でも、赤信号を渡ることをためらうという行動が挙げられる。

第7章 希少性--わずかなものについての法則

  • Q1. 希少性の原理と、ブレームによる心理的リアクタンス理論はどのような関係にあるか。
  • A1. 商品やサービスが希少なものであるとされると、私たちはその商品に対する自由を失うと解釈できる。心理的リアクタンス理論によると、この場合に私たちは自由を回復したいという欲求から商品に対して反応してしまう。

  • Q2. 「恐るべき二歳児」と十代の若者が、なぜ特にリアクタンス効果を生じやすいのか。
  • A2. その年代の人間はいずれも自分自身を個人として考える感覚が現れてくるので、特に支配、権利、自由といった問題に敏感であるためである。

  • Q4. 禁じられた情報に対して、潜在的な受け手が示す標準的な反応はどのようなものか。 情報へのアクセスが遮断されると、受け手はその情報欲しくなり、また情報の内容に賛同するようになる。
  • A4. この現象は情報を実際には受けとっていない場合でも生じる。また、情報が他では手に入らないものと見なされた場合には説得力が増す。

  • Q5. ウォーチェルらが行ったチョコチップクッキーの研究は、希少性の原理の効果を最大にする状況についてなにを示唆しているか。
  • A5. クッキーが最初から少なかった場合よりも、最初は多く入っていて後から少なく減らされた方がクッキーの評価は高まった。このことから、既にあったものが手に入りにくくなると希少性の原理の効果は高まることが示唆される。 また、クッキーが人気でなくなってしまったと説明された場合と、研究者のミスで別の瓶を渡してしまったと説明された場合では、前者の方がクッキーの評価は高まった。このことから、社会的需要によって数が少なくなった場合は、より希少性が高まることが示唆される。

『チームが機能するとはどういうことか』を読んだ

Incrementsの知人が社内で輪講していると言っていて、気になっていたので読んでみた。創造的なチームを作るために気をつけることと、そのために必要になるリーダーシップについて書かれている本とのこと。

現代のチームが固定されたメンバー制から専門集団の一時的な集まりになっている(例えば病院、災害救助、スタートアップなど)ことから、チーム構造からチームワーク自体へ注目するという意味で動詞のチーミングが提唱される。

心理的安全

自立的かつ創造的なチームのキーになるのが心理的安全である。

心理的に安全な環境では、何かミスをしても、そのためにほかの人から罰せられたり評価を下げられたりすることはないと思える。手助けや情報を求めても、不快に思われたり恥をかかされたりすることはない、とも思える。そうした信念は、人々が互いに信頼し、尊敬し合っているときに生まれ、それによって、このチームでははっきり意見を言ってもばつの悪い思いをさせられたり拒否されたり罰せられたりすることはないという確信が生まれる。

現在持っている知識の限界を認める…あることについて自分は知らないとリーダーが認めると、謙虚さを誠実に示したその姿勢によって、メンバーにも同様の姿勢を持つよう促すことになる。

心理的安全というキーワードの導入により、このチームには心理的安全はあるか、メンバーは心理的安全を感じているかといった議論が可能になるのが良いと思う。

また、心理的安全を高めようというプロジェクトを行って、結果的に失敗する話も書かれていたのが印象的だった。トップダウンで心理的安全高めようぜ!と言っても効果は無く、心理的安全を高める個々のリーダーシップ行動が重要であると書かれている。

心理的安全についてはThe five keys to a successful Google teamで見たことがあったのでGoogleの文化と思っていたが、この本の方が先に出たようだった。

フレーミング

フレーミングの力」という章があるのだが、このフレーミングの概念が今ひとつわからない。

フレーミングは人々に行動を根本的に変えてもらうためのきわめて重要なリーダーシップ行動だ。チーミングと学習を促すときにはなおさら欠かせないものになる。また、フレーミングをすると、人々は前向きで生産的な変化に伴うぼんやりとしたシグナルを察知しやすくなり、自分自身のものの見方に対する理解が容易になる。

文中ではこの言葉がいくつかの意味で使われているように感じる。自分が読み取ったのは以下の通りだが、間違っているかもしれない。

  • 個々人が思い込みや信念を持つこと、またそれを変化させること
  • メンバーに役割を与えて、期待をすり合わせること
  • やってはいけない、踏み込んではいけない領域を示すこと
    • そのことで逆にその範囲内で自由に振る舞えるようになる

バウンダリーオブジェクト

専門性が異なる人間同士の混合チームで境界を越えてコラボレーションするための方法として、バウンダリーオブジェクトという概念が紹介されていた。

ボストン大学のポール・カーライル教授は、自動車産業の新製品開発チームの中にある知識の障壁を研究した。そして、バウンダリー・オブジェクトによって、職業や専門知識による境界が取り払われやすくなることを見出した。模型や図の要素を示したり話し合ったりすると、専門用語のわかりにくさが解消されるのである。

これは自分の仕事で言うと、ペーパープロトタイプやFlintoなどを使って作る動的なプロトタイプが相当する。確かにアイデア段階でデザイナー、エンジニア、ビジネス職が集まって議論する際のベースとして一番有効なのは、見て触れるプロトタイプである。

そしてプロトタイピングいいよねと言うより、バウンダリーオブジェクトとして有効だよね、という視点で考える方が応用範囲が広いように思う(やっていることは同じで、言葉が違うだけなのだが)。自分の意見が理解されないときや相手の意見が理解できないときに「この場合のバウンダリーオブジェクトになるものは何だろう」と考えることで、図を描いたりプロトタイプを作ったりする具体的な行動に移れるようになるのではないか。

おわりに

多少冗長で読むのが辛いところもあるが、現代的なチーム活動とリーダーシップについて大切なことがまとまっていると感じた。自分の経験上も、確かにこの本に書かれている条件が満たされていたチームは良いチームだったと言えると思う。そういう「あー確かに」と言えるような良いチームの条件が言語化されているところに本書の魅力がある。

ワーク・ルールズHow Google Worksが好きであれば、さらに楽しく読めるかもしれない。

4/1追記

PMJPのSlackでドラッカー風エクササイズというのを教えていただいいた。メンバー同士の期待の摺り合わせるためのワークショップとのことなので、チームのキックオフ時や新しい人がジョインした際に行うと、チームの心理的安全を高めることができるかもしれない。

東京駅構内のはせがわ酒店

ここ数年で自分のお酒の嗜好が日本酒に移って、ときどきお店や家で飲んでいる。そして日本酒はだいたい東京駅のはせがわ酒店で買っている。

  • 品揃えが非常に充実、普通の酒屋にはなかなか置いていない人気銘柄がある
  • 180mlの瓶やビールも充実しているので、新幹線で飲むお酒を探すのにも便利
  • 駅構内なので下車料金がかからない

お店の仕入れと回転の良さからか、置いている銘柄が毎日どんどん変わるので、見る度に知らない酒蔵や新作に会えて楽しい。何が入荷しているかはオンライン店の新着をチェックすることである程度把握できる。

しかしIT業界民としては東京の西側が活動の中心になるので、東京駅にはほとんど縁が無い。そこで自分は例えば恵比寿から新宿に行くときも、わざわざ東京駅経由で中央線に乗ったりする(JRの規則的にもOKなはず)。新幹線で関西方面に行くときも最寄りの品川駅ではなく、東京駅まで行って乗っている(…なんでこんなことしてるんだっけ?)。

以上、最寄りにいい酒屋がない民のTipsでした。近所にはせがわ酒店がある人がうらやましい。

余談だけど、新幹線のEX-IC予約は「品川-新大阪」のように品川で取らずに、「東京-新大阪」のように東京駅で予約すると、品川駅でも東京駅でも乗れて便利*1。時間があれば東京駅まで、なければ品川駅でという使い方が可能になる。

アプリ開発と状態遷移の管理

このエントリーは読者としてスマートフォンアプリ開発者とWebフロントエンドエンジニアを想定して書いています。

CROSS2016に出るので、最近の自分の考えを整理しておく。

最近ReduxのSwift実装であるReSwiftを使って開発している。使った感想なども最後の部分に書いたけれど、このエントリーの本題はアプリの状態管理の話。

アプリは大きなシングルトン

iOSAndroid共にアプリを実装しようと思うと大抵シングルトンが必要になる。各ViewController内をまたがってデータを共有したいというユースケースが多いからだ。例えば

  • ユーザーのログイン情報を集約するUserManager
  • コンテンツへのいいね情報を集めるLikesManager
  • ブックマーク情報を集めるBookmarkManager

などなど。もちろんアプリの内容によってこれらの顔ぶれは違ってくると思うけれど、大抵UserManager以外にも一つ二つはシングルトンが存在していることと思う。これらはどのViewControllerから呼びたいし、状態を一意に保ちたいものたちだ。DIでインスタンス化を制御することはできるが、結局内部的にはシングルトンである。

自分はシングルトンを増やすことには抵抗があった。シングルトンは様々なところから使われ、内部状態が常に書き換わっていく。これが増えていくと、結果的にアプリの内部状態がどうなっているのか把握できなくなっていく。今UserManagerがどんな状態にあるのか(初回の起動なのか?ログインしているか?ユーザー情報の更新は終わったか?)を想像しながらコーディングやデバッグをすることになり、これは結構なストレスである。もちろん今までこれをずっとやってきているわけだが…。

しかしアプリ内でデータを共有したい、データを一意に保ちたいというニーズはなくならない。であれば、アプリは全体が大きなシングルトンであると考えてしまったほうがいいのではないか。ReduxのStoreがそんな思想で作られているかは知らないが、結果的にはそういう作り方を強制される。自分にはこの制約は結構しっくりきている。

内部状態の管理

野放図に作られるシングルトンは更新のための規約を持たない。どこからでも呼び出してメソッドを叩けば更新される。また、更新や状態の読み出しのためのメソッドの命名も実装者依存なので、結果的にはregisterUser, isLoggedIn, addLikeなどの名前が増えて行く(実装者にしても別に名前を混乱させる意図はなく、オブジェクトに注目して命名すれば自然とこうなると思う)。

f:id:ninjinkun:20160304001715p:plain ReSwiftのREADMEから転載

Fluxでは変更をActionに集約するという強い制約がある。すべてのActionはなんらかの状態更新を行うために発行されるので、ActionをLoggerに流していればアプリの起動時からの状態更新をすべて追うことができる。今の所は時々デバッグに使っているくらいなのだが、これをクラッシュ時に送信するというアイデアもあるようなので試してみたいと思っている。

別の効能としては、内部状態が実装者である自分の制御下にあるという、ある種の全能感が得られていてとても気分が良い。状態に起因する不具合があっても、必ず追いかけられるという安心感はとても心を落ち着かせてくれる。

感情的な部分を取り上げたが、内部状態が制御下にあるということは、開発メンバーが加わったり変わったりした際に開発がスケールすることに繋がるはずだ(まだその場面に直面していないので断言はできないけれど)。その辺りは大勢でステートルフなGUIをメンテナンスするという問題に直面したFacebook発祥のフレームワークだなという印象である。規約に沿って書けば誰でも内部状態が管理できる仕組みになっている。

状態遷移の管理

結局の所、ある程度複雑化したクライアントサイド開発とは、状態遷移をいかに管理するかということに尽きるのではないかという気がしている。ユーザーからの入力、サーバーからのGETやPOST、様々なイベントがアプリの内部状態を変化させる。このイベントとそれによって起こる更新処理をどうモデリングして実装に落とすのかでアプリの複雑さは変わってくる。モデリングというと偉そうだが、要するに状態をすべて書き出してその遷移を記述するということである。

もちろん方法はFlux系だけではない。例えば状態遷移をステートマシン(有限オートマトン、FSM)として記述するというアイデアもある。今やっている開発の中でReSwiftと並行してSwiftStateも試してみたのだが、ログイン処理などはステートマシンで記述すると読みやすく書けそうだった。ステートマシンを使う手法はゲーム方面ではよく使われていそうなイメージがある(未経験なので詳細は不明)。

状態遷移の管理という観点で捉えると、Flux、ステートマシン、MVVM、Promise、FRP対象としている状態の大きさの違いなのかもしれないとも思う。Fluxはアプリという大きな単位で状態を管理するためのアプローチである。Promiseはもっと小さな単位の状態遷移、ステートマシンはその中間くらいというイメージを持っている。PromiseやObservableはまとめることでより大きな状態遷移を作ることもできるので、小さな状態遷移を積み重ねて大きな状態遷移を作るものとして考えても面白い。

おわりに

増え続ける状態と、その遷移をどうモデリングして管理していくかというのがアプリ開発の課題であると考えている。

しかし状態遷移をすべて書き出すプログラミングは、今までのように状態遷移を意識しないでプログラムを書いていた時よりも大変になる。自分がReSwiftを使っていて感じている問題を以下に書き出しておく。

  • コードの量が増える
    • 特にアラートなど、一時的な状態をViewが持っていたケースを状態に落とそうと思うと大変
  • アニメーションの扱いが大変
    • アニメーションには時間の概念があるが、Reduxにはない
    • コールバックがアニメーション中でも何度も呼ばれる
    • 真面目に扱おうと思うとアニメーションの開始、終了もActionにする必要がある?
  • iOSにはVirtual DOMに相当するものがないので、差分更新を手動でやる必要がある
    • 大抵のViewは構築コストが低いので問題ないが、TableView, CollectionViewは差分更新の仕組みを作った
    • VDOM相当のものが欲しければComponentKit使えとなりそう
  • イベントの連鎖を扱う仕組みがない
  • 個別の状態をsubscribeする仕組みがない
    • subscribeすると自分が関与しないActionでもコールバックが飛んでくる
    • この制約がsubscriberにステートレスな実装を強要している気もするので、悪いわけではないのかも
    • これを解決したDeltaというのもあるけど、どうなんでしょ

現在進行形で実験している最中なので、特に今すぐReSwiftいいよと勧めるつもりはないけれど、この方向性はしばらく掘ってみたい。規模の大きいアプリを構築するために、状態を管理する仕組みが必要というのは今後も出てくる話題だと思う。

ブックマークコメントへの返信

アプリ開発と状態遷移の管理 - ninjinkun's diary

シングルトンが状態を持つというのは悪夢のシナリオでは?

2016/02/03 01:05

アプリ開発と状態遷移の管理 - ninjinkun's diary

それ、シングルトンではなくて、グローバル変数では?スコープがグローバルであることは、シングルトンの要件では無いような……

2016/02/03 09:09

仰るとおり、このエントリではシングルトンをグローバル変数と同義で使っています。言いたかったのはグローバルな状態+手続きなので、リポジトリと言った方が正確だったかもしれません。ただ自分の経験から言うと、クライアントではこの種のリポジトリはシングルトンとして実装されるケースが多かったので、クライアント開発者がイメージしやすい言葉を使いました。

3/30追記

ReSwiftを使ったアプリ「RIDE」がリリースされました。このエントリーで考察したことが実装に反映されているアプリになります。見た目は普通ですが、ウォッチリストの同期部分などを見て頂けるとReSwiftの恩恵がわかるかもです。

4/15追記

ReSwiftについて発表した資料を公開しました。

2017/5/17追記

その後Reduxで小さなアプリを作る実験をやってました。個人アプリだと要件は合わないと思います。

戦争と平和を読んだ

昨年からぼちぼち読んでいて、先日読み終わった。どういう話か知らずに読み始めたのだけど、ナポレオンのロシア遠征を題材に、史実の人物とオリジナルキャラクターを混ぜて作ったフィクションとノンフィクションの間みたいな小説だった。物語の中に戦争の時期と平和の時期があるだけで、特に反戦とかそういう内容ではない。

岩波文庫の新訳がとても読みやすく、また訳者によるロシアの風俗や戦争の話が途中にコラムとして挟まっていて、内容を補完してくれて楽しめるようになっている。

簡潔で気の利いた文章

読んでいると、うまいこと言うなーという箇所がいくつもある。文読む月日とかを書くだけあって、トルストイは簡潔で気の利いた文章に執着があるのかもしれない。以下にいくつか抜粋。

「うん、すばらしい、すばらしい子どもたちだよ」なんでもすばらしいと考えることで、自分には手の負えない問題をいつも解決してきた伯爵が相を打った。

1巻。ロストフ老伯爵という、好人物だが実務能力ゼロという人間を描写した一文。

ニコライは底意地の悪い目でピエールを見ていた。それは、第一に、軽騎兵流の彼の目から見ると、ピエールが文民の金持であり、美人の夫であり、要するに女の腐ったやつだったからだった。

2巻。ピエールは主人公の一人。いきなり莫大な遺産が転がり込んできたというチートキャラ。読んでいると、チートキャラだけど彼なりの辛さも抱えているしな…と感情移入しそうなっているところにこの一節。やっぱりピエールは女の腐ったやつだったのかと胸が空くようなニコライの批評。原文がなんなのか気になるけれど、とりあえずこの訳はとても気持ち良く決まっている。

彼は自分でも気づかないうちに、大きな口に酒を何杯かあおって、体にこころよい暖かさを感じ、近くの者みんなにやさしい愛情を感じ、ありとあらゆる考えに対して、その本質を掘り下げずに、表面的に応答する気になったときにはじめて、完全にいい気分になるのだった。

3巻。酒飲みの思考をトレースしている。

死と戦っている十万を超える人間を、一人の人間が指揮できないことを、彼は長年の戦争の経験で知っており、老人の知恵で悟っていたし、戦闘の運命を決するのは総司令官の指図でもなく、各部隊が占めている位置でもなく、大砲や死者の数でもなく、部隊の士気と呼ばれている、とらえがたい力だということを知っていた。

4巻。マネージャーは無力。

何かを望んでいる人間は、望んでいるものをあたかも裏書きするように、すべての情報をまとめる傾向のあることを知っていた。また、そういう場合、矛盾するものはすべて進んで見逃してしまうことも知っていた

5巻。バイアスについての考察。

以前、彼はいい人間だが、不幸な感じだった。そのため、自然に人は彼を避けていた。今では生の喜びの微笑がたえず口のまわりに漂っており、目には人に対する関心がみんな自分と同じように満足しているだろうか? という問いがかがやいていた。そのため、人は彼といっしょにいるのが楽しかった。

6巻。ピエールが様々な経験を積んで内面が変化した後、人々に受け入れられていく場面。

最終巻になぜか付いている訳者のQ&Aも面白い。

Q 第四巻二二九ページのコラム「貴族の荘園」を読んで、ちょっと寂しくなりました。こんな恵まれた人の書いた小説を、私のようなせせこましい生活をしている人間が理解できるのかと。

A いや、大丈夫ですよ。人間の問題はたいてい時空を越えているでしょう。それに、今の日本人の充足感と空虚感は、ロシア貴族に近いかもしれません。逆に、当時の庶民の重労働や飢餓感を想像することの方が難しいでしょう

著者語る

内容はロマンスありの戦記ものという体裁なので、ぐいぐい読んでしまえる。しかし途中に作者が自分の歴史観を開陳する部分が挿入されていて、これが結構曲者だった。

物語の途中に挿入されている部分は短くてまだよかったのだけど、最後の巻にあるエピローグに文庫の半分のページ数を使ってさらに濃密な語りが入っていて、これがなかなか辛い。物語が終わってからそのまま読み始めたら、全然終わらないし内容は哲学的で小説みたいにテンポよく読めないしで、「俺は早く終わらせて物語の余韻に浸りたいんだよ!」と自分は一人でキレていた。

後日日を空けてから読んだら、歴史と個人の関係を真摯に考察していて面白い文章として読めたので、時間を開けて読むのがいいのかもしれない。

とりあえず今は長い小説を読み終わったあとの満足感に満たされている。

戦争と平和 (一) (岩波文庫)

戦争と平和 (一) (岩波文庫)

DroidKaigiの発表を募集しています(11/30締め切り)#droidkaigi

droidkaigi.github.io

4月に行われたAndroidエンジニアのお祭り、DroidKaigiの第2回が2016年の2/18、2/19開催予定で、現在発表を絶賛募集中です。自分は今回もスタッフとしてお手伝いさせて頂いています。

自分は前回発表したのですが、その後「資料見ました」と言ってくださった方が入社したので、直接のコンバージョンかはわからないですが、採用実績も1あります。

また、初心者向けセッションも要望が多いので、そういった発表もお待ちしています。2016年にAndoidを始めるのに一番近道な方法まとめ とか、とても喜ばれそうです。

技術を深掘りしたい方、裾野を広げたい方、採用に繋げたい方、DroidKaigiはあなたの発表をお待ちしています!