机器 – 程序 – 人

原文链接: http://www.cnblogs.com/jamesleng/archive/2011/12/05/2276450.html

 “Write Programs for People First, Machine second” Steve McConnell, <<Code Complete>> 2th edition, 34.3

所谓“People First”,Steve说的是程序的可读性最重要。Steve就此阐述的认证要点主要是程序的维护成本较高这一点。对Steve的这个观点,我是很认同的。不过,我觉得Steve的观点较狭隘,我想顺着其内在逻辑扩展一下:一个程序应该优先考虑程序员的感受,其次考虑机器的。而提高程序的可读性无非是体贴程序员的具体途径之一而已。另外,除了Steve所提到的“People First”有利于降低程序维护成本这一点之外,在我看来,“People First” 这个理念对整个软件行业的发展具有极为重要的意义。这个理念无疑是引导软件行业发展的方向之一。而且事实上,在软件改变世界的伟大进程中,通过“People First”这个方向上的进步所发挥的巨大作用是不可或缺的。因为按照经济学常识,财富来源于生产效率的提高,而在软件行业正是通过“People First”才极大地解放了软件开发的生产效率。

Steve的观点中隐含着一种对程序进行分类的思考,如前所述,按其内在逻辑,大致可以将程序分为以下几种:

  1. 对人友好的程序。指体贴程序员的程序,如Steve所说的可读性较好的程序等。
  2. 对机器友好的程序。指体贴机器的程序,如性能高,耗用资源少,健壮性高的程序。
  3. 既对人友好又对机器友好的程序。
  4. 对人和机器均不友好的程序。

那么,如何才能写出对人友好的程序呢?

在Steve看来也就是如何提高程序的可读性了。就此Steve概括了以下一些要点:

  • Good class, routine, and variable names;
  • Careful formatting;
  • Small routines;
  • Hiding complex Boolean tests in Boolean functions;
  • Assigning intermediate results to variables for clarity in complicated calculations;

So far, So good……

如前所述,提高程序的可读性仅是体贴程序员的具体途径之一而已。我觉得这个领域的关键在于:让程序员按人的思维习惯来写程序,而不是机器的。由此,OO也就自然而然代表了这个领域的发展方向了。因为OO的诞生显然就是为了体贴程序员,而不是机器。事实上,机器是压根就不知道OO的存在的。无论是虚拟机还是具体机,机器只知道机器指令而已。甚至Process,Thread,Stack, Heap这些东西也是OS或开发库提供的抽象,也不为机器所知。也就是说,OS为了体贴程序员也是下了不少功夫的。当然有些编程领域,是压根就不能考虑使用OO语言的。如此一来,就杯具了,这时也就只能指望Steve概括的那几招了。实在不行,就只能写点注释了。问题是,为了理解一个程序,就不得不看注释。这还是体贴人的程序吗?

如何才能写出对机器友好的程序呢?

Steve对这个话题并未涉及。我觉得这个领域的关键在于:让程序员按机器的思维习惯来写程序,而不是人的。多年来,一直存在一些C/C++程序员自以为技艺高人一等。这些人虽显得浅薄无知,但是其论证的论据还是站的住脚的,也就是C/C++程序员需要关注一些底层的东西,也就是机器世界的那些东西了。其实,真正直面机器世界的程序员也就只能耍Assembly了,与之相比,C还是朝体贴人的方向上迈出了较大的一部,我想这也是C能成为伟大语言的原因之一吧。至于C++就更不用多说了,因为它已经是OO语言了。从根本上说,不同语言的Complier会在不同程度上对机器世界的那些东西进行抽象,目的就是为了体贴程序员。如此一来,使用不同语言的程序员需要掌握的机器世界知识也就不一样了,最底层的一头是Assembly,另一头无疑是各种DSL了。如果掌握机器世界的知识多一些,自然是有利于写出对机器友好的程序了。不同场景,不同编程环境,对机器世界知识要求相差太大。好在绝大部分程序员面对的环境好歹都是有一个OS的,而且一般还有比较体贴的开发库。大体上,如果弄明白Process,Thread,Stack, Heap,IO等OS提供的抽象,对提高程序的性能,健壮性和少耗用资源还是颇有帮助的。否则,就只有把自己想象成机器,并祈求主的保佑,不要被机器同化了。

有没有既对人友好又对机器友好的程序呢?

从编程语言的发展史来看,很明显就是一个不断体贴程序员的过程,这个过程无疑是以牺牲一些性能和计算资源作为代价的。但是程序的健壮性却是有一定程度提高,特别是Java和C#这类强类型静态语言。当然,回到本文的开头,“People First, Machine Second”并不意味着放弃对机器的体贴,只是把优先体贴程序员作为原则而已。之所以行得通,是因为硬件发展得够快,从而弥补了这种原则的负面作用。

至于对人和机器均不友好的程序,不用说,从60年代软件危机以来,整体改善并不明显,原因主要是程序越来越多了,也越来越复杂,程序员也越来越多了,糟糕的程序员自然也增加了不少。对OO不以为然的人一向不少,一些牛人向来有嗜好把程序写的既难以理解又问题一大堆。这些人对机器世界的认知又会高明到哪去呢?

总之,“People First”就是把体贴人作为第一原则,Compiler诞生才60年,OO诞生才40年,OO成为主流才20年,DSL近几年才进入应用阶段,我感觉这个方向上的进步是不会有尽头的,因为人人都知道人的潜力本身就是无穷的。

转载于:https://www.cnblogs.com/jamesleng/archive/2011/12/05/2276450.html

猜你喜欢

转载自blog.csdn.net/weixin_30252155/article/details/94786460