投稿

よいコーディングとはなにか?

私が駆け出しプログラマーだったころからずっと疑問だったことがある。 それは「よいコーディングとはどういうコーディングなのか?」というものだ。 読みやすく、理解しやすいコーディング 必要なことしか書いてないコーディング メンテナンスしやすいコーディング データ中心に設計されているコーディング いろいろな表現があるが、どれもどんぴしゃという感じがしなかった。 それが何十年もたった今になってようやく1つの答えを見つけた。 そのきっかけは、会社の若手社員の何気ない質問だった。 「アーキテクチャーって日本語ではなんというんですか?」 「構造よ。」と答えたあとで違和感が残った。建築物のつくりも「構造」というが、システムの「構造」とは微妙に違う気がする。同じ「構造」なのに、どこが違うのだろう? 私のイメージでは、建築物の構造は「静的」、システムの構造は「動的」な感じがする。 なぜシステムは動的な感じがするのか? それは、システムには動いているもの、流れるものが存在しているからだ。 してみると、自然界のシステム、交通システム、発電システム、 経営システム、どれもその中に流れているものがある。 何かの流れを制御して、目的を果たすのがシステムなのだ。 そういえば、システムにもよいシステムと悪いシステムがある。 悪い交通システムは頻繁に交通渋滞が発生する。 よい交通システムは、交通量が変動しても交通渋滞が発生しない。 つまり、流れが変動しても流れが滞ることなく、スムーズに流れるシステムがよいシステムなのに違いない。 よりよいコーディングとは、よりよいシステムを作れるコーディングだ。 それはコーディングを流れるもの、つまりデータの流れ方がよく見え、流れの変動・変化への対応が容易で、流れをスムーズに制御できるようになっているコーディングなのだ。 こうして駆け出しプログラマの疑問は二十数年の時を経てようやく解決したのだった。

「そもそも」の勧め

皆さんは普段「そもそも」という言葉を使っていますか? 「そもそも」は辞書には以下のように説明されています。 -------------------- そもそも 1 【▽抑/▽抑▽抑】 〔「そも」を重ねた語。古くは漢文訓読に多く用いられた〕 (1) (名) (物事の)最初。起こり。どだい。副詞的にも用いる。 「―は僕が始めたものだ」「―の始まり」 (2) (接続) 改めて説き起こすとき、文頭に用いる語。いったい。だいたい。 「―、事前調査の不備がこのような事態を招いた」「―私の今日あるは彼のおかげだ」 (三省堂提供「大辞林 第二版」より) -------------------- つまり、「そもそも」は、時間における起点が何かを表現するときの言葉なのです。 起点には、過去の起点と未来の起点の2つがあります。 過去の起点とは、「真の原因」、未来の起点とは、「真の目的」です。 話はかわりますが、昔、アメリカに行ったときのことです。初めて行った時には、見るもの聞くものすべてが日本と違っていて、毎日へとへとに疲れてしまいました。でも2度目に行った時には、もう以前行ったときと同じところは気にしないようになっていて、ずいぶん楽になっていました。皆さんも新しい職場に変わったり、新しい場所に引っ越したりしたときに似たような経験をしているのではないかと思います。 変化しないものを情報処理の対象からはずす、というのは、日ごろの情報処理を効率化するための人間の本能でありすばらしい能力なのです。 だから、変化しないものが見えなくなるのは人間としてごく自然なことなのです。 「現在」に比べると、過去の起点である「真の原因」も未来の起点である「真の目的」も遠く離れていてほとんど変化しません。 だから、自然にまかせると「真の原因」も「真の目的」も人間の本能によって見えなくなってしまうのです。 本能にさからうには、流れ落ちる水をくみ上げるように、意識して行動することが必要です。 では、どのように行動すればいいのか? 簡単です。普段の会話で「そもそも」を使うようにするだけです。 「そもそもこうなった原因はなに?」「そもそもこれは何のためにやってるの?」というように。 「そもそも」は、頭の中の世界で、足元ばかりを見て歩いているとき、顔を上げて遠くを見るための言葉です。 進んでいる方向があっているのかどうか

思考の訓練

 このブログでは、「思考する」ということをいろいろ議論してきた。  ところで、人はいつどうやって思考することを覚えるのか?  生まれたばかりの赤ちゃんが思考できるわけではない。ということは、本能の助けがあるにせよ、なんらかの訓練によって思考できるようになるのだろう。その訓練とはなんなのか?  猫だって生まれたときから狩ができるわけではない。では猫はどうやって狩ができるようになるのだろう?  お正月に実家に帰省したとき、しゃべることを覚えたばかりの甥っ子が、いろんなものを指差しては、大人が返す単語をまねしてしゃべるのをうれしそうに延々と繰り返していた。言葉をしゃべる、聞く、まねしてしゃべる、これがただ単純に楽しいからやっている。  猫の場合は動くものにじゃれるのが大好きだ。じゃれるのが嫌いな子猫はいないから、じゃれると快感を感じるということが本能に組み込まれているんだろう。本能のままに楽しいからじゃれる、を繰り返すうちに、狩の基礎訓練が出来ていく。  人間の場合も同じように、言葉をしゃべる、聞くことに快感を感じるということがきっと本能に組み込まれているのに違いない。そして、言葉をしゃべる、聞くを繰り返すうちに、言葉で物事を定義して、理解し、考えて、伝えるという、人間固有の思考の基礎訓練ができていく。  思考は、やはり「言葉」で訓練するものなのだ。

「見る」と「観る」

 先日、知人と会話しているときに、「若い子に病気の動物の状況をチェックさせていたのに、変化の予兆を見逃してしまって、危うく事故になるところだった。ちゃんと見ててといってるのにどうして気づかないんだろう?」という話がでた。見ているのに見ていない、これはどういうことなのか。予兆を見つけられるような見方を指導するにはどうしたらいいのだろうか?  たとえば、ここに一見すると同じ2枚のイラストが並べてあるとする。この2枚を見比べるときの違いを考えてみよう。 (1)2枚のイラストがただ並べてあるだけの場合  この2枚をただ見ると、「同じイラスト」だと思い、それ以上詳しく見ようとは思わない。 (2)2枚のイラストの上に「間違い探し」と書いてある場合  この2枚のイラストのどこかに違いがあると思って、2枚のイラストを部分ごとに見比べていく。それによってたとえば違いが5つ見つかったとして、それ以上みつからなければあきらめて、さらに探そうとはしない。 (3)2枚のイラストの上に「7つの間違い探し」と書いてある場合  目標がはっきりしているので、さらに詳細な部分を比較しながら7つ見つかるまで根気よく探していく。  また、イラストがピースに別れていて、各ピースに1つ以上間違いがないと分かっている場合や、イラストの間違いがある範囲が絞り込まれている場合は、さらに効率よく間違いを見つけられる。  (1)は違いを見つけようと思ってみていない。漠然と全体をみているのでこれを「見る」と定義しよう。 (2)や(3)は、違いを見つける目的で、部分に分けて比較をしている。観察や観測に通じる見方なのでこれを「観る」と定義しよう。  辞書の定義によれば、「見る」と「観る」はそれぞれ以下の意味に該当する。 「見る」→視覚によって、物の形・色・様子などを知覚する。 「観る」→判断を下すために、物事の状態などを調べる。 (三省堂提供「大辞林 第二版」)  つまり、違いを見つけるには、「見る」のではなく「観る」ことが必要であり、「観る」には必ず何かと見比べる必要がある。    では何と見比べるのか?  変化の予兆を見つけるには、過去のある時点の状態と今の状態とを見比べなければならない。そのためには、今見ているときに、未来に比較することを前提に、見ているものを分解して状態を観察しておかなければならない。  経験を積んで

記事を書けなくなったわけ

 そもそも、このブログを書き始めた動機は、自分の所属している組織の知的生産性を上げたいというものだった。 しかし「知的生産性」を掘り下げていけばいくほど、個人の子供のころの育ち方や人生に対するスタンスにまでさかのぼってしまい、後から訓練で何とかなるような代物ではないという思いが強くなった。 なんども育成に挑戦してみたが、育成できない原因ばかりが明らかになり、育成なんか無理なのではないかと途方にくれてしまったとたんに、記事が書けなくなってしまった。  1年前、新しい仕事で新しいメンバとチームを組むことになった。新メンバのリーダは、今までで明らかになっていた育成できない原因は持っていないように見えた。だから、彼を育成できなかったら、もう私に育成できる人はいない。そのときは今後育成をきっぱりあきらめようと覚悟した。  そうして一緒に仕事をし始めて3ヶ月、なかなか変化は見られなかった。  やっぱりだめなのか、もうあきらめようかと思った矢先に、彼は突然芽をふいた。自分に今出来ないことは出来ないと素直に認めて、それでもいくべき場所に向かって自分にできることは全力でやり、できないことはなりふりかまわず助力を求めるようになったのだ。それからは、まるで若芽のようにぐんぐんと成長し始めた。おかげでまた私は育成をあきらめるわけにはいかなくなったわけだが。  彼はいま、自分の部下達の育成に真剣に悩んで取り組んでいる。  彼が次々と衝突する課題を一緒に議論しているうちに、育成対象者が今いるレベルにあった訓練方法があるのではないかという気がしてきた。  たとえば、エアロビクスの初心者は、模範演技をどれほど真剣に見て真似しようとしても、いきなり複雑な振り付けを覚えて音楽にあわせて踊るなど絶対に無理である。しかし、初級クラスでごく簡単なラジオ体操のような振り付けを音楽にあわせて踊るところから始めて、それができるようになったら、中級クラス、上級クラスと順次ステップアップしていくことで、ある程度までは難しい振り付けが踊れるようになる。  思考法もこれと同じようにレベルに合わせた訓練によりステップアップが可能なのではないだろうか?そのための具体的な方法を見つけることは簡単ではないけれど、可能なのではないだろうか?と思えるようになってきたのである。  貴重な仲間が増えたことだし、彼と共に、もう一度、知的生

検討結果のまとめかた

 要件定義では、通常、顧客との打ち合わせのタイミングにあわせて、①検討資料の準備、②顧客との打ち合わせでの検討のための議論、③検討資料への検討結果の反映、というサイクルを繰り返しながら、検討作業全体を進めていく。  このサイクルのうちの「③検討資料への検討結果の反映」を行う際に、1点注意すべきことがある。  それは、決定した結果だけを反映するのではなく、決定に至る考え方を記載する、ということである。  決定に至る考え方は、数学にたとえると方程式にあたり、決定事項は方程式で求めた答えの値にあたる。  方程式が書いてあれば、同じ答えがいつでも出せるだけでなく、新しい課題が出てきても、方程式に当てはめることで容易に答えを導きだすことができる。  たとえば、システムの利用実績出力対象項目を検討し、「項目A、B、C、D、Eのうち、A、B、Eを対象項目とする」と決定されたとしよう。  しかし、決定されたことだけを記載したのでは、後日、新たな項目F、Gが出てきたときに、利用実績出力対象項目とすべきかどうかを、また一から検討しなければならなくなる。  そうならないためには、この項目に決定した理由、決定に至る考え方を記載しておく必要がある。  先ほどの利用実績出力対象項目の例ならば、以下のように記述をするとよい。 -------- 利用実績対象項目の考え方  ファーストリリースの開発規模を抑えるため、ファーストリリースで提供する利用実績出力機能の対象項目の考え方は以下の通りとする。 1.契約上の制限値に該当する項目 2.サーバリソースの消費量に直結する項目   :   : -------  考え方を記述したあと、実際の決定事項が確かにこの考え方にのっとっているかどうかをチェックすることにより、考え方の正当性を検証し、決定事項と共に記載する。  このように考え方を記載しておけば、後で新たな項目の検討が必要になっても、この考え方に照らすだけで、対象とするかどうかを決定できるのである。  ただし、検討結果の考え方をまとめるのは、思いのほか難しいことが多い。というのは、検討時の議論の中では、この考え方が明確に言葉になっていないことが多いからである。  その場合は、言葉になっていない考え方を顧客に確認してもらうために、想定される考え方を「考え方のたたき台」や「考え方を引き出すための質問事項」な

パターンを洗い出すには

 要件定義では、通常、モレなく検討するためにパターンの洗い出しが必要になる。このパターンの洗い出しをちゃんと行うにはどうすればよいのだろうか。  よくあるパターンの洗い出しは、考えられるパターンをただ列記したものが多い。この方法では、すべてのパターンが洗い出されていてモレがないということを示すことができない。つまり、一生懸命考えた洗い出しも、思いつくものを適当にピックアップしただけの洗い出しも、列記されたものだけを見るとその区別がつかないのである。  では、列記されたものにモレがないということを、どう検証し、どう示せばよいのか?  列記されたものは、それだけでは単なる点データの集合体になっている。点のままではモレが無いということは示せないので、それらをMECEを使って面にする必要がある。  MECEを使って面にするには、まずそのデータを埋める表を作る。 表の縦軸、横軸は、ほとんどの場合最初から全部埋まることはない。しかし1軸は簡単に決められることが多い。そこでまず、1軸に分類を書き込み、空白の枠が2つだけの表をつくって、その表に列記されたものを仕分けしていく。表の分類はそれだけでモレがないということが明らかなものでなければならない。たとえば「社内」と「社外」、「新規」と「既存」、「利用前」と「利用中」と「利用後」というように。  仕分けが終わったら、仕分けたデータを眺めて、枠内にあるデータの共通点に着目して、もうひとつの分類軸を見つける。共通点を見つけるには、このようにデータを近くに集めると考えやすい。  余談になるが、ナンクロというパズルをご存知だろうか?ナンクロは同じ番号の白マスには同じ文字が入る、というルールだけをヒントにその番号の文字を決めていくパズルである。これを解くときによくやるのが、解決したい文字の部分を取り出して集めて試行錯誤しながらその文字を見つけるという方法である。たとえば「山○」、「○草」、「○外」をメモ用紙に書き出し、○に入る文字を探すと、「野」という文字が見つかる。同じことをそれぞれのマスがパズル面のあちこちに分散したままやろうとするとなかなか見つからない。  このように、共通点を見つける作業は、共通点を見つけたい対象を物理的に近くに集めると見つけやすいのである。  共通点を見つけてそれを分類軸にし、その分類軸