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

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

作者: 光剑书架上的书 | 来源:发表于2021-04-27 06:23 被阅读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个原则分别如下:

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


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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/sgkvlltx.html