Download pdf - At scope demo

Transcript

ソースコードから設計意図を発掘する

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でアーキテクトらしい仕事ができる

Copyright BACKSLASH DESIGN Co., Ltd.5

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.

リバースモデリングリバースモデリング 資産化資産化 資産運用資産運用

インフラ

①教育 ②指標と計測

洗練化洗練化

③プロセス構築 ④ツール導入

プロダクトライン開発

山田 大介Daisuke YAMADA

[email protected]

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

12 Copyright BACKSLASH DESIGN Co., Ltd.