スクラムガイドにある「リファインメントは開発チームの作業の10%以下」という箇所について、疑問が上がっていました(Facebook上で。限定公開だったのでリンクは貼りません)。そこにコメントしたのですが、私の解釈は以下のようなものです。

リファインメントはいろんなやり方があるので、「開発チームの工数の10%」という解釈がほぼ近いと思っています(工数、作業量、エネルギー、許容量、できること、そこの言葉の捉え方はいろいろありそうです)。POとミーティングをしてもいいし、開発チームだけで相談してもいいし、定例化してもいいししなくてもいいし、開発チームタスクとして作業をしてもいいし、ミックスしてもいい。

2週間スプリントでリファインメント「イベント」を週1回実施して、スプリント前半のリファインメントでは調査タスクを発生させ、後半までに開発チームで調べておく、というチームがありました。このときはイベント(全員)+調査タスク(担当した人)あわせて「10%以下」の対象になります。

別のチームでは、スプリント中に新しい急ぎのPBIが頻発するので、毎日15分確保しておき、急ぎのPBIがある日は内容を調べて見積もるようにしていました。

たしかケントベックが言ってた、「新しいストーリーはホワイトボードに貼っておいて、メンバーは気の向いたときにそれを眺めて、見積もりポイントを封筒に入れる。何人分か集まったら、その平均(だか最大値だか)を見積もりとする」というのも、スクラムであればリファインメント作業になると思います。

リファインメントはプロダクトバックログの「すぐやるやつ」と「今後の見通し」を把握するためにやるので、チームやプロダクトによっていろいろな形になるようです。「10%以下」は、そちらにのめり込みすぎないような、またプロダクトオーナーがやるべきことをチームに押しつけすぎないような、バランスのための目安かなあと個人的に思っています。

AIIT夏合宿に1日だけ参加し、TDDを紹介して、みんなでペアプロをしてきました。大学生って若いんだなあ。 #enpit

途中から参加者を放置して、メンターの太田さんとペアで書いた、HTML Canvas版ライフゲイムです。最低限ですが、ブラウザ上で動きが見られるところまでたどり着きました(本当に最低限なので、見て驚いてください)。
https://github.com/yattom/tdd_life_javascript

さて、このコードのキモは3つあります。

1.テスティングフレームワークがない。フレームワークの使い方ではなくテストの書き方、考え方に集中するために、その場でテストのロジックを書き、それが関数になり、実行の仕組みを作り…と、テスティングフレームワーク自体を育てていくアプローチをしています(最近のお気に入り)。必要最低限の「フレームワーク」ができて手頃ですし、「これ面倒だからフレームワークで対応したい」というペインポイントを感じながら作れるのがメリットです。

2.テストコードとプロダクトコードが渾然一体している。1ファイル(life.js)にテストコードとプロダクトコードが入り交じった状態で進めました(パターンになかったっけ)。最終的には、テストが「上のほう」、プロダクトコードは「下のほう」にまとまっています。これは配置だけの問題でなく、プロダクトコードの中にテストのためのコードが入り交じっているという状況も作り出しています(例: セルを描画した回数をアサートするために、プロダクトコードの中で数える)。この件は次のキモにつながり…

3.モック(テストダブル)を嫌う。Canvasに描画するという処理そのものをテストするのは困難です。そこでモックライブラリを導入して、描画処理が何回呼ばれたとか、正しいパラメータが渡されているとか確認するのが、常道です。しかし今回は(2.で触れたように)プロダクトコードのロジックの中にテスト用の処理(何回呼ばれたか数える)を埋め込んでいます。大変だ!プロダクトコードがテストで汚染された!

ですが、TDDであれば、あるいはTDDでなくても、プロダクトコードと自動テストとが一体となって作られ、一緒にコミットされ、変更やメンテナンスも同時です。プロダクトコードとテストコードの意味的な分離はそれほど、昔ほどは重要ではないように感じています。今回実際に書いてみて、このくらいなら複雑にもならないし、可読性も悪くないし、扱いやすいコードにできることがわかりました。少なくともモックを導入するよりは、プロダクト+テスト全体としてシンプルになっています(実際の比較はしていませんけれど)。

もちろん、たかだか2時間で書いたコード量ですから、これから質・量ともに増えて複雑になっていけば、いつまでもモック不要とはいかないでしょう。一方で、プロダクトコードとテストコードの分離が絶対である、依存関係は一方通行であるというのは、ルールと言うよりはガイドラインに過ぎず、バランスやトレードオフを考えるべき条項なのではないでしょうか。

P.S.
Jim Coplienがセミナーで言っていました。「製品にアサートを(テストと言うよりはDbC的な表明だと思う)を埋め込んだまま出荷すべきと意見したが、止められた。なので会社を辞めた」。またハードウェアはたいてい、異常時にテストする仕組みを埋め込んでいます(内部の自動テストや、外部からテストする端子など)。

新米スクラムマスターにお勧めの本

「新米スクラムマスターが読むべき、読んでおくべき書籍や資料を教えてください」とFacebookで書いたところ、何人かのアジャイルコーチやスクラムマスターといった皆さんからお勧めをもらいました。

https://www.facebook.com/yattom/posts/1771377669542867 (ログインしなくても読めます。「コメント26件」みたいのを開いてください)

せっかくなので、ここにも転記しておきます。私の独断で分類しつつ、一部紹介コメントも追加しました。

超基本、必読

入門書

人、チーム、組織について

広い観点を得て深く知る

成功しているアジャイルの実例

それじゃあ価値はどこからくるの?

前回の続きです。

Gerald Weinbergは、「品質」という言葉を「誰かにとっての価値」と定義した。高品質のデリバリを達成するには、「価値を届ける相手は誰か」、そして「デリバリに求められる価値は何か」といった理解が必要だ。

(『インパクマッピング インパクトのあるソフトウェアを作る』(ゴイコ・アジッチ、翔泳社、2013年) p.07 アクター)

もちろん、ストーリーを動くソフトウェアという形にしてユーザーに提供すれば、ユーザーはそれを使って何らかの便益を受けられます。すなわち、ユーザーは価値を得られます。こう考えれば、「価値がある」ストーリーには、文字通りユーザー価値があることになります。

しかし問題はそう単純ではありません。例として、ショッピングサイトを考えてみます。ストーリーは「商品カタログを見る」「注文する」「決済する」「発送する」などになるでしょう。すぐに典型的な疑問がわいてきます ―― 「注文する」ストーリーには単独で価値があるのか?すべてそろわないと価値がないのではないか?

ユーザーストーリーマッピングはひとつの答えになります。ユーザーが買い物をするという行為を完結できる一連のストーリーを選び、それを最小限の時間やコストで実現できる組み合わせにして、最初のリリースを定義する(これを私はMVP(Minimal Viable Product)とも呼んでいますが、人により解釈が異なるようです)。こう考えると、個々のストーリーの価値は問題ではなく、リリースというひとまとまりの動くソフトウェアに価値があることがわかります。

前回紹介した、ストーリー1つに独立して価値があるという考え方もあります。いまの時代にショッピングサイトを作るとしたら、他社にない特別な優位性が求めらるはずです。そうした優位性のアイデアが「注文する」ストーリーに込められているなら、単独で価値を持つと考えられます。リーンスタートアップのアプローチであれば、この優位性(の仮説)を検証するために、集中して実験することになります。注文の部分だけソフトウェアで実現して、ターゲットユーザーに試してもらうかもしれません。

プロダクトの強みとなる箇所だけを取り出し、検証する作業に当たります(これをMMF(Minimal Marketable Feature)と呼んでよいと思いますが、人により解釈は異なるようです)。最終的にプロダクトとしてユーザーに利用してもらうときは、一連のストーリーが必要になります。ギルドワークス株式会社の市谷さんは「学びを得ることと価値提供を混同しない」と言っています。

ユーザーストーリーマッピングに限らず、アジャイルなソフトウェア開発では、リリース計画やロードマップが用いられます。いずれも、顧客に動くソフトウェアを届け、価値を提供するための計画です。どういうタイミングで、なにを提供すれば、届ける価値を最大化できるのか。

リリースからはさらに、生のユーザーフィードバックを得られるようになります。こうしたフィードバックをどうやって得ていくかも、リリース計画の一部となります。フィードバックは様々な種類があり、ユーザー行動分析もそうですし、クチコミの評判もあれば、市場や競合の変化もそうです。売上やマーケットシェアの変化もフィードバックとなります。プロダクトの性質により、リリースが何スプリントに一度の場合も、1スプリント内に何度もリリースする場合もありますが、基本的には変わりません(間隔の長いリリースのほうが、計画が難しくなる傾向はあるようです)。

こうなると、次のリリースの内容は、その先のリリースまで見据えたものになってきます。そのため、リリース計画においてはその先のリリースも含めた、ロードマップの検討と更新が欠かせないものになります。ロードマップはプロダクトビジョンの実現、今後のプロダクトの向かう先を示すもので、チーム全体の方向をそろえる道具のひとつとなります。

ユーザーストーリーの価値

良いユーザーストーリーの条件として、よくINVESTが挙げられます。(参考: https://blog.guildworks.jp/2015/06/03/how_to_deal_with_invest_of_userstory/ )

  • Independent 独立している
  • Negotiable 交渉可能である
  • Valueble 価値がある
  • Estimable 見積り可能である
  • Sized Right (Small) 適切な大きさである(小さい)
  • Testable テスト可能である

この中のValuableについて考えてみます。ユーザーストーリーは価値がなければいけない。1個1個のユーザーストーリーに価値があれば、プロダクトオーナーは依存関係を意識せず並べられ、開発者はテストを含め完全に完成させられ、顧客は毎スプリント価値あるアウトプットを受け取れます。価値があるユーザーストーリーとは素晴らしい。

本当でしょうか。本当に、ユーザーストーリーは「価値があるべき」であり、「価値を持てる」のでしょうか。

ユーザーストーリーを扱う上で、よくある悩みは「1スプリントで完成できない」というものです。スクラムマスターは「それではストーリーを分割しましょう」と言います。Richard Lawrenceによればストーリー分割には以下のようなパターンを使えます。

  • 原則
    • 優先順位が違うものを分ける
    • だいたい同じ大きさ(小ささ)に分ける
  • パターン
    1. ワークフローのステップごとに分ける
    2. ビジネスルールのバリエーションで分ける
    3. 最初の1個目で基本形ができるように分ける
    4. シンプルな部分と複雑な部分に分ける
    5. データのバリエーションで分ける
    6. データ入力の方法で分ける
    7. パフォーマンスを別に切り出す
    8. 操作(CRUD)で分ける
    9. スパイクを切り出す

いずれももっともですし、効果的な分割ができそうです。でも分割したものには価値があるのか?あるとしてどのくらいなのか?測る方法はあるのか?

そもそも価値とはなんなのか。

エクストリームプログラミング入門の第1版で、ケント・ベックはこう書いています。

第15章 計画戦略 計画ゲーム (p.89):

計画ゲームのゴールはチームが生産するソフトウェアの価値を最大化することである。

計画ゲームは3週間ごとにおこなうとされています。常に、ソフトウェアの価値を最大化するよう計画すると述べているものの、ストーリー1つひとつに価値があるという言及は、この本には見つかりません。

アジャイルマニフェストアジャイル宣言の背後にある原則の1番目は「顧客満足を最優先し、価値のあるソフトウェアを早く継続的に提供します」とあります。ここにも、継続的に提供するのは価値のあるソフトウェアであって、ストーリーとか、機能とか、フィーチャーとかPBIとかいったものが個々に価値があるとは言っていません。

エクストリームプログラミング(第2版)では、こうなっています。(訳は筆者)

Chapter 7. Primary Practices - Stories

顧客が理解できる機能の単位を使って計画する。……見積りにより、ビジネス側と技術側の観点から相互に対話する機会が生まれ、そのおかげで価値を早期に、一番ポテンシャルが高い時期に作り出せる。コストがわかれば、その機能の価値を鑑みながら分割したり、結合、拡張することもできるようになる。

ここでは、ストーリーは相互の対話、インタラクションのためにあると言っています。ユーザーストーリーの3Cにもあるように、ストーリーに会話は不可欠です。

ここに、ストーリーが「価値がある」意味が出てきます。価値とは、それがなんであれ、誰のためであれ、ストーリーに背景を与えます。技術側はその背景を理解して初めて、ソフトウェアの価値に貢献できるようになります。技術側は正しいものを作るために、ビジネス側の観点を持たなければならない、そのための「ストーリーの価値」です。

アジャイルマニフェストの原則ではまた、「できるだけ短い時間間隔でリリースします」「ビジネス側の人と開発者は、プロジェクトを通して日々一緒に働かなければなりません」とあります。ここから、ビジネス側の人、ひいては顧客側は開発者にフィードバックをするチャンスが得られます。ストーリーに価値があれば、その部分をさわって、満足か不満か、直すべき点はどこかという情報を開発側は受け取れます。開発者の知識とソフトウェアの実装は一致しています。そこにビジネス観点から見て間違いがあれば、開発者の知識を修正でき、ソフトウェアも正しくなります。そして「チームが生産するソフトウェアの価値を最大化する」ことに近づきます。

以上から、ユーザーストーリーが価値があるのは、正しいもの、価値あるソフトウェアを作るためと言えます。そうなる確率を上げるために、作る前の会話を効果的にし、作った後の確認も容易になります。これはすなわちリスクマネジメントの手法と言えます。価値があるユーザーストーリーを書くと、ソフトウェアが失敗するリスクを下げられる。

ストーリーに価値があるのは、実現したらソフトウェアの価値がそのぶん増すというような、単純なものではないのです。リスクマネジメントの手法なので、どんなリスクを想定するか、どんな情報を得たいか、そのうえでどれを優先すべきか、考えるための道具として使うものです。「間違ったものを正しく作る」事態を避ける道具のひとつなのです。

(まだ十分に考えが整理されていないのですが、いったんまとめるために本稿を書きました。観点の不足もあると思うのですが、コメントなどで突っ込んでもらえると嬉しいです。)

年末にThinkPad X1 Carbonを手に入れ、環境を作っていました。これまではホストOSをWindowsに、開発などではゲストOSをLinuxにしていましたが、今回はホストをLinuxにしようとしていろいろ試してみました。結論としては、これまでと変わらずホストWindowsになってしまったのですが、それまでの経緯や調べたことなどを記録しておきます。誰かの参考になるかもしれないので、役に立ったリンクも張っておきます。

3行まとめ

  • ホストLinuxでは新しめのハードウェアに苦労する
  • GUIアプリの操作感は、ゲストOSはだいぶ不利
  • それ以外のパフォーマンスは、ゲストOSでも遜色ない

やったこと

新マシンのスペックはこんな感じです。

Windowsプレインストールですが、回復メディアを作ったらさっさと初期化、まずはUbuntu Desktop 14.04を入れてみました。そこから、Ubuntu上で暮らしていけるかの確認(主にハードウェア)と、Windowsをゲストにして作業が快適か(主にOfficeを使う)を、調べていきます。

ハードウェアについては、自分にとってはいきなり致命的だったのが、WiGigドックとBluetoothマウスの問題でした。WiGigドックはLinuxでの情報が見つからず(「数年以内にはサポートするんじゃない?」とか )、断念。

マウスはロジクールMX Anywhere 2Bluetooth接続ですが、Ubuntu 14.04ではPINなしのペアリングに対応してないとのこと。回答の中に「DON'T DO THIS!」とあったりもしたので、こちらも諦める方向(実のところPPA追加だけなので、大した騒ぎではないのですけど)。

また指紋認証も、fprintのサポート外デバイスらしく、使えるようにできませんでした。 (こちらのリンクの138a:0090に該当。)

Windowsゲストの導入

気を取り直して、Windows 10をゲストでインストールします。qemu+kvmVirtualBoxをそれぞれ試しました。Windows10はインストールUSBディスクを作っておいたものの、VMをUSBブートさせる方法がわからず、isoイメージから。基本的には問題なかったものの、引っかかった点をいくつか。

Windows上ではブラウザやIntelliJ IDEAを操作してみましたが、もっさり感があるのと、キーリピートが不自然に中断されるなどの微妙な使いにくさがありました。(これは対策したけど変わらず)

ベンチマーク(要約)

その後、新マシンにあらためてWindowsを(ホストとして)新規インストールして、さらにVirtualBoxHyper-VそれぞれでUbuntu Desktop 14.04を入れ、PCMark8や、pythonベンチマークを取ってみました。ここでは要約だけで、より詳しくは下の方に載せておきます。

PCMark8はWindows専用で、ブラウジングなど一般的なアプリケーション利用の操作感のスコアを出してくれる、ようです。ホストの時は2644、ゲストの時は1250前後となり、半分くらいでした。ただし項目ごとに見ると、差があるのは一部の項目だけで、そこまでの差はないようです。

Pythonでは総合的なベンチマークを取りました。こちらの結果は、傾向としてLinuxホスト>Linuxゲスト>Windowsホスト>Windowsゲストという、わかりやすい順位になりました。

ベンチマークのスコアを見る限りでは、どちらがホストでも極端な差は出ないようです。ただしアプリケーションの操作感は、Linuxホスト/Windowsゲストだとどうも使い辛く感じます。気のせい、プラセボ、思い込みかもしれません。

当面の結論

なにより、使いたいハードウェアを使えないという点で、WindowsをホストOSにして(もう少し)生きていくことにしました。ただし開発はゲストのUbuntu Desktop上で、IntelliJ IDEAも含めて使っていくつもりです(Windows上のPythonは、慣れたけど、やっぱりツライ)。

環境にかける情熱がだいぶ減っているなあというのも発見でした。なんとかなりそうでも、すぐ面倒くさくなる。いったん解決できても、今後のことやまたトラブル出たらと、思ってしまう。前にやった解決方法とかも、毎回忘れてるし。

そういえばゲストWindowsでOfficeを使ってみれば良かったなあ(面倒なので諦めた)。

ベンチマーク結果

PCMark8のベンチマークWindows専用です。無料で使えるHome Conventional 3.0を実行します。結果、ゲストではホストの約半分のスコアでした(2644に対し1250前後)。qemu(1259)とVirtualBox(1235)では、目立った差はありませんでした。

しかし項目別に見ると、Casual GamingとVideo Chat encodingが極端に悪いものの、それ以外ではそこまでの差はないように見えます。(いずれも、ホストの場合を1.0とした相対値。[s][ms]は時間なので長い方が遅く、[fps]は短い方が遅い)

ゲストを実際に操作すると、もっさりというか、引っかかるというか、使い辛い気がするんですが、ユーザーの操作に対する反応性だけであって、総合的なパフォーマンスは悪くないようです。

pythonのパフォーマンスはPython benchmark suiteというものを使いました。様々なベンチマーク(純粋なPythonの処理から、Web、DB、jsonxmlなどまで)をまとめて実行してくれるものです。画面表示・描画はありません。
グラフはそれぞれのかたまりがベンチマークの種類に対応し、その中の7本のバーが左から、以下の順序になっています。長さは実行時間で、長い方が遅くなります。いずれのベンチマークでも、Windowsゲストを1.0とした相対値になっています。

  1. Windowsゲスト(VirtualBox上)
  2. Windowsホスト
  3. Linuxゲスト(Hyper-V上)
  4. Linuxゲスト(VirtualBox上)
  5. Linuxホスト
  6. X240sでのWindowsホスト(参考値)
  7. X240sでのLinuxゲスト(Debian。参考値)



全体的な傾向としては、前述のように 5>4>3>2>1の順に速く(グラフは短く)なっています。項目によっては、Windowsのほうが速かったりと、異なる傾向のものもあります。(なお、極端な差が出たり、環境によって実行できなかった項目は、除いています。) Linuxゲストは、Hyper-VよりVirtualBoxのほうが成績が良いようですが、厳密に同じ設定になっていないかもしれないので、ここは参考程度に。

なおPython benchmark suiteで利用しているGitHub - vstinner/perf: Toolkit to run Python benchmarksというモジュールが現在Windowsで動かず、パッチを作って使いました。うまくいけばそのうち取り込まれると思います。

一歩ずつ進める

あなたが解きたい問題には、簡単なものもあれば難しいものもあります。
単純なものもあるし複雑なものもあります。とても簡単でとても単純な問題だったら、一発で解決できるかもしれません。しかしもう少し難しかったりもう少し複雑だったりすると、一発では解決できなくなってきます。こうした問題は少しずつ、一手ずつ解いていくことになります。

大きくて複雑な問題を一息で解決できれば、カッコいいかもしれません。
しかしそのやり方にはリスクがあります。一息でやっつけようとして、それが上手くいかないと、振り出しに戻ってしまい一歩も先へ進めません。ことによっては、最初よりも状況が悪化してしまうかもしれません。カッコよさよりも、問題解決という目的を大切にして、確実で効果のある進め方が必要です。小さな問題でも大きな問題でも、自分に合った歩幅で一歩ずつ進めましょう。ひとくちサイズずつ食べるという言い方もします。

一歩ずつ進めるアプローチにはメリットがたくさんあります。一歩で考えるのは小さな問題、元の問題から切り出した一部分になります。そうすると同時に考えないといけないことが減って、比較的簡単に解決できるようになります。問題はわかりやすく、解決方法もシンプルで、善し悪しも客観的に評価しやすくなります。解決方法が正しいかどうか、判断も容易です。考慮漏れや見落としが入り込む可能性も小さくなります。さらにより良い解決方法を求めて、方法自体を洗練させたり、他の案を検討したりもできます。

例題:
  • 皿洗い問題 汚れたお皿が10枚あります。洗って拭いて食器棚にしまわないといけません。
    • どういうやりかたをしますか?
    • 100枚だったらどうですか? 10000枚だったら?

自分の歩幅

一歩ずつ進めるといっても、どんなふうに一歩を決めればいいでしょうか。Webアプリの開発を例にすると、たとえば次のように6つに区切るという手があります(あくまで一例です)。

  1. 画面を実装して入力できるようにする
  2. 入力したデータをどう保持するか設計する
  3. 入力と既存のデータを組み合わせて保存する実装をする
  4. ユーザーが使いやすいよう画面を修正する
  5. 全体が矛盾なく整合しているかテストする
  6. 実行時間が遅くなったりしないか確認する

1ステップごとに、プログラムが少しずつ増え、完成に近づいていきます。2番は設計を検討するだけですし、5番や6番はテストやレビューが中心で、コードは書かないようなステップもあります。

こうした「一歩の大きさ」は様々です。ベテランならば1番から6番までまとめて一歩で片付けてしまうかもしれません。新人だったら、もっと細かく分けないとうまく進めないかもしれません。あるいはベテランでも、1画面に300項目あるような複雑な機能なら、念入りに小さな一歩で進めるでしょう。Rubyならまとめてできる人でも、C++では設計だけ先に考えるということもあります。問題の性質、人の経験やスキル、解決に使う道具やテクノロジーによって、妥当な一歩の大きさが変わってきます。自分が自信を持てる、これなら踏み外したり、うっかり間違えたりしないと思えるような一歩を、そのときどきで選んでください。

プログラミングの世界ではよく、設計・実装・テストという作業をしますが、こうした「作業の分解」も一歩ずつ進める一つの方法です。

  • 設計: 対象の問題全体を解決する方法を決める
  • 実装: 設計で決めた方法を具体化する
  • テスト: 問題が解決したか確かめる
例題:
  • 普通の一歩問題 普通に歩いているときの、一歩の大きさを測ってください。そのうえで、「自分が自信を持てる」一歩の大きさは、どのくらいだと思いますか?
    • 平坦な道路では?急な山道だったら?ツルツルに凍った氷の上なら?
    • 裸足のとき、履き慣れた靴のとき、ビーチサンダル、下駄、竹馬ではどうでしょう?
    • 空中100メートルで綱渡りをするとしたら、一歩の大きさはどのくらいですか?一歩でも進めますか?
  • 間違えない問題 プログラムを書くとき、何文字、あるいは何行までなら絶対に一箇所も間違えないで書けますか?
    • 確かめてください。
    • 自分で自信があると感じる度合いと、実際に間違えてしまう割合は、合っていますか?

前に進まない一歩

一歩ずつ着実に確実に前に進むという考え方ではあるのですが、前に進まない一歩というものもあります。進めていくうちに、わからないところが見つかることがあります。最初の想定と違う箇所が出てくることもあるし、今までやったことが間違っていたとわかることもあります。単に、自信が持てなくなることだってあります。そうしたときは、前進するのをいったんやめて、考え直さないといけません。状況を再確認したり、方針を見直したり、情報を収集したりするのも、前に進まない感じがありますがこれもまた一歩です。

大きな問題を少しずつ解決するのは、長い道のりを一歩ずつ進むようなものです。一歩ずつ進んでいると、先行きがわからなくなったり、見失ったりしやすくなります。全体として問題解決に近づいているかどうか、ときどき周りを見渡し、行く手を確認したほうがよいでしょう。本当に前進しているか、解決に近づいているか、事実の確認と仮説の検証をしながら進んでください。道を間違えていると困るので、ときどき行く手を探索して情報収集しましょう。むしろ、一歩ずつ進んでいるからこそ、問題点や不明点に気づくことができます。

コラム 前に進まない楽しい仕事

プログラミングというのは楽しいものです。 楽しいことをしていると、つい時間を忘れて没頭しがちです。 やっていることが面白くなって、もともとの目的を忘れてしまうことも、またありがちです。 コードの美しさにこだわったり、アルゴリズムのチューニングに熱中したり、モデリング中毒になったり、アニメーションの気持ちよさを追求したりと、ハマりどころはたくさんあります。

そういう点ももちろん大事なので、かけるべき時間はかけましょう。しかし今やらないといけないのか、どれくらい時間をかけるべきなのか、意識して確認しましょう。先にやるべきことは先にやる、後に回せることは後にするのが大事です。

いま、なんのために、どんな一歩を踏んでいるところなのかを忘れずに。

解としての一歩ずつ

そもそもプログラミングとは、問題を解くために、コードを1行ずつ書くことです。プログラムはまさしく、一歩ずつの積み重ねでできているわけです。アルゴリズムを勉強していると、解説はたいてい、1ステップずつの処理に分けて書いてあります。分割統治との組み合わせで、様々なアルゴリズムにおいて、扱いやすい一部分だけを取り出して処理するというアプローチが利用されています。問題解決の方法と進め方はどちらも、一歩ずつ進めるのと相性がいいのです。

一歩ずつのアプローチは、後から他の人が見たときも理解しやすくなります。理解するほうも、やはり一歩ずつ理解を進められるためです。一歩ずつの考え方を反映したプログラムやシステムの構造も、同様です。

例題
  • 問題分解問題 スマホアプリに入力したデータをサーバで集計して、運用者がGoogle Spreadsheetで見られるようにしたいとします。
    • まずこの問題を3つの問題に分解してください。
    • 3つに分けたそれぞれを、さらに小さな問題に分解してみてください。ここでも一歩ずつ進めましょう。一気にうんと小さくしようとせず、2つか3つくらいずつ、段階を追って分解してください。

https://github.com/yattom/text_for_programmer/wiki/%E4%B8%80%E6%AD%A9%E3%81%9A%E3%81%A4%E9%80%B2%E3%82%81%E3%82%8B