写点什么

20 年编程老兵的代码价值观 | 极客时间

  • 2019-05-16
  • 本文字数:1647 字

    阅读完需:约 5 分钟

20年编程老兵的代码价值观 | 极客时间

代码,是我们交流的语言和处世的名片,更是未来你找工作的简历。


你好,我是范学雷,我想和你来聊聊“怎么写好代码”这件事。


2014 年 2 月,安全研究人员爆出苹果公司旗下的 iOS 和 OS X 操作系统出现了严重的安全漏洞,黑客可以利用这一漏洞轻松获取用户的数据。下面的这段 C 语言伪代码简单描述了当时的漏洞情况。


    if ((error = doSomething()) != 0)        goto fail;                 goto fail;        if ((error= doMore()) != 0)                goto fail;fail:        return error;
复制代码


相信你一眼就能看出来,在这段代码的第三行出现了多余的代码,导致后面的其他代码“失效”,这一低级错误也让所有的安全人员大跌眼镜。你可能会说,这开发人员真是太粗心了,是不是他复制代码的时候,多复制了一行,然后忘记删除了?


可能是这个原因,但问题的源头肯定不是粗心。有专家在看完了代码文件之后,发现相关的 Bug 代码没有正确使用缩进,也没有正确使用括号,并且其中的空格、制表符和代码注释也都不统一。


换句话说,这段代码就是所谓的“烂代码”。


工作中,你要是说谁的代码烂,那我估计很快你就会挑起一场战争。因为对于烂代码和好代码的定义,真的是千人千面。现实环境的变化,也影响着你我对于代码“好”与“坏”的判断标准。


虽然对于“什么是优秀的代码“难以形成一致意见,但是这么多年的经验,让我对代码“好”与“坏”积累了一些自己的看法。


“好”的代码应该:


  1. 容易理解;

  2. 没有明显的安全问题;

  3. 能够满足最关键的需求;

  4. 使用规范的命名;

  5. 经过充分的测试。


“坏”的代码包括:


  1. 难以阅读的代码;

  2. 浪费大量计算机资源的代码;

  3. 代码风格混乱的代码;

  4. 复杂的、不直观的代码;

  5. 没有经过适当测试的代码。


当然,上面的列表还可以很长很长,长到一篇文章都列不完、长到我们都记不住的程度。如果用一句话来概括的话,我觉得“最适合当前现实环境的代码,才是最优秀的代码。”我将会在极客时间上的专栏《代码精进之路》中详细阐述这句话的含义。

我是谁?

我是范学雷,现在是 Oracle 的主任工程师,也是 OpenJDK 和 Java 安全的评审成员。从 1998 年我参加工作以来,一直在一线从事编程工作,期间在 OpenJDK 社区参与代码评审的工作。作为一个代码评审者,不是批准或者拒绝提交的代码,而是提出合理的建议,帮助代码提交者规避这些失误或者错误,编写出更优秀的代码。


作为解决现实问题的软件工程师,不管资历深、资历浅,我们都需要编写优秀的代码,并且是越来越优秀的代码,因为这是我们生存的基本依靠。作为活在现实世界的技术工程师,我们需要保持长久的竞争力,甚至是越来越强的竞争力,因为这是改善我们生存质量的最好方式。


我常和一些程序员说:“每一行代码,都体现着程序员的修为,思考问题的深度,甚至是处理问题的习惯和态度。代码,是我们交流的语言和处世的名片,更是未来你找工作的简历。”

这个专栏我会讲些什么?

我会围绕代码的规范、性能和安全三个方面展开,选取工作中遇到的最高频的、实用的细节问题,从重要性、易犯错的场景以及最优的处理方案等角度来讲解,让你知道好的代码应该怎么写,怎么定义好的代码。

互动讨论

import java.util.HashMap;import java.util.Map;
class Solution { /** * Given an array of integers, return indices of the two numbers * such that they add up to a specific target. */ public int[] twoJia(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { int complement = target - nums[i]; if (map.containsKey(complement)) return new int[] { map.get(complement), i }; map.put(nums[i], i); } throw new IllegalArgumentException("No two sum solution"); }}
复制代码


这段代码中你发现了几个错误呢?同时可以在留言区秀秀你最中意的代码,或者吐槽一下你今年遇到的那些烂代码,并且给你造成了哪些困扰呢?


内容选自极客时间代码精进之路专栏


2019-05-16 15:049434

评论

发布
暂无评论
发现更多内容

鸿蒙系统应用开发之开发准备

EquatorCoco

华为 系统开发 鸿蒙系统

UV贴图和展开初学者指南

3D建模设计

3D渲染 3D材质编辑 3D材质纹理贴图 UV纹理贴图 UV映射

软件测试开发/全日制/测试管理丨接口功能测试

测试人

软件测试 自动化测试 接口测试 测试开发 测试管理

阿里云 EMAS & 魔笔:12月产品动态

移动研发平台EMAS

软件测试开发/全日制/测试管理丨用户端 Web 自动化测试

测试人

软件测试 自动化测试 测试开发 Web自动化测试 web测试

如何选择适合自己的外贸独立站域名?

九凌网络

亚马逊云科技助力施耐德电气加速AI技术在制造场景的落地与创新

财见

一文详解VScode 的远程开发

快乐非自愿限量之名

远程开发 vs-code

AE脚本-图层分布路径形状高级控制 Tweaks

Rose

音视频小程序在教育行业的应用发展是短期爆发or未来趋势?

Geek_2305a8

UV映射技巧和窍门

3D建模设计

3D渲染 3D材质编辑 3D材质纹理贴图 UV纹理贴图 UV映射

软件测试开发/全日制/测试管理丨用户端 App 自动化测试

测试人

软件测试 自动化测试 测试开发 app自动化测试

软件测试开发/全日制/测试管理丨接口测试抓包与 Mock/接口自动化

测试人

软件测试 接口测试 测试开发 Mock

AE脚本-快速创建微风摇曳摆动波浪动画 Breeze

Rose

CAE技术的局限性讨论-CAE咨询

智造软件

CAE CAE软件

2024年最热门的15个科技工作岗位

互联网工科生

程序员 科技 岗位

Postgres 中文周报:PostgreSQL 2023 热门回顾

酷克数据HashData

什么是多边形网格以及如何编辑它?

3D建模设计

3D渲染 3D材质编辑 3D材质纹理贴图 UV纹理贴图 UV映射

医疗机构如何释放数据要素价值 推动数据资产化

用友BIP

数据资产

面向研发使用、全栈开发、前后端分离的低代码平台

互联网工科生

软件开发 前后端分离 低代码 全栈开发

了解什么是UV纹理?

3D建模设计

3D渲染 3D材质编辑 3D材质纹理贴图 UV纹理贴图 UV映射

低代码平台几分钟构建一个内部应用程序

高端章鱼哥

开发工具 低代码开发 JNPF

软件测试开发/全日制/测试管理丨Docker容器技术

测试人

Docker 软件测试 容器技术 测试开发

业务无忧:稳定云虚拟主机让您的在线业务更加顺畅

一只扑棱蛾子

虚拟主机 云虚拟主机

使用AI搭建SpringBoot服务

X.F

AI Openjdk Java' openai Bard

如何选择适合自己的外贸独立站域名?

九凌网络

DAPP、链游、交易所和区块链钱包开发

区块链软件开发推广运营

交易所开发 区块链开发 链游开发 公链开发 区块链开发DAPP开发

Apache Flink 和 Paimon 在自如数据集成场景中的使用

Apache Flink

大数据 flink 实时计算

NeurIPS’23 Paper Digest | 如何把 LLM 的推理能力应用于事件序列预测?

可信AI进展

人工智能 机器学习 推理 推理模型 算法、

软件测试开发/全日制/测试管理丨性能测试

测试人

GaussDB(for MySQL)新特性TDE发布:支持透明数据加密

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 华为云GaussDB(for MySQL)

20年编程老兵的代码价值观 | 极客时间_语言 & 开发_范学雷_InfoQ精选文章