43 Q&A:聊一聊职业发展和选择 你好,我是景霄。

在前面几节课中,我分享了在FB工作的一些经验和感想,不少同学都提出了自己的困惑,也希望我能给出一些职业发展方面的建议。综合这些问题,我主要选取了下面三个主题,来说说职业发展、职业选择方面我的看法。

Q:程序员的岗位主要有哪些类型?我该如何选择?

A:无论是在求职阶段,还是正式进入公司工作后,你都会发现,工程师普遍按技术的不同,分为下面几个岗位。

  • 前端:包括移动(Android、iOS)以及Web前端(JavaScript、CSS)开发。
  • 后端(服务器端):主要是服务器端的开发,简单来说,就是输入为请求,输出为响应,发送给客户端。
  • 算法:主要涉及到的是机器学习,比如推荐系统如何更好地实现个性化推荐,搜索引擎返回的结果如何才能更符合地用户的需求等等。
  • 架构:涉及系统架构,偏底层,语言以C++为主。

从薪酬的角度来看,普遍来说:算法 > 架构 > 后端 > 前端。当然,这主要是由市场的供需关系决定的。

就拿算法岗来说,国内市场普遍缺少算法人才,也是因为这个岗位的培养难度更大,需要投入更大的精力。在顶尖互联网公司,参与核心产品研发的算法工程师们,工作三年,年收入100-200W人民币是很常见的。

不过,我这里所说的算法人才,绝不是指类似在校生那种,看过几篇论文,写过一些MATLAB,在学校做过几个科研项目的程度。算法工作岗位需要的算法能力,是你必须身体力行,有某些产品线的实践经历。还需要你真正了解市场,比如今日头条的推荐算法是怎样的,Google搜索引擎是怎么工作的,头条里的广告排序又是怎么做的等等。

再来说说架构,这也是目前一个热门的方向。我一直认为这是一个很偏工程、很硬核的领域,发展前景也相当不错,可以说是一个产品的基石。就拿刚刚提到的推荐系统来说,广告的定位和排序系统背后,都需要强有力的架构支撑。因此,这一行也可以称得上是人才紧缺,是企业舍得花高薪聘请的对象之一。

与算法不同的是,这个领域不会涉及很深的数学知识,工程师的主要关注点,在于如何提高系统性能,包括如何使系统高扩展、减小系统的延迟和所需CPU的容量等等。架构师需要很强的编程能力,常用的语言是C++;当然,最重要的还是不断积累大型项目中获得的第一手经验,对常见的问题有最principle的处理方式。

最后说说后端和前端,这是绝大多数程序员从事的岗位,也是我刚进公司时的选择。也许比起前两个岗位,不少人会认为,后端、前端工程师的薪酬较低,没有什么发展前景。这其实大错特错了!从一个产品的角度出发,你可以没有算法工程师、没有架构师,但是你能缺少后端和前端的开发人员吗?显然是不可能的。

后端和前端,相当于是一个产品的框架。框架搭好了,才会有机器学习、算法等的锦上添花。诚然,这两年来看,后端和前端没有前两者那么热门(还是市场供需关系的问题),但这并不代表,这些岗位没有发展前景,或者你就可以小看其技术含量。

比起算法和架构,后端、前端确实门槛更低些,但是其工作依然存在很高的技术含量。比如对一个产品或者其中的某些部件来说,如何设计搭建前后端的开发框架结构,使系统更加合理、可维护性更高,就是很多资深的开发工程师正在做的事。

前面聊了这么多,最后回到最根本的问题上:到底如何选择呢?

这里我给出的建议是:首先以自己的兴趣为出发点,因为只有自己感兴趣的东西,你才能做到最好。比如,一些人就是对前端感兴趣,那么为啥偏要去趟机器学习这趟浑水呢?当然不少人可能没有明确的偏好,那么这种情况下,我建议你尽可能多地去尝试,这是了解自己兴趣最好的方法。

另外,从广义的角度来看,计算机这门技术存在着study deep和study broad这两个方向,你得想清楚你属于哪类。所谓的study deep,就意味着数十年专攻一个领域,励志成为某个领域的专家;而study broad,便是类似于全栈工程师,对一个产品、系统的end to end都有一个了解,能够随时胜任任意角色的工作,这一点在初创公司身上体现得最为明显。

Q:如何成为一个全栈工程师?

A:相信屏幕前的不少同学是在创业公司工作的,刚刚也提到了,创业公司里全栈工程师的需求尤为突出。那么,如何成为一个优秀的全栈工程师呢?

简单来说,最好的方法就是“尽可能地多接触、多实践不同领域的项目”。身体力行永远是学习新知识、提高能力的最好办法。

当然,在每个领域的初始阶段,你可能会感觉到异常艰难,比如从未接触过前端的人被要求写一个页面,一时间内显然会不知从何下手。这个时候,我建议你可以先从“依葫芦画瓢”开始,通过阅读别人相似的代码,并在此基础上加以修改,完成你要实现的功能。时间久了,你看的多了,用的多了,理解自然就越来越深,动起手来也就越来越熟练了。

有条件的同学,比如工作在类似于FB这种文化的公司,可以通过在公司内部换组的方式,去接触不同的项目。这自然是最好不过了,因为和特定领域的人合作,永远比一个人单干强得多,你能够迅速学到更多的东西。

不过,没这种条件的同学也不必绝望,你还可以利用业余时间“充电“,自己做一些项目来培养和加强别的领域的能力。毕竟,对于成年人来说,自学才是精进自己的主要方式。

这样,到了最后,你应该达到的结果便是,自己一个人能够扛起整条产品线的开发,也对系统的整个工作流程有一个全面而深入的理解。

Q:学完本专栏后,在Python领域我该如何继续进阶呢?

A:在我看来,这个专栏的主要目的,是带你掌握Python这门语言的常见基本和高阶用法。接下来的进阶,便是Python本身在各种不同方向的运用,拿后端开发这个方向来说,比如,如何搭建大型系统的后台便是你需要掌握的。一个好的后端,自然离不开:

  • 合理的系统、框架设计;
  • 简约高效的代码质量;
  • 稳健齐全的单元测试;
  • 出色的性能表现。

具体来说,你搭建的系统后端是不是易于拓展呢?比如过半年后,有了新的产品需求,需要增加新的功能。那么,在你的框架下,是否可以尽可能少地改动来实现新的功能,而不需要把某部分推倒重来呢?

再比如,你搭建的系统是不是符合可维护性高、可靠性高、单元测试齐全的要求,从而不容易在线上发生bug呢?

总之,在某一领域到了进阶的阶段,你需要关注的,绝不仅仅只是某些功能的实现,更需要你考虑所写代码的性能、质量,甚至于整个系统的设计等等。

虽然讲了这么多东西,但最后我想说的是,三百六十行,行行出状元。对于计算机行业,乃至整个职场来说,每一个领域都没有优劣之分,每个领域你都可以做得很牛逼,前提是你不懈地学习、实践和思考。

那么,对于职业选择和发展,你又是如何看待和理解的呢?欢迎留言和我一起交流探讨,也希望屏幕前的一直不懈学习的你,能找到属于自己的方向,不断前进和创新,实现自己的人生理想。

参考资料

https://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/Python%e6%a0%b8%e5%bf%83%e6%8a%80%e6%9c%af%e4%b8%8e%e5%ae%9e%e6%88%98/43%20Q&A%ef%bc%9a%e8%81%8a%e4%b8%80%e8%81%8a%e8%81%8c%e4%b8%9a%e5%8f%91%e5%b1%95%e5%92%8c%e9%80%89%e6%8b%a9.md