为什么程序员总是写糟糕的代码?这3个原因

我最近一直在想我们作为一个行业为什么总是产出糟糕代码的原因。

1.明显原因……

我一下子想到的最明显的原因是,有好的程序员,也有不那么好的程序员,有的人技术水平高,有的人水平却低,有人对这门技艺感兴趣,但也有的人却不愿意在工作之外学习其他。

好了,我就不深入探讨了。

那么是不是在这表层之下还有更多的问题呢?有没有导致糟糕代码的根本性原因?我觉得有必要深入探究一下。

2.低预期……

对于这一点,众所承认的是,我们在大学中,通过自学或书籍学到的东西,并不能匹配现实世界的真正需求。

因此,可以想象初学者总是需要在工作中学习如何产出好的代码。我们也相信,真正的编程知识只能通过经验累积才能获得。因而,初学者甚至觉得他们能写出的就是糟糕的代码!

当初学者预期他们将产出质量不好的代码,通常,那就是你将得到的结果!

虽然上述推理有部分是真理,但这个假设我不愿意接受,原因很多,但主要是以下三个:

期望低标准的职业生涯起点,也就是说质量变成了一个不重要的因素。低入口门槛的直接结果是低质量开发人员的大量涌入,并导致下面的第2点。

通过强迫他们和大多是低质量的开发者一起工作,我们让那些关心工艺和对自己的工作质量感到自豪的人过得苦不堪言。

上述两个因素的结合导致了我们现在这个状况,每个人都认为他们会写代码,但是我们更信任如同品牌商品一样的专业开发者。

我们得对初学者有更高的预期。试问,哪家医院会聘用一个以前没有做过手术的医生,或者说,哪家航空公司会雇用一个不会紧急降落的飞行员?我们根本不能接受这样的医生和飞行驾驶员。那么,为什么软件行业要接受低质量的程序员呢?

那么,低质量开发者的根本原因是什么呢?

3.编程书籍

几天前,我正找一些我以前看过的旧书的时候,恰巧找到了几本关于Java的书——一本针对学习Java的初学者,另一本针对于SCJP认证。对于接下来要讲的话题,具体书名我就不说了。

不幸的是,初学者参考的那些书籍总是在不经意间准确描绘了差的代码应该是怎么样的。

任何编程语言的初学者书籍,大多满是坏的代码。如《Clean Code》和《Pragmatic Programming》就是如此,但这些书籍却被广泛用于教导大多数的初学者。

一些糟糕代码的例子……

3.1糟糕地命名类、变量和方法

i, ii, j, k用于循环;SampleChapter1用于类名;等等

3.2不分离关注点

三页长的main()方法囊括了一切,没有根据责任不同分成不同的方法。

3.3不好的编码实践

没有如包含验证或异常处理这样好的编码实践。相反,他们通常使用一个包含所有代码在类内的大的通用的try()..catch(Exception e)块。

大量使用if-else,switch,goto语句等。

3.4走捷径

这些书籍还需要摆脱“快速修复”的编程风格。例如,方法中有10个参数并不罕见。

需要做两种类型的计算?没问题,传递一个布尔参数,并添加一个if-else结构即可。需要增加新的功能呢?哈哈,那就添加更多的代码到那个已经长达两页的方法中去!这里只举几个走捷径例子。

学习编程的一个好方法是掌握语言的语法,高效开发所需的工具,以及组成代码的组件和模块的设计——以这种顺序。

不幸的是,大多数书籍停留在语法上,而不触及工具和设计改进的话题。虽然这些书的意图和目的是要教导编程语言的语法,但是阅读的人同时也会学习编码风格和方法。

在初学者学习代码的时候,教导他们明白一件事非常重要,那就是,代码是为其他人阅读和理解而写的,而并非是为了编码器而写。

希望你们中的一些人在阅读了这篇文章之后,如果将来写编程书籍的话,请务必要记得在书中写好代码!学着产出高质量的代码不应该只限于专家级的书籍中,而应该是每本关于编程的书的重要组成部分!

当初学者用来学习的书籍中包含低质量的代码时,我们怎么能期待学自这些书的人会产出高质量的代码呢?

本文来自企鹅号 - java吧媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据派THU

独家 | 一探Stack Overflow工作搜索

作者:Aurélien Gasser 翻译:顾佳妮 术语校对:梁傅琪 全文校对:张冬阳 本文长度为6100字,建议阅读20分钟 Aurélien Gasser在...

1805
来自专栏大数据文摘

Reading Club | 算法和人生选择:如何给洗好的袜子排序呢?

1123
来自专栏机器之心

计算机架构顶会ISCA 2018唯一中国论文:清华大学提出AI计算芯片的存储优化新方法

卷积神经网络目前已经广泛应用于各种任务中,但因为其参数数量与中间储存的特征图数据,它很难部署到一般端应用中。尤其是当输入图像的分辨率增加,网络储存的中间特征图将...

1100
来自专栏CSDN技术头条

Twitter开源云环境时间序列数据断层检测工具BreakoutDetection

【编者按】区别于传统环境,鉴于云环境中众多不可预测的因素和异常,其时间序列breakout检测并不容易。近日,Twitter开源了一款基于E-Divisive ...

2045
来自专栏hbbliyong

更快学习 JavaScript 的 6 个思维技巧

我们在学习JavaScript,或其他任何编码技能的时候,往往是因为这些拦路虎而裹足不前: 有些概念可能会造成混淆,尤其当你是从其他语言转过来的时候。 找不到时...

2647
来自专栏程序人生

测量

在lean startup的框架里,测量(measure)是非常重要的一环,它承接着"build"和"learn",当系统的全部或者部分构建(build)出来后...

3418
来自专栏AI科技评论

业界| Google试水—Go语言也要冒险尝试机器学习?

导读:Go又称Golang,是Google开发的一种静态强类型、编译型、并发型且具有垃圾回收功能的编程语言。Go语言于2009年11月正式宣布推出并开放源代码,...

3323
来自专栏Java学习网

为什么程序员总是写糟糕的代码?这3个原因

我最近一直在想我们作为一个行业为什么总是产出糟糕代码的原因。 1.明显原因…… 我一下子想到的最明显的原因是,有好的程序员,也有不那么好的程序员,有的人技术水平...

3416
来自专栏Golang语言社区

体育竞技游戏的团队AI

很多人问游戏AI该怎么做?随着游戏类型的多元化,非 MMO或者卡牌的游戏越来越多,对AI的需求也越来越强了。而市面上关于 AI的书,网上找得到的文章,也都流于一...

1274
来自专栏机器人网

利用机器视觉OCR提升包装生产线性能的三种方法

OCR 是什么? OCR,或光学字符识别,是一种广泛应用于包装业的视觉系统工具。与条形码技术一样,OCR 也是一种数据采集的方法。它的最大优势在于其信息代码格式...

3265

扫码关注云+社区