衝冠一怒為代碼:論程序員與負能量

衝冠一怒為代碼:論程序員與負能量

衝冠一怒為代碼:論程序員與負能量

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

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

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

負能量:編程文化中的情緒工具

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

衝冠一怒為代碼:論程序員與負能量

對程序員這個群體來說,負能量太重要了,因為這樣傳達價值觀最有效。當我在一個編程培訓班執教時,用適當的惡搞圖、傳聞逸事和視頻向學生灌輸行業文化是標準做法,而這些素材中最流行的主題就是圍繞程序員在外行面前的挫敗感的。想要指出哪些行為習慣是好的、壞的、壞到家了絕不要犯的,藉助情緒工具來表達再合適不過了。應該幫助新手程序員們做好心理建設,讓他們知道他們會被非技術行業的同事以這樣那樣的方式誤解;會有朋友們來安利他們的“價值百萬”的 App 創意;會被壓在“祖傳代碼”的五指山下,任你一個筋斗 8848 光年也難以脫身。

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

衝冠一怒為代碼:論程序員與負能量

我注意到,程序員的負能量常常隨著經驗的增長而增長。當程序員還是萌新的時候,他們不知道有什麼坎坷等著他們,所以他們躊躇滿志地邁開腳步,願意相信路途艱險只是因為他們經驗還不足、眼界還不寬,他們自信最終能夠掌控一切。

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

這種負能量的增加並不一定是件壞事。探討編程時最主要的就是非常關注所寫的代碼的質量。代碼的質量決定了性能(不考慮硬件、網絡等因素),因此能夠針對代碼表達出自己的觀點很重要。幾乎所有的關於代碼的討論都可以歸結成是對於代碼質量的評定,簡單的一句評語裡就蘊含著評價代碼質量的情感:

  • “那個模塊裡有很多地方的邏輯都前後不一致,應該優先進行重要性能優化”
  • “那個模塊寫得挺爛的,應該重構”
  • “那個模塊狗屁不通,趕緊回爐重造吧”
  • “那個模塊寫得真垃圾,需要修補修補”
  • “那個模塊就是一坨屎,把它寫出來就是犯罪,Parsley 腦子裡想他喵的什麼呢”

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

當然了,問題在於,人類就是一種奇怪的、搖擺不定的情緒化動物,接收表達的情緒都能改變我們 —— 這種改變一開始是細微的,而經過漫長的歷程後,這種改變就紮根深處了。

負能量是一條曲折泥濘的下坡路

幾年前,我是一個非正式的團隊領導,為我司面試過一位開發者。我們非常喜歡他;他敏銳、善於發問、有技術才能,並非常契合公司文化。我特別欣賞他的積極向上和踏實肯幹。因此我們聘用了他。

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

幾周後,那位新聘進來的開發者表達出了和我一樣的負能量(連罵法都一模一樣)—— 其實這本在情理之中,卻出乎我意料之外。我感覺這並不是他的本色表現,或者換一家文化不同的公司,他的舉止又該有所不同。但他偏偏吸收了我傳達的文化,只是為了融入團隊。我腸子都悔青了。只因為我自己的主觀感受,就給新員工設定了一種消極的基調,而我覺得他本不至於如此。就算那些負能量的表現並非他的真實感受,只是為了體現他和同事脾氣相投,那也要怪我把惡劣的態度展示給他了。常言道,近朱者赤,近墨者黑。

衝冠一怒為代碼:論程序員與負能量

負能量的陽關道和獨木橋

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

因此到後來,這些開發者開始接受這樣的事實:爛代碼註定就是軟件的一部分,而他們的工作就是優化這些爛代碼。若不少見,則無需多怪。他們採取佛繫心態,專注於如何解決擺在眼前的問題或者任務,學著如何精確評估軟件的質量情況,並傳達給利益相關者,他們憑多年經驗,將軟件質量吹得天花亂墜。最終憑藉卓越而一貫地奉獻,他們得到了豐厚的獎勵。他們功績豐偉,故此得到上千萬美元的獎金,然後退休去做他們想做的事,以此度過餘生。(我的結局可千萬也要如此美滿啊!)

衝冠一怒為代碼:論程序員與負能量

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

不幸的是,由於業務需求推著他們持續開發功能,他們無暇去操心代碼質量,於是無力去實施那些優化代碼的宏偉計劃,最終只好變成了“怨婦”。由於他們還是能勝任工作的,所以暫時沒被辭退,但會被髮配到公司的角落,這樣既不會打擾到別人,又能保證關鍵系統的運轉。於是他們沒法獲得新的開發機會,他們的技能逐漸萎縮,逐漸被業界所邊緣化。他們胸中的鬱結潰爛流膿,而後結成堅硬的痂,他們會發現自己喜歡和二十多歲的 CS 學生爭論那些他們最愛的老舊技術如何如何可行、怎麼怎麼好用 —— 以此來維持自尊。最終,他們退休了,終日對著鳥兒發脾氣洩憤。

現實情況可能處於兩種極端之間。

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

碼農“流行”文化中的負能量

如今,工程師們的態度正受到前所未有的關注。“不犯渾原則”的概念在工程組織中越來越常見。Twitter 上湧現了越來越多的奇聞軼事,說的都是人們因為無法(不願)忍受排外觀念和地盤觀念,而徹底退出編程行業。即使是 Linus Torvalds,也為自己多年來對其他 Linux 開發者(總是因為 Linux 的效用性而爭吵)的敵意和斥責發表了道歉聲明。

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

Linus 如今已經擯棄了過度苛刻的態度,可有些人卻仍舊對那種態度點頭稱是 —— 這些人本該對負能量的利弊深有體會。在正確性上較真倒是沒錯(就算是稱為基本原則也不為過),但當你問起他們為何非要用帶刺傷人的方式表達消極觀點時,他們開始端起家長做派或者青春期少年的自負腔調:“他們太蠢了活該被罵”、“我得確保他們不會再犯”、“如果他們沒出錯,我也不會衝他們吼啊”等等。(關於領導者的情緒趨向會多大程度地影響開發社區,我再舉一個例子,我們可以看看 Ruby 社區的八字真言 MINASWAN:“Matz is nice and so we are nice” —— Matz 是 Ruby 的創始人。)

我發現,大多數持有“幹掉傻瓜”心態的狂熱分子往往是那些深切關心代碼的質量和正確性的人,他們將身份認同建立在代碼質量上。可惜,他們常常分不清忠言逆耳和出言刺耳。這種心態的至暗面來自於人類向他人秀優越的原始慾望,這種慾望完全合乎人性,但毫無價值。那些不能戰勝這種慾望的人,往往會陷於黑暗的困局。

衝冠一怒為代碼:論程序員與負能量

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

隨著我們的行業發展得越來越快、編程變得越來越平易近人,“大神”和“龍套”的差距也在迅速縮小。編程領域正在逐漸敞開大門,歡迎那些並非成長於早期技術大爆炸時期的極客文化中的人們,而他們最終會成就一個嶄新的編程領域。並且,無論何種社會或年代,資本主義的對效率的要求終將體現在企業文化和招聘實踐中:最好的企業根本不會僱傭那些不能與他人平和地相處的人,更不用說那些待人不善的人了。

我從負能量中學到了什麼

我們不能任由過度的負能量支配思維和交流方式,更不能使之形成流毒,因為這對生產團隊是很危險的,也會讓企業付出高昂代價。我數不清我看過(和聽過)多少軟件項目下馬、以高昂的代價完全重造,僅僅是因為某個受信任的開發者的一己之私見,認為即使是一項技術、一個之前的開發者的遺留代碼或一個文件,都能代表整個項目的質量,一丁點不合格就要磨刀霍霍。散發負能量也會使人洩氣,使人際關係緊張。就因為我把 CSS 代碼寫進了錯誤的文件裡,被一位同事嚴厲地斥責,這讓我悶悶不樂,好幾天都心神渙散,我一直對此耿耿於懷。我以後也不太可能讓那種人接近我的團隊。(但誰能說得準呢?識別三日當刮目嘛。)

負能量也確實對你的健康有害。

衝冠一怒為代碼:論程序員與負能量

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

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

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

歸根結底,我來到這裡是為了完成一項任務,大發牢騷無益於理解、評估或修復代碼。

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

後來我得到了一個新的機會,成為了一名正式的人力資源績效評估經理。作為一個合格的開發經理,我更加註重自己對(持續優化的)遺留代碼表達觀點的方式。要實施改變,你必須認清現狀,但如果你陷入了哀嘆、消極怠工或任何消極反應,你將一事無成。歸根結底,我來到這裡是為了完成一項任務,大發牢騷無益於理解、評估或修復代碼。

事實上,我越是約束我對代碼的情緒反應,我對代碼看得就越清晰透徹,內心的混亂就會越少出現。當我用委婉的方式(“這裡可能還有些改進空間”)表達時,我和他人都開心,更能顯示出對事不對人的態度。我還意識到,通過完全地(招人煩地?)保持理智(“你是對的,那個代碼

確實相當糟糕,但我們會改進的”),我可以化解他人的負能量。我很期待自己能在佛系路線上走得更遠。

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

衝冠一怒為代碼:論程序員與負能量

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


分享到:


相關文章: