作者:暗夜风线_371 | 来源:互联网 | 2016-02-27 02:24
编者按:本文由秦迪向「高可用架构」投稿,介绍编写好代码的思考与感悟。转载请注明来自高可用架构公众号「ArchNotes」。
秦迪,微博研发中心技术专家,2013 年加入微博,负责微博平台通讯系统的设计和研发、微博平台基础工具的开发和维护,并负责微博平台的架构改进工作,在工作中擅长排查复杂系统的各类疑难杂症。爱折腾,喜欢研究从内核到前端的所有方向,近几年重点关注大规模系统的架构设计和性能优化,重度代码洁癖:以 code review 为己任,重度工具控:有现成工具的问题就用工具解决,没有工具能解决的问题就写个工具解决。业余时间喜欢偶尔换个语言写代码放松一下。
“一个人工作了几年、做过很多项目、带过团队、发了一些文章,不一定能代表他代码写的好;反之,一个人代码写的好,其它方面的能力一般不会太差。” —— 秦迪
最近写了不少代码,review 了不少代码,也做了不少重构,总之是对着烂代码工作了几周。为了抒发一下这几周里好几次到达崩溃边缘的情绪,我决定写一篇文章谈一谈烂代码的那些事。这里是上篇,谈一谈烂代码产生的原因和现象。
1、写烂代码很容易
刚入程序员这行的时候经常听到一个观点:你要把精力放在 ABCD(需求文档/ 功能设计/架构设计/理解原理)上,写代码只是把想法翻译成编程语言而已,是一个没什么技术含量的事情。
当时的我在听到这种观点时会有一种近似于高冷的不屑:你们就是一群傻 X,根本不懂代码质量的重要性,这么下去迟早有一天会踩坑,呸。
可是几个月之后,他们似乎也没怎么踩坑。而随着编程技术一直在不断发展,带来了更多的我以前认为是傻 X 的人加入到程序员这个行业中来。
语言越来越高级、封装越来越完善,各种技术都在帮助程序员提高生产代码的效率,依靠层层封装,程序员真的不需要了解一丁点技术细节,只要把需求里的内容逐行翻译出来就可以了。
很多程序员不知道要怎么组织代码、怎么提升运行效率、底层是基于什么原理,他们写出来的是在我心目中一堆垃圾代码。但是那一坨垃圾代码竟然能正常工作。
即使我认为他们写的代码是垃圾,但是从不接触代码的人的视角来看(比如说你的 boss),代码编译过了,测试过了,上线运行了一个月都没出问题,你还想要奢求什么?
所以,即使不情愿,也必须承认,时至今日,写代码这件事本身没有那么难了。
2、烂代码终究是烂代码
但是偶尔有那么几次,写烂代码的人离职了之后,事情似乎又变得不一样了。
想要修改功能时却发现程序里充斥着各种无法理解的逻辑、改完之后莫名其妙的 bug 一个接一个,接手这个项目的人开始漫无目的的加班,并且原本一个挺乐观开朗的人渐渐的开始无法接受了。
我总结了几类经常被鄙视到的烂代码:
2.1 意义不明
能力差的程序员容易写出意义不明的代码,他们不知道自己究竟在做什么。
就像这样:
1
2
3
4
5
6
|
public void save() {
for(int i=0;i<100;i++) {
//防止保存失败,重试100次
document.save();
}
}
|
对于这类程序员,建议他们尽早转行。
2.2 不说人话
不说人话是新手最经常出现的问题,直接的表现就是写了一段很简单的代码,其他人却看不懂。
比如下面这段:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public boolean getUrl(Long id) {
UserProfile up = us.getUser(ms.get(id).getMessage().aid);
if (up == null) {
return false;
}
if (up.type == 4 || ((up.id >> 2) & 1) == 1) {
return false;
}
if(Util.getUrl(up.description)) {
return true;
} else {
return false;
}
}
|
还有很多程序员喜欢复杂,各种宏定义、位运算之类写的天花乱坠,生怕代码让别人一下子看懂了会显得自己水平不够。
很多程序员喜欢简单的东西:简单的函数名、简单的变量名、代码里翻来覆去只用那么几个单词命名;能缩写就缩写、能省略就省略、能合并就合并。这类人写出来的代码里充斥着各种 g/s/gos/of/mss 之类的全世界没人懂的缩写,或者一长串不知道在做什么的连续调用。
简单的说,他们的代码是写给机器的,不是给人看的。
2.3 不恰当的组织
不恰当的组织是高级一些的烂代码,程序员在写过一些代码之后,有了基本的代码风格,但是对于规模大一些的工程的掌控能力不够,不知道代码应该如何解耦、分层和组织。
这种反模式的现象是经常会看到一段代码在工程里拷来拷去;某个文件里放了一大坨堆砌起来的代码;一个函数堆了几百上千行;或者一个简单的功能七拐八绕的调了几十个函数,在某个难以发现的猥琐的小角落里默默的调用了某些关键逻辑。
这类代码大多复杂度高,难以修改,经常一改就崩;而另一方面,创造了这些代码的人倾向于修改代码,畏惧创造代码,他们宁愿让原本复杂的代码一步步变得更复杂,也不愿意重新组织代码。当你面对一个几千行的类,问为什么不把某某逻辑提取出来的时候,他们会说:
“但是,那样就多了一个类了呀。”
2.4.假设和缺少抽象
相对于前面的例子,假设这种反模式出现的场景更频繁,花样更多,始作俑者也更难以自己意识到问题。比如:
1
2
3
4
|
public String loadString() {
File file = new File("c:/config.txt");
// read something
}
|
文件路径变更的时候,会把代码改成这样:
1
2
3
4
|
public String loadString(String name) {
File file = new File(name);
// read something
}
|
需要加载的内容更丰富的时候,会再变成这样:
1
2
3
4
5
6
7
8
|
public String loadString(String name) {
File file = new File(name);
// read something
}
public Integer loadInt(String name)
var cpro_id = "u6885494";
推荐阅读
-
一位程序员的妻子在网上分享了她丈夫在北京工作八年的经历,月薪仅3万元,存款情况却出乎意料。本文探讨了高学历人才在大城市的职场现状及生活压力。 ...
[详细]
蜡笔小新 2024-12-28 11:14:15
-
本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ...
[详细]
蜡笔小新 2024-12-27 17:26:33
-
-
本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ...
[详细]
蜡笔小新 2024-12-27 14:45:30
-
本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ...
[详细]
蜡笔小新 2024-12-27 08:43:40
-
本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ...
[详细]
蜡笔小新 2024-12-24 15:21:23
-
本文详细介绍了C语言中的指针,包括其基本概念、应用场景以及使用时的优缺点。同时,通过实例解析了指针在内存管理、数组操作、函数调用等方面的具体应用,并探讨了指针的安全性问题。 ...
[详细]
蜡笔小新 2024-12-24 10:51:59
-
本文详细介绍了C语言的起源、发展及其标准化过程,涵盖了从早期的BCPL和B语言到现代C语言的演变,并探讨了其在操作系统和跨平台编程中的重要地位。 ...
[详细]
蜡笔小新 2024-12-23 14:11:43
-
在数据无处不在的时代,数据库成为了管理和处理数据的核心工具。从早期的信息记录方式到现代的云数据库,数据库技术经历了巨大的变革。本文将探讨云数据库的特点及其对程序员的影响。 ...
[详细]
蜡笔小新 2024-12-17 14:42:46
-
本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ...
[详细]
蜡笔小新 2024-12-28 11:05:31
-
本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ...
[详细]
蜡笔小新 2024-12-28 10:36:30
-
Valve 最新发布了针对 Steam Deck 掌机的 Windows 驱动程序,旨在提升其在 Windows 环境下的兼容性、安全性和性能表现。 ...
[详细]
蜡笔小新 2024-12-28 10:31:16
-
本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ...
[详细]
蜡笔小新 2024-12-28 10:07:27
-
2020年悄然过半,时间的宝贵与无情令人深思。自去年12月开始撰写公众号以来,不知不觉已接近一年。本文将对findyi公众号在技术管理、认知提升、创业经验、职场发展、产品运营及个人成长等方面的文章进行总结,为读者提供一次回顾和补漏的机会。 ...
[详细]
蜡笔小新 2024-12-24 11:01:18
-
本文详细介绍如何通过修改配置文件来隐藏Apache、Nginx和PHP的版本号,从而增强网站的安全性。我们将提供具体的配置步骤,并解释这些设置的重要性。 ...
[详细]
蜡笔小新 2024-12-24 10:21:12
-
本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ...
[详细]
蜡笔小新 2024-12-23 20:40:08
-
|