• 2005-12-06

    差异程序员

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/1676755.html

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

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

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

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

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

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

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

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

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

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

    分享到:

    历史上的今天:

    引用地址:

    评论

  • Java和C++实在是剑宗与气宗的差别。
    回复lonelyfox说:
    各有所强!
    2005-12-14 08:50:14
  • 一个团体规模一大就会分化,分工合作才是王道,当然其间的复杂性也会增强,不过这就熵增,是必然
    回复andjia说:
    怎样发展还取决于个人的想法。
    2005-12-14 08:49:27
  • 我认为从人性上说,人们讨论和思考的问题通常是当前碰到的或者未知的问题。在实际工作中,为了某些指定的工作他需要去研究一些当前碰到的问题,去研究层次设计、模块封装。对于书本上提到的算法和数据结构对于很多程序原来说是已经知道(C++程序员)。对于很多程序员来说不需要知道(Java)因为有很多东西能够实现这些功能。很少人会去对一个已经了解的东西去一直研究。所以,这些基本的东西反而不被关注。就像huangyi所说,最终基础算法程序员和应用程序员也许会变成两种职业。
    回复Janhail说:
    分工是必然的,社会发展的历史已经为我们展现了分工的好处。实际上,任何问题的细究都需要相当的时间和精力,并不是每个人都愿意自己弄清楚所有的问题。程序员的分化给了不愿意了解底层问题的人一个机会。当然,想成为一个好的程序员,弄清楚底层机制还是大有裨益的。
    2005-12-14 08:48:30
  • 我想随着组件技术越来越成熟,工具越来越简单,程序员变成两种,一种领域专家,一种科学家.

    前者可能比后者多很多.

    而以后软件开发越来越简单,对软件智能化的需求就多起来,而人工智能,数据挖掘等技术越来越成熟, 我想第二种程序员也需要不少.

    这两种程序员之间可能不需要怎么交流,就象两种行业,因为组件技术的成熟,标准的建立,工具的成熟.
    回复huangyi说:
    或许命名不是很恰当,但意思是对的,关键还在于自己走了哪一条。
    2005-12-09 08:56:09