最近杂七杂八写了一些东西,其实主线一直围绕了程序员职业生涯这个主题,也是我春节读书思考的一些成果。文章比较长,断断续续发在了 MacTalk 上,但总归不是一篇完整的东西。今天重新整理修订,形成了一篇完整的文章,题目就是:关于程序员职业生涯的八点感想。
说的是程序员,其实很多东西是相同的,如果你也在互联网行业,应该会有点帮助。
一、程序员是个好职业
工作了十几年,到今天为止,我依然认为程序员是这个时代很好的职业。是不是最好,不敢确认,毕竟没离开过互联网行业,就像你只懂中文就很难说中文是世界上最好的语言一样。不过最好的之一,总归是有的。无论程序员自嘲也好,被误解也罢,甚至被其他领域的人黑到了喜马拉雅山的高度,但不可否认的是,大部分程序员都是在空调房里敲敲键盘就有可能冷不丁改变了世界,并且,大部分时候,我们都让这个世界变得好了一点点。与很多职业相比,程序员的投入产出比都算高的,稍有智力门槛,也没比其他行业高多少。而这个时代,给了程序员们大展宏图的机会,给我们足够的自由度去创造我们想要的东西。
至于传说中的「程序员职业病」,其实和程序员这个职业并没有多大关系。越来越多的互联网公司为员工提供了各种福利,免费的健身房,舒适的桌椅,香浓的咖啡,甚至一些娱乐设施。自己不运动,其实很难怪到这个职业头上。另外,程序员的工作也「并没有想象的那么辛苦」,所以,遇到头脑清楚逻辑清晰又喜爱计算机并且没有远大的志向进入其他领域的年轻人,我总是对他们说,来做个程序员吧,这是个能让你的生活变得精彩的职业。
二、程序员是一个具备长久生命力的职业
我大学刚毕业的时候,程序员还是一个稚嫩的职业,那个年代,身边的人们没见过35岁以上的程序员。于是很多人告诉我,程序员是吃青春饭的,你在国内见过35岁的程序员吗?我说,没有。
就是嘛,所以要尽早转行呀……
这种话听得着实不少,事实上也真的有很多程序员早早转行了,我没转不是因为内心强大,而是比较单纯。35岁,听起来像光年一样的距离,谁会考虑那么遥远的事情。所以我什么都没想就继续编程了。
35岁转瞬即至,除了过了个普通的生日之外,什么都没有发生。我依然在活蹦乱跳的编写程序,偶尔向周围稍稍四顾,身边的朋友要么在某个技术领域成为行家里手,要么在做产品的同时写书分享,有的设计出了千万人使用的软件,有的则成为了一个纯粹的管理者,经营着上千人的机构。这些人从前是程序员,现在也是。
随着互联网行业的成熟,程序员在成为风口浪尖人物的同时,也逐渐规范和传统化,与其他行业的工程师一样,程序员们在自己的领域有深耕,有转化,有思考,有沉淀,稳步前行。
毫无疑问,程序员是一个具备长久生命力的职业。
三、程序员不一定要写一辈子程序
以前人们总是说年龄大了就不要写代码了,或者说写不动代码了。现在多少有点矫枉过正,比如 CTO 怎么能不写代码呢,写代码可是一辈子的事呀。在我看来,这个问题根本没什么可以争论的,一个阶段一种做法。如果你写代码是最有价值的,就去写代码。如果你做产品是最有价值的,就去做产品。如果你去管理公司是最有价值的,就去管理公司。去年参加极客邦硅谷行的时候和七牛云的创始人许式伟聊天,我说老许你还在写线上代码么?老许说,不碰代码半年多了,我需要从更高的层面上去把握七牛的方向、人和事。
老许比我牛得多,是一位非常资深的程序员,热爱编程,可以说写了半辈子代码,即便如此,在这个阶段,显然有比写代码更重要的事情等着他。前一阵子看过一篇文章「扎克伯格开发笔记:打造 Jarvis 的日子」,扎克伯格在文章里写到:
2016年我给自己制定了一个挑战:打造一个像钢铁侠里 Jarvis 那样的家庭 AI 助手。
在这一年里,我打造了一个可以通过手机和电脑进行对话的 AI 系统。它能够控制我家里的灯光、温度、电器、音乐和安防系统,而且这个 AI 还能了解我的品味和习惯,可以学习新的词汇和概念,甚至可以逗我的女儿 Max 开心。Jarvis 是由 Python、PHP 和 Objective-C 编写的,运用了包括自然语言处理、语音识别、面部识别以及强化学习在内的人工智能技术。
扎克伯格是为了编程而编程么,显然不是。除了保持技术的敏感度,他主要是为了了解人工智能发展的现状。通过挑战熟悉 Facebook 的工程师们使用的内部技术,同时了解智能家居。而且,这些工作仅仅占用了他很少一部分时间。
实际情况也是这样,与我一起成长起来的七零后程序员,差不多有超过一半,他们的工作重心已经不再是编码,而是其他工作事务,另外一半则依然以编程为主要任务。这两种状态,都是很好的存在。
四、入行三五年
以我并不丰富的程序员阅历来看,入行三到五年的经历对程序员以后的职业生涯有非常重要的作用。互联网时代学习环境开放,资料浩如烟海,很多大学生在走出学校大门的时候,很可能在某项专业技能上已经达到了很高的水准,但是这三到五年的探索,依然是不可或缺的。
很多人喜欢制定学习计划,但这些计划大都无法执行下去。不是计划出了问题,而是人学习和提升的方式很难按部就班,很多时候我们都是在摸索前行。就像你今天按计划要耕完一亩田,作业进行到一半的时候,你发现一块土质的异常,于是深挖下去,用镰刀割去杂草,用铁锹铲除泥土,用钻头钻出深洞,最后发现了一口油井。如果你按照计划耕完这一亩田,可能永远发现不了那口井。
我相信每个人身体里都有某种特质,这种特质让你在某个领域取得成就的可能性远远大于其他,这种特质也能让你异于他人。但是,人们并不是生来就知道自己擅长干什么的,需要花时间去寻找,找到它,然后去做自己最擅长的事情,这对你漫长的职业生涯是一笔巨大的财富。
需要五年这么久的时间吗?依我个人的经历,恐怕更长也说不定。无论程序员也好,软件工程师也罢,叫着简单,领域知识却是浩如烟海。进入现代互联网阶段,程序员的领域细分到了令人发指的程度,比如 XX 语言工程师,前端工程师,后端工程师,架构师,大数据工程师,安全工程师,运维工程师,移动开发工程师,DBA 等等,叫法繁复,甚至职能重叠,这些角色最初都叫做程序员,最终他们像一棵大树,枝条粗壮,蜿蜒生长,然后在树冠分开,并结出了各种各样的果实。同时,每个细分的领域又会衍生出浩瀚的领域知识。
比如编程语言,常用的编程语言就有几十种,静态语言,动态语言,脚本语言,函数式编程,面向对象编程,过程式编程等等,从平台角度,Java VM 上有 Java,Scala,Groovy,Clojure,Jython,Ceylon 等,.Net 平台上有 C#,J#,F#,VB.Net,VC#,ASP.Net,移动平台有 iOS,Android,Windows Phone……
即便我们把目光聚焦在一门语言或技术上,Java,你也不可能仅仅掌握它的语法特性和函数库,然后写写业务表单和增删改查就完了。Java 的虚拟机、性能、并发编程、Jit 技术、垃圾收集、集群、分布式、异常、日志服务,还有大量的 Java 平台开源项目,都需要深入了解。除此之外,一些数据结构和算法也是程序员们应该掌握的内容,比如栈、队列、链表,二叉树、红黑树、B 树,散列表,排序算法,查找算法,最小路径,最小生成树等等……
这么看来,五年的时间并不长是不是?
当然,还有一种可能,你花费了五年的时间,发现自己并不适合做程序员,虽然这听起来有点悲哀,但也不失为一件好事,因为你还有时间转型啊。程序员几乎可以转型为其他任何角色,反过来却很难。我们听说过很多优秀的产品经理,创业者,管理者最初都是程序员,却很少听说哪个顶尖的程序员是从产品经理转过来的,有吗?反正我不知道。
关于程序员技能树,推荐一个 GitHub 项目,极客邦组织发起的 StuQ 程序员技能图谱:
[https://github.com/TeamStuQ/skill-map]
内容之全宛若九阴真经,勤加练习,必有大成。
五、程序员与产品
以前写过很多程序员和产品经理的故事,比如:产品经理和程序员的爱恨情仇、技术人员转产品经理靠谱吗、最可怕的产品经理、硅谷不需要产品经理等。其中有对程序员和产品经理的调侃,也有他们的自嘲。在很多人眼中,产品经理做需求,程序员做实现,似乎是一对冤家对头,比如最新的段子是这样的:
产品经理失踪了,程序员第一时间到警察局报警。警察对程序员说:你先冷静一下,你这样一直笑没办法做笔录。
其实根本不是这样,一个好的产品,一定是程序员和产品经理一起努力协作的结果,甚至,很多技术人员本身就是这个产品的产品经理,有的即负责技术又设计产品,有的干脆是从程序员转成了产品经理。张小龙在刚并入腾讯的时候负责 QQ 邮箱,那时候他觉得自己应该做一个管理者,产品的事情让团队的人去做就行了。「说老实话,我个人没有太关注它的体验,几乎很少参与到产品的设计中,结果出了大问题」。之后张小龙彻底改变风格,重回一线。「从极简版开始,我真正投入去做一些我自己掌握的产品体验,我怎么说就怎么做,任何一个元素要改都必须得到我的同意才行,我会全程参与到这个产品的每一个功能体验中」。最后始有微信。
张小龙是那个时代南方最好的程序员 —— 或之一。
马化腾对技术和产品的重视程度也由来已久,他在2008年的公开演讲中就说:产品和服务是需要大量技术背景支持的,我们希望的产品经理是非常资深的,最好是由做过前端、后端开发的技术研发人员晋升而来。好的产品应该交到一个有技术能力、有经验的人员手上,这样会让大家更加放心。如果产品经理不合格,让很多兄弟陪着干,结果发现方向错误,这是非常浪费和挫伤团队士气的。
如果你是个程序员,如果你热爱你的正在研发的产品,一定要参与到产品的方方面面中来,彻底了解产品的逻辑、体验、交互和用户心理,每一次版本发布后去观察用户的反馈,收集产品数据,与产品经理反复探讨和确认每一个细节。事实上,无论产品经理和设计师做到何等的事无巨细,最终软件是由程序员写出来的,这个产品必定天然携带了这些程序员的特质和元素,如果程序员在每一行代码中倾注了自己的情感,这个产品就是个有情感会呼吸的产品。如果程序员只是实现产品的工具,那做出来的东西也是没有生气的,苍白的。
只有程序员和产品经理同时全情投入,才有可能做出最好的产品。
六、你不是一个人在编程
有些人因为性子略显孤单,觉得编程不需要和人打交道,于是选择了这个行业。他们的口头禅是:能不能不打扰我,我只想一个人安静的编程。
不能!
在软件开发领域,最初级的程序员可能与机器相聚的时间更多一些,但凡开始进入状态,我们都是更多的与人而不是计算机打交道。即使我们编写的代码,也是给人使用,然后才会考虑计算机的心情。如果不是这样,一直用汇编写程序不也挺好?有人说那不是很难吗?如果一直是汇编打天下的话,自然会有各种平台和技术资料、社区来支撑这种技术,而且,你也不会用到 Java,Python 这样的语言,你咋会知道汇编难呢?前辈们会教育你,根本就没有简单这回事!
所以,无论你是多么优秀的程序员,都需要与人打交道,开会、讨论、争吵、发邮件驱动、微信里交流,如何让事情变得跟有效率,如何让别人同意你的观点,如何让别人被说服的时候感觉更舒服而不是挫败,等等,这些都是程序员需要学习和掌握的技能。
事实上,哪个行业都需要与人打交道,程序员也不例外,因为,你从来就不是一个人。
七、专业性很重要,但也别太「专」了
程序员一看就是个很专业的工种,但是正如前面所述,这个领域的技术用浩如烟海来形容豪不为过,我们穷尽一生也无法掌握其万分之一。人们常说先做专才,再做通才,也就是所谓的 T 字型人才,既有某个领域的专业知识,同时知识技能广泛,为人处世,大开大合。古代开国皇帝大抵都是这种,雄才大略又武艺高强,上马砍人,下马治国,一通百通。所以程序员必须首先具备专业技能,才能在这个残酷的领域里存活下来,不要没干两年就想着去管理,抛弃专业知识。翻一翻互联网招聘职位列表就知道了,一百条里面99条是各种各样的工程师,好容易有一条是管理性质的,一看是总经理,您能胜任吗?
所以,专业技能是需要优先考虑的,等你真正成了技术大拿,自然知道怎么去扩展横向知识。
但是您也别太专了,以至于成了偏门技术。我有个朋友一直在国外生活,他的技术栈就是大型机 —— MainFrame,每天和 JCL(Job Control Language)、COBOL 等技术打交道,工作机会不多,但这个专业的人员更少。找工作倒是不难,但是看不到上升的空间,每次换工作都得换城市,为了一个更好的职位,甚至需要从美国辗转到日本,每次被折腾的死去活来,换方向代价有太大,薪水还会降很多,进退维谷。
选技术方向,不要让自己处于这种境地。
八、没什么职业规划,往前走,就是规划
每个人都希望做好职业规划,赢在起点,然后按部就班的往前走,一步一步,迈向人生巅峰 —— 其实根本没这回事,世界上不存在完美的职业规划。我自工作以来,经历过不少重大选择,大部分则是被时代的浪潮和机遇推着往前走。从结果来看,很难说清楚好坏。因为不够强大,更多时候,我都无法和命运抗衡,喜欢计算机和编程,就留在了互联网这个行业里默默努力 —— 现在看起来,也并没有比别人努力的更多。然后遇到一些机会,就迎了上去,仅此而已。
也不存在什么赢在起点的事情,如果你是老老实实经历了中国教育的所有阶段,你不得不承认,你已经没那么优秀了。等到进入工作状态,你会惊奇的发现,我靠,自己竟然是个普通人??
牛人去哪了?暗黑的教育体系无耻的创建了各种科大少年班,网罗了中国最聪明的一批孩子。当我们在中学瞎晃的时候,他们已经大学毕业了,当我们在大学谈恋爱的时候,他们已经博士或博士后毕业了。等你真正开始工作的时候,你会发现重要的职位已经被安姐朱赟、道哥翰清这样的神童占据了,即使不那么重要的职位,比如产品总监,也被次神童邱岳这样的人霸占着……
这么写你们可能会觉得我有点悲观,其实根本不是,我是个天性乐观的人,并因此遭受过很多不公正待遇。比如,大家都知道我的字典里根本就没有悲观两个字,因为他们把我的字典抢走了……
我们年轻的时候,经常有人说:
像你这种程序员我见得多了
懂点编程就以为能够横行天下
其实行走江湖是一件很痛苦的事
会编程,有很多事情不能做
你不想种地吧
又不耻去打劫
更不想抛头露面在街头卖艺
那你怎么生活?
我们只能踏踏实实的写好每一行代码,做好每一个产品,然后等待时间的力量,万一是大器晚成呢?