程序员偷偷深爱的 9 个不良编程习惯

我们曾经都做过这样的事情:当妈妈不注意的时候,偷偷地吃糖果零食,然后导致有了蛀牙。同样的,我们都违背过一些编程的基本规则,并且都会坚定地表示这种行为是不可取的。但我们就是偷偷爱着这些不良的编程习惯。

我们对所谓的编程规则嗤之以鼻,输出的代码也很糟糕——但我们依然活着。编程上帝没有下闪电劈死我们,我们的电脑也没有爆炸。事实上,只要我们能编译和发布代码,客户似乎就很满意了。

这是因为糟糕的编程不像安装电路或者摸老虎屁股那样有直接的危害性。大多数时间里它也是可以工作的。规则通常是作为一种指导或格式上的建议,并没有硬性规定一定要遵守,也不会导致代码马上死掉。当然,你的代码可能会被人耻笑,甚至可能大家公开嘲笑你,不过,这种挑战惯例的行为可以让人增加一点颠覆传统的快感,哪怕是在不经意间。



为了让问题变得更加复杂,有时候违反规则反而更好。(一般人我不告诉他!)出来的代码会更干净,甚至可能会更快和更简单。规则通常显得太过于宽泛,有技巧的程序员可以通过打破这些规则来提高代码。不要告诉你的老板,这对你的编码生涯会很有意义。

下面这9个编码习惯,虽然在编程规则中是被驳斥的,但我们很多人就是会不由自主地使用它们。

编程习惯No. 1:使用goto


关于禁止使用goto可以追溯到许多结构化编程工具还未面世的时代。如果程序员想要创建一个循环或跳到另一段程序中,那么他们需要输入goto后再跟一个行号。过了几年之后,编译器团队让程序员使用字符串标签取代行号。这在当时被认为是一个热门的新功能。

有的人认为这会导致“意大利面条式代码”。代码会变得不可读,并且很难理解代码的执行路径。线程混乱,缠缠绵绵到天涯。Edsger Dijkstra就三令五申地表示应该禁止这个命令,他有一份诙谐的手稿,题目为《Goto语句害人不浅》。

但绝对的分支是没有问题的。这就让人纠结了。通常,巧妙的 break 语句和return 语句可提供一个非常干净的关于代码在那个时候执行什么的声明。有时候,添加 goto 到case语句会比更恰当的多级嵌套的if-then-else语句块更易于理解。

也有反例。在苹果的SSL堆栈中的“goto fail”安全漏洞就是最好的例子之一。但是,如果我们能够仔细避免case语句和循环的一些尴尬问题,那么我们就可以嵌入良好的绝对转移,使阅读代码的人更容易明白这是怎么回事。我们可以插入break和return 语句,让每一个人感觉更清洁和更愉快——可能得除了goto的敌视者。

编程习惯No. 2:成功避开文档


我的一个朋友有一个非常精明的老板,这位老板虽然从来没有写过任何代码,但却秉持着每一个功能都必须包含在文档中的理念。哪个程序员不提供注释,那么他就会受到惩罚。所以,我的朋友在他的编辑器中联入了一个有点像人工智能的玩意儿,于是乎,他的每一个功能就都有几行“文档”了。因为这位精明的老板还不够聪明到能理解这些注释其实啥意思也没有,所以我的朋友逃过一劫。他的代码常常被作为正式文档。我想,他应该快要升职了!

许多函数方法,甚至一些类或多或少都能自文档化。冠以insertReservation或cancelReservation或 deleteAll 等名称的函数并不需要多此一举来解释它们的作用。为函数取一个正确的名字往往就足够了。事实上,这比写一段长长的注释要好,因为函数名可以出现在代码中的其他地方。而文档只能默默地呆在某个角落。自文档化的函数名可以改进它们出现的每个文件。

在有些情况下,写文档甚至会导致情况变糟。例如,当代码瞬息万变,团队像疯了似的重构的时候,文档会产生分歧。代码是这样写的,但文档解释的还是四五个版本以前的情况。这类“过时”的文档通常位于代码顶部,有的人会在这里对代码应该发生什么作一个美好总结。因此,尽管重构团队已经仔细修改了相关的注释,但还是会遗漏文件顶部的这段“美好总结”。

当代码和文本出现分歧的时候,注释就变得毫无价值,甚至会产生误导。在这样的情况下,良好的自文档化的代码显然胜出了。

编程习惯No. 3:一行写太多代码


老板突然发神经地给团队发了一封讨厌的邮件:为了执行非常严格的风格规定,我们大家都必须重写我们的代码。最神奇的要求是:每个行为或步骤或子句必须各自成行。你不能使用点语法连续调用函数。在一个分支语句中,你不能有两个及以上返回布尔值的子句。如果要定义变量,那么另起一行。如果你正在做一个复杂的计算,那么不要使用括号。每个片段也自成一行。

他认为他的这个法令将能使调试变得更加容易。就像你单步调试代码一样,调试器会一个动作一个动作地前进。这样就不会卡在某一行。而且更容易执行。

但是这样一来,键盘上的回车键烦不胜烦,因为我需要不断地插入行。而且我敢肯定,老板因此还可以到处吹嘘他的团队能写多少行代码。

唉,有时在同一行中声明一堆变量反而更容易;有时把所有的布尔子句放在一起反而更简单——一切都能变得更加紧凑。那也意味着,我们可以在屏幕上看到更多的逻辑而无需滚动鼠标。更易于阅读就意味着理解起来更快。这才是简单的精粹。

编程习惯No. 4:不声明类型


那些热爱类型化语言的人认为,如果为每个变量添加明确的数据类型声明,就可以写出更好的、没有错误的代码。花一点时间来拼写类型,能帮助编译器在代码开始运行之前标志愚蠢的错误。可能会让人觉得痛苦,但很有帮助。这是编程中停止bug的一种有备无患的方法。

但是时代变了。许多较新的编译器完全可以智能地通过查看代码来推断类型。它们会向后和向前浏览代码,直到可以肯定这个变量是string 还是int,抑或其他。如果这些被查看的类型不成队列,那么错误标志就会点亮。因此再也不需要我们输入变量的类型了。

这意味着我们现在可以在代码中省略掉一些最简单的声明。代码更清洁,而且阅读代码的人也猜得出for循环中命名为 i 的变量表示一个整数型。

编程习惯No. 5:摇摆不定的代码


有的程序员在代码上特别优柔寡断,犹豫不决。先是一开始将值存储为字符串,然后又解析成整数。接着又转换回字符串。这是非常低效的,你甚至可以感觉到CPU在咆哮这种浪费负载的行为。聪明的程序员之所以能快速地编码,是因为他们事先会设计架构,以尽量减少转换。他们的代码能更快地运行是因为他们有一个良好的规划。

但是,不管你信不信,这种摇摆不定的代码有时候也是有意义的。比如说,你有一个非常棒的库,在它专有的黑盒子里能做无数智能的事情。如果库需要字符串的数据,那么你就给它字符串,即使你刚将这个数据转换成为整数型。

当然,你可以重写所有的代码,以尽量减少转换,但是这需要时间。而且,有时候让代码稍微多花点额外时间来运行也未尝不可,因为重写代码需要耗费我们更多的时间。有时,背负这样的技术债务比一开始就正确构建的成本要更低。

有的时候,库不是专有的代码,但那些你以前全部自己写的代码是你独有的。有的时候,再次转换数据比重写库中的所有代码要快得多。所以,就让它这样吧,就让代码摇摆吧。

编程习惯No. 6:编写你自己的数据结构


有一个标准规则是,程序员在完成数据结构课程的第二年,不应该写用于存储数据的代码。基本上我们需要的所有的数据结构,已经有人写好了,而且其代码已历经多年的测试和再测试。它和语言捆绑在一起,而且常常是免费的。你的代码只能造就bug。

但有时你会发现数据结构库有点慢。有时它们会迫使我们使用标准的,但于我们的代码却是错误的结构。有时库会把我们推向在使用结构之前重新配置数据的地步。有时库会包含一些所谓有备无患的保护功能,如线程锁,但其实我们的代码并不需要。

如果遇到这种情况,那么就应该着手写我们自己的数据结构。这或许能让你做得更快,做得更多。而且代码会变得更清洁,因为我们不会包括那些多余的用于格式化数据来完成一些功能的代码。

编程习惯No. 7:在中间打破循环


有一个规则制定小组宣称,每个循环都应该有一个“常量”,也就是说当这个逻辑语句为true的时候,循环一直执行。当常量一定不会是true的时候,循环才会结束。这是考虑复杂循环的好方法,但它会导致愚蠢的禁令——例如禁止我们在循环中间使用return 和break 语句。这一条也包含在禁止goto语句的规则中。

这个理论是好的,但它通常会导致更复杂的代码。请看下面这个简单的案例,遍历数组,将找到的元素传递给test函数,并将该元素返回:

while (i<a.length){...if (test(a[i]) then return a[i];...
}

“循环常量”爱好者会要求我们增加一个布尔变量,命名为notFound,然后这样使用:

while ((notFound) && (i<a.length){
...
if (test(a[i])) then notFound=false;
...
}

如果这个布尔值能够合理地命名,那么这就是一段很棒的自文档化的代码,更易于大家理解。但这也增加了复杂性。这意味着你需要分配另一个局部变量,并堵塞寄存器,因为编译器也许还不能足够智能到解决这个问题。

有时候,一个goto 语句或一个跳转会更干净利索。

编程习惯No. 8:使用短变量名(i和x和and也是有意义的)


Edgar Allan Poe这位诗人和小说家曾经说过,在一个故事中的每一个词都应该是有内涵的。编码规则也强调如此。变量名应该说明这个变量的所作所为。那些使用驼峰式大小写的方法来写变量名,以表达关于变量细节的Java程序员深以为然,于是一个又一个疯狂长度的变量名出炉了。有些程序员写的变量名,会组合五六个甚至更多的词语。

但有的时候,使用单个字母作为变量名反而会更方便。有时在循环迭代中只使用i或j会更简单。有时使用字母a代表array ,l代表list会更便捷,即使是字母l和数字1看上去很难辨别。

正如这篇文章前面鼓励的是自文档化的代码,而非长长的注释。在上述情况下,单个字母的变量名也是自文档化的。字母 i 是通用的迭代器。只要是程序员立刻就会懂。

编程习惯No. 9:重新定义运算符和函数


一些最有趣的编程语言允许你去做一些特别诡异的事情,例如重新定义元素的值,就如同常量一般。例如Python,你可以输入TRUE=FALSE(在Version2.7及之前的版本)。这并不会产生某种逻辑崩溃,或导致宇宙终结——仅仅只是互换了TRUE和FALSE的含义。你也可以在C预处理器和一些其他语言中玩玩类似于这样的危险游戏。还有一些语言允许你重新定义运算符,如加号。

当然这是延伸了,不过有一个观点是,在一个大的代码块内,当重新定义一个或多个所谓的常量时,速度会更快。有时老板会要求代码做一些截然不同的事情。当然,你可以修改代码的每个事件,或者,你可以重新定义。这让你看上去像一个天才。不必重写一个庞大的库,只需翻转一下,就可以做相反的事情了。

这9个习惯就都在这儿了。千万不要轻易尝试,不管它看上去有多牛掰。太危险了——真的,这是实话。

公众号内回复“1”带你进粉丝群!

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

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

相关文章

室友半夜偷偷不睡觉,原来竟是看这个!

接口测试及常用接口测试工具解析 一、常见接口&#xff1a;二、前端和后端&#xff1a;三、什么是接口测试&#xff1a;四、接口组成五、为什么要做接口测试&#xff1a;六、接口测试怎么测&#xff1a;七、用什么工具测 那些关于接口测试的二三事&#xff0c;首先大家要搞清楚…

一名8年测试工程师,因为偷偷接私活被····

接私活 对程序员这个圈子来说是一个既公开又隐私的话题&#xff0c;不说全部&#xff0c;应该大多数程序员都有过想要接私活的想法&#xff0c;当然&#xff0c;也有部分得道成仙的不主张接私活。但是很少有人在公开场合讨论私活的问题&#xff0c;似乎都在避嫌。就跟有人下班后…

上班偷偷看视频摸鱼而不会被老板打的工具,还不用吗

文章首发于微信公众号「蚂蚁原图」&#xff0c;欢迎大家关注。打开微信&#xff0c;使用 “搜一搜”&#xff0c;搜索「蚂蚁原图」&#xff0c;即可关注。 今天给大家推荐的项目是 「 intellij-media-player 」&#xff0c;这个项目作者的目的是摸鱼&#xff0c;能够在上班的时…

惊了,浏览器竟偷偷干了这些事....

前言 之前我就一直好奇&#xff0c;为什么我在浏览器输入一个地址之后&#xff0c;就可以返回数据&#xff0c;这中间到底发生什么了呢&#xff1f; 于是我苦研技术二十年&#xff08;bus&#xff09;&#xff0c;终于把这中间发生了啥大概给理清楚了。接下来就一起来看看到底…

今天被公司约谈,说工作时长不够,要求每天至少11小时,不然就是态度不认真!...

一天的工作时长多久合适&#xff1f; 一位同花顺公司员工吐槽&#xff1a;今天被公司约谈&#xff0c;说工作时长不够&#xff0c;要求每天至少11小时&#xff0c;不然就是工作态度不认真&#xff01; 楼主问&#xff1a;这种情况怎么办&#xff1f;大无语了&#xff01; 网友惊…

偷偷自动化,每周才工作几小时却拿全薪,这样道德么?

&#xff08;点击上方公众号&#xff0c;可快速关注&#xff09; 编译&#xff1a;伯乐在线/刘唱 程序员们在 StackExchange 上有激烈的讨论&#xff0c;如果偷偷把自己的工作自动化&#xff0c;是不是不道德&#xff1f; 这次讨论的源于 Etherable 于 6 月 27 日在 StackExcha…

【创作赢红包】喂,鬼仔,你还在瞒着我偷偷使用强制相等

我们都知道JavaScript有 (强制相等)和(严格相等)运算符进行比较。但你可能不知道它们两个究竟有什么不同&#xff0c;并且更重要的是&#xff0c;在 js 引擎中使用它们的时候发生了什么? 前面我们提到 是强制比较。强制意味着 VM 试图将进行比较的双方强制为相同的类型&…

程序员在晚上才敢偷偷看的10个网站,建议私藏!

这10个网站&#xff0c;大家自己看看就好&#xff0c;千万不要到处传播&#xff0c;因为访问的人太多了&#xff0c;网站可能会挂&#xff0c;这样我就不能拥有快乐了&#xff0c;salute&#xff01; 搜索工具类&#xff1a;Goobe 别再傻傻用Google和百度了&#xff0c;goobe…

【紧急情况】:回宿舍放下书包的我,花了20分钟敲了一个抢购脚本

文章目录 情况紧急 ⁉️抢❗️抢❗️抢❗️开抢时间说明&#x1f4a8;开抢过程&#x1f4a5;Get_cookie.py开抢 结束语&#x1f631; 情况紧急 ⁉️ 不管你信不信&#xff0c;这就是俺刚瞧出的代码&#xff01;&#xff01;&#xff01; 现在离20&#xff1a;00还有38分钟&…

中国科学院大学计算机在职博士招生,中国科学院在职博士研究生如何报考?

中国科学院大学博士研究生招收的学术型博士学位研究生&#xff0c;旨在培养德智体全面发展&#xff0c;在本学科领域掌握坚实宽广的基础理论和系统深入的专门知识&#xff0c;具有独立从事科学研究及相关工作的能力&#xff0c;能在科学研究和专门技术等方面做出创造性成果的高…

大学论文的研究框架是什么?

第一次写论文&#xff0c;难免连论文的基本固定结构都不得而知&#xff0c;更别提论文内容的研究框架啦&#xff01;这一篇是论文基础知识的扫盲&#xff01;告诉你一个论文的基本框架与如何树立起自己选题的内容研究框架~本篇干货满满&#xff0c;如果你还不会写论文&#xff…

巴比特 | 元宇宙每日必读:Meta开源AI模型ImageBind,可横跨6种模态,同时处理6种感官数据,元宇宙建设将更进一步...

摘要&#xff1a;据《科创板日报》报道&#xff0c;当地时间5月9日&#xff0c;Meta宣布开源了一种可以横跨6种不同模态的全新AI模型ImageBind&#xff0c;包括视觉&#xff08;图像和视频形式&#xff09;、温度&#xff08;红外图像&#xff09;、文本、音频、深度信息、运动…

Meta提出全新参数高效微调方案,仅需一个RNN,Transformer模型GPU使用量减少84%!

近来&#xff0c;随着ChatGPT和GPT-4模型的不断发展&#xff0c;国内外互联网大厂纷纷推出了自家的大语言模型&#xff0c;例如谷歌的PaLM系列&#xff0c;MetaAI的LLaMA系列&#xff0c;还有国内公司和高校推出的一些大模型&#xff0c;例如百度的文心一言&#xff0c;清华的C…

计算机社团活动展望未来,2018社团展望未来演讲稿范文

2018社团展望未来演讲稿范文 我们社团展望未来&#xff0c;就必须坚持社团活动的创新。以下是小编要与大家分享的社团展望未来演讲稿范文&#xff0c;供大家参考! 社团展望未来演讲稿范文(一) 不知不觉中&#xff0c;我加入到社团部这个大家庭中已有半年的时间。这半年&#xf…

我的专业我做主计算机演讲稿,我的未来我做主演讲稿

我的未来我做主演讲稿 演讲稿的写法比较灵活&#xff0c;可以根据会议的内容、一件事事后的感想、需要等情况而有所区别。在日常生活和工作中&#xff0c;演讲稿应用范围愈来愈广泛&#xff0c;在写之前&#xff0c;可以先参考范文&#xff0c;以下是小编精心整理的我的未来我做…

计算机社团竞选优势6,关于社团竞选演讲稿汇总六篇

关于社团竞选演讲稿汇总六篇 使用正确的写作思路书写演讲稿会更加事半功倍。在我们平凡的日常里&#xff0c;演讲稿应用范围愈来愈广泛&#xff0c;大家知道演讲稿的格式吗&#xff1f;下面是小编为大家整理的社团竞选演讲稿6篇&#xff0c;供大家参考借鉴&#xff0c;希望可以…

Meta「分割一切」超进化版来了!检测、分割、生成一切,狂揽2k星

编&#xff5c;桃子 好困源&#xff5c;新智元 Meta的SAM「分割一切」模型刚发布&#xff0c;国内团队就进行了二创&#xff0c;打造了一个最强的零样本视觉应用Grounded-SAM&#xff0c;不仅能分割一切&#xff0c;还能检测一切&#xff0c;生成一切。 Meta的「分割一切」模型…

粤港澳大湾区Microsoft Build 2023 After Party - 广州站

在经历过阳春三月一大波GPT带来的AI浪潮之后&#xff0c;今年的Build大会尤其令人期待。本次Build大会发布了超过50个新技术&#xff0c;尤其是在ChatGPT中支持Bing插件来提供联机搜索、Windows Copilot加入微软Copilot大家庭&#xff0c;提出Copilot Stack来便于搭建您自己的C…

学会这八个技术,你离BAT大厂不远了

红人榜第七期来咯~本期干货&#xff1a;HTTP、本周最受关注的技术关键词TOP8&#xff0c;往下看吧~ 在如今这个时间和知识都是碎片化的时代&#xff0c;C站根据C1-C4认证的成长路径&#xff0c;进行知识细化整理&#xff0c;形成系统化的知识图谱。 小编根据C1认证的成长路径…

互联网大佬谁编程排第一?周鸿祎:我应该可以排到前三名

10月24日是程序员节。在这一天&#xff0c;360集团创始人周鸿祎在社交平台发布动态为程序员点赞。 周鸿祎表示&#xff0c;未来&#xff0c;世界是架构在软件之上&#xff0c;是数字化的世界&#xff0c;每一个程序员都承担着重要的使命&#xff0c;用技术为国家解决一些“卡脖…