AI 老兵给年轻程序员的几点忠告

文:李烨,专栏作者,现就职于微软(Microsoft),曾在易安信(EMC)和太阳微系统(Sun Microsystems)任软件工程师。先后参与聊天机器人、大数据分析平台等项目的开发。

曾经,有位长辈很关心我的工作,特意语重心长的嘱咐:“你要小心,你会的东西千万不能教给别人。俗话说的好,教会了徒弟饿死了师傅。”

我知道,这位长辈真心是为了我好。在许多传统行业当中,也确实如此。而且,抽象层面,这番话的含义其实是:一定要保有自己在行业中的核心竞争力,才能够保有饭碗。这一点我是绝对同意的。

只可惜,长辈提供的具体战术在 IT 行业无效——IT 行业是一个讲求分享的行业,业内也有一句话:If you can’t be replaced, you won’t get promoted.

这句话有点 zhuangbility,不过换一句讲也没什么不同。在教育、网络资源空前发达的今天,一个靠在软件里敲代码创造价值的行业,实在没有什么“核心技术”是一个具备基本素质且能上网的年轻人获得不到的。

其他行业从业者耗十几年心力一点点摸索掌握的窍门,对应到 IT,多写几条 query Google 一下,从理论论文到工业实现到 best practice code 瞬间一网打尽。

那么什么是 IT 行业技术人员的核心竞争力呢?我以为包括如下四点:

  • 沟通能力

  • 学习能力

  • 全局眼光和行业洞察力

  • 创新能力

 I. 沟通能力

无需多言:和 Peer 沟通,和 Lead 沟通,和 PM 沟通,和客户沟通……体察对方,表达自己,将需求转化为 Design,将 Task 拆解为 AI 的能力。

就 IT 领域而言,除了双向的理解和交流外,还应注意,尽量让沟通高效,节约他人和自己的时间。

具体到细节,比如说:能 google 百度到的知识信息就不要问别人。沟通能力还包括宣讲/讲课和辅导他人的能力,越是资深员工对这方面的要求越高。

 II. 学习能力

不仅包括字面意义上的,通过阅读、听讲等方式习得新的知识技术的本领。还包括(更重要的),从实际工作中总结提炼的能力,即将现实问题转换为经验,并举一反三推而广之的能力。

IT 行业是当今世界发展最为蓬勃的行业之一,创新的旗帜集合了一群这个世界上最聪明最具活力的人在一起焚膏继晷地研发各种新技术——那种一旦被发明出来就可以让一群人失业的东西。

在这样的行业里指望靠着大学时上的几年课和工作最初几年的经验就从此高枕无忧属于做梦。行业在变,作为其中的一员,但凡还想吃这碗饭,就只能随机应变。身在 IT,拒绝学习==找死。

这两点,沟通能力和学习能力,是入门级核心能力。换言之,就是任何程度、级别的 engineer 必备的。

 III. 全局眼光和行业洞察力

即对本行业本领域前沿研究、工业实践的了解,以及以此为据通过理性分析获得的对于行业发展的前瞻性预测。

这一点,也是区分 IT 新手和老兵的试金石。一方面因为形成这种行业性的 vision 需要时间积累,另一方面也是因为,在一个日新月异的行业里,年轻人尚可凭借青春年华、无家庭拖累、天然的可塑性等,到变化已经发生后再做出改变。而年长者在丧失了年龄优势后和后来者竞争,则必须借助之前的积累。

相对于沟通能力和学习能力;全局眼光和行业洞察力提高了一步,应该算是中级核心能力。

 IV. 创新能力

这属于高阶核心能力。

创新一词一提出来,大家可能会想到原创。确实,无论任何年代,这个世界上的原创者都是当时人类中最具才智的一群人。

人类儿童期的东西方先贤哲人,原创了人类的思维体系;终结蒙昧时代的科学家,洞悉了宇宙运行的规则,原创了一套人类的符号系统及对自然界规律的描述方法;文学艺术上史留名的文豪大师们,原创了美和对美的欣赏……于本行业而言,那些著名算法、数据结构、开创性技术方向的发明人可谓原创者。

随便两个例子:

  • e.g1:有一篇微信传疯了的文章:《世界上最美丽的女科学家》的主人公,发明了“扩频通讯技术”的好莱坞艳星海蒂拉玛。

  • e.g2:Geoff Hinton,DNN,DL 概念的提出人和关键技术突破者。他提出的分布式概念表示技术到现在才刚刚开始工业应用,而这一理论是他在 1986 年提出的。

大部分成不了这样的人。如果不是追求成为顶尖高手,而只是追求在中老年还能作为一个 solidperformer 在 IT 行业吃口技术饭的话,其实也不必做到原创。但创新力还是至少要达到能和业内高手共振的能力,也就是能顺利理解和跟进。

以最快速度将他人原创应用到自己所从事的具体领域和正在实践的具体业务上,就是一种跟进式的创新。

比如做 DataMining,用现有工具做已经成型的事情,只能叫学习;通过读论文将新兴算法、方法应用到当前业务上,就可以算是一种微创新。

以上,比较抽象的列举了 IT 技术人员的核心竞争力。

职业发展

下面说一下 IT 技术人员的职业发展路径。因为我一直在外企工作,所以就以外资软件企业为例。不过根据间接了解,本土很多企业也与之类似。

一般而言,软件企业内部,技术人员在积累了一定的工作经验之后可以走两条路:技术和技术管理。

做技术就继续深入钻研,做管理就转型项目经理,然后沿着管理路线上行。做管理一段时间后大多会和技术分离,慢慢会远离技术。

不过也有一些企业不太一样。比如微软,Google,Facebook 更甚,就是技术管理不分离,即使做到高级管理职位,日常还要写代码。

总体而言,技术相对更独立,所谓 Individual Contributor。这倒不是说日常要一个人干活,沟通是必须的,不过,日常工作中“硬”技术的成分更多,所掌握的能力相对更通用一些。而管理路线相对和公司绑定更紧密,当然这些都是相对而言。

面试经验

下面说一下,engineer 面试的内容。根据本人被面试和面试他人的经历整理,专指 industry hire(社招)。

I. 面试形式

大多数面试分为 2 部分,phone interview 和 on site interview,还有些只有后者。onsite 就是到人家公司办公室去面试,一般都是多轮。最常见的,每一轮中 interviewer 和 interviewee 一对一。但偶尔也会有几个 interviewer 一起面一个 interviewee 的情况。

具体形式就是口头提问和写代码两种。写代码的话,大多数情况是让求职者写在纸上或者白板上,模拟推演,也有个别让求职者直接上机编程的。但即使上机,也都是不联网的机器。

II. 面试问题

具体的面试问题很多样,不过大概可以分为两类:项目经验和通用技术问题。

项目经验就是针对求职者之前做过的项目进行提问,大概会覆盖项目目的、内容、求职者的具体工作,应用技术,遇到过什么难题之类。

有些 interviewer 会让 interviewee 选一个印象最深的项目讲。这项考察,有可能是考察 interviewee 之前经验和未来工作的匹配程度;有可能是了解 interviewee 在原团队的地位和具体价值;也可能是以项目为实例了解求职者的技术能力;还可能是要了解求职者解决问题的能力。

技术问题可以很宽泛,一般来说,每一项求职者写在简历上说自己会的技术都可能被问到。但也可以笼统分为两种:具体技术细节,和算法。

技术细节(死考)

具体技术细节问题可能很基础。以 Java 语言为例,大致说明一下。

Java 技术细节,举个最简单的例子:Vector 和 ArrayList 的区别是什么?static inner class 和 non-staticinner class 的区别是什么?final,finally 的区别是什么?等等。

这些关于语言本身,属于最初级。略深入一点,一般会问线程同步的问题,例如:线程同步的方法有几种,分别怎么应用,有什么优劣?还有就是 Collections,Collection,基本每次都会被用到。这些都是信手拈来的例子。

和 Java 相关的还有一类问题就是 design pattern。这个其实不是语言问题,不过因为 java 特别适合写 design pattern,所以很容易考到。

还有一类,就是 JVM 相关的,也算 java 相关。GC 一般是必问的。或者会问一些优化参数,或者 outofmemory 了怎么办之类。

这类题属于“死”知识,背下来就行。虽然 JVM 调优这种没经验不太好应对,但总体是可以通过背记完成的。

算法(活考)

与这类题相对的就是算法题——让考生现场实现一个算法。这类题属于“活”考。

算法题又可以分为定式题和模拟题。

  • 定式题是指那种有通用固定解的题,比如这个题需要一种特定的数据结构(平衡二叉树、堆之类的);或者这个题可以对应到一种经典排序、查询算法;或者这题是 leetcode,topcoder 原题。

  • 模拟题则是指没有以上那些固定解,一般是有一个具体的问题,然后针对这个问题写特定算法。现在大多数求职者都会事先准备,有些应聘者会提前很久去 leetcode 上刷题。在这种情况下,模拟题就看出效果了。

算法题要注意的是:

1.完成功能的同时 bug free;
2.时空复杂度。

所有的算法题一定都关心时间复杂度,有些会关心空间。完成一个程序后,千万要保证 bugfree,然后再看时间复杂度,如果是 O(N2)或以上的复杂度,一般就没分了。算法题至少要在 O(NLogN)级别,一般要 O(N)或者 O(LogN),能 O(1)最好。

另外,算法题一般不会限制语言,用最熟悉的语言就好。

以个人经历而言,大多数公司的面试中知识题相对多一些,算法题较少。但也有些公司的面试,基本全部都是算法题。知识题偏重考经验,主要想要考察的是被面试者是否使用过这项技术,以及精熟程度。而算法题,基本就是考基础理论和智商了。

从 interviewer 的角度来讲,考知识题很容易,因为题是自己出的,事先记住答案就好了。而算法题对于 interviewer 也是挑战。因为要迅速看出 interviewee 写的程序是否有 bug,和时空复杂度是否合乎要求。如果在碰到自己不熟悉的语言,也会有点紧张的。

架构设计

还有,对于比较资深的人员,一般会考察架构设计能力。有可能是通过之前的项目,问有没有架构相关经验。

  • 如果有,是怎么做的,这样问比较实际;

  • 如果没有,可以虚构一个系统,请面试者当场设计架构。

架构能力是在总结项目经验和学习业界先进实践等过程中习得的。对应学习能力的第二层。

从新手到老兵

前几天听到有个人抱怨,说都工作好多年了,怎么还考算法,什么是时间复杂度都忘了。但是实际上,算法考察的标的,是我刚才列出的第二条核心竞争力:学习能力。

时空复杂度是一切程序的基础,真正被用户使用的应用程序,一定会关注性能。时空复杂度就是一切性能的基础。

工作多年有家有业的人不可能长时间什么都不干去刷题,遇到定式题和能搜索到的模拟题时,可能不如刚毕业的学生和新手熟悉,这个是客观存在的。

但是在算法上,达到一个及格水平,是任何年龄的人做技术工作的一个根本。你可以忘了 B 树的构建,但是不能连 quick sorting,binarysearch 都忘了。而所有算法的时空复杂度,只要知道原理都可以现场推出来。以忘了来解释不知道时空复杂是不成立的。

这也引出了一个个 IT 技术人员的常见问题:有工作经验的 engineer 和学生相比的优势是什么?或言,老员工相对新手的优势是什么?

其实也很简单,优势在于:核心竞争力 I,II 的高阶部分(属于沟通能力的宣讲/辅导能力,属于学习能力的总结提炼能力和架构能力),以及 III,IV 两点。

这里再强调一下第三点:全局眼光和行业洞察力(对应的英语词汇为 vision)——年轻人的学习能力虽然强,但是毕竟入行时间段,对于业界的总体 vision,一定需要时间培养的。老员工建立这种 vision,可以指导自己的学习,知道下一步应该学什么。

而且也应该知道自己的弱点在哪里应该补什么。年轻人学习起来容易不分主次,不得要领。那么作为有经验的人,则应善抓重点,虽然能用来学习的时间比年轻人少,但是对于时间的利用应该更高效。

另一方面,因为具体的技术工作总是在变,总是需要新的方法和工具,那么具备 vision 的员工也可以在团队的技术方向选择、工具平台选取上做出贡献。

个人成长

如果作者可以穿越回十数年前的大学时代,我会给当时的自己提什么样的建议呢?

我会这样说:

在本科时期一定要打好理论基础,数学和计算机科学理论的基础课程和经典书籍一定要学好。数学分析、概率统计、线性代数、数理逻辑,真是书到用时方恨少。

当年一堆看起来毫无意义就知道扭曲方程、矩阵的公式原来是从具体的实际问题求解中提炼总结引申出来的,也是现在解决实际问题的基础指导。

之所以学起来那样枯燥艰涩是因为期间的求解过程跨越了数十、百甚至上千年,我们有幸直接获取了既往一代代天才毕生研究成果的结论,实在三生有幸,居然没记住,或者给忘了,岂止是该打!

计算机类的课程,应该专注在数据结构、编译原理、操作系统等理论性强的课程,语言并非当时的重点。

计算机类的书籍应该读 Introduction to AlgorithmArt of Computer Programming 等的经典著作,而不是把时间浪费在 XX 天精通 XX 之类的速成书上。结合经典书籍练习算法远比做个炫酷的网页、动画有意义得多。

研究生时期,应该在实践编程的同时着力培养自己钻研的能力。虽然没有读博士,到了读研期间也有机会接触学术、理论。至少应该多读些领域内前沿的论文,并通过项目实现理论文章中描述的方法或技术。

工作的初期,则把重点放在 coding 本身。在最初两年内实现三万行以上的有效代码,才算是跨过了 IT 技术人员的第一道门槛。之后才能逐步把 focus 向上提升,指向架构层,同时不断总结个人经验,兼顾业界前沿技术和发展动向。

IT之幸与IT之殇

说到底,IT 技术人员,其实就是产业工人,和传统制造业的一线工人没什么本质区别。不同之处在于我们处在一个尚且年轻,新技术还在不断涌现的行业里。

行业的现状使得我们在拥有同样的资历、相似的能力时普遍比其他理工科系毕业的同学多拿了不少工资,但同时也的确承担了更多被淘汰出局的可能性。

任何一个行业,发展规律都类似。在初期急需大量人才,使得许多学习能力强的年轻人可以跨过很低的门槛涌进来。又因为行业本身正是社会热点,而为行内的从业者戴上了一圈既“专业”又“高薪”的光环。

随着行业向成熟发展,创新空间日益趋于狭小,行业壁垒逐渐稳定,而整体劳动的自动化比例会大大加强。行业成熟的过程,也就是挤压大量低层次 labor 的过程。当此之际,不求进取的结果也就不言而喻了。

本文经GitChat授权发布,转载请联系出处。

—end—

高手请留步

☟☟☟

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值