【开发模式】项目过早优化现象:处女座专属鸡汤

最近在Coursera上看机器学习,顺便梳理了下算法体系。

其中Andrew Ng就有提到一个“过早优化”的观点非常喜欢:

        与其将大把时间花费在挑选学习算法、更换模型上,然后花费6、7个月收集数据,(潜台词:这是愚蠢的做法,bad idea)

不如

        凭直觉先随意挑个算法、用少量数据在1,2天内进行实现,然后通过学习曲线、误差分析来调整这个学习算法,并判断特征是否足够区分,是否需要加入新的特征变量,直到有证据表明目前特征适合且只欠缺样本量/数据后再开始收集。这样花下去的时间才更容易有所收获。(潜台词:这才算把时间花在刀刃上,recommended way)

 

        这里我将其延伸到项目优化问题上,整理下自己的看法,请各位看官手下留情~

A. “艰难的开头”

        在学校里,基本每门语言课的老师都会强调代码的可读性。这本无问题,但可读性、交互性(特别是涉及GUI交互)在更多时候与性能优化是矛盾的。希望脚踏两船的往往弄得焦头烂额,最后还是不得不妥协,只能折中偏向其一。

        而上过设计模式的课后,多数同学更是为了可读性、复用性、拓展性……在项目的开始就一头扎进了无限优化框架的不归路。

        特别是对于项目经验并不丰富的同学,往往在项目的开头就因为想着如何搭好框架而把自己弄得精疲力竭,进度停滞;想着后续的功能需求还一个都未实现,心里更是惴惴不安;面对BOSS的一次次催促而逐渐厌烦,导致项目的一个DEMO都没出来就已宣告放弃。

        当然,这更多是自己的亲身体会,每每项目开头总会被各种框架设计问题折腾不休,直到将系统走通或主要功能实现才松下这口气。如今看来,如果开始就从功能着手,一步步增量,反而更轻松、更适合这些项目的进度要求。而在一开始就铺开框架,往往后期会因为先天庞大的结构调整不止:一面为以后预留接口,一面修改甚至还删去当初不必要的拓展。

 

B. “瀑布式开发” v.s. “迭代式开发”

        其实,现在看来过早应用“设计模式”并没有想的那么好处多多,其更像“瀑布模型”这种弊端多多的线性开发模式,至之上而下,在初期进行更多优化设计,并只有等到整个过程的末期才能见到开发成果,从而增加了开发风险。

        “迭代式开发”反而是更多项目最好的选择,而非一无是处只适用于理论的概念。

        “迭代式开发——不要求每一个阶段的任务做的都是最完美的,而是明明知道还有很多不足的地方,却偏偏不去完善它,而是把主要功能先搭建起来为目的,以最短的时间,最少的损失先完成一个“不完美的成果物”直至提交。然后再通过客户或用户的反馈信息,在这个“不完美的成果物”上逐步进行完善。”

        其实不完美并不可怕,多数项目后期弥补的代价往往是可以接受的,项目进度的不可估计、风险的未知往往才是项目失败的根源。

 

C. 耦合 v.s. 性能

        此外,“设计模式”强调的低耦合往往是冗余的根源,在性能方面的表现与其完全是负相关。真正高效的代码,绝对是能合并方法就合并方法,能枚举的就绝不遍历,最好所有代码全写在一个方法内。当然,这又是一个极端了。

 

D. 结论:好钢用在刀刃上       

        说了那么多,其实想表达的就是项目过早优化不仅费心费力,而且容易起反效果:后期因为庞大的框架与多余的部分而轻松不起来。

        因此写代码还是顺心就好,时间要花在刀刃上。框架优化了性能降低、性能提升了可读性差,既然无法两全,除非指标要求,何苦纠结这个呢,项目开始就走极端可不是一个好的做法哦~

       打下补丁:当然自觉代码水平极烂的还是得花时间规范下吧。

时间: 2024-10-06 00:31:59

【开发模式】项目过早优化现象:处女座专属鸡汤的相关文章

项目之开发模式

项目开发模式: 1.瀑布式: 设计好你能想到的最好的算法,然后開始实现 比如:做一辆摩托车,開始的时候就整合想着摩托车怎么做 弊病:开发周期太长,没有想好最优的算法不開始运行代码 2.迭代式: 迭代这两个字我见的也少,字面没法理解,举例吧,做摩托车,先做出一辆自行车,然后开发时间到了,能够先交出一个半成品,然后在自行车上加入发动机

项目中生产模式和开发模式的切换

1 #ifndef NetMacro_h 2 #define NetMacro_h 3 4 5 #define TEST_ENVIRONMENT // 当前为开发模式,若注释到这行代码即为生产模式 6 7 #ifndef TEST_ENVIRONMENT 8 // 这里写开发模式下需要用到的URL 9 // 如: 10 #define HTTP_PORTAL @"10.0.0.26:8080" 11 12 13 #else 14 // 这里写生产模式下需要用到的URL 15 // 如:

.NET简谈插件系统开发模式

摘选自[王清培]博客 http://www.cnblogs.com/wangiqngpei557/archive/2011/06/10/2077413.html 今天跟大家分享一下我们在日常开发中并不常用的开发模式“插件系统模式”,什么叫插件,从大一点的概念讲就是我们开发的软件是由很小的模块组成,每一块都能成功的装卸,使我们的软件成为一个有机体,在发生重大事故.改良优化等等的时候,我们不需要重新编译我们的系统就能很方便的进行升级替换进行使用:这样的开发模式就是插件系统开发模式:这个概念很大,每个

将基于Dagger-1开发的项目迁移到Dagger-2中

原文链接 : Dagger 1 to 2 migration process 原文作者 : Miroslaw Stanek 译文出自 : 开发技术前线 www.devtf.cn 译者 : chaossss 校对者: tiiime 状态 : 完成 我相信每一个 Android 开发者都听说过依赖注入框架,事实上几乎所有 Android 官方会议都讨论过软件设计模式.虽然我是依赖注入的脑残粉,但我不得不承认也有人不喜欢依赖注入,主要原因如下: 依赖注入框架很慢 - 好吧,在使用 RoboGuice

ThinkPHP中的MVC开发模式理解一

MVC这三个字母不愧博大精深,当我自以为要马上攻破php最后一道难关的时候,那时候的我好想就想错了,当我研究了一个半月之后,竟然发现其思想是那么的难以理解,直到现在我也不得不承认我只是对这个思想的认识只是一个皮毛,对于很底层的东西还是不太理解,还有别的要说的,但先说一下我对MVC的理解: 其实MVC并不是一个什么语法或者算法,只是一个开发模式,说道开发模式,我所知道的有传统的MODEL模式,即过程化的处理,而MVC则是对结构做了一个很好的优化,更像是一种开发规范,你必须要根据规范去执行,才能够去

android加载速度优化,通过项目的优化过程分析

通过这么长时间的盒子开发以及之前手机项目的经验,总体感觉两种不同设备还是有很多不同的地方的,首先一点不同的就是,手机项目和电视项目默认启动页面加载速度有重要区别 对于手机:手机加载网络数据,由于屏幕小,如果主页有网络图片的情况下,基本都是显示默认图片,这也是由于网速的限制,更重要的是手机上基本是图文混排,用户没看到图片可能焦点就在文本上了. 对于电视:如果应用首页加载使用默认图,会感觉特别丑,因为屏幕大,重要信息都是图片,如果没有图片,那用户看到的都是空白,用户的焦点没有了,只有等待和抱怨. 因

企业应用开发ERP项目中应用到的技术和工具

一.基础技术选型 C# .NET 3.5/4.0  这两个版本的.NET已经相当方便(Linq, Lambda,Parallel),语法简洁,配合WCF和WF两项技术,可以满足快速开发,维护方便的目标. Win Form  因ERP项目涉及大量的表单(Entry),查询(Enquiry),报表(Report),WinForm仍然是首选技术.自定义控件,数据绑定,自定义窗体,这三项技术组合起来可产生无穷的威力. SQL Server 2005  取兼容性最好的一个版本.2008/2008 R2/2

新开发模式下自动化测试

关键字:自动化,测试, 功能测试 测试的目标是两个:"发现系统中存在的问题"和"证明系统能够满足用户的需求". 自动化测试既不单指某种工具,也不仅仅指某种测试技术,它是工具.过程.人员和方法的组合. 测试的现状Testing is dead 开发速度第一质量第二 新的敏捷开发模式 开发人员技能越来越高 测试在开发过程中起的作用越来越小 设计和框架缺陷更重要 敏捷开发强调尽早测试.自动测试.持续测试 自动化测试的难点 1.        脚本量.脚本的可维护性 2. 

IT企业级应?开发模式演化

前端研发流程 传统To B类系统的研发模式 探索 & 思考设计模式库(DPL)设计语?设计语?详解基于MVVM模式的Web框架 & UI库优化后的开发模式实现价值实践 赋能 赋能授权(Empowerment)是近年来应最多的商业语汇之一.赋能授权的意思就是授权给企业员工--赋予他们更多额外的权力.逻辑上来说,这样做意味着为了追求企业的整体利益而给予员工更多参与决策的权力. 理论上, 赋能授权是为了消除妨碍员工们更有效工作的种种障碍,其思想出发点是企业由上而下地释放权力--尤其是员工们自主工