Re: [閒聊] interview 心得

看板Soft_Job (軟體人)作者 (uid88)時間11年前 (2014/08/02 15:10), 11年前編輯推噓7(7020)
留言27則, 15人參與, 最新討論串19/24 (看更多)
※ 引述《l42857 (~.~)》之銘言: : <恕刪> : 個人認為 : 收一個程式設計人員, 最重要是要看他是"怎麼在coding"的. : 最好的方式, 就是出一些題目. : 讓應試者直接在一台可上網的電腦, 直接寫三~四小時的程式. : 電腦要裝上影像測錄軟體. : 寫完考官先上機驗收, 測試結果, 及應試者溝通能力是否合格. 我覺得直接寫三、四小時確實是太長了 我們通常是一個人分配到45分鐘左右 舉一個前一陣子我在用(不需要背名詞,紙上也可以寫)的具體例子好了 目的: 瞭解在multi-thread上的能力 語言: 任何語言,不需要build,pseudo code也可以。用我不會的語言要教我一下。 題目: 請設計一個程序或機制,不論被叫幾次,裡面的內容只能被執行一次 Code: void func() { printf("Hi.\n"); // This line can be executed only once! } void a() { func(); } void main() { func(); a(); func(); } Output: 只有一行"Hi." 請問要如何改? 知道答案的,請慢一點再公開~~ XD 如果寫出來了,我會慢慢加條件 (然後會被版主踢到C_AND_CPP版 XD) 只要天天有在寫程式,不需要準備,也不需要背東西就可以來寫這題目 面試需要準備是一件很奇怪的事情 公司應該要設計好題目,讓應徵者不需要"準備"才對 我總是覺得這樣才會貼近他平日的實力,而不是準備好的實力... -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 98.234.114.205 ※ 文章網址: http://www.ptt.cc/bbs/Soft_Job/M.1406963436.A.E77.html

08/02 15:15, , 1F
dispatch_once
08/02 15:15, 1F
那請問你會怎麼implement這功能呢? 或著也可以去看source code,如果能花幾分鐘解釋清楚,他們那樣做的原因 我也會認為你很厲害~~ ※ 編輯: uid88 (98.234.114.205), 08/02/2014 15:31:02

08/02 15:35, , 2F
可以把主程式func都註解掉嗎?
08/02 15:35, 2F

08/02 15:37, , 3F
我來亂的XDD
08/02 15:37, 3F

08/02 15:39, , 4F
樓上並不是來亂的 因為我第一時間也是想出這個答案
08/02 15:39, 4F

08/02 15:40, , 5F
不過我猜樓主心理已有標準答案 結果對 過程不對一樣零分
08/02 15:40, 5F
拿零分其實很難的~ 弄個bool來判斷有沒有執行過也不錯啊 要加在哪裡? 這樣做會有什麼問題?

08/02 15:43, , 6F
singleton?
08/02 15:43, 6F
嗯,要怎麼加?

08/02 15:44, , 7F
我第一次工作也像eboy說的那樣做 結果後來加班到快死
08/02 15:44, 7F
謝謝分享,這個好笑 XD

08/02 15:55, , 8F
加一個mutex lock和變數讓他只印一次
08/02 15:55, 8F

08/02 16:04, , 9F
08/02 16:04, 9F
謝謝特地還寫code! 很好,既然用了lock,要不要想一下通常lock比較會搞出什麼問題?

08/02 16:22, , 10F
我會用dispatch_once...但是我不會把dispatch_once重新
08/02 16:22, 10F

08/02 16:22, , 11F
implement一次 /__\
08/02 16:22, 11F
會用也很好啊,你已經知道了他的精神。 有機會想想看你自己的話會怎麼做? 看可以做到什麼程度

08/02 16:30, , 12F
大概是busy-waiting之類的..不太確定
08/02 16:30, 12F
喔~busy-waiting這個名詞都出來了,有加分喔(因為用得很對; 雖然我不喜歡背名詞) 事實上有比這個busy-waiting還嚴重的問題: deadlock(有lock嘛,就有可能會dead) 在類似mutex lock功能之中,有沒有不會deadlock而在這裡可以用的東西?

08/02 16:45, , 13F
記得是有semaphore或monitor 不過這code很短
08/02 16:45, 13F

08/02 16:45, , 14F
只有一次inc和一個if 我覺得是不太會出現starving
08/02 16:45, 14F

08/02 16:46, , 15F
或是deadlock (只有一個條件變數也不符合循環等待)
08/02 16:46, 15F
很多系統都有提供interlocked exchange的功能 即使是在多核心多工的狀況下,也保證某一變數只會有一個人動它 這功能只做上面這件事,不會佔住資源,所以不會deadlock

08/02 16:53, , 16F
08/02 16:53, 16F
找到的這一篇不錯喔~ 如果能看完看懂,我也會覺得你很強 接下來用它的精神,看看你自己的implementation可以做到什麼程度

08/02 17:05, , 17F
在第二個func()前面加return (誤)
08/02 17:05, 17F
快要笑不動了... (真正面試時千萬不要用...) XD ※ 編輯: uid88 (98.234.114.205), 08/02/2014 17:16:08 接下來就要加一個條件: 第二次以後叫的要等第一次執行完才能回去 這也算是很合裡的要求,如果第二次以後的太早回去 等於說一次都沒做完就繼續接下來的事... 不太對 所以要建立一個等待的機制... 現在有等,如果也有前面提的mutex lock,形成deadlock的條件已經到齊: 假設printf所代表的功能裡需要一個資源A,第二次叫的傢伙又不幸先拿了A才叫func 就形成了"拿著A的等lock,拿著lock的等A"的deadlock 用interlocked exchange的好處就是可以避掉這種潛在的問題 整理一下 這問題回答程度可以總結為: 1. 用變數去記錄有沒有執行過 2. 用global變數 3. 用程序裡static變數 4. 考慮multi-thread的情形 用mutex, semaphore, critical section或是interlocked exchange都可以 5. interlocked exchange最合適的原因 6. 第二次以後叫的要等第一次執行完才能回去 7. 建構成可以泛用的機制 通常我會期待大學出來的到2 研究所到3,還要瞭解一些4 做過幾年的到5 資深的要能在邏輯上嚴謹的做好6,7也要有一些概念 ※ 編輯: uid88 (98.234.114.205), 08/02/2014 17:45:17

08/02 18:07, , 18F
可是大學OS就會教4了吧 我也是上學期上過而已..XD
08/02 18:07, 18F

08/02 18:26, , 19F
我也覺得大學畢業生應該要講出 (4)
08/02 18:26, 19F
在學校是學了很多,如果這是問答式的題目的話,上完課確實可以回答 可是實際上要熟悉它,寫進程式裡面,我估計需要一些實作的經驗

08/02 18:27, , 20F
defer func : zzz ; : hi ." Hi." cr ['] zzz is func ;
08/02 18:27, 20F

08/02 18:27, , 21F
: a func ; : main func a func ; ' hi is func \ FORTH
08/02 18:27, 21F

08/02 18:55, , 22F
有人會去刻4的code嗎? 還是都直接用現有的api?
08/02 18:55, 22F
用系統的服務就好

08/02 19:43, , 23F
以題目的要求來說,用變數就夠了,其它的太搞剛
08/02 19:43, 23F
確實是。可是題目會慢慢加一些條件,看回答的人能做到多深

08/02 21:19, , 24F
可以用(function once (){do something})() 嗎XDDD
08/02 21:19, 24F

08/02 22:08, , 25F
IIFE都出來了 有java版解法嗎?
08/02 22:08, 25F

08/02 22:25, , 26F
這裡的interlocked exchange指的是像atomic O.P的意思嗎
08/02 22:25, 26F
對的

08/03 17:57, , 27F
wp, sp
08/03 17:57, 27F
※ 編輯: uid88 (17.244.72.246), 08/06/2014 07:20:18
文章代碼(AID): #1Jt8xivt (Soft_Job)
文章代碼(AID): #1Jt8xivt (Soft_Job)