[Week2 作业] 代码规范之争

 

这四个问题均是出自 http://goodmath.scientopia.org/2011/07/14/stuff-everyone-should-do-part-2-coding-standards/ 。

我对这四个问题均持反驳的看法,下面是我的理由~

Q1:这些规范都是官僚制度下产生的浪费大家的编程时间、影响人们开发效率, 浪费时间的东西。

 

A1:

其实很简单,因为统一编码规范可以造就代码风格的一致性。在团队里每个开发者所看到的代码,无论是自己写的或者是别人写的,都将有着统一的代码结构,有着一样的命名协定。这样的代码给人带来阅读源码愉悦的体验:你看别人的代码就像看你自己的代码一样!当然好的注释是非常必要的,否则别人的代码就算像是自己写的代码,一个月后估计就只有上帝能看懂了。

我以为这样做还有个好处就是“一次制定,终身受用”。比如开发某大型商用软件,如果开始能够统一代码规范,那么即使最初的开发者离职了,接手的新人也能够从统一的规范中快速入手并进行同样规范下的源码修改。通过遵循一致的风格,此种规范能够让其他开发人员的介入、帮助、维护或新的发展变得高效有序。而且代码规范具有极高的复用性,在不断的实践中总结出一套好的规范集,能够在许多大型软件开发前就做出约束与规定,这样对以后的每个软件开发流程都有非常好的影响。

并且,统一风格利于寻找bug。在做代码审查的过程中,规范一致的代码对于审查的效率提升有莫大帮助。想象一下你看这一堆你觉得像坨屎一样的代码进行code review的时候会有多好的心情吗...还会想着认真寻找bug吗?看都不想看,还能让人好好review嘛!

最后,我觉得是对于程序员个人的一种收获。编码规范的统一更利于程序员自身主人翁意识的培养,这种意识的培养我觉得是工程师与码农的很大区别之一(纯属个人意见)。能够对自己的代码负责,就能够开发出更加高质量的代码,对于工程师本身也是能力的锻炼。如果开发者从来不管代码后续的维护问题,不管源码的可阅读性问题,那么对他而言码代码只能算作是一种工作,而从来不能称之为艺术。

 

Q2:我是个艺术家,手艺人,我有自己的规范和原则。

 

A2:

代码书写过程中所遵循的编码规范,有时就好像是一个作家在书里的写书风格。它们的共同之处当然有:它们往往容易被忽略,只有少数人才能够严格地遵循它们,并且这些人最后往往能够成功。但是它们当然也有着巨大的不同:作家写书是单兵作战,而工程推进大部分时候是团队合作的。

问题所述的情景在很多软件开发过程中都会很常见。许多程序员都以自己的编码风格为傲,有些甚至是为了代码而代码的。将本来逻辑清晰的代码写得复杂又难懂——这样或许能为他在部门经理心中的地位的提升做出很大贡献?或者只是为了装x(捂脸)?...只是调侃一下:D。复杂晦涩难懂的代码,或者说句法怪癖,基本不可读的代码,是很难得到他人的认同与维护的。能力与创造力和是否坚持自己的怪癖规范没有半毛钱关系。

当然传统软件工程开发里不乏很多单兵作战的例子,比如Ken Thompson、Linus Torvalds、还有Donald Ervin Knuth教授“排版不爽就做个Tex”的让人津津乐道的故事。确实,上个世纪涌现出的这些享誉世界的Hacker们,确实是以一己之力震惊世界的程序员的典范,是真正的程序员。

但是,他们是艺术家,然而我们现在并不是。艺术家往往是富有灵感与创意的,但是艺术家是有前提的:必须得有足够的天份与更多的练习。也就是说:首先你需要是个匠人,然后你才可能是个艺术家。

作为一名solo developer,渴望成为superhero而独立开发软件,在现代软件工程的复杂程度下,基本是不可行的。开发初期,我们可能会因为自己可以随意制定规范与原则而感到效率极高:不需要跟别人开发的模块耦合,不需要“被迫”写注释,不需要花“大量的时间”去改变自己原先的编码规范而适应团队的编码规范,不需要做大量“无用”的交流工作。

但是作为一名独立开发者最大的好处同时也可能是最大的坏处就在于两个字:自由。时间越长,对于独立的开发人员来说一个软件的发布就越困难。除非开发者本身本来就有详尽的知识技术、可行的解决方案和大量开发的经验。但是现实往往是残酷的,每个人都会有自己的思维盲点,在开发中这是避免不了的。我的观点不是说某个人不能开发一个小的软件,我的意思是说,一个人在付出足够多的努力成为“艺术家”之前,软件开发流程往往会因为设计的局限与解决方案的不准确而被迫停止。

而且,对于软件的开发流程的推进,除非开发者是一个非常自律的人,不然可能遇到某个大的bug开发者就会丧失后续开发与维护的想法了。但是如果是在一个团队中的话,大家可以一起想办法解决bug,至少不会让开发者丧失后续开发的信心。

所以说,每个开发者在想要一直保持“自己的规范与原则”前,需要认真地考虑一下自己是否真的是工程开发中的“艺术家”。如果还不是,那么就必须遵守团队的编码规范;如果是,等到成为“艺术家”的时候,开发者自己也应该明白团队编码规范一致的重要性了。

 

Q3:规范不能强求一律,应该允许很多例外。

 

A3:

世界上确实没有完美的适用于各个软件开发的规范,这是正常的。如果一个编码规范能完美适应大部分软件的开发,才是不正常的:因为这种兼容性而导致的要么就是编码规范集的急剧缩小,或者是不能适应它的软件团队推倒重新制定一套新的编码规范。

但是,实践开发验证过的编码规范确实可以提高生产效率,或者说,自己完全重新定制一套编码规范有时并不如采用某种相似结构的编码规范来得高效。这不仅仅是由团队本身的实力决定的,更是因为实践过程中使用过的东西更具有执行力。完全新的编码规范,就好像温室的花朵,可能在软件开发过程中团队要不停地对这种规范进行修改——甚至是重新来过,花朵最后可能就只剩绿叶还留着——根本的东西已经没了。这种规范制定上的错误有时候是致命的,而且很多时候重新从头制定会产生各中奇奇怪怪的编码规范:

http://stackoverflow.com/questions/218123/what-was-the-strangest-coding-standard-rule-that-you-were-forced-to-follow

所以我比较赞同的是在软件开发中,以前人的经验实践过的编码规范作为基石——就像是泥塑的前期形态已经定好,辅以根据开发的软件的特色、框架等制作的扩展规范编码——就像是为泥塑精细雕琢一样。只有这样,才能在保证编码规范的大方向走对的情况下,走出自己的编码规范的路。这样,不论我们走的是小道,山道或者不从道上走,都能走上正确的归途——前人早已经用脚为我们走出为了成功的方向。这么宝贵的精神财富,何苦不用呢?

 

Q4:我擅长制定编码规范,你们听我的就好了。

 

A4:

其实我觉得这句话,和下面这句话的效果并没有什么不同:

我擅长吃饭,你们的饭都让我来吃就好了。

编码规范不是一个人能决定的,就像一个团队——也不是一个人能决定的。在一个团队里大家确实要有所分工,各司其职,但是有些东西必须大家一致同意才能决定——比如团队例会时聚餐的地点、菜品的口味等。编码规范就像是饭菜的口味一样:确实有吃货可能会选到很好吃的饭店——对他自己而言,但是对于其他人呢?

这就相当于一个北京的同学拿着一盘炸蚕蛹,广东的同学端着一盘爆炒田鸡给你吃一样——他们确实选择了他们喜欢的,但是你并不一定喜欢,有时候反而非常讨厌。因为对于他人来说美味可口的东西对你来说未必下得了口。所以对于那些自称擅长制定编码规范的同学来说,他所制定的编码规范可能确实看起来风格很好,很美味,"很多人"都喜欢。但是他现在要满足的不是"很多人",而是"团队"的口味。个人在这一点上务必要为团队的统一与规范做出让步。

这种心理更多地出现在这样的开发者身上:抱怨不是因为制定的编码规范不好,而是出于"我"比制定编码的人更优秀,"我"不能被比我差的人所制定的规范所束缚的心理。这样的开发者大多数觉得自己的代码会被一个loser所制定的lower的编码规范所拉低,所以实际上,他们的抱怨往往来自于心理失衡,而不是规范本身的问题。为了有这种"人上人"的体验,他们往往想要制定编码规范来lead别人,就好像他们制定了编码规范就能鲤鱼跃龙门——成为小组组长、部门经理、公司CTO一样。

这种态度本身是带有傲慢、虚荣心的,如果一个开发者想要实现这样的"规范独裁",那么他必定只是一个蹩脚的开发者,更遑论是小组组长、部门经理、CTO了。真正优秀的开发者是谦虚、礼貌以及能够为团队做出牺牲的。不懂得融入团队,天天把别人当傻x的开发者,往往自己一直扮演着最傻x的角色。

转载于:https://www.cnblogs.com/SivilTaram/p/4847712.html

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

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

相关文章

STM32F1笔记(三)UART/USART

UART:Universal Asynchronous Receiver/Transmitter(通用异步收/发器) USART:Universal Synchronous/Asynchronous Receiver/Transmitter(通用同步/异步串行收/发器) 从命名即可看出USART就是UART的基础上…

python安装界面翻译_python环境搭建

如果想要运行python需要有解释器和编辑器。 什么是解释器 解释器我们可以把它理解成翻译官,它是将我们写的python代码翻译成计算机能够懂得机器语言。 然后计算机收到解释器的命令来干活,最终再将结果反馈在解释器中。 解释器推荐使用anaconda3 什么是an…

无需重新部署Eclipse和Tomcat即可进行更改

他们说,由于应用程序服务器过大,Java的开发速度很慢–您必须重新部署应用程序才能看到所做的更改。 使用PHP,Python等脚本语言时,可以“保存并刷新”。 这个法定问题总结了这个“神话”。 是的,这是一个神话。 您也可以…

进阶篇-用户界面:4.Android中常用组件

1.下拉菜单 在Web开发中&#xff0c;HTML提供了下拉列表的实现&#xff0c;就是使用<select>元素实现一个下拉列表&#xff0c;在其中每个下拉列表项使用<option>表示即可。这是在Web开发中一个必不可少的交互性组件&#xff0c;而在Android中的对应实现就是Spinne…

收款单单据编号不正确

问题现象:现在在应收&#xff0c;应付的收款单录入和付款单录入里点击增加的话&#xff0c;单据编号如果是出现2024呢&#xff0c;按保存的话&#xff0c;就会出现单据号重复&#xff1b;查到的最大的单据号是3034&#xff0c;在流水号里改成3038后再增回加的话还是出现2024。然…

STM32F1笔记(四)NVIC中断优先级管理

STM32将中断分为5个组&#xff0c;组0~4。配置代码如下&#xff1a; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 在标准库里&#xff0c;分组的定义如下&#xff1a; /** defgroup Preemption_Priority_Group * {*/#define NVIC_PriorityGroup_0 ((uint32_t…

到底是什么程序和功能?

许多RDBMS支持“例程”的概念&#xff0c;通常将其称为过程和/或函数。 这些概念已经在编程语言中存在了一段时间了&#xff0c;而且不在数据库中。 区分程序和功能的著名语言是&#xff1a; 艾达 基本知识 帕斯卡 等等… &#xff08;存储的&#xff09;过程和&#xff08…

http的“无连接”指的是_http协议无状态中的 quot;状态quot; 到底指的是什么?...

引子&#xff1a;最近在好好了解http&#xff0c;发现对介绍http的第一句话【http协议是无状态的&#xff0c;无连接的】就无法理解了&#xff1a;无状态的【状态】到底指的是什么&#xff1f;&#xff01;找了很多资料不仅没有发现有一针见血正面回答这个问题的&#xff0c;而…

个人日志-7.4

姓名 刘鑫 时间 2016.7.4 学习内容 完善需求分析报告。撰写数据库设计说明书。初步安排计划概要设计说明书。调整项目开发计划说明书。 所遇问题 无 解决方案 无 转载于:https://www.cnblogs.com/liuxin13070013/p/5641967.html

通达信编程实例

1、放量a、今日比昨日的成交量放大了1倍&#xff1a;VOL/REF(VOL, 1)>2; b、今日的五日均量比五天前的五日均量放大了3倍&#xff1a;AA:MA(VOL, 5);BB:REF(AA, 5);AA/BB>4&#xff1b; c、今天的成交量达到了整个流通盘的10%以上(注意&#xff0c;10%的表达式是10/100或…

STM32F1笔记(五)外部中断EXTI

STM32的每个IO都可以作为外部中断的中断输入口。 STM32F103的中断控制器支持19个外部中断/事件请求。每个中断设有状态为&#xff0c;每个中断/事件都有独立的触发和屏蔽设置。 STM32F103的19个外部中断为&#xff1a; EXTI线0~15&#xff1a;对应外部IO口的输入中断。 EXT…

您不想错过的十大Java书籍

我们通过阅读书籍并进行实验来学习。 因此&#xff0c;必须选择最佳的可用选项。 在本文中&#xff0c;我想与一些书分享我的经验&#xff0c;以及它们如何帮助您发展为Java开发人员。 让我们从头开始&#xff0c;对于任何Java学生来说&#xff0c;前三本书都是一个很好的起点。…

pythonos模块_Python3 入门教程——os模块使用(文件/目录操作)

前言 os模块是Python标准库中一个用于访问操作系统的功能模块。 使用os模块中提供的接口&#xff0c;可以轻松实现跨平台访问。 在os模块中提供了一系列访问操作系统功能的接口&#xff0c;如&#xff0c;新建目录、删除目录、变更目录、重命名目录.... 新建单级目录 基本语法&…

当数据量很少的时候,tableview会显示多余的cell--iOS开发系列---项目中成长的知识二...

当数据量很少的时候,tableview会显示很多的cell,而且是空白的,这样很不美观 所以使用下面的方法可以去掉多余的底部的cell 原理是:设置footerView为frame 是 CGRectZero ,造成一种假象! UIView *v [[UIView alloc] initWithFrame:CGRectZero]; [self.myTable setTableFooterVi…

逗牙搞笑网www.idouya.xin

有一天&#xff0c;小明问妈妈“妈妈&#xff0c;妈妈&#xff0c;爸爸是什么啊&#xff1f;”妈妈刚刚和爸爸吵架&#xff0c;生气的回答“孩子&#xff0c;记住所有的男的都是色狼&#xff01;”小明有去问爸爸“爸爸&#xff0c;爸爸&#xff0c;妈妈是什么啊&#xff1f;”…

STM32F1笔记(六)独立看门狗IWDG

STM32F1内置了两个看门狗&#xff0c;独立看门狗IWDG和窗口看门狗WWDG&#xff0c;可以用来检测和解决由软件错误引起的故障。 IWDG最适合应用于那些需要看门狗作为一个在主程序之外&#xff0c;能够完全独立工作&#xff0c;并且对时间精度要求较低的场合。WWDG最适合那些要求…

在JSF 2中对定制验证器进行参数化

在JSF 2中编写自定义验证器并不复杂。 您实现Validator接口&#xff0c;添加FacesValidator批注&#xff0c;并在faces-config.xml中插入Validator声明&#xff0c; 仅此而已 。 一块蛋糕。 但是&#xff0c;让我们考虑以下情形&#xff1a; 您需要自定义日期验证器&#xff0c…

python绘制散点图的函数_python matplotlib更新函数的散点图

有几种方法可以对matplotlib图进行动画处理.在下文中,我们将使用散点图查看两个最小示例. (a)使用交互式模式plt.ion() 要进行动画制作,我们需要一个事件循环.获取事件循环的一种方法是使用plt.ion()(“交互式打开”).然后需要首先绘制图形,然后可以循环更新绘图.在循环内部,我…

偷学来的资料

--矛盾 fis3的pngcrush不支持你的node版本v4.4.0 换成4.2.4就可以了. --工具 淘宝 NPM 镜像:http://npm.taobao.org/ FIS2 to FIS3:https://github.com/fex-team/fis3/blob/master/doc/docs/fis2-to-fis3.md fis3demo:https://github.com/fex-team/fis3-demo --前端blog/网站 廖…

Java EE6事件:JMS的轻量级替代品

我今天要讨论的功能是Java EE 6中的事件机制。一般的想法是触发一个事件&#xff0c;并让事件监听器来接收它。 我创建了这个完全没有用的示例&#xff0c;但是它的简单性帮助我专注于重要的内容。 我将从后备操作中触发LogEvent&#xff0c;该事件将记录到java.util.Logger中。…