編程糟糕透了
我有工作的朋友中,每一個至少都會每周兩次做一些比在筆記本上(體力上)更重的事情,最終找到一個逃避方法,就像下面的談話:“哥們,你工作可不努力。我用螺絲刀僅花了一個4700小時的周時就在Mordor下面挖了條隧道。”
編注:魔多(Mordor)在托爾金魔幻小說中的中土世界中,是黑暗魔君索倫的領地,位于中土世界的東南部、安都因河(Anduin)以東。佛羅多和山姆·詹吉要前往魔多摧毀魔戒。魔多的地形非常獨特,有三個巨大延綿的山脈從南、西、北包圍著魔多。這些山脈可以防止人們從這些方向入侵,也可以阻止魔多內的人逃出。
他們說到點子上去了。Mordor很爛,并且挖隧道肯定比敲鍵盤更耗費體力,除非你是一只螞蟻。但是,僅僅是討論的需要,我們可以在壓力和精神錯亂是壞事這個爭論上達成一致嗎?真好。歡迎來編程。
所有的編程團隊由瘋狂的人組建
假設加入一個工程師團隊。你非常興奮、充滿想法,可能是由于可能是剛走出學校,遇到一個一塵不染、包含漂亮的設計以及令 人驚嘆的用途、經濟和力量三者審美相統一的世界。你首先與項目負責人Mary會面,這個項目是一個主要的大都市的橋梁項目。在你通過15層安全檢查之 后,Mary將你引薦給Fred。那個安全檢查是Dave在他放在桌上衣服被偷過一次以后設置的,并且后來再也沒發生過丟失事件。Fred僅從事于木藝, 因此當你問他為什么也會參與其中時,那是由于這座位于急流之上200英尺的橋是用于交通高峰時的,布滿著汽車和人。“不要擔心”,Mary說,Fred將 會處理人行道的問題。什么人行道?好吧,Fred已經做過一個很好的人行道案例,并且人行道將會增加橋的吸引力。當然,人行道必須建成沒有欄桿,那是因為 并非工程師的Phil沒有強迫配備欄桿。沒有人可以確定Phil要做什么,但是可以肯定的是,Phil要做的是關于協調各方一致,并且必須與上級保持一 致,沒有任何工程師愿意與這些領導打交道,只好隨Phil意愿做。
同時,Sara發現了一些即將造成損失的拼湊工藝,并且它們已經融入到橋的設計中,所以你將不得不圍繞建橋進程中的每一環節,因為每一個環節意味著 不同的底層支撐和安全考慮。湯姆和哈里已經合作了多年,但當前在使用公制還是英制測量上產生仇隙,它已經發展成為 “誰先完成了那部分的設計”的地步。互相將事情擰在一起已經成為令人頭痛的問題,他們已經放棄了,僅僅使用蠻力、錘打、或一整天焊接處理的部件。橋梁設計 為懸索橋,但沒有人確切知道如何建立一個懸索橋,所以他們在已經完成一半時,添加額外的支撐柱保持物體直立,但他們沒有管懸索,因為他們仍然是支撐橋的部 分。沒有人知道哪部分(真正支撐橋),但每個人都相信他們是重要的組成部分。經過說明之后,需要你拿出一些新想法,但你沒有,因為你是推進工程師,對橋梁 東西一點都不了解。
你會開車穿過這座橋嗎?不會。如果橋莫名其妙地被建造起來,相關的每個人都應該被處決。然而,某些你用過的那些隨便寫的每個獨立程序、銀行業軟件、網站以及一個廣泛使用的程序,(聲稱)能夠保護互聯網上信息,但事實上不存在這樣程序。
所有的代碼都是壞代碼
每一個程序員在沒有人在家的時候偶爾會關掉燈,倒一杯威士忌,放一些德國輕音樂,在電腦上打開一個文件。這個文件因程序 猿而異。有時他們寫,有時找到它且不得不保存它。他們快速閱讀幾行,調整它們使它們看起來更舒適,隨后想起剩余文件和這些文件(經來某些時候)必然崩潰時 淚水隨之變苦。
這個文件中代碼好。它的變量和函數命名清晰明了。它(編碼)簡潔,沒有做任何愚蠢的事情。它從來不生活在野外(譯注:可能是指代碼產生非預期結 果),或面臨一個銷售團隊(譯注:可能是指產生效益)。它僅做一件普通且特定的事情,運行也很好。它由一個人編寫,并且從來沒有其他人動過。讀起來就像一 個大于30歲的人寫的詩。
每個程序員開始時會寫一些這樣的完美的小片段。然后周五有人告訴他們需要在周二之前編寫600個這樣的片段,他們糊弄了 一部分,也許復制一些片段,試著把它們貼在一起或者他們要求能夠解決該部分的同事一起工作,然后將所有的程序員編碼胡亂糅合在一起,有人靠畢加索畫生活, 因為沒人想看到貓尿浸泡你那 “在光線下逐漸融化的雪花”。下周, 大家鏟更多的雪在其上以阻止畢加索畫作跌倒。
有一個理論說除了相比計算機實際可做事情還有更多的規則之外,你可以通過下述的規則來糾正,這些規則都是不同程度的改善且被編碼的個人喜好所非議, 所以沒有任何代碼集在沒有做幾十個一致、一些遠遠不止相似方式的事情時就讓它進入真實的世界。任何工作剛開始很少的幾周僅是清楚了解到一個程序是如何工作 的,即使在熟悉每一個單獨的編程語言、框架以及涉及到的標準規范(因為規范是“獨角獸”)。
黑夜總會出現
我花了好些年成長,伴隨著的是臥室里的櫥柜。這個櫥柜有一個古怪的設計。期初看起來很正常,當走進去做一些事情時,會發 現右手邊的墻會給凹室讓路,通向一個方便的小架子。然后向上看,在凹室后面的墻有一條通向一個未放任何東西的狹小空間,那里沒有光線,(讓)你立即認為它 是一個日間休息室,是為在夜間打著手電筒飼養每一個餓壞的怪物貯備的。
這就是編程要學到的東西。你逐漸知道對自己有用的工具,然后四處查找,并且身旁也有一些方便的新工具,那些總在床邊工具給你展示無窮無盡的恐懼。
例如,假設你是個一般的Web開發人員。你熟悉十幾種編程語言,數以千的庫,標準,協議,以及其它你掌握的。你仍然需要至少一周左右學習更多,記得 檢查你知道的事情查看它們是否已經更新或過時,確保它們仍能夠一起工作并且沒有人修復你在某個周末喝醉時開發的自認為很好的東西。你一直跟上時代,很酷, 隨之一切事情容易突破。
“我勒個去”,你說,然后開始尋找問題所在。你發現,有一天某些白癡因為另一個白癡采用1/0表示無限而才用它來作為自 己的無限標識以簡化代碼,隨后一個非白癡正好認為這種行為很白癡且本應該由第一個白癡決定1/0是否可以作為無限,因此他決定成為一個衛道士的同時在他的 新編譯器里規定這種行為是錯誤的。因為他自己也是個白癡,然后決定不告訴任何人這個錯誤行為,現在所有的“雪花”落入貓尿,你甚至無法找出這只“貓”。
你擅長所有的這些技術,那很好,因為經驗讓你只花費6小時就能指出哪里出錯,而不是丟掉飯碗。你現在需要從上百萬個小事情中妥善地處理一個小的額外 事情,終生難忘,因為你需要的程序都是這些混蛋和白癡寫的。并且那只是在你個人選擇的領域,這只是你需要知道計算機科學領域中事情的一小部分,可能你也從 沒有學過該領域中事情。
一個人在5歲時不會知道MacBook實際是如何運作的。為什么我們會叫你反復關機?因為我們不清楚Macbook出什 么狀況了, 且真地很容易導致計算機內部休克,也很容易地通過運行自帶的自動檢測工具指出問題所在。程序猿的電腦比非程序猿的電腦運行的更好的唯一原因是程序猿對待自 免疫病毒就像帶有強迫癥的小孩,當電腦出毛病時我們不會敲打它們。
大量的工作在互聯網上做,互聯網有它自己的缺陷
還記得那個關于瘋狂的人和糟糕的代碼嗎?互聯網的真實情況是比他的字面描述要糟糕十億次。類似由12人維護的三頁動態網站被美化為“購物車”,這是 一種夸大,事實上這種“購物車”隨時隨地都會崩潰掉;就現在為非死book工作的工程師正面對數以萬計的程序漏洞,拼命的在系統崩潰之前試圖找到解決 的辦法。在谷歌的辦公室,會有團隊連續三天沒有休息過;某地一個數據庫維護員工作在山谷包圍的公司里,顧不得跟家里人聯系,家人甚至認為他死掉了;如果這 些維護人員垮掉的話,世界將會崩潰;很多人甚至不了解系統維護人員每天的工作狀態,但是相信我,如果他們同時要吃午餐的話,肯定不會像你一樣去熟食店排隊 買飯,因為他們認為那樣會浪費時間。
你無法重啟Internet。數萬億美元依賴一個搖搖欲墜的“蛛網”,它基于非正式協議和“目前足夠好”代碼,旁邊有十年前注釋,類似
“TODO:FIX THIS IT’S A REALLY DANGEROUS HACK BUT I DON’T KNOW WHAT’S WRONG”。
我甚至沒有提到那些為了刺探情報和利益的人們對互聯網的各個部分的攻擊,哎呀他們太無聊了。聽說過4chan嗎?當他們決定一個下午不喜歡你時,4chan可能毀掉你的生活和事業。我們甚至不用擔心4chan那是因為核武器與處于核冬天沒有太大的差別。
在網上,可以說“你知道的,如果恰到好處使用科技,這種工作有效,”嘭!現在已成為網絡的一部分。任何人只要有點小錢和一臺電腦可以嵌入互聯網的一 點點,放上他們想要的惡意代碼,然后將他們的一點點集聚,一切都開始變得更差。即使是好的程序員也懶得去學習的的神秘規范,這規范是由一些組織建立起來去 實現一些‘獨角獸’,所以每個人都會在一半的時間,處理這個事實:沒有什么東西能匹配任何東西或有具有任何意義,(反而)可能會隨時暴露事實,這時我們只 是試圖掩蓋它,希望沒有人注意到。
這些是互聯網的潛規則:在你第一次打開瀏覽器5分鐘后,一個老毛子小孩就會獲得你的社會安全號。你使用賬戶登陸過嗎?在NSA的某臺電腦正開始追蹤你的物理位置直至你的肉體在宇宙不復存在。發送郵件?您的電子郵件地址剛在尼日利亞一個BBS上出現過。
這些事情不是真的,那是因為我們不去關心,也不試圖阻止,它們是真的是因為所有的事情都不完美,沒有完全的代碼,每個人只是試圖讓它運行。如果你從事于互聯網,這是你的工作:期望最后一段代碼(你寫的)足夠好,能夠運行幾個小時,這樣你就可以好好吃一頓和休息一下。
我們沒有瘋,我們正被逼瘋
錯誤:嘗試用正則表達式解析HTML;系統返回克蘇魯(邪神)。
有趣吧?不是?那么下面這個呢?
“那是叫做?arrayReverse?”
“s/camel/_/”
“酷,thx”
難道沒用?使用駱駝(駝峰命名法?)?看起來不像正確的響應嗎?不是?天吶。你可以仍然找上帝。在開始討 論這段代碼時,你還沒有花很多時間去閱讀。人的大腦在基本邏輯上不是特別好,現在有一個整個職業不用做事,但真的真的需要很復雜邏輯。巨多的抽象狀態和判 斷條件鏈被用于發現東西,像忘寫的逗號。讓你一整天都這樣做,會讓你處于輕微的失語狀態就像你看著正在說話的人的臉,你不知道他們已經說完,因為話中沒有 分號。你沉浸在一種完全無意義的世界,所有的煩惱都來源于由一系列的數字變成一個巨大的迷宮般的符號和一系列不同的數字或結局可能是一只小貓的照片。
對大腦破壞性影響大腦已經由寫程序語言人證明(譯注:估計是揶揄程序語言設計者腦殘)。這是一個程序:
#include <iostream> int main( int argc, char** argv ) { std::cout << "Hello World!" << std::endl; return 0; }
這個程序與下面做同樣一件事情:
`r```````````.H.e.l.l.o. .w.o.r.l.di
這個程序:
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-] >++++++++[<++++>-] <.>+++++++++++[<++++++++>-]<-.--------.+++ .------.--------.[-]>++++++++[<++++>- ]<+.[-]++++++++++.
還有這一個:
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook. Ook! Ook? Ook! Ook! Ook? Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook.
一旦誰設計的程序語言讓其他人寫成這樣:
#:: ::-| ::-| .-. :||-:: 0-| .-| ::||-| .:|-. :|| open(Q,$0);while(){if(/^#(.*)$/){for(split('-',$1)){$q=0;for(split){s/| /:.:/xg;s/:/../g;$Q=$_?length:$_;$q+=$q?$Q:$Q*20;}print chr($q);}}}print"n"; #.: ::||-| .||-| :|||-| ::||-| ||-:: :|||-| .:|
依據作者,那個程序是“一個兩行程序,用于解析嵌入到代碼中的兩行注釋,以讀取瑪雅數字代表的單個ASCII字符,這些組成雜志標題,雜志放在一個在90度旋轉的ASCII藝術空間里。”
該方案贏得了比賽,因為它必須得到。想生活在這樣的世界里?不。這是個一天抽一包煙都沒有人管的世界。“當然他一天一 包,誰不這樣?”,最終每個程序猿蘇醒,在他們完全意識到所見到的世界和其中的相互關系如同之前代碼一樣,他們交流關于這些的故事仿佛困倦引起的幻覺是正 常的事情。這是一個世界,人們避開xxoo去寫猩猩編程語言。所有程序員都是強迫他們的大腦做大腦不愿做的事情,大腦在這種情況下永遠無法做出更好,每天 10至15小時,每周5到7天,一個人慢慢地變瘋。
</胡言亂語>(結束胡言亂語)
原文鏈接: stilldrinking 翻譯: 伯樂在線 - luakuc
譯文鏈接: http://blog.jobbole.com/69342/