天若有情

到教堂忏悔,愿主安抚我罪恶的心灵......
posts - 4, comments - 35, trackbacks - 0, articles - 24
发信人: AtomAndBit (原子与比特), 信区: DotNET
标  题: 从招聘的角度谈程序员应具备的能力
发信站: 水木社区 (Mon May 23 22:44:14 2005), 站内
昨天写的,觉得写得不怎么样,没敢发。今天索性发了吧。别笑俺。
从招聘的角度谈程序员应具备的能力
今天实在太晕了.这几天面试了3个人了,这3个人都是科班的,一个大专,两个大本,大本中
的一个还考上了软件工程硕士.我的考题很简单,就是写一个类,计算平面中2点间距离,注
意类的设计和编码风格.我晕,一个都没写出来!第一个人不知道两点间距离怎么算.第二个
人写出来这样的东西:
Class Distance
{
        double distance = ......;
}
这也叫类,真服了.
第三个回答更干脆,不会.他用c用的多,我让他用c写一个.写出来这样的:
int Dis
{
        d = ......;
}
不传参,不return.
真郁闷,这究竟是什么世道.感叹之下,感觉需要写一些东西,从招聘者的角度谈谈程序员(
中国程序员!)应该具备什么样的素质,希望对即将踏上程序路上的人或刚踏上的人有点帮
助.
一般来说,单位招聘人都有一个定位,一般可分为售前,技术支持,项目经理,系分,高级开发
人员,一般开发人员.咱就不谈售前,技术支持,俺在这方面没话语权。招项目经理关键是
信任,对个人项目管理能力还有对个人自身做人的信任,这个谈起来江湖成分就比较多了
。系分的关键是对业务和技术两方面的理解能力,还有沟通能力,这个俺也没资格谈,因
为俺不是合格的系分。俺就从俺的经历谈一下高级开发人员和一般开发人员所应该具备的
素质和能力。
什么是高级开发人员。俺这么认为,给一个某个方面的需求,高级开发人员应该是能够提
出一个有效的解决方案,能够独立或者带几个人实现这个方案的人。这个需求不是项目级
别的需求,而是更具体一些的问题,比如关键类的设计,关键服务的设计,根据需求设计
对数据库进行逻辑设计和物理设计等等。这种人应该对某一领域的技术知识有很深入的了
解,对程序执行流程有很深入的理解,还应有阅读文档、撰写文档的能力。一般开发人员
应该能够在高级开发人员的指导下,能够编写规范的代码,能够完成代码的实现与部署。
俺从2个故事谈起吧,俺经历过的。当然,这些故事中俺也有问题,俺就不在这里做自我
批评了。
第一个故事,1个哥们。C#还行。一次俺交代了一个任务,尽快做出一个只有2-3个页面
小网站的Demo。然后俺就去玩我自己的去了。过了两小时,俺估摸着差不多了,去看看,
还在干呢。又过了1个小时,俺再去看,刚弄好一个页面。俺一看代码,吓偶一跳,虽然
只有一个页面,但是类就有七八上十个。他用上了领域模式!!实体类都搞了好几个。问
为什么。他说他刚看过一些网上优秀项目的源代码,觉得别人写得特别好。问题是,他看
的那个网站数量级和俺要求做的这个是一样的吗?俺还只要做Demo,就用上了领域模式,
只因为这是好的设计。结果他爽了,俺不爽。第一,问题没解决,第二,进度太慢。俺才
不关心Demo的性能、可扩展性和可维护性呢。这样的人,在工作中,只能当一般程序员用
,就不能当高级程序员用。
第二个故事,这次是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的能力。你不对方案的优缺点掌握,
就不会总是选择出好的方案。具有方案选择能力的人和不具有选择能力的人不是一个量级
的。