ソフトウェアクラフトマンシップ運動とは,プログラミングスキルを体得してソフトウェアクラフトマンとなるための方法と,その実践について語るものだ。そこでは,技術的なプラクティスが重視されている。それらを学んでよりよいプログラマになるには,長い期間が必要なのだ。
ソフトウェアクラフトマンシップ宣言(Manifesto for Software Craftsmanship)は言う:
意欲溢れるソフトウェアクラフトマンとして,我々は,技能の習得を支援し,自らも実践することにより,プロフェッショナルとしてのソフトウェア開発が到達すべき水準を高める。この活動を通じて我々は,次のことを尊重する。
単に動作するソフトウェアではなく,巧緻なソフトウェアであること
変化に対応するだけではなく,確実に付加価値を得ること
個人と個人の交流だけではなく,プロフェッショナルのコミュニティであること
ユーザとの協力関係だけはでなく,生産的パートナーシップであること
すなわち,左の項目を追求することにより,右の項目が不可欠であることを明らかにする。
"The Codesmith"と題したブログ記事で,Chris ODell氏はクラフトマンを次のように定義する。
私の考えるクラフトマンとは,選んだ素材を使って単に無から有を作り出すだけではなく,その中に彼ら自身の一部を作り込むような人々のことです。優れたクラフトマンは,所持することの価値と同時に,機能的な価値を備えたものを創り上げるために,時間と労力を惜しみません。優れたクラフトマンシップとは,高品質な製品と同義なのです。
金属工 (metalsmith)と鍛冶工(blacksmith)に準えて,氏はコード工(codesmith)ということばを造語した。氏にとってこれは,"一定レベルのクラフトマンシップを意味し,見習いから名人への進歩を意味する"ものだ。同じブログのフォローアップ記事 "Anyone Can Be a Codesmith" では,コード工が自身の技術を磨いてコード名人(codesmith master)になる方法について説明している。
コード工への壁は低いものでなければなりません。ですから,どのような形式でもコードを書けば,誰もが気軽にコード工を名乗れて然るべきだ,と私は思っています。クラフトマンシップとしての理想は,適度な実用主義を伴ってこれに続くべきですが,スキルを学んで優れたコーダになるには,時間と経験が必要なのです。
今年InfoQが公開した"アジャイルにおける技術的プラクティスの重要性"という記事では,クラフトマンシップ運動に関与する何人かが,技術的プラクティスの重要性について説いている。
Matt Badgley: "私たちはアジャイルエンジニアリングの優れたプラクティスを継続し,クラフトマンシップの考え方を持ち続けなくてはなりません。それなくしてアジャイルはあり得ません。"
Robert Martin: "[XPの13のプラクティスを]利用していないのならば,よいと思うものを取り入れてみるべきだと思います。それらのプラクティスが文化を定義し,自らの価値観を表現してくれることでしょう。"
Ruud Wijnands: "私がこれまで見てきた,アジャイル導入に成功した企業はすべて,技術的なプラクティスを評価ないし実践している企業です。あまり成功していない企業では,そうではありません。"
プログラマが自身の技術を磨いてソフトウェアクラフトマンになるには,どうすればよいのだろう?John Sonmez氏は自身のブログ記事 ブログ記事 "Why I Don't Code Katas" の中で,同じ業務の反復実行では,プログラマのスキルを向上させることはできない,と述べている。何かを学ぶには,バーを継続的に上げ続けなければならないのだ。
同じプログラム問題を解決するために何度もコードを書くことは,制約や工夫を加えて新たな課題を持ち込まない限り,まったく同じことを繰り返しているに過ぎません。自分にメリットがあるのは最初だけで,2回目は多分,それを実行しているだけなのです,
(…) 何かを上達したいのであれば,ひとりでプラクティスを繰り返すだけでは十分ではありません。難易度や課題を増やして練習することが必要です。
スキルを開発するためのよい方法は実行することだ,と氏は言う。プログラマがソフトウェアクラフトマンになるには,プログラムすることが必要だ。
プログラムを学ぶための最良の方法や,スキルを向上させる方法について質問するEメールをたくさん頂きます。先日も,Android開発を学ぶ方法についてのEメールをたくさん頂きました。このように探求心溢れる問い合わせに対して,私がどう答えたと思いますか?
Androidアプリを作りましょう。
でも,うーん,どんな本を読めばいいのですか?
本はいりません。アイデアを出して,それを作ってみるのです。その過程で,何が必要なのかを把握してください。行き詰まったら,答を探すか,誰かに聞きましょう。
Steve Ropa氏は"Building Software Craftsmen"という記事を書いている。大学にはソフトウェア開発の理論の講義がある。クラフトマンプログラマになるには,"現実世界での経験と,知識を実用化するアプリケーションが必要"だ,と氏は言う。これを実現するのが徒弟制度だ。
私の提案は,時計を数百年前に戻して,あなたのチームルームを作業場にすることです。その作業場にクラフトマンを住まわせてみましょう。最初に必要なクラフトマンが,すべては揃えられないかも知れません。育て上げることが必要になります。徒弟制度プログラムを適用し,将来的なキャリア開発にクラフトマンのモデルを利用することで,これが達成できるのです。
氏は自身のブログで,ソフトウェア開発の見習いからクラフトマンになるための,5つの主要分野を紹介している。
- コードを創る - クリアで十分に練り上げられたコードを,ひとつ以上のプログラム言語で作る能力。(…)
- 原則を適用する - (...) SOLIDのような原則を理解し,その使い方を知る必要がある。
- 技術とツール - プログラマはリファクタなどの作業を,手作業で行えなければならないと同時に,ツールの使い方や,タスクに対して適切なツールの選択を知っておく必要がある。
- 仕事の習慣 - (...) TDDや継続的インテグレーションなどのように,優れたプログラマが素晴らしい仕事をするための習慣を,体で覚えておく必要がある。
- ソフトスキル - (...) チームで作業する方法,他者とのコミュニケーションの方法など,一般的な学習環境では忘れられがちなソフトスキルを学ぶことになる。