自學(xué)編程這條路上,你容易不知不覺犯這些錯(cuò)誤
編者按:自學(xué)成才的開發(fā)員之路充滿艱辛,也充滿了各種不確定性。從新手到完成職業(yè)程序員這一蛻變沒有捷徑,也正因?yàn)槿绱耍凶詫W(xué)成才的開發(fā)人員都有自己不一樣的經(jīng)歷和故事。在這篇文章里,Victor Cassone 分享了他自學(xué)編程過程中的一些經(jīng)歷以及由此收獲的經(jīng)驗(yàn)和教訓(xùn)。希望看到這篇分享之后,有助于讓你反思自己的過去,并激勵(lì)你繼續(xù)前進(jìn)。
專注于學(xué)習(xí)的過程
在我第一次開始學(xué)習(xí)編程時(shí),我并沒有打算讓自己走上職業(yè)編程人員的道路。當(dāng)時(shí),我只是想制作一款特別的應(yīng)用程序。這一想法最早是在我大四那年產(chǎn)生的,當(dāng)時(shí)我剛剛讀完了理查德·布蘭森(Richard Branson,維珍品牌創(chuàng)始人)的《Losing my Virginity》這本書,可能也是由于我之前通過科技媒體平臺(tái)接觸了大量的創(chuàng)業(yè)信息,所以我感覺自己充滿了創(chuàng)業(yè)的斗志。我看過許多關(guān)于大學(xué)生利用移動(dòng)應(yīng)用程序想法獲得高額投資的文章,我想我也可以成為這其中的一員。
一天,在課間的時(shí)候,我的腦海中突然出現(xiàn)了一個(gè)關(guān)于應(yīng)用程序的想法。這款應(yīng)用程序的細(xì)節(jié)并不重要,重要的地方在于這個(gè)想法是獨(dú)一無二的,并且具有很大的增長(zhǎng)潛力(至少在我看來是這樣)。我確信自己發(fā)現(xiàn)了接下來應(yīng)該會(huì)發(fā)生的一個(gè)大事記,我沉浸在自己的這一想法中,上課之后完全聽不到講師在說些什么。我為自己的這一想法而感到興奮,很快我就感覺必須要采取行動(dòng)了。
但是這中間有一個(gè)大問題,我想創(chuàng)建一款移動(dòng)應(yīng)用程序,但我并不認(rèn)識(shí)什么人可以幫我構(gòu)建移動(dòng)應(yīng)用程序。于是我就想,管它呢,編程能有多難?我當(dāng)時(shí)對(duì)我的專業(yè)并不怎么感興趣,將很多時(shí)間都用在Xbox 上玩游戲。我想我可以利用一些空閑時(shí)間來自學(xué)構(gòu)建這一款移動(dòng)應(yīng)用程序。有時(shí)候,天真的想法有助于讓你采取那些本不會(huì)貿(mào)然嘗試的行動(dòng),正可謂初生牛犢不怕虎。
當(dāng)時(shí)的我就是一名沒有任何編程、業(yè)務(wù)和設(shè)計(jì)經(jīng)驗(yàn)的大學(xué)生,嘗試學(xué)習(xí) Android 開發(fā)來構(gòu)建一款復(fù)雜的應(yīng)用程序。我買了幾本關(guān)于 Android 開發(fā)的書籍,花了很多時(shí)間自學(xué),嘗試來開發(fā)出這款應(yīng)用程序。我不在乎它之后的效果怎樣,我只想做出一款成品,如果是能通過從其他渠道復(fù)制和粘貼代碼來完成那就最好不過了。
我認(rèn)為我可以投機(jī)取巧,用最少的編程知識(shí)來完成這一目標(biāo)。我一心只關(guān)注最終的結(jié)果,是隧道盡頭的那盞燈讓我不斷前進(jìn)。時(shí)間一分一秒的流逝,這款應(yīng)用程序變成了一大堆復(fù)制和粘貼代碼的集合體,沒有很多的功能,勉強(qiáng)達(dá)到了運(yùn)行起來不崩潰的程度。
后來,直到我偶然間接觸了計(jì)算機(jī)科學(xué)課程,我才意識(shí)到我應(yīng)該更多地專注于學(xué)習(xí)這一過程。由于我自己在編程方面的能力不足導(dǎo)致我放棄了最初的應(yīng)用程序創(chuàng)意想法,我也意識(shí)到了我這樣根本做不成什么大事,至少現(xiàn)在還不行。
幸運(yùn)的是,隨著時(shí)間的推移,我改正了自己的行為,開始更加認(rèn)真地學(xué)習(xí)。我開始喜歡上了編程,并最終走上了專業(yè)軟件開發(fā)人員的職業(yè)生涯之路。
收獲與所得
有一個(gè)好的想法是很棒的一件事,但要留意你的這個(gè)想法可能會(huì)變得具有吞噬性。這是一股很強(qiáng)大的力量,我就是在很長(zhǎng)一段時(shí)間之內(nèi)都被這一力量所吞噬。它讓我把關(guān)注力放在了最終的結(jié)果上,而不是實(shí)現(xiàn)這一結(jié)果的過程之中。
重要的是記住一點(diǎn),學(xué)習(xí)像編程這類復(fù)雜的知識(shí)需要一步一步的去積累。所以,要想讓自己有所學(xué),唯一的方法就是專注當(dāng)下每一步的學(xué)習(xí)過程并且掌握每一步所需要掌握的內(nèi)容。
如果你過于關(guān)注最終結(jié)果,那你很有可能就會(huì)開始走捷徑。走捷徑可能會(huì)讓你短期之內(nèi)取得不小的進(jìn)展,但從長(zhǎng)遠(yuǎn)來看,對(duì)于基礎(chǔ)知識(shí)的缺乏遲早會(huì)成為你的絆腳石。學(xué)習(xí)一樣新知識(shí)就像蓋房子一樣,你要先建好地基,然后萬丈高樓方能平地起。如果地基不牢,整座建筑遲早會(huì)坍塌。
有時(shí)要想搭建一個(gè)堅(jiān)實(shí)的地基就需要你放慢速度。不要因?yàn)樽约哼M(jìn)展緩慢而感到羞恥,一次性完全掌握基礎(chǔ)知識(shí)的人最終會(huì)領(lǐng)先于那些走捷徑、但必須回頭重新學(xué)習(xí)的人。我就是一個(gè)反面例子,外表看上去我可能像是一位編程天才,但其實(shí)我根本就無法構(gòu)建起一款像樣的應(yīng)用程序。
專注于每天的學(xué)習(xí)過程,最終你會(huì)為自己取得的進(jìn)步而感到驚訝。
Stack Overflow 很棒(也很危險(xiǎn))
在我學(xué)習(xí)構(gòu)建應(yīng)用程序的過程中,Stack Overflow 成為了我最好的朋友。每當(dāng)我遇到什么困難卡住的時(shí)候,我都會(huì)到 Stack Overflow 社區(qū)提出問題,平均一周都會(huì)有好幾個(gè)問題。我不僅會(huì)在這上面提出問題,而且也會(huì)將從上面所得到的答案視為救星。我會(huì)花費(fèi)大量的時(shí)間進(jìn)行搜索工作,試圖找到可以解決我當(dāng)下問題的那個(gè)代碼塊。一旦找到答案之后,我會(huì)將其復(fù)制并粘貼到我的代碼庫(kù)中,嘗試讓其發(fā)揮作用。我根本就沒有投入時(shí)間讓自己嘗試去理解這些代碼,我只是粗暴的通過這種蠻力形式進(jìn)行嘗試。
這種模式持續(xù)了有一段時(shí)間,直到最后,我醒悟過來,最終意識(shí)到了這種方法的缺陷所在。
收獲與所得
在學(xué)習(xí)編程過程中,復(fù)制與粘貼是最可怕的一種方式。Stack Overflow 可謂是一把雙刃劍,它非常適合幫助你解決問題,但如果你不多加小心,它就會(huì)成為你總是想要依賴的那根拐杖。
有的時(shí)候,可能是由于 Stack Overflow 太擅長(zhǎng)于幫助你解決問題,你也會(huì)因此產(chǎn)生一種不切實(shí)際的自信心,而這未來只會(huì)給你帶來更多的麻煩。
如果遇到問題你只是一味的想通過求助來尋求答案,那你學(xué)不到多少東西。在訪問 Google 之前,確保自己嘗試過解決這一問題。如果你發(fā)現(xiàn)自己正在進(jìn)行復(fù)制、粘貼代碼這一操作,那也要確保自己至少投入了一些事件去理解這些代碼塊。畢竟,在學(xué)習(xí)的過程中,沒有捷徑可走。
尋找過來人的幫助
在我決定自學(xué)編程之后,我做的第一件事就是買了兩本 Android 開發(fā)方面的書。一開始,我嚴(yán)格按照書中的練習(xí)去做,并完成了所有的示例項(xiàng)目。但很快我就感到厭倦或者說沮喪,不想再繼續(xù)跟著這本書學(xué)下去。我決定走自己的路,自己來搞定編程。但正如我之前所說,這樣做的結(jié)果就是會(huì)慢慢的讓自己陷入災(zāi)難之中。
我會(huì)自己一個(gè)人長(zhǎng)時(shí)間的待在我的房間或咖啡店里。我將自己與外界隔離,我感覺沒人可以幫助我,因?yàn)槲艺J(rèn)識(shí)的人都沒有任何 Android 開發(fā)的經(jīng)驗(yàn)。日子一天天過去,我卻沒有取得多大的進(jìn)展。
有一次,我想到了一個(gè)好主意,那就是下載一個(gè)名為 FFMPEG 的大型 C 庫(kù)。我想要構(gòu)建的應(yīng)用程序需要對(duì)視頻進(jìn)行編輯,因此我認(rèn)為如果能夠利用這一 C 庫(kù)的強(qiáng)大功能那應(yīng)該是一個(gè)不錯(cuò)的主意。其實(shí)在當(dāng)時(shí),這并不是最明智的舉動(dòng),因?yàn)楫?dāng)時(shí)我的 Android 應(yīng)用程序幾乎還無法正常運(yùn)行。我浪費(fèi)了很多的時(shí)間去閱讀 C 代碼,試圖弄清楚該怎樣在我的應(yīng)用程序中用到它。慢慢的,我又開始變得沮喪,最終放棄了這個(gè)主意。
幸運(yùn)的一點(diǎn)是,大約在同一時(shí)間,我報(bào)名參加了面向?qū)ο缶幊?OOP)的一門課程,也不知道怎么就被錄取了。在所有報(bào)名的學(xué)生當(dāng)中,我是唯一來自非計(jì)算機(jī)科學(xué)專業(yè)的一位。我也不知道自己怎么就被選中了,可能是報(bào)名軟件中有 bug 吧。
這門課程給出的第一項(xiàng)任務(wù)就是創(chuàng)建一個(gè) Blackjack 程序。當(dāng)時(shí),我自學(xué)編程已經(jīng)有 5-6 個(gè)月的時(shí)間了,因此我對(duì)自己可謂是信心滿滿。我很快完成了這一任務(wù),并自我感覺良好的樣子。但很快,這種感覺就消失了。我的整個(gè)程序是用一種很籠統(tǒng)的方式去寫成的,而班上的其他人都知道這一程序應(yīng)該分成幾個(gè)類別。這種感覺太差了!
收獲與所得
好在,老師給出的課堂作業(yè)和指導(dǎo)意見可以讓我先擱置我的 Android 應(yīng)用程序,專注于反思自己的開發(fā)能力。我開始更加重視學(xué)習(xí),并重新找回了自己最初的想法,那就是制作一款完整的應(yīng)用程序。
如果我在早期階段就能有幸同那些經(jīng)驗(yàn)豐富的開發(fā)人員交流,那他們就會(huì)了解我在做些什么,從而給出優(yōu)先順序建議,讓我可以更加理智的采取行動(dòng)。當(dāng)我走入沒有什么出口的死胡同時(shí)(比如嘗試?yán)肍FMPEG),他們也會(huì)幫助我及時(shí)的調(diào)整路線。經(jīng)驗(yàn)豐富的開發(fā)人員就像是指南針,他們雖然無法直接帶你到達(dá)目的地,但他們會(huì)確保你所選擇的是正確的方向。他們的這一幫助往往會(huì)成為你扭轉(zhuǎn)敗局,走向成功的關(guān)鍵所在。
事后回想起來,其實(shí)當(dāng)時(shí)我有很多種方法可以尋求他們的幫助。我可以嘗試在大學(xué)里找一位擁有Android 開發(fā)經(jīng)驗(yàn)的教授/學(xué)生,也可以嘗試尋找一個(gè)在線 Android 社區(qū)。但那時(shí)的我卻只是將自己隔離了起來,隔離是一把雙刃劍。一方面。它可以讓你專注于手頭上的任務(wù),另一方面,它會(huì)讓你遠(yuǎn)離外界,無法獲得關(guān)鍵性反饋。
確保自己可以獲得過來人的經(jīng)驗(yàn)指導(dǎo),這將為你節(jié)省不少的時(shí)間,并減少一些不必要的挫敗感。
尋找合適的環(huán)境
在我自學(xué)編程的過程之中,這可能是我唯一做的還算對(duì)的事情。在我整個(gè)學(xué)習(xí)生涯之中,無論是在家備戰(zhàn)考試還是做作業(yè)對(duì)我來說效果都很糟糕,好像總有很多的干擾因素。所以,我通常都會(huì)去圖書館或者咖啡館來尋得一方清靜。幸運(yùn)的是,在我自學(xué)編程的時(shí)候,我也是這樣做的。
我成為了鎮(zhèn)上幾家當(dāng)?shù)乜Х瑞^的???。較之其它學(xué)習(xí)地點(diǎn),我更喜歡咖啡館的原因在于咖啡館的選擇性更多一些,你可以選擇一家你不會(huì)碰到認(rèn)識(shí)人的店面。如果我在家學(xué)習(xí),那我必須要關(guān)上門,這樣我的室友才知道在一段時(shí)間之內(nèi)不可以打擾我。其實(shí)無論在哪里,我都會(huì)確保耳機(jī)里的音樂聲音足夠大,這樣我就聽不到周圍的任何聲音。那種沒有歌詞的歡快音樂類型最適合我。
收獲與所得
尋找合適的環(huán)境往往是學(xué)習(xí)過程中容易被忽視的一個(gè)環(huán)節(jié),要知道在這個(gè)過程中你應(yīng)該保證不會(huì)有其他的干擾因素,這樣你才能長(zhǎng)時(shí)間的保持專注狀態(tài)。專注是保證記憶力和技能獲取效果的基礎(chǔ)組成部分,當(dāng)你嘗試將新信息輸入大腦中時(shí),輸入效果的強(qiáng)度直接與你的專注程序相關(guān)。如果你的注意力不集中,那新信息的粘性會(huì)降低,導(dǎo)致學(xué)習(xí)速度變慢,學(xué)習(xí)時(shí)間也會(huì)因而增加。
看看那些世界水平的表演家平時(shí)是如何訓(xùn)練的就知道了,他們是會(huì)每五分鐘就看一次手機(jī)嗎?肯定不會(huì)吧。
要想提高專注力,最簡(jiǎn)單的一個(gè)方法就是尋找一個(gè)對(duì)你來說干擾力最低的環(huán)境,具體可以參考以下幾種方式:
- 找一個(gè)沒人會(huì)打擾你的地方
- 將手機(jī)設(shè)置為飛行狀態(tài)
- 利用某種定時(shí)網(wǎng)站攔截器來管理社交媒體和新聞網(wǎng)站的瀏覽權(quán)限
- 戴上耳機(jī)聽一些不會(huì)讓你分心的音樂(最好提前設(shè)置好歌單列表,這樣就不必經(jīng)常切換歌曲)
- 避開周圍有電視或者是其他會(huì)導(dǎo)致你分心因素存在的環(huán)境
- 隨身攜帶一個(gè)筆記本,可以記下突然出現(xiàn)在腦海中的任何想法
只有你自己可以決定何處才是適合你的學(xué)習(xí)環(huán)境,并且正確的去選擇這一類的環(huán)境。確保自己在環(huán)境選擇上費(fèi)點(diǎn)精力,因?yàn)樗档媚氵@么做。
將所學(xué)付諸實(shí)踐,進(jìn)入工作場(chǎng)合
我的第一份編程工作其實(shí)來的有些偶然。當(dāng)時(shí),我剛剛搬到內(nèi)布拉斯加州的奧馬哈,距離我開始自學(xué)編程已經(jīng)過去了一年的時(shí)間。我在奧馬哈幾乎沒什么認(rèn)識(shí)的人,于是我通過 Meetup.com 進(jìn)行搜索,試圖找到對(duì)同樣 Android 開發(fā)感興趣的人。幸運(yùn)的是,當(dāng)時(shí)我找到了一個(gè)相關(guān)的聚會(huì)活動(dòng),涉及 iOS 和Android 開發(fā)。于是,我鼓起勇氣,決定前去參加。
萬事開頭難,第一次去之前我在車?yán)铼q豫了大約有十分鐘的時(shí)間,不知道是該進(jìn)去還是直接開車走人。我怯場(chǎng)了,我對(duì)自己的編程技巧沒有信心,我知道在場(chǎng)的每個(gè)人都比我有經(jīng)驗(yàn)。最后,我把心一橫,管它呢,我就直接走了進(jìn)去。我也很高興當(dāng)時(shí)我做出了正確的決定。
之后,我開始定期參加這一聚會(huì)。不久之后,在聚會(huì)上我認(rèn)識(shí)了一位招聘人員,他正在尋找一名安卓開發(fā)人員。我們就此事談了一會(huì),之后我接到了這一崗位的面試通知。在參加面試前,我感到信心滿滿。但在面試過程中,我卻表現(xiàn)得有些不知所措。面試官介紹著這一職位需要負(fù)責(zé)的項(xiàng)目,我發(fā)現(xiàn)這一切都超出了我的理解范圍。我試圖讓自己跟上節(jié)奏,但他們顯然能夠看出這超出了我的能力范圍。
面試結(jié)束之后,他們讓我先隨便逛逛,再同其他人談一談。我知道自己這次搞砸了,于是我在市中心逛了一會(huì),讓自己冷靜下來。之后,我又參加了一次面試,不久之后,他們向我提供了一個(gè)實(shí)習(xí)崗位。因?yàn)楫?dāng)時(shí)公司的 CTO 自己負(fù)責(zé)所有的 Android 工作,他需要有人來替他分擔(dān)一下。
當(dāng)時(shí)的我甚至不敢相信自己拿到了這個(gè)機(jī)會(huì),在簽署了所有的相關(guān)文件之后,我又跑到 CEO 那里,問他這是否是一份帶薪實(shí)習(xí)的工作。最后,我從實(shí)習(xí)轉(zhuǎn)為全職工作,我作為軟件開發(fā)人員的職業(yè)生涯也正式開始了。
收獲與所得
如果在某種技能方面你是自學(xué)成才,那應(yīng)該不會(huì)有招聘人員主動(dòng)來找你。你需要走出去,主動(dòng)尋找機(jī)會(huì)。那些畢業(yè)于四年制大學(xué)和編碼培訓(xùn)學(xué)校的人可以利用學(xué)校資源來找到工作,但對(duì)于自學(xué)人群可說,這一便利條件并不存在。也就是說,對(duì)于我們這樣的人來說,要想找到一份工作,最好的辦法就是走出去,認(rèn)識(shí)更多的人,你可以通過像 Meetup.com 這樣的網(wǎng)站去尋找那些每個(gè)月或每?jī)蓚€(gè)月聚會(huì)一次的相關(guān)小組。
盡你所能鼓起勇氣去加入這些群體。保持友好的態(tài)度,同其他人分享你的經(jīng)歷,確保他們了解你找工作的長(zhǎng)期目標(biāo)。讓自己進(jìn)入可能帶來積極影響的情景之中,如果你不買彩票,那你永遠(yuǎn)也中不了大獎(jiǎng)。認(rèn)真看待你所擁有的任何機(jī)會(huì),即便它看上去像死路一條,但峰回路轉(zhuǎn)也說不定呢。
關(guān)鍵是要讓自己眼光放長(zhǎng)遠(yuǎn)一些,實(shí)習(xí)或者兼職工作可能當(dāng)下給不了你想要的薪資待遇,但他們能夠幫你打開走向未來的大門。
總結(jié)
如你所見,我在自學(xué)過程中犯過許多錯(cuò)誤。要掌握一門新技能,絕對(duì)不是一路坦途,其中會(huì)有轉(zhuǎn)彎,也會(huì)有起伏跌宕。希望我的經(jīng)歷和我的所思所得能夠幫助你繼續(xù)前進(jìn)。