我最近一直在想我们作为一个行业为什么总是产出糟糕代码的原因。
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结构即可。需要增加新的功能呢?哈哈,那就添加更多的代码到那个已经长达两页的方法中去!这里只举几个走捷径例子。
学习编程的一个好方法是掌握语言的语法,高效开发所需的工具,以及组成代码的组件和模块的设计——以这种顺序。
不幸的是,大多数书籍停留在语法上,而不触及工具和设计改进的话题。虽然这些书的意图和目的是要教导编程语言的语法,但是阅读的人同时也会学习编码风格和方法。
在初学者学习代码的时候,教导他们明白一件事非常重要,那就是,代码是为其他人阅读和理解而写的,而并非是为了编码器而写。
希望你们中的一些人在阅读了这篇文章之后,如果将来写编程书籍的话,请务必要记得在书中写好代码!学着产出高质量的代码不应该只限于专家级的书籍中,而应该是每本关于编程的书的重要组成部分!
当初学者用来学习的书籍中包含低质量的代码时,我们怎么能期待学自这些书的人会产出高质量的代码呢?