软件开发的“三重门”
自从上次写了“程序员技术练级攻略” 以来,就觉得似乎还有很多东西没有谈到,但当时没有继续思考了。而春节前有人问我,是做底层技术,还是做业务。这问题让我思考了很多,不由自主地回顾了一 下我这十多年的软件开发经历,并顺着整理分类了一下自己解决过的若干问题,还发散想了很多,经过了一个春节假期的发酵,产生了下面这篇文章。
目录
前言
这篇文章必然是通过我的个人经历来写的。所以,我先说说个人经历吧。我的经历基本分成三个阶段。
第一阶段:我 刚毕业时在家乡的某银行工作,做些银行的业务系统,还搞些网络,电子邮件系统,OA什么的,因为大四的时候在老师的公司里实习,银行里的人际关系太复杂, 而且技术都包给了产商,所以在银行的每一天都觉得不能适应里面的工作环境。两年后离职,单位分的房也不要了,直接去了上海,在上海呆了两年,本来想做互联 网的,但是泡沫来了,最终去了一家做系统集成的国企公司还是继续做银行业务。这四年来,主要解决的都是一些业务上的问题,银行里的会计业务,OA业务,国 际业务,中间对公业务都非常地复杂,而且因为当时的软件开发相当的不规范,所以基本上是在一种比较混乱的状态下度过的,而银行方面又很强势,所以,这段时 间主要是做业务。所以,技术上主要是积累了如何使用那些技术。C+/Java, Windows编程,Unix编程,网络编程主要是这段时间学的,看了太多的书(我大学课程里没有C++和Java,也没有Windows/Unix和网 络编程,所以,只能拼命地看书和自学)。
第二阶段:然后,我来了北京,到了一家做分布式计算系统的公 司,整天和一个高性能技术高可用性的企业级的集群式的软件产品打交道(这家公司去年被IBM收购了),在这家公司把Windows/Unix和网络编程有 了更深入的了解,对我长进比较大的是明白了怎么做一个性能高,可用性高的集群式的系统,天天和底层打交道,干了4年多。然后去了一家金融信息公司,这家金 融公司主要做全球的金融信息数据处理,而我主要还是做核心数据发布系统的性能调优的项目,金融数据的实时性要求的高,数据量非常地大,高可用性要求得高, 得想尽一切办法省网络带宽,增加系统性能,还要保持高的可用性,不当机,不丢包。又干了4年多,入职的时候从国外接过来两个系统,其性能单机每秒可处理 120K message,我走的时候,我和团队把其优化到了每秒1.4M messages 的吞吐,另一个系统,从接手时的100k message/s优化到了500k message/s。这八年多的时候,全是在和这些高计算高性能的项目打交量,几乎没有什么业务,都是纯技术,积累到了很多和性能有关的高并发高计算系统 架构级的知识。
第三阶段:两 年前来到了现在的做电子商务的互联网公司,还是在做一个数据处理量很大的业务系统,因为要干的是要把电子商务全球化的东西。但是,因为电子商 务的特殊性,必需要去兼顾业务的特点,而且在这家电商公司,耳读目染了很多有趣的业务难题,比如,库存计划,配送优化,等等。虽然很多东西还不明白,但发 现,用技术来解决业务难题真是太有意思了。
我的这三个阶段,第一个阶段花了4年,第二个阶段花了8年,第三阶段刚刚开始2年不到,有时候我也去别的公司讲课,所以,我很有幸经历了中国软件开发的进化过程。我的经历可以说是中国软件行业进程的一个缩影,而我把这三个阶段称为——软件开发的三重门。它们分别是:
- 业务功能 – 粗放地开垦
- 业务性能 – 扩大化生产
- 业务智能 – 精耕细作
之所以加上“业务”二字,是因为我以为计算机是一个工具,其用来解决实际问题,所以,什么都离不开业务,就算是性能优化也一样,通过之前那篇“12306.cn的性能优化”中的“业务分析”段落,我们可以知道业务的不同,系统的难度和解决方法就可以不同。所以,我们总是用技术在解决业务问题。业务的形态对软件的开发有决定性的作用。
下面让我具体描述一下。
一重门:业务功能
这 是软件开发的第一重门,也就是掌握可以实现业务功能的技术。通常分成三块:语言+系统+数据处理。在这个阶段,主要是能掌握各种技术,比如:开发用的各种 工具(如:IDE,XUnit,Debugger,等),各种代码库和框架(如:C++的STL,ACE,Boost,等,Java的 Spring,Hibernate等),各种系统知识(如:Windows API,Unix/Linux API,TCP/IP,Socket,多线程多进程间的同步、互斥,并发安全,还包括Web平台,移动平台,等等),还需要掌握数据处理的知识(如:数据 结构,基本算法,数据库设计,数据库引擎 ,SQL等),等等……
这个阶段主要是把这些不同的技术组织成可以实现业务功能的解决方案。重点是能掌握和使用技术。很多流程和方法论的东西基本上就在这一重门里。这重门主要解决的是业务实现问题。
二重门:业务性能
业务的功能搞定了以后,就是业务的性能问题了。搞定功能并不难,搞定性能是有点技术含量的事。有句话不是那么说的吗——每个人都可以搞一个网站出来,但不是每个人都能搞出能支持百万级访问量的网站。但是,我看到很多技术团队或是工程师脱离了业务,只单纯地搞性能,比如:单台服务器支持10万个TCP链接的并发,等等。这些东西虽然在技术上有点意思,但是没有业务的环境,也只能是自娱自乐了。
我们可以看到一些企业开始注重这个问题了,性能问题也是最近被大家讨论得最多的问题,京东商场的性能问题,12306的性能问题,等等。
当然,所谓性能不并单单指系统的吞吐力,还指系统运行时的总体性能,比如,系统安全性能,易用性能,系统的Accessbility的性能,系统的扩展性性能,等等,就像是前段时间“Web开发中需要注意的问题”一文中谈到的那些事一样。这表明着你对系统的全面和深入的了解。
在 这个阶段,需要对业务模型,数据流,业务流,系统架构,算法,和各种技术有深入的了解,要了解到本质上来。比如,在第一重门中,我们只需同要知 道,Java有同步关键字,在这一重门中,我们还要知道同步或互斥对性能的巨大伤害性,在第一重门中,我们只需要知道STL中的智能指针或是STL的用 法,这一重门中,我们还要知道智能指针中的refcnt的同步加锁对性能的损害,还需要知道STL中容器的size()方法在某些时候是性能很差的。在第 一重门中,我们需要知道hash表的效率,在这一重门中,我们还需要知道hash表的碰撞问题。
最重要的是,在这重门重点是软件的设计问题。你需要有足够多的经验能比较不同设计方案的优缺点,比如TCP和UDP,同步和异步,epoll和select,push和pull,水平扩展的各种方案…… 还记得本站的那篇“程序员的谎谬之言还是至理名言”,广度是你深度的副产品。所以,这重门是看你的技术视野有多深有多广。
三重门:业务智能
这 重门可能是最难的一重门了,如果你能进到这重门里,你应该是科学家级的程序员了。让你有智能的业务,这个事可能是顶级的技术难题了。第一和第二重门都不算 难,这重门是最难的。参看Amazon的个性化推荐系统,或是Google搜索引擎的结果个性化推荐等等(比如我输入“黑天鹅”关键字,你怎么知道我要找 的是动物,电影,音乐,还是本书?怎么让搜索出来的结果排名即公正又可个性?),你就知道,用技术来解决这种类似的问题难度可想而知,不然就不会出现如 Hadoop之类的技术了。
我再举两个这重门里的业务方面的例子。
- 一个例子是关于库存计划的,需要像天气预报一样 预测未来的销售量从而决定库存,所以,最简单的做法是,监测各个商品的销售统计,然后看一下最近的销售趋势,还要看一下往年的销售趋势(因为某些节假日会 是一个高峰期),还要分析一下大众的喜好变化,比如,在某影评网站上的某电影的热度其会告诉我哪个电影的DVD要滞销了,得打折卖,哪个电影的DVD要畅 销了,得多进货了。还可能需要监控新闻评论,比如某权威人士推荐了某个商品,那么我得赶快进货了。等等。这完全就是一门科学。
- 还有一个例子是配送问题。我有一辆卡车要处理我仓库和配送站间的物流问题,我需要找到一条最经济的路线来在有限的时间内处理最多的物流。这个不是最短路径问题,这是个计划统筹学的东西。也是一门科学。
还有近期“方韩之争”里有很多人来分析文章相似度的技术,这些东西都属于三重门里的东西。
到了这重门里,可能技术反而不是重要的了,而是数学模型。这重门里主要是业务模型,数据模型和算法问题。这些东西和你的业务模型密切相关。能解决这样的问题,是真正的大牛。对于我来说,可能是高山仰止了。
后记
通过上面的说明,我们可以看到下面这些东西,
- 我的那篇“程序员技术练级攻略”里的东西只能让我们最多达到1.1 到 1.2重门。
- 一重门像是开垦荒地,二重门像是扩大生产,三重门像是精耕细作。
- 一重门(业务实现)里聚集着大量的劳动密集型的企业,劳动密集型的企业通常都需要流程和方法论。敏捷过程改进这类的东西只在一重门里。
- 二重门和三重门里只有少数不多的技术型的公司。这类的公司通常非常注重技术,并且是企业文化是工程师的文化。
- 三重门里可以产生的创新和那些可以用来改变世界的技术。
- 国内现在的情况是,一重门优化阶段 + 二重门的学习阶段。三重门里似乎还没有什么见术。不过,我看到一些公司已在尝试三重门的东西了。
- 作为技术人员的你,如果你想跟上时代,让自己有价值的话,你至少要达到二重门。
- 因 为国内的技术环境等不良因素,导致大量的程序员在一重门的时候就已经失去信心,或被大浪淘沙淘掉了,所以,二重门里的程序员比较少了,但是随着年轻的一代 和技术的日趋成熟,也会慢慢多起来的,我现在已经看到这个趋势了。而三重门里的程序员成了稀缺的大熊猫。因为大量的二重门程序员干到那个时候都转管理了。
我的这些言论不一定对,但希望能让大家有启发,有所思考。
注:本来这篇文章的标题想取成“程序员要解决的三种问题”, 但是因为过年都在关注 “方韩之争”,所以,干脆取成了这个名字。你可以认为我比较调皮,也可以认为我爱ZB,还可以认为我标题党,反正,请随意理解。(这篇文章是我的自己写 的,没有代笔,因为你一定会在这篇文章中看到属于我的用五笔打出来的错别字,当然,我无法自证,哈哈)
(转载时请注明作者和出处,请勿用于商业用途)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《软件开发的“三重门”》的相关评论
除了第一重是考验编程的基本功, 其它重, 都是看思路的
思想上去了, 技术也就上去了
很有借鉴意义啊,我2011年毕业进银行有半年多了,又是女孩子,感觉一小撮前辈不喜欢带着女徒弟做项目,不过在别的前辈的带领下现在也渐渐步入正轨,以后的路还很长,我要继续努力啊
皓皓 你 是 安徽人 吗 ?1
可能是文章写得太好了 最后斑竹说自己打了很多错字 我竟然在看的时候都没有发现 不过我没发现不代表我没有认真看 只是内容却是看了很有启发 对于即将迈出象牙塔的我 很有帮助
比如“因为当时的软件开发相当的不规模”中,我把“规范”打成了“规模”,呵呵。
以为是车震
推荐大家都看一下《ACM图灵奖(1966-2006)-计算机发展史的缩影》 http://product.dangdang.com/product.aspx?product_id=20819782
在学校果然还是只能自学,虽然我已经自学很久了.但是越是深入,越是不明白.完全不知道未来
同感,追梦的路是艰辛的@maplebeats
@wehelpwe
谢谢推荐。我立刻准备去买
耳读目染->耳濡目染
刚摸到二重门的门槛就转管理了,也有遗憾,也无奈
楼主根据自己的经历总结,未免有点以偏概全。很多时候,软件行业根本不存在楼主所说的三种门,只是软件开发人员的水平确实存在差异而已。优秀的软件,往往只有一遍开发的机会,比如一个游戏开发完成并发布后,根本不给你再深耕细作的机会,所以很多时候功能开发已经决定了软件的成败。至于敏捷能不能帮你解决第三重门的问题,墙裂推荐楼主先去看看敏捷的基本思想。Agile一开始就说过,它本身只是流程的方法论,决定成败的永远是人,而不是方法。
我觉得本文至少对我目前所在的公司是相当适用的,还在一重门里奋斗呢~
我觉得C++不是那么难学
写得不错。。。。。。。。。。。。。。。。。
结合自己的实际成长经历谈技术成长、职业规划,非常靠谱,对初学者指导意义很大,谢谢了,支持博主,加油!
唉,作为一枚软件工程专业的在读本科生再次感到压力山大啊,搞软件开发要学的东西实在太多了,正是因为要学的东西太多都不知道从何处下手了,往往是在犹豫和迷茫中消磨了时光,恳请楼主多给计算机专业大学生一些建议,谢谢!
近期在给自己制定计划,看了这篇文章很有启发,技术方面的方向更清晰了。
谢谢博主。
顶一个…
“当然,所谓性能不并单单指系统的吞吐力,还指系统运行时的总体性能,比如,系统安全性能,易用性能,系统的Accessbility的性能,系统的扩展性性能,等等”, 这句话里的“性能”应该指的是软件的品质或者属性吧?性能一般被理解成“performance”。
您写的真好,让我明白了我应该努力的方向,谢谢博主
还在第一重门里 摸爬 呵呵 努力 加油向第二重门迈进
第一次过来 写的不错 请多多指教..
说到硕博, 我真是给读硕士给浪费了时日。 身心备受折磨。 上了之后各种被忽悠。 太烂了。 想学使不上劲。 没有啥指路人。 甚至被同学告知有老师给本科去上课前自己都不会,要学生给他讲讲!临时上阵(我们本科时是不是都是这么被忽悠的!?)。 读硕士一定要跟个真正务实的好老师。 只剩嘴皮子的人害人啊(证明人品超差,各种不正常的事情都会发生)。 读下来啥也不会,被毕业论文折磨(不靠谱”导师”起各种反作用)。学校不存在二流,人才有二三流呀。
陈皓一些文章我打印下来,开阔视野很有作用!如此热心跟个人经历有关。
写的不错
@一骑满尘
都不知道你在说啥,按楼主的意思第三层次是包括推荐,分类聚类算法在内的各种商业智能的应用,你扯啥敏捷,还强烈推荐,真的莫名其妙,是不是CCTV看多了
我们的经历有几分相似。我也是刚毕业回家乡的银行工作,后来去了广州,再回到西安,在Platform待了短暂的一段时间。(您讲的那家高性能计算公司我猜应该是Platform吧)。之后,我进了一家后来被IBM收购的公司, 再后来又从IBM走出来。回顾以往感慨万分。有不少弯路,也有不少收获。期待通过努力,后面的路走得更精彩吧。
陈皓先生您好,我是一名自学的新手,在自学中有几点困惑想请教您。
下面是我自学的方法:
1. 找一本书,读一个大概作为入门,暂时不细抠。
2. 尽快开始找一些小东西写,别管写得多烂多不专业,先像幼儿学说话一样大胆说出来。
例如我学习javascript的时候,先找本书粗读了一番,然后就试着做一些日历、动画效果、表单验证之类来入门。
3. 写累了就拿出书来再看看,可能会发现有疏漏、没细读或者很重要但自己没扎实掌握的地方。
4. 总的原则是一点一点积累,无论是写新的小程序还是读新的知识点,认真吃好当前这一小口。
下面是我的困惑:
1. 【用到了再学,先看个大概】这种方法似乎学新的语言还算管用,但是学数据结构算法、Unix网络编程,就不太
好用了,后者是不是需要读书更细致一些,学得相对扎实后再实践?
2. 我不是计算机科班出身,但有一点编程的基础,可以找一个入门级的工作。我很喜欢这个行业的工作,也明白学习
不要太功利,要扎实。但是我迫切需要一份工作来养家糊口,那么我是应该在工作中学习,边干边学,还是工作和私
下学习完全分开,工作中完成任务,私底下学自己想学的?我的意思是,暂时应付工作可能需要比较功利的学习,
没时间很扎实的啃书本。
3. 怎样权衡读书、读开源程序和按自己思路写程序这三者的关系?我目前觉得读书似乎能帮助入门或了解细节,读开源 程序能帮助了解人家的想法了解真正的高手怎么做的,按自己的思路写能提高熟练度。但是我不明白这三者怎样结合,如果先读书,读到什么程度再做别的?如果先读源码,源码好多,耗费的时间巨多,是不是得有点选择和目的?如果先不管书和源码的成熟做法,自己先大胆写一气,是不是有些不专业?这三者的结合顺序是怎样的?
敬请赐教,万分感激。
“不当机”当字应为宕
good
软件开发确实不容易啊,必须努力的学习
挺好玩
所以您才是专家嘛
现在有千万的年薪了吧?
斑竹不是360buy的吧
你好!读了您的博文,受益匪浅,最近正在做关于系统性能优化的测试,遇到了很多问题。不知道是否可以推荐一下关于“高并发高计算系统”的书籍和资料?谢谢!
业务功能,业务性能,业务智能
光满足功能的话该有多弱,光知道解决功能问题,对性能智能毫无意识的话是不是就是没救了。
受益匪浅