# 程式設計泛用面試題目
+ 下列問題,請就你所認知和理解的部分進行回答,真的不知道的話就答不知道。
+ 有些題目有標準答案,有些沒有。不過,重要的不是答案正不正確,而是你如何理解這些議題、如何尋找答案、和如何解決問題。
+ 你可以只憑自身所知來回答,也可以從任何地方找答案。不過,如果你是從其他地方獲得解答的話,請務必註明資料來源。
+ 部分問題與經驗相關,如果你沒有相關經驗的話,請你想像你在這個情境下你會如何應對。
+ 實作題請使用你最擅長的程式語言撰寫,或按照應徵條件上指定的程式語言撰寫 (如果有限定)。不過,題目和範例都是以`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. 你做過最瘋狂最荒謬最離奇最不可思議最匪夷所思的一件事是什麼?為什麼?