[心得] 程式設計師應該懂多少?

看板Soft_Job (軟體人)作者 (Xsion)時間16年前 (2009/06/01 14:38), 編輯推噓52(52069)
留言121則, 28人參與, 最新討論串1/23 (看更多)
雖然經歷一波不景氣的光景,不過公司軟體業務也的確發生人力不足的現象, 需要補充新血以免日後軟體問題導致出貨延遲。敝公司軟體部門乃是使用C / C++與MFC搭配開發Windows Application。功能大多圍繞在公司出品的IC相關 應用上。 以上是前因,因為公司不大,基於老闆先存活再談永續經營理念...當然是要找 即戰力囉。不過大家內心也有數,要找到100%相關工作經驗的即戰力機率是 微乎其微。心中把標準稍稍放低,只要懂C / C++,不用我來教變數宣告、指 標、函數宣告...等等就謝天謝地了。Windows Programming只要懂得Message Routing, Procress / Thread等一點點粗淺的觀念即可。MFC當然是用過就可 以了。 基於以上原則,履歷千挑萬選,剛畢業的不能挑,公司小沒完善的教育訓練, 不應該叫人跳進來這個火坑誤人子弟嘛^_^ 沒寫過C / C++的一堆MIS或ERP相關 經驗的也不敢叫,雖然Java, C#和C++有九成像,但是我們用的MFC和J2EE還有 .Net也差異太大了,還是不敢叫。於是乎挑出了幾個有在大廠(有上市上櫃就算) 寫過一些測試程式或產測程式,有兩三年經驗的人來面試看看。 面試不外乎先問問對方經歷,寫過哪些東西,用什麼工具、遭遇過的困難等等。 然後介紹一下自己公司的職位需要的技能和工作內容等等。到這裡為止都還OK, 面試者都能洋洋灑灑的應對。然後就是在下最重視的重頭戲了,專業評估。 Q: 下面這段程式有沒有什麼問題? void fun(int* ptr) { ptr = new int[2]; } int main() { int *ptr = NULL; fun(ptr); ptr[1] = 1; ptr[2] = 2; printf("%d %d", ptr[1], ptr[2]); return 0; } 這個程式很短也沒啥實際功能,我覺得不是很好的範例程式,不過面試時間不長, 要盡量了解一下對方的C語言底子,所以只好把一堆錯誤都塞進一個程式裡。 不過重點是,這程式可是編譯得過呢~(因為有人回答他語法錯誤) 我期待中的粗淺的Programmer起碼會看出「有使用new配置記憶體,卻沒delete釋放」 「C語言是zero base陣列宣告大小為2的不能索引到[2]」,我想有點程度的應該還能回答 C語言都是傳值呼叫,所以配置好的指標空間無法回傳。 我還想看得出錯誤的人還可以討論怎麼修改會比較好... 以上預想的劇本都沒出現過,回答有: A1:這程式會編譯不過吧,那是指標不能用ptr[1]。 A2:這程式沒有錯。 A3:......(沉默無言) 我真的不相信這一題這麼難,所以我引導一下。 提示:你覺得new之後要做什麼? A1:沒用過new。 A2:不知道。 A3:new是什麼指令? 我暈,好吧他們可能是沒寫過C++,所以我換一個問法。 Q:你有用過malloc和free嗎? A1:沒有。 A2:......(無言) A3:不熟 好吧,或許你們都用C++ Builder或.Net,有好用的data structure class可以用, 所以我改問... Q:當有不定資料長度的資料要儲存時,你會使用什麼方法。 A:不定長度? Q 補充道:就是一開始不知道需要多大空間,要動態配置的啊。 A:不是寫程式時就知道大小了嗎? Q又補充道:很多狀況要等執行時期,資料讀入或使用者輸入後才知道會有幾筆資料啊。 這些是編譯時期不會知道的啊。 A:不會啊,都可以知道啊。 同上題,另一位回答道。 A:方法? Q補充道:對,就是你會用哪一種資料結構或者是哪些現成的Class? A:用陣列啊。 Q可是陣列不能動態大小耶。 A:是喔?......(沉默) Q:你都宣告一個很大的陣列來存放嗎? A:這也是個方法啦......(已經恍神中) 面試到此已經快要升天了,針對一位強調自己會C++和物件導向的人再問道。 Q:Class宣告中,你是如何決定成員的存取等級? A:存取等級? Q:就是 public, protected和private那三個啊,你宣告的變數或函式要放在哪一段裡面? A:喔,那個喔。那些比較理論的東西,我比較沒在注意(心虛中) Q:小姐,這些不是理論,這是物件導向最基本的精神-封裝。 A:喔~那個喔,我都是改人家程式的,都是放在public。 Q:所以你都不知道為甚麼要放在public嗎? A:恩......(無言) 另一位面試者,強調用MFC寫過Windows Application,所以問道。 Q:你知道Windows Message的架構嗎? A:不知道(這個倒爽快) Q:你知道Procress和Thread的差異嗎? A:...(沉默是金) Q:在Windows裡面,不同Procress間要如何溝通?(我承認我蠢,連上一題都無法 回答的人,我還找死問這題!) A:阿!我有寫過,用CreatThread...... Q:那是Thread,Thread和Process共用資料段,不需要啥特別的方法溝通。 A:喔~(沉默) 以上是我要求太高的面試心得,現在我考慮拿C / C++語言教材的前三章習題, 來當作相關工作經驗三年,資訊系畢業的應徵者試題。 PS:面試者皆有相關C / C++程式開發經驗兩年以上,資訊科系畢業。 目前薪資在40k~50k之間的「即戰力」人才。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.243.230.145

06/01 14:42, , 1F
科科 不意外
06/01 14:42, 1F
※ 編輯: xsion 來自: 210.243.230.145 (06/01 14:50)

06/01 14:53, , 2F
所以我一直覺得年資這種東西根本就... 唉
06/01 14:53, 2F

06/01 15:02, , 3F
其實我慶幸轉戰到linux後....對這些東西的印象特別深
06/01 15:02, 3F

06/01 15:05, , 4F
該程式段如果用gcc編譯, error message恐怕是new這個字
06/01 15:05, 4F

06/01 15:07, , 5F
不過不會動態宣告真的是太扯了, 都用array硬幹很難以想像
06/01 15:07, 5F

06/01 15:15, , 6F
Process和Thread的差異, 在OS課本應該會有詳細的描述
06/01 15:15, 6F

06/01 15:18, , 7F
但真正要了解其中的道理....唯有寫過這樣的程式才會體會
06/01 15:18, 7F

06/01 15:23, , 8F
這個Linux有什麼關係~_~? 換了平台豬不會變牛啊...
06/01 15:23, 8F

06/01 15:24, , 9F
資料庫我不熟, 我寫過的是影像, 和一些通訊
06/01 15:24, 9F

06/01 15:25, , 10F
malloc和free這些東西對我來說再熟悉不過....
06/01 15:25, 10F

06/01 15:27, , 11F
尤其是自定資料結構, 更需要這種方式來和系統要記憶體
06/01 15:27, 11F

06/01 15:28, , 12F
不...你講的東西和gcc/Linux基本上是沒關係的..
06/01 15:28, 12F

06/01 15:29, , 13F
我並不是說換了平台的關係....而是說在這樣的環境下
06/01 15:29, 13F

06/01 15:30, , 14F
我不得不驅使自己面對這樣的問題....
06/01 15:30, 14F

06/01 15:30, , 15F
裡面和OS有關的問題大概就是跨Process的溝通方式吧
06/01 15:30, 15F

06/01 15:30, , 16F
其他的是和作業系統平台無關的基礎知識
06/01 15:30, 16F

06/01 15:30, , 17F
IPC每個平台都有, Process/Thread也不見得每個OS都一樣...
06/01 15:30, 17F

06/01 15:30, , 18F
因為我覺得底子好,學啥平台都只是時間問題
06/01 15:30, 18F

06/01 15:31, , 19F
嚴格來講幾乎都是平台無關的問題吧...XD
06/01 15:31, 19F

06/01 15:32, , 20F
在我還沒有面試過人前,這些問題我覺得回答不出來的人大
06/01 15:32, 20F

06/01 15:33, , 21F
學大概都在混,面試過人後,我發現回答不出來是常態...
06/01 15:33, 21F

06/01 15:34, , 22F
我比較意外的是開50K找不到人..:p
06/01 15:34, 22F

06/01 15:35, , 23F
所以到後來我篩應徵者學歷>>>經歷,要不然面試很浪費時間
06/01 15:35, 23F

06/01 15:36, , 24F
看起來不是沒有人應徵啊 XD 而是來應徵的...
06/01 15:36, 24F

06/01 15:38, , 25F
其實我本想po徵才文 不過依照版規已經有三篇了 所以改po心得
06/01 15:38, 25F

06/01 15:40, , 26F
其實我找人沒有預定預算,只要能用,都會開到合理的範圍
06/01 15:40, 26F

06/01 15:40, , 27F
學歷>>經歷這樣篩選方式, 倒不如透過原po的方式出考題
06/01 15:40, 27F

06/01 15:40, , 28F
問題就在於[堪用]的都很難......
06/01 15:40, 28F

06/01 15:41, , 29F
不會寫程式而很會考試的還是大有人在....
06/01 15:41, 29F

06/01 15:41, , 30F
我是說浪費時間啊,照原Po這樣出考題,篩到堪用的機會已
06/01 15:41, 30F

06/01 15:42, , 31F
小公司的話,沒名氣人家也不知道你薪水開的高, 所以不會想去
06/01 15:42, 31F

06/01 15:42, , 32F
經不大,基礎知識如果有機會夠,出些問題抓個能力程度,
06/01 15:42, 32F

06/01 15:42, , 33F
你要找的人大部分都在硬體廠, 少部分在一線的軟體公司...
06/01 15:42, 33F

06/01 15:43, , 34F
就大概面試個幾個人就有機會抓到可以用的,比起一直花時
06/01 15:43, 34F

06/01 15:43, , 35F
間面試,至少我不用因為要面試拖累了我手上的進度...
06/01 15:43, 35F

06/01 15:44, , 36F
沒錯 小公司面試國立高材生最後常常也是白忙一場 跑了老半
06/01 15:44, 36F

06/01 15:44, , 37F
的ofer最後人家還是會選擇大廠
06/01 15:44, 37F

06/01 15:45, , 38F
所以我不吝於給私大或科大的人機會 想說其中應該也會有強者
06/01 15:45, 38F
還有 44 則推文
06/01 21:33, , 83F
中宣告的變數設定為「可以被GC回收」的功能), 和GC沒有
06/01 21:33, 83F

06/01 21:33, , 84F
直接關係...
06/01 21:33, 84F

06/01 21:35, , 85F
有這壞習慣的人在.NET中使用部份COM+元件時, 很容易出現
06/01 21:35, 85F

06/01 21:35, , 86F
memory leak...
06/01 21:35, 86F

06/01 21:40, , 87F
姆...我不大同意這種因為原來寫A所以寫B的時候就會YY講法..
06/01 21:40, 87F

06/01 21:41, , 88F
實際狀況是不管他原來是寫什麼寫B的時候都會發生YY的狀況XD
06/01 21:41, 88F

06/01 21:42, , 89F
我說的這問題在寫VBA/VBscript時是沒問題的, 甚至可以說
06/01 21:42, 89F

06/01 21:43, , 90F
是常見的寫法. 習慣的這樣的構想方式的人在寫其他語言
06/01 21:43, 90F

06/01 21:45, , 91F
的程式時也常看到會被忽略而不自覺. 這是思考慣性的問題
06/01 21:45, 91F

06/01 21:47, , 92F
另外說明一下, 思考慣性本身不是壞事. 用熟悉的思考習慣
06/01 21:47, 92F

06/01 21:48, , 93F
編寫程式後, 當bug出現時你就可以根據經驗由過往最常
06/01 21:48, 93F

06/01 21:49, , 94F
發現的錯處開始除錯. 這樣能大大的縮短預計的除錯時間.
06/01 21:49, 94F

06/01 21:51, , 95F
還有用戶回報錯誤時不改那裡, 心中也可以有大概印象...
06/01 21:51, 95F

06/01 23:02, , 96F
不意外 大多都是改程式
06/01 23:02, 96F

06/01 23:22, , 97F
C語言不能用new
06/01 23:22, 97F

06/01 23:33, , 98F
vb.net 宣告陣列[2] 其實宣告了[0] [1] [2] 語言混著用
06/01 23:33, 98F

06/01 23:34, , 99F
常常到後面就錯亂了~~@#$#︿%&*
06/01 23:34, 99F

06/01 23:35, , 100F
to Zbank:我知道,所以我很體貼的改問對方malloc了
06/01 23:35, 100F

06/01 23:43, , 101F
VB/VB.NET用陣列通常都是用迴圈到.Length或UBound()吧..
06/01 23:43, 101F

06/01 23:44, , 102F
不知道最大的index是多少並不奇怪...
06/01 23:44, 102F

06/01 23:44, , 103F
這三小 明明就編不過 C/C++混著寫 你們工程師都這樣幹嘛?
06/01 23:44, 103F

06/01 23:45, , 104F
然後寫VB而想直接過渡到.NET的人, 甚至開始值也用
06/01 23:45, 104F

06/01 23:46, , 105F
LBound()來決定... :P
06/01 23:46, 105F

06/01 23:47, , 106F
To fina101:C是C++的子集,本來就可以混著寫...
06/01 23:47, 106F

06/01 23:47, , 107F
更甚者寫C++不用C語法,根本寫不下去啊。
06/01 23:47, 107F

06/01 23:47, , 108F
這種Code 在ㄧ些編譯器是會過的 我試過
06/01 23:47, 108F

06/01 23:56, , 109F
通常在NEW完是要再CHECK記憶体位址 這種情況常看新人發生
06/01 23:56, 109F

06/01 23:59, , 110F
恩~SORRY 我耍笨了 這可以過 我剛忘了include
06/01 23:59, 110F

06/02 00:00, , 111F
DEBUG 抓半天 有的新人連ERROR MESSAGE都看不懂
06/02 00:00, 111F

06/02 00:08, , 112F
有的是if/else一大堆在一個函式,都不會抽象化的
06/02 00:08, 112F

06/02 01:13, , 113F
這種東西不熟也不會死 寫個測試code跑跑看就知道
06/02 01:13, 113F

06/02 01:13, , 114F
學問這麼多 不常用總是會忘 底子好能夠快速想起就OK
06/02 01:13, 114F

06/02 13:29, , 115F
指標亂寫電腦會當掉 考這個是正確的
06/02 13:29, 115F

06/02 13:30, , 116F
C/C++可以混著寫 用extern "C"
06/02 13:30, 116F

06/02 13:30, , 117F
如果要使用純c檔的話....
06/02 13:30, 117F

06/02 21:46, , 118F
這種要求 台清交剛畢業就能勝任了...
06/02 21:46, 118F

06/03 00:13, , 119F
樓上可能不知道台清交也有廢物
06/03 00:13, 119F

06/03 19:10, , 120F
我知道啦 推文沒辦法寫那麼多 只要稍微挑過應該不少都行吧
06/03 19:10, 120F
※ 編輯: xsion 來自: 114.44.220.37 (02/20 23:17)

05/04 16:17, , 121F
有準備國考的人應該都可以回答得出來
05/04 16:17, 121F
文章代碼(AID): #1A8tTI5w (Soft_Job)
討論串 (同標題文章)
文章代碼(AID): #1A8tTI5w (Soft_Job)