有人说:“初级程序员才比招式,高级程序员只看内功。”什么是基本功?不是那些高大上、新潮的技术、框架,而是程序员每天做的基础工作。比如,快捷键是否熟悉,测试习惯好不好,代码干不干净,打字速度有多快等等。在 IT 产业高速发展的当下,为何我们还要重申程序员基本功的重要性?一个基本功扎实的程序员应该具备哪些素质?当我们与国内最早导入敏捷软件开发方法的熊节先生探讨这一话题时,他表示,程序员的基本功才是真正影响开发效率,甚至影响整个项目成败的核心。然而,”国内 80% 的软件从业者都存在基本功缺失的问题,其实我想说 90%,太得罪人。“
本文整理自 InfoQ 与熊节的采访全文。
InfoQ:您曾提到,80% 的国内软件从业者存在基本功不扎实的问题,您是怎样得出这一结论的?这种现象在程序员、项目管理者身上分别有哪些不同的表现?
熊节:来自近二十年的行业观察。软件开发所需要的能力很早就被定义出来,包括需求管理、项目管理、配置管理和质量保障四个方面。我们从这四个方面看对应的人如何工作时就会发现,基本上,大部分的程序员都在凭本能做事。
比如我们讲需求管理,无非是上传下达。无论是需求分析师也好,产品经理也好,我看到许多人在获取需求时,要么是上去就问,要么就是自己头脑里有一套东西,不管客户讲的是什么,硬塞给客户。再比如项目管理,项目管理主要是管控进度和质量。进度怎么管?项目经理应该给出一个有效的团队协作、进度把控方式。但大多数项目经理没有这些东西,就是简单的轮询。比如一个任务要做五天,到了第四天去问做完没有?还没做完,怎么办?那能不能加班把它做完?这些工作方式,你看不到任何方法、技巧,都是全凭人类本能在做事,看不到应有的专业能力。
程序员同样存在着广泛的基本功缺乏的现象。软件开发这件事,不是只要能把功能写出来就行的。我每天的代码应该如何提交?我提交的代码怎样才能不破坏昨天提交的功能?如何确保交付的软件质量过关?这些都是程序员应有的基本功。例如单元测试,这是保证软件质量最根本、最核心的东西,对整个行业都非常重要,然而却很少有公司能做到。现在整个行业的声音并不是说写单元测试很重要,我们要想办法做到它,而是写单元测试太难了,我们做不到。这个现象反映出整个行业的基本功缺失到了一个很严重的程度。
InfoQ:是什么因素导致从业者很难进入到理想的工作状态?
熊节:主要是能力的缺失。像如何拆解任务,如何管理任务进度,如何了解生产流水线是否健康,用什么方式协调人与人之间的合作,这些都是有能力要求的。而从业者不具备这个能力。这又回到最初提到的问题——基本功的缺失。在缺乏基本功的情况下,人们完全凭着人类的本能做事,遇到问题就靠加班解决。
InfoQ:除了个人层面,这一问题有哪些历史成因?
熊节:从历史上看,我们不仅要看个人的努力,还要看历史的进程。这里有一个重要的时间节点,就是 CMM 认证。从 2001 年开始,全国各地都在对 CMM 大力补贴扶持,这件事给 IT 行业带来了巨大的影响。在 IT 行业从小到大、从弱到强的成长过程中,我们忽略了基本功,没有打基础,没有提高行业的能力。2008-2009 年,我们很多企业通过了 CMM5 级认证,但这些企业的能力在哪?最基本的需求管理、项目管理、配置管理和质量保证能力,都存在巨大的缺失。
当时之所以大力补贴 CMM,政府的目的是要让软件行业出口创汇,但从历史的发展来看,软件外包的市场远远比不上内需。结果 CMM 对出口创汇的作用有限,又没有适时发展行业能力。当初大力补贴 CMM 这一决策,导致国内软件行业走了十年的弯路。
InfoQ:企业的软件流程标准化的缺失是否也带来了一定影响?
熊节:软件流程的标准化在国内软件行业基本没有发生过。的确,很多企业实施了 CMM、 ISO9001 之类的流程,但是这些流程都停留在纸面上。团队真正在开发软件的时候,并没有照着这些流程来实施。这样的“标准化”,其实并没有真正影响软件开发的过程。
需求管理、项目管理、配置管理、质量保证,这些最基本的事情是不是应该做的?我觉得是需要的。但停留在纸面上的流程并不是真正的软件开发流程。目前,大家在做软件的流程中还是存在凭本能写代码、单元测试没做就结束任务的问题。所以流程标准化是好是坏是第二个问题,首要问题是究竟有没有标准化、究竟有没有流程,这在许多企业中都是非常现实的问题。
InfoQ:您认为企业在帮助程序员夯实基本功方面应扮演什么样的角色,提供哪些支持?
熊节:软件开发是一门手艺,讲究又快又好,只考察能讲出多少知识是没有用的,只能用实际的代码来验证。企业从面试开始,到程序员的培养、发展、晋升,都应该更重视基本功,更重视那些真正影响每天软件开发的效率和质量的能力,不要只着眼于看起来高深、实则一年用不到一两次的技术点。
我最近做了一个“测试驱动开发实战营”的事,目的就是帮程序员快速提升编程的基本功。我认为需要有一系列这样的实战训练项目,让企业可以快速识别各种角色基本功是否扎实,并且可以通过密集的实战训练快速夯实基本功。
InfoQ:您认为,基本功扎实的程序员通常具备哪些素质?
熊节:第一,需要具备良好的沟通能力。沟通不仅仅是说话或者写文档,程序员还应该能用自动化的测试作为媒介,准确地框定需求范围。
第二,他应该能有效地拆解任务。要把任务拆解成可以落地、可以逐步实施的小块。这是需要练习的事情。
第三,他应该能在保证质量的情况下,把拆解好的任务快速实现出来,让每一行代码都是有测试覆盖、有质量保证的。
第四项基本能力就是代码质量要好。写完一段代码之后,应该回头看一看,有没有坏味道?用适当的重构方法把坏味道消除掉,让代码质量保持在良好状态。
第五,做前面几件事情的速度要快。只是头脑里知道怎么做,没有用,因为一旦有压力的时候,就很难施展出来,所以需要反复的练习,在压力下也能快速完成这一系列动作。
InfoQ:前段时间关于“996”的话题比较火。您如何看待这一问题?
熊节:从法律的角度, 996 不能鼓励,必须改变。但就一些程序员的效率而言,如果平时加强训练,把写代码的速度提高一倍,能够理解清楚需求,合理拆解任务,代码写得好,很可能根本就不需要加班。
很多年以前,制造业的先辈就已经发现一个规律:质量是免费的。换个角度来说就是,降低对质量的要求,并不会使软件开发变快,反而会因为缺陷太多、难以维护而拖慢速度。老话说磨刀不误砍柴工,缺乏基本功、代码质量不好,就会使自己不断陷在低效的焦油坑里。很多加班就是这样加起来的。
所以我们在批判 996 现象的同时,是不是应该有一定的自省,为什么开发软件的速度这么慢、质量这么差?如果把基本功练得扎实一点,是不是能少加一些班?我认为这是一个有建设性的视角。一味认为加班都是别人造成的,固然可以让自己心理感到很舒服,但恐怕并不有助于改变现状。
哪怕在最坏的情况下,你真的身处一个很糟糕的企业,就是因为老板或者其他角色的原因导致加班,练好基本功至少能让你更容易脱离这个焦油坑,跳槽去更好一点的公司。
InfoQ:您可以向程序员朋友推荐几本提升基本功的书籍吗?
熊节:《重构》、《实现模式》和《测试驱动开发》。
不过我始终认为,读书对于能力提升的帮助很有限。能力的获得,必须通过重复、有针对性、有反馈的刻意练习。这也是我搞“测试驱动开发实战营”的原因:我希望为大量程序员创造一个刻意练习的环境,帮他们提升基本功。
嘉宾介绍:
熊节是中国 IT 业界最早导入敏捷软件开发方法、尤其是注重工程技术实践的极限编程(XP)方法的敏捷先行者,也是多年以来中国敏捷社区的领军人物,为敏捷、尤其是持续集成等敏捷工程实践在中国 IT 行业的引入、传播和推广发挥了重要作用。
2005 年至 2018 年间,熊节效力于国际知名的 IT 专业服务公司 ThoughtWorks,担任过软件架构师、项目经理、敏捷转型顾问、研发中心主管等多种角色。在 ThoughtWorks 期间,熊节以项目交付为载体,将极限编程的工程实践植入员工和客户的日常工作。熊节还以敏捷转型顾问的身份,指导和参与了华为、中兴、上海贝尔、平安等企业的敏捷转型历程。
工作之余,熊节一直以写作的方式对行业技术导向创造影响。他曾在各类专业媒体发表数十篇文章,并主持翻译了《重构》、《软件工匠》、《实现模式》、《卓有成效的程序员》等敏捷领域重要著作。他的新作《敏捷中国史》是中国 IT 业界首部系统总结敏捷方法传入中国及发展演化历程的著作。
想了解更多,可关注微信公众号:程序员练功房(ID:programmer_gym)。
(文章来源:InfoQ)