2012/05/23 au talk - 讓事情發生

52
Software Engineering A Practical Approach Luba Tang 2010/4/6

Upload: appuniverz

Post on 14-May-2015

1.732 views

Category:

Documents


0 download

DESCRIPTION

講者Luba Tang是來自聯發科的軟體架構師。在此次的AU Talk,他與聽眾們分享他軟體的開發經驗,以實務的角度出發,告訴我們要如何有效率、有次序地開發一個軟體。軟體是集眾人的智慧,一起做出有用的東西,成就有用的人。軟體的生產要素是人。人是有情緒的,不完美的,有缺陷的。如何集眾人之力,讓事情發生,可以說是開發軟體時真正的挑戰。

TRANSCRIPT

Page 1: 2012/05/23 AU Talk - 讓事情發生

Software EngineeringA Practical Approach

Luba Tang2010/4/6

Page 2: 2012/05/23 AU Talk - 讓事情發生

Outline

• 軟體工程的重要性• 實務上的進行方法

Luba Tang ( 唐文力 )Senior Engineer in CTO/CIT, MediaTek

HW/SW Co-Simulation, Embedded Compiler

Page 3: 2012/05/23 AU Talk - 讓事情發生

SW is more costly than HW

In recent 5 years, software is 3 times costly than hardware

Software aspects of IC design can now account for 80% or more of embedded systems development cost

Page 4: 2012/05/23 AU Talk - 讓事情發生

Embedded System Suffers from Design Gap

Page 5: 2012/05/23 AU Talk - 讓事情發生

Challenges in Modern Embedded Software

Implement a large, various and variant embedded system Shrinking time-to-market for short life cycle of a product

• 10~15 months for releasing• 6~12 months for being on the shelf

Changing requirement• x2 new devices per 10 months

Coordinate with more than 6 teams coming from different backgrounds

Heavy workload• 250 K Line of code for self product• 1M Line of code in total system

High reliability

Page 6: 2012/05/23 AU Talk - 讓事情發生

Everything about DESIGN becomes important

Esp. Software Engineering

Page 7: 2012/05/23 AU Talk - 讓事情發生

我的軟體開發流程

對我而言是真實的 我不研究軟體工程 自己用過也教過,經過實驗與取捨

混合多種性質 不是最快的

曾有學弟改變流程,在更短時間內做完更多的事

Page 8: 2012/05/23 AU Talk - 讓事情發生

軟體開發的過程

挑對手 – 在專案開始之前– 組織行為– 專案時間表– 人力配置

初手 – 規格與設計– 組織與工作規劃– 需求分析– 架構設計

中盤策略 – 撰碼與測試– Unit-test 的策略– Dependency Checking– Revision control

末盤策略 – 交貨拿錢– Software versioning– Release engineering

Page 9: 2012/05/23 AU Talk - 讓事情發生

軟體開發機構的成長過程

渾然不知 (Oblivious)– 我們都不知道我們正尋着一個過程做事

變化無常 (Variable)– 我們全憑當時的感覺做事– 超級程式設計師的形象

照章行事 (Routine)– 我們凡事皆依造工作慣例,除非我們陷入

恐慌– 超級技術負責人的形象

把穩方向 (Steering)– 我們會選擇結果較好的工作慣例來行事– 有能力的經理

防範未然 (Anticipating)– 我們會參造過往的經驗制定出一套工作慣

例 全面關照 (Congruent)

– 人人時時刻刻都會參與改善工作問題的要求

客戶的要求

低低

P0

P1

P2

P3

P4

P5

Page 10: 2012/05/23 AU Talk - 讓事情發生

模式一:變化無常型

仰賴超級程式設計師– 不同程式設計師的能力可達20:1 甚至更高的差別– 問題的複雜度往往呈現指數成長,就專案成功的機率而言,超級程式設計師並

非決定性的關鍵 模式

– 『告訴我們你想要的是什麼(而且不要改變你的心意)』– 『提供我們一些資源(而且只要開口,你就會不停地提供)』– 『不要再來煩我們(消除所有隨機事件發生的可能性)』

軟體開發系統

需求

隨機事件

資源

其它輸出

軟體

Page 11: 2012/05/23 AU Talk - 讓事情發生

模式二:造章行事型

仰賴超級技術負責人– 問題複雜度過高,承認超級程式設計師並非決定性的關鍵– 控制者還無法直接取得開發系統內部狀態

模式– 『我將會使那些程式設計師,管他張三李四,皆能善盡責任』– 『我會僱用交大的學生,訓練他們變聰明』– 『我會開除清大的學生,讓其他人工作更賣力』

軟體開發系統

需求 (改變)

隨機事件

資源

其它輸出

軟體

控制者改變

Page 12: 2012/05/23 AU Talk - 讓事情發生

模式三:把穩方向型

模型– 預期狀態的樣貌– 觀察實際的能力– 比較預期與實際差異的能力– 對系統採取行動,使得實際狀況更接近預期的能力

軟體開發系統

需求

隨機事件

資源

其它輸出

軟體

控制者改變

需求

Page 13: 2012/05/23 AU Talk - 讓事情發生

挑選適合的開發模式

模式沒有對與錯– 就相同的問題而言,上述模

式的成功機率其實大同小異 針對客戶與問題的要求來

選擇模式,而非由資源來選擇模式

不計資源的話,永遠可以以集成法來進行

問題的要求

客戶的要求

低低

P0

P1

P2

P3

P4

P5

Page 14: 2012/05/23 AU Talk - 讓事情發生

專案開發的時間表 (1/2)

需求 設計 撰碼 測試

總時間通常 10~12 個月必須第一次 release

個別時間

3/5~2/3 的時間6 個月

1/10~1/6 的時間1 個月

1/3~1/4 的時間2.5 個月

預留1/10 的時間1 個月

Page 15: 2012/05/23 AU Talk - 讓事情發生

專案開發的時間表 (2/2)

總時間第二次 release 之後,每隔 N 週要 release 一次

• Linux kernel 中, N=8~12

個別時間

Release 1 Release 2 Release 3 Release 4

24hours

24hours

24hours

24hours

依專案慣性4~8週

Page 16: 2012/05/23 AU Talk - 讓事情發生

專案開發的人力需求

總人力通常每 10K 需要 2~3 個人

個別人力

需求 設計

撰碼 測試

通常 1~3 人 依子專案個數約莫 3~5 人

依獨立元件個數從 5~30 人都可能

維護

和設計人數相仿

閒置人力 ?建立開發環境讀相關規格

Page 17: 2012/05/23 AU Talk - 讓事情發生

軟體開發的過程

挑對手 – 在專案開始之前– 組織行為– 專案時間表– 人力配置

初手 – 規格與設計– 組織與工作規劃– 需求分析– 架構設計

中盤策略 – 撰碼與測試– Unit-test 的策略– Dependency Checking– Revision control

末盤策略 – 交貨拿錢– Software versioning– Release engineering

Page 18: 2012/05/23 AU Talk - 讓事情發生

初手 – 撰寫規格書

不要產生沒必要的文件 如果溝通會耗掉某些人大部分的時間,就必須撰寫規格書

負責溝通的人,寫對應的章節

規格書中的章節1. Project Vision 2. Organization3. Requirement4. Basic Design5. Milestone Design

Page 19: 2012/05/23 AU Talk - 讓事情發生

Project Vision

內容– 我們要做甚麼 ?– 為什麼要做這件事 ?– 投資報酬– 失敗風險

例子– 將 simulation instruction 相關資訊放入 SQL 資料庫中,以利下列操作1. 方便閱讀 simulation instruction 內容2. 自動生成 simulation instruction 的 header 與

implementation files3. 方便修改、新增 simulation instruction 的內容

Page 20: 2012/05/23 AU Talk - 讓事情發生

人力組織 – Marlin Hills’ programming team

優點 : 結構完整、歷經二十多年考驗 缺點 : 人員流動風險高、人員幅度較大 可考慮以Mills Chief Programmer Team 為基礎,將多

個工作集中到少數人身上

Page 21: 2012/05/23 AU Talk - 讓事情發生

Example

Page 22: 2012/05/23 AU Talk - 讓事情發生

Pair Programming

優點– 降低溝通成本– 自然導入 unit test– 減少 trivial fault– 提升 programmer素質– 不需要額外的 peer review

執行方法– 每個人是 code owner ,同時也是他人的 code tester– 兩人為一組,每 1~2週輪換一次

在實驗室當中, pair programming 的效率比single programming 高

Page 23: 2012/05/23 AU Talk - 讓事情發生

軟體開發的過程

挑對手 – 在專案開始之前– 組織行為– 專案時間表– 人力配置

初手 – 規格與設計– 組織與工作規劃– 需求分析– 架構設計

中盤策略 – 撰碼與測試– Unit-test 的策略– Dependency Checking– Revision control

末盤策略 – 交貨拿錢– Software versioning– Release engineering

Page 24: 2012/05/23 AU Talk - 讓事情發生

需求分析

使用情境設定 (必要 )–畫圖,然後說故事

使用者與事件列表 ( 非必要 )–列出使用情境中的所有

• 主詞 => 物件• 動詞 => 函式或關係• 形容詞 /副詞 => 參數• 受詞 => 參數

Page 25: 2012/05/23 AU Talk - 讓事情發生

UML Scenario

Page 26: 2012/05/23 AU Talk - 讓事情發生

簡單的情境設定的例子 – 看圖說故事

學生

作業

報告

程式

勞動

作業

林教授

可能是是

可能是

可能是

Page 27: 2012/05/23 AU Talk - 讓事情發生

說故事的重點

優秀的工程師,就是懂得溝通的工程師 溝通系統中四大關係1. 生成2. 繼承3. 使用4. 毀滅

學生

作業

報告

程式

勞動

作業

林教授

可能是是

可能是

可能是

Be 動詞繼承關係

一般動詞使用關係

需求分析重點就是在搞清楚四大關係

Page 28: 2012/05/23 AU Talk - 讓事情發生

軟體開發的過程

挑對手 – 在專案開始之前– 組織行為– 專案時間表– 人力配置

初手 – 規格與設計– 組織與工作規劃– 需求分析– 架構設計

中盤策略 – 撰碼與測試– Unit-test 的策略– Dependency Checking– Revision control

末盤策略 – 交貨拿錢– Software versioning– Release engineering

Page 29: 2012/05/23 AU Talk - 讓事情發生

專案的三大本質

單一進入點 (Single Entry) 相依於其它專案 (Dependency) 不可能遞迴相依 (Acyclic)

程式或 函式庫

stdlib

Qt math

Pthread

單一進入點

有相依性

不能遞迴相依

架構設計重點就是在搞清楚元件之間的相依性

Page 30: 2012/05/23 AU Talk - 讓事情發生

架構設計的步驟

從最粗糙到最精細– Software Stack (必要 )– CRC ( 非必要 )– Work-Breakdown-Structure (必要 )– UML Object diagram (必要 )

Page 31: 2012/05/23 AU Talk - 讓事情發生

Software Stack (必要 )

定義有哪些元件元件之間概念上的分層

基本須要先做的元件只需要基本測試

可以後做的元件需要比較多的測試

Page 32: 2012/05/23 AU Talk - 讓事情發生

CRC - Class-Responsibility Card ( 非必要 )

目的– 確保生成關係的可行性

買空白名片卡,正面寫上物件名稱,背面寫上物件的用途 不同元件的設計者,持有不同的 CRC卡 找一天大家一起打個牌 玩法

1. 從main 開始, main 有用到的物件就疊在main 上面2. 如果物件 A 用到物件 B ,就將 B放到 A 上面,直到所有牌都放完3. 如果牌放完,而沒有缺牌,則確保架構是 Acyclic 的

mainQt math

stdlib

pthread

Page 33: 2012/05/23 AU Talk - 讓事情發生

Work-Breakdown Structure (必要 )

顧名思義,將工作不斷分割,依相依性排好 在規劃初期,通常只會分割到第二階 實作階段,會分割到第三階,但是不是必要 不在 software stack 上的工作,記得也要列進來

Page 34: 2012/05/23 AU Talk - 讓事情發生

Example

Level 2 dependency graph

Level 3 dependency graph

Page 35: 2012/05/23 AU Talk - 讓事情發生

軟體開發的過程

挑對手 – 在專案開始之前– 組織行為– 專案時間表– 人力配置

初手 – 規格與設計– 組織與工作規劃– 需求分析– 架構設計

中盤策略 – 撰碼與測試– Dependency Checking– Revision control– Unit-test 的策略

末盤策略 – 交貨拿錢– Software versioning– Release engineering

Page 36: 2012/05/23 AU Talk - 讓事情發生

必然會遇到的問題

只要程式有人用– 你就會繼續開發,讓他更好用– 客戶或許會更新程式,或許不會

客戶會面臨–版本太新–版本太舊

Page 37: 2012/05/23 AU Talk - 讓事情發生

Too Old Problem

Host– 提供函式庫的專案

Dependant– 使用函式庫的程式

Too Old Problem– Host 提供的函式庫版本太舊

DependantHost

Version 2

需要 version 3

Page 38: 2012/05/23 AU Talk - 讓事情發生

Too New Problem

Host 所提供的函式庫太新

DependantHostV3

需要 version 3

HostV6

HostV4

HostV5

改成 version 6 ,可能嗎 ?

Page 39: 2012/05/23 AU Talk - 讓事情發生

解決方案

確認問題– 利用 Dependency Checker(如 ./configure script) ,在編譯之前檢查版本,以確保版本吻合

解決問題– 利用 Source Code Manager (如 SVN, CVS,

Perforce) ,返回到適合的版本

Page 40: 2012/05/23 AU Talk - 讓事情發生

Dependency Checking

最常見 dependency checker 為 ./configure script Dependency checker 產生器有 Open Source 的

– Autoconf– Cmake

Dependency checker 會 Top-down 的檢查函式庫版本以及系統環境

程式或 函式庫

stdlib Qt math

Is v2?

Is v3?

Is v6?

Page 41: 2012/05/23 AU Talk - 讓事情發生

Global Version

解決太舊的問題 將所有的 project 設定一個版次號碼 規定所有的 dependant 的版次必須要小於等於 host 的版次 最上層的 dependant 為 global version

MainV2

StdlibV6

QtV5

MathV3

PthreadV7

Global version

Page 42: 2012/05/23 AU Talk - 讓事情發生

Local Version

解決太新的問題這是從少數客戶擴張到多數客戶的關鍵

DependantHostV3

需要 version 3

HostV6

HostV4

HostV5

HostV3-1

HostV3-2

開分支 (branch)

合併 (merge)

版次跳躍

Page 43: 2012/05/23 AU Talk - 讓事情發生

Version Threads

2.3

2.4

2.5

2.6

2.7

2.3-1 2.3-2

2.4-1

2.6-1

Local Versions

Global Versions

Page 44: 2012/05/23 AU Talk - 讓事情發生

軟體開發的過程

挑對手 – 在專案開始之前– 組織行為– 專案時間表– 人力配置

初手 – 規格與設計– 組織與工作規劃– 需求分析– 架構設計

中盤策略 – 撰碼與測試– Dependency Checking– Revision control– Unit-test 的策略

末盤策略 – 交貨拿錢– Software versioning– Release engineering

Page 45: 2012/05/23 AU Talk - 讓事情發生

Software Versioning

功用– 對外做為看板,告知客戶目前專案的 stage of

life cycle– 對內做為進度管理,得知目前 release status

• Point release• Major release

Page 46: 2012/05/23 AU Talk - 讓事情發生

Stage of Life Cycle

Pre-alpha0 developing

Alpha1 Internal testing

Beta2Customer testing

RC3Release Candidate

RTM4Release to Market

GA5Success in Market

In Market

In House

Page 47: 2012/05/23 AU Talk - 讓事情發生

Release Status

Point release– 為了 bug-fix 經常且快速的 release

Major release– 為了 new feature 告知客戶應做更新

2.6

2.7

2.8 2.9

2.6.1 2.6.1

2.6.1

2.6.1 2.6.1major

point

Page 48: 2012/05/23 AU Talk - 讓事情發生

Case Study 1 – DirectFB

Format– [Major].[Minor].[Micro].[IF_Age].[Bin_Age]

Major release– [Major].[Minor]

Point release– [Micro]

Release Status– [IF Age].[Bin Age]

Release 的規則不固定,隨喜好進版。 進版規則

– Existing interface changed => IF Age = 0– Binary interface changed => Bin Age = 0– Bug-fixed or new feature => Micro += 1

Page 49: 2012/05/23 AU Talk - 讓事情發生

Case Study 2 – Linux Kernel 2.6.11+

Format– [Major].[Patch Level].[Minor].[Bug-fixed]

改進以往 release 方式 (2.odd/2.even) ,利用多個 source tree 來增加 patch 進入 mainline 的效率

Source tree Versioning Meaning

Mainline 2.6.X/2.6.X-rcY Developing source tree

Stable 2.6.X.Y For bug-fix

Legacy 2.6.X.Y-1 1 version old stable

Mm Integration tree, for new feature

Ck/Rt Improve performance

Page 50: 2012/05/23 AU Talk - 讓事情發生

Linux kernel version threads

2.6.11

2.6.11.1stable

Mainline

2.6.12

2.6.13

2.6.14

2.6.15

2.6.11.2

2.6.12.1

2.6.14.1

MM

Page 51: 2012/05/23 AU Talk - 讓事情發生

Proposed Release Engineering

3.1

3.1.1stable

Developing

3.1.2

3.2.1

3.4.1

StableRelease

3.2

3.3

3.4

3.5

Page 52: 2012/05/23 AU Talk - 讓事情發生

軟體開發的過程

挑對手 – 在專案開始之前– 組織行為– 專案時間表– 人力配置

初手 – 規格與設計– 組織與工作規劃– 需求分析– 架構設計

中盤策略 – 撰碼與測試– Dependency Checking– Revision control– Unit-test 的策略

末盤策略 – 交貨拿錢– Software versioning– Release engineering