トラブルシューティングの極意―達人に訊く問題解決のヒント

第10回 [ソフトウェア開発編]悪循環からの脱出―ソフトウェア開発の時短術+見極め技

この記事を読むのに必要な時間:およそ 3 分

期日までに約束した内容を実現することは,仕事の基本です。しかし,予定どおりにすんなりと進まないのがソフトウェア開発の難しいところです。ソフトウェア開発を予定どおりに進めるためには,見積りや進捗管理の技法を工夫することも大切です。しかし,実際にソフトウェアを作っているのは,管理者ではなく,現場の開発者です。開発者自身が,日々の開発活動の中で発生する,ちょっとしたトラブルをうまく切り抜けることができるか,泥沼にはまり込むかが,開発全体の進捗を大きく左右します。トラブルはつきものです。そのトラブルに正しく対処して,泥沼に入り込まない技を身につけることが一人前の開発者になるということです。

ソフトウェア開発は時間との戦い

仕事を遅らせるやっかいなコード

ソフトウェアにバグはつきものです。今までずっと動いていたプログラムが,なぜかエラーを起こすようになった。完成したと思っていたプログラムが,不具合を指摘されて修正しなければならなくなった。こういう想定外の事態が,開発をジワジワと遅らせます。

多くの不具合は,該当個所のコードを見直せば,簡単に直せる類のものです。ちょっとした勘違いや見落としに起因するバグは,発見さえできれば,調査も修正も容易です。

やっかいなのは,なぜ正しく動作しないのかコードを読んでもパッと見にはわからないバグです。あるいは,簡単に修正できると思っても,実際に修正してみると思わぬ副作用に悩まされるバグがあります。スケジュール遅れの危険な兆候です。

こういうやっかいな不具合を引き起こすプログラムには,次の特徴があります。

  • メソッドが長い
  • if文やfor文が入り組んでいる
  • 変数への代入を繰り返している

こういうわかりにくいコードのまま,バグと格闘するのは無謀な戦いです。数時間がんばっても,状況を悪化させるばかりです。数時間のロスを何回か繰り返せば,予定したスケジュールはいとも簡単に崩壊します。スケジュールがタイトになればなるほど,つまらないバグが増えて,簡単に直せる修正でもミスを繰り返し,仕事が加速度的に増えていきます。悪循環です。

泥沼に入り込む前にすること

長く複雑なコードを相手に格闘するのは,泥沼に入り込む道です。避けなければいけません。

読んでも意味がわからないコード,どこで何が起きているかわかりにくいコードは,修正に取りかかる前に,まず,コードを整理します。

とっちらかった部屋の中をあっちこっちひっかきまわして探し回るよりは,部屋を整理してから探したほうが,探し物は簡単に見つかります。経験的には,入り組んだコードは,コードを整理するだけで,問題が解決することが多いものです。コード整理の途中で,それも早い段階で解決策が見つかることがほとんどです。

次の4つのコード整理のテクニックは効果絶大です。

  • 段落に分ける(空白行を追加する)
  • 説明用の変数を導入する
  • 説明用のメソッドを導入する
  • ガード節で条件分岐を単純化する

もっとも簡単なコード整理は,コードの意味的な切れ目に改行を1つ追加して,コードのかたまりを「段落」に分けることです。

頭の中で,追いかけているロジックの切れ目を「段落」として目に見えるようにするだけで,コードの構造がわかりやすくなります。

変数を使いまわして代入を繰り返していたら,用途ごとに別の変数を宣言します。それぞれの変数に「目的(意味)⁠を表す変数名をつけます。冗長なようですが,こうやって用途ごとに別の変数を作って,意味のある名前をつけることで,ロジックがわかりやすくなります。また,用途ごとに別の変数を使うほうが,思わぬ副作用が減って,コードが安定します。

段落に分け,説明用の変数を導入すると,コードのまとまりを別のメソッド(下請けメソッド)に切りだしやすくなります。メソッドは「目的(意味)⁠を説明する名前をつけます。こうやって「説明用のメソッド」を導入すると,もとのロジックの詳細が隠ぺいされ,大きな処理の流れがはっきりしてきます。また,⁠説明用メソッド」は,再利用できる場合があります。重複していたコードをひとつのメソッドに一元化できれば,同じ修正をあちこちでやる必要がなくなりコードの変更が楽で安全になります。

複雑なif文を分解整理する技

複雑なif文は,やっかいなバグの温床です。if文を整理するコツは,まずは,説明用メソッドの導入です。条件の判断式,条件ごとの処理内容を,メソッド単位にまとめて,詳細を隠ぺいします。

処理の詳細をメソッドで隠ぺいすると複雑なif文の分岐の構造がはっきりしてきます。

if文の多くは,例外条件の判定と例外的な処理です。多くの場合,例外ケースは,早い段階で判定し,その場でリターンできます。例外条件を最初に判定し,早期にリターンするこの方法を「ガード節」と呼びます。複雑なif文を整理するときに絶大な効果を発揮しますリスト1)⁠

リスト1 if-elseを早期リターンで書き換える

//if-elseを使った分岐処理

if(正常条件) {
  正常時の処理();
} else {
  例外時の処理()
}

//早期リターンを使った,if文の単純化

if(例外条件) {
  例外時の処理();
  return ;
}

正常処理();

基本はコード整理

やっかいなバグと戦う前に,4つのコード整理のテクニックを使って,わかりにくいコードを整理してみましょう。

急がばまわれです。段落に分け,説明用の変数や説明用のメソッドを導入し,if文を単純化するだけで,多くの問題がすんなりと解決します。

複雑なコードのままで格闘するのは,状況をますます悪化させます。⁠時間」という貴重な資源を浪費します。わかりにくいコードと格闘する「時間」の浪費が,ソフトウェア開発のスケジュールを致命的に遅らせます。限られた時間で問題を解決するために,まずやるべきことは,わかりにくく入り組んだコードを整理して,単純でわかりやすいコードに書き換えることです。

著者プロフィール

増田亨(ますだとおる)

ギルドワークス株式会社 取締役

業務アプリケーションのアーキテクト。ビジネスの関心事を正しく理解し,顧客に価値あるソフトウェアを届けるために,日々「ドメイン駆動設計」を実践中。専門分野:オブジェクト指向設計,エクストリームプログラミング,Java/Springフレームワーク。

Twitter ID:@masuda220

バックナンバー

トラブルシューティングの極意―達人に訊く問題解決のヒント

バックナンバー一覧

コメント

コメントの記入