首先還是來(lái)說(shuō)編程是什么哗伯?
無(wú)論你是不是程序員荒揣,每一天你都在編程,每一天你都被編程焊刹。編程系任,就是設(shè)計(jì)一些步驟,組織這些步驟虐块,讓這些步驟在當(dāng)前環(huán)境中正確的運(yùn)行俩滥,最終得出自己想要的結(jié)果。
你的每一天都是在起床非凌、喝水举农、吃飯、工作敞嗡、上廁所颁糟、娛樂(lè)、睡覺(jué)等步驟的有序組織下運(yùn)轉(zhuǎn)的喉悴,你活在這個(gè)程序中棱貌,同時(shí)你在這個(gè)程序中為改善自己的生活而制定各種計(jì)劃并努力去實(shí)現(xiàn)。
機(jī)械設(shè)計(jì)箕肃,其實(shí)比編程還要編程婚脱。所謂的機(jī)械零件,就是數(shù)據(jù)結(jié)構(gòu)。所謂的傳動(dòng)機(jī)制障贸,就是應(yīng)用程序接口(API)错森。所謂發(fā)動(dòng)機(jī),就是程序的內(nèi)核篮洁。你將零件裝配好涩维,通過(guò)傳動(dòng)機(jī)制將它們接駁到發(fā)動(dòng)機(jī)上,于是你就創(chuàng)造出來(lái)一部機(jī)器袁波,通上電或者打著火瓦阐,就可以讓它運(yùn)轉(zhuǎn)起來(lái)。
編程比機(jī)械設(shè)計(jì)來(lái)的更為簡(jiǎn)單篷牌,你不需要經(jīng)常給自己所編寫(xiě)的程序添加潤(rùn)滑油睡蟋,也不需要去對(duì)每個(gè)數(shù)據(jù)結(jié)構(gòu)進(jìn)行復(fù)雜的力學(xué)分析,更不需要關(guān)注這些數(shù)據(jù)結(jié)構(gòu)是否嚴(yán)絲合縫的相互配合枷颊,至少目前的計(jì)算機(jī)軟件工程是這個(gè)樣子的戳杀,它不像機(jī)械工程學(xué)科那樣以堅(jiān)實(shí)的物理定律為基礎(chǔ)。機(jī)械的結(jié)構(gòu)與運(yùn)行規(guī)律總是可計(jì)算偷卧、可分析的豺瘤,而軟件的結(jié)構(gòu)與運(yùn)行過(guò)程卻充滿著太多不嚴(yán)格的環(huán)節(jié)。這種不嚴(yán)格听诸,卻給我們營(yíng)造了一個(gè)可以發(fā)揮天賦或工科實(shí)踐經(jīng)驗(yàn)的空間。顯然蚕泽,即使軟件工程存在著各種不嚴(yán)格晌梨,但是我們卻能夠通過(guò)編程模擬出機(jī)械工程的一切。事實(shí)上也是如此须妻,現(xiàn)代的機(jī)械工程領(lǐng)域仔蝌,軟件已經(jīng)無(wú)處不在。
機(jī)械設(shè)計(jì)有很多精妙的『算法』荒吏,像縫紉機(jī)敛惊、槍械、發(fā)動(dòng)機(jī)之類的機(jī)構(gòu)绰更,設(shè)計(jì)它們其實(shí)要比計(jì)算機(jī)世界里的算法設(shè)計(jì)難得多瞧挤,而且這些機(jī)構(gòu)對(duì)人類文明的發(fā)展往往能夠產(chǎn)生巨大的推動(dòng)作用。希望你不要因此愛(ài)上機(jī)械設(shè)計(jì)……學(xué)會(huì)編程儡湾,你會(huì)對(duì)機(jī)械設(shè)計(jì)的理解更為深刻特恬。因?yàn)榫幊淌菍ⅰ涸O(shè)計(jì)』本身作為一種智力活動(dòng)而對(duì)待的。你可以將機(jī)械工程領(lǐng)域的那些智力活動(dòng)應(yīng)用于編程徐钠,也可以將編程中的智力活動(dòng)應(yīng)用到任何設(shè)計(jì)之中癌刽。
最近很多同學(xué)都留言說(shuō):自己不是科班出身而且零基礎(chǔ),能學(xué)好編程嗎?
這個(gè)問(wèn)題我的回答是:哪個(gè)人不是從零基礎(chǔ)開(kāi)始學(xué)的显拜,你又不是第一個(gè)衡奥!
非科班出身的人總是會(huì)引發(fā)各種對(duì)抗力量,這個(gè)庫(kù)怎么安不上远荠?這段程序是怎么運(yùn)行的杰赛?
寫(xiě)程序遇到?bug 的時(shí)候,
科班出身的人先想到的是怎么排查?bug矮台。
非科班出身的人先想到的是懷疑人生乏屯,
怎么會(huì)有這種問(wèn)題?
我是不是不適合學(xué)編程瘦赫?
學(xué)新東西的時(shí)候辰晕,
科班出身的人是在一個(gè)穩(wěn)固的地基上添磚加瓦,底子穩(wěn)确虱、塌不了含友。
非科班出身的人是在拿著拼圖的一角尋找關(guān)聯(lián)的碎片,只有拼的足夠多校辩,最后才能連接成完整的知識(shí)網(wǎng)絡(luò)窘问。
我以前也試圖提升過(guò)自己的學(xué)習(xí)能力,但真不像雞湯文里說(shuō)的學(xué)習(xí)某種模式能改變你的思維宜咒、加入一個(gè)讀書(shū)會(huì)能讓你成為終生學(xué)習(xí)者惠赫,不是這樣的。只有學(xué)一個(gè)自己不擅長(zhǎng)的東西故黑、把自己推出舒適區(qū)儿咱、反復(fù)碰壁,這個(gè)過(guò)程才讓我學(xué)會(huì)了如何學(xué)習(xí)场晶。
從循規(guī)蹈矩到自尋出路
幾年前混埠,當(dāng)我決心從零開(kāi)始學(xué)編程的時(shí)候,我制定了一個(gè)「每天編程1小時(shí)」的計(jì)劃诗轻。
和大多數(shù)人一樣钳宪,我想系統(tǒng)的、有體系的去學(xué)習(xí)扳炬,跟著教程從基礎(chǔ)學(xué)起吏颖。那時(shí)候還在印象筆記建了一個(gè)筆記本叫《每天編程1小時(shí)》,收集一些好的教程鞠柄,根據(jù)知識(shí)點(diǎn)試著去列一套成體系的學(xué)習(xí)路徑侦高。
開(kāi)始跟著教程學(xué)的時(shí)候,問(wèn)題來(lái)了厌杜》钋海看了幾章之后计螺,突然就會(huì)出現(xiàn)看不懂的概念,知識(shí)就斷層了瞧壮,就跟上數(shù)學(xué)課撿了根筆之后發(fā)現(xiàn)后面的就聽(tīng)不懂了登馒,但我也沒(méi)錯(cuò)過(guò)什么啊。我又試著跟著示例代碼敲咆槽,敲完也不知道這段代碼是怎么運(yùn)作的陈轿,自己只要一拓展就會(huì)出錯(cuò),后來(lái)敲煩了就直接復(fù)制粘貼秦忿,感覺(jué)學(xué)的特別迷茫麦射。
實(shí)在學(xué)不下去的時(shí)候,就換一本教程灯谣,基本都是從第一章開(kāi)始覺(jué)得會(huì)了潜秋,但實(shí)際上又不知道學(xué)的這個(gè)要怎么去使,這種感覺(jué)就一直在我的腦子里嗡嗡的轉(zhuǎn)胎许。到后來(lái)那一個(gè)概念我都看了六遍了峻呛,誰(shuí)講都那樣,但還是不會(huì)使辜窑。
這時(shí)候開(kāi)始對(duì)系統(tǒng)學(xué)習(xí)的方法有點(diǎn)懷疑了钩述,大家都說(shuō)要從底層學(xué)起、看大量書(shū)單穆碎,但會(huì)不會(huì)這種系統(tǒng)學(xué)習(xí)的方式不適合我這個(gè)非科班出身的新手牙勘?畢竟,我已經(jīng)沒(méi)有4年時(shí)間來(lái)學(xué)編程了啊惨远,我每天只有1小時(shí)能用來(lái)學(xué)習(xí)谜悟,再這樣繼續(xù)看各種瑣碎的語(yǔ)法細(xì)節(jié),我就要失去耐心了北秽。
我想,不如先寫(xiě)點(diǎn)小項(xiàng)目練練手最筒。于是我開(kāi)始從一些簡(jiǎn)單的程序?qū)懫鸷孛ィ瑢?xiě)一個(gè)匯率轉(zhuǎn)換的公式、寫(xiě)一個(gè)隨機(jī)生成姓名的系統(tǒng)床蜘,寫(xiě)一個(gè)學(xué)生圖書(shū)管理辙培,可能這些程序在專業(yè)人士眼里都算不上是項(xiàng)目,幾行代碼和簡(jiǎn)單語(yǔ)法就能搞定了邢锯,但對(duì)于我來(lái)說(shuō)扬蕊,這些程序就是一個(gè)個(gè)使用情景,我從這些使用情景中理解了概念的真正意義丹擎。
其實(shí)很多概念都是基于無(wú)數(shù)個(gè)場(chǎng)景的抽象尾抑,抽象了之后就會(huì)少了很多細(xì)節(jié)歇父,給人一種太籠統(tǒng)、太晦澀的感覺(jué)再愈。而讓人印象最深刻的是場(chǎng)景榜苫,就像提到「燙」的時(shí)候,第一時(shí)間想到的是被燙的場(chǎng)景和感覺(jué)翎冲,而不是燙的定義垂睬。
所以說(shuō),開(kāi)始動(dòng)手寫(xiě)練手項(xiàng)目抗悍,是我自學(xué)編程的一個(gè)重大轉(zhuǎn)折點(diǎn)驹饺,讓我開(kāi)始把編程用起來(lái)了。
發(fā)現(xiàn)別人沒(méi)辦法幫自己走出困境是有點(diǎn)沮喪的缴渊,但是可能掙扎的過(guò)程也是我學(xué)習(xí)的一部分赏壹。發(fā)現(xiàn)無(wú)路可走了,就只能靠提升自己的解決問(wèn)題能力來(lái)突破困境疟暖。
經(jīng)歷過(guò)這次求助之后卡儒,我發(fā)現(xiàn),如果我不能清楚準(zhǔn)確的描述問(wèn)題俐巴,我就沒(méi)辦法解決這個(gè)問(wèn)題骨望。而問(wèn)題一旦被清楚準(zhǔn)確的描述了,也就變得很容易解決了欣舵。探索了一段時(shí)間之后擎鸠,我甚至形成了一個(gè)自己的解決問(wèn)題
方法論:
第一步:提出假設(shè)
假設(shè)階段是最重要的,如果你對(duì)一個(gè)事情沒(méi)有假設(shè)缘圈,說(shuō)明你沒(méi)有思考劣光。有時(shí)候之所以會(huì)痛苦,就是因?yàn)榘l(fā)現(xiàn)事實(shí)和你認(rèn)為最正確的假設(shè)是不一樣的糟把。在阿加莎的小說(shuō)里绢涡,平庸的偵探會(huì)為自己的推斷找各種牽強(qiáng)的證據(jù),而波洛會(huì)勇于根據(jù)事實(shí)不斷推翻自己的推斷遣疯。
在假設(shè)階段雄可,我會(huì)從我的角度對(duì)這個(gè)問(wèn)題做幾個(gè)推斷。報(bào)了一個(gè)錯(cuò)之后缠犀,我腦子里會(huì)有若干個(gè)假設(shè)数苫,是環(huán)境錯(cuò)誤導(dǎo)致的,還是語(yǔ)法錯(cuò)誤導(dǎo)致的辨液,還是網(wǎng)站的什么問(wèn)題導(dǎo)致的
第二步:搜索與修正
在這個(gè)階段虐急,我把所有假設(shè)轉(zhuǎn)換成不同的形式進(jìn)行搜索。拆分假設(shè)滔迈,重組語(yǔ)言止吁,領(lǐng)域分類被辑,轉(zhuǎn)換形態(tài)…用這些方法挨著個(gè)搜索一圈,會(huì)排除掉一些東西赏殃,但如果還是不行敷待,我會(huì)往回退一步,搜一下我做的這個(gè)事情有沒(méi)有人在做仁热,或者找一個(gè)相關(guān)視頻跟著敲榜揖。這樣下來(lái),幾乎沒(méi)有什么問(wèn)題是解決不了的抗蠢。
通過(guò)這樣大量信息的檢索與對(duì)比之后举哟,往往我會(huì)認(rèn)識(shí)到自己思路上的一些根本性錯(cuò)誤,有一些假設(shè)是不成立的迅矛。就比如說(shuō)我可能會(huì)費(fèi)力去想如何用石膏去做一個(gè)音色好聽(tīng)的吉他妨猩,石膏就不應(yīng)該拿來(lái)做吉他。在初學(xué)時(shí)會(huì)犯很多這種假設(shè)上的錯(cuò)誤秽褒,我通過(guò)幾輪會(huì)修正自己的常識(shí)壶硅,等到穩(wěn)固了之后,再在常識(shí)上進(jìn)行一些創(chuàng)新销斟,當(dāng)我知道了大家會(huì)找最好的桃花芯木做吉他的時(shí)候庐椒,我再去思考,是否存在比桃花芯木聲學(xué)共振還好的材料蚂踊。
第三步:回歸問(wèn)題
在經(jīng)歷了前兩個(gè)階段之后這時(shí)候問(wèn)題本身就已經(jīng)變得清晰了很多约谈,這時(shí)候只需要做的就是,將你認(rèn)為最有信心的解決方案大膽的實(shí)踐犁钟。如果成功那么問(wèn)題就迎刃而解棱诱,如果不幸失敗,那就洗把臉振作一下涝动,重新回到第一步迈勋。
在反復(fù)經(jīng)歷這些階段之后,我發(fā)現(xiàn)在解決新問(wèn)題的時(shí)候醋粟,可以進(jìn)行一個(gè)準(zhǔn)確的假設(shè)了粪躬,因?yàn)槲乙呀?jīng)積累了足夠多的編程常識(shí)。后來(lái)讀到《解決問(wèn)題心理學(xué)》這本書(shū)昔穴,發(fā)現(xiàn)里面提出的方法和我自己總結(jié)的還挺像的,有一種欣慰的感覺(jué)提前,知道了自己解決問(wèn)題的方法是經(jīng)過(guò)科學(xué)理論驗(yàn)證的吗货。
成長(zhǎng)的唯一辦法就是寫(xiě)更多代碼
雖然能做的事情比以前多了,但有些時(shí)候總會(huì)有一種不安狈网、甚至是自卑感宙搬。就像是拼好了幾大塊拼圖笨腥,卻沒(méi)有把這些都連起來(lái)拼成一個(gè)完整的知識(shí)網(wǎng)絡(luò)。于是就想勇垛,是不是還是應(yīng)該系統(tǒng)學(xué)習(xí)脖母、從底層老老實(shí)實(shí)的學(xué)起。
那段時(shí)間闲孤,我又有了一種迷茫的感覺(jué)谆级,面對(duì)著這么浩大的任務(wù)不知道該怎么進(jìn)行下去。那段時(shí)間感覺(jué)很無(wú)助讼积、失去了方向肥照,每天胡亂找些視頻來(lái)看。
我覺(jué)得對(duì)于技術(shù)上的學(xué)習(xí)讓我知道了技術(shù)的可能性并抱有警惕之心勤众,在最關(guān)鍵的時(shí)刻派上用場(chǎng)舆绎。尤其是創(chuàng)業(yè)的時(shí)候,更需要在無(wú)路可走的情況下们颜,找到解決方案吕朵。