# 成為軟體工程師,然後呢? ## 前言 **整篇會比較像是一個雜談,反正就想到甚麼寫甚麼。** 成為軟體工程師進到公司也將近四年了,部門在前三年間走的人遠遠大於來的人,但好消息是這半年來,部門加入了好多優秀的新血,但在跟他們聊天的過程中赫然發現,我認為如此優秀的他們,對於這份工作還是充滿焦慮跟不安。 於是身為差點死在沙灘上的前浪,我想利用年前最後一點自己的時間,用我自身有點烙賽的經驗,分享給也處於這種狀態的工程師,也順便梳理一下自身這四年的成長,再展望一下未來的自己會成為怎樣的工程師吧! ## 背景 快速回顧自己的背景好了,私立大學財金系畢業後先在 FMCG 工作一年後回家工作,然後中間考上四中資管所,等報到時間到後準時辭職當菸酒生。 研究所時期的教授是在醫療資訊大數據的專家,這段經歷也幫助我拿到一家醫療資訊新創公司的實習生的缺,中間就邊寫論文邊實習,碩論口試結束後沒多久開始面工作,運氣好的是當時是大徵才時期,願意把我撈上岸的公司很多,最終就選了一家面試過程很舒服的系統廠擔任全端軟體工程師,待到至今將近四年。 ## Entry / Junior 工程師可能會遇到的問題 ### 一、*[冒牌者症候群](https://womany.net/read/article/13322)* 想先來談談這個困擾我最深的難題 - 冒牌者症候群,關於他的定義可以參考連結,看完我的背景,應該不難想像我會有這狀況,非本科跨考仔一開始擔任軟體工程師,我的冒牌者症候群真的超級嚴重,若你跟我一樣,一直覺得自己在工作上的成就,都是運氣使然,那你可能可以試試這幾種方式緩解你的焦慮: 1. #### 找到你的擅長的地方 > 在你擅長的地方,拿回你失去的分數。 ##### 工程師這個職業不僅僅是寫程式碼,還有許多面向可以討論,比如溝通協作、問題解決能力等等。 ##### 而我在初期自己擅長可能是溝通能力的部分,初期寫不出高品質的程式碼,我就在溝通需求,問題釐清上拿回分數,起碼讓跟我合作的人感覺自己仍是有專業的地方,所以找到你擅長的地方,並專注於發揮它們時,你會發現自己在團隊中的定位越來越清晰,對自己的信心也會逐漸建立起來。 2. #### 接受自己可能沒那麼好 ##### 剛入職難免會期待自己能在所有事情上表現優秀,但試著接受「自己可能沒那麼好」這個事實,應該是我覺得最重要的一步,這跟「我就爛」的心態有所不同,而是當我們能坦然面對自己的限制,不再過度苛責自己時,反而更容易擁抱成長的機會。 3. #### 別人可能也沒那麼好 ##### 剛入職時,每天在跑 Scrum 總會很驚訝別人做事的方式,覺得我可能到不了那個高度,但事實是,大家都有自己的弱點和不完美,只是他們的問題可能不像你的那麼明顯,或者他們更擅長隱藏自己的不安與挫敗。 ##### 我也想推薦一本對我意義很重大的書:無*瑕的程式碼 番外篇-專業程式設計師的生存之道 (The Clean Coder: A Code of Conduct for Professional Programmers)*,你會發現許多優秀的工程師也會在一些小地方很烙賽,但還是無損他們的偉大。 --- ### 二、*到底該怎麼問問題* > 他以為他可以,他想問得得體 這句來自蛋堡「關於小熊」的一段歌詞應該講到很多 Junior 的心聲吧,遇到一個技術問題或是規格不明確的時候,往往需要求助於同事,但又害怕自己的問題是不是太過簡單,會讓人覺得自己怎麼拿到這份工作的,所以後來自己稍微想了一下甚麼是「**該問的問題**」,而甚麼又是「**不該問的問題**」。 #### **該問的問題** 1. #### 影響團隊或專案進度的問題 影響團隊進度,且已嘗試基礎排查。 例: > 我在部署新功能時,發現伺服器突然無法連接到資料庫,導致整個服務中斷。我已經檢查了連線設定和防火牆規則,但還是找不到問題。 2. #### 團隊或公司內部規範問題 例: > 我們團隊在Git流程中,是應該用rebase還是merge來整合分支?文件裡提到兩種方式都可能用,但不確定具體情境。 #### **不該問的問題** 1. #### 未嘗試Debug的模糊問題 例: > 我的程式碼跑不動,可以幫我看嗎? :::info 這應該是最致命的問法,直接把問題轉嫁給下一個人而已,在問此類問題盡量提供錯誤訊息、上下文或自己嘗試的過程。 ::: 2. #### 明顯可自己驗證的問題 這類型的發問通常會發生在 Junior 明明自己可找到方法驗證,但懶得自己動手做一次,想要拿其他同事的建議或經驗當背書,應該避免發生這種情況。 例: > 如果我修改這個參數,會發生什麼事? ## 我目前是怎樣的工程師? 說實在,非本科跨考仔一開始擔任軟體工程師,我的[冒牌者症候群](https://womany.net/read/article/13322)真的超級嚴重,幸運的是,當時 TL 跟其他同事給我很大幫助,才漸漸走出那種恐慌感,在擔任 4 年的軟體工程師,自己的技能樹大概點成像這樣: ### 技能樹 ![image](https://hackmd.io/_uploads/rk3Pywfukg.png) 目前的自己可能更接近Mid-Level SE,以下列出我認為 Juinor 跟 Mid-Level 的差異,基本上最大的差異就是對於手上的技術善用的程度,跟獨立完成作業的程度。 #### **1. 技能對比** | **能力範疇** | **Junior 工程師** | **Mid-Level 工程師** | |---------------------------|-------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------| | **Java 基礎** | 理解核心 Java(如 OOP、集合、異常處理)。 | 熟練掌握 Java,並對 Java 8+ 特性(如 Lambda、Streams)運用自如,能優成程式碼性能。 | | **框架和工具** | 了解基本框架(如 Spring Boot),能跟隨指導完成簡單的 REST API。 | 深入掌握 Spring Boot、Hibernate,能獨立設計和實現複雜功能。 | | **資料庫** | 能執行基本的 SQL 查詢,對 RDBMS 有基本理解(如 MySQL)。 | 熟悉 SQL 調教、索引、事務。 | | **問題解決** | 需要較多指導,能解決簡單的 bug,但面對未知問題可能需要幫助。 | 能獨立解決中等複雜度的問題,熟悉調試和性能分析工具,對程式碼有更深的理解。 | | **架構理解** | 對整體系統架構的理解有限,僅專注於所負責的功能。 | 理解系統的設計原則,能參與架構設計,並在必要時提出優化建議。 | | **工具熟練度** | 能熟練使用基本的 IDE(如 IntelliJ IDEA)和版本控制工具(如 Git)。 | 對工具有深入了解,能配置 CI/CD 流程,熟悉 Docker 和 Kubernetes 等部署工具。 | #### **2. 責任與角色期望** | **範疇** | **Junior 工程師** | **Mid-Level 工程師** | |---------------------------|-------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------| | **專案參與** | 在指導下完成分配的任務。 | 獨立負責開發,並協助指導 Junior。 | | **設計與規劃** | 很少參與設計與需求分析,主要執行分配的任務。 | 參與需求分析,對系統設計提供建議,並能計劃解決方案的細節。 | | **Code Review** | 主要是接受 Code Review ,學習改善程式碼的方式。 | 主動參與並進行 Code Review ,並提供反饋以幫助 Junior 成長。 | | **問題解決與支持** | 需要頻繁請教同事解決問題,獨立處理問題的能力有限。 | 能獨立解決問題,並幫助 Junior 工程師解決技術障礙。 | | **軟實力** | 學習團隊溝通與合作,努力融入項目流程。| 具備良好的溝通能力,能主動分享知識。 ## 未來的路在哪? 整體來說,現在的自己與四年前相比,在專案開始或系統開發時,開圖能力已經大幅提高了,當 Team 上的 Junior 遇到技術困難時,可以給出適當的建議,但這都屬於比較像是經驗是累積後的結果,若要從 Mid-Level 到 Senior 的話,可能還必須有更多的成長,所以這邊也列一下自己認為若要往下一階段前進的話,自己可能還有哪些地方可以持續成長。 **1. 系統設計與架構能力** * 精進方向: * 學習分散式系統設計(如微服務、事件驅動架構)。 * 練習設計大型系統(uber or X)。 * 閱讀經典書籍,如《Designing Data-Intensive Applications》。 **2. 專案品質與完整度** * 精進方向: * 在開發過程中,注重需求的理解與實作的完整性,避免功能缺失或半成品交付。 * 確保程式碼的可讀性、可維護性,並遵循最佳實踐(如 Clean Code、SOLID 原則)。 * 導入自動化測試(單元測試、整合測試)與 CI/CD 流程,確保每次交付的品質穩定。 * 在專案結束後,進行回顧(Retrospective),分析哪些地方可以改進,以提升未來專案的完整度與品質。 **3. 探索外部職缺與挑戰** * 精進方向: * 定期更新 LinkedIn 和履歷,並設定職缺通知。 * 參加技術面試,了解自己的市場價值。
{"title":"成為軟體工程師,然後呢?","contributors":"[{\"id\":\"5ab386fa-9b07-4b0c-a740-d1ef5cf00a9a\",\"add\":7312,\"del\":1094}]","description":"成為軟體工程師也將近四年了,這四年歷經每次的年報、績效訪談,好像都是在回顧工作上的表現,得到的建議跟回饋,很少真的審視自己,在身為軟體工程師,自己目前擁有甚麼,"}
Expand menu