2023 Dcard iOS Intern 實習心得
應徵歷程與實習生活全紀錄!
哈囉!大家好,我是來自臺北市立明倫高中的吳承翰,也是今年(2023)Dcard 的 iOS Intern。想透過這篇文章和大家分享從發現這個計畫一直到錄取的過程以及在 Dcard 的實習生活。
來到 Dcard 的契機
時間回到 2022 年 9 月的 SITCON 學生計算機年會,當天在 Dcard 的攤位可以詢問工程師關於各類工程職位的問題,由於當時我正在學習 iOS App 開發,所以聽了對方 iOS 工程師的介紹。
後來對方問我有沒有嘗試過什麼 Side-Project,聊到我已經在 App Store 上架 Scholarium 和 MLSH 2 款 app(既然看到了就順便下載一下吧 XD),也因此得知隔年可能會有實習計畫。其實當下完全沒有想過會就此來到 Dcard,畢竟企業實習對於一個隔天還要考學測模擬考的高三生來講還非常遙遠,然而剛離開攤位後,那位工程師追來遞給我一張名片,因為幾乎是第一次收到名片,太令人感到衝擊了,所以一直把實習的事情放在心上。
誰知道 8 個月後我真的來到 Dcard 了 :D
App 作業:iTunes 音樂搜尋 App
這份作業要求串接 iTunes Search API,開發一個能讓使用者搜尋與瀏覽 iTunes Store 音樂資訊的 App,包含:
- 搜尋功能:
供使用者輸入關鍵字進行搜尋。 - 歌曲列表:
將搜尋到的資料以列表呈現,要實作分頁機制(滑動到底部再載入更多曲目)。當使用者點擊歌曲後再導至「詳細頁面」。 - 詳細頁面:
利用前頁的歌曲 ID 取得資料,呈現歌曲詳細資訊以及歌手、專輯、單曲預覽按鈕,點擊後導至「預覽頁」。必須能回到「歌曲列表」。 - 預覽頁:
載入指定的網址,在 App 內呈現內容。必須能回到「詳細頁面」。 - 使用 Swift 開發。利用 UIKit 搭配 Auto Layout 建構 UI,不使用 SwiftUI。需要處理例外狀況。
我在這份作業採用 MVC 架構。由於歌曲列表的 UI 還算單純,所以直接使用 UITableViewController
實作,然後設計 2 個 Prototype Cell,一個用於顯示歌曲,另一個則是待列表滑動至底部,用於提示使用者正在載入中/發生錯誤。
至於「詳細頁面」,依照題目指示需要利用歌曲 ID 搭配另一支 API 取得歌曲的詳細資料,為了提高 Code 的可重用性並降低「詳細頁面」的複雜度,我將擷取資料的程式碼包裝成一個 Helper,此外也將指示載入中/發生錯誤的 UI 獨立出來,再透過「Child View Controller」的形式加入「詳細頁面」。
最後的「預覽頁」原先想直接用 SFSafariViewController
,但為了讓載入的網站看起來更像 App 的一部份,所以後來改用 WKWebView
、UIToolBar
、UIProgressView
做了類似的 XD
這項作業有個蠻有趣的地方是 API 回傳的專輯封面是圖檔的 URL,因此要另外以非同步的方式下載圖片,然後再更新 UITableView,所以用了 SF Symbol 當作圖片下載過程中的 Placeholder。
履歷
人生第一次投履歷,我的方式是篇幅不要太長 1~2 頁就夠了,最好能用具體可量化的數據呈現過去比賽、活動、作品等成果。
由於先前沒有任何實習經驗,在加上 Dcard 並沒有限定制式的履歷格式,於是我決定以當時為了大學入學面試準備的三折頁為基礎精簡呈現。第一頁先是簡短的自我介紹,再來是介紹 Scratch → Python → iOS App 開發 → SITCON 學生計算機年會擔任講者,以及競賽、社團的學習歷程,每個階段大概用 2、3 句話帶過。第二頁則是 App 開發作品和一些 Side Project。
求職信(選繳)
第一次寫求職信,內容大致上是自我介紹,接著說明如何得知實習計畫,並針對職缺介紹上提到的條件、加分項,選最主要且自己也符合的三項列點說明,最後解釋為什麼會想來 Dcard 實習。
作品集或專案經驗(選繳)
我其實是從大學的備審資料整理出來,可以利用這個機會更詳細的介紹自己的專案。
第一次面談:iOS Team
履歷投遞截止一週後收到 Dcard 的面談邀請。第一次面談是利用 Google Meet 以線上的形式進行。
時間剛好撞到下午第一節的數學課,等待進入會議室的心情 be like:
面試當天有 2 位 iOS 團隊的工程師,大家先簡單地自我介紹後然後說明一下面談的流程:先輕鬆地閒聊,再問 iOS、Swift 相關問題,最後看作業。
大致整理一下當時面談的內容,不外乎會先聊聊幾個基本的問題,像是:
- 為什麼會想來實習?
- 預計一週可以來幾天?
- 已經決定未來以 iOS 為職志嗎?或是還會嘗試其他如 Web 之類的?
此外也針對 Swift 討論相關問題,進行技術上的交流,例如 class 和 struct 的差別、 strong, weak, unowned 的定義等等,後續也會針對先前繳交的作業進行提問,探討作業中的實作內容。
上述過程並非像考試一樣,直接丟題目出來要你回答,會先詢問「你有用過/知道 XXX 嗎?」,問問題除了口述,有時候還會搬程式碼出來問執行結果會如何?就像 APCS 從選擇題變簡答題,而且還會問為什麼?講完也不一定會直接說答對或答錯,而是再問一個更深入的問題看你有沒有新的想法或結論。
如果真的遇到完全沒聽過、百分之百不知道的知識點,我覺得就照實講沒關係,一來是面試是雙方彼此認識的過程,比起落選應該更擔心萬一僥倖錄取才發現無法勝任這項工作,二來是打腫臉充胖子很快就會出現破綻(x,但如果是有些觀念不太確定,或是只知道一點點,還是可以講清楚然後試著回答看看,把自己知道的說出來,剩下的就交給面試官定奪囉!
其實當時問到有關 GCD 的題目時我也有這種狀況,但經過幾題延伸的問題後發現自己對 GCD 的理解存在矛盾,最後反而歸納出正確答案。透過面試也會發現目前對哪些觀念的理解比較破碎,知道日後要加強什麼地方。
總之,「完全不會」的題目就說不清楚沒關係,但如果還知道 1%,就把那 1% 講清楚,讓對方知道自己會什麼。
第二次面談:Engineering Manager、Engineering Director、HR
原本第一次面談覺得好像凶多吉少,沒想到一週後收到第二次的面談邀請。這次是實體面談,約了一個放學後的時間,當天甚至是放學直接穿著制服從學校衝來 XD
在門口登記後 HR 會帶你參觀 Dcard 的工作環境、介紹 Dcard 的發展歷程,包括最著名的零食區,還有床讓你能在上班時間睡覺(?)然後等時間到開始面試。
第一關:Engineering Manager、Engineering Director
本來以為會有白板題,還好沒有(x
有別於第一次面談聚焦於技術能力,這次面談比較偏向「行為面試」(Behavioral Questions),像是自己是如何決定專案要採用什麼技術?例如:SwiftUI vs UIKit?最近有沒有碰過什麼新東西?
突然,蹦出一個超級意料之外的問題!
嘿我把你在 SITCON 的議程看完了,可以分享一下簡報結束後的 QA 環節有人問「⋯⋯」為什麼會回答「⋯⋯」嗎?
那場議程整整 40 分鐘耶!放在履歷上的東西真的會被認真看,而且是鉅細靡遺地看 XD
第二關:HR
這關是和 2 位 HR 面談,聊到為什麼會選擇 iOS、會想來 Dcard、希望實習學到什麼、對未來有什麼目標或期望⋯⋯,很多問題都是從履歷的內容延伸,也會讓你有個具體的情境去表達想法。
整場面試下來其實就像在聊天一樣,氣氛一點都不嚴肅,甚至比大學入學面試還輕鬆 XD
收到錄取通知
2 天後,在學校的午休時間接到 Dcard 的電話告知後續事宜,然後下午就正式收到錄取通知信了 🤩
初入 Dcard
來到 Dcard 的第一天會拿到工作設備、開通各種帳號和權限,以及裝滿紀念品的紙袋 😆
剛進 Dcard 時有個 Onboarding Project 讓你能練習 Dcard App 的程式架構、資料流、以及內部套件的使用方式。這次專案要求串接台北市市區公車路線 API 並以列表呈現,要支援下拉更新、分頁功能,其實和當初的作業有點像,只是變成 Dcard 的模式,另外還需要像 108 課綱的自主學習計畫那樣規劃每天的進度,當天結束再記錄狀況,然後等開發完成後會把拆 PR 直至 push 到 GitHub 上接受 Code Review 的流程都走過一遍,之後就可以處理 Dcard App 真正的專案囉 😎
參與正式專案
我實習期間,Dcard 的工程師會隸屬於 2 個團隊,一個是以工程師本身專業為導向的 Function Team(例:iOS),每週會有一次「Weekly Sync」讓大家知道彼此在做什麼專案,或是討論一些會影響到大家的異動,也會定期舉辦讀書會和成員分享任何有關 iOS 開發的內容;另一個則是以 Dcard 產品功能為導向的 Delivery Team(例:電商),在每天的「Daily Sync」大家會討論專案遇到的問題和執行進度。
這次在 Dcard 的 Create Team,第一個專案是改善「我的文章」功能的解鎖流程和介面:
- 使用者可能不知道解鎖密碼即是 Dcard 登入密碼。
- 使用第三方登入(如:Apple ID、Google、FaceBook 帳號)的使用者可能未曾建立密碼。
- 「忘記密碼」按鈕要等密碼錯誤後才會顯示在對話框裡,不好找也容易忽略。
- 以 Email 重設密碼時使用者可能會將自動帶入的信箱修改成自己其他信箱(與 Dcard 帳號不同),因此收不到驗證信。
- 目前 UI 是系統預設樣式,而不是 Dcard 的客製化元件。
- 針對使用者尚未登入、尚未驗證身分需另作引導,惟「新生季版」不需要驗證身分也能發文、Dtto 對發文權限的分級制度與 Dcard 有些許不同,如果使用者已發過文章應優先顯示解鎖畫面。
看過企劃書後,PM 會召集 Delivery Team 中負責該專案的成員們參加「Launch Meeting」,這時若對企劃書的內容有任何疑惑或窒礙難行的部分都可以提出來討論,然後預估自己什麼時間要完成哪些部分。
等設計師的設計稿出爐後,工程師會先根據設計稿和流程圖思考該如何實作,然後撰寫 RFC 文件(Request for Comments),說明:
- 專案目標
- 技術現況
- 預計如何實作
- 以及更動的範圍
通過另外 2 位 Function Team 的成員審視後才會正式進入開發。後續開發過程中如果對設計稿、流程圖、API ⋯⋯有新的問題或想法,也可以利用 Daily Sync 的時間和 Android、前後端、設計師、PM、EM⋯⋯確認。
待開發完成後,會有「UI Day」讓設計師檢驗畫面的呈現等是否符合預期,然後由 QA 進行測試,工程師修正完再送複測。
如果確認符合企劃書的預期就可以發 PR,每個 PR 內會用英文依特定的格式填寫該 PR 的目標(完成的部分)、實作方式、以及測試方法,通過 Function Team 另外 2 位工程師 Code Review 後才會併入主分支,納入下一次的 App 版本更新。
Dcard 的 iOS Team 每週五都會向 App Store 送審新版本的 app
本來在到職之前還不清楚實習生具體會做些什麼,擔心會應付不來,但開始實習後發現這些工作和自己平常開發 App 非常相似,只是分工變的更細,有設計師設計 UI、PM 主導企劃⋯⋯,工程師會更專注在開發上,同一項專案也因此常常需要和不同專業的人們討論,可見「溝通」在團隊協作也是一項至關重要的能力。
Dcard 生活日常
最後分享一下 Dcard 公司文化和福利 :D
彈性自由的環境
表定工作時間是 10:00~19:00,中午休息一小時,不過實際上有很大的彈性。究竟有多彈性呢?實際出勤不僅能前後彈性一小時運用,甚至未滿 4 小時除了請半天假也可以選擇自行補足時數,另外每週有 2 天是常態遠距。平時在辦公室也能選擇到任何角落工作,不受座位侷限。大家可以彈性地分配時間、空間來掌握自己的工作進度。
源源不絕的食物
說到食物,肯定少不了眾所皆知的——零食區!
除此之外,每週二公司會提供午餐、每週五提供下午茶點心、每週二和週五還有手搖杯,不僅可以自由選擇品項,還能調整甜度、冰塊、甚至加料 🤩
還有一件有趣的事,公司有半自動的義式咖啡機和拉花鋼杯,從咖啡粉填壓、萃取時間、打奶泡都是自己控制,大家經常成群結隊泡咖啡,其中會拉花的人超級多 @@
隨手就拉出一杯玫瑰花!天鵝!而且一個比一個還厲害 🫨🫨🫨
還有更多⋯⋯
像是 Team Building、按摩、各種年節活動⋯⋯。Slack 除了工作也藏著許多有趣的頻道和千奇百怪的表情符號,甚至週五到了下班時間還會有人聚在一起玩 Switch,公司氛圍總是充滿活力。
結語
沒想到人生中第一次實習會是在 Dcard 如此規模龐大的公司,見識到以工程師為職業可能會是什麼樣貌,甚至還能實際投入產品開發,影響數以百萬計的使用者。此次擔任 iOS Intern 獲得的經驗,無疑將我對資訊產業的職涯發展帶往更具體的想像。
希望這篇文章能幫到想應徵 Dcard 以及第一次申請實習的人們!如果你也還在猶豫要不要送出履歷?懷疑自己能不能勝任?我認為如果能通過履歷審核和面試的層層關卡,表示能力被肯定,不用太擔心應付不來,Mentor 和夥伴們也非常友善,尤其絕對不用擔心學歷、年紀等問題,畢竟團隊可以透過作業和履歷更認識你!
所以現在就按下送出鈕吧! 😎