前几天集团的TopCoder大赛上,遇到了一个程序员同事,闲聊中说起了他想转产品经理的想法,有点意外,但是在情理之中。因为以他所处的环境,在一定的时期内,他很可能产生一个错觉,并且将之误认为是程序员这个职业的“天花板”。
无独有偶,前些天,一个从大学期间开始至今我们关系不错的好基友,和我聊天的时候再次说起了想换工作,但是不想继续写代码了想法。但是想做什么,还不知道。
当初回国之前,我也曾经产生过写代码会写不动的想法,所以当时想趁着回国的机会,找一份产品经理的职位。当时一个好友对我说:“想都别想,因为你没有这方面的积累,成功概率不会太高!” 听人劝吃饱饭。谁让他对国内互联网环境比彼时的我更了解呢?所以,敲定了一份写代码的offer之后,我屁颠屁颠的回国了。
这一写,就是两年。两年的时间里,疯狂的成长的同时,也对程序员这个职业有了新的认识。尽管我现在的职位仍然是产品经理,但是负责任地说,回国之前那种“因为觉得自己写代码写不动了,而退而求其次找个入门门槛低的产品经理的差事谋生”的想法,已经不在了。
很多工作了几年的程序员可能都有会这样的迷茫,代码写多了,无非就是“增删改查调接口”,很容易就看到了程序员职业的天花板。其实产生这样的想法的程序员,是把自己定位成了一个coder的角色。coder, 中文翻译为“码农”。
我曾经和我的团队的小伙伴说:“不管你是什么学历,不管你是不是科班出身,你在这个团队里,我希望你能像一个工程师一样去思考问题,去做事,而不是把自己仅仅定位成一个coder。” 在我看来,工程师是一个脑力劳动者,coder只是一个体力劳动者。
程序员的价值,不单单局限于在屏幕前的有节奏的敲击键盘进行编码,还应该在于拿到需求之后的思考,分析,建模。编码只是我们工作的一个环节。coder 或者码农,更多应该是程序员这个群体用来自嘲的词,而不应该成为外界对我们这个群体的定义。
以一个程序员的身份,看待一名程序员可以发展的几个方向,列出来与大家共勉:
1. 深度方向
一个工程师要往高阶发展,必须同时强化几个技术能力:
设计能力:懂的如何利用分层、面向对象、设计模式等设计组织代码
编码能力:熟悉所使用的语言的语法特性,知道怎么用一两行代码代替初级开发者十几行甚至上百行代码
工程能力:学会如何快速构建工程,学会如何构建可读、可扩展性的工程,学会如何避免埋坑给后人,学会如何与人协作维护工程,学会如何保证工程质量,学会如何权衡利弊,甚至学会如何在困难面前妥协。
抽象能力:初级开发者通常会等到逻辑重复时再抽象封装(甚至怕拖进度或者懒惰而放弃),而高级开发者通常一开始写出的逻辑就为了以后的重用,并且深知一开始多付出的思考设计时间最终都会因为复用得到回报。很多开发框架就是一步步抽象/埋坑/优化而来的。
架构能力:一个业务系统如何划分模块,模块之间如何写作通信,每个模块的技术选型如何做,系统细节如何规避问题等等。
优化能力:学会如何评估、分析、提升系统性能。优化途径很多,产品功能优化、业务逻辑优化、基础技术优化、操作系统底层硬件的优化等等。
2. 广度方向
开发过程基本上离不开操作系统、存储、网络、webserver等等配套设施,因此这也是高阶必备技能。一旦业务系统出问题了,必须要能快速定位解决(不一定自己解决,但要知道找到哪个负责人来解决)。
比如存储mysql, 高级开发者会懂的利用索引、利用分表分库提高查询性能,懂的负载均衡和灾备提高性能提高可靠性(虽然是DBA的工作,但了解了有助于出问题时排查)。
比如缓存,高级开发者懂得如何有效且最大限度利用缓存系统提高应用性能。
比如http, 初级开发者往往只懂得http网络请求就只是一去一回两个包,高级开发者会去深究网络七层模型、会深究http请求的各个环节(DNS、三次握手等等)
比如web前端,学习如何依靠浏览器缓存、CDN缓存、压缩代码、合并文件等等提高前端性能,学习如何进行前端安全攻防。
3. 软素质
懂的团队管理,项目管理,沟通技巧等等。
那些想逃离程序员这个职业的程序员们,你们的想法应该被尊重,但是以上的这些,如果你没有想过,只是写了几年的“增删改查”,就觉得已经触及程序员的天花板了,你真的曲解了程序员这个职业。
程序员,是个很有话题性的群体,同时也是个很有创造性的群体。程序员是这个世界上,为数不多,可以把想法转变成现实的职业之一。那些看似动动嘴皮子的工作真的比程序员的工作轻松吗?不要忘记,人永远比代码复杂!