概要: 「プログラミングの心理学」は、 ジェラルド M. ワインバーグ (Gerald M. Weinberg) による本である。 オリジナルは 1971年に刊行され、25周年記念版が 1998年に発行された。 日本語訳もある。 著者のワインバーグは著名なコンサルタント・教師であり、 学術的な研究でも業績をあげている。 1971年当時のプログラマはメインフレームのソフトウェア開発が主な業務で、 おもな使用言語は FORTRAN や COBOL、PL/I などであった。 ちなみに、PC はまだ存在しなかった。 このような時代に書かれたにもかかわらず、 この本が推奨するのは XP 的な手法であり、こんにち 「バランスドチーム」「心理的安全性」と呼ばれているものが なぜ重要かが実例とともに説明されている。
「この本の目的はただひとつ、それはプログラミングを 人間的な活動として研究する試みを始めることである」
人々が集まってプログラミングをすると、 必然的になんらかの組織が発生する。
会社などで定義された「公式な」組織だけではなく、
自然発生的に生まれた「非公式な」組織の場合もある。
非公式な組織の多くは、人々のニーズと「物理的に近い場所にいる」ことによって発生する。
非公式な組織の存在を無視したり、それを強制的に消そうとすると
何らかのツケが回ってくる。
多くのプログラマは他人から離れて作業することを好むが、
一方で彼らは自分の成果物に執着しがちである。
コードを「所有する」ことの害悪は、それが自分自身 (エゴ) の
延長であると考えがちなことである。
こうなると、自分のコードの間違いを「自分の欠陥」ととらえることになり、
間違いを間違いと認めにくい風潮が生まれる。
プログラマのエゴの問題を直接是正しようとしても難しい。
むしろ有効なのは、プログラマのいる文化および価値観を変えることである。
プログラマの成果が集団に帰属し、個人には帰属しない
というチームでは、コードはつねに全員で改良すべき共有物という
考え方が生まれ、バグの発見が促進される。
このようなチームは仕事に対するメンバーの満足度が高く、
あまり人が離れない。
また、たとえ誰かがいなくなったとしても、
チーム全員が同じ知識を共有しているので、あまり深刻な問題にならない。
「伝説のチーム」…チーム全員で仕事を共有し、つねに結果を出すチーム。
このようなチームは存在するが、
残念ならがまだあまり一般的ではない。
周囲からは「何か秘訣があるに違いない」と思われている。
伝統的な考え方をもつ組織をこのようなチームにつくり変えることは難しく、
このようなチームをゼロから構築するほうが簡単である。
いったんこのようにしてできあがったチームは、
全体で環境を移動することもありうる。
「プログラミング集団」が組織化されると、開発チームになる。 開発チームは、(個人では達成できない) ある共通した目的を達成するために作られる。
伝統的な (エゴレスでない) 組織では、 プログラムの構造とチームの構造は似かよってくることが多い。
def main(): x = input() y = process(x) output(y)
この場合、以下のことが起こる:
「見せかけの合意」は危険である:
プログラマは「何をするのか」だけでなく「なぜするのか」を知りたがる。
上層部から細かい部分まで指定されると士気が低下する
(自分達はただの「コーダー」)。
目標が明確でないと、メンバーは瑣末な点にこだわるようになる
(パーキンソンの凡俗法則)。
プログラマの仕事に対する満足度を左右する要素は 4つある:
このうち環境によって大きく差があるのは 4. である。
チームメンバーの役割は大きく次の 2つに分けられる:
どちらも重要な業務である。 古い組織では、「タスク指向」の業務は父親的、 「メンテナンス指向」の業務は「お母さん的」な仕事とされ、 実際に女性がついていることが多かった。
いくつものチームが集まり大きな組織を構成すると「プロジェクト」になる。
ソフトウェアプロジェクトでは、人はつねに入れ替わる。
しかし「プロジェクト」は人の任期を超えて存続する。
他に移りたがっているプログラマを金銭的またはその他の報酬で引き止めようとしても、
たいていは無駄である。
「チームに『かけがえのないプログラマ』がいたら、一刻も早くそいつを追い出せ」
小さなチームですら進捗の正確な評価は難しいのに、
大きなプロジェクトではなおさら大変になる。
大きなプロジェクトでは「測定」よりも「報告」が優先される。
各階層の管理職は極端な報告を避け、平均に寄せるために
全体として進捗報告はほとんど現実を反映しなくなる。
そして同調圧力がある (アッシュの同調実験)。
いくつかのチームが異なった専門的なタスクを与えられることはよくある。
しかし、チームの役割に「優劣」がつけられていると、各チームがスムーズに協調することは難しい。
(たとえばエンジンのバルブはシリンダーより「偉い」わけではないし、
クランクシャフトもバルブより「偉い」わけではない)
階層的な管理は、各メンバーが交換可能であるような業務でのみうまくいく。
ソフトウェア開発はそうではない。
階層的な組織の問題はほかにもある。
階層の差が大きいと、上層の管理職は現場のプログラマの仕事をほとんど理解できない。
そのため、仕事の成果そのものではなく、「成果のようなもの」を基準に評価することになる。
プロジェクトは水平に管理するのではなく、垂直に管理したほうが望ましい。
大規模プロジェクトの失敗の原因のほとんどは、管理の失敗である。
「たとえ私たちがプログラミングを今より『うまく』できるようになったとして、 それは本当に価値のあることなのだろうか?」
コンピュータは魅惑的な機械だが、だからこそ私たちはそれが どうやって本当に自分を(人類を)幸福できるのか、つねに考える必要がある。