查看原文
其他

【第1384期】Cat Chen谈前端职业生涯重要的几个阶段

前端圈 前端早读课 2019-06-04

前言

今日早读文章由@前端圈授权分享。

正文从这开始~~

本文内容来自于CatChen在第四届FEDAY上关于“点开你的技能树”的演讲,没到现场的可以看看文字版。

下面是Cat Chen的演讲内容,稍做修改,全文有15000字,请慢阅:

关于这个主题主要集中在四个方面:

第一、自我怀疑一下,我们进入前端是否做出的正确的选择?

第二、一个常见的职业生涯模式,我们怎么样一步一步的往前迈进?

第三、在这个迈进的过程中,我们应该学习什么样的技能?

第四、是点题的问题,你的顾客是谁?

第一、到底前端是一个正确的选择吗?

我在我的职业生涯过程中,发现很多人会跑来问我这样的问题,就是到底前端是不是一个正确的选择。然后他们会分开来问一些子问题,例如说到底我进入了前端我应该做产品呢?我应该做基础架构呢?还是应该做产品基础架构呢?可能有些公司不存在产品基础架构这样的概念,通常来说的定义就是在于产品和基础架构之间。有点像是做一些框架、AB测试平台,测试工具等等的方案。其实一个更好的问题应该是问到底我想服务于什么样的客户?因为想要服务于什么样的客户才是真正决定了你要做什么?

如果你选择做产品,那么往往你服务的客户就是真实存在的用户,如果你选择去做一个基础架构的话,那么你服务的客户其实就是你公司内部其他的工程师,如果你做产品基础架构的话,那往往是在中间,可能你会服务一些内部的工程师,但如果你的平台或者框架是开源的话,同时你也服务一些外部的工程师。

当然,所有的这些选项都没有一个很清晰的界限。界限是模糊的,所以也没有任何选择是绝对的。如果你选择做产品,服务于外部的一些用户,那么首先,你需要找到一个让你觉得非常非常想要解决的用户问题,因为这才是你核心驱动力的出发点,你要先解决一个用户的问题,例如说我作为用户,每天用到这个东西不爽,我就是不爽,我决定用我的编程能力去解决这个问题,然后你才会有足够的动力把这个事情做得非常非常的完美。如果这是老板让你做的这个东西,老板叫你做这个功能,可能你觉得我也是对这个功能存在的意义是一知半解的,那你就没有实足的动力去把它做好。这个对你长远的职业生涯有什么影响呢?你去解决用户问题的话,那么你的机会是存在于大大小小不同规模公司里面,因为有不同规模的公司都在尝试解决用户问题,所以你将来的就业机会就会相当的广阔。

如果你选择去做基础架构,那么你服务的人群就是其他的工程师,那么这往往意味着你希望解决一个其他工程师的问题,或者说是一个工程性的问题,而且是希望解决的手段是提供一个可扩展的服务,你的客户往往就是公司内的其他工程师。那这样带来的第一点好处就是你可能会对他们有更好的同理心,你能知道我在这家公司内,我以前是做产品的,我就觉得这个存储服务很糟糕,一点都不好用,API设计完全不合理。我就知道这个CDN一点都不好用,我要去做个CDN我就不这样做。然后你就冲上去他把解决了。而且你能够很好的知道你自己想要什么,因为你原本就是自己的客户;第二方面是,一个更方便能够跟自己客户沟通的渠道,因为你的客户就是可能坐在你几张桌椅外、或者几栋楼以外的一个别的工程师,所以你想知道说这个东西好用吗?你不需要做用户调研,你不需要上线做AB测试,你直接跑过去问就可以了。比如说这是一个demo,你跑过去问一下,喜欢吗?这个API你会用吗?一看就明白吗?不明白是吧?那显然是我的锅,那我回去在改,对吧?

然而问题是说,如果你是做基础架构,那显然不是任何大公司,小公司都能够支付得起做基础架构的成本,所以你的就业范围往往就被受限在一些某个规模以上的公司里面,因为只有这些大规模的公司他才想到说,我需要做自己的基础架构,然后来服务于我自己的内部的其他的产品,但也有少数公司是自己做云平台的,那他可以说我做这个东西服务于我的内部的工程师还服务于我的其他商业客户。但小规模一点的公司,非常罕见。也不是绝对没有,有些创业公司是做云平台服务的,但比大公司要罕见得多。也比解决用户问题的产品公司要罕见得多。

那么如果你是做产品基础架构的话,那么你就站在两者之间了,往往也是说有一个工程性的问题你想解决,但解决的手段不是你提供一个可扩展的服务、可伸缩的服务,而是一个可复用的框架,例如React和React Native这样的例子,那么你的核心客户是谁?其实本质上还是你公司内部的其他工程师。

如果你开源的话,可能会有外部的其他的客户,然而这是有一个巨大的条件作为前提:

第一,你开源的东西能够影响公司在整个行业里的影响力和名声,让公司的名声变得更好;

第二,可能它能帮助到公司吸引人才,让其他应聘者说:“我喜欢这家公司,我之所以申请来面试,是因为你们开源了这个,是一个非常伟大的事情,我对你们公司非常向往”。

没有这两点的话,其实你想在一家公司做开源,是不太可能的。你要想想,还是回到那个问题,你的客户是谁?如果你的客户只是说是外部的工程师,开源社区的受益者,那谁来为你的工作买单。显然不是你的经理,显然不是你的Team Lead,显然也不是你的公司,因为他们得不到直接好处的话,是不会为这样的事情买单的。

一家公司如果允许你一直做开源,这开源都对公司内部其他团队一点贡献都没有,那结果就是要么公司解散这个团队,要么公司自己解散掉,因为你在做一些不符合经济规律的事情。

那跟做基础架构一样,你所能选择的就业范围是会受到一定的限制,因为只有在有一定规模以上的公司才会愿意支付代价来做这种项目。当然你也可以说:“我选择离开,我做一个纯粹的开源开发者,我做自由职业,我上Pinterest上面去赚钱”。这也是另外一条路。但是你选择在一家大公司里面就业,那可能更多的就是一家有一定规模的公司,而不是一家小公司。

归纳总结一下,我们可以得出一个很简单的抉择树,你想要解决的是什么人的问题?你觉得是最终用户的问题?这很简单,去做产品。因为那才是让你兴奋,让你每天白天想要做,晚上想要解决问题,不停想着,洗澡的时候也要想着这样的问题,但是如果你说,我想要解决的是一个工程性的问题,或者其他工程师也在感受的问题,那你要想想,你的解决方案到底是一个可伸缩的服务呢?还是一个可复用的框架?这决定了,你到底是去做一些基础架构的事情,还是去做一些产品基础架构。

下一个是我比较常遇到的问题是:我是应该做前端呢?后端呢?还是全栈?

同样,另外一个更直观获得回答的问题是,你应该问一下,到底哪一样能够让你更加努力工作,就是做什么事情能够让你更兴奋,不管怎么样,我也要做,就算老板不发工资给你做,你也要做,为什么这样说?因为这个选择只对你的职业生涯的前若干年产生有意义的影响,到了你的职业生涯的后期,所有东西都会收敛到一起,也就是说你不可能你只懂前端,也不可能只懂后端,当你成为一个技术大牛,或者技术总监,VP这样的角色的时候,你必须对下面子问题都有所了解,你知道问题怎么样分解,你知道这个问题分解下去之后需要有多大的成本解决、风险有多大、有多少的可能最终这个问题是解决不出来的,或者解决得不完美的。到了那个时候,其实你选择前端,后端,还是全栈这已经不是一个关键点了,你都需要要懂。所以唯一的问题就是说,什么东西能够让你的职业生涯的前几年尽可能的加速,哪要加速,其实事情还是在于你人本身,什么事情,什么样的问题能够让你这个人真的非常非常感兴趣,愿意加班加点也要去做,老板不发钱也要去做,所以我的唯一的建议,就是选择对你头几年发力最有帮助的一个兴趣点出发,然后把事情做好。然后之后就不在是一个问题。

接下来我们来讨论一个常见的,典型的职业生涯的划分方式,这是我个人的观点,我通常看到别人的话,我会按这样的方式来划分,在进行划分之前呢,首先我想做一个类比,不直接说怎么按你的技能,水平来划分,假如你的编程能力被转换成为你开车驾驶经验,你应该怎么样划分一个人的职业生涯?

第一阶段很简单,就是一个学开车的人,还没有驾照只能在别人的监控之下在路上开,或者在一个可控的场地里面开。

第二个阶段,领到驾照,现在可以自己上路随便开。

第三个阶段,有经验了,成为老司机。

第四个阶段,可能就像一个出租车司机这样的角色,可以从A点到B点很准时的完成。

第五个阶段,可能是自驾游这样的的规划者,我们现在组个车队,要从这里开去哪里,要开三天,五天,十天,怎么样能到?

第六个阶段,也是最后一个阶段,可有是一个探险队这样的级别,我们要去一个无人区的地方,正常来说,不会有人去的,但我们相信那里有一个宝藏,我们一定要去,所以来谁出钱,谁出力,我们去吧。

然后我们接下来一个一个的来分析一下,具体每一个阶段的特点是什么?

第0个阶段,一个学生这样的阶段,那么很多时候第一关键点并不是编程或者开车,第一个关键是明确你自己喜不喜欢驾驶的体验,你不喜欢,你干嘛去考个牌呢?你叫车就好啦。世界上不是说你必须要去考个牌的。

那么如果你发现你喜欢驾驶体验,而并不是为了家里要抽个签买辆车这样的原因,那我享受这个体验,就算我只是去学车,练习我也享受这中间的过程,当然作为学生,也有一些不那么好的地方,你开车不是安全的,所以只能在一个可控的范围内开,不能把你放在马路上开,把你放在马路上开,你会危急其他人。

第1个阶段,通过所有的考试,领到牌照之后,证明你可以自己开了。所以,你可以说,我很享受我自己开车的大部分的时间,我在路上开,我都是心情愉悦的。然后呢,有时候你还是会犯一些很傻的的错误,例如说,不该转的时候转啦,左转的时候转到错误的隔离带那一侧之类的,在所难免总是会发生。然后有时候,会有一些更有经验的老司机给你一些技巧,告诉你怎么样开车更好、怎样保养你的车更好。

第2个阶段,变成老司机了,那么你就可能会有一个安全驾驶的历史记录,你看,我多少年没有出过事故,3年,5年,然后给我一个GPS,我能跟着走,去哪里,一天之内的,GPS说得出来,我一定能去到。中间哪里去加个油,去个洗手间什么的不在话下,不需要人告诉我,我是一个成年人,我该去哪儿,我自然能去到。然后呢,当然老司机也有一个小问题,很容易被路上其他新手冒犯到。觉得这个人怎么这样开车,这样的车技也能上来呀?这牌照到底是买来的?还是垃圾筒捡来的?就会有这样的疑问。

第3阶段,成为一个好像出租车司机或者快递员这样的,到了这个阶段,基本上我列出来的点不在讨论你的驾驶技术了,因为这个阶段来说,你要非常准点和可靠的A点开到B点,这对于出租车司机来说是一样的,对于快递员来说也是一样的。就是你有一个从A点到B点的需求,驾驶技术不在是你的目的,他只是你的手段,你的目的是A点到B点。驾驶只是手段之一,然后B点有可能是一天能到的,但是也可能你要跑个长途,拉个货,那么可能是几天之外的距离,你怎么走?行程怎么规划?每天晚上睡哪里?这是你自己想明白的事情。然后有时候,你在路上开着开着,发现出事情了。举个例子,有人决定,我们要来广州参加这个会议,北京过来,不搭飞机,我决定开三天的车过来,开着开着,开到杭州,遇到台风,开不过来了,怎么办?这时候你自己要想办法找路走,绕开台风,还是如时到达,到不了,你就错过了这个会议了,这个你不能怪别人,只能怪自己,你去怪台风没有意义的,因为你不能说,因为台风出现了,所以我来不了了,所以你要赔偿我,台风不会赔偿你,你需要做的就是非常准时可靠的从A点去到B点。

到第4阶段,你会成一个安排更多司机一起协同去某个地方的的角色,例如说,我们组个青藏自驾游,哪现在谁有兴趣一起去?有可能没有人愿意一起去,觉得这个太无聊了,有什么好去的? 又有人觉得这个太危险了,不去。哪你要一个一个的说服别人,你看我们认识,其实这个目的地很好玩的,去到有很多很新奇的事情,我们可以看到的,在这个大城市看不到的,哪你要让大觉得非常Exciting,这个目的地我想去。然后你在去组织说,你要去这个目的地需要什么资源呢?是找个赞助商呢,来赞助你这次的行程,然后你帮他打打广告,还是自己掏钱去呢?这些都是你要能解决的问题。解决完之后,才决定大家怎么从A点到B点。这时候,从A点到B点的过程就越来越自由了,有可能有些人说我们开过去,有些人说我们要去目的地提前准备,你们过来就是扎营的,哪人家就提前飞过去了,这都不重要。重要的是,你的整个行程要安排好。要从A点到一个很遥远的B点。

第5个阶段,哪就是一个探险队,这就不能用现场的这种自驾的方式来比喻了,要回去想想,好像说,回到哥伦布发现新大陆的年代,哥伦布凭什么说服皇室说,来赞助一下我,出点钱,好让我有船,有人去找新大陆,哪这个事情是要想办法的,不是别人无端端会给你的。然后去哪里招来的船员,哪里招来的水手,哪里弄来的船,所有这些东西你都要规划好,然后你才有一支探险队,然后这支团队才会在你的领导下出发去寻找你想要寻找的东西。

所有这一切,翻译回来,用程序员的话说,你会发现很简单,很多东西都是一一对应的。

第0阶段,你作为一个刚刚学习编程的人,最重要的是,搞清楚你想不想编程呀,享受编程的话,哪你自然会觉得写代码很有乐趣,但是我们也知道,你的代码会有很多的bug,你需要有很很多的调试,就跟一个新司机在路上,不是哪么安全一样,如果你的code如果能够进生产环境,生产环境有相当的概率会倒掉。

第1个阶段,你成为新司机之后,你会说OK,我是享受编程的,我有一定的编程理念和方法了,我能自己做,但是偶尔还会犯一些小错误,哪么你要想办法自己去学习和修复,然后就开始从老司机哪里学习经验,人家说这个IDE这样配置比较好,可以让你的生产效率会更高,你就学着做,这样子写代码,能够更好的避免常见的错误,避免以后代码修改的时候引入不必要的影响,降低你犯错误的风险,哪可能你就照着做了。

第2个阶段,你进入老司机的阶段,你可能同样有很好的历史经验,你看我成功的发布了这么多新产品的特性,他们都能够得到很好的结果,这些特性发布的时候没有产生bug。然后写的代码,都是很容易阅读和很容易维护的,然后可以跟随着一个有效的项目安排,来完成一些项目。就是说,这个功能现在要做,2个月,1个月,你去做吧。可能不需要太多的帮助。PM说这个东西2个月做完,哪我就有计划的按步就般的就把这个东西1-2个月做完就可以了。2个月就说,QA过了,所有都过了,签字吧,上线,不需要额外的帮助。当然,类似的我们可能会觉得来了一个新手,这个人写代码,怎么这么烂呢?然后Code Review实施都不过,每次都Reject,你这样写代码不行,你哪样写不行,回去重写。这时候通常有经验的程序员,可以尝试慢慢的改变一下自己的态度,去更好的花时间去培养新人,去让他们了解怎么样能够增强他们的编码能力,他们避免犯错的能力,然后其实这对于自己也是一个提升。

第3个阶段,你作为一个出租车司机了,哪么很重要的能力就是和我之前说的一样,编程技术由目的变成了手段,你的目的是什么?你的目的是商业结果,你需要对商业结果负责任,商业需要从A点去到B点,可能是说月活要涨个5%,可能会说客户端应用崩溃率要减半,这些都是商业目的的结果,那你存在的意义就是对商业目的结果负责任。同时说是说,商业结果可能不仅仅是1-2个月之外啦,是3-6月之外啦,可以说月活在半年之后要增加20%,留存率不变,这就是我们需要的商业结果。哪至于怎么样做得到这个月活如此增长呢?这6个月你自己想办法想明白。没有人需要很明确的告诉你,做什么产品,帮什么新特性能够提高月活,但是你需要去自己想办法分析用户数据,找出来一个门道,然后把月活搞上去。这个时候你需要想办法,把这个工作切分下来,确认你每个月每天做什么,有时候就如同我刚刚举的例子,你从北京开车来广州,开着开着去到杭州了,发现台风你过不来,哪你需要有你的B计划,就好像你做月活,我们假设做这个优化,自然月活就上去,做着做着发现,这个东西做不下去了,我们市场可能变了,政府监管可能变了,竞争对手可能有新的产品发布了,导致这方面的改良计划不在有效了。哪么你就要去想办法应对,提出新的办法来绕过去,然后同时还是达到你原来的月活既定目标。

第4阶段,然后这时候就不是你一个人对一个商业的目标负责任了,而是你希望来带领一个团队,来完全一个更大的商业结果。哪么这时候你需要聚集一群人,说我们一起从这个地方到哪个地方去,目的地还是一个商业结果,哪么你需要让所有人都感觉到OK,我确实是想要去哪个地方。就能够协同一起努力来达到你想去到的商业目的。

这个商业目标有可能是一年以后,也有可能也是含糊不清的,含糊不清的意思是可能说我要达到商业目标是用户更加享受我们的应用工具,如何定义用户更加享受使用我们的工具,这是一个很含糊的目标,你首先要提出来用何种方法来测量,然后测量得到结果,你要如何提升,提升到什么程度,你才能说你达到到你的目标,你的客户更享受你的工具,这一切都是你要解决的,这跟你带领一个自驾游的车队一样,你先要说清楚,你要去哪里。然后让大家都觉得哪是一个可达的目的地,都愿意付出自己的努力,去到哪个目的地,然后你才能启程。

第5阶段,来到一个探险队的模式,哪就会更加难了,就是可能存在一个非常非常振奋的结果,就好像你说:我现在要开创一家公司,这家公司要解决一个现在没有任何一个大公司小公司解决的这个新问题,这个问题就我看到了,其他人都没有看到,你会说,这个商业目标能隐藏在一个难以触及的商业领域,因为往往只有这么巨大的商业目标隐藏在某个领域里面,才会存在这样的商业机会。你要做的事情,其实说起来很简单,但是需要的技能很复杂。说起来简单,你就是需要聚集一群人,让他们都能够跟你一起找这个东西,但这时候跟上一阶段不一样的是,你甚至你不能很好的说清楚B点在哪里,B点就好像说隐藏在一个山中的宝藏,隐藏在无人区的宝藏,你不知道这个宝藏在哪里,你只能去,然后你要想出一个系统的方法,去把它找出来,哪这么大一块地,宝藏到底埋藏在哪里呢?你是用什么方法来去扫描宝藏,如何系统性的划分这个宝藏埋藏的区域,使得你有尽可能的高的概率能够找到宝藏呢?哪这是你需要解决的问题,哪同样,你说,我现在要做一个新产品,你怎么知道你现在开一家新公司做一个新产品你这个产品的市场在哪里,没有人知道,这就跟寻找一个埋藏在某处的宝藏一样,你需要很多尝试的过程,你才能找到。我现在解决一个新的用户的问题,解决到这个阶段,我觉得我是足够了解我的用户,我知道我的用户在哪里,我的用户也知道我的存在,哪我可以慢慢慢慢的做用户的增长,让更多的用户来用。因为我找到了用户存在的Pattern。

接下来我们讲讲,既然我们如此划分了,在这些阶段里面我们需要学习什么样的技能?进入这个环节之中呢,就我可以说一下,很多时候大家之所以要讨论技能,我也发现很多喜欢问这样的问题,第一就是我是应该更加多的关注技术,还是业务?然后也有人会提问说,我在学习的过程中,如何在技术和软技能之间做出平衡?

然后我觉得唯一合理的答案就是:depends。要看你现在处于哪个阶段?要看你要看你对什么事情更感兴趣?而且还要看,你实际上要达成的目的是什么?

那么对于第一个阶段来说,首先我要看的是你要达成的目的是什么?

你开始学写代码,你有点印象,有点感觉,说我写代码是一个愉悦的事情,哪这时候你的目的很明确,你要写很多很多的代码,作为一个练习的过程,然后同时就是说想要有一个很低成本的配置环境,来减少写代码之外的开销,不要说我不会使用Linux,所以我要硬着要用Linux,所以怎么样,怎么样。我学习这个命令行花了半年的时间,这半年终于把我的Vim设置好了,或者我的Emacs设置好了,这才开始写代码,这浪费时间。基于这样的目的,你要学习什么样的技能。

第一就是说,你要在一门语言内要非常非常的affection,能够把哪门语言用好,然后对于前端工程师来说,哪意味着,学一些非常基本的HTML、CSS、JavaScript,不需要很精通,至少要到一定的程度。然而你学这门语言不一定是前端的语言,这门语言只是你迅速起步的手脚架而以,熟悉了任何一门语言,对你之后的发展学习其他语言都有帮助,然后最后就是说熟悉一门开发环境的配置,比如说迅速能上手的IDE, 一些很基本的Linux的命令,然后可能一些git的命令使得你要去下载一些网络上的repo,你可以下载呀。

经历了这个阶段之后,你就进入了第一个阶段,就好像一个新手一样,这时候呢?你的目标是什么?你的目标是你可以写代码,你可以写很多代码,但下一步的目标是你要写高质量的代码,同时你希望从其他人身上学习,不要忘了,这个过程是一个老司机指点你的最佳的过程,哪么,要达成这样的目的,第一,你需要开始采用一些流程和工具来让你的代码质量越来越好,然后可能说你引入一些coding style,我的代码风格是这样的,可以让我的代码更容易阅读,更容易维护,我引入测试,包括单元测试,集成测试等等,来使我写出的代码是健壮的,我将来自己维护也好,有人帮我维护也好,都是很容易维护的。

另外一方面是非技术性的,要学会提问题,这是非常非常重要的。对于这个阶段来说,第一,是非常基本的,让自己能够感觉到舒服的向别人提问题,这很奇怪,为什么要列在前面?其实观察这个阶段的很多程序员,大家会害羞,觉得我问这个问题是不是太蠢了,或者我问这个问题,会不会让大牛觉得我非常的肤浅,这么简单的东西都不明白,他就不想理我了,你需要跨越这样的心理障碍阶段,能够很舒服的提出问题。

第二点是说,在什么都问,什么都伸手党 和 什么都自己都研究不敢提问之间做一个很好的权衡,一方面你既不能伸身党,什么都想都不想,自己没有做过任何研究就去问,但另外一个方面,你也不能说这个东西我研究了一个星期,还是一点动静都没有我才去问吧,相当于浪费了一个星期的时间,所以你要找到一个平衡点,比如这个东西搞了1-2小时,毫无进展,哪速度为0对任意多的时间的积分产生的距离还是0?所以没有意义的,如果你发现你的速度为0,接近为0,搞了一段时间之后,你是时候去问人了。别人帮助你,使你速度从0变成一个有意义的小数了,你可以慢慢的越走越快,越走越快,但速度是0,是一个最艰辛的阶段。你需要获得帮助。

然后,最后就是如何提好的问题,不要直接提你眼见到的一个很精准的很小的问题,或者很技术性的问题。要提供更多的上下文,我为什么要解决这个问题,是因为我要解决一个更大的问题,为什么我要解决一个更大的问题呢?是因为我有一个更大的商业问题需要解决。哪可能别人会告诉你,其实你不需要解决这个小问题,因为你的大问题的解决方案就是错的。首先你要把你的大问题的解决方案改掉,你这个小问题就绝对绕过去了,不存在了。

第二个阶段,到了一个老司机的阶段了,这时候你的你的目标是什么?设计和维护高质量的系统,然后有一定自己在编程方面独立自理的能力,自己能够搞掂自己,不需要太多的依赖于别人,除了一些非常难的问题,更多的时候,你交给我一个技术性的问题,我自己可以研究出结果来,我不需要靠问。

下一点,就是开始去对其他的更Junior的程序员提供一些指导性的建议呀什么的,哪样达成这个目标,第一点,你需要学习一些与系统设计相关的东西,哪系统设计说起来好像很复杂很复杂的样子,前端,后端,大规模系统,分布式系统,但核心是什么?但是核心就是说,你要分析Tradeoff 是什么?任何东西都不可能做到完美,当一个复杂到一定程度的系统,完美是不可能存在的。更多的是说Tradeoff在哪里?你在这里Tradeoff权衡之间如何做出选择,有了这些关键能力,你在去应用他来应付不同的技术框架。

然后,第二就是说,对于当下流行的技术要有一定的了解,不需要非常深,你需要知道说,我做一个系统设计我依赖于这项技术和依赖于哪项技术之间产生什么样的差距,我到底应该用React来写呢?还是这个东西实在是太少了,连React的体积都不值得,我自己就调用DOM API 就写完啦,这是你需要想的,Tradeoff是什么? 想明白。但你也要懂一点现代技术有什么?React是存在的,我有React这个选择,我也可以跑回去用jQuery,是不是jQuery写这么简单的东西比React更快。

第二项重要的能力是什么?是高效的debug的能力。因为你开始遇到越来越复杂的技术问题了,很多技术问题的难点在于你要debug,尤其是你作为一个有几年工作经验的,在公司里面,通常你有合理的概率你会接手到一个难维护的系统,如果你没有这方面的能力,扔一个开发了3-5年的遗留系统给你,你会发现你hold不住,哪这时候怎么办呢?没办法,哪这方面,第一就是,你要觉得我可以接手一些有一定体量的遗留系统,我有胆量去接,而不是说,这个东西有这么多遗留代码,有些是三年前写的,有一些是五年前写的,完全看不明白,看得明白第一行,看不明白第一个文件做什么,哪这时候就不行了,因为这是你的工作需要,你要觉得这样OK,我可以接这样的活,

哪接下来就是说,你要懂得使用二分的方法来找到你要debug的东西在哪里,哪么对于前端程序员来说,很重要就是要学会灵活的运用Chrome的DevTools,或者其他浏览器里面同样的调试工具,因为你做前端,其实说起来就是二分查找调试有意义,但是你还是需要有一个非常顺手的工具,你才能做完理论上的二分查找。哪最后就是你还要懂一点服务器端的调试,如果服务器返回一个JSON给我,这是一个非法的JSON,它根本就不能pass,这样就不管了,Bye-bye,这是不行的,你要去找出服务器为什么给你返回一个非法的JSON,然后你要把问题解决掉,否则的话,你还是做不成你想要做的事情。

哪么最后一点就是你需要去Mentor一下比你资历没有这样深的程序员,哪么第一就是说,你需要包容其他人瞎搞,你要有能力去包容其他人瞎搞,因为每个人成长过程都是这样的,需要经历过一些瞎搞的过程,如果你说,你这个人进来,看我做事情的方法很牛逼,你一定要按照我很牛逼的方法做,这是不行的。你团队中的新人很快会觉得说,头三个月会觉得这个人超牛逼,我问的什么问题,他都能解答清楚,这个遗留系统这么庞大,完全看不明白,吃不进去,问任何一个领域的小问题他都能够解答清楚,但有一个问题,这个牛人一定要让按照他指定的方法解决问题,哪可能三个月之后,这个年轻人就走了,他觉得说没有意思,这个牛人是很利害,他能回答所有的问题,但是我每次写出来的代码,他Code Review的时候,就直接要我改,说我写的方法和跟他想要的方法不一样,改着改着,我就觉得不耐烦了,我不想干了,因为学习的过程就是通过瞎搞胡弄慢慢慢慢搞明白什么是正确的方法,别人抓着你的手,一定要按照他要的路去做,这是不行的,所以作为一个有经验的程序员,别人要瞎搞可以,我想清楚,你到底要怎么样瞎搞,对商业会不会有很明显的负面影响,是不是有可控的负面影响,如果对负面可控,去瞎搞。我要允许你实验,这才是你正确的成长过程。

下一步就是分享你的经验和知识,哪应该很简单,很多人都会,有一定的经验之后,就会做技术分享。

下一阶段就是说像出租车司机这样,第一,你要明白B点在哪里?对于前面几个阶段的人来说,请问我们团队什么样才叫成功?这些人通常是答不出来的,因为没有到这个阶段,他不知道,但是对于一个到了第三个阶段的人来说,通常你问这个问题,你是希望他是能够答得出来的,他说现在我们有一个产品了,这个产品已经找到了准确的市场定位,进入了一个快速增长的阶段,所以这个产品的目标是一年之后,月活要翻一翻。OK,这是一个及格的第三阶段的程序员,因为他知道团队的商业目标在哪里,然后他才可以使用自己的执行力去帮助团队达成这个目标。

接下来就是说,他需要有一个可靠的方案来达成目标,团队说,我们日活要翻一翻,哪这个阶段的程序员至少会说,我3-6个月之后,我有这样的一套方法能做到月活涨到10%-20%,哪慢慢做完,做完10个月,能做到月活翻一翻,而且团队里面也不仅仅只有我一个人,还有其他人,他们做的东西也会对月活有贡献,哪么这样才能做出来整个团队的目标的结果。

然后对于这个阶段的程序员来说很重要的就是要能够测量你到B点的距离,月活可能很容易测量,给你一个方法说这叫作月活,数据报表上面就是这样子的,月活到翻一翻有多远这是很容易测量的,但是有一些其他问题,不容易这么测量的,你要找到一个有效的方法来测量,离你的商业目的距离有多远。然后有时候,你还需要管理其他人对你的工作的期望。

你说我要能做10%月活增长,3个月就能做到,哪万一你做不到呢?哪可能你做了2个月才发现,原来我的项目计划是错的,我现在才做了5%,第三个月做完最多就8%,哪如果你不能管理其他人的期望,让其他人对于你三个月以后的结果感到非常的意外,哪可能你就你的结果就没有这么好了。

哪因此对应的这个阶段的程序员来说,以下一些技能是非常重要的:

第一,你要明白你的商业目标是什么,这依赖于两项技能,第一是书面和口头的沟通能力,因为商业结果并不是代码里写着明年的月活目标要翻倍,你有看过哪个在你的代码里面吗?没有。这依赖于你的沟通能力,或团队的leader,或者更上级的leader没办法把这个事情说清楚,哪你要有能力去和他沟通,要问清楚,要让你个人能够理解到,也就是说,领导的精神他不主动传达给你, 你要有能力去把领导的精神拿回来。明白你团队的目标是什么。

然后第二个,你所在的商业领域基础的理解,你是做哪一行的, 这一行什么样才算成功,如何恒量成功,如果这些都不懂,你也没法理解你团队的商业目标。

然后接下来就是一些做路线图的基础能力,比如说我明白和定义我们团队任务是什么?目标是什么?时间线怎么定?比如你要做到6个月之后,这么多的月活。哪三个月应该有什么样的结果,或者每两个月有什么样的结果,多久一次迭代,每次迭代到底要走多远,这些要能定下来,要管理你的Stake holders,要管理你的dependencies,例如我现在要做的东西是基于React Native,我是做产品的,但是我需要某些新特性,看着React Native的新版本发布才有,哪万一React Native说了他们的路线图什么时候下一个版本什么功能,如果它的发布推迟了,我能管理好吗?我还能发布我的功能吗?哪这是你要想清楚的。

最后就是管理风险,就好像我刚才所说的,你肯定会有不同的依赖,像可能有对外的框架库的依赖项,也可能公司对内的,我做这个产品,我发布我需要法务的评审,然后我需要市场的配合,新产品一发布,市场就要上来做广告,万一市场到时候说,预算还没有到手,做不到marking contain,你怎么办所以更多的细分下来,第一,你要能够跟踪进度,跟踪进度的具体做法就是你要有一些指标,你要定义好指标,通过log从你的生产环境把指标的数据收集回来,然后你要管理其他人对你的团队和你对你的期望。用最简单的一句话,就是好像你带一个小朋友开车上路,他整天会问:我们到哪儿啦?到了吗?还有多久才到呀?你要理解到这是你团队的leader或者更高的领导经常想要知道的问题就是我们到了吗?为啥还没有到?我们多久才能到?

其实处理这种问题,跟你开车过程中面对的同样问题是没有区别的,你要能够管理好他们的期望,要给给他们一个合理的答案。

同时就是说,你要做风险管理,风险控制,你要正确的识别出可能存在的风险。就好像我刚刚举的例子,你从北京开车到广州,天气预报说上海、浙江一带可能有台风,哪你怎么办呢?你是提前绕路走?还是说,不管,先开过去,因为我有一个后备方案,开到了真遇到台风,要怎么样避开是要想清楚的。还有就是你要有容灾方案,容灾方案你也是需要想清楚的。

然后再下一步,更多的就是如何扩展你的技术的广度和深度,然后这时候,虽然你会在前面第0个阶段和第二个阶段你会不停的练习你的前端的技能,但是到这个级别了,你会发现其实我还有很多其他东西要学,然后不仅仅是HTML,CSS,JS就能解决问题的,你可以说网络你要懂,你能调试吗?你能知道HTTP/1.1 和 HTTP/2 怎么工作吗?哪如果工作的过程中, 不符合你预期的bug出现,你有办法调试吗?用什么工具来调试?你是只能用Chrome来调试呢?还是说可以把一个Wireshark掉上去,去看一下TCP DOM出来的结果是什么?这就是截然不同的技能级别,然后可扩展性,可伸缩性,你需要知道的是网络的流量是怎么样做负载均衡的,对于很多前端开发人员来说,尤其是在大公司,这可能是从来都不会提出的问题。你看,这个东西我写完了,服务器端的代码能跑啦,跑起来JS,CSS都加载了,不就出来了吗?但是这怎么出来的?你的大规模的群集是怎么做负载均衡的?如果你的一个数据中心倒了,你的数据还能出来吗?他能切换到其他数据中心去,其他数据中心还能抗得住吗?是做4层的负载均衡,还是7层的负载均衡?这些是你要知道的,你才能够理解什么是PoP呀,以及CDN怎么工作等等这些概念,然后安全相关的,你也需要扩展一下,你要知道XSS,CSRF,HTTPS怎么运作,HTTPS上面到底有哪些TLS的扩展,这些扩展都是做什么用的,比如说两个HTTPS的域名共存在一个AIP上,怎么办呢?他们能解析吗?他们能连接吗?能连接的话,有什么缺陷吗?这些是你需要理解TLS扩展,你才能知道的答案,最后,到这个阶段,往往你也需要真心的要关注一下和性能相关的东西,包括如何做测量和如何做优化。当然你也需要扩展一些非技术性的能力,包括设计呀,界面设计,交互设计,用户体验设计,数据分析能力,项目管理能力,因为你有了这种能力,你才能够兼顾一些团队内其他角色可能做得不哪么好的,或者做不到你预期的的东西,当这样的事情出现的时候,因为你需要对业务负责任,所以你必须要有能力去做好。

第四个阶段,首先要来钱,为什么你的团队还在,为什么没有被公司断奶,你的公司没有倒掉,一切的根本问题就是钱从哪里来,所以第一个问题就是你要来钱,你要么说我创立一家公司,别人给我投天使轮,哪么你在大公司内,我要带领我的团队做一件新的事情,哪你想办法说服你上面更高级的leader,同意说,我给你HC,你去招人,接下来,你要有人呀,不行,还不够,别人要想和你一起干,他们做着做着就没有动力了,就开始打酱油了,哪你有HC也没有用,有钱其实也没有用,所以你要召集人,让人觉得你这个商业目标我有兴趣去做,哪最后,说起来是很简单,其实最后真正最复杂的部分就是执行怎么到达B点,哪么你需要一些技能是包含领导力,领导力其实可以拆成两个部分,一个部分是vision,你要有办法找到一个对的愿景,第二部分,是很多人都会忽视的,就是理解人。你要理解人的动机是什么?哪这你需要把跟人的交互慢慢分解下来,跟别人交互,我们讨论的是事实,什么时候背后的驱动力是情绪,还有什么时候背后的驱动力是信仰,往往能够驱动一个人去非常努力的去给你团队干活的是靠后的两者,就是情绪和信仰。而不是事实。事实说我的框架是对的,我的商业目标是对的,这能对你的驱动力本身是不够的,你需要的是一个人的情绪和信仰去驱动他,这样子他才能够给你足够好的后果或好的结果。接下来呢,还有你销售的能力,否则从哪里找来钱,要有一些战略性思考的能力,然后也要有资源分配和计划的能力,你有钱啦,有人啦,但怎么高效的把钱和人利用起来,达成你的目标是你需要知道的,然后同时你也需要技术的,就是增强你的技术能力,怎么说来做一些可扩展性的东西,分布式的计算,分布式的存储到底是怎么样做的,然后你可能需要去管一下发版,发版怎么发?对于很多做产品的工程师会觉得,我把代码提交上去了,自然下一个版本就出去了,哪里需要怎么发版呢?不需要知道后台怎么样编译的,这个东西如果进了App Store会怎么样?会怎么审批,或者其他又怎么审批,我不懂。到了这个阶段,可能你就需要知道了。最后你就是需要了解一些与Web没有关系的其他方面的前端,就好像iOS或者安卓,或者桌面端,你的产品形态可能不仅仅受限在Web,当然同时你还是要继续拓展你的非技术的能力,是招聘,培养人才,管理人才,其实你可以看看很明显的模式就是所有的东西跟人相关的,到了这个阶段,你会真正的理解到我为什么说,人是你最重要的资源。因为你没有人,你什么都不用干了。所以你要有能力把人招过来,或者忽悠过来,然后要把他们培养好,他们有能力做你希望他们做的事情。然后要管理好他们,不能让他们打酱油。

第五个阶段,哪你的目标就更难达到了,证明有一个Reasonable 的ROI,如果你能找到B点在哪里,没有人能够通过很简单的用数据说法的方法说明这个商业目的到底能不能达到和达到了之后一定和。但是你要有方法说明是事情有风险,但是这个风险是合理范围之内,是正的,所以我们应该去,这个好的商业结果我可以拿到手,哪接下来就是你要拿到足够的钱和去做,因为这需要更多的人和更多的钱,最后就是去到B点,哪技能方面,这个已经办法很深入的去讲每一个具体的技能,第一就是让,要让你之前的技能每一个都,就是扩展出去,提高你的深度和广度,而第二个,其实是很重要的,开始要有跨界,跨行业这样的技能,就是你不仅仅只呆在一个前端程序员、前端工程师或者工程师的级别中,因为你可以看一下哪些真正带领更大的团队来达成一个可能可达成的不可达的商业目标,你会发现,他们不已经在乎他们原本出身是程序员呢?设计师呢?还是PM呢?还是数据分析师。这一切都不重要了,重要的是到了哪个领导力的级别,有能力去找到一个足够重要的目的地,说服公司给投资之后,他们下面要能够领导这些所有这种不同的角色,然后协同分工,把事情做出来,最后达到这个商业目的的结果。

所以到了这里的时候,这也很好的说明了我原来的这个说法,前端,后端,全栈其实不重要了,因为最后当你来到这个阶段的时候,比如说,我要创始一家新的公司,哪其实没有人会问你说,你作为一个创始人你的技能最重要的,最有效的是什么技能呀?更多是你能不能把团队组起来,你的团队组起来之后,到底技能怎么互相补充,能够做成你想要做的这件大的事情,这就是最后一个阶段的需要的技能。

最后一个小结,就是回顾前面所说的,点题的一个问题,就是说你做这一切,其实如果真的要去驱动你去思考我该怎么正确点开我的技能树,我要达到我的目的地,我接下其实真正你需要问的哪个问题是,此时此刻,我在这个阶段,顾客是谁?这是最重要的一个问题,或者我们可以换一个角度来提这个问题,如果我成功达到我的目标,什么人的生活会变得更好。以何种方式变得更好,如果你能够很清晰明确的回答这个问题,其实你的方向会很明确,该学什么,该做什么,最后要到哪里,你都是可以自己回答的。或者就算不能自己回答,你也可以知道去找哪些人提问,通过哪些途径获取到你想要的答案。这时候你已经有一个可靠的方法到达你的目的地。

所以最后我想说一句话就是:明白这个问题,然后所有其他的问题都会变得简单很多。

关于本文
作者:@Cat Chen
原文:
https://mp.weixin.qq.com/s/-aB5gWesz6EowdIiRVkfNA

最后,为你推荐


【第1074期】写给前端应届生的职业规划建议


【第412期】谈前端工程师的职业规划

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存