DRY原則
DRY原則とは
- Don't Repeat Yourselfの略で、「繰り返しを避けること」という意味
- 劇的な生産性向上のテクニカルなコツは、「自動化」にありそう。
- DRY原則を守ると恩恵を受けられる領域が6つほどある。
コード
コードとコメント
コードとドキュメント(設計書)
自動生成
作業(タスク)の自動化
アプリケーション・ライフサイクル全般
コード
- 基本的には重複コードはなるべく無くそうというスタンスは必要
- 共通化故にメタメタなプログラミングをしちゃうとかえってわかりにくくなることも時々ある。
- 個々人の心がけも重要なのですが、アプリケーションの規模が拡大し、開発人員が増加するにつれて、DRY原則を破られる可能性は高くなる
- 重要なのはメソッドやクラスが「探しやすい事」。そして「探す癖をつける」こと
探しやすさ
- DRY原則を破らない最善の方法は、「アプリケーションに出てくる全てのNaming(名前付け)に気を使う」だったりする
書いたコードは必ず他の人に見てもらう
IDEの機能を利用して、これも周知・共有する
- クラスやメソッド、ファイルを当該ソリューションの中から探すショートカット(Visual Studioであれば、Ctrl + 「,」)
「探す癖をつける」
- ”ソースコードはコミュニケーションの結晶”
コードとコメント
- コメントには、コードで表現しきれないこと(意図や理由)を書くと良い
コードとドキュメント(いわゆる設計書)
- 大規模・中規模開発においては、アーキテクチャ方針に関しては、ドキュメントとして残すべき。
- ドキュメントとしてのソースコード。コードはすなわちドキュメントである。
- 確かに、読みやすいコード・一貫性のとれたコードは、どのようなドキュメントにも勝るのかも知れない。
自動生成(コード・ジェネレータ)
- コード・ジェネレーターには、2種類(消極的なコード・ジェネレーターと積極的なコード・ジェネレーター)ある。
消極的なコード・ジェネレーター
- 目的はタイピング量の削減
新規ソース・ファイルの生成
テンプレート
ソースコード管理指示
コピーライト文
プロジェクトにおける各新規ファイルの標準コメントブロック
積極的なコード・ジェネレーター
- 単に利便性を追求したものですが、DRY原則を実践する際に必要となるもの
作業(タスク)の自動化
- 自動化できる対象はたくさんあるかと思いますが、例えば以下の様なタスクです。
開発マシンの自動起動(朝決まった時間に起動させておくと、仕事始めがスムーズ)(マシンスペックにも依存(SSDなら不要かも))
プロジェクトのコンパイル
開発環境の構築
上述のとおり、コードの生成。主に積極的なコード・ジェネレーターの場合です。軽量な開発プロセスのルーチンに組み込むと良い。
回帰テスト JUnit/NUnitなどの自動UTはもはや当たり前のようになりました。GoogleではUIテストも自動化している。(テストから見えてくるグーグルのソフトウェア開発(クオリティボットの実験より))
ビルドの自動化(コードチェックアウトからビルド、成果物配置まで)中央サーバでのビルドならJenkins、個人の開発マシンなら簡単なバッチを作れば自動化できます。
アプリケーション・ライフサイクル全般
- 簡単に言えば、V字モデルを数週間レベルにまで短縮させ、さらにそれを繰り返し行うことでアプリケーションの精度を高めるという手法がアジャイル
- 大切なのは、後工程でも利用可能なメタ・データやデータを作成するというところ
コンカレント・エンジニアリング:開発工程を全並列化し、開発期間の短縮するためのプロセス
テクノロジ(Technology)
現在利用可能なテクノロジをどの程度活用しているか?
市場におけるテクノロジー・リーダーであるか?
製品のインターフェースは業界標準に準拠しているか?
今後使用し開発していくテクノロジの方向を示すための製品に対する長期的な見通しを持っているか?
製品を業界のリーダーとするテクノロジを開発中か?
ツール(Tool)
最も使いやすいツールとは?
要求される自動化、互換性、統合のレベルは?
新しいツールによるインパクトをどう管理しているか?
ツールのインターフェース標準化のために、他の業界リーダーや団体に積極的に働きかけているか?
ツールが要求するデータは何で、そのデータの管理のしかたはどうか?
タスク(Task)
タスクが特に複雑化している時のタスクの定義、分割、効果的な管理の仕方は?
タスクを実行するプロセスは、品質、生産性のレベルを達成するために継続的に改善されているか?
タスクの自動化は有効か?
人材(Talent)
有能な人材を効果的に用いているか?
長期間にわたり有能な人材を確保できているか?
継続的にトレーニング、社内教育を行い、やりがいのある仕事を与えているか?
経営者は従業員を満足させているか?彼らに権限を委譲しているか?
経営者は企業のビジョンをよく理解し、従業員に伝えているか?
時間(Time)
いかに市場投入時間を短縮するか?
いかにすばやく製品の改良に着手するか?
製品開発サイクル・タイムの改善度の評価法は?
- 効率化の追求の手段として、「自動化」がある
Discussion