說明

此篇為實習心得的準備篇,主要會闡述面試的小故事以及入職前需要提前作什麼準備還有申請嘉義大專業實習選修的注意事項。

若想要閱讀其他實習心得,點擊總覽觀看其他篇章!

為保護當事人隱私,文章提到之人名皆有替換及修飾內容,請勿對號入座!

面試前的小故事

一開始在找實習職缺時,就想往 Android 實習生的方向找,只是軟體開發的相關職缺非常稀少,比較多機會都在北部,而就讀嘉義大學的我,如果要兼顧課業的話勢必就要找在南部的實習機會。第一次看到這間公司 實習職缺的時候,非常心動!因為職缺名稱就叫「Android 軟體開發實習生」,它的工作內容也是我想學的技術,只不過該公司的實習計畫時長大約一年,四上還有學分要修的我當時選擇了不投履歷,直到那間公司的 HR Dora 打電話給我!

Dora:我看你的履歷滿適合的欸,要不要來試試我們的軟體開發實習生!~

當下心情非常激動,公司人資主動邀請我應徵實習,在跟對方講出自己的擔憂以及需求後,都一一解決了。就這樣星期一致電詢問我的意願、星期二打電話回去告知有興趣面試、星期三線上面試 + 口試,最後星期四公佈錄取!雖然文字記錄看起來沒什麼,但對我來說那段過程暨興奮又煎熬的…

面試

無論面試的職位大小、工作內容多寡,都一定要針對該職缺做過功課!還有準備問公司的問題~因為在被 Dora 告知「就來面試看看啊~就當作來聊天」,我就傻傻地信以為真,沒有做準備就直接面試,過程可說是相當的慘…

面試主要分成兩個部分:

第一部分:線上 open book 考試

總共 30 分鐘要做六道題目,可以上網查答案,只是第二部分要能夠應答

1. 為何需要 CI/CD?

CI/CD 是 Continuous Integration & Continuous Development 是軟體產品開發後很重要的環節,因為產品在測試完上線後可能還會有很多問題需要調整,所以需要持續的整合與交付,提供客戶最完善的服務;而 CI/CD 也是 DevOps 的一環,它是一種開發人員與維護人員溝通合作的文化。

回答基本上沒問題

2. 請說明 MVVM 的架構及其優缺點。

MVVM (Model-View-ViewModel)是一種 Android 開發的一個架構,將資料結構跟背後運算放在 Model 裡,可能會串連資料庫;View 專心處理畫面、元件的部分;而 ViewModel 就是他跟之間溝通的橋梁,能夠及時串接資料綁訂到相對的原件(上述自己寫程式下來的感覺)。

優點是將開發封裝成一種模式,會讓團體開發更有規則依循,而測試工程師也會更方便做測試。就有點像網站的前後端分離,UI 設計人員可以專心處理畫面;後端工程師可以專門處理邏輯、資料庫的部分。 缺點就是大量的 DataBinding 會吃很多的記憶體資源以及針對 Model 與 View 的方式不容易除錯。

一位面試官提出 DataBinding 的資源消耗是必須的,所以不成缺點。

3. 給定一個 Linked-List 和一個值 x,將 Linked-List 分為兩個部分,使得所有值小於 x的節點位於值大於等於 x 的節點之前。(注意:需要維持節點原始的相對順序)

Example1:

Input: head = [2, 4, 3, 1, 5, 2], x = 3

Output: [2, 1, 2, 4, 3, 5]

Example2:

Input: head = [2, 1], x = 2

Output: [1, 2]

一開始以為是演算法的題目就先跳過了,但後來面試官提醒任何做法都可以,先不要考慮時間複雜度(他們只是想知道思考問題的角度、能不能解決問題)

後來的解法:

分成兩個 array,bigsmall: big>= 自己的值;small 就放比自己小的值。用 for 線性過去,就會依序放入,最後把兩個 array 串聯起來就好了!

4. 請說明 List, Map, Set 有什麼差別?請舉出數個分別實作 List, Map 和 Set 的類別並比較其差異。

原本的回答
以 Python 語言來舉例

說明:

    List 可以放各種不同的資料型態在同一個串列裡面,通常用 integer 的 index 來存取
    Map 就像數學函數中的一對多關係,透過一個 key 對應到特定的 value,而一個 key 能有很多個 value,JSON 檔案格式就跟它很像。
    Set 與上述兩個容器最大的不同就是,它會維持所有內容的順序(已排序),在 Python 中它還可以用集合的概念來操作(聯集、交集...等)

程式:
	List1 = [1, 2, “hello”, 2.0, -1, “kdan”]	
                              // list 可以放各種不同資料型態的資料
	Map1 = {
            “H”: 1,
            “E”: 1,
            “L”: 2,
            "O": 1, 
            “k”: 1,
            “D”: 1,
            “A”: 1,
            “N”: 1
        }			// map 可以用來統計一個句子字母出現的次數
                              // “hellokdan”

        Set1 = {
            1, 2, 3, 6, 100, 102
        }
				// 在 set 裡的資料都會是 ordered (已排序)

面試官說預期我會使用 kotlin or Java 來解釋…

後來詢問我有沒有用過 kotlin 裡面的資料結構,例如:List 有分 ArrayList、LinkedList 等,並問我有用過嗎? 我說不太清楚,回答了以下:

.toString()
.toArrayList()
List<Student>
List<T>

Class Student {
	Int id,
	String name,

	Fun toString() {
		Return $id;	
    }
}

Fun printHello() {
	print(‘hello’)
}

override 複寫
@override
Fun printHello() {
	print(‘Hello, Kdan!’)
}


overload 重載
Fun calculate(x)
Fun calculate(x, y)
Fun calculate(x, y, z)

後來問完下面加分題後,有請我解釋 override 跟 overload 的差別,一開始還搞混 = =

5. 請完成以下程式,從輸入的字串中找出頭尾都是相同字元的最長的子字串。

Example1:
Input: text = "kdanmobile"
Output: []
Example2:
Input: text = "Hello, World!"
Output: ["llo, Worl"]
Example3:
Input: text = "go, go, go"
Output: ["go, go, g", "o, go, go"]

一開始也是空著,後來的回答:

第一個想法:利用雙指標記錄頭跟尾與最長字串的長度變數

第二個想法:用 map 紀錄每一個字的出現的 index, 再由最大的 index 減去最小的 index 得到長度,再去比較最大值, 最後把那個字串印出來

"Hello, World!"

map1 = {
	“H”: [0],
	“L”: [2, 3, 10]
}

10 - 2 + 1 = 9
“llo, worl”

6. 加分題 Class Diagram 中包含以下幾種關係 (relationships)

關聯 (Association) :以實線箭頭表示
實作 (Implementation) :以空心三角形的虛線箭頭表示
聚合(Aggregation):以空心菱形的實線表示
組成(Composition):以實心菱形的實線表示
繼承 (Inheritance):以空心三角形的實線箭頭表示

試用以上關係分別繪出一個適當的 Class Diagram

我直接貼軟工期末報告畫的東西,面試官說我解釋得很詳細、不錯

第二部分:口試 + 檢討考卷

除了檢討題目以及我的回答外,他們還問了我的專題以及課堂上學了哪些東西,以下是額外的問題:

  1. Docker 的使用經驗
  2. API 串接經驗
  3. 有想過要應徵網頁職位嗎?
  4. 有寫過 MultiThread 的程式嗎?

還有面試官額外的個人建議:

  1. 把廣告 API 當成一種功能
  2. 程式題只是要了解解題的想法以及會想用什麼資料結構來解(通常)

自身檢討

  1. 因為是線上面試,用戶名字要是本名比較好

後來有新辦另一個專門求職的帳號,用戶名為本名,照片為求職用的大頭貼。

  1. OOP 觀念沒複習還搞混,卡的有點久

在面試前把工作內容及需求釐清,對於不熟的領域應要有初步瞭解的程度,視情況需要,再把內容拿出來複習,或是用程式碼及 side project 來當佐證。

  1. 專業相關課程的報告或作業要認真做

像這次就有 OOP、UML、MultiThread 之類的問題,之前修課的時候多少都有接觸到,沒辦法肯定以後一定用不到,所以要好好學習!

入職前準備

學生實習與正職入職前需要的文件其實也大同小異:

  • 大頭貼 / 生活照
  • 銀行薪轉帳戶
  • 畢業證書 / 學歷證明
  • 體檢報告(一般勞工體檢)
  • 身份證正反面
  • 前公司離職證明

需要提前準備的是「體檢報告」,當時到大醫院體檢無法預約的情況下,在現場等了一段時間,加上體檢報告出來,又等了一段時間,因為要求的報告是在三個月內,所以一兩個月內打算求職的時候,就可以先去做健檢了。

專業校外選修

接下來是嘉義大學申請實習學分的介紹,沒興趣的可以跳到最後結語的部分

為什麼要申請實習學分

一般實習是可以不用綁定學分的,其工作性質就是打工,一週可能就只有 2.5 天(依公司情況而定)。

嘉義大學的畢業門檻是總學分需達到 128 學分(包含系必修、選修、通識教育學分等),而三、四年級的每學期最低習得學分需高於 9 學分。因為自己大三有上修一些課,學分基本上夠了,加上對於四下的課沒什麼興趣,還有想參與實習賺取經驗的動機,所以才選擇實習綁學分,一邊實習、一邊修得學分。

如何申請實習

申請時間落在前一個學期接近期末的時候,例如四下想要實習,四上接近期末時就要開始準備申請實習學分的資料了。

你需要準備:

  • 教師開課同意書
  • 家長同意書
  • 學生校外實習申請表
  • 實習合約書(一式兩份)

先決定想要申請多少學分,因為最低修課學分為 9,加上想要整個學期實習,不想同時修其他學校課程,所以我選擇一週工作四天。

學分數579
一週(小時)162432
一週(天)234
總時長(小時)288432576

再來找一位跟你關係不錯的系上老師幫你開課,需幫忙期中、期末參訪以及週報、成績考核表的簽名,不一定要找班導。最後處理實習合約書,建議先把合約書給實習公司看過並簽核再給學校簽名(學校對於合約書的要求較不嚴格)

以上文件在教務處規定的時間繳齊就可以申請學分了

實習中要做什麼

  1. 每週需撰寫週報,記錄實習內容並寫下心得,開課老師與實習機構主管需要看過簽名
  2. 期中、期末需要約老師及實習主管一起訪談,可以是線上的,主要是瞭解學生實習狀況還有接收雙方的回饋
  3. 成績考核表,也就是這堂課的評分依據,雙方共同協調分數

最後在規定時間內將上述的文件都繳齊,就算修得學分了!

所有需要的文件都在這裡:專業校外實習相關表格下載區

結語

下面這段是當時面試結束馬上記錄下來的心得:

整體面試下來給我的感受,發現「實習」只是變向的正職,跟一般的工作正常的工作性質、內容其實差不多。以利益方面考量,只是領個比較低的薪水,但是就是做一樣的事,原本我以為是可以有系統的學到很多東西,所以在這方面預期會有落差。不過聽面試官解釋他們的工作,我認為還是有很多東西可以學習,也不僅是專業方面,工作倫理、職場文化也在我的考量內,所以還是很划算的。

一個有規模的公司,他們會分很多的部分處理不同的事,這次很明顯的感受是:HR 跟 IT Team 處理的事情劃分滿明顯的。HR 負責規劃人力、安排面試時間、掌管員工上班時間等,像這次面試就沒看到他,都是沒講過話的人;而 IT Team 就是問你關於他們工作內容的東西,一方面了解你的實力,一方面也問出你適不適合這份工作,不會讓你無所適從。

會想要實習是想在出社會前,累積一些實務經驗,也不只是寫程式方面的累積,工作倫理、上班的責任算是想給自己的壓力(還有暑假過的太廢了),想給自己目標還有找事情給自己做。畢竟我還是學生身分,還有容錯的空間,而且用學生這標籤感覺可以化解滿多問題的。

撇除學生身分,面試官問的問題不太針對學生,而我說出的答案也不完全都是課堂上學到的,所以跟我一開始的想法一樣,如果還是想要做實務的工作,他們會針對你的工作經驗去衡量是否應聘,學歷的部分或許不太重要(也有可能只是實習,所以不 care),把你當成一個工程師來面試,所以不要緊張,把自己所知道的、想表達的都清楚說出來就好!

結果還沒出來,也不知道會不會跟我講面試結果,但不管有沒有錄取,也學到了一些經驗,還有釐清一直以來的疑問,如果沒跨出這一步舒適圈的話,好像也不會知道的那麼多。

一直以來告訴自己的話:「要做的事情不變,只是換個地方寫程式而已」

下一篇是 技術篇,主要記錄實習階段負責哪些工作內容以及學到了哪些技術!