他學醫三年後轉專業到計算機,竟又輟學當了軟體工程師

文章推薦指數: 80 %
投票人數:10人

編者按:這是一個學醫的人如何中途換專業改學計算機然後再輟學最後成為軟體工程師的故事。

不過這個故事的重點不是他的個人經歷,而是對如何學習以及教育方法的總結與反思。

他的一點感悟非常深刻:教與學都應該以掌握基礎為目的。

介紹

我大學是學醫的,學了3年。

經過漫長而複雜的一系列事件和領悟之後,我萌生了對計算機科學以及隨後的軟體工程的興趣。

於是,我決定換學院改學軟體工程本科課程。

不過那課程我只學了2個月不到。

這不是因為我不想承擔義務。

相反,我有對目標痴迷到一門心思的本事。

因為痴迷,我很容易就會意外地深入學習特定主題時忘記了社交和日常責任等事情。

對於一些人來說,痴迷學習聽起來也許跟通常被歸納為「大學輟學生」(我就是)的特徵不相符。

但其實這是完全說得通的。

我上的課提供給我的材料既不夠又不合適。

而且學習的進度就像蝸牛一樣,我的很多問題都沒有回答(哪怕我親自去找了教授)。

我已經厭煩了拷貝板書出來的程序。

我已經厭倦了只聽見「面向對象範式」而不見這個「神秘」的面向對象的影子。

我對只是膚淺地學習已經煩透了。

我記得有一節課後我去圖書館拿起了一本Java書。

我整個下午和晚上都在看和做實驗。

那一個晚上我學到的東西比我在課堂上整整1個半月學到的東西都要多。

那麼我花錢買到的是什麼?不就是個純正的學位嗎?我再也無法忍受自己上這樣的課因為我在課堂上花費的時間太多而在學習上花費的時間太少了。

不過我並不認為這是課程的錯,這其實是以課堂為基礎的一般教育的過錯。

出於多個原因,課堂教育似乎沒有針對能力而優化。

不過除了所有那些對教學方式的不安以外,對我而言課堂教育還有一個更深層次的問題:這實在是太無聊了。

有時候上課節奏太快太膚淺,有時候又出奇的慢。

哪怕課程內容很深,但訓練卻不是。

總的說來,我發現課堂教育不足以推動學生走到那最後一步:從知識轉化為可行動的理解。

所謂的「可行動的理解」是指用潛在的新穎方式將知識應用到新的上下文環境的能力。

如果不能認識概念在上下文中的存在的話你是不是真的理解這一概念呢?這就好比因為你能對一個函數求導(這僅僅是機械操作)但沒認識到適用在什麼地方,它為什麼重要或者實際意義是什麼就宣稱你知道那導數一樣。

計算機就能替我們執行機械擦做。

但計算器並不能看清一個問題並且利用直覺理解來推斷出正確的辦法。

它們只能執行被命令去做的操作。

難道我們不應該比一部不智能的計算器對導數的「理解」更深入地理解概念嗎?我認為應該。

但課堂教育似乎不同意這一點。

當我在解決問題、學習新東西,或者形成概念之間的連接時,我喜歡踱來踱去,草草記點筆記,甚至大聲地向自己解釋想法。

我喜歡從許多不同的角度檢查我的心智模式,直到找到需要修補的漏洞。

此外,一旦舊主題逐漸失勢我喜歡不斷修正,反過來從新的角度審視這些東西,從而有機會建立我過去錯失的連接,重新測試我的理解。

於是我輟學,開啟了一段非傳統的教育之旅。

一開始,我完全按照自主的學習方式。

在這一初步階段,我把絕大部分的精力都放在了想出可靠的學習計劃(不是那麼簡單的)這一項目上面。

我知道我偶需要根據第一原則去學習,但是梳理那堆數不勝數的資源需要消耗的時間和精力太多了,所以我的學習進度變得很慢。

我知道自己有動力,也能夠吸收信息並且綜合利用,並且嚴格地拷問自己的心智模式——這一切都是高效自學者的特質。

我不那麼熟練的是對自己制訂的學習路徑的堅持,因為我總認為這樣是不夠的:我不是這個領域的專家,所以又又什麼資格替自己設計一門有效的課程呢?我不是軟體工程師應該知道什麼方面權威的信息來源。

我需要一些指導來起步……最好是來自專家的指導。

學習資源比較

我開始去尋找非傳統的外部教育資源來提供更多的指導。

MOOC

我想到的第一個非傳統資源是MOOC生態體系。

在篩選了無數選項之後,我意識到MOOC有一個問題跟我之前遇到過的類似:那就是幾乎每一個專題都有MOOC。

此外,它們在質量、深度、教學方法以及時間限制方面各不相同,意味著如果我要把MOOC作為主要學習來源的話我有很多其他因素要過濾。

就像以往一樣,我需要篩選掉其中的很多,還要確定報讀哪一門課,以及最合理的上課順序,決定哪些主題是基礎,哪些屬於「可選」。

MOOC不是一個理想的來源於是我當時放棄了,開始另想辦法。

訓練營

我喜歡訓練營的想法,因為高強度學習對我很有吸引力。

我不怕壓力,並且喜歡挑戰認知極限……以及成功突破。

我在考察無數的訓練營的時候,注意到它們都存在兩個致命缺陷:

  1. 時間約束似乎太極端因此排除了疊代測試和評估一個人對主題的理解的能力。

    在這裡是沒有機會進行循環學習的。

  2. 主題傳授的深度不夠。

    即便是最好的訓練營對於學生的基礎知識準備得也很不充分。

換句話說,我把訓練營看作是產生用戶而不是開發者的一種方式。

什麼的用戶?框架和高級開發工具的用戶。

我不想被局限在特定的工具集或者一些基於軟體潮流的狹隘的開發原則裡面,而沒有根植於基礎/根本性的知識和培訓。

當然,這條規則總會有例外,我也聽說過一些相當強的人是從訓練營出來的(我就見過幾個)。

訓練營似乎對那些已經具備技術背景只是想跟進特定專業的人更加成功,比如web app開發或者移動開發。

自學課程

我還發現了好幾個由自學者創建也是面向自學者的課程。

在Reddit和Medium上會時不時冒出不同的「自行設計的碩士學位」文章和要點。

我看了很多。

我還看了teachyourselfcs上面的課程,內容還是挺可靠的。

這些課程的主要問題不是品質(其實上面還是有一些比較全面、合理的課程的),但是我意識到,純粹的自學在一個人有了堅固的基礎知識和培訓,變成內行之後才會更高效。

這是因為自學缺乏對新手很關鍵的一個組件:反饋。

(來自那些有資格提供的人的)反饋是最強大的自我改進形式(假設你遵循的話)。

特定領域的新手並不知道如何識別合格的工作或者信息。

他們不知道在自己的實踐中如何識別反模式。

他們不知道如何解釋項目(尤其是較大型的)中的微妙之處,也不知道如何讓自己對特定標準負責,因為他們不知道那些標準是什麼(或者哪怕理論上知道那些標準是什麼,也不知道如何在實踐中識別)。

Launch School

有一次我無意中遇到一個謎一樣的東西——Launch School。

我記得我瀏覽了他們的「Is this for me?(這是為我準備的嗎?)」頁面,這個是在解釋Launch School是什麼值錢專門解釋Launch School不是什麼的。

基本上,這個地方不是給仍然在研究自己的選項的人準備的,也不是給那些想迅速找到工作的人準備的。

實際上,LS對自己的「慢學習路徑」感到自豪。

他們重視深度、掌握、循環學習以及堅持不懈。

他們是「方便快捷」這種學習方法的反面。

他們的教學方法正是我想找的。

他們稱之為「立足於掌握的學習」,這是一種通過能力而不是時間來衡量進展的學習模式。

在你證明自己已經掌握了目前課程材料之前是不能轉到下一門課程的。

他們通過評估、訪談以及項目的組合來衡量是否掌握。

通常的過程是3到4個小時的評估,裡面會有各種問題讓接受測試者用準確的語言來解釋概念。

他們的學習指導還解釋「精度」是什麼意思,如果有任何語言表達含糊或者過於複雜的話,給評估打分的講師或者TA會讓學生改正答案。

學生絕對沒有辦法糊弄自己對材料的理解,因為學生的水平需要能解釋概念以防止錯過任何重要細節或者回答不清楚。

如果學生得分不夠好,會被要求回去改正答案。

如果得分低於B,他們會得到「還不行」的評價,然後至少一周的深入學習後必須重新進行評估。

另一個「還不行」意味著再進行2周的學習,以此類推。

書面評價只是對是否掌握進行評估的第一部分。

評估往往還會有項目及/或面試這些要素。

在項目期間,學生會被賦予一套技術規範以及時間限制(通常是24到48小時)來開發出滿足這些規範的應用。

代碼質量、結構以設計決策都會接受嚴格審查,並且由一位導師進打分,打分者會給學生非常充分的反饋。

在面試期間,學生要在面試官面前解決問題,類似於求職面試時進行的編碼挑戰。

面試還要求學生展示自己在開發應用是做出的設計決策。

Launch School嚴格的評估從多方面測試了學生的溝通技能、計劃水平、精確度以及代碼質量等。

有導師和TA幾乎可以全天候地回答問題。

他們還對課程期間大量的編程作業進行無數的代碼評審(記住:反饋對掌握非常關鍵)。

通過核心課程耗掉了我還幾千個小時的學習。

然後我轉到了他們可選的頂點課程(capstone program),繼續學習優化、算法分析和設計,系統設計。

我還開發了一個項目來展示自己的思考能力、研究水平,管理複雜性的能力,以及設計深度。

頂點課程總共又花掉了我1000小時。

我在紐約的好幾場活動中展示了我的作品,這些作品引起了其他工程師足夠的興趣,他們都想引薦我,以至於我必須拒絕掉其中一些面試機會。

在發出第一份求職書之後,我拿到了offer、面試機會,以及在2周內選擇各種地點的自由。

我喜歡自己在LS的經歷,因為我終於能夠發揮自己愛鑽研的本事了。

我可以用蘇格拉底的方式對一個主題刨根問底到死。

補充學習

我也利用了其他的來源學習,作為對LS課程的補充。

數學這門課我幾乎都沒有接受過正軌培訓,但是又非常重視這門課,因為它非常重要,而且還能帶來智力上的快樂。

這是我利用的主要資源:

  1. How to Prove It(如何證明)

  2. Discrete Math for Computer Science(計算機科學之離散數學)

  3. Linear Algebra(線性代數)

  4. 群論(同一位作者還寫了一本抽象集合的書頁很棒但不是必須看的)

  5. 《微積分第一卷》

我還自學了一點架構與設計,利用的是下面一些主要資源:

  1. 《Ruby實用面向對象設計》(適用一般的面向對象語言)

  2. 《Web應用架構》

  3. 《設計數據密集型應用》(此書尤其不可思議)

  4. 《Web應用安全:初學者指南》

基礎的重要性

非傳統背景對軟體「工程師」常見的抱怨是他們知道如何編碼但是「工程」方面的知識缺乏。

或者換句話說:他們缺乏學生在更傳統的教育課程(比如在大學裡面見到的)中接觸到的基礎。

對於自學的開發者以及那些走非傳統教育計劃的人來說,很容易就會錯過了學習基礎的知識,以及仍然未意識到自己一開始就缺乏了一套核心的知識。

太過專注於實用性的課程會犧牲掉為開發者產生強健的心智模式。

這樣的學習計劃的問題在於構建在理論理解基礎上的牢固心智模式其實是一項實用資產,因為它可以讓開發者利用這些心智模式將新的信息情景化並且解決新問題。

心智模式就像羅盤,輔助開發者在新的技術領域探索。

傳統教育課程往往把太多的時間聚焦在理論上。

因為這個,它們有時候會犯理論太過深入而犧牲了實踐訓練的錯誤。

非傳統教育課程往往相反:它們往往會犯實踐太過深入而犧牲了理論訓練的錯誤。

不管是哪種情況,學生的準備都是不充分的:他們受到自身知識的限制而不是為其理解而賦權。

這是由於錯誤的理論與實踐的二分法。

沒有實踐,學生對如何應用自己碰到的了理論就沒有頭緒。

沒有理論,學生就對如何將新信息適配到現有的「它是如何工作的」的模式沒有主意,進而阻止了他們有效地同化新知識到真正理解上面。

缺乏理論的實踐會將學生局限在他們當初受到培訓的技術上(此處的適用術語是「框架用戶」而不是「軟體工程師」),而缺乏實踐的理論會造就在接收第一本功能規範時對從何開始毫無頭緒的學生。

牢固的心智模式需要理論與實踐的融合。

在進入你的第一個軟體開發者角色前是不可能學會你作為一名軟體開發者所需要掌握的一切的。

總會有更多的東西要學。

因此,最好的行動路線是形成牢固的基礎理解,從而讓你能迅速地吸收新信息,適應不斷變化的行業。

傳統和非傳統教育都有看不見的例外。

Launch School是一個非傳統的教學計劃但卻強調心智模式、基礎理解以及學習「不會改變的東西」的重要性。

儘管軟體業總在發生迅速變化,但基礎性的東西卻不會。

對於畢業生來說僱傭他們從事的角色使用的是自己從未遇到過的技術是很常見的事情。

Western Governor’s University(西部州長大學)是大多數大學所遵循的標準教育的例外。

我只是最近才了解到這麼一所學校,並且對他們採用的所謂的「立足於能力的教育」教學方法印象深刻。

在WGU這裡,學生需要在特定課程證明自己具備足夠技能才能進入到下一門課程。

課程並沒有時間限制:無論是哪一門學科,學生都要學到獲得相應能力為止。

開發者培訓的來源是什麼無關緊要。

不管是傳統的、非傳統的都行,他們是不是完全自學的也不要緊,需要考慮的最重要的一點是:他們是不是已經把基礎給掌握了?

其他

我現在是一名二級軟體工程師,正在跟一群非常有才能的工程師和總監共事。

在充分掌握了基礎並進行足夠的實踐之後,我感覺自己已經為解決複雜挑戰做好了準備。

我尤其喜歡現在這個位置的一點是我們所面臨的其中一些挑戰說沒有辦法在StackOverflow之類的地方找到的,因為我們是第一次嘗試解決這些問題的人。

我希望立足於掌握的教學方法能逐步成為主流,因為它能防止得分在「C」或「D」檔的人沒完全掌握核心概念就過關了。

原文連結:https://hackernoon.com/how-i-went-from-student-to-drop-out-to-software-engineer-e8123d6a4199

編譯組出品。

編輯:郝鵬程。


請為這篇文章評分?


相關文章