[读书笔记]软件架构师应该知道的97件事
1、开发人员应该解决问题,而不是解迷取乐。
2、关键问题可能不是出在技术上:
- 不要把对话当成对抗
- 不要带成情绪与人沟通
- 尝试通过沟通设定共同目标
3、以沟通为中心,坚持简明清晰的表达方式和开明的领导风格。
- 让开发人员参与架构的制订过程,这样他们才会买你的帐!
4、架构才是影响应用性能和可伸缩性的决定因素,性能参数是无法简单地通过更换软件,或者“调优”底层软件架构来改善的。
5、分析客户需求背后的意义
- 架构师可以通过询问客户,分析客户要求的功能和需求的真正意义,定位真正的问题,从而提出比客户的建议更好、成本更底的解决方案。
6、让沟通事半功倍,起立发言是简单、有效的方法!
7、故障终究会发生。
8、量化需求
- 比如:必须在1500毫秒响应用户的输入。在正常负载(定义如下....)的情况下,平均响应时间必须控制在750~1250毫秒之间。由于用户无法识别500毫秒以内的响应,所以我们必须将响应时间降低到这个范围之下。
9、一行代码比五百行架构说明更有价值
- 如果你亲自参与开发,应该珍视自己花在写代码上的时间,千万别听信这会分散架构师精力的说法。参与项目所付出的努力,既能拓展你的宏观视野,也能丰富你的微观视界。
10、提前关注性能问题。
11、草率提交任务是不负责任的行为。
12、业务目标至上、掌握业务领域知识
- 架构师必须通过沟通协调,即保护软件架构,又坚持业务目标,即允许开发人员制定微观(技术)决策,又设法避免他们参与制定业务决策。如果技术决策脱离了业务目标目标和现实条件的约束,则无异于用宝贵的稀缺资源进行高风险的投机。
13、先确保解决方案简单可用,再考虑通用性和复用性。
- 许多用来实现基础设施的代码,包括组件框架、类库、基础服务,普遍存在一个问题,它们的设计一味强调通用性而不考虑具体应用,导致出现许多令人困惑的可选项和不确定因素,这些功能常常不是因为被闲置,就是被误用,甚至毫无价值。
14、架构师应该亲力亲为
- 对技术缺乏全面理解的架构师,充其量只是个项目经理。
- 架构师完全可以要求团队成员的帮助,让团队成员充分参与制订解决方案,同时引导讨论方向,找出正确的方案。
- 架构师应该尽早参与项目,与团队成员并肩工作,而不是坐在象牙塔里发号施令。
15、持续集成
- 尽早构建,经常构建。
16、避免进度调整失误
- 加快进度不一定会降低成本,要考虑交付质量和后期造成的影响,可以尝试去掉一些不重要的功能,留待后续版本发布。
17、取舍的艺术
- 世界上不存十全十美的设计,既具有高性能,又具有高可用性;既高度安全,又高度抽象;
18、不要轻易放过不起眼的问题
- 自已的盲点自己难以查觉,忠言虽然逆耳,却是你最宝贵的财富。
- 组织团队一起来想办法管理风险。
19、让大家学会复用
- 大家知道它们的存在
- 大家知道如何使用它们
- 大家认识到利用已有的资源好过自己动手
20、架构里没有大写的"I"
- 自我反省,做人问题。
- 重视团队合作,架构属于团队,不是你一个人的。你负责导航,大家一起划桨。双方缺一不可,但相比之下,你更离不开他们的帮助。
- 做技术的,保持谦虚是最基本的素质!
21、先尝试后决策
- 尽量推迟决定的时间,最后即便不做决策,决策也会自己呈现。
- 对同一个问题尝试两种或两种以上的解决方案,比直接决策然后动手实现的工作量要大。
22、程序设计是一种设计
- 把编写代码看成设计行为,而不是生产行为。
23、控制项目规模
- 抓住真正的需求
- 分而治之
- 设置优先级
- 尽快交付
24、架构师不是演员,是管家。
- 扎实掌握技术和业务领域知识,以严谨的领导风格赢得团队的尊重。
25、混合开发的时代已经来临
26、性能至上
- 尤其目前的互联网行业
27、学习软件专业的行话
- 比如架构和设计模式可以分成四大类,企业架构模式、应用架构模式、集成模式和设计模式。
28、具体情境决定一切
- 架构决策只有在情境需要时,才能牺牲尽量简单的原则。
29、侏儒、精灵、巫师和国王
- 软件架构师好比国王,应该熟悉各种人的性格特点,招聘不同性格的人加入自己的团队,英明的国王知道怎样用目标来激励不同的种族,率领大家并肩作战完成任务。
30、避免重复
- 复制是魔鬼
- 重复性的工作拖累开发进度
31、仔细观察,别试图控制一切
32、架构师当聚焦于边界和接口
- 低耦合,高内聚
- 定义系统边界
33、助力开发团队
- 确保开发人员拥有他们所需的工具
- 确保开发人员拥有他们所需的技能
- 只要不违背软件设计的总体目标,就让开发人员自己做出决策。
- 保护好开发人员,不要让他们卷入到不那么重要的工作中。
34、记录决策理由
- 不要为了写文档而写。
- 懂得《取舍的艺术》,定义软件架构,就是要在质量属性、成本、时间以及其它各种因素之间,做出正确的权衡。
35、分享知识和经验
36、模式病
- 使用模式解决适用的问题才是最重要的,禁止在项目中硬塞不必要的模式。
37、关注应用程序的支持和维护
- 应用程序超过80%的生命周期都是在维护上
- 理解开发人员和支持人员确实具有不同的技能
- 在项目中尽可能早地引入支持负责人
- 将支持负责人作为团队的核心成员之一
- 让支持负责人参与规划应用程序的支持
38、有舍才有得
- 接受某种约束或放弃某个特性,可带来更好的架构,这种架构在构建和运维上都会更加简单,而且成本底。
39、先考虑原则、公理和类比,再考虑个人意见和口味。
40、数据是核心
- IDE、操作系统、软件等都是工具。
41、不仅仅控制代码,也要控制数据。
- 源代码控制和持续集成,是管理应用程序构建过程和部署过程的优秀工具。数据方案和数据内容通常会随着源代码变化而变化,它们也是这一过程的重要组成部分,因此也需要对之进行类似的控制。
- 灵活运用“数据库脚本”解决问题。
42、确保简单问题有简单的解
- 对于简单的问题,不要采用复杂的解决方案。软件设计者都是聪明人,但是出于炫技心理,很容易陷入“杀鸡用牛刀”的误区。
- 对应第一条“开发人员应该解决问题,而不是解迷取乐。”
43、架构师首先是开发人员
- 作为架构师,主要目标应该是创建可行、可维护的解决方案,当然,也一定要能解决当前的问题。
44、根据投资回报率(ROI)进行决策
45、一切软件系统都是遗留系统
- 即使系统十分前沿,采用了最新的技术开发而成,但对于接手的下一个而言,它也会是遗留系统。
- 设计优化的架构基础,考虑如下几个问题:清晰性、可测性、正确性、可跟踪
- 可以参考一些优秀的开源项目
46、起码要有两个可选的解决方案
47、理解变化影响
- 优秀的架构师能够深刻理解变化带来的影响,这种影响不仅限于彼此隔离的软件模块之间,而且包括人与人之间,以及系统与系统之间。
- 变化有多种不同表现形式:功能需求的变化、可扩展性需求的演进、系统的接口被修改、团队人员流动等。
- 常用方法减轻变化的影响:运行小规模的增量渐变、构建可重复运行的测试用例、让测试用例更易编写、跟踪好依赖关系、系统性的行动,根据反馈信息作出进一步反应、自动化重复的任务。
48、你不能不了解硬件
- 学习硬件知识
- 和基础设施架构师紧密合作
49、现在走捷径,将来付利息。
50、不追求“完美”,“足够好”就行
- 在设计和实现上追求完美,会导致过度设计和模糊混乱的解决方案,最终使系统难以维护。应用程序开发不是选美大赛,因此,停止吹毛求疵的做法,不要再浪费时间追求尽善尽美。
51、小心“好主意”
- 那种诱人的、不用想都知道的、外表无辜、以为不可能会产生伤害的那种“好”主意。通常在项目进展到一半而似乎一切看起来都挻好——形势和进度都在循序渐进,初步测试进展顺利,落地日期看起来可靠无误——的时候,项目团队中有人会冒出这些想法。务必小心那些“好主意”,它可能会杀死你的项目。
52、内容为王
- 很多系统的成功取决于其内容的建设。
53、对商业方,架构师要避免愤世嫉俗。
54、架构师要以自己的编程能力为依托
- 对应“架构师首先是开发人员”
55、稳定的问题才能产生高质量的解决方案
- 只要问题是稳定的,你就可以创建出一个拥有稳定设计的系统。稳定的设计可以让你集中精力,打造出高质量的应用程序。
56、天道酬勤
57、弃聪明,求质朴。
58、对决策负责
- 重要的架构决策应该以书面形式记录下来,它们必须经过校核证实,并可被追溯。
- 必须和执行该决策及会直接或间接受其影响的人进行过沟通,达成共识。
59、精心选择有效技术,绝不轻易抛弃。
60、客户的客户才是你的客户!
61、事物发展总会出人意料
- 设计是一个不断发现的过程,发现问题并解决问题。
- 没有永不过期的解决方案。
62、着重强调项目的商业价值
- 形成价值陈述
- 建立量化的度量标准
- 回过头来关联传统商业的衡量方式
- 知道该在哪里停止
- 寻找恰当的时机
63、偿还技术债务
- 花合适时间“一次做对”!
- 取巧走“捷径”,争取尽快推出修改后以产品。
64、打造上手的系统
- 用户体验很重要
- 对最终用户而言,界面就是系统!
65、找到并留住富有激情的问题解决者
- 我们所要找的,是那种具备解决问题的能力和激情的开发人员,都善于攻克各种难题的人才。
- 提防批评过度,它可能会扼杀开发人员的创造力,降底生产力。
- 好的开发人员都非常聪明,他们知道自己并非一无是处,如果你对其工作吹毛求疵,将会降低他们对你的尊重!
- 以正确的方式经营开发团队,其重要性不言而喻。
66、学习新语言
- 想要理解客户或者想让客户理解你的语言,必须学习客户所在行业领域的语言,这样才能做到有效沟通。
67、优秀软件不是构建出来的,而是培育起来的。
- 设计尽可能小的系统,帮助成功交付,并推动它向宏伟的远景目标不断演化。注意,不要把这种演化式方法和削减需求、规范混乱和生产废品这样的做法混淆在一起。