軟體開發從業18年,我總結了9個最有價值的經驗

2021-02-19 架構頭條

從 14 歲起,我就開始在父母的臥室裡寫代碼。當時,通過非常慢的網絡,我閱讀任何能夠獲得的東西。20 歲時,作為一名 Web 開發人員,我籤了人生中的第一份勞動合同,當時學的是 PHP 和 JavaScript。

在這個領域,我花了 18 年時間,才發現編程只是職業的一小部分。即使是空閒時間出於興趣,我也不會停止編碼,但工作中還有很多其它事情。有些事情,開發者往往很晚才能領悟到,這也是為什麼我想和大家分享我的經歷,以及我覺得很重要的 9 個經驗教訓。

開發者通常很自負。這是事實。

為什麼呢?我認為,任何認真對待自己職業的人都會認為自己有點兒像藝術家。我們雖然不會在數百萬人面前唱歌或者作畫,但我們有時候在以一種非常優雅高效的方式編寫代碼、解決非常複雜的問題,我們同樣為自己的工作感到自豪。

開發者和數學家一樣,解決問題的方式都有點兒像藝術家。

正因如此,我們很維護自己的代碼——就像熊媽媽照顧她的後代那樣。親手寫下這些代碼的我們,無法忍受別人對他指指點點。

但這對任何人都沒有幫助。我們熱愛自己的工作,但更重要的是我們正在解決問題。通過與其他人討論我們的想法和方案,可能會出現更好的替代方案。這沒有什麼不對的。事實上,合作通常會產生最佳解決方案。

我見過各種各樣自負的開發者,但沒有見過哪種自負對開發者會有所幫助。

因此我的建議是:當你開始作為一名開發者工作時,請把你的自負拋掉,多聽聽其他人對你工作的看法。學會接受這樣一個事實:更好的想法可能來自你的頭腦之外,它們只會幫你提高自己的技能。只有傾聽反饋,你才能贏。

如果你只懂 JavaScript,所有的問題都會像釘子一樣。不要再稱自己是一名 Java 開發者或 JavaScript 開發者。

由於某些語言的特性或語法,你可能會偏愛一些語言,這很正常。然而,如果你能學點別的東西,就會受益匪淺。學習新語言,尤其與你日常工作所用的範式不同的語言,會幫助你打開思路,發現解決問題的不同辦法

這一點我怎麼強調也不過分:學習多種語言並使用一段時間,你會從中受益。

我幾年前讀過一本書《七周七語言》,展示了各種可用的選項,這讓我思路大開。很多選擇是我從來沒有想到過的,因為我太專注於自己的日常任務和日常工具,從來沒有停下來看看其它東西。

https://www.amazon.com/-/es/Bruce-Tate/dp/193435659X/

我們是開發者,知道如何通過代碼來解決問題,但不要把自己放到一個盒子中,你會被那個盒子的大小所限制。看看那個盒子外面的東西,跳出那個盒子思考,試試其它選項、其它語言、其它解決問題的方法。即使只是一會兒,你也會帶著新的想法和更大的心態做出更好的抉擇。

有時候,開發新手認為他們需要把所有事情都記在心裡,因此當他們意識到自己開始忘記如何寫一個簡單的 for 語句時,就會感到很糟糕。

這不僅是正常的,而且我認為這也是健康的。

有太多東西需要記憶了,但我們其實不需要記憶,我們只需要擁抱這樣一個事實:網際網路是另一個有力的工具。就像我們需要 IDE 一樣,我們需要網際網路來尋找答案。

我們都這樣做,如果你一開始就感覺不好,就不要在這種感覺上浪費時間。只需要尋找你的答案並解決你的問題。

這樣想一想:每一種語言都有一種類似但又稍有不同的觀察者(Observer)模式的實現方式。你認為什麼更現實?理解觀察者模式有什麼好處以及它能解決什麼問題,還是記住你所使用的每一種語言如何實現它?

如果你知道它能解決你的問題,那麼你就真的解決了你的問題。剩下的只是搜索實現它的最佳方法。

其它搜索也是一樣。只專注於我們職業中重要的解決問題的方面,讓谷歌幫你慢慢回憶。這才是正確的方式。

或者說,「你應該終身學習」,這完全取決於你自己是否要跟上行業的最新發展。如果你想要保持相關性,那麼你就必須一直學習。

技術在發展,語言在變化,這都很正常。誠然,有些生態系統比其它生態系統變化得更快,跟上他們的步伐似乎是一項艱巨的任務。但是,記住你只是一個人,不可能無所不知,只需專注於重要的事情。如果你必須學會一件事情,那麼我的建議是學會如何學習。

這聽起來很傻,但這可能是一名開發人員需要的首要技能。我們必須在快速學習新技能方面表現得更好。否則,你將陷入被標記為「過時」的風險。

同時,這也是本文提到的其它經驗發揮作用的地方。變化、改變、新的挑戰、沒有自負——所有這些都會幫助你學習並拓展技能範圍。你做的越多,效果就會越好。最終,你會發現所有的語言都是類似的。你將開始看到它們公共的根本,你將能夠用其中任何一種語言工作。你所要做的就是閱讀一些關鍵的東西。

你的整個職業生涯都要學習:

新語言

新(老)編程範式

新工作方法

解決問題的新方法

與團隊互動的新方法

檢查和測試代碼的新方法

如果你還沒有準備好永遠當一名學生,那你需要考慮下這個職業是否適合你。請注意,我不是說「立刻辭職」,而是考慮下是否願意開放思維來持續學習。

這個問題我說過很多次,但是作為開發者,我們傾向於認為自己的代碼在發布之前需要是完美的。雖然這並沒有什麼不對,但也可能是一個潛在的問題。

早期優化是一個問題,因為你可能在某件可能並不需要優化的事上花費大量時間,而且在某些情況下執行優化時,你會做出破壞功能的假設。

所以,把注意力集中在需要做的工作和你正在嘗試解決的問題上,一旦問題修復,立馬測試、迭代結果,看看團隊對你的解決方案有什麼想法——即使你已經看到了改進的方法。如果你需要花費兩天以上的時間來讓它完美,但它現在就可以投入生產,很有可能現在就應該投入生產。

歸根結底,你是在解決問題。解決問題越快,對你的用戶就越好。

跟上面提到的觀點一樣,不要陷入早期優化的黑洞。

即使你認為你可以快速優化,但一旦你開始做,你就會發現時間膨脹效應是真的。

作為軟體開發人員的首要任務是寫一個功能或修復一個 bug 來讓它起作用——無論代碼看起來多醜或者你的方案可能多麼低效。如果它起作用了,你就證明了它是可行的。這就成功了一半。

第二步是優化它。這是可選的一步。一些人容易忘記的細節,你可以用來優化代碼的時間取決於很多變量,這些變量有時候不受你的控制。因此,集中精力讓它起作用,然後再看看你是否真有時間來優化它。

早期優化意味著要邊寫代碼邊優化,這是一種危險的方式,因為優化時,我們都是在對執行時間、數據要求、內存需求以及其它我們尚未看到的因素進行假設,任何這樣的假設都可能是錯誤的,最終會在你的邏輯中引入 bug。

想想 TDD 工作流:

步驟 2 是必需的。你首先需要考慮通過測試,也就是說讓功能起作用。測試不關心你使用的算法或者你是否使用了三層嵌套的 if 語句。稍後才會做那些,可能是代碼評審過程中的一部分。

7 項目最後的 10% 往往要花費 90% 的時間

如果你一個人獨自工作,這一點尤其重要,但是團隊也會有這種細節計算失誤的問題。

任何一個做完項目的人都會告訴你同樣的事情(這不僅僅適用於我們行業):你一開始會略過很多細節,最後才不得不考慮它們。

這很正常。我們都傾向於一開始專注於重大的功能,將比較小的細節或已知的 bug 留到最後。但是它們仍然需要解決,這就是額外 90% 的工作。精細的工作比較花時間。你需要測試、修復、重新測試、寫文檔、執行用戶培訓、展示最終方案等等。

當然,這取決於你的環境、客戶以及很多其它因素,但總會有一些東西。所以記住:當你認為你已經寫完代碼的時候,你很可能忘記了一些東西。

編碼是關於抽象的行為。通過抽象通用邏輯,我們可以在其它地方復用它,但是一開始的時候,我們有時會注意不到抽象的重要性。

這是我個人的經驗法則:如果我在兩個地方寫了相同的代碼,那麼就將它們放到一個函數中(或者一個方法,一個模塊等等... 你懂的)。

即使數字二對你來說很低,但是要考慮到將來你可能在其它地方使用抽象後的代碼。而且通過把它放到一個常用的地方,你現在就可以使用它了。

抽象和規模有關。一段抽象的邏輯可以用很少的精力就被復用很多次,而到處複製粘貼代碼雖然很容易,但用的越多需要的精力就越多。想想,如果你因為一個 bug 不得不改變一段邏輯,而它在你的項目中被重複了 5 次,會發生什麼?你在修復這個 bug 時,會有 5 次機會犯錯。

同樣的邏輯也適用於你的日常任務。如果你發現自己做某件事一次以上,那麼它可能就可以用某種方式自動化。這是效率的關鍵,因此不要僅僅在代碼中尋找重複模式,在你的動作中也可以尋找重複模式。如果你能自動化完成一項每天需要 10 分鐘的任務,你一個月就能節省 5 個小時。

有人說,如果你想要成為一名成功的開發人員,你需要創建副業項目。我並不認同這一點。我個人認識很多優秀的開發者,他們只在朝九晚五工作時寫代碼。

老實說,我很欽佩他們。他們能夠在做好工作的同時,享受他們的空閒時間做其它事情。這絕對沒有什麼問題。

然而,有時候你需要一些額外的練習。有時候你覺得自己落後於其它同事。而這時,副業項目就會有所幫助。

我不是說構建一個新項目,讓數以百萬計的人使用,或者對產業進行革命性改變,當然如果你喜歡的話,就去做。但是我討論的是拷貝其他人的項目,以便從中學習。我說的是通過解決 bug 或者增加額外功能來向其他人的項目做貢獻。

你可以用副業項目來體驗你不經常看到的地方。如果你每天寫 8 小時的單元測試,也許可以考慮從頭創建一些東西並且開發一些功能。如果你厭倦了獨自工作,可以考慮為現有的項目做貢獻,體驗一下如何與其他人協調工作。

你可以使用副業項目來強化自己的薄弱環節,從而幫助你提高自己的技能。但同樣,不要為了被認為是一名嚴肅的開發人員,而認為你需要為他們工作或者擁有一個綠色的 GitHub 活動圖。那太傻了。

這是我作為一名開發者在過去 18 年中學到的最難的 9 個經驗教訓,希望通過我的分享,能對你的新(或者已經從事的)職業有所啟示。

原文連結:

https://medium.com/better-programming/9-hard-lessons-i-struggled-to-learn-during-my-18-years-as-a-software-developer-14f28512f647

相關焦點

  • 「敏捷軟體開發」的迷思
    當敏捷方法流行起來以後,名字裡這「軟體開發」四個字,就引發了不少的誤解。最典型的誤解是什麼樣的呢?大概這麼回事……CEO(對CIO):聽說你們搞IT的有個新東西叫敏捷,做產品又快又好,你去看看唄?CIO(查了一下百度):哦原來這東西叫敏捷軟體開發,看來是軟體開發部的事……那誰,軟體開發一部的謝部長,你們去搞一下敏捷唄。
  • 【軟開文化】軟體開發部2017年年終總結暨頒獎大會圓滿落幕
    2018年1月30日下午15點30分,軟體開發部舉行了2017年年終總結暨頒獎大會。
  • 硬貨系列之世界各國軟體工程師薪酬大比拼(上)
    (初級、中級、高級開發人員)和技術能力(Java、C++、C#、.NET、JavaScript、PHP)的不同,為您詳細介紹世界軟體工程師的薪資狀況。從歐洲主要國家的情況來看,德國、英國、瑞典和荷蘭,軟體工程師年薪在5.2萬到5.9萬美元的區間之內,芬蘭的工資情況略低,約為4.7萬美元。法國則一目了然,以4.4萬美元排名所有目標國家的最後一位。
  • 紐西蘭工作籤—木工、軟體開發工程師、空調安裝員
    要求低:無需英語要求,學歷不限制,只需相關經驗三年及以上。家屬福利:工作半年可申請家屬陪工,配偶享有同等工作權利,18歲以下子女可免費就讀當地公立院校。權益保障:國內外籤署勞動合同,薪水按周發放,無拖欠無滯壓。招收標準:男,45歲以下,有技能證書,無英語要求,身體健康,無傳染性疾病。工資:20-22紐幣/時。
  • 如何定義和區分高級軟體開發工程師
    在軟體開發領域,高級開發工程師通常是指那些編寫代碼超過3年的人。這些人可能會被放到領導的位置,但經常會產生非常糟糕的結果。
  • 一位軟體工程師的6年總結
    本文主要是關於軟體開發人員如何提高自己的軟體專業技術方面的具體建議,前面幾點旨在確定大的方向,算是廢話吧。1、分享第一條經驗:「學歷代表過去、能力代表現在、學習力代表未來。」其實這是一個來自國外教育領域的一個研究結果。相信工作過幾年、十幾年的朋友對這個道理有些體會吧。但我相信這一點也很重要:「重要的道理明白太晚將抱憾終生!」所以放在每一條,讓剛剛畢業的朋友們早點看到哈!
  • 30位管理精英的從業經驗大集結
    如今,他們傾囊相授,分享了他們從業以來的經驗,有的人是專門構建起來系統的方法論,這其中包括了工程師團隊如何打造;銷售模式應該如何設計;融資時應該注意什麼風險;企業文化應該如何孕育;品牌定位應該如何思考等等諸多內容。相信,無論你是創業者,職員,亦或還是在校學生,都能從這些經驗中,收穫頗豐。1. 將坦率做到極致!
  • 無經驗!薪資最高16k!軟體/開發工程師內推!21屆畢業生速進!
    軟體開發工程師C/C++工作職責:熟練掌握C/C++語言、數據結構與算法,具備較強的編程能力。熟悉分布式存儲系統,有相關開發經驗;軟體開發工程師 Java工作職責:熟練掌握Java語言、數據結構與算法,熟悉資料庫編程,具備紮實的編程基本功。優先條件(滿足其一):1.
  • 新芽之穗,或能扛鼎 ——廣州軟體研發部2017年新員工培訓回顧
    8月21日,繼天津培訓學院集中培訓後,「北廣上天」四地進行視頻連線,全體新員工參加2017年軟體開發中心新員工入職大會。蔡總發表迎新致辭,先對總行發展歷史進行簡要回顧,然後對新員工新徵途表示祝賀與希冀。最後,新員工代表的培訓總結結束迎新大會,也標誌著啟航歸來的學子們在軟體開發中心大展宏圖的新起點。
  • 總結經驗的名言名句
    1、沒有經驗,任何新的東西都不能深知。培根  2、沒有學識的經驗比沒有經驗的學識好。h.g.博恩頁  3、一個人應能利用別人的經驗,以彌補個人直接經驗的狹隘性,這是教育的一個必要的組成部分。杜威  4、一個人的早期前面吃鐵,後面防滑。金埴  5、一個人的經驗是要在刻苦中得到的,也只有在歲月的磨鍊中才能夠使它成熟。
  • 如何成為一名優秀軟體工程師
    軟體工程師的職業生涯要歷經以下幾個階段:初級、中級,最後才是高級。這篇文章主要是講如何通過10個步驟助你成為一名高級軟體工程師。
  • 我以99.9%的信心,成功開發了我想要應聘的公司
    我也很清楚這兩年學的米課知識更多的還在理論層面,我需要一家公司能夠提供平臺和實踐應用的機會,這樣才能轉化成實戰經驗。當初也是因為這點放棄另一家公司"盛威集團」的更高offer。說到盛威集團,那時候他們的HR主動打給我說,說他們的總經理看了我的簡歷後,很有興趣,還說特意為了直接面試我,他可以在百忙之中騰出半個小時給我。
  • 敏捷宣言的四個核心價值
    為什麼說工作的軟體高於詳盡的文檔,這敏捷最核心是強調文檔適度(why),查閱各類敏捷書籍想,裡面澄清,敏捷不是說廢棄文檔,不考慮團隊實際行為,是過左的行為。我以更場景化的項目,來舉個例子,裝修公司做裝修的項目,有UI效果圖,有尺寸規格,但不必花費太多精力告訴你零件如何組裝,但如果要考慮喜歡DIY的用戶,宜家家居,會出更細化到操作步驟的分解。
  • 如何深度開發客戶
    可經驗豐富的老業務員們,卻往往有那麼幾個長期客戶,讓新人們羨慕嫉妒恨。當然了,太太只能有一位,情人、小三、紅顏知己、花花草草,自然不算在內。那我們是不是可以這麼理解,凡是從業多年的業務員,都希望有幾個忠實的老客戶,並且多多益善,沒有人會嫌錢多的。可實際工作中,很多人覺得無從下手,客戶詢價了,沒影了;下單了,沒下文了;接觸幾次了,跑了。總是有那麼點貓咪撓癢的感覺,好像一切都不在自己的掌握中,都是客戶說了算,客戶是老大,客戶是上帝。
  • 請回答HR:人資發展4大困境+9個突破口
    HR 2 年了,薪資除了工作滿一年普調漲了一點,之後就再也沒動過,想跳槽也找不到合適的崗位,我到底還要不要接著做HR?」為此,我們研究了今年市場上20多份權威機構報告,通過大數據分析人力資源行業的人才需求,總結了HR的四個方面的「成長焦慮」,並針對性給出9條建議,希望能幫助大家找到突破口~
  • 偷懶比勤奮,更有價值
    不想不知道,一想才發現,這個問題挺有價值的。舉個例子。學日語時,我之所以能發現anki這樣的軟體,就是出於「偷懶」的衝動。如果我是個勤奮的人,定了學日語的flag,那必然會要求自己在壓力山大的工作之餘,每天早起晚睡,犧牲休息時間,憑藉鋼鐵的意志努力學習日語。這樣做的話,我提升的只有自己的自律。但我恰恰是個不想太努力的人。
  • 成為更好軟體工程師的八種方法
    一方面大家都說「我想變得更好」,能夠認識到「更好」的樣子。另外,太多的人想改善,但是沒有什麼實際改變。為此,我們分享八個可立即操作的方針,可以做一個流程圖以便提高你的編程技術。這些智慧是從事軟體開發行為35餘年積累而成,是多少人在工作中積累和總結出來的。就像是踩在巨人的肩膀上一樣。
  • 2018中國十大高薪職業排行榜最有前途的熱門職業
    隨著國際保險巨頭在中國開拓市場以及國內企業的需要,精算師是幾年後保險業最炙手可熱的人才,目前在國外的平均年薪達10萬美元,國內目前月薪也在1萬元以上。4年以後,隨著人們對於保險認識的加強,保險行業的興起必然會需要更多的精算師。海關報關員隨著我國的對外貿易的飛速增加,海關報關員從業人員存在大量人才缺口。
  • 產品開發主管
    公司自成立以來,業務量持續穩定增長,2020年已達到接近10個億人民幣年銷售額。現因公司業務的快速發展,急需一名經驗豐富的產品開發主管加入。負責對市場上的各類寵物產品進行調研,分析其產品優缺點,尋找並挖掘新的需求增長點;負責深入了解用戶核心需求點及用戶痛點,並找到可供產品開發實現的切入點;負責新品標籤審核、內外包裝信息及質量檢驗、產品送檢、打樣測試、市場反饋收集、品質管控等一系列產品開發流程跟進及執行工作;負責協調內外部資源,推動及加快項目進度的進行;定期在公司內部進行相關知識培訓
  • 貴州金三裡農業開發有限公司
    財務部    會計1名任職要求:1.會計相關專業,大專以上學歷;年齡在25-40歲,男女不限;2.3年以上工作經驗;做過成本會計經驗者優先;3.認真細緻,愛崗敬業,吃苦耐勞,有良好的職業操守;4.思維敏捷,接受能力強,能獨立思考,善於總結工作經驗;