|
作為軟件工程師,你希望從工作中獲得的是:穩(wěn)定的薪水、參與好項(xiàng)目的機(jī)會(huì)、好工作的跳板或只是和其他程序員成為好基友。這里的“高效”,我指的是按時(shí)完符合要求的項(xiàng)目的能力。經(jīng)歷過(guò)不少軟件編寫(xiě)工作后,我相信以下實(shí)踐會(huì)幫助你學(xué)會(huì)“高效”,同時(shí)提高專(zhuān)業(yè)聲望、拉長(zhǎng)職業(yè)壽命,和獲得個(gè)人滿(mǎn)足。
Programmer(from good-wallpapers)
1. 理解你的需求
成為高效程序員的第一步是,保證時(shí)間的合理分配。沒(méi)有什么比將時(shí)間花在完全沒(méi)有前途的工作上更浪費(fèi)的了。
盡快開(kāi)工
盡快完成一個(gè)直觀的系統(tǒng)。這意味著先創(chuàng)建界面,無(wú)論是程序界面還是用戶(hù)界面,然后生成內(nèi)部功能的存根代碼(如果有必要的話(huà))。這么做便于“客戶(hù)”查看,通過(guò)執(zhí)行用戶(hù)界面或編寫(xiě)程序界面的代碼,可以發(fā)現(xiàn)最初代碼存在的矛盾或遺漏。甚至在第一次交付以前,你有可能會(huì)注意到問(wèn)題或可改進(jìn)的地方。
有一個(gè)經(jīng)典觀念認(rèn)為,如果你提前設(shè)計(jì)好所有東西,那么之后你要做的就只剩寫(xiě)代碼了。如果你之前做過(guò)完全相同的項(xiàng)目,那么這個(gè)說(shuō)法當(dāng)然正確。但如果不是,你很可能會(huì)陷入死角,也就是你只是在猜想或執(zhí)行一個(gè)可疑的假設(shè)。
很早以前在一家無(wú)線(xiàn)網(wǎng)絡(luò)的新公司工作時(shí),我們開(kāi)了兩個(gè)月的會(huì)來(lái)設(shè)計(jì)一個(gè)將在6個(gè)月內(nèi)發(fā)布的無(wú)線(xiàn)門(mén)戶(hù)和網(wǎng)關(guān)。最終,我們厭煩了開(kāi)會(huì),開(kāi)始編寫(xiě)代碼。頭兩周內(nèi),我負(fù)責(zé)的部分與原始設(shè)計(jì)不符,兩個(gè)月后的第一個(gè)無(wú)線(xiàn)連接測(cè)試表明,我完全誤解了無(wú)線(xiàn)協(xié)議。
這不是說(shuō)設(shè)計(jì)是沒(méi)必要的。但在一定程度上,設(shè)計(jì)只是一種猜想。設(shè)計(jì)應(yīng)該通實(shí)執(zhí)行來(lái)確認(rèn),并且早執(zhí)行總是比晚執(zhí)行好。
即使原始設(shè)計(jì)是充分的,只要你發(fā)現(xiàn)可以調(diào)整的地方,你就要改進(jìn)它。硬件產(chǎn)品、建筑和大型軟件項(xiàng)目等會(huì)受到僵死的“預(yù)制”的損害,但對(duì)于軟件,你可以在項(xiàng)目早期提煉項(xiàng)目要求,然后制作適合的界面。但是,這必須盡早完成。
盡早開(kāi)工有利于樹(shù)立你的職業(yè)形象。如果能向你的老板展示一些成果,他會(huì)很高興的。另一方面,提早開(kāi)工有助于緩解焦慮。
經(jīng)常交付
一旦你完成一些可用的東西了,不要只是把它留作“概念實(shí)證”。要讓其他人試執(zhí)行它、看看他們的反應(yīng),然后讓它指導(dǎo)開(kāi)發(fā)過(guò)程的優(yōu)先次序。觀察人們?nèi)绾问褂媚愕能浖@是無(wú)可代替的方法。客戶(hù)問(wèn)卷調(diào)查和焦點(diǎn)研究可能會(huì)提供一些有用的意見(jiàn),但有可能會(huì)讓開(kāi)發(fā)者的設(shè)計(jì)決定和特點(diǎn)被客戶(hù)牽著鼻子走,這是一種冒險(xiǎn)。
特別是要盡快將軟件交付QA人員,經(jīng)常提交成果,最好是按預(yù)定的時(shí)間間隔。讓他們測(cè)試每天的成果,或至少是每周的成果也是好的。這會(huì)讓QA人員覺(jué)得自己全程參與項(xiàng)目開(kāi)發(fā),從而培養(yǎng)職業(yè)責(zé)任感,更樂(lè)意發(fā)現(xiàn)和報(bào)告問(wèn)題。最需要優(yōu)先解決的是導(dǎo)致產(chǎn)品失效的問(wèn)題,如崩潰或死循環(huán)——讓問(wèn)題盡可能涵蓋多方面,熟悉整個(gè)產(chǎn)品,這樣才有可能提早發(fā)現(xiàn)設(shè)計(jì)問(wèn)題。
在一個(gè)小型3D軟件公司,我負(fù)責(zé)移植從SGI出品的龍頭產(chǎn)品到Windows NT。6個(gè)月后,移植沒(méi)完成,倒有了崩潰的傾向,我很不情愿地將第一輪成果交付測(cè)試團(tuán)隊(duì)。幸運(yùn)的是,因?yàn)槁┒刺啵琎A經(jīng)理堅(jiān)持要我立刻解決導(dǎo)致測(cè)試人員無(wú)法有意義地使用程序的問(wèn)題。如果是我自己測(cè)試,我應(yīng)該會(huì)忙于看起來(lái)更困難更重要的核心3D問(wèn)題,可能會(huì)怠慢看來(lái)起比較普通的問(wèn)題,如用戶(hù)界面、載入-保存功能和與計(jì)劃支持的硬件之間的兼容性。
程序員常常不想過(guò)早將代碼交付測(cè)試人員——他們不想聽(tīng)到自己已經(jīng)知道的漏洞;而測(cè)試人員極有可能不想測(cè)試基本上行不通的東西。但測(cè)試人員的工作就是找到這些問(wèn)題。如果程序員想盡快看到成果的話(huà),應(yīng)該把漏洞報(bào)告當(dāng)成好東西。
2. 把工作當(dāng)真
將軟件放在盡可能接近完工的狀態(tài)下運(yùn)行。你永遠(yuǎn)不知道你什么時(shí)候得演示系統(tǒng)、發(fā)送評(píng)估備份或甚至交付。
使用真實(shí)數(shù)據(jù)
如果你只用作為著冰山一角的樣本數(shù)據(jù)作測(cè)試,那么,你的程序可能一撞上真實(shí)數(shù)據(jù)的大冰山就沉了。
我曾參與開(kāi)發(fā)一種用于評(píng)估先進(jìn)的半導(dǎo)體絕對(duì)值的供應(yīng)鏈管理產(chǎn)品。跨過(guò)交付這道大坎后,我們接到消息說(shuō)他們輸入的第一批真實(shí)數(shù)據(jù)仍然在處理中——已經(jīng)兩天了。我同情主程序員,他不得不在管理人員和客戶(hù)的催促之下忙活了兩周。很高興遇上這事的人不是我。
使用正式版本
記住,用你自己的機(jī)器創(chuàng)建的東西不是正式的。
在最近的一個(gè)游戲開(kāi)發(fā)項(xiàng)目中,我負(fù)責(zé)用戶(hù)界面,我陸續(xù)從QA那接到報(bào)告說(shuō)有些顏色不對(duì)。最后,我發(fā)現(xiàn)問(wèn)題只出現(xiàn)在交付版本中,另一位程序員使用專(zhuān)門(mén)的主機(jī)調(diào)試工具找到了漏洞。結(jié)果竟是一個(gè)我在兩個(gè)月前犯下的愚蠢錯(cuò)誤,沒(méi)有指定初始顏色值。調(diào)試版本總是選擇特定的默認(rèn)值,但是交付版本會(huì)更改,最終結(jié)果是不太確定的。如果我注意經(jīng)常地運(yùn)行交付版本,我會(huì)立刻發(fā)現(xiàn)問(wèn)題的,而不是損失大量的時(shí)間。
經(jīng)常合并
及時(shí)將你的代碼并入主代碼庫(kù)中——你拖得越久,這項(xiàng)工作就越累。
我曾與一名程序員共事,他覺(jué)得每天數(shù)據(jù)庫(kù)中出現(xiàn)的所有新代碼和數(shù)據(jù)變化都“很麻煩”。確實(shí),這讓所有其他程序員每天都要花一定時(shí)間合并,他才能夠只掃視一下代碼和數(shù)據(jù)就開(kāi)始運(yùn)行一些不錯(cuò)的獨(dú)立樣本。但每一次階段性交付時(shí),我們都要花好幾天再次把單獨(dú)的代碼接到當(dāng)前的代碼庫(kù)中,有時(shí)候甚至得拖延交付或冒著損失整個(gè)項(xiàng)目的風(fēng)險(xiǎn)。
將你的代碼與正式版本分開(kāi)意味著程序員不能評(píng)估你的代碼,以及測(cè)試員不能盡早發(fā)現(xiàn)漏洞。可能你并不想其他人挑剔你的代碼,但早發(fā)現(xiàn)問(wèn)題總是比晚發(fā)現(xiàn)好的——所以,忍了罷。
code(from etsy.com)
3. 理解你的代碼
生活中充滿(mǎn)了奇妙的神秘,但你的代碼可不適合出現(xiàn)這些神秘。你不必知道你的車(chē)怎么工作的——如果引擎發(fā)出奇怪的聲音,把它交給汽車(chē)技師就好了。但換成是你的代碼,如果連你都不知道它是怎么運(yùn)行的或出了什么錯(cuò),那就沒(méi)人知道了。
有自己的編寫(xiě)風(fēng)格
我童年時(shí)的鋼琴教師是這么評(píng)價(jià)我和我姐姐哥哥的:“你姐姐的時(shí)間感強(qiáng),你哥哥的鍵盤(pán)打得不錯(cuò)。”然后他停頓了一下說(shuō):“你嘛,嗯,你很努力。”
編程是一種有些人能做有些人不能做的事,但還有一些人則是天才。雖然我有過(guò)多年的練習(xí),鋼琴還是彈不好;雖然我那么喜歡打球,水平仍然一般般。但我確實(shí)認(rèn)為我有編程和寫(xiě)作的天賦。不要吃驚,我認(rèn)為好程序就像好散文。散文和代碼都是文本,有語(yǔ)法、句法、拼寫(xiě)和語(yǔ)義。對(duì)于大多數(shù)寫(xiě)代碼的人和寫(xiě)作的人,有這些就夠了,但好作家和好程序員還要有一種美感,他們的作品在結(jié)構(gòu)和風(fēng)格上是有特點(diǎn)的,往往能借此識(shí)別出作者。
許多Windows程序員都感到好奇:為什么壞脾氣的老Unix/Mac/Amiga/Lisp程序員對(duì)Win32/MFC/.NET很不滿(mǎn),但如果所有應(yīng)用界面都來(lái)自Microsoft,你可能就不知道還有什么東西是更好的。
復(fù)制粘貼
風(fēng)格化編程的反面是復(fù)制粘貼。從什么地方復(fù)制一些可能有用的代碼,稍作調(diào)整,合并,重復(fù),然后就大功告成了。你的軟件簡(jiǎn)直就是大雜燴。
離開(kāi)一家公司的幾個(gè)月后,一位前同事電郵問(wèn)我,他復(fù)制粘貼了十頁(yè)的代碼組成一個(gè)算法,為什么運(yùn)行不了。我實(shí)在不知道怎么回答了。如果你不能解釋你自己的代碼應(yīng)該是怎么運(yùn)行的,你還指望誰(shuí)來(lái)拯救你?
我甚至在診斷自己從樣本代碼復(fù)制粘貼過(guò)來(lái)的代碼時(shí)也犯過(guò)難。從復(fù)制粘貼開(kāi)始新代碼是合情理的,但你不能因?yàn)榭雌饋?lái)能運(yùn)行就放手不管了——你得返回去看看你是否讀懂了每一條,根據(jù)自己的目的理清代碼。
清理代碼
保持你的房子/公寓/房間整潔的最好辦法就是每天花一點(diǎn)時(shí)間清理它,或至少每周清理一次吧。如果等到住所亂到一定程度才打掃,那么這麻煩就非常大了。除非你雇個(gè)清潔工。
假設(shè)你沒(méi)辦法奢侈到雇一個(gè)人每天幫你清理代碼的程度,那么你就應(yīng)該定時(shí)地檢查你的代碼、清理累積的死代碼、淘汰過(guò)時(shí)的注釋和錯(cuò)誤的名稱(chēng),否則你必定會(huì)得到一份不敢拿出來(lái)見(jiàn)人的代碼。如果你不覺(jué)得丟不起人,好吧,你行。
我指導(dǎo)過(guò)的一名程序員總是向我報(bào)告,她的代碼“完成”了。這是管理者樂(lè)意聽(tīng)到的話(huà),卻讓我非常抓狂。她的代碼從來(lái)沒(méi)有做完——你得調(diào)試它、維護(hù)它、改進(jìn)它,直到它徹底沒(méi)問(wèn)題。
問(wèn)題?注釋?zhuān)?/strong>
有些人認(rèn)為編程是一門(mén)手藝活,也有些人認(rèn)為編程是一項(xiàng)工程。更經(jīng)常的是,它是一門(mén)考古學(xué)。你挖掘代碼的沉積物,想知道這些奇怪的人工產(chǎn)品是用來(lái)干什么的。為后來(lái)人著想一下,留點(diǎn)線(xiàn)索吧。
我問(wèn)之前提到的那位程序員“完成”注釋了沒(méi)有。結(jié)果是,一個(gè)函數(shù)名稱(chēng)為“GetData”的注釋居然是“Gets data”。這不只是廢話(huà)——簡(jiǎn)直是侮辱。什么數(shù)據(jù)?什么格式?來(lái)自哪里?更不要提像服務(wù)器不可用或傳送中斷時(shí)會(huì)怎么樣這種小細(xì)節(jié)了。
將你的代碼做成文檔,以防有人隨時(shí)要拿來(lái)用。可能要用的人就是你本人——想想如果不這么做,你得重新訪問(wèn)代碼多少次啊?
與之前的一個(gè)老板合作時(shí),他叫我瀏覽一段沒(méi)人有時(shí)間看的代碼。一開(kāi)始,我認(rèn)為它很糟,不知道寫(xiě)的都是什么東西。之后我慢慢摸索出來(lái)這段代碼是干什么的,所以我勉強(qiáng)同意它不算太糟。最后我終于認(rèn)出這貨竟是我兩年以前寫(xiě)的。教訓(xùn):多留點(diǎn)注釋。
當(dāng)你寫(xiě)代碼時(shí),記得注釋?zhuān)皇堑戎霈F(xiàn)什么方便的清理短語(yǔ)——注釋你的代碼,讓它甚至可以清楚地反映你在編寫(xiě)時(shí)的想法。你可以成為自己的編寫(xiě)伙伴。
現(xiàn)在你可以用Javadoc和doxygen等生成漂亮的HTML或來(lái)自源代碼注釋的其他格式化的文件。理想的情況是,你每天晚上做的就是doc生成的部分,可以通過(guò)你的內(nèi)聯(lián)網(wǎng)獲得。
注意警告
無(wú)視編輯器和運(yùn)行時(shí)間警告會(huì)害到你自己。有“警告”就有原因。
我曾做過(guò)一個(gè)基于Unix的應(yīng)用,它不能成功地連接某些函數(shù)。我們通過(guò)在運(yùn)行時(shí)再次連接這些函數(shù)解決問(wèn)題。六個(gè)月后,當(dāng)我們執(zhí)行一個(gè)干凈的新版本時(shí),我們才發(fā)現(xiàn)原來(lái)我們關(guān)掉了能提醒我們未知連接漏洞的警告。在供應(yīng)商的斥責(zé)下,我們將連接問(wèn)題解決了。但結(jié)果是,原來(lái)我們只要通過(guò)重新排列庫(kù)就能連接上了。
提高編輯器的警告水平,注釋代碼以及記錄創(chuàng)建和運(yùn)行時(shí)間的警告信息,最好包括解決警告的標(biāo)準(zhǔn),這樣你就會(huì)知道是否解決問(wèn)題或忽略問(wèn)題。
Programmer(from photobucket)
4. 優(yōu)化編程
帶著目的寫(xiě)代碼
復(fù)制粘貼代碼的人的另一個(gè)極端是,只是為了讓代碼看起來(lái)更漂亮(至少對(duì)他們而言)而改變代碼。雖然有編程審美感是值得贊揚(yáng)的,但改變代碼以便讓你覺(jué)得漂亮只是浪費(fèi)時(shí)間(無(wú)用的冒險(xiǎn))。瀏覽并改變別人寫(xiě)的代碼,讓它看起來(lái)更漂亮,真是讓人生氣。
我有一個(gè)挑剔的同事,瀏覽我們的代碼庫(kù)時(shí)將所有的附加語(yǔ)都刪除了。如果他只是清理了入門(mén)級(jí)員工寫(xiě)的代碼,那可能沒(méi)人會(huì)說(shuō)什么,但那些附加語(yǔ)是我們團(tuán)隊(duì)的技術(shù)領(lǐng)導(dǎo)寫(xiě)的,他可是我們公司最出色的人物之一。
不要搞破壞
“代碼重構(gòu)”現(xiàn)在十分流行,但程序員往往以為它是指代碼清理或重新設(shè)計(jì)。這個(gè)技巧是指重新組織代碼,同時(shí)不破壞其他東西。如果你以改進(jìn)的名義破壞已經(jīng)存在的功能,那么你的意思就是:要么你的時(shí)間比其他人的時(shí)間金貴,要么你不破壞就不會(huì)整代碼。
我有一個(gè)特別討人嫌的同事,他決定重新執(zhí)行我們系統(tǒng)中的解析器,但結(jié)果讓代碼變成其他所有人都不知道怎么寫(xiě)了。我讓他恢復(fù)原狀,之后發(fā)現(xiàn)代碼能編寫(xiě)了,卻不能運(yùn)行了—–問(wèn)他怎么回事,他說(shuō)“應(yīng)你的要求”,他移除了整個(gè)解析器。真沒(méi)團(tuán)隊(duì)精神。
保持代碼運(yùn)行需要一些耐心和額外的工作——你勤奮地回歸測(cè)試你的工作,在將函數(shù)添加到新代碼中時(shí),你可能需要暫時(shí)留住老代碼和界面。但對(duì)于所有與這個(gè)代碼庫(kù)有關(guān)的人來(lái)說(shuō),這是必須做的。
找到瓶頸
人們總是談?wù)?ldquo;最佳”,但這不是一個(gè)正確的詞。我們極少將最佳作為目標(biāo)——相反的,我們的目標(biāo)是改進(jìn)和權(quán)衡以達(dá)到足夠好的表現(xiàn)。
在谷歌的電話(huà)面試時(shí),我被問(wèn)到如何在一組有序的數(shù)字中搜索某個(gè)數(shù)字。顯然,提問(wèn)的人是在問(wèn)二進(jìn)制搜索法。但在現(xiàn)實(shí)生活中,我可能會(huì)做出“錯(cuò)誤”的選擇——從頭找到尾。如果程序表現(xiàn)足夠好了,還花兩倍的時(shí)間寫(xiě)兩倍的、必須維護(hù)和調(diào)試的代碼,那是毫無(wú)意義的,特別是如果那段代碼并非程序的瓶頸(我嚴(yán)重懷疑如果那個(gè)數(shù)據(jù)是瓶頸部分,你居然還會(huì)將它線(xiàn)性排列)。
如果你確實(shí)需要在程序的速度或空間方面達(dá)到最佳,折騰除了瓶頸以外的其他任何部分都只是浪費(fèi)時(shí)間。
5. 自我管理
你可能對(duì)你那位討厭的老板有各種抱怨,你的抱怨可能沒(méi)錯(cuò)。所以你得成為你自己的管理者。即使你的老板人不錯(cuò),他也不會(huì)站在你背后告訴你該寫(xiě)什么、怎么寫(xiě)才會(huì)快(盡管我肯定許多老板恨不得這么做)。
估計(jì)時(shí)間
程序員不能提供有用的時(shí)間估計(jì),這是出了名的。但我認(rèn)為這是無(wú)理指責(zé),因?yàn)楣芾韺油鞒龈畹念A(yù)測(cè),并且程序員的警告往往被無(wú)視(這可能是所有工程的共同災(zāi)難)。但是,合理的時(shí)間估計(jì)對(duì)于按時(shí)完成項(xiàng)目仍然是關(guān)鍵的。
在一個(gè)商業(yè)軟件項(xiàng)目中,我的有些同事居然樂(lè)得忘了產(chǎn)品交付日期——有人問(wèn)是否已經(jīng)交付了,另一個(gè)人才很驚訝地發(fā)現(xiàn),日子已經(jīng)過(guò)去好幾天了。
更糟的也更普遍的是,程序員能給出的時(shí)間估計(jì)是“只需要幾天。”每次我聽(tīng)到這話(huà),或者我自己說(shuō)出這話(huà),我都感到害臊。
一家圖像軟件公司的總裁想讓產(chǎn)品支持VRML(那時(shí)它是下一件大任務(wù)),包括我們將在兩個(gè)月內(nèi)發(fā)行的產(chǎn)品也支持VRML。他可能想到(他是正確的)我會(huì)拒絕開(kāi)始新項(xiàng)目,所以他問(wèn)了另一個(gè)工程師,得到了他想到的回答:“只需要幾天。”兩天后,我告訴總裁,我們剛剛浪費(fèi)了他和我的兩天時(shí)間,因?yàn)橛袃砂俣鄠€(gè)更重要的漏洞要修復(fù),他認(rèn)為我的理由算是充分。(后話(huà):VRML沒(méi)有太成功。)
另一位程序員完全沒(méi)有時(shí)間估計(jì)的概念。但沒(méi)有必要完全拒絕時(shí)間的模糊屬性——畢竟只是估計(jì),事實(shí)上你應(yīng)該避免太確切。如果你是一名有經(jīng)驗(yàn)的工程師,你就知道你以前做類(lèi)似的工作需要多長(zhǎng)時(shí)間,如果你不是,那你就問(wèn)問(wèn)有經(jīng)驗(yàn)的人。
我有一個(gè)聰明的朋友,經(jīng)常被指派去開(kāi)發(fā)實(shí)驗(yàn)原型,他問(wèn)我:“你怎么估計(jì)時(shí)間?”我認(rèn)為這是一個(gè)反問(wèn)句,但甚至純研究人員也要估計(jì)時(shí)間。有人支付他們,希望得到結(jié)果,即使它是許多演示樣本或某段時(shí)間發(fā)表的文章。
如果你確實(shí)估計(jì)不準(zhǔn)需要多少時(shí)間,那么你就不是做這項(xiàng)任務(wù)的合適人選。
有時(shí)候程序員不情愿承諾時(shí)間是因?yàn)樗麄兒ε卤WC。確實(shí),這個(gè)世界沒(méi)那么美好,經(jīng)理會(huì)在時(shí)間上跟你討價(jià)還價(jià),競(jìng)爭(zhēng)對(duì)手可能用嚴(yán)苛或不切實(shí)際的安排來(lái)擠兌你,希望你失敗。在你承諾時(shí)間后,你就悲劇了,你別想得到任何你希望的結(jié)果。
我曾有個(gè)老板問(wèn)完成時(shí)間后會(huì)追問(wèn)一句:“你保證?”但問(wèn)他硬件條件和其他相關(guān)事宜時(shí),他會(huì)說(shuō):“我盡量。”
我能說(shuō)的只有,抓緊時(shí)間以及給出現(xiàn)實(shí)估計(jì)。任何讓步都應(yīng)該根據(jù)實(shí)際的介于產(chǎn)品和資源之間的交易。要根據(jù)假設(shè)、相關(guān)事宜和資源做時(shí)間安排,找個(gè)地方寫(xiě)下來(lái),這樣以后你就不用麻煩你不太給力的記性了。
計(jì)劃進(jìn)度
在決定上哪去以前,你不會(huì)跳上車(chē)的,對(duì)吧?你在開(kāi)車(chē)時(shí)心里可能就有路線(xiàn)了。相同地,在你開(kāi)始用電腦寫(xiě)以前,你應(yīng)該知道你今天想完成什么,有一些想法了。
每天都會(huì)遇到分心的事,所以你不可能總是完成你想完成的事。與那些將軟件工程團(tuán)隊(duì)當(dāng)作自動(dòng)販賣(mài)機(jī)的人的想法相反的是,有些任務(wù)不是一天就能完成的。所以想想你到周五要完成什么,如果你完成了,那么周末你就可以好好過(guò)了。
6. 不斷學(xué)習(xí)
一名社團(tuán)足球隊(duì)成員曾經(jīng)問(wèn)我,我們每天束緊防滑釘練習(xí),你們“C語(yǔ)言編程的秘密是什么?”如果存在這樣的秘密的話(huà),我肯定會(huì)在晚間電視節(jié)目上宣傳如何靠房地產(chǎn)發(fā)財(cái)。對(duì)不起,沒(méi)有捷徑——你必須學(xué)習(xí)、練習(xí)和犯錯(cuò)。你不一定得依靠團(tuán)體訓(xùn)練或?qū)W校教育——有許多國(guó)立的和當(dāng)?shù)氐膶?zhuān)業(yè)團(tuán)體、書(shū)籍,當(dāng)然還有網(wǎng)絡(luò)。
編程是科學(xué)
編程被稱(chēng)作“計(jì)算機(jī)科學(xué)”是有原因的。無(wú)需正規(guī)的計(jì)算機(jī)科學(xué)教育,任何人都可以輕易地開(kāi)始編程(可能太容易了)。特別是,那些學(xué)過(guò)其他工程和理科的人,可以非常快地上手編程,然后以此謀生。但對(duì)于高效地處理重大任務(wù),你必須知道軟件的固有功能和限制、識(shí)別前提,這樣你才不會(huì)白費(fèi)力氣地做重復(fù)的工作。你不必知道所有事,但你應(yīng)該至少粗略地了解許多領(lǐng)域,必要時(shí)能做一些額外的研究。
例如,創(chuàng)建了新文件格式的人應(yīng)該知道一些關(guān)于編輯器的事。我不是指所有代碼生成的優(yōu)化如循環(huán)展開(kāi),而是基本的問(wèn)題和各種編輯的短語(yǔ)和大部分指定標(biāo)記和語(yǔ)法的重要性。今天,大多數(shù)人會(huì)默認(rèn)地使用XML,那是件好事,
但在那之前,一般是粗略地寫(xiě)一些文本格式,指向一些生成的樣本文檔作為文件,之后其他寫(xiě)了另一個(gè)解析器的人會(huì)補(bǔ)上一些在文檔中閱讀的東西,但不是全部。在出了差錯(cuò)的情況下,你有兩種方式推卸責(zé)任——要么讀者不行,要么作者太差。無(wú)論怎么樣,更受歡迎的產(chǎn)品會(huì)贏。
我對(duì)3D圖象行業(yè)最不能容忍的事情之一是,過(guò)多的文件格式不明。當(dāng)我執(zhí)行一個(gè)3D作品的OBJ文件解析器時(shí),我測(cè)試的每份導(dǎo)出作品都生成明顯不同的文件,比如空白和換行不同。與之形成對(duì)比的是,我的一個(gè)初出茅廬的同事用語(yǔ)法和詞法分析器設(shè)計(jì)了一個(gè)新游戲交換格式(現(xiàn)在,這不再是什么大不了的事了—-大多數(shù)新圖象文件格式好像都是基于XML的)。
只會(huì)將簡(jiǎn)單的腳本和用戶(hù)界面放在一起的程序員和可以處理實(shí)際問(wèn)題的程序員,如果說(shuō)這二者有什么區(qū)別的話(huà),那就是對(duì)復(fù)雜計(jì)算的理解能力,如算法怎么影響問(wèn)題的大小。每一位程序員都應(yīng)該知道基本的復(fù)雜性術(shù)語(yǔ)和對(duì)常見(jiàn)問(wèn)題的復(fù)雜程度有常識(shí)性認(rèn)識(shí)。
我的第一份工作是計(jì)算機(jī)輔助半導(dǎo)體設(shè)計(jì),涉及許多可擴(kuò)展性的問(wèn)題,包括一些NP-complete問(wèn)題(非常難處理)。但是,每次看到在線(xiàn)性時(shí)間中不能解決的問(wèn)題,和我們自夸可能意味著大部分是線(xiàn)性時(shí)間的“線(xiàn)性”算法,有些工程師會(huì)興奮地說(shuō):“這是旅行商問(wèn)題!”(旅行商問(wèn)題,即TSP是一個(gè)有著重要工程背景、在圖論中的典型組合優(yōu)化問(wèn)題,已被證實(shí)是一個(gè)NP完全問(wèn)題。也就是,如果一個(gè)旅行商不得不到幾個(gè)城市做生意,怎樣走最短的路線(xiàn)使他一次到達(dá)這幾個(gè)城市。)
免費(fèi)啤酒、自由討論、免費(fèi)軟件
好吧,其實(shí)沒(méi)有免費(fèi)啤酒;但現(xiàn)在程序員過(guò)得還不錯(cuò)(盡管經(jīng)濟(jì)衰退和外包業(yè)惹爭(zhēng)議)——畢竟你需要的東西網(wǎng)上教程、討論組上都有,還有免費(fèi)軟件可以用。你要解決的只有硬件和寬帶問(wèn)題。
the-social-programmer(from geekherocomic.com)
7. 尊重
高效軟件工程師的要求之一是,被認(rèn)真對(duì)待。你必須得到你的同事和老板的尊重,至少出于你的技術(shù)能力、對(duì)自己的工作有主導(dǎo)權(quán)、對(duì)他人有一定影響力。
愚蠢問(wèn)題
真的,這個(gè)世界上存在許多愚蠢的問(wèn)題。提出一個(gè)聰明的問(wèn)題會(huì)增加別人對(duì)你的尊重,但這是一項(xiàng)技術(shù)活。一個(gè)揭露未解決的事的好問(wèn)題會(huì)讓別人看到你深刻的內(nèi)涵,你敏銳的思維。要求說(shuō)明關(guān)于技術(shù)參數(shù)的問(wèn)題,顯示了你閱讀和發(fā)現(xiàn)問(wèn)題的能力。
如果你的問(wèn)題沒(méi)有得到答案,可能是問(wèn)題本身有誤,所以不要再重復(fù)發(fā)問(wèn)了。換一種方式提問(wèn),帶上更多細(xì)節(jié)或背景。如果被提問(wèn)的是你,或花時(shí)間回復(fù)新手問(wèn)題的是你,你會(huì)感謝上述考慮的。
能與技術(shù)支持人員保持良好關(guān)系,這是讓我對(duì)自己都感到驕傲的事。但我確實(shí)記得一件往事,那時(shí)我拋出一個(gè)問(wèn)題:“幾周前提出來(lái)的那個(gè)問(wèn)題是怎么回事?”你可以想象別人是多么惱火地回答——“你說(shuō)的怎么回事是指什么,并且,你說(shuō)的是什么問(wèn)題?”
粗魯無(wú)禮是沒(méi)有回報(bào)的,特別是如果你是要求免費(fèi)指導(dǎo)或咨詢(xún)討論組。即使你是在支持協(xié)議的保護(hù)之下發(fā)問(wèn),激怒了你的技術(shù)顧問(wèn)對(duì)長(zhǎng)期合作也會(huì)很不利。
我曾經(jīng)向臭脾氣的新人們解釋為什么他們的問(wèn)題有問(wèn)題或者什么是他們從一開(kāi)始就做錯(cuò)了的,真是太累人了。現(xiàn)在,我給你快速生效的傻瓜過(guò)濾器——“我想知道的只是……”或果斷無(wú)視。
讓所有人知道你讀了文件和谷歌搜索了該問(wèn)題。除了避免回復(fù)必然的“RTFM”(RTFM意為:去讀該死的指導(dǎo)手冊(cè)。當(dāng)你需要信息或者解決問(wèn)題時(shí),在請(qǐng)求對(duì)方幫助之前,應(yīng)該花一些時(shí)間嘗試自己去尋找需要的東西。)和“Google is your friend”,都顯示了你做足了功課,那些幫助的人不必搜索相同的資源。如果你確實(shí)指望他們?yōu)槟闼阉髂切┵Y源,那你的意思就是,你的時(shí)間比他們的金貴,你在謀殺他們的時(shí)間。
白癡答案
如果你要表現(xiàn)得你知道自己在說(shuō)什么,那么你確實(shí)應(yīng)該知道你到底在說(shuō)什么。工程師的交流有時(shí)候更多地是炫耀自己的知識(shí)而不是提供信息(如果你也能這么做,那我向你致敬)。這往往無(wú)益于求職面試,面試官其實(shí)是假借“發(fā)現(xiàn)你是怎么想的”的幌子,向求職者拋出空洞的問(wèn)題。當(dāng)然,如果求職者有一點(diǎn)自知之明的話(huà),也可能產(chǎn)生出乎意料的結(jié)果。
有一位技術(shù)總監(jiān)打電話(huà)面試我,要我概述C++編輯的結(jié)果堆棧框架,并且口頭答復(fù)他。我一步一步地打草稿,每次我給他正確的答案,他都反過(guò)來(lái)要我說(shuō)一個(gè)錯(cuò)誤的答案,以便我們可以仔細(xì)檢查為什么那個(gè)選擇不管用。我不知道我這么寫(xiě)是不是在彰顯我有多聰明或他有多聰明。
作為一名工程師,你不能太倚重錢(qián)財(cái)和長(zhǎng)相——信譽(yù)才是你的資本。所以如果你犯錯(cuò)了,就坦率承認(rèn)吧。
我有幸與一名資深工程師共事,他從來(lái)不犯錯(cuò)。當(dāng)他的Java代碼在多重處理器系統(tǒng)中崩潰時(shí),原來(lái)是出現(xiàn)了大漏洞。當(dāng)我拿代碼指出UI代碼不支持多線(xiàn)程運(yùn)行時(shí),他堅(jiān)持說(shuō)只有一個(gè)線(xiàn)程。當(dāng)我列出代碼中的7條線(xiàn)程(我能找出的)時(shí),他同意不應(yīng)該保留這么多線(xiàn)程,并且最好修改一下。但他還是按老樣子編寫(xiě)代碼——他沒(méi)有修復(fù)任何漏洞,他只是用更多代碼掩蓋了漏洞。
最后,一個(gè)節(jié)省時(shí)間的建議:不要糾結(jié)于愚蠢的爭(zhēng)論。愚蠢是會(huì)傳染的。
it知識(shí)庫(kù):成為高效程序員的7個(gè)重要習(xí)慣,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。