(作者这些年一直在从事这个主题的工作,本文是这些年工作的一个总结。另外作者是一个比较守旧的人,所以软件行业、IT行业、互联网行业、数字行业等等,在作者眼中都是一个意思,起码在能力角度并无区别,所以作者并不认为这里面提到的什么东西只适合与IT行业不适合于互联网等等。)
软件开发人员的培养,先说一下解决这个大问题的方法论,首先要理清楚问题域,从问题出发。那么头脑风暴一下,随便选一个问题作为出发点:我们培养的人是在从事什么?答案当然也很简单,从事软件开发。这个问题本身简单到了没什么意义,把一个复杂的问题抽象为了一个简单到没用的问题,如果我们进一步思考(此处省略不知道多少步),就会发现关键的问题应该是,软件开发到底是一项什么工作?
只有清晰的定义了这项工作,才能很好的定义出从事这项工作的人有哪些工作场景,然后才能定义出为了胜任这些工作场景,他们应该具备哪些能力,定义出这些能力胜任时的表现,然后才能谈得到培养,同时还要考虑通过什么方式能衡量这些能力胜任时的表现和他们实际工作表现的差距,以评估培养的效果,指导培养方式的迭代改进。
以上就是我们的方法论,所以作者才会来从事这项工作,因为我不是不相信任何外行能够很好的定义出这里面的内容的。
那么我们从头开始,回到问题:软件开发到底是一项什么样的工作,这个问题有太多的维度,我们仅从能力的角度开思考这个问题,也就是说如果完不成只可能是能力问题,没有其他问题干扰。从这点切入,这个问题可以等价的看成,抛掉所有角色来看,假设存在一个可以干所有角色的事情的人,并且他的时间是无限的,而且他的智力水平是一个中等偏上的人(考虑到大学毕业生仅占中国总人口的5%左右,这个设定还是偏保守了),那么对他来说,开发一款软件是一个怎样的工作呢?
抛掉知识层面的部分,从能力角度,我定义如下:
- 把你的业务问题转化为数学问题,让它的规则逻辑自洽,然后用代码实现
- 如果它的规则过于复杂,人力不能判断逻辑是否自洽,进行抽象,寄希望于抽象之后逻辑自洽
- 如果抽象之后依然过于复杂,不能判断逻辑自洽;或如果进一步抽象将变成过度抽象,从而无法判断是否可以落地,那就切分。寄希望于在一个问题子域中,解决方案可以逻辑自洽,不同的问题子域的方案之间可以映射以合作解决大的问题域
上述三大假设中,仅有人的智力水平中等偏上这一点,是完全成立的。时间无限肯定不可能,但它并不影响对能力的定义,只是影响工期,最多加入一个对时间管理、优先级选择的能力的要求,而这个能力是通用能力,已有解决方案。一个可以干所有角色的事情的人有限成立,因为从能力角度是可以做到的,在软件开发的早期确实大量存在这样的人,我们曾经称之为软件英雄的人大都如此,即便是今天,这样的人也不是不存在。但是在如今这个时代,却不能以这个为目标来发展人,主要导致这个结果的原因是对效率的追求,有限的时间匹配无限的工作量,势必要把人分成多个角色来工作以追求效率,所以这个方向是绝大多数企业无法接受的。不过这里面有个矛盾点,想要把我们定义的三种工作做好,跨角色的能力也就是按照传统软件英雄的角色去培养能力是不可避免的,否则能力的发展是有天花板的。好在就算你不刻意的发展他们这些能力,这些能力也会随着工作年限的增加自然获得,只是效率不高而已,由于大多数企业还没有精力考虑突破天花板的效率问题,所以这个问题我们按下不表,以后我们再深入聊。从这个角度来讲,上述的工作内容是可以成立的,起码我这么认为。
那这样的工作对人提出了怎样的要求呢?在回答这个问题之前,我们还要对问题域进行进一步的思考,那就是人的发展本身有怎样的限制,同时软件行业本身有什么特点结合上人的限制会进一步加剧这个问题的复杂性?
我人的发展认为主要有三大限制:
- 人的易错性。即便是做过很多遍的事情,也不能保证每次都做的不出错。如果每次还稍微有点区别,就更难保证了。
- 学习需要很长时间。技术知识也好,业务知识也好,本身都是需要被学习才能掌握,而人的学习速度是很慢的,要花大量的时间。不想机器,只要加载了程序,下一秒就可以工作了,而且绝不出错。
- 个体间无法快速复制。一个人学会没啥用,别人不会就是不会,好容易培养出一个老手,再复制他/她又要花费几乎等量的时间。不像机器可以快速复制给很多机器,每台都不会有错误。
那么软件行业本身什么特点又进一步加剧这个复杂性呢?
- 软件不遵守差不多原则,做出来的东西必须严格符合逻辑,否则就会出错。而这种严格符合逻辑的产品却是要靠有易错性质的人来构建。
- 软件系统的分层掩盖了它的复杂性,导致软件的知识在空间维度上是海量的,对于学习是很大的挑战。只要是涉及到纯机器的部分,人们总会封装的去理解,以为挺简单的,然而创新又总是贯穿很多层,所以上层的很多想法到实现的时候,总是很复杂。这就加剧了不同角色间、管理者与被管理者间,老手与新手间的磨合成本
- 软件行业的快速发展,导致所学的知识在时间维度上是快速变化的。据说是受摩尔定律影响,我们软件开发人员的世界基本上是极其不稳定的。每隔一段时间,我们依赖的类库、框架就会升级,我们掌握的知识和技能就会在一定程度上过时,这进一步加剧了学习的挑战。
以上的复杂性叠加上人的不足,使得软件开发人员的培养是一个极其困难的问题。理解了这样一个复杂的背景,我们才好思考,软件开发对于人提出了怎样的要求,以及如何培养人来胜任这样的要求。
to be continued……