回顾自己对软件开发的认识历程,大抵可以分这么几个阶段:
第一阶段,做程序员,刚刚上路,对软件开发的理解就是你有一堆材料,我有一把锤子,你要椅子我就做椅子,要桌子做桌子,那个时候最擅长的是听到一个需求马上在脑子里反应出该用什么技术去实现,几个类,几个页面。
第二阶段,开始接触分层思想,接触设计模式,知道原来做软件有技巧在里面,你要考虑复用,考虑扩展,同样是做桌椅,你要考虑内在的几何结构,承重要求等。
第三阶段,东西看得多了,了解到模式也分多个层次,了解到从word文档中的文字需求到最后的软件成品,有一套方法可以遵循,有一些原则需要遵守;再到后来,就是架构风格,以及软件之上的业务领域的分析方法。
做软件并不是我钟爱的工作,虽然根据业务需求构建一个漂亮的设计蓝图出来是一件让人兴奋的事情,但我始终觉得,人生在这个世界上,认识周围的这个世界是第一重要的事情----这是第一个站立起来学会思考的人所面临的事情,也是任何一个呱呱坠地的婴孩睁开眼睛后所面临的事情。
幸运的是,我发现做软件并非让我远离了认识世界的追求,就像佛家在一粒沙一滴水中看世界一样,软件世界中也藏着这样的方法。我从这篇文字开始思考的,就是从软件角度去看待这个世界,或者认识现实世界的方法。----这听上去有点蚍蜉撼大树的感觉,不过笛卡尔大哥说的对,你不思考,怎么证明你的存在呢?我就这么思考着,让上帝笑到岔气儿吧。
在上面描述的对软件开发的认识历程里,我觉着有个东西像是从海底慢慢升起来,越来越高,直到矗立在跟前,让你无法他视,这个东西就是----抽象。
抽象是透过表象看本质的过程,它可以用在软件开发的多个层次上。在业务层次上,一个大的复杂的业务需求可以被刀片一样的抽象思维切割,分解,然后再在每个相对小的问题领域上钻取挖掘其本质,发现其间共通的东西,和与传统的经验性的事物相似的属性----越接近本质,概念应该越简单。软件世界如此,现实世界也如此。从这个角度讲,姬昌是个好分析师,把世界抽象到八卦,老子更加是个好分析师,把世界抽象到了阴阳,道,乃至混沌。
在具体的软件层面上,无论是在系统级,组件级,类级,抽象这把刀都可以拿来用,把面对的问题领域比做一个球,你可以从任何角度切入进去,沿着不同的关注面将问题分解开来。
正是因为纷繁复杂的事物都可以抽象到更加接近本质的简单的东西,这就提供了一条解决复杂问题的思路,
从简单的原则原理起步,逐渐推导到高一层的结论,一步步逼近现实问题;当然,抽象有多个层级,从哪个层级起步就取决于分析师的经验和掌控能力,以及逻辑推导能力。把这个方法用于个人的认知重构将会是一个伟大的工程:把大脑清空,从简单的本质的原理起步重新搭建和清理自己的认知结构,这工作想想就让人兴奋。
也正是因为有抽象这样的工具,对软件世界的认识不再像看起来那么困难,因为沿着抽象阶梯往上走,总能走到一个可以被一个普通的脑袋理解的台阶,从这里开始,可以再按照需要沿着某个分支往下走到更有意义的程度。研究软件如此,认识现实世界也如此。
我相信类比老子“道生一,一生二,二生三,三生万物”的思路,软件世界里的事物可以划分排列为一个类似金字塔的概念模型,或者更软件一点,是一个树状的概念模型(网太复杂了,摒弃掉不重要的关联关系,树模型更容易接受),我们所接触的语言,工具,框架,模式,原则,方法等所有软件概念都可以按照不同的维度排到这个树上。现实世界也可以,从一个起点开始,按照不同的维度不同的抽象等级将万事万物排列到一颗树上。这个思路可不可行,需要好好考虑和实验一下。
抽象仅仅是哲学领域中众多认识事物的方法之一,这让我觉得,做架构师或分析师需要掌握不单是软件领域的那些方法,更重要的是哲学上的方法论,用这些最高层的方法武装的头脑,会具有分析世界的能力。
分享到:
相关推荐
《软件工程卷1:抽象与建模》是一本世界著名的计算机教材,由丹麦计算机科学家Dines Bjørner撰写,刘伯超等人翻译,清华大学出版社出版。本书是软件工程系列教材的第一卷,主要围绕软件开发中的两个核心概念——...
一共3个压缩包,这是第1个 《软件工程卷1-3》是冯诺依曼奖章获得者、世界著名的计算机科学家Dines Bjoiner教授的最新著作。这套丛书为读者理解软件和软件开发过程提供了一个“全新的视角”。这三卷书首次系统地...
构造型模式解决对象的创建问题,包括简单工厂模式、工厂方法模式、抽象工厂模式、创建者模式、原型模式和单例模式。这些模式的应用可以提高代码的可维护性和可扩展性。 结构型模式 结构型模式解决对象的结构和组织...
《软件工程卷1-3》是冯诺依曼奖章获得者、世界著名的计算机科学家Dines Bjoiner教授的最新著作。这套丛书为读者理解软件和软件开发过程提供了一个“全新的视角”。这三卷书首次系统地论述了如何用形式方法来指导领域...
对象是对现实世界实体的抽象,拥有属性和行为;类作为对象的模板,描述了一组具有共同特征的对象;继承使得子类能够获得父类的属性和行为,增强代码的复用;聚集则是对象之间的一种“部分-整体”关系;多态提供了...
战略编程与战术编程的区别、类应该设计得“厚重”(thick),即提供足够的有用功能,通用类更加简单,增加新层和新抽象,以及注释应该描述代码中不明显的部分等,都是软件设计中应该遵循的原则。 在谈到类的设计时...
面向对象分析是一种分析方法,它将现实世界的问题领域抽象为一系列的对象和类,并定义它们之间的关系。 **面向对象设计(OOD):** 面向对象设计是将面向对象分析的结果转化为软件设计的过程,它定义了对象之间的...
而斯坦福大学作为全球顶尖的教育机构之一,其推出的“抽象编程”公开课无疑为全世界的软件开发爱好者和专业人士提供了一个掌握先进编程技巧的绝佳平台。 抽象编程,顾名思义,是一种通过抽取并隐藏程序中具体的实现...
软件建模的概念是为待开发的软件创建模型,这些模型可以是对现实问题的抽象,也可以是未来软件系统的蓝图。如同数学建模用公式来表达物理规律,软件建模则通过各种图表来描绘软件系统的主要特征和组件之间的关系。...
人们为了应付现实世界的复杂性,逐渐形成了很的概括、分类和抽象的能力,并在此基础上应用于程序设计就形成了面向对象程序设计方法。 模块的耦合性是模块之间的联系及互相影响应尽可能地少,对于必需的联系都应当...
不过,它要求开发人员具备特殊的技能,并且对于现实世界中交互性强的软件系统很难应用。 面向复用的开发模型建立在已有软件组件和框架的基础上,能提高开发效率和质量。但它的缺点在于商业组件的修改受到限制,影响...
概要设计的实践要求学生将抽象的需求转化为具体的实现计划,这是软件开发从概念走向实际的关键步骤。 上述实验不仅要求学生动手实践,更强调预习和复习的重要性。学生应在实验前对相关理论知识有所了解,实验中则应...
软件不仅是计算机系统中的程序和文档,更是一种知识的体现,是人类经验、智慧的抽象和固化。软件技术的核心在于理解和解决软件的构造性和演化性。 【软件的构造性】 软件的构造性意味着它是由多个组成部分构成的,...
5. 依赖倒置原则:抽象不应依赖于细节,细节应该依赖于抽象。开放-封闭原则:软件实体(类、模块、函数等),应该可以扩展,但不可修改。 6. 软件生存期过程和软件生存期模型的联系是,软件生存期模型是跨越整个...
软件架构是指在软件开发过程中,对于软件系统的各个方面的设计进行指导的一系列相关的抽象模式。它是一个系统的草图,描述的是直接构成系统的抽象组件,以及这些组件之间的连接关系。在软件开发过程中,软件架构扮演...
在这一章中,学生将学习如何通过类来抽象现实世界中的实体,以及如何利用继承和多态性来增强代码的复用性和灵活性。此外,还将讨论接口和抽象类在设计中的应用,以促进模块化和可扩展性。 进入第9章,重点转向了UML...
OOP的核心是将现实世界的问题映射到软件世界中的对象,通过对象的属性和行为来构建复杂的系统。然而,正如描述中引用的学者观点,单纯的OOP思路可能不足以应对大规模项目,需要更完善的面向对象软件工程方法学...
2. **类与对象**:讲解如何定义类来抽象现实世界中的实体,并创建对象来实例化这些类。类是对象的模板,而对象则是类的实例。 3. **继承与多态**:通过继承,子类可以继承父类的属性和行为,实现代码复用。多态允许...
对象是现实世界实体的抽象,类是对象的模板,继承实现了代码的重用,而消息传递是对象间的通信机制。面向对象的三大特性——封装、继承和多态性,封装保证了数据的安全,继承提高了代码的复用,多态性则允许不同类型...