何某日和

「カメラ」のち「ハンダゴテ」ところにより「プログラミング」 ── そんな私“かめきち”のウェブサイト

特別研究II 座学 [2012.07.11]

導入

 座学形式としては最後の特研。「エクストリーム・プログラミングとは」という題目の下に、これまでに学んできたことの総決算を執り行いましたので、その時の学びを外在化しておきます。

 ちなみにエクストリーム(extreme)とは、日本語で「究極の」とか「極限の」という意味です。以下に出てくる「XP」とは、eXtreme Programmingのことであり、Windows XPの「XP」ではありません。 (Window XPの「XP」は、eXPerience(経験)の意。)

 ※くれぐれも断っておきたいのは、執筆者が学生の身分であり、実際の開発現場のことなど何一つ知らないということです。 本稿の中には、立場をわきまえない表現が散見されると思いますが、それは純粋で無恥な学生が理想論を述べているに過ぎないというものが多いと思います。 しかし、これが理想であることもまた確かなことであり、できるならば実現したいことでもあるのです。ゆえに空想的理想論とは言え、今の気持ちを書き残そうと思い至ったのです。 自分向けの覚え書きのようなものですが、万一、他の方が参考になさる際には、気分を害してしまうことがあるやもしれません。その点はどうかご容赦を賜りますようお願いします。

エクストリーム・プログラミングとは(XP:eXtreme Programming)

 私の師が、その昔に某企業で公演で「エクストリーム・プログラミング」について解題したことがあり、そのスライドを用いて、私達にも口伝してくださいました。 以下は、そのスライドの内容そのものや、そこから学んだことについてのまとめです。(1ヶ月以上経ってからまとめているということもあって抜けも多かろうと思います。)

プログラムの進化における共創性 ─ eXtreme Programming(XP)を題材にしながら ─

 by 青木 淳さんと浅岡 浩子さん(共にブラックブックの著者)

(タイトルページのため、特記すべきことなし。)

誰でもなれるソフトウェア技術者

 昔、そんな言葉で酷評されてしまったソフトウェア開発分野ですが、はて、本当に「誰でもなれる」のでしょうか。 パイプ椅子を作るのなら良いかも知れませんが、そんなものを拵えたところで既存の大手企業(軍隊的組織、伽藍)との価格競争になることは目に見えていて、勝ち目もないでしょう。 そうではなく、アーロンチェアのように、本当に使う人間のことを知り尽くしてよく考え抜いた上で作り上げるのです。さすれば他の企業の追随も押さえられるというもの。 そのために駆使するのがソフトウェア工学であり、今日取り上げるエクストリーム・プログラミングであり。
 是非そうした技術を身につけて社会に出たいものです。

骨をくわえた犬とソフトウェア技術者

 イソップ物語より

骨をくわえた犬が、水に映った自分の姿を見て、骨をくわえた犬が、もう一匹いると思い込み、その骨を奪い取ろうとして、吠えたとたんに、自分がくわえていた骨を、水の中に落としてしまった。

 言い換えれば「二兎を追う者は一兎をも得ず」ですよね。 Smalltalkが良い、いやC++もなかなか、でもJavaがメジャーみたい...。どれも中途半端で先の犬と同じ。どうして言語を選ぶのですか、と。 時には、自分の好きな言語の違いで派閥が生じ、論争を生むことがあります。傍らから見れば、いずれもプログラミング言語であり、大した差などないのですが...。

 確かに現場で実際に用いるときは、各々の言語の細事まで吟味して選ぶことが必要になると思います。しかし、その視点を普段の物の見方にまで持ってきて「あーだこーだ」言っていることに意味がありますか。 もっと大局的な位置(「結局どれもプログラミング言語だしね」と大胆に捉える視点)から見なければ、犬のようなソフトウェア技術者に成り下がってしまうやもしれません。

エンジニアリングの成熟度[1]

第一段階:技術主導
第二段階:生産性主導
第三段階:感性主導

 設計行為のレベル(成熟度)についての話です。例として、デジタルカメラを用います。市場にデジタルカメラが出回り始めた頃の画素数は高々数十万画素。 そこから各社が技術の刷新を繰り返して、どんどんと画素数が向上したのでした。これを第一段階「技術主導」とします。
 次にデジカメの電池持続時間を延ばすため、また各社は必死になります。このあたりは必須技術の有無ではなく補助機能の良し悪し(「あれば便利」というもの)で、 ユーザの動向が変化します。これを第二段階「生産性主導」とします。
 さらに時代は進み、各社ともに技術が出尽くした、となると、最後はデザイン勝負となります。人の感性に訴え出る設計に遷ってゆくのです。 これが設計に関する成熟度の第三段階「感性主導」です。

 例えば私なら「一眼レフのEOS 60Dを持っている」という、いわばステータスのようなものがあって、そのステータス自体が自らの欲求を満たしてくれるのです。 「このデザインが何となくいいんだよなぁ...」という感性的な評価がなされるまでになると、その分野の「設計」という行為は成熟していると言えるのです。
 対するソフトウェアの設計についてはどうでしょう。さほど成熟しているでしょうか。

 開発の現場はデザイン環境ではなく、未だにプログラミング環境でしかないのではないか、という話です。 デザインを云々して正しいソフトウェアを生み出す余裕などなく、短い納期で動くソフトウェアを生み出して排出してはいませんか。 そもそも、ぎりぎりの期限を強いられるというのは、つまりソフトウェアの設計行為自体を軽んじていることに他なりません。実体の掴みづらい「ソフトウェア」ゆえに、 設計・デザインをなきものと考えてしまう、というのも理解できなくはありませんが...。 高度情報化社会と言われながらも未だにレベルが低い...このままで良いのでしょうか。

(余談です。上記のような問題があるからこそ、今、自分が取り組んでいる研究は面白いと思うのです。見えない・触れられないソフトウェアをスパゲッティに写像して実在感を持たせる... 本当に上手くゆけば、ソフトウェアの設計行為の成熟度を向上することに貢献できるかもしれないのですから。)

何をめざしているのか?

めざすもの:工匠(こうしょう、たくみ)

 先人たちが残してくれた知財を集め、抱卵し、それらの関係構造を見抜いて、評価・実行に移す。 (収集(collect) → 抱卵(incubate) → 洞察(insight) → 評価(evaluate) → 収集 → 抱... の好転周期)

 誰でも、どこでも、軽薄短小。そんな日曜大工道具(素人の道具)も、もちろん使うことはあります。しかし、それに留まらず、 専門大工道具(玄人・職人の道具)を持ち、使いこなせなければなりません。この人だけに、あそこだけに...そんな玄人道具を持つ人に仕事はやってくる、と。
 一端の技術者として、自分にしか取り扱うことのできない職人道具を持ちたいものです。ちなみに師曰く、そのような玄人道具は、技術者が自ら創りだすのだとか。 宮大工職人の槍鉋(やりがんな)が良い例となります。

eXtreme Programming (XP)

 文献の紹介で、共にケント・ベック氏のもの。ピアソン・エデュケーションより出版。ちなみに氏はSmalltalk界やデザインパターン界で著名。

  • XP エクストリーム・プログラミング入門 ─ ソフトウェア開発の究極の手法
  • XP エクストリーム・プログラミング実行計画

[1] Winograd, T., From Programming Environments to Environments for Designing, Communications of the ACM, Vol.38, No.6, pp.65-74, 1995.

12個の実践項目

 エクストリーム・プログラミングという手法を実践する上で必要と考えられる12個の項目について、それぞれをまとめておきます。 (内容の重みに差があろうかと思います。ご容赦ください。)

計画ゲーム

「計画」というと、あれをやって、次にこれをやって、その次に...と立てるでしょうか。その際に見落としがちなのが「失敗の計画を立てること」です。 「成功の計画」を立てることは至極当然ですが、それよりも大切なのが「失敗の計画」なのです。

デザイン(設計)はフォルム(形)の実現にあるのではなく、ミスフィット(ぴったりしないもの)の排除にある。 ── Alexander[2]

わざわざ時間を割いて失敗の計画を立てるなど無駄ではないか、と一時の私は思ったものですが、とんでもありません。事前に落とし穴を見つけることが、どれほど有用なことかは自明です。

短期リリース

 p.15のスライド「ソフトウェアをドライブする」より

車の運転は、常に小さな変更をし続けることなのよ。こっちに少し向いてしまったら、あっちに少し修正する。運転している間中、こっちへあっちへとね。

 車を運転するという行為自体は非常に高度なことで、その場の状況へ柔軟に対処し続けることで初めて成り立つのです。 それとは相反するように「設計はこれで決まり」「実装終わった」「納品できた」と言って、一発決め打ち型で成し遂げられるほど、ソフトウェア開発は安易なものなのでしょうか。

 もちろん、それが「一筋縄に行かぬ大変困難な行為」であることは、技術者にとってみれば明らかなことで、まさに車の運転と同じであるということも理解できるはずです。 にもかからわず、実際のプロジェクトではどうでしょう。俗に言うウォーターフォールモデルでは、各工程を決め打ちで進めるのではないでしょうか。 ゴールが見えたからと言って、その場所から目を閉じて歩くのですか、恐ろしい。目を開けてみたらゴールはいずこ...なんてことが多いはずです。

 最初から完全な計画を打ち立てねばならないのは、いうなれば顧客や自社上層部に安心してもらうこと(つまり信頼を獲得すること)が目的でしょう。 信頼を得ることが大切なことだとは思いますが、その方法以外にも信頼は獲得できるはずです。それが「短期リリース」です。 こまめにリリース(現状の進捗報告)を行うことで、顧客側や上層部から「おぉ、ちゃんと仕事進んでるね」と信頼を獲得できるのです。 仕事をさぼったりはしていない、と証明して信頼を得る良い手段として活用したいものです。(後の「オンサイトのユーザ」と合わせると効果的でしょう。)

 蛇足ですが、この類似例として「機能安全」や「本質安全」という言葉にも繋がりましょう。 日本では信号機が一つしかないような場面で、例えばアメリカならいくつもの信号機が同じ色を示して同じように動いているのです。 日本は「壊れない信号機」を用いることで安全を確保しています。アメリカは壊れるかもしれない信号機を「いくつも冗長に用いること」で安全を確保しています。 壊れない信号機が現実に存在するのであれば、日本のやり方は無駄が無くて良いように思いますが、果たしてそんな理想的というか夢物語のような信号機が存在するかと問えば、 おそらく渋々「無い」と答えるほか無いでしょう。
 しかし、やい「コスト」だの「リスク」だのという言葉を盾に、この冗長化を避けようとする人たちが居るようです。 そんな「リスクにうるさい人々」は、わざわざ大変危険なリスクを持つ方向へ走っているかもしれない、ということに気付いているのでしょうか。目先のリスクに踊らされてはいないでしょうか。
 上の決め打ちに見られる「完璧主義」などというものは、本当は存在する問題点(致命的リスク)を黙殺して虚偽の理想郷を描いているに過ぎず、もはや時代遅れも甚だしいと私は感じます。 複線を敷いて冗長に事を進めるためには、確かに相当のコストが必要になるでしょう。 しかしながら、単線で乗り切るという夢を見て取り返しの付かない事態に陥ることの方が、その企業にとってよほど致命的なコストに繋がるとは思いませんか。 もはや賭博ではありませんか。目先の敵キャラ(目先のリスク)に力を使い果たして、ラスボス(致命的リスク)に対抗できるはずもありません。

「理想」で会社は成り立たないと言う割に、「理想」を盾に逃避しているようにも見えるのです。 ソフトウェア開発だの車の運転だの人生だの、その題目・式次(プログラム)など永遠に定まるはずもなく。 この「現実」を受け入れずして、「現実的なソフトウェア開発」が可能になるとは到底思えません。

メタファ(隠喩)

(意味世界(提喩・包含)と現実世界(換喩・隣接)とを結びつける要所。(via パワーランチ「レトリック 2」 2012.05.30) とかく、意味付け(関連付け)の役割を果たすもの。「ヒルのような唇」など。 本稿の各項の説明では、何かしらの喩えを用いているけど、それもまたメタファ。その効用は?)

 のろまな人を「亀」と言ったり、私のことを「カメラキチガイ」と言ったり。 ある名称を用いて暗に別のものを指し示す比喩表現「隠喩(暗喩)」ですが、実はプログラミングにも深く関わることだったりするのです。 例えば、関数の手続きに名称(関数名)を与えることも、メモリ上の特定領域に名称(変数名)を与えることも、隠喩と捉えることができるのです。

 後のコーディング規約でも触れるように、人は類推力を頼りにプログラムを読み進めたり活用したりするものです。 それゆえに上手い比喩表現を用いれば、読み手が理解しやすいプログラムになります。つまり、比喩表現などのレトリックを使いこなせるようになることが、プログラミング上達の要ともなるのです。 (特に意表を突くような隠喩は印象に残って覚えやすいものです。「ヒルのような唇」など。プログラミングにも同じことが言えます。)

 補足ですが、隠喩(類似性)が、提喩(包含性、意味世界)と換喩(隣接性、現実世界)とを結びつけるものであるということも学んだのだ、ということを記録しておきます。(パワーランチ「レトリック2」にて)

シンプルな設計

 田中さんに好きな食べ物を尋ねてみました。

私は、ステーキが好きです。

 それと、山田さんにも好きな食べ物を尋ねてみました。

ちょうど先週の木曜日に田中さんと食べに行ったレストランで注文した、インド米使用の特製カレーライスは私の実家のものと味が似ていたので好きです。

 設計とは、その開発における「一番大切なこと」を明らかにするものであり、その設計を見た人に「一番大切なこと」が伝わらなければ意味がありません。 何が言いたいのかを把握するためには、シンプルな方が良いということが上の例で明らかになったと思います。 ソフトウェア開発でUMLなどの図を拵えることもあろうかと思いますが、その際、あまり細かいことに拘って複雑な描き方をすると、 もはや設計としての役目から逸脱することになります。大切なことに絞って記載するよう努めねばなりません。

テスティング

 テスティングは、これから自分の作ろうとするものの仕様を明確にし、実装の手助けをしてくれる大切なものです。
まず、ある手続きを次の3つの構造に区分けしますが、その中心となるのが「本体(do)」で、その手続きの主体となる処理を行います。 その本体の前に設ける「表明(assert)」は、本体処理を行うための前提条件を満たしているかをチェックする部分です。 本体の後には「確証(ensure)」を置き、本体の処理の結果が当初予定していた内容に合致することを保証するための部分です。 テスティングは、この表明と確証の部分を作成することに相当します。つまり、どのようなものが入力され、どのようなものが出力されるのかを明らかにするのです。

 未だ小さな例でしか体感していませんが、それでもこの表明と確証とを作成しておくと、最後に本体を実装する際に気分が楽になります。 もし入力値がこんなのだったらどうしよう...などという余計な心配をすることもなく、本体として実現すべき処理の実装に集中することができるのです。 実装に対する環境整備が「表明」で、応答に対する環境整備が「確証」という具合でしょうか。 新しく取り組むことであっても、心づもり(環境整備)さえ整っておれば落ち着いて事を進めることができるものですが、プログラミングもまた然り。

リファクタリング

システムの振る舞いを変更することなく、部品の品質を向上させる。

 上の言葉に「部品の品質を向上させる」とありますが、これは「部品」として取り出せるような構造にしていることが前提となります。 部品として取り出すことも難しいようなプログラム(凝集性の低いプログラム)では、まず何を変更するにも全体への影響を考えねばなりませんし、 そのコストは無視できるものではないはずです。

「システムの振る舞いを変更することなく」という部分に変わりはありませんが、凝集性の低いプログラムであれば「部品の品質を向上させる」ことよりも、まず「凝集性を上げる」ことが先決でしょう。 もつれ合った複雑な構造を見ながら手を入れる(リファクタリングする)など、さらなる混乱を生みかねませんので。

 数学で喩えるなら「因数分解」がその一例となりましょう。共通項(共通機能)を括りだすことで全体をコンパクトにしたり、見通しを良くすることができるのです。 ただし、下手に因数分解して手足が出なくなることがあるように、ソフトウェアプログラムのリファクタリングにも慎重さが欠かせませんので、注意が必要です。

ペアプログラミング

 ペアプログラミングとは、その文字通り二人でプログラミングを執り行うことを言います。かたや先輩かたや後輩。先輩が学んできた落とし穴(失敗談)を、先輩本人からの口伝によって後輩は学ぶことができますし、 また逆に後輩に口伝することを通して先輩自身も知識を定着させたり、新たな発見があったりするものです。

 また、教科書や専門書からは伝わらないことを伝えることができます。「プログラムの発生と進化の過程」がその代表格と言えるでしょう。 料理のレシピ本には、必要な材料や完成イメージだけでなく、さらに調理の手順も記載されています。だからこそ、その料理再現できるわけですが、プログラミングではどうでしょう。 その手の専門書にはプログラムのソースコードがまるまる載っていることも少なくありませんが、それはレシピ本で言うところの完成イメージ(青写真)に過ぎません。
 プログラムを書き認めるとき、きっと自分なりの組み立て方があろうかと思いますが、果たしてその作者独自の組み立て方の手順が、プログラムをまるまる載せているような本から伝わるでしょうか。 その本を読んだからと言って、さようなソースコードを頭の中で再構築できるでしょうか。

 目で見て理解したとしても、それを行解に移さない限り、本当の意味での会得には至りません。 「プログラムを丸写しすること」ではなく、「頭の中でどのような思考過程を経ればそのプログラムに至るのかを考えること」が、本来のプログラミングの学びです。 ペアプログラミングは、その本来の学びのために有用な手法となりましょう。

共同所有

「馬の耳に念仏」とは、よく言ったもの。どれだけ有り難い説法を聞かせたところで、馬や鹿にはわかりっこないのです。そしてそれはソフトウェアプログラムにおいても全く同じこと。

 どれだけ有用なプログラムを公開(オープン)しておいたところで、それをきちんと会得して使いこなせるようなウマシカなど居ないのです。 たとえ10人に教え諭したとて、ものになる者はひとりかふたり、とあります[3]。 そんな世の中で、公開されているプログラムを勝手に理解して勝手に使いこなせるような人間が果たしてそれほど居るのかどうか。 もし、さような人間が現れたとすれば、むしろチャンスと捉え、是非ともその人とお近づきになるべきなのです。その人はきっと優秀で有能な技術者なのでしょうから。 (その「繋がり」を会社の利益として捉えられないものか、と。)ある種、優秀な人材を捜す糸口にもなるのです。

「わかる人にはわかる、わからない人にはわからない」という考え方を、何か他の例に写像したならきっとピンとくるはずですが、繰り返します、それはソフトウェアプログラムにおいても同じことです。 共用のリポジトリに入れることも然り、Webページを拵えることも然り。その人の取り組みを外部にアウトプットすることで、自身のモチベーションはもちろん、周囲に良い意味での刺激を与えることにつながります。 そして先に述べたように、その活動を理解してくれる有能な人たちと「共創」という関係を創り出すことができるのです。 自分の強みを活かしつつ(外在化しつつ)、わからぬ事は先人に訊いて自らの強みとして会得する。まさに「共創」のなす業。「Linux」も、その最たる例となりましょう。

 オープンにすることによるリスクも当然あるのでしょうが、メリットのことをもっと真剣に考えてみてはいかがでしょう。もっと先を見通しませんか。

継続した結合

 何か問題が生じたとき、その問題だけを切り離して対処を施そうとすることがあると思います。確かに、その方がスッキリしていて見通しやすく、問題解決も楽になると感じるはずです。 が、実際に生じる問題というものは、その場の環境によって再現されるものであり、その場から切り離して別環境でテストやデバッグを施しても、再現性に欠ける場合があるのです。 つまり、全く意味のないテスト・デバッグとなりかねないのです。

 そのため、可能であれば「切り離す」ということを避けたいものです。テストやデバッグの話で言えば、テストプログラムと本体プログラムは常に一緒にしておくことです。 PBEという言葉があります。Programming By Example ── 例題(テストプログラム)を基盤として実装を進めてゆくやり方ですが、まさに「継続した結合」の良い例でしょう。

 テストプログラムを付随するなど、格好が悪いように感じるかもしれませんが、テストプログラム自体は、本体プログラムの正しさを証明するものであり、切り離すなど勿体ない話なのです。 「繋がり」に付随する「意味」は、切り離した時点で失われます。その「繋がり」にある価値を無駄にしないようにしたいですね。

40時間労働

 仕事が終わらないからと言って、自身の体を無理にこき使ってはいませんか。若いうちは無理したって平気だと思っていませんか。そもそも、「平気」とか「平気ではない」などという問題ではないのですが...。

 体に休息を与えることは、もはや「権利」ではなく「義務」と言っても過言ではありません。殊に食品製造や調理の話に喩えれば明らかです。 どんどん作りたいからと言って、定期点検も消毒もろくに行わずして、品質の良い食品が製造できるでしょうか。錆びた包丁で料理を作るのですか。なんと悪質な。

 プログラミングとて同じこと。モノを作る立場であれば、道具のメンテナンスを日々欠かさないことは当然であり、 無理して頑張ったとしてもそれは決して褒められたことではありません。 自身の体とて、プログラミングに必要不可欠な道具なのです。定期メンテナンス(休息)を充分に行い、品質の良いプログラムを作らねばなりません。 (さもなくば、悪質なプログラムによって自分の首を絞めかねませんので...)

 参考として、師の言葉を引用します。週間BCN 視点:プログラマは「書く」よりも「読む」

オンサイトのユーザ

 既に短期リリースの項でも述べましたが、ソフトウェア開発は常に軌道修正を行わねばならないような高度な作業です。 もし現場にユーザが居たらば、すぐに意見を求めることができ、より精密な軌道修正が可能となるでしょう。 その意味で、オンサイトユーザ(現場のユーザ)が居ると嬉しいですね。

コーディング規約

 プログラムの書き方、殊に変数名や関数名の付け方は統一されているべきであり、複数の文化を混用するべきではありません。

Yesterdayは、high schoolのfriendとbaseballをwatched。

 まあ読みづらいったら...。単純に考えても保守性に影響を及ぼすことがわかるとおもいます。

 もう少し考えてみると、これは既存の資産を活用できるか否かにも関わってきます。統一感があれば、

  • createPassword
  • getPassword
  • setPassword

...という具合に、先頭の単語以外が一致していて、一目で何をするものかがわかるのと同時に、「Password」と検索すればパスワード関係の処理をすべて見つけることができるでしょう。 比べて、統一感が無い場合、

  • createPassword
  • pasuwado
  • setpwd

...という具合に、キャメルケースで書く人、ローマ字表記で書く人、略称を用いて書く人などが混在します。 「createPassword」を作った人が、パスワードを取得する関数を必要としたとき「get」や「Password」で検索するでしょう。 しかし該当項目が見つからないため「なんだ、まだ作ってないのか。じゃ、作ろう。」と言って、「pasuwado」と同じ機能を持つ「getPassword」を生みかねません。 明らかに無駄ですよね。

 プログラムを書くときは、それを読む人・使う人に対して気遣うべきです。類推によって他の部品を見つけ出すことができるように命名を工夫し、無駄を生むリスクを下げることが望まれます。


[2] 形の合成に関するノート, Christopher Alexander, 稲葉武司 訳, 鹿島出版会

[3] 資料のp.13。「約5年間、10人に教えたとしても、ものになる者は、ひとりかふたり。教わる人は、教える人を、なかなか追い越すことができない。」

まだまだ続くよ

 残り部分をザックリとまとめておきます。

使い心地がよい(デザイン=人工物を科学する)

使い心地に関するグラフ
  1. 「使いやすい」←→「役に立つ」
  2. 「使いやすい」+「役に立つ」
  3. 「使い心地が良い」

 とてもシンプルな時計は、扱いが単純なため「使いやすい」ですが、タイマー機能がなかったりして「役に立つ」とは言えないものです。 とても機能的な時計は、細かい設定ができるため「役に立つ」のですが、機能ごとに沢山のボタンがあったりして「使いやすい」とは言えないものです。 機能の削減と追加では、この「使いやすい」と「役に立つ」の行き来しかできず、その域を抜けて両立することができません。
 そんな状況から「使いやすくかつ役に立つものとは何か」と考えてゆき、後に「これ、何となく良いんだよね〜」という感性主導の設計へと移行する、と。 いつまでも機能の追加・削減に留まるべきではなく、新しい方向性を示す必要があるのです。

  • 人工物を科学する
    • 要素技術の研究・開発:具体的な構成技術について突き詰める。大切なことだけど、ミイラ取りがミイラになりかねない。多くの人はこっち。
    • アプリケーションの研究・開発:対象を抽象化することで構造を見抜き、別の事案にまで発展・応用する。構造主義的。

作業環境

(「継続した結合」にも繋がる)

一番最初は作業机を引っ付け合わせ、共同の作業空間を作り出す。やがて汎用機が導入され、さらに個人の机にパーソナルコンピュータが導入され。 最後には個人の机ごとに仕切り壁を用意しだす。空間は個人ごとに分断され、そのうち会社に出てくる意味すらわからなくなる。

「継続した結合」でも述べましたが、繋がりが持つ意味を殺してはなりません。作業環境は共有空間であり、開発メンバー同士が繋がってこそ初めて意味があるはずなのですが、 そこに衝立(ついたて)を設けて繋がりが切断しかけているのです。少し危ない気がしませんか。(もっと工夫の余地があるはず、と。)

 バイリンガルの女性に、日本語で「将来の夢は?」と問うと、

家庭を持ち 子供を育て 温かい家庭を作りたい

...と。同じように英語で「Your visions?」と問うと、

仕事を持ち 自立して 社会に貢献したい

...と。つまり環境(文化)が変化することで、その人の意識(発想)が変化するというのです。だからこそ、職場環境(風土や設備投資)は重要なのです。

技術革新を殺す10の方法

 なぜ、新技術が現場に適用されるのに25年もの時間を要するのでしょう。そこには、組織内における意識のギャップがあるものと考えられるのです。
まず開発者の特徴を。

  • もっとよい道具を
  • 自由に責任が伴うことを自覚していない
  • 前線で苦闘している孤独な開発者

対する管理者の特徴を。

  • もっとよい教育を
  • 開発者の自律心を信じず統制を厳しくする
  • 事実に触れることを怠る管理者

 このギャップがデスマーチを生むとも。

技術革新を殺す10の方法

  1. 下からのアイデアはすべてくだらないものと疑ってかかる。
  2. 何か承認を求めたら何段階も筋を通させる。
  3. ほめることを一切せじ、ともかくけなしてしまう。
  4. お互いに批判ばかりさせる。
  5. 問題点を指摘したら、それを失敗の証だと騒ぎ立てる。
  6. ものすごい締めつけ管理をする。
  7. 変革は一切極秘裏に進める。
  8. 不人気な決定は部下に押しつける。
  9. 情報を求めてくる人間に、その理由を事細かに申告させる。
  10. 上は何でも知っている人だということを周知徹底させておく。

 こんな企業には勤めたくないですし、関わりたくもないですね...。

共創性 ─ 外在化とコミュニケーションの効用

共創性(Collective Creativity):自己/他者が表出した情報/表現/作業結果をシステムを介して利用することによる、知的創造活動。

 人は、過去の自分が考えていたことを、外在化によって整理します。そして、その整理されたものを踏まえて更に思考を巡らせ、新しい着想へと繋げます。 つまり「外在化する直前の自分」と「外在化した直後の自分」との二者間で、知的創造物を発展させるのです。 もちろん自分一人だけではなく、別の人を介することも大変に有用で、むしろ自分にはない視点を使って発展させるわけですから、一人で取り組むよりも飛躍的な発展が期待できます。 そしてそれは、人の数だけ大きな発展を期待できるでしょう。まさに共創。結合(融合)によって生じる価値はここにあります。 プログラマも、デザイナも、研究者も、エンドユーザも。様々な立場が融合することで生じる新しい知見を、ソフトウェア開発へ存分に活かしたいものです。

最後に

 ソフトウェア開発に従事するということ、それ即ち、人工物を科学するということ。 何度でも作り直しの効く「ソフトウェア」なのです、決め打ちに走ったりせず柔軟に対応すべきです。 農家の方々のように、一生涯のうちに数十回程度しか試行錯誤できないという厳しい環境で日々を送ることもあるのです。 比べてみれば、ソフトウェア開発者が非常に贅沢な環境にいるのだということも理解できるはず。 「現実はそう簡単じゃない」という言い訳をする前に、自分に何ができたか、これから何ができるかを真剣に考えてみるべきではありませんか。

 もし勤め先で泥臭さを思い知ったとしても、またここに還って初心に戻り、理想について思考できることを切に願ってやみません。