Beautiful Code

Beautiful Code

程式設計師最討厭的工作,並不是撰寫難度很高的程式,而是維護一堆缺少完整文件又長得醜的程式。尤其現在能具備完整文件的系統專案已經少得可憐,所以美化 程式碼的要求才會日益增高,如果能做好基本功,即使沒有文件輔助,工程師也能輕鬆追蹤程式碼。不過,要寫出好的程式碼是需要功力的。

Beautiful Code=專案問題最佳解法

要寫出完美的程式,需要透過實務經驗或前人智慧,一點一滴累積實力,並非一蹴可幾。但軟體專案常因時程要求,在系統開發上只求在時限內達到目的,往往忽略軟體工程上強調的重點(例如物件導向的觀念、設計模式的運用等)。

書名中的「Beautiful」一字,代表著解決程式難題的最佳撰寫方法,這些解法是專家在執行專案及設計系統架構的過程中,不斷地累積、歸納、 整理而得出,等同於系統設計好手們常高談闊論的設計樣式(Design Patterns)。閱讀本書,就如同站在巨人肩膀上,瞭望整個軟體開發世界,透過高手的文字描述,洞悉他們面對軟體專案發生問題時,如何思考出解決方案 的過程。

本書內容構成十分有趣,透過作者Greg Wilson的召集,將業界大師級的軟體設計師及科學家統統拉進來,貢獻出畢生所學,集結三十餘篇的文章,簡短且精闢的文字流露著專業及縝密的思路。本書 作者所有出版收入均做為公益之用,捐獻給國際特赦組織(Amnesty International)。

既然稱為程式「設計」,當然也需要融入美感。要寫出具有美感的程式,讓人稱為藝術之作,除了需要掌握程式語言本身的特性,多看、多研究高手的作品 之外;也要如同寫文章一般,具備足夠的知識、打好基礎,才能夠文思泉湧,寫出好的程式,就如同本書Ruby之父Yukihiro Matsumoto所提到的觀念:Treating Code As an Essay。

除了要Beautiful Coding,Beautiful Debugging也是一門學問,在開發過程中,除錯常是影響程式撰寫能否順利進行的關鍵。透過系統化流程處理程式錯誤的偵測,並有效找出問題徵結,才能有效率地在最短的時間內完成除錯。

想知道有經驗的專家們,在面臨軟體開發的難題時,如何發揮智慧迎刃而解?本書如同論文集般,收錄各領域技術大師的文章,以各式各樣的案例,搭配不 同的程式語言呈現多元化的應用。像是以極簡的正規運算式(Regular Expression)語法,比對複雜的檔案內容或應用在搜尋網站系統記錄檔內容;以Perl提供的現成Bio套件,辨識生物科技基因;利用NumPy快 速處理多維度的陣列資料等。

用對程式語言,才能事半功倍

一個系統或程式,可以用不同的程式語言撰寫,各家寫法也大不同。因此,需要考量到程式語言本身的特性,選用適合的語言開發。針對各種目的,運用不同的程式語言實作,不但能發揮該語言的優點,程式也不致過於繁雜,增加閱讀及日後維護的困難。

本書不限定於探討單一特定程式語言,包含XML、Ruby、Linux等,涵蓋領域很廣。從NASA太空總署專案,到作業系統核心設計等主題,你 可以從不同角度體會各類應用。雖然有許多案例是一輩子都不可能參與的專案類型,但都能從專家的經驗分享中,獲取這些程式撰寫技巧。

就實務而言,軟體專案時程的不合理壓縮已經成為常態,身為程式設計的一員,更應該以撰寫漂亮的程式碼為要務,在有限時間之內發揮最大的設計價值。

如何撰寫漂亮的程式碼?本書作者歸納整理出以下建議:程式碼需內容簡潔(brevity);穩健低風險的方法(conservatism);擁有 變更之彈性(flexibility);並在這些特性之間取得平衡(balance)。如果你能夠掌握這些原則,再透過閱讀本書,思考咀嚼出一番心得,相 信你撰寫的程式碼,便能夠美得內外兼俱!

資料結構與演算法的課程,只要是資訊相關科系的同學必然接觸過,對於演算法的定義,筆者在網路上搜尋了一些相關資料,找到洪朝貴教授一句十分貼切的形容:「有規律的愚公移山」。要能用最有效的方式重複地進行工作,必須了解這個工作最花時間的地方在哪裡。

筆者自從開始工作之後,便很少再回頭碰相關的議題,主要專案的性質大多以應用系統為主,至於演算法的細節,倒不那麼在乎,也是因為目前所使用的程式語言,多數已提供相對應的程式庫及函式呼叫,便於直接使用而不需重頭再來。

演算法能幫上什麼忙呢?

若你的工作對計算機系統資源錙銖必較(像是IC設計、嵌入式系統、手機應用等),演算法的觀念就顯得重要許多。在這些有限資源下,要發揮高效能的運算處理,資料量的增加對處理時間增量的影響有多少,必須瞭若指掌,才能撰寫出品質良好的程式碼。

這些常見的演算法如排序(Sort)、堆疊(Stack)、佇列(Queue)、樹(Tree)等操作,你應該都已耳熟能詳,這些資料結構或演算法,通常 不需要自己動手打造,不管是採用Java或C#等通行的程式語言,這樣的演算法通常已被完整包含在平臺提供的函式庫中,僅需輕輕鬆鬆直接呼叫API即可。 所以這也是演算法在工作之後會逐漸被遺忘的原因。

精神在於建立思考過程

當然,這些已經十分通俗常見的演算法觀念,對於剛接觸電腦科學這領域的新手來說,的確是一門必須好好花點心思,打下紮實底子的重要基本功。從研究 這些演算法的過程中,能深深體會每個演算法的運作細節,除了瞭解如何運用這些演算法之外,同時可以思考不同的運作方式對系統效能的影響,從這樣的精神延伸 到未來面臨其他應用時,也能用相同的思維來檢驗自己所撰寫的程式碼,找到系統負荷的瓶頸所在。

演算法與使用那一種程式語言來撰寫並沒有絕對的關係,演算法所要表示的精神是以不同的處理邏輯及順序來達到某特定目的,而處理過程中在不同情境之下,將有不同的效果。

本書以Java為實作演算法的程式語言,故閱讀本書必須對J2SE標準的函式庫有基本的認識。作者針對程式開發人員在工作經常遇到的演算法及資料 結構,以淺顯易懂的方式,說明每個演算法的意義,結合實作的範例讓讀者更清楚其應用的方式為何,每個章節並附上練習題目讓讀者自我檢定學習的效果。與過去 筆者在學生時代由教授選讀的教材相比,本書無論在章節設計上及程式範例的,閱讀起來的確是輕鬆許多。

廣泛討論各種演算法,參考價值高

本書首先從Big O的觀念介紹起,這是在討論演算法複雜度時相當重要的一環,接下來便依序介紹迭代(Iteration)與遞迴(Recursion)、(List)、佇 列(Basic & Priority Queue)、堆疊(Stack)、基本及進階排序法(Basic & Advanced Sorting)、二元及三元搜尋樹(Binary & Ternary Search Tree)、雜湊(Hash)、集合(Set)、平衡樹(B-Tree)、字串搜尋及比對(String Searching & Matching)、計算機幾何學(Computational Geometry)、程序最佳化(Pragmatic Optimization)等議題。

在討論每個主題時,作者以圖例的方式,先說明演算法本身代表的意義及使用時機,針對該演算法進行Java程式碼的實例探討,而針對不同類型的資料 結構亦會與其他相關的主題相互比較,方便讀者分析思考;此外,本書在實作每一個演算法時,亦會搭配單元測試框架JUnit來驗證程式碼的正確性,結合當今 流行的測試驅動開發(Test-Driven Development)的觀念,一般的演算法書籍十分少見。

如同大師Niklaus Wirth的著作《Algorithms +Data Structure=Program(演算法+資料結構=程式)》所示,資料結構與演算法即為程式設計的基礎。想練成所向無敵的無影腳之前,好好地紮穩馬步才是基本要領。

去年轟動一時的《Java Puzzlers》,先前筆者已經透過專欄(請參考iThome第207期)介 紹,它是一本闡述如何避開Java語言設計陷阱的好書。值得讓國內讀者高興的是,本書的正體中文版已於今年三月中問世(簡體中文版於今年一月出版,書名為 《Java解惑》,譯者為陳昊鵬,人民郵電出版社發行),透過《Java 2全方位學習》暢銷作者朱仲傑的用心詮譯,加上他在Java領域的專業及流暢的文筆,相信為大家詮釋這本書是再合適也不過的了。

為了讓國內讀者方便而快速吸收剛出爐的技術新知,國內不乏許多科技類的翻譯書。雖然本書的原文內容用字淺顯易懂,畢竟國內讀者對中文書的閱讀能力 遠比對英文書要好,當然筆者亦同。在閱讀翻譯書時,你也許會遇到以下狀況,來自國外的暢銷書經過國內翻譯之後,有時會有每個中文字都看得懂,整句則不知所 云的窘況。

一本好的翻譯書除了譯者本身的專業程度外,廣泛地收集相關資料來加強內容的深度,才能豐富譯作的內涵,讓讀者覺得不只是單純的文字翻譯,而是知識的整理與佈達。

虛虛實實,實實虛虛

除了研究Java語言的深度,同樣值得品味的是,隨附在難題內容中容易讓人產生錯覺的幾何圖形(這讓我想到家樂福的商標,是字母C而非箭頭之 意),有些圖形你可能曾經看過,這些幾何圖形表面上看起來簡單,但實際上另有玄機,由不同角度下檢視則有不同的效果,就像他們所設計的謎題一樣。在書中的 《附錄B》便整理了這些圖形的源由及設計理念,算是在研究Java之外的一種樂趣。

本書是針對Java初階及中階的開發人員設計的書籍,所以讀者最好已經對J2SE的技術已有使用經驗。為了挖出藏在Java語言中的陷阱,每個難 題都是作者精心設計,入門者在閱讀某些章節時可能會覺得有些吃力,譯者為了讓本書能推廣給每位Java的愛好者,在一些原本的內容未陳述清楚之處,貼心地 加上譯者的詳細註解(像是Rube Goldberg是誰?為什麼要取名為Cleanup?),讓讀者在閱讀時更加順暢。

雙關語標題也是本書一大特色

先前筆者研讀《Java Puzzlers》原文書時曾遇到一個狀況,就是作者在每個題目的標題會以一些特殊名詞或雙關語來命名,可能是結合某電影片段的名句,或是某些文化性較強的經典俚語,讀者若非熟悉國外文化,可能無法體會幽默智慧之處。

為了讓讀者更能體會作者的巧思,中文版在書末特別增加了令人感動的《附錄C》章節,針對全書所有的俚語及雙關語,說明了這些辭彙的源由及代表的含意。

有名的書要翻得好,的確不容易。就本書的翻譯品質來看,在專有名詞的英中對照上十分直覺,我想應該是譯者先前已經累積不少寫作經驗使然。另外,就文字編排及版面配置上,閱讀起來十分舒服,讓閱讀的過程更為愉快。

這本《Java Puzzlers》的題材,都源自作者在一些Java研討會上發表的生動內容,採用輕鬆詼諧的文筆撰寫。為了可以感受一下原書作者生動的脫口秀實況,你可 以在這裡找到當年兩位作者脫口秀的簡報實況:www.javalobby.org/av/javapolis/prezo- fullscreen.jsp?id=25,或者在這兒可以參考當年脫口秀的台詞:www.linux-mag.com/content/view /1293/2205,應該更能身臨其境。

譯者不吝提供了免費試讀章節,讓你可以先享受後購買,在網路上下載試讀內容 (www.javaonline.idv.tw:8080/forum/mvnforum/listthreads?forum=17)。對於本書的內容 有任何疑義,你也可以透過譯者的網站反映你的建 議,好書需要讀者支持,這也是鼓勵好作者/譯者的最佳方式。

《Learning SQL》

《Learning SQL》

SQL(Structured Query Language)是一種程式語言,它可以在命令模式下讓使用者與資料庫系統進行交談式互動,或者是編寫成程式檔(SQL Script)執行。它的語法簡單直覺,容易學習且快速上手。發展至今已經約三十餘年,廣泛流行的程度不減當年。

市面上流行的資料庫系統產品眾多,但以SQL進行資料操作的基本精神不變,每個產品為提供使用者更方便更有效的資料庫系統功能,除了標準ANSI SQL外,還會提供屬於自家產品特有的SQL語法及函式,像Oracle的PL/SQL、Microsoft SQL Server的T-SQL等。有鑑於初學者常常會因此而混淆,甚至混用,在本書介紹的SQL語法為ANSI標準,可適用於任何支援標準SQL語法的資料庫 系統上。

本書的定位為基礎入門書籍,所以會從最基本的觀念開始闡述。研讀本書你不需要有任何資料庫的基本觀念,作者以深入淺出循序漸近的方式,將你帶入資 料庫領域的大門。在書中採用的實作案例,是採用免費的MySQL資料庫系統做為練習平臺,透過實際操作讓你對SQL語法更有感覺。

結構化查詢語言,簡單得讓你可以立即上手
第一章先從SQL過去的歷史背景及演進過程談起,介紹關連式資料庫的基本觀念及一些重要名詞。第二章開始就以實作方式,介紹如何透過MySQL進 行資料庫系統的操作,教你如何一步一步以SQL命令建立資料庫,建立及變更資料表(Table)結構,資料型態的差異,資料的增刪修改等。

由於資料查詢功能是SQL語法的精華所在,第三、四、五章說明如何從資料庫找出你要的資料,這就提到SELECT語法的結構及相關撰寫方式,如何 搭配SQL提供的函式形成所需的過濾條件,以及跨多個資料表的存取方式。這裡會談到許多實用的細節,利用Join方式從一個以上的資料表找出關連性,這也 會是許多報表設計時常會運用到的重要觀念。而Join的方式亦有許多方式,在第十章可以找到完整的用法說明。

第六章介紹如何運用集合(Set)的概念融入資料操作上,第七章介紹對於不同型態資料(字元、數值、日期等)的處理方式,其間的轉換方式為何,另外第八章提到利用群組化(Grouping)及聚集(Aggregate)的功能,對資料進行分組運算,產生簡單的統計結果。

當你的資料無法單純以一個查詢語法得出,子查詢(Subquery)便可以幫你解決。第九章介紹子查詢的使用方式,它可以當成另一個查詢的資料來 源,或過濾條件值,它亦是為十分實用的語法。而條件判斷的機制,在第十章介紹了CASE的用法,可以根據變數值來決定不同的處理。

在多人同時使用資料庫系統時,交易管理機制就十分重要。第十二章便介紹交易的意義,利用不同形式的資料鎖定方式,透過交易機制針對資料一致性及完整性上達到有效控制。第十三章談到資料的正確性亦可以透過限制來防微杜漸,透過建立索引來提昇資料庫查詢的效率。

SQL入門者的良伴,與實作相結合
只要你的工作會接觸到資料庫,不管是開發應用系統,或負責系統管理工作,或是製作分析報表,就會與SQL脫離不了關係。在實務上有很多報表產生工 具或是整合性開發環境,都提供自動產生SQL命令的強大功能,但身為IT從業人員的你,能深入了解SQL命令的用法,對於資料結構的關連性及資料操作的觀 念才會有更全面的了解。

介紹SQL的書實在太多,你或許會問:這本書到底那兒值得推薦?像是類似指令集、參考手冊的內容,只能在需要的時候當成字典般地查閱,所獲得的資 訊也較為零散,並非學習導向,通常是讀過即忘。本書內容架構以教材方式編寫,可以當成教師們授課教材,每章後面亦提供練習題目,章節規劃即為作者建議的學 習順序。也許是定位為入門書的關係,本書並非提及與DBA維護工作(像是Backup/Restore)有關的內容,以及如何撰寫Trigger及 Stored Procedure。若是這些內容也一併包含,就再完美也不過了。

Effective Project Management

Effective Project Management

「如何有效地管理專案?」像這樣的問題一直被大家討論著,然而影響專案成功的因素實在太多、太廣,從對內的資源的有效控管,時程與成本的精算,到對外與客戶之間的關係聯繫,專案需求的明確定義等,只要其中一個環節沒有顧好,專案常常會流於失敗,甚至嚴重關係到公司的信譽。

傳統的專案管理方法,是將作業內容及工具標準化,讓專案管理人員可以有效地透過系統化的方法妥善管理。然而在面臨不同性質的專案時,一樣的標準化方式也能 一併套用嗎?軟體開發流程也有重量級(像RUP)與輕量級(像XP、Agile)的差別,所以專案管理是不是也可以因應不同的需求而有不同的方法呢?

多樣化專案管理方式,讓專案也能對症下藥
《Effective Project Management》一書介紹了3種不同的專案管理方式:傳統式(Tranditional)、適應式(Adaptive)、及極限式 (Extreme)。光就第一部分介紹傳統式專案管理的內容就值回票價了,其他兩種方式更是可以讓讀者以不同的思考角度,看待專案管理的問題,了解不同方 法之間的差異。會有後面兩種方式也是基於傳統方式的缺點而改良,在觀念及方法上都是比較創新的。

兩位作者Robert K. Wysocki與Rudd McGary加起來將近70年的專案管理經驗讓內容更具參考價值,本書也受到PMI(Project Management Institute,美國專案管理學會)的加持,成為專案管理類之推薦書籍。

本書內容便是依這三種不同的管理方式分別闡述,第一部分包括12個章節,主要介紹傳統專案管理(Traditional Project Management, TPM),從專案的定義開始談起,如何界定專案的範圍(Scoping)、明確定義專案活動(Activity)、預估時程及所需資源成本、組織管理專案 團隊、監控專案進度,到最後的驗收結案。

而極限式專案管理(Extreme Project Management, xPM)主要是針對在專案初期目標尚未明確,且無法有效定義專案範圍,或是針對需求時常變更的專案,甚至連專案結束的方式都毫無章法可言。故xPM強調透 過4個相當短的階段(Initiate、Speculate、Incubate、Review)快速地反覆進行,在每個階段結束時,同時規劃下個階段的方 向及執行內容,減低因為不確定性的影響。

客戶常會以「花錢的是老大」的心態,需求變更次數的頻繁,讓整個專案的需求及範圍無止境的延伸。本書的第二部分以7個章節來說明,針對TPM及 xPM不足之處提出折衷的新方法:適應式專案管理框架(Adaptive Project Framework)。適應式的專案管理方式主要在於流程反覆進行,不斷與用戶互動以確保專案方向的正確性。包含定義版本範疇(Version Scope)、擬定循環計畫(Cycle Plan)、進行循環建置(Cycle Build)、實施用戶查核(Client Checkpoint),以及事後審查(Post-Version Review)等五大步驟。

第三部分則探討企業在進行專案時所應考慮的兩大議題,一個是在多個專案同時進行時,所需要進行的專案組合管理(Project Portfolio Management),在資源有限之下做到最大運用;另外是如何發揮專案支援辦公室(Project Support Office)的效用,提供專案在進行過程中最完善的支援任務。

清楚描述專案管理,紮實讀者的理論基礎
相較於兩年前的版本(第二版)單純包含傳統式專案管理的內容,在這個版本新增了適應式與極限式兩種不同的方法論點。作者的用意便是因應環境多變的 需求,希望以提供多樣化的管理方式來解決不同性質的專案難題,可以讓讀者以不同的思考角度來看待專案管理的問題,了解不同方法之間的差異。

就本書的廣度而言,是十分完整介紹專案管理方法的書,適合用來教學或當成工具書,但較少介紹實務經驗及案例分析建議,是美中不足之處。而就深度而 言,如何讓專案管理更為有效(Effective),就讀者而言會希望看到較具體明確的建議,若是需要針對某些議題再深入研究,就需要再參考作者列在附錄 中的參考文獻。

後一頁 »

Follow

Get every new post delivered to your Inbox.