刘远亮 2013年07月12日 星期五 07:11 | 1604次浏览 | 0条评论
这本是为公
软件编程里最重要的是什么?我说是讲故事。大家听我这么说,很多程序员恐怕会纳闷。为什么是讲故事,什么是讲故事。
Dijkstra说“把这门学科叫做计算机科学(Computer Science),已经给这个事业带来了无可挽回的巨大伤害,它给人误解,以为这门学科就是研究计算机的科学。把它叫做计算机科学,就好像把脑科手术叫做刀子的科学一样。” 今天,我们已经可以清晰的看到这无可挽回的巨大伤害。
Python作者Guido说,他发明python的目的就是要做一门让人人都可以编程的语言。因为他认为,编程是另一种比写作更高形式(或者说更深层次)的思想表达工具。以前的知识主要通过写作表达出来并传递下去。但编程是更好的表达方式,可以表达更多更深层次的知识。一个编程者通过编程将其对某一个领域的专业知识和经验表达出来,做成软件。其他人通过使用阅读这个软件,去获得这个领域的专业知识和经验。Guido说,编程能力在以后将成为文盲的标准。在软件越来越扩大到社会生活各个方面的今天,我们也看到越来越多的人开始意识到,编程能力应该是每个人都具备的基本能力,越来越多的网站开始教普通人如何编程。
Bill Joy说,他在第一次接触软件编程时的那种非常美妙的感觉,看着思想从大脑流出来变成实际的东西,“give ideas a concrete form”。这是他对软件编程倾心的原因。这也是我第一次接触编程时的感觉,是一见钟情的,立即知道这是自己一生的兴趣和喜爱。每个人的一生会喜欢很多东西,大多数都只是一时的。只有极少数的东西,是你会喜爱一生的。你应该努力找到这种东西。软件是连接社会人文科学与自然科学的桥梁,或者说连接人类世界和物理世界的桥梁,这是让我觉得如此着迷,喜爱一生的原因。
好,讲了这些,你应该明白为什么说软件编程就是讲故事了吧。
我过去曾经维护和继续开发过一个他人开发的项目。看得出来,开发的人是个不错的C语言的编程者,但用Java编程,整个代码一团遭。要看懂一个地方,必须要看另一个地方,然后又必须再看另一个地方。整个代码完全缺乏OOP的设计,完全没有一个故事讲出来。我可以理解程序员在编程和设计的时候,需要考虑很多方面的因素,顾此失彼是经常的。所以需要强调最重要的是讲故事。其他的各种考虑也都有其优先级的顺序。
我曾经和一个很好的编程员一起共事过一段时间。他写的代码,其他人阅读,很容易阅读。就好像读文章一样,娓娓道来,该在这个层面这个模块里说清楚的事,绝不会到另一个层面里去。这是种很具体的感觉,就好像好的文学作品给你的那种感觉一样,语言很难准确的传递那种感觉。他很同意我说的编程就是应该讲故事。并说OOP设计是需要一生的反复实践去提高的,他自己也还在不断提高。当然,那是Java横行的时代,OOP几乎就代表了所有的设计。
这里多讲一个故事,我们再具体的讲讲如何讲故事。
在一所很美的大学里,我曾经每天都会在路上欣赏其美丽的古典的建筑。有些东西是简单的,包含的元素很少。比如街灯。但透露这简约的美,并没有故作姿态的弄得很复杂。而那些教堂式的建筑,你远远一看,就知道包含很多的元素,但并不给你凌乱的感觉,让你看着很舒服很安心。你一瞥之下,就知道其有哪些部分组成。你可以看其每一个部分的细节,每一个部分又都是相当完整和相对独立的,有其明显的边缘和内部的复杂度。这么许多的元素组合在一起,构成了整个大教堂式的建筑。它本身是复杂的,但是好的设计,使其拥有本身的复杂度的同时仍然优美,讲述的是一个优美的故事。我认为在软件编程的时候,应该同样的有这样的感觉。该简单的东西简单优美。复杂度高的东西能够仍然一瞥之下就明白是什么,有什么,看着很舒服,对每一部分又可以深入作为一个整体来看。而不是一瞥之下,一片凌乱,不知道要表达的是什么,想传递的是什么。
我想讲到这里,你可能也开始有些概念,如何去讲故事了。本来简单的东西,不要添加额外的复杂度。去不掉的复杂度,努力让其得到好的呈现,好好的讲一个故事。这就是常说的“Keep it simple. As simple as possible, but no simpler.”的意思。
再讲几个具体的指标和方法。Python有interactive console。好的代码设计,应该是其他开发者可以在interactive console里可以自由的和你的代码库交互,可以玩起来。这里就包括基本不用再看你的代码,就能够直接在console里玩你做的那些objects。你的命名是否直观自然,是否能让人能够基本记住,是很重要的。设计的时候,这应该是个目标。而现在restful的url设计,基本也可以让人在浏览器的地址栏里就方便的玩起来。
当复杂度不能再减时,如果都放在一起会超过普通人大脑能够很快接受的能力时,就要考虑分层或者分成模块。而这些层次或者模块,一般本来就是这个有比较高的复杂度的事物自然拥有的层次或模块。这里面每一个层次或模块都应该有其概念的完整性和相对独立性。让人只在这个层次里玩,就可以玩清楚这个层次能做什么,如何玩,而不需要考虑上面一层或下面一层的事情。你在这一层或这一模块玩清楚了,掌握了,可以到其下一层或上一层去玩。这样其他人能够很快的学会如何玩你这个系统。
我这里特别强调这种玩的感觉。要能让其他开发人员可以玩起来的话,就算成功的设计了。如果其他开发人员总要不停的倒回去看你的命名是什么,那就很难玩起来。要做到其他开发人员基本不用回看,就可以用各种方式来玩你的库代码。
以前有文章说我们人脑能同时放下的东西不超过6个。这大概可以作为一个rule of thumb。不要在一个层次或模块里给人的信息量超过这个数量。如果超过了这个数,就要将其分层或分模块,让每层和每个模块的信息量都低于这个数。这也是在python console里你打import this时出来的那首The Zen of Python诗里告诉你的“Sparse is better than dense”。这样当你面对一个复杂度很高的系统时,你也能够尽量的包容这些复杂度,让它们仍然能够以一种美而不乱的方式呈现出来。当然复杂度越高,对人在这方面的设计能力也就要求越高。
软件编程人员在职业生涯里会阅读到很多的编程的规则。这些规则其实在使用过程中都是矛盾的。你需要知道的是什么是更重要的,和在具体场景里的灵活运用。这就是我说的“玩的原则”,其中包含很多具体的原则,以后有时间再撰文讲述。在这里,我想你只有记住首要的是讲好故事,应该就够了,你就知道如何去处理那些规则的优先顺序了。
The Zen of Python诗里有这么两句:“If the implementation is hard to explain, it's a bad idea. If the implementation is easy to explain, it may be a good idea.” 我也一直认为开发人员对自己的代码,首先要能够用简洁的语言讲讲这个代码的故事。
我们早期的编程里,更多的是在机器上的编程,讲究的更多的是如何在机器上跑的更快。但随着软件越来越接近人,或者说越来越接近软件的本质--人的思想的表达,尤其是互联网的发展,人机交互越来越多,并且规模越来越大,呈上亿级别的规模。这样,软件如何对人友好,让人能够更快的明白如何去交互,去玩,才是最重要的。而互联网上软件开发非常讲求时效(其实也是人的不断变化的本质决定的,以及互联网产品一般是对新的社会领域的探索也决定了必须是不断的随着认识的深入而更改软件),也要求开发人员能够更快速的对代码进行更新迭代。这些现在也都慢慢成为大家的常识。所以慢慢的软件其本质开始突显出来,软件编程人员能否讲好故事,是至关重要的,是软件效率中最重要的一环。
另外软件开发中,我们一开始尽量快的达到完成任务的目标。目的是因为很多需求我们一时无法摸清楚。只有软件出来了,在使用的过程中,才会发现更多原来不了解的地方。而快速的完成功能目标,并不是放弃对本质的理解和对设计的追求。在了解更多需求,对本质更加清晰的时候,需要再把这些新的理解融入到软件中去。这样比在一开始就力求完美,花费很多的时间纠结在一些细节上面,在整体上应该是会减少很多的时间,是更顺畅的道路。也是no thinking原则的运用(关于这个,以后再专文讲述)。这也是python设计成功的地方,可以让我们按我们的需求自由的去玩。而不是一定要在一开始就把所有的都设计完全。其实这里所说的这个原则适用于任何事情。不管什么资源什么方法,只要能最快的获得答案,减少未知的,就赶快去做去试。但不要满足于答案的获取和暂时问题的解决,而要在获得答案和暂时解决问题后反思,总结整体的经验,获得本质的认识。
软件是思想的表达,也是探索知识的工具。这是Guido在他那篇Computer Programming for Everybody里面所谈到的。因为这门学科被错误的叫做了计算机科学,给很多人带来了误解,包括在这个领域从业的人。而在今天软件互联网化,更接近人的核心的时代,我们需要更加强调软件表达思想的本质。当然软件开发人员除了讲故事的能力,表达能力之外,也需要很硬的技术功底,掌握多门的技术,良好的数学和硬件的基础。这也正是软件编程这个工作象Bill Joy所说的让人着迷的原因。其是人文学科和自然学科之间的桥梁。软件开发人员在承受巨大的知识能力挑战的同时,也享受着其他行业享受不到的巨大福利和快乐,成为更完整的人,走在时代的前面首先成为具有用软件表达思想能力的人,成为拥有力量用软件改变世界的人。也许这是cursed blessing, 但确实是种blessing。更不用说软件是人类历史上出现的和以往技术不一样的科技,将在我们的手中实现人类几千年来就有的美好理想。而这一切,现在只是开始。
软件编程里玩的原则,上面提到了一些。以后可以专门讲讲。还有软件编程就是创造生命的过程,以后也会专文讲述。
Zeuux © 2024
京ICP备05028076号
暂时没有评论