写点什么

为什么 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:2719136
用户头像
王文婧 InfoQ编辑

发布了 126 篇内容, 共 73.6 次阅读, 收获喜欢 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
回复
没有更多了
发现更多内容

爬虫入门经典(十八) | 滑动验证码识别

不温卜火

python 爬虫

python 爬虫之selenium可视化爬虫

诡途

Python 爬虫 selenium

飞桨中国行首站重庆 解读产业 智造

百度大脑

百度 飞桨 中关村智酷

Three.js杂记(二)——绘制点、线、面

空城机

JavaScript 大前端 WebGL 3D可视化 three.js

爬虫入门经典(四) | 如何爬取豆瓣电影Top250

不温卜火

python 爬虫

首席AI架构师进阶之旅开启!第4期60位AICA学员硬核开学

百度大脑

AI 百度飞桨

【实战问题】-- 缓存穿透,缓存击穿和缓存雪崩的区别以及解决方案

秦怀杂货店

Java redis 缓存 架构 分布式

Three.js杂记(三)—— 物体运动

空城机

JavaScript 大前端 WebGL 3D可视化 three.js

爬虫入门经典(十五) | 邪恶想法之爬取百度妹子图

不温卜火

python 爬虫

前置机器学习(一):数学符号及希腊字母

caiyongji

机器学习

2021年ONNX开发者大会即将召开

百度大脑

百度飞桨 ONNX

数据分析实战项目-蛋壳公寓投诉分析

诡途

Python 数据分析 蛋壳公寓

Three.Js杂记(一)——起步

空城机

大前端 WebGL 3D可视化 three.js

助力香港成为全球寿命最长的城市,我们如何看医管局的数字化转型?

有只小耳朵

数字化转型 人才培养

一气之下开发了个群聊机器人

诡途

Python 办公自动化 群聊机器人

如何巧妙的去除数组中的空格?

程序媛观澜

c++ 字符串

智能家居操作系统谁最强?海尔智家独有“智家大脑”行业最领先

DT极客

C 语言性能优化:循环展开

1

编程 程序员 性能优化 C语言 循环展开

飞桨刷新分子性质预测榜单,助力AI药物研发

百度大脑

AI 药物研发 百度飞桨

手把手教学基于深度学习的遥感影像倾斜框算法训练与分析

cv君

人工智能 深度学习 AI 智能 视觉

想当程序员,如何判断自己是否适合当前端程序员?

孙叫兽

程序员 大前端 引航计划

大前端工程师进阶之路,Node全栈为前端带来更多可能

孙叫兽

大前端 全栈 Node

在这里,每一行代码都需要被认真对待

DT极客

爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影

不温卜火

python 爬虫

Git教程 - Git 命令与操作

码语者

git DevOps

实时 摔倒识别 /运动分析/打架等异常行为识别/控制手势识别等所有行为识别全家桶 原理 + 代码 + 数据+ 模型 开源!

cv君

AI 目标检测 视频理解 引航计划

寻找被遗忘的勇气(二十二)

Changing Lin

3月日更

波卡生态DeFi系统开发方案

薇電13242772558

区块链 defi

2.4 Go语言从入门到精通:条件和循环

xcbeyond

3月日更 Go 语言

初来乍到,请多关照

空城机

杂记

爬虫入门经典(七) | 一文带你爬取淘宝电场

不温卜火

python 爬虫

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