软件开发的“三重门”
自从上次写了“程序员技术练级攻略” 以来,就觉得似乎还有很多东西没有谈到,但当时没有继续思考了。而春节前有人问我,是做底层技术,还是做业务。这问题让我思考了很多,不由自主地回顾了一 下我这十多年的软件开发经历,并顺着整理分类了一下自己解决过的若干问题,还发散想了很多,经过了一个春节假期的发酵,产生了下面这篇文章。
目录
前言
这篇文章必然是通过我的个人经历来写的。所以,我先说说个人经历吧。我的经历基本分成三个阶段。
第一阶段:我 刚毕业时在家乡的某银行工作,做些银行的业务系统,还搞些网络,电子邮件系统,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 ,请勿用于任何商业用途)
《软件开发的“三重门”》的相关评论
现在网站好卡啊。。。
赞!
作为还在第一重门里苦苦挣扎的一线员工
我想知道如何能过跨过这重重门槛
这个不是最知路径问题,果然是五笔打出来的,:)
功能,性能和智能的层次划分很受启发
赞!
赞,功能,性能和智能的层次划分很受启发,
但我个人来说,就是三重门的划分界限,不会很清晰,我工作三年多了,近来突然发现自己常常处于业务功能与业务性能之间…而且在业务功能与业务性能之间需要去找平衡点和最佳的实践方案.
还在一重门, 如何做 才能即将业务做精,又能顺利进入 底层呢?
憧憬第三重门的境界,但做过的项目比较少(最近一个也是银行项目,业务复杂,技术单一),技术广度不够,只能靠自己业余时间自学。可能只能靠跳槽换项目组来提高技术眼界了,期望能进到一个LZ所说的技术型公司,体验到工程师文化。业务与技术的关系一直困扰着我,感谢您的文章!
谢谢大佬的经验谈。。。听君一席话~胜读十年书~
二重门和三重门里只有少数不多的技术型的公司。这类的公司通常非常注重技术,并且是企业文化是工程师的文化
国内有哪些企业??能否给出些例子?
唉,做业务的不知道要什么时候才能到达耗子说的第一重境界了,还是先好好学习technical detail先。
等了好多天了,大哥。终于又有新博客了,先顶一下再详细看。
新年好文,受教了
谢谢分享个人经验!
还在一重门初始阶段。。。
想请问博主,从你现在的观点来看,读硕博和”二重门“与”三重门“的关系如何?如果博主觉得国内和国外的教育水平差距较大,也烦请博主分别回答一下,谢谢。
我本科毕业,没有读过硕博,无法准备回答你啊。不过,我觉得不妨考虑出国读硕博。
终于看到新的文章了!开年第一帖啊!:)
什么没见到第三重,大学里研究生全都是这种人
也不是什么高深的东西,反正写代码的人都是码农,原理全都出自各式各样的论文呢,没什么值得吹的。
研究的是有很多,但是不知道解决了什么东西没有?开发出了什么软件没有?
额..确实够标题的拉~~不过我是正要迈向IT、计算机行业的高三学生…起码让我有了方向吧~~期待大学的学习,我喜欢技术型的。呵呵…关键词:自由软件,为人类做贡献,一点点就够啦~~
一重门在国内大中公司基本都提供学习环境,二重门只有少数大公司或外企有学习机会的工作环境,三重门的工作环境又要结合自身定位发展业务方向去找公司,就太难了。
有自己定目标是好的,如果没有工作需要的刺激,真是很难长期让自觉的学习。
应该只有少数人才可以。
其实我觉得分成这三步更合适:
1。做到:对于一个给定的问题,不管好坏,先要能做出来;
2。做好:对于一个给定的问题,不仅能做出来,而且要做得好,包括性能、健壮,包括代码可维护性、接口设计等各方面;
3。做什么:不再是被动地解决别人给的问题,而是自己去发现和定义问题,并解决它,并解决好
这相当于学习的三步:
1。老师给的题目能做出正确的答案;
2。老师给的题目不仅做对了,而且方法好;
3。不再等待老师出题,而是自己寻找问题,进行独立研究;
其实我觉得有个误区要小心,很多“难题”之难并不在于程序技术方面,而是难在本质上是不同于程序的另一门学科。比如库存、物流这些,其很多难点应该可以认为是程序之外的其他学科的内容了,也许“其他学科”是数学,但也许是其他。第三步可以认为是需要人在至少两个领域内具有“深度”,并且能把这两个领域的知识和能力结合起来,但这些学科不一定就是计算机+数学的组合,具体的组合完全取决于这个人自己想做什么。虽然数学在很多领域都很重要,但数学也不等同于其他领域,数学和编程一样也是工具。所以要把计算机和什么结合起来主要取决于兴趣和主观意愿,其他的都是在确定选择之后根据需要去学习的。
所以核心是要有自己的兴趣点。
真心的,这篇文章写的太好了。至少让自己知道这条路是多么不好走,而且知道自己处在一重门的门口。
另,博主文笔犀利,措辞巧妙,尤其是后注,妙趣横生。受教。
还在一重门,好像那些技术我大多接触过,
但是,我自己没什么信心,多线程的,socket的,该看的书,都看了。
自己写过后台服务,写过server,也写过一些东西。
但是,有时候感觉自己还是什么都不会似得,有一阵子不写代码就感觉到有一点点的发虚。
在一重门中, 开发实施 商业银行核心业务处理系统ing
不知道楼主是不是”计算机相关专业”毕业的,反正我不是。马上要毕业,自学了2年PHP,在小公司拿着极低的工资,每次TX等公司的校园招聘都会直接把我简历过滤掉,感到相当郁闷和迷惘。
嗯,我是本一大学生,一直在苦恼到底是坚持自己喜欢的技术还是像长辈期望的那样转管理,最近看了您几篇文章,觉的还是坚持做技术有意思呀.希望能早日达到第三重境界~
@sjinny
的确,这种说法更直接!不过第3步、第3重还未感觉到,或者说并没那么重要。。。。。。
炒股票,会买的只是徒弟,会卖的才是师傅;
软件开发,能做出来的只是徒弟,能做到一定规模下还稳定高速的才是师傅
让我想起王国维的三境界。这三境界可以作为内心感受,与你说的业务三境界粗粗对应:
“昨夜西风凋碧树,独上高楼望尽天涯路。”可以说是在学习各种软件技术时最常感到的心境了。
“衣带渐宽终不悔,为伊消得人憔悴。”业务性能阶段不再那么迷茫,而是只感到时间不够,精力不够了。
“众里寻她千百度,蓦然回首,那人却在灯火阑珊处。”这种掂花微笑的感觉大概是最后出现的吧。
陈皓你自己在各阶段的心境能不能谈一谈呢?
把前两个做好就很不错了,能做到第三重,只能是对软开真的有很大兴趣,并且从中获得成就感和快感的人。
我觉得所说的第三重门是科学研究,智能是一个模糊的词,从你说的方面看更像是AI。
总结的好,技术再强也是要为业务服务的;在印度,计算机行业也为服务业;时刻清醒的看到自己的定位才能不断进步和发展。
很赞同这三重门,但是我看完之后就再把Linus、RMS等传奇人物往这上头放。。。我想可能他们是第四重门的 :-)
不错不错,有收获
一句没有加粗的话让我震动了——“广度是你深度的副产品”
怎么记住我的session的?是cookie吗?
你说的第三重门是research……我看不出来为什么要经历第一重第二重才要到第三重,博士和大公司的研究员干得是第三重,普通写业务的coder做的事第一重,做性能DBA之类的工程师做第二重,只不过是你工作生涯的三个阶段罢了,写这么玄乎干嘛
我说的是软件开发,不是程序员。呵呵。
对这些不太懂,说点题外话吧,话说amazon主页上边那些大按钮看着很难受啊
另外在z.cn上提交完订单后地址是按英式倒序显示的,看着很揪心啊…
@wxnfifth 我觉得你和楼主说的都对,但是出发点不一样。这三个重确实不一定要按部就班的走上去,我们可以直接跨过某一重而直接做下一重的事情,话说,分工日益明确的当下,不必什么都懂。但是,就软件开发者而言,按这样的步骤走到最后的,那肯定是大牛了,也是技术者的终极目标吧。
过节好,受教了 :-)
专做一项是深度 想要成为真正大牛,广度深度都需要。
我觉得楼主所说的第三重门实际上就是个数学建模问题,这个问题本身并不难,难就难在 如何把项目中要处理的业务问题抽象成特定的数学模型,这个就必须要求楼主熟练、深入的了解特定行业 业务的各方面和细节问题,这个东西非一日能练就成功,很难想象让一个金融架构大师搞一个游戏架构项目会是怎样的情形
至于业务问题 正确的抽象成数学模型后,下面的解决之道就相对简单一些了
皓皓 你缺乏理论知识 你只是钻研技术 是 不行 的 1
皓皓 你需要研究理论 到 你 这一层次了 必须 研究 基础理论 1
一二层做computer engineering,三层的做computer science,一个自底向上approach,一个自顶向下approach,方向不同,关注的范畴也不同,拿到一起比较是否欠妥?
其实 做软件开发 一上来就必须 学基础理论 从 基础理论 出发 去思考 1
最近无聊看了许多图灵奖得主的生平介绍。有些人的理论奠定了现在软件的基础理论。如尼可拉斯提出的软件=数据结构+算法,如巴赫曼提出用数据库代替分散的文件系统。而另一些人,则天资聪颖,他们是通才并且能够展望未来的世界。麦卡锡和西蒙都是这类顶尖传奇人才。
他们都在第三重门上。有些甚至已经跳开”业务智能”这个层面,而正催促着第三次科技革命的进程。
看来我现在还是处于第一重门的门槛入口处!