跳转至

软件工程在微软⚓︎

微软(Microsoft)是以提供软件为主要盈利手段的公司。描述像微软这样的软件公司的软件开发模式也可以使用几个公式来描述。

程序⚓︎

程序 = 算法+模型+数据结构 \tag{1.9}

传统的程序只是算法和数据结构的组合,但是在 AI 迅猛发展的今天,没有个“模型”在程序里,都不好意思出门和人家打招呼。这虽然只是个笑话,但是说明了 AI 的影响力度和普及速度。

模型,一般是指机器学习或深度学习训练出来的 Model,里面既有逻辑又有数据,所以它既不是单纯的算法也不是单纯的数据结构。微软在 AI 领域的积累,使得很多程序都可以有模型的助力而变得“聪明”。

软件工程师⚓︎

在微软的程序员叫做 Dev(Developer,开发员)或者 SDE(Software Development Engineer,软件开发工程师)。

软件工程师 = 程序员 + 软件工程知识 \tag{1.10}

刚从学校毕业进入微软工作的,只能叫做程序员。经过一段时间培训、磨合之后,软件工程知识越来越多,就可以成为真正的软件工程师了。

有的人会问:在学校里学习的软件工程知识不够用吗?笔者只能说那些知识根本不够用,否则笔者也不会写这本书了。

PM⚓︎

PM = 项目管理 + 产品管理 \tag{1.11}

注:PM = Program Manager,直译为程序经理,但实际上是项目管理和产品管理的二合一角色,所以没有准确的中文翻译,以后都称作 PM。

如何定义 PM 的工作呢?简单地说,凡是程序员做不了的事,都由 PM 来做。我们在后面相关章节会有说明。

团队⚓︎

团队,在微软叫做 feature team,或者 feature crew。

团队 = PM + 软件工程师 + Designer \tag{1.12}

注:Designer 直译就是设计师,负责用户界面和交互的设计。微软有一套 Designer 的要遵守的设计概念,使得微软的产品具有整齐划一的界面交互风格。

通常情况下,PM 和软件工程师是长期合作的,但是互相没有 report(上下级的汇报) 关系;而 Designer 有自己的独立组织,与团队是临时合作。

以前微软还有测试的职位,后来被取消了,由整个团队自己负责测试,并有自动化测试流程辅助。如果需要深度测试,就请外包测试人员来完成。

软件工程⚓︎

软件工程 = 团队 + 过程定义 + 执行 \tag{1.13}

软件工程不只是软件工程师的事,而是整个团队的事。比如需求和过程管理要靠 PM,界面设计要靠 Designer。

软件⚓︎

软件 = 程序 + 软件工程 \tag{1.14}

软件公司⚓︎

微软 = 软件产品 + 商业模式 \tag{1.15}

商业模式⚓︎

商业模式不是本书的讨论范围,但是有三个概念要简单说一下:产品、项目、服务

先来看看这三者的区别。

产品 项目 服务
开发周期 长期迭代 短期完毕 长期迭代
目标客户 特定人群 特定客户 组织或公司
需求来源 自定义 客户定制 自定义
开发模式 功能迭代 特定功能 功能增加
人员规模
发布渠道 客户端软件 定制软件包 云端服务
交付方式 可执行文件 源代码+可执行文件 REST API 调用
竞争者 少而激烈

产品⚓︎

我们以微软为例,产品包括:Windows、Office、Visual Studio等等,以客户端软件为主。其特点是由微软决定要做什么,给客户提供什么,具有长期规划,不断迭代。比如,微软认为Windows要提供给所有使用台式机的用户,Office要提供给白领办公人群,Visual Studio只提供给开发人员。每次更新,都是在现有基础上增加一些小的功能;而大版本号的更新则是提供了原有框架之外的功能,比如 Visual Studio 2019 提供了与微软云集成的众多功能,而这些功能在上一个大版本中并不存在。这些产品都是由微软内部专门的团队负责的,通常在300~500人左右。

项目⚓︎

项目包括两类:一种是狭义的,在销售给客户产品后,再同时开发/提供一些定制软件,比如银行买了微软的服务器和数据库,或者买了云资源,那么会有配套的开发人员进行售后服务,帮助银行开发产品。这种项目的研发人员一般比较少,10几个人就可以完成。

另外一种是广义的,比如给Bing Search做一个局部的服务(service),或者给Power Point增加一个新的功能(feature),都可以用项目的形式来组织,虽然其宿主是服务或者产品。这种组织一般会有20~50人不等,然后又会被分成5、6个人一组,完成一个小功能。

还有一种外包项目,本质上和第一种项目是一样的。

注:在微软内部的技术术语中,功能都叫做 feature,可大可小,所以相应的团队叫做 feature team,翻译成中文很别扭,叫做“功能小组”。

服务⚓︎

服务包括:Bing Search、Azure Cloud Platform、Office 365 等等,以云端服务为主,具有战略意义。当然要是把服务看作是存在于云端的产品,也是可以的。

这种服务的后台通常有超级复杂的架构体系支撑,在性能、可用性、可靠性上下足了功夫,高并发大容量。由于处于云端,没有客户端的升级压力,所以一般更新比较快,没有版本号。在微软内部通常由上千人的团队负责开发和维护。在美国,要与Google搜索、Amazon云竞争,在中国,要与Baidu搜索、阿里云竞争。

<要不要画个图?>

思考与练习⚓︎

  1. 除了产品、项目、服务这种分类以外,你还见过什么软件开发组织模式?与这三种有何区别?

  2. 微软为什么要取消测试职位?肯定不是缺钱,你能想出来其原因吗?