和老同事的谈话:关于职业生涯以及MDA
应该是bigtall在2007年度的最后一篇了,虽然2007年欠了大家很多帐,但是继续写应该是在2008年的事情了,很多时候非常有想法的东西,真正到落笔的时候,还是会发现欠缺许多东西,所以很多时候犹豫再三,还是不敢落笔。请大家见谅!
今天有机会见到了以前共事的同事XJ,在KFC海阔天空谈了很多,主要都是集中在各自工作和技术方面,有点启发,所以写下来备忘。大家简单看一个意思就行了。
以前觉得年龄不是一个问题,现在想来其实还真是一个大问题,不知不觉都是30出头的人了,眼看着就要“奔四”,这个日子是慢慢的后半段不如前半段长了。今后的职业生涯怎么变化,也成了一个越来越需要思考的问题。什么是“有出路”的职业?我们经过讨论,觉得定义应该是“一个不需要改行可以一直做到退休的职业”就是一个“有出路”的职业。但是现在的职业真的是一个“有出路”的职业吗?
1.年龄问题
还记得20多岁的时候曾经想着30岁的程序员会不会有人要?结果现在发现30岁的程序员其实很厉害,并没有想象中的“没人要”的情况,相反是一个“香饽饽”(不过也挺贵的)。再看看我们国外那些出书写作的,都是四五十岁的。似乎看起来很不错,但是在中国的我们到40、50的时候还会不会有人要?
2.自身问题
再看,其实周围很多同事都已经转行了,总体来说,30岁以后的程序员数量是呈现一个逐步减少的趋势。30岁之后的程序员们的生活压力却是在不断的加大:娶妻生子,还有房子(加息听说过吗?);但是自身的学习能力、身体状况却是跟20多岁的时候不一样了,还记得bigtall大学时候40个小时可以只睡2小时,现在呢?没有一两天缓不过来!
3.竞争问题
软件这个行业的新技术新思想层出不穷,所以学习是很重要的,如果不持续学习,就可能在下一波的技术浪潮中被淘汰。可是随着年纪越大,学习能力就越弱,也许现在我们可以自豪地说自己是属于剩下的20%,但是我们50岁的时候还可以这样保证?跟20岁的人比还是跟50岁的人比?
4.软件技术发展的问题
曾经有一段时间国内有些人叫嚣什么“软件蓝领”。bigtall认为喊早了,软件开发领域的职责分工随着整体水平的提高逐渐变得越来越细(10年前听说过哪家公司招聘SQA吗?),到时候别说是“软件蓝领”,就是“软件背心”出现也是迟早的事情,但是这个前提应该是分工更加细致的时候,不会是现在,恐怕也不会是2020年(也就是我们50岁)之前。但是这个是一个持续渐进的过程。MDA概念的出现,其实就是标志着“软件蓝领”慢慢出现过程的开始。用bigtall自己的信条可以来解释这个发展趋势“如果人确实是不可靠的话,就尽可能让机器来做”。当然,编码是目前冯诺依曼体系的计算机软件开发中必不可少的部分,正是因为机器不可能替代一切,所以未来会出现“软件蓝领”,当然也会出现“软件金领”(记得C#的设计者吗?)。
面临这样的趋势,如果不因势而变,要想自己的“奶酪”不被人动都很难。
5.公司发展的问题
其实小公司壮大成为大公司的概率比我们想象的都要小。那些成型的大公司(或机构),比如NASA(美国宇航局)、IBM、Microsoft甚至华为,他们的软件开发模式已经基本成熟,可以开发出高质量的软件,而且收入不小,他们有能力从人群中选择最优秀的人为他们服务,而且更会培训新人、挖掘人才。慢慢地,他们的软件开发形成了一种正向循环:好公司-好人-好制度-好软件-好收入-更好的公司-更好的人-更好的制度...
相比小公司,因为能力所限,所以会做很多短期工作,导致产品运行、维护代价太大,有不容易找到合适的人,也少有资源去培训员工,慢慢地就走向了一种负面循环:小公司-软件质量问题-收入减少-员工流失-更小的公司...除了那些有决心摒除软件开发中短视行为的公司,并且有合适的机遇,才能壮大成为大公司。其他的基本都没有未来
那么,小公司能提供给我们“有出路”的职业吗?大公司又能提供几个?要进大公司,又有几个人能入他们的“法眼”呢?
总之一句话:有危机感,也有机会。
接下来谈一下MDA的事情。因为bigtall这两年一直在关注这个问题,但是目前的软件开发现状一直不能令bigtall满意。我们目前的软件开发已经进入了“组件化”的时代,但是显然现在的“组件化”带来的好处并不如想象的那么大。
bigtall一直很羡慕IC行业的做法,他们用一块块集成电路用几个线连一下就可以弄出这么多神奇的东西,从电视到电脑,从手表到手机,从火箭到卫星(注:我说的是硬件范畴)...虽然是差异性很大的领域,但是他们基本都会用到相同的IC(航天领域的对可靠性要求有不同,但是IC模块信号差异不大)。但是相比我们的“组件”,“集成电路(IC)”的通用性确实要大的多。为什么?
通过和XJ的探讨,我们认为IC和“组件”的接口规范是一致的:一定规则的输入,一定规则的输出。但是IC的输入输出是“信号”,而“组件”的输入输出却是“数据”。不同信号之间的差别,无非集中在电压、电流、频率三个方面,而且这三个方面都相对独立,可以单独拿出来处理;但是“数据”之间的区别却太大了。我们的“组件化”过多地强调了“接口规范”但是却忘记去屏蔽掉“数据”之间的差异,而更要命的是计算机程序不仅和“数据”,而且和“数据结构”之间的耦合实在是太紧密了。泛型(Generic)的出现主要是解决了“代码”和“数据结构”之间的耦合过紧的问题。继承(Inherit)和实现(Implement)的出现部分解决了数据的差异。但是“组件”是一个运行时的东西,所以泛型对“组件”和“数据结构”之间的解耦没有帮助。真正的“组件化”时代,bigtall认为还要有“设计时”“组件”的支持。
“设计时组件”的应用场景就是在MDA中。只有“设计时组件”出现,才能解决“组件”和“数据结构”之间耦合过紧的问题,才能提供真正类似于IC应用那样的水平的“组件”。两年前参加过一个“华罗庚软件”公司的推广会(他们老总自称是华老的弟子),这个公司致力于把“数据流图”可执行化,也就是通过设计器把各种设计好的模块像积木一样连起来,最终形成一个应用程序。这个思路很好,但是软件bug太多,听半路就走了。
可见软件开发的“积木化”是很多人的理想,一个“积木式”的软件模块无非就是若干个输入,若干个输出罢了。bigtall把这种“积木化”的模块用一个汉字“米”来表示:横线表示区域界线,也可以表示“积木”本身,横线上面的三个笔画表示输入,横线下面的部分表示输出。现在的情况是做一个“米”比较容易,要把一堆“米”做成一个熟饭却是相当的不容易。我们目前的“组件化”看起来依然是在“一粒生米”的阶段,离煮成“一锅熟饭”的时候还早得很。
如果我们不仅有“运行时组件”也有“设计时组件”的话,加上每一个步骤的“可自定义”特性,我想MDA就会让编程进入一个新的时代。10年前流行的4GL并没有带来什么太大改变,但是以MDA以及类似的概念恐怕会带来深刻的变化。bigtall和XJ曾经谈到了MDA代码生成的反向工程问题,提出了一个疑问:软件行业普遍存在着不设计就进行编码的问题,但是电子行业似乎没有这个做法,他们都是仔细地计算每一个IC的输入输出参数,然后装板调试,从来没有说是把IC先接起来,然后再去设计或者“补设计”。道理很简单,IC随便连起来会烧片子的,会有实际现象(比如火光、闪电等)和真实的物品的损失,现实不容许他们这么做。但是软件太灵活了,而且损失的“时间”对很多人来说无所谓(不珍惜时间算不算民族劣根性?),所以我们会有“先实现后设计”的奇怪而荒谬的做法。其实仔细想想,真的我们实现代码的时候没有“设计”过程?不是,我们都是要想好了才能去动手的,只是不习惯去把设计用文字和图画形式表现出来,稳定下来之后再去编码而已。如果MDA成为了软件开发的主要方式,这种“先实现后设计”现象自然就销声匿迹了。
当然,要真正深入去探索MDA,路还很长!
祝大家元旦快乐!新的一年里,事业顺利!进步!
![老翅寒暑](https://images.cnblogs.com/cnblogs_com/BigTall/46728/o_qrcode-bigtall.png)
公众号:老翅寒暑