編程四十年

翻譯轉(zhuǎn)載來(lái)源:https://codefol.io/posts/the-forty-year-programmer/

到2024年,我就已經(jīng)做了40年程序員了。雖然現(xiàn)在還沒(méi)有到達(dá)那個(gè)階段,但那天遲早會(huì)來(lái)。不同于通過(guò)開(kāi)發(fā)軟件賺很多錢(qián),或者開(kāi)一個(gè)軟件公司。雖然我確實(shí)賺了很多錢(qián),但是這并不是我從事軟件行業(yè)這么多年的目的。

我認(rèn)為你想長(zhǎng)時(shí)間當(dāng)一個(gè)軟件開(kāi)發(fā)者,就像一些音樂(lè)家、藝術(shù)家、裝修工一樣。如果不是這樣,你就可以點(diǎn)擊瀏覽器的右上角了,這樣做非常的有趣,沒(méi)有傷害也沒(méi)有痛苦。但是我認(rèn)為你可能想做一個(gè)二十年或40年甚至更久的程序員。那么請(qǐng)往下看。

我不會(huì)告訴你去學(xué)習(xí)哪種語(yǔ)言或框架。因?yàn)槿绻阌辛己玫木幊袒A(chǔ),你能學(xué)習(xí)任何你想學(xué)習(xí)的編程知識(shí)。直到學(xué)好基礎(chǔ)之前,你不能學(xué)習(xí)好你想要學(xué)的任何技術(shù)知識(shí)。無(wú)論如何,這就是我學(xué)習(xí)的方式。

反而我要說(shuō)的事情是我在剛開(kāi)始編程時(shí)沒(méi)有意識(shí)到但現(xiàn)在他們是我天空中的指路星的那些事情。這就意味著這篇文章不會(huì)具體的談?wù)撃稠?xiàng)技術(shù)。技術(shù)和語(yǔ)言來(lái)來(lái)去去,但他們不會(huì)成為你的指路星。

讓我們從【軟件是年輕的】開(kāi)始吧

軟件開(kāi)發(fā)很年輕

計(jì)算機(jī)語(yǔ)言Fortran可以追溯到1957年,還有一些同期的語(yǔ)言(LISP和Algol:1958年,COBOL:1959)和一些年齡更大的奇怪競(jìng)爭(zhēng)者(Konrad Zuse的Plankalkül,1942 ish)

距今已經(jīng)65年了,大約從1957年開(kāi)始就有程序員了。自1998年(24年)以來(lái),我一直是一名全職有償程序員,但自1984年(38年)以來(lái)我就開(kāi)始做程序員了,所以我的經(jīng)驗(yàn)頗為豐富。Alan Kay,Smalltalk編程語(yǔ)言的發(fā)明者,大約始于1963-59年。他是我發(fā)現(xiàn)的最活躍的人之一。

相比之下,YOYOMA已經(jīng)66歲了,他從4歲半起就開(kāi)始演奏大提琴。他遠(yuǎn)不是世界上演奏時(shí)間最長(zhǎng)的音樂(lè)大師?!都崴故澜缂o(jì)錄》稱(chēng),Kasper “Stranger” Malone?在連續(xù)八年里都有專(zhuān)業(yè)的音樂(lè)發(fā)行。這還只是職業(yè)音樂(lè)人和賣(mài)錢(qián)的歌曲。還沒(méi)有計(jì)算live演出或者任何不需要付費(fèi)的音樂(lè)。所以,讓我們假設(shè)一位真正有經(jīng)驗(yàn)的音樂(lè)家工作了15年,就比我們整個(gè)行業(yè)存在的時(shí)間還要長(zhǎng)。

如此看來(lái),我們的領(lǐng)域還很年輕。

你不需要從小開(kāi)始

所以如果我從八歲開(kāi)始編程以及YOYOMA從四歲半就開(kāi)始演奏,相比之下對(duì)你來(lái)說(shuō)就太遲了嗎?

大約一年前,我才開(kāi)始認(rèn)真彈鋼琴,當(dāng)時(shí)我才45歲。我想我真的很有進(jìn)步,如果我堅(jiān)持下去,我會(huì)在60歲的時(shí)候演奏的非常棒。我已經(jīng)可以體面演奏一些歌曲了。你知道嗎?當(dāng)你掌握一些知識(shí)背景和思考方法時(shí),你會(huì)更快的編號(hào)。幾年來(lái),你一直在練習(xí)掌握技能,甚至不止幾年。

假設(shè)你已經(jīng)50歲了,你能有差不多30年的好時(shí)光去做一個(gè)軟件開(kāi)發(fā)者。如果你從50歲開(kāi)始,當(dāng)你到60歲會(huì)比我在十八歲所花的十年有效率多了。

我遇到過(guò)20歲、30歲甚至40歲才開(kāi)始工作的優(yōu)秀程序員。我不知道任何你不能從50歲或者60歲開(kāi)始的原因。學(xué)習(xí)編程需要時(shí)間和工作,但不需要你年輕。

但這是否意味著你不會(huì)做的那么好?我在鋼琴演奏上沒(méi)有YOYOMA在大提琴演奏好。即使我重新從年輕時(shí)重學(xué)編程,我在編程上都沒(méi)有Alan Kay厲害。你還知道有誰(shuí)不如YOYOMA嗎?基本上所有演奏大提琴的人,但是這點(diǎn)沒(méi)有阻止他們?nèi)W(xué)習(xí)大提琴。不管怎樣,他們中的許多人都擅長(zhǎng)大提琴。所以即使我永遠(yuǎn)不會(huì)進(jìn)入世界前十,我還是享受彈鋼琴。

我同樣享受編程。我成為下一個(gè)艾倫·凱的可能性基本為零。他在我這個(gè)年齡已經(jīng)完成了Smalltalk的編寫(xiě)。如果你從事軟件工作,“不需要做艾倫凱”是必要的。即使是年輕的艾倫·凱也也做不了現(xiàn)在的艾倫·凱。他必須接受這一點(diǎn)。

順序并不關(guān)乎成敗

如果你想擁有一個(gè)長(zhǎng)期編程生涯并且你開(kāi)始入行,就應(yīng)該照我常說(shuō)的做:“只需要寫(xiě)一些軟件,任何軟件都沒(méi)有關(guān)系”。你需要去學(xué)習(xí)許多不同的事情,你學(xué)習(xí)它們的順序反而不是很重要。

在這40年中,許多業(yè)務(wù)方向來(lái)來(lái)往往。桌面app?完成了,移動(dòng)端?寫(xiě)了,操作系統(tǒng)?搞定了,網(wǎng)頁(yè)編程?一直在弄。你自己的列表可能回不一樣,但是它將跨越多種不同的編程。你做這些功能的順序并不重要,重要的是你需要一直嘗試不同的事情。

當(dāng)然,“嘗試不同的東西”是關(guān)鍵。你在四個(gè)不同領(lǐng)域中的每一個(gè)領(lǐng)域都用了 10 年的時(shí)間,比用 40 年編寫(xiě)網(wǎng)絡(luò)套接字服務(wù)器好得多。這不代表40年的深度沒(méi)有價(jià)值,深度肯定是有其價(jià)值的。所以你不應(yīng)該在一年中做40件不同的事情。

但是你得小心別太死板,事實(shí)證明幾乎任何學(xué)科方向都會(huì)教你一些東西。如果你堅(jiān)持不去學(xué)習(xí)它,你就會(huì)落伍。

嘗試不同類(lèi)型的編程。雖然無(wú)需在意嘗試它們的順序,但你應(yīng)該在某些方面深耕,并變得更好。

現(xiàn)在還早著呢

如果你學(xué)的東西沒(méi)用呢?呃,有沒(méi)有用是相對(duì)的。我花了多年的業(yè)余時(shí)間撲在一門(mén)叫DGD的老式MUD編程語(yǔ)言上。我當(dāng)然不是為了它的實(shí)用價(jià)值。幾乎所有關(guān)于它的東西都是奇怪而且非標(biāo)準(zhǔn)化的,并且它很少有真正實(shí)用的地方。但正因?yàn)樗钠婀纸虝?huì)了我很多。它教會(huì)了我后面使用Ruby on Rails,還教會(huì)了數(shù)據(jù)編程方面的一些東西,即使它沒(méi)有使用數(shù)據(jù)庫(kù)!它教會(huì)我的東西,在我后面學(xué)習(xí)的五六種語(yǔ)言都很有用。它讓我一小時(shí)又一小時(shí)地講與它戰(zhàn)斗的故事。

有趣的是,很多年后我在DGD中得到一份咨詢(xún)工作。這個(gè)世界上就沒(méi)有幾個(gè)DGD的工作,我居然得到了一份。你永遠(yuǎn)不會(huì)知道我學(xué)了許多“有用”的語(yǔ)言都沒(méi)有這個(gè)語(yǔ)言有用。

假如YOYOMA15歲,大約是它音樂(lè)生涯中的十年。假裝他像你一樣煩惱,到底是該演奏一首復(fù)雜的古典音樂(lè),還是玩弄一些流行的、爵士樂(lè)的東西。你可以幫他看看它們的優(yōu)點(diǎn):古典音樂(lè)會(huì)提高他的技巧,流行的爵士樂(lè)會(huì)給他帶來(lái)廣度,等等。

但是真正的答案很簡(jiǎn)單:既然兩者都有價(jià)值,那就挑選一些東西然后學(xué)習(xí)它。如果你再堅(jiān)持30多年,你選哪一個(gè)并不重要。這兩個(gè)都能讓你變得更好。重要的是工作,將其投入實(shí)際工作中,這將是寶貴的經(jīng)驗(yàn)。試著不假思索的“劃走”,這兩種都不值得你花時(shí)間。

這就是年輕的馬友友的答案。這也是給你的答案。

我經(jīng)常對(duì)自己說(shuō)“現(xiàn)在還早”。我的意思是我才46歲,而不是96歲或更高年齡。我至少還剩下二十年甚至是五十年時(shí)間。所以如果我做了奇怪的或者非主流但是它帶給我了樂(lè)趣的東西,那真的很不錯(cuò)。如果我做一些實(shí)際的東西,并且能讓我在短期度過(guò)難關(guān),那也挺好。

但是重要的事情是:堅(jiān)持工作,作為一個(gè)程序員需要在20年、40年或60年做大量的工作。如果兩個(gè)工作都難以取舍,那可能他們都很好,其中每一個(gè)都是好的選擇。否則他們都是不好的,那你就需要找更有價(jià)值的替代他們了。

現(xiàn)在還早,去學(xué)習(xí)有趣的或者有用的吧。去支付你的時(shí)間學(xué)習(xí)他們,但你猜測(cè)的是十年、二十年或三十年后的回報(bào)。不要總是選擇十八個(gè)月后最好的東西。你不可能真正看到未來(lái)會(huì)發(fā)生什么。

好的工作

你開(kāi)始編寫(xiě)軟件一定是因?yàn)樗谀承┓矫嫖搅四?。它的某些部分是好的,否則你就不會(huì)費(fèi)心了。

嘗試弄清楚原因。你喜歡什么?什么引導(dǎo)著你?他有什么好處?這對(duì)每個(gè)人來(lái)說(shuō)都不一樣。

我喜歡成就感和聰明的感覺(jué)。這在我工作中不是最好的事情,但是我在家經(jīng)常做。我不需要所有人看見(jiàn)它。我可以完全依靠自己的智慧。然后工作就好了。我同樣喜歡做一些不同于工作的東西,甚至我在兩個(gè)地方都寫(xiě)代碼。我喜歡寫(xiě)一些其他程序員可以使用和欣賞的東西。

你的將會(huì)有些不同,這很好,找到他們吧。

你應(yīng)該對(duì)你的工作感到滿(mǎn)意,如果它不在讓你滿(mǎn)意,你就應(yīng)該停止做它。如果它不再是好的,那就是緊急情況:你就需要休假或者找到一個(gè)你喜歡的東西。如果你的工作不再有好的感覺(jué),你就會(huì)快速且艱難地燃盡你對(duì)工作的熱情。

對(duì)工作滿(mǎn)意比較好。如果不滿(mǎn)意,就換工作。

這些都不一定意味著工作都需要很好,或者必須要換工作。但是你需要足夠好的工作來(lái)保持你進(jìn)步。保持進(jìn)步是有要求的,不管是以那種方式。所以這也可能影響你的工作。

這不是短跑或者馬拉松,這是寫(xiě)日志

做一個(gè)決定很簡(jiǎn)單,例如“我要成為一名程序員”然后列出有56個(gè)要點(diǎn)的8節(jié)計(jì)劃說(shuō)明你要如何做。我不會(huì)告訴你不要激動(dòng),如果你都不能興奮起來(lái),那又何必費(fèi)心做程序員呢。

但是我會(huì)告訴你:不要把計(jì)劃看的太重。

在我小時(shí)候,我住在離這里4.2英里的一個(gè)破爛小鎮(zhèn)上,我討厭哪里的所有人,當(dāng)然他們也討厭我。有個(gè)好理由,公平的說(shuō):我是個(gè)小混蛋,他們都沒(méi)啥過(guò)錯(cuò)。一個(gè)卡內(nèi)基梅隆大學(xué)的學(xué)位讓我離開(kāi)了那里。在我看到電腦之前,我一直覺(jué)得電腦很神奇,直到我有機(jī)會(huì)玩弄一個(gè)老的 Apple IIe 時(shí)才開(kāi)始了解電腦。在卡內(nèi)基梅隆大學(xué)我一直呆在實(shí)驗(yàn)室,因?yàn)橛?jì)算機(jī)非常棒,而我沒(méi)有任何社交技能。

所以:我采取了一條非常直接的路徑去寫(xiě)軟件,我很早開(kāi)始了不斷的工作。

但是即使是像我這樣的人都不能只靠軟件生活。最后我找到了朋友并且希望和他們維持關(guān)系。最后我厭倦了與人交談的乏味。最后我找到了妻子。然后,有了自己的孩子,并盡可能給他們最好的。最終我發(fā)現(xiàn),情緒的僵化和壓抑只能讓你越走越遠(yuǎn)離幸福的生活,即使有一份好工作。

在某些時(shí)候,你停止籌劃是因?yàn)槟悴豢赡茴A(yù)料到每件事并給出計(jì)劃。在某些時(shí)候,你不是 "脫離任務(wù)",你只是在 "過(guò)你的生活"。

所以你因?yàn)樽隽塑浖幌嚓P(guān)的東西而自責(zé)是沒(méi)必要的。為什么我在這里談了這么多音樂(lè)?因?yàn)槲乙苍趯W(xué)習(xí),而不是把所有東西都放到軟件里。學(xué)習(xí)藝術(shù)也同樣如此,我曾經(jīng)做了一個(gè)講座并且寫(xiě)了一本書(shū),它講的是如何從藝術(shù)家那里偷取軟件的時(shí)間方法,我正在展示越來(lái)越多我自己的東西。很明顯,我也在演講和寫(xiě)作。我的興趣每年都在擴(kuò)大。

這不是一種失敗,也不是放棄。你不能預(yù)測(cè)什么將會(huì)變得有價(jià)值,所以你應(yīng)該學(xué)習(xí)一些東西。這和我給你說(shuō)的關(guān)于你應(yīng)該寫(xiě)什么樣的軟件一樣,你應(yīng)該盡可能廣泛的涉獵。這就是我要交給你的:你活的越久工作的就越好,你就越能意識(shí)到每件事(和每個(gè)人)都有有用的東西能教會(huì)你。

工作就完了。

學(xué)習(xí)軟件編程并不是一項(xiàng)你計(jì)劃好的任務(wù):當(dāng)你完成這些點(diǎn)就你就是一個(gè)程序員了。還需要你盡可能快的寫(xiě)出你第一個(gè)項(xiàng)目你才是一個(gè)程序員。如果你在讀這篇文章,你有可能是一個(gè)程序員。如果不是,如果不是,就去在線(xiàn)代碼學(xué)習(xí)網(wǎng)站上寫(xiě)你的第一個(gè)程序吧 -- 它應(yīng)該在 20 分鐘內(nèi)完成。

有時(shí)候你想要提升你的某些方面:你的程序越大就越混亂,所以你需要學(xué)習(xí)模塊化和封裝。你試圖以良好的性能來(lái)處理成千上萬(wàn)的組合,所以你可能要學(xué)習(xí)一些離散數(shù)學(xué)。所有這些東西都可以在網(wǎng)上找到,如果你想深入了解,通常會(huì)有書(shū)籍和課程的參考。

學(xué)習(xí)非軟件的東西也是這樣。寫(xiě)游戲《Chicory》的人將他屏幕上的聲音與他寫(xiě)的那部分游戲音樂(lè)的調(diào)子相協(xié)調(diào):你會(huì)得到和諧的音符,因?yàn)樗シ诺娘L(fēng)鈴略有不同,取決于背景中的歌曲。這真是太酷了?我意識(shí)到我知道的還不夠多,甚至不懂得欣賞它。這有助于推動(dòng)我去年的音樂(lè)創(chuàng)作。

繼續(xù)去實(shí)踐吧,工作會(huì)有無(wú)限的樂(lè)趣讓你變得更好。不要害怕那些看起來(lái)不切實(shí)際的工作。就像我不知道音樂(lè)對(duì)我的軟件工作有什么幫助,也許什么幫助都沒(méi)有,也許會(huì)讓我獲得很高成就。未來(lái)太遙遠(yuǎn)了,我不善于預(yù)測(cè)未來(lái)20年后音樂(lè)會(huì)給我什么幫助。

我們?nèi)魏我粋€(gè)人都無(wú)法預(yù)測(cè)。

你不是在短跑或者跑一場(chǎng)馬拉松。相反的,你正在寫(xiě)日記。在十年后,你可能會(huì)翻開(kāi)它說(shuō):‘哇,我做了一些很酷的事情’或者‘哈,我真是個(gè)有趣的人’。但是我猜你能堅(jiān)持寫(xiě)日記然后說(shuō)“我很擅長(zhǎng)java語(yǔ)法的”。

不要搞混工作和職業(yè)

難道我不想在某個(gè)時(shí)候退休嗎?退休當(dāng)然很不錯(cuò)。但是我不會(huì)停止工作。我不會(huì)為了錢(qián)做我不喜歡的工作,特別是不會(huì)教給我什么了不起的東西的工作。我目前在?YJIT?上的工作充滿(mǎn)了我愿意免費(fèi)寫(xiě)的代碼,但是如果我沒(méi)有收費(fèi),我就永遠(yuǎn)不會(huì)碰賬單還很少更新我的狀態(tài)。他們會(huì)少了很多系統(tǒng)管理的工作或 Git 歷史的維護(hù)。所以,不要把你的工作和你的事業(yè)混為一談,他們不是一回事。他們只有很少的關(guān)聯(lián)。寫(xiě)軟件是了不起的工作,它是一個(gè)不錯(cuò)或更好的職業(yè)。

這就是我要一直談?wù)撘魳?lè)家的另一個(gè)原因。一些人通過(guò)寫(xiě)和演奏音樂(lè)獲得報(bào)酬。但是許多或者大多數(shù)音樂(lè)家一直沒(méi)有獲得報(bào)酬但是他們?nèi)匀辉谧?。工作時(shí)有趣,有力量且令人滿(mǎn)意的。如果你能通過(guò)它獲得報(bào)酬,這可以為你打開(kāi)更多時(shí)間去工作。但是工作就是工作,而職業(yè)是幫你掃清工作障礙的一種手段。對(duì)我來(lái)說(shuō),編寫(xiě)軟件就是我的職業(yè)。也許你也一樣?

不過(guò),最重要的事情是你在任何時(shí)候得到的是哪類(lèi)建議。你會(huì)得到關(guān)于工作的建議。也會(huì)得到關(guān)于職業(yè)的建議。如果你把一個(gè)建議誤認(rèn)為另外一個(gè),這個(gè)建議就沒(méi)有多大意義了。令人討厭的是,人們會(huì)混淆使用“工作”、“職業(yè)”、“事業(yè)”等詞。所以只聽(tīng)詞的表達(dá)不能告訴你哪個(gè)是哪個(gè)。

編程沒(méi)有固定的等級(jí)

如果學(xué)習(xí)的順序不重要,那么就不存在“第一級(jí)”或“第二級(jí)”或其他級(jí)別這樣的東西。關(guān)于先學(xué)哪門(mén)語(yǔ)言或課程你會(huì)獲得不同的建議,這很好。但是如果你開(kāi)辟了你自己的路,這并不意味著你沒(méi)有做好基本功,你就很糟糕。最終,如果某件事很重要,你會(huì)發(fā)現(xiàn)你需要它,然后會(huì)回到它上面。

或者你不會(huì),但是大多數(shù)時(shí)候,你會(huì)的。

你會(huì)聽(tīng)到一些可怕的故事,關(guān)于一些人忽視一些基礎(chǔ),年復(fù)一年變得更糟糕。這種情況是會(huì)發(fā)生的,就像你能寫(xiě)15年的意大利面條式代碼,其中每個(gè)模塊都能直接進(jìn)入其他模塊,并且能直接修改對(duì)方的變量。如果你繼續(xù)嘗試,你會(huì)發(fā)現(xiàn)這樣為什么不好,你會(huì)創(chuàng)造一個(gè)新的風(fēng)格來(lái)解決這個(gè)問(wèn)題,然后在一些奇怪的事情上獲得表現(xiàn)出色。一個(gè)程序員的“新范式”對(duì)于其他程序員總是相對(duì)怪異的。

問(wèn)題在于你不嘗試?yán)^續(xù)進(jìn)步。如果你繼續(xù)犯錯(cuò),你就會(huì)學(xué)到有用的東西,或美好的東西,或怪異的東西。如果你一直做相同的事情而不去嘗試改進(jìn),你就會(huì)一直很糟。

但如果你按照順序通過(guò)某人預(yù)設(shè)的關(guān)卡也是可行的。

李小龍說(shuō):"我不懼怕會(huì)一萬(wàn)種腿法的敵人,我只怕把一種腿法練一萬(wàn)次的對(duì)手"。

訣竅就是關(guān)注和提高,如果你堅(jiān)持足夠長(zhǎng)的時(shí)間,你可以專(zhuān)注于一件事,十件事甚至是一百件事。你可能無(wú)法管理一一萬(wàn)件事情。但是如果你真的足夠努力,你可以證明我錯(cuò)了。但你必須要做一些奇怪的事情。

這很好,新的范式-被稱(chēng)為“奇怪的事情”-是我們?cè)鯓邮占玫男率挛锏姆绞健H绻霸诿總€(gè)星期二做一些全新的事情”是你的“一腳”,那就繼續(xù)踢下去吧。你會(huì)發(fā)現(xiàn)這很糟糕,或者你會(huì)變得非常擅長(zhǎng)它。

你變得越好,你就越與眾不同

職業(yè)生涯早期的培訓(xùn)(代碼學(xué)校、博客文章、大學(xué)課程、書(shū)籍)感覺(jué)像一條流水線(xiàn)。他們有一堆真正的基礎(chǔ)技能-例如,寫(xiě)函數(shù)、調(diào)試、估算以及團(tuán)隊(duì)交流。他們?cè)噲D確保你在每一個(gè)方面都有一個(gè)基本的能力水平。

人們很容易認(rèn)為,比如說(shuō),一個(gè)首席工程師,有一個(gè)你需要的技能清單,但是有許多技能在列表上同時(shí),還必須要保持高水平,但是那并不是事實(shí),一點(diǎn)兒也不。

它不僅僅是工作水平,它同樣是開(kāi)源的級(jí)別,還是受尊敬的級(jí)別。

你能通過(guò)寫(xiě)一段相當(dāng)簡(jiǎn)單的代碼然后寫(xiě)出(使用自然語(yǔ)言,如英語(yǔ))它的大量細(xì)節(jié)來(lái)獲得巨大的尊重,比如 Patrick McKenzie 的 Bingo Card Creator 。你還能通過(guò)寫(xiě)出一些真正能獲利的軟件來(lái)獲得尊重,就像一個(gè)公司的創(chuàng)始人。或者寫(xiě)一些有深度的和復(fù)雜的東西,就像一些晦澀難懂的語(yǔ)言(Haskell)。這些途徑除了基本能力之外沒(méi)有多少相同的地方。

你需要非常擅長(zhǎng)某件事,而且這件事需要受歡迎或有利可圖,或者以某種方式 "做大"。這聽(tīng)起來(lái)應(yīng)該非常模糊,因?yàn)樗緛?lái)就是模糊的。它同樣是主觀的。如果你打算賺比爾-蓋茨級(jí)別軟件的錢(qián),但是你卻寫(xiě)了Haskell(復(fù)雜,高深,廣受好評(píng),但沒(méi)錢(qián))。你將會(huì)獲得巨大的失敗,反之亦然。并且相關(guān)聯(lián)的技能完全不同。

這就是為什么問(wèn)一些問(wèn)題會(huì)很傻,例如“我有15年的編程經(jīng)驗(yàn),我的工資應(yīng)該有多少?”。十五年的經(jīng)驗(yàn)非常多,以至于你應(yīng)該完全不像站在你旁邊同樣有15年經(jīng)驗(yàn)的人。你寫(xiě)過(guò)書(shū)嗎?在一個(gè)大規(guī)模的項(xiàng)目上工作,賺了錢(qián)?上傳了非常有趣的開(kāi)源項(xiàng)目?你在這十五年里面做了什么?就像說(shuō),“我是一個(gè)有20年經(jīng)驗(yàn)的音樂(lè)家,我應(yīng)該每小時(shí)賺多少錢(qián)?”對(duì)于這個(gè)問(wèn)題沒(méi)有一個(gè)簡(jiǎn)答的答案,它也不應(yīng)該有。

不僅僅是工資的問(wèn)題,你應(yīng)該問(wèn)“我是一個(gè)有15年經(jīng)驗(yàn)的軟件工程師,這意味著我完全有能力領(lǐng)導(dǎo)這個(gè)項(xiàng)目,對(duì)嗎?”,這個(gè)答案當(dāng)然是“有可能”。接下來(lái)的問(wèn)題是“你在15年里面做了什么?”

你應(yīng)該通過(guò)做基礎(chǔ)練習(xí)學(xué)習(xí)深刻原理

我不會(huì)告訴人們一開(kāi)始就去學(xué)習(xí)軟件設(shè)計(jì)的深層原理。這是因?yàn)槿绻銍L試把他們當(dāng)作理論去學(xué)習(xí),但沒(méi)有實(shí)際的經(jīng)驗(yàn),你大概率會(huì)犯錯(cuò)。先學(xué)習(xí)通過(guò)一些實(shí)際的語(yǔ)言去構(gòu)建一個(gè)可用的軟件。我真的不關(guān)心是哪個(gè)語(yǔ)言。在你的實(shí)際開(kāi)發(fā)中獲得一些真正的錯(cuò)誤。然后我們能去討論存在哪些理論去修復(fù)你個(gè)人的問(wèn)題。

如果事實(shí)證明你在模塊化這方面做的很出色,這太棒了!我們可以討論你遇到的其他問(wèn)題,對(duì)我來(lái)說(shuō)是可行的。如果你沒(méi)有問(wèn)題,但結(jié)果仍然是簡(jiǎn)單而平淡的......那么你確實(shí)有問(wèn)題,我們可以討論這個(gè)。如果你沒(méi)有需要關(guān)心的問(wèn)題,這僅僅意味著你能很好的構(gòu)建同級(jí)別的軟件。由你決定。當(dāng)你開(kāi)始感覺(jué)到你的工作變得陳舊時(shí),那么你確實(shí)有一個(gè)問(wèn)題,所以你可以尋找一個(gè)解決方案。在那之前,做對(duì)你有用的事情。

然后,做二十多年的相同的循環(huán)。構(gòu)建,犯錯(cuò),學(xué)習(xí)理論,修復(fù)你的錯(cuò)誤。我不太關(guān)心你做這一切的順序。

這是否意味著如果你一開(kāi)始學(xué)習(xí)了理論你就會(huì)“破壞”你自己然后永遠(yuǎn)變壞?當(dāng)然不會(huì)。但是它會(huì)需要一段時(shí)間你才能使用你學(xué)的理論。所以他不是最快的方式去構(gòu)建一個(gè)好的軟件。在長(zhǎng)期的學(xué)習(xí)中,一切都會(huì)好的,現(xiàn)在還早,不是嗎?

使用什么樣的技術(shù)很重要

我花了很多時(shí)間告訴你學(xué)習(xí)技術(shù)的順序并不重要。

那重要的是什么呢?

重要的是你要學(xué)不同的東西,如果你總是做一件事,你不會(huì)了解到你養(yǎng)成了哪些壞習(xí)慣。如果你總是在一臺(tái)機(jī)器上寫(xiě)代碼,你就不知道自己有多少網(wǎng)絡(luò)知識(shí)沒(méi)有學(xué)到,而最終網(wǎng)絡(luò)可能是重要的。如果你只是工作于web服務(wù)器并且從不寫(xiě)移動(dòng)端或app代碼,你就永遠(yuǎn)不會(huì)知道到為什么“只在我的機(jī)器上工作”是如此的糟糕。你能在相當(dāng)長(zhǎng)一段時(shí)間內(nèi)做一件事情,五年?十年?但是如果你需要做40年,你就需要了解自己軟件所涉及的許多其他技術(shù)。你需要一些視角(洞察力)才行。

觀點(diǎn)就像其他深層原理一樣,你通過(guò)工作和看到現(xiàn)實(shí)世界的問(wèn)題來(lái)獲得它。你需要通過(guò)各種工作來(lái)獲取它,這樣你就能看到不止一種觀點(diǎn)。當(dāng)你說(shuō)“好吧,我的部分正常工作”,但是這整個(gè)系統(tǒng)失敗了,因?yàn)槠渌说牟糠譀](méi)有工作,你就能意識(shí)到你觀點(diǎn)的問(wèn)題。你學(xué)習(xí)到關(guān)心一些大于你自己的代碼的問(wèn)題。這樣就變成了軟件架構(gòu),但是它同樣變成了洞察和同理心。一個(gè)真實(shí)世界的軟件系統(tǒng),要做一些有用的事情,有很多軟件,但也有很多人。你不能忽視這些人。

這意味著需要學(xué)習(xí)多種技術(shù),和許多非技術(shù)的技能。

你使用什么技術(shù)很重要的另一個(gè)原因是,一些語(yǔ)言或庫(kù)會(huì)使你在特定的技能方面更出色。你“應(yīng)該至少學(xué)習(xí)一門(mén)功能性編程語(yǔ)言”,就像你“應(yīng)該學(xué)習(xí)彈奏莫扎特的曲子”一樣。它會(huì)教你一些有趣的東西,讓你能變得更好。如果你想做四十年的編程,那你就需要有扎實(shí)的基礎(chǔ)技能。

難道你不能從任何技術(shù)中學(xué)習(xí)扎實(shí)的基本功,而不僅僅是那些奇怪的難點(diǎn)?當(dāng)然可以。如果你已經(jīng)做到了,那么學(xué)習(xí)相當(dāng)于莫扎特鋼琴曲的軟件對(duì)你來(lái)說(shuō)就不難了。莫扎特沒(méi)有什么神奇之處。他傾向于些難的音樂(lè),你必須快速而準(zhǔn)確地移動(dòng)你的手指。Haskell同樣沒(méi)有什么神奇之處。它需要你對(duì)模塊化和依賴(lài)性保持小心和精確。如果你在這方面已經(jīng)很出色,你會(huì)做的很好。

但如果你在欺騙自己說(shuō)自己很棒,你會(huì)發(fā)現(xiàn)你在撒謊。

我對(duì)學(xué)習(xí)軟件編程采取 "做任何感覺(jué)好的事情 "的方法,這樣的好處是無(wú)論你在做什么,你都可以繼續(xù)做下去。但最糟糕的是,我不會(huì)讓你對(duì)你的錯(cuò)誤負(fù)責(zé),我只是假設(shè)你會(huì)處理這個(gè)問(wèn)題。

這可能很好,也可能很糟。你自己做選擇吧。我不是你的母親或你的導(dǎo)師。

大多數(shù)時(shí)候我們需要在屁股上被踢一腳來(lái)提醒我們的問(wèn)題。我當(dāng)然也需要。我在踢自己屁股的一個(gè)方法就是學(xué)習(xí)難而準(zhǔn)確的東西,如果我犯錯(cuò)我就會(huì)注意到它。

關(guān)注其他領(lǐng)域,向其他領(lǐng)域?qū)W習(xí)

如果我們的產(chǎn)業(yè)很年輕,這意味著什么?它意味著我們?nèi)匀辉诿骰A(chǔ)的東西。

當(dāng)我在大學(xué)的時(shí)候(1993-1998),測(cè)試優(yōu)先和測(cè)試驅(qū)動(dòng)開(kāi)發(fā)還不是真正的東西。敏捷開(kāi)發(fā)也不是真正的東西。這些方法是存在的,但是并不流行,也不為人所知,更沒(méi)有很好的開(kāi)發(fā)。源碼控制存在但是并不好用也沒(méi)有廣泛的使用。開(kāi)源項(xiàng)目是存在的,但是人們普遍認(rèn)為開(kāi)放源碼的都是粗糙的軟件。認(rèn)為L(zhǎng)inux是或者永遠(yuǎn)是最好的操作系統(tǒng)是一件奇怪的事情,雖然一些狂熱的信徒是相信的。對(duì)于速度密集型應(yīng)用來(lái)說(shuō),C語(yǔ)言是否足夠快以取代匯編語(yǔ)言還沒(méi)有定論。最終,“GOTO”被認(rèn)為是不好的,我們應(yīng)該避免它。web開(kāi)發(fā)才剛剛起步,我在校期間它開(kāi)始在網(wǎng)頁(yè)上支持圖片。

在我們這行事情改變相當(dāng)?shù)目?。換個(gè)角度來(lái)說(shuō),我們?nèi)匀辉诨A(chǔ)方面是無(wú)能的。

你能從其他領(lǐng)域中學(xué)到一大堆東西。我寫(xiě)了一本關(guān)于如何竊取藝術(shù)家的練習(xí)方法的書(shū)。我一直在這里談?wù)撘魳?lè)家,藝術(shù)和音樂(lè)是古老的學(xué)科,我們已經(jīng)教了它們很長(zhǎng)時(shí)間。所以藝術(shù)和音樂(lè)教師比計(jì)算機(jī)科學(xué)教授更好,他們有幾千年的經(jīng)驗(yàn)優(yōu)勢(shì)。

所以如果你遇到一個(gè)問(wèn)題,你開(kāi)始學(xué)習(xí)計(jì)算機(jī)程序員處理問(wèn)題的最佳方法……可能已經(jīng)大大限制了你的選擇。最好想想其他人處理問(wèn)題的方式。Atul Gawande的《The Checklist Manifesto》講述了關(guān)于宇航員、摩天大樓建造者和醫(yī)生處理清單列表的方式是非常不同的。他們都是偉大的方法。在軟件中,我們才剛剛開(kāi)始偷他們的方法,所以如果你向軟件工程師學(xué)習(xí),你已經(jīng)跳過(guò)了學(xué)習(xí)處理大多數(shù)清單類(lèi)型問(wèn)題的最好方式。

檢查清單在這里不是獨(dú)一無(wú)二的,爵士音樂(lè)家的合作水平讓程序員十分羨慕。嚴(yán)肅的視覺(jué)設(shè)計(jì)師產(chǎn)生的結(jié)果是數(shù)據(jù)科學(xué)家可以嘗試模仿的,但我們并不擅長(zhǎng)這個(gè)。當(dāng)我看到烹飪學(xué)校培訓(xùn)的團(tuán)隊(duì)和他們的工作空間組織時(shí),我的下巴都掉下來(lái)了。在一個(gè)圖書(shū)館員組織的數(shù)據(jù)空間工作幾年,你就會(huì)明白我們的文檔是多么糟糕。

如果你想要和非常棒的程序員一樣好,你真的在出賣(mài)你自己。

我很確定你會(huì)注意到程序員趨于忽視非程序員的好建議。"單純的 "QA 人員和運(yùn)營(yíng)人員往往被視為二等公民,我們經(jīng)常表現(xiàn)得好像他們沒(méi)有什么可以教我們的。這是非常愚蠢的。如果你足夠聰明,你會(huì)弄清楚他們擅長(zhǎng)什么,并且為什么它很重要。

如果你認(rèn)為答案是“他們什么都不擅長(zhǎng),而且這一點(diǎn)也不重要”,那你永遠(yuǎn)不會(huì)像他們一樣擅長(zhǎng)他們的事情。

要從非常不同的學(xué)科中學(xué)習(xí)技能是很難的。學(xué)習(xí)足夠的藝術(shù)去偷他們的練習(xí)方式也是很難的。這可能需要幾年時(shí)間。但是對(duì)于那些非常像編程的學(xué)科-數(shù)據(jù)庫(kù)管理或者DevOps-都非常接近,這些都非常值得去了解他們。

這同樣意味著如果你有木工、舞蹈或空手道的愛(ài)好,你應(yīng)該去考慮這些技能能給你什么。另一個(gè)程序員可能要花多年去學(xué)習(xí)它,但是你已經(jīng)有了。我希望它能教會(huì)你一些“可轉(zhuǎn)移”的技能。但是我不知道是哪些技能,因?yàn)槲也蛔瞿竟せ颍ù蟛糠郑┪璧富蚩帐值馈_@就是為什么我在這里談?wù)撍囆g(shù)和音樂(lè),那些東西我還了解一點(diǎn)。

程序員是反面的

如果你從其他領(lǐng)域?qū)W習(xí),它會(huì)讓你變得奇怪。雖然大多數(shù)情況是好的,但是有時(shí)候它也會(huì)不太一樣。

具體的例子就是,藝術(shù)家和音樂(lè)家還有作家如果你重復(fù)了相同的練習(xí)一遍又一遍,你會(huì)變得很擅長(zhǎng)。重寫(xiě)是一件事,練習(xí)相同的音樂(lè)段落是一件事,反復(fù)畫(huà)人物和畫(huà)靜物也是一件事。

我們?cè)谲浖_(kāi)發(fā)里面也有一個(gè)名字-“重復(fù)造輪子”。這被認(rèn)為是一件壞事,我們?cè)谒较吕镎J(rèn)為這樣做是可恥的。我們尋找方法讓計(jì)算機(jī)做重復(fù)的事情讓我們可以投身于新工作上面。

實(shí)際上,說(shuō)你反復(fù)做同樣的事情是在公眾面前受到羞辱的快速方法。這讓你失去了聲譽(yù),以怪異的方式做做事通常會(huì)消耗你的聲譽(yù)。聲譽(yù)當(dāng)然同樣與頭銜和金錢(qián)等綁定在一起。

這就是為什么我們大多數(shù)人真的不善于啟動(dòng)新項(xiàng)目。這就是為什么我們中的大多數(shù)人都不能說(shuō)明什么時(shí)候使用一種或另一種語(yǔ)法結(jié)構(gòu),這也是我為什么我們的行為就像機(jī)器應(yīng)該強(qiáng)制執(zhí)行關(guān)于縮進(jìn)的一目了然的規(guī)則,好像有一種簡(jiǎn)單的、正確的方法來(lái)做。因?yàn)槟銟?gòu)建技能的方式是重復(fù)的,并且它會(huì)隨著時(shí)間變得更好,然后相信表達(dá)能力,并與其他人交流等常規(guī)規(guī)則在我們的行業(yè)都是被鄙視的。

這是否意味著你個(gè)人需要在這些方面做得不好?一點(diǎn)也不。

除了有幾個(gè)個(gè)別的人,你不可能說(shuō)服程序員以其他方式思考。但是,答案不是要把每個(gè)人都變?yōu)楦玫臓顟B(tài)。那將需要幾十年甚至更長(zhǎng)時(shí)間。你沒(méi)有那樣的時(shí)間。你想變得更好,比這更快。

但是,你個(gè)人可以做一些 "不好的做法",事實(shí)上做這些會(huì)使你變得更好。

你能重復(fù)的造輪子。你能重復(fù)的寫(xiě)一些東西,你同樣能通過(guò)寫(xiě)一些“壞的”代碼的方式來(lái)觀察發(fā)生了什么。

但是要小心最佳實(shí)踐(最佳方案),他們就像其他形式的建議:它們意味著別人做了工作來(lái)思考它,并變得更聰明,而你只是在使用他們想出的最簡(jiǎn)單的東西。這在開(kāi)始時(shí)很好,但作為一種改進(jìn)的方式就很糟糕。

明白如果你向藝術(shù)家和圖書(shū)管理員和廚師長(zhǎng)學(xué)習(xí),你不能簡(jiǎn)單將軟件世界的其他人拉進(jìn)來(lái)。僅僅因?yàn)槟闶菍?duì)的并不能說(shuō)服他們。你的正確做法甚至可能需要他們不具備的技能。

但是,你不關(guān)心太多你周?chē)钠渌嗽趺聪?,你就可以變得更好。而且你不必告訴人們你是如何做到的。

你變得更好,你就和其他人越不一樣。包括,特別是,那些真正擅長(zhǎng)的 "其他人"。

出于同樣的原因,要小心使用工具和執(zhí)行。它們是保證最低能力水平而設(shè)置的,而不是為了讓你真正擅長(zhǎng)一些不尋常的事情而設(shè)計(jì)的。但你想要的是在一些不尋常的事情上變得真正優(yōu)秀。

謹(jǐn)慎對(duì)待生產(chǎn)力技巧

人們會(huì)告訴你取得好成績(jī)的訣竅是持續(xù)不斷的工作。我的意思是,我至少已經(jīng)告訴你四五次了。他們會(huì)說(shuō)訣竅是每天進(jìn)步一點(diǎn),然后成倍增長(zhǎng)。

這個(gè)建議有個(gè)陷阱:大部分時(shí)間,練習(xí)并不能讓你明顯的變好。每隔一段時(shí)間,它就會(huì)使你有一個(gè)巨大的跳躍。其中一些巨大的跳躍會(huì)使你在其他幾件事上變得更糟。

如果你期望每年持續(xù)20%的增長(zhǎng),月復(fù)一月就會(huì)感到很難受。因?yàn)樾手荒苓_(dá)到這個(gè)程度,這些過(guò)程中有很多是非常低效的,而且完全不可靠。雖然有時(shí)它們會(huì)帶來(lái)巨大的收益,但往往是什么都沒(méi)有,偶爾他們還會(huì)對(duì)你造成傷害,而不是幫助。

漂亮整潔的生產(chǎn)力和效率建議,通常是針對(duì)你很了解,結(jié)構(gòu)良好的任務(wù),但40年的編程生涯并不是那種任務(wù)。需要再次強(qiáng)調(diào)的是:想想日志,不是馬拉松或短跑。試圖為自己保留一個(gè)進(jìn)度條會(huì)很糟糕。

隨著時(shí)間的推移,你會(huì)學(xué)會(huì)小型一些過(guò)于整齊的東西。再次強(qiáng)調(diào):建議是去除最重要部分的專(zhuān)業(yè)知識(shí)。是的,包括我現(xiàn)在正在說(shuō)的。

效率總是某種特定類(lèi)型的效率。省時(shí)的方法可能不省錢(qián)。無(wú)論是哪一種,都可能需要比你目前擁有的孩子更少或者更安靜的地方。效率是指你如何完善一個(gè)已經(jīng)到位并運(yùn)作良好的策略。

我很少談?wù)撔始记桑膊⒉皇窃诟嬖V你做這些事情的最快方法,因?yàn)榛旧献罹膬?yōu)化的方法也是最脆弱的。但是效率沒(méi)問(wèn)題,優(yōu)化也是好的。一旦你有了基本工作,它可以提供額外的一點(diǎn)幫助。不過(guò)困難的部分在于讓基礎(chǔ)發(fā)揮作用,這也是我最想告訴你的,事后保持高效就不那么重要,也更容易。

但說(shuō)真的,大多數(shù)情況下,干就完了

這些都是我認(rèn)為比較完美的事情,大多數(shù)是為了讓你安心,而并不是改變你的方法。我一直在推薦來(lái)自非技術(shù)學(xué)科的建議,這并不是巧合,因?yàn)槟阋呀?jīng)知道了,而不是在滿(mǎn)是技術(shù)書(shū)呆子的論壇上展示自己。

如果你寫(xiě)程序,你就是程序員?;蛘呤谴a農(nóng),或軟件工程師,或任何你喜歡的稱(chēng)呼。

如果你堅(jiān)持寫(xiě)程序,你可以成為一名多年的程序員。沒(méi)人在監(jiān)管這些東西,或者至少,如果一些人做了,你知道你能安全的避開(kāi)他們。我的意思是,有人會(huì)在這里評(píng)論說(shuō):"他不是一個(gè) 40 年的程序員,他是全職不到 25 年的!" 這很愚蠢,但我們?cè)谶@里談?wù)摰氖腔ヂ?lián)網(wǎng)。有人會(huì)這么說(shuō)的,有時(shí)標(biāo)題甚至不意味著自我描述,但你必須逐字閱讀第一句才能理解。至少閱讀兩個(gè)句子,以獲得完整的上下文。你知道,JoeRandom_420并不引人注目。

無(wú)論如何,如果你堅(jiān)持做,你就有資格被稱(chēng)為程序員。這不是一個(gè)俱樂(lè)部,這里沒(méi)人能趕你出去。如果你做了一段時(shí)間工作,就說(shuō)你做了一段時(shí)間工作就是了。

你如何做一段時(shí)間的工作?答案是堅(jiān)持不懈。在堅(jiān)持中管理你自己的期望,同時(shí)注意在犯錯(cuò)時(shí)修正他們。并且不能太過(guò)于死板,需要嘗試各種各樣的編程方式,并且從其他領(lǐng)域?qū)W習(xí)。最后,嘗試享受你的工作吧。

以上就是你剛剛看到的所有這些東西。

剩下的就是時(shí)間,也許還有一點(diǎn)就是保持成熟。

在你意識(shí)到之前,40年不知不覺(jué)就過(guò)去了。正如我父親的保險(xiǎn)杠貼紙上橡樹(shù)旁邊寫(xiě)的那樣:"你,和我一樣,會(huì)很快變老"。

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

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

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