<转>职业程序员不必那么“职业”
本文作者余晟,文章首法于其微信公众号“余晟以为”(微信号:yurii-says)
本文转载于http://www.codeceo.com/article/occupation-programmer.html
我刚工作时,怎么也搞不清楚为什么求职信息里要有 “行业” 的选项,还要有 “职业” 的选项,很多时候 “行业” 和 “职业” 还是重叠的,比如行业是 “软件开发”,职业是 “软件工程师”,这不是一回事?过了好些年,这个谜团才真正解开。
好玩的是,我本来以为只有自己不清楚这个问题,慢慢才发现不是这样。工作的时间长了,不少年轻的朋友们和我聊工作的问题,我发现不少人对自己职业生涯的困惑,都来源于对 “行业” 和 “职业” 的理解。看来,值得为这个问题写篇文章,谈谈我的看法。
- 所谓 “行业”,通常是就公司而言的,指的是公司业务所在的领域。比如 “运输”、“零售”、“电商” 等等。
- 所谓 “职业”,通常是就个人而言的,指的是个人所从事的具体工作。比如 “货车司机”、“营业员”、“平面设计” 等等。
以上的例子看起来很简单,但生活中时常会发生混淆。因为行业与职业既不互斥也不重叠,每个人既有自己的职业也有自己的行业,而且职业和行业的名称还有可能非常相似。行业有 “软件开发”,职业也有 “软件开发”,两者还是有区别的。如果行业是 “软件开发”,往往指的是这个人所在的公司负责开发和销售软件产品;如果职业是 “软件开发”,往往指这个人自己就在编码开发软件。延伸开来说,软件公司里不只有开发软件的人,还有测试、财务、行政、销售等等各种职业。做软件开发的人也不一定在软件公司,电商、科研等等行业的公司里也需要这种职业。
搞清楚了行业和职业的大致关系,就可以来谈职业生涯了。
基本上,任何一份工作能给人的新鲜感都不会超过 6 个月,之后就只是简单重复的劳动。从公司的角度来说这是合理的安排,熟练工效率最高最保险。从个人角度来说很可能就不满意了,有心人总会想着自我提升。可是,力气该花在哪里呢?时间是有限的,谁都不想白花工夫。
这时候,行业和职业代表了发展的两个方向。选择行业,就要拓展自己知识的广度,去接触上下游的人,了解整盘生意、整个业务链是怎么玩的。选择职业,就要加深自己技能的熟练程度,寻找比自己更专业的人和资料,加以学习。
通常我们说的 “向专家学习”,其实是没有明确方向的,因为专家既有行业专家,也有职业专家。假设你在一家在线商店做程序开发,那么你的行业是电子商务,职业是程序员。
选择行业作为发展方向,就应当侧重了解以下问题:电商的应用有哪些特点,在系统的选型和使用上有哪些讲究,哪些问题适合使用什么框架和中间件解决……
选择职业作为发展方向,就需要侧重了解以下问题:现有的编程语言和框架有什么功能,什么特性,系统有哪些技术指标各表示什么意思,系统大概会出什么问题应当怎么解决……
注意上面我说的是 “侧重”,极度 “偏科” 的组合是没有市场的。仅仅关心行业而不能动手就只能夸夸其谈,仅仅关心职业而不了解背景和规矩同样寸步难行。所以,大多数职业通常都对行业知识和职业技能有入门要求。但是,个人在成长时应当如何选择方向,把重心放在行业知识上还是职业能力上,很多人未必清楚这个问题。
可以肯定的是,至少相当多的程序员选择的是 “职业”。无论什么行业的程序员,大家愿意愿意争论什么语言好、什么框架好之类的问题,把自己定位为 “中立” 的技术人员,所谓 “中立”,指的就是 “和具体问题无关,与具体领域无关”。这种职业生涯的选择,美其名曰 “职业程序员”。
但是这种 “职业程序员” 工作起来往往会有很多问题。
典型表现之一就是业务人员常常会大喊 “你怎么连这个都不懂,这不应该要我说啊”,因为他们确实 “不懂”——我见过不少开发仓储系统的程序员真的不理解什么是库龄,也搞不懂标品和库存的区别等等 “入门问题”;
典型表现之二就是我经常在面试时遇到来自完全不同行业的程序员,对要应聘的行业没有理解也不做功课,看到 “程序员(开发工程师)” 就直接投简历了。你问他 “NoSQL 和 SQL 有什么区别” 通常还能答上来,问他 “电商、SNS 的什么特性决定了它们要大量用到 NoSQL”,往往就答不上来了。如果再问问他之前行业的典型问题对应着软件科学里的什么模型,能答上来的人就更少了。不过很多 “职业程序员” 觉得这不是问题,本来就不必操心这些问题嘛。
现实的结果是,大量的 “职业” 程序员更适合去做 “纯” 开发,虽然这个职业已经 “人才济济” 了;而 “行业” 程序员奇缺,在许多行业有大量公司需要开发 “不求高精尖,只求稳定能用” 的系统,愿意付出高薪招募有足够行业知识、开发技能相对一般的程序员,却长期一无所获。我相信不少程序员弃 “行业” 而选 “职业” 并不是有意识的选择,但这种 “无意识” 的代价有时大到让人叹息。
为什么会这样?我觉得有两方面原因。
一方面,软件开发本身已经足够成熟,对于纯软件领域的许多经典问题,已经有相当成熟的解决方案,形形色色的各种语言、框架、组件已经相当可靠了,不那么靠谱的程序员也可以拿来直接使用。换句话说,“纯” 软件开发已经有相当多的积累,要想做出成绩的门槛已经很高。
另一方面,软件如何解决各种现实问题,其实一直没有经典的方案。软件最早是解决科学计算和银行问题的,走的是理论先行的路子(还记得 Codd 的经典论文吧),之后软件开始试图解决其它各种领域的问题,这时候就只能实践先行了。这些领域(行业)之前的经验和规范如何移植到软件的世界中,其中哪些值得保留,哪些需要更新或放弃,大量此类问题都还在摸索(移动互联网兴起以后更是如此,因为新兴场景和问题成倍增长)。
在这种情况下,行业知识的价值更高也就不难理解了。如果有两个程序员,甲的职业技能更强,用一个月时间把仓储管理系统的响应速度提高了 100%,乙的行业知识更多,用一个月时间把仓储管理系统的准确率提高了 40%,出货速度提高了 20%。对如今电商行业的大多数公司来说,谁的价值更高,恐怕是不言而喻的——其实对于这种现象,温伯格在《成为技术领导》里给过一个模型:不要算加法,算乘法。如果你花了 90% 的精力在职业上,10% 的精力在行业上,总分是 0.09,如果精力分配是 60%:40%,总分是 0.24。数值或许不那么准确,但总的趋势是对的。
或许有人会说,偏向 “行业” 是有风险的,万一行业不景气了怎么办?还是靠 “职业” 的硬本事吃饭更有底气。这种担心其实是不必要的。
首先选择行业不是要撞大运,不是终身契约;
其次选择行业未必意味着你要完全放弃职业技能,你或许只需要把时刻紧追最新技术的精力用来了解行业已有的经验就好;
最后,如果你技术过硬又能深入了解两三个行业,那就是 “领域专家” 了,领域专家可是比只会夸夸其谈的 “咨询顾问” 吃香得多。