最近我在接受采訪時(shí)被問(wèn)到我關(guān)于成為一名偉大程序員的見(jiàn)解。這是一個(gè)有趣的問(wèn)題,我認(rèn)為我們都可以是偉大的程序員,無(wú)論我們的天賦如何,如果我們遵循一些規(guī)則的話——我相信——這應(yīng)該是常識(shí)。實(shí)際上,這些規(guī)則并不只適用于編程領(lǐng)域,也適合任何專業(yè)。
當(dāng)然,這十個(gè)Python程序員總結(jié)的要點(diǎn)中的所有內(nèi)容并不都是完全正兒八經(jīng)的,有些事情只是我的看法,你的情況可能會(huì)有所不同,所以如果出現(xiàn)矛盾的話,不要耿耿于懷。
這些要點(diǎn)是:
1.學(xué)習(xí)如何提問(wèn)
提問(wèn)題的Python程序員基本上有這些類型:
完美主義者:特別是在詢問(wèn)關(guān)于某些開(kāi)源工具的問(wèn)題時(shí),他們可能已經(jīng)通過(guò)代碼進(jìn)行了調(diào)試,發(fā)現(xiàn)了問(wèn)題的真正原因。但是即使沒(méi)有發(fā)現(xiàn)真正原因,完美主義者也會(huì)講明白這個(gè)問(wèn)題,重現(xiàn)步驟,建議可能行得通的解決方法,或者甚至是,建議可能行得通的修復(fù)途徑。事實(shí)上,完美主義者沒(méi)有問(wèn)題。只有答案。
話匣子:這個(gè)人實(shí)際上沒(méi)有問(wèn)問(wèn)題。他們表明他們的想法,有時(shí)會(huì)到處放置浮夸的問(wèn)號(hào)。對(duì)于問(wèn)題,他們給出的是他們的思路流程,如果你揣著答案等的話,他們要么自己找到了答案,要么在多封電子郵件之后才問(wèn)出真正的問(wèn)題?!芭?,對(duì)了,我發(fā)現(xiàn)這個(gè)需求是完全錯(cuò)誤的,我用一些其他的技術(shù)解決了這個(gè)問(wèn)題。實(shí)際上,我完全改變了庫(kù)。”呵呵。只希望他們別再問(wèn)問(wèn)題了。
笨蛋:代碼在這。我不知道哪里出錯(cuò)了?請(qǐng)幫幫我。
經(jīng)理:對(duì)于這種類型的人,時(shí)間就是金錢。問(wèn)題一定很短,答案越快越好。令人令人啼笑皆非的是,因?yàn)楸3謫?wèn)題簡(jiǎn)短(意即:不完整,不簡(jiǎn)潔),大多數(shù)情況下,會(huì)丟失很多重要的細(xì)節(jié),然后為了解答問(wèn)題,程序員只能請(qǐng)求更多細(xì)節(jié)。所以,經(jīng)理(自然會(huì)失望,因?yàn)樗玫降牟⒎鞘且粋€(gè)答案而是一個(gè)新的問(wèn)題)會(huì)再次發(fā)送一個(gè)短的訊息,并且更緊急地要求答案。循環(huán)往復(fù)。最后可能需要1-2周的時(shí)間才能解答。
抱怨者:這類人不問(wèn)問(wèn)題。他們一直一直抱怨,直到問(wèn)題消失。如果情況沒(méi)有變好,那就有了更多的理由抱怨。
現(xiàn)在應(yīng)該清楚的是,一個(gè)精心準(zhǔn)備的問(wèn)題(簡(jiǎn)明扼要,簡(jiǎn)單,簡(jiǎn)短,但有足夠的細(xì)節(jié))將會(huì)產(chǎn)生更佳的答案。如果你確切知道對(duì)于該問(wèn)題你需要學(xué)習(xí)什么,那么更有可能得償所愿。
2.學(xué)習(xí)如何不提出問(wèn)題
實(shí)際上,最好盡量避免提問(wèn)?;蛟S你可以自己弄清楚呢?當(dāng)然情況并不總是如此。許多事情你根本無(wú)法知道,通過(guò)詢問(wèn)Python領(lǐng)域?qū)<?,有助于找到抵達(dá)成功最快和最有效的途徑。但是,經(jīng)常自己去嘗試解決問(wèn)題有很多好處:
通過(guò)這種艱辛的方法學(xué)到的東西能夠更好地保存到記憶中——我們將牢牢記住所學(xué)到東西。
自己去尋找答案更有價(jià)值。
你不會(huì)制造“噪音”。還記得前面所說(shuō)的“話匣子”嗎?除非你詢問(wèn)的人有責(zé)任回答問(wèn)題(從而推遲他們的工作),否則他們可能會(huì)在不了解你的思維過(guò)程的情況下,來(lái)嘗試回答每一個(gè)不完整的“問(wèn)題”。這對(duì)任何人都沒(méi)有幫助。
通過(guò)推遲問(wèn)問(wèn)題(至少一段時(shí)間),你可以收集更多的相關(guān)信息,然后提供給可能能夠回答問(wèn)題的人。想想“完美主義者”,他們首先花更多時(shí)間尋找細(xì)節(jié),然后自己解答問(wèn)題。
通過(guò)訓(xùn)練你可以更擅于提問(wèn)。這需要時(shí)間。
3.不要遺留破碎的窗戶
最近有一篇非常有趣的文章,是關(guān)于不要留下破窗戶的。文章的本質(zhì)是永遠(yuǎn)不要妥協(xié)于質(zhì)量。永遠(yuǎn)不要成為逃兵。永遠(yuǎn)不要遺留…破碎的窗戶。以下引用自這篇文章:
“當(dāng)我們采取一些捷徑在最短的時(shí)間內(nèi)提供一些東西時(shí),反映了我們的粗心大意的代碼會(huì)讓我們之后的開(kāi)發(fā)人員(來(lái)自同一個(gè)團(tuán)隊(duì),未來(lái)的團(tuán)隊(duì),甚至我們自己?。┑贸鲆粋€(gè)重要的結(jié)論:對(duì)我們所生產(chǎn)的代碼付出足夠的關(guān)注并不重要。應(yīng)用程序漸漸開(kāi)始惡化將是一個(gè)不可阻擋的過(guò)程?!?/strong>
其實(shí),這并非意味著要成為一個(gè)完美主義者。有時(shí),修復(fù)破碎的窗戶是可以推遲的。但是,通常情況下,對(duì)于允許窗戶被打破和保持打破狀態(tài),沒(méi)有人會(huì)覺(jué)得開(kāi)心。我們程序員不開(kāi)心,我們的客戶不開(kāi)心,我們的用戶不開(kāi)心,我們的項(xiàng)目經(jīng)理也不開(kāi)心。這是一種態(tài)度,是作為專業(yè)人士的核心內(nèi)容。Benjamin Franklin怎么看呢?
“低價(jià)格的甜蜜被遺忘之后,低質(zhì)量的苦澀將回味悠長(zhǎng)。”
一切都是如此。“低價(jià)”是我們用一種草率的方式來(lái)實(shí)現(xiàn)某些東西而獲得的快速勝利。
4.軟件應(yīng)該是確定性的。這就是要瞄準(zhǔn)的目標(biāo)!
在理想化的世界中,軟件中的一切都應(yīng)該是“確定性的”。我們都應(yīng)該是函數(shù)式程序員,編寫(xiě)沒(méi)有副作用的純粹的函數(shù)。如String.contains。無(wú)論執(zhí)行以下操作多少次:
assertTrue(''abcde''.contains(''bc''));
…結(jié)果總是相同的,都是預(yù)期的結(jié)果。哪怕宇宙爆炸對(duì)這一計(jì)算也沒(méi)有影響。這是確定性的。
我們也可以在我們自己的程序中,而不僅僅是在標(biāo)準(zhǔn)庫(kù)中做到這一目標(biāo)。我們可以嘗試盡可能多地編寫(xiě)無(wú)副作用的確定性模塊。這真的與我們選擇什么技術(shù)無(wú)關(guān)。確定性編程可以用任何語(yǔ)言完成——即使函數(shù)語(yǔ)言有更多工具也可以通過(guò)更復(fù)雜的類型系統(tǒng)來(lái)防止意外的副作用。但是我所示的例子是一個(gè)Java示例。對(duì)象方向允許確定性。對(duì)的,像PL / SQL這樣的程序語(yǔ)言允許確定性。如果要在索引中使用函數(shù),那么需要請(qǐng)求確定性的函數(shù):
CREATEINDEX upper_first_name ON customer (upper (first_name));
-- Deterministic functionhere: -----------^^^^^^^^^^^^^^^^^^
這又是一個(gè)規(guī)則問(wèn)題。有副作用的過(guò)程/方法/“函數(shù)”是為“破窗戶”。有副作用也許會(huì)更容易維護(hù),當(dāng)然希望最終可以消滅副作用。但這通常是自己騙自己。當(dāng)將來(lái)的某一天意外突現(xiàn)的時(shí)候,就是你付出昂貴代價(jià)的時(shí)候。別不相信,說(shuō)曹操曹操就到。
5.接受意料之外的事情
程序員始終應(yīng)該遵守墨菲定律。一切都可能被打破。并且它即將被打破。作為軟件工程師,我們應(yīng)該謹(jǐn)記它是會(huì)破掉的。因?yàn)槲覀兊氖澜缡遣淮_定的,所以我們正在實(shí)現(xiàn)的業(yè)務(wù)需求也是不確定的。我們只有在終于能夠確定的時(shí)候,才能實(shí)現(xiàn)技巧#4(確定論)。否則,我們將不可避免地進(jìn)入不確定論的世界(也就是“現(xiàn)實(shí)世界”),即一個(gè)將會(huì)出錯(cuò)的世界。所以,要以此為基礎(chǔ)。接受意料之外的事情。訓(xùn)練你內(nèi)心的洪荒之力,從積極的角度預(yù)見(jiàn)各種麻煩。
當(dāng)然,如何以簡(jiǎn)潔的方式寫(xiě)代碼來(lái)預(yù)見(jiàn)各種麻煩就是另一個(gè)故事了。如何從那些可能會(huì)失敗的東西(因此不需要處理)中辨別那些將會(huì)失敗的東西(因此需要處理),還是需要通過(guò)一些實(shí)踐滴。
6.不要貨物崇拜。不要教條主義。始終具體情況具體對(duì)待。
所有教給你的內(nèi)容都存在潛在的錯(cuò)誤。即使是那些流行語(yǔ)。引用一句很不錯(cuò)的話:
“我的職業(yè)生涯至少有50%是為了幫助或解脫由教條主義引發(fā)的一個(gè)個(gè)災(zāi)難。
我們的職業(yè)充滿了虛假。我們喜歡把自己當(dāng)作數(shù)學(xué)家,堅(jiān)持最純粹的思想,認(rèn)為它們一定是正確的。
那是一條歧路。我們的職業(yè)構(gòu)建在數(shù)學(xué)的基礎(chǔ)之上,但除非你進(jìn)入范疇論或關(guān)系代數(shù)的時(shí)髦世界(即便你真的進(jìn)入,我也懷疑一切是否是“正確的”),否則你就得面對(duì)現(xiàn)實(shí)世界務(wù)實(shí)的業(yè)務(wù)需求。好吧,坦率地說(shuō),這離完美還有十萬(wàn)八千里。讓我們來(lái)看看一些最流行的編程語(yǔ)言:
C
Java
SQL
你真的覺(jué)得這些語(yǔ)言一點(diǎn)都不像數(shù)學(xué)嗎?行,不如我們先來(lái)討論段錯(cuò)誤,Java泛型和SQL三值邏輯。這些語(yǔ)言是由實(shí)用主義者建立的平臺(tái)。所有這些都有一些非常酷的理論背景,但最終,還是有了這些工具。
對(duì)于建立在語(yǔ)言之上的所有東西也是如此:庫(kù),框架,設(shè)計(jì)模式,甚至架構(gòu)。沒(méi)有什么是對(duì)的或是錯(cuò)的。一切都是為某些上下文設(shè)計(jì)的工具。想想在其上下文中的工具。永遠(yuǎn)不要把這個(gè)工具當(dāng)成一個(gè)獨(dú)立的理由。我們不是“為藝術(shù)而藝術(shù)”。
所以對(duì)這些質(zhì)疑說(shuō)不:
XML
JSON
功能編程
面向?qū)ο缶幊?/p>
設(shè)計(jì)模式
微服務(wù)
三層架構(gòu)
DDD
TDD
實(shí)際上:*DD
不勝枚舉
所有這些都是某些給定上下文的好工具,但并不總是如此,要學(xué)會(huì)具體情況具體對(duì)待。保持好奇心,開(kāi)發(fā)創(chuàng)造力,知道何時(shí)才需要使用這些工具,將有助于你成為一個(gè)更優(yōu)秀的程序員。
7.就是干
這是真理。話說(shuō),總有一些牛人出類拔萃,能夠傲視群雄,讓人鞭長(zhǎng)莫及。
但大多數(shù)程序員只達(dá)到“好”的級(jí)別,或是有潛力達(dá)到“好”的程度。那么怎么才能成為一名好的程序員呢?正如羅馬不是一天建成的,偉大的軟件也不是一天可以寫(xiě)成的,受歡迎的人并非我們這個(gè)時(shí)代唯一的英雄。我遇到過(guò)許多默默無(wú)聞但偉大的程序員,他們孜孜不倦地攻克軟件難題,解決了許多小公司隱蔽的問(wèn)題。
偉大的程序員都有一個(gè)共同點(diǎn):遇到問(wèn)題就是干。練習(xí),實(shí)踐。每天都致力于工作與學(xué)習(xí),然后變得越來(lái)越優(yōu)秀。
想要更擅長(zhǎng)SQL?那就干吧!每天都嘗試用一些新功能編寫(xiě)一個(gè)SQL語(yǔ)句。使用window functions。分組。遞歸。分區(qū)的外連接。MODEL和/或MATCH_RECOGNIZE子句。不需要每次都交付生產(chǎn),就是為了實(shí)踐。這些都是有價(jià)值的。
8.專注一個(gè)主題(從長(zhǎng)遠(yuǎn)的角度)
可能只有很少一部分“優(yōu)秀的”全棧開(kāi)發(fā)人員獨(dú)領(lǐng)風(fēng)騷。事實(shí)上,大多數(shù)全棧開(kāi)發(fā)人員都將位于中間水平。當(dāng)然,一個(gè)小團(tuán)隊(duì)可能只需要幾個(gè)全棧開(kāi)發(fā)人員,就可以涵蓋很多業(yè)務(wù)邏輯,快速推出一個(gè)新的軟件。但是,軟件將非常笨拙,“馬馬虎虎能工作”。也許這對(duì)于只要可行即可的產(chǎn)品階段來(lái)說(shuō)就已足夠,但從長(zhǎng)遠(yuǎn)來(lái)看,會(huì)導(dǎo)致全棧開(kāi)發(fā)人員將沒(méi)有時(shí)間來(lái)正確分析(或預(yù)見(jiàn)?。└鼜?fù)雜的問(wèn)題。
主要專注一個(gè)主題,并真正擅長(zhǎng)這個(gè)方面。真金不怕火來(lái)煉,只要你有本事,那么走到哪里都需要。所以,致力于你的職業(yè)生涯,做一些真正好的東西,而不是“差不多就行”。
9.涉獵廣泛
雖然你應(yīng)該主要關(guān)注一個(gè)主題,但不應(yīng)該完全遺忘其他方面。你永遠(yuǎn)不能馬上真正擅長(zhǎng)SQL、擴(kuò)大、擴(kuò)展、低級(jí)性能、CSS、面向?qū)ο蟆⑿枨蠊こ?、架?gòu)等等的所有內(nèi)容(見(jiàn)技巧#8)。這是不可能的。
但你至少應(yīng)該明白它們每一個(gè)的本質(zhì)。你需要明白何時(shí)SQL是正確選擇(以及何時(shí)不是)。何時(shí)低級(jí)別性能的調(diào)整很重要(何時(shí)不是)。CSS原則上如何工作。面向?qū)ο蟆P優(yōu)點(diǎn)。等等。
你應(yīng)該花一些時(shí)間涉獵這些(以及更多)概念和技術(shù),以便更好地了解它們的重要性。知道何時(shí)應(yīng)用它們,然后再找專業(yè)人士來(lái)實(shí)際執(zhí)行工作。
涉獵新的范式和技術(shù),有助于你用全然不同的思維方式思考,可能你會(huì)在以后的日常工作中不自覺(jué)地以某種方式用到它們。
10.保持簡(jiǎn)單,傻瓜式
愛(ài)因斯坦曾說(shuō):
“Everything should be made as simple as possible, but no simpler.”
(“任何事情都應(yīng)該盡可能簡(jiǎn)化,直到?jīng)]法再簡(jiǎn)化為止。”)
沒(méi)有人能夠處理巨大的復(fù)雜性。在軟件中不能,在生活的任何其他方面也不能。復(fù)雜性是好軟件的殺手,因此簡(jiǎn)單性是使能者。易于明白。難于實(shí)現(xiàn)。你需要大量時(shí)間和實(shí)踐才能識(shí)別和生產(chǎn)出簡(jiǎn)單。當(dāng)然,你可以遵循許多規(guī)則來(lái)實(shí)現(xiàn)簡(jiǎn)單化。
最簡(jiǎn)單的規(guī)則之一就是使用只有幾個(gè)參數(shù)的方法/函數(shù)。讓我們來(lái)看看吧。前面提到的String.contains方法就是如此。我們可以寫(xiě)”abcde”.contains(“bcd”),不閱讀任何文檔,每個(gè)人都能立即了解這做什么以及為什么。該方法做了一件事情,并且只做這一件。沒(méi)有復(fù)雜的上下文/設(shè)置/其他傳遞給該方法的參數(shù)。沒(méi)有“特殊情況”,也沒(méi)有任何警告。
此外,在庫(kù)中簡(jiǎn)化比在業(yè)務(wù)邏輯中要簡(jiǎn)單得多。那么我們能實(shí)現(xiàn)嗎?也許吧。通過(guò)實(shí)踐。通過(guò)重構(gòu)。但像偉大的Python軟件一樣,簡(jiǎn)單性也不是一天可以搞定的。
聯(lián)系客服