软件开发的本质
从本质上来说,软件开发过程就是问题空间到解决方案空间的一个映射转化。
“问题空间”就是系统要解决的“领域”问题。因此,也可以简单理解为一个领域就对应一个问题空间,是一个特定范围边界内的业务需求的总和。
“领域模型”就是“解决方案空间”,是针对特定领域里的关键事物及其关系的可视化表现,是为了准确定义需要解决问题而构造的抽象模型,是业务功能场景在软件系统里的映射转化,其目标是为软件系统的构建统一的认知。
每个软件系统本质上都解决了特定的问题,属于某一个特定领域,实现了同样的核心业务功能来解决该领域中核心的业务需求。领域模型在软件开发中的主要起到如下作用。
- 帮助分析理解复杂业务领域问题,描述业务中涉及的实体及其相互之间的关系,是需求分析的产物,与问题域相关。
- 是需求分析人员与用户交流的有力工具,是彼此交流的语言。
- 分析如何满足系统功能性需求,指导项目后续的系统设计。
代码艺术家
“根本没有艺术这种东西,唯有艺术家而已”。(贡布里希《艺术的故事》)
这句话的意思是,艺术其实就是艺术家的一种表达方式、情绪和价值观。艺术家在哪里,艺术就在哪里;艺术在哪里,美就在哪里。
禅是什么?计算机程序设计艺术又是什么?
我想说,这个程序设计的艺术也是不存在的,只有程序员而已——我们不妨称之为“代码艺术家”好了。程序员在哪里,程序设计的艺术就在哪里,人类的智慧跟创造力就在哪里。
软件研发是技术也是艺术,不仅要有一行行的代码,还要有主题思想、想象力、宏观架构。
我有一个梦想,我写的代码,可以像诗歌一样优美。我有一个梦想,我做的设计,能恰到好处,既不过度,也无不足。
软件的复杂性
然而,现实却是——
“不管你们有多敬业,加多少班,在面对烂系统时,你仍然会寸步难行,因为你大部分的精力不是在应对开发需求,而是在应对混乱。”(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 ...... 待续
网友评论