在IT工程師和培訓(xùn)機(jī)構(gòu)多如牛毛的時(shí)代,拜師學(xué)藝并不難走孽。但自學(xué)編程對(duì)于毫無(wú)基礎(chǔ)的同學(xué)來(lái)說(shuō)卻可能是個(gè)問(wèn)題尺棋,相信有過(guò)類(lèi)似經(jīng)歷的朋友都有一把辛酸淚和一肚不吐不快的體會(huì)。讓我們從一個(gè)故事說(shuō)起...
故事
某君在一個(gè)普通大學(xué)讀著自己不喜歡的專(zhuān)業(yè)莽使,以打游戲锐极、刷段子和睡覺(jué)度日,突然有一天想學(xué)點(diǎn)什么芳肌。學(xué)編程好像挺酷灵再,而且聽(tīng)說(shuō)IT行業(yè)充滿了機(jī)會(huì),沒(méi)準(zhǔn)一不小心就和大佬一起“改變世界”了亿笤。
那么第一個(gè)問(wèn)題來(lái)了翎迁,他該選擇什么語(yǔ)言?
是世界上最好的語(yǔ)言PHP净薛?還是語(yǔ)言之母的C汪榔?幸好還知道個(gè)編程語(yǔ)言排行榜,找到一看肃拜、幾十種不帶重樣痴腌,這要逼死天秤座的小朋友。選PHP吧燃领?上非誠(chéng)勿擾都要被滅燈士聪,而且就只能做個(gè)網(wǎng)頁(yè)。萬(wàn)般糾結(jié)之后我們選C吧猛蔽,聽(tīng)起來(lái)既高級(jí)又底層剥悟,說(shuō)不準(zhǔn)還能考個(gè)計(jì)算機(jī)二級(jí)灵寺。
接下來(lái)得干正事兒了。在這個(gè)便捷的網(wǎng)絡(luò)時(shí)代区岗,自學(xué)可選擇的方式非常豐富略板。除了在網(wǎng)絡(luò)上收集資料、閱讀干貨外慈缔,某君還向一些前輩咨詢了自學(xué)的方法蚯根。
網(wǎng)絡(luò)上流傳的編程學(xué)習(xí)方式有:
- 看書(shū)(這是最容易想到的方法)
- 觀看視頻教程
- 閱讀官網(wǎng)文檔
- 讀源碼
- 到大學(xué)蹭課或者報(bào)名培訓(xùn)(不知道還算不算自學(xué),沒(méi)交學(xué)費(fèi)都算吧胀糜?)
某君又得糾結(jié)一番了颅拦,大學(xué)蹭課和培訓(xùn)并不一定有合適條件,且不符合自學(xué)的氣質(zhì)教藻;觀看視頻教程距帅,前輩們覺(jué)得比較low;閱讀官網(wǎng)文檔和源碼括堤,這不適合初學(xué)者碌秸。總得來(lái)說(shuō)看書(shū)算是比較中肯的方法悄窃,至于看什么書(shū)呢讥电,前輩推薦了《C Primer Plus》,據(jù)說(shuō)是學(xué)習(xí)C語(yǔ)言的經(jīng)典之作轧抗。
好吧恩敌,不再糾結(jié),直接啃這本大部頭横媚,雖然有人說(shuō)看原版好一些纠炮,但是實(shí)在能力有限、還是看中文版吧灯蝴。一口氣花了一周時(shí)間讀完這本書(shū)恢口,果然是經(jīng)典,變量穷躁、語(yǔ)句耕肩、條件判斷甚至指針都知道怎么回事了。
某君決定按照書(shū)中的說(shuō)法實(shí)踐一下了问潭,于是打開(kāi)了記事本猿诸,折騰很久裝了GCC,把書(shū)上的第一個(gè)例子抄了下來(lái)睦授,在控制臺(tái)的小黑窗輸出了“Hello World”两芳,成就感滿滿摔寨。決定上手寫(xiě)點(diǎn)高級(jí)的的東西一試身手去枷,合上書(shū)。咦,為什么會(huì)報(bào)錯(cuò)删顶?哦竖螃,原來(lái)少個(gè)分號(hào)。不禁陷入思考:為什么學(xué)了兩個(gè)月還是只能在這個(gè)黑窗口算算秋水仙數(shù)逗余?網(wǎng)友還說(shuō)要看官網(wǎng)文檔特咆、要讀源碼、要看英文原版录粱,我一樣都不能做到腻格,我一定是能力不夠,編程果然是天才做的事情……
正經(jīng)話
上面的故事是我編的啥繁,但其中的糾結(jié)卻是自學(xué)者或多或少都經(jīng)歷過(guò)的菜职。實(shí)際上,IT從業(yè)者并不像傳說(shuō)中那樣需要天才般的智商旗闽,要點(diǎn)在于能否找到合適的入門(mén)途徑酬核,再加上一點(diǎn)點(diǎn)堅(jiān)持和思考。比較可惜的情況是一些人沒(méi)能找到適合自己的學(xué)習(xí)方法适室,并在糾結(jié)和碰壁后失去信心嫡意,然后沮喪的認(rèn)定自己并不適合干這行。學(xué)編程很多時(shí)候就是一個(gè)趟坑的過(guò)程捣辆,但不是每一個(gè)坑都有必要趟蔬螟,寫(xiě)這篇文章的目的是希望能夠幫助初學(xué)者盡量少趟一些坑。
IT世界的地圖
初學(xué)者遇到的一個(gè)典型問(wèn)題是對(duì)IT世界沒(méi)有一個(gè)大的圖景汽畴。比如大多數(shù)的Java書(shū)籍促煮,教完你基礎(chǔ)語(yǔ)法知識(shí)和秋水仙數(shù)的求法后就結(jié)束了,并沒(méi)告訴你接下來(lái)能干什么整袁。我曾經(jīng)為此感到非常困惑菠齿,學(xué)完Java SE后做了一個(gè)非常簡(jiǎn)陋的GUI demo,就失去了后續(xù)的Java學(xué)習(xí)方向坐昙,帶著對(duì)Java的偏見(jiàn)绳匀,這成為了我一段令人沮喪的學(xué)習(xí)經(jīng)歷。關(guān)于這個(gè)話題一本書(shū)可能都不夠炸客,簡(jiǎn)單來(lái)說(shuō)疾棵,我嘗試從計(jì)算機(jī)科學(xué)知識(shí)和技術(shù)實(shí)踐兩方面來(lái)聊聊成為一名IT工程師需要具備哪些東西。
計(jì)算機(jī)科學(xué)基礎(chǔ)
首先初學(xué)者要具備一些非潮韵桑基礎(chǔ)的知識(shí)是尔,這些知識(shí)在你踏上工作崗位后能被實(shí)際的用到,比如計(jì)算機(jī)運(yùn)行原理开仰、網(wǎng)絡(luò)的傳輸拟枚、常用數(shù)據(jù)結(jié)構(gòu)和算法等薪铜。這部分屬于計(jì)算機(jī)科學(xué),也是應(yīng)該被計(jì)算機(jī)專(zhuān)業(yè)本科課程涵蓋的恩溅,不要傷心錯(cuò)過(guò)了大學(xué)本科的相關(guān)課程隔箍,我會(huì)分享一些有用的資源。
這里我羅列了一些計(jì)算機(jī)專(zhuān)業(yè)的學(xué)生一般需要學(xué)習(xí)的課程脚乡,當(dāng)然每個(gè)學(xué)校專(zhuān)業(yè)設(shè)計(jì)都不一樣蜒滩,甚至采用的教材名字也不一樣,僅供參考奶稠。大學(xué)計(jì)算機(jī)科學(xué)課程往往包括:《高等數(shù)學(xué)》俯艰、《離線數(shù)學(xué)》、《電子電路》锌订、《數(shù)據(jù)結(jié)構(gòu)》蟆炊、《程序設(shè)計(jì)》、《計(jì)算機(jī)組成原理》瀑志、《編譯原理》涩搓、《計(jì)算機(jī)網(wǎng)絡(luò)》、《軟件工程》劈猪、《數(shù)據(jù)庫(kù)原理》等昧甘。有些學(xué)校會(huì)有一些額外的課程,例如《通信原理》战得、《匯編語(yǔ)言》充边、《線性代數(shù)》、《C語(yǔ)言》常侦、《Java 語(yǔ)言》等浇冰。
圖片來(lái)源于:網(wǎng)易計(jì)算機(jī)專(zhuān)業(yè)的課程體系
盡管IT行業(yè)知識(shí)更迭非常快聋亡,但是基礎(chǔ)知識(shí)并不容易過(guò)時(shí)肘习,因此有大量的資料可以選擇∑戮螅可以選擇從計(jì)算機(jī)經(jīng)典叢書(shū)系列開(kāi)始漂佩,比如佛羅贊和莫沙拉夫的《計(jì)算機(jī)科學(xué)導(dǎo)論》,甚至可以閱讀一些計(jì)算機(jī)科普類(lèi)讀物例如《穿越計(jì)算機(jī)的迷霧》罪塔。另一種直觀的方式是觀看大學(xué)精品課和去跟慕課課程投蝉,比較推薦的有幾個(gè):
- 中國(guó)大學(xué)精品開(kāi)放課程,高等教育出版社的精品課程項(xiàng)目征堪,有全國(guó)大量的名校授課視頻和課件
- 中國(guó)大學(xué)MOOC 瘩缆,這個(gè)是中國(guó)大學(xué)MOOC和網(wǎng)易合作的,提供了上文附圖中計(jì)算機(jī)課程體系中所有課程
- 果殼網(wǎng)的MOOC學(xué)院佃蚜,主打翻譯全球名校的優(yōu)秀課程庸娱,比如斯坦福的《編譯原理》和MIT的《Python》
從知識(shí)到實(shí)踐
除此之外着绊,還需要了解實(shí)際應(yīng)用于設(shè)計(jì)軟件或者開(kāi)發(fā)網(wǎng)站中的實(shí)踐類(lèi)知識(shí),包括某個(gè)特定語(yǔ)言以及周邊的庫(kù)涌韩、框架和工具等畔柔。 我們可以把特定需求中用到的語(yǔ)言氯夷、庫(kù)和框架以及其他的工具稱為技術(shù)棧臣樱,在技術(shù)選型上通常也是被這樣考慮的,HR常常會(huì)根據(jù)技術(shù)棧來(lái)尋找需要的工程師腮考。比如需要學(xué)習(xí)SSH 三大框架和Java的Java技術(shù)棧雇毫;為服務(wù)器web開(kāi)發(fā)而生的PHP技術(shù)棧;在移動(dòng)開(kāi)發(fā)領(lǐng)域流行的IOS踩蔚、安卓技術(shù)棧等棚放。當(dāng)然這里面有一些重合和共用的技術(shù)也需要學(xué)習(xí),比如版本管理器Git馅闽、SVN就是每個(gè)合格的工程師需要去學(xué)習(xí)的飘蚯。
換句話說(shuō),大學(xué)課程主要定位在上面說(shuō)到的計(jì)算機(jī)科學(xué)基礎(chǔ)知識(shí)福也,而市面上的培訓(xùn)機(jī)構(gòu)主要是告訴你在怎么在實(shí)際工作中運(yùn)用局骤,所以大學(xué)和培訓(xùn)機(jī)構(gòu)都有他們的價(jià)值。
想要更加詳細(xì)的了解這部分內(nèi)容暴凑,這里有一些開(kāi)源的技能圖譜可以參考:
圖片來(lái)自: STUQ
如何挑選你的兵器峦甩?
在介紹完計(jì)算機(jī)領(lǐng)域的大致圖景后,就需要選擇一門(mén)合適的編程語(yǔ)言现喳,一個(gè)較為形象的例子是把編程語(yǔ)言比喻成兵器凯傲,因?yàn)槲覀兩钪幊陶Z(yǔ)言對(duì)于工程師而言是實(shí)實(shí)在在的工具,我們不是為了學(xué)它而學(xué)嗦篱,學(xué)編程不僅僅是學(xué)語(yǔ)言特性冰单,一般來(lái)說(shuō)我們也不用知道賦值語(yǔ)句像“茴香豆蔻”的“茴”字有四種寫(xiě)法。
當(dāng)然語(yǔ)言之爭(zhēng)從來(lái)沒(méi)有停止過(guò)灸促,如果把編程語(yǔ)言比喻江湖武器的話十分有趣球凰。
C語(yǔ)言是M1式加蘭德步槍?zhuān)芾系煽俊?/em>
C++是雙截棍,揮舞起來(lái)很強(qiáng)悍腿宰,很吸引人呕诉,但需要多年的磨練來(lái)掌握,很多人希望改用別的武器吃度。
Perl語(yǔ)言是燃燒彈甩挫,曾經(jīng)在戰(zhàn)場(chǎng)上很有用,但現(xiàn)在很少人使用它椿每。
Java是M240通用彈夾式自動(dòng)機(jī)槍?zhuān)袝r(shí)它的彈夾是圓的伊者,但有時(shí)候不是英遭,如果不是,當(dāng)你開(kāi)火時(shí)亦渗,會(huì)遇到NullPointerException問(wèn)題挖诸,槍會(huì)爆炸,你就會(huì)被炸死法精。
_JavaScript是一把寶劍多律,但沒(méi)有劍柄。 _
-- 來(lái)自網(wǎng)絡(luò)
老實(shí)來(lái)講IT行業(yè)的最終目的是交付可用的軟件搂蜓,編程語(yǔ)言也是適應(yīng)市場(chǎng)的狼荞。這對(duì)于初學(xué)者或許有些殘酷,在工作中我們發(fā)現(xiàn)最好的語(yǔ)言是用來(lái)處理工作任務(wù)或者構(gòu)建合適的應(yīng)用帮碰,并不是出于愛(ài)好或者某種Geek精神相味。
對(duì)于初學(xué)者而言,在選擇合適的入門(mén)語(yǔ)言時(shí)至少需要考慮兩點(diǎn):
- 是否能適用于構(gòu)建你想要的應(yīng)用殉挽。如果你的目標(biāo)是創(chuàng)建一個(gè)運(yùn)行在IPhone上的APP丰涉,那么最好選擇 Object C 或者 Swift,學(xué)習(xí)web開(kāi)發(fā)可以選擇PHP 或者JAVA斯碌。實(shí)際上我們?nèi)匀豢梢杂脜R編做出網(wǎng)頁(yè)一死,但是這樣做成本高昂。
- 是否容易學(xué)習(xí)输拇,在滿足第一點(diǎn)的條件下請(qǐng)盡量選擇容易學(xué)習(xí)的語(yǔ)言摘符。容易不僅僅指語(yǔ)法簡(jiǎn)單,包括環(huán)境搭建策吠、部署等都需要考慮在內(nèi)逛裤,以及能不能容易找到好的學(xué)習(xí)資料,因此盡可能的選擇主流語(yǔ)言猴抹。
別忘了非常重要的一點(diǎn)带族,學(xué)習(xí)編程語(yǔ)言還包括平臺(tái)提供的API,比如Win 32 之于C++/C#/VB蟀给,以及周邊的庫(kù)和框架(這些庫(kù)蝙砌、框架和工具能在上面說(shuō)的技術(shù)圖譜中找到)。IT歷史上甚至出現(xiàn)框架和庫(kù)引領(lǐng)編程語(yǔ)言走向的情況:JQuery 和Angular 改變了前端開(kāi)發(fā)的思想; Rails 搶走了Ruby的名氣跋理;而SSH三大框架一度代表了Java世界择克。
最后我為初學(xué)者整理了一個(gè)流行編程語(yǔ)言和用途的表:
另外還需要注意的是開(kāi)發(fā)工具,可以選用IDE和有代碼提示的編輯器前普,但盡量不要在這上喋喋不休肚邢,這就像用來(lái)盛放你鋒利兵器的架子,用著順手就行,也不推薦使用純文本編輯器骡湖,這看起來(lái)像赤手空拳贱纠。 推薦一些編輯器和IDE
挑選合適的資料和有效的閱讀
對(duì)初學(xué)者而言,我仍然推薦好的視頻教程响蕴,雖然我已經(jīng)聽(tīng)到不下5個(gè)人聲稱是靠閱讀官方文檔或者看源碼學(xué)會(huì)編程的谆焊,而且認(rèn)為觀看視頻教程見(jiàn)效太慢。但這個(gè)思想對(duì)初學(xué)者很危險(xiǎn)浦夷,不得不承認(rèn)閱讀文檔和源碼能更準(zhǔn)確找到自己想要的信息辖试,這對(duì)深入技術(shù)原理非常有用,但視頻能比文字傳達(dá)出更豐富的內(nèi)容军拟,有更直觀的演示和細(xì)致的講解剃执,我想沒(méi)有比這個(gè)更適合初學(xué)者了誓禁。
除了上面提到的精品課程和慕課教程懈息,國(guó)內(nèi)有像網(wǎng)易云課堂,國(guó)外有l(wèi)ynda.com這種在線學(xué)習(xí)視頻網(wǎng)站摹恰,甚至在優(yōu)酷和土豆都能找到足夠的教程資源。
如果選擇了閱讀技術(shù)類(lèi)書(shū)籍,我們來(lái)聊聊怎么有效的閱讀一本技術(shù)書(shū)籍搂抒。
讀IT類(lèi)書(shū)籍和讀考試類(lèi)書(shū)籍的方式不同寇漫,初學(xué)者需要選擇更接地氣、并且能告訴你最終能做出什么案例的書(shū)籍闺阱。你不需要通讀整本書(shū)炮车,而是需要搭建好和書(shū)中版本一致的環(huán)境,然后把書(shū)中的每行代碼敲入電腦酣溃,觀察這些代碼怎樣被運(yùn)行瘦穆,在遇到問(wèn)題時(shí)去請(qǐng)教朋友或者到搜索引擎中尋找解決辦法,直到示例程序能被正確運(yùn)行赊豌。
可能一個(gè)月才能讀完一本書(shū)扛或,但慢點(diǎn)并沒(méi)什么壞處,敲過(guò)一遍的代碼才能算是你的碘饼,否則永遠(yuǎn)存在于紙上的代碼清單中熙兔。對(duì)于關(guān)鍵的概念和知識(shí)點(diǎn),可以在閱讀的同時(shí)做一些筆記艾恼,去嘗試使用思維導(dǎo)圖來(lái)做你的筆記吧住涉,這讓你的筆記跟上你的思考,并形成一個(gè)知識(shí)網(wǎng)絡(luò)钠绍。
自我激勵(lì)
自學(xué)無(wú)疑是寂寞的舆声。編程學(xué)習(xí)耗時(shí)較長(zhǎng),如何保證在這個(gè)階段能堅(jiān)持下去五慈?
我們知道很多人都能對(duì)游戲產(chǎn)生強(qiáng)烈的興趣纳寂、愿意為之投入時(shí)間主穗,這其中的秘密就是游戲的獎(jiǎng)勵(lì)規(guī)則。殺死一個(gè)怪物就能得到一些金幣毙芜,通過(guò)完成任務(wù)獲得滿足感忽媒,通過(guò)關(guān)卡的設(shè)計(jì)產(chǎn)生持續(xù)吸引力,進(jìn)而形成正向的反饋腋粥。
其實(shí)學(xué)習(xí)編程也一樣晦雨,實(shí)現(xiàn)一小段程序并運(yùn)行,足以讓人感到成就感和滿足隘冲,借鑒這個(gè)簡(jiǎn)單的心理學(xué)技巧闹瞧,定期給自己設(shè)定一些有實(shí)際意義但是不太難的目標(biāo)和任務(wù)。太難會(huì)讓人失去耐心展辞,太簡(jiǎn)單又很無(wú)聊奥邮,最好設(shè)定一個(gè)跳起來(lái)剛好摸得著的任務(wù)。每完成一個(gè)目標(biāo)就給予自己獎(jiǎng)勵(lì)罗珍,可以是完成任務(wù)的成就感洽腺,也可以是其他的物質(zhì)獎(jiǎng)勵(lì)。
這個(gè)時(shí)候一個(gè)代辦記事的清單就可以幫上忙了覆旱,可以是一個(gè)to do list的軟件蘸朋,或者自己手寫(xiě)一張卡片貼到墻上,關(guān)鍵在于不要忘了在任務(wù)達(dá)成后給予自己適當(dāng)?shù)莫?jiǎng)勵(lì)扣唱。
那如果真的遇到一些麻煩的任務(wù)呢藕坯,如何順利解決而不至于喪失信心?笛卡爾在《方法論》一書(shū)中告訴了我們研究復(fù)雜問(wèn)題的方法和步驟:
- 盡量將其分解為多個(gè)比較簡(jiǎn)單的小問(wèn)題噪沙,一個(gè)一個(gè)地分開(kāi)解決
- 將小問(wèn)題從簡(jiǎn)單到復(fù)雜排列炼彪,先從容易解決的問(wèn)題著手
- 子問(wèn)題被解決后,進(jìn)行聯(lián)調(diào)測(cè)試曲聂,看是否能協(xié)同運(yùn)行
在敏捷開(kāi)發(fā)這種工程思想中我們正是這樣做的霹购,我們需要把業(yè)務(wù)需求進(jìn)行拆分然后評(píng)估工作量,不僅可以直觀的看到任務(wù)進(jìn)展朋腋,手上的工作也不會(huì)看起來(lái)龐大得難以完成齐疙。
最后多說(shuō)幾句
非科班出身的工程師入門(mén)是有一定痛苦的,不像武俠世界里面的名門(mén)正派弟子旭咽,也沒(méi)有機(jī)緣遇到骨骼精奇的世外高人贞奋,如何選擇合適自己的學(xué)習(xí)方式并自我管理是很重要的一方面。沒(méi)有任何Low的學(xué)習(xí)方式穷绵,只要直接而又高效轿塔,而且要能達(dá)到我們的目的就好。以我為例,從大專(zhuān)學(xué)校畢業(yè)并沒(méi)有機(jī)會(huì)參加本科課程勾缭,曾經(jīng)也在網(wǎng)上攫取各種視頻教程揍障,去別的學(xué)校蹭課,甚至帶上禮物去一個(gè)老師那里登門(mén)拜訪補(bǔ)課俩由。
另一方面是如何上桌毒嫡,吃上編程這碗飯。學(xué)習(xí)的成果如果無(wú)處施展便成為屠龍之技幻梯,參加一些開(kāi)源項(xiàng)目和一些公益活動(dòng)兜畸,誰(shuí)不喜歡一個(gè)熱心的人呢。也可以嘗試去實(shí)現(xiàn)自己的一些idea碘梢,當(dāng)做一個(gè)小項(xiàng)目來(lái)開(kāi)發(fā)咬摇,有了一些項(xiàng)目實(shí)踐后去找一個(gè)公司實(shí)習(xí)會(huì)容易的多。
我不知道算是有幸還是不幸經(jīng)歷了這一個(gè)過(guò)程煞躬,矯情一點(diǎn)來(lái)說(shuō)是有一些曲折肛鹏,但是我知道“聰明”從來(lái)不是這個(gè)行業(yè)的門(mén)檻。引用流行于知乎的一句老話“以大多人的努力程度汰翠,還輪不到拼天賦的程度”龄坪,在Thoughtworks有大量?jī)?yōu)秀的工程師昭雌,從他們身上我能看到聰明不是學(xué)習(xí)編程成功的關(guān)鍵复唤,堅(jiān)持和勤于思考才是。