三年的工作省思

前言

工作到現在已經三年半了,雖然有許多成長,但也看見自己很多的不足,可以再進步的地方。個人覺得如果要能夠更快速地成長,需要定期總結自己的經驗以及所學習的東西,並且思考未來可以再怎麼做會更好。平常我有做日記的習慣,但是還沒有為自己統整工作上面的心得,這邊除了當作紀錄以外,也是可以提供給跟我差不多狀況的人參考。不過老實說,這些分享並不一定正確,但是至少是此時此刻的我最真實的想法,也歡迎大家多多指教。

經歷

畢業前

我是從研替開始軟體工程師的生涯,以前在大學、研究所時,雖然有寫程式,但是畢竟都還是學生等級的程式,個人是覺得不夠深入與成熟。不過另一方面其實也累積了不少基礎,有許多重要的知識都是那時紮根的,包括Linux的使用、git的使用、Network的概念、Security的概念,這些對後來的自己都有很多幫助。雖然有時會想要是現在的自己回到過去的話,肯定可以學得更快更好、更有效率,畢竟產業和學術上還是有多少落差,但這也都有點後見之明了,而且正是因為曾經經歷過,才會有不同看事情的角度。會覺得過去要是怎樣怎樣現在就會更好,大概是人免不了的通病吧!

第一年

進到職場後,最不習慣的是每件事都要很清楚是在做什麼,過去在學校基本上只要code能work就行了,所以最常做的就是上stack overflow找找,然後copy & paste,不太會去理清背後的原理,或是思考怎麼做才會更有效率。然而在職場上,如果只是剪剪貼貼的話,遲早會出問題的,被同事問回答不出來還是小事,更慘的是自己做完了導致其他的bug出現。另外一點是動作需要很迅速,我記得剛過試用期後就被交付了要porting BSP上的ICMP的功能到FreeRTOS,時間給我3天,結果最後花費的時間還是超過,這跟學校其實差異很大,我在學校光是改一個memory leak的bug就改了2個月(雖然是因為還要兼顧課業)。最後,關於品質的部分,也是那時的我需要克服的坎,我不喜歡做測試,可是當時的主管就很強調要做自我驗證,才不會提供的程式上面有很多顯而易見的問題,給出去的程式也是代表自己的品牌,需要細心驗證才行。

其實整體來說,我在職場上的第一年大概是以調整心態並且適應工作為主,而工作內容大概都是偏向AP層的修改,或是開發些應用程式。最常見的case大概是做客製化的firmware以及處理客戶回報的問題,改的內容不外乎是web上的修改,或是AP層上面的邏輯的問題。不過也不是沒有要寫新feature,包括在JAVA應用程式上用JNI連結到C library、Linux command line tool、帳號管理API等等,或多或少訓練了怎麼設計程式架構。

第二年

第二年開始我已經有能力解決比較困難的問題,那時團隊遇到SDRAM不足的問題,後來我透過分析map檔找到一個沒有必要使用的巨大global variable,克服這個難關。不過老實說,我現在回想起來這個問題也不是太難,只是要對firmware compile過程有比較深一點的認知而已。另外當時遇到了過熱當機的問題,這個老實說是幫助我成長最大的問題,我把NXP的MCU spec讀了好幾次,了解了ARM的exception架構,另外也深入理解FreeRTOS以及lwip等NXP提供的BSP是怎麼與MCU互動的。除此之外,我基於資深同事提出的proprietary protocol架構上做改進,並且設計提供給AP使用的API,其實也理解了設計protocol的原則,包括易用、相容性、功能獨立性等等。

這一年對我來說是技術成長最快的一年,開始練習解決問題需要有系統的思維,除了AP層以外,更加理解軟體與硬體的相依性,BSP的概念等等。那時候我常常都是在ARM的exception handler中加上dump stack的功能,然後反推造成當機的原因。這些經驗對後來看待問題時有很大的幫助,會思考這個OS的運作性質是什麼,怎麼去分配記憶體的,比較能夠有系統觀去解決問題。

第三年

第三年因為要做經驗傳承,開始跟資深同事學習公司既有的proprietary OS,除了AP以外,更重要的是底層kernel的運作,類似UNIX上面STREAM的架構。由於FreeRTOS的架構相對來說比較簡單(有些人甚至認為比較像library),所以proprietary OS也是強化了我對OS的理解,而且多了可以比較的參照物。除此之外,因緣巧合下我開始有了機會可以當project leader,雖然團隊加上我只有3個人,不過也算是個不錯的經驗。我主要負責的是與PM、測試溝通,然後分配feature & bug給團隊,並且確保merge的code沒有任何問題。同時間,我也開始和其他同事合作導入CI/CD、code review的概念,剛好就在我的project上進行實驗。

這個時間點對我來說除了技術以外,開始有了與人相關的任務,不論是領導還是溝通。另外因為自己有比較多一點的權力,所以也嘗試導入自己所喜歡的文化,如CI/CD。比較有趣的是,我發現以前的同學也差不多在這個時間擔任leader的角色,也許大家走的路都差不多吧!

現在

延續前一年,我開始擔任既有產品的maintain窗口,學習分配工作給團隊的其他人,並且思考要怎麼進行有效率的溝通,不論是團隊內還團隊外。技術方面則是開始接觸eCos這個系統,雖然外界已經沒人在用了,但是這個產品仍然需要有人maintain。發現挺有趣的是我差不多一年接觸一種OS,也加深了以前學OS的一些概念,例如synchronization、scheduler等等。

其實到了現在我覺得已經進入了一個坎,技術開始進步緩慢,而且因為既有產品線眾多,有許多maintain的effort,沒有心力去學新技術。目前,不得不好好反思自己的職涯規劃,以往我都是認為只要有學習成長就可以了,沒有想太多自己未來的走向,包括什麼是自己的強項,我接下來的時間要學什麼,可以成長多少等等。如果再宏觀一點,從人生角度來說,我規劃學習這些技術對工作有什麼幫助?在我的生命中是什麼樣的地位?我的人生究竟是想要什麼?成就感嗎?還是只要賺夠多錢就行了?這些都是以前有想過,但是沒有仔細思量的,現在因爲工作上面遇到了些障礙,所以會開始思考什麼才是自己想要的。

雖然我是因為感覺沒有成長所以思考是不是要改變跑道,但是另一方面來說,我覺得也是因為這個契機才開始會反省工作在自己人生中的意義是什麼,這倒也不是什麼壞事。人本來就應該要很清楚自己想要什麼,留在某個地方就是要承擔自己失去的其他機會成本,離開某個地方就是要能捨棄當前環境的舒適以及穩定,沒有好或壞,就只是要自己承擔相對應的責任。

總結

這職場三年多下來,其實我也學習了很多事情,比起技術而言,我覺得最重要的是觀念的改變。從一個人的觀念和面對事情的態度,大概就可以推估他的未來發展。技術要學其實是可以很快,但是個人特質是很難短時間內改變,因此我覺得這是影響個人成就非常深遠的關鍵。以下就我的觀點分享認為重要的事情。

  1. 發問前一定要再三思考
    • 在問別人問題的時候,要先思考想從對方那邊得到什麼樣的答案。簡單來說就是不要無腦發問,同事都是很忙的,所以相對應來說可以問問題的次數是有限制。因此每次發問都先思考:我問的問題是否其實查一查資料或做做實驗就可以解決?我想問的問題到底是什麼?有時候整理一下自己的想法後,就赫然發現其實問題已經得到了解答,根本不需要問人,這也是常聽到的Rubber Duck Debugging
    • 一般來說我們遇到不確定的問題都會去請教主管,看要怎麼做會比較好,這個做法在剛進公司時是OK的,畢竟對工作內容還不熟,但是隨著自己慢慢熟悉,要做的應該是自己能夠做主並且決策。以公司的角度來說,多請人就是要減少大家的工作量,如果事事都要去問人的話,那就不需要多請人了。當然有些問題可能是一定要主管做決策的,那可以提出自己的想法以及建議的解決方式,主管只要確認我們的解法沒有什麼大問題就可以了。
  2. 定期反省,找出更有效率的做法
    • 可以的話,建議每天做日記,思考今天的工作內容有什麼可以改進之處。不過老實說這樣確實是蠻累的,而且會變成無腦的慣性,所以也可以改成每週一次。一個人在工作上的表現,大概就是解決問題的能力和效率,如果這個能力能不斷提升,能創造的價值就越高。
    • 舉例來說,在我的公司就是要處理很多文件流程,每次要跑大家就都要到處問人,後來我受不了了,乾脆自己整理一份跑流程的SOP,每次跑我就參考SOP執行,如果有錯再修改SOP,大大減少我在工作上的煩躁感。而且後來有新人進來要跑流程時,我也可以請他們看SOP,而不需要手把手教學,減少時間的浪費。
  3. 用目的論思考,了解自己做的事情是為了什麼,要解決什麼問題
    • 我發現有時候自己做的事情和別人對我的期待其實是有落差,我認為重要的東西,別人卻覺得那個不是重點。因此面對任何任務,都要確定做這件事的目的是什麼,例如是要給客戶滿意的解釋,還是要百分之百肯定問題的根因,然後是不是值得投入相對應的資源。
    • 常常做事情都會不小心過度鑽研在細節上面,大家各自提出自己的意見,而無法做出正確的決策,這時候最好都是要回到最初的問題:我們到底是要解決什麼,怎麼決策才能符合我們最一開始的目的。不會有完美的解答,但是只要能達到設定的目標,那就是可以接受的答案。
  4. 溝通的時候,站在對方的立場思考
    • 工作上基本上一定會有cowork的機會,而很多的爭論幾乎都是來自於溝通不夠完全。回應他人的問題時,可以站在他的角度思考,他想得到什麼答案,我能提供什麼答案,怎麼在中間取得平衡,不要變成事情都是某一方去承擔,另一方面也是提高溝通效率,不會信件來回很多次都得不到共識。
    • 有時候不要太依賴信件,有些情況直接面對面溝通會來得有效率,且也不會太過生硬,讓人有距離感,有時候都是因為雙方文字上彼此誤會而吵起來。
  5. 要定期盤點自己的能力
    • 我會強烈建議要隨時maintain一份A4的履歷,並不是說要騎驢找馬,而是為了把自己重點且精華的能力精簡成一份履歷,其實也是認識自我的一種方式。整理完後會發現原來自己的強項是什麼、還欠缺什麼,工作的時候就比較不會得過且過,而是會用宏觀的視野思考為什麼要做,還能怎麼做會更好,因為這些都將變成未來與人談判的籌碼。當然如果有好的機會的話,已經有一份履歷在手,就可以隨時把握。
  6. 負起責任
    • 負起責任有幾個方面,首先就是對自己做的事情,任務交到自己的手上,那就是要把它做好,如果發現有任何問題就是要隨時反應,不要到了最後一刻才說。另外這也隱含了一點:我不是機器人,別人說什麼就做什麼,而是要有能力自己判斷、決策並且承擔最後的結果。能做到這點,周圍的人就可以放心與自己合作了。
    • 另外一方面是對自己負責,永遠要記得不管做什麼決定,承擔結果的是自己。不管是想要加班做事情、針對某個問題作深入鑽研、隱藏遇到的問題裝做表面一片和諧,其實都無妨,只要能夠接受最終結果就好。既然都已經是成年人了,就不要想著拿盡所有好處而且可以逃避責任。以職業生涯來說,選擇自己的去留也是同樣的道理,如果放棄了現在的位置,那就別未來才後悔失去了許多福利,如果選擇留著,那也別再抱怨沒有新的成長,一切都是在於自己的選擇。

不過老實說,上面的分享也只適用於想不斷提升自己的情況,但是人生是有很多面向的,我也曾經看過有人工作只出五分力,剩下的時間都是專注在自己的生活品質上面。這並沒有什麼不好,甚至如果以長遠來看,他說不定活得還比認真努力打拼的人更快樂。反正,最重要的還是要記得人生是自己的,做什麼決定都沒關係,只要肯承擔後果就好