程序员生存定律--细论软件这个行当的根本特征

程序员生存定律这系列的目录在这里:程序员生存定律--目录

喜欢从头瞄的,可以移步。

------------------------------------------------------------------------------

规律是必须顺应而不能改变的,但除此之外现实中还有一些事实也是无法改变的,这两者都很像程序中的常量,想提高人生的高度则需要同时驾驭这两者,而不能试图为两者赋值。下面我们就一起来看一下,软件世界中只能顺应,而不能试图改变的特质有那些。

技术更迭偏快

在学校里,动力机械类专业往往会学习一门叫工程热力学的课程,如果耐心翻阅就会发现虽然封皮换了,但这门课程现在的教科书和五几年的教科书其实差别不大,热力学第一定律还是那个热力学第一定律。

与之相对应《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内部数据结构

4Windows图形系统窥视

5章 图形设备抽象

6章 坐标空间和变换

7章 像素

8章 直线和曲线

9章 区域

10章 位图基础

11章 高级位图图形学

12章 用Windows位图进行图像处理

13章 调色板

14章 字体

15章 文本

16章 元文件

17章 打印

18DirectDrawDirect3D立即模式

如果你仔细观察,你会发现其中第一章,第四章牵涉的是一些基础知识,比如Windows 基本结构、如何Hook API等,因此虽然部分内容有点过时,主体上仍然是有现实意义的。

第十章、第十一章、第十二章主要和位图格式相关,而位图格式变化不大,所以这几章的主体部分仍然是有现实意义的。

第十四章主要讲的是字体,而Truetype字体即使在今天也是字体的主流,因此也还是有现实意义的。

其他的章节则因为主要是和GDI相关联大致上是过时了(不意味着完全没用),也就是说18个章节里只有6个章节还有较大的现实意义。

这本书在国内的出版时间是2002年,到2012年正好是间隔10年,10年时间淘汰了某一类技术差不多80%的内容。不知道还有那个行业会有这种淘汰率。

如果任何人以为书里被淘汰的那80%的内容容易学,那就错了,在当年即使是有Windows基础编程知识的人(知道线程、消息机制等)把这部分知识搞通至少也需要1年(工作后)。

介入门槛偏低

某一次喝酒的时候和几个朋友闲聊,谈到了自己的专业:

有的说我是学物理的,和核能有关系。

有的说我是学涡轮机的,这是主要动力机械,发电厂常用。

有的说我是学变压器的,负责把电送出去。

听了之后,其中一人大笑,说:你们几个拼起来就是一个发电站,纯属打入软件队伍的杂牌。

虽然看不到具体数字,但就日常感受来看软件行业中来自其他专业的人似乎确实偏多。这反过来就不成立,你很少听说学软件的跑去做数学了。

这背后隐含的是这样一个事实:软件行业介入的门槛相对比较低。虽然做到高处,很难讲软件就好做,机械就难做,但从介入壁垒来看,确实是软件行业偏低。

如果去做动力机械,那么要学习工程热力学、传热学、材料力学这样的课程,但如果要做软件开发,那么学好一门编程语言以及对应的IDE已经可以开始工作了。

当然,后劲不足可能会把不思进取的软件开发人员限制在某个范围内,比如说只能做应用级的开发,最终让他们等待淘汰。

软件的这个特质,也导致了软件开发人员所特有的一些问题,比如:如果自身没有突破,那么很容易就会被海量的后来者赶上。这点的影响也将在后续章节里陆续提到。

那门槛可以低到什么程度?

以著名的北大青鸟为例,其公开数据是累计培养了50IT人才,均摊到10年里,这么一家培训机构每年就可以提供大概5万人。当然这其中不都是程序员,但从北大青鸟的角色来看,其中的主体部分是程序员。而国内的培训机构则远不止北大青鸟一家。这是量的视角。

如果你再细心去关注北大青鸟公开出来的故事,你就会发现,高考落榜者、酒店保安、流水线工人都在介入这个行业。这里并没有一点歧视任何人出身的意思,而只是想说,这个行业的介入门槛相对比较低。

而同时我们也很难讲,只有做编译器的、文件系统、MapReduce的才是程序员。也许有的人做的工作更难,而有的人做的工作则相对容易,但不管怎么样,大家确实是属于同一个行业,都叫程序员。

软件和软件差别可以很大

我在《完美软件开发:方法与逻辑》这本书里曾经写过一段有点抽象的话:

从特质上来看,既然软件是固化的思维,那就必然同时具备思维以及思维所承载之物之特质。

  • 思维的特质是指:思维的澄清通常是渐进的,思维自身是不可度量的,思维的主体一定是人,思维通常由概念和逻辑组成,思维的无边界化(灵活易变)这样的特质。这部分特质是共通部分,同时属于所有软件。

  • 思维承载之物之特质是指:当思维的对象是数学的时候,思维本身也就具备了数学的特质;当思维的对象是商业逻辑的时候,思维自身也就具备了商业逻辑的特质。

既然思维自身的特质是复合的,那么作为固化思维的软件,其特质必然也是复合的:

既有属于所有软件的共同特质,也有特属于某类软件,甚至同其他类软件完全相反的独有特质。

上述文字主要想强调的是虽然都是软件但软件A和软件B可以有相似部分,但差异可能更大。一个人可能研究OCR算法好几年最终只写几百行代码,完全不需要用什么面相对象和设计模式,但在信息管理系统中一个人一两天内可能就需要写几百行代码。这两者虽然有巨大差异,但实际上都会被称作软件。

这种特质导致了软件开发所需要的知识日益的分化,最终结果就是不同软件领域差别很大。想用唯一的知识体系覆盖所有的软件类别变的非常困难。

对方法论而言,基于这一点最关键的一个引申结论是:任何一种方法论不只要陈述自己的方法,还要陈述自己方法的适用边界。

对个人发展而言,那就意味着要关注知识的可流动性这类问题。可流动性是说,你在A类软件中可能达到了一定高度,但如果穿越到了B类软件的领域中,可能江湖地位会一下子下降很多。

通俗的说法是:男怕入错行,不同的软件种类也勉强可以被看做是不同的行业,虽然他们都用一个词:软件来概括。

这一特质也带来很多非常典型的问题,比如:学习必须聚焦。这点的影响也将在后续内容里陆续提到。

那多内部分野可以多到什么程度?

要想对多内部分野这一点有个直观感觉,最直接的方法是去看招聘广告。

有以语言来区分职位的:.net开发工程师、C++软件开发工程师、PHP开发工程师、Java工程师等。

有以平台来区分职位的:Android开发工程师、iPhone游戏软件开发工程师等。

有以领域来区分职位的:GIS数据工程师、金融项目软件工程师、电子商务软件工程师等等。

接下来还会有各种交叉,比如:Java软件工程师(金融)等。

这里面未必没有重叠,但大致上来讲很难在彼此间穿越,年头越多穿越越难。

如果觉得这个分类不是很系统,那么可以参照软件工程中对软件的分类,再乘上平台和编程语言就可以切分出大致不同的领域:

  • 航空电子
  • 应用系统
  • 命令与控制
  • 嵌入式系统
  • 微代码
  • Web应用
  • 科学研究和工程研究
  • 实时系统
  • 驱动程序
  • 电信软件
  • ... ...

最极端的情形是也不用分什么软件种类,一个项目的整个生命周期就能耗尽一个人一生中大部的能量,想尝试的可以维护个电信或银行里的大系统试试。

------------------------------------------------------------------------------

关于我自己的各种信息,在左边栏可找到,想了解下写这系列文章的人是不是骗子和大忽悠的可以瞄。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值