编程艺术:本质、精神、模型、原则等《禅与计算机程序设计艺术》 /

2021-04-27  本文已影响0人  光剑书架上的书

软件开发的本质

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

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

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

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

代码艺术家

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

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

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

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

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

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

软件的复杂性

然而,现实却是——

“不管你们有多敬业,加多少班,在面对烂系统时,你仍然会寸步难行,因为你大部分的精力不是在应对开发需求,而是在应对混乱。”(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个原则分别如下:

设计模式

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 ...... 待续


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

上一篇下一篇

猜你喜欢

热点阅读