Skip to content

Commit

Permalink
Xiaowuhu/20200903 (microsoft#551)
Browse files Browse the repository at this point in the history
* add files

* add

* add framework

Co-authored-by: Xiaowu Hu <[email protected]>
  • Loading branch information
xiaowuhu and xiaowuhu authored Sep 11, 2020
1 parent 1a132e4 commit 47ca29b
Show file tree
Hide file tree
Showing 43 changed files with 275 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
- 大量实例,侧重在设计技能和团队开发
- 增加了其他书籍没有涉及到的UI/UX设计

(未完待续)

Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<img src="images/Slide1.jpg"/>
<img src="images/Slide2.jpg"/>
<img src="images/Slide3.jpg"/>

这是一门在微软亚洲研究院针对联合培养项目的博士生和本科生们的软件工程课,之所以前缀为“高级”,意味着它和同学们在学校学习的“普通”软件工程课完全不同。

<img src="images/Slide4.jpg"/>

同学们可以学到什么?

理论知识

经验技能

协作能力




<img src="images/Slide5.jpg"/>

通过什么方法学?Learning by Doing!


<img src="images/Slide6.jpg"/>

如何验证你的所学?

<img src="images/Slide7.jpg"/>



<img src="images/Slide8.jpg"/>
qqq
<img src="images/Slide9.jpg"/>
aaa
<img src="images/Slide10.jpg"/>

<img src="images/Slide11.jpg"/>

<img src="images/Slide12.jpg"/>

<img src="images/Slide13.jpg"/>

<img src="images/Slide14.jpg"/>

<img src="images/Slide15.jpg"/>

<img src="images/Slide16.jpg"/>

<img src="images/Slide17.jpg"/>


Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# 木头的“麻烦”

“木头”是一名软件工程师,给自己起了一个网名叫“木头”,为人也是有些木讷,在本书中,“木头”同学将成为所有故事的主角。

木头有个朋友是小学数学老师,在一次聚会闲聊中,这位老师询问能不能用当今热门的AI来辅助教育。平时不爱说话的木头一听就来了精气神儿,这个是自己的专业呀!木头借着酒劲儿吹了个牛:“如果是小学数学题的话,根本不需要什么AI,用个小程序就可以解决了。”

于是,木头为吹牛付出了微小代价:朋友请他实现那个小程序,目标是每天出20道100以内的加减法算术题。这个对木头来说很容易,花了1个小时用C#搞定。

<在这里是否要放代码?>

故事结束了......吗?刚刚开始呢!一系列“麻烦”在等待着木头。

## 麻烦一:如何运行

木头把C#代码传给了朋友,没想到朋友问了一个很初级的问题:如何运行这个程序?

这对于木头来说,就好比问每天如何刷牙洗脸,但是对于朋友(客户)来说,就需要以下步骤来实现运行程序的目标:
1. 确认操作系统是不是 Windows 10,如果不是需要升级;
2. 下载并安装 Visual Studio 2019 Community 版本,有可能朋友搞不清楚Enterprise、Professional、Community三个版本的区别;
3. 打开 VS 后加载工程,然后运行代码。

这个要求对朋友和他的低配计算机来说就是一个灾难。木头想,那做一个可执行程序吧!因为朋友信赖木头,所以不会怀疑这个可执行程序是带病毒的。可是当得知朋友的计算机操作系统是 Mac OS 的时候,木头又犯嘀咕了:很多用户面对好端端的 Windows 10 不用,偏要跟时尚买 Mac。我自己又没有 Mac,跨平台怎么办?......干脆用 Python 吧!

于是木头又用 Python 实现了那个小程序,然后告诉朋友如何安装 Python 库,如何运行 Python 程序......,反正是花在沟通上的时间比编写程序的时间多很多倍!但是,当朋友磕磕绊绊地运行了程序,得到了第一批30道算术题时,双方都认为付出是值得的!

## 麻烦二:如何发布

可是接下来朋友的问题又让木头傻眼了:如何把程序运行的结果发布给学生呢?总不能让学生都安装 Python 后来运行代码吧?这是小学数学课,不是大学计算机课。依赖家长同样不靠谱,家长的水平也是参差不齐的。

想来想去,想到了微信小程序!于是木头又花了一周的时间学习了如何制作微信小程序,完全是 Mobile 客户端的开发模式,很多概念需要熟悉,还要熟悉框架、组件、API等等,好多坑要踩!

一周后,当小程序出现在朋友的手机上时,双方又都觉得付出是值得的!!

## 麻烦三:如何判作业

小程序发布给学生家长并运行一周后,老师受不了了:家长们把作业结果截屏后都发送给了老师,让老师判作业。但是,有一个问题没有想到:木头使用了随机种子算法,所以每个同学得到的算术题都不一样,答案自然就不一样。如果全部50个学生,相当于老师要自己每天做 $50 \times 20=1000$ 道算数题,基本就没时间干别的了,而且还遭到了校长的批评:某某老师上班时间不工作总看微信!

木头也觉得过意不去了,赶紧改程序,变成自动判作业:家长口述题目给学生,学生口述答案给家长,家长填写答案。全部完成后,点击“判作业”按钮,再把分数提交给老师。

这一下老师轻松多了,和木头聊天时,双方还是都觉得付出是值得的!!!

## 麻烦四:如何升级

下半学期开始了,同学们要学习乘除法了。如果和加减法混在一起的话,还需要用括号来表示运算优先级。

这难不倒木头,又花了一个周末搞定,让老师重新发布。结果,有的家长升级了小程序,有的家长没有升级,微信群里面很热闹,老师很头疼......

木头在责任心驱使下,再次出马,使用微软 Azure 平台,把出题程序运行在了云端,解决了很多问题:
1. 客户端升级问题不存在了;
2. 给每个同学的题目不一致的问题不存在了;
3. 家长不用给老师发微信提交作业了,全都在云端存储。

但是这个 Azure 平台也不是免费的呀?好在并不贵,木头自己先垫付了,打算以后和学校商量让学校出钱。木头看到平台每天都在稳定地运行状态,觉得自己为教育做出了贡献,很值得!!!!

## 麻烦五:更多的需求

在学校出钱购买了 Azure 服务后,还付给了木头一小笔劳务费,木头笑纳了,但笑容很快就凝固了:五年级的老师知道了这件事情,希望系统能够上出一元二次方程的题目。

家长们也纷纷表示一元二次的题目很便宜了,只需要0.5元一次,因为听说有的学校的方程题目要二元一次呢,贵了4倍!

另外,还需要能够提供7x24小时服务,学生随时可以申请“加餐”做题,而不是只有老师留作业的方式。

木头又搞了几个周末,总算可以出解方程的题目了,并且提供了按需(On Demand)出题的方式。部署到云端后效果非常不错,觉得自己的贡献从一年级到五年级,非常值得!!!!!

## 麻烦六:全球化

基于微软 Azure 平台的出题系统非常成功,校长到处宣传,逢人便讲。一个国际学校的老师知道了这件事,联系到了木头,希望可以提供英文界面,便于外国学生使用。

木头感觉自己肩上的担子越来越重,这点儿劳务费还不够电费呢......没办法,硬着头皮上吧!后面指不定还有什么需求呢?

### 思考与练习

1. 在发布渠道/方式上,你还有什么建议?
2. 你觉得木头后面还会遇到什么麻烦?
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# 什么是软件工程?

## 产品、项目、服务

我们以微软为例,先来看看这三者的区别。

||产品|项目|服务|
|---|---|---|---|
|开发周期|长期规划|短期完毕|长期规划|
|目标客户|特定人群|特定客户|组织或公司|
|功能来源|自定义|客户定义|自定义|
|开发目标|功能迭代|特定功能|功能增加|
|人员规模||||
|发布渠道|客户端软件|定制软件包|云端服务|
|交付方式|可执行文件|源代码+可执行文件| 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等等,以云端服务为主,具有战略意义。当然要是把服务看作是存在于云端的产品,也是可以的。这种服务的后台通常有超级复杂的体系架构支撑,在可用性、可靠性上下足了功夫,高并发大容量。由于处于云端,没有客户端的升级压力,所以一般更新比较快,没有版本号。在微软内部通常由上千人的团队负责开发和维护。在美国,要与Google搜索、Amazon云竞争,在中国,要与Baidu搜索、阿里云竞争。

<要不要画个图?>

### 思考与练习

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

Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# 分析

从木头遇到的“麻烦”来看,他本人做了一件很了不起的事情:利用自身能力和微软技术为教育做出了贡献!但是,对事态发展估计不足,会给个人以及产品/项目本身带来不好的影响。

我们来分析一下木头的故事的发展脉络。

## 1. 程序(Program)

编写能够生成小学加减法算术题的程序,这个任务只是一个简单的算法(Algorithm)+数据结构(Data Structure)就可以解决了,我们称之为程序(Program)。算法可以是随机数生成、加法的组合,加法公式和相加的结果需要放在一个数据结构中。

于是我们得到了一个公式:

$$
程序 = 算法 + 数据结构 \tag{1}
$$

## 2. 测试(Testing)

如果用户信任,你可以发布可执行的二进制文件,用户执行它即可完成测试;如果用户不信任,你就需要发布源代码,有技术能力的用户可以还原你的开发环境,从而测试这些源代码。

在木头的故事里,那位老师就是测试人员,确保木头的程序的运行结果与预期相符。老师可以选择运行二进制文件,或者有技术能力的话,就运行C#或者Python的源代码。

于是我们得到第二个公式:

$$
测试 = 程序 + 模拟用户环境 \tag{2}
$$

## 3. 发布(Release)

测试结束后,需要发布给真正的用户去使用,程序真正地运行在用户环境下,才会有价值。当然“用户”有时候可能是你自己,你给自己写了个工具来提高生产力。这时候,“程序”已经升华了,可以称之为“软件”了。

程序升华到软件的公式:

$$
软件 = 测试过的程序 + 真实用户环境 \tag{3}
$$

## 4. 用户体验(User Experience)

在木头的故事里,家长必须通过微信发送答案,老师忙得整天看微信,用户体验非常不好。用户(老师和家长)从这个软件中获得的好处,如果不能大于使用该软件的付出(包括时间、金钱等),那么这个软件是没有存在的必要的。所以自动判作业的需求就会出现,而对于一个好的软件来说,这也是必不可少的一个过程。

普通软件升级到一个好软件的公式:

$$
软件产品 = 软件 + 用户体验 \tag{4}
$$

微软的 Office 办公套件在这方面做得非常的好,功能和用户体验都是经过用户确认的,所以才能被广泛使用,成为了办公系统中的事实上的标准。


## 5. 软件升级(Upgrade)

依赖微信小程序当然是一种解决方案,但并不完美。客户端软件分发也是一个特别麻烦的事情,因为总会有用户不去主动升级,从而造成了软件厂商的维护成本高居不下。所以很多厂商会尝试新的路子,比如微软的 Office 办公套件就推出了 Office 365 服务,用网络服务方式代替分发/下载方式,但是在离线时依然可以使用主要功能,在线时可以同步离线时的工作文档,并与团队中的其它人交互。

$$
产品生态 = 软件产品 + 升级渠道 \tag{5}
$$

在 Mobile 端开发中,无论是 Android 还是 iOS,平台厂家都提供了升级渠道,软件开发商不需要维护自己的升级体系;Microsoft Store (微软应用商店) 是微软的 UWP(Universal Windows Platform,通用 Windows 10 软件开发平台)的官方发布、升级渠道。这些都叫做 Ecosystem (生态环境),这对于软件产品的发展非常重要。

## 6. 部署到云(Cloud)

木头把一个客户端软件改成了部署在服务器(云)端的一个服务(Service),升级完全在服务器端完成,用户在使用时,“不得不”使用最新版本的软件,数据也是在云端存储,老师不用每天盯着微信看了。

$$
软件服务 = 软件 + 云端部署 \tag{6}
$$

## 7. 组合软件服务

如果有一个语文老师,想请木头制作一套古诗背诵、接下句、作诗的程序(但是估计木头是断然拒绝的),然后又有一个英语老师,想请木头制作一套背英语单词的程序(如微软小英),那么语文和数学或者英语等就形成了软件服务的组合,我们称之为现代化软件服务(Modernize):

$$
现代化软件服务 = \sum_{i=1}^m 软件服务 \tag{7}
$$

## 8. 解决方案(Solution)

当木头解决了一元二次或者二元一次方程的问题后,可以为小学五年级的老师同学提供服务了,这相当于做了一次服务功能升级;当可以提供 7x24 小时的服务后,相当于做了一次服务质量升级;当可以面向个人用户(学生)按需出题时,相当于做了一次服务体验升级;当可以为国际学校提供英文界面时,相当于做了一次服务范围(受众用户)升级。

当可以为小学一年级到五年级都可以提供出题服务时,那么就成为了一种全栈的解决方案了(Solution),于是有公式:

$$
解决方案 = (传统)产品生态 + (现代)软件服务 \tag{8}
$$

这样的话,木头就可以开一个软件服务公司了,名字已经想好了,叫做 WoodySoft。
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# 什么是软件工程?

好了,我们终于进入正题了:什么是软件工程?

在公式1~8中,我们看到了一系列在“软件”这个名词之外的概念,这些概念的组合就是软件工程所涵盖的范围,但还不止于此。

Empty file.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@


远程面试,发邮件给题目,返回来邮件中有两种:

1. Q-A paired, well organized
2. individual program



面试题

难度,答题时间

0 comments on commit 47ca29b

Please sign in to comment.