アジャイル開発技術者に必要なスキルと育成【後編】:技術とその他スキル

前回に引き続き、スキルについて見ていきます。前回は、技術スキルのデザインパターンまでを紹介しました。今回は、テスト駆動開発、リファクタリング、チームワーク、ファシリテーションを掘り下げていきます。

【前編】:技術スキルについて

特約執筆者:長瀬 嘉秀

1.技術スキル

アジャイル開発のスキルを振り返ります。前回ご紹介した一覧を再度見てみます。
・アジャイルの仕組み
・オブジェクト指向
・設計(UMLなど)
・デザインパターン
・テスト駆動開発(TDD)
・リファクタリング
この中で、最後の2つの紹介ができていなかったので、テスト駆動開発から見ていきます。

1.1 テスト駆動開発

テスト駆動開発とは、アジャイル開発における基本となるプログラミング手法です。従来のソフトウェア開発とは、大きく異なり、テストから先に作成して、その後で処理ロジックを作っていきます。ただし、世界的には、ほとんどのソフトウェアがこの手法で開発されています。
テスト駆動開発は、XPのプラクティスのひとつで、アジャイル開発の基本要素です。他のアジャイルプロセスを選択しても、ほとんどのプロジェクトで採用しています。テストから考える手法が、なぜ、必要なのかを考えていきます。
従来のプログラミング手法は、メインプログラなどの処理ロジックをコーディングして、それが出来上がると、プログラムを実行してテストしていきます。以前のプログラミングの入門書などには、このような説明がされていました。テスト駆動開発は、このやり方とは、根本的に違います。メインロジックではなく、まずは、テストから作成していくからです。
テストを考えるということは、インターフェースを決めないとテストコードは書けません。インターフェースを決める行為は、インターフェース設計になります。テストコードを書くということは、単にテストを作っているのではなく、インターフェースを設計しているのです。そして、インターフェース設計ができあがると、このインターフェースの内部を作成していきます。これが、テストの先の処理ロジックにあたります。

【図1 プログラミングの違い】

インターフェース設計の重要性は、現在のアプリケーションは、殆どの場合が、ネットワークなどの外部から呼びされます。従来のように、単体アプリケーションとして、メインプログラムをコマンドラインと単体で動作させることは、ほとんどありません。このように、アプリケーションの環境も従来とは大きく変わったことも、テスト駆動開発にアプリケーションの作り方が変わってきた要因でもあります。
テスト駆動開発を行うと、アプリケーションが完成すると、同時にテストコードを出来上がります。一般的に、アプリケーションと同じ量のテストコードになります。もちろん、テストコードとアプリケーションのコードを作成していくので、従来のようにアプリケーションのコードだけを作成したほうが、コーディング作業としては、早く終わります。ただし、この後に、テストをしていくので、それを考慮すると、テストコードが同時にできたほうが有効です。
このテストコードは、毎日実行されます。アジャイル開発では、テスト工程は、日々の作業の中に組み込まれているので、毎日がテストであり、ソフトウェアの品質が確認されます。もし、コードにバグを購入してしまったら、即座に判明する仕組みになっています。この仕組みにより、迅速な開発と品質担保を行います。
次に、ソフトウェアの開発だけではなく、構築について考えます。ソフトウェアを動作させるためには、ソフトウェアをコードからビルドして、実行可能な環境に配置を行います。従来では、手作業で配置を行っていました。アジャイル開発では、リリースまでの時間が短いため、ビルド、配置は自動化する必要があります。Jenkinsなどのツールを使って、クリック一発で、配置までを行います。これをCI(継続的インテグレーション)と呼びます。このCIにおいて、ビルドの後に、テスト駆動開発で作成したテストコードを実行します。テストコードがあれば、何度も、CIを行うたびに、テストを実行するのです。さらに、結合テストも自動化しておくと、ユニットテスト、結合テストの両方を実行できます。
アジャイル開発では、ユニットテスト、結合テストを毎日実行することで、常にバグのない状態に保つことができます。
アジャイル開発にとって、品質面と設計面の両方において、テスト駆動開発は必須の技術です。
参考書は、以下になります。
テスト駆動開発入門
アジャイルソフトウェア開発技術シリーズ・応用編 テスト駆動開発

1.2 リファクタリング

リファクタリングは、アジャイル開発のみならず、ウォーターフォール開発においても、ソフトウェアのコード品質を上げていく上では欠かせない技術です。リファクタリングの意味は、一言でいうと、再設計です。なんのために、再設計するのかというと、ソフトウェアの構造やコードをきれいにして、機能追加等の変更に耐えられるようにしておくためです。リファクタリングを怠ると、スパゲッティのようなプログラムになっていき、最終的には修正など手を入れることができなくなります。これは、機能追加をできない状態を意味しています。このような状況に陥ると、アジャイル開発のイテレーションがうまくまわらなくなり、プロジェクトの失敗に繋がります。まさに、アジャイル開発には、必須の技術と言えます。
リファクタリングの重要性はご理解いただけたかと思いますが、なぜ、実施が難しいかというと、技術的な難易度が高いためです。リファクタリングを行うためには、テストコードが存在していないと、修正したコードをテストできません。テストコードを作るためには、テスト駆動開発が必要です。さらに、再設計をすることは、設計技術に精通している必要があります。そのためには、オブジェクト指向の設計技術であるデザインパターンを習得が必須です。このため、リファクタリングは、高度な技術レベルを要求します。
それでは、ここで、リファクタリングの定義を確認してみます。

「リファクタリングとは、外部から見たときの振る舞いを保ちつつ、理解や修正が簡単になるように、ソフトウェアの内部構造を変換させることである」(参考文献『リファクタリング』より)

リファクタリングは、外から見た振舞い変えずに、内部構造を変更することです。機能追加等の外部からの振舞いを変更することを行ってはいけないということです。リファクタリングを図で表すと次のようになります。

【図2 リファクタリングのイメージ】

共通コードを抽出するようなことだけが、リファクタリングではありません。リファクタリングの技法には、次のようなものがあります。
・コードの臭い
 リファクタリング対象箇所を発見するためのきっかけ
・リファクタリングカタログ
 リファクタリングの手順
・ツール
 リファクタリングの際の使用するツール

参考書は、以下になります。
リファクタリング
アジャイルソフトウェア開発技術シリーズ・応用編 リファクタリング

2.チームワーク

アジャイル開発は、チームで行う開発です。PMがチームの要員に指示していくものではないのです。裏を返すと、チームのすべてのメンバーが自主的に行動する必要があります。ウォーターフォール開発のように、設計者が設計書を書いて、プログラマーはそれに沿ってコーディングするだけ、というようなことはありえません。アジャイルのエンジニアは、設計とプログラミングを同時に進めていきます。
アジャイルでは、マインドチェンジが必要だと言われています。それは、上からの指示で仕事をするのではなく、自主的な判断で仕事をするからです。例えば、アジャイル開発では、タスクという行うべき作業が張り出されます。それをメンバーが自主的に手を上げて、担当していきます。自分で判断して、行動するのです。
このような行動は、チームリーダー研修などのトレーニングで代用することはできます。アジャイル開発のチームメンバーはすべてを行えば、開発が始まる前に、自主的に行動できる習慣を身につけることができます。
さらに、作業の見積もりについて、アジャイル開発ではチーム全員で決めていきます。当然、見積もりの数字が全員同じということはありません。違った見積もりをカードとして出して多数決をとったり、話し合いですり合わせたりします。PMが見積もりを決めて、要員を割り当てるようなことはありません。

3.ファシリテーション

レトロスペクティブと呼ぶ、反省会を実施します。レトロスペクティブは、定期的に行います。チーム全員で、意見を出して、課題を解決していきます。トヨタでいうところの改善です。レトロスペクティブは、ファシリテーターという議長役を決めて、話し合いを行います。ファシリテーターは、全員の意見を吸い上げて、実りある会議にします。また、ファシリテーターは、チームのメンバーが毎回持ち回りで担当します。常に同じ人が仕切るということを避けるためです。
ファシリテーションも、リーダー研修のようなメンタルなトレーニングが多くあり、それらで代用できます。うまく会議をさばけるようになれるように、進行することが重要です。
単に詳細設計書を見て、コーディングしていたエンジニアは、アジャイル開発では必要なく、チームの一員として行動できるようになることが求められます。そのためには、研修などによって、トレーニングしてから開発チームに参加する必要があります。

4.まとめ

連載「エンタープライズアジャイルにおける品質担保」(4回)を含め、全6回で、アジャイル開発におけるアーキテクチャー、品質からスキルと育成まで、説明してきました。アジャイル開発のプロジェクト管理は、スクラムなどの書籍が多く出版されているので、それらを参考にしていけば、行えると思います。また、ソフトウェアエンジニアとしての基本的なプログラミングに関しても、フレームワークなどの書籍があります。問題なのは、エンタープライズシステムの開発で、今まで行っていたテストや品質、さらにはSEとして、引き継がれてきたスキルをどのように、アジャイル開発に対応付けるかです。ゲームやネットサービスのような新しいソフトウェア開発は、過去の資産を引き継ぐ必要はありません。エンタープライズシステムは、企業システムなので、過去の資産、経験を無視できません。多くのシステム開発がアジャイル開発に移行していく名から、これらの課題を解決していける会社がITによる企業競争力をつけていけるでしょう。

▼関連記事はこちら▼
【前編】: 技術スキルについて
【シリーズ連載】: エンタープライズアジャイルにおける品質担保

おすすめ記事