软件开发的本质

从本质上来说,软件开发过程就是问题空间到解决方案空间的一个映射转化。

程序设计思想(编程艺术本质精神)(1)

“问题空间”就是系统要解决的“领域”问题。因此,也可以简单理解为一个领域就对应一个问题空间,是一个特定范围边界内的业务需求的总和。

“领域模型”就是“解决方案空间”,是针对特定领域里的关键事物及其关系的可视化表现,是为了准确定义需要解决问题而构造的抽象模型,是业务功能场景在软件系统里的映射转化,其目标是为软件系统的构建统一的认知。

每个软件系统本质上都解决了特定的问题,属于某一个特定领域,实现了同样的核心业务功能来解决该领域中核心的业务需求。领域模型在软件开发中的主要起到如下作用。

代码艺术家

“根本没有艺术这种东西,唯有艺术家而已”。(贡布里希《艺术的故事》)

这句话的意思是,艺术其实就是艺术家的一种表达方式、情绪和价值观。艺术家在哪里,艺术就在哪里;艺术在哪里,美就在哪里。

禅是什么?计算机程序设计艺术又是什么?

我想说,这个程序设计的艺术也是不存在的,只有程序员而已——我们不妨称之为“代码艺术家”好了。程序员在哪里,程序设计的艺术就在哪里,人类的智慧跟创造力就在哪里。

软件研发是技术也是艺术,不仅要有一行行的代码,还要有主题思想、想象力、宏观架构。

我有一个梦想,我写的代码,可以像诗歌一样优美。我有一个梦想,我做的设计,能恰到好处,既不过度,也无不足。

软件的复杂性

然而,现实却是——

“不管你们有多敬业,加多少班,在面对烂系统时,你仍然会寸步难行,因为你大部分的精力不是在应对开发需求,而是在应对混乱。”(Robert C.Martin)

“软件的复杂性是一个基本特征,而不是偶然如此。”(Frederick P.Brooks.Jr《人月神话》 )

问题域有其复杂性,而软件在实现过程中又有很大的灵活性和抽象性,导致软件具有天然的复杂性。缺少技艺。“写代码”作为一种技能,入门并不是很难。但是要像高手那样优雅地“写好代码”并不是一件容易的事,需要持续地学习和实践。

匠人精神

把简单的事情做到极致,功到自然成,最终“止于至善”。秋山利辉《匠人精神》

软件设计不仅是“技术”(Technique),更是一门“技艺”(Craftsmanship)。要想控制复杂度,防止系统腐化,我们不能只满足做一个搬砖的“码农”,而是要坚持自己的技术梦想和技术信仰。

怀有一颗“匠人”之心,保持专注、持续学习,每天进步一点点。唯有如此,我们才有可能“从码农走向工匠”!

代码自律精神

破窗效应(Broken Windows Theory)是犯罪心理学中一个著名的理论,由JamesQ. Wilson和George L. Kelling提出,刊于The Atlantic Monthly 1982年3月版中一篇题为“Broken Windows”的文章。此理论认为:环境中的不良现象如果被放任存在,就会诱使人们仿效,甚至变本加厉。以一幢有少许破窗的建筑为例,如果破窗不被修理好,可能将会有破坏者破坏更多的窗户。最终,他们甚至会闯入建筑内,如果发现无人居住,也许就在那里定居或者纵火。一面墙,如果出现一些涂鸦而没有被清洗掉,那么很快,墙上就布满了乱七八糟、不堪入目的东西;一条人行道有些许纸屑,不久后就会有更多垃圾,最终人们会视若理所当然地将垃圾顺手丢弃在地上。这个现象,就是犯罪心理学中的“破窗效应”。

“第一扇破窗”常常是事情恶化的起点。

从“破窗效应”中我们可以得到这样一个道理:任何一种已存在的不良现象都在传递着一种信息,会导致不良现象无限扩展,同时必须高度警觉那些看起来是偶然的、个别的、轻微的“过错”,如果对“过错”不闻不问、熟视无睹、反应迟钝或纠正不力,就会纵容更多的人“去打烂更多的窗户”,极有可能演变成“千里之堤,溃于蚁穴”的恶果。

在软件工程中,“破窗效应”可谓是屡见不鲜。面对一个混乱的系统和一段杂乱无章的代码,后来人往往会加入更多的垃圾代码。这也凸显了规范和重构的价值。首先,我们要有一套规范,并尽量遵守规范,不要做“打破第一扇窗”的人;其次,发现有“破窗”,要及时地修复,不要让事情进一步恶化。整洁的代码需要每个人的精心呵护,需要整个团队都具备一些工匠精神。

KISS 哲学

KISS:Keep It Simple and Stupid。

Less Is More。

一个方法只做一件事情。单一职责原则(SingleResponsibility Principle,SRP)。

Robert C. Martin有一个信条:函数的第一规则是要短小,第二规则是要更短小。

真正的“简单”绝不是毫无设计感,上来就写代码,而是“宝剑锋从磨砺出”,亮剑的时候犹如一道华丽的闪电,背后却有着大量的艰辛和积累。真正的简单,不是不思考,而是先发散、再收敛。在纷繁复杂中,把握问题的核心。

Less Is More:维护过遗留系统、受过超长函数折磨的读者应该深有体会,相比于3000行代码的“庞然大物”,肯定是更短小的函数更易于理解和维护。有时保持代码的逻辑不变,只是把长方法改成多个短方法,代码的可读性就能提高很多。超长方法是典型的代码“坏味道”,对超长方法的结构化分解是提升代码可读性最有效的方式之一。

“我不是一个伟大的程序员,只是习惯比较好而已。”(Kent Beck)

只有养成精益求精、追求卓越的习惯,才能保持精进,写出好的代码。

SOLID :5大设计原则

5个原则分别如下:

  • Single Responsibility Principle(SRP):单一职责原则。
  • Open Close Principle(OCP):开闭原则。
  • Liskov Substitution Principle(LSP):里氏替换原则。
  • Interface Segregation Principle(ISP):接口隔离原则。
  • Dependency Inversion Principle(DIP):依赖倒置原则。SOLID 设计原则最早由Robert C. Martin在2000年的论文“Design Principles and DesignPatterns”中引入。 SOLID 是开头字母的缩写,其本身就有“稳定的”的意思,寓意是“遵从SOLID原则可以建立稳定、灵活、健壮的系统”。
设计模式

With patterns, you can use the solution a million times over, without everdoing it the same way twice.利用模式,我们可以让一个解决方案重复使用,而不是重复造轮子。克里斯托佛·亚历山大《建筑的永恒之道》。

Christopher Alexander, 是当代建筑大师。在对建筑理论的探索过程当中,亚历山大形成了自己的有关建筑、自然和生活的哲学。

视觉思维:想象力与抽象思维

如果你能闭上眼睛,让算法在你的眼前舞动——这就是视觉思维。如果,你能牛逼到,能看到01字节的跳动(ByteDance),那你就是编程界的“天神”般的存在了。

“人类之所以成为人类,是因为人类能够想象”。(赫拉利《人类简史》)

“想象力比知识更重要,因为知识是有限的,而想象力概括着世界的一切,推动着进步,并且是知识进化的源泉。”(爱因斯坦《论科学》)

抽象思维以词为中介来反映现实。这是思维的最本质特征,也是人的思维和动物心理的根本区别。

正是抽象思维帮助人类从具体事物中抽象出各种概念,再用这些概念去构筑种种虚构的故事。这些概念包括经济(例如货币、证券)、文学、艺术和科学等,都是建立在抽象的基础之上的。

“所有事物都要经过两次创造的原则,第一次为心智上的创造,第二次为实际的创造”。(柯维《高效能人士的七个习惯》)

先想清楚目标,然后努力实现。不管是人生大问题,还是阶段性要完成的事情,都需要目标清晰、有的放矢。

平衡的艺术:Rule of Three

Rule of Three 也被称为“三次原则”,是指当某个功能第三次出现时,就有必要进行“抽象化”了。这也是软件大师Martin Fowler在《重构》一书中提出的思想。三次原则指导我们可以通过以下步骤来写代码。(1)第一次用到某个功能时,写一个特定的解决方法。(2)第二次又用到的时候,复制上一次的代码。(3)第三次出现的时候,才着手“抽象化”,写出通用的解决方法。这3个步骤是对DRY原则和YAGNI原则的折中,是代码冗余和开发成本的平衡点。同时也提醒我们反思,是否做了很多无用的超前设计、代码是否开始出现冗余、是否要重新设计。软件设计本身就是一个平衡的艺术,我们既反对过度设计(OverDesign),也绝对不赞成无设计(No Design)。

参考资料

爱因斯坦《爱因斯坦文集》Frederick P.Brooks.Jr《人月神话》克里斯托佛·亚历山大《建筑的永恒之道》赫拉利《人类简史》秋山利辉《匠人精神》

《禅与计算机程序设计艺术》 / 陈光剑 目录第一性原理什么是禅?什么是计算机?什么是程序设计?什么是艺术?宇宙之起源物质之形成半导体材料纳米光刻二极管、三极管太极阴阳与二进制布尔代数与数字逻辑系统模拟电子电路系统信号与处理信息论图灵机模型冯诺依曼模型计算机演化史什么是编程?编程语言进化史程序 = 数据结构 算法模型关系思维真理与模型建筑工程、机械工程、电气工程与软件工程CPU架构设计缓存思想计算机科学中的中间层理论从01机器码到汇编指令到高级编程语言:一切皆是映射美妙的递归用计算机画一张分形图分层思想硬件驱动操作系统通信原理:TCP/IP 与 HTTP 协议、WIFI无线协议互联网简史数据的存储:从ROM、RAM到寄存器到L1/L2 Cache 再到磁盘文件索引原理:来自大自然的启示 Tree 结构人类社会数字化人工智能虚拟现实技术、艺术与禅道

// TODO ...... 待续


《禅与计算机程序设计艺术》 / 陈光剑,