陳建隆:給資工系大學生的一堂課(三)
說起來一路從什麼都不懂的 iOS 菜鳥到現在, 自己不是什麼都懂的大師, 但也勉強算是熟練的工程師。 今天就來分享一下一路走來在軟體開發遇到的風景。 這段路我還沒走到盡頭, 我也相信自己會一直在軟體這方面持續行進下去。
讓我們繼續看下去!
很菜的菜鳥
很菜的菜鳥, 這個階段大概就是大學生時期, 似乎才剛從高中畢業後, 因為科系的關係開始接觸程式設計。 這個階段的任務主要是在熟悉一門程式語言, 深入的了解程式的架構, 以及讓自己熟悉用程式語言去思考問題。
這階段最重要的就是了解程式的美…
沿著一門程式語言的脈絡去學習。從淺到深, 從設計的目的到實做的細節。從開始到結束, 從framework到外部的library& plugin。學程式語言, 某種程度可以說是在學一種思考的方式。這個階段, 是理解程式語言思考方式的階段。什麼叫做用程式語言的邏輯去思考問題? 基本上就是用程式語言能最優化的方式去將問題分解, 也就是說CPU怎麼運行, 可以得到比較好的效果。
下面這篇文章很不錯的講了這樣的實例。 轉貼自連結
舉個例子: 寫一個函數計算當參數為 n(n很大) 時的值 1-2+3-4+5-6+7……+n
long fn(long n) {
long temp=0;
int i,flag=1;
if(n<=0) { // boundry check
printf("error: n must > 0);
exit(1);
}
for(i=1;i<=n;i++) {
temp=temp+flag*i;
flag=(-1)*flag;
}
return temp;
}
上面的程式, 基本上以問題定義的方式直接實做了出來, 當n很大時, 運行速度肯定會有問題。
long fn(long n) {
if(n<=0) {
printf("error: n must > 0);
exit(1);
}
if(0==n%2)
return (n/2)*(-1);
else
return (n/2)*(-1)+n;
}
下面的解法則是提出了優化的部分, 將問題進一步分解, 得到有效率的做法。要做到這些事情, 進而能解決現實中的會遇到的程式問題, 必須要熟悉幾樣事情。
- 資料結構 – 可以了解資料要怎麼被處理, 需要怎麼被結構化。 ex. Tree, Linked List, etc.
- 演算法 – 演算法的範圍蠻廣的, 但要做到可以解決大半問題, 從已經解決過的問題取經學習。 ex. Quick sort
- Object Oriented 的概念
- 英文
如果說, 這些內容都能夠經常實做, 並內化成寫程式的養分, 相信剛踏出校園要面試找到一份還不錯的工程師職位, 是還蠻容易。
這邊有個良心的建議: 學好英文!
1. 高階程式語言基本上都是以英文為藍本的, 要想寫出好程式, 學好英文是必須的。
當軟體工程開發已經越來越像是在寫文章, 用已經規定好的格式跟工具, 去寫出你看得懂, 別人也需要看得懂的程式碼。 良好英文能力成為寫程式的一環, 你使用的變數, 必須用合乎文法或者是常用的單字, 英文不好誤用單字或者句子, 進而導致別人對於程式碼的理解障礙, 是還蠻常見跟發生的問題。
2. 所有第一手的資料幾乎都是英文的, 中文翻譯的品質良莠不齊, 國外的教學網站、 stackoverflow、 iTunesU 等等。 學習的方式已改變, 但門檻幾乎都是英文。
以 iOS 開發來說, Apple 本身官方的文件, 其實完善程度算是相當足夠的, 但國內的論壇或者是討論區, 對應的豐富度其實蠻不足的, 尤其是初階 Tutorial 的教學文件, 這方面大陸的論壇或文件, 應該是相對完善。 雖然說大陸的文件完善, 但畢竟是第二手的資訊, 翻譯的品質還是良莠不齊, 想確保你學的東西是對的, 還是建議閱讀英文。
下面是幾個我覺得相當不錯的網站:
最後強烈推薦 iTunesU – 這裡有全球頂尖的教育機構提供的免費課程,您可以從超過 50 萬個針對數千主題的免費課程講座、影片、書籍和其他資源展開學習。基本上 MIT, Stanford, Berkeley 等名校的 CS 課程都在上面, 除了課程本身的質量非常高以外, 學生與教授的互動, 更是值得我們學習的, 包括提問、 獨立思考的能力、 甚至是學生上台侃侃而談的表達能力等。
3. 遠端工作, 英文更是必須。
如果你對於台灣的軟體工程師待遇不滿意, 想要在這塊島上找尋出路, 不管是香港、 大陸、 新加坡、 美國等, 對於軟體工程師的職缺應該都是相對多的, 假如你英文好, 能力強, 沒理由受限于地域跟接受你覺得不合理的待遇。在台灣以外的地方, 軟體工程師的待遇應該都是兩倍三倍起跳。 而在台灣的你, 為什麼甘心拿那 1/3 左右的薪資!? 只因為英文不好嗎!?軟體工程師是相當提倡自由、 開放、 以及遠端工作的工作, 學好英文, 出路真的可以更寬廣。當然如果想要找到國外的工作, 除了英文外, 還有另一點也很重要, 就是在國外可以認可的地方建立自己的品牌。 Ex. Opensource 的專案, Github 上許多的專案。 盡可能在各國都認可的平台或環境去做開發, 建立自己的品牌。
菜鳥
菜鳥期最主要的標誌是有一定的背景技能, 但還無法靈活運用所學到的知識, 這階段進階主要的任務是在於培養自我學習的能力。 菜鳥期可能對於 C++ 有一定的了解, 會用迴圈、 函式等, 但對於較深入的像 C++ 的 Template, Objective-C 的記憶體管理等屬於各自語言的細節不熟悉, 導致會寫出不適用的程式。
如果說這時期有優良的老鳥來帶領, 會進步的相當快速。
如果想要學習 C++ 的話, 可以從下面幾件事開始。
當然上述這些都是比較基本的項目, 可以說, 逐漸地懂得如何去使用上述的一些內容, 是從菜鳥逐漸變成老鳥的象徵。在這個階段, 最好能養成自學進步的習慣, 找到適合自己的學習管道, 並逐步累積的學習。
扎實地學好一門語言是很重要的, 以 C++ 來說,C++ Primer 是學習好這門語言的聖經, 相信每個工程師應該都掙扎的看了不止一次, 當睡前讀物還蠻不錯的。 等到將這本書看得津津有味的時候, 也許就是能了解這門語言的美的時候了。軟體產業進步的相當快速, 但不管有多少新東西出現, 上述所講的基本理論, 看來還會流行好一陣子, 而想要不被淘汰, 自學的能力是需要培養的。
老鳥工程師
基本上老鳥工程師大部份都可以獨當一面進行產品的開發, 工作的內容逐漸從細節轉向于產品系統的架構以及設計, 實際在開發期, 主要負責的內容會慢慢地偏向于引導團隊用對的方法跟架構開發產品, 實際開發的部分, 可能由菜鳥跟老鳥一同撰寫。
下面的一些做法, 可以讓老鳥工程師參考跟學習:
- XP 、Scrum 、 Kanban、 結構化分析、 結構化設計
- Test Driven Development、 Pair Programming、 Continuous Integration
- 中文網站: 30天快速上手TDD
能夠成長為老鳥工程師, 大部份都擁有自學的技能, 並能逐步地透過平時的工作逐漸地將知識累積成經驗與智慧, 遇到問題後能迅速地想出可行的幾個解決方案, 透過系統的架構來解決未來可能會遇到的問題, 以及透過實作的流程防範未然。
另外想提一下設計思維, 目前在軟體設計時, 關於使用者的體驗, 用戶使用的流程等在手機的開發中越來越被重視, 具備設計思維的軟體工程師, 是相當吃香的。
簡單的分享一些內容跟書籍:
人類行為的三個層次:
- 本能層次 – 外觀
- 行為層次的設計 – 使用的樂趣與效用
- 反思層次的設計 – 自我形象、個人滿足、 記憶
三者之間往往會交互影響, 設計產品(撰碼)時宜審慎考慮其對使用者情緒的影響。 – 魯蛇喬
小結: 以程式設計來說幾乎永遠都有新的技術在每天產生, 如何站穩基礎, 並逐步地向廣以及向深發展, 是有志于當個大師軟體開發工程師的必經之路。 讓我們一起分享一起學習吧!
生也有涯, 而學海無涯。 不停地練習、學習、分享, 是唯一向前的路。
留言討論