从招聘的角度谈程序员应具备的能力

来源:互联网 发布:mac上照片功能怎么用 编辑:程序博客网 时间:2024/04/29 01:31

从招聘的角度谈程序员应具备的能力

今天实在太晕了.这几天面试了3个人了,这3个人都是科班的,一个大专,两个大本,大本中的一个还考上了软件工程硕士.我的考题很简单,就是写一个类,计算平面中2点间距离,注意类的设计和编码风格.我晕,一个都没写出来!第一个人不知道两点间距离怎么算.第二个人写出来这样的东西:

Class Distance
{
        double distance = ......;
}

这也叫类,真服了.

第三个回答更干脆,不会.他用c用的多,我让他用c写一个.写出来这样的:

int Dis
{
        d = ......;
}

不传参,不return.

真郁闷,这究竟是什么世道.感叹之下,感觉需要写一些东西,从招聘者的角度谈谈程序员(中国程序员!)应该具备什么样的素质,希望对即将踏上程序路上的人或刚踏上的人有点帮助.

一般来说,单位招聘人都有一个定位,一般可分为售前,技术支持,项目经理,系分,高级开发人员,一般开发人员.咱就不谈售前,技术支持,俺在这方面没话语权。招项目经理关键是信任,对个人项目管理能力还有对个人自身做人的信任,这个谈起来江湖成分就比较多了。系分的关键是对业务和技术两方面的理解能力,还有沟通能力,这个俺也没资格谈,因为俺不是合格的系分。俺就从俺的经历谈一下高级开发人员和一般开发人员所应该具备的素质和能力。

什么是高级开发人员。俺这么认为,给一个某个方面的需求,高级开发人员应该是能够提出一个有效的解决方案,能够独立或者带几个人实现这个方案的人。这个需求不是项目级别的需求,而是更具体一些的问题,比如关键类的设计,关键服务的设计,根据需求设计对数据库进行逻辑设计和物理设计等等。这种人应该对某一领域的技术知识有很深入的了解,对程序执行流程有很深入的理解,还应有阅读文档、撰写文档的能力。一般开发人员应该能够在高级开发人员的指导下,能够编写规范的代码,能够完成代码的实现与部署。

俺从2个故事谈起吧,俺经历过的。当然,这些故事中俺也有问题,俺就不在这里做自我批评了。

第一个故事,1个哥们。C#还行。一次俺交代了一个任务,尽快做出一个只有2-3个页面小网站的Demo。然后俺就去玩我自己的去了。过了两小时,俺估摸着差不多了,去看看,还在干呢。又过了1个小时,俺再去看,刚弄好一个页面。俺一看代码,吓偶一跳,虽然只有一个页面,但是类就有七八上十个。他用上了领域模式!!实体类都搞了好几个。问为什么。他说他刚看过一些网上优秀项目的源代码,觉得别人写得特别好。问题是,他看的那个网站数量级和俺要求做的这个是一样的吗?俺还只要做Demo,就用上了领域模式,只因为这是好的设计。结果他爽了,巢凰5谝唬侍饷唤饩觯诙忍0巢挪还匦腄emo的性能、可扩展性和可维护性呢。这样的人,在工作中,只能当一般程序员用,就不能当高级程序员用。

第二个故事,这次是2位,A和B。是Linux下的C++开发。A的C++,Linux狂牛。B的C++,Linux仅仅会用,但是具有一定的领域知识。俺Linux刚会用。因为系统是要给一般人用的,俺想弄一个界面出来。这个任务交给了A。A咣咣咣折腾了1周,出来了1个界面,实现了一点点功能。具体怎么实现的?我的妈呀,底层设计得很庞大,按照他这种设计,到项目结束,他恐怕就做不了几个页面。俺对性能没什么要求,他也知道的,干嘛不用快速开发语言呀。俺只好出手了,俺听说Python在Linux下开发界面很快,俺一边学一边编,搞了一下午,没搞定。放弃,不玩这个,太灵活。俺又听说.net在linux下有个mono,俺也不知道怎么样,一番调研,可行。现学现用,GTK#+mono,安装用了3小时,编程用了3小时,俺就编出来个和他那一样的东东。B呢。B的特点是编的程序错误百出,几乎没编过什么完全正确的程序。但是,B的思路,B的框架是对的,尽管B编的程序跑出来的结果全部是错误的。从我的角度看,B可以做高级程序员用,而A则只能做一般程序员用,尽管A的OS,C++狂牛,而B的狂烂。俺是让A做B的助手,B有什么程序上的问题和需求让A来解决。A自己编的代码,到最后用上的只有2个函数。而B的代码则成了整个框架的基础。

现实点讲,用人和被用的关键就是有需求和有应用价值。就拿第一个故事的哥们来说,你技术倒是锻炼了,但是你解决了什么问题?我不赞成用技术学习的态度去工作。道可道,非常道。能学习到的东西的价值始终是有限的。比如,等你把领域模式学好之后,能够干些大的项目了,但是此时,大项目各方面的工具都很成熟了,建模工具,ORMAP,什么的,别人需要的又是对需求、业务和过程的把握能力的人。你干的活,机器都能干,要你干嘛?能查找得来的东西最没价值。领悟出来的东西才是最有价值的。从用人单位的角度来看,它需要的是能够解决问题。而技术只是解决问题的手段之一。平台是技术的一种。语言是能够操作平台的工具。必须有所区别,有所把握,有所轻重。如果你能够解决问题,你什么技术都不会都没关系。比如一个门,用麻绳缠得乱七八糟,你要进屋必须解开麻绳,费了9牛2虎的力解不开,别人拿一把刀,一下就把绳子剁了。他的解决问题的能力就比你高。你如果理解一个平台的话,你什么语言不会都没关系,你只要能够指挥别人完成你指定的任务就行了。而如果你只会语言,对平台不了解,对问题领域也不了解,那么,你能干啥?茴香豆的茴字有几种写法有什么意义?还有的,过分依赖工具栏肥桥竦模乙材芄慌瘢牵骋惶欤桓瞿就访慌筒恢涝趺窗炝恕

具体来说,我觉得一个一般的程序员应该具备这样的能力:
1,熟悉至少一个工具
2,熟悉平台中的某一块,熟悉一门语言,能够承担一些具体的任务。
3,还得有些基础吧。不能工具玩的团团转,离了工具啥都干不了。连一个最简单的类都写不了。

一个高级程序员应该具备:
1,精通1门语言和1个平台,熟悉多种工具、语言、平台,能够通过对比研究选择合适的方案
2,熟悉OO,UML
3,对问题域有一定的了解,熟悉至少1种软件开发过程
4,比较强的分析问题、解决问题的能力

从学习的角度来说,也不能什么都学习,什么流行学习什么。市场规律最基本的一条就是什么多了就贬值。俺个人的体会是:
1,从流程的角度来学习。比如,你如果从CLI层面搞清楚了一个Hello world程序的执行流程,搞清一个ASP.Net页面的执行流程,了解整个过程中发生了哪些调用操作,就很不错了。
2,从横向的角度来学习。也就是学习平台的结构,了解类库哪一部分哪一部分是干啥的,能干啥,不能干啥,常用的多留意留意。一个平台通了,其它的都很简单。
3,用比较的眼光来学习。俺觉得2个以上类似的东西对比学习效果比较好,主学一个,副学一个,先学一个,后学一个,比如,你学.net,可以适当看看java。windows的看看unix/linux。这样作最大好处是思考问题的思路不会狭窄,不会盲目迷信工具,不会盲目迷信平台,不会盲目迷信,会明白可选工具的优点和缺点,会慢慢培养出一种对解决方案的洞察力,会开始具备决策的能力,具备trade-off的能力。你不对方案的优缺点掌握,就不会总是选择出好的方案。具有方案选择能力的人和不具有选择能力的人不是一个量级的。