l

2013年1月31日 星期四

例外處理之錯誤訊息描述:HTC One X拍照篇

Jan. 30 14:47~16:27

錯誤訊息

Teddy前幾天用HTC One X照相的時候,出現了類似「SD卡存取錯誤」的訊息。詳細錯誤敘述Teddy已經忘記了,當然也沒辦法把手機畫面抓下來…因為…SD卡存取錯誤,沒辦法把畫面存起來啊…Orz。

看到這個訊息之後Teddy心想:「耶,手機買不到一年,怎麼這麼快SD卡就壞掉了?!」。江湖上不是傳言說:「HTC品質,堅若磐石」嗎…啊,不對,這是另外一家公司的口號XD。可能是PC用太久了,Teddy想說把手機重新開機看看問題會不會自動消失。重開之後再試一次拍照功能,還是一樣出現同樣的錯誤訊息。李組長眉頭一皺,發現案情並不單純 後來Teddy觀察到,拍照時照片好像都有拍成功,但是最後卻沒有被存起來。於是Teddy猜想,會不會是SD卡的空間已滿?刪掉幾張舊照片之後,果然錯誤訊息不見了,照片也可能成功的被存下來。

***

看完上面這個故事不知道鄉民們心中是否有著跟Teddy一樣疑問:為什麼HTC One X的拍照軟體不直接告訴使用者:「SD卡空間已滿,若要繼續拍照請先清除SD卡空間」,而是顯示「SD卡存取錯誤」這種很容易讓人誤會的訊息?之前Teddy寫過一篇《HTC One X之發現一個bug》也是遇到類似例外處理與錯誤訊息顯示的問題。本篇提到的「SD卡存取錯誤」這個錯誤訊息,Teddy在「公堂之上大膽假設一下」,可能是因為拍照軟體將捕捉到的例外直接顯示出來,請參考下圖:

螢幕快照 2013-01-30 下午3.22.03

在SD卡已滿的情況下,拍照軟體還要存入照片,於是手機硬體發出「SD卡存取錯誤」的例外E1,而拍照軟體可能有著類似下圖的例外處理程式:

螢幕快照 2013-01-30 下午3.28.13

因為採用「generic catch」的方式來捕捉例外,因此最簡單的處理方式就是把捕捉到的例外直接顯顯示在畫面上。

***

問題出在哪裡

接下來眼尖一點的鄉民們可能會問:前面這段程式這樣寫並沒有錯啊,錯的是Android作業系統,為什麼不針對SD空間不足傳回一個「NotEnoughSDSpaceException」,而卻傳回「SDAccessErrorException」這種這麼一般性的例外

沒錯,如果作業系統或是底層的API可以直接針對SD卡的操作傳回非常詳細的例外類別,API的使用者就比較輕鬆,也許直接把錯誤訊息顯示在畫面上就可以了。但是由於存取SD卡的錯誤原因很多,如果要針對每一個原因都設計一個例外類別,系統中便會有太多的例外類別(exception class的種類太多也是一個問題,例如需要更多的記憶體空間來存放這些例外)。像是JDK,IOException底下的子類別,也只有一個FileNotFoundException和檔案處理比較有關,其餘的檔案操作例外,大多直接使用都用IOException來表示。

怎麼辦

身為一位繁忙的程式設計師,正常功能都快沒時間寫了,哪有時間去管例外處理的問題。所以鄉民們當然可以正大光明地選擇維持現狀。如果真的要做到Teddy心中期待的錯誤處理方式(至少要顯示類似「SD卡空間已滿,若要繼續拍照請先清除SD卡空間」這種對使用者而言比較有意義的訊息),程式可能要改成:

螢幕快照 2013-01-30 下午4.01.16

***

很多時候,使用者認為的bug,不一定真的是程式邏輯的錯誤,可能只是因為使用者不清楚程式內部運作的context或是precondition。例如,雖然大家都知道要拍照一定要有足夠的儲存空間,否則拍完之後無法存檔,但使用者在拍照的時候並不一定會隨時注意到儲存空間是否足夠。在這種情況之下,如果程式可以從使用者的使用情境來思考,當錯誤發生時儘量顯示對於使用者有意義的訊息,那麼聰明的人類是很有可能可以自行排除大部分的問題滴

***

友藏內心獨白:以上程式結構純屬紙上談兵。

2013年1月30日 星期三

C. C. Agile 二月份聚會[Sprint 6] 改地點啦

Jan. 28 21:47~23:12

螢幕快照 2013-01-28 下午11.16.03

C. C. Agile前五次活動都是在「果子咖啡」舉辦,但有鄉民跟Teddy反應這個地點對新北市的觀眾朋友來講有點遠,因此這一陣子Teddy和ezScrum團隊有空便在尋找新的地點。今天找到兩個候選位置,打算利用接下來的Sprint 6與Sprint 7分別在這兩個地點試辦,以決定哪一個地點比較適合當作長期舉辦C. C. Agile活動的場地。

二月份舉辦活動的地點是台大附近的「靈感咖啡」(台北市新生南路三段84-6號三樓),舉辦日期是2月21日禮拜四晚上7:00~10:00(6:45之後可進場)靈感咖啡並沒有供餐,且禁帶外食,所以鄉民們要記得先吃飽再過來…Orz(這個限制有點不方便)。店家提供飲料紅茶與果汁可無限暢飲,基本場地費每人低消160元,費用於現場報到時繳交給工作人員即可。店家也有提供糕點之類的食物,有需要的鄉民們可自行付費加點。

在此再次提醒報名的鄉民們,由於場地有限,若您報名之後無法參加,請記得要取消報名,把機會留給其他人。

***

至於Sprint 6的講者,Teddy毛遂自薦推薦了自己挑眉質疑。這次分享的題目是「搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題」。這個主題,是Teddy念博士班的時候苦學多年所獲得的心得,保證全國僅此一家,別無分號微笑

分享內容簡介

Java 語言設計了兩種不同用途的例外:Checked與Unchecked Exceptions。原本Java語言設計者希望利用前者來表示「可復原的錯誤」,後者來表示「不可復原的錯誤」。然而,實務上很多開發人員對於Java語言的規範並不 鳥它 買單,多年來Java程式設計師們對於如何使用這兩種例外一直爭吵不休。在本次活動中,Teddy將介紹一種簡單且有系統的方式,來理解Java語言所設計的這兩種例外,以及如何解讀現有系統對於這兩種例外的使用習慣。

***

報名網址在這裡https://www.accupass.com/go/CCAgileSprint06本週五(2月1日)中午12:00開放報名

***

友藏內心獨白:這可是有緣人才聽得到的 爵士舞功 絕世武功招式啊XD。

2013年1月29日 星期二

光靠寫書的版稅是賺不到什麼錢滴

Jan. 28 10:29~12:52

image

昨天晚上Kay拿了一篇iThome 591期上面的文章給Teddy看,文章是「良葛格」所寫的「技術書籍寫作的三個角度」。「良葛格」算是電腦技術書籍寫作與出版的前輩(不過Teddy不認識他,他也不認識Teddy啊挑眉質疑),文章中所描述的內容Teddy讀完之後非常感同身受。今天介紹一下「良葛格」所提到技術書籍寫作的三個角度給有志從事技術寫作或是想知道技術寫作 黑幕 心路歷程的鄉民們參考。

寫書可從寫作開始

Teddy在2008年9月博士班剛畢業,當時雄心萬志的Teddy立了一個目標:「上班之後我要抽出時間來寫一本書」。寫什麼書?是關於敏捷開發與Scrum的書,還是Design Pattern的書?都不是,是Teddy博士論文的研究題目:「Java例外處理設計與重構」。上班之後,轉眼間一個月、半年、一年、N年過去了…結果如何鄉民們應該都知道答案了。這本例外處理設計的書,到目前為止都只是個存在 友藏 Teddy內心深處的念頭,至於寫書所需要的時間則從來都沒有從Teddy的行程表中被「抽出來」過。

反倒是因為Teddy經常在部落格中 哭夭 寫作關於敏捷開發相關主題的文章,累積到了一定數量之後,集結出版好像成為順理成章的事,結果一不小心就誕生了《笑談軟體工程:敏捷開發法的逆襲》這本書。這種在部落格上寫作,然後集結成書的經驗,在Teddy之前已經有太多前輩做過了,應該可以寫成一個模式(pattern)挑眉質疑

現代人工作都很忙,大概除非失業或長期放無薪假,否則真的不容易有一段連續且完整的時間可以靜下心來寫完一本書。套用敏捷方法iterative and incremental的精神,把一天(或一個禮拜)當成一個sprint(一個寫作周期),每個sprint寫一篇。經過N個sprint之後,一本書…的草稿,自然就成形了(鄉民內心獨白:哪有那麼簡單啊,說的比唱得還好聽疑惑)。

把寫書到出書的過程看成廣義出版的過程

2011年7月Teddy有了將部落格文章集結出書的想法,在某位好心鄉民的介紹之下,Teddy認識了悅知出版社的編輯。出版社對於作者出書的要求,也不是來者不拒,要是書印好之後賣不出去,出版社可是要賠錢的(書店可以把賣不出去的書退給出版社,所以滯銷的風險要由出版社承擔)。

在商言商,出版社還是要考慮到這本書的主題有沒有市場,內容是否吸引讀者。由於「搞笑談軟工」部落格原本就有 廣大的 一小群忠實的讀者,再加上已經有現成的稿件可讓出版社參考(不是只有一個想法就靠打嘴砲的功力來提案),因此後續的提案審查、簽約、編輯排版、內容增修、校對、印刷出版的過程相對的就比較順利。雖然實際上整個過程還是花了不少時間,但是如果沒有平常寫作所累積出來的稿件與讀者基本盤,Teddy很難想像還要花多少時間才可能讓一本書從零到真正付梓出版啊。

寫書跟開發軟體,都是一種「產品開發的過程」。在這個過程中,寫作(把東西寫出來)只是其中的一項活動。好比開發軟體,不是說把程式寫出來就沒事了,在寫程式之前還要進行需求訪談,確定開發的產品具有市場價值。同時寫出來的軟體需要進行不斷的測試,以確保品質。有心想從事寫作的鄉民們,要先有「寫書是一種產品開發的過程」的觀念,之後遇到一堆出版社的要求,才比較容易淡定地應付。此外,這種心態也可以讓作者提早思考自己「產品的價值」在哪裡以及潛在的讀者群是誰。如果可以持續依據讀者對於自己產品的反應與看法加以修正寫作的內容與方向,則可以讓自己最終的產品更加成熟(尤其當作者只有一個人的時候,聽聽其他人的聲音,可以讓作品更加洗練)。

寫書的收入不能只看版稅

在台灣,要靠寫書(尤其是技術書籍)賺到什麼錢,幾乎是不可能的任務挑眉質疑。所以,想要從事電腦技術書籍寫作的鄉民們,請先放棄「從版稅賺大錢」的想法。

那難道要寫一本好的技術書籍,就真的只能靠作者的「佛心」嗎?Teddy的經驗和「良葛格」在文章中提到的幾點看法非常接近。首先,如果鄉民們寫的書真的很不錯,可以先幫自己賺到名聲(如果寫得很爛,賺到的就是臭名了…Orz)正所謂「名利、名利」,有了名之後,獲得利的機會也比較多一些(理論上…XD)。

機會要從那裡來呢?例如,出名之後,可能會有公司邀請作者去演講,或是到公司內部上課(企業內訓)。作者自己也可以舉辦公開講座課程,招收普羅大眾來上課。更厲害一點,可能可以接到企業顧問案,當任兼職顧問,幸運的話可以獲得一張長期飯票微笑

Teddy自己的經驗,一個多月前就有一位 粉絲 讀者寫信給Teddy。這位讀者因為看了Teddy的書,覺得寫的很 好笑 有道理,因此也想要在公司內部推廣敏捷開發。Teddy接觸之後才知道員這位讀者是IT部門的協理,他們公司買了好幾本Teddy的書,而該部門的副總也很支持,所以就因為這樣而讓Teddy多了一個做生意的機會。在更早之前,也有某遊戲公司董事長,買了好幾本Teddy的書給公司主管,後來做成了一筆Scrum敏捷開發方法企業內訓課程的生意。此外,也有許多鄉民,是因為看了Teddy的書,而來報名參加Teddy所舉辦的Scrum或Design Pattern公開訓練課程。

Teddy的《笑談軟體工程:敏捷開發法的逆襲》從2012年6月底出版至今剛好快滿7個月,印了約有2,500本。據出版社表示,一本電腦技術書籍,在台灣最後能夠賣出超過3,000本,就算是非常暢銷的書了,所以Teddy還有500本的目標要好好努力,才可以稱得上是暢銷書作者啊。到目前為止,Teddy所收到的版稅總和,大概只約略等於Teddy開一次為期兩天的Scrum課程學費收入。寫書花了幾百個小時,直接從版稅獲得的收入,等於上一次12個小時的課程。如果想光靠版稅過活,真的是要學日本綜藝節目挑戰一萬元過一個月的生活啊挑眉質疑

最後再補充一點可能的收入來源,「良葛格」在文章中提到可以透過廣告(應該是部落格廣告)增加收入。但是Teddy不太喜歡部落格的版面穿插著其他廣告,所以一直沒有嘗試這個方法(迷之音:應該是點閱率太低,收不到什麼廣告費吧不要告訴別人)。

***

友藏內心獨白:佛心對於寫出好的中文電腦技術書籍可能是最重要的成功因素啊。

2013年1月28日 星期一

第二梯次Design Patterns這樣學就會了入門實作班,Day3實況報導

Jan. 27 21:41~23:00

螢幕快照 2013-01-27 下午10.27.57

上Design Pattern這麼無聊的課怎麼會笑成這個樣子不要告訴別人

***

隔了一個禮拜,第三天課程(1月26)開始Teddy先快速複習一下前兩次所介紹的課程內容。緊接著便開始今天的第一個模式:Template Method。

螢幕快照 2013-01-27 下午9.49.55

 

Teddy設計了一個讀取應用程式設定檔的例子,來解釋Template Method。

螢幕快照 2013-01-27 下午9.54.42

 

請鄉民們思考一下,Template Method是否符合Open-Closed Principle?

螢幕快照 2013-01-27 下午9.57.03

 

接著介紹Command模式。Teddy設計一個套用Command模式之後可以成為簡單Plugin架構的例子。

螢幕快照 2013-01-27 下午10.09.34

 

開始練習,助教出動了XD。

螢幕快照 2013-01-27 下午10.10.57

 

下一個模式輪到了Adapter,這個模式的概念比較簡單,因為日常生活中大家都體驗的到。

螢幕快照 2013-01-27 下午10.14.07

 

這個Pluggable Adapter很多鄉民們可能都已經用過了,但卻不知道這種用法叫做Pluggable Adapter,也不清楚這個模式的設計用意。

螢幕快照 2013-01-27 下午10.17.05

 

介紹完Adapter接著介紹Strategy。Teddy設計的題目是棒球選手依據教練指示上場以特定的策略打擊。

螢幕快照 2013-01-27 下午10.22.09

 

Strategy實作結束之後,補充說明Strategy與Template Method以及State的相同與差異之處。

螢幕快照 2012-09-02 下午10.35.23

螢幕快照 2012-09-02 下午10.35.34

最後一個模式是Composite,當然也是有包含程式實作。

螢幕快照 2012-09-02 下午10.42.17

 

最後一個模式是Composite,當然也是有包含程式實作。

螢幕快照 2013-01-27 下午10.26.50

 

最後幫這三天的課程做一個快速的總複習。

螢幕快照 2013-01-27 下午10.32.09

***

順便幫今年泰迪軟體所開的課程打個廣告,應觀眾要求,特別在三月加開一次「Design Patterns這樣學就會了入門實作班」平日班(有些觀眾假日需要陪老婆、小孩很棒),報名網址在此:https://www.accupass.com/go/pattern1303

另外,「Design Patterns這樣學就會了進階實作班」也已經開放報名了喔,網址在此:https://www.accupass.com/go/pattern1304

螢幕快照 2013-01-27 下午10.33.37

 

Scrum敏捷方法實作班:第五梯次」3月份報名網址:https://www.accupass.com/go/scrum1303

泰迪軟體本年度新開發的課程「單元測試與持續整合實作班」3月份第一梯次報名網址:https://www.accupass.com/go/testci1303

螢幕快照 2013-01-27 下午10.45.31

 

最後,也是泰迪軟體本年度新開的課程「例外處理設計與重構實作班」,報名網址還在建置當中。

螢幕快照 2013-01-27 下午10.45.42

***

鄉民內心獨白:每一門課都好想上啊熱戀

2013年1月27日 星期日

2009冬遊日本京都Day5-B嵐山之大悲閣(千光寺)

Jan. 24 23:12~23:50

到了嵐山之後,先去租了腳踏車,在嵐山公園附近閒逛一下。

螢幕快照 2013-01-24 下午11.13.55

螢幕快照 2013-01-24 下午11.14.02

螢幕快照 2013-01-24 下午11.14.12

 

真的有租車喔挑眉質疑

螢幕快照 2013-01-24 下午11.14.28

 

這裡有山、有水,環境真的很漂亮。很多遊客選擇搭船遊河,感覺應該挺不錯的。Teddy和Kay沒有去搭船,兩個人騎著腳踏車瞎晃。

螢幕快照 2013-01-24 下午11.15.32

螢幕快照 2013-01-24 下午11.15.52

 

騎著、騎著來到一個有點奇怪的叉路。

螢幕快照 2013-01-24 下午11.16.06

 

接下來要用走的,把車停在路邊。

螢幕快照 2013-01-24 下午11.16.21

 

越往上游走,人跡越少,景色也越美。

螢幕快照 2013-01-24 下午11.16.55

螢幕快照 2013-01-24 下午11.17.27

 

為什麼要一直往上走哩?因為一路上看到下面這個看板。絕景,再怎麼辛苦也要一覽絕景啊。

螢幕快照 2013-01-24 下午11.18.08

 

繼續爬。

螢幕快照 2013-01-24 下午11.18.21


原來目的地是大悲閣(千光寺),下面有一小段簡體中文的介紹。

螢幕快照 2013-01-24 下午11.20.26

螢幕快照 2013-01-24 下午11.20.43

 

絕景、絕景。

螢幕快照 2013-01-24 下午11.21.11

 

看到這個洗心亭就快到了。

螢幕快照 2013-01-24 下午11.21.24

螢幕快照 2013-01-24 下午11.21.32

螢幕快照 2013-01-24 下午11.21.45

螢幕快照 2013-01-24 下午11.22.01

到了,這裡是大門入口。

螢幕快照 2013-01-24 下午11.22.15

 

View真的還不錯。

螢幕快照 2013-01-24 下午11.23.21

螢幕快照 2013-01-24 下午11.23.35

螢幕快照 2013-01-24 下午11.24.11

螢幕快照 2013-01-24 下午11.24.28

螢幕快照 2013-01-24 下午11.24.48

螢幕快照 2013-01-24 下午11.25.04

據說如果是櫻花季節或是楓紅時節來到這裡,景色更是美麗。可惜Teddy來的不是時候…Orz。不過每個季節都有每個季節的特色,體驗一下也不錯。

***

友藏內心獨白:好想到京都賞櫻啊。