2014年11月19日

[知乎专栏–思考IT]从软件工程到研发管理(一)

作者 zhuangbiaowei
一、研发(R&D)与软件工程的区别何在?

每个行当,都有自己的「行话」,同行之间交流,会有很多的省略。比如咱们这些软件开发人员,经常会这样交流:「最近在做什么项目呀?」、「我们那个项目压力好大啊!」

「项目」在软件开发领域,是最常出现的一个词。这个词背后,通常包含以下假设:有一个总的项目目标,这个目标会被层层分解为一个一个具体的任务,然后这些任务将会被逐步完成,最后项目结束。

其他的工程领域,倒真是这样,但是在将工程概念移植过来,变成软件工程以后。有些情况,就发生变化了。

1. 研究与开发协作并进的探索历程

很多时候,我们会下意识的使用「研发部门」、「研发人员」这样的词。但是我们在使用的时候,往往会忘记「研发,其实是研究(Research)与开发(Development)」的缩略语。

软件开发这个年轻的领域,还存在太多需要研究的东西。甚至不能简单的认为这是一个「研究–>开发–>研究」的交替过程。

我们会在研究的阶段,采用各种开发的实践来做辅助;也会在开发的阶段,进行多种研究:那种方案是否可行?有没有更好的选择?那种实现是否存在漏洞?需求真的是这样吗?

我们以为的研发循环;

可能比上图所示,更加复杂的研发循环。

2. 开放性与变动性无处不在

软件工程,有一个很神奇的封闭性(稳定性)假设:稳定的需求+稳定的团队+稳定的技术+稳定的外部环境==>稳定的结果。

然后,一切与这个封闭性假设不符的情况,都被打包归入(风险)的范畴。而所有的风险,只有两个办法来对付:预防、规避。

但是,这个假设本身就是错的。需求在变化,团队在流动,技术在发展,环境在改变,这一切不能仅仅视之为风险了事。不能老想这躲避、或者阻止。

敏捷宣言当年的一声大吼:拥抱变化!实在是振聋发聩!但是,仅仅拥抱变化,也是不够的。

  • 一个研发部门,可能存在多支研发团队,同时进行多个研发项目。这些项目之间,是否存在关系?是否需要协作?工作成果是否能够共享?
  • 开源社区每天都在诞生、创造很多可能好用的工具、框架、项目、组件甚至新语言。要不要用?该怎么用?在什么地方用?
  • 如果研发过程,是在一个开放的环境中,一切都在变化。我们如何判断成败?如何决定取舍?就算要拥抱变化,也要问一句:拥抱哪些变化呢?

3. 所谓「精益」

最有一个词,开始流行「精益(Lean)」,为何这个词开始流行?为何我们又开始信奉新的「银弹」了呢?

这个图,看起来是不是很神奇呢?其实,如果是科研人员,会觉得毫不新奇。大多数「日夜探索未知」的科研人员,他们的研究方法,通常都是这样的:有了一个创意,先做一些原型,然后验证并修正自己的假设。

这并非特别了不起的创新,只是大家越来越意识到:

  • 一个企业的研发过程,并非简单的拿到需求,开始开发,然后完成需求的过程。
  • 即使在研发过程中,也存在太多需要探索的未知了。
  • <未完待续>