从Dash iOS开源说起,不要过于追求完美代码

(Dash iOS源码截图)

前段时间知名的苹果平台文档工具Dash作者开源了它的iOS版本,这是Dash被突然从App Store下架,双方扯皮,直到现在的后续结果。对于这件事情我们不多做评价,不过开源是人们乐于见到的。Dash iOS版本开源后,获得了一些开发者的赞美,但没想到的是,它的代码引起了一些争议。

在以往开发者的印象里,开源意味着展示自己,意味着对代码有追求,Dash可以说粉碎了这个看法。但就像图拉鼎所说,代码写得如何,并不妨碍它在商业上的成功。

你对追求完美代码有什么看法呢?

我们找到伦敦一位资深程序员Daniel Irvine分享的文章,他认为不应该追求完美代码。

引言

完美主义者最大的特点就是过度追求一件事情的完美,他们看什么东西都不会完全满意,因此经常陷入深深的矛盾之中,殊不知这个世界上根本就没有绝对的完美,将精力投注到工作中、生活中各个方面,努力改善,乐此不疲。程序员中的完美主义者又会怎样呢?

许多程序员文化是建立在完美代码的理想上:代码不仅能够运行,而且也必须是干净、优雅的。我们以巧妙地构建解决难题的对策为傲。然而这种完美主义可能不利于团队的成功,因为完美主义常常导致个人分歧。

然而能得到所有人公认的完美代码标准并不存在。对于完美代码,每个人都有一个略微不同的审美观点,这意味着我们每个人都有自己的想法:什么样的代码看起来完美。如果我们都是由完美主义来驱动——希望我们的代码看起来像我们想要的样子,那么我们最终会与队友发生分歧,因为我们每个人互相反对,只是为了让代码库看起来像我们所想看到的样子。

当我成长为一个程序员时,我发现有一些小技巧,可以让团队避免因为完美代码而发生冲突。下面就让我们来看一看。

不要被教条束缚

对代码库的唯一要求就是,它是可用的。通过一个简单的方法来验证,如果它经过完全覆盖测试并通过,就可以证明是可用的。除此之外,每个测量都是主观的。

当你阅读其他人的代码,不要去想如果是你写的话会怎样。不要试图在你脑海中重写这段代码,让它存在就是它的方式。

减少你对代码设立的标准

用制表定位键(Tab)还是空格键(Space)?两个还是四个空格?为你的左括号设置同一行呢,还是另起一行呢?不知道如果只有一个单一的编程语言的话,是不是就不会有这种争论?解决这个问题的标准方法就是为团队设立编码标准,这会为团队的代码带来一致性。

不幸的是,很难形成完整的编码标准。总是会有灰色区域导致了潜在的分歧,如命名、模式、对象建模技术等。

而且,他们团队定下的规则有时会引火烧身。

我曾经所在的团队,对编码标准有过如下规则:“功能不得超过7行代码”。事后看来,这个规则,还不如没有。虽然我仍然赞同这个观点,但这一规则还是激起了很多混乱和争辩。人们需要不断地想着它。团队里的一些人从不相信这个规则。总之,我们团队花了大量时间和精力,来维持这个规则。

你想想啊,那些时间如果用来结对编程或是一起改进代码该是多好啊。所有的规则都有一定的代价,尽管有了这些规则,你可能仍然会有意见分歧。

虽然我仍然按照简短代码的规则来写代码——通常少于七行——但我不屑于依照这些规则来写代码。

让代码库成为自己的标准,而不是写出什么规则。

不要被pull请求套牢

我通常会迅速合并pull请求,即使它对代码有很大的改动。这样做有两个原因。第一是等待PR修改十分煎熬,会打消团队成员的积极性。第二点更微妙,基本代码保持可延展性是非常重要的:意义、准备和期待去改变。但是,“完美pull需求”文化阻碍了这一点。它促进了代码在主分支是“黄金”,并不应该再次改变的概念。如果我们允许不完美代码成为主干,那我们会鼓励更高的变化率。团队学会总是提出:“我看的代码足够干净吗?”

这有点违背直觉:允许主程序写入不完美的代码。实际上,它可以提升程序的质量。

那么,审查pull请求的更好的方法是什么?

我的策略是这样的。我会首先通读整套变更,标注任何可能重要的事情。然后优先排列他的反馈,限制最多三条建议。其它的就不管了。

我很少就风格问题进行评论,比如放错的空格或缩进参数列表。如果代码是可延展的,有人可能在以后会清理它。同时,这些风格问题并不会给任何人带来伤害。

放眼望世界

对于任何多于几十行的代码,完美只是旁观者的感觉。如果你期望每个人以完全相同的方式解决问题,那么你就犯了错误。如果你对代码有着宏伟的愿景,那么你将会感到失望。

为你的队友提供他们认可的设计和代码的空间,并鼓励每个人在系统设计时平等的发挥作用。

当你的团队写出的代码与你想要的不一样时,不要与他们争论。要记住,在团队中保持健康工作关系,长远来看是有价值的。所以也许你要牺牲你个人对质量的愿景。

程序员应该每天花一些时间,回顾并反思自己的开发技术的发展。为自己和团队,思考每天的效率。这个月的工作可能下个月不再做。团队技能的增长是从新手到专家,这一点尤为如此。所以,要确保你少走弯路,因为最初的弯路要比他人提供的帮助都多。

作者:刘志勇

来源:51CTO

时间: 2024-08-03 11:17:04

从Dash iOS开源说起,不要过于追求完美代码的相关文章

iOS开发:GitHub上的40个iOS开源项目

 开发:GitHub上的40个iOS开源项目-"> 1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS.Mac OS X网络通信类库,现在是GitHub上第三大Objective-C库.它建立在NSURLConnection.NSOperation等类库的基础上,让很多网络通信功能的实现变得十分简单,因此,许多iOS应用开发都会使用到它. 支持HTTP请求和基于REST的网络服务(

Github上600多个iOS开源项目分类及介绍

iOS 开源项目 . 开源框架.开源模块列举 http://github.ibireme.com/github/list/ios/

iOS 开源图形库 Core Plot 使用教程

本文讲的是iOS 开源图形库 Core Plot 使用教程, 注意 :本篇教程已被 Attila Hegedüs 更新,可适用于 iOS 9 和 Swift 2.2.原始教程出自教程组成员 Steve Baranski. 如果你曾经想在自己的 app 中引入图表或图形,那么你应该已经考虑过下面两种选项: 自己写. 通过使用 Core Graphics 或者 Quartz 这样的框架编写全部的绘制代码.然而,这显然要花费大量的功夫. 买一个! 购买一个像 ShinobiControls 这样的商业

27个提升效率的iOS开源库推荐

DZNEmptyDataSet(UI,空表格视图解算器) PDTSimpleCalendar(UI,drop-in日历组件) MagicalRecord(实施活跃记录模式的Core Data助手) Chameleon(UI,色彩框架) Alamofire(Swift 网络) TextFieldEffects (UI,自定义外观的文本区域) GPUImage(快速图片处理) iRate(获取用户评价) GameCenterManager(快速管理游戏中心) PKRevealController 2

Github上600多个iOS开源项目

将Github上600多个iOS开源项目进行分类并且有相应介绍,小伙伴们快来看呀 地址:http://github.ibireme.com/github/list/ios/ 转载:http://blog.csdn.net/fyq891014/article/details/12625081 参考: http://blog.csdn.net/james_1010/article/details/8538524

AsyncDisplayKit 1.0 发布,iOS 开源框架

经过两个 Beta 版本之后,AsyncDisplayKit 1.0 发布了!此版本现已提供下载. AsyncDisplayKit是一款能够保持界面流畅性的iOS开源框架,即使是最复杂的用户界面,也可以让其流畅运行并快速响应. AsyncDisplayKit不止是Paper的组成部分,与Facebook神奇的动画引擎Pop也是关系密切. 在使用AsyncDisplayKit的过程中,不会对用户体验造成任何影响,只有在修改结果检验无误后,变动内容才会被映射至主进程当中.而用户也可获得快速流畅的使用

Java发送ios推送消息(APN)的代码示例

Java发送ios推送消息(APN)的代码示例 实际项目应用中,应该考虑使用开源项目java-apns:https://github.com/notnoop/java-apns 千万不要用一个叫JAVAPNS的项目.这个开源项目的代码非常烂,每次发送消息都重新建立socket连接. 在apple的文档中,都明确的说了会把这种行为当作dos攻击行为.性能差就更不用说了. ios手机上要安装对应的应用.该应用与.p12证书文件应该匹配. apple官方的,关于APN服务,和apn的feedback的

求个能在IOS,Android上播放FLV视频的代码

问题描述 求个能在IOS,Android上播放FLV视频的代码 查了很多资料,测试了很多插件,PC端播放无压力,有些是Android可以,IOS不可以的,糟糕透了,请问下各位大牛们,怎么在移动WEB端自由的播放FLV视频 解决方案 iOS doesn't have the correct codecs to play an FLV. It needs to be reencoded as a .mp4 or .mov file. Something that iOS can actually p

开源项目PullToRefreshScrollView控件怎么用代码控制进入刷新状态?

问题描述 开源项目PullToRefreshScrollView控件怎么用代码控制进入刷新状态? 开源项目PullToRefreshScrollView控件怎么用代码控制进入刷新状态? 解决方案 你改一下源码,把changeState改成public,你去控制状态