進度條

程式新手課程學完了,該怎麼變高手?

為什麼有課程標榜一個月學會,但又有文章說學會一項技能要一萬小時?

作者: 縱裕 更新日期:

各位同學大家好,我是縱裕

 

其實常常會收到學生的問題,多半都是跟學完課程或成為高手有關。

 

說高手是有點沈重,所以大家都是講”進階“。

這邊要先提到的是,很多問問題的學生本身都是有程式工作經驗的。

並不完全是新手從零開始。

 

 

學習程式語言,本身就是為了解決”工程“上面的問題。

程式語言本身就是為了更方便的操作電腦而設計出來的。

例如控制電腦,設計出了機械碼。

讓機械碼更好用 -> 設計組合語言

組合語言還是很不人類與數學 -> C語言

C語言不友善 -> Ruby / Python 等更口語的程式語言

(當然中間還有C#, Java 之類的不同路徑演化,但這邊只取單一情況,真實情況更複雜些)

 

當然為了通訊,最後出來了網際網路與瀏覽器

作為底層的TCP / HTTP 被設計出來

HTML / CSS / JavaScript 出現了

 

為了有效率的儲存資料與搜尋,所以關聯性資料庫出來了。

JSON格式所帶來的好處與發想 -> NoSQL資料庫的出現

 

 

所以如果你想跳脫出新手,學會工具本身是基本,

能解決“工程問題”才是所謂的“工程師”

 

 

解決工程問題又分為幾個階段

1. 問題產生

2. 分析問題

3. 拆分問題

4. 解決問題

5. 驗證解決方案

有沒有跟看板方法(Kan-ban)提出的很像?

延伸閱讀:透過Kanban(看板方法)管理,視覺化並改善你的工作流程

 

 

 

 

問題產生一般人會想說,工作遇到了再說,但通常這遠遠不夠,尤其是對野心越來越大的你。所以很多文章才會提到要做Side Project,讓問題找上自己。

開始嘗試實做自己偉大的專案時,立刻就會碰到設計問題,建議一切從簡,不要過度設計。不然會跟網購買的衣服一樣,這專案就放在那邊了。

用目前會的能力去做出prototype樣品,不會的部分先放著。放著的部分就是你碰到的問題。我們就可以開始分析解決了,如果連樣品都做不出來,那就是還有更多的問題。直接跳到分析解決。

 

 

不過如果我們5個階段都跑的完,那就已經是合格的工程師了,也不需要看了。因此接下來就直接跳到我們應該要做什麼。

 

基本上學完課程後跳脫出新手的關鍵點就是,你做不做得出來簡單的樣品。(請不要說我想做一架鋼彈... 就算是其中一個配件的樣品都不太可能做得出來吧)

 

 

 

以Ruby on rails / PHP 與框架 / 其他後台程式與框架 來說,通常是網路運用。以現在的趨勢會分成,前端框架與Ruby on rails(以下省略其他後台)。如果你還不熟悉前端框架的話可以優先學習,這算是趨勢還滿值得投資的。看目前起來就是React.js 或是 Vue.js選一個。

 

再來是Rails 的部分,分為功能實作以及系統優化,而且Rails主攻Web運用。Web 層級的功能優化主要分成,一般功能或是功能加上資料庫操作。
   

 

一般功能的實作如果有困難,初學者的情況是語法不熟悉,以及程式邏輯不清楚。建議是先使用Gem / Library 來完成,然後”進去“看他寫了什麼,以及嘗試修改。這部分很痛苦,但敢自稱自己不是”新手“的工程師多半都經歷很長一段這樣的時間。而且這樣的訓練不限定於Ruby on rails。

 

 

我個人的程式邏輯是在嘗試著看懂boot loader與修改中學習到的。boot loader是手機開機最一開始執行的程式,還沒進入作業系統(Android / Linux)。以當時還是新手的我來說真的是很痛苦,後來工作完成到現在也還是不敢說自己多懂這支程式。

 

但是建立起來對程式邏輯的感覺是滿有幫助的,當然這也是包含著大量程式語言的撰寫。

 

 

 


如果已經跳脫出新手,那下一步有幾個選擇:

 

 

1. 增強對程式語言語法的理解(看你什麼程式語言,PHP, Ruby, JavaScript...)。

每種程式語言都有很多神奇的地方,可以讓你做出很多神奇的事情。但是高手常常會用比較「精練」的寫法,容易讓你看不懂。

買本深入探討程式語法的書去自我鍛鍊,能讓你更有效率的處理、看懂程式,跳過很多坑。

 


2. 增強對MySQL或PostgreSQL等關聯性資料庫的掌握度

這建議一般不會在新手時期提出,因為要把這兩隻程式學好,可能比學習框架還困難,他本身就可以是另外一個職業了。

但是通常程式框架有效能上面的限制,如果要非常有感的讓網站加速,學習這兩隻程式是非常有幫助。

例如「要快速開發」就要多使用Ruby 與 Rails API(維護上也好維護)。但是效能要好則”可能“剛好反過來,變成盡量不要使用它們。資料庫多半是C語言或是C++撰寫的,所以同樣的程式邏輯,使用資料庫去運算一定比較快,但容易增加系統複雜度,造成維護上可能比較複雜。

不過資料庫有資料庫的同步阻塞問題,也可能反而讓你的運用更慢。這聽起來很矛盾,但是弄懂它就是脫離非新手的關鍵之一。

 


3. 增強對Linux或你們Server的作業系統的掌握度。

一般來說,無論你運行怎樣的程式,都是跟作業系統互動。所以如果不懂作業系統功能,就會喪失很多優化的可能性。例如Thread的實作與執行,Crontab排程原理以及問題,與其他程式的互動(Carrierwave 常跟 imagemagick 這隻C 語言寫的影像處理程式互動)、Ruby的IO控制在Linux曾是如何實現 ...等

 


4. 增強對Web service的掌握度。

Apache / Nginx 可以處理的事情很多,他們自己本身也是程式碼超多的怪物。很多事情根本不需要Rails去處理,透過他們相對有效率多。這也包括了對TCP架構的了解。

相關課程:Linux雲端伺服器,用AWS暸解Apache與Nginx

 


5. 了解公司的商業邏輯

再強大的技術,如果邏輯不對,還是要修改或是重寫。所以沒有人可以做出一個框架不用修改就可以符合所有的商業運用。這也是為什麼會有工程師這樣職務的原因。

 

反之,如果對商業邏輯很了解,並且可以有效率的轉換成程式架構,那對公司來說是非常有用的。例如架構師、設計師其實都是以這個為中心在做事。如果你只是個負責”上色“的工程師,那想必是很難獨當一面的。

 


6. 對演算法的掌握度

這部分很兩極,你可以刷leetcode 為了去大公司,也可以單純的分析時間複雜度。很多工作根本不會碰到這些要用到演算法問題,但也可能某一天突然就碰到了很麻煩的事。

大部分的人都只到會解題與面試的階段,在APP界真的能運用的目前我看到的幾乎是沒有(演算法工程師就不一樣了)。

很多年薪百萬的工作在工作上是不需要會的,但面試的時候有機會會考,這就要看自身的情況與對數學的掌握度。

 

 


7. 對網站架構的處理

這部分比較困難,但是跟上面一樣,WordPrss、Ruby on rails不應該是網站的全部。有很多新東西可以嘗試,Mongodb, 前端測試, Micro service...等。

最困難的一點是,很多跟公司規模與上面提到的商業邏輯有關。最新最潮的技術常常頭洗下去就發現坑太大回不去掛了。但新技術就是發明出來解決問題的,所以也有可能你們公司或是專案就是需要這個。    

 


8. 英文語言能力。

如果說要一次把薪資翻倍的話,上面幾乎都做不到。但英文變好可以。

初學者英文好可以很容易在Stackover flow上面查到資料,也可以透過大量的網站與關鍵字吸收新知,變成假高手。進階者則是更可以出國工作。

我在處理學生問題的時候常常很意外的發現他們英文程度的不夠,很多不是程式新手的同學不知道搜尋的關鍵字,或是給他們網站後,他們看不懂(儘管都是程式碼)。

雖然我不清楚各位讀者的英文程度到哪裡,但是這還是很值得投資的。

延伸閱讀:
1. 事先知道的話挑戰國外工作可能不一樣?在加拿大發現的人際關係經驗與英文需求

2. 從土木系到科技業,小PM進擊百萬年薪奮鬥史(下) - 跨越百萬的關鍵

 

 


所以你會發現,其實”進階“的軟體工程師並不完全是把框架練好,而是整體的“工程”實力的增加。時間就這麼多,所以衡量分配時間與資源是很重要的(Trade-off)

 

當然把使用的工具的說明書快速看過一遍是必要的(這邊沒有說仔細研讀每一個章節)。畢竟很有可能市場上已經有更多更好的解決方案,這就要看自己的判斷了。

 

 

所以為什麼有課程標榜一個月學會,但又有文章說學會一項技能要一萬小時。

因為學會工具確實只要一個月,我們的課程也不過長40小時左右。就算是兩三組課程也不到100小時。一天8小時也才兩個星期不到。但當工程師遠遠不止要會這些。所以一萬個小時才能精通也不為過。

 

只是沒有人說精通了才能開始工作

 

 


最後,如果你喜歡我們的文章,別忘了到我們的FB粉絲團按讚喔!!

Medium picture

縱裕

錄課程錄到快死掉了啊!!!