James Gosling谈计算机编程艺术 http://www./javaworld/jw-03-2002/jw-0325-gosling.html 2002年3月22日,Bill Venners采访了Java之父,谈论了有关企业软件,算法,用户界面友好软件等话题。
正文:
James Gosling不在布道Java语言的时候,通常躲在Sun实验室的一个安静角落,一连好几天都在思索一些新方式,以协助程序员更好地处理程序的复杂性。 他的书架上还挂着一个里的博格人面具,上次JavaOne演讲中他就带在脸上,在面具的低垂注视下,他对Bill Venners款款道来,话题涉及当前的编程趋势,以及对软件系统设计和构建的看法。
Bill Venners: Java在那么多的手机和智能卡上普及,可是为什么大多数都在用Java编写服务器端的程序? James Gosling: 我觉得这是北美中心论者的观点. 你要是参加北美的会议,处处可闻人们在讨论企业软件。可是我最近去参加欧洲和日本的一些Java会议,没有人讨论企业软件。 Venners: 那他们在用Java做什么? Gosling: 他们关注设备,手机上的编程,以及如何实现端到端系统。如果北美的记者有机会去日本最近的JavaOne会议的话,一定会大开眼界,在那里,基本上没企业 软件什么事儿。到处都是嵌入式系统,实时系统,有些稍显笨拙,有些却十分精妙。他们使用Java,让计算无处不在。 企业软件当然有其精髓之处,但是除非和别的领域沾边,否则毫无意义。企业软件已经被边缘化了,要想有所意义,得有端到端的思想。 Gosling: 不管你在写代码时有没有用到算法,不可否认的是,计算机编程确实是一门艺术。当有性能瓶颈需要解决时,许多人束手无策,毫无办法,他们不理解算法性能的具体含义,他们不懂如何定量地去分析算法复杂度。 很少有人问:'怎样提高程序的运行速率呢'。码农们总喜欢调用现成的APIs函数,封装了一层又一层。有时你会看到深达10层甚至100层的调用堆 栈,不由地呼叫起来,'天哪!'。他们就是一味地在抽象层上垒抽象层,恨不得不断地就这么垒上去。写出来的程序可想而知,复杂繁琐得让人难以理解。 Venners: 你曾说过,那么多人一点算法都不懂,就直接投身到软件开发大军中,这让你倍感惊讶. 你还说,他们编写的程序笨拙而低效,你觉得原因是什么,是糟糕的算法设计导致的?还是他们基于面向对象的设计过于拙劣,抑或还有其他原因?(译注:这种情形在中国也越来越普遍,近年来的很多IT培训机构速造了大量的低级程序员,以及所谓的一些测试人员。但是优秀的程序员,对很多公司而言,还是可遇而不可求) Gosling: 不管是算法设计还是系统设计,这些方面都有问题。低效的算法设计来源于对算法知识的一知半解,比方说啊,你设计动态数组的时候,如何增长数组呢?是每次增 长10个比特,还是每次按原有大小的10%增长?听起来好像是一回事啊,其实不然。若按每次10个byte的增长,加入n个元素的时间复杂度就是 O(n2),但是后者的时间复杂度只有O(n), 你看,高下立判吧 Venners: 那么,编程这门艺术应该能让人们的生活更便捷吧. Venners: 可能是因为里边有太多软件装置的缘故吧。软件这玩意儿,可不能硬拉胡扯。 Gosling: 有一部分是软件吧。还遍布着很多细小的管子,从这串到那,有些司职管理引擎的效率,有些调控空气质量,反正它们包办一切,不用再劳你身架了。再者,现在的 汽车完全是自动型的,人们只要钻进去,启动,就开路了。而不像以前那么麻烦,比如像这样,'喂,外面有40度啊,我得预热下发动机,还得把熄火装置放身 边, 你别一味加油了,空气有点潮湿,没必要再加了.',可不是忒麻烦。 大多数人才不想管发动机罩后的事情呢。他们只关心达到目的地。类似的,人们只关注自己的业务,才不愿纠缠什么软件问题呢。 Venners: 你以前说过,Java被设计用于分布式的可靠人机交互软件系统。我知道Java的架构有助于实现可靠的分布式系统,但是Java是如何帮助提高人机交互体验的。 Gosling: 很多是语言的API层在作用,但如你所见,大部分还是语言的底层部分的功劳。你提到的很多其他方面也有利于改善用户的使用体验。 举个例子,经常崩溃的软件当然用起来很不爽。而依赖于机器CPU的软件系统则更难使用。软件零售商将软件的苹果版本和PC版本分类摆放,其实本身就是整个 市场结构的大错。而在日本,人们在不同的CPU和不同的操作系统下,生产了很多Java手机,但他们之间的软件都能互相移植。比方说你想装一个俄罗斯方块 游戏,那就装好了,可移植性为用户带来了莫大的便利。 Venners: 您曾说过,打造一个高度灵活适应的编程系统是你毕生的追求。而我在编写系统的时候,团队成员经常会提出程序适应性的问题。有些 会增强程序的适应性,但复杂度也随之增加. 当你在编写软件的某一模块时,你是如何在适应性和复杂度之间权衡的。 Gosling: 这个就是体现计算机编程艺术性的地方了。向程序添加一部分代码,当然会增加程序的复杂性,可是如果你不加呢,用户用你的软件时就会繁琐得多。精力守恒定理 适用于此,你投入到程序中的精力越多,用户使用时遇到的麻烦和折腾的精力就会越少。程序员做的,正是在开发端和用户端之间尽量平衡开发和用户的复杂度。 Venners: 有人问过你对开发工具有何看法,当时你回答更愿意和程序的复杂性做搏斗,你喜欢程序复杂性的哪一部分呢?
|
|
来自: diandianxingk > 《待分类》