寫程式碼是一回事,學習成為一名軟體工程師是另一回事 - thehosk

banq發表於2022-04-25

學校是一回事;教育是另一回事  — Austin Kleon

只有當你透過考試並定期駕駛時,你才能真正學會駕駛汽車。作為一個熟練的司機,不僅僅是能夠駕駛汽車而不撞車,知道理論知識。需要能夠駕馭你在道路上遇到的所有情況和場景,並處理道路上所有瘋狂的瘋子。
作為一名軟體開發人員,創造軟體就像駕駛汽車一樣,但要比汽車複雜一千倍,而且有兩倍的瘋子。

軟體是開發者所創造的,技能、經驗和知識是開發者所得到的。軟體開發技能是你建立高質量軟體和交付軟體專案的方式。
做好開發者的工作,創造軟體是一回事,但要在職業生涯中取得進展,你需要學習軟體開發的基礎知識。

開發人員的教育不僅僅是寫程式碼。你寫的程式碼,技術技能並不是職業生涯的堅實基礎,因為在5/10年的時間裡,你會需要不同的技術技能。
你創造了專案所需的軟體,因為這是客戶和你工作的公司所支付的東西。
  1. 一個開發人員的價值是基於他們的技能、知識和經驗;
  2. 一個開發人員還需要確保他們正在學習、改進併成為一個更好的軟體開發人員。

理想情況下,你會同時做這兩件事,但這並不總是可能的。
當你覺得作為一個開發者太舒服時,是時候考慮轉向新的東西了。

軟體開發是一項你永遠無法掌握的技能
軟體開發人員始終是軟體開發的學生,每當你認為自己知道自己在做什麼時,它就會打你的臉。
好的開發者是謙虛的,因為軟體開發用令人尷尬的錯誤粉碎了過度自信。
你無法避免錯誤、問題和災難。
因此,你需要謙虛地承認錯誤,需要一個團隊來幫助你發現和解決這些問題。

當你開始做一名開發人員時,你專注於建立程式碼以滿足需求。
我曾經認為,作為一個開發人員,只是寫程式碼。
軟體開發還有很多其他方面,從設計、架構、單元測試到DevOps和ALM;收集需求,明確假設。
有許多最佳實踐,如SOLID原則,DRY(不要重複自己),KISS和其他。
最佳實踐和基本技能有長期的好處。這使得初級開發人員很難理解,因為沒有短期的好處。

命名好的程式碼,設計成容易測試的,不是第一版程式碼。
這些好程式碼所做的不僅僅能工作起作用,它還是為了便於閱讀、理解和修改而建立的。

我曾在遺留程式碼中工作,其中有一個2000行的方法。這個方法就像一個狀態機,控制著案例的狀態。這是一個改變的噩夢,因為如果你改變了一行,它可能會破壞下面的任何程式碼。

一個改變可能會影響到100多行的程式碼,而且幾乎不可能進行測試。
一個簡單的程式碼修改可能需要一個星期的時間來完成和測試。

經驗是有價值的,因為透過與壞的程式碼打交道並看到它所造成的問題,它可以激勵你在未來不犯這些錯誤。

堅實的基礎
每個軟體專案都為獨特的要求創造獨特的軟體。它建立在軟體工程的基礎上。優質的開發是透過良好的流程、最佳實踐、DevOps、程式碼審查完成的。
你需要確保你的最佳實踐沒有過時,並對更新它們持開放態度。會有新的工具、軟體和技術,需要你更新最佳實踐。
首席開發人員需要對軟體開發過程的每個方面都有一個願景。你需要謙虛,對更新你的開發流程持開放態度。

基本的軟體工程技能
技術在變,但軟體開發不變
技術隨著新的語言、服務、工具和最佳實踐而發展。
開發人員需要掌握一些基本的軟體工程技能,這些技能無論在什麼技術上都是有用的。

  • 命名(是簡單和可讀程式碼的關鍵)
  • 設計程式碼(設計簡單,不復雜)
  • 設計模式
  • 單元測試
  • DevOps
  • 軟技能
  • 文件
  • 開發的最佳實踐
  • 敏捷開發
  • 錯誤修復

這些核心技能是軟體開發的基礎。如果你不知道好的程式碼是什麼樣子的,也不明白為什麼它是好的,你就無法寫出好的程式碼。反過來說,你需要知道壞的程式碼是什麼樣子的,這樣你就能負擔得起,並理解為什麼這個程式碼是壞的。
如果沒有人指導,或者沒有意識到這些程式碼會造成未來的問題,初級開發人員就不會停止編寫低質量的程式碼。壞的程式碼現在可以工作,但在未來會產生問題。壞的程式碼就像錯誤。如果你不承認自己犯了錯誤,你就無法避免錯誤的發生。
牛仔開發人員不瞭解軟體開發的最佳實踐或好處。如果你不理解一種方法的好處,你就不會使用它。

經驗並不都是有價值的
使用你已經擁有的技能和知識從事軟體專案,就像在跑步機上跑步。你付出了很多努力,但卻沒有任何進展。
在你已經掌握的技能上獲得的經驗價值有限,因為它在你的簡歷上為該技能增加了更多時間。
有價值的經驗是在新鮮的環境中學習新的知識和技能,你可以把它帶到未來的專案中。

要有好奇心--儘可能多地學習
優秀的開發人員要學會理解,而不僅僅是創造軟體。理解可以幫助你在未來建立軟體,避免問題,並對軟體開發的工作方式有更好的理解。
作為一個軟體開發者,你可以對自己和你的教育做最好的投資。在軟體開發之外的學習將使你更好地進行軟體開發,因為很多軟體開發是與人一起解決問題的。

"每一天都要努力成為比你醒來時更有智慧的人。忠實地履行你的職責,並做好。你會有系統地取得進步,但不一定是快速突飛猛進。然而,你要透過為快速衝刺做準備來培養紀律性。日復一日,一寸一寸地努力。在一天結束時--如果你活得足夠長--大多數人都會得到他們應得的東西。" 查理-芒格

作為一個軟體開發人員,你要每天少吸一點,減少錯誤,用壞程式碼換取好程式碼。作為一個軟體開發人員,每天都要有進步,那麼隨著你的技能、知識和經驗的增長,生活會變得更容易。

軟技能
軟體開發是一項團隊運動,所以你越能有效地與其他人類溝通和工作,就越好。
在建立軟體時,所有的大問題都是由人引起的,並由人解決。
有效的溝通、說服和協作是值得投資的核心技能。

我曾經在一個我是Scrum主管的團隊中展示過演示和進展。我的scrum團隊工作出色,進展順利,但客戶對這個團隊或我並不放心。
我從一位經理那裡得到了一些反饋,他解釋說我用錯誤和負面資訊來引導,而把正面的東西留到最後。這就像用擴音器講壞訊息,低聲講好訊息。這給人的感覺是我和團隊沒有做好工作。

感知就是現實。

從那時起,我在演講、溝通方面做了很多工作。你沒有很長的時間來溝通,你需要讓它發揮作用。
所有專案、晉升和其他重要決定都是由人作出的。你需要建立關係並影響他們。

Reddit網友評論
1. 有趣的是,這個事實就是為什麼即使是最好的學生程式設計師在進入專業環境之前也很難掌握對框架和工具的需求。

我記得我在學校裡試圖學習Spring,以便在實習前對它有所瞭解。我可以很好地跟著教程走,而且我很喜歡那些讓rest apis更容易的web功能,但是整個依賴注入/應用上下文的事情對於一個剛剛自己建立專案的人來說並沒有什麼意義。

直到我開始看到生產級的Spring Boot微服務,標準框架的好處才變得明顯。

Git也是如此。我在學校裡用過它,並認為自己瞭解它,但現在我對版本管理的理解更加深刻了。


2. 我聽到的最好的區別是,"軟體工程是隨著時間的推移而進行的程式設計"。當你第一次實現某些功能時,任何實現都可以。然而,當你隨著時間的推移維護和擴充套件程式時,更合適的實現方式將促進你的變化和維護。這就是好的工程開始顯現的地方。


3. 我維護的程式碼越多,我就越不相信這一點,或者至少是對它的通常理解。
通常情況下,這被理解為。

  • 靈活性。
  • 適用於未來。
  • 可配置性。

而每次我看到只做一件事的啞巴程式碼時,維護、擴充套件甚至重寫它都比擴充套件靈活的、面向未來的可配置程式碼容易。
正因為如此,我傾向於認為交流和可讀性要重要得多得多。
一般來說,這是因為人們把程式碼抽象得太遠,最後實現得很差。所以你最終得到了一個超級低階的介面,如果你改變它,就會破壞整個應用程式,所以你不得不在抽象中埋下一個隨機的if()變化。
  • 可讀性
  • 可刪減性

其他都是這些的下游。

Readability is king. 可讀性為王


 

相關文章