Skip to content

Commit

Permalink
Xiaowuhu/20200914 (microsoft#560)
Browse files Browse the repository at this point in the history
* add 3.1

* add 3.2

* add more

* Update 04.0-单入单出单层-单变量线性回归.md

* Update 3.3 微软的软件工程师.md

Co-authored-by: Xiaowu Hu <[email protected]>
  • Loading branch information
xiaowuhu and xiaowuhu authored Sep 16, 2020
1 parent 7365e6f commit 1916e3d
Show file tree
Hide file tree
Showing 11 changed files with 386 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,6 @@ $$

第1行是第1个样本的3个特征,第2行是第2个样本的3个特征,这与常用的阅读习惯正好一致,第1个样本的第2个特征在矩阵的第1行第2列,因此我们在本书中一律使用第三种形式来描述线性方程。

另外一个原因是,在很多深度学习库的实现中,确实是把 $X$ 放在 $W$ 前面做矩阵运算的,同时 $W$ 的形状也是从左向右看,比如左侧有2个样本的3个特征输入($2\times 3$ 表示2个样本3个特征值),右侧是1个输出,则 $W$ 的形状就是 $3\times 1$。否则的话就需要倒着看,$W$ 的形状成为了 $1\times 3$,而 $X$ 变成了 $3\times 2$,很别扭。
另外一个原因是,在很多深度学习库的实现中,确实是把 $X$ 放在 $W$ 前面做矩阵运算的,同时 $W$ 的形状也是从左向右看,比如左侧有2个样本的3个特征输入($2\times 3$ 表示2个样本3个特征值),右侧需要一维的输出,则 $W$ 的形状就是 $3\times 1$,这样矩阵运算的结果是 $(2 \times 3) \times (3 \times 1)=(2 \times 1)$。否则的话就需要倒着看,$W$ 的形状成为了 $1\times 3$,而 $X$ 变成了 $3\times 2$,很别扭。

对于 $B$ 来说,它永远是1行,列数与 $W$ 的列数相等。比如 $W$ 是 $3\times 1$ 的矩阵,则 $B$ 是 $1\times 1$ 的矩阵。如果 $W$ 是 $3\times 2$ 的矩阵,意味着3个特征输入到2个神经元上,则 $B$ 是 $1\times 2$ 的矩阵,每个神经元分配1个bias。
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@

作者在本书中介绍的关于微软(中国)的所有内容,仅限于作者本人的观点,并不代表微软官方。

AA
Architect
JD
PM
SDE
DEV
Dev Lead
Dev Manager

<img src="images/Slide1.jpg"/>
<img src="images/Slide2.jpg"/>
<img src="images/Slide3.jpg"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ $$

### 软件工程师

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

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

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

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

### PM

Expand All @@ -32,7 +32,7 @@ $$

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

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

### 团队

Expand All @@ -44,7 +44,7 @@ $$

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

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

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

Expand Down Expand Up @@ -82,8 +82,8 @@ $$
|开发模式|功能迭代|特定功能|功能增加|
|人员规模||||
|发布渠道|客户端软件|定制软件包|云端服务|
|交付方式|可执行文件|源代码+可执行文件| API 调用|
|竞争者||||
|交付方式|可执行文件|源代码+可执行文件|REST API 调用|
|竞争者|||少而激烈|

### 产品

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
# 面试的故事

我们先讲一个木头面试的(真实,但有节选)故事,从故事的情节中,大家也许可以发现像微软这样的公司是如何考察个人能力的。

木头毕业后在一个国企工作,后来想“下海”闯荡,于是花了3个月时间复习了4本书,分别是《C++教程》、《数据结构与算法》、《C#教程》、《高等数学》。恰逢微软启动了当年的扩大招聘计划。于是,修改简历,扔过去,反正也不花钱,要是花钱,就扔100块钱的,就当是买彩票了。

和很多大公司一样,微软有两种招聘渠道:Campus Hire(校园招聘)和 Industry Hire(行业招聘)。一般来说,Campus Hire 要经过三轮面试,前两轮是技术面试,最后一轮是 AA(As Appropriate,直译为视情况而定,决策者)面试;而 Industry Hire 要经过六轮面试,前五轮技术面试,最后一轮 AA 面试。

木头加入微软就是走的 Industry Hire 渠道,只要不是刚踏出校门的学生寻找第一份工作,就都要走这个渠道。简历能被 HR(Human Resoruce,人力资源)看到,是一件非常幸运的事(如何写简历不在本书的讨论范围之内),木头就很幸运,几个关键的技术点正好符合 JD(Job Description,职位描述),于是有下面的故事发生......

### 第一轮面试

10月20日,18:00下班后,某大厦4层木头的办公地点。

木头的手机响了,一个男子的声音:我是微软xxx,你是yyy吧?

木头激动地说:是!

面试官:我们进行电话面试吧?

木头:好。

面试官:您有大数据量的处理经验吗?

木头:有!每天上万条记录,一个月可以到100多万条,如,通话话单或短信业务......

*注:以上问题是关键,主要是看木头有无大批量数据的处理经验,所以可以过关了。*

### 第二轮面试

10月23日,12:00午休时间,某大厦4层木头的办公地点。

木头的手机响了,一个女子的声音:我是微软zzz,你是yyy吧,我们可以电话面试吗?

木头:好!

面试官:您先用英语介绍一下自己吧?

木头:blah blah blah......(磕磕绊绊的没关系,只要能说就行)

面试官:给您出一道题目吧,也算智力题吧。

木头:好!

面试官:0~1000的数组填写1~1000整数值,位置随机,肯定有重复的。用最简单的方法找到重复的数字并打印出来。

*注:这是电话面试,如果你在电话这边一声不响地思考,那是不礼貌的,你必须尽快想出答案,并且在思考的过程中,要让对方“听到”你在思考。做到这一点很难。*

木头:嗯......(30秒后)用一个辅助存储数组,记录次数,最后统计一下即可。

面试官:要是不用辅助存储呢?

木头:嗯......(30秒后)把数组排序,然后就能找到。

面试官:那要经过两次扫描,还有更简单方法吗?

木头:嗯......(30秒后)我暂时想不出来了,对不起。

面试官:没关系。再问您一个问题:如果有一款新手机,你打算如何测试?

木头:......(省略100字)反正我觉得重点应该在数据业务上,因为手机上的话音业务比较成熟,而数据业务是用户困惑的地方。

面试官:您有什么爱好吗?

木头:我喜欢游泳,我“健将”好几个月了。我很幽默。我喜欢打桥牌,我喜欢玩魔方。

面试官:您很幽默,我听出来了。打桥牌,说明您逻辑推理能力强;魔方是个很专业的爱好。

木头:是这样的(在电话面试的过程中,要尽量的表达你自己的优点,但不能过火)。

面试官:好的。如果合适,您还将接到电话。

木头:好的。

木头挂断电话,心里忐忑不安:唉!那个数组问题没答对啊!心理太紧张了,时间也太紧了,我讨厌电话面试这种形式。坐到座位上后,木头开始思考数组题的答案,10分钟后,有了结果,并且认为肯定是正确的答案之一。在电面过程中,不会有这10分钟存在的。估计我搞砸了,机会就这样远离我而去......

没想到,10月26日,11:00,木头的手机响了,一个女子的声音:我是微软 HR,你下周来面试吧......

### 第三轮面试

10月31日,15:00,希格马大厦6层。

面试官是个小伙子:说说你最得意的项目吧。

木头:......(此处省略10000字。一般都是用这种方式开始,让面试者有个热身的机会,增加自信心)

面试官:咱们做个算法题吧,你在黑板上写出代码来!

*注:这个难度超大的,因为:1.站着;2.在黑板上写;3.有人看着。压力巨大。*

面试官:有两个数组,排序好的,分别有M个元素和N个元素,建立一个新数组,有M+N个元素,把那两个数组中的元素按次序写入新数组中,在写入的时候就排好序。

木头10分钟后,涂涂改改若干次后,写出了一个函数,正要报告“完毕”,我忽然发现了一个漏洞,其中的一个数组有可能先用完,那么这段代码就会死机。又花了2分钟,把这个漏洞弥补上了。

挑了几个小毛病后,就进入第二问了。

面试官:还是这两个数组,从每个数组中取一个值相加,放入到新的数组中,在写入时就是排好序的,组合关系不能重复。比如,第一个组合是$i_0+j_0$,第二个组合可能是$i_0+j_1$或$i_1+j_0$,取小的那个组合,然后继续......

木头:在黑板上做 $k=1,2,3$ 的推演,最后没有推出来,时间已经不够了......

面试官:行了,k=n估计是时间不够了,咱们做一个建模题。三个形状,一个圆,一个矩形,一个正方形,如何建模?

木头:......(此处省略1000字)

面试官:行,咱们去下一个面试吧。

*注:上面的第二问主要考你的解题思路,并不指望你能在现场解出来。回家后,我前后用了1小时时间,用代码实现了,保证是最佳算法。*

### 第四轮面试

当日16:00,希格马大厦1层。

面试官是个部门经理:咱们做个算法题吧!

(算法!除了算法,还是算法!因为我应聘的是SDE)

木头:(颤抖地)好...吗...吧!

面试官:有一棵满二叉树,每个节点都有一个指向其它某个节点的指针,要求用O(1)的消耗,就能知道这个指针指向的是上级节点。如何设计数据结构?

木头心想:数据结构的书没白看,这次有在黑板上写东西的经验了。3分钟后,画了一个二叉树的数据结构,每个节点的key值都用含有级别信息的值标识,则任意一个节点内的指向其它节点的指针的key值与本节点的key值比较,就能知道指向的是否是上级节点。

面试官:还有没有更简单的方法?

木头:不可能有了。

面试官:真的吗?你用的是深度优先算法,能不能考虑广度优先算法?

木头:除非把节点存储在数组中,但是还要把左右节点也存到辅助数组中。

面试官站起来了,在黑板上刚把数组画出一半来,还没等他说话解释,木头立刻就明白了他的意思,说:哦,我知道了。满二叉树,第n级节点占用了$2^n$个单元,用某节点的位置的单元序号直接能得到它的级别。

面试官:我们再出个建模题吧。大厦里有很多会议室,建个模型,来管理这些会议室。

木头:(先做了会议室类,再做了管理类)。

面试官:如果多人预订会议室呢?

木头:(又做了预订动作类)

又说了些别的,就带木头去6层了。他进去后和人力资源谈了几分钟,再出来时,就和木头握手说再见。人力资源说起下一轮面试的时间,木头才踏实了,知道应该过关了。

### 第五轮面试

11月1日,10:00,希格马大厦1层。

面试官是个女博士,人很和善:说说你最得意的项目。

木头:您对增值业务有了解吗?数据业务或话音业务?

面试官:话音业务我不了解,说数据业务吧。

木头把数据互联网业务的系统设计思路在黑板上画了一遍,考虑到了可用性、可靠性、可扩展性,分4层结构,第一层做对内DNS轮询;第二层做接入,要用Load Balance(负载均衡);第三层用 com+ 组件,做中间件,做任务分发;第四层做数据库群集......(此处省略10000字)。

面试官:我们再做一个算法题吧。

木头:(天啊,又是算法)没...问题!

面试官:有一个字符集,要求用算法把所有组合列出来。如 {a,b,c},要列出 {a,b,c,ab,ac,bc,abc} 七种可能。

木头:(在黑板上写了5分钟,也没写出来)

面试官:可以考虑用递归方式

木头:我尽量先考虑用迭代方式吧。

面试官:好。

木头:(还是没琢磨出来)

面试官:再给你5分钟吧,写不出来就算了,我自己也写不出来。

木头:(5分钟后写出了一个递归函数,勉强过关,她好像并不在意这个题目是否能答的出来,因为木头在开始的关于系统结构的讲解给她留下了很深的印象)。

面试官:咱们去6层吧,glad to meet you!

木头:哦,好好(其实应该说me too)。

*注:这种情景让笔者想起了有一次在Intel,给一个老外和几个同胞讲我们的产品系统结构,讲得他们很爽,最后老外主动站起来和我握手,说"glad to meet you"。当时,那些Intel的同胞都很惊讶的叫了一声,因为他们知道那个老外很少这样做,前面有10个这样的公司给他们讲东西了,他从来没有站起来过。于是我才知道,如果在刚见面时,人家对你说“glad to meet you”是客套,在会谈结束后说“glad to meet you”就表示是欣赏你。*

### 第六轮面试

当日11:00,希格马大厦6层。

面试官是一个学者,应该是大领导,非常和善。

面试官:说说你最得意的项目。

木头:......(此处省略10000字)

面试官:你的简历中提到你的学习能力很强,说说理由。

木头说了木头第一次做语音增值业务系统的经过,又举了个自学游泳的例子):花1个月(4次)学仰泳,花2个月(8次)学自由泳,花6个月(24次)学蝶泳......

面试官:当用户在网络上发起请求后,系统服务器故障了,你如何保留这个用户的请求信息。

木头:如果没有造成"呼损",那就不管了;如果不牵涉到计费,也不管了;我尽量设计成把请求一次提交。

面试官:如果以上条件都不满足呢?

木头:那我只好把 session 存在 DB 里面了。

又说了些别的,就把木头送出办公室,挥手告别。

Loading

0 comments on commit 1916e3d

Please sign in to comment.