Content Entry

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

Published: 2005-05-25 Categories: Other Tags:
发信人: 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的能力。你不对方案的优缺点掌握, 就不会总是选择出好的方案。具有方案选择能力的人和不具有选择能力的人不是一个量级 的。 -- ※ 修改:·wizard 于 May 24 13:37:09 修改本文·[FROM: 166.111.68.*] ※ 来源:·水木社区 newsmth.net·[FROM: 218.107.131.*]
comments loading