Pages

Monday, March 28, 2011

天使與魔鬼對於 Unit Test 的影響

Unit Test
我們的程式碼不是拋棄式的,是會跟著我們的。從一開始專案啓動,開始建構整個開發框架,到每一位開發人員的投入開發,版本不段的往上增進 ,直到規定的時程到,截取一個穩定的版本出去,開始上市或者上線,之後再進入不斷改版的階段。在這個過程每日看待我們的程式碼,而一個團隊的話,一定會有大家互相交互看程式碼的情況。

當我們還沒變成一流的軟體工程師之前,難免寫了程式會有缺陷,未來勢必需要做重構 Refactoring,而想要 Refactoring 既有功能,又不希望因為改了這邊,不小心害到別的部份,所以最重要的,想要做 Refactoring 之前,先寫好 Unit Test 單元測試。

過去我寫過 Java 的 JUnit,現在也開始在寫 Objective-C 的 OCUnit,對於 Unit Test 整體對於使用者在開發上的心態影響,有些開發經驗與心得。

讓程式設計師寫和維護 Unit Test 的動力有:
  1. Test driven development 是個良好的開發模式。運用在開發上了,先寫測試程式,測出了錯誤,開始實作主要程式,主要程式寫完,再跑測試調整到對即可。
  2. 透過先從測試程式,了解了測試邏輯,才知道寫的程式有何意義。沒有意義的就不寫。將開發範圍先敲定。 
  3. 如果寫的測試程式和主要程式都好了,可以把測試程式給別的合作程式設計師看,教導溝通主要程式是如何使用。 
  4. Unit Test 是一種投資,越早投資越好。當之後每開發寫好一組,還可以連帶之前的一起包裝成測試套件,全部都測過一遍,確保程式都以穩定。 
  5. 單元測試是自動化測試的基礎,如果搭配了程式涵蓋率,可以知道哪邊還沒測試到,盡量補上它。
讓程式設計師不想寫和維護 Unit Test 的藉口有:
  1. 覺得寫完程式測一測,log 插一插,畫面按一按看到結果就好了,反正老闆只看系統表面、客戶也只是操作不要有 Bug 就好。 
  2. 規格總是愛改,從上游規格設計就不健康了,朝夕令改,我下游的開發人員幹嘛那麼辛苦,寫完程式又寫完測試程式,才又跟我說要加什麼需求,要變更什麼需求。 
  3. 時間根本不夠用了,不夠我開發,時程都追殺我了,我哪有時間寫測試程式。臨時收到需求變更,我改好程式對就好,之前寫的測試程式不論誰寫的,先不管。
以上種種因素不論是天使或者是惡魔在開發人員心中交互掙扎,唯有體會過寫 Unit Test 帶來的好處的開發人員,才會堅持的繼續寫和繼續維護下去,讓程式可以更透明化。而時間不足夠、需求變更狀況發生、老闆同事們的不重視,則會讓怠惰的心態產生,最後惡魔更加得意。動力和藉口不用整理太多,因為只要幾項成效,殺傷力足夠,天使與魔鬼之間的勝負就定局了。

Thursday, March 24, 2011

What Is a Game

你玩遊戲嗎?會玩到沈迷嗎?光看 iPhone app 在 App Store 裡面的銷售就可以發現遊戲系列是最受歡迎的。是什麼讓遊戲可以不一樣?我看著 Game storming - A Playbook for Innovators, Rulebreakers, and Changemakers 這本書的第一章談 What Is a Game 分析的程度非常清楚,讓我來瞭解看看這些組成遊戲的基本元素。

遊戲空間:要進入一個遊戲是要進入另外一個新的空間,讓我們每一位玩家可以讓原來現實的人生獲得短暫的暫停,而接受遊戲規則進入遊戲裡面。遊戲建立了一個全新的世界,一個會運作的世界。所以對於加入的玩家要遵守制定的規則,會讓玩家感到暫時的真實感,稍微不太順手,或著跟平常生活是矛盾的。如果沒有同意規則,遊戲是無法成立的。

遊戲邊界:一個遊戲的邊界是時間和空間。當玩家進入,遊戲進行會有時間在跑,當玩家離開遊戲空間則就遊戲結束。遊戲空間是可以暫停的,我們可以想像玩家想要暫停吃下午餐或者上廁所。所以可以想像玩家將自己置身於這遊戲空間裡頭。

互動規則:在遊戲空間裡面,玩家要遵守遊戲世界訂定的規則。例如幾個回合能做多少事情,如果玩家做超過遊戲的規定,我們稱之為作弊。

遊戲紀錄:遊戲物件會紀錄著遊戲資訊,不論是位置或是狀態或是積分。當得分了這就是遊戲資訊可以被紀錄。遊戲紀錄可以用來追蹤進行的程度,記載了遊戲的狀態。我們可以簡單的想像當得到了多少分數,遊戲可以到怎麼樣的階段。

遊戲目標:玩家必須要告知怎麼樣遊戲會結束。是可以讓所有玩家接受與瞭解的。有時候遊戲是以時間導向,像是運動系列。有些是分數導向達到滿分及遊戲結束。

Wednesday, March 23, 2011

Amazon Kindle 的閱讀體驗

Amazon Kindle 拿著閱讀至今跟著我已經一個月了,他真的是閱讀上很好的個人圖書館。我在開始這個部落格有提到,如果我們不再學習,我們就不會進步,學習是要靠自己的。Kindle 他不只是一個黑白閱讀平面裝置,更是一個隨手可讀可翻的學習好幫手。

Amazon Kindle 可以分為硬體裝置、軟體閱讀、平台服務。

Kindle 硬體裝置在閱讀上相當的輕巧,隨身攜帶都不成問題。電池方面如果把網路連線關掉可以撐比較久,如果網路沒有關閉的話,平常時常閱讀大概不到一星期要充一次電。他在左右兩邊都各安排了左右翻頁的箭頭按鈕,可以依照個人拿著的習慣來翻頁。

Kindle 的裡面呢?作業系統本身提供了閱讀上各種控制的操作,包含了基本翻頁到快速 Go to 封面、目錄或者第幾頁。由於 Kindle 在翻頁上速度跟翻實體書瀏覽速度截然不同,所以有目錄查詢幫上很多忙。閱讀時候如果看到重點可以隨時劃下底線,輸入些筆記在旁邊,碰到不會的單字詞有英文字典可以提供英文翻譯。或者哪一頁相當重要可以加整頁面折起來作為查詢快速翻閱使用。雖然 Kindle 可以閱讀各種文字檔案類型,但是要完全支援上述那些閱讀體驗,要用 Mobis 檔案。所以在 PDF 放到 Kindle 裡面看,就會相當的失敗了,因為它是把每一頁變成圖像在讀,要移動游標看特定的區塊,放大和選取方面和我們一般由左至右閱讀有不順的感覺。所以目前為止我放在 Kindle 裡面都是 mobis 檔案為主,剩下檔案類型就回到電腦上閱讀。

Amazon Kindle 本身提供了 Whispersync 服務,這是要在 Amazon Kindle store 買的書才能享有此服務。Amazon 在賣一個 kindle 版本書時候,提供了一個 Buy once, read any where 的機制,讓同一本書可以在 Kindle 裝置上面閱讀之外,Mac 電腦、智慧型手機上都可以下載來閱讀,而且提供了同步的機制。例如今天在 Kindle 上面看完同步後,稍候在 Mac 上面打開,即可同步到剛剛看的最新頁面,讓閱讀不間段。此外最近 Amazon 在 Kindle 多了一個 Social reading,每一個註冊 Amazon 有買 Kindle 書的會員可以在 Amazon 官網建立自己閱讀頁面,讓自己在閱讀上劃下任何重點以及摘錄筆記,可以做分享,甚至分享到 Twitter 上面。且 Amazon 在賣 Kindle 版的書籍,通常會比原來實體書在打個折扣,通常是 60% 折,這方面有他們和出版商定價策略,網路上許多部落格都有在說名這點介紹。我們在閱讀上可以選擇 Kindle 版本享有比實體書的折扣,算是不錯的回饋了。

Friday, March 11, 2011

Auto load more when scroll to the bottom of the list

當我們在開發 iPhone app 使用到 table data source 幫我們處理資料列表時候,如果在列表最下面原先就有設計配製了 more 按鈕,這顆按鈕可以按下去載入更多後面的資訊,載入新資訊後,滑動往下看看到底,再按下更多按鈕。

如果今天希望操作上 scroll down 到最底端,可以自動的載入更多資訊。我們該怎麼做?

使用 github 上的 opensource project Three20 來開發,做法從 TTTableViewDataSource 著手:加入 TTTableViewDataSource 的 tableView:cell:willAppearAtIndexPath:,用此可以來辨別現在畫面上的 cell 是哪一個。判斷是不是最後一個 cell,且該 cell class 是我們放的 more 按鈕。將 more 按鈕的 loading 啓動,開始運轉。告訴 table view 不要選取最後一個。告知 self.model 開始載入資料,而且是 more 的方式加上資訊。

Thursday, March 3, 2011

ShareKit 一套讓 iPhone app 內容分享出去的 Library

故事情境一、 John 有使用 Delicious,如果在 iPhone 上使用某套軟體看到了喜歡的連結網址,希望可以記載起來,如果有一顆 share 按鈕,這將會是不錯的功能。

故事情境二、 Marry 有用 Facebook,他在使用 iPhone app 裡面做了一個很不錯的效果,類似得到某某積分,如果可以把這個快樂事情簡單的 Share 到 Facebook 平台,這將會是多麼棒的成就感。

故事情境三、 Henry 在某某 iPhone app 裡面看到某句佳句,希望可以 tweet 到自己的 Twitter 上,如果 app 有內建這樣的 share,這樣也是不錯的體驗。

ShareKit 是一套 Open source,可以讓 iOS apps 方便做分享的 library。它支援的 Services 有 Delicious, Facebook, Instapaper, Twitter, Tumbir 等等。分享的內容可以是網址 URLs, 圖片, 文字甚至是檔案類型。ShareKit 會針對適當的 service 支援度,來提供並且處理好分享出去。它甚至可以 Offline Sharing,當今天沒有網路連線,依然可以分享,等網路接通順暢後,ShareKit 會把這些 pending 的項目寄送出去。

如何分享?使用 ShareKit 瞭解它的框架,即能明白它的運作方式,與未來想要幫忙擴充新的 Sharing service 才能順利。首先是 ShareItem,告知使用怎麼樣的 ShareItem ,裡面可以塞入網址, 文字或者圖片,各個對應到 Sharing URLs, Sharing images, Sharing Text, Sharing Files。將這些資訊包裝起來。

交給 SHKActionSheet,它就會根據傳入的 ShareItem 來打開選單,讓使用者可以挑選想要用那一種 Service 來分享出去,當使用者點選下去,可以再根據 index 來決定配對串接後面不同的 Share Service。