113
從組裝軟體中談談軟體發展 Wen Liao

軟體組裝心得分享

Embed Size (px)

DESCRIPTION

下集:http://www.slideshare.net/zzz00072/2-32517297

Citation preview

Page 1: 軟體組裝心得分享

從組裝軟體中談談軟體發展

Wen Liao

Page 2: 軟體組裝心得分享

請注意

● 歡迎– 隨時中斷及提問題– 糾正錯誤– 防無聊

● 手機上網、打電動 (記得靜音 )

– 中途離席

Page 3: 軟體組裝心得分享

範圍

● C 語言● Linux

Page 4: 軟體組裝心得分享

目標

分享開發軟體會遭遇的問題

Page 5: 軟體組裝心得分享

發展軟體

● 微觀角度● 宏觀角度

Page 6: 軟體組裝心得分享

編輯器

編譯器

載入器

組譯器

除錯器

連結器

原始碼

Binary

Hello WorldSegmentation fault

http://en.wikipedia.org/wiki/File:CBP_checking_authenticity_of_a_travel_document.jpg

Page 7: 軟體組裝心得分享

編輯器

編譯器

載入器

組譯器

除錯器

連結器

原始碼

Binary

Hello WorldSegmentation fault

http://en.wikipedia.org/wiki/File:CBP_checking_authenticity_of_a_travel_document.jpg

Page 8: 軟體組裝心得分享

編輯器

編譯器

載入器

組譯器

除錯器

連結器

原始碼

Binary

Hello WorldSegmentation fault

http://en.wikipedia.org/wiki/File:CBP_checking_authenticity_of_a_travel_document.jpg

Page 9: 軟體組裝心得分享

編輯器

編譯器

載入器

組譯器

除錯器

連結器

原始碼

Binary

Hello WorldSegmentation fault

http://en.wikipedia.org/wiki/File:CBP_checking_authenticity_of_a_travel_document.jpg

Page 10: 軟體組裝心得分享

編輯器

編譯器

載入器

組譯器

除錯器

連結器

原始碼

Binary

Hello WorldSegmentation fault

http://en.wikipedia.org/wiki/File:CBP_checking_authenticity_of_a_travel_document.jpg

Page 11: 軟體組裝心得分享

編輯器

編譯器

載入器

組譯器

除錯器

連結器

原始碼

Binary

Hello WorldSegmentation fault

http://en.wikipedia.org/wiki/File:CBP_checking_authenticity_of_a_travel_document.jpg

Page 12: 軟體組裝心得分享

編輯器

編譯器

載入器

組譯器

除錯器

連結器

原始碼

Binary

Hello WorldSegmentation fault

http://en.wikipedia.org/wiki/File:CBP_checking_authenticity_of_a_travel_document.jpg

Page 13: 軟體組裝心得分享

分頁

可以顯示 tab字元 80字元分界線

行號

括號邊界指示

折疊邊界

可以顯示空白字元

語法專用色彩

Page 14: 軟體組裝心得分享

http://blog.vgod.tw/wp-content/uploads/2009/12/vim-cheat-sheet-full.png

Page 15: 軟體組裝心得分享

有沒有空白字元,差很大

.

Page 16: 軟體組裝心得分享

有沒有 tab顯示,差很大

Page 17: 軟體組裝心得分享

正規表示式

:%s/^/CCU_PLAYER_

:%s/\[.*\] //g

Page 18: 軟體組裝心得分享

啊就用鍵盤手動更改又沒差太多啊?

Page 19: 軟體組裝心得分享

這是效率的問題

Page 20: 軟體組裝心得分享

一個 log 30000行,去掉有規則但是不相同的字串。

有 50個命令要加 8個字元的 prefix,然後還要加

postfix

Page 21: 軟體組裝心得分享
Page 22: 軟體組裝心得分享

編輯器

編譯器

載入器

組譯器

除錯器

連結器

原始碼

Binary

Hello WorldSegmentation fault

http://en.wikipedia.org/wiki/File:CBP_checking_authenticity_of_a_travel_document.jpg

Page 23: 軟體組裝心得分享

原始碼

● 編寫● 閱讀

Page 24: 軟體組裝心得分享

“Programming is the art of telling another human what one wants the

computer to do.”, Donald Knuth

高德納:「程式語言是一種告訴別人你要教電腦去做啥事的藝術。」

Page 25: 軟體組裝心得分享
Page 26: 軟體組裝心得分享

Hello World

http://www2.informatik.uni-halle.de/lehre/c/c_hello.html

Page 27: 軟體組裝心得分享

http://www.ioccc.org/2011/akari/akari.c

main(int /**/n ...

fread(....) ...

Page 28: 軟體組裝心得分享

程式就是作文 !

Page 29: 軟體組裝心得分享

http://www.ptt.cc/bbs/CS_TEACHER/M.1238177596.A.796.html

http://zh.wikipedia.org/wiki/%E7%94%9F%E9%AD%9A%E7%89%87

v. s.

朋友

Page 30: 軟體組裝心得分享

一致性

● POSIX執行緒是線程的 POSIX標準,定義了創建和操縱 thread的一套 API。

● HTTP通訊協定使用的預設埠為80,客戶端送出要求給伺服器上面的 port80。當然除了默認接口外,使用其他的ポート番號也是 OK的。

改編自 http://zh.wikipedia.org/zh-tw/POSIX_Threads

Page 31: 軟體組裝心得分享

變數命名規則一致

Page 32: 軟體組裝心得分享

TAB和空白一致

Page 33: 軟體組裝心得分享

括號格式一致

Page 34: 軟體組裝心得分享

http://petdance.com/2012/04/the-worlds-two-worst-variable-names/

v. s.

名正言順:從學號找學生姓名

Page 35: 軟體組裝心得分享

http://petdance.com/2012/04/the-worlds-two-worst-variable-names/

名正言順:捷運學生票扣款檢查

v. s.

Page 36: 軟體組裝心得分享

深度區塊

Page 37: 軟體組裝心得分享
Page 38: 軟體組裝心得分享

巢狀前置處理

Page 39: 軟體組裝心得分享

反正作業 /產品交出去就收工了,幹嘛那麼認真?

Page 40: 軟體組裝心得分享

這是效率的問題

Page 41: 軟體組裝心得分享

想像一下

● 專案規模– 上千個原始檔案– 文件數十個,都是過期的– 你處於星光 n班,開發者早就離職– 裏面充滿

● 變數用單個字元● 變數意義和內容不符● 意義不明的縮寫 prefix● 巢狀前置處理

– 生死狀:出貨期限延後,每天公司被客戶罰錢– 新增功能,老闆幫你畫押三天搞定

Page 42: 軟體組裝心得分享

原始碼

● 編寫● 閱讀

Page 43: 軟體組裝心得分享

自動程式文件分析產出

Page 44: 軟體組裝心得分享
Page 45: 軟體組裝心得分享
Page 46: 軟體組裝心得分享
Page 47: 軟體組裝心得分享

編輯器專用的追蹤外掛

Page 48: 軟體組裝心得分享

grep Auto.*Size * -r

Page 49: 軟體組裝心得分享

超級比一比

Page 50: 軟體組裝心得分享

編輯器

編譯器

載入器

組譯器

除錯器

連結器

原始碼

Binary

Hello WorldSegmentation fault

http://en.wikipedia.org/wiki/File:CBP_checking_authenticity_of_a_travel_document.jpg

Page 51: 軟體組裝心得分享

socket.c

zftp-srv

zftp-client

file.c

config.h

client_main.c

srv_main.c

作業:土炮 FTP

Page 52: 軟體組裝心得分享

生檔案版本一

● zftp-srv– gcc -c srv_main.c

– gcc -c file.c

– gcc -c socket.c

– gcc -o zftp-srv file.o socket.o srv_main.o

● zftp-client– gcc -c clint_main.c

– gcc -c file.c

– gcc -c socket.c

– gcc -o zftp-client file.o socket.o client_main.o

Page 53: 軟體組裝心得分享

生檔案版本二

● zftp-srv– gcc -o zftp-srv file.c socket.c srv_main.c

● zftp-client– gcc -o zftp-client file.c socket.c clint_main.c

Page 54: 軟體組裝心得分享

手動下命令有什麼不好?最多放在檔案編輯器剪貼

一下就好了。

先求有,再求好。

Page 55: 軟體組裝心得分享

這是效率的問題

Page 56: 軟體組裝心得分享

AOSP

● Note: The source download is approximately 8.5GB in size. You will need over 30GB free to complete a single build, and up to 100GB (or more) for a full set of builds.

● 請注意:下載原始碼需要大約 8.5GB 硬碟空間 。單獨編譯會再需要 30G 硬碟空間,而全部編譯會需要 100GB以上硬碟空間。– 有很大量的程式原始碼– 編一次要很久的時間

http://source.android.com/source/initializing.html

Page 57: 軟體組裝心得分享

想像一下

● 假設編一次專案需要 4個小時

● 每個檔案都編兩下的前提下,修掉上面的錯誤要幾個小時?

● 算看看– 第一次編:四小時

– 找錯誤:看運氣和能力

– 修正後重編:再四小時

Page 58: 軟體組裝心得分享

三年之後又三年,三年之後又三年,都快十年啦,老大!

Page 59: 軟體組裝心得分享

需要更聰明的方式 !

● 自動產生程式或 binary

● 只去編上次改過的程式原始碼● 提供不同設定● 修改方便

Page 60: 軟體組裝心得分享

Make

● 用途:讀取 Makefile,產生 binary– 執行檔– Library

● 發明人– Stuart Feldman, 1977

● 2003– ACM Software System Award

http://en.wikipedia.org/wiki/Make_(software)

Page 61: 軟體組裝心得分享

最簡單的規則

● 目標 :目標需要參考的元件

<tab> 命令– 範例

● file.o:file.cgcc -c file.c

Page 62: 軟體組裝心得分享

socket.c

zftp-srv

zftp-client

file.c

config.h

client_main.c

srv_main.c

Page 63: 軟體組裝心得分享

樹狀結構

Page 64: 軟體組裝心得分享

Show Time

第一次全部都編

沒改程式原始碼所以不需要重編

Page 65: 軟體組裝心得分享

Show Time (cont.)只改 client_main.c就只編 zftp-client

改了 config.h全部砍掉重練

Page 66: 軟體組裝心得分享

Make 只是編碼自動化的選擇之一

Page 67: 軟體組裝心得分享

編輯器

編譯器

載入器

組譯器

除錯器

連結器

原始碼

Binary

Hello WorldSegmentation fault

http://en.wikipedia.org/wiki/File:CBP_checking_authenticity_of_a_travel_document.jpg

Page 68: 軟體組裝心得分享

GNU Binutils

● 處理 binary及產生 binary– ld

– ar

– nm

– ...

Page 69: 軟體組裝心得分享
Page 70: 軟體組裝心得分享

Page 71: 軟體組裝心得分享

可以看到 Symbol,所以呢?

Page 72: 軟體組裝心得分享

搬個家

找不到了

symbol 底家啦

恭迎歸位!

Page 73: 軟體組裝心得分享

可以從 nm找到symbol以解決 link不

到 library的問題

然後呢?

Page 74: 軟體組裝心得分享

這是效率的問題

Page 75: 軟體組裝心得分享

情境模擬

● deep_shit.c:(.text+0x7): undefined reference to `this_is_ridiculous'

● 專案有幾千個檔案,數百個目錄– 請找出 this_is_ridiculous是放在那個 library?

不知道 binutil,就慢慢找吧。

Page 76: 軟體組裝心得分享

編輯器

編譯器

載入器

組譯器

除錯器

連結器

原始碼

Binary

Hello WorldSegmentation fault

http://en.wikipedia.org/wiki/File:CBP_checking_authenticity_of_a_travel_document.jpg

Page 77: 軟體組裝心得分享

printf大法

Page 78: 軟體組裝心得分享

抓蟲

寫東西到位址 0x0,嘿嘿

Page 79: 軟體組裝心得分享

顯示出錯的 statement

Page 80: 軟體組裝心得分享

列出呼叫順序

印變數內容

還可以直接呼叫函式

Page 81: 軟體組裝心得分享

我用 printf去夾,總有一天夾到出錯的點吧?

Page 82: 軟體組裝心得分享

有沒有遇過函數呼叫到九十幾層的?

要 printf 到那一天?

Page 83: 軟體組裝心得分享

有沒有看過單一個函數三五百行的?

要塞幾個 printf?

Page 84: 軟體組裝心得分享

抓漏

借了不還,嘿嘿

Page 85: 軟體組裝心得分享

找到 1024 bytes的浪費

連順序、行號都有

Page 86: 軟體組裝心得分享

發展軟體

● 微觀角度● 宏觀角度

Page 87: 軟體組裝心得分享

作業:土炮 FTP

● 預想的規劃步驟:

1.做出 client送出文字, server 印出來

2.做出 client送出文字, server 印出來,再送回給client

3.定義資料結構,最少有命令代碼, Buffer

4.使用自訂資料做 2

5.實作 server 檔案部份功能

6....

Page 88: 軟體組裝心得分享

Q:要怎麼避免寫下一個步驟時改壞,發生砍掉重練的悲劇?

Page 89: 軟體組裝心得分享

A: Save/Load 大法!

Page 90: 軟體組裝心得分享
Page 91: 軟體組裝心得分享
Page 92: 軟體組裝心得分享
Page 93: 軟體組裝心得分享

改爛了 ... 重來

Page 94: 軟體組裝心得分享
Page 95: 軟體組裝心得分享

千秋萬世直到永遠

Page 96: 軟體組裝心得分享

情境模擬

Page 97: 軟體組裝心得分享

長期開發

r133,465

http://nightly.webkit.org/

Page 98: 軟體組裝心得分享

133,465是存133,465 份嗎?別鬧了!

Page 99: 軟體組裝心得分享

某專案

● 平台:Windows, MAC OS, Linux

● 新增功能,要怎麼管理?– 寫一份,複製三份?

● 錯誤修正,要怎麼管理?– 修一份,複製三份?

Page 100: 軟體組裝心得分享

某專案 ++

● 團隊人數: 5 位– 兩個人的功能會更動檔案 A

– 一個人更改了 API● int iFoo(char *buf, int count);● void *iFoo(void *buf, int count, int *whatever);

– 要怎麼合併程式?改爛了怎麼回去?– 上星期三改的程式和現在的程式差別?– 三個星期前到底改了什麼鬼東西?– 可不可以拿兩個星期前的版本再增加新的功能?

Page 101: 軟體組裝心得分享

正解:聰明的Save/Load大法

Page 102: 軟體組裝心得分享

打電動時什麼時後會想存檔?

Page 103: 軟體組裝心得分享

解決謎題、打敗小魔王後

Page 104: 軟體組裝心得分享

女神:「你掉的是金子做斧頭還是銀子做的斧頭?」

砍掉重練???

是 否

Page 105: 軟體組裝心得分享

http://nvie.com/posts/a-successful-git-branching-model/

Page 106: 軟體組裝心得分享

pcmanx 原始碼紀錄

作者更改時間 更動說明

Page 107: 軟體組裝心得分享

詳細資料

更改檔案

更改比較

HASH

Page 108: 軟體組裝心得分享

犯罪現場

兇手就是你! 可疑程式碼

Page 109: 軟體組裝心得分享

結論

Page 110: 軟體組裝心得分享

“Programming is a way of thinking, not a rote skill. Learning about "for" loops is not learning to

program, any more than learning about pencils is learning to draw.“, Victor Bret

Victor Bret:「程式設計是一種思考的方式,而不是死記硬背的能力。學會程式語言的for loop語法就以為會寫程式,就像學會使用鉛筆就以為會繪畫一樣天真。」

http://worrydream.com/LearnableProgramming/

Page 111: 軟體組裝心得分享

照樣造句

會使用輔助工具就以為精通軟體開發,就像學會使用鉛筆就以為會繪畫一樣天真。

Page 112: 軟體組裝心得分享

Reference

● Google● Google Image● Wikipedia

Page 113: 軟體組裝心得分享

Q & A