多些时间能少写些代码

导读:作者陈皓在微博上说过这样一段话:“聪明的程序员使用50%-70%的时间用来思考,尝试和权衡各种设计和实现,而用30%–50%的时间是在忙碌着编码,调试和测试。聪明的老板也会让团队这样做。而愚蠢的老板,愚蠢的程序员会拿出来100%-150%的时间来忙着赶进度,返工,重构,fix大量的bug…所以,越差的团队一般会越忙,而且还忙不完。”文中作者就此观点进行阐述。

  文章内容如下:

  在现在这个浮躁的时期,再加上敏捷咨询师们念的歪经,他们让人感觉上就像是软件产品是可以在很短的时间内高质量的完成的,这令那些管理者们很兴奋,就像巴甫洛夫的条件反射实验中的狗看到了肉就像流口水那样兴奋。他们使用TDD,快速迭代,不断重构,持续集成直至持续部署的方法在进行软件开发。

  软件开发真是这样的吗?难道不需要花时间去思考吗?对此,有些观点在Todd的《“品质在于构建过程”吗?》以及《Bob大叔和Jim Coplien对TDD的论战》中谈到过了。我只想想表达下面的观点:

  ● 软件的精髓在于设计,设计是一件很费大脑的事件。对于软件来说,设计没有完美的,它总是一件需要取舍需要权衡的事,比如:时间换空间,空间换时间,TCP或UDP,同步还是异步,数据冗余还不冗余等等。那怕是一个小小的observers模式是pull方式还是push方式都需要仔细讨论。这些的东西需要时间和做前期尝试。

  ● TDD、快速原型和迭代可能会对软件和团队产生负面影响。在一开始,你需要花很大的精力来让你的软件从无到有(做过软件的人都知道,从零开始写代码是很痛苦的事),但是因为你没有想好,先做再说,所以,后期你会面临更多的质量问题而让你需要花更多的时间精力。当然,那些咨询师会让你用持续集成和持续部署这样的方法。但我想告诉你,这并不解决你软件设计的缺陷。举个例子——TDD、迭代、原型只关注功能性需求,其不会关注非功能性需求,比如性能问题,高可用性问题,系统维护问题(模块的耦合问题),等等。而这些问题往往都可以让你的软件设计重新来过。

  ● 重构是恶梦,重构应该越少越好。当你维护一个复杂的系统时你会知道重构是一件多么恐怖的事情(参看《重构代码的7个阶段》)。如果一开始没有想好,你要面临的不单单是re-design, re-architect,还要面对时间和人力成本的增加,最难的是你还要面对的是团队士气因为不断的rework而逐渐低落并产生厌倦和懈怠情绪。

  所以,如果你能有多一些时间去和客户讨论一下需求和未来可能的变化,去调查一下实现的技术难点和细节,去和其他有经验的人讨论并推敲一下架构和设计,去思考设计上的缺陷,那么,你的coding会变得非常地直,直到你一眼就看到尽头,你的测试案例也会写得非常地好,你会几乎不需要重构,于是,你会在未来少写很多代码,从而你的软件开发会越来越轻松,直到技术开始换代。

  我现在在做的项目,花了几乎4个月的时间来做设计,在这个过程中,我们反复思考、讨论和权衡若干种实现方法,并尽可能地穷举所有的场景和细节以及未来可能的变化(那怕是那些简单的模块),有个模块被重写了至少三次,每次都是写到一半就被推翻重写,我们整个团队不断地在和其它团队讨论,并在对系统不断地认识中对系统进行简化和优化,并力求达到完美。现在看来,没有贸然使用Scrum是明智的。

  这就好像我们修路造桥一样,我们需要花大量的时间勘测地形地质,分析数据,思考可能出现的各种问题(各种自然灾害),评估不同的设计方案,而不是先尽快建好再说。

  所以,多一些时间,不是让你多做几次迭代,多完成几个模块,而是可以让你少写一些代码,更快的交付一个更好的产品。

  我相信你会有很多疑问,下面是我觉得你可能会有下面的一些观点,让我一条一条来回复:

  ● 首当其冲的一定会是项目的deadline,或是那种你没有活语权的项目。比如做那种“甲乙方合同式的项目”,我把这种项目统一认为是“外包项目”,在这种项目性质下,你很难有话语权。对此,我觉得,1)作为乙方的你还是应该和甲方在项目计划上争取一下,晓之以情,动之以理。2)如果不行,只能在时间、需求范围和质量上做一个权衡。另外,在这种情况下你要找一个方法,把你的压力和痛苦分担给用户和领导。(找到这个方法的前提需要你找到用户和领导他们害怕什么,嘿嘿)

  ● 过度设计和纸上谈兵。有人说会不会设计太多,造成过度设计,或是在设计上花太多的时间。这有可能。我上一家公司的一个项目团队就花了1年多的时间来不停不停的开会和做设计,结果release的时候还有1000多个bug。这个问题的原因是,这个团队的设计是在纸上谈兵,开会是开神仙会,讨论的设计都是浮云。所以,设计并不是讨论和思考,还需要去尝试,我认为当你的设计完成的时候,你的骨干核心代码都基本完成了。

  ● 我的团队成员水平太差,不会思考。首先,先恭喜你找到一堆码农,当然,这不怪你,这是中国教育和大环境的问题,让人不会思考。对于这样的情况,我有两个建议,1)量力而行,使多大的碗就吃多少饭。2)鼓励思考,那怕那些想法很不靠谱,因为如果不开始,那么将永远不会思考。

  ● 必需使用快速迭代。很多公司都在强行上敏捷,他们希望产品越快release越好,而没有充分的时间思考和讨论。对于这种项目,我的建议是,1)找有丰富经验的人来做。2)迭代过程中力求架构和程序逻辑的简单,简单,再简单,力求代码间的高内聚,低耦合。不然,重构的时候你就好玩了。

  ● 创业团队必需要快。做得快就是做得好吗?很多时候,不是谁快谁就能笑到最后的。这样的例子太多了。第一个做出来的人并不一定就会占领市场,其很有可能会成为先驱。

  ● 有钱的公司才会让团队用更多的时间去思考。错了,你们没有见过有钱的公司,有钱的公司可以招一堆干不成活的人,可以把事搞乱了再新来过,甚至可以把做失败的项目换个名字再重新立项。这些真正的有钱的公司只求快,只求人多,不怕做错决定。像我们这些没钱的人,干什么事都是小心翼翼地,生怕做错决定。

本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-11-02 23:42:45

多些时间能少写些代码的相关文章

诺基亚新政:少写70%代码 收益多50%

诺基亚新政:少写70%代码收益多50% --2010年诺基亚中国开发者峰会纪实      2010年10月29日,小康应诺基亚邀请在北京香格里拉嘉里中心大酒店参加了其举办的"2010诺基亚中国开发伙伴峰会".虽然天气,在十月北风的呼啸中变得越发寒冷,但会场的热闹还是让我感触颇深.而一连串的各类大会--中国移动互联网大会.联通uPhone大会.微软Tech ED发布等等,都印证了一点,那就是移动开发已经成为了现在的一个热点.   六项政策,犹如让利大酬宾    当然这个在中国拥有超过2亿

想要少写代码,就多花点时间思考

我曾经在我的微博上说过这样一段话 ,而我想在这里把我的这个观点描述地更加完整一些. @左耳朵耗子 :聪明的程序员会使用50%-70%的时间用来思考,用来尝试和权衡各种设计和实现,然后她们用30% – 50%的时间是在忙碌着编码,调试还有测试.而聪明的老板也会鼓励团队这样做.但是傻逼的老板,苦逼的程序员却会拿出来100%-150%的时间来忙着赶进度,返工,重构,还有fix 大量的bug--所以, 越差的团队只会越忙,甚至还忙不完他们的工作. 而在现在这个浮躁的时期,再加上敏捷咨询师们这群人念的歪经

程序员在加班时间写的代码 bug 骤增

作为一个最底层的程序员 ,我先记录一些只有底层程序员才会知道的事情.如果多年后,我违背自己进入这个行业的初心,走上管理岗位,也能回想起一些禁忌,避免一些错误. 其中最重要的就是这条: 不要相信一个程序员在加班时间写出来的代码 . (软件工程的学说表明,连正常时间好好写的代码,也不要太相信.不过这不是本文的重点,略过不提.) (不懂代码的人,看到本文中的Java代码可以略过,不影响理解.) 创造力的时限 写代码,与写文章.绘画.思考复杂问题,并没有本质上的区别,都是创造性的活动. 每个人的创造力,

android项目文档 ,需要整理准备哪些东西 它应该包括多少个部分,都写些什么呢

问题描述 android项目文档 ,需要整理准备哪些东西 它应该包括多少个部分,都写些什么呢 最近项目越来越大,都出现了65536的问题,由于之前好多人写的,没有系统的整理过,我最近想要写一个相关的东西,该从何入手,都包括哪些内容呢 解决方案 项目说明性文档,一般架构和实现两块.架构说说我准备盖一座什么样的房子,有几个门,几个窗等等,实现写写门是什么材料做的,用到了什么技术,实现了什么功能,如何实现的.类似的梳理过程,卤煮可参考参考. 程序文档自动生成就行了. 解决方案二: 什么相关的东西,网上

不要浪费时间写完美代码

一个系统可以维持5年,10年,甚至20年以上,但是代码和设计模式的生命周期非常短,当对一个解决方案使用不同的方法进行迭代的时候,通常只能维持数月,数日,甚至几分钟的时间. 代码重要性区分 随着对代码是如何改变的研究,致力于代码修改艺术的人发现了一个代码库的规律曲线.每个系统都有很多从未改变的代码.但是也有小部分非常重要且有用的代码一次又一次的改变,经过了多次重构和重写. 当你对一个系统,问题域,或者架构方法越来越熟悉的时候,就更容易发现和预测哪些代码会经常修改,哪些代码不会被修改,即区分重要代码

可以少写1000行代码的正则表达式_正则表达式

熟练地掌握正则表达式的话,能够使你的开发效率得到极大的提升. 正则表达式经常被用于字段或任意字符串的校验,如下面这段校验基本日期格式的JavaScript代码: var reg = /^(\\d{1,4})(-|\\/)(\\d{1,2})\\2(\\d{1,2})$/; var r = fieldValue.match(reg); if(r==null)alert('Date format error!'); 下面是在前端开发中经常使用到的20个正则表达式: 1 . 校验密码强度密码的强度必须

段永平:和巴菲特吃饭可以少犯些错误

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 段永平:以前10块钱你想买,现在5块钱你反而想卖,这个很可笑,对不对? 冯郁青 全球股市的暴跌,让普通投资者无所适从.一次次出乎意料的迅猛下跌,使得他们急需"投资大师"的点拨. 与巴菲特共进过午餐的华人投资家段永平,日前接受了<第一财经日报>的专访. 在A股经历了暴涨暴跌之后,他对于市场有哪些判断?对投资者又有

第19天,写些什么好?10个写作话题分享⑥

第19天,写些什么好?可以写作的话题汇总 &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; [31天企业博客建设指南]栏目开通以后,许多博客新手和我交流时,问的最多的问题就是写作问题,他们知道博客很重要,需要持续性的更新,需要有丰富的和企业定位相关的内容,但是,在话题写作上还是常常没有思绪. 写博客就是向别人讲述你的公司的点点滴滴,今天,我和大家一起来交流我们都可以写哪些点点滴滴呢? 1.学会在博客里讲故事,博客本

20个正则表达式必知(能让你少写1,000行代码)_正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. 列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的. 构造正则表达式的方法和创建数学表达式的方法一样.也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式.正则表达式的组件可以是单个的字符.字符集合.字符范围.字符间的选择或者所有这些组件