专访《构建之法——现代软件工程(第三版)》作者邹欣

{-:-}![这是一个Logo图像{300}](http://file.epubit.com.cn/ScreenShow/160563aa795b9f5d2dcc)

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

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

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


校园篇

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

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

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

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

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


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

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

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

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

计算机科学

软件工程

发现和研究长期的、客观的真理

短期的实际结果(具体的软件会过时)

理想化的

对各种因素的折衷

确定性,完美,通用性

对不确定性和风险的管理,足够好,具体的应用

各个学科独立深入研究,做出成果

关注和应用各个相关学科的知识,解决问题

理论的统一

百花齐放的实践方法

强调原创性

最好的、成熟的实践方法

形式化,追求简明的公式

在实践中建立起来的灵感和直觉

正确性

可靠性

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

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

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

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


问:有人说,考研的不是特别热爱科研的就是逃避现实的懦夫。您怎么看?工作三年等于读研三年吗?

邹欣:讨论问题,不必搞“懦夫”这种标签。趋利避害,人之常情。这些问题不能用非白即黑这样的模式。

的确,有些人是为了科学而主动考研,有些人是因为工作不好、换专业、换学校找而考研。有些人读了硕士,考虑各种出路的优劣之后,就决定读个博,读博之后,考虑了各种出路的优劣,就留校。后来一些留校的年轻教师,虽然没有在外面真正打拼过,就当了学生的就业指导或者大学生创新创业辅导员,这是人间喜剧,值得好好品味。


问:您的大学生涯是如何度过的呢?在韦恩州立大学您又接触了怎样不同的教育呢?

邹欣:大学,一袋烟的功夫,就过了,就像北京的春夏之交那么短,然而总是有些回忆挥之不去。

那时候,北大的老师挺不错的,由于没有PPT和投影仪,老师都写板书,你可以看到一些推理的过程。有一个老师,一上课就开始板书,一直到最后,大家都刷刷地抄笔记……我当时挺不爽的,不想抄笔记。现在想想,这也许是她能做到的最好水平了,也不容易。

我工作几年后,去Wayne State University读硕士,由于有工作的经验和感悟,知道要学什么,在什么地方投入,所以结果还不错。它是典型的美国公立大学,而且还坐落在底特律的市中心,底特律地区还是美国中东裔移民的最大的居住地之一,我还认识了几个从约旦,巴勒斯坦来的同学。在这个地方对美国会有更深的了解。我很快地拿到了所有学分(好像都是A),写了论文,就离开了。我的硕士指导老师还想让我在那里读博士,但是我婉拒了。

当时我也想搞个名校的博士,但是名校不理我:)

我的导师和我还时不时有联系,他也是搞软件工程的,最近还出了一本书:Software Engineering:The Current Practice


问:对于进入IT这一行业,学校专业力量是否重要?985相比211所占优势有多大呢?想进好一点的公司或高校深造,211学历会不会直接先被刷掉呢?

邹欣:这个看个人。不太看学校的级别。

我个人不清楚985和211的含义。当然可能“级别”高一点,但是级别能说明啥?市级厅级省部级,都有人尸位素餐,或犯下大数据的罪行,贪污的数目都不能用16位整数表示,你说级别能说明啥?

当然,从统计意义上,我们可以说某个三本学校的学生的优秀的“概率”稍低,但是在IT专业的学习上,大家几乎都是平等的。人生的目的之一,就是要打破别人给你定义的统计意义。在今天,你如果有持续更新的技术博客和一定质量的公开源代码库(github),你就比99%的人优秀了。


问:您对后生有什么寄语和忠告吗?

邹欣:写一万行代码,再说其他。


职场篇

问:您作为微软的研发经理,您的研究方向是什么呢?您平常每天都做些什么?或者说您典型的一天是如何度过的?

邹欣:我现在在微软Windows操作系统工程部工作,就是改进Windows 10(包括Windows 10 Mobile)的操作系统,App,和生态系统。这么大的系统有很多人在开发。我负责的团队只做其中很小的一个部分-例如, 中文版Cortana(小娜)的前端工作, 浏览器Edge的工作, Window App生态系统,服务的改进, 等。 研究的方向就是-build to win

典型的一天: 早上开一两个电话会议,因为合作的很多同事在美国。 上班 和组里的同事聊天,讨论项目进展,看看有什么问题需要解决。 有时和同事一对一地讨论问题。 参加项目的各个阶段的复审-spec,code,test plan,bugs,release readiness. 计划下面一个阶段的工作,做调查,分析数据,等 中间回复邮件 下班 回复邮件,看看网络上对windows 10的一些反馈,提出想法,回复一些反馈 周五下午通常搞点小活动,庆祝一下大家取得的成绩。


问:除了这份工作,您似乎也在高校教书是吗?那么这两份工作您是如何权衡的呢?

邹欣:这件事的缘起是2006年的时候和微软亚洲研究院清华大学合作教学,我2007年开始讲课,没有报酬,就是原来工作的一部分。后来在北航讲课是想看怎么改进软件工程的教学。通常我的课都安排在周一晚上,我周末备课,周一下午去讲课。

现在我已经不亲自讲课了,从2015年开始,有越来越多的学校在用《构建之法》讲软件工程,我用这本书的稿费(以及以前编程之美的稿费)在网上招聘了一些有实际工作经验的助教,让他们和任课老师合作,一起改进教学。我就是看看同学们的博客,给老师和助教出些主意。都是通过cnblogs或者微信来保持联系。这个活动是大家自发组织的,有不少能人在帮忙维护,我们希望每一年都有改进,把中国的软件工程教育搞好。

我觉得,不必权衡太多,既然教了课,写了书,就要做到最好。你觉得我们的软件工程课哪里不够好,可以告诉我。


问:经过这么多年的将兴趣转换成职业后,您对计算机编程的感觉是否还如当年一样热衷?如何在繁重的工作压力下,保持初心呢?

邹欣:当工作很有意思的时候,就不是太大的压力。我虽然一直在一个公司,但是换了好几个不同的部门,每次都重新学习,多数情况下还能做出一点成绩,和团队的成员相处得不错。我换部门之后,还有一些同事想跟我一起走,说明我人还不错。

现在还有大学生来请教“生涯”的问题,我觉得挺好的。

“初心”这个东西,我没太多想。小孩子很容易被人忽悠的,我小时下围棋,也没有老师,就自己看书学,不料想打入了全市前32名,获得本市乙级棋手称号(据说高考可以加5分),我老爸说,如果大学有围棋系,你就可以下,否则不能下棋,要好好学习!

我高考报志愿的时候,老师说,生物学会大发展,下个世纪的科学!我觉得计算机也不错,还有某个学校的招生老师说,你来学数量经济学吧,以后可以。。。。我有一天放学路上,看到我的语文老师生急病被拉到医院,我当时想学医也很有用。。。结果我们班主任说,医学类招生水很深啊,你别去!

想来想去,我大学第一志愿是生物,结果分数不够高,去了计算机系。:)


问:从事这份工作应该具备哪些知识、技能和素质呢?

邹欣:这样的问题。。。我觉得下面这些很重要,是一个纲要,纲举目张。

  • 离散数学
  • 形式语言与自动机&编译原理
  • 一门基础编程课
  • 操作系统
  • 软件工程

还要具备这个素质: 自己写一万行代码,混在别人写的10万行代码中,还能愉快地工作。


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

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

-拿四瓶不同的酒,撕掉标签和其它标识。

-喝掉这些酒,每次换酒之前还要漱口,然后分析每一种酒的口感,风味,以及各种特点,并写下来。

-和标准答案对照,总结自己的差距。

第二天继续。

第三天继续。

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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

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


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

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


问:您认为IT行业是否客观存在性别差异问题?您的同事、学生中女性大概占多少呢?

邹欣:差异就是客观存在的。护士,厨师,幼儿园老师,建筑工人,某个偶像的脑残粉。。。都有差异。例如,在护士行业是否存在性别差异问题?

我周围的同事大约女生有1/3-1/4吧,考虑到大学IT专业的男女比例,这个数字说明,只要努力,女生也能学得比男生好(统计意义上),找到很好的IT行业的工作。 还是那句话,把自己的事情做好,别想太多统计意义。


问:您能给我们描述下IT行业当前的现状吗?未来的前景又如何呢?

邹欣:现状令人惊喜地好,有些学生大学自己就没写过1000行程序,结果也能找到工作。我真是又惊又喜,以惊为主。 IT行业前景不错。你看一个小小的例子:http://www.microsoft.com/microsoft-hololens/en-us


问:俗话说,隔行如隔山。听说IT行业内也是如此。不同方向的人才一般一直专攻一个方向还是会有所转换?是否容易呢?

邹欣:我倒不觉得隔行如隔山,你看现在做英语培训失败的,说笑话的,做空调的,,,,都可以开发布会要做最好的智能手机了。他们翻山很容易啊。

你只要选一个方向,一直专攻,到碰到困难的时候,就知道是要换,还是要继续了。当你到了那个地步,自然就有解法。


问:您是如何平衡工作,写书,家庭?

邹欣:事情较多,要分轻重缓急。除了你提到的工作,写书,家庭,别的事我不太做,所以还能应付。坚持做好一件事也不容易,比如写书,一个小领域写很多年,的确会产生厌烦情绪。我经常就上微博,看一些有趣搞笑的东西,发发牢骚,劳逸结合。一本书在绝大部分时间里,都是一个草稿,就像一杯水,也可以说一半是满的,或者一半是空的。为了把这个杯子装满,有时要不断鼓励自己。也得到周筠老师很多鼓励,乐观看待已经完成的部分,不断改进。就像《高效人士的7个习惯》提到的那样,可以想象这杯“水”满了以后获得的乐趣和成就感,这样又可以继续做下去一段时间。坚持到最后,咦,书写好了,孩子也长大了!


教学方法篇

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

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

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

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


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

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

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

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

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

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

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


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

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

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


问:现在网上有快速成为全栈工程师的培训班,收费不少,你觉得这种办法有道理么?会取代学校的传统方法么?

邹欣:首先,如果人们是充分了解了这种培训班的信息,然后去上课,那是他们的自由选择,对他们来说,这是有道理的。这个培训班的价值,应该由市场来决定。 大学要教什么?打一个冰山的比方,大学就是让你在能力上形成一大坨冰!这一大坨冰,扔到海里,就会有大约1/8的部分露出水面。这个姑且认为就是能解决目前工作需求的那些技能。

图像说明文字

大学的教学目的,就是教你一大坨冰,等你走到社会,就相当于把这一大坨冰往海里一扔,露出水面的部分就够你解决问题了。

也有学者这么说:

We are currently preparing students for jobs that do not exist, using technologies that have not been invented, in order to solve problems we do not even know are problems.

——KarlFish

大学生们应该为那些尚未出现的工作做准备,用那些还没有发明出来的技术,解决我们目前还不知道的问题。这是我们理解的大学之道。既然这样,我们就不必太在意今天市场上时髦的东西,而是要学好深层的规律,原理,打好基础。比如你学好计算机、数学的基础课程,走上社会见招拆招就好!今天时髦的技术并不是要避免,或者不重视,而是把它们当作学习规律,原理的参考,做各种实验的原料。例如,你要学操作系统,你可以拿现在时髦的操作系统做实验,为了实验的效率,你要熟悉各种命令行参数,但“熟悉命令行参数”并不是大学教育的目的,而是做深入分析的副产品。

学霸能把各门课的知识,技能聚合成一坨冰,学渣只能收拢一些冰渣,这些冰渣很快就融化了。

有人说这太花时间了,太乏味了,如果我只学露在水面上的那一块冰就好了!临时学一下实用技能,就是在露出水面的部分加一些冰。很多同学没有意识到---没有水下面那一大坨冰的支持,水面上的那一小坨就会大部分沉到水下。 有人说一个人就可以快速成长成为一个全栈工程师,这让我想起街头卖艺的“One-man-band”,他们什么都会一些,可以很快地演奏一些曲子。

图像说明文字

与之对立的,是只钻研某一乐器的:

图像说明文字

你愿意花钱听哪种演奏呢?当一个小孩说–我长大了要做音乐家!你会让他走上one-man-band的道路么?

那为啥这种“快速全栈”补习班这么热门呢?有好几种原因。

1) 大学教学水平太差,想让学生学到一大坨冰,结果教的课都很“水”!学生没办法,只好上培训班补习。 2) 学生先懒后急,没毕业的时候,看不到水下那一大坨冰的作用,觉得大学的教学计划枯燥,不爱学。快要毕业时,再搞一大坨冰,已经来不及了,听到大家经常谈论小冰山,只好另外花几万块钱去上培训班,想马上复制那些小冰山。 3) 会玩几种乐器比学精一种乐器容易多了,而且容易收钱。 所以:

-要珍惜大学的时光,搞出一大坨冰! -可以玩一下one-man-band,但一定要要精通一两个技能。


技术达人篇

小记者:龙星镖局


问:假如要学习编程,是不是越早越好,不一定非要等到上大学?

邹欣:兴趣爱好什么时候开始都行。

问:有些人建议学编程语言时先从Python这样的语言入手,而后再学习C、C++这样复杂的语言,这和很多国内高校的顺序是相反的。你是什么建议?

邹欣:类似的讨论不少,例如这个2009年的博客和评论讨论了MIT的入门课从讲授Scheme转到Python的故事。今年斯坦福大学也换了入门课的语言,从Java 换到 JavaScript。 我觉得,在教学的时候,可以从各个方向给学生介绍CS的核心知识及计算机语言,条条道路通罗马,下面的各种道路都可以试一试:

  • 物理 -> 电子 -> 某种底层嵌入式应用 -> 机器代码 -> 汇编 –> 高级语言
  • 数学 -> 数理逻辑 -> 形式语言与自动机 -> 计算机语言理论 -> 某种计算机语言 (这种道路让人想起高德纳老师)
  • 容易理解的语言如VB和计算机游戏 ->学习UI编程 -> 学习语言设计 –> 设计符合自己要求的语言和工具 (参见 轮子哥的成长

学校的教学有它自己的很多限制, 学生的质量和基础,老师的能力,学校的培养计划,学期的长度(13 – 15 周),等等。 我认为入门课不妨生动活泼一些, 让学生有足够的动手机会。 另外,语言是否 “复杂“,是由各种因素决定的,如果你隐藏了细节, 很多复杂的东西也很简单,例如: C++的cout/cin语句就比C语言的 printf()/scanf()简单多了, 当然,如果把这些问题都讲透了,这些都不是太复杂。

问题是:

  • 老师有没有能力把这些讲清楚
  • 把这些讲清楚,对学生后续的学习有没有直接的帮助?

国内和国际上对软件工程的教育差别在哪里?比较双方代码量的区别就知道了。另外看看学生的吐槽: http://www.cnblogs.com/xinz/archive/2013/02/06/2908169.html

国外的好老师,真的把教学当作一个严肃的课题来做,按照规律来搞教学,请看这个例子: https://zhuanlan.zhihu.com/p/20610349

问:计算机系和软件工程的老师有区别么?

邹欣:你在校园里面碰到老师,如果她是计算机系的,你可以问老师: 你发现了计算机科学的什么客观规律? 如果是软件工程的,你可以问:你构建了什么样的软件?你发现了工程的什么规律?

问:公司面试,如何看待面试前先刷题?

邹欣:这个没啥好说的,别人面试前做什么,公司管不着。如果公司看不出一个人的真正水平,那就是这个公司的问题。

问:你带过很多程序员,你觉得优秀程序员有哪些共同的特点?

邹欣:动手能力强, 发自内心地想把事情做好。

问:业界有很多设计模式相关的书籍,读的时候很有感觉,但具体应用时候又觉得无所适从,这是为什么?

邹欣:我喜欢下围棋,也看过不少围棋书。有这样一个说法,如果光下棋不看书,水平就停滞;看一本围棋书再实战,棋力就会下降一级。当然,如果继续实战,棋力会涨回去,甚至超过原来的水平。所以,要理论和实战相结合。

问:你是软件工程领域的行家,出版过《构建之法——现代软件工程》一书,如何理解书名的“现代”?软件工程方法论有过时的说法么?

邹欣:古书上说 “世易时移,变法宜矣”,方法论当然要随着时代的变化而调整。 我们要问的是, 世易了么?时移了么? 开发软件的需求方变化了么? 开发软件的理论基础变了么?开发软件的工具变了么?软件从业者的情况变了么?团队交流的情况变了么?这些变化的因素是本质的变化, 还是非本质的变化?

很早以前就有嵌入式开发, 这个和最近兴起的IoT开发有什么异同呢?

很早以前有批处理系统,写数值计算的程序,通过纸带输入,过一天才有结果输出。现在有深度学习,投进去数据和各种参数,也要很久才能得到一个结果。 这两种是一样还是不一样?改变的因素是本质的, 还是非本质的?

问:你的《构建之法》以及和老师的合作 (http://edu.cnblogs.com),似乎很看重实战,我也听到不少大学领导说 “我们大学的教育使命,和职业培训是有区别的,我们要讲大学之道,培养科学家...”,你怎么看这个问题?

邹欣:

  • 中国的大部分大学,培养学生的目的是让他们成为合格的职业人士;还有一些学校,要培养学生当科学家,当然也很好。不过,一些人把科学家和其他职业人士对立起来了。 科学家也是一种职业,不能以特殊性否定普遍规律 -- “我要培养白马,所以培养马的规律不适用于我“。 中国的大学在招 “科学家” 的时候,招聘流程和其他行业招人也很类似,说明也是按 “职业” 的规律来招人的, 而且有些学校通常会限定许多条件, 例如必须在国外获得某些学位等等, 这么说中国的大学培养不了科学家? 这不是和上面提到的中国大学主要目的互相打脸了么?
  • 科学家(或者说科技工作者)也是一类职业,也有它本身的规律,也有原理,知识,技能。 它不是隔绝于其他职业之外,而是和其他职业有很多共性。成功的科学家和成功的其他职业人士一样,展现出良好的分析,表达,个人管理,时间管理的能力,正确处理 “合作+竞争”的关系,还有项目管理的能力,等等。 这些能力的获得,都需要练习,特别是 “专注的,有反馈的,持续改进的” 练习。为何这些技能不能在大学里训练呢?这样的训练不就是职业培训的一种方式么?
  • 科学家作为一种职业,也要持续地给自己充电,有些通过脱产读更高一级的学位,博士后,有些通过出席研讨会、阅读、参加课程来学习。例如最近一些科学家都参加了如何使用 “云计算” 来帮助科研的课程,或者参加 “教育心理学” 的课程。 科学家在参加这种课程的时候, 也有企业的人员或老师参加, 大家不都是一样职业的培训么? 为何看不起职业培训呢? 在培训过程中,有人获得顿悟,立即成为 “完整的人,高尚的人”; 也有人是渐悟,逐渐提高了自己的修养;还有人就是学到了一些技能,这也无妨,对吧?
  • 或曰:"大学是培养人心智的地方,急于把自己安塞到社会中的某个岗位会让大学生急功近利,失去本真的学习快乐。" 对IT 专业来说,心智如何培养?平时抄作业,考前哀求老师画重点,就能得到心智? 想偷懒,不想面对现实,那就直说,不要拿“心智”来搪塞, 要格物致知,要深入研究,练习,要分析IT行业发展的源和流。 没有脚踏实地的实践而奢谈 “心智”, 仿佛临渊羡鱼,或幻想空中楼阁。
  • “大学之道,在明明德...” , "为天地立心,为生民立命,为往圣继绝学..." 古人的话,真的很美。但别自我麻痹太多,现代的大学之道应该能分解为可衡量的,可执行的,可具体传授的各个部分。教育者要分而治之,把大学生的职业培养搞好,让大学生毕业后能跻身于一流的研究院或大学,一流的企业,或者,毕业生去了一些普通的单位,甚至没有单位,但是他们有信心在社会上自立。这,就是最基本的大学之道。

问:很多计算机、软件工程领域的同学看了很多编程方面的书,但实践中还是感觉写不出来好代码,你觉得最大的原因是什么?

邹欣:看得太多,想得太多,写得少,从实际世界得到的反馈太少。

问:当前计算机领域的工作越来越细分,很多职位只负责算法模型调研,实际的编程实现有工程团队在做,经常出现需求不能正确实现的情况,有没好的建议?

邹欣:就像足球队那样,有分工,但是目标是一致的 -- 赢得比赛。需要的时候,后卫也要射门,前锋也要防守。负责模型调研的应该要把全栈做一两遍,才有全局的感觉。 写程序,搞研究,目的是各种各样的,要想清楚自己和团队的目的是啥。

更多详情请看https://zhuanlan.zhihu.com/p/20003750


图像说明文字

构建之法——现代软件工程(第三版)

1 推荐
暂无评论,快来抢沙发哦~
异步小编
异步小编 V5

1.3K经验值

相关技术

相关图书

相关文章