|
寫于 2012-6-22
博客光寫GacUI的Demo更新也好無(wú)聊啊。所以今天先換換口味,胡扯點(diǎn)別的。
一年一度的高中畢業(yè)生填志愿的日子即將就要到了,又有很多人問(wèn)計(jì)算機(jī)專業(yè)的事情。其實(shí)我從心底里覺(jué)得,高考后才來(lái)問(wèn)這個(gè),已經(jīng)晚了一大半了。當(dāng)然另一小半十分有前途的人可以在大學(xué)四年趕上來(lái),不過(guò)估計(jì)他們還是要讀個(gè)研究生,才能把自己訓(xùn)練成能用的碼農(nóng)。
編程是一件很難的事情。當(dāng)然我的意思跟那篇著名的《編程是一件很難的事情》不一樣。想把代碼寫好,本來(lái)就是一件非常困難的事情。我大三的時(shí)候訓(xùn)練一個(gè)大一的老鄉(xiāng),就光是C++,長(zhǎng)達(dá)四年后她還搞不清楚模板元編程究竟是什么。而且還有C語(yǔ)言學(xué)會(huì)了,轉(zhuǎn)C++會(huì)把壞習(xí)慣帶進(jìn)來(lái)啦;C++的人轉(zhuǎn)做C#之后發(fā)現(xiàn)很多C++的好技巧到了C#都只會(huì)讓程序變得更慢啦,很多寫動(dòng)態(tài)語(yǔ)言的人不理解類型的好處還在那里胡扯啦,還有C#和Javascript明明放著大好的函數(shù)式風(fēng)格不用,非要把代碼寫的超長(zhǎng)(本來(lái)光是這樣沒(méi)什么問(wèn)題的,只是有某些人不肯學(xué)習(xí)新知識(shí))。可見(jiàn),就算把自己訓(xùn)練了好多年,最終進(jìn)入了工作崗位,想把代碼寫好,也是一件非常困難的事情。
當(dāng)然有些人說(shuō),如今只有產(chǎn)品做得好才能賺錢,代碼寫的好有個(gè)屁用。這只能是人各有志,有些人就不喜歡鉆研代碼,這本來(lái)也沒(méi)什么。但是這些人老是跳出來(lái)忽悠別人,也只會(huì)讓編程變得更難。只是幸好,我的單位并不會(huì)跟某些單位一樣說(shuō)一些“把代碼寫得那么好有什么用,搞得我們還非得學(xué)東西才能看你的代碼,趕緊做點(diǎn)新feature啦”的這種話,我已經(jīng)覺(jué)得很好了。
“寫得好”這個(gè)東西還是比較抽象。我認(rèn)為其中一條就是代碼要好維護(hù)。我一直以為,只有代碼寫得好維護(hù)、好改、清晰易懂,這樣加新的功能才會(huì)容易,不出事情,順利發(fā)布軟件。后來(lái)我發(fā)現(xiàn)我錯(cuò)了,騰訊不也是QQ一版一版的發(fā)嗎,原來(lái)加班也是一種方法,啊哈哈哈。如果在一個(gè)單位里面,不加班別人就會(huì)找你麻煩的話,我相信你也不會(huì)花心思把代碼寫好的,反正都要加班。
不過(guò)對(duì)于志向就是寫代碼的那一些人,最好還是不要受到這些外來(lái)信息的干擾。最近跟我們組里的一個(gè)test manager聊天,他是一個(gè)菲律賓人,說(shuō)是從紙帶時(shí)代開(kāi)始就寫代碼了(不過(guò)看起來(lái)好年輕……),工作的時(shí)候還覺(jué)得C語(yǔ)言是一個(gè)嶄新的語(yǔ)言。后來(lái)他跟我說(shuō),如果一個(gè)人有志向與,代碼一條路走到黑,最好就去學(xué)習(xí)一下怎么當(dāng)architect。他說(shuō)道,Architect的知識(shí)架構(gòu)是由各種pattern組成的,然后就說(shuō)了自己年輕的時(shí)候的很多故事來(lái)作證這個(gè)道理。然后還講了微軟的其中一個(gè)創(chuàng)始人到現(xiàn)在還堅(jiān)持一線寫代碼的事情,不過(guò)沒(méi)告訴我是誰(shuí)。
在這之前,剛好MSR的Daan Leijen因?yàn)閬?lái)北京參加programming language相關(guān)的conference,就來(lái)我們這里參觀了一下。后來(lái)我看他做過(guò)GUI,做過(guò)parser combinator,發(fā)明實(shí)現(xiàn)過(guò)語(yǔ)言,就前去搭訕,結(jié)果發(fā)現(xiàn)他讀書的時(shí)候的導(dǎo)師竟然是Erik Meijer。按照他的話說(shuō),“then we are connected”,如果說(shuō)成中文,就是有緣分吧。接著就跟他討論了一些parser combinator和類型系統(tǒng)之類的東西。我說(shuō)我之前也搞過(guò)這些東西,最后還貢獻(xiàn)了一部分給公司,換了個(gè)組之后還開(kāi)了講座什么的。他講到他讀書的時(shí)候,也是學(xué)校沒(méi)教自己自學(xué)的這些東西,后來(lái)周圍也沒(méi)什么人做,但是并沒(méi)有讓他喪失動(dòng)力。然后就說(shuō)了一句話讓我印象很深刻:“原來(lái)你也做這些東西啊,我應(yīng)該可以看到為什么你要從產(chǎn)品組跳到MSRA來(lái)了。”他直到今天,頭發(fā)都基本上掉光了,還在那里繼續(xù)研究programming language的東西,還給了我?guī)灼撐摹N矣X(jué)得很好,人就該像他那樣。
有些時(shí)候,人就得有那個(gè)信念,才能把可行但是難度大的東西,也最終搞出來(lái)。我自己寫了11年的程序,其實(shí)并沒(méi)有接觸過(guò)十分廣泛的東西,因?yàn)楹芏鄷r(shí)間都花在重寫我的一些idea上面了。譬如說(shuō)編譯器就寫了五六個(gè),GUI庫(kù)就寫了八遍,還有些雜七雜八的。不過(guò)從這個(gè)過(guò)程之中,可以明顯感覺(jué)到自己什么時(shí)候比以前更進(jìn)一步。這種signal有很多,譬如說(shuō)當(dāng)你決定要添加一個(gè)比較復(fù)雜的功能,也可以迅速知道怎么做而不用動(dòng)到架構(gòu)啦;譬如說(shuō)你覺(jué)得你的代碼越來(lái)越順眼啦;譬如說(shuō)你因?yàn)榧軜?gòu)不行決定重寫的時(shí)候,你發(fā)現(xiàn)前一個(gè)版本的代碼可以撿起來(lái)繼續(xù)用的部分越來(lái)越多啦。
寫到這里,我想起很多人都問(wèn)過(guò)我,程序要怎么寫才能寫得好,或者說(shuō)設(shè)計(jì)模式要怎么寫,之類的問(wèn)題。如果把學(xué)習(xí)編程花費(fèi)的精神代價(jià)做標(biāo)準(zhǔn)的話,捷徑是沒(méi)有的。但是如果僅僅把時(shí)間作為標(biāo)準(zhǔn)的話,捷徑顯然是有的。怎樣才能加速你學(xué)習(xí)的過(guò)程呢?答案就是,先寫再看書。對(duì)于像編譯原理這種略微高深的知識(shí),總要自己寫過(guò)幾遍,吃了一些苦頭,才能知道為什么書里非要把算法那么設(shè)計(jì),結(jié)構(gòu)那么安排。對(duì)于像設(shè)計(jì)模式這種需要大量經(jīng)驗(yàn)才可以領(lǐng)悟到的知識(shí),如果你從來(lái)沒(méi)獨(dú)立寫過(guò)一個(gè)上萬(wàn)行的程序,你覺(jué)得你能理解設(shè)計(jì)模式在講什么嗎?我覺(jué)得這種時(shí)候能做的也就是背下來(lái),理解什么的都是扯淡。諸如此類,學(xué)習(xí)程序,如果要加速那個(gè)過(guò)程,肯定要花大量的時(shí)間寫代碼。當(dāng)你把項(xiàng)目做得越大、越復(fù)雜、算法越扭曲、界面越華麗、尺寸已經(jīng)大到你覺(jué)得不學(xué)習(xí)新的方法論就肯定會(huì)讓代碼失控的時(shí)候,這個(gè)時(shí)候你來(lái)看設(shè)計(jì)模式的書,保證是每看到一個(gè)模式都覺(jué)得人家說(shuō)到你心坎里去了。那你不僅可以迅速理解,而且以后還可以不由自主的想起來(lái)使用它。
當(dāng)然,如果你不是一個(gè)喜歡寫代碼的人,那這個(gè)方法肯定沒(méi)有用,因?yàn)橹型痉艞壥裁吹奶嗔恕_@種時(shí)候,只能怪你沒(méi)緣分,設(shè)計(jì)模式不渡你了。如果你最后撐下來(lái)了,雖然你自己覺(jué)得你也花費(fèi)了相當(dāng)?shù)呐Γ莿e人反正是看不到你的努力的,就會(huì)開(kāi)始覺(jué)得你有捷徑了。為什么呢?因?yàn)樾矢甙。瑫r(shí)間花得短啊。
光寫代碼也是沒(méi)用的。同人于野一篇講成年人還能不能進(jìn)步的博客說(shuō)得很好,知識(shí)分為舒適區(qū),學(xué)習(xí)區(qū)和恐慌區(qū)。舒適區(qū)的意思就是,你很容易就可以做完。學(xué)習(xí)區(qū)的意思就是,你需要花費(fèi)大量的智力才可以做完。恐慌區(qū)的意思就是,你根本不知道如何下手。當(dāng)你在為了練習(xí)編寫大量的代碼的時(shí)候,你要盡量把題目都安排在學(xué)習(xí)區(qū)這里,這樣才能讓你進(jìn)步快的同時(shí),還不會(huì)被問(wèn)題打倒,可以繼續(xù)積累成就感了。
學(xué)生做這個(gè)最方便了,工作之后,如果剛好遇上個(gè)黑心公司要你天天加班,你反而沒(méi)時(shí)間做學(xué)習(xí)區(qū)的內(nèi)容了,公司給你的肯定是舒適區(qū)的苦力活。
說(shuō)到這里,如果你還有時(shí)間練習(xí)的話,千萬(wàn)不要去想:“我每一個(gè)程序都要跨平臺(tái)”,“我只做這個(gè)語(yǔ)言”等等。反正將來(lái),語(yǔ)言你都要會(huì),平臺(tái)的差異你都要知道,為什么要斷送自己了解這些東西的機(jī)會(huì)呢?你真的以為不知道垃圾收集的原理,和一些底層的可以通過(guò)C++的練習(xí)而得到的的操作,你真的可以在某些關(guān)鍵時(shí)刻操縱好C#嗎?當(dāng)然有些人會(huì)覺(jué)得,我估計(jì)一輩子不會(huì)遇到這些問(wèn)題的,所以我還是不管他了。人各有志嘛,C#不渡你,也是你自己的事情。如果你真的可以一輩子都在一個(gè)平臺(tái)上用一種語(yǔ)言做同一種程序做到退休,那真是幸福的生活啊。
胡扯到這里也差不多了,這就是月經(jīng)貼,時(shí)不時(shí),總是要發(fā)一下的。
it知識(shí)庫(kù):陳梓瀚:關(guān)于編程的胡扯,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。