最近开始看<<金字塔原理>>,这是一本讲语言表达的书,介绍了一种能清晰地展现思路的高效方法,能够训练思考、使表达呈现逻辑性。金字塔原理能将零散的观点有序组织起来,化繁为简,适合所有需要精进思考、分析、表达能力的读者,感兴趣的或者是和我一样语言表达能力需要进步的可以看看.
![](https://img.haomeiwen.com/i1650675/4e12d3d5dd8f7a74.jpeg)
之所以把这门书和软件设计相提并论,是因为我感觉这本书的一些观点和软件设计颇为相似,可以相互启发,这本书讲语言表达,而软件就是用编程语言来表达逻辑,只不过不同编程语言的语法不同,并且我认为编程语言的语法难度甚至要低于汉语,英语等自然语言,所以,从某种意义上来说写好代码甚至比说好汉语更为简单,好的软件设计和好的语言表达一样,应该言简意赅,一目了然.下面截取文章的部分章节描述对软件设计的启发.
归类分组,将思想组织成金字塔
大脑会自动将发现的所有事物以某种秩序组织起来.基本上,大脑会认为同时发生的任何事物之间都存在某种关联
文中举了多个例子来说明人脑具有对事物进行归类组织的特点,将语言表达进行好的归类便于大脑进行更好的理解,程序也是如此,各种架构各种分层的提出,便是面对共性业务问题的一种归类分组,便于程序员更好的理解软件逻辑,例如最常见的mvc架构,<<实现领域驱动设计>>提出的六边形架构,架构整洁之道提出的整洁架构,Software Architecture Patterns提到的分层架构,事件驱动架构等多种架构,皆是对共性问题的归类分组.
奇妙的数字"7"
米勒认为,大脑的短期记忆无法一次容纳约7个以上的记忆项目.有的人可能一次能记住9个项目,而有的人则能记住5个.....当大脑发现需要处理的项目超过4个或5个时,就会开始将其归类到不同的逻辑范畴中,以便于记忆.
对于软件来讲就是一个函数内的知识点或者说代码行数不要过多,当行数较多时,脑子要有意识的去想是否要对该段代码进行适当抽象归类,虽然7行有点极端,但也不要超过20行代码,熊节老师说过它的代码一般不会超过5行......
自上而下思考,总结概括
金子塔中的思想以3中方式互相关联---向上,向下和横向.位于一组思想的上一个层次的思想是对这一组思想的概括,这一组思想则是对其上一层次的解释和支持.
文章中的思想必须符合以下规则:
1.纵向:文章中任一层次上的思想必须是下一层次思想的概括.
2.横向:每组中的思想必须属于统一逻辑范畴.
3.横向:每组中的思想必须按照逻辑顺序组织.
"两横一纵"是金子塔中的核心思想,软件设计也是如此.
纵向
纵向关系是指文章中任一层次上的思想必须是下一层次思想的概括.软件设计也是如此,例如我们每抽象出一个函数,这个函数必须是对该函数实现的总结概括,例如我们抽象出一个函数叫做initUi(初始化界面),那么该函数的实现必须是Ui相关组件的初始化,而不能包含Ui以外的组件.
横向1
横向关系是指每组中的思想必须属于统一逻辑范畴,<<代码大全>>也通过"形成一致的抽象"来表达相同的意思,例如我们要用代码表达一段业务逻辑,那么该逻辑中用到的类名和函数名应该具有业务含义,而不是把sql语句,报文格式等实现层面的语言放到该段业务逻辑中.在例如我们要实现打开泵组功能,对应到业务逻辑应该是类似于pump.open()这种描述,而不是弄一堆发送报文的逻辑在里面(泵组打开是通过发送报文实现的).
横向2
横向关系是指每组中的思想必须按照逻辑顺序组织.书中提到的组织思想包含4中顺序分别是,
- 演绎顺序:大前提,小前提,结论
- 时间顺序:第一,第二,第三
- 结构顺序:波士顿,纽约,华盛顿
- 程度顺序:最重要,次重要,等等
本文大概是结构顺序吧,当然对于软件设计来说只用到了时间顺序,软件本质是个图灵机,按照cpu时钟有条不紊的运行.
最后
先写这么多,这本书我还没看完,所截取的部分思想不到全书的1/10,感兴趣的同学还是建议读一下该书.最后在强调一下好的软件设计和好的语言表达一样,应该言简意赅,一目了然,当你不知道自己的设计是否优劣时,把自己的设计用语言描述出来,如果语言简单,逻辑清晰,那么这个设计多半就是好设计了.最后在分享一下熊节老师关于好设计的一个描述,本人深以为然.
我的point是,大多数时候,只要知道什么时候应该增加对象,怎么给对象和函数命名,数据应该放在哪里,设计就已经足够了
最后的最后
推荐一些书和课程,希望对新员工有帮助
重构
Head First 设计模式
程序员修炼之道
代码整洁之道
架构整洁之道
敏捷软件开发
企业应用架构模式
Microsoft NET 企业级应用架构设计
10x程序员工作法
软件设计之美
代码之丑
如何落地业务建模
领域驱动设计实践
网友评论