给我一个支点,我可以转动地球
----阿基米德
对于程序员来说,编程语言就是我们的支点,不同的程序员有不同的支点,而杠杆是需要我们创造的,那些能够成功的吸引人的眼球的设计,都是成功的杠杆,虽然支点不一样,但目标都是让我们这些生活在地球村的人民生活更美好,社会更健康更充满活力。所以能和那些有共同想法,能力卓著,充满创造力,积极向上的程序员一起工作,是项目组的其他人共同的愿望。所以项目经理或者软件经理有义务有理由去挑选那些尽可能优秀的人为整个团队乃到公司服务。但人才的挑选是个大问题,非常难以找到合适的方式,不管是延续了几千年的科举制度,还是当前帝国的高考制度,抑或是世界500强的经典面试,既有成功案例,也不乏失败的教训,都难免受到批评家或者挑剔者不同的诟病,也许知人善任才是硬道理。 人才是不拘一格的,很难有一套完整的制度或者程序能完全挑出真正的精英。不论什么时代,都会有一些失落的精英感叹龙泉空呤或者伯乐感叹千里马难寻。
其实我觉得世界上所有人都是人才,关健在于用在什么地方,你让一个千里马去耕地,一定没有老黄牛好。面试官的态度一定要正确,不能因为面试的人一问三不知就立即推测这人是草包或者滥竽充数者,因为人家可能是其他方面的高手或者专家。而人力部门的官员或者猎头也应该尽量有什对性的挑选有相关经验者面试,且莫为了完成给技术部门推荐的数量而超大面积撒网。笔者做为C程序员,就曾经好几次被推荐去搞JAVA面试,实属浪费公司时间和个人时间。当然如果JAVA真能提供比我现在更优越的工作环境,条件,发展前景,而且允许我从零开始去搞研究开发倒也无可厚非,多学一些东西充实头脑,多一门技术为社会服务,我们也求之不得。关健在于中间环节的人多不负责任造成,确实让人不舒服。
叹息归叹息,言归正传。笔者在工作期间,参与了大量的面试,为了寻找一个好老板不容易呀,呵呵,也面试过不少人,能够和高手互相学习,取长补短,绝对是工作过程中的一件快事。好的面试应该分笔试和面试两部分。对于MTK来说,笔试的程序员和其他各行各业的程序员一样,都要考查以下几点:
1.宏的运用,包括常规宏与宏函数,括号运用与反斜杠是区分理论家与实践家的重要方法
2.某些复合关健字的意义和用法,const ,static,voltale等在大学课本上讲之不多而又在工作中应用甚广的函数
3.基本数据结构的长度计算,包括考虑到共用体,结构体在各种对齐方式下的长度,
4.内存使用,指针,指向指针的指针,数组,堆,栈,静态存储区,动态存储区
5.编写代码能力,一般能通过编写常用函数库来考察你对常用函数了解的深度,既要会用,也要了解其局限性和敝端
6.阅读代码能力,正确写出代码输出结果
7.代码找错能力,是是非非的指针,编译器的约定,不好的代码习惯,错误的函数用法,都是考查之热点
8.顺带会小测一下你的编码风格,这可以从你编写代码中看出来,错误处理,ASSERT运用,return运用,括号的运用,代码块,空格,空行都是观察一个优秀程序员必不可少的。
这些都是一个软件工程师应该具备的基本素质,如果你要去应聘一个不管哪方面的软件工程师,笔试部分完全可以按照我的热点来复习,绝对不会有太大问题。这也就是我们去许多不同公司甚至不同行业面试会发现笔试题几乎一模一样,几乎都是从嵌入式工程师应该知道的0x10问题和林锐博士的高质量C抄出来的。许多人不明白为什么这样,这些题答案都固定了,只要有人背下来,笔试几乎是毫无问题的,还能起到测试作用吗?我认为绝对没有问题,你能背下来这些答案或者肯花时间去记这些问题,并搞明白这些原理,说明你是花下不少时间的,认真的,至少也是一块可造之材,而且高级的工程师对于这些问题往往会有出人意料的更绝妙的答案,这些问题,如果你写过N年代码,你就会有自己不同的看法。背答案是初学编程者最好的入门方法,而你如果能在理解的基础上背,你就更上一层楼了。其实学习什么都这样,以前我有个同学英语总是不及格,向老师请教方法,老师说你把我们现在学的这本英语课本背下来试试,小伙子起早贪黑背,把高中六本书全背了不过瘾,又背新概念,后来英语竟然在全校也是数一数二的,从落后分子变成了全校精英。可见古代那些背八股文绝对没白花功夫,他们正是从背诵中领悟了宇宙,社会,人生的真谛,从而成为那个时代的统治者。笔者刚毕业时,为了练习编程技能,曾经把《the c programming language》的程序全背会了,里面的一些标准C函数库的设计理念和过程令我叹为观止。为我阅读理解林锐博士和其他人写的编程秘籍打下了基础。
有了上面的笔试基础,剩下的面试就简单了。很难想象一个C语言基础知识不懂的人,能写出有用的,可维护的,安全的代码。当然也有例外,我有一个同学,程序课基本不上,写的代码运行是对的,就是很难读懂原理,这样的代码适合去参加《C专家编程》里面提到的混乱代码大赛,一定能拿个奖回来,这也是人才,所以笔试很重要。对于MTK,一般我们要掌握以下五个方面的知识,才能顺利进行MTK方面的开发。
1.history机制,这是很重要的,恰当的运用和理解,可以节省程序运行时间和维护成本,对写高精简代码有好处。一般有关这方面,我经常会问他们EntryNewScreen函数的运用,对这个函数的理解,运用,修改会极大的优化我们的程序架构。当然,我遇到的不少MTK开发工程师,只有极少人能讲明白这个函数,大多数人只能说出他的几个参数的意义,还有一些是什么也说不出的,他们给我说,这个函数就那么用,复制,粘贴,修改就行了,从没有深入了解这个函数的实现过程。做学问,做为开发工程师,不能知其然不知其所以然,这是很消极的,如果这个问题回答正确,接下来就是一些特殊窗口比如IDLE,POP框的入栈出栈问题;
2.DM机制,这里也有个重点的函数dm_redraw_category_screen,这个函数几乎和EntryNewScreen一样普遍,一样的重要。
3.读写文件,不管是一个非MTK工程师面试还是MTK工程师,这个问题是应该知道的,因为不管是电脑中还是手机中都有大量的数据需要存储,而读写文件在程序中许多地方都是不可缺少的。而这也是用应用开发不可缺少的,这里面有读写出错的处理,有大小端问题,都是需要掌握和了解的。
4。GUI设计,不管是一个非MTK工程师面试还是MTK工程师,这个问题也是应该知道的,手机和电脑上的图像,框体都是由一个个像素点实现的。基本的GUI掌握了,说明你是重视用户接口设计的,并且可能对这方面有很深入的研究,在这个视觉决定一切的世界里,如果能恰当的运用,会产生绝妙的创意,苹果电脑,手机无一不是这方面的杰作。这方面不应该要求写代码的,平台不同,代码不同,这些知识学死了反而不好。
5.网络链接,这个也是很有用的,不管对手机还是电脑,地球村离不开网络,为什么不多研究一下,让我们的程序从网上动态更新,给用户一天一个惊喜呢,呵呵。一般来说,我们都希望能知道一个网络链接需要哪些步骤,具体的代码嘛,写法太多,没有标准答案,不同的平台有不同的API,拘泥于一个平台,要被人笑话坐井观天了。
6,当然我还想了解我未来的同事一下数据库的知识,也许在将来的手机或者我们未来的工作平台上能派上大用处,不过MTK目前不支持,我只好做罢。用一些自己也拿不准的问题问别人,多少有些小人之心。