推特上, 有网友问我: ”想问问 Andy 老师在开始一个项目的时候是怎么区分必要的设计考虑和过早优化的?“
我用这个标题来回答很多年轻开发者的这个问题吧:
-
第一阶段, 年轻的时候, 读的书不够多, 知识不够丰富, 被客户虐的少的时候, 我建议大家不要想架构设计这个问题, 自寻烦恼, 这时候你心中想着变成架构师, 但是能力非常不够, 怎么改都是错。 那怎么办? 乱写也行, 按照你臆想的‘设计模式’写也可以, 对不对不重要, 关键是代码量要上去, 失败次数足够多, 经验足够多是年轻程序员最宝贵的财富
-
第二阶段, 要从写代码到‘完整的做产品’, 对, 我说的不是‘架构’, 是‘完整的做产品’, 因为你独立完整的做产品, 你就会知道, Demo 和产品之间差的不是‘模式设计’, 而是你觉得代码写完以后, 产品的细节才刚刚开始, 用户会以你完全意想不到的方式去用软件, 那时候你会发现你自己给自己臆想的设计模式根本搞不定用户需求, 当你有一天终于满足用户的需求的时候, 你会发现你创建了好大一座‘si 山’
-
第三阶段, 当你做了足够多的项目, 被客户虐过很多遍以后, 你会理解, 避免 ‘si 山’ 的关键是要理解需求, 而不是一个好的 ‘架构设计’, 你会发现当你能力够了以后, 你不再是迷恋自己是否是大神, 你仅仅是客户和计算机之间的‘技术翻译员’, 技术的深度不能拯救你, 了解不同人心理的广度更重要
-
第四阶段, 恭喜你, 这时候你已经很不错了, 知道先理清楚需求, 先根据用户的需求来设计架构, 而不是过度迷恋工程细节和代码优雅, 甚至会事先抽象一些模块、 流程和数据结构来事先规避返工和混乱
-
第五阶段, 当你被客户虐了千百遍, 当你已经从美少年变成中年油腻大叔, 你的心态会发生变化的。 你会知道那个答案的: 最优雅的设计模式是最简单的代码, 尽量写函数(不要写一堆祖谱关系的类), 尽量用基本的数据结构(Dict、 List、 Tuple) 来存储数据(不要用复杂的数据结构)、 尽量用组合方式来保持清晰数据处理逻辑(而不是用复杂的祖谱类和遗弃数据面条来表示)、 中间稍微重复最后重构(而不是没事就抽象重复函数, 其实就两份函数重复了)…等等
为什么? 因为架构设计是为现实需求服务的、 架构设计是为清晰数据流向服务的、 架构设计是为了大胆删除代码不要有副作用设计的, 架构设计是为简单服务的。
架构设计是你深入理解计算机这个工具和现实世界复杂的人性后, 自然而然的动作, 是无招胜有招, 不要用学校学的‘设计模式’来给自己的想象力画地为牢。