令和5年春期試験午後問題 問8

問8 情報システム開発

⇱問題PDF
バージョン管理ツールの運用に関する次の記述を読んで,設問に答えよ。
 A社は,業務システムの開発を行う企業で,システムの新規開発のほか,リリース後のシステムの運用保守や機能追加の案件も請け負っている。A社では,ソースコードの管理のために,バージョン管理ツールを利用している。
 バージョン管理ツールには,1人の開発者がファイルの編集を開始するときにロックを獲得し,他者による編集を禁止する方式(以下,ロック方式という)と,編集は複数の開発者が任意のタイミングで行い,編集完了後に他者による編集内容とマージする方式(以下,コピー・マージ方式という)がある。また,バージョン管理ツールには,ある時点以降のソースコードの変更内容の履歴を分岐させて管理する機能がある。以降,分岐元,及び分岐して管理される,変更内容の履歴をブランチと呼ぶ。
 ロック方式では,編集開始時にロックを獲得し,他者による編集を禁止する。編集終了時には変更内容をリポジトリに反映し,ロックを解除する。ロック方式では,一つのファイルを同時に1人しか編集できないので,複数の開発者で開発する際に変更箇所の競合が発生しない一方,①開発者間で作業の待ちが発生してしまう場合がある
 A社では,規模の大きな改修に複数人で取り組むことも多いので,コピー・マージ方式のバージョン管理ツールを採用している。A社で採用しているバージョン管理ツールでは,開発者は,社内に設置されているバージョン管理ツールのサーバ(以下,サーバという)のリポジトリの複製を,開発者のPC上のローカル環境のリポジトリとして取り込んで開発作業を行う。編集時にソースコードに施した変更内容は,ローカル環境のリポジトリに反映される。ローカル環境のリポジトリに反映された変更内容は,編集完了時にサーバのリポジトリに反映させる。サーバのリポジトリに反映された変更内容を,別の開発者が自分のローカル環境のリポジトリに取り込むことで,変更内容の開発者間での共有が可能となる。
 コピー・マージ方式では,開発者間で作業の待ちが発生することはないが,他者の変更箇所と同一の箇所に変更を加えた場合には競合が発生する。その場合には,ソースコードの変更内容をサーバのリポジトリに反映させる際に,競合を解決する必要がある。競合の解決とは,同一箇所が変更されたソースコードについて,それぞれの変更内容を確認し,必要に応じてソースコードを修正することである。
 A社で使うバージョン管理ツールの主な機能を表1に示す。
pm08_1.gif
〔ブランチ運用ルール〕
 開発案件を担当するプロジェクトマネージャのM氏は,ブランチの運用ルールを決めてバージョン管理を行っている。取り扱うブランチの種類を表2に,ブランチの運用ルールを図1に,ブランチの樹形図を図2に示す。
pm08_2.gif
〔開発案件と開発の流れ〕
 A社が請け負ったある開発案件では,A,B,Cの三つの機能を既存のリリース済のシステムに追加することになった。
 A,B,Cの三つの追加機能の開発を開始するに当たり,開発者2名がアサインされた。機能AとCはI氏が,機能BはK氏が開発を担当する。開発の流れを図3に示す。
pm08_3.gif
 I氏は,機能Aの開発のために,ローカル環境でaブランチからfeature-Aブランチを作成し開発を開始した。I氏は,機能Aについて(ア),(ウ),(オ)の3回のコミットを行ったところで,(ウ)でコミットした変更内容では問題があることに気が付いた。そこでI氏は,(α)のタイミングで,②(ア)のコミットの直後の状態に滞りなく戻すための作業を行い,編集をやり直すことにした。プログラムに必要な修正を加えた上でcした後,③テストを実施し,問題がないことを確認した。その後,レビューを実施し,aブランチにマージした。
 機能Bは機能Aと同時に開発を開始したが,規模が大きく,開発の完了は機能A,Cの開発完了後になった。K氏は,機能Bについてのテストとレビューの後,ローカル環境上のaブランチにマージし,サーバのリポジトリにプッシュしようとしたところ,競合が発生した。サーバのリポジトリからaブランチをプルし,その内容を確認して競合を解決した。その後,ローカル環境上のaブランチを,サーバのリポジトリにプッシュしてからテストを実施し,問題がないことを確認した。
 全ての変更内容をdevelopブランチに反映後,releaseブランチをdevelopブランチから作成して④テストを実施した。テストで検出された不具合を修正し,releaseブランチにコミットした後,再度テストを実施し,問題がないことを確認した。修正内容をaブランチとbブランチにマージし,bブランチの内容でシステムの運用環境を更新した。

〔運用ルールについての考察〕
 feature-Bブランチのように,ブランチ作成からマージまでが長いと,サーバのリポジトリ上のdevelopブランチとの差が広がり,競合が発生しやすくなる。そこで,レビュー完了後のマージで競合が発生しにくくするために,随時,サーバのリポジトリからdevelopブランチをプルした上で,⑤ある操作を行うことを運用ルールに追加した。

設問1

本文中の下線①について,他の開発者による何の操作を待つ必要が発生するのか。10字以内で答えよ。

解答例・解答の要点

ロックの解除

解説

1つのシステム開発に複数人の開発者が携わる場合、情報の共有不足による不整合や混乱を防止するため、ソースコードやドキュメントの変更履歴を管理し、誰もがアクセスできる状態にしておくことが不可欠です。バージョン管理ツールは、複数の開発者が同時に作業するためにソースコードの管理上必要となる機能を提供するソフトウェアであり、主に以下の機能を備えています。
  • 同時更新による更新消失を防ぐ機能
  • 変更者、変更日時、変更部位など変更履歴の記録
  • 任意の時点の内容の表示、過去のバージョンへの復元
バージョン管理ツールには、集中型と分散型の2つのタイプがあります。
集中型では、中央のリポジトリにソースコードが保存され、開発者はそのリポジトリからファイルを取得して作業します。変更が完了したら、リポジトリに反映させます。集中型の代表的なツールとして、Subversion、CVS、Perforceがあります。
一方、分散型では、各開発者が自分自身のPCにローカルリポジトリを持ち、変更履歴を管理します。最終的な統合は、必要に応じて行われます。分散型の代表的なツールとして、Git、Mercurialがあります。本文中でA社が採用しているのは分散型です。現在は分散型の人気が高く、特にGit(ギット)は多くの開発現場で使われています。本問で登場するコマンドやブランチ運用ルールは、実際の開発現場でもよく使われるため、今回の問題を通して理解を深めておくと良いでしょう。本問のmain、develop、feature、releaseにhotfixを加えた5つのブランチ構成は、Git-flowモデルと呼ばれます。

〔設問1〕
ロック方式の問題点について問われています。本文中でロック方式は「ロック方式では,編集開始時にロックを獲得し,他者による編集を禁止する。編集終了時には変更内容をリポジトリに反映し,ロックを解除する」とあり、1人が編集している間、他の人は同じソースコードを編集できなくなることがわかります。編集したいソースコードがあっても、他の人が編集しているときは、そのロックが解除されるまで待たなくてはなりません。したがって、待つ必要がある操作とは「ロックの解除」です。

∴ロックの解除

設問2

図1及び本文中のacに入れる適切な字句を答えよ。

解答例・解答の要点

a:develop
b:main
c:コミット

解説

〔開発案件と開発の流れ〕と「図3 開発の流れ」に基づいて、空欄a~cを埋めていきます。バージョン管理ツールについての知識が曖昧な場合も、本文中の説明や「表1 A社で使うバージョン管理ツールの主な機能」と「表2 ブランチの種類」を読むことで、回答を導くことができます。

aについて〕
空欄を含む文は「ローカル環境で[a]ブランチからfeature-Aブランチを作成し開発を開始した。…その後,レビューを実施し,[a]ブランチにマージした」となっています。表2と図1中には以下の説明があります。
  • 開発者は、ローカル環境でdevelopブランチからfeatureブランチを作成する
  • featureブランチは、開発者が個々に用意するブランチで、開発とテストが完了したら、変更内容をdevelopブランチにマージする
この2点の記述より、開発者であるI氏が作成するfeatureブランチの元であり、変更内容をマージする先となるのは、developブランチであることがわかります。よって、空欄aには「develop」が当てはまります。

a=develop

bについて〕
空欄を含む本文中最後の一文は「[b]ブランチの内容でシステムの運用環境を更新した」となっています。表2のmainブランチの説明より、システムの運用環境にリリースする際に用いるソースコードを管理するのはmainブランチとわかります。よって、空欄bには「main」が当てはまります。

b=main

cについて〕
空欄を含む一文は「プログラムに必要な修正を加えた上で[c]した後,テストを実施し,問題がないことを確認した。その後,レビューを実施し,[a]ブランチにマージした」となっています。この記述より、空欄cはソースコードの修正後、テストの前に実施されることがわかります。本文中では明記されていませんが、図2と図3を見ると、プログラムの開発は共通して「コミット⇒テスト⇒レビュー⇒マージ」の順で行われていることがわかります。よって、テスト前に行うべき作業は、ソースコードの変更内容をリポジトリに反映させる「コミット」です。

c=コミット

設問3

本文中の下線②で行った作業の内容を,表1中のコマンド名と図3中の字句を用いて40字以内で具体的に答えよ。

解答例・解答の要点

(オ)のコミットをリバートし,次に(ウ)のコミットをリバートする (32文字)

解説

図3を確認すると、コミットは(ア)⇒(ウ)⇒(オ)の順で行われているので、(ア)のコミット直後の状態に戻すためには、既に行われた(ウ)と(オ)の2つのコミットについて取り消す必要があります。表1を見ると、リバートというコマンドを使うことで、指定したコミットで対象となった変更内容を打ち消す変更内容を生成できるとわかります(既存コミットの履歴を消すわけではなく、変更内容を元に戻す新しいコミットをする)。

一連の複数のコミットについてリバートを行う際には、不整合を防ぐためコミットとは逆順で1つずつ取り消していかなければなりません。このため、直前のコミット(オ)を消し、その後(ウ)を消すという順で変更内容を戻していくことになります。したがって、I氏が行った作業の内容は「(オ)をリバートし、その後(ウ)をリバートする」となります。

∴(オ)のコミットをリバートし,次に(ウ)のコミットをリバートする

設問4

本文中の下線③について,実施するテストの種類を,それぞれ解答群の中から選び記号で答えよ。
解答群
  • 開発機能と関連する別の機能とのインタフェースを確認する結合テスト
  • 開発機能の範囲に関する, ユーザーによる受入れテスト
  • プログラムの変更箇所が意図どおりに動作するかを確認する単体テスト
  • 変更箇所以外も含めたシステム全体のリグレッションテスト

解答例・解答の要点

下線③:
下線④:

解説

〔下線③について〕
プログラムを開発し、featureブランチに変更内容をコミットした直後に行われるテストです。この段階で行われるのは、新しい機能や修正した機能が、完全かつ正しく実装されているかをプログラム単体で確認する単体テストです。developブランチにバグを混入させて、他の開発者に迷惑をかけることを防ぐためには、開発領域内でしっかりと単体テストを行うことが重要です。したがって「ウ」が適切です。

〔下線④について〕
mainブランチにマージする前の、releaseブランチで実施する最終的な動作確認です。この段階では、運用環境にリリースするための細かな調整や、リリースしても問題ないことを確認するための総合的なテストが行われます。プログラムに変更を加えた場合には、その変更が、既存の正常な部分に意図しない影響を与えてないかを確認しなければなりません。この確認のために行われるテストはリグレッションテスト(回帰テスト)と呼ばれ、総合テスト(システムテスト)のひとつとして実施されます。したがって「エ」が適切です。

∴下線③=ウ:プロブラムの変更箇所が意図どおりに動作するかを確認する単体テスト
 下線④=エ:変更箇所以外も含めたシステム全体のリグレッションテスト

なお「ア:結合テスト」は、featureブランチをdevelopブランチにマージした際に実施されます。

設問5

本文中の下線⑤について,追加した運用ルールで行う操作は何か。表2の種類を用いて,40字以内で答えよ。

解答例・解答の要点

developブランチの内容をfeatureブランチにマージする (32文字)

解説

developブランチには複数の開発者の変更内容が次々とマージされていくため、featureブランチが長期間にわたって存在する場合や、複数の開発者が同時にfeatureブランチで作業している場合には、サーバのリポジトリに反映するときに大きな競合(コンフリクト)が発生しやすくなります。可能であれば、テストやレビューの前に差を小さくしておくことが理想です。

この問題への一般的な対策として、サーバ上のdevelopブランチに対して行われた変更を定期的にローカル環境のdevelopブランチにプルし、変更点をfeatureブランチにマージしておくアプローチがあります。developブランチで行われた変更をfeatureブランチにこまめに反映しておくと、レビュー完了後のマージで発生する競合の範囲を小さく抑えることができます。

「随時,サーバのリポジトリからdevelopブランチをプルした上で」行う操作ですから、最新のdevelopブランチの内容をローカル環境のfeatureブランチに反映させるための操作が該当します。したがって「developブランチの内容をfeatureブランチにマージする」旨の解答が適切となります。

∴developブランチの内容をfeatureブランチにマージする
模範解答

Pagetop