# 程式設計泛用面試題目 + 下列問題,請就你所認知和理解的部分進行回答,真的不知道的話就答不知道。 + 有些題目有標準答案,有些沒有。不過,重要的不是答案正不正確,而是你如何理解這些議題、如何尋找答案、和如何解決問題。 + 你可以只憑自身所知來回答,也可以從任何地方找答案。不過,如果你是從其他地方獲得解答的話,請務必註明資料來源。 + 部分問題與經驗相關,如果你沒有相關經驗的話,請你想像你在這個情境下你會如何應對。 + 實作題請使用你最擅長的程式語言撰寫,或按照應徵條件上指定的程式語言撰寫 (如果有限定)。不過,題目和範例都是以`JavaScript`描述。 + 未經同意,不得擅自轉載、發佈、或散播本題目之所有和部分內容。 ## 思維題 ### Q1. 程式設計中有許多要考量的因素和指標,請說明下列指標的含意,接著依照你認為的重要性跟優先性進行排列,並且說明這樣排列的原因。 > + 效能 Performance > + 可延展性 Scalability > + 可靠性 Reliability > + 可維護性 Maintainability > + 可重用性 Reuseability > + 可擴充性 Extensibility > + 可讀性 Readability > + 可測試性 Testability > + 可用性 Availability > + 安全性 Security ### Q2. 好的開發人員應該具備何種特質?為什麼?那些特質你具備?那些特質你不具備? ### Q3. 面對一門新的技術,你的學習方式、途徑、策略是什麼?為什麼? ## 觀念題 ### Q4. 物件導向程式設計好在哪裡?不好在哪裡?為什麼? ### Q5. 使用變數的功能、用法、和目的是什麼?什麼是好的用法?什麼是不好的用法?為什麼? ### Q6. 什麼是重構?如何進行重構?什麼時候需要重構?要如何確保重構後不會影響原本功能? ## 技術題 ### Q7. 某些程式語言中 (例如JavaScript),為什麼 0.1 + 0.2 不會剛好等於 0.3?要如何解決這個問題? ![](https://i.imgur.com/6qIDcuo.png) ### Q8. 方法的鏈式呼叫 (Method Chaining) 是什麼?有什麼優點?有什麼缺點?適合用在哪裡?不適合用在哪裡? ### Q9. 什麼是單元測試?有什麼用途?什麼東西該測?什麼東西不該測?為什麼很多人覺得它很困難?不寫單元測試軟體品質一定差嗎?寫了一堆單元測試軟體品質一定好嗎? ## 實作題 ### Q10. 針對下列需求寫出一個篩選條件的方法。 這是一個讓民眾預約`打掃人員`到家裡進行打掃的預約系統,需求如下: > * 身為`幹大事的人`,我需要預約`打掃人員`到我家打掃,因為我就懶。 > * 身為`貓奴`,我需要預約`打掃人員`到我家打掃,因為貓皇對環境整潔度十分苛刻。 > * 身為`女大學生`,我需要指定`女性打掃人員`到我家打掃,因為男人豈能進我黃花大閨女閨房? > * 身為`男大學生`,我只需要預約`一小時的打掃`,因為我家除了床跟電視之外沒有任何家具。 > * 身為`打掃人員`,我需要可以設定`服務城市`最好是`同區`,因為這樣我不用歐兜邁騎遍大江南北。 > * 身為`打掃人員`,我需要可以設定`最低服務時數`,因為這樣我才不會騎車三小時打掃半小時。 > * 身為`打掃人員`,我需要可以`棄單`,畢竟客戶可以挑`打掃人員`,我也可以挑客戶。 > * 身為`平台營運商`,我希望`客戶`可以針對`打掃人員`進行評分,因為這樣可以賞善罰惡。 > * 身為`平台營運商`,我希望可紀錄`打掃人員`的`棄單率`,因為挑食的小孩長不大。 > * 身為`平台營運商`,我需要系統可以按照`服務地點`、`滿意度星等`、`棄單率`等條件來自動匹配`打掃人員`給`客戶`,因為這樣我就不用養一堆接電話的。 請在不考慮資料庫連線和程式架構的前提下,按照下列匹配規則寫一個方法來篩選`打掃人員`。 首先,會透過下列篩選條件來縮小範圍。 > 1. 當`訂單`有`指定性別`時,依照指定之性別進行篩選。 > 2. `打掃人員`可以決定願意接受的`最低服務時數`,若`訂單`的服務時數過低,則不匹配。 > 3. 提供服務的`打掃人員`必須居住在`服務地城市`。 > 4. 如果有任何`打掃人員`的`居住地郵遞區號`與`服務地郵遞區號`相符,則以`服務地郵遞區號`作為篩選條件,剔除不同`居住地郵遞區號`的`打掃人員`。 > 5. 如果沒有任何`打掃人員`的`居住地郵遞區號`與`服務地郵遞區號`相符,則維持原狀,僅以`服務地城市`作為篩選條件。 篩選過後,再依照下列排序條件進行排序。 > 1. `滿意度星等`高者優先。 > 2. `棄單率`低者優先。 💥喔喔,你遭遇到了問題! 理論上,排序最高者將成為被指派的`打掃人員`,但是你注意到`滿意度星等`和`棄單率`在短時間內幾乎是不會變動的。 例如,同一天進行預約的訂單,當天的`打掃人員`的`滿意度星等`和`棄單率`幾乎都是相同不變的,因為這些分數都是在服務完畢後才會被客戶進行評分。 為了避免短時間內總是指派同一位`打掃人員`,請你設計一套權重機制來進行隨機挑選,讓排序高的`打掃人員`具有較高的機率被選中,但是又能防止總是只有第一名被選中。 下列為`打掃人員`及`訂單`的範例物件: ```javascript= /* 打掃人員 **/ const housekeeper = { /* 性別 **/ gender: 'female', /* 居住地城市 **/ residentCity: 'Taipei', /* 居住地郵遞區號 **/ residentZipCode: 100, /* 滿意度星等 (滿分5星) **/ stars: 4.3, /* 棄單率 **/ abandonmentRate: 0.02, /* 接受有養寵物的服務地點 **/ acceptPets: true, /* 最低服務時數 (包含) **/ minimumHours: 2, } ``` ```javascript= /* 訂單 **/ const order = { /* 服務時數 (必填) **/ serviceHours: 2, /* 服務地城市 (必填) **/ serviceCity: 'Taoyuan', /* 服務地郵遞區號 (必填) **/ serviceZipCode: 320, /* 指定性別 (非必填) **/ specificGender: 'male', /* 是否有養寵物 (非必填) **/ hasPets: true, } ``` 你的方法簽章大概會是這個形式: ```javascript= // 全部打掃人員 const allHousekeepers = [housekeeper1, housekeeper2, ... ] // 被指派的打掃人員 const designatedHousekeeper = findMatchedHousekeeper(order, allHousekeepers) ``` ### Q11. 寫一個方法來取得兩個日期範圍內的所有星期日的日期。 例如:取得`2021-08-01`至`2021-08-31`的所有`星期日`的日期。 在這情況下,應該要回傳`2021-08-08`、`2021-08-15`、`2021-08-22`、`2021-08-29`。 ### Q12. 寫一個方法來判斷所有時間區段是不重疊的。 下圖為兩段時間重疊或不重疊的所有情況,其中`After`、`Start Touching`、`End Touching`、`Before`這四組被定義為`不重疊`。 ![](https://i.imgur.com/Vfg1CBZ.png) 下列為數個時間區段的範例陣列: ```javascript= const overlappedSlots = [ { start: '08:00', end: '11:00' }, { start: '10:00', end: '17:00' }, { start: '16:00', end: '19:00' }, ] const nonOverlappedSlots = [ { start: '08:00', end: '10:00' }, { start: '13:00', end: '16:00' }, { start: '16:00', end: '19:00' }, ] ``` 請寫一個方法可以接受上列`時間區段陣列`當作`傳入參數`,回傳`布林值`來表示所有時間區段是`不重疊`的。 ## 專案題 ### Q13. 協同開發最常遇到的問題是什麼?你會如何解決? ### Q14. 客戶無法清楚表達需求的時候該怎麼釐清?如何避免潛在需求? ### Q15. 如何預估時程?預估時程準和不準的原因是什麼?預估時程真的有用嗎? ## 附加題 (自由選答,不計分) ### Q16. 為什麼有人說懶惰是程式設計師的美德? ### Q17. 專案經理總是說:「先求有再求好」這是可行的嗎?為什麼? ### Q18. 你做過最瘋狂最荒謬最離奇最不可思議最匪夷所思的一件事是什麼?為什麼?