給年輕 Coder:路越來越難走,但請謹記我們的精神是不怕打破規則!

5578893436_bcddd9e630_z

雖然網路讓我們的生活變得容易,但是學寫程式的活躍程度已經和我當初的狀況完全不同了。

  • 什麼時候學寫程式成了一件這麼酷的事?

當我在高中的時候,人們聽到我在自學寫程式時,沒有人認為我是個萬人迷搖滾巨星,他們的反應都是「一定是因為他球踢得很爛」。然而等到了 Instagram 等社交媒體盛行,與臉書創辦人祖柏克等科技名人的崛起後,這一切都讓軟體開發者轉眼成了最酷的頭銜。

你現在可能還不相信在某些工作圈,別人聽到會 coding 會覺得你很酷,但你可以在 YouTube 上看到超多相關的討論,有些人會在那自誇因為自己會編碼,所以超酷,而很多網友還真的覺得這些人很厲害。

現在開發者的形象在一般人的眼裡已經改變,我再也不會因寫電腦程式維生而感到羞愧,但程式開發者新手現在必須面對我以前從來沒遇過的問題。

● 問題一、你一定得學 HTML9 Responsive BoilerStrap JS(或任何在 HacherNews 新聞網上的 JavaScript框架)

很多人在炒作最新與最棒的「電腦程式熱」。時至今日,電腦程式的世界裡有很大的進展,但都不是什麼科技王牌,因為這些都並不足以立刻解決所有問題。

大家通常都鼓勵新手去解決他們連學都沒學過的問題,這也沒什麼不對。但當新手準備進入狀況時,卻沒有什麼人可以教他們「會走前先得學會爬」,因為檯面上大家在討論的都是些最新、最棒的程式。

身為經驗豐富的網頁開發者,我喜歡玩那些剛問世的新科技,但我知道在工作上使用對的工作很重要。新手通常都覺得學習如何讓自己不格格不入是增進他們編碼能力的最快方法,但以大方向來看,學會最新流行的程式並不重要,可是卻一直沒有人跟群組裡的人明確說過這點。

● 問題二、程式基礎並不有趣

以下列出的可能是永遠不會在 HackerNews 流行、而且在工作內容裡也鮮少被提及的東西:數據架構(Data Structures)、連結串列(Linked Lists)、Trees, 深度優先搜索算法(Depth First Search)、Floyd 判圈算法(Floyd’s Cycle Detection Algorithm)。

此外,一些超級常在科技訪問中被提及的內容卻常讓新手認為他們需要跟上最新流行才能得到工作,而不是去學會真正重要的紮實基礎。

所以某方面來說「編碼學習社群」很像是間回音室,常讓新手感到很困惑。不幸的是,經驗豐富的工程師們並不知道他們之間的討論常被新手斷章取義。

多數時間裡,經驗豐富的工程師在意的是紮實的基礎與分析能力,而不是使用特定工具的經驗。特種技術的工程師們只懂特定的東西,一般來說,他們在市場上有點被高估了。

● 問題三、(有點)知道他們自己在做什麼的人

身為一個網頁開發者,我在從事第一份工作時,我寫了一些超級糟糕的編碼。當時,網頁框架剛問世,那時候的大家不是在做 PHP 就是 CGI。網頁框架當時相對還很新,所以我跟其他人同步開始。

我犯了所有可以犯的錯,而我在做第二份網頁開發工作時,我所遇到的工作內容也常讓我不斷問些像是「模組測試到底是什麼鬼東西?」

活到老,學到老。我心裡的程式開發魂對於要去認識我很久以前寫的編碼感到有點害怕,但當我真的開始去做,我發現我的程式開發魂依然活在荒野中。

但現在,人們已經寫網頁應用程式寫了很多年了,也有了很多很棒的練習。一方面來說,這意謂著編碼人員的程式碼檢查與溝通可以更迅速。人們有機會在短時間內學會編碼社群花了十年才學會的東西。

另一方面,試著要去完全了解這些社群正在談論細微差別是有點讓人吃不消,例如像是:

Monoliths 超棒!
微服務(Microservices)是我的好朋友!
微服務有點言過其實。Monoliths 又再度引領風潮!
Turbolinks?

我們社群的包袱超過 10 年以上,它讓我們很容易地去了解過去的世界長得什麼樣,但我希望今日的新手將不必經歷類似我在 2008 年所製作糟糕的 monolith。

問題四、不知道自己在做什麼的人(但這沒關係)

一剛開始,你會去和別人做比較是正常的,但若一直都是如此,便不是件好事。要跟比你經驗豐富多很多的人做比較很困難,這會讓新手對自己有以下看法:

我什麼時候才能學會所有我該會的東西?我一直覺得還有很多我該學會的東西。

問題的答案對他們來說當然不中聽。沒有人學得完所有他們該學會的東西;如果你真的全部學會了,那就是你沒有時時學習新東西,該是時候去找新的挑戰了。

看著 Aaron Patterson 投入 Ruby C 程式語言,或是使用 RubyVM::InstructionSequence 來了解其中到底發生了什麼事,或程式編碼在沒有正規運算式的狀況下,如何在 rail 開發框架中使用有限的自動操作來做出東西,這些東西都讓我不禁頭痛。這些討論都提醒了我,想起自己對於很多內部工作是如此的毫無頭緒…

問題五、有些重要東西你只能從錯誤中學習

如果你從沒犯過一些導致重要軟體零件停止的重大錯誤,那麼你就缺乏從壓力中學習修正問題的經驗。

特別是在你忙著處理問題時,非技術部門的人員走到你辦公桌,跟你說些你早就知道的問題,然後硬教你很多東西。但這些東西是書本教不了你的。

問題六、系統變得更複雜了

以下是系統因 Ruby on Rails 開源 Web 應用框架而變得更複雜的案例:

2008:為了要讓你的網站在網路上保持運作,你得自己重啓伺服器,並安裝所有的零件,如:apache 與 mongrel。

而今日:使用 git push heroku 指令。OK,一切就緒。

聽起來似乎所有事情都變得無比簡單,但系統的複雜性所帶來的副作用很快就要出現。

再回到 2008 年的例子。

2008:要在專案中執行下載動作時,一個模式中你需要約 5 行的編碼,在指令要求中將複製多個部分的表格數據到系統硬碟的檔案裡。如果 apache 設置得宜,一切都會運作良好,production 也不會有問題。

今日:整合 carrierwave/paperclip 等指令後,你的模式裡只需一行編碼,就能執行下載所有你所需要的東西。這行編碼雖然有點神奇,但它真的可以完成工作。

除非你是用 heroku 雲端平台服務,雖然 heroku 很不錯,我們要橫向擴張也容易,但在這個例子裡,heroku 會導致使用檔案系統來上傳圖片失敗。也就是說,如果你用 heroku,你可能該用亞馬遜雲端運算服務 AWS 來作為儲存層。要設定 AWS 很簡單,你只需要再使用者介面點選即可。登入時,你需要輸入信用卡資料,而且他們會致電給你已確認你的電話號碼是否正確。更棒的是,你的第一 G 容量是免費的。

建立了你的使用者群組之後,你將會看到約莫 10 頁的規定與職責,並取得你的亞馬遜應用程式介面保密條款。太棒了。你的 app 大概已經在 GitHub 共享虛擬主機上了,而現在你該離開 figaro gem 了。將檔案儲存在你的電腦環境變量(environment variables)裡是個很棒的方式。你不知道什麼是環境變量嗎?現在讓我來告訴你……

隨著每一個正確方向的進展都會讓事情變得有點難以處理。改善 Rail 框架的目的是要讓可用性更佳,而不是提升其可學性,因為在現實世界裡建立 app 本來就是很複雜。這是件好事,雖然大家有時候大家覺得難以招架,但這只是學習過程的一部份。

現在回頭看,當我剛入行時,我最大的問題就是不斷逞能,所以無法意識到成熟度的重要性。

但現今的新手卻是恰恰相反。他們把經驗豐富的同行看做他們懂得神祕的黑魔法。他們看資深開發者的眼神,就像我 5 歲時看我父母的眼神。童年的時候,我覺得大人會些我永遠不會的超能力。

但其他方面而言,要成為一位優秀的軟體工程師的過程依然是相同的。剛入行的新手需要一點點光亮來指引他們,並讓他們走在正確的方向。

我有幸能幫助那些想進入軟體工程界的人走向正確的方向,讓他們從解決 FizzBuzz 的問題升級到解決「優先搜索算法(Depth First Search)」、「逆向演算法連結串列(Algorithms Reversing Linked Lists)」等傳統 CS 問題,或像是複雜的 Rail 應用程式等等。

我在 theFirehoseProject 當編碼老師,教導這些雄心勃勃的網頁開發者,以及幫助編碼新手在網頁開發學習上更上一層樓都讓我覺得很有意義。

雖然現在新手要進入網頁開發時所面對的狀況跟我當初的已經大不相同,但學習過程仍然是一樣的:不要害怕去打破現有的規則!

(資料來源:Medium;圖片來源:CEThompson,CC Licensed)

說點什麼吧!

SPONSOR

熱門 未分類 分類文章