2019年/10月/30日
简单之美
本文是简单之美的读书笔记,这本书是国内出版的,采用的是场景式,人物对话然后再引入独白的写作模式,像拍电影一样,书中观点大部分深表赞同
这是一本为那些在实际工作中陷入迷茫的软件开发者,管理者和企业经营者准备的书,发现如何品尝软件开发的乐趣,如何从千头万绪变得线索明朗,如何从复杂世界进入简单世界 思想是解决一切问题的根本 有经验的软件开发者获取知识和使用知识的方法无法系统地传递给软件开发新手 当追溯一切问题的根源时,哲学总是追溯的源头
有效信息:
- 简洁明确的思想表述
- 层次清晰的分类信息
- 令人信服的论证过程
无极生太极
软件开发是一项创造性活动,因为它的创造性,我们要特别关注软件开发中的想象力 建立自己的思想体系来学习各种知识 只有简化问题才能高效解决问题 创造不能复制,每一次都是独特的
人类思维的三种类型
- 逻辑思维
- 形象思维
- 灵感思维
领域问题最终会转化为一个个数学运算,但是在求解领域问题的过程中,仅仅依靠数学知识是远远不够的
处理领域问题太复杂,需要借助面形思维(经验,习惯和形象思维) 人们可以使用java语言进行隐喻式编程
java语言培养了我在软件开发中的想象能力 能够充分展开想象,是创造能力的集中体现
软件开发是一项具有艺术性的科学工作 不成熟的领域-软件开发管理
太多糟糕的管理,他们对于软件开发的负面影响远大于软件开发人员自身
方法是我们一生中最有价值的知识财富
如果思想体系没有建立,找不到建立思想体系的方法,以及不会应用思想体系来解决问题,我们就无法把握事物的本质
要想用最直白的常识来交流,把握事物的本质是关键,而为了把握本质,我们首先需要认识事物
思考领域模型的时候不要立即开始考虑数据库的因素
认识上需要追求简单,实践中也该同样如此 软件开发的本质是创造,所以运用信息的能力才是关键
如果你的企业正在招聘人才,请关注应聘者解决问题的思路和看待问题的层次
越简单越准确 越简单思路越清晰
你曾经经历过轻率的决策吗? 你曾经经历过非技术型妥协吗? 你曾经经历过无责任参与吗? 这些都是破坏简单性使得软件开发变得复杂和混乱的根本原因之一
关于软件开发方法论的思考
文化是方法论的基础 开源软件的开发过程中,几乎不用考虑人的因素,这并不代表个人因素不重要,二是因为人们的想法简单而统一
只有成熟的软件开发组织,才能快速适应组织规模的变化 成熟之路上,最重要的是软件开发思想的修炼
不关注人的因素,软件开发就会失去控制 追求人的主动性,是智力活动密集型企业的最高目标
应该设立一个专门的部门,它没有建立秩序的职能,而是专注于调整社会关系,提供心理知道指导,服务于个人
人的缺陷
- 沟通永远是不完全的
- 人是古怪的
- 宁愿保守的失败
- 喜欢临时创造而不喜欢积累
- 不能始终如一
我见过争吵带来的创意 也见过争吵带来的失败 完全依赖于人员素质的敏捷方法也是不容实施的 文化是一个复杂的总体 敏捷方法非常适合于那些做好准备顿悟的人 我可以不同意你的观点,但是我誓死捍卫你说话的权利
企业需要的是人的技能,而不是技能发挥的形式 中庸:一种非常动态和灵活的平衡 良心有时候是不可靠的,只有依靠严刑峻法,才能建立信托责任 一线程序员总是受到最多的职责,因为他们直面问题解决的环节 所谓进入管理队伍,就是彻底地放弃软件开发工作
软件开发活动的复杂性
- 没有信服力的指令
- 缺乏主动性的执行
- 党同伐异的评价
- 逃避责任的交流
妥协的方案往往会给软件开发组织带来无数潜在的问题
管理者分类
- 以德服人,注重自身品德休息,关心下属,宽厚待人,信守承诺
- 喜欢辩论交战,思维缜密,表达能力出众,毫不畏惧面对各种挑战,直到对方成服
- 采用世俗手段,拉弄舆论,打压反对派,胡萝卜加大棒
关于需求的思考
客户往往不能准确的表达出自己的需求 理论上,提出需求的人必须经过专业的训练 人类的交流,总是基于某种特定的语境 交流双方必须要基于同一个语境 不回避是一种科学的态度 我们要在完整故事的基础上,去优化和精简软件系统的功能 不仅仅需求分析需要讲故事,软件开发的各个环节都需要这项技能
将故事方式
- 结构简单
- 层次推进
易经,阐述变化之理的著作 让客户明白自己的需要,离不开需求分析人员的主动性 需求变化永远是客观存在的 主动出击,一切都会尽在掌握之中
关于软件架构设计的思考
人们设计软件时,通常是在隐喻基础上直接想象系统的运行状况,随着想象的细节化,然后才会有各种抽象的产生
世界上的万事万物都具有某种特定的结构 如何设计软件架构,是构建软件系统成功与否的关键 我们对宇宙的认识任然非常有限 人类对生命的认识任然非常有限 中医:关注接口,不关注实现 每个软件架构师都有自己的设计风格,没有唯一的架构 构建软件的能力来自实践和智慧 架构的设计,应该由一位设计师来完成 人类认识世界的能力是很有限的,甚至在认识和表述自己的创造物时也是如此 很多工作的本质都是一个故事 在架构软件系统时,一个细节上的失误,可能会导致巨大的软件开发成本 一个成功的软件架构师应该像战役指挥官一样,善于用自己丰富的经验来规避一切后果严重的错误决策 架构设计需要形象思维能力多过于逻辑思维能力,需要的激进创新能力多过于循规蹈矩 模式化的想象使得人们的思维变得清晰和具体 混乱往往来自历史遗留问题,来自决策中的妥协,来自隐喻的忽视,来自种种人为的因素 软件设计活动具有两个最主要的特点:
- 抽象(简化信息,归纳特征)
- 隐喻
隐喻使你的想象变得集中而有条理 编程,只是用一种语言表达想象的过程 隐喻肩负着简化认识的使命 设计者必须具备一定的生活阅历
软件架构师的素质
- 诚实
- 想象力
- 生活经验
- 逻辑思维
- 理想主义者
- 兼容并蓄
- 反思精神
关于软件实现的思考
领域,是客观事物的集合 计算模型对于软件来说非常重要 团队成员要有共同的工作目标 在现实中,要找到建设理想团队的一般性方法是不可能的 现实往往不会因为个人的意志而改变 快乐很简单,它源自一种生活态度,最后成为一种生活习惯 很多乐趣往往就在眼前,可是却视而不见 从编程思想入手,寻找一条简单的线索并持续围绕这条线索积累知识 解决方案的数量,永远比问题的数量要多
相比于团队决策,我更倾向于个人决策,实际上,个人决策并不排斥冲突,冲突是创造力的源泉,也是发现设计问题的最佳方法 软件行业是一个不成熟的行业,没有有效的决策机制
通常非专业的人都不敢去干涉一个专业的手术,可是,软件开发不同,每个人都希望进行决策,而每个人也都很幸运,因为没有人会当场死在“手术台”上
关于软件测试的思考
软件测试是一种破坏,只有当破坏推动了建设才是有意义的 没有设计,就无所谓测试 软件测试能力是软件开发组织技术能力的一个缩影 对于软件来说,最大的软肋在于逻辑思维的不可遍历性 四原则
- 聚焦
- 积累
- 自动化
- 目标一致
人必须先说很多话,然后保持静默 原则总是很简单的,可是在实践中,能够坚持原则的人总是很少
关于团队的思考
一个高效的小团队就可以产生巨大的生产力 对于团队来说,软件开发思想也是需要高度统一的 真正有创造力的人,并没有什么标准的性格 与其关注个性不如关注化学反应 团队规模应该尽可能的精炼
很多转向管理岗位的技术人员,可能从来没有认可自己在技术方面的价值,也从来没有为自己曾经从事过技术工作感到骄傲
企业发展需要各方面的人才:专才,奇才,怪才,勤恳的人,不善言辞的人,喜欢搞笑的人,关键是如何激发个人潜能
锥子要放到口袋里才能冒出来
关于项目管理的思考
管理是服务,而不是控制
开源软件
- 极度的投入
- 专业的技术
- 高效的工作
- 友善的沟通
让项目管理人员远离任何技术方面的决策 把项目管理和软件开发工作清晰的分开 信任专业的技术人员比信任脱离技术背景的项目管理人员更靠谱 非线性系统具有多样性和多尺度性 对于软件项目来说:制定长期的,静态的,精细的计划是没有价值的 最有效的方法是建立短期的,精细的计划,以及长期的,粗放的计划 未来是很难确定的 风险其实不能阻碍人的创造力 软件开发过程中,最大的风险只有人 项目管理人员,当你成天考虑风险,大肆干扰技术开发工作时,你自己可能是这个项目中最大的风险 管理的最高境界就是简单
- 目标单纯
- 思想自由
- 交流坦率
关于软件维护的思考
组件化开发 组件具有高内聚,低耦合的可能性 历史遗留问题带来的维护成本要远远大于解决它的成本 经验告诉我,看似复杂的代码,讲述的故事情节其实是很简单的
软件开发组织需要积累的知识非常广泛
- 数学,逻辑学
- 计算机科学
- 心理学
- 社会学
知识的最高表现形式是常识 对知识的热爱是知识积累的基础 软件技术本身,没有想象中的发展得那么快 更多的是来自应用思想上的发展 现实很复杂,因为没有积累
要保持问题的简单性,必须从思想上来解决 有价值的知识是具有系统性的