“编程不规范,同事两行泪!”
【编者按】编程江湖中一直盛传着一个段子,那就是要问程序员最讨厌哪 4 件事?那必须是:
写注释、写文档、别人不写注释、别人不写文档。
更甚者,在《流浪地球》形成刷屏之势之后,仿其而出的“代码千万行,注释第一行;编程不规范,同事两行泪”在技术圈中开始盛传,由此可见对于所有的程序员来说这是多么痛苦的事情。
本文作者 —— 全栈开发者 Nitin Sharma 分享了编程的七宗罪,也许对你会有所启发。
作者 | Nitin Sharma,全栈开发者
译者 | 罗昭成
责编 | 沭七
来源 | CSDN(ID:CSDNnews)
以下为译文:
还有什么事情比自己动手去创造更有趣?看着你发明的东西慢慢地进入生活?我们人类,是万物之主,是造物主。
但是在数字化时代,发明创造的方式发生了变化。现在,我们都创造数字化产品。我们建网站、写软件来满足我们的需求。虽然我们创造不再依赖于我们的创造力,但是我们仍然可以与艺术家其名。
编程的世界非常地宽广,涉及重多领域,我们有很多选择。你可以选择使用函数式编程,还是使用面向对象编程?你可以选择做服务端还是客户端?那么,你心中已经有抉择了吗?下面,有 100 种编程语言,可以用来实现你的需求。
语言、框架、库都在逐渐增多。你可以通过多种方式完成相同的代码功能。虽然这些语言可能差别很大,但是大多数语言都遵循相同的思想。所以,他们也会出现相同的问题。
以下是编程七宗罪,你可以想办法避免他们发生。虽然我不是基督教徒,但是我也喜欢定义七宗罪。
协作时不使用版本控制
上帝保佑,我们有版本控制工具。如我所说,如果我们没有像 Git 这种版本管理工具,代码的世界将变得异常艰难。版本控制让我们在协作的时候,修改或移动变得非常简单。
想像一下,我们坐在电脑前,手动检查并合并文件,为不同的版本保存不同的文件夹。这样做是非常低效的,并且很不可靠。幸运的是,我们有 Git 和其它版本控制工具,来帮我们完成这个事情。
我参与过没有版本控制的项目,那简直就是一场恶梦。
不使用合适的变量命名
我不知道为什么,身边总有一些人,使用很短/随机的名称来给变量命名。当你的项目只有 10-20 行代码,或者只是代码片段时,你可以使用这种方式进行命名,但是在大项目中,不要这么做。不合适的命名,对可读性和效率有致命的影响。
一个命名的简单规则:你变量的名称可以自解释。当你看到它们的时候,就知道他们的用途。但是不要使用太长的名字来命名!保持命名简短,并具有可读性。
让我们来找一找,你的代码中用 a , b, c 命名的代码。
使用过多的依赖,不经思考直接升级
GitHub 上面有多少个开源项目? 已经多到我们数不清了。这些开源库使开发者的工作变得更加容易,节约我们的时间。
但是使用过多的依赖库会对整个项目带来风险。依赖库越多,就意味着编译时间和运行时间的加长。我们应该在我们需要的地方添加对应的依赖库,而不要为了使用它而使用它。
所以,在升级之前,我们需要经常去检查依赖库/插件的支持情况。我曾经有一次,升级了 React,而没有去检查它对其它库的影响。到如今,我依然认为这是我生命中最严重的错误之一。
不自解释的代码
值得一提的是,没有人想阅读整个方法/文件来理解它是干什么用的。使用最少的代码来实现功能,但是不要让别人或者是以后的自己,讨厌你自己写的东西。
我们应该一直尝试去写自解释的代码。我们应该让我们的代码,在第一次被看到的时候,就知道它是干什么用的。要完成这样的代码,我们需要进行正确的代码重构,统一的语法,适当的变量名称。必要的时候,还要给代码添加注释。
当然,也不要过多地书写注释,你不需要通过注释解释每一行代码。最好用 1-2 行注释,写清楚重要部分的概述或说明。
格式不一致
这个和第四点非常相近,格式不一致也会对可读性和生产效率带来巨大的影响。在项目中,选择一个特定的命名规范并一直坚持下去,不要在中途改变它们。我个人更喜欢用大写字母来命名文件,驼峰命名法来命名方法、变量等。但这些也会根据不同的语言而作出改变。
没有比开发者格式化代码更糟糕的事情。
此外,在代码中,我们还需要使用相同的缩进格式。根据你的代码样式和选择的语言,使用 2/4/8 个空格来做缩进。但无论你使用什么样的格式,请坚持在整个项目中一直使用。
不处理错误
畏惧它。逃避它。Bug 终会降临! —— 灭霸
(译者注:指 Bug 如影随形,不休不止,像诅咒一样。)
事情是这样的,无论你是多么优秀的程序员,你的代码都有可能会出现问题,除非你写的是像如下的这种代码:
console.log("Yey")
printf("Wow")
这些错误有可能是因为 API 错误引起的,也有可能是超时,类型错误,空值,或者只有上帝知道的原因。通常,这些会让你的代码出现问题。
在不同的语言中,处理错误的方式有很大的差异。但是一般情况下,在访问数据之前都需要判断数据否为空。在我的经验中,空指针比其它错误都多。
所以,在执行数据处理的相关需求时,建议将代码放到 try-catch 中,并处理对应的异常,最后,不要忘记告诉用户哪里出现了问题。如果在用户按下按钮和按键的时候不给用户反馈,用户将不知道发生了什么。给用户错误提示,并告诉它下一步怎么做。
时刻记住灭霸的话。
使用不当的数据类型/数据结构
在不同的语言中,数据类型要求不一样,强类型语言非常严格,而弱类型可以随意使用。强类型语言在编译时就会告诉你错误,而其它语言需要在运行时,才能知道错误。
举个例子,我们将数值存储在整型/符点型/双精度符点型的变量中,并且与存储在字符串中的变量进行比较时,有的语言会进行自动类型转换,然后进行比较,而有的语言并不会。
结语
编程七宗罪,让人不爽。我们需要避免出现。
这个仅仅是在编程中出现的常见错误。你很难看到,一个程序员,在他的程序中出现这些问题。但这也正如圣经中的七宗罪一样,不仅是这些问题。它们是原罪,可以组合成不同的错误。
你认为还有什么错误需要加在这个列表里面,在评论中写出来,让我知道。
Happy Coding!
原文地址:https://hackernoon.com/the-7-deadly-sins-of-programming-a7574efc639f
本文为 CSDN 翻译,如需转载,请注明来源出处。
(本文为AI科技大本营转载文章,转载请联系原作者)
精彩推荐推荐阅读:
“安利”一款debug神器:在AI面前,bug都不是事儿
一键免费自动AI抠图,效果连PS大哥也点赞!
这可能是史上最全的Python算法集!
Python之父重回决策层,未来如何发展?
华为立 Flag:一年超越三星做全球智能手机老大!
那些简历造假拿 Offer 的程序员,后来都怎么样了?
被V神点赞, 我是如何用五子棋打败以太坊排名最高的应用的? |人物志
50个最有价值的数据可视化图表(推荐收藏)
2月报告:Python逆袭成功?踢馆Java,碾压C++!
点击“阅读原文”,查看历史精彩文章。
相关文章:

记一次 调节有音量界面 上移的bug
如图所示:音量调节的界面直接上移了本来是以为是因为edittext 的原因使得这个界面上移了(但其实我也不信,因为我应该影响不了系统的界面) 然后最后不断调整布局 不断调整代码 通过排查 发现是因为使用了DTMF的原因(用来…

这可能是史上最全的Python算法集!
来源 | CSDN(ID:CSDNnews )本文是一些机器人算法(特别是自动导航算法)的Python代码合集。其主要特点有以下三点:选择了在实践中广泛应用的算法;依赖最少;容易阅读,容易理…

Emoji表情图标在iOS与PHP之间通信及MySQL存储
在某个 iOS 项目中,需要一个服务器来保存一些用户数据,例如用户信息、评论等,我们的服务器端使用了 PHPMySQL 的搭配。在测试过程中我们发现,用户在 iOS 端里输入了 Emoji 表情提交到服务器以后,PHP 无法在 MySQL 数据…

【linux】图形界面基础知识(X、X11、GNOME、Xorg、KDE的概念和它们之间的关系)
转载自:https://blog.csdn.net/zhangxinrun/article/details/7332049 简介 LINUX初学者经常分不清楚linux和X之间,X和Xfree86之间,X和KDE,GNOME等之间是什么关系。常常混淆概念,本文以比较易于理解的方式来解释X&…

DreamWeaver做ASP 第13页
第七步:修改资料篇 修改资料!首先要清醒一点,什么人才可以修改。 一,本人只能修改自己的;二,管理员可以修改所有人的。 那今天先来搞个可以修改自己资料的页面。 顺序是:先确认是正确登录&#…

【linux命令】setterm控制终端属性命令(中英文)
###setterm中文 SETTERM(1) 用户命令 SETTERM(1) 名字 setterm - 设置终端属性 概要 setterm [选项] 描述 setterm向终端写一个字符串到标准输出,调用终端的特定功能。在虚拟终端上使用,将会改变虚拟终端的输出特性。不支持的选项将被忽略。 选项 对…

搜狗分身技术再进化,让AI合成主播“动”起来
整理 | 一一出品 | AI科技大本营去年 11 月的互联网大会期间,搜狗与新华社联合发布全球首个AI合成主播一经亮相,引起了人们对“AI媒体”的广泛讨论。如今,搜狗 AI 合成主播不断更新迭代。2 月 19 日,在新华社新媒体中心与搜狗公司…

Angular http跨域
var app angular.module(Mywind,[ui.router]); app.controller(Myautumn,function($scope,$http,$filter){ //$http跨域 //服务端设置 // 访问权限 response.setHeader("Access-Control-Allow-Origin", "*"); // 访问类型 response.setHeader(&q…

文本分类step by step(二)
(注:如有转载请标明作者:finallyliuyu, 和出处:博客园) 《文本分类 step by step(一)》 在《文本分类step by step(一)》中,我们从处理语料库开始讲起,一直讲到利用分类器…

Centos7.4 版本环境下安装Mysql5.7操作记录
Centos7.x版本下针对Mysql的安装和使用多少跟之前的Centos6之前版本有所不同的,废话就不多赘述了,下面介绍下在centos7.x环境里安装mysql5.7的几种方法:一、yum方式安装 Centos7.x版本下针对Mysql的安装和使用多少跟之前的Centos6之前版本有所…

叫你一声“孙悟空”,敢答应么?
整理 | 一一出品 | AI科技大本营(ID:rgznai100)随着自然语言理解等技术的发展,对话机器人如今盛行,而基于此的智能音箱产品的发展也异常火热。很多开发者一般热衷于在一些对话机器人平台上开发相应的语音技能,但也有不…

【linux】Matchbox(一):启动脚本
脚本执行顺序 启动X服务器 /etc/rc5.d/S01xserver-nodm --> …/init.d/xserver-nodm–> 对应进程: /bin/sh /etc/rc5.d/S01xserver-nodm start background xinit /etc/X11/Xsession–> 对应进程: xinit /etc/X11/Xsession – /usr/bin/Xorg …

java试用(1)hello world
设置环境变量path H:\soft\j2sdk1.4.2_17\bin;H:\soft\eclipse;%path%set CLASSPATH.;H:\soft\j2sdk1.4.2_17\jre\lib;JAVA_HOME: D:\jdk1.5.0PATH: D:\jdk1.5.0\bin;编写程序 Noname1.java (注意:文件名要和class名一样)class Noname1 { public static void…

GAN性能不稳?这九大技术可“镇住”四类缺陷
作者 | Bharath Raj译者 | ang010ela编辑 | 一一出品 | AI科技大本营尽管 GAN 领域的进步令人印象深刻,但其在应用过程中仍然存在一些困难。本文梳理了 GAN 在应用过程中存在的一些难题,并提出了最新的解决方法。使用 GAN 的缺陷众所周知,GAN…

java正则表达式获取指定两个字符串之间内容
xml解析利用正则表达式获取指定两个字符串之间内容 在遇到解析复杂xml的时候,想到大家所想到的都是利用dom4j作为首发工具,但是当遇到层次很多,较为复杂,我们难道还需要从根节点一层一层的解析下去吗?此时不仅代码繁琐…

【linux】Matchbox(二):基本概念
X server X server是Linux系统里面图形接口服务器的简称。Windows系统的界面是这个系统不可分割的一部分,各种窗口操作界面显示都是由系统核心直接管理的,而Linux的图形界面并不是系统的必要组成部分,它可以在无界面的条件下运行。当需要Lin…

Android 控件之ImageSwitcher图片切换器
ImageSwitcher是Android中控制图片展示效果的一个控件,如:幻灯片效果...,颇有感觉啊。做相册一绝 源码下载 一、重要方法 setImageURI(Uri uri):设置图片地址 setImageResource(int resid):设置图片资源库 setImageDra…

【Qt】Qt5.x移植后的环境配置(imx6)
1、环境配置脚本如下 #!/bin/shexport QTDIR=/usr/lib/qt5 export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins export QT_QPA_PLATFORM=eglfs:fb=/dev/fb0 export QT_QPA_GENERIC_PLUGINS=evdevtouch:/dev/input/event1 export QT_QPAFONTDIR=/usr/lib/fonts export QML2_IM…

程序员如何避免“滴滴式裁员”悲剧?
作者 | 徐麟转载自数据森麟(ID:shujusenlin)滴滴于2月15日正式发表裁员公告,想必很多互联网人的朋友圈都已经被这条消息刷屏了,其中最常见的莫过于下面这张图了:此图一出,广大互联网吃瓜群众不禁后背发凉&a…

windows服务搭建及命令总结
1、图解FTP服务器搭建(Windows Server 2008) https://wenku.baidu.com/view/803bdc1759eef8c75fbfb361.html?fromsearch https://www.cnblogs.com/john2017/p/6269671.html 2、WindowsServer2008下搭建ApachePHPMySQL https://wenku.baidu.com/view/2e82b99ea1116c175f0e7cd18…

Linux下的CST和UTC时间的区别
在linux中,用date查看时间的时候显示:2008年 12月 17日 星期三 09:04:14 CSTCST China Standard Time UTC8:00 中国沿海时间(北京时间)世界协调时间(Universal Time Coordinated,UTC)GPS 系统中有两种时间区分,一为UTC,另一为LT&a…

Python之父重回决策层,未来如何发展?
作者 | 豌豆花下猫来源 | Python猫(ID:python_cat)春节假期结束了,大家陆续地重回到原来的生活轨道上。假期是一个很好的休息与调节的机会,同时,春节还有辞旧迎新的本意,它是新的轮回的开端。在…

【Android】adb命令总结
1、adb version 显示ADB工具版本 2、adb devices 查询设备,显示设备序列号 3、adb sideload < file_location> 通过USB进行ROM刷机 4、adb install < apk文件路径> 安装APK 5、adb uninstall <软件名> 卸载软件 6、adb push <本地路径>…

MySQL中char与varchar的区别
字符与字节的区别 一个字符由于所使用的字符集的不同,会并存储在一个或多个字节中,所以一个字符占用多少个字节取决于所使用的字符集注意:char与varchar后面接的数据大小为存储的字符数,而不是字节数(其实是5.0版本以上…

怎样在Red Hat Enterprise Linux 5.4版本上安装GCC?
注意:如果打算使用GUI的方式安装,需要导入GPG-Key(否则在使用GUI时会出现public key for *.rpm is not installed) 请切换到安装光盘目录下: cd /media 可以看到 RHEL* 的目录,然后切换到这个目录中: cd RHEL* 你需要运…

【C++】mingw32-make+cmake:error: ‘nullptr‘ was not declared in this scope解决方法
###问题 使用cmake成功(Configuring done Generating done)后,在cmd终端中执行 mingw32-make报错: error: nullptr was not declared in this scope###原因 nullptr是在c11的新内容。编译时,没有添加对C11的支持。 解…

喜得爱女,吴恩达深情撰文:欢迎你来到新世界!
整理 | 琥珀出品 | AI科技大本营(ID:rgznai100)一个月前,吴恩达冷不丁在Twitter放出了重磅消息: “我们的最新‘成果’ Baby Ng 即将诞生!2019 年 2 月见面!”果然,昨日吴恩达公开了首个小公主降…

FastJson 简单使用
对象、List转JsonUser user new User(); /*JSON 序列化,默认序列化出的JSON字符串中键值对是使用双引号,如果需要单引号的JSON字符串, [eg:String jsonString JSON.toJSONString(map, SerializerFeature.UseSingleQuotes);] *fastjson序…

【数据安全案例】交警计算机系统再遭***,交通违法记录随意删除
根据新浪报道,据新华社10月14日电 利用当网管的机会,破解密码,非法进入交警计算机系统为他人删除车辆交通违法记录牟利。辽宁省鞍山市铁西区检察院透露,当地某公司员工程尚军因涉嫌破坏计算机信息系统罪,已于10月初被依…

开源,还能走多远?
【编者按】在各大厂纷纷拥抱开源的当口,“开源代码面临可持续发展危机”的言论也甚嚣尘上。早期,技术爱好者们“用爱发电”,“他们知道在出问题前,没人会注意到他们,没人会重视他们”。但遗憾的是,很长一段…