vlambda博客
学习文章列表

编程人生 | Java 架构师曾波

图灵访谈是个很棒的栏目,初衷很简单,邀请技术人士分享编程故事。近年来做得少了些,不过,不会停止。讲述编程人生的作者你可能听说过,也可能没有,他们属于一个群体:程序员。他们的编程人生,若能引发诸位对于自身及编程之旅的二三思考,足以。

技术的车轮滚滚向前,愿我们可以见证彼此留下的痕迹。

本期故事主角:Java 架构师曾波。
最近,由曾波翻译的 Java 性能优化经典著作《Java性能优化实践》一书出版了。图灵借此机会跟曾波聊了聊他的故事。一开始我们请曾波进行简单的自我介绍。后面,结合波姐的经历,图灵提了几个问题。希望一位 Coding 十几年的程序员的经历和感悟,可以跟诸位的编程之旅产生某些共振。

曾波,资深互联网架构师。因为经常在网络上跟年轻人敞开心扉,并给予悉心指导,就如“知心姐姐”一般,人送外号“波姐”。


波姐先后任职于微软、什么值得买、京东金融、鹏博士电信传媒集团等国内外互联网企业。曾参与多家公司技术团队从组建到成熟的过程,并主持实施了重大技术决策和技术落地,在大规模复杂系统架构和技术管理方面拥有丰富的实践经验。



从小不是“好学生”

高中当过“打工人”

大学与微软遇见好导师

我从小生长在贵州省的一个小城市。儿时记忆里每天都在山上跑来跑去,从来就不是什么“好孩子”。在学校里,也不是老师眼里的“好学生”。上课时,除了老师讲新课时能安静下来,其他时候都在前后左右交头接耳。老师经常向我父母告状,说我有“小儿多动症”,上课时头摇得就像“货郎鼓”一样。不过幸运的是,每次考试都能稳定在前十名,就这样读完了小学和初中。

刚一上高中,受《古惑仔》的影响,我的成绩严重下滑(经历过这时代的人应该都懂),没什么心思念书。那段时间,我妈顶着压力让我休学一年去体验社会(当时没觉得有什么,现在回头看,这样的妈大概是世界上最了不起的母亲之一了)。这一年我尝试了很多“工作”,在市场里卖过菜,在大排档里当过服务员,还学过汽车修理和汽车喷漆……体会到了“打工人”的苦后,我主动找到家里人让我重新回到了校园。高考时,家里人都希望我能够选择读师范类学校,日后可以有个稳定的工作,而我遵从了自己的想法,选择了计算机专业,也是运气好,还真被录取了。

读大学的时候,我遇见了几位很不错的老师。其中有一位引荐我进入学校网络中心。大二的时候,我开始负责学校服务器和教务系统的维护工作,此间我的编程技能“突飞猛进”。

大学毕业后很幸运地通过面试进入了微软,遇见人生第一任领导 Winston,一位非常棒的管理者,他教会了我很多做人做事的方法和道理,为以后的职业发展打下了基础。2011 年,我离开微软,受邀加入一家创业公司体验了一段创业之旅。2013 年,公司被收购后,我开启了一段“疯狂周游列国”的模式。此后,我先后任职于什么值得买、京东金融、鹏博士集团等互联网公司。


编程启蒙老师:小霸王学习机

最早什么时候开始接触编程,用的是什么计算机,编程的初体验如何?

我最早接触编程应该是在 1995 年前后,记得是小学毕业那会儿,暑假在家用小霸王学习机打游戏呢——当然了,除了打游戏,还可以学习(你懂得)。小霸王学习机上自带的 GBASIC 可以进行简单的编程,比如照着附带的教程做一些小例子。

第一次照着附带的教程用键盘在蓝色屏幕敲入并成功执行类似

INPUT XSUM=2*XPRINT SUMEND

这样的计算后,那种满屋子跳着喊叫的兴奋感、成就感真是让人无比怀念。

学会了简单的 GBASIC,初中做数学题的时候我就开始利用 GBASIC 来偷懒了,小霸王学习机名副其实地变成了“学习机”。

到了初中二年级,在微机课上,我真正摸到了电脑,模糊记得电脑的配置是:Intel Pentium II 300 CPU、32M 内存、富士通 3.2G 硬盘,微星主板。通过微机课,我学会了制作简单的网页,不过这时候用的是 HOMEPAGE 或者 Dreamweaver。

真正称得上做出能运行的程序应该是在高中,那时候流行聊天室,我就学习了基于 Perl(Practical Extraction and Report Language)的CGI、ASP(Active Server Pages)制作一些动态的网页和聊天系统。如果说还能靠写程序赚点钱,是到了大学之后的事情了,比如自己写了一个简单的 ASP 的 CMS 系统给企业做网站。

编程人生 | Java 架构师曾波

摄于普吉岛,© 曾波



始于编程,通过管理协调更多资源

你将编程视为工作还是乐趣多一些?

写程序对我来说一直都是兴趣,在高中时期,我理想的职业就是做程序员,因此我算是实现了自己的职业梦想。工作十几年了,我觉得能够从事这份职业挺开心的。

你现在做管理多于编程吗?觉得管理和编程最大的差别在哪里?

目前的工作岗位上的管理工作远远多于写代码。个人觉得,管理岗和开发岗最大的区别有两点。

一是在处理问题上,管理讲求权衡利弊、合作共赢。管理面对的是人和事,有很多中间态,也就是说不确定的因素,而这些靠个人很难突破,往往需要协调团队及多方资源去解决。反观程序员,大多数情况下处理的是明确的业务问题,就像敲代码一样非 0 即 1,通常依靠自身能力可以独立解决。

二是在知识体系的深度和广度上,程序员更倾向于追求自己在某个技术领域的知识深度,而技术管理者不但需要在某个技术领域内积累到一定的深度,还需要管理、规划、组织、创新、沟通、战略、行业、商务、谈判等知识来支撑自己进行决策。当然,并不是说程序员岗位不需要这些能力,而是说管理者对这些能力是强依赖的。


国外大厂、国内大厂 VS 创业公司

波姐在国外大互联网公司、国内大互联网公司、创业公司都工作过,能谈谈在这几类公司任职,最大的不同点是什么吗?

这个问题有点“一千个人眼里有一千个哈姆雷特”的感觉了。就我个人而言,主要还是企业文化的差异,外企对工作方式、编程习惯比较注重。

当年我入职微软第一天接受的培训就是邮件礼仪、会议礼仪,接下来就是工作方式的形成。微软内部实行导师制,新人都会被经验丰富的导师带。在试用期内,导师每个月都会邀请跟你工作上接触较多的同事,帮你指出“问题”,然后会跟你约时间讨论和解决问题。接下来呢,你得想办法努力去改掉自己的坏毛病。Code Review 每天都有,如果只是应付差事,那基本上,每天的 Code Review都会让你很难堪。对于大部分人来说,正是由于自己的代码每天都会接受“审判”,因此大家会在写代码前反复思考、推敲,甚至查找“海量”资料来保证代码的正确性。

在工作方式和编程习惯的培养上,感觉国内大部分公司还是值得向国外知名互联网公司学习的。在技术选型上,外企似乎更灵活一些。打个比方,假设你需要用到中间件,外企一般会根据业务特点来进行选型,而国内大厂往往有一套固定的选型。很多情况下,这种做法容易导致企业和员工束手束脚。

国内程序员工作压力相对较大。目前,国内的整体氛围是:大家都很努力,员工努力、产品线努力、BU 也努力,让每个人有种感觉——你要是不努力马上就要被淘汰了。当然,这个过程中有技术的快速成长与薪水方面相对应的收获——但是,也有很多人,深陷凌晨的城市与 N 个月奖金的泥淖中不能自拔。

创业公司那就更甚,玩的堪称是与死神赛跑的游戏,多数时候只能考虑公司明天还能不能活着的问题,因此,更多就是管理层不断地下任务,下任务,下任务,程序员不断地 coding,coding,coding……而不是 thinking。紧张的节奏压得你没有时间思考,也没有时间总结。

喜游玩,乐结交

作为程序员,你是否觉得工作几乎成了生活的全部?你怎么看待这个问题?

你这是挖坑让我往里跳吗?哈哈哈,我一直都认为工作永远只是生活的一部分,只是不同时期工作所占比例不尽相同。我这里所指的工作不仅仅是在公司的工作,还包含了对专业知识的学习,这个还和自己的职业规划有一些关联。我个人觉得,刚从事工作前 5 年是快速学习成长期,工作差不多可以占据全部生活的 60% 以上。工作 5~20 年之后,如果发展顺利,你基本上已经成为公司的骨干力量,也差不多成家立业了,这个时候工作在生活中的占比就相对来说会低一些,大概在 40%~50%。等到工作 20 年以上,大多数人已经步入管理层或者是转岗了,工作在生活中的占比甚至可能低于 30%。

不编程的时候,你都做些什么,还有其他兴趣爱好吗?如果不做程序员,你想干哪一行?

其实也没啥特别的兴趣爱好,和大多数人一样喜欢旅旅游、看看书。工作这十几年,祖国的大好河山基本走过了,还去了 30 多个国家和地区。不做程序员的话,我应该会从事一些咨询顾问类的职业。因为平时对这类行业和领域比较关注,经常关注它们的行业动态、政策走向。

生活中有一部分程序员不太擅长社交,据我所知,波姐在技术圈朋友众多,是否可以讲讲其中的心得。

其实吧,程序员不是不太擅长社交,而是大多数情况下“懒得理你”,不信你和他讨论一下“PHP 是世界上最好的语言”这个问题试试。

以上纯属程序员的自嘲,别当真。其实这些都来源于大多数人对程序员这个群体的不了解,从而才有了以讹传讹。在国内,程序员大多活动在北上广深杭渝蓉等一二线城市,且大多都是理工科出身,从覆盖范围上来说相对较少。而理工科出身的人大多比较理性且直接(别人所谓的“情商低”),在与人交流时,如果对方的逻辑不严谨,一来二去容易产生一些误会。我记得有那么一个段子——程序员 A 的妈妈跟 A 说,你去菜市场买 2 斤西红柿,如果看见卖西瓜的就买一个。不一会儿,A 就回来了,手里拿着一个西红柿。虽然是一个段子,但也能在一定程度上说明:一小撮程序员在很多情况下处理起问题来就像敲代码一样非 0 即 1,不知道灵活变通。好事不出门,坏事传千里。慢慢地,这一小部分人就成了一个群体的“代言人”了,一小部分人的特色就成为群体的特征标签了,类似的还有程序员爱穿格子衫、程序员闷骚等。

其实程序员也和普通人一样,不能用不善社交的部分程序员来代表整个群体。就我周边认识的程序员来说,绝大多数是幽默风趣、博学多才的。

最后说一句:关爱程序员,从你我做起。

编程人生 | Java 架构师曾波

摄于北极圈,© 曾波


《Java性能优化实践与翻译趣事

大家知道,《Java性能优化实践》是领域内一本比较经典的书。波姐能说一下书里讲到的典型的性能优化问题有哪些吗?是否能举一两个 Java 工程师在日常工作中频繁遇到的问题。

《Java性能优化实践》并不是一本代码性能优化手册,而主要聚焦在性能方法论、性能测试理论、底层的技术和机制以及优化分析的度量、统计和工具等方面的知识上,只在第 11 章、第 12 章有针对性地对集合类、并发库做了一些性能问题的总结介绍。

HashMap 应该是每个 Java 程序员写代码和面试必备的集合类了,书中会从原理上告诉你旧版本的 HashMap 违反了香农的严格雪崩准则,而在最新设计中将 indexFor() 替换为使用键对象的 hashCode(),并应用一个掩码将哈希中的高位向后移位。也会告诉你如何为影响 HashMap 性能问题的 initialCapacity 和 loadFactor 两个变量设置适当的值从而避免性能问题。

同时,这本书也在第 12 章的小结中向广大读者总结了使用多线程来改进应用程序之前我们应该考虑哪些方面的问题,在设计的过程中需要避开哪些坑,聚焦于哪些方面的设计等诸如此类的问题。

翻译《Java性能优化实践》这本书的过程中,最有趣的事情是什么?

我觉得最有趣(ga)的事莫过于找作者进行疑问解答了。这本书中有个别地方写得比较随意,这部分内容来源于作者的 Blog 或者是之前在 InfoQ 上发表过的文章,比如在原书 3.3.1 中有那么一段:“JVM 有一个与内存相关的软件特性,其首字母缩写也是 TLB(后面会看到)。当提到 TLB 时一定要确认是在讨论哪个特性。”但是后面又没有针对 TLB 相关的讨论,我翻遍了所有 JVM 的资料也没找到 TLB 特性,因此,我猜测是作者糊涂了,把 JVM 里内存相关的 TLAB 写成了 TLB。类似这样的问题原书里有多处,为了寻求作者的解答,我先查看了原书所有的勘误,勘误中有很多类似的疑问,但作者一直都没有回应。随后,我就给作者发邮件,等了差不多 2 周,没得到回复。于是我又跑遍了 LinkedIn、Facebook、Twitter 等一切能找到作者的地方,各种关注、发私信,终于等到了作者的 Twitter 私信回复,这才算是和作者联系上了。翻译完之后,我粗略看了下,我跟作者前后交流了上百封邮件,才把书中的一些疑问给解决了。

一条建议与一本书

如果要给刚入行或者入行不久的年轻人一条建议,你会给什么?如果要为年轻人推荐一本深刻影响过你的书,它会是哪一本书?

对于刚工作不久的年轻人,我认为最关键的一点是:在职业初期尽快做好职业规划,并持之以恒地着手学习,且在不同阶段瞄准不同的学习目标。

经常遇见刚入门甚至工作多年的程序员说“我很迷茫”“我职业没方向了”“我到瓶颈期了”……每次我都会问对方几个问题:你的职业理想是什么?近三年的职业目标是什么?最近在看什么专业书籍?这些人中极少有人能就某个问题给出令他们自己满意的答案。一个人的职业生涯可以划分为很多阶段,每个阶段与其他阶段都承上启下、互为因果。因此,即使从同一条起跑线开始,经过一段时间,大家的发展也会迥然不同,有些发展得不错,有些差强人意。如果你留意观察,成功的人通常是那些有坚定目标并持续努力学习的人。

要说对我影响比较深刻的书,我推荐大家读读德内拉·梅多斯的《系统之美》。人生是由一个个选择组成的,但我们在做决定时往往只见树木不见森林,并没有站在一个更高的系统层面去思考。比如团队有成员离职了,我们的第一反应通常是通知 HR 补人,而不是去思考是不是团队本身出了什么问题。《系统之美》关注的大局是整个系统,这本书也是在教我们如何去应付复杂系统的问题——透过问题看本质。我经常跟身边的人说:看问题需要至少高自己两个 level 去思考。我把它戏称为 Two level 理论:一则是让自己可以换位思考,二则可以让自己逐渐养成从更高维度看待问题的习惯。如果你能够从“上帝视角”看待问题在全局系统中的作用(意义),那么你就可以很快很轻松地平衡取舍,从而做出决策。


关于性能问题的系统世界观

《Java性能优化实践》是 Java 工程师解决性能问题的指南针,打造了关于性能问题系统的世界观。计算机类图书新书畅销榜第 9 位,Java 工程师不可错过!(PS:如果要参加送书活动,出门楼下,截止 12:00。)

编程人生 | Java 架构师曾波


扫码 7.6 折到手


编程人生 | Java 架构师曾波



图 灵 社 群

编程人生 | Java 架构师曾波


点个 「在看」