软件是什么?----当我们谈论敏捷的时候,我们在谈论什么

敏捷的思想方法何其多,真是乱花迷眼,难以把握。一直想写些文章,给大家好好的介绍敏捷的思路,应该如何理解敏捷和实施敏捷。结合大家的目前的实践,觉得真正的核心和理解的难点是对软件的理解。大家对敏捷感到难以理解和把握,其实是缺乏对软件的理解。搞清楚了软件是什么,那么如何理解敏捷,如何实施敏捷就自然的清楚了。所以这篇文章给大家讲讲我个人理解的软件是什么,并初步的带出来我对敏捷,对软件开发和管理这些方面的系统的知识。

软件到底是什么?发明最短路径算法的Dijkstra说“把这门学科叫做计算机科学(ComputerScience),已经给这个事业带来了无可挽回的巨大伤害,它给人误解,以为这门学科就是研究计算机的科学。把它叫做计算机科学,就好像把脑科手术叫做刀子的科学一样。”今天,我们已经可以清晰的看到这无可挽回的巨大伤害。

人们现在对软件编程的理解,普遍还停留在“就是在计算机上写代码的人”。所谓的“码农”,是程序员对自己地位处境的一种自嘲,是很形象的概括。代码男,理工男,是人们普遍的对程序员的印象。常流行的说法是,“我们一切都筹划完备了,就差一个写代码的了”(见知乎上搜索就差一个写代码的了)。绝大多数人包括很多程序员自己都认为只要花钱找一个懂技术的把设计好的东西做出来就可以了。在软件公司里,常有产品人员和技术人员之间在理解和沟通上的鸿沟,产品认为技术人员不懂业务不懂产品。技术人员认为产品人员不懂技术,逻辑思维不行,设计出来的东西逻辑都不通,缺乏逻辑思维能力。而技术人员往往表达能力奇差,对产品和业务都缺乏兴趣。代码结构很差,讲不清楚故事,对于理工之外的其他思维方式太过于陌生。大家对软件工程估期的种种困惑。程序员总觉得为什么受伤的总是我,背黑锅的总是我。我的职业经历,见过了太多的软件的遭遇,很多在我看来实在是软件的耻辱。如此种种,可以说“罄竹难书”,恕我在这里不一一列举了。这些都和我们把这门学科当作是计算机科学有关。这种理解对这个行业的伤害,太大了。

软件到底是什么?软件学科到底是一门关于什么的学科?这是个什么样的高科技?

我在高考前填志愿时,两个选择,一个是计算机科学,另一个是生命科学。中学生都在封闭的校园里,很少接触社会,所以我对这两个学科都没什么概念。一开始计算机科学放在第一志愿。但后来有人说生命科学才是最热门的专业。我这样填反了。我当时也觉得计算机好像太小了,难道这辈子就搞那个小电脑去了?(可见计算机科学这个命名对我也产生了误导。)相比之下,生命科学自然是更加高科技,科技含量更高,感觉领域更大。心想既然上大学,就学个难的。于是同意把生命科学放在第一志愿,计算机科学放在第二志愿。

就这样,我进入了生命科学系。这个专业对计算机的硬件和软件也是要求学得比较多的。在大一上软件编程课的时候,我对软件编程一见钟情了,才发现这才是我真的一辈子想从事的工作。看着头脑里的想法可以转换成代码并且能够在机器上跑,并有结果出来,实在是一种非常美妙的感觉。几年后,我在美国学习软件编程的时候读到过可以称得上是互联网之父的BillJoy在描述他第一次编程的体验的时候,发现他的感觉和我惊人的一致。他说也是那种“give ideas a concreteform”(给思想一个具体的形式)那种美妙把他深深吸引了。

在高三的时候,已经大学毕业工作了几年的哥问我,想学什么样的专业。我不知道。(可怜的中学生!)他说,你看你是对物理的世界更感兴趣,还是对人的世界更感兴趣。我觉得这问题挺怪,还有谁只对物理世界感兴趣而对人的世界不感兴趣吗?人不是要在这个人的社会里生活的吗?怎么可能对人的世界不感兴趣只对物理世界感兴趣,这样的人生太没意思了。我其实是虽然家里理工背景自己也数理化一直挺好,但实际上从小就更喜欢文学喜欢故事的人,虽然这种喜欢不为人所知。选专业时没提,一是觉得过于突兀自己也吃不准,一是觉得上大学就要学点难的。

而我对自己的未来的工作其实当时是这样想的,我希望能每年就换一个工作。我希望去尝试不同的行业,体验不同的工作。我觉得人生有限,一定要去尽量丰富自己的人生。

所以当我看到自己写的代码能够运行并出结果,而且自己好像还挺擅长这个,很快脑袋里就能有算法然后把程序写出来。不停的想不停的写不停的能有结果。我意识到我找到了人的世界和物理世界的桥梁,人文学科和自然学科之间的桥梁。而且这个学科可以让我在职业上去不断的尝试新的行业,体验不同的行业。我认定这个才是我一生所要从事的。

当然学习生命科学对于我其实也是很大的裨益,很多工科学习(大概除了土木不用学以外,其他工科都要学,因为只要能用到人体上的都要学),需要应用到很多数学,作为基础学习,是不错的基础。这些对于我未来做软件编程还是有帮助的,尤其是关于生命科学的学习对我理解软件编程启发很大。学的时候兴趣也很大,尤其对大脑和基因学感兴趣,但是作为长期的职业选择,则很不喜欢一辈子都在实验室里工作。这是和软件编程不一样的。学习生命科学什么都要学,什么都不专,而且从业都领域其实很狭窄。软件编程看似很专,但是可以用在各种领域里。生命科学的学习看似绕了些弯路,但是学习软件编程本来就是需要不断学习其他很多领域的知识博采众长的,所以从长远看也是给自己打下一个好的基础,能够有这样的知识结构其实也正是自己所需要的。

Python作者Guido说,他发明python的目的就是要做一门让人人都可以编程的语言。因为他认为,编程是另一种比写作更高形式(或者说更深层次)的思想表达工具。以前的知识主要通过写作表达出来并传递下去。但编程是更好的表达方式,可以表达更多更深层次的知识。一个编程者通过编程将其对某一个领域的专业知识和经验表达出来,做成软件。其他人通过使用阅读这个软件,去获得这个领域的专业知识和经验。Guido说,编程能力在以后将成为文盲的标准。在软件越来越扩大到社会生活各个方面的今天,我们也看到越来越多的人开始意识到,编程能力应该是每个人都具备的基本能力,越来越多的网站开始教普通人如何编程。(详见Guido的文章Computer Programming for Everybody)实际上,正是因为Guido这样的对软件的理解,python被设计成了最容易学习的语言,简洁可读性很好,并且非常适合对创新领域的探索。

我后来看到乔布斯也做过类似的表述。乔布斯的这段采访视频,相信很多人都看过吧。乔布斯也许可以算得上美国最好的产品经理了吧。据他自己说,他当年编程也是如痴如醉的。我曾经在公司年会上引用过他的话。我说,乔布斯说过,软件编程是一种思维方式,可以帮助你对这个世界获得更深更本质的理解。不过大家不要忘了,要理解这个世界,你还需要其他很多种思维方式。要成为一个优秀的程序员,你就需要去学习各种思维的方式。这是一个艰辛漫长的过程。虽然路途遥远,但是这是我们的宿命,也是我们的幸福。

我从来不认为仅有数学思维是可以做好软件的。就好像只懂数学无法理解世界一样,只懂数学也不足以理解软件,你还需要硬件,人文,商业等方面的知识。

举一个小的例子,摘自quora(http://www.quora.com/What-is-object-oriented-programming),看看乔布斯对于对象化编程的解释:

Here, in an excerpt from a 1994 Rolling Stone interview, Jobsexplains what object-oriented programming is.
Jeff Goodell: Would you explain, in simple terms, exactly whatobject-oriented software is?
Steve Jobs: Objects are like people. They’re living, breathingthings that have knowledge inside them about how to do things andhave memory inside them so they can remember things. And ratherthan interacting with them at a very low level, you interact withthem at a very high level of abstraction, like we’re doing righthere.
Here’s an example: If I’m your laundry object, you can give meyour dirty clothes and send me a message that says, “Can you get myclothes laundered, please.” I happen to know where the best laundryplace in San Francisco is. And I speak English, and I have dollarsin my pockets. So I go out and hail a taxicab and tell the driverto take me to this place in San Francisco. I go get your clotheslaundered, I jump back in the cab, I get back here. I give you yourclean clothes and say, “Here are your clean clothes.”
You have no idea how I did that. You have no knowledge of thelaundry place. Maybe you speak French, and you can’t even hail ataxi. You can’t pay for one, you don’t have dollars in your pocket.Yet I knew how to do all of that. And you didn’t have to know anyof it. All that complexity was hidden inside of me, and we wereable to interact at a very high level of abstraction. That’s whatobjects are. They encapsulate complexity, and the interfaces tothat complexity are high level.  

可以看得出乔布斯的表达能力很强,对对象化编程理解的很到位,把对象化编程解释的很清楚。也可以看出来,要做好对象化编程,在程序间的接口这一层面讲故事的能力非常重要。我见过很多程序员的代码,最大的问题就是不知道要在整体上讲一个好的故事,或者不知道如何讲故事。这对于他们来说,是一个非常陌生的思维方式。以前写过软件编程就是讲故事具体的讲这个问题。

我看到最好的产品经理,比如MarkZuckerberg,马化腾,丁磊,张小龙这些人,都是很优秀的程序员。很多人会认为他们只是程序员中的异数,在我看来,他们是修成正果。

Facebook的工程总监说过这样的话,不管你做关于软件的什么职位,产品经理,或者运营,或者销售,只要和产品有关,懂得编程都可以比其他任何事情帮助你更好的做这个职位的工作,因为就是有那么多细节你需要去知道的,否则你根本无法做出好的判断。

我也许不会画产品原型图,不会写prd文档,但是我一样可以指导产品经理做产品设计。不会画原型图不会写prd文档对我的产品设计产品战略能力没有多大影响,因为我很容易知道原型图和prd文档做得好应该怎么样,我只要叫别人画就可以。但是编程是不同的。编程是去深刻的理解这个世界的本质,然后用数字化的方式把它表达出来。比如事务(transaction),并行(concurrent),分布(distributed),锁的机制等等,这些可能很难归到数学或者物理里面去,但又和人类世界的很多东西都有着关系。

软件甚至是和管理有着天然的关系。学习软件编程,可以让你更深的理解管理,去自己创造管理。学习软件,就是学习各种软件里的组织的法则,比如代码仓库应该如何管理。不同的版本如何管理,不同的包如何管理等等。

软件的架构设计甚至是带有很强的哲学思维的。比如你必须在变化中去找不变的东西。比如对restful中的资源的理解等等。

在英语里code除了代码的意思,还有另一个涵义,即法律。在web2.0风起云涌的时候,在美国有不少人提软件实际上在构建未来社会基本的架构成为未来世界的“法”,比如开源的各种软件和相应的开源中使用的支持开源组织的组织工具管理工具等,这些组织方式和工具都开始扩散到各种开放组织中去。

好了,讲了这许多,到底什么是软件?

谜底揭晓,其实软件才是真正的生命科学啊!这个生命并非指狭义的如动物才是生命,而是广义的把一切我们人类可以识别的东西都认为是生命,如建筑,软件,组织,茶壶等等。软件就是创造生命。软件是关于如何创造生命的学科,是融合人文,数学,物理等等的高科技。它不仅有理工属性,还有人文属性和艺术属性。

也许你觉得我扯得太大太远了。你知道ChristopherAlexander,就是那个在6,70年代提出模式语言,深刻影响了对象化编程和设计模式的人,他在2000年后写出了一个四大册子每册700到一千多页的鸿篇巨著:Natureof Order (http://www.natureoforder.com),分别讲了生命的现象,创造生命的过程,生活中的各种具体的生命,以及这些理论对于人类科学的划时代的意义和启示。虽然是鸿篇巨著,读起来却是非常精彩。虽然这部巨著还没有像他以前的模式语言那本很薄的书对软件业起到巨大的影响,但是我认为这个影响应该是迟早的。

Nature ofOrder里最核心的概念就是生命中心。比如编程是非常灵活的,如何去组织代码,形成怎么样的模块就是找寻生命中心的过程。对象化编程里的对象可以算是生命中心。小的生命中心可以组合起来,在上面一层形成更大的生命中心。而软件最终做出来的东西是也是一个生命的存在,虽然它是数字化的。对生命中心的解释超越本文的范围。本文只需要大概说明白软件是什么即可。关于生命中心的概念,和如何具体的运用到软件编程,组织管理等方面去,我们可以另文系统的讲述。以前我也有很多文章都片段性的从不同的角度有所涉及。比如生命度和教育,生命度和时间管理组织管理,生命度和感觉。

其实佛教的观点,关于生命的知识是人类最根本的知识。我们做软件编程,涉及到这么多的知识,这么多的思维方式,这么多的能力,一定要有一个能够统一这所有知识的根本的知识,就好像物理界一直在寻找那个能统一所有物理定律的最简单的大统一理论一样。当然,你可能认为佛教是个宗教。这个暂不论吧。但是ChristopherAlexander在他的Nature ofOrder的最后一节,讲到他走向一个禅寺,描述寺庙里的沙盘的生命。其中的文字是一种追根溯源,一切归零般的文字。我不知道ChristopherAlexander和禅宗是否有渊源,但他对生命中心的描述确实是和佛学高度一致的。为什么生命中心?因为我们人类就是通过生命中心来识别周围的事物的。为什么我们是通过生命中心来识别周围事物?因为我们也是生命。 这是生命和生命之间的共鸣。

在我的编程实践,产品管理,项目管理,和软件团队管理的实践里,我其实都是在灵活的运用生命中心的理论。很简单的理论,但是却可以演化出很多的原则和方法,适应各种的场景。我在这个博客上写过很多关于软件管理的文章。有兴趣可以看看,更能明白我的意思。这里也不深入了。

我希望有机会能够比较系统的把这些知识写出来,帮助大家更好的把握软件,掌握敏捷开发。理解了什么是软件,你去理解各种敏捷开发,会发现其实它们都可以很好的用生命中心做统一的理解。其各种变化也只是依据生命形态的变化而变化而已。

我们把这门学科叫做计算机科学,给了大家很多的误导。学校里把这门学科当作计算机科学来教,更是误导了一代又一代的人。很多互联网或传统的公司,只要和软件沾点边,就会给自己挂一个某某科技公司的牌子,但他们恐怕真不知道这是什么高科技。对于他们来说也许只有生命科学纳米技术这样的才算高科技吧。这个高科技其实是关于生命的高科技,是真正的生命科学!我们应该好好的学习这门学科的知识了。

后续:

今天看了下Dijkstra的维基百科词条,里面正好有讲到这门学科被错误的命名为"计算机科学"的问题。大家可以看看。http://en.wikipedia.org/wiki/Edsger_W._Dijkstra

He was the first to make the claimthat programming is so inherently complex that, in order to manageit successfully, programmers need to harness every trick andabstraction possible. When expressing the abstract nature ofcomputer science, he wrote:"The job [of operating or using acomputer] was actually beyond the electronic technology of the day,and, as a result, the question of how to get and keep the physicalequipment more or less in working condition became in the earlydays the all-overriding concern. As a result, thetopic became —primarily in the USA— prematurely known as "computerscience" —which,actually is like referring to surgery as "knifescience"— and it was firmly implanted in people's minds thatcomputing science is about machines and their peripheral equipment,which is not true"

我来翻译一下:他是第一个声称编程是本质如此复杂的东西,为了成功的掌握它,程序员需要掌握所有的可能的技巧和抽象的能力。对于计算机科学抽象的特性,他写道:“当时的电子技术还不足以有很好用的计算机,所以如何让硬件多少还能运行就成了最重要的考量。结果就是,​这门学科被过早的命名为”计算机科学“。这就好像把手术叫做”刀子科学“一样。这个概念深深的植入了人们的意识,大家开始认为计算机科学就是关于机器和以及周边附件的学科。

另外,ChristopherAlexander评价他的模式语言被用在软件编程领域的情况的一段视频文字后来整理成了IEEE的一篇文章:http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=795104

 所以看这篇文章也可以知道他讲的内容。他是这样评价的:SoftwareProgramming’s use of patterns have so far just been a neat formatthat is a good way of exchanging ideas about programming, but lackin the two other dimensions: MORAL CAPACITY in producing a livingstructure and the GENERATIVITY OF THE THINGand that is capability in producing a coherentwhole.

大概翻译一下:软件编程对于模式语言的使用目前看来主要还只是一种用来交流想法的比较干净的语言而已。在另外两个方面还非常欠缺,一个是创造一种有生命的架构的道德能力,一个是萌生新物的能力,即能够创造一个完整的(生命)整体的能力。

被子背在后背上--开源学习
被子背在后背上--开源学习
开源学习http://www.opensourcelearning.org/:我们都是自学者,让自学变得更容易一些!软件工程师,架构师,丰富的学习经验,教学经验。