2015年5月10日 星期日

The Pragmatic Programmer : from journeyman to master 書摘


我們,採集的只是石頭,卻必須時時刻刻展望未來的大教堂。
                                                                                                                —採石工人的信條

  1. 第一章:注重時效的哲學
    • 負責你的代碼,不要找蹩腳的藉口
    • 不要容忍破窗戶:有問題就及時修改,別累積技術債
    • 做團隊裡「做變化的催化劑」:提供大家改變的契機,讓大家追隨你而改變
    • 永遠記住大目標,要見樹並見林
    • 使質量成為需求問題:讓你的用戶參與權衡
    • 定期為你的知識資產做投資
    • 批判地分析你讀到的和聽到的
    • 你說什麼和你怎麼說同樣重要:交流、知道你要說什麼、瞭解聽眾、選擇文件的風格和美觀
  2. 第二章:注重實效的途徑
    • 不要重複你自己:和重用(Reuse)差別在,重複(Repeat)在於你做了同樣的事情,你應該只做一次卻做了很多次,造成時間和成本浪費;而重用則是再次利用優秀的程式碼來達到效率上的精進。
    • 讓重用變得容易(Make It Easy to Reuse)
    • 消除無關事物之間的影響:提升系統各組件的正交性(即降低耦合性)
      • 有正交性的好處:提高生產率、降低風險、項目團隊、設計
      • 編碼:讓代碼解藕、避免使用全域變數、避免相似的函數
    • 可撤銷性:不要存在最終決策,你的產品隨時隨地都有可能砍掉重練
    • 使用曳光彈來幫助你找到目標:和原型製作的差異在於曳光彈代碼是完整的,之後會構成最終系統的骨架的一部分
      • 用戶能及早看到能工作的東西
      • 開發者建構了一個他們能在其中工作的結構
      • 有了集成的平台
    • 為了學習而製作原型:原型所具備的元素有
      • 正確性
      • 完整性
      • 健壯性
      • 風格
    • 靠近問題領域編寫程式(Program Close to the Problem domain):選擇特定語言或是編寫特別定義過的程式來解決問題
    • 估算以免發生意外
      • 理解提問內容
      • 建立系統的模型
      • 把模型分解為組件
      • 給參數指定值
      • 估算項目進度
  3. 第三章:基本工具
    • 用純文本保存知識(Keep Knowledge in Plain Text)
    • 利用命列Shell的威力(Use the Power of Command Shells)
    • 用好一款編輯器:好的編輯器應該具有以下特性
      • 可配置:可高度客製化
      • 可擴展性
      • 可編程性
    • 總是使用原始碼控制工具
    • 要修正問題,而不是發出指責
    • 不要恐慌
      • 將你的數據視覺化
      • 跟蹤
      • 使用橡皮鴨:向別人解釋你的程式碼,讓別人像鴨子一樣一直點頭,直到問題出現
      • 消除過程
    • Select沒有問題
    • 不要假定,要證明
    • 學習一種文本操縱語言
    • 撰寫能撰寫程式碼的工具
  4. 第四章:注意時效的偏執
    • 你不可能寫出完美的軟體
    • 使用DBC按照合約設計:
      • 前條件
      • 後條件
      • 類別不變項
(未完.....)

2015年5月2日 星期六

數學思考(Think Mathematically) 筆記&閱讀心得

大二下過了這麼久,終於有時間好好讀一本書了。

這次借來的看的「數學思考」是由建中第49屆314班全體同學合譯後出版。其實會讀到這本書真的是因為大學的專業課程所需,像是統計、作業研究、電腦網路等,大部份都需要縝密的分析和邏輯能力,逐一抽絲剝繭後才能找到解決方案。既然想說自己不是讀書的料,那就只好強化數學能力,畢竟數學是所有學科的基礎嘛。

⟪筆記部分⟫

這本書主要提供了一套可依循的步驟來看待數學問題。作者引入了「要點思考」(Rubric Writing)這方法,主要步驟有:

  1. Stuck
  2. Aha!
  3. Check
  4. Reflect
第一個Stuck是指遇到困難,作者提到「遇到困難是件榮譽的事」,因為你可以從中發現到思維上的障礙和不足點,好比說我是不是「沒有搜集足夠的已知條件」、「我不確定我的所求」或是「所使用的工具不對」等等。另外在這階段時要多多使用「特殊化」和「一般化」的技巧,特殊化是指找出某個符合題目的例子,包含要找到特例,來輔以自己的想法;而一般化是問說「為什麼這樣做才是正確的」,就是確認自己的方法是否正確,之後能不能套用到類似性質的問題上。

第二個Aha!是指在解題時想到好點子就記錄下來,不管是靈光一閃或是經過縝密推論而得到結論,讓你很開心、愉悅,覺得離解答又更進一步的想法,都把它記錄下來,在往後的計算也可能再次用到。

第三個Check顧名思義就是檢查任何的計算或推理,你也可以用幾個例子檢查你所發現的法則(特殊化),最後再看看你的解法是否能解決原命題。

最後一個的Reflect是指想一下發生了什麼事。可以寫下重要的想法或是記憶中引人注目的時刻,然後確實地仔細思考在這一題中學到了什麼。

經過以上步驟就完成了要點寫作,再加上作者所提供的「進入」、「攻擊」、「回顧」,這張圖在解決數學問題上就顯得十分有用。

p.129 數學思考整體步驟

⟪心得⟫

這本書閱讀起來十分輕鬆,一個晚上就讀完了。看完後我第一個想法是:「假如我高中時代有看過這本書就好了。」從小時所接受的數學教育一直以來都是大量算題目、介紹很多工具和方法、熟練不同的解題技巧,到最後只要題目再有新的變化還是招架不住。我記得我高中有個老師每堂課就要我們背題目,尤其是矩陣那個章節更是要求。所以從教育來看,有兩個點很值得檢討:

1. 思考、辯駁、討論的訓練


台灣的數學教育一直很填鴨,課堂上我們總是希望老師教得愈多愈好,教更多解題技巧,學生做愈多題目愈好,可是卻常常缺乏討論的機會。近日才看到關於猶太人的教育相關文章,他們對於孩子放學後會問說:「你今天有沒有問了好問題?」而不是像台灣的家長問說:「今天考得如何?」「有學到什麼?」。愛因斯坦曾說想像力比知識重要,我把它解讀為「提出好問題比獲得知識更重要」因為提出問題時你要對該領域有一定了解,而且也代表你願意學習。

在我們的中小學教育中其實還蠻有這種練習的,讓學生發言、問問題,都是很好的機會。可是到了國高中,面臨升學考試壓力,這種討論的模式大量減少,問問題也傾向於很簡單的回答,非常可惜。

此外台灣人也很奇怪,就是會有菁英主義。菁英不是不好,可是大家總會希望說有個唸書高手出現,他總是自己唸書,然後硬是比別人高分,造就班上大家都自己念自己的,你要跟我討論課業門都沒有。可是假如你今天沒有外在幫助,缺乏討論和問問題,又怎能期待大家都變好呢?

2. 分析問題、深入思考的能力

從高中進入到大學後,教授開始用原文書上課。一方面是讓我們練英文整我們,另一方面是讓我們完整接觸洋人的想法和思考方式。可是台灣學生在這塊十分欠缺(對我就是其中一位),他們對於一個問題都可以有很完整的思考脈絡,就跟在數學思考裡面闡述的雷同,從已知慢慢推到未知,並且不注重於標準答案,而是自己的答案能不能說服他人。

在台灣考試考久了我們都希望出現那種十秒鐘就能解的題目,我們要求標準、快速的答案,所以才會有人覺得台灣都被標準答案綁死,導致我們長大後無法洞悉問題、提出有效且長遠的解決方案。

與其做大量訓練,不如給我們下一代有用的魚竿,教孩子如何思考,尤其是在數學這塊。



2015年4月6日 星期一

為了開發iOS App,要如何先學好Objective C? How to learn Objective-C well in order to develop iOS App?

這個寒假以來大概是我腦力消耗最多的時候了。自從學校的網頁設計課程教授網頁手機版設計後,我就打算改成iOS版,然後開始想買哪種Mac,後來在室友的幫助下買到一台二手但是狀況極佳的Macbook Pro,就這樣開始了學習Objective C的旅程。

而剛好買玩電腦前後,學校有了個做App的比賽,剛好就藉這機會報名參加。那時候剛好是期末考,要在期考時完成作品說明書也是很累人。他有分初審和決賽,結果初審只有格式不符的沒通過,對於自己的辛苦準備實在有點過意不去啊。

實際上也是到1/25之後才有時間學習,剛開始被MVC的觀念卡住,還有一些瑣碎的物件導向知識又會出來反咬我。所幸後來就慢慢克服。我使用的教材以Stanford CS193p Fall 2013-2014為主,查資料時使用"Programming in Objective-C Fifth Edition",對我來說這線上課程真的就有如在史丹佛上課一般,老師講得緊湊又有趣,非常推薦。

回歸正傳,要開發iOS App還是蠻建議從Objective-C開始,理由不外乎有:

  1. Objective-C現有的程式碼多,Stackoverflow上一堆相關問題回答
  2. Objective-C已經存在許久,穩定度經得起考驗
  3. 學會Objective-C轉換到Swift根本無痛轉移,只是有些微語法差異
學了一陣子後發現重要的還是基礎觀念,每次有Bug大概有一半以上都是基礎觀念在咬我。很多想說我這功能不知道怎麼寫、不知道有什麼函數可用,其實網路上很快就可以查到。StackoverflowApp Coda上就有很多可用的程式碼。可是你如果不知道函數要吃的參數型態、這邊該不該alloc、NSDictionary要怎麼用、MVC架構如何導入,那很快還是會卡住。

我個人蠻推薦高見龍大大在部落格上的說明,像是protocol、instancetype都介紹得很詳細。另外雖然說語法常常會讓人卡關,可是相對應的電腦科學背景也頗需要。像是我最近剛讓iOS去跟SQLite做query,一些資料庫背景知識有時候會跑出來咬我。

不過我相信只要有毅力,真的就會慢慢地把App做出來。加油!

2015年3月11日 星期三

跳脫舒適圈一直都是好事?

有人說,跳脫舒適圈,可以讓人成長,挑戰自己的極限,還能擴展視野,看到不一樣的東西。

現代產業強調跨出舒適圈,投入其他領域,找到不同的商機,甚至異業結盟都有可能,讓自己的專業無限擴展。換言之,窩在自己的舒適圈,一樣可以活得很好,但是可能就看不到外面更美好的世界了。

不過,大二後我對這個有了不同看法。第一,一個人如果突然跑到自己完全不熟悉的領域,而且完全都沒準備,這樣用「救火」來說是否比較貼切呢?一位法律背景突然要去開刀也不太可能。因此,應該說是要找個跟自己有「一定」關聯的產業去做,才不至於出現極大的反感。好比法律系的可以去打醫療官司,可以去對付專利蟑螂。縱使之前不知道這是什麼,一做下去仍是很有意義的。

反之,如果新領域僅是要你幫忙、替他人賣勞力、絲毫不給你發揮空間,而且又跟自己背景極大的無相關。此時,就要審慎評估了。當然也有不乏救火的人才,柯P就是很典型的例子,受到刺激之下出來競選成為台北市長。他在手術房的經驗給政治人物新的看法,做事快狠準,乾淨俐落。

而這當然建立在他願意去做,他也覺得很有意義。於是乎,我試著探討「跳脫舒適圈」是否要什麼前提?倘若我覺得沒意義還要去做嗎?萬一我覺得有意義,但是做了之後發現不是自己想要的呢?這都見仁見智。重點在於,至少要有意願去做,也要去模擬看看做了之後會發生什麼事情。

其實當自己做了全盤考量,就等於跳出了舒適圈了。

因此,我會覺得,要跳去的地方最好要跟自己領域有關聯,或是符合自己某些特質。這樣做起來才會有意義,縱使可能會很累,但是已經做過全盤考量,才有本事走下一步,也才讓「跳脫舒適圈」的意義完整體現出來。


2015年1月31日 星期六

能力 v.s. 熱情:寫程式要有滿腔熱血,但是我們要怎麼把程式學好? Ability v.s. Passion: Being enthusiastic is the essence in programming, while learning skill counts.

最近在學ios objective c開發,突然有些感觸。自己學寫程式兩三年了,早就知道程式是我這輩子最想做的事情。但是有時候熱情並不會讓自己突然變成程式高手,也不會一夕之間變成比爾蓋茲。你可能聽過身邊的人說他覺得寫程式很有趣,但是到後來能變成程式高手的又有幾個呢?他們會持續做這份工作嗎?

對於非英語系國家的人來說,在英文環境下寫程式同時也變成一種障礙。

你看出來了嗎?有時候固有滿腔熱血很重要,但是一股腦兒地往前衝只會讓自己跌個狗吃屎。

我之前寫程式就是一直往前衝,我看到什麼文章就看,別人推薦的也看。雖然說多多益善,但是卻沒有深刻理解,就像過往雲煙一下子消散而去。我一直以為多看、多寫、多想就可把程式學好,但是顯然地我想得不夠深。而且我看來,學習能力也是很重要的一環,孔子說:「學而不思則殆。」真有他幾分道理。好比說學習函數我就會注意:

  1. What(追本溯源):函數的作用是什麼?語法是什麼?為什麼要有這個函數?設計理念是?如果有類似函數,他可帶來哪些效益?如果不使用它我還有哪些函數可用?
  2. How(運籌帷幄):這函數要怎麼用?放在哪個區塊?他有哪些parameters?他和其他元件可以怎麼互動?我怎麼發揮它的最大效益?
  3. When(抓住時機):什麼時候要用這個函數?為什麼有些programmer在這裡要用這個,原因是?
只要想要把這三個東西抓住,我就會一直查很多資料,同時間我也學會了。而這也是為何給同一份程式作業,有些人會腦袋一片空白,有些人很快就知道如何下手。差別很可能就在這裡。

整體來說熱情是幫助自己在遇到障礙時不會退縮,但是寫得好不好就很攸關學習能力和思考能力了。以學習能力來說,一定要不斷地問自己為什麼,讓你的思考得到極大化。

而在學習一個新語言時,因為程式語言的基礎理念大同小異,有先學過c其實就很夠用。使用高中的讀書技巧也很有用:
  1. 掌握程式整體脈絡、語法特色、函數寫法、資料型態等
  2. 把握來龍去脈:寫程式就像蓋房子,基底(使用何種程式)怎麼建?建材(資料型態、函數)選擇?
  3. 上機實作、多看別人的程式碼,還有Don't reinvent the wheels!
相關自學能力可看這篇:自學能力 - MBAlib

最後著看到這篇文章的人都能變得愈來愈強!

2014年1月9日 星期四

對於大學生活的省思(三):讀書和玩樂

上一篇:對大學生活的省思(二):偏差的國際觀、不足的國際競爭力

我覺得我們就算經歷過教改,甚至十二年國教,學生還是只會念書,根本不知道自己要什麼。找到興趣和人生目標所在絕對比念好書還重要。可惜我們還停留在只要上頂尖大學就會成功的想法,進好大學後就可以玩四年了。

在大學,玩和唸書一樣重要,玩不是說在宿舍打一整天的LOL,而是要玩出名堂,除非你玩四年的Game然後做出不得了的遊戲或是當個電競玩家(可惜在台灣還不被鼓勵);念書也絕非是一直念書,而是學到終身可用的知識。我有個同學每天就是念書,談話多半離不開考試、報告,一心只求高分。看在眼中也是蠻變態的,說不定他喜歡念書,可能適合走研究路線,但是長遠來看那思維還是停留在國高中時代:只為分數而唸書。

關於念書我覺得還有一點很奇怪,大家好像都見不得別人好:看到別人念書就會酸說好認真啊~裝認真喔~。我不懂你這樣說有何用處,奇怪這資源是我努力拿到的,我想要認真學習你就是不爽;其二,你覺得你大學都不念書出來會有競爭力嗎?你說課業又不是全部,對,不是全部,但是處於知識經濟的時代,四年後你說你培養了膽識和社交能力,的確這很重要,但你拿什麼見識給面試官?

我覺得大學還有一很重要的功能:讓學生會學習自我學習、會自動學習。我念的資管要寫程式,老師教得不錯,就是細節沒有教很多。問題來了,每次寫程式時同學對題目不會來問我時,我給他們一個函數或想法,他們就很訝異說老師沒教這個啊~我又不會。的確這不是你的錯,可是大學資源這麼多,網路和圖書館就在你周遭,你怎麼不花一點點打Game的時間來查個資料呢?

可能是因為我的高中畢業生進成大的較少,所以我有幸能進成大讓我十分感動,也十分珍惜在成大的每分每秒。想要讓今天比昨天更好,想要學更多我想知道的事,雖然可能很累,但我不會後悔。

對大學生活的省思(二):偏差的國際觀、不足的國際競爭力

上一篇:對於大學生活的省思(一):生活習慣

在國際化方面,我真的覺得我們跟別人差太多了。以東歐的克羅埃西亞來說,路上的司機、郵局人員大多會講一口流利的英文,飯店人員就更不用說了。你會說他們母語的發音系統和文字跟英文很像所以學得很快,錯了,是因為克羅埃西亞僅有二百多萬人口,不吸引外資外國觀光客是絕對必要的。而我們呢?學那麼久英文就只是用來應付考試,就算在外語環境充足的台北,用英文隨便問一個人都不一定能回答。

我深深感受到,我們還停留在台灣比中國好、晶圓製造很強、科技品牌閃耀全球,錯了,那是過去,世界變化太快了,然而我們一直還自我感覺良好。對應到大學生的思維,就變成我不學英文又沒關係,我看國內新聞就好,國外大事關我啥事?你說你看評論網站,那很好,可是不是第一手資訊,很多也是拿過外資訊翻譯過來的。畢業標準要多益820,這點做不到的話難不成要要求國外客戶用中文跟我們溝通嗎?

成大是一所綜合性大學,也是目前南部最好大學,常常會有國際人士來演講,偏偏身邊同學很少人去聽,十分可惜。在大學把書唸好根本不夠,那只是國高中的思維,必須還要學習如何提問、批判性思考,要達到這點很簡單,多看國外的評論網站是不錯的選擇,或是看TED演講都很棒。

下一篇:對於大學生活的省思(三):讀書和玩樂