---
# System prepended metadata

title: KKBOX take home

---

# KKBOX take home

![](https://i.imgur.com/u8YSPZe.png)
![](https://i.imgur.com/bYEqEfC.png)
![](https://i.imgur.com/Ribn9hV.png)
![](https://i.imgur.com/RRpbWnM.png)
![](https://i.imgur.com/wsPSFnl.png)


參考資料：
[RSS Feed 連結](https://feeds.soundcloud.com/users/soundcloud:users:322164009/sounds.rss)
[avplayer](https://developer.apple.com/documentation/avfoundation/avplayer)


## 要做的事 - 預估時間（單位：小時）
* 架構分層 - 5
* 研究 ＯＣ - 10...?
* 研究 RSS XML decode - 3
* 研究 AVplayer - 3
* 優化 - ...?


## 需求分析 - 預估時間（單位：小時）
* 抓取解析 RSS內容 - 6
* 刻靜態畫面 （AVPlayerLayer） - 6
* 流程串起來，傳值（假資料 - 3
* 串真的資料 - 6
* 播放語音（AVPlayerLayer） - 3
* 控制進度條播放進度（AVPlayer） - 3
* 點擊按鈕播放上下則語音（AVPlayer） - 4
* 自動播放下則語音，若無則停止播放（AVPlayer） - 4


## 架構
* Modal: 解析RSS，有 struct來decode和包裝
* VC: 刻靜態畫面
* ViewModel: 邏輯


## 問題
* 有用到其他的套件嗎？
    * Kingfisher -> 快取圖片，因為有一百多集
* 架構？MVC/MVVM
    * MVVM，但也沒被問
        * 比較好測
* OC怎麼下手，從頭開始？還是需要寫什麼的時候去找怎麼寫？
    * 至少要知道怎麼宣告、型別、return、func
    * GitHub上面找答案拼湊
    * 先用Swift完成需求，後期再翻譯成OC
* 投影片要做什麼？寫什麼？
    * 要如何demo 作品
* 要寫測試？
    * 會加很多分
    * 沒寫有被問為什麼沒寫
* 易於未來擴充與變動？建議要如何做會比較好？
    * 承認沒做好，直接線上refactor
* 在哪個部分的時間會佔比較多？
    * 寫ＯＣ
    * 用Swift寫只花兩天，後面的時間花在OC
* 曾經有哪些坑要注意？
    * XML parser只有Swift，改用原生的
    * ＯＣ先看完基礎的
    * kingfisher 快取圖片
* ＸＭＬ parser有原生的方法，去GitHub找


## 注意
* ＯＣ的部分：RSS 就好
* ＯＣ ＋ Swift 同時運作的時候要調整一下bridge，官方有清楚的教學


## 面試
* 先簡報作業，丹丹會code review 直接refactor、Dino也是
    * 先講想法，有想法的話就會請你直接打
    * 幾乎都是口頭
    * 問 ==為什麼會這樣寫==
* 資深ＰＭ問一些產品想法
    * 問處理衝突的經驗
    * 問工作流程
    * 去年WWDC的內容有什麼可以應用到公司產品上
        * 程式上要怎麼寫

## Unit Test
- ![](https://i.imgur.com/udZCSxX.png)
- ![](https://i.imgur.com/40xyBep.png)
- Priority
    - RssParser
        - `parseFeed` method: 知道這個url可不可以使用，並能不能用 xml decode
        - 中間 `delegate` method: 是否可以讀取到的各個 rssItem tag
    - HomeViewModel - `RssParserDelegate`
        - `successParsedResult` method: 確認model是否有傳遞資料過來
    - EpisodeViewModel/HomeViewController - `init` method/`UITableViewDelegate` -`didSelectRowAt`
        - 確認EpisodeViewModel中的 podcast/episode details是否和使用者選擇的集數內容是否正確
    - EpisodeViewController
        - `loadDetails`: 是否有把data放入元件的參數裡面
    - EpisodeViewController/PlayerViewController - `tapPlay` @objc method/ `init` method
        - 確認是否不為nil的viewModel(含podcast/episode details)，有用正確的 init method建構出包含playerVM的 playerVC instance