从软件开发的特性看程序员的职业生涯路线

软件开发这个行业,技术是个很关键的问题。所以讨论得最多的也是技术问题。但是,软件开发行业的技术,和其它任何技术型行业都有明显甚至完全的不同,软件开发具有非常明显的独特性。

先看看其它传统的技术行业,比如律师,财务,文学,书法,绘画,医生,建筑,航空航天,等等。除了软件技术行业,其它的统称“传统行业”,传统行业的特点就是变化不太大,至少不会在你的一生当中,有巨大的变化。年轻时候学的,老了一样用的上。越老越吃香。

但是软件行业不一样,发展速度超快,10年是完全不一样了,一般2,3年技术就会发展更新一代。快,不仅仅只是软件行业的唯一特点,还有另一特点也非常的奇葩,就是“零成本复制”。

软件行业的快速变化,和无限复制两大奇葩特点,让它大大有别于其它行业。这同时也给从业者带来巨大的困扰。这个困扰就是:“软件行业快速变化及零成本复制和软件工程师对生活稳定及可持续支出的需求”间的矛盾。

怎么解释上面这句话呢?用实例,比如一个建筑工程师和一个软件工程师:

建筑工程师,做的越多,技术越精,十年前建大楼,十年后还是建大楼,而不是建月球基地。其知识技能比较容易积累。

软件工程师,十年前用VB写小型管理软件,十年后用hadoop搞大数据,技术完全发生了变化,十年前掌握的VB基本被废。唯一的优势就是有原来的基础学新的技术能更快一点,当然也有人会因为原有的技术及思维模式,更难接受新技术。

这个特点,让从业者的知识积累变得用处不太大。

第二个特点,可以这么理解:

建筑工程师,建完了央视大楼,还有人民日报大楼可以建,还是同样的技术,还是同样的价格。能把同样的东西,反复出售。

软件工程师,写完一个类库后,下次就不用再重写一遍了,直接复用就成,最糟糕的一点就是,一厉害的软件工程师,写完一类库后,其它100万个软件工程师都不用再写了,直接复用别人的。当然,不用再写了,也就没有钱赚没有工资拿了。

软件的这两大特点,让软件从业者的职业生涯无法重复,只能不断的做新的,未知的,已有的东西,就不需要再做了,就算勉强做,也不值钱。因为复制是不花钱的。当然了,复制不花钱,不等于只能卖只一个客户,软件开发完毕,厉害的老板,可以把同样的软件卖给100万个客户。

结果就是,老板笑死了,软件工程师饿死了。

比尔·盖茨,拉里·埃里森为什么能够做到全球首富?李彦宏,马云,马化腾为什么能做到国内首富?道理很简单,因为有千千万万的程序员给他们写程序。微软写了一个Windows操作系统,复制了几百亿几千亿份卖到全球各地,看到软件行业“零成本复制”的威力没?如果没有成千上万的程序员给马云加班彻夜写代码,他还能在台上说那句“我从来没有想过自己会这么成功”吗?很多赚大钱的IT老板,很大程度上借了软件行业“零成本复制”的优势而已。

所以软件的这种特点,产生的现象也很明显的了,赚钱的软件公司钱多的不得了,但是功成之后的软件工程师,往往默默的去了另一公司或项目,再从头打造另一个赚钱的软件项目,如果找不到另一个可以打造的软件项目就失业了。当然,现实情况没有这么悲观,不少公司都给员工股份,让他们享受到共同的利益,不过能受益的还是少数。大多数从业者基本上和这个无关。

以前看过一个传奇程序员的故事:

他做软件开发已经几十年,积累的代码/类库都整理好放在一个随身带的硬盘里,要开发什么软件或项目的时候,就直接从硬盘里快出调出程序类库进行组装。据说一个几十人的团队需要个把月才能完成的项目,他一个人一天就能组装出来。他调侃说,要是哪天硬盘丢了,他可能就要改行了。

故事是不是真的,我们就不用去考究了。当然,硬盘的数据也是可以备份的。但是,这个故事告诉我们,除了老板能榨取程序员劳动结果的“零成本复制”的优势之外,我们程序员自身也是可以利用好这个优势的。可惜大部分程序员没有注意到这点,甘心沦为软件通天塔下的底层的齿轮。

因为这种软件技术的不可持续性,缺乏象其它行业那样,可以一遍又一遍重复,然后就赚钱的模式,软件行业的从业者,一般入行几年后,都或多或少会面临“出路”问题。老系统做完了,老技术变化淘汰了,必须要找到新的切入点,职业生涯才能继续下去。

当然软件行业也未必没有优点,软件行业有一个巨大的优点,就是其“复杂性”,一套复杂的软件或系统,不象大楼一样,1,2年就建完交活了,很可能需要不断的持续投入,改进,优化,升级,这让软件从业者多少有了点活干,往往计划1年2年的项目,只要有客户能销售能赚钱,前后可以做5年,10年甚至更久。

但是复杂性也有缺点,就是大多数公司项目对此估计不足,又希望能早点出结果,所以逼迫软件工程师加班加点,因为早做出来,早占市场,晚了就来不及了。所以软件复杂性虽然延长了职业生涯,但也带来副作用,就是加班。

一个软件工程师,除了对技术的热爱,也不得不考虑生活问题,如果延长技术生命周期,比掌握某热点技术要重要得多,一大主要就是两个方向,转型或者是进入更稳定的技术研发层次,比如底层软件及更复杂,更专业的软件领域。

所以,不考虑转行的情况下,技术复杂度,其实是软件工程师最好的朋友,掌握那些有一定门槛的,变化不太剧烈的技术,或者有前瞻性的技术,是打持久战的不二法门。

当然,复杂度阻挡了一大批从业者进入,形成门槛,如果顶不住复杂度,怎么办?还有另一个方向,就是接地气。避开技术的激烈变化这一劣势,上传统业务这一稳定的贼船,其实就是使用技术,比如在某个行业里深挖,象业务人员一样熟悉这行业的业务,那技术只是使用。另一个就是做技术的最前端,变化最激烈的这一部分。

这怎么说?因为最前端,比如用户端,变化最激烈,所以总有活干,用户界面,界面设计,产品设计,软件测试,这些最前端的东西,变化相当迅速,但对技术的要求不高,用户最看得见效果,所以总有钱赚。

由此可见,软件工程师的技术道路,应该走两极,要么走门槛极高,变化不大的底层级,要么走和用户业务最接近,变化最大的最前端级,其职业道路都比较长远。

而中间级的研发,高不成低不就,一但技术产生升级和系统研发完毕,职业生涯都会受到严重挑战,以国内来看,象.net, Java等平台的普通研发,都存在这样的问题,一个项目做完了,然后呢?然后就没有了。为了混饭吃,不得不再去找另一个项目,几个项目搞下来,其它行业的比如系统的C/C++,云计算平台都搭好了,PHP,JS+Html的网站都建好了,可以不断的滚动升级了。

在底层及前端层不断积累,大块吃肉的同时,中间层技术象.net或Java这样的,还在为找到下一个项目发愁,明天,会有一个项目需要投入进去吗?这种快餐式的开发,只能解决眼前肚饱问题,对职业的长远发展毫无帮助,实乃在软件行业发展的雷区和陷阱。

简而言之,要么像那个传奇程序员一样学会积累自己的代码与类库,或着走向底层研发/用户界面这两端。中间级高不成低不就的研发,是最缺乏可持续发展的模式,也是那个层次的人,总是在嚷嚷“三十多岁挨踢”之类的话。

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注