作者 | Scott Shipp

译者 | 核子可乐

当我还是菜鸡程序员时,我看到资深程序员们写的代码会觉得:“这也太傻了吧,毫无特点。”当我工作经验渐长后,才发现自己还是太年轻,naive。

Brian Goetz 是 Java 领域的技术大牛,同时也是《Java 并发实践》一书的作者之一。我最喜欢的一句名言就是他讲的。这句话出现在甲骨文公司以《编写傻瓜式代码》为题发表的访谈当中,当时记者问到 Goetz 如何才能编写出性能良好的代码。以下是他给出的睿智回应:

一般来说,在 Java 应用程序当中快速编写代码的方法,就是先写点傻瓜式代码——这类代码简单、干净,而且遵循最明确的面向对象原则。

在接下来的发言中,他一直在具体解释:为什么尝试优化代码并试图让代码看起来不那么傻瓜,正是程序员群体中的一种常见错误。而在我看来,这更多是一种新手程序员常犯的错误。

  

高级开发者的代码

如果大家像我一样,也经历过初窥门径的过程,那么各位应该还记得自己第一次看到高级开发者写出的代码时,心里想的是:

“这玩意儿我也写得出来,为什么我就不是高级开发者呢?”

此后,我花了不少时间想写出相类似的代码,最后发现我根本就做不到。

关于“高级开发者”的疑问,并不在于我无法理解代码当中的特征。相反,我一眼就能明白他们写的代码在说些什么,因为这些代码从根本层面上就是在走傻瓜式路线,谁还看不懂啊。但除此之外,似乎还有更多不同。我记得当时我在想,“这「更多的」究竟是什么?又是怎么做到的?”

从那时起,我逐渐学会了编写傻瓜式代码的所有原则与质量保证方法,包括:YAGNI 原则 (You Ain’t Gonna Need It);单一责任原则;DRY 原则(Don't Repeat Yourself);单一级别抽象原则;低耦合等等。我自己,也慢慢成了“高级开发者”。(我其实很讨厌「高级开发者」这种说法,因此我始终坚持称自己为「软件工程师」,但这又是另一个故事了。)

我学到的最重要的经验就是:

编写傻瓜式代码实际上非常困难,但一旦实现则会带来远超预期的回报。

如何从一里外认出菜鸡程序员

在《重构:改进现有代码设计》当中,Kent Beck 指出:

任何傻瓜都能够编写出计算机可以理解的代码,但只有优秀的程序员能够编写出人类可以理解的代码。

如果大家遇到精妙无比的单一代码行,以及模糊的抽象及 / 或语言特征时,其背后几乎总会有一位初级开发者。说实话,后一种情况尤其常见。看到这些代码,我仿佛就看到这位程序员在强调:

“快来看我!我真的很懂这门编程语言!我在使用默认接口同步本地线程 JavaBean 复制构造函数,并配合自定义通用未检查异常以及跨函数安全强化 JAXB Lombok 代码生成!看我厉不厉害!”

以上场景纯属胡说八道,但相信大家能够明白我的意思。这类代码往往来自那些只关注计算机理解,而不重视人类理解的程序员。

代码的本质,在于向其他人交流并向计算机发出指令;但相较于后者,目前代码的前一项作用显得尤其重要,因为有编译器负责将程序员编写的内容翻译成机器语言。一般来讲,这种转换会分多层实现,例如在将 Java 编译为 ByteCode 时,Java 代码首先由 Java 虚拟机在运行中读取,并最终将内容翻译为 0 和 1 的形式。

不过代码代表的仍然是人类的语言,除了指导计算机之外,必须也能够表达任务当中的谁、什么、何时、哪里、如何以及为什么等问题。再举个例子,即使你的公司被收购了五年多,这些代码也仍然得具有实际意义,并确保之前从未见过这些代码的新团队能够快速打开并进行功能增强 / 错误修复。

是的,编写傻瓜式代码非常困难。随着时间的推移,我觉得我越来越喜欢这种编程风格了。当我在代码评论中收到“这代码真干净!”之类的评语时,我真的感到非常欣慰。我知道我能为整个团队、乃至未来的代码维护者们做的最好的事情,就是编写傻瓜式代码。

需知:

道路千万条,维护第一条。代码不规范,运维两行泪。

作为结尾,我再列出 Dave Carhart 的一些观点,只为博君一笑:

你写的代码是傻瓜式的吗?

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

怎么在一里以外识别出一个菜鸡程序员相关推荐

  1. 一个菜逼程序员的2016年度总结

    最近看到阮一峰老师的2016年度总结,菜逼程序员我也想记录下自己的这一年. 从学校走出来 15年6月从学校走出来,和几个大学死党同学规划毕业旅行是大西北,作为一个重庆的山上娃娃,见到沙漠,戈壁,雅丹, ...

  2. 一个一年工作经验的菜鸡程序员的一年总结

    坎坷并且顺利的一年 前言 一.为什么会干这一行? 二.入职 1.被大佬照顾的小白 2.被浪潮拍死的弄潮儿 3.重新出世的大菜鸡 回顾以前展望未来 前言 刚开始准备投入这个行业是2020年8月的时候,当 ...

  3. 蓝桥杯真题 15省7-牌型种数 小明被劫持到X赌城,被迫与其他3人玩牌。 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。 这时,小明脑子里突然冒出一个问题: 如果不考虑花色,

    题目描述 小明被劫持到X赌城,被迫与其他3人玩牌. 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张. 这时,小明脑子里突然冒出一个问题: 如果不考虑花色,只考虑点数,也不考虑自己得 ...

  4. 小镇走出的大厂女程序员,也害怕努力后仍一无所获

    ​程序员向来是热搜体质,熬夜.秃头.996.多金.而女程序员更是其中的稀缺物种,即便是阿里巴巴这样的大厂,女程序员的比例也不过在10%上下.而在阿里云建站部门的17个程序员中,仅有鹿铃(花名)一个女性 ...

  5. 如何成为一个优秀的程序员

    本文给出了十五个评定软件开发人员的标准,可以帮助程序员朋友从一个好的程序员成为一个优秀的程序员,和大家共飨! 怎样评定一名软件开发人员?这是一个颇为奇怪的问题.现在已经有了很多的理论和形式来做这件事, ...

  6. 关于程序员的那些事——一个五年程序员的总结

    一晃,做了五年多的程序员了,感觉自己应该是程序员大军中比较典型的一个,班科生毕业,直接加入了软件开发的行列,先是小公司,然后大公司,走了一条典型的程序员的路线. 虽然我不是大牛,但是感觉在我这样普通程 ...

  7. 我要做一个什么样的程序员

    2年前毕业误入程序员行业,是奔着传说的高薪水来的(绝大部分刚出校门毕业生的心态). 自己不是一个甘于平庸的人,觉得既然已入行,就要在这行有一番作为,不能仅仅是为了赚钱,每天上下班8小时的工作,那不是我 ...

  8. 【知乎】怎么成为一个优秀的程序员,而不是一个优秀的码农?

    怎么成为一个优秀的程序员,而不是一个优秀的码农? 9 条评论 分享 默认排序按时间排序 98 个回答 3844赞同反对,不会显示你的姓名 萧井陌 微信公众号:炼瓜研究所 技术社区 - 3844 人赞同 ...

  9. 程序员:要想成为一个伟大的程序员

    程序员:要想成为一个伟大的程序员,首先,要有钱,没钱等着饿死,其次,需要的可不仅仅是能够编写出可以正常运行的代码.Justin James给出了能够成为业内顶尖高手的程序员应该具有的几个典型特质. 要 ...

最新文章

  1. 数据库定义语言常见关键字
  2. mingw+libpython安装记录
  3. emacs php 配置文件,如何配置emacs进行正确的PHP开发?
  4. 进阶之路:深入解读 Java 堆外内存 | 凌云时刻
  5. 草图大师(2018)
  6. hulk入门使用——ddos攻击
  7. 男人:你是“橙皮男”还是“草莓男”?
  8. js 数据类型思维导图
  9. 上交计算机考研专业课,2020上海交通大学计算机考研经验,过来人谈考研
  10. 自建企业邮箱如何选择服务器
  11. UE4学习笔记:学习UE4中的UMG(图形UI设计器)工具(一): Widget Blueprint控件蓝图
  12. 轻量级网络——MobileNet系列学习(理论篇)
  13. 《华盛人》技术服务支持
  14. iOS HTTPS证书不受信任解决办法
  15. 优思学院|利用Excel进行双样本t检验
  16. Oracle应用之merge合并更新函数
  17. 爬虫——把jason格式用pandas化成dataframe
  18. 【虹科】什么是网络钓鱼?如何避免?
  19. 离散数学:计算主析取范式(基于真值表)
  20. 如何获得所有汉字_汉字思维直播课 | 掌握这20个中国故事,拿下小学语文的“半壁江山”...

热门文章

  1. python判断今天周几_Python如何根据日期判断周几
  2. view.post(Runnable)
  3. python max((1、2、3)*2)_Python functional.max_pool2d方法代码示例
  4. 数据结构之树、森林、二叉树的转化
  5. 4-7:TCP协议之流量控制
  6. 55 - I. 二叉树的深度
  7. 3D Slicer源代码编译与调试
  8. Python Flask服务同时接收单个、多个上传的文件
  9. Linux日常运维管理技巧(四)文件同步工具-rsync、Linux系统日志、dmesg命令、lastb命令查看登录失败的用户、screen工具虚拟屏幕
  10. java 连接IBM MQ的方法和常见问题