無(wú)論你是剛?cè)刖幊痰男“?,還是已經(jīng)浸潤(rùn)編程數(shù)年的資深人員。相信這篇文章都會(huì)給你帶來(lái)不一樣的啟發(fā),前人的經(jīng)驗(yàn)永遠(yuǎn)是我們最容易看到的捷徑。 作者 | Erik Dietrich 譯者 |彎月,責(zé)編 | maozz 出品 | CSDN(ID:CSDNnews) 以下為譯文: 今年,我對(duì)DEV社區(qū)平臺(tái)(https:///)有了很大的了解。在Reddit眾多怒氣沖沖的評(píng)論家以及急于否定他人的鑒賞家中,這個(gè)平臺(tái)積極的正能量宛如一片綠洲,讓人眼前一亮,并為我們帶來(lái)了更廣闊的軟件世界。 這個(gè)社區(qū)非常有趣的一面是,社區(qū)中似乎有很多初學(xué)者。我經(jīng)??吹叫率肿珜懙奶右约懊嫦蛐率值奶?。所謂“新手”,指的是那些渴望成為程序員的人,他們或者在參加培訓(xùn)班,或者在尋找入門級(jí)的工作,或者只是不幸被定義為“初級(jí)”的角色。 我覺得這很有趣。相對(duì)而言,新手對(duì)該行業(yè)充滿更多熱情和興奮。而這種興奮是富有感染力。 然而,同時(shí)也讓我感受到我在這個(gè)行業(yè)中屬于前輩了。 我想起了Bob Martin曾在播客或演講中說(shuō)過(guò)的一段話。 在過(guò)去的4-5年中,程序員的需求急劇增長(zhǎng),以至于程序員的數(shù)量每隔5年就會(huì)翻一番。結(jié)果是,擁有5年經(jīng)驗(yàn)的程序員在這個(gè)行業(yè)的任職時(shí)間甚至超過(guò)了該行業(yè)的一半。 行業(yè)的前輩 如今,我已在這個(gè)行業(yè)中度過(guò)了20個(gè)春秋。其中的10年時(shí)間里,我的主要工作都是編寫代碼。而另外10年都在管理程序員、指導(dǎo)他們,就如何管理程序員向組織提供咨詢,運(yùn)行代碼庫(kù)評(píng)估實(shí)踐,而如今的我在從事內(nèi)容營(yíng)銷。 但是,無(wú)論身處以上哪個(gè)職位,我都在或多或少地編寫代碼。 根據(jù)上述有關(guān)程序員增長(zhǎng)速度的估算,我比這個(gè)行業(yè)中94%的人都年長(zhǎng)。 所以,總結(jié)起來(lái)說(shuō),我是一個(gè)與編程新手廝混在一起的編程愛好者。 于是,我不禁在想:“如果我可以將這段經(jīng)歷總結(jié)成一些簡(jiǎn)短的建議,再假設(shè)有人感興趣,那么我會(huì)對(duì)他們說(shuō)什么呢?” 以上就是這篇文章的背景。下面讓我來(lái)談一談20年編程生涯為我?guī)?lái)的重大教訓(xùn)和收獲。 最糟糕的莫過(guò)于知識(shí)重復(fù) “避免復(fù)制粘貼的編程!” 如果你在編寫應(yīng)用程序時(shí),總是靠復(fù)制、粘貼和修改代碼,如果還沒有人因此而拿戒尺打你的手心,那么現(xiàn)在你自己動(dòng)手吧。 你應(yīng)該停止這種做法。立刻,馬上!這是一種可怕又偷懶的做法。 想象一下,你有一個(gè)完美的CalculateBill方法,但是產(chǎn)品經(jīng)理猶豫著說(shuō):“我們有一部分客戶來(lái)自墨西哥,那邊的賬單計(jì)算方式不一樣?!庇谑?,你復(fù)制了這個(gè)方法,重新命名為CalculateBillMexico,并根據(jù)需要做出調(diào)整。 這種方法的問題在于:
是不是一塌糊涂?而這只是“復(fù)制-粘貼”的表面問題。 復(fù)制粘貼只是一個(gè)開端 真正的問題在于系統(tǒng)中的知識(shí)重復(fù)。 系統(tǒng)中的知識(shí)重復(fù)可以以多種方式發(fā)生,而無(wú)腦地復(fù)制粘貼只是最明顯和最愚蠢的方式。知識(shí)重復(fù)的其他形式還包括: for循環(huán)上方的代碼注釋解釋循環(huán)的開始、結(jié)束和增量。 全局變量在程序里賦了一個(gè)值,然后從配置文件中重新賦了另一個(gè)值。 數(shù)據(jù)庫(kù)表中同時(shí)包含“稅前總額”、“稅款”以及“總金額”三列。 范圍很廣的ERP系統(tǒng),CRM模塊中存儲(chǔ)了客戶信息,然后在賬單模塊中又存儲(chǔ)了一次。 對(duì)于以上所有這些情況來(lái)說(shuō),最好的打算也不過(guò)是通過(guò)恰當(dāng)?shù)牧鞒毯拖到y(tǒng)來(lái)認(rèn)真地跟蹤重復(fù)并確保同步更新。 至于一無(wú)是處的代碼注釋,團(tuán)隊(duì)的領(lǐng)導(dǎo)會(huì)警告你每次更新代碼時(shí),都別忘了檢查注釋。 還有上述的ERP系統(tǒng),銷售和會(huì)計(jì)兩個(gè)部門都需要嚴(yán)格地制定備忘錄,并通過(guò)發(fā)送正式電子郵件確??蛻粜畔⒈3滞?。 而且,請(qǐng)記住,這些還只是最好的打算。 當(dāng)你為了確保同步開始構(gòu)建復(fù)雜的邏輯(那么你就必須進(jìn)行維護(hù)——請(qǐng)參照下一節(jié))時(shí),情況就會(huì)每況愈下。 也許你只需要實(shí)現(xiàn)一個(gè)數(shù)據(jù)庫(kù)觸發(fā)器,就可以在“總金額”列發(fā)生變化時(shí)確?!岸惽敖痤~”+“稅款”=“總金額”?;蛘?,你也可以編寫尷尬的狀態(tài)檢查邏輯,當(dāng)默認(rèn)的全局變量值與配置文件分配的值不匹配時(shí),記錄警告。 糟糕時(shí)候,上述情況會(huì)造成數(shù)據(jù)不同步。然而,作為程序員,你可能不必?fù)?dān)心,因?yàn)槟愕墓ぷ饕舶ㄅ宄槭裁炊嗄陙?lái)從未給某個(gè)客戶開過(guò)發(fā)票或多收了客戶很多錢。 然而,根除系統(tǒng)中出現(xiàn)的知識(shí)重復(fù)問題并積極抵制,就可以避免所有這些情況。 代碼是負(fù)債 作為開發(fā)人員,我們喜歡寫代碼。寫代碼的感覺非常好,而且構(gòu)建軟件令人興奮。 此外,我們還需要學(xué)習(xí)新的語(yǔ)言、范例、框架、技術(shù)棧、工具、API和庫(kù)。我們沉浸在自己的內(nèi)心世界,享受快樂地編寫代碼的狀態(tài)。 然而,沉浸在代碼世界而不自知的不止我們。 被誤導(dǎo)的禿頭老板甚至用每小時(shí)生成的代碼行數(shù)作為生產(chǎn)力的度量指標(biāo)。但是即便你沒有那么愚蠢,也很容易認(rèn)為代碼自然是越多越好。事實(shí)上,代碼是應(yīng)用程序和業(yè)務(wù)的殺手,而各個(gè)公司卻把它當(dāng)成有價(jià)值的知識(shí)產(chǎn)權(quán)。 還是忘記這些無(wú)稽之談吧。 我能理解為什么我們將代碼視為資產(chǎn)。但是實(shí)際上代碼完全是負(fù)債。 少即是多 你知道有人可以用10行代碼實(shí)現(xiàn)別人要100行代碼才能實(shí)現(xiàn)的功能嗎?那么你知道比10行代碼更好的是什么嗎?那就是0行代碼。 比如,我們寫了一行代碼:
你知道這中間可能會(huì)出多少錯(cuò)嗎?
保守地說(shuō),這行代碼可能會(huì)出10個(gè)錯(cuò)誤。那么現(xiàn)在,讓我們?cè)黾拥?行代碼。 你是否覺得2行代碼可能會(huì)出20個(gè)錯(cuò)誤? 我認(rèn)為2行出的錯(cuò)誤可能會(huì)超過(guò)100個(gè)。你可能覺得我過(guò)于悲觀,但是我認(rèn)為潛在的問題與代碼行數(shù)之間的關(guān)系更接近排列組合的個(gè)數(shù),而非線性關(guān)系。 我有多年專業(yè)管理顧問的經(jīng)驗(yàn)。我做過(guò)數(shù)據(jù)驅(qū)動(dòng)代碼庫(kù)的評(píng)估,并幫助IT領(lǐng)導(dǎo)者制定有關(guān)代碼庫(kù)的戰(zhàn)略決策。 因此,我有機(jī)會(huì)查看、分析和收集大量代碼庫(kù)的統(tǒng)計(jì)信息。 如果算上我利用自動(dòng)化分析過(guò)的客戶端代碼庫(kù)之上的代碼庫(kù)的話,那么我總共收集了1000多個(gè)代碼庫(kù)的詳細(xì)統(tǒng)計(jì)信息。在獲取這些數(shù)據(jù)后,我進(jìn)行了回歸分析,以尋找相關(guān)性。 你知道對(duì)代碼庫(kù)造成負(fù)面影響最大的因素是什么嗎?代碼庫(kù)的大小。 幾乎所有與代碼庫(kù)有關(guān)的問題都與代碼庫(kù)的大?。ㄒ赃壿嫶a行來(lái)衡量)有著顯著的關(guān)系。 我喜歡代碼。 我喜歡編寫代碼、研究代碼、分析代碼,并通過(guò)代碼來(lái)構(gòu)建事物。但是請(qǐng)不要誤解,代碼是一個(gè)巨大的負(fù)債。我們始終應(yīng)該努力用盡可能少的代碼來(lái)完成所有工作。 高級(jí)開發(fā)人員:信任,但要自行驗(yàn)證 23歲時(shí),我開始了第一份軟件工程師的工作,我非常敬佩公司里的高級(jí)開發(fā)人員。Paul、Raymond、Chris、Ken,他們都有20年的經(jīng)驗(yàn),我至今仍然記得每一個(gè)人,而他們熟練使用多種編程語(yǔ)言的能力也讓我看傻了眼。 我從他們那里學(xué)到了很多東西。 我之所以提到這些,是因?yàn)槲蚁脒^(guò)渡到接下來(lái)要說(shuō)的話。 如果你是這個(gè)行業(yè)的新手,那么可能就會(huì)像我一樣,認(rèn)為團(tuán)隊(duì)里高級(jí)開發(fā)人員的每句話都是金玉良言。而且如果你幸運(yùn)的話,很多高級(jí)開發(fā)人員確實(shí)是不可多得的人才。 然而,并非所有高級(jí)開發(fā)人員的水平都相同。 回想起來(lái),我上面提到的同事都是優(yōu)秀的程序員,我從他們那里學(xué)到了很多東西。但是,我也明白在我的職業(yè)生涯中,最初的經(jīng)歷都很幸運(yùn)。 很多公司擁有很多出色的高級(jí)開發(fā)人員,但也有很多公司擁有的高級(jí)開發(fā)人員較少,或者他們的高級(jí)開發(fā)人員在技術(shù)上并不過(guò)關(guān),但是這些高級(jí)開發(fā)人員仍然任職很久,遲遲沒有被解雇,甚至可能得到晉升,頂著“高級(jí)”或“首席”的頭銜。 這種現(xiàn)象非常普遍,甚至有人稱之為“專家級(jí)初學(xué)者”。 我說(shuō)這些是為了警告你,有很多高級(jí)開發(fā)只是表面上裝出來(lái)的,實(shí)際上并不稱職。 因此,在你是新手時(shí),沒有確鑿的證據(jù)就不應(yīng)該質(zhì)疑他們,但不要輕易假設(shè)他們告訴你的是對(duì)還是錯(cuò)。你需要自行驗(yàn)證(最好不要當(dāng)著他們的面)。 TDD(測(cè)試驅(qū)動(dòng)開發(fā))不僅有效,而且還可以積極地改變編程的方式 在涉及任何與編程或技術(shù)相關(guān)的問題時(shí),身處該行業(yè)的我們都會(huì)帶有偏見。
只要提到以上任何一個(gè)建議,就會(huì)看到持有強(qiáng)烈見解的人們吵得沸反盈天。因此,考慮到所有這些因素,我意識(shí)到我自己也陷入了類似的境界:“順TDD者是生存還是毀滅”。 我的目的不是給你洗腦,而是分享我的經(jīng)驗(yàn)。 大約在10年前,我對(duì)TDD持懷疑態(tài)度。請(qǐng)注意,我不是一個(gè)單元測(cè)試懷疑論者,剛開始的時(shí)候我就同意這是一種很有幫助的做法。 但是對(duì)于TDD?我不太確定。 我決定寫一篇博客,介紹為什么TDD并不是那么出色。 但是,我不想就此事寫一篇文章表達(dá)站不住腳的廉價(jià)觀點(diǎn)。因此,我決定嚴(yán)格按照TDD建立一個(gè)小型客戶項(xiàng)目,然后我就可以在文章中寫:“我花了幾周的時(shí)間來(lái)驗(yàn)證TDD,結(jié)果卻并不美麗?!?/p> 然而,命運(yùn)總是充滿了意外驚喜。 對(duì)TDD的幡然醒悟 那天真是尷尬又怪異。確切來(lái)說(shuō)是好幾天。 整個(gè)過(guò)程非常漫長(zhǎng),我所作的一切都非常笨拙且不自然。我記錄了一條又一條筆記,作為證明TDD很糟糕的證據(jù)。 然而,后來(lái)發(fā)生了一件有趣的事情。 我對(duì)這種笨拙的范例非常著迷,每天我都花4-5個(gè)小時(shí)編寫代碼,但中間并沒有停下來(lái)實(shí)際運(yùn)行應(yīng)用程序,檢查我的更改是否有效。換做往常,每隔10分鐘我就會(huì)運(yùn)行一次應(yīng)用程序,檢查程序是否正確,看看我的更改是否確實(shí)有效。 在發(fā)現(xiàn)自己已經(jīng)寫了幾個(gè)小時(shí)的代碼后,我啟動(dòng)了應(yīng)用程序,嘆了口氣,以為接下來(lái)就是長(zhǎng)達(dá)幾個(gè)小時(shí)的調(diào)試。畢竟,我推遲了將近30個(gè)周期。 然而,神奇的事情發(fā)生了,一切都能正常工作。 第一次運(yùn)行,一切都很完美,竟然沒有出現(xiàn)一個(gè)異常,也沒有發(fā)生任何意料之外的事情。我花了幾個(gè)小時(shí)編寫代碼,中途并沒有檢查GUI,也沒有在運(yùn)行時(shí)驗(yàn)證,但一切都能正常工作。 最終,我寫了一篇與預(yù)想截然相反的關(guān)于TDD的文章。從此我就踏上了這條不歸之路。 我學(xué)習(xí)了這項(xiàng)技術(shù),掌握了這項(xiàng)技術(shù),教授了有關(guān)該技術(shù)的課程,并對(duì)開發(fā)人員進(jìn)行了指導(dǎo)。但此外之外,我還檢查了單元測(cè)試對(duì)代碼庫(kù)的影響,發(fā)現(xiàn)這些影響無(wú)疑都是正面的。 所以,你也可以嘗試學(xué)習(xí)TDD,你絕不會(huì)后悔。 證據(jù)才是王道 到目前為止,在這篇文章中,我提到了有關(guān)代碼庫(kù)的評(píng)估實(shí)踐,還討論了經(jīng)驗(yàn)數(shù)據(jù)。最后讓我再介紹一下職業(yè)生涯的最后一課。 證據(jù)就是一切。 代碼審查可以作為一種有教育意義的授權(quán)活動(dòng)。同時(shí),代碼審查也可以抹殺一個(gè)人的靈魂。 不過(guò),通常代碼審查都在啟發(fā)性體驗(yàn)和毫無(wú)意義的爭(zhēng)吵之間來(lái)回?fù)u擺。 你可能會(huì)聽到“設(shè)計(jì)不佳”或“效率不高”之類的反饋。你也可能會(huì)說(shuō)這些話。而且,你極有可能會(huì)在沒有任何證據(jù)的情況下聽到或說(shuō)出這樣的話。 你需要改正這一點(diǎn)。 證據(jù)的重要性 如果有人在代碼審查或其他形式的團(tuán)隊(duì)或組織協(xié)作中,以惡劣的態(tài)度對(duì)待你,那么你就應(yīng)該拿起證據(jù)的武器。如果你想就某件事情向管理層或領(lǐng)導(dǎo)層提出任何想法,那么也應(yīng)該拿出證據(jù)。 證據(jù)可以幫你贏得辯論、組織、領(lǐng)導(dǎo)角色和職業(yè)發(fā)展。 你不同意團(tuán)隊(duì)廣泛使用全局變量的做法?不要做無(wú)謂之爭(zhēng),你需要證明。 我所說(shuō)的“證據(jù)”并不是指尋找類似于“全局變量的弊端”等文章,或拿權(quán)威人士嚇唬人。我的意思是查找代碼庫(kù)中沒有全局狀態(tài)的模塊,并對(duì)照這些模塊與JIRA問題票的發(fā)生率。 你們團(tuán)隊(duì)中是否有人要求你不要使用你選擇的庫(kù)或API,只是因?yàn)槟撤N模棱兩可的性能問題?你會(huì)服氣嗎? 那就證明這個(gè)人錯(cuò)了。實(shí)際動(dòng)手試試看。 你需要習(xí)慣于動(dòng)手實(shí)驗(yàn),而不是大聲表達(dá)自己的觀點(diǎn)或加倍考慮。這可以直接驗(yàn)證你自己的想法。 有時(shí),你會(huì)意識(shí)到自己的懷疑是對(duì)的。而有時(shí),你會(huì)意識(shí)到自己錯(cuò)了,這都很有價(jià)值。 但更重要的是,你可以提出別人無(wú)法反駁的論點(diǎn),并樹立勤奮和正確的好名聲。這種做法還可以幫助你克服看似無(wú)法克服的困難,例如“我只是個(gè)新人,而他是高級(jí)工程師(專家級(jí)初學(xué)者)”。 更進(jìn)一步,這還可以為你的職業(yè)發(fā)展奠定基礎(chǔ)。 編寫代碼的能力可以讓你收獲一份收入豐厚的職業(yè)。能夠編寫代碼并通過(guò)證據(jù)提供技術(shù)和業(yè)務(wù)上的決策可以確保你的職業(yè)生涯迅速取得成功。 你是否愿意聽取以上意見? 我感覺這篇文章富有哲理。實(shí)際上,我是在芝加哥飛往休斯敦的飛機(jī)上寫下了這篇文章,當(dāng)時(shí)的我端著一杯酒,又無(wú)法使用wifi。在百無(wú)聊賴中,我只能與空姐交談,然后就回憶起了我的職業(yè)生涯。 我認(rèn)為如果你足夠努力,就可以就這些觀點(diǎn)進(jìn)行辯論。 但是,我不打算將這些作為一成不變的編程法則或某種專業(yè)行為的準(zhǔn)則。我會(huì)把這些我在職業(yè)生涯中所學(xué)到的教訓(xùn)作為課程,并附上警告事項(xiàng),因?yàn)檫@些只是我個(gè)人的觀點(diǎn)。 最后,希望這些意見對(duì)你有所幫助。你可以自行決定是否聽取這些意見。 原文:https://daedtech.com/5-things-ive-learned-in-20-years-of-programming/ 本文為 CSDN 翻譯,轉(zhuǎn)載請(qǐng)注明來(lái)源出處。 |
|
來(lái)自: 天下小糧倉(cāng) > 《程序員》