ソースコードから設計意図を発掘する
CASEツール:AtScopeの紹介
ET2014
2014年11月
ビースラッシュ株式会社
1 Copyright BACKSLASH DESIGN Co., Ltd.
ビースラッシュのサービス
Copyright BACKSLASH DESIGN Co., Ltd.2
ソフトウェア設計力
の現場展開
組織力の強化支援
技術者の育成
設計意図の見える化
ソースコードの資産化
ドキュメントの資産化
ドキュメント診断ソースコード診断
アーキテクト育成
CASEツール
構造化設計セミナー
プロダクトライン工学
アーキテクトを育成し、ソフトウェア資産を活用した、「作らずに作る」開発を実現します
部品化再利用
ビースラッシュが解決したいこと
Copyright BACKSLASH DESIGN Co., Ltd.3
コードを追いかけて動きを理解
grep検索で関連部分を探す
局所的な修正の積み重ね
コードの複雑さが増大する負のスパイラル
設計構造と設計意図を理解
依存線と配置で関連を
追跡
大局を見て勘所を押さ
えた修正
コードがシンプルで美しくなる改善スパイラル
高速
高品質
資産化在庫
残業
バグ
設計力向上セミナー
Copyright BACKSLASH DESIGN Co., Ltd.4
管理者向けセミナー 技術リーダ育成
現場展開トレーニング底上げトレーニング
設計力セミナー
今日から使える
管理者のための3時間コース
ソフトウェア設計マネジメント
レビュー技法
講演会
アーキテクチャ設計実践
資産化モデリング
オブジェクト指向モデリング
SysML図法 組込みモデリング技法
設計図活用
リファクタリング+リバース設計
リバースモデリング
今日から使える
凝集度と結合度
二年目研修:上流工程を学ぶ
ソフトウェア分析設計
今日から使える
ステップアップC言語
要求開発実践
要求分析技法
聴く力と書く力
要求獲得とモデル化
構造化モデリング[静的]
構造化モデリング[動的]
アーキテクト育成
アーキテクチャ設計実践[コード起点]
ミドルウェア設計技法
AtScopeの3つの機能+1
Copyright BACKSLASH DESIGN Co., Ltd.6
力づく開発
func() {・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・}
func() {・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・}
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・}
}
・・・・・() {{
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
}}
func() {・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・
・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・
}}
static char time_tick;
main () {time_tick = 0;while(1){
if(time_tick== 1){
time_tick = 0;
top_module();}
}}
void ta0int() {time_tick = 1;
}
①アーキテクチャ解析
②クラス解析
C言語
③モジュール解析
コンポーネント単位
ファイル単位
関数とデータの単位
再配置
考える開発
To_uiTo_ctrlFrom_ctrlTo_histFrom_sys
<<...app
To_uiTo_ctrlFrom_ctrlTo_histFrom_sys
To_drvTo_mainteTo_app
<<...sys
To_drvTo_mainteTo_app
To_drvFrom_sysTo_uiTo_hist
<<...mainte
To_drvFrom_sysTo_uiTo_hist
From_ctrlFrom_sysFrom_mainteFrom_histFrom_ui
<<...drv
From_ctrlFrom_sysFrom_mainteFrom_histFrom_ui
To_uiTo_drvFrom_appTo_app
<<...ct rl
To_uiTo_drvFrom_appTo_app
From_appFrom_mainteTo_drv
<<...his t
From_appFrom_mainteTo_drv From_appTo_drvFrom_ctrlFrom_mainte
<<...ui
From_appTo_drvFrom_ctrlFrom_mainte
6
8
2
2
4
153
3
3
8
5
3
3 15
PaperHandlingPaperHandling
PatternControlPatternControl
SwInputSwInput
ButtonMonitorButtonMonitor
ToggleDrvToggleDrv
KeyScanKeyScan
CopyAppCopyApp
BlinkAppBlinkApp
MessageOutputMessageOutput
MachineWatchMachineWatch
FusingControlFusingControlDisplayOutputDisplayOutput
OperationPanelOperationPanel
LedOutputLedOutput
LedDrvLedDrv
DisplayDriverDisplayDriver
SystemMainSystemMain
PageStreamPageStream
2
1
1
1
3
2
2
1
11
1
2
2
1
3
1
1
1
1
1
1
1
1
1
1
3
2
app
UserPersonUserPersonDiagnosisStepDiagnosisStep
ReceptionistReceptionist
sys
SysNoticeSysNotice
SysCtrlSysCtrl
mid
InspectionProcessInspectionProcess
drv
TimerTimer
SwSw
VolSensorVolSensor
CurrentMeterCurrentMeter
EepRomEepRom
ui
PushButtonPushButton BuzzerSoundBuzzerSound
PanelDisplayPanelDisplayOperationFlowOperationFlow
NoticePanelNoticePanel
LedLed BuzzerBuzzerLcdLcd
lib
InspectionHistInspectionHist
mon
ProgramConfirmationProgramConfirmation
LcdInspectionLcdInspectionVolInspectionVolInspection
MaintePanelMaintePanel
VolMeterVolMeter
HistInspectionHistInspection
InspectorInspector
2
2
2
1
3
3
13
3
3
3
4
2
2
5
1
3
1
3 2
41
3
3
3
8
5
2
3
1
3
2
7
22
2
2 23
2
2
4
2
1
5
2
1
5
2
3
22
2
main
sc_execsc_exec
rc_initrc_init
ds_finish
rc_finish_diagrc_finish_diag
up_start_inputup_start_input
up_set_weightup_set_height
up_rq_chg_modeup_rq_chg_mode
rc_start_diagrc_start_diag
rc_request
rc_rq_chg_moderc_rq_chg_mode
<<...rcMode
1
1
1
1
1
1
1
11
1
1
1
1
SysCtrl
sc_execsc_exec
main
DiagnosisStep
ds_finish
UserPerson
up_rq_chg_modeup_rq_chg_mode
up_start_inputup_start_input
up_set_weightup_set_height
Receptionist
<<データ>>Receptionist::
rcMode
rc_rq_chg_moderc_rq_chg_mode
rc_start_diagrc_start_diag
rc_initrc_init
rc_finish_diagrc_finish_diag
rc_request
1
1
1
1
1 1
1
11
1
1
1
1
再配置
再配置
再配置することで設計意図が分かります
設計ルール違反が色付きで表示されます
指定したデータから関数コールを遡ります
EnterpriseArchitectで動きます
④リファクタリングスコア
設計意図を発掘する ①アーキテクチャ解析
コンポーネント図やクラス図は、配置を変えることで、設計の意図や設計上の課題が見えてきます。
下の例は、アプリ層・ミドル層・ドライバ層による水平レイヤリングと、システム全体およびUI部の垂直パーティショニングをした例です。
Copyright BACKSLASH DESIGN Co., Ltd.7
To_ui
To_ctrl From_ctrl
To_hist
From_sys
<<component>>app
To_ui
To_ctrl From_ctrl
To_hist
From_sys
To_drv
To_mainte
To_app
<<c...sys
To_drv
To_mainte
To_app
To_drv
From_sys
To_ui
To_hist
<<c...mon
To_drv
From_sys
To_ui
To_histFrom_ctrl
From_sys
From_mainteFrom_hist
From_ui<<component...
drv
From_ctrl
From_sys
From_mainteFrom_hist
From_ui
To_ui
To_drv
From_app To_app
<<component>>ctrl
To_ui
To_drv
From_app To_app
From_app
From_mainte
To_drv
<<c...lib From_app
From_mainte
To_drv
From_app
To_drv
From_ctrl
From_mainte
<<...uiFrom_app
To_drv
From_ctrl
From_mainte
68
2
2
4
15
3
3
3
8
5
3
3
15
To_uiTo_ctrlFrom_ctrlTo_histFrom_sys
<<...app
To_uiTo_ctrlFrom_ctrlTo_histFrom_sys
To_drvTo_mainteTo_app
<<...sys
To_drvTo_mainteTo_app
To_drvFrom_sysTo_uiTo_hist
<<...mainte
To_drvFrom_sysTo_uiTo_hist
From_ctrlFrom_sysFrom_mainteFrom_histFrom_ui
<<...drv
From_ctrlFrom_sysFrom_mainteFrom_histFrom_ui
To_uiTo_drvFrom_appTo_app
<<...ct rl
To_uiTo_drvFrom_appTo_app
From_appFrom_mainteTo_drv
<<...hist
From_appFrom_mainteTo_drv From_appTo_drvFrom_ctrlFrom_mainte
<<...ui
From_appTo_drvFrom_ctrlFrom_mainte
6
8
2
2
4
153
3
3
8
5
3
3 15
再配置
循環
階層を飛び越えた依存はない
設計意図を発掘する ②クラス解析
ファイル単位の入出力を図面化します
●印が、ひとつのファイルになります
赤線が双方向依存、色付きの●が大きなファイル、を示しており、それぞれリファクタリング候補になります
再配置することで、設計の意図が浮き上がります
8
PaperHandlingPaperHandling
PatternControlPatternControl
SwInputSwInput
ButtonMonitorButtonMonitor
ToggleDrvToggleDrv
KeyScanKeyScan
CopyAppCopyApp
BlinkAppBlinkApp
MessageOutputMessageOutput
MachineWatchMachineWatch
FusingControlFusingControlDisplayOutputDisplayOutput
OperationPanelOperationPanel
LedOutputLedOutput
LedDrvLedDrv
DisplayDriverDisplayDriver
SystemMainSystemMain
PageStreamPageStream
2
1
1
1
3
2
2
1
11
1
2
2
1
3
1
1
1
1
1
1
1
1
1
1
3
2再配置
app
UserPersonUserPersonDiagnosisStepDiagnosisStep
ReceptionistReceptionist
sys
SysNoticeSysNotice
SysCtrlSysCtrl
mid
InspectionProcessInspectionProcess
drv
TimerTimer
SwSw
VolSensorVolSensor
CurrentMeterCurrentMeter
EepRomEepRom
ui
PushButtonPushButton BuzzerSoundBuzzerSound
PanelDisplayPanelDisplayOperationFlowOperationFlow
NoticePanelNoticePanel
LedLed BuzzerBuzzerLcdLcd
lib
InspectionHistInspectionHist
mon
ProgramConfirmationProgramConfirmation
LcdInspectionLcdInspectionVolInspectionVolInspection
MaintePanelMaintePanel
VolMeterVolMeter
HistInspectionHistInspection
InspectorInspector
2
2
2
1
3
3
13
3
3
3
4
2
2
5
1
3
1
3 2
41
3
3
3
8
5
2
3
1
3
2
7
22
2
2 23
2
2
4
2
1
5
2
1
5
2
3
22
2
SysCtrl
sc_execsc_exec
main
DiagnosisStep
ds_finish
UserPerson
up_rq_chg_modeup_rq_chg_mode
up_start_inputup_start_input
up_set_weightup_set_height
Receptionist
<<データ>>Receptionist::
rcMode
rc_rq_chg_moderc_rq_chg_mode
rc_start_diagrc_start_diag
rc_initrc_init
rc_finish_diagrc_finish_diag
rc_request
1
1
1
1
1 1
1
11
1
1
1
1
設計意図を発掘する ③モジュール解析
変数を指定して、そのアクセスを遡ります
変数のカプセル化の状況と異なるスレッドからの衝突が見えてきます
Copyright BACKSLASH DESIGN Co., Ltd.9
このデータへのアクセス構造
●の色はコンポーネント単位であり、複数の色からアクセスされている場合は、カプセル化が不完全。
main
sc_execsc_exec
rc_initrc_init
ds_finish
rc_finish_diagrc_finish_diag
up_start_inputup_start_input
up_set_weightup_set_height
up_rq_chg_modeup_rq_chg_mode
rc_start_diagrc_start_diag
rc_request
rc_rq_chg_moderc_rq_chg_mode
<<...rcMode
1
1
1
1
1
1
1
11
1
1
1
1
再配置
ひし形はデータアクセスの起点であり、複数の起点がある場合は、データの排他制御の設計が必要。
④リファクタリングスコア
ソースコードを構造的な視点で点数化を行います
場当たり的なコード変更ではスコアは下がり続けます
「リファクタリング」や「変更時の構造設計」を行うことで、スコアを維持・向上させることができます
Copyright BACKSLASH DESIGN Co., Ltd.10
<<警告リスト>>
/* ファンアウト */
17 : InspectionProcess.c
14 : DiagnosisStep.c
14 : EepRom.c
13 : Lcd.c
12 : Inspector.c
/* 循環依存 */
2 : InspectionProcess 8 : CurrentMeter
3 : InspectionProcess 3 : DiagnosisStep
1 : Receptionist 3 : DiagnosisStep
2 : UserPerson 1 : Receptionist
<<日付>>
2014年04月12日 11時59分11秒
実施ディレクトリ:C:\Users\PC-USER\Desktop
\01_TaiSosei
<<スコア>>89
アドホックな変更の積み重ね
リファクタリングや
変更時の構造設計の実施
スコア スコア
ご参考:ソフトウェアの資産化アプローチ
既存資産を起点として戦略的な開発の実現へ ボトムアップ:既存コードを部品化して、洗練化・資産化していく
トップダウン:設計意図を明確にして、ソースコードへ反映していく
既存コード
部品表
設計図設計図
開発戦略アーキテクチャ
ドキュメントアーキテクチャ
ドキュメント 資産開発
機種開発
部品化
変動点
設計方針目論見
統合資産
部品マスター
洗練化
合わせこみ
既存コード
既存コード
資産活用
11 Copyright BACKSLASH DESIGN Co., Ltd.
リバースモデリングリバースモデリング 資産化資産化 資産運用資産運用
インフラ
①教育 ②指標と計測
洗練化洗練化
③プロセス構築 ④ツール導入
プロダクトライン開発