首页 > 代码库 > 程序员生存定律--细论软件这个行当的根本特征
程序员生存定律--细论软件这个行当的根本特征
程序员生存定律这系列的目录在这里:程序员生存定律--目录
喜欢从头瞄的,可以移步。
------------------------------------------------------------------------------
规律是必须顺应而不能改变的,但除此之外现实中还有一些事实也是无法改变的,这两者都很像程序中的常量,想提高人生的高度则需要同时驾驭这两者,而不能试图为两者赋值。下面我们就一起来看一下,软件世界中只能顺应,而不能试图改变的特质有那些。
技术更迭偏快
在学校里,动力机械类专业往往会学习一门叫工程热力学的课程,如果耐心翻阅就会发现虽然封皮换了,但这门课程现在的教科书和五几年的教科书其实差别不大,热力学第一定律还是那个热力学第一定律。
与之相对应《C#高级编程》这本书在2005年还是第三版,但到2011年已经出到了第七版,页数则从1027页增加到了1473页。
这看着是一个很小的不同,但实际上已经折射出了软件行业的一个根本特质:技术更迭、增加速度较快。
技术更迭较快说的是这样一种现象:今天有价值的,明天可能会贬值为0。
在软件行业里,你所依赖的某一平台或语言很容易产生更迭。单以Windows平台而论,10几年前很多人只有Win32 API好用,但一个人如果只停留在Win32 API里,是不太能适应今天的软件开发的---虽然没有官方统计,但感受上在今天Web开发、手机终端开发明显比Windows开发要火热。
这也许源自于这样一种现实,很多传统行业的技能直接依赖于某种自然规律,如:热力学、流体力学、材料力学等等。这些东西自身只会深化或细化,比如从牛顿定律到相对论,但很少会有颠覆性变化。但软件开发所需的东西(API等)往往依赖于某一个公司或组织,比如微软、苹果等,进而是一种人造系统。一旦社会基本需求发生变化,这些公司或组织就必需不断的抛弃并更新自己的系统,比如:GDI -->GDI+ -->WPF。
同时一旦公司因为某种原因倒闭,这一公司所支撑的技术也会变得淹没无闻。
1995前后开始从事这个行业的人很多都会知道Delphi,但我估计2005后加入这个行业的人就会对这个东西感觉陌生了。我们很难去深究原因,但至少现象上来看,Delphi这样的开发平台随着Borland一起远去了。当然,与之一起远去的还有Delphi世界里的很多牛人。
极端来讲,如果Windows彻底打输了当前移动终端这场战争,那么靠Windows吃饭的人(包括研究Native API的和研究.net framework的)无疑的都有贬值的风险。
可以打一个比方来使这种差异更形象一点:
好比说两个不同的人,一个在传统行业一个在软件行业,两个人都很勤奋,不停的往自己脚下垫东西,努力使自己达到更高的位置。传统行业中的人比较自然的会越垫越高,而软件行业中的人则会垫到一定时候,突然间某几块砖就会消失了。
这倒并不意味着软件行业中并非没有具有较长生命价值的东西,但这些东西往往集中在一些特定的领域里,牵涉的从业人员比较少因此不太具有代表性。
具有长久价值的东西里面最典型的东西是通用数据结构和算法,今天的排序算法在10年后必然同样具有价值,但专门从事算法优化改良的毕竟是少数。可以讲大部分人群还是处在技术更迭的大潮之中。此外,图形算法、分析设计方法等也具有稳定且长久的价值。形象来讲似乎越抽象、越偏向于研究的东西其价值越长久,而越具体、越立刻可用的东西其时效性就越强。
这一基本特质的影响非常深远,甚至引出了学习可能会产生较大负效应这类比较特别的问题,这点将在后续内容中陆续有所陈述。
为了让大家对技术更迭有一个更直观的印象,我们来看一下袁峰先生所著的《Windows图形编程》的目录,并看一下这本书里那些东西在过去的10年里被更迭掉了,而那些没有?目录有点长,但为了能把事情说清楚,我还是把它整个贴出来:
第1章 基本技术和知识
第2章 Windows图形系统体系结构
第3章 GDI/DirectDraw内部数据结构
第4章 Windows图形系统窥视
第5章 图形设备抽象
第6章 坐标空间和变换
第7章 像素
第8章 直线和曲线
第9章 区域
第10章 位图基础
第11章 高级位图图形学
第12章 用Windows位图进行图像处理
第13章 调色板
第14章 字体
第15章 文本
第16章 元文件
第17章 打印
第 18章 DirectDraw和 Direct3D立即模式
如果你仔细观察,你会发现其中第一章,第四章牵涉的是一些基础知识,比如Windows 基本结构、如何Hook API等,因此虽然部分内容有点过时,主体上仍然是有现实意义的。
第十章、第十一章、第十二章主要和位图格式相关,而位图格式变化不大,所以这几章的主体部分仍然是有现实意义的。
第十四章主要讲的是字体,而Truetype字体即使在今天也是字体的主流,因此也还是有现实意义的。
其他的章节则因为主要是和GDI相关联大致上是过时了(不意味着完全没用),也就是说18个章节里只有6个章节还有较大的现实意义。
这本书在国内的出版时间是2002年,到2012年正好是间隔10年,10年时间淘汰了某一类技术差不多80%的内容。不知道还有那个行业会有这种淘汰率。
如果任何人以为书里被淘汰的那80%的内容容易学,那就错了,在当年即使是有Windows基础编程知识的人(知道线程、消息机制等)把这部分知识搞通至少也需要1年(工作后)。
介入门槛偏低
某一次喝酒的时候和几个朋友闲聊,谈到了自己的专业:
有的说我是学物理的,和核能有关系。
有的说我是学涡轮机的,这是主要动力机械,发电厂常用。
有的说我是学变压器的,负责把电送出去。
听了之后,其中一人大笑,说:你们几个拼起来就是一个发电站,纯属打入软件队伍的杂牌。
虽然看不到具体数字,但就日常感受来看软件行业中来自其他专业的人似乎确实偏多。这反过来就不成立,你很少听说学软件的跑去做数学了。
这背后隐含的是这样一个事实:软件行业介入的门槛相对比较低。虽然做到高处,很难讲软件就好做,机械就难做,但从介入壁垒来看,确实是软件行业偏低。
如果去做动力机械,那么要学习工程热力学、传热学、材料力学这样的课程,但如果要做软件开发,那么学好一门编程语言以及对应的IDE已经可以开始工作了。
当然,后劲不足可能会把不思进取的软件开发人员限制在某个范围内,比如说只能做应用级的开发,最终让他们等待淘汰。
软件的这个特质,也导致了软件开发人员所特有的一些问题,比如:如果自身没有突破,那么很容易就会被海量的后来者赶上。这点的影响也将在后续章节里陆续提到。
那门槛可以低到什么程度?
以著名的北大青鸟为例,其公开数据是累计培养了50万IT人才,均摊到10年里,这么一家培训机构每年就可以提供大概5万人。当然这其中不都是程序员,但从北大青鸟的角色来看,其中的主体部分是程序员。而国内的培训机构则远不止北大青鸟一家。这是量的视角。
如果你再细心去关注北大青鸟公开出来的故事,你就会发现,高考落榜者、酒店保安、流水线工人都在介入这个行业。这里并没有一点歧视任何人出身的意思,而只是想说,这个行业的介入门槛相对比较低。
而同时我们也很难讲,只有做编译器的、文件系统、MapReduce的才是程序员。也许有的人做的工作更难,而有的人做的工作则相对容易,但不管怎么样,大家确实是属于同一个行业,都叫程序员。
软件和软件差别可以很大
我在《完美软件开发:方法与逻辑》这本书里曾经写过一段有点抽象的话:
从特质上来看,既然软件是固化的思维,那就必然同时具备思维以及思维所承载之物之特质。
- 思维的特质是指:思维的澄清通常是渐进的,思维自身是不可度量的,思维的主体一定是人,思维通常由概念和逻辑组成,思维的无边界化(灵活易变)这样的特质。这部分特质是共通部分,同时属于所有软件。
- 思维承载之物之特质是指:当思维的对象是数学的时候,思维本身也就具备了数学的特质;当思维的对象是商业逻辑的时候,思维自身也就具备了商业逻辑的特质。
既然思维自身的特质是复合的,那么作为固化思维的软件,其特质必然也是复合的:
既有属于所有软件的共同特质,也有特属于某类软件,甚至同其他类软件完全相反的独有特质。
上述文字主要想强调的是虽然都是软件但软件A和软件B可以有相似部分,但差异可能更大。一个人可能研究OCR算法好几年最终只写几百行代码,完全不需要用什么面相对象和设计模式,但在信息管理系统中一个人一两天内可能就需要写几百行代码。这两者虽然有巨大差异,但实际上都会被称作软件。
这种特质导致了软件开发所需要的知识日益的分化,最终结果就是不同软件领域差别很大。想用唯一的知识体系覆盖所有的软件类别变的非常困难。
对方法论而言,基于这一点最关键的一个引申结论是:任何一种方法论不只要陈述自己的方法,还要陈述自己方法的适用边界。
对个人发展而言,那就意味着要关注知识的可流动性这类问题。可流动性是说,你在A类软件中可能达到了一定高度,但如果穿越到了B类软件的领域中,可能江湖地位会一下子下降很多。
通俗的说法是:男怕入错行,不同的软件种类也勉强可以被看做是不同的行业,虽然他们都用一个词:软件来概括。
这一特质也带来很多非常典型的问题,比如:学习必须聚焦。这点的影响也将在后续内容里陆续提到。
那多内部分野可以多到什么程度?
要想对多内部分野这一点有个直观感觉,最直接的方法是去看招聘广告。
有以语言来区分职位的:.net开发工程师、C++软件开发工程师、PHP开发工程师、Java工程师等。
有以平台来区分职位的:Android开发工程师、iPhone游戏软件开发工程师等。
有以领域来区分职位的:GIS数据工程师、金融项目软件工程师、电子商务软件工程师等等。
接下来还会有各种交叉,比如:Java软件工程师(金融)等。
这里面未必没有重叠,但大致上来讲很难在彼此间穿越,年头越多穿越越难。
如果觉得这个分类不是很系统,那么可以参照软件工程中对软件的分类,再乘上平台和编程语言就可以切分出大致不同的领域:
- 航空电子
- 应用系统
- 命令与控制
- 嵌入式系统
- 微代码
- Web应用
- 科学研究和工程研究
- 实时系统
- 驱动程序
- 电信软件
- ... ...
最极端的情形是也不用分什么软件种类,一个项目的整个生命周期就能耗尽一个人一生中大部的能量,想尝试的可以维护个电信或银行里的大系统试试。
------------------------------------------------------------------------------
关于我自己的各种信息,在左边栏可找到,想了解下写这系列文章的人是不是骗子和大忽悠的可以瞄。