作者 | 耿立超
责编 | Aholiab
封图 | CSDN 付费下载自视觉中国
出品 | CSDN(ID:CSDNnews)
南方的路边普遍生长着一种三片叶子的植物,学名车轴草,这种草有时会长出四片叶子,是一种稀少的变种,被人们称之为“幸运四叶草”,这种草在北方寒冷的气候里无法生长,直到去了南方我才见到……
本文选自《大数据平台架构与原型实现:数据中台建设实战》的自序,在这本满是专业术语和源代码的书里,作者曾想着要在序里少谈一点技术,多聊一些故事,然而从动笔的那一刻,时光便越追越久远,故事也越写越悠长,于是便有了今天这篇文章。相信有很多80后的读者与作者有着相似的成长轨迹,或许这些故事能引起你的一些共鸣。
初出茅庐
2006年夏天,我大学毕业,那年夏天是我人生中度过的最愉快的一个夏天,临近毕业,所有的事情都已尘埃落定,恰逢06年世界杯,整个校园夜夜都在狂欢。晚上和同学在食堂买上几盘酱油螺蛳和花生,喝着食品工程系实验室里酿出来的鲜扎啤看世界杯是那年夏天独有的记忆。那年毕业时流行的歌曲是王筝的《我们都是好孩子》,歌曲同名专辑是当年最好的一张唱片,可惜后来的王筝再也没有出过像样的专辑,和我们的大学时代一起永远地封存在了那年六月骄阳下的毕业合影里。
我无比悠闲和惬意的大四下学期是在宿舍和网吧里挥霍掉的,大学四年我最喜欢的游戏是《反恐精英》,最擅长的武器是狙击步枪,我们总是选择那种小型地图,开局迅速遭遇,一通厮杀之后,几分钟就可以结束战斗,然后再乐此不疲地开始下一局。我喜欢和舍友一起在网吧里打游戏,那种乐趣是和陌生人在对战平台上玩所体验不到的,大概是因为这样,毕业之后我就很快和所有游戏永远地告别了。很多年以后回想自己的大学时代,我真心得觉得那些在网吧里度过的日子是青春里很美好的一段回忆,是一段自由挥霍却可以无所顾忌的时光。
听上去我的大四下似乎过得有些颓废,然而事实并非完全如此,那时候学校里还有最后一件要紧的事牵扯着我的精力,就是毕业设计和论文答辩。我学的专业是电子信息工程,高考填报志愿时,我想学计算机,因为上高中的时候我就对编程感兴趣了,但是阴差阳错最后还是进了电子系。平心而论,电子信息是比计算机难很多的一个专业,《高等数学》只是在这个专业安身立命的一条“低保线”,我至今都记得《电磁场与电磁波》和《数理方程》两门课程曾是很多同学的梦魇。
虽然我是一个很有上进心的孩子但却不够聪明,这个高冷的专业除了挫败感没能给我带来太多的快乐,反而把我逐渐地推向了软件编程,于是我把很多业余时间花在了学习计算机上,大学四年里,我从全国计算机等级考试二级开始考起,一路拿下了二级C语言,二级C++,三级数据库直到最高的四级证书,然后又考取了国家计算机专业资格与水平考试——软件设计师的认证,这些证书已经让我积累了一个计算机专业本科生该有全部知识,而我当时的编程能力已经远远超过了他们中的大多数。
回到我的毕业设计,尽管电子信息是一个偏硬件的专业,但是也有汇编和C语言课程,系里为了给同学们更加宽泛的选题空间,一些计算机相关的课题也会被接受,所以我选择了一个软件课题《学生信息管理系统的设计与实现》,然后就开始了长达三个多月的编程和论文撰写。
我的毕业设计需要一个图形化的操作界面,这对我来说是个不小的挑战,在此之前我从没有写过桌面应用程序,当时开发Windows上的GUI程序有两种选择,一种是使用Visual C++ 6.0调用MFC类库实现,另一种是使用VB.NET或C#在.NET框架上实现,由于当时我只会C和C++两种语言,所以第二种方案被直接排除了,但是第一种方案也不是我想要的,因为VC6.0和MFC在当时已经属于比较落后的技术,而且VC6.0的语法与我那时学的C++ 2003标准差别很大,如果要用的话还要退回去学习过时的知识,这让我感到非常沮丧。
转机来自于那一年刚刚推出的Visual Studio 2005,它携带的C++编译器是当时第一款全面支持2003标准的C++编译器,更让人惊喜的是微软为了将C++程序员吸引到.NET平台,在Visual Studio 2005中第一次引入了可以运行在.NET平台上的托管C++,取名为C++/CLI,这意味着开发人员可以使用标准C++在.NET上开发Windows桌面应用。一切都来得刚刚好,在获知这些情况之后,我果断地投入到了C++/CLI的学习中去。
三个月后,带着完善的软件成品和毕业论文我顺利通过了论文答辩。因为我的毕业设计是一个可以运行且功能完善的实物作品,使用的又是当时最新的技术,所以最后还被系里推荐入选了校级优秀毕业设计,虽然在那个即将各奔东西的时刻已经不会有人在意这些事情了,但对我来说这份毕业作品是自己大学时代最好的一个注脚,兴趣驱使着我不断地学习,总算不负四年的青春。
南方的“乌托邦”
毕业之后我进入了家乡所在城市的一家公司,那是实力非常雄厚的一家地方软件企业,有趣的是父母为了能让我顺利进入这家公司还颇费了些人脉关系,在北方的人情社会里这似乎总是免不了的,只是加入之后我才发现,其实公司的“门槛”并不怎么高,应届毕业生中既有来自211院校的,也有普通的大专毕业生,但这些都不重要了,重要的是所有的应届毕业生都要被安排到苏州昆山的分公司去工作,这是这家公司的战略,她在一望无际的阳澄湖边上买了一大片荒地,盖起了几栋红色的办公楼和员工宿舍,在那里,迎接我们的是全新的开始以及阳澄湖边硕大无比的……蚊子!是的,让你失望了,那时候我们和大闸蟹还不熟。
初到昆山的日子是紧张而忙碌的,应届毕业生被组织在一起参加为期三个月的强化培训,主要是学习Java编程语言,这是当时开发企业级应用的主流语言,我很庆幸在自己刚进入这一行时被公司引领到一条正确的技术道路上,此后十多年Java经久不衰,让我也从中受益良多。
培训期间,每天都要学习大量的知识,然后上机编程,中间还穿插着各种考试。我的面向对象编程思想就是在那时建立起来的,虽然之前学习过C++,但是会写Class和能用面向对象思想设计程序差别还是很大的,从面向过程到面向对象的思维转变中我意识到思维模式对编程的深刻影响,这种强烈的冲击在后来我从面向对象向函数式编程切换时又体验了一回,可以说是一种既痛苦又新奇的体验。
在阳澄湖边的生活像是在上“大五”,身边的同事都是刚刚毕业的学生,公司的位置远离市区,像极了很多城市的大学城。在那种偏僻的地方,虽然可以让人沉下心来好好学些东西,但如何让生活变得有趣也是一个问题。南方的路边普遍生长着一种三片叶子的植物,学名车轴草,这种草有时会长出四片叶子,是一种稀少的变种,被人们称之为“幸运四叶草”,这种草在北方寒冷的气候里无法生长,直到去了南方我才见到。曾经有段时间采集四叶草在公司的年青人里非常流行,每天午休散步时,大家就会在园区里寻找这种草,比谁找到的更多,更稀有,然后作为“战绩”采回去养在案头的玻璃瓶里。
没有城市的万家灯火,夏夜里,抬起头,我们可以看到漫天繁星;迎着阳澄湖上徐徐吹来的风,宿舍的阳台上,是天边的云卷云舒;在一个近乎与世隔绝的地方,住着年青的人和可爱的心,然而每一年,一批又一批的新人去到那里,然后又一批一批地离开,微薄的收入和偏僻的位置注定了那只是他们职业生涯的起点,是一个美好却不现实的“乌托邦”。
北京,北京
培训结束后,大家被分到不同的事业部,很多人陆续出差去了外地,而我被派去了北京分公司,和先前已在那边的项目组汇合为一家瑞典客户开发个人信贷系统,我们姑且叫它X系统吧。
作为工作之后参加的第一个项目,我满怀期望地想从实际项目中学到一些宝贵的东西。X系统的后台使用的是EJB,当时EJB已经势微,业界流行的方案都是Spring + Struts + Hibernate,可是我连吐槽的机会也没有,后台业务重,逻辑复杂,都由老员工负责,作为新人,我被安排去写前台客户端。X项目是当时为数不多还要提供GUI客户端的系统,那时B/S架构已经成为主流,C/S架构的系统已经很少了。X系统的客户端使用的是Java的GUI类库Swing,于是Swing成为了我参加工作后研究的第一项技术。
学习Swing的过程中,让我收获最大的是对MVC架构的理解,MVC一直是应用系统开发的重要架构思想,是一名架构师成长的必经之路,虽然像Struts和Spring MVC这样的Web框架也是基于MVC架构设计的,但是由于这些Web框架向上不控制实际视图(即Web页面),向下又没有严格的模型绑定,所以很难让人透彻地理解MVC的思想(几乎所有的Web框架都有类似的问题,因为它们的V和M、C通常是异构的,使用的是不同的语言和运行环境),而Swing则是非常纯正的MVC实现,它对于模型、视图和控制器的界定都非常清晰,并且三者都是在Java语言环境内实现,相互之间的协作更加自然。
在北京出差的那段日子我住在离公司不远的一条叫双榆树西里的街巷里,那是一条弥漫着生活气息的小巷,巷子两边种着城市里极为少见的柿子树,秋天的时候树上会结满金黄的柿子,像一个一个的小灯笼挂在路两边。
巷子的一头是中关村南大街,从天桥过到马路对面就是人大校园,我经常会在晚上去人大的教室里看书或是去操场跑步。巷子的另一头有一家四川老板娘开的小餐馆,老板娘精明能干,浓浓的四川口音也是餐馆的一大特色,印象中店里最好吃的是回锅肉盖浇饭,八元一份,正宗的川菜味道。巷子里还有家做蜂蜜烤翅的小店,味道超级好,生意好得不行,但对于刚刚参加工作的我们来说在北京那样的一线城市吃烤鸡翅也是很奢侈的,偶尔买买,从没有吃到痛快。
由于紧邻高校,周末的双榆树西里有夜市,而且还很热闹,摆摊的都是开着私家车过来凑热闹并顺便做点小生意的年轻人,他们把各种衣服、鞋子和毛绒玩具摆在后备箱里,城管来的时候他们把后备箱一关,就可以直接开车跑了。不知道为什么过去了那么久对那条小巷的记忆依然那么清晰,在北京生活的很长一段时间里,我们都没有想过要去故宫、长城走一走,那个时候的生活真的好简单。
八个月之后,我离开北京去了香港。在香港,我们为一家投行开发和维护一些金融衍生产品。当时香港投行广泛使用基于VBA的Excel作为金融产品的配置工具,这让我们感到非常意外,谁会想到在外人眼中高大上的投行使用的却是这样的工具,所以香港的工作并没有带给我特别的乐趣,在完成本职工作之余,我开始花大量时间研究领域驱动设计。
2008年的时候领域驱动设计还是一种很小众的设计思想,完全没有像今天这样知名和流行,在前往香港前,我在海淀书城里意外翻到了那本靛青色的《领域驱动设计:软件核心复杂性应对之道》,看过几页之后我就意识到它绝对是本好书,书里的很多概念是自己写程序时能感觉到却没能归纳出来的东西,它的很多思想都让我无比认同,在此后多年的企业级应用开发中,我一直是领域驱动设计的忠实信徒和倡导者,即使是在这本关于数据的书里我依然在第六章谈到要围绕主数据进行领域建模,这是在应用系统开发上积累的宝贵经验。
08年金融危机爆发前,项目结束,我从香港回到了昆山,在经过短暂的休整之后,两年的合同也即将到期,尽管很舍不得要好的同事,但就像大多数人一样,为了更好的发展,我坐上了去往上海的列车。
“魔都”十年
从昆山来到上海的那天,在地铁一号线和二号线的换乘站人民广场,当早高峰的汹涌人潮将我淹没时,我第一次感受了这座城市的脉搏。作为一座国际化大都市,上海的IT业也非常发达,从业人员数量巨大。但不同于北京和深圳,上海的知名互联网企业并不多,特别是在几年前,从业者中,高端一些的大多集中在甲方外企和咨询公司,低端一些的则在中小型的外包公司,所以比起那些拥有一线大厂的城市,上海的IT业受外企文化的影响很大,和这座城市的整体气质倒是比较契合。
初到上海时,我落脚在两个老同事那里,他们先于我一年来到上海,我们一起经历过一段短暂的令人抓狂的群租生活,在一套三居室的房间里住了七个人,每个人都有着各自的作息,从早上五点开始有人洗漱,到晚上12点加班的人归来,在那间没有实体墙的隔间里,我的睡眠被彻底地摧毁了。坚持了三个月后,我和一位同事在公司附近合租了一套两居室,生活终于回到了正轨。
我在上海的第一份工作是为一家美国公司维护一个面向零售行业的商品销售系统,那是一个寿命已经接近十年的系统,虽然它也在不断地进化,但使用的技术和框架已经很陈旧了,为了解决对象关系映射(ORM)问题,它甚至自己封装了一个ORM框架,而实现一个完备的ORM框架是非常具有挑战性的,显然,这个系统早期的开发团队对此并没有一个理性的认识,这个框架隐藏了很多“诡异”的bug,有时候你的对象会像空气一样被它无视,无论怎样也不会被持久化,而有的时候又会被持久化多次,在数据库里生成多条重复记录,它的“dirty checking”机制神秘莫测(dirty checking是指ORM框架需要检查内存中的对象有没有发生变化以便决定是否需要将其最新数据同步到数据库中),备受大家的诟病,而糟糕的是所有的代码都是在这个ORM框架之上编写的,没有一个人敢修改这个框架里面的代码。
决策层显然是知道问题存在的,他们决定将后来的新功能构建在Hibernate上,但那时很多老员工多年只维护这一套系统,技能和知识都有了很大的局限性,在他们初次使用Hibernate时也犯了很多低级错误。比如,为了应对Hibernate中常见的LazyInitializationException,他们不断把自己的对象和集合的抓取策略设置为eager,这一饮鸩止渴的做法虽然解决了眼前的问题,却像滚雪球一样在孕育一个更糟糕的bug。
虽然我在团队沟通中多次提到这一做法是错误的,但是很多人并不以为然,终于有一天当测试人员打开一个再普通不过的页面也要花费接近1分钟时,他们才决定坐下来好好思考一下这个问题,这让当时年青又骄傲的我觉得很不爽。现在看来,自己当时做的并不好,作为一名技术人员,我们可以在团队里营造工程师文化,但是技术上的对错和团队的沟通与协作是两回事,在这两者之间保持好平衡是一个程序员的必修课。
在离开上海的第一家公司之后,我去过创业公司,也在500强工作多年,在上海的十一年里,我开发过SaaS产品,实施过数据库分库分表,做过应用系统集成,从Linux服务器安装到应用系统前端页面开发,几乎方方面面地工作都上手过。2013年,意识到大数据将是未来几年一个重要的新兴领域,我开始将个人的技术重心从应用系统转向大数据。我曾经为某Hadoop商业发行版编写过一些底层代码,设计过HBase的二级索引方案,后来则为多家企业设计大数据平台。
我的技术领域因工作需要不断地拓展和延伸,随着的经验的积累和技术实力的增长,我开始慢慢地肩负起系统架构的工作。从程序员到架构师的角色转变是一个自然而然的过程,我从来没有为此特意准备和规划过,但似乎每一次技术上的积累和进步又都是在为这一方向而努力。
“星巴克”自由
这是一个关于行业收入的话题。记得十多年前在阳澄湖边和小伙伴们畅想未来的时候,我曾开玩笑地说:如果未来吃大闸蟹能像吃馒头米饭一样随意,应该就是成功了吧。现在看来,这个flag立得太高了(此处应有一个尴尬的表情~),不知道是自己不够争气还是大闸蟹太争气,总之“大闸蟹自由”尚未实现,不过这些年下来,我倒是找到了一个挺符合当前经济水平的参照物——一杯星巴克咖啡。
十四年前刚参加工作时,我的月薪是1400,那是当时国内二三线城市本科毕业生的标准起薪。神奇的是,在刚参加工作的头一两年,由于长期出差,我总会有一些额外的出差补助,再加上那时候也没什么消费需求,所以我几乎没有动过工资卡上的钱,直到工作一年后,我大手一挥,刷光卡上所有的钱为自己买了人生的第一台ThinkPad笔记本,那台坚挺的笔记本陪伴了我将近9年的时间,直到现在它任然可以正常开机运转。
来到上海那年是我工作的第三个年头,作为一线城市,上海的生活成本很高,相应的,薪资水平也很高,我是薪资翻了接近两倍来到上海的,在此后的数年里,随着能力和经验的增长,个人收入也在一直上涨,几年前,一杯30元的星巴克对我来说还是比较奢侈的,不会每天都喝,以今天的状况来看,自己算是实现了“星巴克自由”吧。顺便要说一句,星巴克的咖啡真的又贵又不好喝,现在有很多新兴的咖啡连锁品牌做得都很好,我经常喝一家叫Manner的咖啡,在上海有很多门店,好喝又实惠。
在外人眼里,IT是一个高收入行业,从行业平均薪酬来看,IT从业者的收入确实要高于很多传统行业,当然,这个行业也很辛苦。一线大厂的薪资是最有竞争力的,相应的,作为从业者付出的也要更多,996就是一个经常被人们提及的话题。此外在咨询公司和有自主产品的中小型IT公司,收入也是很不错的,而500强的甲方公司也是很多人的职业首选,相对来说,最差的是那些在行业里不知名的中小型外包公司,无论是能给到的待遇还是工作性质都很难吸引并留住真正的人才。
专注是最好的修行
虽然IT是一个科技行业,但我一直觉得“聪明”并不是这个行业最重要的资质,当然,如果你很聪明一定是件好事情。在这个行业工作五年和十年之后,你会发现同时期参加工作的人,他们之间的距离会迅速拉开,除去中途改变职业发展方向的,大部分走技术路线成长起来的人靠的并不是聪明,而是常年坚持不懈地学习和积累。
我很庆幸在工作这么多年之后,还对编程保持着简单而朴素的热情。作为一名程序员,最本真的乐趣和成就感就是写出简洁、优雅又高效的代码,这里面最关键的并不在编程语言本身,而是我们的设计思想和设计能力,也就是大家所说的“内功”。
好的设计能抽象出隐藏于业务描述中的实体和概念,理清它们的定位与职责,能将复杂的逻辑拆解并委派给合适的角色,然后通过它们之间的协作去解决最终的业务问题,这是面向对象编程最本质的思想,也是编程最有乐趣的地方,优雅的设计总能让人着迷,当它被实现出来并完美运行的那一刻,成就感所带来的喜悦是一份最好的奖赏。
这个行业每年都会涌现大量的新技术和新概念,有的成功地引领了趋势,有的则如过眼云烟,两三年之后便销声匿迹,为了增加自身的竞争力,从业者需要不断地学习新事物,并且还要基于自己的经验判断它们的虚实,从而决定个人或团队的发展方向,因为一旦决定投入到某个新兴领域,就需要投入大量的时间和精力,否则很难有所建树。
让一个人常年专注在一件事情上是很难的,一定要有某种内在的驱动力才能长久。从“菜鸟”到“大牛”,每个人的成长经历不尽相同,除了个人的资质,努力和一些运气之外,我在这个行业很多优秀的人身上看到过一个共同的特质,那就是对“表象背后”的好奇和研究,这是驱使很多人不断前行的动力,也包括我自己在内。
技术上的“表象”可以理解为框架的上层接口、通用型架构(如MVC)、设计模式以及那些形成广泛共识的最佳实践,这些表象的“背后”是框架的底层实现细节,是架构和模式的设计思想与对问题的化解思路,是形成最佳实践的初衷和优化过程。很多人停留在了“会用”的程度上,他们缺乏对背后逻辑和深层设计思想的好奇与探索的兴趣,这也制约了他们在技术上的发展。
而对这些知识和经验的学习与思考会帮助人们更加透彻地理解原理,更加深刻地领悟设计的本质,最最重要和宝贵的是它能提升我们解决问题的能力,这是从业者最核心的竞争力,是个体之间实质性的差距。
关于学习和积累的一个很好的习惯是把它们记录下来,如果你有自己的博客,可以把日常工作中遇到的问题和解决方法写成文章保留下来,或者针对正在学习的技术做一些笔记,经过日积月累,个人的技术实力会得到很大的提升。记录和写作的目的并不在于产出那些文档,而是在写作过程中,我们会重新梳理和思考所面临的问题与解决方法,这一过程有助于我们加深对知识的记忆和理解。
结语
以前听过一个说法,说25岁以后的日子会过得越来越快,我来到上海那一年刚好25岁,回想在上海的生活说得真是贴切。这么多年,努力工作,跳槽,升职,加薪,职场上的那些事一样没落全都经历了。
技术越做越深,经验越来越多,但生活却越来越平淡,有时候我会想起在阳澄湖边的那些日子,一边是难以为继的收入,一边是简单快乐的生活,岁月给了我们一些东西,然后又从我们身边拿走了另外一些东西。
这是一个痛并快乐着的行业,有艰辛也有收获,愿十年之后,我依然能像刚刚走出校园时的样子,对工作,对生活,对这个世界保有着热忱和赤子之心,愿你也一样。
*关于作者
耿立超,架构师,14年IT系统开发和架构经验,对大数据、企业级应用架构、SaaS、分布式存储和领域驱动设计有丰富的实践经验,热衷函数式编程。目前负责企业数据中台的架构设计和开发工作,对Hadoop/Spark 生态系统有深入和广泛的了解,参与过Hadoop商业发行版的开发,曾带领团队开发过多个基于大数据技术的企业数据平台,完成数据采集、数据仓库、实时处理和数据服务在内的完整平台建设。著有《大数据平台架构与原型实现:数据中台建设实战》一书,个人技术博客:https://laurence.blog.csdn.net/
《大数据平台架构与原型实现:数据中台建设实战》已在京东上架