天天看點

真正的程式員

真正的程式員

第1章

我很幸運能在電腦和電子遊戲普及之前出生。我有幸與朋友和兄弟一起在戶外玩耍,并發明了我們自己的遊戲。

我們可以成為我們自己的英雄,使用一根會立即變成弓、槍、劍或望遠鏡的樹枝。它可以是任何東西,除了可能是回旋镖,因為一旦你把棍子扔掉,你就必須去拿回來。

真正的程式員

在某個時候,我長大了,那樣玩變得很尴尬。當其他孩子認為成年人很酷時,您不能将松果視為手榴彈并假裝擁有神奇的力量。你隻是不再适合了。你最終會受到成長的壓力。不過,那是一個非常幸運的童年。

在某個時候,我有機會玩電子遊戲和使用電腦。可能會有你一直想要的想象世界,在你面前實作。它正在消耗你,有那麼一刻你過着不同的生活。

但大多數電子遊戲都有一些特别之處:你不創造,你反應,你消費。我最終在十幾歲的時候做了即興戲劇。然後,再一次,可以和人們在一起,創造和假裝無中生有。

真正的程式員

當然,魁北克的即興劇院是不同的。那裡有一個溜冰場——一切都是曲棍球。

當我從 2005 年到 2008 年進入職業學院學習多媒體時,我最終陷入了程式設計工作。我覺得太棒了!創造力又來了,它可以讓我賺錢!然後我設計了我的第一款遊戲的機制,這讓我大吃一驚。

真正的程式員

有人告訴我,那不是真正的電子遊戲。這隻是一個 HTML 表單。您應該為文本和選項使用數組,這樣會更好。代碼需要清理。

我有點沮喪;這個遊戲真的是關于我為它的“選擇你的冒險”方面寫的 11 頁文字。但我意識到,如果我想做更多人認為好的東西,我必須學習很多東西。

我必須學習“真正的程式設計”。從 GUI 工具包中的 JScript 轉移到更好的東西,比如 PHP。是以我學會了這一點,以及 Javascript。然後最終我被告知要重新學習如何進行真正的程式設計;PHP是可怕的。有人告訴我也許可以嘗試 Python,然後我就學會了。

但是真正的程式員知道更進階的東西,而 python 的 lambdas 并沒有解決它,面向對象的程式設計不是你想要的。有人告訴我,閱讀 SICP 将是下一步,因為它就像計算機科學的聖經。

真正的程式員

這讓我想到了Scheme。我得到了 K&R 書,因為現實世界中真正的程式員會 C,我在當地大學注冊了兼職課程,同時兼顧他們的工作,因為真正的程式員知道資料結構和數學,我在一定程度上學到了這些。我開始閱讀論文和書籍,因為真正的程式員保持最新并且知道花哨的算法。

不知何故,我拿起了 Erlang,并開始以此為生。我為此寫了一本書。奇怪的是,沒有人質疑我是真正的作家、真正的作家還是真正的插畫家。見鬼,我在沒有在生産系統中使用過 Erlang 的情況下找到了一份教 Erlang 的工作。

第2章

是以我過着環遊世界的生活,告訴人們如何做我自己有時從未做過的事情,而每個人似乎都突然相信我是一個真正的程式員,因為我所做的事情大多與程式設計無關.

一天,我被困在一個會議結束回來的機場,在航站樓發狂地打字,這時一個奇怪而溫和的聲音問我:

如果你願意,請給我設計一個系統!

什麼?!

給我設計一個系統!

我從螢幕上擡起頭,對這個請求感到驚訝。我環顧四周,看到這個立志成為開發人員并希望我稱他為“printf”的孩子,我覺得這很愚蠢和噱頭。他看起來有點像這樣:

真正的程式員

我還不太了解計算機,但您似乎知道。我想寫關于它們的程式和部落格,讓人們使用和閱讀它們。請給我設計一個系統!

現在這是一個令人驚訝的要求,那時我已經醒了 20 個小時,不太确定我是否完全了解或感覺喜歡它。我告訴他系統很難。我不知道他想做什麼,他希望它如何失敗,它應該支援多少讀者,他想在哪裡托管它,是以我無法在資訊如此之少的情況下設計一個合适的系統。

那沒關系。給我設計一個系統。

于是我做了如下架構圖:

真正的程式員

他看了看,說不行,這個系統不夠好。給我另一個。

是以我做了:

真正的程式員

我向他簡要介紹了它的工作原理。

我的新朋友禮貌地笑了笑。這不是我想要的,它太複雜了,而且做了很多我不需要的東西

考慮到備援、監控、備份、緩存和其他減少負載的機制、用于法律保護的外部支付處理器、故障轉移、易于部署等,我感到有點受辱。我本可以為此收取可觀的錢作為咨詢費!出于耐心,我隻是畫了這個:

真正的程式員

我補充說:這是你的設計。你想要的系統在黑匣子裡,希望這個糟糕的答案能讓他别管我。但我很驚訝地聽到回音:

這正是我想要的方式!

這就是我結識小printf的方式。

第3章

我很快就知道了這個小家夥的投資組合。在他的存儲庫中隻有小程式、帶有表單的簡單網頁、瑣碎的指令行實用程式。它們會不起眼,會出現,而且不會很快消失。

然後在某個時候,他開始研究一個更大的程式,該程式使用多個子產品。它需要套接字、通路磁盤、與實際資料庫通信。當它第一次建構并正常運作時,little printf 感到很驚訝。但該計劃還不夠。

它需要重構、更好的測試、文檔、linting 和分析。該程式将運作一段時間,一天早上,它崩潰了。

它一次又一次地崩潰。

配置錯誤,日志不會旋轉,磁盤速度不可預測,網絡會出現故障,錯誤會出現,編碼會混亂,資料庫需要清理,事務會挂起,證書會過期,CVE 會不斷出現,名額将保持沉默。

真正的程式員

它一直轉向意大利面條。

他告訴我:事實是我什麼都不知道!我應該根據我的需要來判斷。我有編寫一個花哨系統的狂妄自大,我花了很多時間來修複它,感覺就像它取消了它為我節省的時間。不過,我應該知道這是多麼美妙的事情。

一天早上,他決定離開辦公室。再見,他對一盞似乎已經燒壞的閃光燈說。他離開去看看除了他那淩亂的小伺服器之外,軟體世界還能提供什麼。

日志會不斷累積,直到硬碟驅動器不再填滿。

第 4 章

真正的程式員

他去了一個工作區,尋找經驗豐富的開發人員,從他們那裡獲得提示和幫助。

他遇到的第一個是一位非常自豪的進階工程師,他似乎覺得自己很優越。

真正的程式員

啊,來了一個學習者!歡迎來到我的領域,我是他所說的專家。

專家?小printf問道。這是否意味着你可以程式設計任何東西?

是的!專家回答。他補充說差不多;我隻編寫值得程式設計的程式。我不會在瑣事上浪費時間。許多程式我從未編寫過,但可以輕松編寫。

啊,那你能幫我處理一下我的系統嗎?小printf剛開始解釋自己的業務,領域專家就打斷了他:

對不起,但我真的不明白這樣做的意義。

為什麼不?

經驗。我擅長程式設計我程式設計的東西,我程式設計我擅長的東西。通過在我已經擅長的這一系列相當有限的事情上做得更好,我確定我在這方面比以往任何時候都更有價值。稱之為工作保障,稱之為适者生存,但這就是我的工作方式。

為什麼你不能幫助我?

好吧,你看,花時間幫助你意味着我将重要的自我投資轉移到促進他人的進步上——這對我來說是一個失敗的政策。對你來說最好的學習方式就是我自己的方式:努力奮鬥,自己弄清楚。它有助于塑造性格。

這似乎不是很有效...

你可以去學校學習,也可以自學。它的真正作用是清除那些隻想輕松自在的懶人,并迫使留在這裡的每個人成為真正應得的人。當我們讓moochers進來的那一刻,我制作的作品的價值就随之下降了。

你不認為合作或同僚可以幫助你嗎?

并不真地。我在一個人呆着并且不分心時工作得最好。每次我最終被迫與他人合作時,幾乎不可能讓我們的東西一起工作。出于惱怒,我拿起他們的作品,用理智的方式重寫了大部分。然後它工作正常。

Little printf 很驚訝地遇到了一位似乎對幫助他人不感興趣的專家,但又對他們缺乏技能感到非常惱火。有點難過,這個男人把自己的視野局限在自己知道的一個領域,到了除了給自己制造問題,什麼都做不了的地步!

我明白了……好吧,我想我很高興你不給我幫助,我的小朋友說

你是什麼意思?任賢者問道,他的身價似乎一下子被降級了。你不覺得我做的工作很有趣嗎?

哦,我願意。似乎你會比其他任何事情都更将我視為障礙和煩惱,而我正在尋找的是幫助,而不是痛苦。

小 printf 迅速離開,讓專家意識到他在更多方面讓自己變得不可動搖,而不僅僅是他的工作保障。

第 5 章

真正的程式員

途中,小printf走到了一間辦公室的門前,辦公室裡坐着一個男人,周圍是厚厚的精裝書,上面有巫師、龍、分形和數學圖案等精美的圖像。

好書,先生,printf 說

謝謝。我認為它們是程式員必不可少的材料。如果你沒有它們,你就不是真正的專業人士

我想我不是專業人士,小printf說。哪一個是你的最愛?

哦,我還沒有讀過大部分。

那你不是一個好的程式員嗎?

不我不是。開發者自豪地補充道:事實上,我是一個糟糕的程式員。

太可惜了,little printf 說,他繼續說:我自己也在好轉。

你聽說過鄧甯-克魯格效應嗎?,男人問。

不,那是什麼?

這是認知偏見的事情。它基本上是說,能力較差的人往往會高估自己的資格,而有能力的人往往會系統地低估自己的資格。

是以如果我認為我正在變得更好,我可能不是很好

是的,正是。你可能很糟糕。另一方面,我公開說我是一個糟糕的程式員。但根據 Dunning-Kruger 的說法,我可能低估了自己,這讓我成為了一名優秀的開發人員,你不明白嗎?

我猜?

那是因為自我貶低是開發人員的重要工具。當你覺得自己很好時,你就會放松并停止進步。

這不是說當你對自己感覺良好的那一刻,你就在走向失敗,然後你應該感覺很糟糕?

是的。但是解決這個問題的方法是說一切都很糟糕,即使你沒有提供解決方案。這樣你看起來很聰明,但沒有太多貢獻。

你是什麼意思?

假設我上網檢視了一個我不喜歡的項目。訣竅是指出所有錯誤的地方,不要提供更多資訊。您可能可以巧妙地指出做這件事的人是白癡的方式并逃脫懲罰。

以及如何更好地做到這一點?

好吧,我喜歡認為他們最好知道自己走錯了路,而我最好向他們展示這一點。這有點像煙霧和鏡子。沒有人知道他們在做什麼,但看起來就像我一樣。

當你被要求幫助卻無能為力時會發生什麼?

那是你回去說一切都很糟糕的時候。你有太多的牦牛剃須要做,改進其他事情,過于悲觀。他們靠自己。

是以這都是裝腔作勢?你是在玩遊戲嗎?你是一個在他們知道的事情上裝作無能的人,這讓那些實際上一無所知的人感覺更糟改善那裡也感覺不好。

無論如何,能力與它幾乎沒有關系。不過名聲還是很重要的。人們雇用朋友,不喜歡和不重要的人首先被解雇;嘗試更改系統,您會變得不喜歡。這都是一個非常社交的遊戲。這就是它在行業中的運作方式,也許在學術界也是如此,雖然我不知道,現在我會嗎?都是關于你認識誰,推銷你自己,你認識你自己的個人品牌?這就是您在企業中獲得工作的方式。

如果事情是這樣的,你必須感覺不好,讓别人感覺不好才能做好,也許我不想在這個行業工作,小printf說,然後離開。

第 6 章

真正的程式員

在本來應該是午休時間的時候,Printf 打斷了一個似乎忘記吃午飯的人,一個三明治一分鐘變冷,坐在他們的辦公桌前,看着他們的螢幕。

那似乎是一個很忙的人,可能知道他們在做什麼。Printf 問:

如果主資料庫可能失敗,那麼從屬資料庫也會失敗嗎?

這位人士說,你所經營的一切都可能而且遲早會失敗。

連告訴你事情的事情都失敗了?

是的,即使是這些。所有大型系統在任何給定時間都處于某種局部故障狀态。

那麼,試圖做出可靠的系統,有什麼用呢?

那人不知道,因為那一刻,他們正試圖回答一頁天因為斷雲而落到他們頭上的問題,想着同樣的事情。

那麼制作可靠的系統有什麼用呢?再次按下小Printf

這個人正在處理生産問題,這孩子不放手,一個三明治要浪費了,這個人不耐煩地回了一句:

根本沒用。無論如何,程式設計都是狗屎。

哦!,他喘着粗氣。

然後是片刻的完全寂靜。

真正的程式員

小家夥回應道,帶着一絲怨恨:

我不相信你。程式是脆弱的,但程式員可以做出很好的努力,讓事情變得更好、更有用。

沒有回複回來。那時,這個人打開了文檔,解釋如何從頭開始引導整個叢集的新副本,事情似乎變得越來越糟。

而且您實際上相信良好可靠的程式-

不好了!那人說。不不不!我不相信好的或可靠的程式!不再!他們都很可怕!我剛剛告訴你我想到的第一件事,因為我現在正在處理這些糟糕的系統。你沒看到我在努力讓這些東西繼續運作嗎?這狗屎實際上是有後果的。

Printf 回過頭來,表情震驚。

真的有後果嗎?你說話就像一個“真正的程式員”。

他加了:

你把一切都混為一談,混淆了一切。有數以百萬計的程式,多年來,它們一直在運作,也同樣失敗。人們已經使用它們并且需要它們。而且我知道有些程式隻能在一台筆記本電腦上運作,一個錯誤可能會破壞整個社群,甚至沒有注意到。你認為這不重要嗎?

那人保持沉默。

第七章

真正的程式員

我朋友通路的第四個工作區有一個人,他的電腦貼滿了很多貼紙,沒人知道它是什麼品牌。

motor-mvc, quadrangular JS, GoQuery, cometeor, 一些日本聲音,...

嗨,中斷的 printf。你在做什麼?

alchemist, bongodb, mochascript, walktime.js, portasql,

你在做什麼?,他又問了一遍,這次聲音更大了。

哦,我正在嘗試新的架構、工具、資料庫、語言。

哇,你的速度似乎很快,可能和 10 個程式員加起來一樣快!

是的!好吧,這個行業發展得非常快!,他看了一眼手機,然後補充道!cardboard.io 架構提出了 3.5 版本,它破壞了與 3.4 的相容性,這在社群中産生了 4 個分支!我必須嘗試所有這些才能知道選擇哪個!

你是怎麼學習所有這些的?

我是早期采用者。如果您不及時了解最新資訊,您就會陷入以編寫 COBOL 或 MUMPS 為生的困境。你想找到下一件大事,乘風破浪!

它曾經奏效過嗎?

哦是的!我在 Rails 變得大之前就發現了它,并且在 node.js 流行之前我就發現了它,而且我在 redis 和 mongodb 和 riak 的第一個 beta 副本上!我是第一個使用 vagrant 的人,然後我讓我們切換到 docker,但當然現在都是關于 unikernels 的。

很酷,所有這些你都站在最前沿的事情,它是如何得到回報的?

哦,它沒有;當rails變得巨大時,我已經轉向下一件大事,是以我沒有落伍。其他的也一樣。不過,這裡希望有 unikernels

我明白了,加了一點 printf,若有所思。你用所有這些架構解決了什麼問題?

哦,我確定我們不會使用不會大的東西,這樣這家公司就不會押注沒有未來的技術。這是一項非常重要的工作,因為如果你不這樣做,除了落後于時代的老灰胡須,你找不到任何人可以雇用,你需要有上進心的人,他們也是早期的采用者。,男人說。

這很有趣,我們的朋友說。

這很難!在創業的世界裡,如果你想要一流的玩家,你需要好的技術來吸引他們!否則你會被僵硬的落後者困住。沒有人願意成為一個死闆的落後者。

小printf插嘴道:不,我不是這個意思,然後他補充說,我的意思是工具是為我們解決問題的,但對你來說,工具本身已經成為問題。

就在那個人默默地站在那裡(在他新的涼爽的跑步機桌子上)時,小printf跳出了房間。

第 8 章

真正的程式員

隔壁辦公室裡坐着一個疲憊的員工,手裡拿着幾十個空咖啡杯,正懶洋洋地趴着,憤怒地打字。

嗨,小 printf 說。

女人并沒有停止她正在做的事情。她不停地拼命打字。

你好?他又問。

女人立刻停下來,從書桌抽屜裡拿出一個燒瓶,喝了一口。

我的工作很糟糕,她說。我做開發。開始還好,我主要是開發,有時是調試東西,但随着時間的推移,情況變得越來越糟。我開始在我們的堆棧中滅火,然後更多的火災不斷發生。我擺脫了他們中的大多數,在這裡和那裡創造小奇迹,然後滿足我也必須做的開發工作的最後期限

他們有雇人幫忙嗎?

不,就是這樣。小火不斷地在這裡和那裡發生,由于我花了很多時間來撲滅它們,我不能像以前那樣小心地處理開發人員的東西,是以我一直在制造更多的火。現在我整天整夜都在滅火,我讨厭我的工作

為什麼你的雇主不做任何事情?

我擅長我的工作,并且我設法将事情控制得足夠長,以至于每個人都習慣了。當你養成了小奇迹的習慣時,人們就會習慣它。然後你一直被困在創造奇迹,否則他們會認為你根本不會做你的工作。

聽起來很悲傷

這是; 因為你是最熟悉這些火災的人,是以你隻能越來越多地處理它們,直到你的雇主雇傭其他人來代替你以前的工作,你所愛的人。如果你對自己的工作足夠關心,去做别人讨厭的事情,你就會因為做越來越多你不喜歡的工作而得到感謝,直到你隻做這些。然後你就沒有什麼可以享受的了。

那你就倒黴了,小printf說。

她的尋呼機又響了。

那個女人,小 printf 對自己說,當他繼續他的旅程時,那個女人會被所有人蔑視:被資深專家,被搖滾明星開發者,被連續早期采用者。盡管如此,她是他們中唯一一個看起來很有幫助的人。或許是因為她在想着自己以外的事情。

第 9 章

真正的程式員

在大樓的拐角處,printf 找到了一間帶大窗戶的大辦公室,可以看到該地區的壯麗景色。裡面坐着一位老紳士,桌上放着一大堆檔案。

啊,當 printf 站在門口時,一個開發人員驚呼了這個人。進來!

透過窗戶,小 printf 發現上面寫滿了文字。在幹擦筆的幫助下,外面的世界被大量的圓圈、箭頭、圓柱體和雲彩遮住了。雖然好奇這個人需要在戶外可以看到真實雲的地方畫出雲,但整個合奏更有趣。

這是什麼?,我們的朋友指着窗戶問。

哦這個?這是我們的生産系統!男人說,從來沒有想過這個問題是關于外面的世界的。我是一名軟體架構師。

什麼是軟體架構師?

大多數情況下,它是知道如何最好地建構和協調大型系統的元件的人,是以它們都可以很好地組合在一起。這是一個必須了解資料庫、語言、架構、編輯器、序列化格式、協定以及諸如封裝和關注點分離等概念的人。

這很有趣!小printf說,這裡有人可以回答我所有的問題!他看了一眼架構圖。你的系統令人印象深刻。它跑得很快嗎?

我不能告訴你,建築師說。不過應該

那麼代碼怎麼樣,好嗎?

我不能告訴你

使用者對此滿意嗎?

我也不能告訴你,我害怕

但你是一名軟體架構師!

确切地!但我不是開發人員。不是架構師去編寫子產品和類,組合庫。軟體架構師太重要了,不能到處碰代碼。但他與程式員和開發人員交談,向他們提問,為他們提供指導。如果問題看起來足夠有趣,建築師就會接管規劃。

為什麼是這樣?

因為我們更有經驗。我們更多地了解系統以及什麼有效或無效。然後,開發人員可以擴充我們的知識來生産出色的系統!

但是,如果不涉及代碼,你怎麼知道事情是否進展順利呢?

我們信任開發商

是以你相信他們能正确地實作你的想法,但不足以提出他們自己的想法?

軟體架構師明顯被這個評論動搖了。我想我可能有點脫節了,他終于承認了。問題是,過了一段時間,你被要求處理太多想法,你沒有一個好的方法來測試或驗證它們……他凝視着,若有所思。有時軟體架構師似乎既不做軟體也不做架構。

Little printf 離開了房間,結束了他的通路,離開了大樓。

第 10 章

真正的程式員

小printf 一到外面,就遇到了一個為慈善募捐的人。

你好,男人說。今天幫助别人感覺如何?

這可能會讓我感覺好些,小 printf 回複說。我整天都在這個辦公室裡,現在我比以往任何時候都更加困惑。

啊,我明白了。這些人都是開發人員。它們并沒有真正的幫助,不是嗎?他們喜歡說的是他們正在改變世界,事實上,他們在這方面幾乎取得了成功。

那怎麼感覺這麼别扭呢?問小printf。

嗯,他們做的最好的往往是幫助一些人的工作變成了程式,或者讓大家的閑暇更加悠閑。軟體正在吞噬這個世界,這肯定會改變它的面貌……但在内心深處,它還是同一個舊世界,有着一張被毀壞的臉。感覺尴尬的原因是,以這種方式改變并不意味着事情會變得更好。我們有同樣的缺陷和問題,我們内心深處也有同樣的漏洞。

那麼我怎樣才能感覺更好呢?小普林特夫顯然很焦慮。

男人想了想,提議 printf 來幫他幫助别人,因為這是這個男人感覺更好的方式。下午,printf 向這個人講述了他的問題和他的冒險經曆。沉默了許久,男人開口道:

人們玩的遊戲,他們追逐和娛樂的角色和聲譽,他們從解決錯綜複雜的問題中獲得的轉瞬即逝的快樂,都在一段時間内很有趣。但最終,如果你沒有解決任何有價值的問題,如果你忘記了所涉及的人,那麼它永遠不會真正令人滿意。

這可能很好,也可能不是,當你長大後,你可能會或可能不會從工作場是以外的其他地方得到它。工作可以是工作;可以是為了錢,也可以是為了好玩。沒關系。隻要您設法在生活中的某個地方獲得這種滿足感。

最後,隻有當你用人的面孔解決問題時,你才能真正感到正确;重要的東西對計算機來說是不可見的。

正是你在系統上花費的時間才使它變得如此重要”,該男子補充道,“當你忘記了為什麼花時間在系統上是有意義的,當它變成一種驕傲的遊戲時,它會引起更多的悲傷比救濟。

開發人員經常忘記這個事實;如果你忽略了事情,在你的系統上工作就會成為它自己的問題,最有效的解決方案是擺脫系統,因為它是問題所在。

隻有當你用人臉解決問題時,你才能真正感覺到正确,對自己重複一點printf,這樣他就會記住。

第11章

真正的程式員

現在坐在我面前的 Printf 正在回家的路上。與他交談讓我意識到,面對我喜歡的東西,我開始程式設計的目的,我所做的事情有多少是蒼白的。Printf 遇到的每一個人都是我看到自己随着時間的推移而扮演的角色。他們鼓勵我成為他們,并且可能鼓勵人們也這樣做。

在我試圖成為一名真正的程式員的遊戲中,Printf 沒有。他說他可以不做一個真正的程式員,他更喜歡做一個有人情味的程式員。

今天我陷入了回首往事的境地,我必須弄清楚我是否也可以成為一個有人情味的程式員;或者如果我所做的一切都隻是一份工作。兩者之間似乎沒有太多值得的東西。