【专访邹欣】投身软件工程教育的程序员

【专访邹欣】投身软件工程教育的程序员_第1张图片

邹欣,现任微软Windows中国工程团队首席研发总监。

1996 – 2003年,邹欣在微软Outlook团队从事开发工作;
2003 – 2005年,他在微软内部质量工具团队和Visual Studio团队负责软件项目管理工具的开发;
2005 – 2012年,他担任微软亚洲研究院技术创新组研发主管,负责研究成果的产品化和创新项目;
2012 – 2014年,他担任微软亚洲互联网工程院首席研发总监,负责必应搜索客户端、必应输入法、必应词典等产品。
2014 – 现在,他担任微软Windows工程院首席研发总监,负责Edge,Cortana, UWP App 在中国的发展。

邹欣于1991年获北京大学计算机软件专业学士学位。1996年获美国美国韦恩州立大学(Wayne State University)计算机软件专业硕士学位。他在2007年出版了《移山之道》,于2008年出版了《编程之美》 (合作),于2014年出版了《构建之法——现代软件工程》。


问:您在《构建之法》前言中提到,高一(1984年)的时候就接触到计算机语言和计算机,当时是在什么情况下开始对计算机语言及计算机感兴趣的呢?

邹欣:当时我的中学“柳州高中” 还挺重视计算机的, 派了两个老师去外地学, 然后就来教我们。 其中一个老师我在这个文章里面提到了( 回忆老师 )。我大概是在高中一年级接触的计算机,当时老师们从各个年级中选出一些学生参加计算机兴趣小组,我记得讲课的是教数学的娄国荣老师,他刚参加完了一个培训班,就来给我们讲BASIC 的语法,我们没有任何电脑的实物,就看着黑板抄写BASIC语句。几乎与此同时,我父亲单位里买了一台电脑(PC 1500), 我才看到电脑是什么模样,并且有机会在上面敲了一些程序。

过了不久,庞中坚老师来管理计算机兴趣小组,我们有时晚上到柳州计算中心上机,那时候用的都是苹果机或者是Laser 310,计算中心据说有一台IBM AT,在一个单独的有空调的办公室里,学生都不能进去看,我每次路过都敬仰地往里瞅瞅。计算中心的工作人员在兴奋地讨论从dBase II 升级到dBase III。后来柳高也买了二十多台电脑,上面运行的是CP/M某个版本的操作系统,用起来没有苹果或者Laser 310 好用,庞老师后悔地说——我上当了,计算机没买对。庞老师在暑假还开了培训班,但是学生们上课时都用电脑玩游戏,庞老师一怒之下,把总电源关了,大家的注意力才集中到程序上。

培训完之后,进行了一次广西范围的计算机竞赛,我好像通过了初试,但是在复试中成绩不好,据说当时判卷的方式是把同学们在试卷上写的程序都原样输入到电脑中运行,如果能够运行并得出正确结果,则得分,否则得零分。在一个题目中我别出心裁地用了一个自认为巧妙的办法,但是好像并没有被赏识,看来我的基本功还是不行。我记得获奖的一个高年级同学由于卷面写得太乱,刚开始得分也不高,后来庞老师找到竞赛组织者,复查卷子,分析程序思路,然后才让这位同学得了应得的高分。后来我和庞老师讲了我的想法,他说想法不错,如果程序语法都写对了,肯定能得三等奖。

大概也就是那一年的暑假,《少年计算机世界》上有一个程序比赛,我看了题目(好像是和判断三角形的类型有关),觉得可以试一试,于是自己在纸上写了程序,但是没有电脑调试,开学后,我就找到了庞老师,想借用一下电脑调程序。于是,一天中午,他带我去了学校的机房,我在计算机前敲敲打打,总算把程序调通了。忙完之后,看到庞老师已经趴在桌子上睡着了。我的程序寄出去后,得了奖,庞老师很高兴,他还想让我写一些高中物理的课件,但是后来我要准备高考了,就没有再花太多时间在计算机兴趣小组上。回想起来,我接触计算机已经是30多年前的事情了,当时真是懵懂少年,多亏了几个老师的帮助和提携,才走上了这条职业道路。


问:在大学分专业的时候,计算机科学与技术和软件工程要选哪个好?对今后的就业方向您有什么看法?

邹欣:一个比较偏“科学”, 一个比较偏“工程”。 大学也有像 计算机/软件工程那样 相关的一对专业, 例如化学/化学工程, 建筑学/土木工程, 你也可以问一下这些专业的学长,它们之间的关系, 就业方向有什么不同。

《构建之法》 第一章就援引了托尼·霍尔(Tony Hoare)的论述, 比较计算机科学和软件工程的不同侧重点。

表 1_2 计算机科学和软件工程的不同侧重点

计算机科学 软件工程
发现和研究长期的、客观的真理 短期的实际结果 ( 具体的软件会过时 )
理想化的 对各种因素的折衷
确定性,完美,通用性 对不确定性和风险的管理,足够好,具体的应用
各个学科独立深入研究,做出成果 关注和应用各个相关学科的知识,解决问题
理论的统一 百花齐放的实践方法
强调原创性 最好的、成熟的实践方法
形式化,追求简明的公式 在实践中建立起来的灵感和直觉
正确性 可靠性

如果你想走科研为主的道路,或者你想做和计算机体系结构,算法,硬件相关的工作,那么建议你读CS, 否则二者差不多。 当然, 在中国,这还要看某个具体大学的水平如何, 是否真的有计算机科研的实力。

给大家一个实践题目:做个视频采访。 在校园里, 找到计算机系的老师或者研究生, 问他们,请问你发现了、或者正在研究哪方面长期的、客观的真理?

找到软件工程学院的老师或者研究生,问他们,请问你在软件构建方面取得了哪些实际结果,总结了什么成熟的实践方法?

(请尽量将你的采访分享给我们,可以发在社区,或是微博上,记得 @程序员邹欣 和 @人邮异步社区 哦~)


问:一个好的产品经理如何提升需求分析的能力并控制沟通成本?

邹欣:我先说一个故事,我的一个同事爱好葡萄酒,要成为评酒师,于是他就参加了各种学习班, 并且每天做家庭作业:

• 拿四瓶不同的酒,撕掉标签和其它标识。
• 喝掉这些酒,每次换酒之前还要漱口,然后分析每一种酒的口感,风味,以及各种特点,并写下来。
• 和标准答案对照,总结自己的差距。

第二天继续。
第三天继续。

后来他的肝受不了, 他就喝酒不下咽,马上吐掉。

用上面的例子做参照看看中国 IT 行业产品经理的情况, 我认为, 绝大部分产品经理的分析能力都有很大的提升空间。 很多产品经理的 “分析能力” 体现在看看微信,微博上的文章, 然后转发给团队。这当然是远远不够的。 医学院的学生要解剖尸体,MBA 的学生要读案例,写案例, 为何计算机行业的人生转发一下微信就够了? 不够,一个产品经理至少要分析本行业和几个相关行业产品的前10名,对每一个产品仔细使用,研究(相当于喝酒),写出研究报告。 自己独立写完10 到 50 个报告的产品经理,全中国有多少呢?

而且软件产品比葡萄酒要复杂得多,需求从哪里来?来自好些地方:

a. 从用户明确的反馈来
b. 从用户不明确的反馈来
c. 从各种技术发展的趋势来
d. 从各个利益相关者来
e. 从各个监管部门来
f. 从产品技术团队来

怎么分析,排序,验证,管理这些需求?请看《构建之法》第八章。

在软件工程的教学中,我们也要求学生团队做产品分析作业, 请看部分学生团队的回答(link, link2)。这种作业显示出他们花力气去分析了么? 他们会是优秀的产品经理么?

关于 “控制沟通成本”, 不知道你具体指的是那些成本需要控制。 把分析报告写好,可能沟通起来成本会降低。


问:目前我自己(异步社区用户)的软件开发团队就几个人,因为人手和技术都有些欠缺,基本上以实现功能为目标,没有完全根据软件工程的过程进行开发,请问如何从0到1建立起一套切实可行的基于软件开发过程的体系呢?

邹欣:如果你的团队把功能都实现得非常好,用户都满意, 而且团队成员也愿意继续做下去,那么,这个团队肯定不是在 0 这个水平。
你可以做下面的几件事,帮助团队把原来不成文的、零散的协作方式变成有记录的、互相协调的流程和共识:

a. 如果团队新来了一个成员,他能否只看一个文档,不用和其他人交流,就能把最新版本的源代码构建成一个能运行的软件,并运行一些基本的测试用例? 如果这个文档没有,那就把它写出来。

b. 如果这个团队成员要修改代码,他能否只看一个文档,就能领会本项目的设计规范,代码签入规范,并且把代码签入?

c. 如果新来的员工不是工程师,而是一个产品经理(!), 而且他发现了这个产品的一个问题 (bug)! 那么,你是否也有一个文档/网站,介绍产品的各个版本,每个版本都做了什么,有什么经验教训?过去的bug 都在什么地方,如何记录一个bug?

把这三种文档做好(可能要经过几轮改进), 让大家都同意,就已经有巨大的进步了。 其他的方面,请看《构建之法》, 《人件》 这些书。 碰到问题就去研究并解决问题, 你没有必要非得去外面请一个 高大上的 “软件工程的过程” 的牌位到家里供着。


问:对于架构的大方向或非常复杂的架构,我(异步用户)一直认是敏捷开发方式无法处理的。因为这需要参与者的水平比较高。而敏捷方法中大都没有超级程序员或架构师的位置。 请问您是怎么看待敏捷的?尤其是大型软件的开发中,敏捷是否有一席之地?

邹欣:首先,敏捷对于不迷信的人来说,是好处大于坏处的。 请看酒后的敏捷。

其次,大型软件是由各种小型模块组成的, 如果你把各个模块之间的关系变得比较松耦合,那么,各个小型模块是可以由小型团队来控制它的开发流程,对吧? 如果你说的大型软件是各个模块紧密耦合,还有很多意大利面条式的代码,而且时间紧,任务重, 那么,各种软件开发方法都是无力的。


问:创新更多是需要领域内的一定的学术或技术积累,还是更需要像阿基米德那样的“灵光闪现”?或者说,创新者大多来自于务实派,还是空想派?

邹欣:这个问题,请看《创新的迷思》系列博客,里面提到了很多和创新相关的书籍,也可以参考一下。


问:您为什么会对软件工程教学有这么浓厚的兴趣,以至于投入这么多精力去做这件事?

邹欣:我1991年从北大计算机系本科毕业,不久就出国念书和工作了。 2005年,我回到北京,在微软亚洲研究院工作。 由于工作的关系,我走访了好几个学校的计算机系和软件学院, 还作为工业界的代表, 参加了一些软件学院的评审。 我当时想 “十几年过去了,这些学校每年都说继续深化改革,即使每年深化改革改进了5%, 这些年积累下来, 现在大学的软件教育一定是非常不错的… ”, 没想到看到的情况吓了我一跳(请看这里, 评审感想)。 我刚开始讲软件工程和软件开发培训的时候, 水平也一般,不过,在给同学和实习生讲课之后, 看到反馈还不错,就继续做下去,每次上课,都在上一次的基础上改进一些,同时也把自己学到的知识和教训加进去。

这个教学逐渐变成了线上和线下结合的一个活动,有编辑,老师,工业界的助教,学生在一起发生各种化学反应, 很有意思,所以我对此兴趣还是很浓。

2014年,我把积累的教案和经验汇集出版了《构建之法》, 现在主要是各个学校的老师在教课,一些助教在做实际工作,编辑在做不少组织工作,我只是用一些业余时间在鼓励大家。


问:您在推行软件工程的创新教学方法的这几年遇到了哪些方面的困难?是如何应对的?

邹欣:首先,这个教学方法中的很多元素并没有什么 “创新” 的地方, 只不过是国外大学习以为常的做法,或者是中国大学本来就要求做到的。 大家觉得“新”,可能是看到这样大运动量,严格的训练居然搞成了,同学们觉得的确有收获,而不是 “进一步深化改革” , “打造一个全新的教学平台” 之类的表面文章,因此觉得“新” 而已。

要做成一件不一样的事情,特别是在天朝的大学,困难总是很多的。 经过几年的努力,现在我们形成了这样的循环:

• 学校老师开课,使用《构建之法》为教材
• 我们给学校老师配一个有工业经验的助教 (报酬来自学校或者我的书的版税)
• 所有学生的作业都上网发布,助教和老师在网上批改作业
• 奖励最优秀的同学和团队
• 收集老师和学生的反馈, 改进下一个学期的教学

我们希望和一些学校进行长期的合作,把更多的专业课,教学体系都改进到符合教学规律,符合现代人才培养理念的状态。

最大的困难是心理上的,很多人都有 “过早退出” 的心理问题。
• 教师和助教想改革,但是能坚持一个学期么?能持续改进么?
• 学生想学好,是真的付诸实践,还是在琢磨 “如何以最小的努力,过了这门课”?

如何应付这些困难呢? 最好调整自己的期望值,选择能够合作的对象来合作,在坚持中不断改进,在争执中协调步伐。


问:您强调“做中学”,那么在软件工程的学习当中,理论学习和技能训练是否有先后顺序和侧重?

邹欣:如果没有理论的知道,技能的训练是事倍功半; 如果没有技能的训练,工具的支持,来自现实世界的反馈,那么理论只是空中阁楼。

大家如果没有写一万行代码,没有和几个同伴做出一个有人用的软件,那么还不用担心这个先后顺序和侧重的问题。

访谈来源【异步社区】

邹欣作品:《现代软件工程:构建之法》(第二版)

【专访邹欣】投身软件工程教育的程序员_第2张图片

《现代软件工程:构建之法(第二版)》共分17章,对照美国ACM/IEEE2013年新出版的计算机科学教学指导(Computer ScienceCurricula 2013)中的软件工程相关部分,这本教材覆盖了其中大多数Core-Tier1和Core-Tier2的内容。可以说,全书对软件工程内容的覆盖不逊于任何一本现行的教材,同时讲述了业界新实践方法。

你可能感兴趣的:(软件工程,访谈,构建之法)