看到這個標(biāo)題诡壁,你一定會有疑問,什么叫普通碼農(nóng)荠割。
相對普通碼農(nóng)妹卿,自然會有超級碼農(nóng)。記得剛參加工作的時候蔑鹦,我被分到一個路由器的組夺克,專門干移植bootloader的工作。同組還有一個同事干同樣的工作嚎朽,只是我們會跟進(jìn)不同項目铺纽。有一天早上,當(dāng)我還在研究初始化代碼的時候哟忍,我看到他正在用GDB工具看反匯編出來的代碼狡门。我問他這是在干嘛,他說他已經(jīng)完成了這幾個項目的移植锅很,現(xiàn)在正在考慮是否可以對初始化代碼用匯編來寫其馏。我當(dāng)時在想,Are you kidding me爆安?不過過一段時間他居然真的用匯編把這些東西給折騰出來了尝偎。
似乎有些人,他們更擅長高強(qiáng)度的腦力勞動。當(dāng)時我們常常上完一天班已經(jīng)很累了致扯,他還能精力十足地跑兩公里回家肤寝。果然幾年以后,他就成為了別人眼中的大牛抖僵。這是超級碼農(nóng)鲤看,當(dāng)時同組還有另一位同事,他只是編寫簡單的html代碼耍群,但干了兩個月就辭職了义桂。辭職的時候興沖沖地和我說,終于不用再看這些煩人的代碼啦蹈垢。碼農(nóng)有各種各樣的慷吊,其中也有一大堆和我一樣的人。我們對于編程曹抬,即沒有那么絕對的擅長溉瓶,也沒有那么厭倦。這樣的人谤民,姑且稱之為普通碼農(nóng)吧堰酿。
作為一個普通碼農(nóng),這些年我在編碼的時候走了不少彎路张足。所以我想總結(jié)一下其中的幾個經(jīng)驗教訓(xùn)触创,順便和大家交流一下。
經(jīng)驗一为牍、只在同一個抽象層次進(jìn)行思考
人的短期記憶是很有限的哼绑,帶來的結(jié)果就是在一個時間點上,我們能記住的邏輯拓?fù)涫怯邢薜牡锱亍R虼司幋a的時候凌那,最好不要進(jìn)行太多的縱向跨層次的思考。
復(fù)雜的單一應(yīng)用維護(hù)起來比較讓人頭疼吟逝,因此通常會被拆分成微服務(wù)或者多個組件。接著每個組件有對應(yīng)的框架結(jié)構(gòu)赦肋,以及常用的第三方依賴块攒。到具體編碼的時候,我們只需要設(shè)計一組類去解決實際的問題佃乘。
一個實際的問題由一個或者一組類來解決囱井,這一組類和他們的之間的接口是一個層次。到具體某個類里趣避,它的每個接口的實現(xiàn)是下一個層次庞呕。如果某個算法特別復(fù)雜,又可以再抽象出一個層次。這樣住练,沒有必要的話不要寫太長的方法地啰。
在編碼的時候可以有意識地切換思考的層次,在設(shè)計類圖的時候不要想實現(xiàn)細(xì)節(jié)讲逛,在寫一個子方法的時候不要去想該如何改善接口亏吝。
很多Git Repo在commit的時候要求改動接口和具體實現(xiàn)要分開提交,就是遵循上述的原則盏混。這么多的語言蔚鸥、框架、范例就是為了讓我們在面對復(fù)雜問題的時候许赃,有一個相對標(biāo)準(zhǔn)的解耦的思路止喷,節(jié)省我們的腦力。
過去在看大量代碼的時候混聊,我常常很焦慮弹谁,甚至懷疑我自己的職業(yè)生涯。然而只要學(xué)會循序漸進(jìn)技羔,不要在某個單點上透支注意力僵闯,解決一個復(fù)雜問題的時候可能就沒有那么吃力了。
經(jīng)驗二藤滥、定期整理自己的知識結(jié)構(gòu)
科學(xué)家發(fā)現(xiàn)鳖粟,兒童和成人學(xué)習(xí)語言的方式是不同的。兒童學(xué)習(xí)語言會增加大腦的神經(jīng)突觸拙绊,而成人則是強(qiáng)化神經(jīng)網(wǎng)絡(luò)之間的聯(lián)結(jié)向图。
對于我們學(xué)習(xí)的知識來說,最好的結(jié)構(gòu)是樹狀和網(wǎng)狀标沪,不要把它們像關(guān)系型數(shù)據(jù)庫一樣存在不同的表里榄攀。
人腦有兩個系統(tǒng),一個和直覺金句、聯(lián)想有關(guān)檩赢,可以快速作出決策。另一個和分析违寞、運算有關(guān)贞瞒,推演起來十分緩慢。強(qiáng)化各個概念之間的聯(lián)結(jié)趁曼,會把原來分散的短期記憶融合到自己長期的記憶中去军浆。這樣不僅不容易把自己所學(xué)的知識忘記,還會同時加快自己的思考過程挡闰。
你可以把自己想象成一個人工智能乒融,雖然運算能力沒那么強(qiáng)大掰盘,但是框架卻要比tensorflow好上一萬倍。你不需要太多的數(shù)據(jù)赞季,也可以優(yōu)化自己的模型愧捕。
其實仔細(xì)一想,很多知識是完全相通的碟摆。我在學(xué)習(xí)YARV的時候晃财,發(fā)現(xiàn)它的指令集和一些cpu指令集比如x86或者mips的有很多共通之處。而js實現(xiàn)異步的原理典蜕,和實時性操作系統(tǒng)ucosii實現(xiàn)多進(jìn)程的方式如出一轍断盛。
過去我在學(xué)習(xí)的時候,總是想方設(shè)法讓自己強(qiáng)記某些知識愉舔,最后發(fā)現(xiàn)這樣不僅低效且很容易因為經(jīng)常忘記而讓自己失去信心钢猛。所以,學(xué)習(xí)新的知識時轩缤,要盡量把它和老的知識做比較命迈,建立知識點之間的聯(lián)系,才能事半功倍火的。
經(jīng)驗三壶愤、Plan yourself
從一個點上看,人的短期記憶有限馏鹤。有一條時間線上看征椒,人在一段時間內(nèi)的精力是有限的。
不要胡亂投資時間湃累。我在剛參加工作的那幾年勃救,因為幾個對硬件的問題不了解,就買了好幾本數(shù)字高頻電路的書來看治力。然而這些問題我到現(xiàn)在也沒有搞懂蒙秒,純粹浪費了大量的時間。
你可以對自己想干的事情和所需要的技能作一個評估宵统,決定自己要把時間投資在哪個技術(shù)領(lǐng)域晕讲。當(dāng)然這不僅僅限于技術(shù),也可以把時間用在技術(shù)之外的地方马澈,這個看個人喜好了瓢省。
這是一個升維的問題,時常跳出自己當(dāng)前的任務(wù)箭券,想一想自己的整個生活。不要盲目疑枯,當(dāng)更高維度的問題解決以后辩块,自己在面臨當(dāng)前任務(wù)的時候也會更加心無旁貸。
總結(jié)
編碼和其他很多事情一樣,都不是一件容易的事情废亭。如果你想節(jié)約時間国章,可以快樂編碼,上完班可以找三四個好友豆村,聚在大排檔液兽,喝點啤酒,談?wù)勅松贫D敲纯梢詫W(xué)習(xí)一門為優(yōu)雅而生的語言——ruby四啰。
入坑以后,你就會發(fā)現(xiàn)粗恢,這TM還是要有這么多東西要學(xué)柑晒,一點也不輕松。于是你就會拋棄輕松編碼的幻想眷射,繼續(xù)努力工作匙赞。
完。