【Embedded Technology 2019 スペシャルセッション】

派生開発問題解決セミナー2019〜派生開発プロセスの基本と発展 守りから攻めの派生開発へ〜

スペックアウトによる設計仕様の理解

AFFORDD 派生開発推進協議会
T19研究会井貝 智行
2019-11-22(C) copyright 派生開発推進協議会

目次
1. スペックアウトとは
2. XDDPにおける位置付け
3. スペックアウトで何をやればいいの？
4. 「設計仕様の理解」は難しい
5. スペックアウトの実情
6. スペックアウトで大切なこと
7. スペックアウトのやり方
8. スペックアウトの効果
9. まとめ(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション2

スペックアウトとは• XDDPでは– ソースコードから設計書の一部を生成する– ソースコードを読んで理解しながら変更箇所や影響箇所を特定する(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション

3

XDDPにおける位置付け（引用元）http://affordd.jp/conference2017/affordd_conference2017_poster1.pdf(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション

4

XDDPにおける位置付け（引用元）http://affordd.jp/conference2017/affordd_conference2017_poster1.pdf(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション

5

スペックアウトで何をやればいいの？
例えば、ドメイン知識が無い派生開発を担当することになったときまず、何をしますか？

(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション6

聞いてみた「既存のソースコード10万行を今度の製品に使おうと思っているが、使えるかどうか1週間で判断してほしい」
T19研究会メンバーの考え＋お越しいただいた方の考え
関連資料をかき集める

ソースを眺める
マジックナンバーの有無
Goto文の有無

解析ツールにかける。
複雑度を測定Grepでキー
ワード検索

ゾンビに注意品質保証がない
デモ版、体験版、社内ツールは要注意
調査範囲を決める。
１関数、約１分で調査する

ビルド環境を構築する。
容易に構築
できない場
合は要注意
上司から理由を聞き出す(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション

設計書、クラス図を探す

何に使うか聞き出す7

スペックアウトで何をやればいいの？
スペックアウトに関連した意見を抽出
全体を把握する（クラス図を作るとか）関連資料をかき集める構造をみる

アーキやIFを調べる

設計書、クラス図を探す

変更要求を確認し、変更箇所、影響箇所を探さずに関連箇所だけを探す。

設計仕様を理解したい(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション

8

「設計仕様の理解」は難しい
設計仕様の理解が重要なのはわかるけど• ソースコードしかない– しかもコメントが無い、役に立たない• ドキュメントが同期していない、信頼できない– 設計の意図がわからない• 前任者が退職していて有識者がいない– 効果的なレビューができない(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション

9

スペックアウトの実情
特別な作業ではなく、皆さん普段作業していると思いますが
しかし・・・• スペックアウト技術や行為が俗人的、人任せ– スペシャルエンジニア的な人がいれば高品質– 担当者によって品質のバラつきが発生• ソースコードの調査(スペックアウト時に)に時間がかかっている– 一度調べた関数を何度も見た– どこから行き着いたかわからなくなった– 調査結果が、全然使えなかった だからまた調査した– 途中で調査の目的が変わった(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション

10

スペックアウトの実情
特別な作業ではなく、皆さん普段作業していると思いますが、しかし・・・• スペックアウト技術や行為が俗人的、人任せ– スペシャルエンジニア的な人がいれば高品質– 担当者によって品質のバラつきが発生• ソースコードの調査(スペックアウト時に)に時間がかかっている– 一度調べた関数を何度も見た– どこから行き着いたかわからなくなった– 調査結果が、全然使えなかった だからまた調査した– 途中で調査の目的が変わった• そもそもスペックアウトという工程を意識していない迷子！？

– 設計仕様を理解するための有益な成果物が残らない(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション

11

スペックアウトを行う上で大切なこと理解したことを示す「成果物（スペックアウト資料）」が重要• “理解した”とはどういう状態をいうのか？
– 自分の言葉で説明できる状態なったとき「理解した」と言える• 頭の中はレビューできない⇒レビューするためにも成果物が必要• レビューすることで関係者間で共有する• 今回限りの資料にしない⇒今後も役立つ資料にする(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション

12

スペックアウトを行う上で大切なこと目的を明確にする• 何のためにスペックアウトをするのか– 知りたい機能は？
– 知りたいことは？
– 必要な成果物は？
– スペックアウトに投入できる時間は？

スペックアウトの一番の目的は変更要求仕様におけるBeforeを明確にする(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション

13

スペックアウトのやり方
スペックアウトの準備

Step1

Step
2

関連資料の整理
ソースファイルの整理

スペックアウトとスペックアウト資料の作成
処理構造

Step
3
(C) copyright 派生開発推進協議会

状態遷移

データ構造

・・・

スペックアウト資料から仕様を作成
ET2019 スペシャルセッション

14

スペックアウトのやり方
スペックアウトの準備

Step
1

Step2

関連資料の整理
ソースファイルの整理・関連資料はそろっているか？
スペックアウトと・ソースコードと同期しているか？
・目的を明確にする

スペックアウト資料の作成
処理構造

Step
3(C) copyright 派生開発推進協議会

状態遷移

データ構造

・・・

スペックアウト資料から仕様を作成
ET2019 スペシャルセッション

15

スペックアウトのやり方
スペックアウトの準備

Step
1

Step2

関連資料の整理
ソースファイルの整理

スペックアウトとスペックアウト資料の作成
処理構造

Step
3(C) copyright 派生開発推進協議会

状態遷移

データ構造

・・・

スペックアウト資料から仕様を作成
ET2019 スペシャルセッション

16

スペックアウトの種類
スペックアウトは、その「場面」（派生開発、リファクタリング、アーキテクチャー再設計など）によっていろいろな表現方法が考えられます。

• 派生開発でのスペックアウトの例– 処理構造のスペックアウト• 関数の呼び出し構造の表現（構造図、クラス図、シーケンス図など）– 状態遷移のスペックアウト• 状態遷移の表現（状態遷移マトリクス、状態遷移図）– データ構造のスペックアウト• データ構造図、ER図(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション

17

処理構造のスペックアウト• 処理の呼び出し構造を表現する– 一つの関数から順次呼び出し構造を「構造図」に表現する– 関数の処理の詳細な理解は後回し

調べたい
機能名

ソース
ファイル
構造図

構造図で気になる関数のフローを展開する

関数を呼び出し構造で表現する

フロー
チャート
変更要求
仕様書

(C) copyright 派生開発推進協議会

データリストET2019 スペシャルセッション

変更箇所を追記(仕様)18

処理構造のスペックアウト• 処理構造AA func1(XX,・){・func2();・

AA func2(XX,・){・func4();・

AA func4(XX,・){・func8();・func3();・return;

func5();
・return;

func9();
・
return;}}・AA func8(XX,・){||||||・||||||
・||||||||||||
・U}・・
return;}3

探索ルート：コードリーディングの順番

カメの探索ルートの悪い点
・範囲が狭い (線で捉えている)・目的が変わる・構造を把握できない(C) copyright 派生開発推進協議会

ウサギの探索ルートの良い点
・範囲が広い(面で捉えている)・目的が変わらない
・全体の構造を把握できる

ET2019 スペシャルセッション

19

成果物の一例
カメの探索ルートで作成した成果物の例
func1()// 受信データ設定
func2()//次に、各大項目レベルでの値格納処理に飛ぶ
func4()
func8()
func9()
階層が深くなればなるほど見づらくなる
・
どこまで調査すればいいのか判断しづらい・
func5()

この探索ルートもシーケンス図を作成するときには有効な場合もあり(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション20

処理構造のスペックアウト• 処理構造AA func1(XX,・){・func2();・

AA func2(XX,・){・func4();・

AA func4(XX,・){・func8();・func3();・return;

func5();
・return;

func9();
・
return;}}・AA func8(XX,・){||||||・||||||
・||||||||||||
・U}・・
return;}3

探索ルート：コードリーディングの順番

カメの探索ルートの悪い点
・範囲が狭い (線で捉えている)・目的が変わる・構造を把握できない(C) copyright 派生開発推進協議会

ウサギの探索ルートの良い点
・範囲が広い(面で捉えている)・目的が変わらない
・全体の構造を把握できる

ET2019 スペシャルセッション21

成果物の一例
ウサギの探索ルートで作成した成果物の例(構造図)func1()

func2()

func5()

func4()

func8()

関数の右上に点がある
場合はフローチャート等があることを示す

func9()

グランドマークがない場合は、この関数を調査していないことを示す(C) copyright 派生開発推進協議会

func3()

グランドマークはこの関数内で呼ばれる関数がないことを示す

ET2019 スペシャルセッション

22

状態遷移のスペックアウト• ツールで起こしたフローチャートを見て、イベントに対する動作が理解できますか？

ソースコード(C) copyright 派生開発推進協議会

フローチャート

ET2019 スペシャルセッション23

状態遷移のスペックアウト• どのような「状態」と「イベント」があるか調べる–「状態」と「イベント」はソースコードから抽出
イベントと状態を書き出す

イベントに対する動きを確認するため、ダイアグラムを書く

ソースコード状態遷移表
ダイアグラム関連資料(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション24

状態遷移のスペックアウト• 変更要求にあわせて、状態遷移図、ダイアグラムを変更する

New

新たな状態を追加(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション25

データ構造のスペックアウト• データ構造図、ER図
測定結果

測定結果

電圧
周波数

測定結果
測定日
測定者
測定条件

• 2019年のT19の活動テーマ(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション

26

スペックアウトのやり方
スペックアウトの準備

Step
1

Step
2

関連資料の整理
ソースファイルの整理

スペックアウトとスペックアウト資料の作成
処理構造

Step3
(C) copyright 派生開発推進協議会

状態遷移

データ構造

・・・

スペックアウト資料から仕様を作成
ET2019 スペシャルセッション

27

スペックアウト資料から仕様の作成

スペックアウト資料
状態遷移表
ソースコードダイアグラムUSDM(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション

28

スペックアウトの効果• 設計仕様の理解– ソースコードを調査することで、設計書では漏れていることが多い準正常系や異常系も抽出可能– 現状の設計のままでは問題が発生する可能性に気づくことも⇒リファクタリング、アーキテクチャの再構築• 変更箇所・影響範囲の特定• 設計技術の習得– 派生開発でやみくもにソースを変更してるだけでは身につかないが、スペックアウトで作成する成果物は設計技術そのもの– ソースコードを図にしたときの関係が見えるので設計の落としどころが分かる– 他人のソースコードを読むことで経験を積める(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション

29

まとめ
• スペックアウトは目的と成果物が重要– 目的に応じた成果物を作る– 次の工程のインプットとなる成果物を作る• スペックアウトは、派生開発の現場の混乱をこれ以上広げないための守りの技術
最後にスペックアウト技術を手に入れたら・・・リファクタリングやアーキテクチャの再構築といった次のステップに進むことができるようになります(C) copyright 派生開発推進協議会

ET2019 スペシャルセッション

30