技术达人 邹欣 专访

受访者:邹欣,微软中国首席研发总监,他在2007年出版了《移山之道》,于2008年出版了《编程之美》 (合作),于2014年出版了《构建之法——现代软件工程》

小记者:龙星镖局

(1) 假如要学习编程,是不是越早越好,不一定非要等到上大学?有些人建议学编程语言时先从python这样的语言入手,而后再学习C、C++这样复杂的语言,这和很多国内高校的顺序是相反的。你是什么建议?

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

  • 物理 -> 电子 -> 某种底层嵌入式应用 -> 机器代码 -> 汇编 –> 高级语言
  • 数学 -> 数理逻辑 -> 形式语言与自动机 -> 计算机语言理论 -> 某种计算机语言 (这种道路让人想起高德纳老师)
  • 容易理解的语言如 VB和计算机游戏 ->学习UI编程 -> 学习语言设计 –> 设计符合自己要求的语言和工具 (参见 轮子哥的成长
学校的教学有它自己的很多限制, 学生的质量和基础,老师的能力,学校的培养计划,学期的长度(13 – 15 周),等等。 我认为入门课不妨生动活泼一些, 让学生有足够的动手机会。 另外,语言是否 “复杂“,是由各种因素决定的,如果你隐藏了细节, 很多复杂的东西也很简单,例如: C++ 的 cout/cin  语句就比 C 语言的 printf()/scanf() 简单多了, 当然,如果把这些问题都讲透了,这些都不是太复杂。问题是:
  • 老师有没有能力把这些讲清楚
  • 把这些讲清楚,对学生后续的学习有没有直接的帮助?

(2) 国内和国际上对软件工程的教育差别在哪里?

比较双方代码量的区别就知道了。另外看看学生的吐槽:http://www.cnblogs.com/xinz/archive/2013/02/06/2908169.html 国外的好老师,真的把教学当作一个严肃的课题来做,按照教学规律、软件工程的规律来搞教学,请看这个例子:https://zhuanlan.zhihu.com/p/20610349

(3) 计算机系和软件学院的老师有区别么?

你在校园里面碰到老师,如果他们号称搞科研的,那:如果她是计算机系的,你可以问老师:你发现了计算机科学的什么客观规律?如果是软件工程的,你可以问:你构建了什么样的软件?你发现了工程的什么规律?如果这些老师号称是搞教学的,那如果她是计算机系的,你可以问老师:你如何启发学生认识并掌握计算机科学的客观规律?如果是软件工程的,你可以问:学生怎样从你这里学习到了编程技术,并掌握了软件工程的规律?

(4) 公司面试,如何看待面试前先刷题?

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

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

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

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

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

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

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

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

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

中国的大部分大学,培养学生的目的是让他们成为合格的职业人士;还有一些学校,要培养学生当科学家,当然也很好。不过,一些人把科学家和其他职业人士对立起来了。 科学家也是一种职业,不能以特殊性否定普遍规律 -- “我要培养白马,所以培养马的规律不适用于我“。  中国的大学在招 “科学家” 的时候,招聘流程和其他行业招人也很类似,说明也是按 “职业” 的规律来招人的, 而且有些学校通常会限定许多条件, 例如必须在国外获得某些学位等等, 这么说中国的大学培养不了科学家? 这不是和上面提到的中国大学主要目的互相打脸了么?

科学家(或者说科技工作者)也是一类职业,也有它本身的规律,也有原理,知识,技能。 它不是隔绝于其他职业之外,而是和其他职业有很多共性。成功的科学家和成功的其他职业人士一样,展现出良好的分析,表达,个人管理,时间管理的能力,正确处理 “合作+竞争”的关系,还有项目管理的能力,等等。 这些能力的获得,都需要练习,特别是 “专注的,有反馈的,持续改进的” 练习。为何这些技能不能在大学里训练呢?这样的训练不就是职业培训的一种方式么?

科学家作为一种职业,也要持续地给自己充电,有些通过脱产读更高一级的学位,博士后,有些通过出席研讨会、阅读、参加课程来学习。例如最近一些科学家都参加了如何使用 “云计算” 来帮助科研的课程,或者参加 “教育心理学” 的课程。科学家在参加这种课程的时候, 也有企业的人员或老师参加, 大家不都是一样职业的培训么? 为何看不起职业培训呢? 在培训过程中,有人获得顿悟,立即成为 “完整的人,高尚的人”; 也有人是渐悟,逐渐提高了自己的修养;还有人就是学到了一些技能,这也无妨,对吧?

 或曰:"大学是培养人心智的地方,急于把自己安塞到社会中的某个岗位会让大学生急功近利,失去本真的学习快乐。" 对IT 专业来说,心智如何培养?平时抄作业,考前哀求老师画重点,就能得到心智? 想偷懒,不想面对现实,那就直说,不要拿“心智”来搪塞, 要格物致知,要深入研究,练习,要分析IT行业发展的源和流。 没有脚踏实地的实践而奢谈 “心智”, 仿佛临渊羡鱼,或幻想空中楼阁。

 “大学之道,在明明德...”  , "为天地立心,为生民立命,为往圣继绝学..." 古人的话,真的很美。但别自我麻痹太多,现代的大学之道应该能分解为可衡量的,可执行的,可具体传授的各个部分。教育者要分而治之,把大学生的职业培养搞好,让大学生毕业后能跻身于一流的研究院或大学,一流的企业,或者,毕业生去了一些普通的单位,甚至没有单位,但是他们有信心在社会上自立。这,就是最基本的大学之道。

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

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

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

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

(11) 20几岁的软件工程师最担心就是:30岁之后怎么办? 30岁之后的软件工程师最担心的就是:35岁之后怎么办? 你怎么看?

21 世纪以来,中国大陆每年招收六百万大学生,其中的百分之十是在学习各种IT 相关的专业(计算机科学与技术、计算机工程、计算机软件、软件工程、管理信息系统等)。扣除读研究生(最终大部分也会走上工作岗位)、出国等分流,同时考虑到培训机构给就业市场贡献的大量劳动力,每年大致有四十万到六十万左右的“软件工程师”进入工作岗位。他们都是以什么样的心态对待这一职业的呢?在工程师抱怨这个行业的同时,我们可以由低到高,看看人们对职业的态度有哪些等级:

a. 临时的寄托或工作 ( Temporary Work)

在大学你会看到很多人选IT专业的原因和“热爱”没有什么关系,有些人是因为专业调剂来到这里,有些人是因为要拿一个文凭作为敲门砖(例如,跨专业考上软件专业的研究生,然后计划以硕士的资格去考公务员)。 他们处于低动力, 低技能的状态。

 b. 工作 (Job)

这就是一个能挣钱养家的营生,如果别的营生更赚钱,那就会跳到别的地方去。一些人留在这个职业,只不过是因为他不会做别的。这些人会经常问“软件开发做到35岁以后怎么办”这样的问题。当然,如果了解和体会了软件开发的投入和回报的关系, 这些人的心态会进步到下一个阶段.

 c. 职业 (Profession)

在工作的基础上,能加上职业道德,职业规划。只有在这个层次上可以开始谈有意义的“职业发展”。他们对“30岁以后”、“35岁以后”都有一定的打算。

 d. 投身的事业 (Commitment / vocation)

把软件项目相关的目标作为长期的承诺,碰到困难也不退缩,一直坚持到完成任务。

 e. 理想的呼唤(Calling)

一些人觉得这是理想的呼唤,通过软件可以改变世界,他们主动寻找机会,实现自己的理想。

  (12) 很多读者会问,  我怎么知道这个工作就是我的事业, 或是理想的呼唤呢?  我上课、上班不用心,正因为这不是我想投身的事业,我想投身什么我也不知道,但是肯定不是正在学习的软件工程!

这些读者可以参考一下 Emanuel Derman 的故事,他从小喜欢物理,认为这就是“理想的呼唤”,在名校拿了理论物理的博士学位之后,非常想做“纯物理”研究,很看不起应用物理,更不用说其他工作了。但是由于经济和能力的原因,他不得不去一般的大学做物理老师,和家人两地分居,郁郁不得志。在35岁的时候(很多中国IT人士认为是程序员的职业终点),他改行做了贝尔实验室某不太重要部门的程序员,在那里领悟到了编程的优美和挑战;几年后他跳槽去华尔街证券公司做程序员,第一个项目是把交易员用的命令行程序改造为GUI 的程序(听起来也不是很高大上),也经常被资深的交易员呼来唤去,令人不爽。但是他坚持学习金融知识,做各种金融分析,逐渐成长为金融风险研究的专家,部门总经理(也被公司解雇过);最后在实践中把金融,数学,和软件融合在一起,在这个新领域提出了有广泛影响力的新模型,被评为金融界的 “年度金融工程师”。他最后去一流大学开创了金融工程 (Financial Engineering) 这门学科。他回顾自己的职业经历时说: "回首当年,我(的态度)的确是错了。任何事情,当你仔细探究,你就会理解它的量和质;当你对一个领域的神韵足够了解,并开始连接这个领域的表现形式和实现细节的时候,任何一个领域都是会变得引人入胜的。"

再多说一句,这么多年之后,大家发现交易员的工作逐渐被程序和程序员取代了。 如果我们对职业有认真的态度,那就能发现很多证明个人能力的方式。

转载请注明:《 技术达人 邹欣 专访 | 我爱计算机