# 資訊科技產業專案設計 2023 Homework2 > Contributor: 六六 Leo ## 觀摩與檢討1 - [屎地芬森-Stevenson (他評03)](https://hackmd.io/SCeR9_shR1iwH1SXE0Y_AA#%E7%AC%AC%E4%BA%8C%E6%AC%A1%E4%BD%9C%E6%A5%AD---%E4%BB%96%E8%A9%95-03) ### Interviewer - [ ] 優點 * 開場白很完整自然 - [ ] 可改善的部份 * (第一題) 和 interviewee 互動較少 * [16:44](https://youtu.be/JMWfE7LiMiY?si=9EfBr6Zu5kk2q3i0&t=1004) algorithm 的正體中文翻譯為「演算法」而非「算法」 * 說話時游標可以不要一直上下來回移動,如 [16:52](https://youtu.be/JMWfE7LiMiY?si=-ufIrtpBpxvRKuC_&t=1013) * [52:27](https://youtu.be/JMWfE7LiMiY?si=xN7uD_MH-rFX1kP2&t=3147) duplicate 當形容詞和名詞時的發音為 [ˋdjupləkɪt] 而非 [ˋdʌpləkɪt] ### Interviewee - [ ] 優點 * (第一題) Repeat 的部分很清楚完整 * 口齒清晰 - [ ] 可改善的部份 * 說話時游標可以不要一直上下來回移動,如 [2:13](https://youtu.be/JMWfE7LiMiY?si=YPTXFsHV2bYmMckB&t=133)、[12:45](https://youtu.be/JMWfE7LiMiY?si=mTp4BqoboSTZulLB&t=765)、[14:35](https://youtu.be/JMWfE7LiMiY?si=85fPgwm9K92IENPy&t=875)、[17:01](https://youtu.be/JMWfE7LiMiY?si=y_g6d33Na8Ad5Cad&t=1021) 等 * (第一題) 在假設題目為升序排列或 singly linked list 時,可以改為向面試官提問,而非自己直接假設,以免自己假設的情況和面試官想要的不符 * (第一、二、三題) C 和 C++ 中的 [struct declaration](https://en.cppreference.com/w/c/language/struct) 需要有分號結尾 * Approach 和 Code 的部分應該拆開來,先完整描述想到的解法,與面試官討論完後再進行實作,以免或是實作的方向不合面試官預期 (如面試官希望看到疊代的寫法,但面試者卻使用遞迴的寫法) * [20:30](https://youtu.be/JMWfE7LiMiY?si=TVDqqfigikNcxLVj&t=1230) 程式碼超出頁面時可以不需要用一堆 enter 把程式碼擠到下一頁,可以在程式碼上方插入新頁面,或是把「查看>顯示列印版面配置」的選項取消勾選 (如下圖),即可讓跨頁面的文字內容連續呈現 ![](https://hackmd.io/_uploads/H1LmInKZ6.png) ## 觀摩與檢討2 - [奇諾-Cino (他評03)](https://hackmd.io/8wkCc3adTq-A17rTK6hVQg#%E7%AC%AC%E4%BA%8C%E6%AC%A1%E4%BD%9C%E6%A5%AD-%E4%BB%96%E8%A9%9503) ### Interviewer - [ ] 優點 * 從實際的應用情境描述出題很棒,不只考驗面試者解決問題的能力,還能測試面試者定義問題的能力 * 引導面試者進行 REACTO 的流程很棒 ### Interviewee - [ ] 優點 * 解題過程流暢,能夠一邊撰寫程式碼,一邊解釋自己的想法 * 口齒清晰、語速適中 * 在討論 map/unordered_map 的複雜度時,在被面試官糾正後,能夠及時反應,並給出正確答案,顯示面試者具有臨場反應能力 - [ ] 可以改進的部分 * 在 Google Docs 上使用 Arial 字型呈現程式碼看起來較為凌亂不易閱讀,可以加上一些空行,並改用其他等寬字型如 Roboto Mono、Comfortaa、Verdana * 第三題似乎想嘗試使用註解寫 pseudocode 來解釋想法,但寫得太像程式碼,有太多不必要的細節,應該聚焦在更高層次的想法 ## 觀摩與檢討3 - [嚐味鹽-Yuanson (他評04)](https://hackmd.io/ld3vOJJySBGi35OerkdehQ?view#%E7%AC%AC%E4%BA%8C%E6%AC%A1%E4%BD%9C%E6%A5%AD---%E4%BB%96%E8%A9%9504) ### Interviewer - [ ] 可以改進的部分 * 第一題討論優化時,面試官讓面試者提出改善的解法後,應該要先要求使用者分析時間複雜度來證明真的有優化的效果,而非直接讓面試者進行實作 * 第一題寫完後應該要跟面試者有更多的討論,像是舉例驗證實作的正確性,或是效能的改善等等,而非直接跳下一題 ### Interviewee - [ ] 可以改進的部分 * 請不要把「d」念成「豬」 * [3:28](https://youtu.be/wgwVsviTdcI?si=i_NKMQaJUG5Rx9Ma&t=208) 面試者講說要利用 Python 語法寫一個巢狀迴圈,可以直接講出是利用 Python 的 [list comprehension](https://www.w3schools.com/python/python_lists_comprehension.asp) * 第一題應該要先解釋為何需要額外撰寫 inner function `generate_string(i)`,解釋這個 function 的功能,然後才開始實作 * 第一題的第二種作法有明顯的錯誤,inner function `generate_string` 沒有被呼叫到,且 `digits` 非空時沒有回傳值 * 第一題的第二種作法看起來只是換個語法寫,不太懂為什麼會有加速的效果,面試者應該要解釋 * 三題都沒有確實進行 REACTO,尤其是 Test 和 Optimization 的部分,無法呈現程式碼實作的正確性,且 Optimization 不應該只是在玩語法糖,應該要有更深入的效能分析和比較 ## 觀摩與檢討4 - [火箭-Raccoon (他評04)](https://hackmd.io/p5kl-5s_T7ShYHnoOdE78Q#%E7%AC%AC%E4%BA%8C%E6%AC%A1%E4%BD%9C%E6%A5%AD-%E4%BB%96%E8%A9%9504) ### Interviewer - [ ] 優點 * 口齒清晰 - [ ] 可改進的地方 * 說話太過字正腔圓,陰陽頓挫和日常說話習慣有差距,聽起來不太自然,讓人懷疑是否在唸稿 * 較少與面試者互動,應該與面試者有更多溝通 * 如果可以針對題目有更多延伸的問題或是真實情境的描述會更好 ### Interviewee - [ ] 優點 * 解釋非常詳細清楚,尤其是在程式碼撰寫時的講解比很多人都清楚很多 * 有活用 REACTO 框架,每個環節都有確實做到 - [ ] 可改進的地方 * 說話太過字正腔圓,陰陽頓挫和日常說話習慣有差距,聽起來不太自然,讓人懷疑是否在唸稿 * [2:11](https://youtu.be/mpWFVjCKZmo?si=0pWRMzLlxnJC-p4Q&t=131) 面試者在這邊說「I will declare the **vector space** ...」,或許改講 vector size 會比較好 * [2:48](https://youtu.be/mpWFVjCKZmo?si=FYeOPPPTf9pELNhd&t=168) 面試者在這邊說「**The end condition** is i <= n ...」應該不太對,for loop 小括號裡面的第二個 statement 放的是繼續的條件而非終止條件 ## 觀摩與檢討5 - [哈默迪-Horus (他評02)](https://hackmd.io/l7E2cjjfQICEXCrSCDtOVw?view#%E7%AC%AC%E4%BA%8C%E6%AC%A1%E4%BD%9C%E6%A5%AD-%E4%BB%96%E8%A9%9502) ### Interviewer - [ ] 優點 * 口齒清晰,講話簡短扼要 * 服裝穿著得體,適合正式場合又不會過於拘謹,給人第一印象很好 - [ ] 可改進的地方 * 三題如果可以舉出實際的應用場景來包裝題目會更好 * 第二題可以再多問一題 follow up,問面試者若不使用 C++ 標準函式庫 `<algorithm>` 中的 `__gcd`,該如何求出最大公因數 * 第三題可以加考如果 input array 改用 linked list,該如何實作,並讓面試者比較 array 和 linked list 的不同,藉此判斷面試者的基礎夠不夠扎實 * 和面試者的互動偏少,感覺比較像是一個出題機器,而較少溝通的成分,做為面試官,可以思考要問哪些問題可以幫助你來判斷一個面試者是否符合公司職位要求 ### Interviewee - [ ] 優點 * 能夠一邊撰寫程式碼一邊解釋,且過程流暢不打結 * 沒有令人煩躁的小動作,整體表現自然大方 - [ ] 可改進的地方 * 第一題的第一種作法很直觀,但第二種作法可以用確認題意時舉的例子來驗證一下程式碼的正確性,即 REACTO 中的 Test * 第一題根據面試官給的題目描述,並不能直接假設陣列長度 n 一定是正整數,Repeat 時還需要確認陣列是否可能為空 * Repeat 不應該只是單純複誦面試官講的題目,還應該要同時確認題目的 contraint,像是第二題應該詢問面試官輸入的 linked list 是否為 singly linked list,且是否可能為空等 * [6:40](https://youtu.be/uMd5cEGXNL4?si=tXU2-JOnrwmgcoPq&t=400) algorithm 的正體中文翻譯為「演算法」而非「算法」,這次作業有要求應採取[台灣的科技用語](https://hackmd.io/@sysprog/it-vocabulary) * 第二題也漏掉 Test 的部分,可以稍微舉例來證明實作的正確性 ## 自我反思與改進 ### 總結其他同學的評論 > [2023 年「資訊科技產業專案設計」作業 1 - 六六 Leo](https://hackmd.io/@sysprog/SJtyg_6yT) 截至 10/16 16:00 收到了四則評論,整理如下: #### Interviewer - [ ] 優點 * 對答還蠻自然的,而且講話也很清楚。 * 口條清晰。 * 講話簡短扼要 * 口齒清晰 - [ ] 可改進部分 * 面試官跟面試者雖然看的出來是用全螢幕區分,但應該要再區分明確一點,比如說用不同帽子之類的。 * 題目部分,不要直接給定 Leetcode 題號,容易讓受訪者背誦題目。 * 跟interviewee沒有太多互動,像是在考試一樣。 * (第一題) [06:27](https://youtu.be/AA8_TrE6INw?feature=shared&t=387): "Can you come up with a better way?" 可以改成更明確的說法,像是 "How can you improve the time complexity?",可以讓 interviewer 不需要揣測要做什麼。 #### Interviewee - [ ] 優點 * 在對答和改善程式碼的時候,有把例子跟條件都打上去,讓面試官可以更了解想法和改進方式。 * 舉例清楚,撰寫程式時的註解也有幫助理解的功用 * A 的部分一條條列出來,對理解想法上有幫助。 * 有把題目輸入的條件紀錄在文件上 * 有適當的寫註解 * 英文講得很好 * 打字速度很快,排版整齊 * 對問題的提問很全面 * 寫程式時會一邊寫一邊解釋程式,很棒 * 第一題 two pointer 講解很清楚,用 ^ 在 array 的下一行代表pointer是個好方法 * 第三題寫程式前先用註解寫大綱很清楚的表達了程式內容 - [ ] 可改進部分 * 語速很ok,但是語助詞(痾)有點多。 * R 的部分跳過了,直接快進到了 E 的部分。 * 知道自己在講什麼,實作上的細節都有講到,但可以稍微放慢速度,略顯緊張 * 在寫程式的時候,filler (如 uh) 有點多。可以稍微有點沉默,等確定想好以後再一次把句子講完。 * (第一題) [07:07](https://youtu.be/AA8_TrE6INw?feature=shared&t=427): 講解比較大小的條件時,可以把條件和要做的事情寫成 pseudo code,會比直接聽更好懂。 * (第二題) [06:20](https://youtu.be/tVjf7ox1H8s?feature=shared&t=380): 「因為使用遞迴,所以時間複雜度是 $O(\log{n}$)」,應該可以改成說「如果 n 為二的 k 次方,則需要呼叫遞迴函式 k 次,也就是 $log_2^n$ 次,因此時間複雜度為 $O(\log{n})$」,會解釋得比較清楚。 #### 總結 經總結其他同學給予的評論,並觀摩其他同學的優缺點後,將針對以下幾點做改進: - [x] 面試官和面試者的差別:面試者戴帽子、面試官沒戴 - [x] 不要給直接給題號,要嘗試以真實情境包裝或改寫題目 - [x] 避免過多的語助詞「呃」 - [x] 要確實執行 REACTO ### 模擬面試過程紀錄 > [YouTube Video]() > [Google Docs](https://docs.google.com/document/d/1e1EvyT2w1MVgxNyKOZBVsLipOOrtshqytaUymoMgAC8/edit?usp=sharing) R: Intervierwer E: Intervierwee #### Repeat - R: 同學你好,很高興你通過了第一輪面試,今天公司請我來是希望更進一步了解你的專業能力以及在程式上的思考方式和習慣,所以接下來要請你回答一些問題。在科學計算和機器學習的場景時常會用到次方的運算,例如求解多項式方程式,計算高維度的函數擬合,或是神經網路常用的 softmax 激活函數等,因此高效率的次方運算就變得非常重要,因此接下來想請你實作一個函式來計算 $x^n$,其中 $x$ 為雙精度的浮點數,$n$ 為整數,並回傳答案為一個雙精度的浮點數。 - E: 好的,我的任務是要計算 x 的 n 次方,其中 $x$ 為雙精度的浮點數,$n$ 為整數,回傳值也是雙精度浮點數。 - R: 對 - E: 那麽請問 x 和 n 的範圍會在什麼區間? - R: x 的範圍是 -100.0 < x < 100.0,而 n 的範圍是 -2^31 <= n < 2^31 - E: 好的,-100.0 < x < 100.0,-2^31 <= n <= 2^31。另外從這個範圍可以知道,不會遇到 overflow 的情形,因為根據 [IEEE 754](https://en.wikipedia.org/wiki/Double-precision_floating-point_format) 的定義,雙精度浮點數有 11 bits 用來表示 exponent,因此扣掉 0 和無限大等特殊值以外,最小可以到 2 的 -1022 次方,最大可以到 2 的 1023 次方 - R: 很好,你的推論沒錯 - E: 請問輸入的 x 會有正負無限大、NaN 或 0 等特殊值嗎?另外會不會有 x 和 n 同為負數,使得 x^n 為有包含虛數的情況? - R: x 不會是正負無限大或 NaN,但可能會是 0,不過當 x 為 0 時,n 一定是正數,另外你可以假設 x^n 的輸出都會是實數,因此不會有 x 和 n 同為負數的情況 #### Example ``` x = 2.0, n = 4 => pow(x, n) = 16.0 x = 2.0, n = -2 => pow(x, n) = 0.25 x = 2.0, n = 0 => pow(x, n) = 1.0 x = 0.0, n = 4 => pow(x, n) = 0.0 ``` #### Approach - E: 最直觀的方式是看 n 是正的或是負的,然後直接把 x 乘或除 n 次,但這個方法會需要做 n 次的浮點數乘法或除法,時間複雜度為 $O(n)$,有更好的做法 - E: 如果 n 為 0,則直接回傳 1.0;如果 n 是負的,把 x 取倒數,n 加負號;如果 n 是正偶數,那 $x^n$ 為 $x^2$ 的 $n/2$ 次方再乘上 x;如果 n 是正偶數,$x^n$ 則為 $x^2$ 的 $n/2$ 次方 $$ x^n = \begin{cases} 1 & \text{if $n = 0$} \\ (\frac{1}{x})^{-n} & \text{if $n < 0$} \\ (x^2)^{\lfloor n/2 \rfloor} & \text{if $n > 0$ and even} \\ (x^2)^{\lfloor n/2 \rfloor}x & \text{if $n > 0$ and odd} \end{cases} $$ - E: 使用遞迴的方式實作,時間複雜度為 $O(\log{n})$ #### Code - R: 看起來沒有問題,請用 C 語言實作 ```c= double pow(double x, int n) { if (n == 0) return 1.0; long int m = n; if (m < 0) { x = 1.0 / x; m = -m; } if (m % 2) return pow(x * x, m / 2) * x; return pow(x * x, m / 2); } ``` #### Test - tracing code ... #### Optimization - R: 上述遞迴的空間複雜度為何?有無改進的方法? - E: 空間複雜度為 $O(\log{n})$,要改進空間複雜度可以把遞迴改用疊代的方式改寫 ```c= double myPow(double x, int n) { if (n < 0) x = 1.0 / x; double res = 1.0; while (n) { if (n % 2) res *= x; x *= x; n /= 2; } return res; } ``` - E: 時間複雜度為 $O(\log{n})$,空間複雜度為 $O(1)$ - R: OK 你表現得非常好,由於時間的關係,今天的面試就先進行到這邊,感謝你今天的參與