「ADAM 筆記」自學程式,你無形中就犯了這些錯誤! – INSIDE 硬塞的網路趨勢觀察

    摘自: https://www.inside.com.tw/2018/07/23/lessons-learned-from-my-journey-as-a-self-taught-developer

<

iframe src=\”https://www.inside.com.tw/2018/07/23/lessons-learned-from-my-journey-as-a-self-taught-developer\” class=\”iframe-full-content\”><!–

自學程式,你無形中就犯了這些錯誤!

評論

評論

本篇來自合作媒體 36 kr,編譯自原文 「Lessons learned from my journey as a self-taught developer」

開發員之路充滿艱辛,也充滿了各種不確定性。從新手到完成職業工程師這一蛻變沒有捷徑,也正因為如此,所有自學的開發人員都有自己不一樣的經歷和故事。在這篇文章裡,Victor Cassone 分享了他自學程式過程中的一些經歷以及由此收穫的經驗和教訓。希望看到這篇分享之後,有助於讓你反思自己的過去,並激勵你繼續前進。

專注於學習的過程

在我第一次開始學習程式時,我並沒有打算讓自己走上職業工程師的道路。當時,我只是想製作一款特別的應用程式。這一想法最早是在我大四那年產生的,當時我剛剛讀完了理查德·布蘭森(Richard Branson,維珍品牌創辦人)的《Losing my Virginity》這本書,可能也是由於我之前透過科技媒體平台接觸了大量的創業資訊,所以我感覺自己充滿了創業的鬥志。我看過許多關於大學生利用行動應用程式想法獲得高額投資的文章,我想我也可以成為這其中的一員。

一天,在課間的時候,我的腦海中突然出現了一個關於應用程式的想法。這款應用程式的細節並不重要,重要的地方在於這個想法是獨一無二的,並且具有很大的增長潛力(至少在我看來是這樣)。我確信自己發現了接下來應該會發生的一個大事記,我沉浸在自己的這一想法中,上課之後完全聽不到講師在說些什麼。我為自己的這一想法而感到興奮,很快我就感覺必須要採取行動了。

但是這中間有一個大問題,我想創造一款行動應用程式,但我並不認識什麼人可以幫我構建行動應用程式。於是我就想,管它呢,寫程式能有多難?我當時對我的專業並不怎麼感興趣,將很多時間都用在 Xbox 上玩遊戲。我想我可以利用一些空閒時間來自學構建這一款行動應用程式。有時候,天真的想法有助於讓你採取那些本不會貿然嘗試的行動,正可謂初生牛犢不怕虎。

當時的我就是一名沒有任何編碼、業務和設計經驗的大學生,嘗試學習 Android 開發來構建一款複雜的應用程式。我買了幾本關於 Android 開發的書籍,花了很多時間自學,嘗試來開發出這款應用程式。我不在乎它之後的效果怎樣,我只想做出一款成品,如果是能透過從其他管道複製和貼上代碼來完成那就最好不過了。

我認為我可以投機取巧,用最少的編碼知識來完成這一目標。我一心只關注最終的結果,是隧道盡頭的那盞燈讓我不斷前進。時間一分一秒的流逝,這款應用程式變成了一大堆複製和貼上代碼的集合體,沒有很多的功能,勉強達到了運行起來不崩潰的程度。

後來,直到我偶然間接觸了電腦科學課程,我才意識到我應該更多地專注於學習這一過程。由於我自己在編碼方面的能力不足導致我放棄了最初的應用程式創意想法,我也意識到了我這樣根本做不成什麼大事,至少現在還不行。

幸運的是,隨著時間的推移,我改正了自己的行為,開始更加認真地學習。我開始喜歡上了寫程式,並最終走上了專業軟體開發人員的職業生涯之路。

收穫與所得

有一個好的想法是很棒的一件事,但要留意你的這個想法可能會變得具有吞噬性。這是一股很強大的力量,我就是在很長一段時間之內都被這一力量所吞噬。它讓我把關注力放在了最終的結果上,而不是實現這一結果的過程之中。

重要的是記住一點,學習像寫程式這類複雜的知識需要一步一步的去積累。所以,要想讓自己有所學,唯一的方法就是專注當下每一步的學習過程並且掌握每一步所需要掌握的內容。

如果你過於關注最終結果,那你很有可能就會開始走捷徑。走捷徑可能會讓你短期之內取得不小的進展,但從長遠來看,對於基礎知識的缺乏遲早會成為你的絆腳石。學習一樣新知識就像蓋房子一樣,你要先建好地基,然後萬丈高樓方能平地起。如果地基不牢,整座建築遲早會坍塌。

有時要想搭建一個堅實的地基就需要你放慢速度。不要因為自己進展緩慢而感到羞恥,一次性完全掌握基礎知識的人最終會領先於那些走捷徑、但必須回頭重新學習的人。我就是一個反面例子,外表看上去我可能像是一位程式天才,但其實我根本就無法構建起一款像樣的應用程式。

專注於每天的學習過程,最終你會為自己取得的進步而感到驚訝。

Stack Overflow 很棒(也很危險)

在我學習構建應用程序的過程中,Stack Overflow 成為了我最好的朋友。每當我遇到什麼困難卡住的時候,我都會到 Stack Overflow 社群提出問題,平均一周都會有好幾個問題。我不僅會在這上面提出問題,而且也會將從上面所得到的答案視為救星。我會花費大量的時間進行搜尋工作,試圖找到可以解決我當下問題的那個代碼塊。一旦找到答案之後,我會將其複製並貼到我的代碼庫中,嘗試讓其發揮作用。根本就沒有投入時間讓自己嘗試去理解這些代碼,我只是粗暴的透夠過這種蠻力形式進行嘗試。

這種模式持續了有一段時間,直到最後,我醒悟過來,最終意識到了這種方法的缺陷所在。

收穫與所得

在學習編碼過程中,複製與貼上是最可怕的一種方式。Stack Overflow 可謂是一把雙面刃,它非常適合幫助你解決問題,但如果你不多加小心,它就會成為你總是想要依賴的那根拐杖。

有的時候,可能是由於 Stack Overflow 太擅長於幫助你解決問題,你也會因此產生一種不切實際的自信心,而這未來只會給你帶來更多的麻煩。

如果遇到問題你只是一味的想透過求助來尋求答案,那你學不到多少東西。在訪問 Google 之前,確保自己嘗試過解決這一問題。如果你發現自己正在進行複製、貼上代碼這一操作,那也要確保自己至少投入了一些事件去理解這些代碼塊。畢竟,在學習的過程中,沒有捷徑可走。

尋找過來人的幫助

在我決定自學程式之後,我做的第一件事就是買了兩本 Android 開發方面的書。一開始,我嚴格按照書中的練習去做,並完成了所有的範例。但很快我就感到厭倦或者說沮喪,不想再繼續跟著這本書學下去。我決定走自己的路,自己來搞定編碼。但正如我之前所說,這樣做的結果就是會慢慢的讓自己陷入災難之中。

我會自己一個人長時間的待在我的房間或咖啡店裡。我將自己與外界隔離,我感覺沒人可以幫助我,因為我認識的人都沒有任何 Android 開發的經驗。日子一天天過去,我卻沒有取得多大的進展。

有一次,我想到了一個好主意,那就是下載一個名為 FFMPEG 的大型 C 庫。我想要構建的應用程式需要對影片進行編輯,因此我認為如果能夠利用這一 C 庫的強大功能那應該是一個不錯的主意。其實在當時,這並不是最明智的舉動,因為當時我的 Android 應用程序幾乎還無法正常運行。我浪費了很多的時間去閱讀 C 代碼,試圖弄清楚該怎樣在我的應用程序中用到它。慢慢的,我又開始變得沮喪,最終放棄了這個主意。

幸運的一點是,大約在同一時間,我報名參加了面向對象編碼(OOP)的一門課程,也不知道怎麼就被錄取了。在所有報名的學生當中,我是唯一來自非電腦科學專業的一位。我也不知道自己怎麼就被選中了,可能是報名軟件中有 bug 吧。

這門課程給出的第一項任務就是創造一個 Blackjack 程式。當時,我自學編碼已經有 5-6 個月的時間了,因此我對自己可謂是信心滿滿。我很快完成了這一任務,並自我感覺良好的樣子。但很快,這種感覺就消失了。我的整個程式是用一種很籠統的方式去寫成的,而班上的其他人都知道這一程序應該分成幾個類別。這種感覺太差了!

收穫與所得

好在,老師給出的課堂作業和指導意見可以讓我先擱置我的 Android 應用程式,專注於反思自己的開發能力。我開始更加重視學習,並重新找回了自己最初的想法,那就是製作一款完整的應用程式。

如果我在早期階段就能有幸同那些經驗豐富的開發人員交流,那他們就會了解我在做些什麼,從而給出優先順序建議,讓我可以更加理智的採取行動。當我走入沒有什麼出口的死胡同時(比如嘗試利用 FFMPEG),他們也會幫助我及時的調整路線。經驗豐富的開發人員就像是指南針,他們雖然無法直接帶你到達目的地,但他們會確保你所選擇的是正確的方向。他們的這一幫助往往會成為你扭轉敗局,走向成功的關鍵所在。

事後回想起來,其實當時我有很多種方法可以尋求他們的幫助。我可以嘗試在大學裡找一位擁有 Android 開發經驗的教授/學生,也可以嘗試尋找一個線上 Android 社群。但那時的我卻只是將自己隔離了起來,隔離是一把雙面刃。一方面,它可以讓你專注於手頭上的任務,另一方面,它會讓你遠離外界,無法獲得關鍵性回饋。

確保自己可以獲得過來人的經驗指導,這將為你節省不少的時間,並減少一些不必要的挫敗感。

尋找合適的環境

在我自學寫程式的過程之中,這可能是我唯一做的還算對的事情。在我整個學習生涯之中,無論是在家備戰考試還是做作業對我來說效果都很糟糕,好像總有很多的干擾因素。所以,我通常都會去圖書館或者咖啡館來尋得一方清靜。幸運的是,在我自學程式的時候,我也是這樣做的。

我成為了鎮上幾家當地咖啡館的常客。較之其它學習地點,我更喜歡咖啡館的原因在於咖啡館的選擇性更多一些,你可以選擇一家你不會碰到認識人的店面。如果我在家學習,那我必須要關上門,這樣我的室友才知道在一段時間之內不可以打擾我。其實無論在哪裡,我都會確保耳機裡的音樂聲音足夠大,這樣我就听不到周圍的任何聲音。那種沒有歌詞的歡快音樂類型最適合我。

收穫與所得

尋找合適的環境往往是學習過程中容易被忽視的一個環節,要知道在這個過程中你應該保證不會有其他的干擾因素,這樣你才能長時間的保持專注狀態。專注是保證記憶力和技能獲取效果的基礎組成部分,當你嘗試將新資訊輸入大腦中時,輸入效果的強度直接與你的專注程序相關。如果你的注意力不集中,那新資訊的記憶會降低,導致學習速度變慢,學習時間也會因而增加。

看看那些世界水平的表演家平時是如何訓練的就知道了,他們是會每五分鐘就看一次手機嗎?肯定不會吧。

要想提高專注力,最簡單的一個方法就是尋找一個對你來說乾擾力最低的環境,具體可以參考以下幾種方式:

  • 找一個沒人會打擾你的地方
  • 將手機設置為飛航狀態
  • 利用某種定時網站阻擋器來管理社群媒體和新聞網站的瀏覽權限
  • 戴上耳機聽一些不會讓你分心的音樂(最好提前設置好歌單列表,這樣就不必經常切換歌曲)
  • 避開周圍有電視或者是其他會導致你分心因素存在的環境
  • 隨身攜帶一個筆記本,可以記下突然出現在腦海中的任何想法

只有你自己可以決定何處才是適合你的學習環境,並且正確的去選擇這一類的環境。確保自己在環境選擇上費點精力,因為它值得你這麼做。

將所學付諸實踐,進入工作場合

我的第一份編碼工作其實來的有些偶然。當時,我剛剛搬到內布拉斯加州的奧馬哈,距離我開始自學編碼已經過去了一年的時間。我在奧馬哈幾乎沒什麼認識的人,於是我透過 Meetup.com 進行搜尋,試圖找到對同樣 Android 開發感興趣的人。幸運的是,當時我找到了一個相關的聚會活動,涉及 iOS 和 Android 開發。於是,我鼓起勇氣,決定前去參加。

萬事開頭難,第一次去之前我在車裡猶豫了大約有十分鐘的時間,不知道是該進去還是直接開車走人。我怯場了,我對自己的編碼技巧沒有信心,我知道在場的每個人都比我有經驗。最後,我把心一橫,管它呢,我就直接走了進去。我也很高興當時我做出了正確的決定。

之後,我開始定期參加這一聚會。不久之後,在聚會上我認識了一位招聘人員,他正在尋找一名安卓開發人員。我們就此事談了一會,之後我接到了這一崗位的面試通知。在參加面試前,我感到信心滿滿。但在面試過程中,我卻表現得有些不知所措。面試官介紹著這一職位需要負責的專案,我發現這一切都超出了我的理解範圍。我試圖讓自己跟上節奏,但他們顯然能夠看出這超出了我的能力範圍。

面試結束之後,他們讓我先隨便逛逛,再同其他人談一談。我知道自己這次搞砸了,於是我在市中心逛了一會,讓自己冷靜下來。之後,我又參加了一次面試,不久之後,他們向我提供了一個實習崗位。因為當時公司的 CTO 自己負責所有的 Android 工作,他需要有人來替他分擔一下。

當時的我甚至不敢相信自己拿到了這個機會,在簽署了所有的相關文件之後,我又跑到 CEO 那裡,問他這是否是一份帶薪實習的工作。最後,我從實習轉為全職工作,我作為軟件開發人員的職業生涯也正式開始了。

收穫與所得

如果在某種技能方面你是自學成才,那應該不會有招聘人員主動來找你。你需要走出去,主動尋找機會。那些畢業於四年制大學的人可以利用學校資源來找到工作,但對於自學人群可說,這一便利條件並不存在。也就是說,對於我們這樣的人來說,要想找到一份工作,最好的辦法就是走出去,認識更多的人,你可以透過像 Meetup.com 這樣的網站去尋找那些每個月或每兩個月聚會一次的相關小組。

盡你所能鼓起勇氣去加入這些群體。保持友好的態度,同其他人分享你的經歷,確保他們了解你找工作的長期目標。讓自己進入可能帶來積極影響的情景之中,如果你不買彩票,那你永遠也中不了大獎。認真看待你所擁有的任何機會,即便它看上去像死路一條,但峰迴路轉也說不定呢。

關鍵是要讓自己眼光放長遠一些,實習或者兼職工作可能當下給不了你想要的薪資待遇,但他們能夠幫你打開走向未來的大門。

相關文章

評論

_stq = window._stq || [];
_stq.push([ \’view\’, {v:\’ext\’,j:\’1:6.3.2\’,blog:\’11062372\’,post:\’147755\’,tz:\’8\’,srv:\’www.inside.com.tw\’} ]);
_stq.push([ \’clickTrackerInit\’, \’11062372\’, \’147755\’ ]);

(function(i,s,o,g,r,a,m){
i[\’tnla_object\’]=r;
i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)};
a=s.createElement(o),
m=s.getElementsByTagName(o)[0];
a.async=1;
a.src=g;
m.parentNode.insertBefore(a,m)
})(window,document,\’script\’, \’//tnla.thenewslens.com/static/tnla.min.js?v=1.2\’, \’tnla\’);
tnla(\’init\’, \’inside\’, \’1\’);
tnla(\’track\’, { // 文章頁
\”name\” : \”pv\”,
\”au\” : \”Anny\”, // author
\”ca\” : \”評論\”, // category
\”ct\” : 1, // content type, [ 0 -> index, 1 -> article ]
\”dp\” : \”2018-07-23T19:11:40+08:00\”, // datePublished ex: 2017-04-24T17:50:52+08:00, 1526372912861(timestamp integer in ms)
});
var MLobj = {
\’CONTENT\’ : \’article\’,
\’Pubdate\’ : \”2018/7/23\”,
\’Cid\’ : \”147755\”,
\’Auth\’ : \”Anny\”,
\’cat\’ : \”評論\”,
\’sec\’ : \”評論\”,
};
tnla(\’id\’, function(id){
MLobj.uuid = id.uuid;
MLobj.ssid = id.ssid;
var mediaLab = new ML(MLobj);
mediaLab.mediaLab();
});

// lndata setting
var ln_data_setting = {
account: \’3f85070\’,
domain: \’inside.com.tw\’,
cm_tid: \’4099\’
};

var _smq = _smq || [];
_smq.push([\’_setAccount\’, ln_data_setting[\’account\’], new Date()]);
_smq.push([\’_setDomainName\’, ln_data_setting[\’domain\’]]);
_smq.push([\’pageview\’]);
(function() {
var sm = document.createElement(\’script\’); sm.type = \’text/javascript\’; sm.async = true;
sm.src = (\’https:\’ == document.location.protocol ? \’https://\’ : \’http://\’) + \’cdn.lndata.com/collect.js\’;
sm.onload = function(){
tnla(\’id\’, function(id){
var tid = ln_data_setting[\’cm_tid\’];
var redir_uri = \”https://tnla.thenewslens.com/lndata-cm?tnla=\” + id[\’uuid\’] + \”&host=\” + location.hostname;
var uri = \”https://cm.lndata.com/?tid=\” + tid + \”&uid=\” + id[\’uuid\’] + \”&redir=\” + encodeURIComponent(redir_uri);
//fetch(uri, {mode: \’no-cors\’});
var ck = new Image();
ck.src = uri;
})
}
var s = document.getElementsByTagName(\’script\’)[0]; s.parentNode.insertBefore(sm, s);
})();

var _comscore = _comscore || [];
_comscore.push({ c1: \”2\”, c2: \”17728543\” });
(function() {
var s = document.createElement(\”script\”), el =
document.getElementsByTagName(\”script\”)[0]; s.async = true;
s.src = (document.location.protocol == \”https:\” ? \”https://sb\” :
\”http://b\”) + \”.scorecardresearch.com/beacon.js\”;
el.parentNode.insertBefore(s, el);
})();

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *