码路指南
此文章所在專(zhuān)題列表如下:
碼路指南:緣起
?專(zhuān)治各種迷茫
我們這一代的父輩,大部分都不是程序員,沒(méi)有從事編程的經(jīng)驗(yàn)。以我自己來(lái)說(shuō),我是2000年初中二年級(jí)才接觸的電腦,而那時(shí)候也正是個(gè)人電腦開(kāi)始普及的時(shí)候,所以我是隨著PC和互聯(lián)網(wǎng)蓬勃發(fā)展而涌起的編程者大浪中的一員。由于可鑒的前車(chē)并不多,這朵大浪會(huì)如何走向,又會(huì)有多少人拍死在沙灘上,后繼的浪潮我們又該如何正確看待,這些問(wèn)題其實(shí)我們都是要想清楚的。畢竟我們最起碼要生活,那么職業(yè)發(fā)展問(wèn)題是個(gè)大問(wèn)題。
我相信很多程序員都會(huì)有各種各樣的迷茫,比如:
- 我該如何入門(mén)?
- 我該如何提高自己的編程水平?
- 我的編程水平遇到瓶頸了,如何突破?
- 為什么我努力看書(shū)學(xué)習(xí),還是感覺(jué)沒(méi)多大提升?
- 我覺(jué)得我現(xiàn)在是專(zhuān)家,啥都做得出了!但其實(shí)你還是個(gè)編程新手
- 我在公司里無(wú)晉升/加薪希望,該怎么辦?
- 我都過(guò)30歲了,還在編程一線加班,怎么辦?
- 等等……
這些問(wèn)題我們都需要弄明白。如何自己想不明白,就需要外人點(diǎn)播一下。
我一直關(guān)注博客園的“理想流”(http://www.cnblogs.com/daoshi/),很欣賞他獨(dú)到的思考,最近看到他出的書(shū),還有寫(xiě)的“程序員生存定律(http://www.cnblogs.com/daoshi/p/3776814.html)”一系列文章,私以為對(duì)指導(dǎo)我們程序員的職業(yè)生涯有不錯(cuò)的幫助,于是拜讀并加以排版整理,后續(xù)會(huì)再加入自己的一些看法,記錄在“碼路指南”這個(gè)專(zhuān)題里。希望更多人看到,也希望幫助更多人解決迷茫。
碼路指南:怎樣才算是編程高手?
高手的定義
一旦度過(guò)了初始階段,做過(guò)了前面說(shuō)的那些事情,那么一個(gè)人算是基本入行了,接下來(lái)的目標(biāo)就非常簡(jiǎn)單,要在選定方向上成為高手。高手意味著專(zhuān)業(yè),而在分工無(wú)限細(xì)化的年代里,專(zhuān)業(yè)則是生存、發(fā)展好最為重要的一個(gè)前提。
高手的定義和養(yǎng)成關(guān)鍵
我估計(jì)如果問(wèn)100個(gè)人“什么樣的程序員是高手?”,那答案會(huì)有100多個(gè)。因?yàn)橥粋€(gè)人還可能給高手下不同的定義。
在這里我們認(rèn)為,在特定領(lǐng)域里能搞定大部分人搞不定事情的就是高手。從這樣一個(gè)定義出發(fā),我們會(huì)發(fā)現(xiàn)在技術(shù)人員和銷(xiāo)售人員眼里,高手的內(nèi)涵是有很大差異的。
純技術(shù)人員更多的關(guān)注性能能不能提到極致,并發(fā)能不能處理的很好,內(nèi)存溢出Bug能不能很快搞定,類(lèi)庫(kù)的機(jī)理熟悉不熟悉等等。而在銷(xiāo)售人員的眼里,則在技術(shù)外還多看了些東西,比如業(yè)務(wù)流程熟不熟悉、使用性好不好、能否迅速對(duì)應(yīng)變化、能否在限定工期和預(yù)算下搞定任務(wù)等。
考慮到職場(chǎng)和產(chǎn)品銷(xiāo)售有著非常緊密的關(guān)系,我們這里使用后一個(gè)視角,而非是單純的技術(shù)視角。
有幾類(lèi)本質(zhì)上很不同的人都會(huì)被視為高手,比如說(shuō):
- 能寫(xiě)出很牛的病毒的。這個(gè)不舉例子,但當(dāng)年讀過(guò)CIH的代碼,我是被其精巧給震住了。此外也許搞加密解密的也應(yīng)該放在這個(gè)類(lèi)別里。
- 能把一堆3D圖形放到64K的。以前專(zhuān)門(mén)有個(gè)比賽是干這個(gè)的,64K大小的EXE能給你放10幾分鐘很酷的3D動(dòng)畫(huà),第一次見(jiàn)絕對(duì)會(huì)很震驚。
- 能迅速調(diào)試出問(wèn)題所在的。內(nèi)存泄露、多線程同步這類(lèi)問(wèn)題往往讓人糾纏很久也搞不定,但就是有人能很快的解決這類(lèi)問(wèn)題。
- 能僅靠幾個(gè)人就架起高并發(fā)網(wǎng)站的。新興Web2.0網(wǎng)站如:Flickr,甚至還可以包括Google,在初期往往是幾個(gè)人搞起來(lái)的,這些人名聲不顯,但絕對(duì)是高手。
- 能主導(dǎo)開(kāi)發(fā)出很牛的產(chǎn)品的。這個(gè)上可以想想U(xiǎn)nix和Linux的作者等。
- 能主持大規(guī)模軟件設(shè)計(jì)的。這個(gè)往往更有商業(yè)價(jià)值,我們常說(shuō)的Martin?Fowler應(yīng)該可以算在這個(gè)類(lèi)別。
- 能把一種語(yǔ)言研究的特別牛的。想想各個(gè)編程語(yǔ)言的創(chuàng)建者,想想C++的大牛們。當(dāng)然創(chuàng)建某一門(mén)語(yǔ)言的也可以歸到這個(gè)類(lèi)別里。
- 能開(kāi)辟自己方法論的。比如搞CMMI的Watts?S.?Humphrey。
- 能寫(xiě)出很牛的書(shū)的。比如:Windows平臺(tái)下寫(xiě)了Windows核心編程的Jeffry?Richard。
- 能寫(xiě)出很牛的算法的。比如:Donald?Knuth。
- ……
這個(gè)表應(yīng)該還可以加長(zhǎng)很多,單以大家認(rèn)可這個(gè)角度來(lái)看確實(shí)高手可以從各個(gè)方面冒出來(lái)。?
不管在那一方面,要想成為上面所描述的高手總是需要學(xué)習(xí)、思考、實(shí)踐這些環(huán)節(jié),這沒(méi)什么可說(shuō)的。但和軟件相關(guān)的知識(shí)其實(shí)多如牛毛,完全不像小說(shuō)里武功秘籍那么稀缺,幾乎可以講滿地都是。這就使選擇和集中成為難題。
軟件的三個(gè)基本特征(技術(shù)更迭快、低介入門(mén)檻、多內(nèi)部分野)就像鍘刀一樣,一旦選擇出錯(cuò),就會(huì)把個(gè)人的努力切的粉碎,一點(diǎn)價(jià)值也留不下來(lái)。而與此相對(duì)的,則是人的黃金學(xué)習(xí)時(shí)間其實(shí)并不多 —— 不過(guò)是畢業(yè)后的10年左右的時(shí)間。
曾經(jīng)有人希望自己能夠從事嵌入式軟件的開(kāi)發(fā),因此給自己買(mǎi)了ARM板,自己在家里花了很多時(shí)間來(lái)學(xué)習(xí)并實(shí)踐相關(guān)知識(shí),最終卻因?yàn)槠渌脑蜻M(jìn)入了一家做網(wǎng)絡(luò)的公司。這個(gè)人等價(jià)于被軟件的內(nèi)部分野較多,而彼此間技能流動(dòng)性較差這樣的一個(gè)特質(zhì)斬了一刀,被斬掉的倒不是ARM板,而是自己一年多的辛苦投入。這種情況下強(qiáng)調(diào)學(xué)的知識(shí)將來(lái)有用是沒(méi)有太大意義的,因?yàn)檫€有兩刀在等著:如果你三年都不做這個(gè),你今天學(xué)到的知識(shí)可能會(huì)被更迭掉了,同時(shí)由于你年紀(jì)增長(zhǎng)了,可能也不太適合與大批新介入這個(gè)行業(yè)的人員進(jìn)行競(jìng)爭(zhēng)。?
這類(lèi)事情使軟件行業(yè)中的成為高手這事變得復(fù)雜了。
為了在成為高手這條路上走的順暢,事實(shí)上有三個(gè)關(guān)鍵點(diǎn):一是要有一張全局性的地圖,以便選好方向;二是要知道都有那些坑,好繞開(kāi)它,免得掉進(jìn)去。三是要有足夠的熱情和動(dòng)力,能堅(jiān)持走下去。下面將分別從這三個(gè)方面來(lái)說(shuō)明成為高手途徑和方法,而這種途徑和方法會(huì)因?yàn)榫唧w目標(biāo)不同而有所微調(diào)。
碼路指南:程序員的幾個(gè)職場(chǎng)發(fā)展方向
職場(chǎng)該如何走?
清代著名學(xué)者曾對(duì)知識(shí)地圖的必要性做過(guò)非常精確的表述:
凡讀書(shū)最切要者,目錄之學(xué)也。目錄明,方可讀書(shū),不明,終是亂讀。
—— 王鳴盛,《十七史商榷》
目錄即是地圖。
對(duì)于軟件開(kāi)發(fā)的知識(shí),我更愿意使用下面的的“地圖”,這不一定是最合理的,但確實(shí)對(duì)歸納各種軟件開(kāi)發(fā)知識(shí)有所幫助。
1. 通用的領(lǐng)域知識(shí)
※1?有的時(shí)候子類(lèi)別間的界限并不是很容易界定,其中一個(gè)主要原因就是存在著像.Net?Framework這樣涵蓋了過(guò)多內(nèi)容的概念。
2. 概念和邏輯創(chuàng)建和優(yōu)化
※2 ?從形式上來(lái)看UML更近似于一種編程語(yǔ)言,但從其目的上來(lái)看也許歸在這里是更合適的一種選擇。
3. 專(zhuān)業(yè)領(lǐng)域知識(shí)
4. 關(guān)于軟件的間接知識(shí):
- 需求開(kāi)發(fā)和描述
- 估算
- 估算法。比如,COCOMO,?FP等。
- 估算術(shù)。比如,使用計(jì)數(shù)等原始辦法。
- 軟件工程和方法論
- 輕量型方法論。比如敏捷。
- 大方法論。比如CMMI
- 綜合分析。比如,《人月神話》,《人件》所做的工作。?
隨著待解決問(wèn)題越來(lái)越復(fù)雜,通用的領(lǐng)域知識(shí)中,幾種技術(shù)往往會(huì)組成一種技術(shù)Stack,他們更需要被看做一組必須一起掌握的知識(shí),比如:LAMP(Linux+Apache+MySQL+Python/PHP)。
當(dāng)然上面羅列的遠(yuǎn)不是全部,這種羅列更多的是展示一種分類(lèi)的方法。通過(guò)對(duì)這種分類(lèi)方法的補(bǔ)充和完善,大多可接觸到知識(shí)都可以被歸入特定的類(lèi)別,比如說(shuō):WinRT可以看做一種新的平臺(tái),HTML5則可以看做是一種語(yǔ)言等。
每個(gè)人可以根據(jù)自己的情形,參照上面的分類(lèi)建立屬于自己的地圖,有點(diǎn)問(wèn)題沒(méi)關(guān)系,有就比沒(méi)有要好很多。接下來(lái)依據(jù)這樣的地圖就可以選一條自己的線路,持續(xù)累積,尋求實(shí)踐機(jī)會(huì),最終就很可能會(huì)成為真正的高手。
而關(guān)于增值所需的動(dòng)力,所要避開(kāi)的陷阱,將下面陸續(xù)提到。
增值、讀書(shū)與大局觀
單純從達(dá)成某一目的而言,讀書(shū)往往非是絕對(duì)必要條件。
秦始皇把書(shū)一把火燒了,劉邦項(xiàng)羽一樣造反并取得勝利。但讀書(shū)無(wú)疑的可以加速一個(gè)人增值的過(guò)程,記不得是誰(shuí)說(shuō)過(guò):實(shí)踐無(wú)疑是人類(lèi)最好的老師,但只靠實(shí)踐來(lái)認(rèn)知世界無(wú)疑也是愚蠢的。這是非常精辟的。除此之外,要想培養(yǎng)大局觀,那就非讀書(shū)不可。
每個(gè)人的親身經(jīng)歷,在大的時(shí)空背景中往往只是一個(gè)簡(jiǎn)單的截面,這一截面中絕不會(huì)包含可以歸納出所有真理的事實(shí),因此只依賴于自身的實(shí)踐也就必然限定了一個(gè)人的視野。 這一點(diǎn)隨著一個(gè)人的責(zé)任范圍變大往往會(huì)體現(xiàn)為一種制約和限制。所以培根講:有實(shí)際經(jīng)驗(yàn)的人雖能夠處理個(gè)別性的事務(wù),但若要綜觀整體,運(yùn)籌全局,卻唯有學(xué)識(shí)方能辦到。?
即使從實(shí)踐來(lái)看也是如此,要想培養(yǎng)出一種大局觀,那就非讀書(shū)不可。而大局觀往往是成為將帥之才的必要條件。
具體到軟件而言,有一本很有名的書(shū)對(duì)培養(yǎng)技術(shù)的大局觀有幫助:《代碼大全》。至于專(zhuān)業(yè)性較強(qiáng)的書(shū),反倒是可以根據(jù)自己的情景比較容易的選擇,這里就不提了。
基于上面這樣的一張地圖,我們就可以具體的去考慮幾條進(jìn)階路徑。
路徑一:由程序員而架構(gòu)師
架構(gòu)師是一個(gè)很火的職位名字,但你很難給它下精確的定義。
下面所陳述的一切是我個(gè)人的理解和體會(huì),我無(wú)法保證它和其他人的解釋完全吻合。因?yàn)榧軜?gòu)師,乃至架構(gòu)設(shè)計(jì)實(shí)在是一種非常模糊的概念,如果你用心去找,可以找到各種定義(甚至IEEE和SEI的定義也不一致),這就導(dǎo)致你只能參照別人,相信自己。
本質(zhì)來(lái)講架構(gòu)設(shè)計(jì)也是設(shè)計(jì),所以凡是做設(shè)計(jì)的都可以稱(chēng)自己為架構(gòu)師。
當(dāng)一個(gè)系統(tǒng)的規(guī)模變大的時(shí)候,設(shè)計(jì)上的決策就具有了特別的價(jià)值,并且也越來(lái)越需要專(zhuān)門(mén)的人來(lái)做,架構(gòu)設(shè)計(jì)也就越來(lái)越像是一種特別的設(shè)計(jì)。比如說(shuō):考慮架構(gòu)設(shè)計(jì)的時(shí)候,可能需要考慮選用什么樣的數(shù)據(jù)庫(kù)、選用那個(gè)開(kāi)源框架、選用什么樣的硬件平臺(tái),這些東西在小規(guī)模程序中往往是居于次要地位的。
假設(shè)說(shuō)一個(gè)人已經(jīng)掌握了一門(mén)或幾門(mén)編程語(yǔ)言、面向?qū)ο蟆⒃O(shè)計(jì)模式、能夠很熟練的寫(xiě)出質(zhì)量較高的代碼,接下來(lái)他想成為架構(gòu)師,這個(gè)時(shí)候他需要做什么?
我個(gè)人認(rèn)為,這時(shí)候這個(gè)人首先要有一個(gè)“專(zhuān)業(yè)”。這個(gè)專(zhuān)業(yè)可以是“金融”,“財(cái)務(wù)”,“電商”,“管理”等等。這是一種屬于某一專(zhuān)業(yè)的領(lǐng)域知識(shí),而不是編程技術(shù)。如果把需求和最終的代碼,看成描述同一事物的一體兩面,那么設(shè)計(jì)始終是要架起這兩者間的橋梁。而架橋的時(shí)候,怎么可能只知道一端而不知道另一端。
接下來(lái)是深化設(shè)計(jì)所需要的各種通用領(lǐng)域知識(shí)(UML、面向?qū)ο蟆⑿阅艽_保等)。這時(shí)和一般所說(shuō)的設(shè)計(jì)的一個(gè)關(guān)鍵區(qū)別是,那就是架構(gòu)設(shè)計(jì)要分心思去考慮那些東西用別人的就好了,而那些東西要自己開(kāi)發(fā)。而一般所說(shuō)的設(shè)計(jì)技術(shù)中,比較側(cè)重自己應(yīng)該怎么干(面向?qū)ο蟆y(cè)試驅(qū)動(dòng)等)。為達(dá)成這一目的,就需要對(duì)現(xiàn)有技術(shù)的優(yōu)劣有相對(duì)比較清晰的認(rèn)識(shí),比如要能分清楚那些是成熟穩(wěn)定的技術(shù),那些是處在實(shí)驗(yàn)階段的技術(shù)。Pinterest網(wǎng)站就曾經(jīng)進(jìn)行過(guò)下列這樣的架構(gòu)改進(jìn),在這樣的改進(jìn)過(guò)程中,不知道各種技術(shù)的優(yōu)劣是代價(jià)很大的:
Pinterest 早期階段:
- Rackspace
- 1?small?web?engine
- 1?small?MySQL?DB
2011/1:
- Amazon EC2 + S3 + CloudFront
- 1 NGinX, 4 Web Engines (for redundancy, not really for load)
- 1 MySQL DB + 1 Read Slave (in case master goes down)
- 1 Task Queue + 2 Task Processors
- 1 MongoDB (for counters)
- 2 Engineers
2011/9:
- Amazon EC2 + S3 + CloudFront
- 2NGinX, 16 Web Engines + 2 API Engines
- 5 Functionally sharded MySQL DB + 9 read slaves
- 4 Cassandra Nodes
- 15 Membase Nodes (3 separate clusters)
- 8 Memcache Nodes
- 10 Redis Nodes
- 3 Task Routers + 4 Task Processors
- 4 Elastic Search Nodes
- 3 Mongo Clusters
- 3 Engineers
2012/1:
- Amazon EC2 + S3 + Akamai, ELB
- 90 Web Engines + 50 API Engines
- 66 MySQL DBs (m1.xlarge) + 1 slave each
- 59 Redis Instances
- 51 Memcache Instances
- 1 Redis Task Manager + 25 Task Processors
- Sharded Solr
- 6 Engineers
2012/10:
- Amazon EC2 + S3 + Edge Cast,Akamai, Level 3
- 180 Web Engines + 240 API Engines
- 88 MySQL DBs (cc2.8xlarge) + 1 slave each
- 110 Redis Instances
- 200 Memcache Instances
- 4 Redis Task Manager + 80 Task Processors
- Sharded Solr
- 40 Engineers (and growing)
摘自:http://highscalability.com/blog/2013/4/15/scaling-pinterest-from-0-to-10s-of-billions-of-page-views-a.html
這個(gè)過(guò)程比較真實(shí),大家可以參照著想想如果自己來(lái)主導(dǎo),那還欠缺什么。
最后一點(diǎn)要說(shuō)的是,做架構(gòu)設(shè)計(jì)已經(jīng)相對(duì)于在做技術(shù)管理工作,至少要適當(dāng)涉獵估算并能做出合適的任務(wù)分解,這樣一旦日程緊張,則可以通過(guò)增加人手等手段來(lái)在質(zhì)量、成本和進(jìn)度之間進(jìn)行均衡。
由于知識(shí)面已經(jīng)擴(kuò)的比較大,架構(gòu)師在具體某個(gè)專(zhuān)業(yè)領(lǐng)域上的深度可能會(huì)有所欠缺,比如:在做一款電子消費(fèi)產(chǎn)品時(shí)用到了TTS,但架構(gòu)師不一定能很好的了解TTS的算法---這是CodeGuru的領(lǐng)域。
架構(gòu)師所需要達(dá)成的最終目標(biāo)可以形象的描述為:產(chǎn)品經(jīng)理考慮用戶和市場(chǎng)建立了一個(gè)模型,那么架構(gòu)師要能把這東西映射到技術(shù)的世界里來(lái)。如果是在互聯(lián)網(wǎng)行業(yè),那么在你的主導(dǎo)設(shè)計(jì)下要可以做出高并發(fā)的網(wǎng)站。換到其他行業(yè)也與此類(lèi)似,從產(chǎn)品的的角度往回看,架構(gòu)師要能解決和技術(shù)相關(guān)的所有問(wèn)題,主導(dǎo)完成商業(yè)上有價(jià)值的產(chǎn)品或項(xiàng)目的開(kāi)發(fā)工作。實(shí)現(xiàn)手段上倒并無(wú)限制,可以是購(gòu)買(mǎi),可以是組織人員進(jìn)行開(kāi)發(fā),只要能平衡短期和長(zhǎng)期利益,解決特定的問(wèn)題即可。
路徑二:由程序員而CodeGuru
與架構(gòu)師相對(duì)應(yīng),在某些智力密集型的程序中,也需要技能高超的程序員,這種程序員往往被稱(chēng)為Guru。
這條路線里,程序員并不把自己擅長(zhǎng)的領(lǐng)域擴(kuò)的太寬,但在指定領(lǐng)域上會(huì)挖掘的很深。驅(qū)動(dòng)、字庫(kù)、圖形庫(kù)、算法庫(kù)、OCR等都偏向于這一領(lǐng)域。
假如說(shuō),一個(gè)程序員在掌握基本語(yǔ)言之后,想往這個(gè)方向發(fā)展,那么需要的技能和架構(gòu)師差別很大。比如:一個(gè)人如果想往驅(qū)動(dòng)方向發(fā)展,那么就需要了解CPU的基本結(jié)構(gòu)、內(nèi)核調(diào)試方式、操作系統(tǒng)中與相應(yīng)驅(qū)動(dòng)所對(duì)應(yīng)的機(jī)制、硬件側(cè)的規(guī)格、通訊協(xié)議等。
這時(shí)候很可能由于程序規(guī)模并不十分龐大,面向?qū)ο蟆⒃O(shè)計(jì)模式這類(lèi)東西沒(méi)有太大發(fā)揮空間,而是需要處理的是大量或麻煩或艱深的細(xì)節(jié)。
2013年1月,ITeye發(fā)布了一條信息說(shuō):Intel面向?qū)W生免費(fèi)提供?C++?開(kāi)發(fā)工具,并簡(jiǎn)單的介紹了一下是那些工具免費(fèi)向?qū)W生提供:
- Intel?C++編譯器(高度優(yōu)化的編譯器)?
- Intel數(shù)學(xué)核心函數(shù)庫(kù)(高性能數(shù)學(xué)庫(kù))?
- Intel線程構(gòu)建模塊(C++任務(wù)模型、最流行的C++并行方法)?
- ?Intel集成性能基元(多媒體基元庫(kù))?
看到這張列表,我們可以思考下要開(kāi)發(fā)這類(lèi)工具需要什么樣的程序員。上面這些工具的開(kāi)發(fā)都屬于高難度的工作,和開(kāi)發(fā)大規(guī)模的MIS系統(tǒng)完全不同,如果不是某方面的專(zhuān)家,基本不太可能負(fù)擔(dān)起相應(yīng)的責(zé)任。而這類(lèi)領(lǐng)域則正是Guru的天下。
路徑三:由程序員而純管理
純管理工作和技術(shù)管理工作可以用是否接觸乃至編寫(xiě)代碼來(lái)區(qū)分。純管理工作往往需要把精力放在預(yù)算編制、人員職業(yè)路徑、考評(píng)、度量、流程改善這些工作上。一定程度上講,這等價(jià)于和編程工作說(shuō)拜拜,當(dāng)然前提是你得有編程經(jīng)驗(yàn),有一些通用領(lǐng)域知識(shí)和概念創(chuàng)建乃至邏輯優(yōu)化的知識(shí),否則的話和程序員沒(méi)法溝通,進(jìn)而給工作造成障礙。
從需要讀的書(shū)來(lái)看,這時(shí)候可能要看過(guò)PMBOK,《項(xiàng)目管理修煉之道》,《管理的實(shí)踐》,《基業(yè)長(zhǎng)青》等等。
但如果一個(gè)人認(rèn)為想做管理要從PMP開(kāi)始,那大概是還沒(méi)太明白管理這項(xiàng)工作的本質(zhì)。管理本身是一種借勢(shì),雖然有技術(shù)性的一面,比如要理解掙值曲線這類(lèi),但這方面知識(shí)其實(shí)并沒(méi)有想的那么復(fù)雜 —— 至少?zèng)]有C++11復(fù)雜,只要有時(shí)間正常智商的人都可以在不太長(zhǎng)的時(shí)間內(nèi)掌握。所以如果你想做管理,并使用了和學(xué)習(xí)C++語(yǔ)言一樣的方法,那基本上是偏離了方向。
拋開(kāi)機(jī)緣這類(lèi)東西不論,做好管理工作有兩點(diǎn)很關(guān)鍵:
- 一是要把技術(shù)工作做的相對(duì)比較好。這好像有點(diǎn)學(xué)而優(yōu)則仕的意味,但大多時(shí)候人們更愿意相信“將軍起于行伍,宰相拔于州郡”,而不愿意相信單只會(huì)耍嘴皮子的人。過(guò)度務(wù)實(shí)的人容易迷失于道路,過(guò)度務(wù)虛的人則容易飄的太高而喪失根基。管理者正應(yīng)該身處在這兩者之間的一個(gè)平衡點(diǎn)。
- 二是要能夠借勢(shì)。要情商比較好,能把很多人組織在一起。這個(gè)時(shí)候要知道那些東西需要規(guī)則化,那些東西需要靈活把握。過(guò)度偏向規(guī)則是教條,過(guò)度偏向靈活則是人治,平衡點(diǎn)始終要根據(jù)具體人員的狀況,工作特質(zhì)這些不可改變的事情來(lái)把握。這有點(diǎn)微妙。但即使程序員這個(gè)群體相對(duì)簡(jiǎn)單,但并不能推翻先人后事這類(lèi)規(guī)則。這不知道是不是東方特色,當(dāng)你想做管理并想推進(jìn)事情的時(shí)候,終究要理清人際上的關(guān)系,否則就和可能會(huì)欲速則不達(dá)。這點(diǎn)會(huì)在后面進(jìn)一步展開(kāi)來(lái)談。
下面我們來(lái)看一個(gè)具體點(diǎn)的例子,這個(gè)例子出自郭致星老師的博客,是一個(gè)學(xué)員的真實(shí)疑問(wèn)(文字上有修飾),X入職后的現(xiàn)狀如下:
開(kāi)發(fā)部現(xiàn)在26個(gè)人。基本組織架構(gòu)是由開(kāi)發(fā)組、需求組、測(cè)試組、運(yùn)維部四個(gè)部門(mén)組成。需求組的人收集需求,再通過(guò)系統(tǒng)指派給開(kāi)發(fā)組,進(jìn)行開(kāi)發(fā)。開(kāi)發(fā)組的文檔嚴(yán)重缺乏。
現(xiàn)在公司內(nèi)有技術(shù)總監(jiān)和開(kāi)發(fā)部經(jīng)理的崗位。眼下全公司就X一個(gè)項(xiàng)目經(jīng)理,目前是跟著開(kāi)發(fā)部經(jīng)理,在熟悉一個(gè)核心系統(tǒng),由于沒(méi)有任何文檔的遺留,所以現(xiàn)在是相當(dāng)于一個(gè)開(kāi)發(fā)人員在開(kāi)發(fā)一些實(shí)際的功能,一邊開(kāi)發(fā)一邊熟悉現(xiàn)有系統(tǒng)。
現(xiàn)在X并沒(méi)有項(xiàng)目的實(shí)際權(quán)力,而且整個(gè)項(xiàng)目組也只有開(kāi)發(fā)部經(jīng)理,加上2個(gè)開(kāi)發(fā),再加上1個(gè)測(cè)試和X共5個(gè)人。其中X和其中一個(gè)開(kāi)發(fā)都是新來(lái)的。
與此同時(shí),業(yè)務(wù)部門(mén)在搞一些流程,但還沒(méi)做完,沒(méi)有在開(kāi)發(fā)部進(jìn)行實(shí)施。工作氣氛比較沉悶。技術(shù)總監(jiān)和開(kāi)發(fā)部經(jīng)理,都是技術(shù)型的人,比較偏向技術(shù),平時(shí)工作也多偏向于具體執(zhí)行。
在使用一個(gè)Redmine系統(tǒng)進(jìn)行項(xiàng)目管理和BUG跟蹤。
這里的系統(tǒng)大部分都類(lèi)似于產(chǎn)品線制,屬于需要長(zhǎng)期開(kāi)發(fā)維護(hù)的,需求源源不斷的來(lái),相應(yīng)人員也就需要不停的做,沒(méi)有版本制度,也沒(méi)有計(jì)劃和規(guī)劃。
系統(tǒng)現(xiàn)在主要的問(wèn)題是性能問(wèn)題。?
問(wèn)題就是在這樣的一種環(huán)境下,X應(yīng)該如何開(kāi)始自己的管理工作?
這類(lèi)問(wèn)題通常并沒(méi)有唯一答案,但確實(shí)有些通行的手段可供參考,最終做不做的好和個(gè)人能力乃至環(huán)境關(guān)聯(lián)很緊:
在不同類(lèi)型的公司里,對(duì)應(yīng)手段上會(huì)有不同。比如在規(guī)范性比較強(qiáng)的大公司,第4,5兩步的權(quán)重就會(huì)比較低。在上述這樣的場(chǎng)景下,PMP這類(lèi)書(shū)籍中所提到的種種技術(shù)手段誠(chéng)然是必要的,但和人打交道的部分(老板、直屬上司、下屬)往往會(huì)對(duì)最終的結(jié)果產(chǎn)生更大的影響,這是管理工作與純粹技術(shù)工作不同的地方。
碼路指南:為何你成不了編程高手?
成長(zhǎng)路上常見(jiàn)的坑
前面講到了程序員成為高手需要有一張地圖,借助這樣一張地圖,程序員可以嘗試成為架構(gòu)師、Guru或者純管理者。但這條路總是不會(huì)那么順暢。
升級(jí)練功流的網(wǎng)游中總會(huì)給修仙的主人公設(shè)置下幾大關(guān)卡,比如:金丹難成、元神難成、成了元神后還有天人五衰等等。沒(méi)有這些關(guān)口,情節(jié)很難推動(dòng),所以仙俠類(lèi)的網(wǎng)游幾乎無(wú)一例外依賴于這類(lèi)設(shè)定。這一傳統(tǒng)甚至可以追溯到《西游記》和《封神演義》。
拿這個(gè)來(lái)對(duì)照程序員的增值道路,就會(huì)猛地發(fā)現(xiàn),升級(jí)練功流也不完全是扯淡。不管走那條道路,程序員的修煉路上同樣的也有三災(zāi)九難,要想成就高手,還是得一個(gè)個(gè)跨過(guò)去才行。如果一個(gè)程序員達(dá)到一定高度后再回頭觀望,那就會(huì)發(fā)現(xiàn)自己的同學(xué)、曾經(jīng)的同事總是會(huì)因?yàn)檫@樣那樣的原因倒下去。這并不是一個(gè)簡(jiǎn)單的天道酬勤就可以敷衍的行當(dāng),下面就讓我們來(lái)具體看看,究竟增值過(guò)程中可能遇到那些陷阱,掉到坑里又需要付出多大代價(jià)才爬的出來(lái)。?
學(xué)習(xí)失去焦點(diǎn)
軟件行業(yè)里有幾個(gè)經(jīng)典的題目,每過(guò)一段時(shí)間就會(huì)被翻出來(lái)PK一下,比如關(guān)于編程語(yǔ)言優(yōu)劣的比較等。其中一個(gè)經(jīng)典題目是軟件和數(shù)學(xué)的關(guān)系。
從結(jié)果來(lái)看,一派人認(rèn)為數(shù)學(xué)是軟件的基礎(chǔ),而另一派人認(rèn)為數(shù)學(xué)和軟件沒(méi)什么太大關(guān)系,除非是在某幾個(gè)特定領(lǐng)域里。如果你用心觀察過(guò)這事情,你就會(huì)發(fā)現(xiàn)這事情特別有意思。
比如說(shuō):2011年,CSDN轉(zhuǎn)了一篇,叫:“數(shù)學(xué)是成就卓越開(kāi)發(fā)人員的必備技能”的文章,在文末作者說(shuō):
那么,數(shù)學(xué)對(duì)所有事都有利么?這事情很難說(shuō),我對(duì)我現(xiàn)在的處境十分滿意,或許你也如此,但這都和潛能有關(guān)系。如果你是協(xié)作世界的一名開(kāi)發(fā)人員,你真的不需要數(shù)學(xué)。如果你樂(lè)于你的整個(gè)職業(yè)生涯是這樣的:在工作時(shí)間中做企業(yè)CRUD應(yīng)用,或在閑暇時(shí)間滑翔跳傘或極限水上滑板(或其他各種時(shí)髦的極客運(yùn)動(dòng)),也分配較多時(shí)間在Spring、Hibernate、Visual Studio或其它東西上。那些特殊的職位并沒(méi)有真正限制你的潛力,你能變得極具價(jià)值,甚至可深入追求。但是如果你想為多樣化的職業(yè)生涯而奮斗,想要有能力嘗試幾乎所有涉及代碼的事,從信息檢索到Linux內(nèi)核。
總之,如果你想成為一個(gè)開(kāi)發(fā)人員、程序員和計(jì)算機(jī)科學(xué)家的完美組合,你必須確保你的數(shù)學(xué)技能達(dá)到標(biāo)準(zhǔn)。長(zhǎng)話短說(shuō),如果你在數(shù)學(xué)方面有一定天賦,那在軟件開(kāi)發(fā)領(lǐng)域中所有的大門(mén)都是向你敞開(kāi)的,如果沒(méi)有,那你就安安心心地做CRUD型工作吧!
總的來(lái)看,這個(gè)作者認(rèn)為數(shù)學(xué)很關(guān)鍵,得學(xué)。
而在2012年CSDN又轉(zhuǎn)了篇文章,叫:編程需要知道多少數(shù)學(xué)知識(shí)?在文章里作者說(shuō):
數(shù)學(xué)和編程有一種容易讓人誤解的聯(lián)系。許多人認(rèn)為在開(kāi)始學(xué)習(xí)編程之前必須對(duì)數(shù)學(xué)很在行或者數(shù)學(xué)分?jǐn)?shù)很高。但一個(gè)人為了編程的話,需要學(xué)習(xí)多少數(shù)學(xué)呢?
實(shí)際上不需要很多。這篇文章中我會(huì)深入探討編程中所需要的數(shù)學(xué)知識(shí)。你可能已經(jīng)都知道了。
對(duì)于基本的編程,你需要知道下面的:
- 加減乘除 —— 實(shí)際上,電腦會(huì)幫你作加減乘除運(yùn)算。你僅需要知道什么時(shí)候運(yùn)用它們。
- 模運(yùn)算 —— 模運(yùn)算是用來(lái)計(jì)算余數(shù),它的符號(hào)通常用%百分號(hào)來(lái)表示。所以23除以7等于3,余數(shù)是2。23?mod?7?=?2。
- 判斷是奇數(shù)還是偶數(shù)的模運(yùn)算 —— 如果你想知道一個(gè)數(shù)是奇數(shù)還是偶數(shù),用它mod?2來(lái)作模運(yùn)算。如果結(jié)果是0,它就是偶數(shù)。如果結(jié)果是1,就是奇數(shù)。23?mod?2等于1,所以23是奇數(shù),24?mod?2等于0,24是偶數(shù)。
- 對(duì)一個(gè)數(shù)作百分?jǐn)?shù)運(yùn)算,就是用這個(gè)數(shù)來(lái)乘以一個(gè)百分?jǐn)?shù)。譬如你要得到279的54%,就是用0.54*279。這就意味著為什么1.0等于100%,0.0等于0%。
- 知道負(fù)數(shù)是什么。負(fù)數(shù)乘以負(fù)數(shù)等于正數(shù)。負(fù)數(shù)乘以正數(shù)等于負(fù)數(shù)。就這么簡(jiǎn)單。
- 知道迪卡爾坐標(biāo)系統(tǒng)。在編程中,(0,0)代表屏幕左上角,Y坐標(biāo)的正軸往下。
- 知道勾股定律,因?yàn)樗怯脕?lái)計(jì)算笛卡爾坐標(biāo)中兩點(diǎn)之間的距離的。勾股定律a^2+^2=c^2。(x1,y1)和(x2,y2)兩點(diǎn)之間的距離等于((x1–x2)^2+(y1–y2)^2)。
- 知道十進(jìn)制、二進(jìn)制、十六進(jìn)制。十進(jìn)制就是我們通常用的十個(gè)數(shù):0-9。通常認(rèn)為這個(gè)十進(jìn)制系統(tǒng)是人類(lèi)發(fā)明的,因?yàn)槲覀冇惺畟€(gè)手指。
總的來(lái)看,這個(gè)作者認(rèn)為數(shù)學(xué)不太關(guān)鍵,大多時(shí)候可以不學(xué)。
你如果持續(xù)關(guān)注這事兒,各種極端對(duì)立的觀點(diǎn)絕對(duì)會(huì)吵爆你的頭。但這事情其實(shí)不可能有結(jié)論,因?yàn)楸粚?duì)立起來(lái)的兩極都是太大的概念。
比如說(shuō):如果把軟件開(kāi)發(fā)縮減為應(yīng)用軟件的開(kāi)發(fā),那爭(zhēng)議性就會(huì)降低很多。
這里的關(guān)鍵問(wèn)題是,假如一個(gè)人的目標(biāo)是應(yīng)用軟件開(kāi)發(fā),卻花了10年來(lái)學(xué)習(xí)數(shù)學(xué),接下來(lái)在實(shí)際應(yīng)用程序開(kāi)發(fā)過(guò)程中,每天面對(duì)的是UI布局、IDE使用、圈復(fù)雜度控制、面向?qū)ο笫褂谩⒃O(shè)計(jì)模式的使用和類(lèi)庫(kù)的使用這類(lèi)問(wèn)題,那么這個(gè)人就會(huì)發(fā)現(xiàn)數(shù)學(xué)其實(shí)沒(méi)啥用,他等價(jià)于因?yàn)槭ソ裹c(diǎn)而失去了10年。
這里想表明的是,一旦誤讀了知識(shí)與目的間的因果關(guān)系,那么學(xué)習(xí)就會(huì)失去焦點(diǎn),進(jìn)而造成負(fù)效應(yīng),畢竟相對(duì)于人的可承受負(fù)荷而言,這個(gè)世界上的知識(shí)不是太少,而是太多。
一般的認(rèn)識(shí)是只要學(xué)習(xí)就必然有所得,所以對(duì)人生的影響一定的是正面的。但實(shí)際上這個(gè)想法是偏頗的,尤其是在軟件行業(yè)里。
在軟件行業(yè)中,這種風(fēng)險(xiǎn)之所以異常突出,就在于前面提到過(guò)的軟件的兩個(gè)特質(zhì):更迭速度快和子領(lǐng)域眾多。這兩個(gè)因素導(dǎo)致軟件相關(guān)的知識(shí)是爆炸性增長(zhǎng)。
而避免“失去焦點(diǎn)”這一陷阱的第一關(guān)鍵則是分類(lèi):對(duì)軟件開(kāi)發(fā)進(jìn)行分類(lèi),對(duì)軟件所關(guān)聯(lián)的知識(shí)也進(jìn)行分類(lèi),形成自己的大局觀和整體視圖。
前文曾經(jīng)提過(guò)集中對(duì)知識(shí)進(jìn)行分類(lèi),對(duì)軟件進(jìn)行分類(lèi)的方法,這里再補(bǔ)充一個(gè)對(duì)繞過(guò)這一陷阱有幫助的分類(lèi)方法,它來(lái)自《軟件成本估算:COCOMOII模型方法》這本書(shū)。
書(shū)里面把軟件分成了下面幾個(gè)類(lèi)別:
| 終端用戶編程(一般的應(yīng)用程序) | ||
| 應(yīng)用程序生成器(開(kāi)發(fā)工具等) | 應(yīng)用組裝 | 系統(tǒng)集成 |
| 基礎(chǔ)結(jié)構(gòu)(OS,DB等) | ||
在進(jìn)行分類(lèi)的同時(shí),書(shū)里還給出了一組數(shù)據(jù),即95%的人從事的是終端用戶編程。
這個(gè)分類(lèi)的意義在于,通過(guò)它我們可以認(rèn)識(shí)到每一類(lèi)別背后隱含的知識(shí)需求其實(shí)不一樣,程序員則要根據(jù)自己的目的設(shè)定焦點(diǎn)。再來(lái)看一個(gè)具體的例子:
算法領(lǐng)域中,最經(jīng)典的書(shū)籍恐怕是Donald?Knuth的《計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)》。對(duì)此書(shū)的評(píng)價(jià)已經(jīng)不止是高那么簡(jiǎn)單了,如:
這部多卷專(zhuān)著是公認(rèn)的對(duì)經(jīng)典計(jì)算機(jī)科學(xué)最權(quán)威的描述。幾十年來(lái),無(wú)論是學(xué)生、研究人員還是編程從業(yè)人員,本套書(shū)的前三卷都是他們學(xué)習(xí)編程理論、進(jìn)行編程實(shí)踐的寶貴資源。?
這是一套集所有基礎(chǔ)算法之大成的經(jīng)典之作,當(dāng)今軟件開(kāi)發(fā)人員所掌握的絕大多數(shù)計(jì)算機(jī)程序設(shè)計(jì)的知識(shí)都來(lái)源于此。?
—— Byte
那么是不是每個(gè)人都應(yīng)該把這書(shū)讀一讀?這書(shū)的前三卷大致有2000頁(yè),上班的人都讀通估計(jì)要1~2年這個(gè)樣子。
至少在我來(lái)看,答案是否定的。具體情況要看你做的是那類(lèi)軟件,你人生的下一步在那里而定。
假設(shè)說(shuō)一個(gè)人做的是終端用戶編程(比如:財(cái)務(wù)類(lèi)軟件),并且目標(biāo)也是在這個(gè)方向上繼續(xù)深造,那么你讀這書(shū)其實(shí)是在浪費(fèi)時(shí)間。
這是因?yàn)樵诮K端用戶編程上,自己去寫(xiě)算法的機(jī)會(huì)非常的少,甚至可能沒(méi)有。反倒是業(yè)務(wù)領(lǐng)域知識(shí)(會(huì)計(jì)知識(shí))、OO、設(shè)計(jì)模式、甚至于估算這些知識(shí)都比研究算法更有價(jià)值。?既然如此,那么從務(wù)實(shí)的觀點(diǎn)上看,為什么去學(xué)習(xí)不能在可見(jiàn)范圍內(nèi)創(chuàng)生價(jià)值的東西,而不是去學(xué)習(xí)立刻可以變現(xiàn)的東西。走極端的人會(huì)找出需要寫(xiě)算法的例子來(lái)反駁上述立論,但點(diǎn)不足以表征面,即使偶爾需要自己了解下算法,真就值得花那么多時(shí)間去學(xué)習(xí)么,為什么不盡可能借鑒現(xiàn)成的。
而在基礎(chǔ)結(jié)構(gòu)性的軟件開(kāi)發(fā)中,情形就不同,這時(shí)算法無(wú)疑是非常核心的東西。所以Google這類(lèi)公司的面試中往往非常強(qiáng)調(diào)算法。
這里最關(guān)鍵的就是聚焦,聚焦的根本則是要在限定時(shí)間范圍內(nèi)創(chuàng)生價(jià)值。
從方法上講,聚焦就是找到一個(gè)適合自己大小的區(qū)域,然后做深。才華橫溢的不論,一般來(lái)講,橫向穿越和縱向穿越都不太行,除非已經(jīng)基本窮盡當(dāng)前的領(lǐng)域。縱向穿越是指從底層穿到上層(想想開(kāi)發(fā)網(wǎng)絡(luò)協(xié)議的和用網(wǎng)絡(luò)協(xié)議的),橫向穿越則指橫跨太多的領(lǐng)域(想想從內(nèi)核驅(qū)動(dòng)跨越到信息管理軟件)。
其實(shí)如果一個(gè)人真的擁有無(wú)限的時(shí)間資源,那么什么時(shí)間點(diǎn)學(xué)習(xí)什么就變得不太關(guān)鍵。但這是不可能的,同時(shí)一個(gè)人的學(xué)習(xí)時(shí)間遠(yuǎn)不像想的那么充沛。這點(diǎn)會(huì)在后面探討。?
在清楚自己的目標(biāo)后,再配合前面提到的知識(shí)分類(lèi)地圖,那么避開(kāi)這一陷阱的幾率就大了很多。
學(xué)習(xí)與實(shí)踐相分離
喜歡看網(wǎng)文的很少有人會(huì)不知道起點(diǎn),不過(guò)估計(jì)很少有人注意過(guò)起點(diǎn)給小說(shuō)分類(lèi)的標(biāo)簽。在網(wǎng)文小說(shuō)里有很多個(gè)流派,其中一個(gè)叫做“扮豬吃虎”。這個(gè)流派的基本特征是很厲害的一個(gè)人要假裝很菜,最后在關(guān)鍵時(shí)刻力挽狂瀾。這個(gè)流派十分有人氣,大概僅次于“升級(jí)練功”,而遠(yuǎn)高于“重生”、“轉(zhuǎn)世”這類(lèi)的流派。
網(wǎng)文是絕對(duì)的市場(chǎng)導(dǎo)向,所以這個(gè)現(xiàn)象可以從側(cè)面說(shuō)明很多人喜歡“扮豬吃虎”或者說(shuō)潛意識(shí)里有著“扮豬吃虎”的情節(jié)。“扮豬吃虎”這事兒小說(shuō)里看著很爽,但挪到現(xiàn)實(shí)里來(lái)很容易讓人掉到學(xué)習(xí)陷阱里。更可怕的是,現(xiàn)實(shí)里有這種心思的人其實(shí)也還很多。
有時(shí)候會(huì)看到這樣一種現(xiàn)象:很多人自學(xué)的東西和工作中用的東西完全沒(méi)關(guān)系。比如:一邊用著C#做Web開(kāi)發(fā),一邊自己學(xué)習(xí)著C/C++做嵌入式。
這事并不一定不對(duì),只能說(shuō)非常危險(xiǎn),很可能會(huì)導(dǎo)致那樣都沒(méi)有高度。我們得承認(rèn)當(dāng)人生被錯(cuò)位的時(shí)候,往往只能這樣來(lái)改變命運(yùn),這是沒(méi)辦法,也是正確的。但首先要認(rèn)識(shí)到這樣做是相當(dāng)?shù)托У?#xff0c;低效到一定程度后對(duì)的事情也并不一定有結(jié)果。
CSDN曾經(jīng)做過(guò)一份薪酬統(tǒng)計(jì)(http://www.programmer.com.cn/5877/),這里面有三個(gè)與上述身在曹營(yíng)心在漢現(xiàn)象有關(guān)聯(lián)的結(jié)論:
- 一是73%的程序員對(duì)自己的薪資并不滿意。
- 二是各個(gè)主流開(kāi)發(fā)語(yǔ)言上的差異并沒(méi)有想的那么大。雖然C#開(kāi)發(fā)者中月收入小于5000元的比例最高,但5000~10000這個(gè)群體在主流開(kāi)發(fā)語(yǔ)言上相差并不大。
- 三是平均來(lái)看,收入增長(zhǎng)和工作年限正相關(guān)。當(dāng)然認(rèn)為到那個(gè)歲數(shù)工資自然就高了是很危險(xiǎn)的。
對(duì)薪資不滿意應(yīng)該是程序員希望跨界的一個(gè)原動(dòng)力,但收入和年限正相關(guān),與語(yǔ)言非正相關(guān)卻說(shuō)明單純從功利角度看跨界并不明智。因?yàn)榧僭O(shè)一個(gè)人Java語(yǔ)言用過(guò)三年,C#用過(guò)三年,總的來(lái)看收入水平更可能處在三年的水平上,而不是六年的水平上。
軟件是一種固化的思維,這就軟件開(kāi)發(fā)更多是一種實(shí)踐而非是一種理論。軟件開(kāi)發(fā)內(nèi)的很多領(lǐng)域,總體上看體現(xiàn)的是復(fù)雜而不是艱難,不論是前端開(kāi)發(fā)還是驅(qū)動(dòng)開(kāi)發(fā)。
講到到這里就有必要簡(jiǎn)單區(qū)分一下“復(fù)雜”和“艱難”。考試出題可以有兩種方法:一是每道題都不是很難,但題量很大;一是題量很少,但每道很難。從結(jié)果來(lái)看,兩類(lèi)考試方法下,得高分都并不容易,但其難度的來(lái)源卻并不相同,前者更多的體現(xiàn)為復(fù)雜,而后者卻體現(xiàn)為艱難。
在軟件行業(yè)里,除了一些專(zhuān)門(mén)的領(lǐng)域,比如圖像算法等,軟件開(kāi)發(fā)則更類(lèi)似于前者,所以經(jīng)過(guò)培訓(xùn)后大部分人都可以做軟件開(kāi)發(fā),進(jìn)入門(mén)檻并不高。
解決艱難問(wèn)題時(shí),天分很重要;解決復(fù)雜問(wèn)題時(shí),練習(xí)很重要。所以軟件開(kāi)發(fā)的學(xué)習(xí)過(guò)程中,實(shí)踐很重要,純理論知識(shí)的權(quán)重較低,當(dāng)然基本的算法復(fù)雜度還是要明白的。
這也就意味著脫離項(xiàng)目實(shí)踐的學(xué)習(xí)投入產(chǎn)出比往往會(huì)差。比如說(shuō):編程中常見(jiàn)的多線程問(wèn)題。如果單純從學(xué)習(xí)的角度看,創(chuàng)建線程本身并不復(fù)雜,掌握各種線程同步方法(事件、信號(hào)燈、互斥量等)也并不復(fù)雜。寫(xiě)簡(jiǎn)單例子的時(shí)候,也很少會(huì)出錯(cuò)。但一旦落到具體的場(chǎng)景下,雖然多線程的本質(zhì)沒(méi)變,但沒(méi)經(jīng)驗(yàn)的人幾乎一定會(huì)在涉及多線程的代碼上導(dǎo)致一會(huì)兒出,一會(huì)兒不出的問(wèn)題。
再比如說(shuō):你可能看了很多設(shè)計(jì)的書(shū),但從來(lái)沒(méi)有從頭到尾寫(xiě)過(guò)什么程序,總是在既有代碼上修修改改,或者只是完成幾千行代碼的小工具,那么你的設(shè)計(jì)知識(shí)是很難融匯貫通的,也還是無(wú)法很好的承擔(dān)大系統(tǒng)的設(shè)計(jì)工作。
這點(diǎn)上有一個(gè)旁證,根據(jù)統(tǒng)計(jì)最多的Bug是由新手導(dǎo)致的。這從側(cè)面說(shuō)明,能做和能做好之間的鴻溝需要大量的實(shí)踐來(lái)填平的。
在這樣一種前提下,期望先選個(gè)工作,再自己學(xué)習(xí),努力轉(zhuǎn)行這樣的想法是損失很大的。單純從增值效能上看,解決這點(diǎn)很簡(jiǎn)單,除非必須放棄當(dāng)前的工作領(lǐng)域,否則要以當(dāng)前參加的項(xiàng)目為根基展開(kāi)學(xué)習(xí),這樣才能比較好的調(diào)和學(xué)習(xí)和實(shí)踐。
而除非一個(gè)工作領(lǐng)域過(guò)于偏狹,大多時(shí)候在編程語(yǔ)言(C#→C/C++)、不同領(lǐng)域間(圖形處理→地理信息系統(tǒng)等)穿越損失可能更大。
至于如何在“博”與“專(zhuān)”間平衡,如何選中更適合自己的工作領(lǐng)域,將在后續(xù)章節(jié)里陸續(xù)談到。
碼路指南:在博與專(zhuān)之間取得平衡 平衡最合適
?“博”與“專(zhuān)”上的迷失
假設(shè)說(shuō)一個(gè)人的學(xué)習(xí)已經(jīng)聚焦,并且學(xué)習(xí)的內(nèi)容和自己實(shí)際參與的項(xiàng)目也相吻合,那么是不是就沒(méi)有問(wèn)題了?很不幸,答案仍然是否定的,在任何一個(gè)子領(lǐng)域里,仍然需要進(jìn)一步去考慮“博”與“專(zhuān)”的均衡。
對(duì)于軟件開(kāi)發(fā)而言,設(shè)計(jì)是再常見(jiàn)不過(guò),再簡(jiǎn)單不過(guò)的一個(gè)詞了。可如果把視角拔高一點(diǎn)就會(huì)發(fā)現(xiàn),單以設(shè)計(jì)而論仍然是一個(gè)不可窮盡的領(lǐng)域,我們可以快速掃描一下和設(shè)計(jì)相關(guān)的部分概念:
- 面向?qū)ο蠓治雠c設(shè)計(jì)
- 結(jié)構(gòu)化分析與設(shè)計(jì)
- 模型驅(qū)動(dòng)開(kāi)發(fā)
- 契約式編程
- 面向方面的開(kāi)發(fā)
- 基于組件的開(kāi)發(fā)
- 元編程
有些時(shí)候方法論也會(huì)和設(shè)計(jì)牽扯到一起:
- 測(cè)試驅(qū)動(dòng)開(kāi)發(fā)
- 敏捷軟件開(kāi)發(fā)
如果感覺(jué)這個(gè)還不夠多,那可以去Wiki上查編程的范式(paradigms)這個(gè)條目,那里列了47種范式,每個(gè)都和設(shè)計(jì)多少有點(diǎn)關(guān)系。
上述這些還只是說(shuō)了設(shè)計(jì),如果橫向展開(kāi),那么在特定領(lǐng)域中必然還會(huì)牽涉到框架的選用、輔助工具的使用等等。這也就意味著,從博的角度來(lái)看,即使是在設(shè)計(jì)這樣一個(gè)看似狹小的領(lǐng)域中仍然是沒(méi)邊界的。
與此同時(shí),把一個(gè)API研究的再透,也是低值人群,因?yàn)檫@種深入理解和單純會(huì)用某個(gè)API相比,從創(chuàng)造價(jià)值的角度看,差別不大。
這也就意味著對(duì)于大多數(shù)軟件開(kāi)發(fā)人員而言,要去尋找廣博與精專(zhuān)間的均衡點(diǎn):既不能閉上眼睛,也不能就用顯微鏡來(lái)看世界。而這一均衡點(diǎn)的價(jià)值則可用反木桶原理來(lái)說(shuō)明:木桶原理說(shuō)的是桶里的水是由最短的一塊板決定的,但考量人的價(jià)值時(shí)卻是適用于反木桶原理,即人的價(jià)值往往由最長(zhǎng)的一塊板決定。
考慮博和專(zhuān)的問(wèn)題不能離開(kāi)產(chǎn)品開(kāi)發(fā)進(jìn)行考慮,前面曾經(jīng)提到過(guò),產(chǎn)品開(kāi)發(fā)往往和公司的現(xiàn)金流綁定的更緊,能為現(xiàn)金流貢獻(xiàn)力量的技術(shù)才是有價(jià)值的技術(shù)。而產(chǎn)品開(kāi)發(fā)本身事實(shí)上對(duì)博和專(zhuān)的程度提出了最基本的要求,這種要求往往具有迭代的特質(zhì)。為了形象的說(shuō)明這一點(diǎn),這里舉一個(gè)通用的例子來(lái)進(jìn)行一點(diǎn)說(shuō)明:
在第一次跌代里,往往需要達(dá)到兩個(gè)最基本的目標(biāo)。第一個(gè)目標(biāo)是可以為產(chǎn)品貢獻(xiàn)自己力量,但代碼質(zhì)量普通。這個(gè)目標(biāo)如果達(dá)不到,一個(gè)人會(huì)失去自己的存在價(jià)值。
這時(shí)候最少需要了解某種語(yǔ)言(比如:C++)、某個(gè)平臺(tái)(比如:Windows)、某個(gè)IDE(比如:Visual?Studio)和某些業(yè)務(wù)相關(guān)的知識(shí)(比如:打印體系)。這個(gè)范圍可以盡可能圈的小點(diǎn),但用到的則要學(xué)透。比如:不管接觸到那個(gè)框架,都要去了解它的內(nèi)存機(jī)制、線程機(jī)制、異常處理組件構(gòu)建和國(guó)際化處理這些全局性的機(jī)制,而不能只是了解某個(gè)接口怎么用。
這并非是很高的要求,沒(méi)有這些就變成了“靠運(yùn)氣編程”,寫(xiě)完程序后還要祈禱他能跑起來(lái)。了解這些之后就可以負(fù)擔(dān)起部分開(kāi)發(fā)工作,否則的話只能做旁觀者,沒(méi)法參與到實(shí)際工作中來(lái)。
第二個(gè)目標(biāo)是把事情做好,并能負(fù)擔(dān)些層次更高的工作。這時(shí)候要比較深入的了解面向?qū)ο蟆⒔Y(jié)構(gòu)化方法、設(shè)計(jì)模式、理解設(shè)計(jì)原則,并能把它們用好。至少要能判定,這個(gè)程序?qū)懙暮?#xff0c;那個(gè)程序?qū)懙牟缓?#xff0c;同時(shí)面對(duì)需求能把工作進(jìn)行下去。
前兩個(gè)目標(biāo)是基礎(chǔ),一般來(lái)講學(xué)校中基礎(chǔ)打的越好,這個(gè)階段越短。達(dá)成這兩個(gè)基本目標(biāo)之后就可以結(jié)合情境來(lái)做進(jìn)一步的選擇,可以認(rèn)為這是博與專(zhuān)選擇上的第二次迭代。當(dāng)然這時(shí)候也要謹(jǐn)記不要和實(shí)踐分開(kāi)。
完成上述兩個(gè)層次后,可以有兩個(gè)方向可供選擇。
1. 可以進(jìn)一步考慮專(zhuān)的問(wèn)題,比如在特定領(lǐng)域里把知識(shí)深化下去。做驅(qū)動(dòng)就要理解操作系統(tǒng)的核心機(jī)制,做打印的就要了解頁(yè)面描述語(yǔ)言等,但這個(gè)時(shí)候要適當(dāng)警惕邊際效應(yīng)。
邊際效應(yīng)是說(shuō),你讓一畝地從畝產(chǎn)500斤增加到1000斤可能只需要投入100塊;讓畝產(chǎn)從1000增加到1500可能就需要200塊;讓畝產(chǎn)從1500增加到2000則需要400塊了。
一個(gè)典型的例子是對(duì)C++的學(xué)習(xí),C++是公認(rèn)的復(fù)雜,如果想做C++的律師,那么估計(jì)搞個(gè)10年可能夠資格了,但問(wèn)題是把時(shí)間都投在這個(gè)上,投入產(chǎn)出比可能不好。而停在那里合適則是個(gè)尺度問(wèn)題,大致來(lái)講是可以靠時(shí)間彌補(bǔ)的細(xì)節(jié)問(wèn)題,并不適合專(zhuān)到最底層。比如對(duì)于100萬(wàn)行的程序,預(yù)先花時(shí)間去了解每一處細(xì)節(jié),就有點(diǎn)過(guò)了。
2. 可以把博再推進(jìn)一步,比如:熟悉專(zhuān)門(mén)領(lǐng)域的專(zhuān)業(yè)知識(shí)、熟悉多種既存框架的特性、熟悉提高用戶體驗(yàn)的關(guān)鍵點(diǎn)。熟悉多種既存框架的特性的具體含義是:
設(shè)計(jì)某一種解決方案時(shí),首先要考慮的就是是自己開(kāi)發(fā)還是使用現(xiàn)有的模塊。一旦決定使用現(xiàn)有的模塊(包,框架等),那就要進(jìn)一步考慮究竟用那個(gè)。
做這類(lèi)工作時(shí),如果沒(méi)有一定廣博的知識(shí),做選擇的時(shí)候就會(huì)特別的艱難。
假使說(shuō)現(xiàn)在公司內(nèi)部要導(dǎo)入一套項(xiàng)目管理系統(tǒng),那么做決定的負(fù)責(zé)人必須至少考慮所有下面這些事情:
- 自己從頭造,還是用現(xiàn)成的做二次開(kāi)發(fā)?
- 用現(xiàn)成的,是用開(kāi)源產(chǎn)品,微軟的還是其他公司的?
- 用微軟的話,是用MS?Project還是基于SharePoint,還是混合?考慮License費(fèi)用的話真的劃算么?
- 用開(kāi)源產(chǎn)品,有這么多選項(xiàng)究竟導(dǎo)入那一個(gè)?
- 如果自己從頭造,那么是基于微軟的技術(shù),還是基于LAMP這樣的技術(shù)?
- 使用什么框架?
- 如果要做,用什么語(yǔ)言?
一個(gè)人很難精通上面所有的領(lǐng)域,但當(dāng)做選擇時(shí),完全沒(méi)有概念也是災(zāi)難性的。
此外,考慮博與專(zhuān)平衡點(diǎn)時(shí)似乎有一種特例,鉆研特定算法的人,從一開(kāi)始就只往專(zhuān)的方向發(fā)展,并不會(huì)考慮其他。比如:鉆研TTS的人,可能幾十年如一日只要專(zhuān)注于TTS就完了。
至于具體選擇那個(gè)方向,則要根據(jù)自身情形來(lái)定。總的原則是要以當(dāng)下工作為根基,以實(shí)用為目的甄選各種知識(shí),并追求平衡點(diǎn)。
大致上講,期望做技術(shù)專(zhuān)家的更適合前一個(gè)方向,而期望做技術(shù)管理的則更適合后一類(lèi)方向。
學(xué)習(xí)軟件工程的時(shí)機(jī)與必要性
簡(jiǎn)單來(lái)講越是沒(méi)實(shí)踐經(jīng)驗(yàn)的人越不適合學(xué)習(xí)軟件工程,越需要規(guī)劃整體把握全局的時(shí)候越需要學(xué)習(xí)軟件工程。
軟件工程中覆蓋的元素非常繁雜,可以有管理、流程、開(kāi)發(fā)模型、估算、分析設(shè)計(jì)方法等。這無(wú)疑會(huì)把知識(shí)面擴(kuò)展的很寬,一旦沒(méi)有根底,就很容易變成紙上談兵,夸夸其談。
在眾多軟件相關(guān)的知識(shí)中,軟件工程絕對(duì)是很特別的一個(gè)。很多人很鄙視軟件工程,說(shuō):我一看到軟件工程的書(shū)就直接略過(guò);與之相對(duì)應(yīng),很多人很推崇軟件工程,會(huì)花很大的心思去研究敏捷、CMMI等。
剛?cè)肼殘?chǎng)的程序員大致上是討厭軟件工程的,因?yàn)檫@東西離自己的實(shí)踐有點(diǎn)遠(yuǎn),并且主要是添加束縛。但既然更加復(fù)雜紛繁的歷史都可以總結(jié)出規(guī)律,忽視軟件開(kāi)發(fā)的內(nèi)在規(guī)律無(wú)疑的對(duì)有志于成為管理者的人是不利的。
真要學(xué)習(xí)軟件工程,不太適合從抽象層次很高的教科書(shū)開(kāi)始,而適合從《代碼大全》這樣與實(shí)際關(guān)聯(lián)比較緊密的書(shū)籍開(kāi)始。
在國(guó)內(nèi)軟件工程的落地似乎始終困難,軟件工程相關(guān)名詞始終在不停的變換(ISO,CMMI,敏捷等),但實(shí)際能落地起作用的卻不多,這最終導(dǎo)致了一種吊詭的局面:剛對(duì)一個(gè)絕望,就開(kāi)始對(duì)新的一個(gè)報(bào)以希望,并在這兩個(gè)簡(jiǎn)單的步驟上做無(wú)限循環(huán)。這種狀況也許有其更深層次的原因,比如生存壓力過(guò)于強(qiáng)大導(dǎo)致工程力量的長(zhǎng)遠(yuǎn)價(jià)值被漠視,進(jìn)而使方法論并不為解決現(xiàn)實(shí)問(wèn)題而存在,而是為了證書(shū)而存在。很難據(jù)此就說(shuō)軟件工程毫無(wú)價(jià)值。
碼路指南:別錯(cuò)過(guò)人生中學(xué)習(xí)的黃金時(shí)期
保持知識(shí)更新
錯(cuò)過(guò)人生中的好時(shí)機(jī)
沒(méi)畢業(yè)的程序員或者剛畢業(yè)的程序員往往感覺(jué)空余時(shí)間比較充沛,還很苦惱不知道如何打發(fā)時(shí)間,但實(shí)際上一個(gè)人一生中可以用于充電的時(shí)間遠(yuǎn)比想的少。一旦錯(cuò)過(guò)時(shí)機(jī),往往悔之莫及。
對(duì)于大多數(shù)人而言,人生就像個(gè)模板,小處還有偏差,大處卻基本相同。
- 20~30歲這個(gè)階段可以講是黃金時(shí)期,這個(gè)階段里,家庭負(fù)擔(dān)較小,可以自由支配的時(shí)間較多。當(dāng)然撞到了很特別的、需要瘋狂加班的公司只能另算。
- 30歲之后因?yàn)橥尥蕹錾?#xff0c;家庭上的時(shí)間開(kāi)銷(xiāo)增加,個(gè)人可支配時(shí)間變少。其中很大一部分人還有很大可能會(huì)面對(duì)電視劇里常說(shuō)的婆媳矛盾,讓你每天心緒不寧。
- 40歲之后,家庭瑣事會(huì)進(jìn)一步增加,典型的上有老下有小。實(shí)在運(yùn)氣不好的自己也會(huì)生點(diǎn)病---頸椎病、腰間盤(pán)突出、胃病大概可以入選程序員的三大職業(yè)病。
- 50歲之后,時(shí)間上會(huì)再次解脫,但可惜的是自己也老了,時(shí)機(jī)不在。
如果把人生按照年齡畫(huà)一條拋物線的話,40歲左右一個(gè)人可以達(dá)到的人生的頂點(diǎn),未來(lái)再突破的幾率則變小。從歷史人物來(lái)看,大器晚成的不是沒(méi)有,但真的很少。
用心觀察就會(huì)發(fā)現(xiàn),招聘啟示里經(jīng)常會(huì)注明年齡要在35周歲以下或者40周歲以下,除非是招聘高層。這反過(guò)來(lái)意味著如果沒(méi)有到高層,人生會(huì)在40之前定型,之后有下滑危險(xiǎn)(如遭遇不景氣、公司倒閉等)。對(duì)程序員而言,這種風(fēng)險(xiǎn)尤其的大,因?yàn)楹芸赡苣阈量嗾莆盏闹R(shí)體系被更迭掉了。
學(xué)習(xí)本身無(wú)疑的是需要順應(yīng)這種自然規(guī)律的。
很多人很大的一個(gè)錯(cuò)誤在于,在黃金時(shí)期,沒(méi)做什么積累,就顧得享受生活了,而一旦意識(shí)到積累的必要性時(shí),卻又受困于諸多瑣事而欲振乏力,最終人生高度有限,并迅速走低。這就是現(xiàn)代程序員版的“少壯不努力,老大徒傷悲”。
基本上講,35歲以前要把需要花大量時(shí)間,比較硬的技能,學(xué)習(xí)曲線陡的技能掌握,具備工作所需要的所有主要技能,而35歲之后則主要關(guān)注知識(shí)的更新和某些軟技能。
學(xué)習(xí)時(shí)添水戰(zhàn)術(shù)效率真的很差,每次點(diǎn)一根火柴燒水,一億年水也燒不開(kāi)一壺。同時(shí),比較硬的技能(比如:Donald?Knuth的《計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)》)往往是需要大塊時(shí)間投入的,但年紀(jì)越大時(shí)間越呈現(xiàn)為碎片化,越難搞定硬的知識(shí) —— 先天就容易造就添水戰(zhàn)術(shù)。比較軟的技能,則可以用碎片時(shí)間來(lái)學(xué)習(xí),比如:提高PPT的制作水平,提高表達(dá)能力。
如果能夠安排好自己的時(shí)間和軟硬知識(shí)的關(guān)系,那么就可以在特定基礎(chǔ)上做積累,小步前進(jìn),使自己的價(jià)值越來(lái)越高。從這個(gè)角度看,年輕絕對(duì)是一種債務(wù),大多數(shù)人必須在他沒(méi)完全結(jié)束前,還掉所欠的東西。
那么具體來(lái)講那些東西是比較硬的,要在35歲前搞定呢?這因目標(biāo)而異,但下面這些項(xiàng)目應(yīng)該具有非常高的通用性:
- 精通一門(mén)最常用的語(yǔ)言
- 了解一個(gè)最常用平臺(tái)的基本機(jī)制,比如:內(nèi)存管理、線程機(jī)制等
- UML圖和面向?qū)ο蠓治鲈O(shè)計(jì)方法
- 設(shè)計(jì)原則,如:職責(zé)單一等
- 設(shè)計(jì)模式
- 《代碼大全》里講的一切
- 精讀一個(gè)知名的,但有點(diǎn)規(guī)模的程序。這點(diǎn)上要感謝開(kāi)源項(xiàng)目給我們提供了這么多優(yōu)秀程序。但要謹(jǐn)防好高騖遠(yuǎn),動(dòng)輒挑戰(zhàn)Linux內(nèi)核,精讀是關(guān)鍵。
- 累積一定的代碼量,比如:獨(dú)立的完整做過(guò)一個(gè)數(shù)萬(wàn)代碼行的東西。這里的關(guān)鍵是完全自己打造,一定不要拷貝粘貼。
- 掌握基本算法和數(shù)據(jù)結(jié)構(gòu)(可以不自己寫(xiě),但至少要知道其復(fù)雜度和區(qū)別)
- 養(yǎng)成一種清晰的編碼風(fēng)格
- 有自己的專(zhuān)業(yè)(金融、高并發(fā)網(wǎng)站,圖像處理,TTS等)
學(xué)習(xí)英語(yǔ)的時(shí)機(jī)和必要性
總的來(lái)看,程序員學(xué)習(xí)英語(yǔ)是一項(xiàng)投資回報(bào)率相對(duì)比較好的投入。從目標(biāo)上來(lái)看,程序員未必一定要口語(yǔ)流利,但最低要達(dá)到閱讀英文資料沒(méi)有障礙的程度。這里面有一個(gè)微妙的事情,一旦英語(yǔ)閱讀問(wèn)題較大,查找問(wèn)題會(huì)習(xí)慣用百度,這天然會(huì)限制一個(gè)人的視野。不是說(shuō)百度自身有多不好,而是說(shuō)英語(yǔ)的世界里有著更多更精彩的內(nèi)容。
不管喜歡不喜歡,我們必須承認(rèn)一種現(xiàn)實(shí),在IT的世界里英語(yǔ)是一種世界語(yǔ),一方面是由于美國(guó)公司的強(qiáng)大,一方面則是由于開(kāi)源選擇了英語(yǔ)。這最終導(dǎo)致IT世界里的新動(dòng)向、解決問(wèn)題的小技巧、網(wǎng)站的架構(gòu)等等都要到英語(yǔ)的世界里去找。在StackOverlow很容易找到各種小問(wèn)題的答案,在Quora則很容易找到各種網(wǎng)站的架構(gòu)。
從學(xué)習(xí)時(shí)機(jī)來(lái)看,這件事情特別應(yīng)該在大學(xué)里面搞定,如果不行至少也要在畢業(yè)1~2年內(nèi)達(dá)到閱讀無(wú)障礙的程度,當(dāng)然希望加入外企還需要額外的付出。從學(xué)習(xí)方法來(lái)看,學(xué)習(xí)外語(yǔ)真沒(méi)什么特別的竅門(mén),堅(jiān)持并投入時(shí)間即可。
停止知識(shí)更新
對(duì)程序員的增值而言,人生里最大的陷阱也許是為安全的假象所欺騙而徹底的放松自己。這種狀況在生存環(huán)境比較惡劣的情形下不太會(huì)發(fā)生,但在壟斷企業(yè)或某一領(lǐng)域中絕對(duì)領(lǐng)先的企業(yè)里則容易滋生。發(fā)現(xiàn)自己是否停止知識(shí)更新了并不困難,比如:一年一本書(shū)沒(méi)看,一年一點(diǎn)新知識(shí)沒(méi)接觸,一年中工作負(fù)荷基本不滿等都可以成為一種信號(hào)。
這真的是溫水煮青蛙,一旦到了三十幾歲,并在這種環(huán)境中呆習(xí)慣了,那么再想跳出來(lái),基本沒(méi)可能。唯一能做的事情是,祈禱公司不要掛掉,公司也不要來(lái)場(chǎng)運(yùn)動(dòng),進(jìn)行人員的大換血。孔夫子說(shuō):日當(dāng)三省吾身,這是很有必要的,至于認(rèn)識(shí)危險(xiǎn)后能否做點(diǎn)什么,那就是事在人為了。
1. 技術(shù)人員的知識(shí)更新
接觸一個(gè)新的崗位后,大致要經(jīng)歷一個(gè)學(xué)習(xí)并逐漸勝任的過(guò)程,這個(gè)時(shí)間段里大多數(shù)人的學(xué)習(xí)熱情是很高的。一旦基本勝任之后,事情就有了變化。
很大一部分人可能會(huì)感覺(jué),反正工作也就用到這么些知識(shí),學(xué)習(xí)其他的也用不上,因此開(kāi)始把自己封閉起來(lái),不太看書(shū),不太看技術(shù)新聞。
這其實(shí)很危險(xiǎn),因?yàn)檫@種做法等于把自己綁死在當(dāng)前這份工作上。而任何一個(gè)產(chǎn)品都有自己的生命周期,一旦一個(gè)產(chǎn)品的生命周期結(jié)束時(shí),碰巧其所用的技術(shù)也已經(jīng)過(guò)時(shí),那么當(dāng)事人就會(huì)很尷尬。因?yàn)楫a(chǎn)品可以結(jié)束,生活卻還得繼續(xù)。
這里面一個(gè)非常經(jīng)典的例子是MFC。微軟的這款產(chǎn)品的歷史非常悠久,從1992年發(fā)布到2012年幾近存在了20年時(shí)間。隨著90后程序員的逐漸出現(xiàn),馬上這款技術(shù)就要變得比程序員的年紀(jì)還要大了。
即使到今天,很多桌面應(yīng)用仍然是基于MFC開(kāi)發(fā)的,這可以通過(guò)查看程序包的dll依賴來(lái)很容易的進(jìn)行驗(yàn)證。MFC是一個(gè)很大的池子,有深度、有歷史。想把MFC的類(lèi)繼承關(guān)系、消息機(jī)制、框架結(jié)構(gòu)、RTTI、序列化都搞清楚還是要很花一點(diǎn)時(shí)間的。
現(xiàn)在我們假設(shè)一款龐大的企業(yè)應(yīng)用是基于MFC開(kāi)發(fā)的,一個(gè)程序員也通過(guò)幾年的努力了解了MFC,了解了應(yīng)用本身,并可以負(fù)擔(dān)起B(yǎng)ug修正,新功能追加等任務(wù)了。
接下來(lái)這個(gè)程序員似乎沒(méi)什么好學(xué)的了。因?yàn)镸FC的更新幾乎已經(jīng)停滯,因此對(duì)MFC的學(xué)習(xí)幾乎不需要花太多的時(shí)間了。現(xiàn)有代碼也理清楚了,也不需要再花很多時(shí)間學(xué)習(xí)了。現(xiàn)有程序也比較好的滿足了企業(yè)的需求,推倒重來(lái)的可能性幾乎沒(méi)有。
那這個(gè)時(shí)候這個(gè)程序員不需要學(xué)習(xí)了么?答案一定是否定的。這里面蘊(yùn)藏著一個(gè)天大的矛盾。
從企業(yè)的角度看,一定是需要一個(gè)團(tuán)隊(duì)來(lái)維持這個(gè)程序的開(kāi)發(fā)的。但從個(gè)人的角度看,如果把所有的青春都耗費(fèi)在老技術(shù)上,那么一旦老技術(shù)退出歷史舞臺(tái),個(gè)人該何去何從?
還是上面的例子,假設(shè)說(shuō)一個(gè)人持續(xù)投入在這類(lèi)開(kāi)發(fā)上,當(dāng)他45歲的時(shí)候,當(dāng)前產(chǎn)品生命周期結(jié)束,世界變的只有移動(dòng)開(kāi)發(fā)和云端開(kāi)發(fā),那么只擅長(zhǎng)MFC的他該何去何從?
如果真的如此,這個(gè)人就被逼到了死角里,人生很可能產(chǎn)生巨大滑落。所以一定不能認(rèn)為所學(xué)足夠而停止技能的更新與學(xué)習(xí)。
從具體應(yīng)對(duì)措施來(lái)看,一是要參照知識(shí)的地圖,橫向擴(kuò)展知識(shí)的廣度,比如不只要盯著代碼,也要了解業(yè)務(wù);不只關(guān)注開(kāi)發(fā)也關(guān)注一點(diǎn)估算;二是提升可流動(dòng)性比較好的東西的掌握程度,比如:面向?qū)ο蠓治雠c設(shè)計(jì),這樣跨越到其他技術(shù)時(shí)就能夠比較平緩的進(jìn)行過(guò)渡。三是要爭(zhēng)取輪換崗位,爭(zhēng)取多種實(shí)踐機(jī)會(huì)。
2. 管理者的知識(shí)更新
到現(xiàn)在為止大部分人認(rèn)同,管理者是需要懂技術(shù)的。從邏輯上看“懂”基本上是不瞎指揮的前提,所以這可以稱(chēng)為中國(guó)版的“現(xiàn)場(chǎng)主義”,估計(jì)爭(zhēng)議不大。
那關(guān)鍵問(wèn)題就是究竟要“懂”到什么程度?
如果說(shuō)兩個(gè)人,一個(gè)選擇了管理方向,一個(gè)選了技術(shù)方向。接下來(lái)要求管理方向上的人技術(shù)水平要和技術(shù)方向的一樣,那么除非這個(gè)人特別天才,否則不太可能。正像前面所說(shuō),這是由于這兩個(gè)方向的“Key”不同所造成的。
如果把目標(biāo)設(shè)定為確保最終產(chǎn)品的成功,同時(shí)假設(shè)管理者有更高的決策權(quán),那么管理者必須在下面這些方面有技術(shù)感覺(jué)。
從做產(chǎn)品來(lái)看,要想成功,有兩個(gè)關(guān)鍵維度需要同時(shí)進(jìn)行把握,一是產(chǎn)品的概念完整性的把握;一是用合適的手段去實(shí)現(xiàn)這個(gè)產(chǎn)品。
前一個(gè)話題很老,《人月神話》就有提及,但實(shí)踐中卻總是被人忘記。好的產(chǎn)品必須貫徹某一種統(tǒng)一意志,iPhone、微信又重新驗(yàn)證了這一個(gè)老的原則。?機(jī)械拼湊的產(chǎn)品雖然融合了很多人的想法,但往往是平庸的,并且在項(xiàng)目執(zhí)行過(guò)程中,往往是出錯(cuò)的根源。很像是雖然有法律,但每個(gè)人有自己的理解,各行其是這樣一個(gè)狀態(tài)。這種概念完整性是管理者第一個(gè)需要有所把握的事情,其次就是解決如何去構(gòu)建產(chǎn)品這個(gè)問(wèn)題。為達(dá)成這一目標(biāo)在下面這幾個(gè)方面上,管理者要有自己的理解,至少要有自己的原則:
下面簡(jiǎn)單列舉幾個(gè)比較關(guān)鍵的考量,這和前面論及的如何往博的方向發(fā)展有點(diǎn)重疊:
- 使用現(xiàn)有產(chǎn)品還是自己開(kāi)發(fā)
- 比如:那些模塊適合自己搞定而那些購(gòu)入就可以了。購(gòu)入的時(shí)候要遵循怎么樣的標(biāo)準(zhǔn)去選擇。
- 使用那種平臺(tái)技術(shù)
- 比如:是使用微軟的技術(shù),還是開(kāi)源的技術(shù)。
- 現(xiàn)行架構(gòu)是否可以達(dá)成產(chǎn)品目標(biāo)
- 比如:在硬件加軟件可以同時(shí)支撐的并發(fā)數(shù)目。
- 代碼可維護(hù)性如何約束
- 這要求必須熟練掌握一些原則性的東西,比如:什么信息隱藏、正交分解、抽象是否充分等。以及一些無(wú)歧義指標(biāo),比如:圈復(fù)雜度,單元測(cè)試的收益平衡。
- 那些環(huán)節(jié)必須固化為流程,那些一定要團(tuán)隊(duì)自由決定
- 比如文檔化要到什么程度才合適,不同階段間什么是必須的輸入輸出。
- ?...?...
假設(shè)說(shuō)有人不這么認(rèn)為,而是在做了管理后,表現(xiàn)出足夠的惰性,不再持續(xù)更新自己的知識(shí)體系了,那么會(huì)發(fā)生什么事情?
這時(shí)候會(huì)很可能會(huì)管理倒置。即管理者是名義上的上級(jí),但基本失去對(duì)現(xiàn)場(chǎng)的把握,所有的決策完全依賴于下屬。得力下屬不在,各種決定就只能靠瞎蒙,最終變成只會(huì)溝通的管理者---即使被食人族吃了也不會(huì)有人注意到,因?yàn)榇嬖趦r(jià)值已經(jīng)被無(wú)限稀釋,變成了一個(gè)象征性的符號(hào)。也可能會(huì)和下屬爆發(fā)激烈沖突。因?yàn)檫@類(lèi)管理者沒(méi)有自己的立場(chǎng),上面有任務(wù)只能下壓。結(jié)果同實(shí)際情況偏離萬(wàn)里,不具有可實(shí)現(xiàn)性,這類(lèi)管理者無(wú)法對(duì)自己的上司陳述,也就只能向下轉(zhuǎn)移壓力。
不管是那種,一旦到這種地步,其實(shí)是趨于失敗,只能祈禱食人族不要來(lái)。
為什么中層管理者也要堅(jiān)持知識(shí)更新?
在IT行業(yè)流傳著一個(gè)很有名的關(guān)于食人族的笑話,這個(gè)笑話說(shuō)的是:
兩個(gè)食人族的人應(yīng)聘進(jìn)了某家大公司,公司人事主管知道這兩個(gè)這伙每天都要吃人,于是警告他們:“如果你們膽敢在公司吃一個(gè)人,你們就會(huì)立即被炒掉!”兩個(gè)食人族唯唯喏喏地答應(yīng),表示絕不會(huì)在公司吃人。兩個(gè)月過(guò)去了,公司平安無(wú)事。
突然有一天,公司發(fā)現(xiàn)負(fù)責(zé)打掃公司衛(wèi)生的清潔工不見(jiàn)了。于是人事主管非常氣憤,找來(lái)兩個(gè)食人族怒斥,并當(dāng)場(chǎng)炒掉了他們。出了公司大門(mén),一個(gè)食人族馬上對(duì)另一個(gè)抱怨起來(lái):“我一直警告你不要吃有在做事的人,你就是不聽(tīng)!我們兩個(gè)月來(lái)每天吃一個(gè)經(jīng)理,沒(méi)人發(fā)現(xiàn)。你看現(xiàn)在吃了清潔工,他們馬上就發(fā)現(xiàn)了!你真是個(gè)豬!”
這個(gè)笑話嘲諷的是某些大公司大企業(yè)病發(fā)作,人浮于事。大企業(yè)病的成因很難一下子說(shuō)的清楚,但結(jié)果卻比較明顯,一定會(huì)導(dǎo)致較多人成為中層管理者。如果說(shuō)成功的企業(yè)天然有感染大企業(yè)病的趨勢(shì),那無(wú)疑的中層管理者也天然有著膨脹趨勢(shì)。從個(gè)人角度看,成為被食人魔吃掉也沒(méi)有人在意的經(jīng)歷并非是什么好事,因?yàn)檫@意味著存在價(jià)值減弱,也不需要什么知識(shí)更新。一旦面臨裁員這類(lèi)事情,這個(gè)人很可能已經(jīng)失去了面對(duì)殘酷競(jìng)爭(zhēng)的能力。
碼路指南:物質(zhì)驅(qū)動(dòng)與興趣驅(qū)動(dòng)
編程驅(qū)動(dòng)力是什么?
在國(guó)內(nèi)普遍有一個(gè)很特別的現(xiàn)象:高中像打了雞血一樣使勁學(xué)習(xí)的人,到了大學(xué)往往會(huì)放松下來(lái),跑去享受生活了,大學(xué)里打游戲、打牌、臨考沖刺的大有人在。
這倒也在情理之中,高中不學(xué)真考不上大學(xué),考不上大學(xué)真就完蛋了;大學(xué)不學(xué),只要能畢業(yè),大致還能找到工作。但人生是場(chǎng)長(zhǎng)跑,稍一停頓,后面的人就嗖嗖的竄到你前面了,雖然你不一定能看得到到底是誰(shuí)。這很像龜兔賽跑,但為了避免不成為那只兔子,單靠口號(hào)層次的主觀意愿是不行的。
停下來(lái)的人其實(shí)很多,有的人停在了大學(xué)里,有的人停在了小有成績(jī)之后,而為了持續(xù)前行而成為高手,那首先要給自己找個(gè)動(dòng)力源,而要想找到動(dòng)力源,那么首先要拷問(wèn)自己的內(nèi)心,知道自己為什么上山學(xué)藝,為什么要成為高手。
純物質(zhì)上的驅(qū)動(dòng)力
如果回看歷史就會(huì)發(fā)現(xiàn)歷史記下名字的人(孔子、商鞅、漢武帝、李白、王安石等等),往往具有一個(gè)共通的特征:他們具有澎湃的生命力,絕對(duì)不是每天混混日子的人,雖然生命力的表現(xiàn)往往不同。
這似乎和好人壞人,理想高尚與否無(wú)關(guān),必須的只是這個(gè)人要有所執(zhí)著,并持續(xù)的運(yùn)用你的腦力、體力去做某件事情。而一個(gè)人要想有所執(zhí)著,那就必須有一種持續(xù)存在的驅(qū)動(dòng)力。
在這個(gè)時(shí)代里,對(duì)于大多數(shù)人而言第一驅(qū)動(dòng)力無(wú)疑是物質(zhì)及金錢(qián),但這似乎只可以做起點(diǎn)而不能做終點(diǎn)。這就和梁山好漢一樣,最開(kāi)始沒(méi)準(zhǔn)只是為了大碗喝酒,大塊吃肉,可聚了義之后,則要考慮替天行道,除暴安良這類(lèi)比較高端一點(diǎn)的事情了。
組織行為學(xué)中的研究佐證了這一結(jié)論,美國(guó)人的研究顯示,當(dāng)年薪超過(guò)40000美元后,薪資將不再是工作滿意度的核心支撐因素。在中國(guó)估計(jì)相差不大,20萬(wàn)以上年薪的人,往往需要尋找其他的驅(qū)動(dòng)力。否則這個(gè)時(shí)候程序員會(huì)處在一種瓶頸狀態(tài):基本物質(zhì)需求得到滿足(比如:住房、汽車(chē)等),但更高一層的物質(zhì)需求又很不現(xiàn)實(shí)(比如:別墅、游泳池等)。
這個(gè)時(shí)候單純的物質(zhì)支撐會(huì)讓生命力變的萎靡,人也就會(huì)變得無(wú)可無(wú)不可,工作中即不會(huì)很高興,也不會(huì)很不高興,每天也只是例行公事。接下來(lái)人生就會(huì)開(kāi)始下滑,倒霉的話還會(huì)失業(yè)。等到困境真的來(lái)了,再想振作,卻沒(méi)那份兒心力了。
在2012年11月,新聞報(bào)導(dǎo)百度總裁李彥宏在公司內(nèi)呼喚狼性,排斥小資。具體來(lái)講,呼喚的是敏銳的嗅覺(jué)、不屈不撓奮不顧身的進(jìn)攻精神,群體奮斗,排斥的是信奉工作只是人生的一部分,不思進(jìn)取,追求個(gè)人生活的舒適的態(tài)度。這事情的是非很復(fù)雜,這里略過(guò)不提,反倒是百度這一行動(dòng)本身說(shuō)明公司里確實(shí)容易存在一種生命力萎靡的狀態(tài),這點(diǎn)甚至讓CEO忍無(wú)可忍。
興趣的力量
如果說(shuō)純物質(zhì)上的驅(qū)動(dòng)有一定局限性,那么興趣又如何?
當(dāng)問(wèn)及一個(gè)人為什么從事軟件開(kāi)發(fā)時(shí),很多人會(huì)回答是:興趣。但人們這么表達(dá)的時(shí)候可能并沒(méi)有意識(shí)到常說(shuō)的這種興趣是一個(gè)不怎么靠得住的驅(qū)動(dòng)力。這種興趣往往是一種一時(shí)的好奇心,而不是與自己性格特質(zhì)相契合,可以用來(lái)給生命解悶的那種興趣。
總的來(lái)看,興趣可以分為兩個(gè)層次:一個(gè)是淺層次的。比如看到一個(gè)游戲比較酷可能想玩玩,看別人寫(xiě)博客,自己也寫(xiě)幾篇;另一種則是深層次的。比如:愛(ài)因斯坦你不讓他思考,他可能感覺(jué)活著就沒(méi)什么意思了。
找到后一種興趣的人是幸運(yùn)的,但大多數(shù)人并沒(méi)有這么幸運(yùn),所以一般所說(shuō)的興趣都是前一種,尤其是即將畢業(yè)和剛畢業(yè)不久的人。
真正做軟件產(chǎn)品的時(shí)候,牽涉的往往是大量比較繁瑣的細(xì)節(jié),大多時(shí)候臟活、累活、苦活遠(yuǎn)比看上去風(fēng)光的活,有趣的活多。具體一點(diǎn)講就是,可能需要面對(duì)比較垃圾的既存代碼,可能要面對(duì)不怎么負(fù)責(zé)的同事,無(wú)理的需求變更,十分緊張的日程等。除非你做的是很高端的研究。
這些東西本身并非是很有趣的,它們很快會(huì)讓初始時(shí)的一點(diǎn)夾雜著好奇心的,淺層次的興趣消耗殆盡。最初印象和實(shí)際的偏差很可能是造成某些程序員提前退場(chǎng)的一個(gè)主要原因。
這種原生態(tài)的興趣消失后,又沒(méi)有其他支撐點(diǎn)的話,人就越來(lái)越會(huì)像機(jī)器人,并可能會(huì)厭惡自己的生活。因?yàn)槊刻齑蟛糠謺r(shí)間都花在工作上,而工作本身又是如此的無(wú)聊。所以故事到興趣這里并沒(méi)有結(jié)束,還需要繼續(xù)找尋驅(qū)動(dòng)力。
當(dāng)然很可能以興趣為出發(fā)點(diǎn)而找尋其他,最終反倒又回到起點(diǎn),這是人生常態(tài),倒不值得驚訝。
興趣、體力與智力
人和人之間的體力往往相差不大,但智力的差異卻往往不可以道里計(jì)。所以一個(gè)經(jīng)驗(yàn)豐富的老農(nóng)半天種一畝地,一個(gè)不太熟練的忙和一天大致也可以搞定一畝地。
純體力上不太拉得開(kāi)人的差距。而智力則不一樣,人的智力容易有數(shù)量級(jí)上的差異。前蘇聯(lián)著名物理學(xué)家、諾貝爾獲得者朗道將世界上的物理學(xué)家從一級(jí)到五級(jí)分為5個(gè)層次,每個(gè)層次的貢獻(xiàn)差一個(gè)數(shù)量級(jí)。朗道認(rèn)為自己是2.5級(jí),獲得諾貝爾獎(jiǎng)后,才把自己生為1.5級(jí)。就不用再考慮5級(jí)的物理學(xué)家和普通人的差異了。
我個(gè)人感覺(jué),越是靠近體力一端的工作越不可能興趣驅(qū)動(dòng),而越靠近智力一端的工作越可能是純興趣驅(qū)動(dòng)。恰如我很難相信干重體力活的人是因?yàn)榕d趣一樣,我也很難相信愛(ài)因斯坦不去做以色列總統(tǒng)而選擇繼續(xù)研究物理不是因?yàn)榕d趣。
程序員的工作在這兩個(gè)極端間,所占跨度較大,但產(chǎn)品開(kāi)發(fā)也許是中間偏左,完全的興趣驅(qū)動(dòng)估計(jì)很難。即使是興趣驅(qū)動(dòng),也不是我喜歡游泳,我喜歡吃小籠包這個(gè)層面的興趣。
物質(zhì)驅(qū)動(dòng)和興趣驅(qū)動(dòng),看起來(lái)貌似都不是特別靠譜,那么什么驅(qū)動(dòng)力才能使人生永動(dòng)呢?
碼路指南:保持內(nèi)心的青春與理想
理想驅(qū)動(dòng)編程
如果說(shuō)物質(zhì)和單純的興趣不足以成為一種長(zhǎng)久的驅(qū)動(dòng)力,那么無(wú)疑的我們需要繼續(xù)去尋找一種可以使人生永動(dòng)的勢(shì)能。
很多一部分程序員其實(shí)是認(rèn)識(shí)到了技術(shù)更迭這樣的特征時(shí)刻在掏空自己立足的根基的,但很多的人在這種時(shí)候并不是采取積極的態(tài)度去面對(duì),而是會(huì)試圖欺騙自己,給自己一種安全的假象。比如可能會(huì)告訴自己,反正公司短時(shí)間沒(méi)問(wèn)題,把手里的事做好就行了。讓自己那么辛苦干什么?這在某些有點(diǎn)年紀(jì)生活相對(duì)安穩(wěn)的程序員身上比較常見(jiàn),這很可怕,有時(shí)候會(huì)把自己逼到死角里。擺脫這種狀況當(dāng)然需要一定的危機(jī)意識(shí),但更關(guān)鍵的是要找到一種使人生永動(dòng)的勢(shì)能。
據(jù)說(shuō)美軍的麥克阿瑟將軍非常喜歡一篇名為《青春》的散文,在占領(lǐng)日本期間日本人在美軍總部發(fā)現(xiàn)了這篇散文,于是這篇文章很快變得很流行,在商界大佬(如松下幸之助等)間流傳甚廣。那《青春》這篇散文說(shuō)的究竟是什么呢?我們來(lái)一起看一下:
青春不是年華,而是心境;青春不是桃面、丹唇、柔膝,而是深沉的意志,恢宏的想象,炙熱的戀情;青春是生命的深泉在涌流。?
青春氣貫長(zhǎng)虹,勇銳蓋過(guò)怯弱,進(jìn)取壓倒茍安。如此銳氣,二十后生而有之,六旬男子則更多見(jiàn)。年歲有加,并非垂老,理想丟棄,方墮暮年。?
歲月悠悠,衰微只及肌膚;熱忱拋卻,頹廢必致靈魂。憂煩,惶恐,喪失自信,定使心靈扭曲,意氣如灰。?
無(wú)論年屆花甲,擬或二八芳齡,心中皆有生命之歡樂(lè),奇跡之誘惑,孩童般天真久盛不衰。人人心中皆有一臺(tái)天線,只要你從天上人間接受美好、希望、歡樂(lè)、勇氣和力量的信號(hào),你就青春永駐,風(fēng)華常存。?
一旦天線下降,銳氣便被冰雪覆蓋,玩世不恭、自暴自棄油然而生,即使年方二十,實(shí)已垂垂老矣;然則只要樹(shù)起天線,捕捉樂(lè)觀信號(hào),你就有望在八十高齡告別塵寰時(shí)仍覺(jué)年輕。?
—— 塞繆爾-厄爾曼德
文字非常優(yōu)美,但意思并不深?yuàn)W。青春是一種進(jìn)取的精神,是一種遠(yuǎn)離頹廢追逐理想的狀態(tài)。我個(gè)人非常認(rèn)同這種觀點(diǎn)。
人的思維和欲望具有無(wú)邊界特質(zhì),只要在未來(lái)和現(xiàn)在之間制造一種差距,那么就會(huì)產(chǎn)生無(wú)盡的勢(shì)能,人也就會(huì)不斷的前行。而制造這種差距的最佳素材往往只能是理想。
大多數(shù)人可能誤解了理想和道德間的關(guān)系,但實(shí)際上理想并非是一個(gè)高尚的詞匯,與善惡無(wú)關(guān),更與宏大與渺小無(wú)關(guān)。
魯智深說(shuō):平生不修善果,專(zhuān)愛(ài)殺人放火,這也可以是種理想,只要你可以承受它所帶來(lái)的負(fù)能量并不感到痛苦。物質(zhì)需要、成就需要、權(quán)利需要、歸屬需要這些動(dòng)機(jī)理論中經(jīng)常提到的東西,乃至前文提到的興趣都可以成為理想的素材。所以反過(guò)來(lái)講,理想是什么似乎并不關(guān)鍵,關(guān)鍵是要有,并且你真的可以很狂熱的投入去做,這就可以產(chǎn)生一定的勢(shì)能。
對(duì)與天生對(duì)代碼狂熱的程序員而言,這并不是什么問(wèn)題;但對(duì)大多數(shù)人這種理想往往并不在程序之內(nèi),而在程序之外。這時(shí)候很可能需要疊加幾類(lèi)東西才能給自己蓄積足夠的勢(shì)能:物質(zhì)的需求、成就的渴望、不安全感的驅(qū)離、技術(shù)上的追求等都是不錯(cuò)的素材。
當(dāng)然這是個(gè)人的私有領(lǐng)域,最終只能由個(gè)人做出選擇。?
這里最后想說(shuō)的是有理想、有斗志不一定會(huì)成功,但無(wú)理想、無(wú)斗志幾乎一定會(huì)鑄就平庸和失敗,因?yàn)榧?xì)致想來(lái)世界本身歸根到底是理想主義者的。
這可以通過(guò)一個(gè)簡(jiǎn)單的邏輯游戲來(lái)做點(diǎn)證明:
意識(shí)決定行動(dòng):個(gè)人意志決定個(gè)人行止,組織意志決定組織行為 → 理想主義者個(gè)人意志更為鮮明,自我意識(shí)強(qiáng)烈,而無(wú)理想的個(gè)人意志薄弱,愿意隨波逐流 → 意識(shí)強(qiáng)者上位 → 處于組織核心地位的是理想主義者?→ 無(wú)理想的人不論在個(gè)人層面還是組織層面都淪為追隨者?→?從資源掌控的角度看理想主義者掌控世界。
對(duì)這事而言,理論其實(shí)不關(guān)鍵,選擇與堅(jiān)持非常關(guān)鍵,但還是把它們放在這里,供大家參考。
動(dòng)機(jī)理論與人生勢(shì)能
如果把我們前面提到的“勢(shì)能”做細(xì)致分解,那么你可以得到各種各樣的動(dòng)機(jī)理論。動(dòng)機(jī)理論卻真的可以解釋現(xiàn)代人種種行為,因此在這里對(duì)其做一點(diǎn)介紹。
1.?馬斯洛的需求層次理論?
動(dòng)機(jī)理論里最有名的可能是馬斯洛的需求層次理論,即:
- 生理需要:包括覓食,飲水,棲身,性和其它身體需要。
- 安全需要:保護(hù)自己免受生理和情緒傷害的需要。
- 社會(huì)需要:愛(ài)、歸屬、接納和友誼。
- 尊重的需要:自尊、自主和成就感;地位、認(rèn)可和關(guān)注等。
- 自我實(shí)現(xiàn)的需要。
2.?ERG理論:
- 存在需要(Existence):與馬斯洛的生理、安全需要相似。
- 關(guān)系需要(Relatedness):與馬斯洛的社會(huì)及地位需要相似。
- 成長(zhǎng)需要(Growth):與馬斯洛的自尊及自我實(shí)現(xiàn)需要相似。
3.?X理論和Y理論:
X理論持下面四種假設(shè):
- 員工生來(lái)不喜歡工作,只要有可能,他們就逃避工作。
- 由于員工不喜歡工作,因此必須采取強(qiáng)制和控制措施,或采用懲罰威脅他們從而實(shí)現(xiàn)目標(biāo)。
- 只要有可能,員工就會(huì)逃避承擔(dān)責(zé)任,并尋求正式的指令。
- 大多數(shù)員工把安全感視為高于其他所有工作相關(guān)因素,并且沒(méi)有雄心壯志。
與之相反,Y理論持四種積極的人性假設(shè):
- 員工視工作如同休息、娛樂(lè)那樣自然。
- 如果員工承諾完成某個(gè)目標(biāo),他會(huì)進(jìn)行自我引導(dǎo)和自我控制。
- 通常人們都能學(xué)會(huì)承擔(dān)責(zé)任,甚至?xí)鲃?dòng)尋求責(zé)任。
- 人們普遍具有做出創(chuàng)造決策的能力,并不僅僅是管理者才具備這種能力。
如果把X理論和Y理論對(duì)應(yīng)到IT行業(yè),那么提倡人件和敏捷的基本是基于Y理論,而提倡CMMI和大棒加胡蘿卜的基本是基于X理論。
4. 雙因素理論(two-factor?theory)
也被稱(chēng)為激勵(lì)-保健理論(motivation-hygiene?theory)。這個(gè)理論認(rèn)為激勵(lì)和讓人不煩(保健)是兩碼事情。滿意與不滿意不是對(duì)立的兩極,滿意對(duì)立的是沒(méi)有滿意,而不滿意對(duì)立的則是沒(méi)有不滿意。簡(jiǎn)單來(lái)講管理質(zhì)量、薪金水平、公司政策、工作環(huán)境這些被認(rèn)為是保健因素,他們不產(chǎn)生滿意,只產(chǎn)生不滿意或沒(méi)有不滿意兩種狀態(tài)。要想激勵(lì)員工必須在晉升、個(gè)體成長(zhǎng)上有所作為。
5. 麥克萊蘭的需要理論
這個(gè)理論把人的內(nèi)在需要?dú)w為三類(lèi):成就需要、權(quán)利需要和歸屬需要。成就需要是一種追求卓越、獲取成功的需要。權(quán)利需要?jiǎng)t是一種控制他人行為的需要。歸屬需要?jiǎng)t是建立良好人際關(guān)系的需要。
6. 認(rèn)知評(píng)價(jià)理論
這個(gè)理論比較神奇。他認(rèn)為工作本身的樂(lè)趣是已經(jīng)是一種內(nèi)在的獎(jiǎng)勵(lì),而外部獎(jiǎng)勵(lì)反倒會(huì)降低動(dòng)機(jī)的水平。這聽(tīng)著比較抽象,但意思是如果總是用獎(jiǎng)金配合績(jī)效考核來(lái)激勵(lì)員工,那么個(gè)人由于興趣而從事某項(xiàng)工作的動(dòng)力就會(huì)降低。這很難理解,但確實(shí)也有證據(jù)來(lái)支持這個(gè)理論。
7. 目標(biāo)設(shè)置理論
由于很多公司會(huì)做目標(biāo)管理,所以很多程序員對(duì)這一理論反倒不陌生。這一理論大意是說(shuō):明確而具體的目標(biāo)有助于提高個(gè)人效能,目標(biāo)的挑戰(zhàn)性、針對(duì)目標(biāo)的反饋都在此基礎(chǔ)上進(jìn)一步提高目標(biāo)的效果。
8. 自我效能理論
這個(gè)理論走到極端就是常說(shuō)的“人有多大膽,地有多大產(chǎn)”。大意是說(shuō)一個(gè)人對(duì)自己有能力完成某項(xiàng)任務(wù)的信念越強(qiáng),那效能越高。或者簡(jiǎn)單說(shuō)就是自信很重要,而促成自信的方式可以是:過(guò)去的成功經(jīng)驗(yàn)、從榜樣吸取力量、受到言語(yǔ)激勵(lì)等。
9. 公平理論
公平理論是說(shuō)一個(gè)人總是會(huì)拿自己的產(chǎn)出收入比和另一個(gè)人比較,如果比率相似,那么人們會(huì)認(rèn)為環(huán)境是公平的。
這落到個(gè)人頭上,就是我們要重視這種差異么?都是同樣的學(xué)校、同樣的智商、同樣的家庭背景,如果一個(gè)人收入等比你多很多,你在意么?
10. 期望理論
這種理論把人的動(dòng)機(jī)分解成幾個(gè)部分:一是如果我努力了,那么這種努力能否在績(jī)效評(píng)估中表現(xiàn)出來(lái)?二是如果我獲得了良好的績(jī)效評(píng)估,那么能否得到獎(jiǎng)勵(lì)?三是即使我被獎(jiǎng)勵(lì)了,這東西是不是我想要的。
這些動(dòng)機(jī)理論從公司的角度看是激勵(lì)員工的方法,從自己的角度看則是努力前行的動(dòng)力。我還是上面的觀點(diǎn),這些理論知道就可,但如果無(wú)法找到對(duì)自己內(nèi)心進(jìn)行觸動(dòng)的點(diǎn),理論在這里并沒(méi)有很大的價(jià)值。如果想進(jìn)一步了解,則需要閱讀組織行為學(xué)相關(guān)的書(shū)籍了。上面的內(nèi)容則主要參照了人民大學(xué)出版的《組織行為學(xué)》一書(shū)。
最后想說(shuō)的是單純從境界上來(lái)說(shuō)似乎有一種精神遠(yuǎn)遠(yuǎn)超出動(dòng)機(jī)理論所能涵蓋的范圍,這種澎湃的生命力和永不屈服的精神,雖然年代久遠(yuǎn),乃至失去傳承,但這種精神卻正是上古華夏民族所身體力行的精神。
何新先生為自己國(guó)學(xué)經(jīng)典系列寫(xiě)了一個(gè)總序,對(duì)此進(jìn)行了很好的描述,他說(shuō):
華夏民族的先史中有一個(gè)神話時(shí)代。這個(gè)時(shí)代實(shí)際就是華夏民族肇始和文明濫觴的英雄時(shí)代。
女?huà)z是敢于蹈火補(bǔ)天的英雄。伏羲、神農(nóng)、黃帝、炎帝、蚩尤、大禹,或創(chuàng)世紀(jì),或創(chuàng)文明,或拓大荒,或開(kāi)民智,或奮身為天下法。
鯀與大禹父死子繼,以身濟(jì)世,拯黎民于水火;蚩尤共工九死不悔,雖失敗而壯志不屈,天地為之崩陷。
夸父逐日,體現(xiàn)了對(duì)神靈的藐視。而精衛(wèi)填海,則表現(xiàn)了對(duì)宿命的不馴。
由此觀之,中華民族的神話先古時(shí)代,實(shí)在是一個(gè)群星燦爛的時(shí)代,慷慨悲壯的時(shí)代,奮進(jìn)剛毅的時(shí)代;是獻(xiàn)身者的時(shí)代,殉道者的時(shí)代,創(chuàng)造英雄和產(chǎn)生英雄的時(shí)代。
傳說(shuō)中華民族是龍和鳳的傳人,而龍鳳精神,我以為就是健與美的精神。?
我個(gè)人總是感覺(jué)很難用動(dòng)機(jī)理論去解釋這種宏大且壯闊的精神。?
小結(jié)
IT這個(gè)行業(yè)確實(shí)是年輕人更容易出頭的行業(yè),如果不信,去看看騰訊和銀行高層的年齡吧。一個(gè)企業(yè)興起的時(shí)候往往會(huì)帶著一批人走上成長(zhǎng)的快車(chē)道。在這類(lèi)企業(yè)里沒(méi)有太多的歷史包袱所以占據(jù)高位的往往是些年輕人,這和有個(gè)幾十年歷史的行業(yè)非常不同。
而為了達(dá)成這一目的,程序員首先必須有效的持續(xù)增值并成為某一方的高手(架構(gòu)師、Guru或者優(yōu)秀的管理者)。單純從技能上講,你一定不能和金字塔最底層的百萬(wàn)大軍競(jìng)爭(zhēng),想象一下一個(gè)剛學(xué)會(huì)某門(mén)語(yǔ)言的人和一個(gè)每天思考虛擬機(jī)原理與設(shè)計(jì)、設(shè)計(jì)跨平臺(tái)系統(tǒng)的人有多大的差距。而從公司的角度看,高手則意味著可以為公司在現(xiàn)在或?qū)?lái)創(chuàng)生較大價(jià)值。
想成為高手就需要選定一個(gè)大致的方向,持續(xù)深化,并避開(kāi)學(xué)習(xí)路上的諸多陷阱,如:失去焦點(diǎn)、分離學(xué)習(xí)與實(shí)踐、過(guò)散而不專(zhuān)等等。
總結(jié)
- 上一篇: jmeter基础之MD5加密
- 下一篇: python输出斐波那契数列_pytho