写点什么

程序员最重要的技能:知道什么时候不写代码

  • 2019-09-11
  • 本文字数:2625 字

    阅读完需:约 9 分钟

程序员最重要的技能:知道什么时候不写代码

摘要:本文指出大多数程序员都容易犯下的错是,因为对编程的兴奋,不知道什么时候应该对编码说“不”。程序员需要知道什么时候不需要编码,并从项目中删除所有不必要的代码,这将让工作变得更容易,并使软件寿命更持久。


对什么说“不”

学会说“不”是一个好的开端。


但是到底是对什么说“不”,又是什么时候适合说“不”呢?


这的确是大多数程序员,甚至是那些高级程序员都很容易混淆的一个重点。


作为一名程序员,编写代码无疑是你职业中最重要的部分。在你的编程生涯中,你不可避免的地将会处理各种关于不同类型代码的请求。而每个请求都可能会迫使你做出一些艰难的决定。这些看上去一切正常,似乎也没什么错。毕竟,这是所有人对你的期望:作为程序员就该编写代码。然而,这里有一个问题:你是否应该编写向你请求的所有代码?


这个问题给我们引入了一个程序员所能学到最重要的技能:


知道什么时候不编码可能是程序员所能学到最重要的技能。

——《可读代码的艺术》


对上面这句话,我完全同意。这是为什么呢?


编程是解决问题的一门艺术。因此,自然而然地,程序员成为了问题解决者。作为程序员,当我们面前有一个新问题有待解决,或因为任何其他原因需要我们写出代码行时,我们会因为使命感而感到兴奋。


有这种兴奋也是再正常不过的,毕竟我们是程序员,我们就是喜欢写代码。


然而,对编写代码这件事过于兴奋就会让我们变得盲目。这种情绪会让我们忽视了一些重要的事实,而这些事实可能导致更大的问题,让我们在未来不得不再去解决这些更严重的问题。


那么,我们往往容易忽略哪些重要的事实呢?


你写的每一行代码都是:


  • 必须被其他程序员阅读和理解的代码

  • 必须被测试和调试的代码

  • 会增加软件缺陷的代码

  • 可能会在将来引入新 bug 的代码


正如 Rich Skrenta 所写的,代码是我们的敌人


代码可谓是邪恶的。代码会腐烂。代码需要定期维护。它们总是包含有待发现的 bug。而新特性的添加总是意味着旧代码必须进行调整。

代码量越大,bug 所能藏身的地方就越多,且 checkout 或编译代码所需的时间就越长,而新员工理解这个系统所需要的时间就越长。这还意味着,如果你需要重构代码,需要挪移更多东西。

此外,更多的代码通常意味着程序拥有更少的灵活性和更少的功能。这一点乍一看是违反直觉的,但确实很多时候,较之一个才华平庸的程序员所编写的冗长混乱的代码,一个简单优雅的解决方案能运行更快,且其功能会更通用。

代码都是由程序员编写的。所以编写更多的代码往往需要更多的程序员。而程序员之间的沟通成本是以 n²的速度增长的,然后,这些程序员写的所有代码都添加到系统,在扩大系统功能的同时,也会增加整个软件工程的运营成本。


我说的这些都是真的,难道不是吗?所以,那些用他们的生产效率和编程思维来激励你的伟大程序员们,都是那些知道什么时候该说“不”,什么时候不编程的人。易于维护、持续寿命长、不断帮助用户实现功能的那种软件,应该不包含任何不必要的代码行。


最好的代码其实是没有代码,而最有效率的程序员知道什么时候不应该编码。

怎么知道什么时候不应该编码呢?

当你投身一个项目的时候,很自然地会感到兴奋,满脑子都是所有那些想要实现的炫酷功能。但是程序员往往容易高估了他们的项目真正需要多少特性。于是就造成系统中有许多未完成或未投入使用的特性,甚至有些特性纯粹只是让应用程序变得过于复杂。你应该首先了解什么对你的项目是必要的,以避免犯下这种错误。


了解软件的用途及其核心定义,这是知道什么时候不应该编写代码的第一步。


请容许我举一个例子。假设,你的软件只有一个目的:管理电子邮件。基于这个目的,发送和接收电子邮件是该软件项目的两个基本功能。你就不应该期待这个软件同时也能管理你的待办事项清单,难道不是这样吗?


因此,你应该拒绝与此核心定义无关的任何可能的特性请求。在这种时候,可以确切地肯定你明白什么时候不应该编写代码。


永远不要随意扩展软件的用途。


一旦知道了什么内容对你的项目是必不可少的,那么在下一次评估所有可能出现的代码请求时,你会意识到这一点。你将清晰地知道编写代码的需求是什么。这个系统应该实现哪些特性?哪些代码值得编写?于是,你可以勇敢地去质疑一切,因为你确切地明白那些不必要的代码是如何拖垮你的项目的。


知道什么时候不应该编码可以使你的代码库更小。



当你启动一个新项目时,一开始系统里只有两三个源文件。一切看起来都那么简单明了。而编译和运行代码仅仅需要几秒钟。这时,你完全清楚在哪里可以找到你想要的东西。


然后,随着项目的增长,将会有越来越多的源文件填满你的目录。其中每个代码文件动辄就包含数百行代码。为了更好地组织这些代码,你很快就需要设立多个目录。记住哪个函数调用其他函数变得比以前更加困难,而追踪 bug 需要付出更多的工作量。管理这个项目变得越来越困难,于是,你需要更多的程序员来帮忙。然后,沟通开销随着程序员数量的增加而急剧增加。你的项目会变得越来越慢。


最后,这个项目变得非常庞大。添加新特性变为一种痛苦。因为即使是很小的改变也需要花上几个小时。修复当前的 bug 总是会引入新的 bug。你的项目开始赶不上最后期限……


现在,这个项目对你来说是一场折磨。为什么会变成这样?


这都是因为你不明白什么时候不应该编码。于是你对所有可能的特性请求都毫不犹豫地说“是”。你是盲目的。编写那些不必要的新代码会让你忽略软件最必不可少的核心内容。


这听起来就像恐怖电影一样,是吗?


但如果你一直对每件事都说“是”,这种恐怖的情况就会发生。你需要知道什么时候不需要编码,并从项目中删除所有不必要的代码。这将让你的工作变得更容易,并使你的软件的寿命更持久。


我生产效率最高的一天就是扔掉了 1000 行代码。

——Ken Thompson


我知道,要明白什么时候不需要编写代码,这点做起来是很难的。即使是高级程序员来说也并不容易。也许,我在这篇文章中所写的东西对于初级程序员来说很难理解,但我认为本文的叙述方式还是能让人理解这些要点的。


我明白,有的程序员或许刚刚开始你的编程生涯,想在编码领域大展身手。你对此感到兴奋不已。这点无可厚非。作为软件从业者,希望你永远不要失去这种兴奋感,但也请不要忽视重要的事实。我们需要从自己的错误中吸取教训。你和别人一样,也会犯错误,也会从自己的错误中吸取教训。但如果你能从我们的经验中学习,至少能更事半功倍。


请继续编码吧,但要知道什么时候需要对编码说“不”。


英文原文:


Knowing when not to code is possibly the most important skill a programmer can learn


2019-09-11 12:023711
用户头像

发布了 63 篇内容, 共 42.1 次阅读, 收获喜欢 119 次。

关注

评论

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

WordPress站点快速集成腾讯数字身份管控平台CIAM,免开发实现登录认证

腾讯安全

通过Rainbond的团队管理去管理已有的组织架构

北京好雨科技有限公司

最佳实践 多租户 开源软件 rainbond

高风险IP究竟来自哪里?IP定位带你反欺诈

郑州埃文科技

模块二作业

ks

Python代码阅读(第54篇):斐波那契数列

Felix

Python 编程 斐波那契 阅读代码 Python初学者

茜纱窗下夜读书(2021年11月)

美月

#读书

专业版再增强 | MSE 无缝兼容 Eureka 协议,性能提升50%

阿里巴巴中间件

阿里云 微服务 云原生 中间件 Eureka

优酷小程序优化实战

阿里巴巴终端技术

小程序 ios android 客户端 包大小

AliRTC 开启视频互动 “零计算” 时代

阿里云视频云

阿里云 音视频 RTC 视频云

【应用分享】百度超级链助力CFCA建设基于区块链的电子数据存证系统

百度开发者中心

百度 超级链

客户端稳定性异常检测:函数接口“扫雷”实践

阿里巴巴终端技术

函数式接口 稳定性测试 异常检测 客户端 APP稳定性

Linux踩过的坑

正向成长

Linux

并发编程之深入理解CAS

飞鸟

CAS 并发’ 11月日更 比较与交换

Android 应用层开发 Drawable 的一些叨叨絮(1),androidstudio中文社区

android 程序员 移动开发

用户案例|告别传统金融消息架构:Apache Pulsar 在平安证券的实践

Apache Pulsar

Apache Pulsar

JWT、JWS与JWE

喵叔

11月日更

如何用 Flutter开发一个直播应用

声网

flutter 人工智能

龙蜥操作系统将捐赠开放原子开源基金会

OpenAnolis小助手

Linux centos 开源社区 开放原子开源基金会

软件测试面试屡屡失败,面试官总是说逻辑思维混乱,怎么办?

六十七点五

学习方法 面试 软件测试 自动化测试 测试工程师

Android 常见的数据存储方式,腾讯T2大佬手把手教你

android 程序员 移动开发

Android 应用层开发 Drawable 的一些叨叨絮,跨平台移动开发答案

android 程序员 移动开发

RecyclerView使用GridLayoutManager为什么无法均匀分布?

Changing Lin

11月日更

300M的文件,9秒钟下载完成,这款软件真的太离谱!

懒得勤快

全面升级 —— Apache RocketMQ 5.0 SDK 的新面貌

阿里巴巴中间件

云计算 阿里云 RocketMQ 云原生 中间件

程序员:我熟悉多线程!面试官:都不敢写精通,还敢要26K?

Java 编程 程序员 面试 多线程

Android 开发市场是盛是衰?你应该知晓,android音视频开发面试题

android 程序员 移动开发

如何使用注解优雅的记录操作日志 | 萌新写开源 01

Zhendong

Java GitHub

资产管理系统是管钱的吗?不完全对

低代码小观

企业管理 资产配置 资产管理 管理系统 企业资产

golang源码学习--context

en

Context

如何给企业制定碳排放额度?

石云升

学习笔记 碳中和 11月日更 碳交易

又碰到一个奇葩的BUG

艾小仙

程序员最重要的技能:知道什么时候不写代码_文化 & 方法_Huseyin Polat Yuruk_InfoQ精选文章