[翻譯]自學開發的心路歷程
來自專欄 SAP技術分享1 人贊了文章
譯者註:看到這篇文章,我感覺非常有同感,本人也自學了很多開發語言。曾經遇坑無數,但是還是慢慢的堅持了下來。印象最深的就是花了大量的時間學習 objc,結果現在轉到 swift,於是又開始自學 swift。現在也在自學 python,感覺又是一次填坑之旅,不過我感覺值得,向著未來的方向前進,每天走幾步,總比站在那裡看好些。也就是因為在自學中遇到了無數的坑,我清晰的知道一門好的課程有多麼的重要,有個人帶是多麼的必要。於是我也決定做一些課程,希望能夠幫助到那些自學開發的人能夠繞過一些坑,跳過一些坑。
我已經得到了本文作者的許可翻譯這篇文章,沒有版權問題。
以下為譯文:
自學開發者的成長之路是艱難、陰暗而又充滿不確定性的。世界上沒有從菜鳥到資深開發者的簡單直接的途徑。因此,我堅信每一個通過自學掌握開發技能的人都有自己的精彩的故事。
在本文中,我會分享一些關於我自己如何探索並且自學編程的經驗教訓。希望通過我的經驗的分享能夠幫助到你反思自己的過去,並且激勵你不斷前行。專註於過程
當我剛剛開始學習編程的時候,我並沒有想把這個當做職業,我只不過想做一個特別的應用而已。
我的編程之旅起始於大學期間。當時我剛剛讀完了理查德 布蘭森(Richard Branson) 的《失去維珍》(Losing My Virginity,也翻譯為「致所有瘋狂的傢伙」或「一切行業都是創意業」),也許是過多的閱讀了 TechCrunch(美國科技類博客),這讓我渾身充滿了企業家的無窮能量。然後,我一直讀一些關於大學生如何因為一些應用的創意而得到投資家青睞的資料,我想:我能夠成為他們其中的一員。一天,當我在課堂里閑逛的時候,突然一個應用的點子在我腦海一閃而過。當然,這個應用到底有什麼特別的並不重要。重點是,這個這主意是唯一的,並且有著無窮的成長空間(至少我認為如此)。我堅持認為我發現了一塊新大陸,可以做一番大事業。這個主意點燃了我的興奮,讓我感覺到我應該立刻採取行動。於是,我放棄了學業,全身心投入到了我的創意中。這裡有一個大問題,那就是我的主意是關於一款移動應用的,但是我不知道誰可以做這個移動應用的開發。這特么的總么辦,編程到底有多難呢?反正我已經沒有興趣繼續學習我的專業。我花了大量時間再玩 XBox 上面,然後分配一些我的空餘時間用來創建這個移動應用。有的時候幼稚能夠讓你開始干你正常情況下不會幹的事情。現在的情況就是,一個沒有任何編程知識,業務或者設計經驗的人,在嘗試著學習並開發出一款十分複雜的安卓應用。我想這在你看來就像是天方夜譚。我希望從這裡開始我可以告訴你一些事情向好的方向發展的好消息。??我買了幾本關於安卓開發的書籍,同時花了大量的時間來嘗試著拼湊出一個應用。我不關心這個應用如何工作,哪怕是從各個地方複製黏貼一些代碼的拼湊,我只是希望能夠完成一個成品。
我以為我不需要學習多少編程,我太過於專註於最終的結果。對最終產品的期待始終驅使著我不斷前行。隨著時間的推移,這個應用變成了一個使用複製黏貼大法拼湊出來的怪物。它沒有多少功能卻基本上每次運行都會閃退。直到有一次偶然的機會,我參加了計算機科學的課程的學習,我才意識到:或許,我該專註於學習。我的能力不足直接導致了我的第一個應用的失敗。我必須回到現實中來,至少在目前,我還不能幹成什麼大事。幸運的是,我慢慢的改正了我的行為並且認真的學習了很多知識。我開始喜歡上了編程,並且最終得到了軟體開發工程師的工作。經驗教訓
有一個好的主意是一件好事兒,但是當這個主意花費掉你全部的時間和精力的時候就要小心了。這個主意強大到讓我花費了大量的時間,讓我僅僅關注於美好的結果而忽略了要要達到那裡需要的過程。
重要的是要知道,像編程這種需要學習很多相關知識的事情,要完成很多小步驟,制定許多小目標。如果你要到達最終的目標,需要關注並完成每一個小目標。如果你太重視最終的結果,那麼就會走努力找捷徑。可能短期來看你有了一些進步,但是從長遠來說,缺乏知識早晚會把你拖垮。學習新知識就像搭房子,要先夯實地基然後再建造。如果基礎不牢靠,早晚建立在這個基礎上的建築都會轟然倒塌。有的時候為了打好基礎會讓你前進的腳步放緩,這沒什麼好羞恥的。記住,從一開始就掌握了基礎知識的人最終一定會超越那些還要在回頭學習的人。我就是這樣的一個例子,外表看起來我可能是一個程序高手,但是實際上,我甚至都不能一個應用來養活自己。中國有句老話說的好:哪怕邁著小步朝著正確的方向前行,總好過於邁大步扯著蛋。
每天專註於過程,你最終會為你達成的進步所震驚。
Stack Overflow 非常好(同時也很危險)
當我在編寫我的應用的時候,Stack Overflow 是我最好的幫友和助手。基本上每次搞不下去我都會在上面提問,這樣每個星期我都會有幾個問題。
我不僅發布問題,我還把 Stack Overflow 上面的回答奉為真理(就像知乎之於我們)。我會花費大量的時間在這裡查找能夠解決我當下問題的代碼。當我找到了答案,我就會複製這段代碼到我的應用,爭取能夠解決我的問題,卻很少花時間去理解這些代碼。我就是這樣野蠻的嘗試不同的內容,甚至讓出錯都成為了藝術。這樣可怕的過程持續了很長的一段時間,直到最終,我清醒了,認識到了這種方法的不足。經驗教訓
如果是學習編程,那麼複製黏貼代碼就是非常糟糕的學習方式。
Stack Overflow 既是福音又是詛咒。它可以幫助你解決很多的問題,但是同時它也會讓你不知不覺的依賴它而不去自己進行深入的研究。有時候這些網站能夠很好的幫助你解決問題,從而給你一種錯覺,而這種錯覺在將來的路上會導致更大的麻煩。如果一直靠別人給你答案,你基本上學不到任何的東西。在問別人或者到網上搜索解決方案之前,盡量自己嘗試著依靠自己解決問題。如果你發現你經常會使用複製黏貼大法,那麼就要警惕起來,至少你要花點時間研究一下這些代碼的原理。記住:在學習的路上,沒有捷徑!尋找有經驗的人的幫助
當我決定學習編程的時候,第一件事就是去市場上買兩本兒關於安卓開發的書。
開始的時候,我按照書上的講述以及例子慢慢學習,並完成了書上所有的練習項目。我很快就感覺到了無聊,甚至沮喪。我決定靠我自己研究該怎麼樣編程。
就像你知道的那樣,這慢慢的成為了災難。我寧願花費大量的時間一個人呆在房間或者咖啡廳,把自己從這個世界隔離。我覺得這個世界上沒人能夠幫助到我,因為我沒有認識的人懂得安卓的開發。時間一點一點過去,然而我卻沒有什麼長進。有一次我有了一個很好的主意,關於在我的應用中使用一個 C 語言的庫函數FFMPEG。因為我的應用需要編輯視頻,所以我覺得使用這個成熟的類庫可以幫助到我。事實證明,這是一個錯誤的決定,我甚至不能讓我的應用正常運行。我浪費了大量的時間閱讀這個庫函數的文檔,嘗試著尋找到合適的方法並能夠把這個庫放到我的應用中。最終,我很懊悔的放棄了這個庫。幸運的是,當時我正好有機會報名了一個面向對象編程的課程並且成功加入。我是這個課堂里唯一一個非計算機專業的學生,我都不知道自己怎麼進去的。我想是他們的報名程序有bug 吧。??第一個作業是創建一個 BlackJack 的程序。我已經自學了5、6個月了,所以我非常有自信能夠完成這個作業。事實上,我也完成了作業並且對自己的成果十分的滿意。但是,現實是殘酷的。我的整個程序寫在了一個龐大的方法裡面,這個課程中的每個人都能看的出來,我的程序需要分解成小的方法,需要重構。這種感覺很糟糕。經驗教訓
幸運的是,課堂的作業以及老師的知道讓我能夠反思我的應用的開發工作以及我的編程能力。我更加的看重學習並且更加堅定了完成一個完整應用的決心。
如果我能夠在早起和一個有經驗的程序員討論過,那麼他們就可能看到我所做的努力,幫助我梳理事物的優先順序,給我一些很有價值的建議。他們甚至有可能讓我避免走一些彎路甚至死路(就像FFMPEG 類庫的使用)。
就像我在曾經的很多文章中提過,有經驗的程序員就像是指南針。他們可能不會帶領你到達終點,但是他們會為你指明方向。能夠獲得他們的幫助經常就是成功與失敗的分水嶺。事後來看,我有太多的方法或許可以獲得幫助,比如當時我應該嘗試著去找尋教有安卓開發經驗的教授或者學生提供幫助,或者在網上的安卓社區中尋找類似的資源。相反的,我選擇了隔離自己,全靠自己。這種做法是一種雙刃劍,一方面,它能夠讓你專註在一件事情上;另一方面,它屏蔽了任何可能幫助到你的有用信息。確保你在需要指導的時候尋求幫助,這會幫助你節省大量的時間並且有效避免將來的沮喪。打造你自己的環境
這或許是我唯一覺得在自學編程的道路上自己做的好做得對的地方。
我覺得我這一輩子實在不擅長為了考試或者做家庭作業而學習。在任何時候到處都是能夠分散注意力的因素。我經常嘗試在圖書館或者咖啡館當做我學習的避難所。我也很幸運的把這個規則應用到了我自學編程上。我最終經常出沒於鎮上有限的幾個咖啡廳。我個人偏愛咖啡廳是因為那裡可以提供很多不同的東西,而且比較容易獨處。咖啡廳的另外一個好處就是你可以選擇不同的地點,這樣比較不會碰到熟人。如果我在家裡學習,我會確保我房間的門是關著的,這樣就可以避免別人在這段時間打擾到我。
不管在哪裡,我一般會開很大聲音的音樂,這樣就可以讓我忽略周圍的環境。歡快的純音樂最適合我學習。我並不是說在遠離干擾的環境選擇上我做到完美了,但是在大多數情況下我還是很成功的避免了干擾。經驗教訓
有一個好的學習環境往往是被忽略的,你的工作環境不應該充滿干擾因素,而應該是長期安靜且免打擾的狀態,這樣更加有利於精力集中。
專註是學習和記憶的基礎。無論何時,你想學習新的知識,都要清楚你的專註的強度決定了你學習的效率。當你注意力低下的時候,新的知識就會很難被接受,同時你的學習效率也會明顯降低。拿任何世界級別的高手為例,如果我們去了解他們是如何訓練的,那麼你認為他們會每隔5分鐘看一下手機嗎?估計不會。最簡單的增加專註力的方法就是打造一個沒有或者很少有干擾的環境,我們可以使用以下幾種方法:- 找到一個別人無法打擾你的地方
- 把手機調到飛行模式
- 使用一些網頁屏蔽軟體屏蔽社交以及新聞類網站
- 帶上耳機聽一些能夠幫助集中注意力的音樂
- 避免電視或者其他比較容易被干擾的環境
- 帶上個記事本,隨時記錄腦海里蹦出的想法或者任務只有你能夠決定在哪裡,以及怎樣打造符合你自己的環境。但是你要確保自己去做,因為這樣的努力是值得的。
走出去多多和別人交流
我的第一份程序員工作就是一個偶然。我剛剛搬到奧馬哈(美國內布拉斯加州最大的工商業城市),同時我已經自學程序開發大約一年之久了。
我在奧馬哈沒有幾個認識的人,所以我搜索了 http://Meetup.com(一個社交網站)嘗試著去找一些對安卓開發的人。很幸運的,當時正好有一個能夠覆蓋安卓以及蘋果的Meetup 移動端開發項目(譯者註:我猜測是一個開源項目),我克服了緊張並且決定加入這個開發項目。第一次參加項目的會議簡直緊張到爆。我花了整整10分鐘時間,在車裡糾結到底是進還是退。我真的很害怕,我對我的開發能力沒有任何的信心,我覺得每一個參加會議的人都比我經驗要豐富的多得多。
最終我戰勝了自己,走了進去,我很慶幸我做到了。然後我就定時參加這樣的會議。在搬來奧馬哈不久,有一次我在 Meetup 上遇到了一個獵頭,他正在找一個安卓開發的外包人員。我和他聊了一會,順利的拿到了周末面試的機會。在面試之前,我本來很自信。但是在面試當中,我就想在聚光燈下驚慌的小鹿一樣。面試官詢問的都是關於我當時在做的項目,我嘗試著按照我準備的回答,但是很明顯,他們能夠察覺這份工作已經超出了我的知識範圍。面試結束之後,他們讓我出去和另外一個人談話。我知道已經搞砸了,於是慢慢走到市中心打算讓我變得清醒一點。最終我和另外一個人完成了面試,很快的,他們提供了一個培訓生的工作。當時他們的 CTO 一直在忙安卓系統的工作,他們需要一個人來幫助復旦一些事務。我的工作就從那天開始了。我做了讓我都震驚的一件事:我簽了合同,領了電腦,然後走到 CEO 那裡去詢問他這是不是有薪的培訓生職位!我很快就從培訓生轉正,成為了一名正式的軟體工程師。經驗教訓
當你自學一些技能的時候,人們往往不會主動來找你,你應該走出去,去發現一些機會。
從學校畢業的大學生,他們在學校經過了系統的學習和訓練,而通過自學開發卻沒有這樣的優勢。對於自學開發的人來說,走出去和不同的人見面,去主動尋找工作是最佳的方法。有一些社交網站,比如 http://Meetup.com,會幫助你找到一些開發相關的興趣組,你可以和他們有些線下的見面和討論。
去克服一起困難,爭取加入這些興趣組中,友好的和別人分享你的經驗,確定別人能夠清楚的知道你找工作的長期目標。嘗試著樂觀的看待事物,對未來充滿希望,相信好的事情會發生。你不加入就永遠不會有贏的機會。認真對待你發展路上的一切阻礙,即使目前看起來是無法解決的問題,它仍舊有可能導致一次你發展路徑上的質的飛躍。關鍵是你要對工作有一個長遠的規劃。培訓生或者兼職或許不能夠給到你想要的薪水,但是卻能夠幫你打開一扇通往未來的大門。總結
如你所見,我在自學的路上犯了無數的錯誤。
學習新的東西永遠沒有捷徑,總是有很多坑,或許這些坑能直接讓你轉向。我鼓勵其他自學開發的人也能夠分享他們的故事,這些故事不僅僅能夠提供有價值的觀點,更重要的是他們能夠照亮我們這些自學開發人員的路。希望我的故事以及經歷能夠幫助到還在自學道路上前行的你。推薦閱讀:
※占察善惡業報經翻譯
※蜀道難原文、翻譯及賞析
※北風行原文、翻譯及賞析
※小熊翻譯——紅粉佳人 Lace Yoke Cardigan
※一群翻譯服務千億級語言翻譯市場