软件开发不是一门精确的科学,但是好的软件开发与好的科学有很多可比之处。特别地,借鉴数学和科学是非常有用的——就成熟性而言它们比计算机科学多了几千年的发展——这样我们就不会试图去做一些不可能的事。我们已经知道知识在实践和理论上都有极限,将大量计算能力用于这种极限的组合是无益的。随着当代科学技术和科学哲学等学科的发展,永不停顿地反思科学观的时代本质及其变革问题,不论从理论上说还是从实践上说都是一件相当重要的事情。

历史上,科学技术的伟大变革无不与人们思维方式的变革、科学方法论的变革相联系。夸张一点说,没有培根等对归纳方法的倡导和笛卡尔等对演绎方法的示范,近代西方科学就不可能在短期内取得如此巨大的成就。实际上,世界上各民族在各个领域的差异在根源上或许都可归因于思维方式的差异,先进的思维方式是先进生产力、先进生产关系的先导;反之,落后的思维方式必然导致贫穷和落后。 正是由于古希腊的形式逻辑和文艺复兴以来发展起来的系统的实验方法导致了近代西方自然科学的产生、发展和昌明,进而造成了高度发达的物质文明。相比之下,中国古代“天人感应”的思维方式则过于注重个人的冥想与体验,没有超常禀赋的常人很难通过这种方式认识到真理,所以这种思维方式或方法论并不适合于大众的使用,这或许也是导致中国古代没有能够产生真正意义上的科学的一个重要原因。

计算机软件这一工程领域的发展,离不开软件工程方法论的指导,随着软件的日益复杂化,软件的设计方法经历了多次的变革。由最初的PO到今天占主流的OO,每一个阶段都有着相应的方法论作指导。

我二年来的软件开发中深有体会的是:从学习专业知识的角度上说,现在软件开发极力倡导培养面向对象思想,并且提出了J2EE学习的三件宝(领域建模、模式、框架),及时跟踪先进的思想和技术,站在业界的前沿。从做学问的态度上来说,我们应该软件开发设计中的技术和方法提升到科学思维方法论,哲学逻辑方法论的高度,从而结出理论与思想的果实。

方法是非常重要的,好的方法能起到事半功倍的效果,相信大家都有体会,简而言之,方法就是为了达到一定的目的而采取的手段,方法可以分为多个层面的方法,首先是具体的方法,如一道数学题的多种解题方法,其次是各学科、行业的专业方法,如物理的方法,数学的方法,建筑的方法,等等,再就是科学思维的方法如抽象和具体的方法,分析和综合的方法,逻辑和历史的方法等等,最高层次的就是哲学的。逻辑方法了,如辩证法。前两个层面的是具体的方法,后两个层面的是抽象的方法。我在这里要说的主要是后两个层面的方法。

科学的探索需要科学的思维方法,那么在我们的软件开发设计中,最重要的是要培养怎么样的科学思维方法呢?其实从“思维”两个字中,我们也可以领悟到一些东西,“思”即是思考,比较容易理解,关键在“维”字,“维”其实是角度的意思,我们经常说的三维空间,就是从x,y,z三个轴的角度来看空间,再加上一个时间维的话就是我们所赖以生存的动态时空了。所以我们的思维一个很重要的元素就是要从多角度看问题,角度决定深度。映射到我们的科学思维方法的话就是其中的发散性思维方法,发散思维是非常重要的,是分析问题的一个利器,但是也要从哲学的高度加以辩证法来把握,那就是必须辅以收敛思维从顶端予以控制,没有收敛的无限发散就容易成为无边的空想幻想,杂乱,没有发散的收敛又将成为呆板僵硬的死脑筋。下面说一下前面提到的几个问题,并对其进行分析。

一、面向对象思想

面向对象是一种新兴的程序设计方法,或者说它是一种新的程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计。 它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其它概念来构造系统)。这可以使系统直接地映射问题域,保持问题域中事物及其相互关系的本来面貌。

培养面向对象思想最需要什么样的思维方法呢?面向对象的核心是抽象,我想这个应该没有太大的争议。抽象,就是抽取事物一些本质的东西,剔除次要的表面东西,但是千万别忘了后面那个像字,那就是抽取之后还得让事物像原来的事物,我们很多人在软件设计中抽取类的时候往往就是抽而不像,变了形,最终不能满足用户的需求。抽象也是一种重要的科学思维方法,同样,抽象也必须从哲学辩证法的高度辅以具体的科学思维方法,是一个感性具体到抽象再到理性具体的过程,感性具体到抽象是解决“抽”的问题,抽象到理性具体是解决“象”的问题。而我们的抽象往往只是抽而不像,就是缺少或者忽视了后一个环节的原因,而且我们的抽象也往往是孤立的,没有发散性地从多个角度进行抽象。

二、建模

阿里云-推广AD

建立系统模型的过程,又称模型化。建模是研究系统的重要手段和前提。凡是用模型描述系统的因果关系或相互关系的过程都属于建模。建模就是一个实际系统模型化的过程。系统建模主要用于3个方面:① 分析和设计实际系统。②预测或预报实际系统某些状态的未来发展趋势。③对系统实行最优控制。对于同一个实际系统,人们可以根据不同的用途和目的建立不同的模型。所建模型只是实际系统原型的简化,因此既不可能也没必要把实际系统的所有细节都列举出来。实际建模时,必须在模型的简化与分析结果的准确性之间作出适当的折中,这是建模遵循的一条原则。

进行领域建模又需要什么样的科学思维方法呢?现实的事物是变得越来越复杂了,太复杂了也往往就很难直接理解和把握它了,于是我们就先建立它的模型,然后研究模型以代替直接研究事物本身,所以这个模型也就不能太失真了,否则研究结果也就跟现实相距甚远了。我们也经常能见到各种模型,如城市模型,汽车模型,轮船模型等等,这些模型都是一些实物模型,比较好理解,也比较好建立,我们姑且把它归为物理模型。还有一类模型就是逻辑模型或是抽象模型,比如模拟一个城市的行政系统等,我们所说的领域建模也是建立一种逻辑模型,即对企业某一功能系统建立模型。建立领域模型需要模型化的思维方法,模型化的思维方法也是一种重要的科学思维方法,而且起着越来越重要的作用。模型化的思维方法综合了其他很多的思维方法,首先,它需要从整体出发来把握系统,这就需要用到系统的思维方法,其次,它需要从各个层面,各个角度考虑系统,得到原型的映射,这就需要发散和收敛的思维方法,如分析与综合,猜想与概括,等等,在对实体,流程建模时又需要用到抽象和具体的方法。在一些细节问题的处理上还经常用到比较,分类,类比等方法,数学的方法。整个领域的建模需要从全局着眼,从局部着手。

三、搭建框架

框架为支持企业的战略和业务开发的软件,它最重要的职责在企业发展的过程中以一种有效的方式来积累知识资源,并将之用于提高企业的核心竞争能力。不论是哪一种技术,最终都是为业务发展而服务的。因此,我们定义的框架概念主要是从业务的角度来描述。首先,框架的是为了企业的业务发展和战略规划而服务的,他服从于企业的愿景(vision);其次,框架最重要的目标是提高企业的竞争能力,包括降低成本、提高质量、改善客户满意程度,控制进度等方面。最后,框架实现这一目标的方式是进行有效的知识积累。软件开发是一种知识活动,因此知识的聚集和积累是至关重要的。框架能够采用一种结构化的方式对某个特定的业务领域进行描述,也就是将这个领域相关的技术以代码、文档、模型等方式固化下来。

框架要解决的最重要的一个问题是技术整合的问题,在J2EE的框架中,有着各种各样的技术,不同的软件企业需要从J2EE中选择不同的技术,这就使得软件企业最终的应用依赖于这些技术,技术自身的复杂性和技术的风险性将会直接对应用造成冲击。而应用是软件企业的核心,是竞争力的关键所在,因此应该将应用自身的设计和具体的实现技术解耦。这样,软件企业的研发将集中在应用的设计上,而不是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响。

对于如何搭建框架的问题,主要是要运用系统的思维方法,整体观要强,从多角度多层面把握系统的框架,所以说发散性思维的培养是非常重要的。而且在搭建系统框架的过程中,逆向科学思维方法也是非常重要的,在软件设计中,我们都希望能搭建出一个灵活、可扩展、可维护的框架来适应需求的变化,根据老子的“将欲歙之,必固张之,将欲取之,必先与之”,反者道之动,所以我们从反面出发,运用逆向思维方法,找出系统的不变的,相对较为固定的东西,沉淀出来即为框架,而且是灵活的框架。这其实也蕴涵了辩证法的哲理在里面。

四、结束语
中国古代有“道”,“器”之说,对此说,个人的理解是“道”就是正确的人生观,世界观及与之对应的方法论。“器”是能体现道的器物,是道的承载者。要想成器,就需要对道有充分的把握,并依照道的指引,自我完善,自我锻炼,将自己锻炼成器。

恩格斯说过“一个民族要想站在科学的最高峰,就一刻也不能没有理论思维的指导”,这句话对于我们的软件开发也是同样适应的,所以,我们要培养科学的思维方法和哲学的方法科学观,这是各种具体问题解决方法的本源,有了这样的思维武器,是要少走许多弯路的。博学而详说之,将以反说约也,希望我们能够深入浅出,出博返约,放得出去,收得回来,练就一身软件开发设计的本领!