2016年8月6日 星期六

[學習清單] 想學好Coding~還差得遠呢!

程式員求生指南:關於寫程式的二三事

公司讀書會的分享。嘗試ORID版
O: 較在意的文章段落
  1. 自我提問: 我適合當程式員嗎? 如果你發現自己寫程式、看程式、解bug都很痛苦,半年一年了也不見改善,也許這份工作不太適合你。
  2. 程式語言的基本觀念:變數、迴圈、陣列、遞迴、I/O、網路、多執行緒、物件導向、regular expression、functional programming、
          資料結構、演算法、網路協定
       進階能力:作業系統、資料庫、網路安全
       觸類旁通:函數程式語言、組合語言、Shell Script
  3. 程式員的要求是:寫出可讀、易維護的代碼。
R:1.  看到文章的自我提問和回答,就回想自己的Coding過程:解bug的時候無著力點時總是很煩很慌張,痛苦的心情是肯定有的,但解完的成就感還是大過於痛苦的心情,這樣我就可以再繼續下去。
        2. 接著看到基本觀念和能力等等,還不到感覺完蛋了,倒是感覺,好在這篇文章的整理,給了我的很大幫助就如同自我檢視清單。
I:多少的基本觀念和能力,都牽動著未來能否達到稱職的程式員要求,與其說在這篇文章學到些甚麼,不如說是看見了有哪些武功秘笈要看過。程式語言的基本觀念需在紮實的如:I/O、多執行緒、正規表達式、資料結構、網路協定、演算法;進階能力,除了作業系統感覺離我很遠,資料庫跟網路安全應是作業上應會被現實一直要求。
D:想當程式員?除了累積更多經驗還是經驗,沒甚麼捷徑,就是路很長,跟慢跑一樣,調整步調/呼吸,持續跑下去就對了。

程式語言基本觀念
變數、迴圈、陣列、遞迴、I/O、網路、多執行緒、物件導向、regular expression、functional programming……。

基本概念:
  • 資料結構
  • 陣列(array)、串列(list)、堆疊(stack)、佇列(queue)
  • 樹(tree)、二元樹(binary tree)、雜湊表(hash table)
  • 指標(pointer):這也許不算資料結構,許多高階語言也不讓你用pointer,但是對記憶體、指標要有概念,這是程式員與非程式員的區別之一
  • 演算法
  • 對以上資料結構的各項操作
  • 排序(sort):至少搞懂3、4種基本的排序演算法,例如bubble sort、quick sort、merge sort等
  • 搜尋(search):depth-first-search、breadth-first-search、binary search等
  • 其它:迭代(iteration)、遞迴(recursive)、分治法(divide and conquer)、時間/空間複雜度的基本概念(big O)等




網路上資源很多,Google一下、多寫一些程式練習,弄懂以上基本概念,應該就夠用了。

觸類旁通:
TCP/IP、HTTP、DNS等這些都是基本的網路協定。
ex: 請解釋cookie是怎麼運作的?

進階能力:
對作業系統(OS,operating system)的了解,是資深程式員應該具備的。例如:
  • Hardware: CPU, memory, I/O devices
  • Process, multi-thread, scheduling
  • Inter-process communication: signal, socket, pipe, named pipe, shared memory, message queue...
  • Synchronization, deadlock, mutex, semaphore
  • File system, cache, virtual memory, page fault...
  • Real-time system, distributed system

資料庫觀念:
關連式資料庫(relational database)

網路安全:
網路安全議題,是屬於系統管理者的範疇,例如DoS (denial of service)、DNS spoofing、man in the middle;有些則是程式員的責任區,例如SQL injection、cross-site scripting、cross-site request forgery等等。此外像驗證使用者身份的流程、儲存/傳送使用者敏感資料的方式,也都與安全有關。

函數語言:
函數程式語言(functional programming language)是另一種風格的程式語言,可以挑一個好好學一下。我個人推薦Haskell,但F#、Scala、OCaml、LISP、R、Erlang、Clojure這些也都不錯,各有擁護者。

稍微有個概念:
組合語言

指令:
工作中有用到Linux/Unix相關的OS,我建議應該要學一種shell script,例如bash。如果你是ops/service engineer或系統管理者,這應該是必備能力了

最後自我要求:
1. 可讀性高的代碼,通常是用很好的解法,解決了真正的問題
  • 你需要徹底了解問題(problem domain)
  • 你需要考慮過至少幾種合理的解法(solution domain)
  • 你需要對程式語言、程式庫、既有程式架構和可運用工具很嫻熟
  • 你要能以簡馭繁,而這代表你掌握了更高的東西
  • 例如牛頓的F=ma
2. 寫程式必須很有紀律,例如:

  • 不急著馬上寫code,先想清楚問題、解法、架構
  • 恰到好處的註解,少了不行、過猶不及
  • 用心想過的命名(程式界有句名言: There are only two hard things in Computer Science: cache invalidation and naming things.)
  • 壓抑copy & paste及產出一堆爛code的衝動:
  • Bingo! 找到一段code了,看我的copy & paste
  • 可以work就很好啦、這麼漂亮的解法……
  • 好累,我不行了,先commit code再說
  • 在commit code之前,自己再好好review一次
3. 越容易維護、擴展的代碼,代表它的複雜度越低
  • 必須做到low coupling、high cohesion,而這兩件事都很難
  • 低複雜度的軟體系統,代表裡面各個模組的複雜度都必須更低
  • 當你輕易多用了一個外部組件、增加了一個external dependency,你就把它的複雜度整個帶進來了,所以要很小心

3 則留言: