軟體研發經驗談─觀念、紀律與個案

陳重嘉

  • 出版商: 琢學
  • 出版日期: 2006-09-29
  • 定價: $650
  • 售價: 9.0$585
  • 貴賓價: 8.5$553
  • 語言: 繁體中文
  • 頁數: 514
  • ISBN: 9868255503
  • ISBN-13: 9789868255500
  • 相關分類: Engineer self-growth軟體工程
  • 立即出貨(限量) (庫存=2)

買這商品的人也買了...

商品描述

本書特色

作者創作本書的主要目的,是想將本身的知識與經驗,傳承給對軟體研發有興趣或有工作需要的讀者,並希望書中的內容能對讀者有所助益。

本書的副標題 ── 觀念、紀律與個案,為本書的創作主軸;書中的所有內容,皆是以此三大主軸為基礎,並結合軟體的相關議題與作者的經驗與見解,做進一步地延伸發展所獲得的成果。

就「觀念」主軸而言,作者嘗試透過日常生活的經驗與案例,來解釋或比喻軟體的相關議題,以助於讀者掌握其意義;例如,作者以不可移情別戀的指標,來形容constant pointer;以健身器材對人身肌肉的健身效果,來比喻與解釋code coverage analysis

此外,「觀念」主軸亦包含了作者對於某些事物的主觀看法與見解;例如,作者將自己對於heap tree的主觀見解,濃縮成兩句口訣 ── 「視情況讓新的child node往上浮」與「視情況讓新的root node往下沈」;經由如此的見解分享,讀者不但可以清楚地感受到作者的觀點,亦可藉此激盪讀者自己的觀點,並由兩者的衝突與矛盾之中,繼續深化與擴大自己的見解與視野。

就「紀律」主軸而言,作者則是列舉常見的不當程式之範例,並搭配相關的軟體偵錯工具,讓讀者從中去摸索體會,撰寫程式與研發軟體時所應當秉持的紀律。

就「個案」主軸而言,其主要內容為作者解題與犯錯經驗的分享,並透過類似於故事的講述方式,來重現當時的情景;雖然這些個案所分享的解題或犯錯經驗,不一定對讀者有直接的幫助,但是多瞭解一些前車之鑑,或多或少能夠產生潛移默化的警惕與啟發之效,進而使得讀者在面對類似的情境時,能夠避免重蹈覆轍,或者少走一些冤枉路。

 

本書內容

1. 基本功
1-1 寫程式的基本規範... 1
標頭檔的規範... 1

Include Guard. 1

盡可能使用標準的定義與程式庫.... 6

Conditional Compilation. 7

函式的規範... 9

Prototype. 9

程式碼的規範... 10

慎重選擇變數的Scope與Life Time. 10

慎重選擇函式的Scope與Life Time. 12

盡可能地不做任何的假設(Assume Nothing).... 16

適時、適當與適量地加入註解.... 18

使用巨集時盡量避免在expression中嵌入運算符號.... 19

變數與函式的命名規範(Naming Conventions)... 23

Hungarian Convention. 23

X Window Convention. 24

My Convention. 27

1-2 Pointer 29

Pointer就是Address 29

Generic Pointer 32

Pointer Arithmetic. 32

Pointers versus Const Modifier 40

1-3 Pointer versus Array. 47

Pointer versus One-Dimension Array. 47

Pointer versus Multi-Dimension Array. 51

Array of Pointer 55

1-4 Pointer versus Function. 59

Pointer to Function (Function Pointer) 59

Callback Function. 63

個案:好朋友就是「有福必通報」、「有好康耶愛倒相報」.... 64

1-5 Information Hiding. 76

Pointers to Incomplete Type. 76

1-6 Reference. 81

Copy Constructor 86

自行定義的Copy Constructor. 93

禁止Copy Constructor被觸發.... 97

1-7 輔助型技巧... 98

參數個數不確定的函式... 98

Assertion. 105

Assertion in Hardware Description Language. 107

如何定義客製化的Assertion. 109

Predefined Macros. 109

客製化的Assert 110

1-8 個案:記憶體綽綽有餘卻要不到... 117 

 

2. 循規蹈矩使用記憶體.. 123

2-1 Run Time Memory Layout 123

Stack Frame and Call Stack. 124

2-2 Alignment Restriction on Address 126

變數所佔用的記憶體大小與起始位址值... 127

客製化的Memory Pool 129

Struct內部的Padding Bytes 133

個案:物件的Starting Address之應用... 136

2-3 SIGSEGV與SIGBUS. 145

2-4 檢查Run Time Memory Error的工具... 146

Purify的歷史... 146

Purify如何偵測Run Time Memory Error 147

2-5 記憶體使用不當的常見案例... 149

Uninitialized Memory Read (UMR) 149

The Operation Beyond Array Bounds 151

Stack Bound Read/Write (SBR/SBW) 152

Array Bound Read/Write (ABR/ABW) 160

個案:分析消費者行為的應用程式.... 163

Null Pointer Read/Write (NPR/NPW) 178

Freeing Mismatched Memory (FMM) 183

Free Memory Read/Write (FMR/FMW) 189

Dangling Pointer與FMR/FMW.. 193

Free Non-Heap Memory (FNH) 194

Free Unallocated Memory (FUM) 196

Memory Leak (MLK) 198

Lost Memory Block. 198

Undeallocated Memory Block. 200

 

3. 檔案處理.. 203

3-1 檔案的內容與格式... 203

3-2 檔案處理的基本概念... 204

Formatted IO.. 209

Binary IO.. 214

個案:聯盟公司忘了關閉檔案... 220

3-3 位元組順序(Byte Ordering)... 235

Big Endian versus Little Endian. 235

由程式實作來理解Endian. 236

謬誤之澄清... 239

Endian的起源... 240

Byte Swapping. 242

Bitwise Operations for Byte Swapping. 242

Pointer Operations for Byte Swapping. 242

如何讓Binary File跨越Endian的藩籬... 244

Binary File Format之設計.... 245

Writer Application之實作.... 246

Reader Application之實作.... 248

3-4 檔案鎖定(File Locking)... 257

Advisory Locking. 258

動手實作File Locking的範例.... 260

個案:The Lock Daemon Is Missing. 266

個案:自行設計的Locking Mechanism.. 267

3-5 多檔協同工作模式... 286

個案:當多檔協同工作模式遇上NFS Cache Delay. 288

 

4. 軟體鎖.. 293

4-1 FLEXlm軟體鎖... 294

FLEXlm的架構... 295

License Model 297

FLEXlm是一種軟體開發工具... 298

FLEXlm Client Library. 299

Basic APIs for Software License Control 299

早期的防盜漏洞... 300

如何防範Kill-Restart Approach. 303

持續監督的重要性... 305

4-2 為何放任盜版橫行... 305

網路效果(Network Effect)... 306

正向回饋循環(Positive Feedback Loop)... 307

軟體鎖是否自製的考量... 308

4-3 小專題:動手設計軟體鎖... 310

Daemon Process 311

動手實作Daemon Process. 313

Socket 316

Basic Functions for Socket Programming. 317

建立Stream Socket的基本程序.... 322

Concurrent Server. 325

建立Concurrent Server的基本程序.... 325

動手實作Concurrent Server. 327

Multiplexing Stream Socket 340

建立Multiplexing Stream Socket的基本程序.... 341

Function for IO Multiplexing. 343

動手實作Mux-Server. 345

軟體鎖的設計與實作... 355

軟體鎖的架構設計.... 355

License File的格式設計.... 356

Packet的格式設計.... 357

Generating a License File. 360

Parsing the License File. 362

License Server (License Manager). 368

Application. 378

 

5. 軟體測試.. 391

5-1 軟體的研發成本... 391

軟體臭蟲的除錯成本... 391

軟體臭蟲被解掉的機率... 393

軟體品質與產品利潤的關連性... 394

5-2 知名的軟體臭蟲... 396

Toyota Prius Hybrid汽油引擎無預警熄火事件... 396

US Yorktown Ship推進系統停擺事件... 396

亞利安五號火箭爆炸事件... 397

5-3 軟體測試的基本觀念... 399

常見的基本術語... 399

Black Box Testing versus White Box Testing. 399

Static Testing versus Dynamic Testing. 401

Validation versus Verification. 401

軟體研發流程versus軟體測試... 402

Testbench. 405

Test Pattern Generation. 407

5-4 衡量程式複雜度的方法... 411

Cyclomatic Complexity. 411

實例解析.... 414

Software Reliability. 417

Non-Nested Control Flow versus Nested Control Flow.. 417

Nested Cyclomatic Complexity (NCC). 419

My Diagram Constructs for Control Flow Graph. 421

Information Flow Complexity. 424

5-5 Code Coverage Analysis 425

基本的衡量指標... 425

Method/Function Coverage. 425

Statement Coverage. 426

Decision/Branch Coverage. 426

Condition Coverage. 426

實例解析... 427

Method/Function Coverage. 427

Statement Coverage. 427

Decision/Branch Coverage. 427

Condition Coverage. 429

5-6 個案:Heap Tree. 436

Heap Tree簡介... 436

Heap Tree的實作... 440

Heap Tree之測試... 447

Directed Test with Two Keys. 447

Directed Test、Random Test與Directed Random Test 451

 

6. 軟體研發流程管理.. 465

6-1 概述    465

6-2 軟體發展環境... 469

階層式架構... 469

Work Space. 469

6-3 Configuration Management 470

Revision Control System.. 471

Codeline and Branch. 475

Branch Model 475

Branch-by-Release. 476

Branch-by-Purpose. 477

Feature and Code Freeze Dates (Code Chill Period). 479

Bug Tracking System.. 480

軟體臭蟲的生命週期.... 481

6-4 回顧與檢討... 485

Adjust Build Time to Rescue Broken Build. 485

Change Set over Code Changes. 486

Merge and Redesign Testcases Periodically. 487

Adding Diversity to Testing Methodology. 488

 

7. 知識的吸收、積蓄與創造.. 491

7-1 前言    491

Push Strategy versus Pull Strategy. 491

7-2 內隱知識(Tacit Knowledge)... 492

斲輪老手的故事... 492

隱喻(metaphor)與類比(analogy)... 494

松下電器的家用麵包機... 496

知識螺旋... 497

知識追求的方向感... 498

7-3 知識管理的修練方法... 500

跨領域的學習... 500

跨領域學習的模範生 —— Pearce McComish Coporation. 502

接觸多元文化與價值觀... 503

行動後回顧(After Action Review)... 504

學習歷史... 505

7-4 知識創造活動的系統化流程... 507

專案指導遠景... 508

隱喻、類比與原型製作... 509

原型製作... 510

專案回顧... 510

結語... 510