|
英文原文:Unlearn, young programmer
有一天我和我的朋友Simone一起喝咖啡,期間我們聊起一些工作上的事情。我們倆都管理著一些員工,為了說明給初級(jí)職員分派任務(wù)時(shí)出現(xiàn)的問題,她打了一個(gè)絕妙的比方。
這就像你讓他們掛一幅畫,但他們從來沒有干過這樣的活。你明白你要做什么——只要讓他們這么做就行了。事實(shí)上,你認(rèn)為有些東西不用解釋,因?yàn)槟阌X得它們太簡(jiǎn)單了。所以,你讓一些新手來為你工作時(shí),你說,“把這幅畫掛在那里,做完了告訴我”,很好理解,對(duì)不對(duì)?但他知道應(yīng)該怎樣釘釘子嗎?實(shí)際上,有很多細(xì)節(jié)他不清楚,他需要學(xué)習(xí)才能把畫掛好。另外,還有很多東西你容易忽略。
首先,是怎么做。他需要什么工具?你知道工具箱里有錘子和釘子。但他不知道,他認(rèn)為他有合適的工具完成任務(wù)。于是他在辦公桌上找到了一個(gè)訂書機(jī)和磁帶機(jī)。
現(xiàn)在他有兩種方法完成任務(wù)。他可以做很多小的磁帶圈,這樣它們可以固定在墻上,然后把它們釘在畫的背面。這種方法看上去可能沒事,但是只有畫掉下來的時(shí)候你才知道他做錯(cuò)了。另一種方法是,他把一大條磁帶纏在畫上,并且把它用訂書機(jī)牢牢釘在墻上。用這種方法的結(jié)果可能更糟,雖然和你的要求差不多——畫掛好了,但是畫面被遮住了。只要有足夠的訂書釘,畫就能掛住。但是這樣太難看了,而且也不是你想要的掛法。如果你不及時(shí)制止他,他可能會(huì)繼續(xù)用這種方法掛畫。
還有一種可能的情況,特別是對(duì)那種急性子的初級(jí)程序員來說。當(dāng)你的老板來問你射釘槍的采購訂單時(shí),你才發(fā)現(xiàn)他這樣做了。于是你叫來你的下屬了解情況,發(fā)現(xiàn)他上周一直在google上搜索,閱讀參考書,并向討論組求助。他知道你想把畫掛在墻上的釘子上,并且認(rèn)為釘釘子的工具是高級(jí)氣動(dòng)射釘槍。如果他能接受你的意見,你得指出掛圖和裝修用的釘子是不一樣的,并且告訴他工具箱里的錘子才是真正適合做這件事的工具。要是他還固執(zhí)己見,就可能會(huì)有像下面這樣的爭(zhēng)吵了:
“為什么不能買射釘槍?”
“因?yàn)闆]有足夠預(yù)算。”
“難道就沒法做好一件事情嗎?”
“你可以用錘子釘釘子。”
“可是我們不是應(yīng)該更快更好地完成工作嗎?難道我們用錘子的原因只是因?yàn)橛昧?xí)慣了它?眼光應(yīng)該放遠(yuǎn)點(diǎn)。”
“我們沒有足夠的時(shí)間證明買射釘槍是對(duì)的。明白嗎?”
最后雙方不歡而散。
現(xiàn)在,你覺得你把工具的問題說得夠清楚了。他也拿到了錘子和釘子,開始了他的工作。問題是,他還應(yīng)該知道如何有效地使用它們。對(duì)你來說熟練使用錘子是輕而易舉的事情。但是對(duì)以前從未見過錘子的人來說,它看上去似乎只有一種用法。事實(shí)上,你可以用錘柄末端。你還可以用爪形部分夾住釘子,然后把它釘進(jìn)墻里,而不必在大力釘釘子時(shí)用手拿著釘子。
站在木工的角度來看,這似乎有點(diǎn)低級(jí),但它反映了使用軟件工具時(shí)的實(shí)際問題。一個(gè)軟件往往提供很多參考文檔,但范例和習(xí)慣用法卻不多。你可以買一本一千多頁的參考書,它告訴你用一個(gè)軟件可以做些什么,卻沒有哪怕僅僅5頁內(nèi)容來說明在你的實(shí)際情況下你該怎么用它。就算你有一個(gè)實(shí)例,它們也不告訴你為什么要用這種方式運(yùn)行。讀完本文之后,你就不會(huì)再糾結(jié)釘釘子是用錘子還是射釘槍了。
我剛開始使用XML時(shí)就遇到了這種情況。我讀過的幫助文檔里這樣說過,“用SAX解析器讀取XML文件,不要用DOM解析器。DOM解析器運(yùn)行速度很慢,并且占用內(nèi)存過多”。后來我問過其他人,“為什么不行呢?難道DOM解析器執(zhí)行效果很差嗎?”
他說:“并非如此,但如果你只想獲得作者和標(biāo)題信息你何必加載一個(gè)10M的文件呢?”
“啊,是這樣,我想把一個(gè)20K的文件內(nèi)容發(fā)布為一個(gè)網(wǎng)頁。”
“那你還是用DOM解析器吧。”
此外,還可能會(huì)出現(xiàn)數(shù)據(jù)交互問題。現(xiàn)在你的下屬知道怎么釘釘子了,他做的第一件事情是在畫框上釘一個(gè)釘子。
天哪!!!
“不不不,你沒看到畫框背后的繩子嗎?你應(yīng)該把釘子釘在墻上,然后把繩子掛上去。”
“哦,我不知道它有什么作用。不過你只釘一個(gè)釘子?多釘幾個(gè)不是更安全嗎?比方說釘6個(gè)。”
“用一個(gè)就足夠了,釘子多了反而不好調(diào)整。”
“為什么要調(diào)整呢?”
“你得把畫掛正吧。”
“哦?要掛正嗎?”
唉,又沒說清楚。
現(xiàn)在我們開始討論更高層次的設(shè)計(jì)問題。畫應(yīng)該掛在哪里?應(yīng)該掛多高?他沒法決定。如上文所說,它沒有你想得那么簡(jiǎn)單。
你明白畫不能掛在門邊,因?yàn)殚_門時(shí)會(huì)擋住它。它也不能掛在那邊,因?yàn)槟阋研聲穹旁谀恰;蛟S你的天花板有14英尺高,畫只是用來讓這個(gè)大房間顯得不那么空蕩。也有可能這是你和“貓王”的合影,有人坐在你辦公桌前的時(shí)候你可以顯擺顯擺。如果它是一張老照片,你必須確保它不會(huì)受陽光直射。這些都是“業(yè)務(wù)規(guī)則”。雖然你掛畫的方式大同小異,但你必須考慮它們。
也有些業(yè)務(wù)規(guī)則會(huì)影響你的決策。如果畫比較貴重,你得想辦法把它保護(hù)好,比方說把它掛在比較難夠著的地方。如果它價(jià)值連城,你得用兩英寸厚的玻璃來保證它的安全,周圍還得裝上警報(bào)系統(tǒng)。要是你打算用來掛畫的那堵墻非常結(jié)實(shí),你得用鉆頭才行。如果墻本身比較值錢,你還是暫時(shí)打消掛畫的想法吧。
這些規(guī)則可能有些道理,但它們并非那么顯而易見。一些在某種情況下正確的方案在其它情況下不一定是對(duì)的。你只能通過你在房間里掛畫的經(jīng)驗(yàn)來了解它們。另外,你還得考慮哪些規(guī)則可能改變。你確定要把畫掛在這嗎?這幅畫會(huì)被移到別處嗎?它會(huì)不會(huì)被換成另外一幅畫?新的畫和原來那幅還是一樣大嗎?
別指望新手會(huì)考慮這些。你可以適當(dāng)指點(diǎn)他一下。你的任務(wù)是盡可能多地告訴他工作的細(xì)節(jié)。如果他聰明,好奇,他會(huì)提問,并了解這樣做的來龍去脈。不過這需要時(shí)間。
如果你沒有給他足夠的信息,他會(huì)試著猜測(cè)。前面提到的急性子的程序員這時(shí)可能就不顧規(guī)則了。你告訴他把你的寵物狗照片掛起來,一周后他回來了,問你要不要再考慮考慮他關(guān)于石膏鋸的建議。
“你為什么會(huì)想到石膏鋸呢?”
“辦公室的工具箱里只有木鋸,不太適合鋸石膏板。”
“什么?你認(rèn)為只有你想鋸石膏板嗎?你可以在Home Depot上買一個(gè)鋸子。”
“那么,好吧,我去買一把。”
“等等,你怎么會(huì)想到鋸石膏板?”
“是這樣,我不知道掛畫最好的方式是什么,所以我上網(wǎng)找了討論組里的畫廊設(shè)計(jì)師。他們說,最好的方法是鋸穿墻壁,做出一個(gè)框架。把畫從后面放進(jìn)去,這樣能夠保證玻璃的安全,因?yàn)槟悴槐貏?dòng)它。而且這種方法比釘釘子更加美觀。”
“...”
這個(gè)比喻可能有些不太切題,不過請(qǐng)相信我——它非常有參考價(jià)值。如果你的職業(yè)生涯中還沒有遇到此類事情,你可以先看看它。
關(guān)鍵是,從細(xì)節(jié)技術(shù)層面到整體效果層面,有很多東西你必須知道。不能讓一個(gè)新手隨意猜測(cè),不管他有多聰明。而且這和聰不聰明沒關(guān)系,一切都要根據(jù)實(shí)際情況決定。可能你和他們一起工作太久了,你忘了你也有一段時(shí)間不知道這些。但是你必須詳細(xì)地描述你的要求,方便他們提問。
僅僅是這樣嗎?
這讓我想起了《帝國反擊戰(zhàn)》中我最喜歡的場(chǎng)景之一:Luke Skywalker遭受了失去親人的打擊,他一直在尋找自己隱秘的身世。后來他跟隨絕地大師Yoda學(xué)習(xí)如何成為絕地武士。但是Luke想學(xué)的東西Yoda卻沒有教他。實(shí)際上,觀眾們認(rèn)為,Luke似乎并不了解絕地武士應(yīng)該是怎樣的,畢竟除了和Ben Knobi一起學(xué)習(xí)的時(shí)間,他幾乎沒有任何這方面的經(jīng)驗(yàn)。而他之前并不知道Kenobi是絕地武士,直到他親眼目睹Kenobi在戰(zhàn)斗中犧牲。
這是這個(gè)場(chǎng)景中令我印象最深的畫面:
LUKE:師父,移動(dòng)石頭很難,它和我以前學(xué)的完全不一樣。
YODA:不,沒有什么不同。只是你認(rèn)為它們不同罷了。你必須忘掉你所學(xué)的。
LUKE:(靜靜地集中精神)好吧,我試試看。
YODA:不,別老想著只“試試”。要么做,要么就別做。
而《帝國反擊戰(zhàn)》和上文掛畫的例子有什么聯(lián)系呢?
初級(jí)程序員們應(yīng)該“忘掉”他們覺得自己已經(jīng)知道的東西,然后重新學(xué)習(xí)他們需要的東西。
剛走出校園的程序員有兩種類型:他們要么干勁十足,隨時(shí)準(zhǔn)備改變世界;要么他們膽小如鼠,不敢抓住機(jī)會(huì)或者嘗試有風(fēng)險(xiǎn)的東西,生怕被炒魷魚。
第一種程序員,也是我非常擔(dān)心的一種。他們自認(rèn)為他們知道要做什么,并且在google和互聯(lián)網(wǎng)上搜索他們需要的資料——他們會(huì)為了掛畫把墻鋸開。或者他們會(huì)因?yàn)樯溽敇尯湍銧?zhēng)吵,因?yàn)樗麄冇X得那是對(duì)的:射釘槍釘釘子的效率更高。實(shí)際上他們錯(cuò)了,因?yàn)樯溽敇寷]法控制釘釘子的力量(它會(huì)把釘子整個(gè)釘進(jìn)墻里),并不適合掛畫。
另外一種就比較不幸了,他們沒法被用人單位接納。因?yàn)樗麄內(nèi)狈ぷ鞯闹鲃?dòng)性,所以他們沒法真正學(xué)到什么東西。他們只能做簡(jiǎn)單的拼寫檢查或是類似于行政助理的工作,甚至有可能一輩子都耗在HTML網(wǎng)頁上。他們會(huì)抱怨,厭倦這份工作,最后跳槽到郵政行業(yè),市場(chǎng)銷售行業(yè)(也許更糟,做個(gè)推銷員)。不管怎樣,這對(duì)他們沒有好處。
這不得不讓我深思:初級(jí)程序員應(yīng)該做些什么呢?如何讓一個(gè)程序員從入門到精通?初級(jí)開發(fā)人員應(yīng)該怎樣避免向這兩個(gè)極端發(fā)展呢?
結(jié)論就是:初級(jí)程序員們必須學(xué)會(huì)“問”。問了,就必定會(huì)有收獲。
看看急性子的初級(jí)程序員的例子:如果他敢于發(fā)問,“老板,我從來沒掛過畫,我該怎么做?”,就不會(huì)有射釘槍、磁帶、石膏鋸這樣的問題了。作為一個(gè)過來人,你應(yīng)該知道他沒有你那么經(jīng)驗(yàn)豐富。
老手們沒法了解新手們不會(huì)什么。但是幫助他們意識(shí)到“哪些不會(huì)”是非常重要的。這種關(guān)系就好比之前提到的絕地大師和絕地學(xué)徒之間的關(guān)系,也可以說是西斯領(lǐng)主和西斯學(xué)徒的關(guān)系,或者是千百年來人類歷史上的各種師徒關(guān)系。
最關(guān)鍵的一點(diǎn)呢?
從某個(gè)角度來說,我們都是初級(jí)程序員。就算你有四十年各平臺(tái)和嵌入式系統(tǒng)的C++開發(fā)經(jīng)驗(yàn),但涉及到關(guān)系數(shù)據(jù)庫(或是Nosql,或是Java和JVM,或是C#和CLR)的時(shí)候,你就是一個(gè)初級(jí)程序員。再換句話說,關(guān)于原力和拯救宇宙(包括一個(gè)后來你才知道是你妹妹的漂亮女孩)的絕地武士,你依然是個(gè)新手。
現(xiàn)在你知道該怎么做了。
為你自己找一位老師(也許現(xiàn)在更準(zhǔn)確的說法應(yīng)該是“導(dǎo)師”),向他們學(xué)習(xí)或是提問是非常有用的。然后,反過來,讓你的同事或是朋友中的初級(jí)程序員也這么做;他們不一定會(huì)接受你的幫助,但仔細(xì)想想,你在這個(gè)年紀(jì)的時(shí)候,不也希望有一位大師來教你嗎?
你是想成為愛抱怨的Luke Skywalker還是想成為絕地武士Luke Skywalker呢?Luke失去了一只手之后才明白Yoda遠(yuǎn)遠(yuǎn)比他聰明,應(yīng)該多請(qǐng)教他,而不是告訴他“你做錯(cuò)了”。
如果你不想讓項(xiàng)目出錯(cuò),還是老老實(shí)實(shí)承認(rèn)自己不是無所不能吧。如果你想讓你的項(xiàng)目更加出彩,不妨考慮一下我的建議。
it知識(shí)庫:別把自己當(dāng)個(gè)超人——給初級(jí)程序員的一點(diǎn)小小建議,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。