作者xsion (Xsion)
看板Soft_Job
标题[心得] 程式设计师应该懂多少?
时间Mon Jun 1 14:38:09 2009
虽然经历一波不景气的光景,不过公司软体业务也的确发生人力不足的现象,
需要补充新血以免日後软体问题导致出货延迟。敝公司软体部门乃是使用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
1F:推 StubbornLin:科科 不意外 06/01 14:42
※ 编辑: xsion 来自: 210.243.230.145 (06/01 14:50)
2F:推 ykjiang:所以我一直觉得年资这种东西根本就... 唉 06/01 14:53
3F:推 GregHowe:其实我庆幸转战到linux後....对这些东西的印象特别深 06/01 15:02
4F:→ GregHowe:该程式段如果用gcc编译, error message恐怕是new这个字 06/01 15:05
5F:→ GregHowe:不过不会动态宣告真的是太扯了, 都用array硬干很难以想像 06/01 15:07
6F:推 GregHowe:Process和Thread的差异, 在OS课本应该会有详细的描述 06/01 15:15
7F:推 GregHowe:但真正要了解其中的道理....唯有写过这样的程式才会体会 06/01 15:18
8F:推 iincho:这个Linux有什麽关系~_~? 换了平台猪不会变牛啊... 06/01 15:23
9F:推 GregHowe:资料库我不熟, 我写过的是影像, 和一些通讯 06/01 15:24
10F:→ GregHowe:malloc和free这些东西对我来说再熟悉不过.... 06/01 15:25
11F:→ GregHowe:尤其是自定资料结构, 更需要这种方式来和系统要记忆体 06/01 15:27
12F:推 iincho:不...你讲的东西和gcc/Linux基本上是没关系的.. 06/01 15:28
13F:→ GregHowe:我并不是说换了平台的关系....而是说在这样的环境下 06/01 15:29
14F:→ GregHowe:我不得不驱使自己面对这样的问题.... 06/01 15:30
15F:→ xsion:里面和OS有关的问题大概就是跨Process的沟通方式吧 06/01 15:30
16F:→ xsion:其他的是和作业系统平台无关的基础知识 06/01 15:30
17F:推 iincho:IPC每个平台都有, Process/Thread也不见得每个OS都一样... 06/01 15:30
18F:→ xsion:因为我觉得底子好,学啥平台都只是时间问题 06/01 15:30
19F:→ iincho:严格来讲几乎都是平台无关的问题吧...XD 06/01 15:31
20F:推 kerickuo:在我还没有面试过人前,这些问题我觉得回答不出来的人大 06/01 15:32
21F:→ kerickuo:学大概都在混,面试过人後,我发现回答不出来是常态... 06/01 15:33
22F:推 iincho:我比较意外的是开50K找不到人..:p 06/01 15:34
23F:→ kerickuo:所以到後来我筛应徵者学历>>>经历,要不然面试很浪费时间 06/01 15:35
24F:→ kerickuo:看起来不是没有人应徵啊 XD 而是来应徵的... 06/01 15:36
25F:→ xsion:其实我本想po徵才文 不过依照版规已经有三篇了 所以改po心得 06/01 15:38
26F:→ xsion:其实我找人没有预定预算,只要能用,都会开到合理的范围 06/01 15:40
27F:推 GregHowe:学历>>经历这样筛选方式, 倒不如透过原po的方式出考题 06/01 15:40
28F:→ xsion:问题就在於[堪用]的都很难...... 06/01 15:40
29F:→ GregHowe:不会写程式而很会考试的还是大有人在.... 06/01 15:41
30F:推 kerickuo:我是说浪费时间啊,照原Po这样出考题,筛到堪用的机会已 06/01 15:41
31F:推 iincho:小公司的话,没名气人家也不知道你薪水开的高, 所以不会想去 06/01 15:42
32F:→ kerickuo:经不大,基础知识如果有机会够,出些问题抓个能力程度, 06/01 15:42
33F:→ iincho:你要找的人大部分都在硬体厂, 少部分在一线的软体公司... 06/01 15:42
34F:→ kerickuo:就大概面试个几个人就有机会抓到可以用的,比起一直花时 06/01 15:43
35F:→ kerickuo:间面试,至少我不用因为要面试拖累了我手上的进度... 06/01 15:43
36F:→ xsion:没错 小公司面试国立高材生最後常常也是白忙一场 跑了老半 06/01 15:44
37F:→ xsion:的ofer最後人家还是会选择大厂 06/01 15:44
38F:→ xsion:所以我不吝於给私大或科大的人机会 想说其中应该也会有强者 06/01 15:45
39F:推 iincho:钱加下去就有了...XD, 不过一般老板不会这样干就是... 06/01 15:46
40F:推 kerickuo:反正小公司学历太好的不会来,挑中间学历的机会会比较高 06/01 15:51
41F:推 GregHowe:不会浪费时间啊....看考题会不会写....不会就打发走 06/01 15:51
42F:→ kerickuo:然後问些基础知识,还ok的就收了,没有什麽选择权。 06/01 15:52
43F:→ GregHowe:或者直接看有没有作品....会浪费时间吗? 06/01 15:52
44F:→ kerickuo:光是打发人走都很浪费时间啊 XD 06/01 15:52
45F:→ GregHowe:说的也是....总是要些客套话.... 06/01 15:53
46F:→ kerickuo:面试个五六个人,一个下午可能就没了... 06/01 15:54
47F:→ GregHowe:我真佩服小m的面试,都约晚上,一次一个人就两个多小时.... 06/01 15:56
48F:→ xsion:对啊 不说些客套话 怕人家上科技版黑特公司咧 06/01 15:56
49F:推 Huangs:写得还满传神的~ 06/01 15:56
50F:推 GregHowe:基本上....里面的科技版的资料还蛮有参考价值的 XD 06/01 16:02
51F:→ xsion:其实我也不怕人家知道题库啊 临时抱佛脚的人还是会一问就倒 06/01 16:05
52F:推 ykjiang:小 m 面试人的确很有耐心,这点不得不推 06/01 16:52
53F:推 avhacker:原 po 该不会以为这段 code 只有没 delete 这个问题吧? 06/01 17:06
54F:→ avhacker:main 中的 ptr 从头到尾都是 NULL, 没变过 06/01 17:07
55F:推 adrianc:楼上... 06/01 17:13
56F:推 iincho:科..有人提到盲点了...XD 06/01 17:14
57F:推 aacs0130:蛮多公司都有c/c++语言考卷的..有做功课应该都可以答出一 06/01 17:14
58F:→ iincho:这告诉我们出程式考题的时候不管怎样都要跑一遍.... 06/01 17:14
59F:→ aacs0130:些...ptr[2]这个bug答不出来就太超过了 06/01 17:15
60F:→ aacs0130:原PO有提到传值呼叫的问题..这个code能编译..不能执行 06/01 17:17
61F:→ xsion:请问iincho大,盲点是...? 06/01 17:25
62F:推 dreamcwli:fun() 根本没办法配置记忆体给 main() 里的 ptr 吧 = =" 06/01 17:44
63F:→ xsion:给楼上大大,这点内文有提到,C语言都是传值呼叫那行 06/01 17:49
64F:→ xsion:这一点就是留伏笔希望面试者回答要怎麽改的啊 06/01 17:50
65F:→ xsion:用double pointer, return value或整乾脆在main new都可以 06/01 17:51
66F:推 avhacker:漏看了,我看到你写"我期待...没delete释放" 就跳过了 XD 06/01 17:52
67F:推 iincho:xsion: 没啦, 我看错了 不好意思... 06/01 17:56
68F:推 onear:这些题目的确不难,这样就有50k,真好.. 06/01 19:55
69F:推 peacecorner:哪间公司阿 可以说吗 我也想去面试看看 06/01 20:05
70F:推 psliurt: 那间公司阿 可以说吗 我也想去面试看看 月薪40K就好 06/01 20:27
71F:推 achii:小公司还挑咧 06/01 20:40
72F:推 sougly:你那些问题我大概都会耶 但我年资 = 0 = = 06/01 20:42
73F:→ littlebau:所以就说阿猫阿狗现在都在当程式设计师了 ..正常啦 06/01 21:02
74F:→ littlebau:老实说 你的题目我也不会 我只会改BIOS code。 06/01 21:03
75F:→ littlebau:跟用C语言写简单测试tool跟小工具。我自认我是阿猫阿狗 06/01 21:03
76F:→ littlebau:型的工程师,而且像我这种的很多。遇到我这种的 不要 06/01 21:04
77F:→ littlebau:录取就对了,因为後面还有很多高手 06/01 21:04
78F:→ littlebau:就算是一个大一 大二的学生应该都会 都可以乐胜在职的 06/01 21:05
79F:推 leicheong:其实写.NET而依赖auto cleanup所以从来不dereference的 06/01 21:25
80F:→ leicheong:人也不少... 尤其是写script/VB转写.NET的人... (默) 06/01 21:26
81F:→ iincho:gc不是错, 是用的人的问题-_-;;; 06/01 21:28
82F:推 leicheong:我说的是auto cleanup (指执行点离开区段後会自动把区段 06/01 21:32
83F:→ leicheong:中宣告的变数设定为「可以被GC回收」的功能), 和GC没有 06/01 21:33
84F:→ leicheong:直接关系... 06/01 21:33
85F:→ leicheong:有这坏习惯的人在.NET中使用部份COM+元件时, 很容易出现 06/01 21:35
86F:→ leicheong:memory leak... 06/01 21:35
87F:推 iincho:姆...我不大同意这种因为原来写A所以写B的时候就会YY讲法.. 06/01 21:40
88F:→ iincho:实际状况是不管他原来是写什麽写B的时候都会发生YY的状况XD 06/01 21:41
89F:推 leicheong:我说的这问题在写VBA/VBscript时是没问题的, 甚至可以说 06/01 21:42
90F:→ leicheong:是常见的写法. 习惯的这样的构想方式的人在写其他语言 06/01 21:43
91F:→ leicheong:的程式时也常看到会被忽略而不自觉. 这是思考惯性的问题 06/01 21:45
92F:→ leicheong:另外说明一下, 思考惯性本身不是坏事. 用熟悉的思考习惯 06/01 21:47
93F:→ leicheong:编写程式後, 当bug出现时你就可以根据经验由过往最常 06/01 21:48
94F:→ leicheong:发现的错处开始除错. 这样能大大的缩短预计的除错时间. 06/01 21:49
95F:→ leicheong:还有用户回报错误时不改那里, 心中也可以有大概印象... 06/01 21:51
96F:推 Zbank:不意外 大多都是改程式 06/01 23:02
97F:推 uefang:C语言不能用new 06/01 23:22
98F:推 zeebra:vb.net 宣告阵列[2] 其实宣告了[0] [1] [2] 语言混着用 06/01 23:33
99F:→ zeebra:常常到後面就错乱了~~@#$#︿%&* 06/01 23:34
100F:→ xsion:to Zbank:我知道,所以我很体贴的改问对方malloc了 06/01 23:35
101F:推 leicheong:VB/VB.NET用阵列通常都是用回圈到.Length或UBound()吧.. 06/01 23:43
102F:→ leicheong:不知道最大的index是多少并不奇怪... 06/01 23:44
103F:推 final01:这三小 明明就编不过 C/C++混着写 你们工程师都这样干嘛? 06/01 23:44
104F:→ leicheong:然後写VB而想直接过渡到.NET的人, 甚至开始值也用 06/01 23:45
105F:→ leicheong:LBound()来决定... :P 06/01 23:46
106F:→ xsion:To fina101:C是C++的子集,本来就可以混着写... 06/01 23:47
107F:→ xsion:更甚者写C++不用C语法,根本写不下去啊。 06/01 23:47
108F:推 swindler:这种Code 在ㄧ些编译器是会过的 我试过 06/01 23:47
109F:推 swindler:通常在NEW完是要再CHECK记忆体位址 这种情况常看新人发生 06/01 23:56
110F:推 final01:恩~SORRY 我耍笨了 这可以过 我刚忘了include 06/01 23:59
111F:推 swindler:DEBUG 抓半天 有的新人连ERROR MESSAGE都看不懂 06/02 00:00
112F:推 juriolegend:有的是if/else一大堆在一个函式,都不会抽象化的 06/02 00:08
113F:推 y2k27:这种东西不熟也不会死 写个测试code跑跑看就知道 06/02 01:13
114F:→ y2k27:学问这麽多 不常用总是会忘 底子好能够快速想起就OK 06/02 01:13
115F:推 arenda:指标乱写电脑会当掉 考这个是正确的 06/02 13:29
116F:→ arenda:C/C++可以混着写 用extern "C" 06/02 13:30
117F:→ arenda:如果要使用纯c档的话.... 06/02 13:30
118F:推 Linvail:这种要求 台清交刚毕业就能胜任了... 06/02 21:46
119F:推 avhacker:楼上可能不知道台清交也有废物 06/03 00:13
120F:推 Linvail:我知道啦 推文没办法写那麽多 只要稍微挑过应该不少都行吧 06/03 19:10
※ 编辑: xsion 来自: 114.44.220.37 (02/20 23:17)
121F:推 kaibaseto:有准备国考的人应该都可以回答得出来 05/04 16:17