编程漫谈(十六):设计与编程
设计先行。
设计###
设计是构思一件事应该是怎样、方案的形态、并论证可行性的过程与产出。
站在设计者的角度:应该是什么样子,为什么? 主要考虑如下要素:
安全、实用、可靠、效率、便捷、流畅、简洁、易懂、易操作
需要根据实际情况进行取舍权衡。
软件设计的主要工作是:
- 深入认识领域,分析和梳理需求
- 领域建模,概念提炼,实体及关联
- 选择合适的数据存储,解决关键技术问题
- 选择合适的技术栈
编程###
编程是实现指定功能的具体方法和步骤,是执行者角度。
站在执行者的角度:怎么弥合现实与理想的鸿沟?
编程的主要工作是:
-
选择强大而可靠的库和框架,提升开发效率;
-
注重实现细节,保证性能和稳定性
-
增强健壮性,防御式编程
-
遵循单一职责及小而美原则,创建可复用的工具与业务方法
-
为扩展预留空间
写出好程序###
程序世界是无界限的。没有所谓的前后端开发测试运维之分(那只是管理术语)。因为所有的程序基于相同的思想与本质。当心中无狭隘的边界之分时,就可以自由遨游于技术的海洋,从多样化的技术中汲取营养。谦逊、好奇、自由。
要写出好程序,有四个小经验:
- 抽象与分层。一个流程里,engine, checker,fetcher, assembler, transformer, ... , 构建合适的抽象与分层,流程与交互会更清晰可读;
- 关注点分离。将大量细小的业务点分离成单一职责的方法,更易测易复用而不易出错,也会更容易组合而扩展与配置。
- 防御式编程。牢记:错误将无孔不入。一个流程或功能有哪些潜在的错误以及如何精细处理好,是区分合格程序员与优秀程序员的一大依据。一个文件读操作,可能会发生哪些错误呢?
- 设计模式,数据结构与算法、函数式编程与元编程、IOC与AOP是增强编程内功的不二法门。
抽象与分层###
最近排查解决一个问题,突然又想到那个问题:软件维护成本是怎么产生的?除新需求外,往往来自之前埋下的坑。那么坑又是怎么产生的呢?通常是设计不严谨导致。 由于设计不严谨,遇到特定情况或者扩展就要做特殊处理,要做兼容,一个兼容可能引发一系列兼容,尤其源头的不严谨,会导致源到端的一整条路径的兼容,代码就会比较难看难理解,这样就埋坑了;解决坑的时候,兼容性的解决方案,在事情的变化中又会埋下新的坑。程序猿媛们就在埋坑和填坑的往复循环中“痛苦并快乐着”。
那么设计不严谨又是怎么产生的呢? 通常是抽象和分层做的不够导致的。开发人员习惯于按照流程顺手写下来,而不细思和提炼出流程中的概念、关联、实体、交互等,将其构建成一件精妙的逻辑装置。结果就是当有变化的时候,装置就出毛病罢工,就要做难看的兼容。这要求开发者能够克制性地向前一步思考,不急于着手,而是仔细推敲流程,提炼出关键因素,进行抽象和分层,在其指引下进行开发和编程。
抽象与分层能力,是程序员的内功心法。能够细致思考抽象与分层的开发人员,做出的设计和写出的代码往往更加简洁优雅。而考察程序员,不仅仅看其已经掌握的知识和技能,更要看他是怎么去思考和解决问题的。不同人的多样化的思考和解决方式,或许比标准答案更加有趣。