前言
由於當初受惠於網路上許多實習心得文章,因此自己決定在實習後也紀錄一下心得並回饋有需要的人。
這篇文寫給所有對軟體開發領域(RD)實習有興趣的人,希望能給沒有實習經驗或未來想去趨勢科技實習的人一些參考方向。
在這篇文章裡我會分成5個部份介紹,分別是
1.個人背景
2.面試過程
3.實習計畫簡介
4.個人專案簡介
5.心得與收穫
1. 個人背景
- 資訊工程學系 大三升大四。
- 大一以前沒接觸過程式,沒有任何比賽、特殊經歷。
- 修習過機器學習概論,因課程內容太少,之後開始上網自學其他部份。
- 專題是棋類遊戲運用強化學習與深度學習的相關題目。
簡言之,真得就是個隨處可見的平凡資工系學生。因此相信經歷跟我差不多或是比我豐富的人一定也有機會找到實習的!
2. 面試過程
面試主要分成兩個階段,分別是Codility Test及線上面試。
Codility Test
第一關是線上的程式考試,共有三題,可以使用Python, C++及Java來作答。
題目不難,大概就是基本的資料結構與演算法,個人感覺題目約Leetcode easy等級。
線上面試
通過Codility Test之後,我被通知進入二階面試,並得知要面試的Team是在做大數據、資料分析相關的。
在面試期間,首先我被問到履歷上寫的專案細節。接著被問到是否有做過自然語言處理 (NLP) 的相關經驗,因為可能跟實習內容有所相關。最後問了有關於機器學習的一些名詞解釋,像是Pooling及CNN。
結果
最後隔了一個月後幸運的收到了Offer。
整體下來我感覺面試內容不會問到太難,感覺較著重於面試者跟 Team 的契合度,畢竟是之後可能要一起工作的人。
後來也有聽說,趨勢各個 Team 會依照面試者履歷上的內容來決定此人是否為適合的人,若覺得不錯便會邀約進一步的面試。
實習計畫簡介
趨勢的實習計畫主要大概可以分成三部份
Training:
實習中最主要的部份,大概佔了90%
每位實習生會分配到一個 mentor (趨勢正職員工),並且由 mentor 帶領實習生完成實習專案的規劃、實做方法、報告等等。
在實習結束前,每位實習生需要向 mentor 及部門主管做一個 final presentation,講述自己這個暑假做的事情及心得,而 mentor 及主管會在結束後給予評語。
Courses:
實習期間每週不定期會有一到兩次所有實習生一起上的課程,課程中會請到趨勢裡與課程內容相關的正職當講師,並帶大家認識學習不同領域的東西。
舉例來說,這次的課程有:Cyber Security、DISC人格特質分析、UX in the Jungle、Cloud Product、職涯規劃等等,涵蓋各個不同領域。
Product Presentation:
實習生們會被隨機分成三~四個一組,並且要彼此合作介紹趨勢的其中一個產品。
這個活動不但可以認識其他部門實習生,同時也可以更加了解公司主要產品內容、公司架構。
個人專案
主題
實習期間,我所負責的專案主要是利用機器學習的技術來做 CPU、Memory以及其他metrics 的異常偵測(Anomaly Detection),同時試著分析並找出不同metrics間的相關性。
由於這次要分析的對象是CPU及Memory在不同時間的值,因此資料的型態是時間序列(time series)。關於時間序列的處理作法也有許多種,而這又是另一門學問了。
異常偵測(Anomaly Detection)這個task,在網路上可以查到非常多種的作法,主要可以分成利用統計模型 ex: ARIMA 或是 機器學習/深度學習模型 ex: Isolation Forest, One Class SVM, LSTM, Auto-Encoder 等方法來達成。
討論與實作
經過與 Mentor 及在趨勢裡做 ML 相關領域的正職討論後的結果,我們決定試著用 Convolutional Auto-Encoder Model 來做這項 Project 。
之後我找到了 keras 官網提供的這篇文章,並參考此範例實做。
然而這次要做的 task 無論是 feature 數量及資料量都遠遠大於上面連結的範例,要達成的目標也不太一樣,因此我認為這是個非常有挑戰性的任務。
結果
在實習最後,雖然照想法 train 出了一個 model,試過不同參數、改過不同架構等等,但用此模型跑異常偵測的結果仍然不是太好,用一句話說明:
該模型可以成功偵測到異常值(True Alert),但同時也會有許多異常值誤報 (False Alert)。
經過最後的討論後,我們想出了動態調整 error Threshold 的方法來讓這個模型能夠更加的準確及有用,因為想要抓的異常值通常會有特別大的 error 。因為時間不夠,此Project就停在這邊。
心得與收穫
這次的實習除了讓我對 Python 資料處理的技巧更加熟悉外,我還學到了許多在學校可能學不到的東西,以下:
時間規劃的重要性
實習剩下最後兩天了!但我的 code 跟檔案還是都好亂!所以我為什麼要到最後一天才在整理...
由於 mentor 對我採取半放任制度的關係,他跟我說不會給我一個明確的deadline,希望我盡力而為。因此我的工作模式就是埋頭苦幹,遇到問題認為自己無法解決後便去找 mentor 討論。
然而到了最後一個禮拜的最後幾天,我仍然在持續的研究及完成 mentor 給我的任務,這導致我在最後一天匆忙的與 mentor 交接。雖然文件都寫的差不多了,但我認為我那時寫的code還是相當雜亂,遠不及可以讓下一個人接手的人易懂易用的程度。
經過這次教訓後,我認為當時我應該要事先做好時間規劃,並在實習後半部份把重心放在寫文件、維持程式碼易讀性的部份,為交接做好準備。
紀錄歷程的重要性
咦?我之前為什麼要寫這個 function? 這個檔案、資料夾是從哪裡來的? 我是不是還有什麼事情忘記做了?
在實習快結束時,我準備要寫文件來交接給之後想繼續做的人。然而這時候我才發覺我只記得目前做出來的這個成果,而對之前嘗試而失敗的實驗或曾經試過的方法只有片面印象。
幸好這次實習只有兩個月,我還能勉強記得,如果是長時間的學期實習或是實際工作,我應該無法記得三四個月前的我做了什麼。
因此,我認為我那時應該要紀錄每天(或是2~3天)做了哪些東西,試了什麼,結果是失敗還是成功等等,也就是所謂的工作日記。有了這些紀錄可以讓我更清楚一路走來哪些地方是值得改進,哪些地方是做得不錯的。
除了讓我可以確實的知道這個暑假做了哪些東西,也可以讓之後繼續接手做的人看了之後能夠清楚哪些坑已經被踩過了,避免重蹈覆轍。
實際職場生活
工作了這麼多天,今天應該禮拜五了吧 ...
(並沒有)有些事情是要在實際體驗過才知道它並不是那麼的美好。
還記得在還沒實習前,聽著身邊學長姐講述實習經驗,總讓我非常羨慕,不禁開始幻想自己未來實習可以完成許多事情,學到許多新知識,完成一個公司Project並被大量使用,認識許多新朋友等等。
但是在親自體驗過實習後,才發現並不是所有事情都能如想像中的那麼順利,根據個人實力及工作態度每個人會有所不同,舉例來說:
- 每天早9晚6上班是真的很累,有時候進度自己覺得有點落後甚至需要帶電腦回家做,在下班後有時也會想著要怎麼改善比較好。中間有一度甚至壓力大到有點睡不太著覺。
- 我最後負責的Project,因為準確率及穩定性問題最後並沒有實際上線,而是交給下一個人繼續做。
然而,雖然整個實習很累,但是我也學到了很多知識,也讓我更加了解職場的環境與需求。同時也很幸運的遇到很好的 mentor 帶我,認識一些厲害的、來自不同背景與領域的 interns 。
這個暑假真的讓我獲益良多,不論是技術上的或是心靈上的都有。
最後,謝謝大家看到這邊,希望每個看完的人都能夠有所收穫!