本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2014/01/programming-thinking-typing
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谈到了结对编程的好处,因为这会促使人们在打字的同时又在思考:
- 两个人都在思考,但思考的却是不同的事情。一个开发者拿着键盘,脑子里想着他正在编写的代码,在短时间内,他的打字速度比较重要。
- 结对的另一个开发者全力思考着。他并不关心编程语言的语法,因为这是另一个人的事情。他要确保自己的搭档使用正确且高效的方式完成工作。
成为一名优秀的开发者要比一名打字员困难得多,他需要学习很多知识:掌握所用的编程语言、了解相关工具的使用方式、知道如何在代码间导航、知道如何编写更好的代码,同时打字速度还要快,这些都是成为一名成功的开发者所要掌握的东西。不要忽略打字的重要性,同时也不要让打字干扰到自己的正常思考。