在你编码之前(转)

 很多开发者,将自己限定为程序员,觉得自己就是一个专业写代码的,和代码稍微远一点东西,就不感兴趣。

  在前一篇文章 《软件开发之未来》 中, 我已经阐述了技术的时效性以及快速更新。

  如果我们紧紧把目光局限在代码,而不是分析、解决问题的综合能力,我们将迟早陷入中年危机, 被奔腾的技术潮流淘汰。

  这篇文章我想讲讲分析问题、解决问题的基本套路,这是我多年总结下来的习惯,希望对大家有帮助。

  绝对不是立刻写代码

  有些同学钟情代码,收到一个任务,马上就想到代码实现。

  问题都还没弄清楚,工作原理还没分析透,就开始整出几个类,然后思考如何用这些类。

  找人讨论,直接看代码。

  这是准备死 1000 次的节奏。

  动笔头: 设计文档

  有些新人,很有责任心,碰到问题也会找我沟通讨论。 但是怎么也不能深入下去,执行效果千疮百孔,各种返工改进,考虑不周,不能产品化,弯路不少。

  问题在于,不善于动笔头。动笔头的目的:

  1. 沉淀思考结果:

    每次思考,每次讨论,达成一步认识,就固定下来。上一步台阶,步步为营才能达到目标。

    如果不记录,就会焦虑,就会低水平原地重复思考。

    大多数人的大脑内存有限,必须借助文档这种外存进行交换才能顺畅运行的。

  2. 文档是 alpha 版本的程序

    大脑就是运行文档的计算机。

    看一遍文档,让整个系统在运行之前,在大脑里面运行一遍。

    每次运行一遍,才能发现是否会抛出异常。对这些异常,在文档修正。然后再次运行,再次寻找处理异常。

    不仅仅在自己大脑运行,还要通过设计评审在别人大脑运行。如果有多种方案,需要大家进行评测那条最佳。

    不可能一次就做好设计,只有反复运行,多处运行,才能最终出错可能性最小。

    因此文档是否清晰明了是否简单,非常非常关键。

  设计文档我推荐采用幻灯片的形式,因为一个页面说明一个问题。大标题配小节,更简洁。

  下面的各个章节,也是这个幻灯片文档的主要内容。

  当然你如果问题不大,对自己的大脑内存以及表达能力有信心,也可以不写设计文档。 风险自己承担了,其实设计文档不费时的。

  陈述问题

  陈述问题,也是陈述需求。

  陈述问题,不应该太涉及技术层面的问题。更多是从前用户的角度来陈述。

  陈述问题,应该是普通用户都能够看明白是什么东西。

  需要将各种场景都说明白。不能漏掉场景,否则对我们之后的设计会存在偏差。

  最终设计完成,需要验证这些问题、需求都得到满足了。

  这些需求、问题,也需要做一个轻重缓急的判别。因为我们整个设计过程,最终需要做一个开发计划,要求能最快提交一个最小的可工作版本。 这样才能做到敏捷。

  陈述问题,有时候不仅需要明确做什么,还要说吗不做什么,这是需要明确系统范围。

  如果是多用户系统,需要罗列参与的用户角色,以及每个人的希望的获得功能。

  工作原理图

  一图抵万言。特别是对于用于沟通的设计文档,文字越少越好。图形能表达最多的内容。

  工作原理图是一个方案的陈述方式。可以有一张,或者多张。这个是整个设计的中心。

  工作原理图,通常包括系统和外部直接的交互关系图,以及系统内部的组成结构图。

  这 2 种图,由方框和连线组成,方框表示模块,连线表示接口。需要标注各个接口和模块的名称,以及接口调用的主要顺序。

  画原理图,不仅仅画画,而是真正的设计。里面蕴含大量思辨,需要我们拟清各种概念。

  模块和接口命名,是思辨的体现。名不正则言不顺。

  围绕这个原理图,需要对个模块和接口进行说明,这个组成了所谓的设计正文。

  用户 UI 设计

  如果需要用户参与,需要设计用户 UI。当然如果是后端应用,需要明确接口。

  用户 UI 往往要比较早明确,因为明确 UI,才能细化需求,这个和概要设计也是相互呼应和印证的。

  用户 UI 设计之所以重要,在于,这是更多从用户的角度思考问题,因此更能完整表达系统,明确正确的方向,方便引导思考进入深入。

  当然如何设计,也会考虑从前方便实现的角度权衡。二者之间如何拿捏,这个是艺术所在。

  开发计划

  也就是 todo。

  一次设计下来,是需求和想法不断膨胀的过程,往往把简单的事情,弄得很复杂。

  开发计划,则是如何干了。这时候主要的思考点,就是理想很伟大,但是我们如何做快速做一个可工作的最小版本。

  大胆假设,小心实践也是这个意思。其实我们设计的内容,可能很多都是错的。

  设计是永远的,不会终止于一次设计文档,也不会终止于评审,也不会终止于若干次改稿。 设计在开发的过程中,才是真正深入,这时候会不断发现之前设计的问题。

  做一个最小可工作版本,这时候再次评估一下设计,发现问题多多。

  所以,设计要尽早做,因为每一次回顾,我们基本上都会有新思路。 最早设计,最晚动手,这才是靠谱的方法。留给我们更多时间去消化完善设计。

  根据问题,补充内容

  初步的设计完成,就会发现各种问题,和疏漏。

  准确记录下问题,然后思考解决方法。

  其实我们如果能够准确的表达出问题,解决方法往往是呼之欲出的。

  更新 Reference 文档

  其实设计文档,长期保留的价值并不大,原因是:

  • 文档过于简单,而且之后各种产品文档应该会包含设计文档的内容。
  • 文档很容易过时,正式开始编码之后,设计仍然在变,这时候通常不会再去更新设计文档

  所以设计文档通常都是虎头蛇尾的。

  一旦确定设计,设计人员需要优先更新 Reference 文档,而且长期去维护这个 Renference 文档。

  Reference 文档是一些参考手册,包括 API 手册、系统维护手册,诸如此类。

  这些文档是提供给其他用户,需要永久保留的。

  很多人老是觉得没有时间维护这些文档。在设计阶段维护这份文档,其实很重要。

  这份文档,其实就是详细设计文档,在编码之前,从用户角度更深入的设计系统,再次发现设计的问题。

  如果觉得 APi 很奇怪,或者操作手册很难写,那么可能设计存在问题。

  小节一下

  分析问题、解决问题,我的套路,基本是这些,其实不麻烦。

  但是这些是可以用在生活工作的各个方面的,是属于“道”层面的东西,如果编码是“术”的话。

  我们都希望成为一个做事靠谱的人,即便在你不熟悉的领域,也能借助资源做好一件事情,上面的分析方法,可能值得借鉴。

时间: 2024-09-12 16:02:06

在你编码之前(转)的相关文章

详解Eclipse Galileo中的快速Java编码

问题 无论您的项目或团队的规模有多大,在编辑代码库时,都会遇到如下的两 个问题: 代码模板 尽管代码模板是提高工作效率的一个理想途径,但需要确 保不能用模板来替代真正的重用,即编写方法或函数以便将它们用于许多位置.如果您有 一大段代码,那么最好在使用代码模板前先考虑采用带有变量的各种方法. 缺乏 一致性 - 当团队中的很多人编辑文件时,难免会有编码上的些许差异,但这些差 异会使代码变得难于读懂和维护.这种情况下,很难搜索到代码差异在何处发生.即便代 码是您一个人写的,如果您忘记了前面代码是如何编

outofmemoryexception-VS2013 coded ui test 编码的UI测试 导致程序内存溢出

问题描述 VS2013 coded ui test 编码的UI测试 导致程序内存溢出 我在使用VS coded ui test对一个Winform的程序做自动化测试的时候,每次都在最后抛出OutOfMemoryException的异常,不知道怎么解决. 大家能不能帮忙解决下? 有没有什么方法控制或者监测内存使用情况啊?

文件名的字符编码和c的fopen函数问题

问题描述 文件名的字符编码和c的fopen函数问题 问一个问题,文件名的存储和文件名的显示应该是两回事吧 中文版windows的环境字符集是GBK GBK中"茅"的编码是 195 169(十进制) 如果我在中文版windows里看到个文件叫"a茅" 那么他的文件名在硬盘中的存储方式应该是97 195 169 我编了个c程序如下: FILE *fp; char b[100]={'a',195,169,0}; strcat(b,".html"); i

PHP编码规范-php coding standard

standard|编码|规范 目录 介绍 标准化的重要性 解释 认同观点 项目的四个阶段 命名规则 合适的命名 缩写词不要全部使用大写字母 类命名 类库命名 方法命名 类属性命名 方法中参数命名 变量命名 引用变量和函数返回引用 全局变量 定义命名 / 全局常量 静态变量 函数命名 php文件扩展名 文档规则 评价注释 Comments Should Tell a Story Document Decisions 使用标头说明 Make Gotchas Explicit Interface an

编码练习:猴子捡桃

插入前面:这段内容本来在下面猴子分桃题目之前是没有的,想看题,可以先看后面的题目,然后看着插入在前面的关于递归实现下面问题的代码,为什么要突然放在前面,因为这是一部分比较重要的内容,是个思想锻炼的结果和总结,另外最后吗还给出了错误的代码以及错误的原因可以对比理清思路: 1 #include <iostream> 2 using namespace std; 3 4 5 int recursion(int time,int n) 6 { 7 int sum; 8 if (time == 0) {

探秘视频编码黑科技,窄带高清2.0视觉模型及场景实战

"黑科技"这个词已经成为了今年云栖大会的关键词.那么,在我们熟知的视频领域,什么才算是黑科技呢? 我们知道,在通常情况下,视频画质越好带宽费用肯定越高,带宽又是视频服务中占比很高的一项成本,很多开发者都在寻求效果与成本的平衡点.那么,有没有一种技术,能够在保证甚至提高视频画质的同时,降低带宽呢?如果有的话,小编觉得这一点可以算是黑科技了吧. 今天,小编就带大家来了解下刚刚在云栖大会上重磅发布的阿里云窄带高清2.0,看看它是如何超越压缩极限,在视觉效果和带宽成本中找到平衡的. 首先,我们

关于ISO-8859-1编码

在Java的一些程序中经常可以看到有这样的代码: String.getBytes("ISO-8859-1") . 虽然我是大概知道这个是以单字节来解码的,我也不写这样的代码.但是见得多了,总要多了解下. 以下from http://baike.baidu.com/view/2613676.htm ISO-8859-1 ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0

Web开发者不可不知的15条编码原则

 HTML已经走过了近20的发展历程.从HTML4到XHTML,再到最近十分火热的HTML5,它几乎见证了整个互联网的发展.但是,即便到现在,有很多基础的概念和原则依然需要开发者高度注意.下面,向大家介绍这些应该遵循的开发原则. 1.善用DIV来布局 当开发一个Web页面时,要考虑第一件事就是区分页面重点.将这些内容用DIV标签包含起来,页面的代码会呈现出整洁.缩进良好的风格. <div id="header"></div> <div id="b

哈夫曼(huffman)树和哈夫曼编码

哈夫曼树 哈夫曼树也叫最优二叉树(哈夫曼树)    问题:什么是哈夫曼树? 例:将学生的百分制成绩转换为五分制成绩:≥90 分: A,80-89分: B,70-79分: C,60-69分: D,<60分: E. if (a < 60){ b = 'E'; } else if (a < 70) { b = 'D'; } else if (a<80) { b = 'C'; } else if (a<90){ b = 'B'; } else { b = 'A'; } 判别树:用于描

linux 中配置apache 网站 编码设置为gb2312 浏览乱码

问题描述 linux 中配置apache 网站 编码设置为gb2312 浏览乱码 httpd.conf 添加了 AddDefaultCharset GB2312? 网页添加了 浏览器浏览的时候默认编码格式还是utf-8 显示乱码 解决方案 将环境变量LANG设置LANG="zh_CN GBK"