2020回顧
也許也包含一點2019的事情。
2020對我來說算是進入社會的前哨戰,以前我總是專注在做自己喜歡做的事情(寫程式、做東西、打球),但是碩班之後即將進入社會,要如何轉換也是我現在面對的課題。 如何繼續做自己喜歡而且想做的事情?是否因此忽略很多其他的事情?如果人生之後不寫程式會發生什麼事情?人生是否沒有這麼單純?
變化
還記得去年(2019)我因為看到一部很喜歡的電影而無法自拔,在校園散步時,早晨熹微的光線穿透樹林,微風帶著早上的濕氣,對於天上的藍天白雲,我腦中有大量無法計數形容詞來擬合天空的藍,描訴雲的流轉。那時是我第一次開始留心於日常的景物、光線的變化。日常的停車塔、斑駁的路邊腳踏車、飽滿的光線,那是我第一次開始重新認識這世界。過去我總是在虛擬世界,拼命的寫code,讓虛擬世界驅動真實。時常想要透過寫程式、認真向上、來做出一些有趣的事情,不一定要對世界帶起多大的波瀾,但至少也要讓我自我滿足。但是2020世界開始不是這麼的單純,疫情貫串了整年,還記得農曆年完3月開始,除了台灣以外的世界國家開始意識到COVID-19嚴重性,我睡前看的bloomberg Live每天都是看道瓊創下歷史跌點;一生不會遇到的熔斷,幾周內遇到四次。美國脫口秀不搞笑,開始講起認真嚴肅的話題,底下沒有觀眾沒有罐頭笑聲,只有主持人沈重的說些事情。再來就是worldometers.info/coronavirus網站上那不斷突破天際的確診人數,沒有高原期,你以為高原期後面還有一波波的新高峰。
十分慶幸台灣度過年初的危機,在大眾的努力成為羨煞世界的平行時空。成為全世界少有的仍正常上班上學的地區。世界並不會永遠向過去幾年一樣安穩如常,世界一直再改變,當我專注於眼前的學術研究時,世界一反過往全球化趨勢,開始新的反全球化現象,在家工作忽然變主流,數位化快速發生(Who lead the digital transformation if your company? meme)。在學校這幾年的保護圈中我過去幾年埋首追求技術,然而當出社會近在眼前,世界又以疫情下馬威,很多事情似乎是忽略了。當我扣掉學科程式這些東西我還剩下什麼,我是否有足夠的soft skill足以面對未來,是否除了工作之類的事外還剩下什麼?
順序
健康、工作、金錢、家庭、夢想… 你會如何排序
這是一個常見的面試問題,直到今年面試過後被問到我才被點醒,這些目標的優先度不是齊頭的,人的能力有限,這些目標必定會發生互相衝突的情境,當遇到這個情形必須有所取捨,這些事物在心中終究是需要排序。
回想過去幾年大學生涯,我因為沒有排好目標的優先順序,而耽誤了很多目標,做事情的效率並沒有很高,而且還搞到失去了一些重要的事情。經過去年的健康波折,沉潛幾個月後,今年我重新衝刺,然而衝刺並非指完全投入學科技術上,我對於人生的一些優先順序有了調整,不在只是當自己年輕每天睡前還在拼命寫程式,正確的休息規劃比盲目的投入更重要。另外過去的假日我也都窩在宿舍用電腦,現在我更喜歡出去走走,不管是了解風城還是山林。過去寫程式、了解電腦是我的興趣,未來更是我的職業,但扣除這些事物我還剩什麼,當我投入了大多數的時間精力進入,那我是否忽略很多重要的事情?這幾個問題是我過去一年認真思考的。此外,今年除了這些事情我還面對了其他關於人的事情,這些事情算是對我反思自己的不足。
研究
今年也是我開始專注於碩士研究的一年,修課結束後我開始專注於爬梳當前RISC-V Core的一些實做與技術,同時透過去年(2019)入碩班開始前就先預先讀過的ISA Spec和2019年底開始的OOO Core細部實現的書目,我算是先建下了一個基礎,但是比起Computer Architecture蓬勃發展的60、70年以來我所擁有的知識僅僅是輕薄的一頁。過往計架課本涵蓋內容可能是20年前已經十分成熟的技術與概念,當前商用CPU隱藏更多近代微架構的演進,更多Designer的巧思與取捨。Physical Register File (rename register)放在ROB還是設計成merged register file?Reservation station設計還是Issue queue設計? Scheduler的演算法?實做的微架構對延遲的影響? 這些都還只是淺的部份,更不用說memory hierarchy、Memory model、exception handle之類的細節。讀碩班使人謙遜,當你看著這看以看不完的人類研究結晶,很快樂但也會反思自己的不足,也會很希望有更多人可以一起在這領域拼鬥,可惜這領域目前在台灣不是很紅,對比國外的長期耕耘,我能做的只有努力追趕,同時留心細節,每個設計都是trade off,都是經過大量分析的結果。現在的我只是在霧中看著這領域的輪廓。對比一些開源專案以及學界研究,我覺得我目前還是有不過我也慶幸自己能接觸這個有趣的領域。
雖然這是一個有歷史的領域,但是現在在RISC-V和開源硬體的浪潮下,愈來愈多軟體界的新血進入,並帶著一些軟體的開發觀念,如Agile Hardware Development等,並且與開源軟體常用的流程如CI整合,並有很多熱血的開發者與學者提供一些開源的驗證方案,這些風潮稍微打破了由SCM三大家近乎壟斷的方案提供局面,讓很多埋藏的技術浮上檯面。學習與探索當今開源界的硬體開發驗證方法也是我這一年收穫很多的部份,看了許多開源CPU專案後我也因此接觸了Verilator、cocotb等有趣的專案,同時利用這些工具打造屬於我自己的驗證平台,我第一次嚐試github的CI flow,包括Travis CI、github Actions等,導入些軟體開發流程進入硬體開發flow,並推廣進入實驗室的流程中。我很慶幸我可以實做與理論一起研究,雖然在分析部份可能仍有不足,但這兩個面向都是撐起世界的兩隻腳。
面試
面試也算是初體驗,以前雖然有實習過,但沒有經過很嚴謹的面試。今年為了找研替,開始寫履歷,投履歷。寫履歷這件事也不是第一次做,當初大學申請入學、碩士推甄就做過了,做履歷除了呈現自己更像是重新回顧過往所作所為。而這次更不一樣,這次會有人對你的履歷提出問題、希望更了解你做的事情。我按照前人的經驗,除了做CV也做了投影片講述自己。這時就很高興過去喜歡修些要做project的課程,因為有更多的素材可以來呈現。
10月底開始了我的馬拉松面試,先是第一家公司連續兩天9場面試,一個接續一個,很久沒有短時間內說這麼多話了,而且對方還會對你的內容提出問題,有時也會有點緊繃,一兩場過後差點累死,不過來駕輕就熟。而且面試到後來也可以對該部門屬性從言談中了解,有些需要一直對客戶的部門,面試官的言語表達反應就會十分順暢。對方是否對你有興趣也可以很快看出來,從問的問題和更深入發掘的程度就可以知道。然後面試對我來說最難的並不是回答問題而是問問題,面試是一個尋找未來合作夥伴的過程,也是一個讓雙方了解該如何合作的過程,什麼方式可以提高受面試者的工作效率,什麼方式可以提昇問題的反饋,這些都很重要,不過我也是經歷數天面試後才了解到,工作時是否需要與客戶溝通(佔工作時間多久),是否需要on call,是否要派駐客戶support,是否有加班peak time,是否要趕tape out deadline,面試前我對於這些問題連輪廓都沒有。經過多個面試主管開始介紹後我才明白這些事情的重要性。
另外一家公司的馬拉松面試是三天7場,一大早騎過頭前溪去考程式上機,太久沒練寫題目直接暴開,沒想到後面的韌體、演算法缺居然沒暴開,還有難得被考了些白板題(樹走訪、鍊結串列衍生題)。這一波面試的主管有些底下管轄的人數很多,有些都破百到近千人,面對大team主管和小team主管,雙方有興趣的東西就有些不同,例如:大team主管比較在意的是你的潛力與soft skill,因為他們本身就會在文件審查和你的自我介紹中了解你的實力,而對於他們工作所需的技能,因為大team主管不太能在半年知道你實際隔年會被分發到哪個單位,因此沒辦法問到十分細節部份,因此可塑性、學習力、解決問題的能力就是他們很看重的;而小team主管因為會知道你之後會被派去做什麼,因此可以在面試中針對比較細節且與他們工作內容高度相關的部份做詢問。此外,面試完後才了解到主管會提到的東西有些時候是因為那是他們最常面對的事情,也因此他們才會特別提到。這波面試也被問到一些很深入的問題,例如:提到之前trace過Linux KPTI的source code和原理,主管就問說有什麼方法可以避免KPTI的overhead(ASID/PCID),還有當ASID/PCID用完時該怎麼辦(ASID/PCID reuse或是TLB AID reuse),雖然衍生問題以前沒想過,不過其實想一想是想得出解法的。
這兩波面試下來看了十多個部門,兩家公司,至少16個部門,內容涵蓋RTL Design、Firmware、drivers、BSP、Kernel和上層演算法,十分龐雜,幾乎是快要涵蓋"Full Stack",這一切都是當初線上填履歷勾太多可以的單位種下的後果,面的很累,但是也藉機接觸到很多不同的領域,同時累積一點業界的資訊。
抉擇
雖然CPU領域是我目前研究的領域,但是否要去當SWE,跟上大CS時代潮流,刷題,甚至出國?我想我目前很喜歡這麼領域,如果就這樣去搞純軟我可能會失去繼續專精於這領域的機會。
能做自己想做的事情當工作是很幸福的
我想即使這條路可能不像當前資工風潮的康莊大道,但我想趁著這波開源硬體的崛起,後X86時代、後摩爾定律時代的到來,雖然CPU是可有歷史的領域,我想未來仍有許多可能。從高中以來我一直規劃我自己的學習路線是從軟體層開始、Linux、到OS往下探索,從microcontroller為另一條路線往上匯合,雖然最後兩者並不是很準確的交錯,但我算是把軟體到硬體之間的元件都走過一遍,雖然不太熟,但對整個big picture有更為熟悉的理解,如今我有機會往microcontroller/microprocessor內部探索,並自行搭建這個世界,我想是十分有挑戰性,也十分有趣的。高中時看的MCU datasheet和diagram,如今有機會成為制定者、實作者,這都是驅使我進入這領域的動力。我想選擇CPU領域、軟軔領域或是純軟領域,對我來說可能包含以下一些考量:
- 成長性
- CPU領域成熟是否代表無法繼續前進? (我目前的答案是NO)
- CPU領域是否仍可往軟體層走? (我覺得軟體是一個透過ISA與CPU溝通的上層,往軟體層走絕對是OK,加上我有軟體背景,對於CPU領域其實也是一個很好的基礎,可以對ISA修改,統計分析,驗證流程做出貢獻)
- CPU這領域是否已經被少數幾家巨頭寡佔? (我想目前高階部份是如此,但是在製程未來難以突破,需要透過微架構改進與先進封裝之類的科技替摩爾定律續命的未來,CPU與計算機架構會再次變成兵家必爭之地,加上AI、邊緣運算等產業出現,CPU與計算機架構會有更多可能:A New Golden Age for Computer Architecture )
- 有趣性
- 寫verilog/SystemVerilog是否有趣? (大二的被DLAB折磨的我答案肯定是NO,但是現在我覺得一些工具的演進,和對於合成出來的電路理解,讓寫HDL變得有很多想法,當然以語言特性來說HDL是有點不好寫,但是考量後端我覺得現在寫起來蠻有趣的)
- 寫純軟C/C++/python…?(對我來說寫純軟的code是十分有趣的,而且現在作法更多元,混搭語言、演算法、Design Pattern,花樣很多,但是目前純軟可能寫的東西可能是網頁、軟體工具之類的,目前我還沒也遇到會大大激起我興趣的目標,再來寫CPU/RTL不代表只會摸到HDL,尤其是CPU領域,一定有很多場景需要C/C++/python等語言幫助)
- 計算機架構很有趣
- $
- 其實錢的部份兩者目前的差異在台灣並不是太大,當然國外很難說,不過到了這個程度,錢對我做選擇的權重很小
既然有了這個延續我過去累積的機會,我想這個選擇應該是正確的。
生活
回頭注重生活可能是我這年的目標之一,自從病後初癒,我覺得不該讓我生活重心這麼單一。因此我開始偶爾的小旅行,探索新的美食,做菜,探尋音樂,隨機的漫遊,走在過去沒走過得路徑上,看一下以前未留心的建築。夜間生活不在只有電腦,重拾書本,聽起podcast練英文同時聽取自己喜歡的領域。讓眼睛休息,不再只接收人造光源。還有開始的偶爾小爬山,目前都爬郊山,不過看看風景,享受Golden Hour帶來的天色變化,享受原始路徑的泥土與水汽。這部份剛起步,我想未來仍有許多空間繼續成長。
最近聽人說道:『學會拒絕後才算是成長成大人』。經過今年一些人際日常發生的事情,我想了解自己的侷限、優先支付自己,顧好自己才可以協助他人,學會知道什麼事情是可以自己承受,什麼事情是無法承受的;了解並不是所有的請求都是需要協助的,因為如果自己無法給予足夠協助,還去協助並不會使一切變好。同時自己不要怕尋求協助,旁人的協助即使是言語的點醒也是可以改善自己面對的困局。這可能是我今年遇到的事情中的一點體悟。
之後希望可以繼續維護這裡,寫作即使文筆不好,但我希望能夠好好把一件件事說明清楚,並且分享一些學習到的知識。