• 近距离的感受了一次大学生找工作难。

    周末回了趟家,一个邻居阿姨带着儿子来串门。她的儿子是今年的应届生,学的是计算机,距离毕业还有四个月左右的时间,工作还没有搞定。来访的目的很简单,看看我能不能帮上什么忙,毕竟我现在所在的公司还有招应届毕业生的习惯。如果可行,我还是愿意帮这个忙的,因为内部推荐一旦录取,是有奖金可拿的。

    这位阿姨一开口,就向我介绍了一大堆她儿子的优点:做过学生干部,组织能力强,已经是预备党员等等。本着对人对己负责的态度,我问了几个问题。

    “你想做什么工作?”
    “我想做管理工作,说实话,我对编程不感兴趣。但是我的专业限制了我只能从编程干起。”
    “你的一些基础课学得怎么样?比如数据结构。”
    “我们大三学的Java,我对Java有一些了解。”
    “那你对面向对象有多少了解?”
    “我只会用一些基础类,对于J2SE还不是很了解。”

    不知道看了这些对话,您会做何感想。至少给我留下的印象不太好,对编程不感兴趣决定了他不会成为一个很好的程序员,答非所问,证明了他的基础不够扎实。后来,我试图引导他正确的理解并回答我的问题,我的尝试失败了,他根本不明白我的意思。

    为了找份工作,这位阿姨和他的儿子没少费心。为了增加工作经验,这个小伙子在一个公司内实习了一段时间。这段实习不但是分文不拿,而且三个月下来花掉了一万大洋,结果,依然是如今这样,几乎一无所知。去年,我做了一次招聘考官(20050129),那些应届毕业生给我留下的感觉非常不好。这次与这位阿姨的儿子交流,更加加深了这个印象。

    人们都在感慨大学生越来越不值钱,可如果大学毕业生不能用自己的实力作证,想值钱也难。与其说这是某个人的悲哀,不如说是中国教育的悲哀。原本严进宽出至少还可以在入口把把关,现在扩招的结果是,连入口都松了。

    良心发现,我给这个小伙子一些简单的忠告,比如,加强一些基础知识的准备,给他的简历提了一些修改意见,比如突出一下与应聘职位相关的东西。剩下的,我只能祝他好运了,至少他的表达能力还不错。

  • 还有什么比休息更让人愉悦的事情呢?尤其是在辛苦之后。休了两个星期,如果中间没有春节,也许就更完美了。要知道,大规模集中的“走亲访友”是一件很浪费时间的事情,所以,虽然休了两个星期,但感觉上,自己好像没怎么休着。没办法,尊重传统吧!

    年后上班的第一天,最让我吃惊的新闻来自Borland。Borland居然要卖掉其赖以成名的IDE产品线。这意味着,也许从今往后,我们耳熟能详的Delphi、JBuilder等产品便要与Borland无关了。从感情上来说,这是一件令人难以接受的事情。让我走入编程之门的是Borland的Turbo Pascal,而Turbo C是我很长一段时间的最爱。初学Java时,我的首选IDE是JBuilder。想必许多程序员朋友和我一样,可能现在手头上用的不再是Borland的工具,但对Borland却有着一份难以割舍的感情。几年前,李维先生写了一部《Borland传奇》,为我们揭开了Borland神秘的面纱,一个个传奇故事展现在我们面前,一个个软件英雄的形象在心中高大起来。那是我为数不多的短时间之内连读两遍的一本书。

    不得不承认的是,最近这些年,Borland的IDE给人一种江河日下的感觉,倒不是说它的产品质量如何如何,只是那个IDE商业大战的年代已经越走越远。在两大主流战场上,微软牢牢把持着.NET这块大饼,Eclipse凭借开源的优势占据了Java的山头,留给Borland的空间越来越小。我们看得出Borland在努力,努力扩展它的业务,将自己的势力范围扩展到整个软件开发周期中。作为一件商业公司,Borland也需要赢利,抛弃赢利能力不足的部分,在商业上无可厚非。

    许多程序员对于自己喜爱的语言或工具往往有着宗教信仰一般的追随,Borland用20多年的时间,打造出了一批忠实的追随者。Borland放弃IDE对于这些追随者来说,是一件痛苦的事情。心中的Borland,是那个开发IDE的Borland。也许从此,我们需要把原本一个的关注点一分为二,一部分追随Borland,一部分追随那些IDE明星。愿Borland能如其所愿,持续发展,愿IDE们在新的环境中继续茁壮成长!

  • 2006-01-18

    时间与质量

    无论是流言蜚语还是亲身体验,时间总是与软件开发过不去,很少听说哪个项目拥有充足的时间,等待我们的似乎只有拼命的与之赛跑。有时,项目到我们这里时,最后期限便已经确定了下来,至于项目中究竟有多少内容,能否如期完成,没人真正关心过,而且通常是时间不够用,所以吃亏的肯定不是制订期限的人。

    曾经,我畅想做一个宽松的项目,但后来,我告诉自己,这是不太现实的。假设真有这样的机会,那在制订项目计划的时候,除了必需的工作时间之外,我们还应该将一些缓冲时间考虑进去,以应对难以预知的一切。拿到这样一个时间表,你会做何感想。由于站的角度不同,我们会下意识的忽略缓冲时间,于是,我们认为时间充足。既然时间尚早,我们便不会着急动手。等神游归来,时间不知不觉已经逝去许多,原本充裕的时间也变成了紧张。这种感觉很熟悉吗?我读小学的时候,我和许多同学在假期作业的问题上经常面临这样的尴尬。项目负责人们估计都很清楚这一点,于是,干脆取消了缓冲时间,甚至在时间表上压缩必要的工作时间,给人制造出一种压力,以防止心理上的懈怠。

    时间表上的时间是固定的,但实际的时间却是稍有富余的,因为正常的工作时间一周只是40个小时而已,于是,加班成了一种让时间表看上去很美的选择。为了早日脱离加班的苦海,程序员们必须尽快的完成自己的工作,正所谓“上有政策,下有对策”,时间的压力会使我们放弃一些东西,一种常见的选择便是质量。

    有过一些编程经验的人应该知道,实现同样功能的代码可能是千差万别,所以,才会有所谓高手的说法。《面向对象软件构造》教导我们说,软件质量分为内部质量和外部质量。站在用户角度,他们关注的只是外部质量,只要用起来感觉一样,他们不会介意内部质量的。既然外部质量容易为人察觉,那么时间压力让我们放弃的便是内部质量。对于软件开发人员来说,内部质量却是一个很关键的因素。除非你打算过河拆桥,做完项目便撒手不管,否则,差劲的内部质量会让未来的自己倍受折磨。但是,这种问题在短期内很少暴露出来,却是对项目的一个长期伤害。《程序员修炼之道》讨论过破窗户的问题,我也曾《体验破窗户》,而时间压力就是一个很好的产生破窗户的理由。

    我们是唯美的程序员,我们不愿意编写令人作呕的代码。时间啊!别逼我们!

  • 2005-12-22

    招聘广告

    岁末年初,正是人心思动的时候,于是,招聘工作如火如荼。

    前两天,一个朋友给我看了一份他起草的招聘广告。说实话,我这人最看不得招聘广告,因为我觉得那些广告是对我自信的严重摧残,之所以这么说,是因为那些广告上要得分明都是些高手高手高高手,基本上属于上知天文下晓地理中通人和,上得厅堂,下得厨房。单就满山遍野的“精通”、“熟练”就足以让我心里没底了,按说我学习编程也有些年头了,掰掰手指头,还真不敢说自己精通什么,而且随着自己了解东西的增多,越发不敢说精通了,因为觉得自己太不懂的东西也越来越多。

    曾经,我对招聘广告中的年头要求颇有微词,因为在我看来,很多工作了很长时间的人并不一定比年头短的人优秀。后来,我逐渐认识到年头在个人发展过程中还是起到了相当的作用,想想现在的自己,比起刚工作那会,许多方面都得到了提高,有些东西确实需要经过长时间的浸泡才能认识得比较清楚,技术是一种。《Teach Yourself Programming in Ten Years》(中文版《10年编程无师自通》)说明了一些道理。以个体论,年头长的不确实不一定优于年头短的,但从整体上来说,这却是一定的,这就是统计的威力吧!

    以前,我总是一厢情愿的认为,在应聘过程中,个人往往会夸大自己的能力,比如装个Linux就说自己精通Linux,写过“Hello,World”就说精通某某语言,CSDN上的两篇关于招聘广告的新闻让我知道了这不是单方面的问题。
    解读招聘广告的4大最常见误区(上)
    解读招聘广告的4大最常见误区(下)

    我不好说是因为用人单位习惯了应聘者的夸夸其谈而在广告“提高”要求,以便让双方都志得意满,还是那些“聪明”的应聘者看穿了用人单位的把戏,提升了自己简历的优美程度,抑或是那些词汇早就不是我所理解的含义,只剩下像我这样的愚者庸人自扰。

    最近还看到了一篇让人心情愉悦的招聘广告,是曹晓刚在JavaParty邮件列表中发的一篇。在这篇广告的最后,提到了数学建模竞赛和挑战杯,这是我没有在其它广告中见到的,让我颇感新鲜。再有,大三那年,撞上了大运,我先后在这两个竞赛中拿奖,这篇广告勾起了我无限的回忆。

  • 2005-12-06

    差异程序员

    云风的《游戏之旅——我的编程感悟》是一本以程序员视角写的书,在众多传道授业解惑的书中,这个类型的书显得有些另类。在我的藏书中,这样的书有三本,王轶男的《编程黑马真言》、梁肇新的《编程高手箴言》和云风的这本《游戏之旅——我的编程感悟》。指望从这种书中获取知识也许本身就是一种错误,虽然不可避免的也能学到一些东西,因为作者的立意就不是教给别人什么东西,只是分享自己的心得,再加上我们实际的背景与作者可能差之千里,所以,看懂字面上的意思就算得上难得了,更何况看透背后的含义呢!但我依然乐于读这种书,品味作者走过的路,体会作者看待问题的方式,顺便开阔一下视野,了解一些不曾了解的东西。

    在这本书的第二章,云风提到了一个问题,今天的许多以程序为生的程序员在工作中感到了理论的脱节,书本上的基本算法和数据结构看似无用。现代编程语言,不再重视程序逻辑的实现和数据的简单描述方法,而注重问题的分化、类层次的设计、模块的封装。

    关于这个问题,我在日常开发中也有一些体会。写过许多程序,却少有需要在算法上需要费些思量的地方,大多数程序几乎可以凭借对软件开发的直觉就能写出来,这种情况下,写程序更多的是在考虑业务问题,而对于计算机知识的关注几乎被压到了最低。我曾经疑惑过,如果这就是软件开发,那么自己学到的计算机知识到底意义何在。借着云风的这个问题,我试着给出一个自己的答案。

    软件开发是为了用计算机解决实际问题,而程序就是一座架在实际问题和计算机之间的桥梁,程序员的使命就是作为一个翻译,用程序设计语言让二者可以进行沟通。从程序设计语言的发展趋势中,我们可以看出,随着计算机基础设施的日益完善,程序设计的中心越发远离了计算机,而更加靠近问题领域:汇编让机器码成为了历史,而C语言让程序员不再理会寄存器,C++让人们更加有效的组织数据,到了Java,内存管理也成了历史,发展中的MDA让有意让模型发挥更大的作用,让现阶段的语言下岗是它的一个努力方向。

    这是一种进步,因为编程的最终目的是为了解决问题,我们很清楚专注的力量,如果能把更多的精力放在问题上,而非其它一些与问题本身无关的内容上,我们可以更快更好的解决问题。像基本算法和数据结构这些东西与问题本身相比,应该算偏计算机方面的东西,随着程序设计的发展,这些已经成熟的内容逐渐被融入到语言/库之中,大多数程序员只要做到了解它们的特长,需要时候拿过来用就是了,完全可以不必考虑具体的实现,这样,精力便更多的放在问题上。实际上,成熟的解决方案应该被隐藏起来,让人们无视它的存在,从寄存器内存到现在的算法数据结构无不如此,现阶段蓬勃发展的是关于设计和架构方面的东西,而在一些UML工具中,我们已经可以看到把隐藏这些东西的苗头。

    不过,程序设计的发展降低程序员的入门门槛,即便对内存管理一无所知,依然不妨碍我们写出一个可以运行的程序,这也为造就软件蓝领打开了一道方便之门,但这也让软件开发失去了许多应有的乐趣,所以,一些抱怨经常会出现在我们的眼前。

    虽然好多人都说,语言是一种工具,但使用不同语言除了语法上的差异,还存在其背景的差异,这样的差异使得程序员在运用语言时拥有了不同的思维方式。Java程序员在看待问题上绝对与C程序员存在很多差异,这一点在我原来工作的部门体现极为明显,Java程序员整天讨论的是架构和设计,而C程序员则关注的是内存和算法。原因很简单,因为这两种语言生长在不同的土壤里,处于程序设计发展的不同阶段,这就造成了二者之间存在迥然不同的思维方式。

    当然,这并不是说后来者就一定比先到者要好。虽然隐藏成熟的解决方案是一件好事,但并不是所有问题都有成熟的解决方案,Intel为我们提供的SIMD(Single-Instruction-Multiple-Data)指令现在就没有对应C/C++解决方案,如果对它有想法,只有操起更低级的汇编语言了。再者,隐藏是有代价的,Java性能低下的江湖传言也不是一天两天了,在一些不得已的情况下,我们只有突破下去解决问题。

    在我看来,如果希望成为一名好的程序员,不但要上得去,也要下得来。隐藏是好的,但一旦出了问题,也许我们不得已要掀开所有封闭的黑盒,而这正是从下起家人的长处,因为他们对计算机本身有着深刻的理解。理解底层技术是不错,但这往往会让人的思维稍微有些受限。在这本书第三章中,云风谈到了Java时,更多的是从技术层面进行剖析,固然这些内容对Java的成功起到了推波助澜的作用,但现在的Java更多的是在软件架构上威风八面。

    不同的程序员却有着相同的称号,或许,这就是让人看不懂的原因吧!每个人有每个人的角色,最重要的是扮演好自己的角色,并不断从别人身上学习有益的东西。