開発の品質を䞊げた7぀の方法 - ã‚œãƒŒã‚¹ç®¡ç†ã€ã‚³ãƒŒãƒ‰ç®¡ç†ã€ãƒ†ã‚¹ãƒˆå°Žå…¥ã€é–‹ç™ºç’°å¢ƒã®4぀の芖点から

゜フトりェア開発における、開発管理の手法やツヌルには、「品質」を向䞊させるずいう目的が存圚したすが、開発者はたず、手法やツヌルの先にある「品質」ずは䜕かを理解する必芁がありたす。゜ヌス管理、コヌド品質管理、テスト導入、開発環境の4぀の芖点から、「品質管理」の珟堎で盎面した実䟋ず課題ずその解決策に぀いお小林昌匘さんが解説したす。

開発の品質を䞊げた7぀の方法 - ã‚œãƒŒã‚¹ç®¡ç†ã€ã‚³ãƒŒãƒ‰ç®¡ç†ã€ãƒ†ã‚¹ãƒˆå°Žå…¥ã€é–‹ç™ºç’°å¢ƒã®4぀の芖点から

はじめたしお、株匏䌚瀟゚ンバむンド代衚の小林です。私はこれたでいく぀かのITベンチャヌに所属し぀぀、そこで技術的な方針を決める圹割を数倚くこなしおきたした。その䞭には、新しいスタッフず共に新芏のサヌビスを立ち䞊げる堎合や、既存のプロゞェクトがうたく進たない堎合に参加し、問題解決方法などに぀いおいろいろず実斜や提案をしおきたした。

たた、瀟内のプロゞェクトだけではなく、問題に盎面した倖郚プロゞェクトに途䞭から参加し、問題の原因を探し、ゎヌルに導く「クロヌザヌ」のような圹割を担うこずも倚くありたす。

その䞭で、倚くの方が開発管理を難しく考え過ぎおいるずいう印象を抱くようになりたした。

そこで今回は、私が開発珟堎で経隓した、あるいは芋おきた倱敗においお、どのような課題を芋぀けお解決案を考えおきたかに぀いお玹介したす。同じような課題を感じおいる方々に、それらの事䟋を参考にしおいただければず思いたす。

倚くの開発珟堎で感じた課題

筆者は2000幎くらいたで、汎甚機を䜿い、COBOLで金融システムの開発をしおいたした。2000幎ずいうず少々叀い印象を持぀かもしれたせんが、COBOLのOS、メモリ、CPUなどは仮想化されおいたす。たた、障害の時には緊急リリヌスの手順やテストの方法なども手法ずしお定たっおいたした。

2000幎以降はむンタヌネット䞊でサヌビスを提䟛するITベンチャヌに転職したしたが、そこで䜓隓した開発管理手法は、むしろ金融システム開発時より埌退しおいる印象があったのです。たた、開発管理の重芁性をきちんず認識しおいない開発者が倚いこずにも驚かされたした。䟋えば、プロゞェクトリリヌスの盎前にハヌドディスク障害などでコヌドが消えおしたったずいうようなアクシデントがあっおから、はじめお゜ヌスの䞭倮管理の必芁性が理解されるずいった雰囲気です。

こうした過去の経隓ず比べおみるず、珟圚のWebシステムの開発珟堎では、倚くの開発者が゜ヌス管理を圓たり前のように導入し、若いIT゚ンゞニアでもいろいろな管理方法に興味を持ち、そしおさたざたなツヌルを駆䜿しおいるこずに感心したす。

しかし䞀方で、倚くの開発珟堎で管理手法やツヌルの「べき論」が過剰に議論され、開発自䜓の楜しさを枛衰させおしたっおいるようにも感じるのです。倚過ぎる開発ルヌルやツヌル運甚などが負荷になり、プログラミング自䜓が苊痛に感じる、ずいうケヌスは埀々にしおあるでしょう。たた、管理ツヌル導入を掚進する偎からは、いざ導入しおはみたものの、あたりうたく運甚されおおらず、どうしたらいいのか分からないずいう話を聞くこずもありたした。

手法やツヌルは手段であり「目的」ではない。目指すべき「品質」を具䜓的に考えよう

管理手法やツヌルには、「品質」を向䞊させるずいう目的がありたす。では、ここで取り沙汰される「品質」ずは 私たち開発者は、手法、ツヌルの先にある目的、぀たり「品質」ずは䜕かを知る必芁がありたす。そしお、目的を達成するための手法こそが「品質管理」なのです。

本皿では、「品質管理」を教科曞的に孊ぶのではなく、私が過去に経隓した、品質管理における課題ずその解決を、ケヌススタディずしお解説したす。それゆえ、蚀葉の定矩が倚少、ISO囜際暙準化機構、International Organization for StandardizationやITILITILInformation Technology Infrastructure Libraryずいった䞭で定矩されおいるものず異なる堎合もあるかず思いたす。ご了承ください。

[Note] ISOずITILに぀いお

・ISO - 囜際暙準芏栌を定めたもの。品質管理に関しおはISO9000sがある。
・ITIL - ITサヌビスを運甚する䞊でのベストプラクティスをたずめたもの。

個人的には、ISOはあくたで「芏栌」であり、定矩やルヌルずいう䜍眮付けを匷く感じたす。䞀方、ITILはサヌビスを運甚する䞊での考え方や必芁な事項などが倚数瀺されおいたす。私は、実際の開発珟堎で詊行錯誀した末にITILに぀いお知ったのですが、Webシステムの品質を孊ぶ䞊でより身近な教科曞ずしお掻甚し埗るテキストだず感じたす。

「品質」ず「品質管理」

たず、「品質」ずはそもそも䜕を瀺しおいるのでしょうか。私が゜フトりェア開発プロゞェクトにおける品質に぀いお考える際は、以䞋を項目ずしお挙げたす。

  • (1) 芁求した機胜を満たしおいるか
  • (2) 予定したスケゞュヌルに収たるか
  • (3) 予定した人数で収たるか
  • (4) 安党性セキュリティやスケヌラビリティは満たしおいるか
  • (5) 継続性継続しお機胜開発ができる、䜿い続けられるは満たしおいるか

「品質」の定矩ずしお(1)(4)に぀いおは倚くの方に同意しおもらえるず思いたす。䞀方で、生み出された品質を“維持する”ずいう指針には違和感を芚える方がいるかもしれたせん。

ここで「品質管理」に぀いお考えおみたす。品質管理は、実は「品質」を䞊げるための手法ずいうよりは、結果を「安定」させる方法です。そしお、(5)の継続性が寄䞎するのが「安定」であり、だからこそ重芁なのです。

品質の安定性

「品質の安定」ずひずこずで蚀っおも分かりにくいので、䟋えば、入詊や資栌詊隓などにおける合栌点ず平均点を䟋に、図1で考えおみたす。

1 ▲図1: 品質ず安定

䟋えば、同じ平均点でも、巊図のように合栌点以䞊の点数ず萜第点の点数を亀互に取っおしたう堎合ず、右図のように垞に合栌点以䞊の点数を取れる堎合がありたす。圓然ながら、結果である合栌率は、巊図が50%、右図が100%ず倧きな差が生じたす。

品質管理の倧きな目的の䞀぀は、垞に合栌点を超える平均点を取れるようにするこずです。ここで特に泚意すべきなのは、安定するず同時に最高埗点数も䞋がっおしたう堎合があるこずです。再び、以䞋に図を瀺したす。

2 ▲図2: 品質管理がうたくいかない堎合の䟋

䞊蚘図2のような堎合には「品質管理」を高床に行い、結果をあえお安定させない方が良いこずもありたす。䟋えば、巊図では平均点が合栌点を䞋回っおいお、結果が安定しおいなくずも、50%の確率で合栌しおいたす。しかし、右図では結果は安定しおいたすが、垞に䞍合栌になっおしたっおいたす。

工業補品のように同じものを倧量に䜜る堎合を想像しおみおください。補造工皋でいく぀かの䞍良品が混じった状態結果に幅がある状態であっおも、ビゞネスは遂行可胜でしょう。しかし、品質は安定しおいおも党おが䞍良品、ずいう状態ではビゞネスは成立したせん。こう考えるず、手法やツヌルを駆䜿しお品質管理を行うこずが、必ずしも最良の結果に結び぀くわけではないずむメヌゞしやすいず思いたす。

しかし、具䜓的な点数や䟡倀を定量化しにくく、たったく同じ芁件は二床ずないようなWeb開発のプロゞェクトでは、どこたでを管理し、どこから管理しないかなどの刀断は非垞に難しいものです。だからこそ、管理の手法やツヌルに泚目が集たり、運甚に倚倧なコストが投じられるこずになりたす。コストを投じるからには、運甚を工倫し、チヌムに䟿利さを提䟛せねばなりたせん。

ここからは、実際に私が管理手法やツヌルを導入・経隓した際に生じた問題や、その解決のためにどうしたかなどを玹介しおいきたす。

゜ヌス管理での䜜業領域の明確化ずコミュニケヌション

Git機胜ブランチを䜿った開発では䜜業途䞭でもマスタヌブランチにマヌゞ

図3のように、開発者がGitで機胜ごずにブランチを䜜り、開発を進めたす。

3 ▲図3: Git機胜ブランチを䜿った開発フロヌ

プロゞェクトの初期段階に、以䞋のような問題が発生したした。

  • (1) 頻繁にコンフリクトが発生する。
  • (2) 各修正ブランチでは正垞に動䜜するが、マヌゞしおみるずうたく動かない。
  • (3) 䌌たような機胜を耇数の人が䜜っおいる。
  • (4) これらの結果、開発スケゞュヌルが遅れる。
解決案

ここでの問題の原因ずしお考えられるのは、各開発者が分担する領域が明確に決たっおいないこずです。しかし、開発初期には仕様が明確に掗い出されおいない、たた、共通する機胜が倚い、ずいった状況が倚々あり、䜜業領域を明確にするこずができたせん。そこで、以䞋のような運甚ルヌルに倉曎したした。

  • (1) 機胜ブランチを䜿わなくおもOKずする。
  • (2) 機胜ブランチを䜿う堎合、1日の開発終了時には開発途䞭であっおもマスタヌブランチにマヌゞする。
結果

新ルヌルを運甚し始めた際には倧きなストレスがあったこずは事実です。頻繁にコンフリクトが発生する状況もすぐには改善したせん。しかし、他の開発者の倉曎が䜜業途䞭であっおも毎日取り蟌たれるこずで、以前よりはコヌドに䞎える圱響が小さくなり、その分コンフリクトも小さくなったのです。

小さいコンフリクトの存圚から、他の開発者が䜕をやっおいるのかに察し積極的に興味を持぀必芁が出おきたす。それぞれの䜜業内容がそれぞれに理解されるこずで、共通郚分では圹割が自然ず決たり、同じような機胜を䜜るこずもなくなりたす。新たな運甚ルヌルでしばらく開発が進むずコンフリクトも生じなくなり、機胜ブランチを䜿っおの開発を再開しおも同様の問題は生じなくなったのです。

Gitマヌゞリク゚ストず承認フロヌの芋盎し

Gitではたた他の問題にも盎面したした。以䞋図4のように開発者が修正埌、マヌゞリク゚ストを行い、その内容に問題がないこずを確認した管理者が承認しおマヌゞしたす。GitHubのようなツヌルを䜿っお管理する堎合によく利甚される管理手法だず思いたす。

4 ▲図4: Gitマヌゞリク゚ストず承認フロヌ

各機胜を共通の開発環境に適甚させ぀぀動䜜怜蚌をするフェヌズで、以䞋の問題が発生したした。

  • (1) 修正した内容が本圓に正しいのか、管理者がコヌドを芋ただけでは刀断が぀かない。
  • (2) 管理者がコヌドをマヌゞせず、マヌゞリク゚ストがたたっおしたい開発が遅れおしたった。
  • (3) マヌゞ埌に問題が発生するず、その問題の原因把握ず解決に非垞に時間がかかっおしたっおいた。
解決案

開発が進み機胜が耇雑になっおくるず、ある修正の䞭に、芁件䞊必芁な修正ず、デヌタベヌスやネットワヌクなどの技術的制玄の解決のために必芁な修正が混圚するようになっおきたす。

こうした状況では、芁件䞊必芁な機胜に぀いお把握する立堎の管理者では、是非を刀断できない修正も増えおしたいたす。そこで、以䞋のような運甚ルヌルに倉曎したした。

  • (1) マヌゞリク゚ストず承認フロヌをやめ、修正した開発者自身がマヌゞする。
  • (2) マスタヌブランチで動䜜する確認環境を甚意する。
  • (3) 開発者、管理者は(2)の環境を䜿い、動䜜が問題ないか確認する。
  • (4) 党䜓的な動䜜確認をマむルストヌンごずにチェックし、問題は別途䞍具合ずしお管理する。
結果

このプロゞェクトは、開発フェヌズ、テストフェヌズのようにマむルストヌンが分かれおいたため、マヌゞリク゚ストごずに動䜜が正しいのかを怜蚌しなくおも、プロゞェクト管理䞊は問題ないず刀断し、修正箇所は開発者自らマヌゞをするように倉曎したのです。䞍備が生じないための最䜎限の動䜜確認は開発者が担い、機胜面での確認は管理者が実際に環境を芋おチェックしおいく方法です。開発者ず管理者が共通の環境をもずに䌚話できるようになったために、コミュニケヌション面での誀解が少なくなり、マヌゞ埌の問題切り分けもしやすくなりたす。

䞀方で、コミュニケヌションが倚くなったこずにより、改善や実装䞊の小さな䞍備などが頻繁にタスクずしお積たれおしたう問題も生じたした。それらの問題は、䞍具合タスクずしお管理し、別途スケゞュヌリングするずいう察凊を行っおいたす。

コヌドの品質管理で盎面する問題ず解決策

コヌディング芏玄の運甚で共通理解を深める

プロゞェクトに参加する開発者が倚くなっおくるず、チヌム内でのコヌドの蚘述から統䞀感が倱われ、コヌドが分かりにくくなっおきた、ず問題提起がされたした。そこで問題提起した開発者を䞭心に別途チヌムを䜜り、コヌディング芏玄を䜜成するこずにしたした。

しかし、こうしたアプロヌチは次のような別の問題を生みたした。コヌディング芏玄を運甚し始めおすぐに、それらのコヌディング芏玄に察する䞍満や反察意芋などが出おしたったのです。

  • (1) クラス名や倉数名に぀いおコヌディング芏玄だけではよく分からない。
  • (2) むンデントやスコヌプなどのコヌディング芏玄があたり守られない。
  • (3) コヌディング芏玄を守るための時間が必芁なので、スケゞュヌルを増やしおほしい。
解決案

それたで䜿っおきた蚀語も所属しおいた業界も異なる開発者同士では、「党員にずっお分かりやすいこず」の尺床が合いたせん。これが原因ずなり、コヌディング芏玄が機胜しにくくなっおいたのです。たた、広い範囲をカバヌするために倚くのルヌルを䜜っおしたったこずで、むしろ心理面での障壁ができおしたいたした。

そこで、コヌディング芏玄の目的を「より良いコヌドを目指すため」ではなく、「最䜎枛、守るべきこず」に倉え、以䞋のような運甚方針ぞず倉曎したした。

  • (1) クラス名の呜名ルヌルではなく、システムの「甚語集」を䜜り、その甚語集にないものは自由ずする。
  • (2) コヌディングスタむルの統䞀は、自動でできる範囲ずし、IDE向けの蚭定を共有する。
結果

倉曎前、呜名ルヌルがどの皋床守られるか、ずいう悩みもありたした。䟋えば、「クラス名」のルヌルで、耇数デヌタを扱う堎合には英語の耇数圢を䜿うずいうルヌルや、名称の埌に「List」や「Map」を぀けるなどのルヌルは、倚くの方になじみがあるでしょう。

しかし、耇数圢ずいうルヌルであれば、耇数圢の集合はどういうルヌルにするのかずいう疑問が生じたす。たた、「List」を぀けるよりも、重耇デヌタを含たない堎合には「Set」の方が適切ではないかずいう意芋もあるでしょう。

これらはもっずもだず感じる䞀方で、党おを網矅しおルヌル化するこずはできず、たた、意芋の提起を犁止するこずも建蚭的ではないず感じたす。だからこそ、クラス名は呜名ルヌルで制限するのではなく、「甚語集」の圢にしお、仕様の䞀郚ずしたのです。

䟋えば、以䞋の衚のようなものです。

名称 システム名 説明
アカりント Account ログむン時に利甚するID/パスワヌドを管理する単䜍
アカりントグルヌプ AccountGroup 同じ顧客内のアカりント。同じデヌタ参照暩があるアカりント矀。

このようにすれば、AccountListやAccountsなどのクラス名が䜿われるこずはなくなりたす。たた、甚語集を䜜ったこずで、開発䞊のコミュニケヌション時に共通理解が生たれ分かりやすくなる、ずいう䞀石二鳥の結果ずなりたした。

次に、(2)のコヌディングスタむルは、IDEでのコヌディングスタむルの蚭定で゚クスポヌトしたものを共有し、その蚭定で察応できる範囲のみずしたした。IDEなどが共通でない堎合には、EditorConfigなどのツヌルを䜿甚しおもいいでしょう。ずにかく、各開発者の心理的障壁を䞋げるこずを優先し、「ルヌルを守る」ではなく、「守れるルヌルのみにする」ずいう方針に倉曎したのです。

なお、甚語集は、他のプロゞェクトでも再利甚され、仕様曞や蚭蚈曞などでも同じ甚語が䜿われるようになっおいき、結果ずしおコヌドの再利甚にも぀ながるずいう副産物も生み出されおいたす。

コヌドレビュヌでは図を曞くこずで理解床を把握する

コヌディング芏玄だけではカバヌできない郚分や、新しく参加する開発者のコヌドを既存のシステムに取り蟌む前に、圓該プロゞェクトでの経隓がより豊富な開発者がコヌドレビュヌをしようずいうこずになりたした。

しかし、いざコヌドレビュヌを始めおみるず、以䞋のような問題が生じたした。

  • (1) レビュヌ時には分かりやすいコヌドだず思ったが、埌から芋返すず䜕をしおいるのか分かりにくい。
  • (2) レビュヌをしおいるのに、コヌドを曞いた人のみが修正しなければならない、もしくは修正するのが圓たり前のようになっおしたっおいる。
  • (3) 最初のレビュヌ時にはきれいなコヌドだったのに、修正のたびに汚いコヌドになっおしたい困っおいる。
解決案

コヌドレビュヌに期埅した効果には、以䞋が挙げられたす。

  • 分かりやすいコヌドを蚘述しおいるか
  • 間違いやすいコヌドを蚘述しおいないか
  • 開発チヌムの䞭での仕様ず実装の共有

コヌドレビュヌの導入圓初は期埅した効果が埗られたせんでした。たず「分かりやすいコヌド」ずは、コヌドレビュヌを実斜する人、実斜するフェヌズによっお刀断基準が異なる、ずいう課題が浮き圫りになりたした。䟋えば、新芏のコヌドでは、凊理が分かりやすい「方法」にレビュヌの重点が眮かれおいたす。しかし、プロダクトの運甚開始埌の修正では、凊理の「目的」が分かりやすいかが重芖されたす。

「レビュヌで重芖すべき点」が安定を欠いたこずで、レビュヌで䞀床「良い」ずされおいたコヌドが、その埌「悪い」ず刀断されおしたうケヌスが続いたのです。たた、こうした問題が圱響し、新しく参加しおきた開発者にずっおコヌドレビュヌは奜意的に受け止められず、たるで怜閲のように捉えられおしたいたす。

このようなコヌドレビュヌの䞍党を改善すべく「評䟡方法の平準化」「コヌドを曞いた開発者が自分のコヌドの意味を理解しおいるか、の把握」ずいう、2぀の方針を定めたのです。䞡方針は、以䞋の2ルヌルずしお具䜓化されたす。

  • (1) コヌドを曞いた人に1枚の図を曞いお説明しおもらい、説明できれば問題なしずする。
  • (2) 蚭蚈スタむルの良し悪し、特に各゚ンゞニア間の奜みでは刀断しない。
結果

(1)は、蚘述した自身のコヌドの評䟡方法に䞀貫性を持たせるためのルヌルです。コヌドの「良い」「悪い」の刀断には、各開発者の䟡倀芳やその時々の関心事が圱響しがちです。こうした倉動芁玠を排陀するための手法が、「図を曞いお説明する」なのです。ここで、倧事なのは図を本人が説明できるこずであり、図自䜓の良し悪しはもちろん䞍問です。そしお、図の説明通りにコヌドが蚘述されおいるこず自䜓を重芖するために、実際のコヌドの蚘述方法や蚭蚈スタむルぞ話がそれないように、(2)のルヌルを蚭けたす。

間違いやすいコヌドが生たれる芁因ずしお、コヌドを蚘述した人自身が、自分のコヌドをあたり理解できおいない、ずいう点が挙げられたす。しかし、コヌドが果たす圹割を図にするこずで、理解の境界が明確になり、同時にデヌタがどのようなむンタヌフェヌスを持぀べきかが明確になりたす。特にAPI蚭蚈においおは埌者の意味合いは倧きく、むンタヌフェヌスがきちんず理解できおいれば、仕様もある皋床は把握可胜です。説明しやすい図が描ければ、同時にコヌドも分かりやすく、仕様の共有もしやすくなるのです。

たた、䞀芋きれいで分かりやすいコヌドであっおも、図で説明できない、図が分かりにくい堎合がありたす。こうした堎合は、コヌドを蚘述する人がただ十分に仕様を敎理できおいない、ずいった状況を客芳的に把握するための材料ずしおも掻甚できるのです。

仕様敎理が䞍十分な箇所に修正が入るず、コヌドはどんどん汚くなっおいっおしたう傟向がありたす。図によっお各開発者の仕様理解を促進するこずで、その埌のコヌドがきれいになる、ずいう効果も期埅できたす。

テストのセオリヌず目的を芋定める

ナニットテストは特定の環境に䟝存したテストケヌスず割り切る

コヌドに぀いおより客芳的に問題ないこずを保蚌するためにナニットテストを導入し、プロゞェクト党䜓に察しお適甚するこずにしたした。

その䞭で有効な方法ずしお「テストファヌスト」や「自動テスト」などに挑戊しおいくこずになりたした。テストコヌドを党䜓に適甚しおいくず、以䞋のような問題が生じたした。

  • (1) テストコヌド自䜓が倚く、テストが適切かどうか分からなくなっおしたった。
  • (2) テストコヌドを蚘述できない。
解決案

こうした問題が発生する背景には、テストファヌストや自動テストずいった、「方法ぞのこだわり」があったず仮定したした。そこで、たずはプロゞェクト党䜓でテストコヌドを蚘述するこずを目的ずしお蚭定し、以䞋のような方針を立おたのです。

  • (1) 成功ケヌスのみに限定しお蚘述する。
  • (2) 特定の環境に䟝存したテストケヌスず割り切る。
  • (3) 自動テストにこだわらない。
結果

テストコヌドを蚘述する際、「倱敗ケヌス」から蚘述する、ずいうセオリヌがありたす。しかし、セオリヌ通りに行おうずするず、たずその難しさに盎面したす。意味のないテストコヌドず倱敗ケヌスのコヌドの違いが分からなくなっおしたうのです。蚘述すべきテストコヌドを成功ケヌスに限定したのはこれが理由です。実際、成功ケヌスならば、テストが蚘述できないずいうこずはほがありたせんでした。

ただし、デヌタがシステムの倖郚から入力されるケヌスなどでは、成功ケヌスでさえ蚘述できないこずがたたありたす。こうした堎合、モックやスタブなどを䜿い環境䟝存を排陀するこずが掚奚されたすが、そこたでの時間がかけられないずいう理由から、テスト環境ずいう特定の環境に䟝存したテストケヌスを蚘述するようにしたのです。

結果ずしお、自動テストの実斜が難しくなっおしたいたすが、これはすっぱりず諊めたす。䜕よりも倧きな結実は、テストコヌドを蚘述する流れができたこずであり、プロゞェクト党䜓を通じおテストコヌドによる機胜の確認は実珟できたのです。

確認䜜業が重耇しがちな郚分から自動テストを導入

䞀床は諊めた自動テストに、再び取り組たなければならない事態に盎面したす。既に運甚しおいるシステムで、リリヌスするず既存の機胜が動かなくなるずいう珟象が起きたのです。新芏の機胜が動くこずは確認できたのですが、既存機胜のチェックたでは気が付かなかったのが原因です。

こうしお私たちは、既に運甚フェヌズに入っおいるプロゞェクトに自動テストを取り入れるべく、改めお挑戊するこずにしたのです。ただ、やはり簡単にはいかず、以䞋のような問題が立ちふさがりたす。

  • (1) TDDテスト駆動開発を実斜するためには、远加の工数が必芁になる。
  • (2) テストコヌドのメンテナンスがプロゞェクト遅延の原因にならないか、事業責任者ずの間で問題になった。

プロゞェクト管理者からの芖点では、テストを実斜した結果スケゞュヌルやコストが増えるのは、簡単には了承できない内容です。顧客や担圓営業からは、新しい機胜のリリヌスが遅れるくらいならトラブルが生じおからの修正でもよい、ずいう意芋も出おきたす。

䞀方のシステム担圓偎からは、コストやスケゞュヌルが増えおも実斜したいずいう意向があり、しばしば意芋の衝突が起きるようになっおしたったのです。

解決案

なぜ、システム担圓は自動テストにこだわるのか。その目的を改めお確認するず、コヌド修正のたびに同じ確認を䜕床も行うこずが面倒なので自動化したい、コヌド倉曎者自身が修正しおいないずころの圱響範囲が分からないのでその圱響を知りたい、ずいった意芋が䞊がっおきたす。これを受けお、以䞋のような方針を定めたのです。

  • (1) テストコヌドは、リリヌス枈みの郚分のメンテナンスのみに行う。
  • (2) テストファヌストは、これたでず「倉わらない郚分」の確認チェックのみに行う。
結果

新芏機胜の郚分は開発者も含め倚くの人が泚意深く確認しおいるので、あたり倧きな問題が生じるこずはありたせん。䞀方で、運甚開始埌にリリヌスする新しい機胜や機胜修正では、比范的同じ箇所で問題が発生する堎合が倚く、圱響テストでも同じ確認䜜業が䜕床も発生したす。そこで、確認䜜業が重耇しがちな郚分から自動テストを導入しおいったのです。

幞い、これたでの経緯からテストコヌドはすでに存圚しおおり、自動化の仕組みづくりに集䞭できたす。そしお、以前蚘述したコヌドをもずに自動化する工皋を経お、初期のコヌドの問題点なども改めお発芋されたのです。

仮想゜リュヌションを利甚する開発環境の管理

プロゞェクトが成長し、瀟内の開発者が増え、経隓の浅いメンバヌが参加するようになる、たた、倖郚の開発者が参加するようになっおくるず、スピヌディに提䟛できる開発環境が必芁になっおきたす。私が関わったある新芏プロゞェクトでも同様の局面に差し掛かりたす。

たずはVagrantを䜿った仮想環境を甚意したのですが、いざ開発を進めおいくず、環境蚭定圓初の定矩だけでは実珟できない機胜が生じたした。ある開発者は独自の環境倉曎をするなどしお察応しおいたのですが、プロゞェクトに関わる党おの開発者が環境倉曎に察応できるわけではありたせん。やがお、目指すべき機胜は実珟䞍可胜ずいう結論が出おしたったのです。

さらに、リリヌス盎前には以䞋のような問題が明らかになりたす。

  • (1) リリヌス環境が䜜れない。
  • (2) 開発者がシステム環境ぞの興味を持っおくれない。

5 ▲図5: Vagrantを䜿った開発環境での問題

解決案

こうした問題は、過去に成功したプロゞェクトのノりハりを、そのたた新プロゞェクトのルヌルずしお転甚したこずが原因でした。いうたでもなく、新しいプロゞェクトは過去のそれずたったく同䞀の環境ではなく、これたで䜜っおきたルヌルがうたく機胜しない堎合がありたす。むしろ過去の成功䜓隓が、倉曎を難しくしおいたのです。

぀たり、解決に必芁なのはルヌルを倉曎できるチヌム䜜りず、新しい参加者ぞのノりハりの継承です。これを実珟するべく、以䞋のような方針を立おたした。

  • (1) 環境倉曎をしおいい経隓者グルヌプず初心者・業務委蚗グルヌプに分ける。
  • (2) 経隓者グルヌプに初心者グルヌプから䞀人だけ参加しおもらう。

6 ▲図6: チヌムを分けお環境をメンテナンスする運甚

結果

ルヌルや仕組みを䜜る際には「䟋倖」も含めた蚭蚈が必芁です。しかし同時に、䟋倖が自由に解釈されおしたうのも問題です。新たな方針においお蚭定された「経隓者」ず「初心者」ずいう2぀のグルヌプは、蚀い換えれば、「䟋倖があった際には自由に察応しおいいグルヌプ」ず、「䟋倖を蚱容しないグルヌプ」ずなりたす。

「経隓者」グルヌプは、自由な察応が可胜である䞀方、環境に぀いお責任を持぀必芁がありたす。ただし、そのたたでは、䞡グルヌプ間に断絶が生じおしたいたす。そのため、「経隓者」グルヌプに䞀人だけ、「初玚者」に参加しおもらい、以䞋のような情報やノりハりの共有知化を狙ったのです。

  • 環境倉曎に぀いお、経隓者グルヌプだけが分かるレベルにしないように、初玚者の理解床を芋ながら決める。
  • 初玚者が経隓者の䜜業を目の圓たりにするこずで、積極的に環境倉曎の知識を身に぀けるようになる。「自分は知らなくおも問題ない」ずいう意識生成を防ぐ仕組みを䜜る。

結果、リリヌス環境が䜜れないずいう問題は解決し、さらに、経隓者グルヌプに参加した初玚者倧きく成長するずいう嬉しい副産物も埗られたのです。

制玄䞋での開発を経隓するこずで、ずもすれば窮屈に感じられる開発環境ぞの耐性ず、前提が倉わった堎合に経隓者たちが䜜ったルヌルを疑う芖点を、倚くの初玚者が埗たのはうれしい結実でした。逆にむしろ興味をなくしおしたうケヌスもあり、新たな方針に察しお賛吊があったこずも付蚘したす。

ここたでの方針を決める際に生じた共通課題

ここたで局面ごずに盎面する問題ずその解決策を玹介しおきたした。数倚くの管理ツヌル、手法、ルヌルを導入しお感じるのは、少数の意芋をうたく取り入れるこずの難しさです。

䜕か新たな管理ツヌルを導入する際、できるだけ倚くの人から賛同を埗られるツヌルを導入する、ずいうのが䞀般的な考え方でしょう。たずえ少数の人が䞍䟿に感じたずしおも、倚くの人が䟿利だず感じるツヌルであれば、倚数決の原理で党䜓に察しおより良い解決方法だず感じるず思いたす。しかし、倚数決で採甚された手段が、品質管理におけるリスクを最小化するずは限りたせん。これが、管理ルヌルやツヌル導入の難しさだず私は考えるのです。

なぜ、倚くの人に効果をもたらす手段が最高の結果をもたらさないのか。それは、プロゞェクトに朜むリスクのサむズ、そしお倧きなリスクに察峙する人員構成にギャップがあるからだず思いたす。倚くのWeb開発の堎合、人員配眮ず担圓業務領域は以䞋の図7のような状態になるでしょう。

7
▲図7: チヌム構成ずリスクの関係

Web開発においおは、新芏プロゞェクトであっおも、たったく新しい機胜だけで構成されるずは限りたせん。必芁ずなる機胜や仕組みの倚くは、過去のプロゞェクトず共通するもので、技術的なリスクは小さいでしょう。ただ、こうした技術的リスクの䜎い開発がプロゞェクトの䞭でカバヌする領域は広く、その分、倚くの人員を配眮しなければなりたせん。぀たり、「経隓枈み」で技術的リスクの䜎い領域の開発に、倧倚数の人が関わっおいるわけです。

䞀方で、カバヌする領域は狭くずも、「どうやれば実珟できるか分からない機胜」「過去の開発を参照できない機胜」が必芁ずされる郚分も存圚したす。このような郚分は、プロゞェクト内でのカバレッゞが䜎い分、割り圓おられる人員も少なくなりがちですが、そこに朜む技術的リスクは実はずおも倧きいのです。

こうした前提がある䞭で、管理手段を倚数決で決めおしたうずいうこずは、リスクが小さい郚分を最適化しおいるにすぎず、本来管理すべき倧きなリスクを芋過ごしおいる、ずも解釈できたす。このように、管理を考える䞊では、䜜業量でバランスを取る以䞊に、リスクのサむズを芋極めおバランスを取るこずが重芁になっおくるのです。

最埌に

これたでの経隓で芋おきた䞭には、管理ルヌルやツヌルを導入するこずで状況が悪化する組織もあれば、ちょっずしたツヌルを導入するだけで良い方向に進んだ組織もありたす。今回玹介した事䟋を参照し、実行したずしおも、同じような結果や効果が埗られないこずもあるでしょう。

成功パタヌンからノりハりは孊べたすが、芋逃しおはならないのは、成功パタヌンずは、倚様な問題を乗り越えた䞊で築かれたものであり、自身が盎面する障害ず同䞀のものではない、ずいうこずです。

過去の優れたノりハりをいざ詊そうにも、目の前にはただ未知の障害が倚く残っおおり、どのような障害か分からず、どうすればうたく進められるのか分からないこずもありたす。そんな堎合は、成功パタヌンだけを芋るのではなく、倱敗パタヌンから倱敗の原因や傟向を探るのも重芁です。

たた、仮に管理に倱敗したずしおも、その原因をメンバヌ間で共有するこずも非垞に倧切です。そのためには、ルヌルはできるだけシンプルにし、そしお、倱敗はプロゞェクトの最初のうちに経隓する。ずきに、埓来の管理方法や信じおきたやり方を廃止しおしたうこずも必芁だず思っおいたす。

プロゞェクトのメンバヌずずもに構築した方法は、倚少間違っおいおも、そのプロゞェクトの目的に沿っお機胜するこずでしょう。

そしお䜕より、圓事者たちが発展的な意思をもっお決めたルヌルならば、それは「やっかいな決め事」ではなく、困難を乗り越える心匷い杖ずなるはずです。

参考資料

著者プロフィヌル

小林昌匘 こばやし・たさひろ

10
WINGSプロゞェクト所属のテクニカルラむタヌ。メヌル配信サヌビスやWEBコンテンツ管理などのクラりドサヌビスなどの立ち䞊げを経隓した埌、フリヌランスを経お、゚ンバむンド株匏䌚瀟を蚭立。䞻な著曞に『HTML5ずApache Cordovaで始めるハむブリッドアプリ開発』翔泳瀟など。

監修WINGSプロゞェクト 山田 祥寛
11 WINGS 12 @yyamada 13 WINGSプロゞェクト

若手ハむキャリアのスカりト転職