这多年来我一直在钻研的技术
因为我是看到tinyfool 《那些年我赶过的时髦技术趋势》,在赞叹的时候,也让我对我有好些回忆,所以想写一篇回忆贴,本来觉得回忆是件挺让人沮喪的事,因为是老了的表现,但我写着写着,就歪了楼。看来,我还不老,还在拼博。下面是很多我的唠叨,你喜欢就读读,不喜欢就TLDR – Too Long, Don’t Read!
自从98年毕业,到今天,参加工作有18个年头了,加上在大三的时候就为两个在外面接活的老师程序,到今天,写的程序被用到生产线也有18个年头了。
背景经历
要说明我技术上的“性取向”,还得我说说的我的一些背景和经历。
我这18年,大约分三个阶段:
- 1996年-2000年:入门乱来期,大三大四加在银行工作的两年。
- 用Powerbuilder/Delphi在WindowsNT/SQL Server上做了好多个MIS管理软件,有酒店的,有送水的,有OA的。
- 用Java的Applet做了一个Web的教学课件,用于在Win95/IE3.0中演示操作系统中的各种调度和算法的动画,得了个全国大学生挑战者杯的鼓励奖。
- 用Delphi的ISAPI技术以及PHP/ASP给一些公司和大学做过几个网站。
- 2000年-2010年:技术学习期,这十年,我主要的编程语言是C/C++。
- 前两年在银行用C语言在Unix(AIX/Solaris/Sco Unix/HP-UX..)写各种银行业务(用C语言写),用C写操作SQL,操作界面,写业务交易逻辑,一切都用C……,这是一个C语言的年代,当时,全国的银行都在做大集中,银行是当时行业里最大的软件系统了,所以,我确定了C/C++/Unix的技术方向,我当时的网上签名是,C/C++/Unix才是大规模杀伤性武器。
- 然后,2002年在Platform做一个全平台的(包括Unix/Linux/Windows)高性能计算的软件产品,很像今天的Hadoop,当时叫Grid Computing,主要用低廉的x86集群进行大规模的并行计算,主要用于芯片设计行业,如:ARM和德州仪器,或是科研,如NASA,或是国家安全,如美国国防部的影像分析,或是3D动画渲染,如怪物史瑞克……从05年以后,发现很多用户开始从Unix迁移到Linux,于是开始更为关注Linux的Kernel知识。Platform有一套很严谨的软件工程体系,我对严谨的软件工程以及很多的基础的技术的认识在这里形成。
- 2007年在路透做路透全球金融数据Real-Time网络的高性能调优(我在《性能测试应该怎么做?》一文中透露过这个公司的性能要求,是一个实时的数据网络,对于99.9%的网络传输在100K的tps下要低于1ms,技术挑战是很大的),在路透,我只干一个事,就是性能优化,我把我负责的几个系统的性能都提升了8倍到15倍的样子,09年年底的时候,我已把未来3年的优化的活都干完了。所以,这个时期,我也开始了我的经理生涯。我对性能调优,高可用系统架构,研发管理的很多是在这里形成的。
- 2010年到今天,技术沉淀期,这个时间段,主要的编程语言是Java。
- 这段时间,我加入了Amazon和Alibaba,也就是所谓的互联网公司。在Amazon干了两个事,一个是把Amazon全球的marketplace连起来,跨大洲的数据中心的通信,还有一个是第一次接触大数据和机器学习——用户需求预测系统。在Alibaba干过电商云平台聚石塔和阿里云,去阿里最主要的是经历双十一。
- 这段时间,对我影响比较大的是Amazon,技术不再是我的瓶颈,大规模的系统,对我也不是问题,而让我收获最大的是,世界前沿的软件设计架构和解决方案,以及做技术的态度和工程的方法,我的眼界、脑洞和视野都巨大的打开,并且在技术管理、工程管理、产品管理、人员管理、公司管理等等管理方面的思维有了质的提升。这段时间,才是我真正技术沉淀的时期。
我的这个背景本来可以更好一些,只可惜运气不太好,本来可以走的更快的,无奈在最关键的时候遇到了两次金融危机,本来可以去硅谷更牛更好的公司见世面,无奈父母身体欠安,只能放弃。
经历决定思维方式
通过我的背景经历,大家不难看到,我基本上都是做一些规模比较大的系统和软件,而且,主要用C/C++/Unix/Linux这样比较晦涩的语言和操作系统。我们知道用C和C++开发,基本上要处理的错误都是和系统底层相应的东西,而上规模的系统和软件,又总是会遇到很多“稀奇古怪”的问题,这些问题,都会逼着我要去了解很多的操作系统、计算机系统、网络、数据库、中间件等等的各种基础或底层技术。
而且我经历的基本上都是非常严谨的软件工程,不能马虎,我有几次马虎的经历,给我造成了非常大的心理影响,比如,曾经被定性为不适合写代码,因为我的代码太烂,或是出了严重的故障,几乎要跑路去了。另外,全球gloabl式的oncall,经常让我在凌晨被电话叫起来解决问题,这个经历比较痛苦。所以,我的整个经历,让我养成了,在软件开发上必需也不得不严谨的习惯和价值观体系。
大家想想,用C/C++开发一个几乎不能出故障的软件系统,你需要多仔细和多严谨的态度才能达到要求?因此,我的经历让我不能马虎,也不能应付工作,更不能在标准上有所妥协,还需要不断地提高标准,所以,时间一长,我必然,会有如下的习惯:
- 要做到——知其然,知其所以然。所以,只能不断的学习基础知识以及和这个技术关联的知识,就像Wikipeida一样,当你进入一个词条的时候,就会伴随时一堆新词条,于是,当多年后,我看到 “知识广度是深度的副产品”这句话时,简直就是说到我的心里去了。
- 要做出工业级的软件。从银行到Platform到Thomson Reuters再到Amazon,软件开发上都会有SLA的要求。我认为,一个软件是工业级还是民用级的,除了功能正确之外,最重要的一个指标之一就是在性能和稳定性上有没有SLA。绝大多数的互联网公司和开源软件都没有SLA。所以,达不到工业级的标准。要达到工业级的标准,就需要花费时间、人力和财力进行非常繁琐的设计、测试评估以及运维管理。
- 工业级的软件来自工业级专业人员和专业软件工程。
- 专业的人员。为什么绝大多数的外国公司需要的是CS(Computer Science)背景毕业的工程师?因为他们要做的是工业级的软件,这是一门科学,即然是科学,就需要受过良好的科学教育的CS专业的人。
- 专业的工程。工业级的软件需要有工业级的软件工程,比如,严谨的Design/Code Review,严格的测试,以及完备的线上运维。
- 专业的工具。这个时候,你就会发现,要做到高级别的SLA,比如包括5个9以上的SLA,人肉干活的能力已经完全跟不上了,你需要大量的专业的与之配套工具。人类之所以聪明是因为会发明工具,所以,这也是工业级的另一个标准——你有多少现代化的支撑工具?
在之前的《开发团队的效率》一文中,我说过——你总需要在一个环节上认真,这个环节越往前就越有效率,越往后你就越没效率。要么你设计和编码认真点,不然,你就得在测试上认真点。要是你设计、编码、测试都不认真,那你就得在运维上认真,就得在处理故障上认真。你总需要在一个地方认真。
认真是痛苦和艰难的,也是需要苦苦坚持的,因为人太容易妥协了,这对每个人来说都是一种不小的挑战。老实说,我与很多人对“认真”的标准不一样,所以,产生了很多分歧,很多人说我太理想了。其实,我能理解他们,一方面是因为我的标准是比较高了,另一方面是他们只做过民用级的软件。
另外,在一开始,做惯了工业级软件的我极度地不适应于那些糙快猛的开发方式。不过,我也在调整自己,毕竟,世界不只一种价值观,有的是工业级的软件,有的则是民用级的,还有的只是个玩具,而且还有Java这门语言非常有效地屏蔽了很多底层和基础知识,所以,也不可一概而论,我也在适应一些民用级的软件开发的方式。
后记
从去年我从阿里离开到现在14个月了,这段时间内,我给大约40多家公司做过相应的技术咨询和解决过很多技术问题,绝大多数公司都是因为性能和稳定性的问题来找我的,我给这些公司解决问题的时候,基本都是这样的Pattern:
- 一开始,发现都是一些技术知识点的问题,
- 然后,马上进入到系统架构方面方面的问题,
- 当再解决架构问题的时候,我发现,已经是软件工程的问题,
- 而软件工程问题的后面,又是公司管理上的问题
- 而公司管理的问题,结果又到了人的问题上
- 而人的问题,又到了公司文化的问题……
你看,很多问题,一环扣一环,最终都不是一个简单的技术问题。我倒不是说,我在抱怨这些问题,我更不是在说能解决这些问题,因为,就像软件工程没有银弹一样,无论你给什么样的解决方案都会有问题,没有问题才是不科学的。我能做的是,观察这个公司的业务形态、和相关的思维方式,以及现有的资源和相应的技术实力,帮助他们从技术到管理上缓解或改善现有的问题。
所以,我基本上来说,这近20年来,我只在专心研究一个事——如何做出一个性能高稳定性好的大规模的系统。在这个方向中,除了很多的基础和底层技术我需要吃透,我还需要在软件的开发工艺,软件工具,以及软件的线上运维,以及相关的管理上不断学习和思考,因为,只有技术、工具、工程、运维、人员这几个方面搞好了,才可能出现一个性能高且稳定性好的系统。
之前对于我来说,我一直在鼓吹先进的管理和软件工程以及技术和工具。今天,对我来说,遇到最大的问题就是,在没有这些所谓的先进的东西的时候,除了我自己上手外,我是否还能解决相应的问题?因为我自己已经完全Scale不开了。
有问题就有挑战,我每天都在思考,如何在不完美甚至残缺的环境下,解决这些公司的技术问题。每个人都要给自己一个目标。目前,我给自己的目标是——在残缺的环境下,能让用户不改一行代码,不动任何的架构,不改变用户很糟糕的软件开发的习惯,也不让用户作任何管理上的调整,能提升用户的软件系统的性能和稳定性。
因为我相信技术,我相信有更好的技术,可以为用户完全透明的提升性能和稳定性,我大致找到了相应的解,现在,我正在实践的路上,这也许是笔大买卖,所以我不知天高地厚地注册了自己的公司……
(全文完)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《这多年来我一直在钻研的技术》的相关评论
我对最后的那个解特别有兴趣
耗子兄写的文章真好,让我看到了自身的不足和努力的方向。支持!希望你在自己的这个沉淀期多写出好的文章。
哈哈,还找人吗?
奇怪看到最后那一句有点莫名感动
而且我经历的基本上都是非常严谨的软件工程,不能马虎,我有几次马虎的经历,给我造成了非常大的心理影响,比如,曾经被定性为不适合写代码,因为我的代码太烂,或是出了严重的故障,几乎要跑路去了。
哈哈哈,今年dota2冠军的队员也曾被其他战队的老队员说过不适合打职业.
耗子哥,我同样作为一个30+程序员,有同感,不过我水平比你差不少啊。
期待有朝一日能与你共事。
@陈皓
赞,祝耗子哥成功。
希望老师能写一篇续文,详细介绍下如何做到工业级,比如 用到哪些工具 技术 能力
互联网行业不存在工业级别的软件,Windows 也是不停地在变化,推翻之前的设计。 Apple Mac 不也是吗?
这是时代的软件生命周期越来越多,用户期待变化,希望看到新鲜的功能。我之前也像你一样追求工匠精神,现在我学会接受,吧工作丢下去,爱干什么样什么样,只要不出bug, 可能明天这些功能就不用了。
看到耗哥最后的愿景,我深深感觉到如果我还去写糟糕的代码,做差劲的设计,我即将被淘汰。
来拜读前辈的文章,为自己的未来发展,指定目标明确方向做一个参考。
“经理决定思维方式”一节里误把global 写成了gloabl了吧?
从coolshell成立就开始关注陈老师的文章,非常务实、非常技术的一个大拿。
我看问这篇文章主要是你的经历的那个地方和自己对比感觉我现在迷茫了。毕业出来一年了,在一家小创业公司当运维。心里非常焦躁(就是关于技术提高)还有的就是在艰难的和自身的惰性做斗争。其中发现几个问题想请教一下:基础偏弱怎么能提高基础?知识的碎片化怎么能系统的体系的整合到一块儿?怎么样提高效率和读书学习效率?怎么样屏蔽百度等收缩工具的弊端?(有问题习惯性的打开百度去收缩,其实内心是极其反感的)
耗子哥,还招人吗?
关于国内的软件水平,我觉得也有点像经济学中所提的后发劣势(curse to the late comer),虽然可以充分利用了一些世界上的先进开发工具和技术,但是理论和思想体系与先进水平还是有相当大的差距,所以还是需要大力提升对计算机科学和软件工程的认知水平。
此文让我重新倒空自己,重拾编程激情。
从10年开始看左耳的博客,每年必翻;从左耳进入amazon开始,明显感觉博主带队能力与视野在增强。当然,很多技术上的视野,我也是在这个阶段开始拓展!感谢博主,Good luck on your way!
一直关注耗子的文章,谢谢,收获颇多
Tl;dr是too long; didn’t read
一般后面跟着一两句话概括文章的内容 意思是如果你懒得看全篇那么这三言两语就是概括全文的。并没有吐槽的色彩
:P
后记里面的Pattern太经典了。
@冲击波
多看书多敲键盘,确定一个自己想突破的方向,每晚2个小时,遇到问题多Google,浏览Stackoverflow的高赞回答,最好有自己的Github开源项目,坚持不懈。看到你还在用Baidu,亏你还在看耗子哥的博客。
看了您很多文章,信念和技术,得到很多指引
多谢,祝好
感谢分享经历,一直在拜读博主的文章
“09年年底的时候,我已把未来3年的优化的活都干完了”——好牛!!
最后两节读了深受启发。感谢分享。
写得很实在。。。
厉害,期待有这种产品上线。其实我最想要的云服务就是 可以 “无限扩容,永不宕机” 的 RDB,DISK, CPU etc。
什么时候创业,我也想去你们公司试下。
就是,敢不敢用 百度 搜索 coolshell,看看会发生什么。
最后一个问题,已经干了一年运维了,浏览器打开一个 URL 有哪些步骤应该有所了解吧,在任何一步坐下手脚都可以让百度打不开。比如:
改 hosts,iptables 屏蔽 baidu.com dns 请求,浏览器装 adblock 之类扩展把百度拦截掉。
搜技术问题的关键不要用中文关键词,否则用 Google 也白搭,搜索结果还千篇一律的复制粘贴文。
并不排斥百度,也许百度很难直接搜到你要的,也许谷歌确实更加精准,实际上还得看你的关键词的选取、组合是否恰当,只要关键词到位了,百度搜中文一样可以解决问题。
个人习惯先用百度,不行再谷歌,长久下来锻炼了不错的关键词选取、组合能力,并且对SEO的理解也有不错的帮助。
文章不长 对于我这种注意力不行的人 洽到好处 以后还会持续关注
作者很牛呀。奇怪的是,既然如此牛为何不搞一个世界级别的大公司了,或者来电原创IT技术,,,呵呵
我觉得关键还是工具。人,公司,文化,领导什么的都难以指望。软件开发最关键的是理解软件。能理解,才能开发和维护。我的一些想法和落实的工具。有兴趣可以看看
https://github.com/hejiehui/xross-tools-installer/wiki
通过使用xunit。系统的整体可以通过图形来展示;每个unit可以划分的大小适中,方便单元测试和理解。由于unit的存在,可以在统一接口下做到组建复用。
从发现酷壳开始就开始拜读皓哥的文章,几年前很多都看不懂。随着理解的深入,再次阅读时,愈发能体会到皓哥在原理探究上的深度,能用直白的话描述复杂的原理,这种能力非厚积薄发不可能有。再次多谢皓哥,预祝创业顺利。
@wusir
你理解反了,那个愿景是让糟糕的代码,差劲的设计,也不用担心被淘汰
o(*≧▽≦)ツ,终于找到陈浩大哥的博客了,读了好多文章,来留个言。
我也喜欢写作,www.jicker.cn这是我的小博客,希望能跟陈浩大哥交换个友情链接。
Money 才是硬道理…………..
一路看这个耗子哥的文章走过来,感触颇多。。。从开始的入门到如今走上这条编程路…
看了博主的文章,深感自己职业生涯混乱,完全没有规划,没有入行。做过global support,解决问题的思维方式变成了如何快速找到别人曾有的解决办法和回答客户提的问题,对技术问题缺乏深度研究。做过开发,渐渐的变成了如何完成任务,只有缓慢的少量的广度积累,缺乏深度延伸。我得好好思考自己接下来的方向了。谢谢博主,看了好几篇博文都学习到不少,既有技术方面的,又有理解思考、经历方面的。博主应该为自己的这些隐形的贡献感到自豪。
技术宅男改变世界。
老陈开公司了,是咨询公司吗?其实我觉得老陈做高端的IT培训比较好,已你的资质,可以做的很牛逼的!
全球gloabl式的oncall
可以作为大部分程序员的标杆了
程序员能做到 耗子叔这样,能够善于表达自己的想法和知识,真的太重要了, 这少不了平时工作的沟通和 技术的分享
耗子叔让年轻程序看到自己需要做的事,钻研技术
gloabl->global
网站设计很温馨,如果有优化计划的话,希望能够对文字渲染或者字体(字体选择以及字间距)进行考虑。
Thx