オフショアコードの見オフショアコードの見える化事例
える化事例～アーキテクチャ分析支援
アーキテクチャ分析支援ツールを分析支援ツールを使ツールを使って、って、言葉の言葉の壁を乗り越える～
える～

2010年
2010年 1月28日
28日
ビースラッシュ(ビースラッシュ(株) 酒井郁子
※ 本事例は
本事例は、組込みプレス
組込みプレス次号
みプレス次号(Vol.18)にも(Vol.18)にも、掲載予定です。にも、掲載予定ですです。
Copyright BACKSLASH DESIGN Co.,Ltd.

オフショア開発
オフショア開発で開発で、こんな問題こんな問題に直面したことはないですか？
問題に直面したことはないですかしたことはないですか？
コミュニケーションが取りにくい仕様のとり違い、変更の説明が困難
品質要求に対する、認識の違い

品質確保は、最後の最後になる
ブラックボックスによる、システムテスト
委託先の提出する、動作確認書予定外の手戻り工数増加
開発スケジュールの遅延に問題が発覚すると再びシステムテストは待ちにテストの遅延が、そのままリリースの遅れに・・・

開発は、委託先の信頼任せコストの妥当性は・・・
開発期間、工数の妥当性が判断ができない

将来的な保守も、委託先頼りに・・・
出荷後の問題も、解析できない
修正・変更があっても、手を入れられない

委託先の依存度合が増すばかりに成果物は暗黙状態
ソフトウェア資産価値が上げられない2

Copyright BACKSLASH DESIGN Co.,Ltd.

オフショア開発
オフショア開発の開発の例
ライフサイクル分担型開発
最終品質は
最終品質は委託元の委託元の責任

派生・再利用商品企画

仕様出しは仕様出しは委託元の委託元の責任

運用・運用・保守
システム
テスト

要求分析
アーキテク
チャ設計

設計品質も設計品質も、委託先任せ
委託先任せ

発注元で管理している
領域

結合／機能
テスト

委託先にお任せ
領域

単体テスト

詳細設計
実装

委託元工数の推移

成果物品質に成果物品質に依存して依存して増大して増大

不具合対策の不具合対策の都度解析工数が都度解析工数がテスト
実施
仕様作成

リリース

3
Copyright BACKSLASH DESIGN Co.,Ltd.

オフショア開発
オフショア開発の開発の問題点
外部委託の外部委託の課題 （委託先：委託先：海外企業）
海外企業）

出典：
経済産業省
2009年版組込みソフトウェア産業実態調査＜経営者および事業責任者向け調査＞

Copyright BACKSLASH DESIGN Co.,Ltd.

日本の日本の課題意識と課題意識と、他国の他国の課題意識
日本企業が日本企業が考える、える、組み込みソフトウェア開発
みソフトウェア開発の開発の課題

海外企業が海外企業が考える、える、組み込みソフトウェア開発
みソフトウェア開発の開発の課題

出典：
経済産業省
2009年版組込みソフトウェア産業実態調査＜経営者および事業責任者向け調査＞＜海外調査＞※ 欧州には、ロシアも含まれる※ 韓国・台湾・東南アジア の回答は、日本企業の傾向に酷似しているため、グラフには載せていない

Copyright BACKSLASH DESIGN Co.,Ltd.

6
Copyright BACKSLASH DESIGN Co.,Ltd.

設計を設計を把握し把握し、委託先任せからの委託先任せからの脱出
せからの脱出を脱出を！
案：
提ご

ソフトウェアの静的構造
ソフトウェアの静的構造を静的構造を可視化⇒ 委託元で委託元で検収作業を検収作業を計画的に計画的に進める

施策１
アーキテクチャの把握できるドキュメントを作成する⇒ 納品物の可視化により、検収量を見える化する
内部構造を把握して、テスト対象範囲を見える化する

施策２
静的解析ツール
静的解析ツール導入
ツール導入により、可視化にかかる工数削減
導入⇒ ツールで時間のかかる作業を削減 ・・・ 解析漏れの防止
ドキュメント化
レビュー
コード解析

解析ツール
解析ツール
導入

ドキュメント化
レビュー
解析結果解釈ツールによる解析支援

7
Copyright BACKSLASH DESIGN Co.,Ltd.

Software静的解析ツール
静的解析ツールなど…
いろいろなツールがある
Copyright BACKSLASH DESIGN Co.,Ltd.

C++言語静的解析ツール
言語静的解析ツール QA C++

Copyright BACKSLASH DESIGN Co.,Ltd.

アーキテクチャ分析支援
アーキテクチャ分析支援ツール
分析支援ツール Structure101【特長】
特長】
アーキテクチャダイヤグラムをアーキテクチャダイヤグラムを用アーキテクチャダイヤグラムを用いた設計要素
いた設計要素の設計要素のグループ化
グループ化と設計構造の設計構造の可視化
ＤＳＭ
ＤＳＭをＤＳＭを用いた設計要素
いた設計要素のグループ設計要素のグループ化のグループ化と設計構造の設計構造の可視化
依存関係図
依存関係図を
依存関係図を用いた設計要素
いた設計要素のグループ
設計要素のグループ化のグループ化と設計構造の設計構造の可視化
相互依存
相互依存と相互依存と経路の経路の数、依存の依存の数を用いて構造上いて構造上の構造上の複雑さを複雑さを検出
さを検出（
検出（XS値
XS値）
一定期間毎
一定期間毎にデータをリポジトリに一定期間毎にデータをリポジトリに保存にデータをリポジトリに保存し保存し、全体のコードサイズや全体のコードサイズやXSのコードサイズやXS値
XS値の遷移を遷移を表示
予
予め定義したアーキテクチャの定義したアーキテクチャの設計図
したアーキテクチャの設計図と設計図と実コードとの整合性
コードとの整合性を整合性を確認

10
Copyright BACKSLASH DESIGN Co.,Ltd.

解析手順の解析手順の紹介

11
Copyright BACKSLASH DESIGN Co.,Ltd.

12
Copyright BACKSLASH DESIGN Co.,Ltd.

ソース・ヘッダーのパッケージ化
ソース・ヘッダーのパッケージ化*.hのマージ例のマージ例
対となる関係が隠され他ファイルとの依存関係が明確になる*.cと*.hがマージされた（青矢印マークがマージを表す）

13
Copyright BACKSLASH DESIGN Co.,Ltd.

ありのまま(実装)構造の構造の把握

開発環境の実装分割そのままに階層関係を表示

自動解析

アーキテクチャ・ダイアグラム：
実装階層と、フォルダ間の依存関係からレイヤ構造化してみせる
14
Copyright BACKSLASH DESIGN Co.,Ltd.

管理単位から管理単位から、から、設計時の設計時の意図推察

部品の特徴・概略を示す

15

15Copyright BACKSLASH DESIGN Co.,Ltd.

解析第2ステップ：
ステップ：依存関係の依存関係の分析

ツール設定
ツール設定により設定により依存関係種別により依存関係種別を依存関係種別を絞って、って、効率よく効率よく調査
よく調査を調査を！

16
Copyright BACKSLASH DESIGN Co.,Ltd.

例：クラス継承関係
クラス継承関係の継承関係の分析
フォルダ間
フォルダ間の継承関係
分析範囲をドリルダウン
フォルダ内
フォルダ内
ファイル間
ファイル間の継承関係

ファイル内
ファイル内の継承関係
クラス継承関係
クラス継承関係から継承関係から同種の同種の役割を役割を担うファイルグループをまとめてゆく
17
Copyright BACKSLASH DESIGN Co.,Ltd.

ツールを活用
ツールを活用して活用して、して、分析作業を分析作業を効率化
クラスグループの固クラスグループの固まり実装時の実装時の分散具合を分散具合を調査

コードから、コードから、基底クラス基底クラス定義の定義の詳細を詳細を理解

Structure101 でクラス継承クラス継承に継承に的を絞った
現状を現状を表示させる
表示させる
調査・調査・分析結果をクラス
分析結果をクラス図をクラス図で整理
SW仕様書中SW仕様書中から仕様書中から、から、そのクラスの役割そのクラスの役割を役割を考えてみる

cla s s C la s s 継承

開発元
担当者

F a ult E v ent

Ala rmE v e nt

具体的な具体的な不明点を不明点を開発元に開発元に質問

C lea rE v ent

Input E v e nt

Out put E v ent

Unit E v ent

Loca lE v ent++++G loba l E v ent

GetMessage() : void
GetTime() : void
SetTime() : void
BroadcastMsg() : void++++GetMessage() : void
GetTime() : void
SetTime() : void
BroadcastMsg() : voidE v ent

ポイントを回答
ポイントを回答#-myTime: int
myDistribute: int++++GetMessage() : void
GetTime() : void
SetTime() : void
BroadcastMsg() : void

解読事項を解読事項を記録
18

Copyright BACKSLASH DESIGN Co.,Ltd.

ステップ３
ステップ３：設計意図に設計意図に基づく再構築づく再構築

第２ステップの分析結果

第３ステップで新たに考察

19
Copyright BACKSLASH DESIGN Co.,Ltd.

実装構造から実装構造から意図から意図を意図を推察

設計図
・機能構造図・Class図
etc.

フォルダ間依存関係図

設計者

設計資料

設計段階で決められたアーキテクチャ（ソフトウェア構造）

乖離が乖離が生じる
実装者

フォルダごと、(ファイルごと)の役割を推察

コーディングされたソフトウェア構造プログラムコード20
Copyright BACKSLASH DESIGN Co.,Ltd.

２．解析手順の紹介

分析結果を分析結果を組み立てる

自動で自動で作成した
作成した
アーキテクチャダイアグラム

分析結果をアーキテクチャ
分析結果をアーキテクチャダイアグラムで表現
ダイアグラムで表現

コードの依存関係
コードの依存関係に依存関係に応じて上下／上下／横並びのセル横並びのセル（＝びのセル（＝File)（＝File)配置File)配置される
配置される

実装状態そのままに実装状態そのままに、そのままに、ファイルはフォルダでグルーピング

役割により役割により、により、グルーピングし名称(名称(および色付および色付け色付け)で特徴を特徴を明確化

他のグループとの関係のグループとの関係を関係を表す
適切な適切な位置に位置に、移動する
移動する21
Copyright BACKSLASH DESIGN Co.,Ltd.

分析結果を分析結果を組み立てる(続き)抽象・抽象・具象クラスの具象クラスの分担
クラスの分担など分担など階層関係があれば階層関係があれば、があれば、セルの配置セルの配置で配置で階層を階層を示す

グルーピングしたセルには解読した
解読した役割名
した役割名を役割名を書く
同種の役割を担う
ファイルグループは同じセルにラッピング
同階層（横並び）のクラス関係は役割分担を考察して配置別途クラス図等のモデル等を作成する

共通処理部を共通処理部を下位層へ・・・下位層へ・・・

22
Copyright BACKSLASH DESIGN Co.,Ltd.

再構成した再構成した構造した構造で構造で、依存関係確認再構築した再構築した構造した構造で構造で、コードの配置コードの配置を配置を変更する変更する

Transformation機能により機能によりアーキテクチャダイアグラムと同アーキテクチャダイアグラムと同じフォルダ分割
フォルダ分割を分割を仮想的につくることで仮想的につくることで設計意図による設計意図による依存関係による依存関係を依存関係を＝可視化することができる可視化することができる

設計構造の設計構造の崩れを顕在化させる
23

Copyright BACKSLASH DESIGN Co.,Ltd.

開発元との開発元との対応との対応の対応の変化
ｘｘｘｘｘ…
(頭に入っている情報をとりあえず伝える)

委託元
担当者

要求仕様ベースの質問

なんとなく理解したかも口頭による回答
開発者
時々メモ書き付き要求仕様ベースの質問
わからない点はそれですか

この仕様の実装状況は…

口頭による回答

この辺の事を言っているのか
claclassss C
Cllas
asss継継承承FFauaultltEEvveent
nt

Ala
Alarm
rmEEvven
entt

CC le
learE
arEvven
entt

IInp
nput
ut EEveventnt

OuOuttpuputtEEvven
entt

Un
UnititEEvveent
nt

不明点を再質問

Loc
LocaalE
lEve
venntt++++G
GloblobaalElEvven
entt

GetMessage() : void
GetTime() : void
SetTime() : void
BroadcastMsg() : void++++GetMessage() : void
GetTime() : void
SetTime() : void
BroadcastMsg() : void

EEvvenentt

それならば、参考になるものがある！

#-

myTime: int
myDistribute: int++++GetMessage() : void
GetTime() : void
SetTime() : void
BroadcastMsg() : voidより具体的な回答
ポイントを突いた資料提供
24
Copyright BACKSLASH DESIGN Co.,Ltd.

リバースモデル活用
リバースモデル活用１
活用１：設計品質の設計品質の確認

Check
要求分析

Check
要求分析

Check

Check

アーキテクチャ設計
詳細設計

アーキテクチャ設計
単体テスト

実装

CodeのCodeのDiffで確認

詳細設計

単体テスト

実装

詳細設計
実装

結合／機能テスト
単体テスト

アーキテクチャ設計
詳細設計

単体テスト

詳細設計

実装

全体を全体を通して、して、アーキテクチャ設計思想は設計思想は保たれているのか確認できていますか確認できていますか？
できていますか？

Copyright BACKSLASH DESIGN Co.,Ltd.

設計品質は
設計品質は、モデルでCheck！
新バージョン

前バージョン

前のバージョンから変更のバージョンから変更があった
変更があった箇所があった箇所
ツールが色ツールが色を変えて表示
えて表示

設計意図に設計意図に反した変更
した変更 ＝設計の設計の崩れをダイアグラム上ダイアグラム上で Check！
設計品質の設計品質の維持を維持を、開発元任せにしない開発元任せにしない

怪しい箇所
しい箇所から箇所から、から、詳細確認

委託元で委託元で管理、管理、積極的なア
積極的なア
プローチで品質確保
プローチで品質確保を品質確保を！！

26
Copyright BACKSLASH DESIGN Co.,Ltd.

リバースモデル活用
リバースモデル活用２
活用２：計画的なテストの計画的なテストの実施
なテストの実施
不具合が発生cla
classss EE BL
BL80008000TiTickck回
回りり____解析
解析結果
結果
Pool

EBL8000Loop

委託元
担当者

Deviation
NMAST系統：Pool＝ １：１

fw::
fw::Loop
Loop

NMAST系統別管理

SetPool(),
GetPool()

ObserverSupervisedUnit
TickedUnit
TimedObject
cla
classsslilib::Eb::E BL8000Loop
BL8000Loop-myLoop

LoopUnit#myLoop#myPool

デバイス毎 動作制御・管理(Max256 Unit保持)#myPool-myCurrentState-myLastPolledUnit1

fw::Loca
fw::LocalF
lFaault
ult Dev
Devia
iattiionon

TickedUnit
TimedObject
clclaass
ssllib::ib::EBLPool
EBLPoolfw::
fw::FFaault
ultDevi
Deviaattion
ion-myFaults

fw::
fw::LoopUnit
LoopUnit-myLastPolledUnit2

claclasssl
slib::ib::
EE BL8000LoopS
BL8000LoopSttaattee#myPool

SetPool(),
Append()-myUnits

ViewableObject
fw::
fw::Dev
Devia
iattiionon

ExtendedObservedObject
fw:
fw::P:Poolool-myPool-myFirePool-myPool-myPool#myLoopUnit#myLoopUnit

Execute()cla
classsl
slib::
ib::
EBL8000LoopSt at
at e__Norma
EBL8000LoopSt
e__NormalS
lSttaattee

clclaass
ssllib::ib::
RReal
ealLoopUni
LoopUnitt

AlarmDeviation
FF:::F:FiireAla
reAlarmDev
rmDevia
iattiionon

ItItemCemClalassss:cla:classss

Insert(),Remove()-myNormalState#myState

PoolIterator
cla
classsslilib:b:::
EBLPoolIteraerattoror
EBLPoolIt

fw:
fw::IOR:IORepl
eplyy

fw::LoopUnit
fw::LoopUnit FFaaul
ulttDev
Deviiat
at ionion#myState<<enumeration>>
fw::
fw::FFaaul
ulttDev
Deviiat
at ion__St
ion__Staattee

claclasssslilib:b:::
FFRR7Det
7Detect
ectorLoopUnitorLoopUnit
IO8000Loop

IOFactory
clclasasssllib::
ib::IO8000F
IO8000Faact
ctory
ory

#myIOLoop

fw:
fw::IOVal:IOValueRepl
ueReplyy

fw::
fw::IOLoop
IOLoopEventclaclasssslib:
lib:::
Hea
HeattDet
Det ect
ect or60Deg
or60DegLoopUni
LoopUnitt-myLoop3-myLoop2-myLoop1-myLoop0

開発者に原因・修正箇所を問い合わせる-myGasLeak

GetTechnicalNumber(),
GetDeviceTypeBits(), etc.

ViewableObject
fw::
fw::Ev
Event
ent

GetPool()

fw::G
fw::GllobaoballEv
Eventent

fw::
fw::FFaaultultEE vventent

clclaass
ssllib::ib::
IO8000Loop
IO8000Loop-myGasFault
Point-myNMAST1RelayOff -myFTR-myATR

InputPoint
fw::F
fw::F aaul
ulttPoi
Point
nt

BlockableObject
InputPoint
fw:
fw::Al:AlarmPoi
armPointnt

fw::
fw::Real
RealLoopUni
LoopUnittFFaault
ult Ev
Event
ent

fw::
fw::AlaAlarmPointrmPoint Ev
Eventent

IOOut
cla
classsslilib::IO8000Out
b::IO8000Out
fw:
fw::R:Rea
eallFFaault
ultPPoiointnt-myfZoneInterfaceDelayInProgressState

TimedObject
clclaass
ssllib::ib::
Rea
RealAlalAlarmPointrmPoint#myState

clclaass
ssllib::ib::
Real
RealAlAlarmPoi
armPoint
nt __St__Staattee

SubstitutePoolEvent
fw::
fw::Rea
RealLoopUni
lLoopUnittFF aul
aulttAct
Actiivvat
at eEveEventent

RemoveAndInsertPoolEvent
fw::AlaAlarmPointrmPointFF ireEv
ireEvent
ent
fw::

TimedObject
fw:
fw::Del:DelaayedF
yedFaault
ult Point
Point#myDetectorPointcla
classsslib:
lib:::
Det ect
ect orP
DetorPoint
oint

RemovePoolEvent
fw:
fw::Rea:RealLoopUnit
lLoopUnit FFaaul
ulttDeAct
DeAct iv
ivaatteEv
eEventent-theFireStatecla
classsslilib:
b:::
RRea
eallAlaAlarmPointrmPoint __F__F ireSt
ireStaatt eeclclaassssllib::ib::
LoopUnittFFaault
ult Point
LoopUni
Point-myInstance-theWaitingDelayState
clclasasssllib::
ib::Rea
RealAllAlarmPoi
armPoint
nt __Wa__Waiitting
ingDelDelayaySt
St aattee#myNoReplyLoopUnitFaultPoint#myWrongTypeOfSensorFaultPoint-myInstance#myGeneralSensorLoopUnitFaultPoint-theNormalStatecla
classsslilib::b::
RRea
eallAlaAlarmPointrmPoint__Norma__NormalS
lSttaattee

claclasssslib:
lib:::
Rea
RealLoopUnit
lLoopUnit FFaault
ultPPoiointnt-myInstance

ZoneInterface()

設計情報とリバースモデルで、変更箇所を理解する

変更箇所の変更箇所の影響範囲を影響範囲を調べてテストの準備
テストの準備を準備を！！
Copyright BACKSLASH DESIGN Co.,Ltd.

影響範囲は
影響範囲は、ツールで調ツールで調べる

依存関係を依存関係を持つ箇所を箇所を一覧表示

このクラスに修正
このクラスに修正が修正が発生！
発生！

変更箇所に変更箇所に依存しているメソッドに依存しているメソッドに依存する
依存する箇所する箇所を箇所を遡る
影響範囲の影響範囲の調査で調査で抜け漏れを無れを無くす！
くす！
28
Copyright BACKSLASH DESIGN Co.,Ltd.

オフショア開発
オフショア開発に開発に“壁”はつきものコミュニケーションが取りにくい仕様のとり違い、変更の説明が困難
品質要求に対する、認識の違い

品質確保は、最後の最後になる開発元の開発元の出方を出方を待って対応って対応していては、していては、“言葉の言葉の壁”は越えられません

ブラックボックスによる、システムテスト
委託先の提出する、動作確認書

開発は、委託先の信頼任せコストの妥当性は・・・
開発期間、工数の妥当性が判断ができない

待ち受け体制から体制から、から、積極的に積極的に働きかける体制
きかける体制に体制に転換

将来的な保守も、委託先頼りに・・・
出荷後の問題も、解析できない
修正・変更があっても、手を入れられない本事例で本事例で紹介した紹介した静的解析
した静的解析による静的解析による可視化
による可視化は可視化は、積極的なアプローチをするための積極的なアプローチをするための、なアプローチをするための、一つの道具つの道具になります
道具になります。になります。

29
Copyright BACKSLASH DESIGN Co.,Ltd.

ご清聴ありがとうございました
清聴ありがとうございました。
ありがとうございました。

JaSST’
JaSST’10

東陽テクニカ・テクニカルセッション
東陽テクニカ・テクニカルセッション

アーキテクチャ分析
アーキテクチャ分析ツール
分析ツールStructure101
ツールStructure101による
Structure101によるオフショアプログラム解析事例
オフショアプログラム解析事例
30
Copyright BACKSLASH DESIGN Co.,Ltd.