写点什么

为什么 80% 的国内开发者缺乏基本功?

  • 2019-08-19
  • 本文字数:3385 字

    阅读完需:约 11 分钟

为什么80%的国内开发者缺乏基本功?

有人说:“初级程序员才比招式,高级程序员只看内功。”什么是基本功?不是那些高大上、新潮的技术、框架,而是程序员每天做的基础工作。比如,快捷键是否熟悉,测试习惯好不好,代码干不干净,打字速度有多快等等。在 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)。


2019-08-19 15:2719059
用户头像
王文婧 InfoQ编辑

发布了 126 篇内容, 共 72.4 次阅读, 收获喜欢 275 次。

关注

评论 12 条评论

发布
用户头像
TDD 确实需要坚持练习才能学会,只看不练原地踏步。可以从实现「单一原则」练习功能测试:happy path; sad path; default path
2024-03-29 23:39 · 浙江
回复
用户头像
老一代之所以做得好,一个原因就是有很多轮子要造,而且也有情怀。只有自己有造过或多或少给团队用的轮子,亦或是体会过几十个人因为你的方法无法工作而不得不停下来,才能领会为什么单元测试重要、为什么要保证稳定性。如果一直都是用着已经限定的框架、接口、工具,写的代码没几个用户(实际上大量的功能从开发后就没有被使用过)使用,程序员就更不关心了。
2020-01-05 19:47
回复
用户头像
”基本功扎实的程序员通常具备哪些素质“,楼上说的这是基本素质吗,又快又好,谁不想呢,具体步骤呢,这么说难免有点套路,说的好听的性质吧
2019-08-25 22:13
回复
用户头像
感觉最近这七八年国内IT行业某种程度在倒退,非常的浮躁了,风口不断 猪满天飞,微服务 高并发 大数据架构师也满天飞,个个都是bat。用着最牛掰的先进框架 包裹这最臭不可闻的烂代码,又是maven 又是jenkins又是git又是docker的都用上了就号称devops了就持续集成了,其实一个像样的单元测试都没有,就是持续编译打包自high呢。 现在如果跟年轻一代程序员提单元测试 重构 设计模式 tdd这些过时的玩意,要么对方一脸茫然 要么对你嗤之以鼻 觉得你老古董了。
2019-08-24 23:16
回复
我看呢,估计对方都觉得人也过时了😂
2019-08-24 23:26
回复
我也觉得,目前大部分做软件的公司,真的在技术的持续集成上有太大的缺失,对项目的“工程化”不到位。
2019-08-25 09:29
回复
用户头像
80%从哪来的?
2019-08-19 13:24
回复
受访者的经验观察
2019-08-20 09:53
回复
拍脑袋拍的吧
2019-08-22 09:41
回复
用户头像
搞了半天是卖书的。基本功是靠时间积累的。是靠专业培训代纪传承的。光靠持续重构和各种治标不治本的开发模式是不可能解决的
2019-08-19 11:31
回复
您的说法和文章内容其实是一致的吧。
文章讲“能力的获得,必须通过重复、有针对性、有反馈的刻意练习。” 重复练习需要时间积累,有反馈就是代纪传承。
2019-08-20 13:43
回复
错啦,不是卖书,看原文:不过我始终认为,读书对于能力提升的帮助很有限。能力的获得,必须通过重复、有针对性、有反馈的刻意练习。这也是我搞“测试驱动开发实战营”的原因:我希望为大量程序员创造一个刻意练习的环境,帮他们提升基本功。
2019-08-27 09:23
回复
没有更多了
发现更多内容

Android面试抱佛脚:进程间通讯学习,从Binder使用看起

android 程序员 移动开发

Android进阶:三、这一次,从入门到精通系列Android高级工程师路线介绍

android 程序员 移动开发

Android进阶:知识遗忘真的是程序员的通病吗?其实是这些新知识的学习方法你还没get到

android 程序员 移动开发

Android面试题之动画+事件处理篇,腾讯、美团Android面试经验分享

android 程序员 移动开发

android进阶篇04、MVC、MVP,腾讯大牛教你自己写Android框架

android 程序员 移动开发

android进阶篇11、crash监控与anr分析简述,vue双向绑定原理

android 程序员 移动开发

Android面试反思:开发5年crud背景,惨遭字节阿里双挂,网站开发前后端分离

android 程序员 移动开发

Android面试复盘:认真刷题,掌握原理很重要,【深夜思考】

android 程序员 移动开发

Android面试必备知识点:Android中Handler八大问题汇总

android 程序员 移动开发

Android面试题之性能优化篇(2),安卓高级开发面试题

android 程序员 移动开发

Android面试:计算机网络面试知识点系统总结,拔剑金九银十(1)

android 程序员 移动开发

android进阶篇09、电量与网络优化简述,android内存优化方案

android 程序员 移动开发

Apache APISIX 社区周报 | 2021 10.15-10.31

API7.ai 技术团队

API网关 社区周报 Apache APISIX

Android面试官,面试时总喜欢挖基础坑,整理了26道面试题牢固你基础

android 程序员 移动开发

Android面试题之Broadcast Receiver篇,你们觉得作为一名程序员最大的悲哀是什么

android 程序员 移动开发

Android面试题之性能优化篇(1),移动开发工程师的岗位职责

android 程序员 移动开发

Android面试|任何东西只要够深,都是一把刀!性能优化都没搞好就别想着去找对象了

android 程序员 移动开发

Android进阶:最简单的方式实现自定义阴影效果,7年老Android一次坑爹的面试经历

android 程序员 移动开发

Android静态代码扫描效率优化与实践,2021大厂Android面试经历

android 程序员 移动开发

Android面经分享:从15K到32K,从小厂到大厂,android系统开发面试

android 程序员 移动开发

Android面经分享:我是如何拿到腾讯头条美团小米的offer从小厂跳到大厂的?

android 程序员 移动开发

Android面试官:看你简历上写熟悉-AIDL,说一说-oneway-吧

android 程序员 移动开发

Android面试指南(三),kotlin匿名内部类写法

android 程序员 移动开发

Android面试题之性能优化篇,当上项目经理才知道

android 程序员 移动开发

Android面试主题整理合集(一),android开发前景

android 程序员 移动开发

Android面试:计算机网络面试知识点系统总结,拔剑金九银十

android 程序员 移动开发

RPC就好像是谈一场异地恋

博文视点Broadview

Android面试必问之Binder进程间通信机制,大厂喜欢从哪些角度考你呢?看完这篇你就懂啦

android 程序员 移动开发

Android音视频--H,flutter小程序开发

android 程序员 移动开发

一个程序员眼中的项目经理

神策技术社区

OKR 项目经理

Android面试:一个进程有多少个-Context-对象?看似初级的问题

android 程序员 移动开发

为什么80%的国内开发者缺乏基本功?_文化 & 方法_王文婧_InfoQ精选文章