資格道場 › レッスン一覧 › ソフトウェア開発管理技術
ソフトウェア開発管理技術・3/4・13分

成果物の管理・解析とコード設計

ゴール

構成管理とリポジトリの役割、リバースエンジニアリングと似た用語の違い、Java の3つの実行形態を区別できるようになる。チェックディジットと、コードの桁数・枯渇年度の計算を自力で解けるようになる。

リバースエンジニアリングは免除試験を含めて30回以上出ている頻出の用語問題です。チェックディジットとコード桁数は、手順を覚えれば確実に取れる計算問題です。どれも「古いシステムの仕様が分からない」「ID が足りなくなる」といった、実務でよく起きる事故を防ぐための知識です。

このレッスンで稽古する(用語チェック・過去問)

構成管理:どの成果物の、どの版が、どれと対応しているか

結論:構成管理は、成果物の「版(バージョン)」とその対応関係、そして変更の手続を管理することです。 管理の対象になるプログラム・仕様書・設計書などを 構成品目 と呼びます。進捗・品質・体制の管理とは別物です。

実務の例でいうと、「要件定義書 v1.2・API 仕様 v3.0・実装 v3.0.1 がそれぞれ対応している」という対応表と、「決まった手続を通さないと書き換えられない」というルールのセットです。これが崩れると「どこを直せばよいか分からない」「直したはずの修正が反映されていない」が起きます。

起きた問題・管理項目 担当する管理 構成管理に起因する?
改版手続を守らずに修正し、正しく動いていたプログラムが壊れた 構成管理(変更の手続) する
仕様書・設計書・プログラムの版が対応付いておらず、修正箇所を特定できない 構成管理(版数管理) する
派生元の修正が、派生プログラムに反映されない 構成管理(派生の管理) する
システムテストで単体テストレベルのバグが多発する 品質管理(テスト) しない
開発作業の進捗状況 進捗管理 しない
成果物のレビュー結果 品質管理 しない
プロジェクト組織の編成 体制(要員)管理 しない

試験での問われ方

  • 「構成管理の対象は?」→ プログラムのバージョン。進捗・レビュー結果・組織編成がひっかけの選択肢です。
  • 「構成管理に起因しない問題は?」→ 版・手続・派生の話が出てこない選択肢(バグの多発など品質の話)を選びます。
版の対応変更の手続要件定義書 v1.2API 仕様 v3.0実装 v3.0.1対応対応修正したい決まった手続を通す新しい版として登録手続を飛ばして修正すると正しく動いていたプログラムが壊れる
左は成果物の版どうしの対応、右は書き換えに必ず通す変更の手続。構成管理はこの両方を管理する。

リポジトリ:成果物を一か所にまとめる書庫

結論:リポジトリは、各工程の成果物を一元管理する場所です。 一か所にまとめることで開発や保守の作業効率が上がり、用語の統一 もしやすくなります。

たとえると、部署ごとにバラバラだった資料をまとめた共有の書庫です。試験では「不良の管理(品質分析)」「作業手順の定義」「予定と実績の管理(進捗)」が、ひっかけの選択肢として並びます。正解のキーワードは 「成果物の一元管理」 です。

リバースエンジニアリング:物から設計図を書き起こす

結論:リバースエンジニアリングは、既存のソフトウェア(ソースコード・オブジェクトコード・稼働中のDB定義など)を解析して、仕様や設計を明らかにする手法です。 通常の開発は「設計図 → 物(コード)」の向きで進みます。その逆の「物 → 設計図」の向きなので「リバース」と呼びます。

たとえると、完成した料理を味見して材料と手順を割り出し、レシピを書き起こす作業です。稼働中のデータベースの定義から E-R 図(データの関係を表す図)付きの設計書を作るのも、リバースエンジニアリングにあたります。

flowchart LR
  A["設計情報(仕様書・E-R図)"] -->|"フォワードエンジニアリング"| B["ソースコード・稼働中のDB"]
  B -->|"リバースエンジニアリング"| A
用語 何をするか 見分けるキーワード
リバースエンジニアリング 既存のソフトを解析し、仕様・設計を明らかにする 物 → 設計図。「解析して」「取り出す」「設計書を生成」
フォワードエンジニアリング 設計情報からソースコードを(自動)生成する 設計図 → 物。「設計情報から」「自動生成」
リエンジニアリング 既存のソフトを分析・理解したうえで、全体を新しく作り直す 「作り直す」(リバース+フォワード)
リファクタリング 外部から見た振る舞いを変えずに、内部構造を改善する 「振る舞いを変えずに」
リストラクチャリング プログラムの構造を整理し直す(再構造化) 「再構造化」。仕様の取り出しはしない
コンカレントエンジニアリング 設計・製造などの工程を並行して進め、期間を縮める 「並行」
ソーシャルエンジニアリング 人の油断や心理の隙を突いて、パスワードなどを盗み出す セキュリティの攻撃手口。開発手法ではない

試験での問われ方

  • 「説明はどれか」型:4つの選択肢が、フォワード(自動生成)・リファクタリング(振る舞いを変えない)・リバース(解析して明らかにする)・リエンジニアリング(作り直す)にそれぞれ対応しています。
  • 「この手法はどれか」型:「〜エンジニアリング」「リ〜」で始まる似た名前が並びます。向き(物 → 設計図) と 「解析・取り出す」 で判断します。

Java の3つの実行形態:どこで動くかで見分ける

結論:Java のプログラムは、動く場所で3つに分かれます。アプリケーションは単体で、アプレットはブラウザで、サーブレットは Web サーバで動きます。 試験では「何が必要か」「どこで動くか」を問われます。

名前 どこで動くか 必要なもの・特徴
Java アプリケーション PC などで単体で動く Java VM だけ あればよい(ブラウザも Web サーバも不要)
Java アプレット クライアント側の Web ブラウザ サーバからダウンロード してブラウザ上で実行する
Java サーブレット Web(アプリケーション)サーバ上 クライアントの 要求に応じて サーバ側で実行する
JavaScript (過去問の文脈では)クライアント側のブラウザ 名前は似ているが Java とは別の言語
VBScript (過去問の文脈では)クライアント側のブラウザ 主にブラウザで動くスクリプト言語
JavaBeans — Java のプログラムを 部品として扱うための規約
Java VM — バイトコード(中間コード) を実行する仕組み

範囲に注意:「Web 環境の動的処理で、Web サーバ上だけで動くもの」の正解がサーブレットになるのは、その問題の選択肢(JavaScript・アプレット・サーブレット・VBScript)の中では という意味です。JavaScript も Node.js を使えばサーバ側で動きます。一般論として「サーバ側で動く技術はサーブレットだけ」というわけではありません。

試験での問われ方:サーブレットの説明問題では、アプレット(ダウンロードして実行)・JavaBeans(部品の規約)・Java VM(中間コードを実行)の説明がひっかけの選択肢として並びます。

Web サーバサーブレット要求→サーバで実行ダウンロード→ブラウザで実行クライアントWeb ブラウザアプレットPC(単体)アプリケーションJava VM だけブラウザも Web サーバも不要
アプレットはサーバからダウンロードしてブラウザで、サーブレットは要求に応じてWebサーバで、アプリケーションはJava VMだけで単体で動く。

チェックディジット:入力ミスを見つける最後の1桁

結論:チェックディジット(検査数字)は、コードの入力ミスを見つけるために末尾に付ける1桁です。 各桁に重みを掛けて合計し、基数で割った余りから求めます。読み取る側も同じ計算をして、末尾の数字と一致しなければ入力ミスだと分かります。

手順の型は次の3つだけです。

  1. 桁ごとに掛けて足す(データ × 重み付け定数)
  2. 基数で割った余り を求める(mod(x, y) は「x を y で割った余り」)
  3. 問題文の指示どおりに仕上げる(例:基数 − 余り の1の位)

試験での問われ方:手順3の仕上げを飛ばした値(余りそのもの)が、必ず選択肢に混ざっています。チェックディジットから未知の桁を逆算させる問題も出ます。どちらも下の例題で手順を確認してください。

チェックディジットを作る① 桁ごとに重みを掛けて足す② 基数で割った余りを求める③ 問題文の指示どおりに仕上げるコードの末尾に1桁付ける読み取る側も同じ計算をして比べる一致 → 正しい不一致 → 入力ミス③を飛ばした「余り」が誤答の選択肢に出る
付ける側と読み取る側が同じ3手順で計算し、末尾の数字と一致するかで入力ミスを見つける。

コード桁数と枯渇年度:組合せは掛け算で数える

結論:コードで表せる数は「1桁あたりの種類数」を桁数の分だけ掛け算した値です。 英大文字なら1桁あたり26通り、数字なら10通りです。将来の件数と比べて、足りるかどうか、いつ足りなくなるかを判断します。

形式 表せる数
英大文字2桁 26 × 26 = 676
英大文字3桁 26³ = 17,576
英大文字2桁+数字3桁(XXNNN) 26 × 26 × 10 × 10 × 10 = 676,000

試験での問われ方:「毎年2割増える」は、×1.2 を年数の分だけ 掛け続けます(20% × 3年 = 60% 増、という足し算ではありません)。枯渇年度は「年度末の累積」が総数を超える年度を答えます。

毎年2割増える(×1.2 を掛け続ける)今年11年後1.22年後1.2×1.2=1.443年後1.728(72.8%増)3年後(誤)20%×3年=60%増足し算で数えると増え方を少なく見積もる
毎年2割増えるときは×1.2を掛け続けるので、3年後は1.6倍ではなく1.728倍になる。
例題 1

チェックディジットを付加する(データ7394・重み1234・基数11)

次の方式によって求められるチェックディジットを付加した結果はどれか。ここで,データを 7394,重み付け定数を 1234,基数を 11 とする。 〔方式〕 (1) データと重み付け定数の,対応する桁ごとの積を求め,それらの和を求める。 (2) 和を基数で割って,余りを求める。 (3) 基数から余りを減じ,その結果の 1 の位をチェックディジットとしてデータの末尾に付加する。

ア 73940
イ 73941
ウ 73944
エ 73947

出典:平成29年度 秋期 基本情報技術者試験 午前 問24

解き方と答えを見る
  1. 手順1 桁ごとに掛けて足す:7×1 + 3×2 + 9×3 + 4×4 = 7 + 6 + 27 + 16 = 56
  2. 手順2 基数で割った余り:56 ÷ 11 = 5 余り 1 → 余りは 1
  3. 手順3 基数から余りを引く:11 − 1 = 10
  4. 手順4 その1の位を取る:10 の1の位は 0 → チェックディジットは 0
  5. 手順5 データの末尾に付ける:7394 + 0 → 73940

答え:ア(73940)。余りの 1 をそのまま付けるとイ(73941)を選んでしまう。

例題 2

チェックディジットから未知の桁を逆算する(C=4、N2=7、N3=6、N4=2)

4 桁の整数 N1N2N3N4 から,次の方法によって検査数字(チェックディジット)C を計算したところ,C = 4 となった。N2= 7,N3= 6,N4= 2 のとき,N1 の値は幾らか。ここで,mod(x,y) は,x を y で割った余りとする。
検査数字: C = mod((N1×1+N2×2+N3×3+N4×4),10)(N1〜N4 の数字は添字)

ア 0
イ 2
ウ 4
エ 6

出典:平成25年度 秋期 基本情報技術者試験 午前 問3

解き方と答えを見る
  1. 式:C = mod(N1×1 + N2×2 + N3×3 + N4×4, 10)
  2. 分かっている桁を代入:N2×2 = 7×2 = 14、N3×3 = 6×3 = 18、N4×4 = 2×4 = 8
  3. 合計:N1 + 14 + 18 + 8 = N1 + 40
  4. 40 は 10 で割り切れるので、mod(N1 + 40, 10) = N1 を 10 で割った余り
  5. これが C = 4 になるので、0〜9 の数字の中では N1 = 4
  6. 確かめ:4 + 40 = 44 → 44 ÷ 10 の余りは 4 = C

答え:ウ(4)

例題 3

3年後まで足りる顧客コードの桁数(英大文字26種類)

顧客に,A〜Z の英大文字 26 種類を用いた顧客コードを割り当てたい。現在の顧客総数は 8,000 人であって,毎年 2 割ずつ顧客が増えていくものとする。3 年後まで全顧客にコードを割り当てられるようにするためには,顧客コードは少なくとも何桁必要か。

ア 3
イ 4
ウ 5
エ 6

出典:平成29年度 春期 基本情報技術者試験 午前 問23

解き方と答えを見る
  1. 1年後:8,000 × 1.2 = 9,600 人
  2. 2年後:9,600 × 1.2 = 11,520 人
  3. 3年後:11,520 × 1.2 = 13,824 人(= 8,000 × 1.2³)
  4. 2桁で表せる数:26² = 676 → 足りない
  5. 3桁で表せる数:26³ = 17,576 → 17,576 ≧ 13,824 なので足りる

答え:ア(3桁)

例題 4

ID(XXNNN)を発行し尽くす年度を予測する

A社の会員登録処理では,次の形式のIDを発行している。各年度末での発行済ID数の推移は表のとおりである。今後もこの傾向が続くと仮定した場合,この形式によるIDは何年度に発行し尽くすと予想されるか。ここで,脱会した会員のIDは欠番として管理し,再利用は行わない。
〔IDの形式〕 XXNNN(例:AZ059など) ・Xには英大文字(A~Z)を設定する。 ・Nには数字(0~9)を設定する。 〔各年度末における発行済ID数の推移〕
年度2006200720082009
発行済ID数(累積)317,000383,000447,000512,000

ア 2010年度
イ 2011年度
ウ 2012年度
エ 2013年度

出典:平成22年度 春期 基本情報技術者試験 午前 問55

解き方と答えを見る
  1. ID の総数:英大文字2桁 × 数字3桁 = 26 × 26 × 10 × 10 × 10 = 676 × 1,000 = 676,000
  2. 毎年の増加数:2007年度 383,000 − 317,000 = 66,000、2008年度 447,000 − 383,000 = 64,000、2009年度 512,000 − 447,000 = 65,000 → 1年あたり約 65,000
  3. 2010年度末:512,000 + 65,000 = 577,000(総数 676,000 未満)
  4. 2011年度末:577,000 + 65,000 = 642,000(まだ未満)
  5. 2012年度末:642,000 + 65,000 = 707,000(676,000 を超える)→ 2012年度の途中で尽きる

答え:ウ(2012年度)

要点(試験直前に読む)

  • 構成管理の対象は「成果物の版(プログラムのバージョン)」。進捗・レビュー結果・組織編成は対象外。
  • バグの多発は品質管理(テスト)の問題で、構成管理に起因しない。
  • リポジトリ=各工程の成果物を一元管理する場所。作業効率と用語の統一に役立つ。
  • リバースエンジニアリング=既存の物を解析して仕様・設計を取り出す(物 → 設計図)。フォワードは設計 → コードの自動生成、リファクタリングは振る舞いを変えない内部改善、リエンジニアリングは作り直し。
  • Java:アプリケーション=VM だけで動く、アプレット=ダウンロードしてブラウザで動く、サーブレット=Web サーバ上で要求に応じて動く。
  • チェックディジットは「掛けて足す → 基数で割った余り → 指示どおり仕上げる」。コードの総数は種類数の掛け算、増加率は年数の分だけ掛け続ける。

ひっかけ

  • チェックディジットの問題では、最後の仕上げ(基数 − 余り の1の位など)を飛ばした「余りそのもの」が選択肢にある。手順の番号を1つずつ消し込んで計算する。
  • 「〜エンジニアリング」「リ〜」の似た名前が並ぶ。「解析・取り出す・設計書を生成」ならリバース、「自動生成」ならフォワード、「振る舞いを変えずに」ならリファクタリング、「作り直す」ならリエンジニアリング。
  • 「Web サーバ上だけで動くのは?」→ その問題の選択肢の中ではサーブレット(JavaScript・VBScript・アプレットはクライアント側で動く)。「ダウンロードして実行」はアプレット、「VM だけで動く」はアプリケーション。
  • 「構成管理に起因しない問題」では、版・改版手続・派生の話が出てこない選択肢(テストでのバグの多発など)を選ぶ。
  • 増加率の問題で「2割 × 3年 = 6割増」と足し算にしない。×1.2 を3回掛ける。コードの総数も 26 × 2 のような足し算ではなく、26 × 26 のように掛け算する。

用語(20)

構成管理 こうせいかんり
成果物の版とその対応関係、変更の手続を管理して、どれが最新で、どれとどれが対応しているかを常に分かるようにすること。
⚠ 進捗管理・品質管理と混同しやすい。対象が「成果物の版」なら構成管理、作業の進み具合やバグ・レビュー結果なら別の管理。
構成品目 こうせいひんもく
構成管理の対象になる個々の成果物(プログラム・仕様書・設計書など)。
版数管理 はんすうかんり(バージョン管理)
成果物の版(バージョン)を記録し、仕様書・設計書・プログラムの版の対応を取れるようにすること。
改版手続 かいはんてつづき
成果物を修正して新しい版にするときに通す、決められた承認と記録の手順。
リポジトリ repository
各工程の成果物を一元管理する場所で、作業効率を上げ、用語の統一にも役立つ。
⚠ 不良管理・手順定義・進捗管理のツールと混同しやすい。キーワードは「成果物の一元管理」。
リバースエンジニアリング reverse engineering
既存のソフトウェアやDB定義を解析して、仕様や設計の情報を取り出す手法。
⚠ フォワードエンジニアリングは逆向き(設計情報 → コード)。リエンジニアリングは解析したうえで作り直すところまで含む。
フォワードエンジニアリング forward engineering
設計情報からソースコードなどを生成する、通常の向きの開発手法。
⚠ リバースエンジニアリングと向きが逆。「設計情報から自動生成」ならフォワード。
リエンジニアリング re-engineering
既存のソフトウェアを分析・理解したうえで、全体を新しく作り直すこと。
⚠ リバースは解析だけ、リエンジニアリングは作り直しまで行う。
リファクタリング refactoring
外部から見た振る舞いを変えずに、プログラムの内部構造を改善すること。
⚠ リバースエンジニアリングと混同しやすい。「振る舞いを変えずに」が出てきたらリファクタリング。
リストラクチャリング restructuring
プログラムの構造を整理し直すこと(再構造化)。
⚠ 仕様や設計を取り出す手法ではないので、リバースエンジニアリングとは違う。
コンカレントエンジニアリング concurrent engineering
設計・製造などの工程を並行して進めて、開発期間を短くする手法。
⚠ 名前が似ているだけで、解析とは関係ない。キーワードは「並行」。
ソーシャルエンジニアリング social engineering
人の油断や心理の隙を突いて、パスワードなどの情報を盗み出す攻撃手口。
⚠ 開発手法ではなくセキュリティの用語。
Java VM Java Virtual Machine
Java のバイトコード(中間コード)を実行する仕組みで、これがあれば Java アプリケーションが動く。
⚠ サーブレットの説明問題で「インタプリタ」「バイトコードを実行」とあれば Java VM の説明。
Java アプリケーション Java application
Java VM さえあれば、Web ブラウザも Web サーバも使わずに単体で動く Java プログラム。
⚠ アプレット(ブラウザが必要)、サーブレット(Web サーバが必要)との違いは「VM だけで動く」こと。
Java アプレット Java applet
サーバからダウンロードして、クライアント側の Web ブラウザ上で実行される Java プログラム。
⚠ サーブレットと名前が似ている。「ダウンロードしてクライアントで実行」ならアプレット。
Java サーブレット Java servlet
クライアントの要求に応じて、Web(アプリケーション)サーバ上で実行される Java プログラム。
⚠ アプレット(ダウンロードしてブラウザで実行)と混同しやすい。過去問の選択肢(JavaScript・アプレット・サーブレット・VBScript)の中で「Web サーバ上だけで動く」のはサーブレット。ただし一般論としてサーバ側の技術がサーブレットだけというわけではない。
JavaBeans ジャバビーンズ
Java のプログラムをアプリケーションの部品として扱うための規約。
⚠ サーブレットの説明問題で「部品として取り扱う規約」とあれば JavaBeans。
チェックディジット check digit(検査数字)
コードの入力ミスを見つけるために、各桁から計算して末尾に付ける1桁の数字。
重み付け定数 おもみづけていすう
チェックディジットの計算で、データの各桁に掛ける決められた数。
基数 きすう
チェックディジットの計算で、合計を割るときに使う数(例:11、10)。
⚠ 基数で割った「余り」と「基数 − 余り」を取り違えないこと。問題文の手順に従う。

このレッスンの過去問

このレッスンで稽古する