沖冠一怒為代碼:論程序員與負(fù)能量

沖冠一怒為代碼:論程序員與負(fù)能量

沖冠一怒為代碼:論程序員與負(fù)能量

(本文已被譯為俄文和西班牙文,十分感謝譯者們。)

此刻我正凝視著一段代碼。這段代碼,可以說是我見過的最爛的代碼之一。為了更新數(shù)據(jù)庫中的單條記錄,其作者竟然把集合中的每條記錄都獲取到,更新后再為數(shù)據(jù)庫中的每條記錄都發(fā)送一個請求 —— 而不僅僅是只操作需要更新的那一條。代碼中還有一個 map 函數(shù),除了返回傳入的值以外別無他用。還有一些條件判斷語句,似乎是用來檢查值相同而命名風(fēng)格不同(駝峰風(fēng)格和下劃線風(fēng)格)的變量。每一次的更新操作(動輒操作每條記錄,包括沒有變動的條目),都要向消息總線發(fā)送一條消息,用以調(diào)用另一個無服務(wù)方法,此方法為同一個數(shù)據(jù)庫中的另一個集合執(zhí)行所有工作。我是不是還沒提到這是面向云“服務(wù)”的“架構(gòu)”中的一個無服務(wù)函數(shù),像這樣的函數(shù)每個環(huán)境里都有 100 多個?

這還是人干的事嗎?我把臉深深埋進(jìn)手掌,禁不住邊笑邊哭出了聲。同事們都問我怎么了,于是我向他們繪聲繪色地描述了這段 Chuck Parsley 出品的 2018 年年度 BulkDataImporter.js 最垃圾代碼榜單。每個人聽了都同情地點(diǎn)頭,我們都覺得:他們怎么能這樣對我們?

負(fù)能量:編程文化中的情緒工具

負(fù)能量是編程中的重要組成部分。負(fù)能量在多個層面上根植于我們的文化,這是我們分享經(jīng)驗(yàn)和撕逼故事(“代碼寫成這樣,你敢信?”)、表達(dá)和同情挫敗感(“皇天在上啊!怎么能干出這種事??!”)、把我們自己粉飾得更優(yōu)秀(“換做是我,才不會寫得這么爛呢”)、甩鍋踢皮球(“我們失敗了是因?yàn)?Chuck Parsley 的代碼爛泥扶不上墻”)或者在氛圍差勁的組織中羞辱并操縱別人(“寫代碼能不能走點(diǎn)心?趕緊修復(fù)你的 Bug!”)的方式。

沖冠一怒為代碼:論程序員與負(fù)能量

對程序員這個群體來說,負(fù)能量太重要了,因?yàn)檫@樣傳達(dá)價值觀最有效。當(dāng)我在一個編程培訓(xùn)班執(zhí)教時,用適當(dāng)?shù)膼焊銏D、傳聞逸事和視頻向?qū)W生灌輸行業(yè)文化是標(biāo)準(zhǔn)做法,而這些素材中最流行的主題就是圍繞程序員在外行面前的挫敗感的。想要指出哪些行為習(xí)慣是好的、壞的、壞到家了絕不要犯的,借助情緒工具來表達(dá)再合適不過了。應(yīng)該幫助新手程序員們做好心理建設(shè),讓他們知道他們會被非技術(shù)行業(yè)的同事以這樣那樣的方式誤解;會有朋友們來安利他們的“價值百萬”的 App 創(chuàng)意;會被壓在“祖?zhèn)鞔a”的五指山下,任你一個筋斗 8848 光年也難以脫身。

當(dāng)我們剛開始學(xué)習(xí)寫代碼時,我們的通過觀察他人對代碼的情緒反應(yīng)來判斷代碼的好壞??匆豢?ProgrammerHumor 版塊吧,那里到處都是新手程序員,看看里面的帖子你就會深切體會到這一點(diǎn)。許多帖子表達(dá)的幽默帶有各種各樣的負(fù)面情緒:挫敗感、悲觀、憤怒、幻滅感和傲慢等等。(如果你想見識見識真正的負(fù)能量,那就讀讀評論吧。)

沖冠一怒為代碼:論程序員與負(fù)能量

我注意到,程序員的負(fù)能量常常隨著經(jīng)驗(yàn)的增長而增長。當(dāng)程序員還是萌新的時候,他們不知道有什么坎坷等著他們,所以他們躊躇滿志地邁開腳步,愿意相信路途艱險只是因?yàn)樗麄兘?jīng)驗(yàn)還不足、眼界還不寬,他們自信最終能夠掌控一切。

隨著時間的流逝和學(xué)識的增長,當(dāng)初的萌新現(xiàn)在已經(jīng)能夠分辨代碼的優(yōu)劣。一旦進(jìn)入這個階段,他們就會直接體會到工作中遇到的爛代碼帶來的挫敗感,如果他們身處于一個團(tuán)體(無論是線上團(tuán)體還是一個實(shí)際團(tuán)隊)中,團(tuán)體中比他們資深的程序員的情緒習(xí)慣,會頻頻出現(xiàn)在他們身上?,F(xiàn)在他們能夠頭頭是道地分析代碼、區(qū)分代碼的優(yōu)劣,這種方式讓他們顯得很“懂行”,負(fù)能量通常就是在這種過程中積壓起來的。越是消極越是有好處:表達(dá)挫敗感能幫你輕松與同事打成一片、融入團(tuán)隊,并且貶低爛代碼能夠抬高自己,讓你表現(xiàn)得更加像個優(yōu)秀的工程師 —— 消極地表達(dá)觀點(diǎn)的人通常被認(rèn)為更聰明、更能干。

這種負(fù)能量的增加并不一定是件壞事。探討編程時最主要的就是非常關(guān)注所寫的代碼的質(zhì)量。代碼的質(zhì)量決定了性能(不考慮硬件、網(wǎng)絡(luò)等因素),因此能夠針對代碼表達(dá)出自己的觀點(diǎn)很重要。幾乎所有的關(guān)于代碼的討論都可以歸結(jié)成是對于代碼質(zhì)量的評定,簡單的一句評語里就蘊(yùn)含著評價代碼質(zhì)量的情感:

  • “那個模塊里有很多地方的邏輯都前后不一致,應(yīng)該優(yōu)先進(jìn)行重要性能優(yōu)化”
  • “那個模塊寫得挺爛的,應(yīng)該重構(gòu)”
  • “那個模塊狗屁不通,趕緊回爐重造吧”
  • “那個模塊寫得真垃圾,需要修補(bǔ)修補(bǔ)”
  • “那個模塊就是一坨屎,把它寫出來就是犯罪,Parsley 腦子里想他喵的什么呢”

(順便說一句,這種“情感的火花”會使開發(fā)者們用“性感”來形容代碼,這樣的形容不太應(yīng)景 —— 除非你在 PornHub 上班。)

當(dāng)然了,問題在于,人類就是一種奇怪的、搖擺不定的情緒化動物,接收表達(dá)的情緒都能改變我們 —— 這種改變一開始是細(xì)微的,而經(jīng)過漫長的歷程后,這種改變就扎根深處了。

負(fù)能量是一條曲折泥濘的下坡路

幾年前,我是一個非正式的團(tuán)隊領(lǐng)導(dǎo),為我司面試過一位開發(fā)者。我們非常喜歡他;他敏銳、善于發(fā)問、有技術(shù)才能,并非常契合公司文化。我特別欣賞他的積極向上和踏實(shí)肯干。因此我們聘用了他。

彼時,我已經(jīng)在公司任職多年,意識到了公司文化中缺乏進(jìn)取意識。我們曾幾次三番想要推出一個產(chǎn)品,甚至在我入職前就已經(jīng)失敗過好幾次,屢次不成導(dǎo)致耗資巨大,換來的結(jié)果不過是連續(xù)挑燈夜戰(zhàn)、一推再推的交付日期和好歹算是能用的產(chǎn)品。雖然我還在盡職盡責(zé)地努力工作,但對于管理層下達(dá)的最后期限,我的懷疑態(tài)度溢于言表。每當(dāng)和同事討論起代碼中某些令人生厭的部分時,我就信口開罵。

幾周后,那位新聘進(jìn)來的開發(fā)者表達(dá)出了和我一樣的負(fù)能量(連罵法都一模一樣)—— 其實(shí)這本在情理之中,卻出乎我意料之外。我感覺這并不是他的本色表現(xiàn),或者換一家文化不同的公司,他的舉止又該有所不同。但他偏偏吸收了我傳達(dá)的文化,只是為了融入團(tuán)隊。我腸子都悔青了。只因?yàn)槲易约旱闹饔^感受,就給新員工設(shè)定了一種消極的基調(diào),而我覺得他本不至于如此。就算那些負(fù)能量的表現(xiàn)并非他的真實(shí)感受,只是為了體現(xiàn)他和同事脾氣相投,那也要怪我把惡劣的態(tài)度展示給他了。常言道,近朱者赤,近墨者黑。

沖冠一怒為代碼:論程序員與負(fù)能量

負(fù)能量的陽關(guān)道和獨(dú)木橋

對于我們現(xiàn)在的中級開發(fā)人員來說,能從過往經(jīng)歷中獲得一些智慧和經(jīng)驗(yàn)是一個快樂的故事:他們在編程行業(yè)的見識越來越廣,意識到爛代碼無處不在、如影隨形。就算在那些最先進(jìn)、最注重代碼質(zhì)量的公司中,爛代碼同樣存在。(而且我跟你說,現(xiàn)代化并不總是治愈爛代碼的良方。)

因此到后來,這些開發(fā)者開始接受這樣的事實(shí):爛代碼注定就是軟件的一部分,而他們的工作就是優(yōu)化這些爛代碼。若不少見,則無需多怪。他們采取佛系心態(tài),專注于如何解決擺在眼前的問題或者任務(wù),學(xué)著如何精確評估軟件的質(zhì)量情況,并傳達(dá)給利益相關(guān)者,他們憑多年經(jīng)驗(yàn),將軟件質(zhì)量吹得天花亂墜。最終憑借卓越而一貫地奉獻(xiàn),他們得到了豐厚的獎勵。他們功績豐偉,故此得到上千萬美元的獎金,然后退休去做他們想做的事,以此度過余生。(我的結(jié)局可千萬也要如此美滿啊?。?/p>

沖冠一怒為代碼:論程序員與負(fù)能量

而另一部分人則走上了一條黑暗之路。他們沒能覺悟到爛代碼是避無可避的,他們篤信爛代碼是軟件中的癰疽,他們毅然扛起大旗,勢要干掉爛代碼。他們之所以拒絕與爛代碼安然共處,確有很多充分的理由:人們應(yīng)該越來越聰明,不能越來越笨;爛代碼是對程序員的冒犯;爛代碼影響生意;消滅爛代碼能證明我是個小機(jī)靈;要是我不指出這代碼有多爛,那我們整個公司就要破產(chǎn)倒閉關(guān)門大吉了。

不幸的是,由于業(yè)務(wù)需求推著他們持續(xù)開發(fā)功能,他們無暇去操心代碼質(zhì)量,于是無力去實(shí)施那些優(yōu)化代碼的宏偉計劃,最終只好變成了“怨婦”。由于他們還是能勝任工作的,所以暫時沒被辭退,但會被發(fā)配到公司的角落,這樣既不會打擾到別人,又能保證關(guān)鍵系統(tǒng)的運(yùn)轉(zhuǎn)。于是他們沒法獲得新的開發(fā)機(jī)會,他們的技能逐漸萎縮,逐漸被業(yè)界所邊緣化。他們胸中的郁結(jié)潰爛流膿,而后結(jié)成堅硬的痂,他們會發(fā)現(xiàn)自己喜歡和二十多歲的 CS 學(xué)生爭論那些他們最愛的老舊技術(shù)如何如何可行、怎么怎么好用 —— 以此來維持自尊。最終,他們退休了,終日對著鳥兒發(fā)脾氣泄憤。

現(xiàn)實(shí)情況可能處于兩種極端之間。

有些公司在極端消極的、頗具地盤觀念的、強(qiáng)勢的文化氛圍下,能夠發(fā)展得相當(dāng)好 —— 例如迷失年代之前的微軟,這些公司往往擁有一款市場前景極好的產(chǎn)品并急需擴(kuò)張;或者往往以命令和控制為結(jié)構(gòu)(Steve Jobs 鼎盛時期的蘋果公司),所有人都只聽一人號令,至于他們自己的看法嘛,不重要。然而,現(xiàn)代商業(yè)調(diào)查(現(xiàn)在已經(jīng)成為常識)一次次表明,要做到宏觀層面的革新和微觀層面的盡善盡美,需要頂級的創(chuàng)造力,而頂級的創(chuàng)造力來自不受高壓限制的流暢、有創(chuàng)造性且有條理的思路。當(dāng)你擔(dān)心同事會對你寫的每一行代碼出言不遜時,你很難開展語言驅(qū)動的、創(chuàng)造性的工作。

碼農(nóng)“流行”文化中的負(fù)能量

如今,工程師們的態(tài)度正受到前所未有的關(guān)注?!安环笢喸瓌t”的概念在工程組織中越來越常見。Twitter 上涌現(xiàn)了越來越多的奇聞軼事,說的都是人們因?yàn)闊o法(不愿)忍受排外觀念和地盤觀念,而徹底退出編程行業(yè)。即使是 Linus Torvalds,也為自己多年來對其他 Linux 開發(fā)者(總是因?yàn)?Linux 的效用性而爭吵)的敵意和斥責(zé)發(fā)表了道歉聲明。

我們的編程領(lǐng)域正在逐漸敞開大門,歡迎那些并非成長于早期技術(shù)大爆炸時期的極客文化中的人們,而他們最終會成就一個嶄新的編程領(lǐng)域。

Linus 如今已經(jīng)擯棄了過度苛刻的態(tài)度,可有些人卻仍舊對那種態(tài)度點(diǎn)頭稱是 —— 這些人本該對負(fù)能量的利弊深有體會。在正確性上較真倒是沒錯(就算是稱為基本原則也不為過),但當(dāng)你問起他們?yōu)楹畏且脦Т虃说姆绞奖磉_(dá)消極觀點(diǎn)時,他們開始端起家長做派或者青春期少年的自負(fù)腔調(diào):“他們太蠢了活該被罵”、“我得確保他們不會再犯”、“如果他們沒出錯,我也不會沖他們吼啊”等等。(關(guān)于領(lǐng)導(dǎo)者的情緒趨向會多大程度地影響開發(fā)社區(qū),我再舉一個例子,我們可以看看 Ruby 社區(qū)的八字真言 MINASWAN:“Matz is nice and so we are nice” —— Matz 是 Ruby 的創(chuàng)始人。)

我發(fā)現(xiàn),大多數(shù)持有“干掉傻瓜”心態(tài)的狂熱分子往往是那些深切關(guān)心代碼的質(zhì)量和正確性的人,他們將身份認(rèn)同建立在代碼質(zhì)量上。可惜,他們常常分不清忠言逆耳和出言刺耳。這種心態(tài)的至暗面來自于人類向他人秀優(yōu)越的原始欲望,這種欲望完全合乎人性,但毫無價值。那些不能戰(zhàn)勝這種欲望的人,往往會陷于黑暗的困局。

沖冠一怒為代碼:論程序員與負(fù)能量

編程領(lǐng)域正在迅速擴(kuò)張,即將觸碰到其邊界 —— 非編程領(lǐng)域。(又或者說,編程領(lǐng)域包裹著非編程領(lǐng)域?欲知答案如何,且聽下回分解。)

隨著我們的行業(yè)發(fā)展得越來越快、編程變得越來越平易近人,“大神”和“龍?zhí)住钡牟罹嘁苍谘杆倏s小。編程領(lǐng)域正在逐漸敞開大門,歡迎那些并非成長于早期技術(shù)大爆炸時期的極客文化中的人們,而他們最終會成就一個嶄新的編程領(lǐng)域。并且,無論何種社會或年代,資本主義的對效率的要求終將體現(xiàn)在企業(yè)文化和招聘實(shí)踐中:最好的企業(yè)根本不會雇傭那些不能與他人平和地相處的人,更不用說那些待人不善的人了。

我從負(fù)能量中學(xué)到了什么

我們不能任由過度的負(fù)能量支配思維和交流方式,更不能使之形成流毒,因?yàn)檫@對生產(chǎn)團(tuán)隊是很危險的,也會讓企業(yè)付出高昂代價。我數(shù)不清我看過(和聽過)多少軟件項目下馬、以高昂的代價完全重造,僅僅是因?yàn)槟硞€受信任的開發(fā)者的一己之私見,認(rèn)為即使是一項技術(shù)、一個之前的開發(fā)者的遺留代碼或一個文件,都能代表整個項目的質(zhì)量,一丁點(diǎn)不合格就要磨刀霍霍。散發(fā)負(fù)能量也會使人泄氣,使人際關(guān)系緊張。就因?yàn)槲野?CSS 代碼寫進(jìn)了錯誤的文件里,被一位同事嚴(yán)厲地斥責(zé),這讓我悶悶不樂,好幾天都心神渙散,我一直對此耿耿于懷。我以后也不太可能讓那種人接近我的團(tuán)隊。(但誰能說得準(zhǔn)呢?識別三日當(dāng)刮目嘛。)

負(fù)能量也確實(shí)對你的健康有害。

沖冠一怒為代碼:論程序員與負(fù)能量

這并不是說只保留積極向上的態(tài)度,每發(fā)起一個 Pull Request 都要配上 100 億個表情符號,或者必須保持愉快的工作氛圍。(當(dāng)然了,如果那就是你所希望的,那就去做吧。)負(fù)能量是編程中(也是人生中)極其重要的部分,它是表示代碼質(zhì)量情況、表達(dá)感受以及同情同胞的方式。它代表著一個人具有發(fā)現(xiàn)癥結(jié)的洞察力和判斷力,它標(biāo)志著問題的嚴(yán)重程度。我常常說,當(dāng)一個開發(fā)者開始從膽怯和不確定的狀態(tài)變得敢于表達(dá)質(zhì)疑時,這意味著他已經(jīng)躍升到了一個新的層級。這能證明他的洞察力和對自己觀點(diǎn)的信心。消極的表達(dá)方式是不可能完全避免的 —— 除非是奧威爾式的社會。

然而,負(fù)能量應(yīng)該與其他基本的人類品質(zhì)相搭配,如:同情、耐心、含蓄和幽默。在必要時,你可以告訴某人他搞砸了,但不必用吼叫罵人的方式。(可別小瞧這樣的方式,如果有人用完全無感情的方式指出你完全搞得一團(tuán)糟,你也會心驚肉跳一番。)

幾年前我還在那家公司的時候,CEO 找我談話。我們略微聊了一會項目的當(dāng)前狀態(tài),然后他問我覺得自己表現(xiàn)得如何。我告訴他說我覺得還不錯,項目進(jìn)展順利,我們也一直在努力,可能有些東西有所遺漏,需要著重關(guān)注一下。他說他對我在辦公室發(fā)表的某些消極觀點(diǎn)有所耳聞,并且其他人也已經(jīng)注意到了。他解釋說,如果我有什么顧慮,都可以隨意向管理層傳達(dá),但注意不要在同事間傳播。作為公司里一位開發(fā)領(lǐng)導(dǎo),我必須謹(jǐn)言慎行,注意自己的舉止對他人的影響,不管我自己是否能意識到,我的影響力都是很大的。他非常和善地說了這些話,最后說如果我也有同感,就應(yīng)該考慮考慮自身和職業(yè)生涯的訴求是什么。他把“好自為之,不然就滾”的辭令表達(dá)得非常和風(fēng)細(xì)雨了。我很感激他能夠誠懇地知會我,讓我明白過去六個月里,自己的態(tài)度下滑影響到了他人而不自知。

歸根結(jié)底,我來到這里是為了完成一項任務(wù),大發(fā)牢騷無益于理解、評估或修復(fù)代碼。

這個例子詮釋了什么是優(yōu)秀而高效的管理,什么是懷柔策略的力量。我意識到,當(dāng)我開始完全信任公司和其實(shí)現(xiàn)目標(biāo)的能力后,我和他人交流的方式真的完全不同了。我還意識到,就算我對正在跟進(jìn)的項目持懷疑態(tài)度,也沒必要向同事們表達(dá)出來,這樣的消極情緒會像瘟疫一般蔓延,導(dǎo)致軍心不穩(wěn),順利完成項目的可能性也就更小了。正確的做法是直言不諱地向管理層反映實(shí)際情況。如果我覺得他們沒聽進(jìn)去,我還可以瀟灑走人嘛。

后來我得到了一個新的機(jī)會,成為了一名正式的人力資源績效評估經(jīng)理。作為一個合格的開發(fā)經(jīng)理,我更加注重自己對(持續(xù)優(yōu)化的)遺留代碼表達(dá)觀點(diǎn)的方式。要實(shí)施改變,你必須認(rèn)清現(xiàn)狀,但如果你陷入了哀嘆、消極怠工或任何消極反應(yīng),你將一事無成。歸根結(jié)底,我來到這里是為了完成一項任務(wù),大發(fā)牢騷無益于理解、評估或修復(fù)代碼。

事實(shí)上,我越是約束我對代碼的情緒反應(yīng),我對代碼看得就越清晰透徹,內(nèi)心的混亂就會越少出現(xiàn)。當(dāng)我用委婉的方式(“這里可能還有些改進(jìn)空間”)表達(dá)時,我和他人都開心,更能顯示出對事不對人的態(tài)度。我還意識到,通過完全地(招人煩地?)保持理智(“你是對的,那個代碼確實(shí)相當(dāng)糟糕,但我們會改進(jìn)的”),我可以化解他人的負(fù)能量。我很期待自己能在佛系路線上走得更遠(yuǎn)。

重要的是,我反復(fù)不斷地參悟到一個深層次的道理:生命太短暫了,沒有時間去發(fā)火或痛苦。

沖冠一怒為代碼:論程序員與負(fù)能量

*Chuck Parsley 屬虛構(gòu)角色。若您恰巧同名,我向您道歉,我相信您是一位不寫爛代碼的優(yōu)秀開發(fā)者,或者至少有志于此。若未同名,相安無事。熱愛生活吧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 棕黃的齊肩發(fā),笑起來彎彎的眼睛,沒有驚艷的面容,卻讓人很舒服,像一杯溫溫的伯爵紅茶。沒有高亢的嗓音,卻能把每首歌詮...
    愛在指邊流過閱讀 553評論 0 2
  • 如何與這個世界連結(jié),我看到自己站在自我世界的中央,作為社會里的人卻時常愿意抽離。 有時候的期待是無意義的,是過于做...
    Annika心湛閱讀 312評論 0 1
  • 目錄 李白曾是風(fēng)雨閣的閣主??!這不科學(xué)啊,風(fēng)帆雖說不上是博覽群書,但李白的詩絕對是每個人都曾拜讀的經(jīng)典,李白的...
    田曰天閱讀 661評論 12 5
  • 三萬英里的高空 我輕哼,珂賽特的歌 飛向云端 窗外,是一片云海 純白而柔美,似仙子將我擁攬入懷 我終究突出了云海,...
    陳轉(zhuǎn)閱讀 684評論 0 3

友情鏈接更多精彩內(nèi)容