《高效程序员的45个习惯》-之三

请您在阅读本文之前,先了解《高效程序员的45个习惯》-之二

每一期都会涉及15个话题,用3期来列出这45个习惯,每次不贪多,贪精,大家如果有空,一定要细细品味这15个习惯。

注意:每一个好的习惯,开头都会相应有一个唱反调的句子哦。

 

16 使用演示获得频繁反馈

“客户不停的更改需求,导致我们严重地延期。他们一次就应该想清楚所有想要的东西,然后把这些需求给我们。”

需求就像是流动着的油墨。你无法冻结需求,就像你无法冻结市场、竞争、知识、进化或者成长一样。就算你真的冻结了,也很可能是冻结了错的东西。

不一致的术语是导致需求误解的一个主要原因。所以,需要维护一份项目术语表。人们应该可以公开访问它,一般是在wiki或内部网里。

项目启动了一段时间以后,你就应该进入一种舒适的状态,团队和客户建立了一种健康的富有创造性的关系。

 

17 使用短迭代,增量发布

“我们为后面的3年制定了漂亮的项目计划,列出了所有的任务和可交付的时间表。只要我们那时候发布了产品,就可以占领市场”

给我一份详细的长期报告,我就会给你一个注定完蛋的项目。

对于大项目,最理想的办法就是小步前进,这也是敏捷方法的核心。大步跳跃大大地增加了风险,小步前进才可以帮助你很好地把握平衡。

 

18 固定的价格就意味着背叛承诺

“对这个项目,我们必须要有固定的报价。虽然我们还不清楚项目的具体情况,但仍要有一个报价。”

固定价格的合同会是敏捷团队的一大难题。我们一直在谈论如何用持续、迭代和增量的方式工作。但是现在却有些人跑过来,想提早知道它会花费多少时间及多少成本。

软件项目天生就是变化无常的,不可重复。如果要提前给出一个固定的价格,就几乎肯定不能遵守开发上的承诺。

如果你现在别无选择,你不得不提供一个固定价格,那么你需要学到真正好的评估技巧。

 

19 守护天使

“你不必为单元测试花费那么多时间和精力。它只会拖延项目的进度。好歹,你也是一个不错的程序员—单元测试只会浪费时间。”

单元测试能及时提供反馈

单元测试让你的代码更加健壮

单元测试时有用的设计工具

单元测试是你自信的后台

单元测试是可信的文档

单元测试是学习工具

 

20 先用它再实现它

“前进,先完成所有的库代码。后面会有大量时间看用户是如何思考的。现在只要把代码扔过墙就可以了,我保证它没有问题。”

很多成功的公司都是靠着“吃自己的狗食”活着。也就是说,如果要让你的产品尽可能地好,自己先要积极地使用它。

编程之前,先写测试。

先写测试,你就会站在代码用户的角度来思考,而不仅仅是一个单纯的实现者,这样做是有很大区别的,你会发现因为你自己要使用它们,所以能设计一个更有用、更一致的接口。

 

21 不同环境,就有不同问题

“只要代码能在你的机器上运行就可以了,谁会去关心它是否可以在其他平台上工作,你又不用其他平台。”

一位同事的代码失败了,最终找到了罪魁祸首:一个.NET环境下的API在Windows XP和Windows2003上的行为不同。平台不同,造成了结果的不一样。

使用持久集成工具,在每一种支持的平台和环境中运行单元测试,要积极地寻找问题,而不是等问题来找你。

 

22 自动验收测试

“很好,你现在用单元测试来验证代码是否完成了你期望的行为。发给客户吧。我们很快会知道这是否是用户期望的功能。”

关键业务逻辑必须要独立进行严格的测试,并且最后需要通过用户的审批。但是,你又不可能拉着用户,逐一模块确认。所以你需要能自动比较用户期望和实际完成的工作。

FIT(fit.c2.com),即集成测试框架,它很实用,可以更容易的使用HTML表格定义测试用例,并比较测试结果数据。

 

23 度量真正的进度

“用自己的时间表报告工作进度。我们会用它做项目计划。不用管那些实际的工作时间,每周填满40小时就可以了。”

时间表很难真实地反映工作完成状况,因此它不可以用来进行计划、评估或表现评估。

你曾经听到开发人员报告一个任务完成了80%么?然而过了一天又一天,一周又一周,那个任务仍然是完成80%。

随意用一个比率进行度量是没有意义的。所以不应该去计算工作量完成的百分比,而应该测定还剩下多少工作量没有完成。如果你最初估计这个任务需要40个小时,在开发了35个小时之后,你认为还需要另外30个小时的工作。那就得到了很重要的度量结果(这里诚实非常重要,隐瞒真相毫无意义)

关注功能,而不是日程表。

 

24 倾听用户的声音

“用户就是会抱怨。这不是你的过错,是用户太愚蠢了,连使用手册都看不懂。它不是一个bug,只是用户不明白如何使用而已。他们本应该知道更多。”

不管它是否是产品的bug,还是文档的bug,或者是对用户社区理解的bug,它都是团队的问题,而不是用户的问题。

对于一些软件,倒霉的用户必须要配置那些包含了一些魔术数字的模糊系统文件,否则系统根本不会运行。系统既没有错误提示消息,也不会崩溃,只是显示大黑屏和一个斗大的“退出”按钮。

每一个抱怨的背后都隐藏着一个事实。找出真相,修复真正的问题。

没有愚蠢的用户;只有愚蠢自大的开发人员。

“它就是这样的。”这不是一个好答案。

你的用户有可能会阅读所有的文档,记住其中的所有内容。但也可能不会。

 

25 代码要清晰地表达意图

“可以工作而且易于理解的代码当然好,但是让人觉得聪明更加重要。别人给你钱是因为你脑子好使,让我们看看你到底有多聪明。”

Hoare说“设计软件有两种方式。一种是设计得尽量简单,并且明显没有缺陷。另一种方式是设计得尽量复杂,并且没有明显的缺陷。”

(Hoare创造了Algol 60编程语言,并发明了快速排序算法。于1980年获得图灵奖。)

代码阅读的次数要远远超过编写的次数,所以在编写的时候值得花点功夫让它读起来更加简单。

当开发人员们像一群旁观者见到UFO一样围在代码四周,感到恐惧、困惑与无助时,这个代码的质量就可想而知了。

看一个例子:

coffeeShop.PlaceOrder(2);//通过阅读代码,可以大致明白这是要在咖啡店中下一个订单。但是2代表什么意思?
coffeeShop.PlaceOrder(2 /* large cup */); //不妨添加一些注释。但注释有时候是为了帮写得不好的代码补漏。
public enum CoffeeCupSize
{
Small,
Medium,
Large
}
coffeeShop.PlaceOrder(CoffeeCupSize,Large);//如果使用上枚举值,代码就一目了然了。

应该让自己或团队的其他任何人,可以读懂自己一年前写的代码,而且只读一遍就知道它的运行机制。

 

26 用代码沟通

“精确地解释代码做了什么,每行代码都要加注释。不用管为什么要这样编码,只要告诉我们做了什么就好了。”

源代码可以读懂,不是因为其中的注释,而应该是由于它本身优雅而清晰。

要尽量避免使用神秘的变量名。(i常用于循环索引变量,str常用于表示字符串。如果用str表示循环索引变量,可真不是好主意)

在代码可以明确传递意图的地方,不要使用注释。

解释代码做了什么的注释用处不那么大。相反,注释要说明为什么会这样写代码。

 

27 动态评估取舍

“性能、生产力、优雅、成本以及上市时间,在软件开发过程中都是至关重要的因素。每一项都必须达到最理想的状态。”

与其花费时间去提升千分之一的性能表现,也许减少开发投入,降低成本,并尽快让应用程序上市销售更有价值。

如果现在投入额外的资源和精力,是为了将来可能得到的好处,要确认投入一定要得到回报。(大部分情况下,是不会有回报的)

 

28 增量式编程

“真正的程序员写起代码来,一干就是几个小时,根本不停,甚至连头都不抬。不要停下来去编译你的代码,只要一直往下写就好了!”

如果不对自己编写的代码进行测试,保证没有问题,就不要联系几个小时,甚至连续几分钟进行编程。相反,应该采用增量式的编程方式。

采用增量式编程和测试,会倾向于创建更小的方法和更具内聚性的类。你应该经常评估代码质量,并不时的进行许多小调整,而不是一次修改许多东西。

在写了几行代码之后,你会迫切地希望进行一次构建/测试。在没有得到反馈时,你不要走的太远。

 

29 保持简单

“通过编写史上最复杂的程序,你将会得到美誉和认可,更不用提保住你的工作了。”

Andy曾经认识一个家伙,他对设计模式非常着迷,想把它们全都用起来。有一次,要写一个大概几百行的代码程序。在被别人发现之前,他已经成功将17种设计模式,都运用到那可怜的程序中了。—这不应该是编写敏捷代码的方式。

问题在于,许多开发人员倾向于将投入的努力与程序复杂性混同起来。如果你看到别人给出的解决方案,并评价说“非常简单且易于理解”,很有可能你会让设计者不高兴。许多开发人员以自己程序的复杂性为荣,如果能听到“Wow,这很难,一定是花了很多时间和精力才做出来的吧。” 这时,他们就会面带自豪的微笑了。其实应当恰恰相反,开发人员更应该为自己能够创建出一个简单并且可用的设计而骄傲。

简单不是简陋。

 

30 编写内聚的代码

“你要编写一些新的代码,看看IDE中现在打开的是哪个类,就直接加进去吧。如果所有的代码都在一个类或组件里面,要找起来是很方便的。”

内聚性用来评估一个组建(包、模块或配件)中成员的功能相关性。内聚程度高,表明各个成员共同完成了一个功能特性或是一组功能特性。内聚程度低的话,表明各个成员提供的功能是互不相干的。

类也要遵循内聚性。如果一个类的方法和属性共同完成了一个功能,这个类就是内聚的。

不过,不要把一些东西分成很多微小的部分,而使其失去了实用价值。当你需要一只袜子的时候,一盒棉线不能带给你任何帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

负载均衡的那些事?

什么是负载均衡?1、负载:就是后端系统的承载能力。比如同等条件下,一个1核cpu-1G内存的机器的承载能力一般会比8核cpu-8G内存的机器要差;相同配置下,一个cpu利用率为80%的机器比30%的承载能力一般要差等等。2、均衡&am…

Develop内部函数,持续更新

Develop内部函数 目录Develop内部函数dev_clear_objdev_clear_windowdev_close_inspect_ctrldev_close_tooldev_close_windowdev_disp_textdev_displaydev_error_vardev_get_exception_datadev_get_preferencesdev_get_systemdev_get_windowdev_inspect_ctrldev_map_pardev_map…

短信认证方案,用手机短信进行上网认证如何实现?

WFilter NGF的“Web认证”模块,提供了一系列的上网认证解决方案。包括如下认证方式:本地用户名密码认证AD域用户名密码认证企业邮箱用户名密码认证Radius用户名密码认证微信WiFi认证Facebook Wifi认证除此,WFilter NGF还有一个“其他”的选项…

《高效程序员的45个习惯》-末篇

请您在阅读本文之前,先了解《高效程序员的45个习惯》-之三。 每一期都会涉及15个话题,用3期来列出这45个习惯,每次不贪多,贪精,大家如果有空,一定要细细品味这15个习惯。 注意:每一个好的习…

【Qt开发】V4L2 API详解 Buffer的准备和数据读取

前面主要介绍的是:V4L2 的一些设置接口,如亮度,饱和度,曝光时间,帧数,增益,白平衡等。今天看看V4L2 得到数据的几个关键ioctl,Buffer的申请和数据的抓取。1. 初始化 Memory Mapping …

halcon File文件算子,持续更新

目录File文件Images图像read_imageread_sequencewrite_imagedeserialize_imageserialize_imagelist_image_fileparse_filenameMisc混合体copy_filedelete_filefile_existsget_current_dirlist_filesmake_dirread_world_fileremove_dirset_current_dirObject对象deserialize_obj…

Nginx 之一:编译安装nginx 1.8.1 及配置

转http://www.cnblogs.com/zhang-shijie/p/5294162.html 一:基介绍 官网地址www.nginx.org,nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的,开发工作最早从2002年开始,第一次公开发布时间…

PI校正环节的程序实现推导过程

PI校正环节在经典控制论中非常有用,特别是对负反馈控制系统,基本上都有PI校正环节。1.下面分别说明比例环节和积分环节的作用,以阶跃信号为例。①比例环节单独作用以上分析说明,若只有比例环节的控制系统,阶跃响应也是…

XML文档注释(C#)

目录XML文档编译器识别的标记添加XLM注释的方法添加XLM注释的例子XML文档 C#可以根据特定的注释自动创建XML格式的文档说明。 这些注释都是单行注释&#xff0c;但都以三条斜杠开头 编译器识别的标记 标记说明<C>把行中的文本标记为代码&#xff0c;例如<c>int …

vs里根据json快速创建对应类的方法

有时候,我们在调用别人接口的时候,服务端返回了一个json格式的字符串,我们要获取json里面的数据的话一般有两种方式: 1.通过正则 2.反序列化成一个对象 第一种方式这里不再多说,主要说一下第二种,(为什么呢&#xff0c;你看到后面 你也会喜欢上第二种) 有人肯定会说, json字符串…

德鲁克的《卓有成效的管理者》

是一本很好的书&#xff0c;对我有诸多的启发&#xff0c;这本书我在短期内连看两遍呢。 现将一些我觉得有启发性的句子发给大家分享。 1. 一个人的有效性&#xff0c;与他的智力、想象力或知识之间&#xff0c;几乎没有太大的关联。有才能的人往往最为无效&#xff0c;因为他们…

人工智能之基于face_recognition的人脸检测与识别

不久乘高铁出行&#xff0c;看见高铁火车站已经实现了“刷脸进站”&#xff0c;而且效率很高&#xff0c;很感兴趣&#xff0c;今天抽时间研究一下&#xff0c;其实没那么复杂。 我基本上是基于https://github.com/ageitgey/face_recognition上的资料和源码做一些尝试和试验。 …

iOS 升级https的方案选择

我的选择是将UIWebView统一替换为WKWebView WKWebView AFN SDWebImage https的支持之前的博客都有涉及转载于:https://www.cnblogs.com/Jusive/p/6867531.html

预处理指令(C#)

目录预处理指令简介#define、#undef#if、#elif、#else、#endif#warning、#error#region、#endregion#line、#line default#pragma预处理指令简介 微软对预处理指令解释链接 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/preprocessor-directives/index…

NSWindowController的初始化创建代码

-(PRAboutWindowController*)aboutCtrl{ if(_aboutCtrl nil){ _aboutCtrl [[PRAboutWindowController alloc]initWithWindowNibName:"PRAboutWindowController"]; } return _aboutCtrl ; } 转载于:https://www.cnblogs.com/PJXWang/p/5816675.html

对CMMI3的学习和思考

原文出处&#xff1a; http://tech.it168.com/m/2007-08-02/200708020957750.shtml本文请勿转载。近来笔者所在公司正在为过CMMI3做各种准备&#xff0c;对公司的员工进行了一些相关的培训&#xff0c;作为项目管理人员的我&#xff0c;在学习CMMI3的过程中&#xff0c;也有了自…

Python3抓取糗百、不得姐

​点击关注 异步图书&#xff0c;置顶公众号 每天与你分享 IT好书 技术干货 职场知识 重要提示1:本文所列程序均基于Python3.6,低于Python3.6的Python版本可能无法运行.重要提示2:因所抓取的网站可能随时更改展示内容,因此程序也需及时跟进.重要提示3:本程序仅供学习,不能拿去做…

halcon边缘检测的方法及各种方法的适用范围

目录一、边缘提取二、BLOB分析检测三、赃物检测一、边缘提取 1、设置ROI兴趣区域 2、快速二值化&#xff0c;并连接相邻区域。 这样做的目的是进一步减少目标区域&#xff0c;通过二值化将目标区域大概轮廓提取出来 3、提取最接近目标区域的轮廓 常用函数有boundary&#xff0…

Oracle优化-表设计

前言  绝大多数的Oracle数据库性能问题都是由于数据库设计不合理造成的&#xff0c;只有少部分问题根植于Database Buffer、Share Pool、Redo Log Buffer等内存模块配置不合理&#xff0c;I/O争用&#xff0c;CPU争用等DBA职责范围上。所以除非是面对一个业已完成不可变更的系…

Win10远程桌面 出现 身份验证错误,要求的函数不受支持,这可能是由于CredSSP加密Oracle修正 解决方法...

升级至win10 最新版本10.0.17134&#xff0c;远程桌面连接Window Server时报错信息如下&#xff1a; 出现身份验证错误&#xff0c;要求的函数不正确&#xff0c;这可能是由于CredSSP加密Oracle修正。 解决方法&#xff1a; 运行 gpedit.msc 本地组策略&#xff1a; 计算机配置…