文档章节

雷观(十三):功能优先,开发与重构并举,性能殿后

FansUnion
 FansUnion
发布于 2015/10/22 10:30
字数 1199
阅读 4
收藏 0
点赞 0
评论 0
      根据自己2年多的实际开发经验,我认为:在项目开发过程中,功能是最优先的,开发与重构同样重要, 性能放后面考虑

    我们工作的最基本目标是,保证工作单位的项目能够如期交付,至少要保证自己的进度。一份薪水,一份责任。
此外,作为技术工作者,我们也有自己的技术追求,提高写程序的能力,写有含金量的代码,保证自己的能力能够与时俱进。

    功能优先,进度就是最直接的要求。对于有可视化界面的项目来说,功能能跑通更是最基本的。Boss看不到界面和功能可以正常运行,是不能清楚地知道你的进度了。客户看不到界面,就等于未完成,人最怕没有进度条,只能焦急地等待。下游环节,比如功能测试等,不到完成的功能交付,真正的测试工作就无法开始(测试用例可以提前编写)。

   重构与开发并举, 项目开发过程中,重构很重要。前期的设计再详细,不到实际动手编码,很多问题的细节,你是考虑不到的。因此,代码功能虽然完成了,但是经常存在思路不清楚、代码重复等小问题。所以,开发完一个小功能,重构一下,比如提取清除不必要的临时变量、取个更准确的方法名称、提取公共的逻辑为工具方法等。而在后期,大的重构则要慎重。主要是这个时候,重构与项目质量与项目进度可能冲突。尤其是对项目负关键责任的经理等人,不希望在交付前期,出现差池。

性能殿后,不是说性能不重要,而是说性能不好衡量,在项目前期和运营前期,性能不好向客户等角色阐述它的价值。此外,很多项目前期对性能的要求根本不会太高,只要不乱写代码,性能应付前期一般是可以的。
  很多项目,比如针对普通消费者(to-c) 的项目,前期可能就对性能有明确要求。针对这种情况,我觉得:项目的架构设计、代码组织、数据库设计,只要保证结构清晰和业务清晰,后期优化是很容易的,基本不会对代码的整体结构有大的改变。比如增加缓存,不会对核心业务有改动。

  以上是大道理,下面以我最近的项目开发经历, 再谈谈一点体会。

  项目,后端是个管理系统,从后台读取数据,然后显示当前用户可以操作的菜单。

   功能优先,我们有3个开发,同时进行编码。菜单是项目最基本的,没有菜单,开发测试非常不方便,所以非常迅速简洁地把权限和菜单做了出来。
   
   开发与重构并举,最近主要功能完成了,我想对菜单这块进行重构。以前为了优先保证整体进度,菜单相关表存储了一些额外的数据,感觉比较多余,而且要完成新的功能,又需要编辑这张表的数据。手动维护冗余字段,给新功能带来了额外的工作量。所以,我觉得先重构,再完成新功能。

   但在重构中,我范了“编码之大忌”,这是一个反面典型案例。

  我一边完成正常功能、一边为了保证程序的性能,写了不少功能之外的代码。大概是这样,把List集合转换成Map格式的Tree树,写的是递归算法。本来递归,对思考逻辑就要清楚,为了性能,多写了判断“提前返回” 的优化代码。结果很惨,优化代码写得不准确,导致最后的菜单数据,不出来、数据不完整(提前返回导致的)。

  事后反思,我觉得写代码的时候,尽量先专注一件事, 逐个击破比较好。把功能正确实现,在写的过程中,如果有疑问,比如数据校验、性能之类,可以先写个"TODO:需要优化",等功能测试通过,再搞下一个。One by one, it is good.


雷观:小雷FansUnion的个人观点,欢迎互动交流
2014年12月15日
湖北-武汉-循礼门

版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

共有 人打赏支持
FansUnion
粉丝 56
博文 857
码字总数 825464
作品 0
丰台
高级程序员
深入 Python :Dive Into Python 中文版 读书笔记 第13,14,15单元测试

第 13 章 单元测试 13.4. 正面测试 (Testing for success)13.5. 负面测试 (Testing for failure)测试有效输入还不够,还必需测试无效输入,而且要按预期失败形式执行13.6. 完备性检测 (Testing...

sToa ⋅ 2014/03/09 ⋅ 0

重构学习(一)

重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下。提高其可理解性,降低维护成本。 重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调...

casoc ⋅ 2016/07/26 ⋅ 0

Beetl 1.2 正式发布,Java 模板引擎

相对于半年前的Beetl1.1 ,Beetl1.2.0做了如完善 模版核心引擎部分: 优化了静态文本合并输出功能,性能有了一定提高。第三方测试结果表明在开启编译和二进制输出功能后,性能是freemarker的2...

闲大赋 ⋅ 2013/01/31 ⋅ 22

Android Studio 0.5.5 发布

Android Studio 0.5.5 发布了,该版本更新到 IntelliJ 13.x EAP build: 135.667. 包含多项改进,详情请看发行说明。 Android Studio 是一个全新的 Android 开发环境,基于 IntelliJ IDEA. 类...

oschina ⋅ 2014/04/18 ⋅ 14

Android Studio 0.2.4 发布

Android Studio 0.2.4 发布了,该版本合并了最新的 IDEA 13 快照版的特性;改进了 Gradle 的集成。详细介绍请看发行说明。 Android Studio 是一个全新的 Android 开发环境,基于 IntelliJ I...

打杂程序猿 ⋅ 2013/08/16 ⋅ 33

H5微信牛牛棋牌房卡出售TypeScript VS JavaScript 深度对比

TypeScript 和 JavaScript 是目前项目开发中较为流行的两种脚本语言,我们已经熟知 TypeScript 是 JavaScript 的一个超集,但是 TypeScript 与 JavaScript 之间又有什么样的区别呢?在选择开...

棋牌出售 ⋅ 01/08 ⋅ 0

关于烂代码的那些事(下)

1.改善可维护性 改善代码质量是项大工程,要开始这项工程,从可维护性入手往往是一个好的开始,但也仅仅只是开始而已。 1.1.重构的悖论 很多人把重构当做一种一次性运动,代码实在是烂的没法...

莫铭 ⋅ 2016/08/02 ⋅ 0

读《代码重构》一书小计

通过阅读《代码重构》一书,让我了解的最重要的一点是“重构不同于优化”。在这之前,我的观念中,“重构”与“优化”是划等号的。不过通过这本书,我了解到他们做着完全不同的事情,甚至是对...

钟良 ⋅ 2016/07/13 ⋅ 1

We7 CMS 2.8 版本正式发布

尊敬的用户: 不想叫您等太久,所以,今天我们发布了We7 CMS 2.8版。 在这个版本里,我们将更多的注意力集中在了用户体验和代码质量上,为此,我们在功能精简提炼和性能优化上做了大量工作: ...

Steve Wone ⋅ 2011/11/28 ⋅ 3

java代码重构

重构(Refactoring)就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。   也许有人会问,为什么不...

Sephiroth ⋅ 2010/05/07 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【elasticsearch】 随笔 Date datatype

一。时间类型的本质 首先json是没有时间类型的,对于es来说,时间类型的标示可以是下面三种情况 1.一个时间格式的字符串,如:"2014-11-27T08:05:32Z","2015-01-01" or "2015/01/01 12:10:3...

xiaomin0322 ⋅ 25分钟前 ⋅ 0

阿里云资源编排ROS使用教程

阿里云资源编排ROS详细内容: 阿里云资源编排ROS使用教程 资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、...

mcy0425 ⋅ 28分钟前 ⋅ 0

适配器设计模式

1、适配器模式 把一个类的接口变换成客户端所期待的另一种接口 使原本因接口不匹配而无法在一起工作的两个类能够在一起工作 分为类的适配器模式和对象的适配器模式 2、类适配器模式 类的适配...

职业搬砖20年 ⋅ 32分钟前 ⋅ 0

npm操作报错 _stream_writable.js:61

有一天 不知道什么原因(估计和node的版本有关),无论你做什么npm的操作 都会报错/usr/local/lib/node_modules/npm/node_modules/readable-stream/lib/_stream_writable.js:61 这时候只要执...

lilugirl ⋅ 35分钟前 ⋅ 0

Eclipse安装插件的几种方式

Eclipse魅力之一就是支持可扩展的插件,来丰富自身的功能,这种方式也是建立在开源思想之上的。具体使用什么方式去安装插件,要看我们拿到的是什么。 1. 拿到的是一串URL,如http://subclips...

GordonNemo ⋅ 38分钟前 ⋅ 0

div图片叠加

css实现代码如下: <div style="position: relative;"><!--这个层为外面的父层,需设置相对位置样式--> <div style="position: absolute;"><!--子层,需设置绝对位置样式--> <i......

niithub ⋅ 39分钟前 ⋅ 0

作用域slot

如果父组件需要使用子组件中的内容怎么办,比如父组件需要控制子组件的显示 <div id="root"><child><template slot-scope="props"><h1>{{props.item}} <div>编辑</div></h1><......

金于虎 ⋅ 42分钟前 ⋅ 1

HongHu commonservice-eureka 项目构建过程

上一篇我们回顾了关于 spring cloud eureka的相关基础知识,现在我们针对于HongHu cloud的eureka项目做以下构建,整个构建的过程很简单,我会将每一步都构建过程记录下来,希望可以帮助到大家...

明理萝 ⋅ 45分钟前 ⋅ 1

xml和对象的相互转化

@Data//setter和getter方法,toString和equals,hashcode方法@EqualsAndHashCode//代表重写equals和hashcode方法@XmlAccessorType(XmlAccessType.FIELD)public class Classroom {@X......

拐美人 ⋅ 45分钟前 ⋅ 0

tableView cell的高度 分组头部尾部的高度 自适应

@property (nonatomic) CGFloat rowHeight; // default is UITableViewAutomaticDimension@property (nonatomic) CGFloat sectionHeaderHeight; // default is UITableViewA......

娜一片蓝色星海 ⋅ 46分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部