在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

编程:思考还是打字

  • 2014-01-28
  • 本文字数:2199 字

    阅读完需:约 7 分钟

Jim Bird 是一位经验丰富的软件开发经理、项目经理与 CTO,专注于软件开发与维护、软件质量与安全等领域中疑难问题的解决。在过去的 15 年间,Jim 曾管理过团队建设并主导过高性能的财务系统的建设。他的主要兴趣在于如何提升小团队的效率以构建真正的软件:高质量、安全、可靠、高性能及适应性强。近日,Jim 撰写了一篇博文,谈到了编程与思考及打字之间的关系。编程与思考关联性更强抑或仅仅只是一些打字动作而已呢?在这篇博文中,Jim 给出了自己的答案。

Ward Cunningham 曾在“The Pragmatic Programmer”一书的序言中说过“如果没有经过深入的思考,那么你会认为编程只不过是使用一种编程语言输入一些语句而已”。

软件开发涉及到很多工作,如设计、解决问题、学习最优的新算法、学习新语言、将乱糟糟的代码重构为紧凑且优雅的代码,这些工作都需要深入的思考才行。

在尝试做一些之前没有做过的事情时,甚至其他人也没有做过,或者是之前曾经做过,不过要确保这次做的时候不会再犯与之前相同的错误,那么你需要花时间想出更好的方式。有时你需要理解别人编写的代码,这样才能对代码做出修改,还有些时候你会寻找代码中隐藏很深的Bug。所有这些工作都需要花费大量的时间,不过最后的结果却是你可能并没有编写太多的代码来表现这一段时间的工作。

开发中还涉及到其他一些类型的工作,这些工作需要输入很多代码,却不需要过多的思考。在清楚了做什么以及如何做之后,你需要编写大量的代码来完成工作。也许之前曾经编写过这样的代码,不过还要再编写一次,这可能是一段脚本、一个界面、一个报表。也许大多数思考工作已经由别人帮你做了:准备好了线框图、明确告诉你应用的感官与流程、详细列出了API 的细节信息,这时你要做的只是敲代码,并尽力保证别犯太多错误。

调试过程就是思考过程。修复Bug、测试Bug 修复并将结果发布出去几乎就是个打字的工作。早期的设计与开发、技术调研与架构设计需要深入的思考。制作第3 个、第4 个、甚至是第100 个界面或是报表就是个打字的工作。UX 设计与原型制作需要深入的思考,而编写CRUD 和配置信息则是个打字的活。追逐移动应用最新、最酷的想法需要深入的思考,而完成应用则只是个打字的工作。解决常见的业务问题需要编写很多代码,而通过软件优化业务流程则需要非常深入的思考。

有些人的工作需要大量的思考,还有些人则只是敲敲代码而已。其实这两种人从事的是非常不同的工作,需要采取截然不同的方式进行管理。

有时编程就是打字

Jeff Atwood 在“Programming Horror”这篇文章中曾说过“我们首先是个打字员,其次才是程序员”。

很多业务应用本质上都是很肤浅的,充斥着大量的数据库表和文件、大量的数据元素、大量的 CRUD 界面、大量的报表、大量的集成、大量的映射,这导致运维工作变得比较困难。长长的功能需求列表,大量的问题需要回答才能保证每个人都能理解需求,需要记住大量的细节信息并追踪这些信息。银行、保险、政务、会计、财务报表与账单、库存管理与 ERP 系统、CRM 系统、办公应用,诸如此类;还有很多 Web 门户和在线商店都是如此。

你是要建造一个房子、一座桥还是一个商场呢?这类大问题的解决代价也很高昂,需要编写大量的代码才行。不过这些代码很有可能之前已经编写过多次了,这些工作更多的是使用熟悉的模式解决熟悉的问题,然后证明所采用的工具与方式是正确可行的。

思考、思考、思考

其他工作,诸如设计游戏引擎或是交易算法、物流与在线风险管理、优化实时控制系统都需要大量的思考,相比之下,打字的工作量倒没有那么大了。这些系统都具有严苛的非技术需求(可伸缩性、实时的性能、可靠性、数据完整性及精确性等)与复杂的逻辑,不过他们都关注于解决一类问题。有一些聪明人能够胜任这些问题,并找到问题的解决方案。虽然如此,还是有一些编码工作需要做,不过核心工作的代码量通常都不是很大,

这正是软件的魔力之所在,成功系统的核心都是一些专利算法和经过深思熟虑的设计。这类工作需要做很多研究并开发大量的原型,具备问题解决能力和丰富的领域知识。

打字与思考是不同类型的工作

需要编写大量的代码还是深入的思考决定了团队需要多少成员,这也改变了人们的工作方式以及你的管理方式。编码工作可以外包出去,思考工作却绝不行。你得认识到编码可以解决哪些问题,不能解决哪些问题,当思考转变为编码时需要多少工作量。

思考工作应该由紧密配合的专家小团队来完成,或是由一个非常聪明的成员独立完成。在设计架构或是解决难题时,你不需要很多人参与。解决问题的人会沉浸在问题域中,这是很有效的方式。

思考与打字

思考与打字是软件开发中的两个重要组成部分。

“Programming is Not Just Typing”这篇文章中,Brendan Enrick 谈到了结对编程的好处,因为这会促使人们在打字的同时又在思考:

  • 两个人都在思考,但思考的却是不同的事情。一个开发者拿着键盘,脑子里想着他正在编写的代码,在短时间内,他的打字速度比较重要。
  • 结对的另一个开发者全力思考着。他并不关心编程语言的语法,因为这是另一个人的事情。他要确保自己的搭档使用正确且高效的方式完成工作。

成为一名优秀的开发者要比一名打字员困难得多,他需要学习很多知识:掌握所用的编程语言、了解相关工具的使用方式、知道如何在代码间导航、知道如何编写更好的代码,同时打字速度还要快,这些都是成为一名成功的开发者所要掌握的东西。不要忽略打字的重要性,同时也不要让打字干扰到自己的正常思考。

2014-01-28 22:381720
用户头像

发布了 88 篇内容, 共 274.1 次阅读, 收获喜欢 9 次。

关注

评论

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

【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内存不一致所引发的OOMKilled问题总结(上)

码界西柚

Docker Kubernetes 容器 JVM 12月日更

瓴羊Quick BI带给企业新发展,企业数字营销和运营变得格外简单

对不起该用户已成仙‖

五种方式实现 Java 单例模式

Jeremy Lai

设计模式 单例模式

详解HashMap源码解析(上)

Jeremy Lai

HashMap底层原理

Centos7安装Nginx教程,一步安装http和https

Jeremy Lai

nginx Linux安装

详解MySQL隔离级别

Jeremy Lai

隔离级别

Seata 环境搭建

Jeremy Lai

分布式事务 seata

模拟HashMap冲突

Jeremy Lai

hashmap 哈希冲突

深入理解Redis 数据结构—字典

Jeremy Lai

字典 redis 底层原理

小程序正式版报错600002 url not in domain list

Jeremy Lai

小程序

应用瓴羊Quick BI数据分析,实时掌控企业运营数据

对不起该用户已成仙‖

Spring Cloud 整合 nacos 实现动态配置中心

Jeremy Lai

nacos 动态配置

详解HashMap源码解析(下)

Jeremy Lai

HashMap底层原理

Java通过反射注解赋值

Jeremy Lai

解决问题 java注解

详解ConCurrentHashMap源码(jdk1.8)

Jeremy Lai

ConcurrentHashMap 源码阅读

字节一面:说说TCP的三次握手

Jeremy Lai

三次握手 TCP协议

手把手教你用Java获取IP归属地

Jeremy Lai

IP地址

刷新AI作图速度,最快开源Stable Diffusion出炉

OneFlow

人工智能 深度学习 前沿技术

SpringBoot整合RabbitMQ实现六种工作模式

Jeremy Lai

spring-boot Rabbit MQ

阿里云ECS后台CPU占用100%,top却找不到

Jeremy Lai

cpu 100% 阿里云;

MySQL更新锁表超时 Lock wait timeout exceeded

Jeremy Lai

事务隔离 Mysql死锁

后端程序员实现一个IP归属地的小程序

Jeremy Lai

SAP MM 使用两个STO实现免关税跨国公司间转储(II)

SAP虾客

SAP MM PO输出 NACE

React 之 createElement 源码解读

冴羽

JavaScript 前端 前端框架 React react源码

【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内存不一致所引发的OOMKilled问题总结(下)

码界西柚

JVM 12月日更 堆外内存 内存干扰

零售品牌如何挑选达人KOL?火山引擎VeDI有妙招!

字节跳动数据平台

大数据 营销 营销数字化 12 月 PK 榜

Java递归实现评论多级回复

Jeremy Lai

递归 解决方案

SpringBoot快速整合通用Mapper

Jeremy Lai

通用Mapper spring-boot

编程:思考还是打字_语言 & 开发_张龙_InfoQ精选文章