老司机乱谈技术人员的修炼之道
时光荏苒,日月如梭,蓦然回首,又逢新春,老司机系列已经一年了。我们有幸生活在一个伟大的时代,信息技术的进步,已经不是在加速,而是在爆炸,时代的奇点即将来临。在过去的一年里,人工智能AlphaGO 已经进化到2.0(抛弃了人类的棋谱实现自我进化),特斯拉已实现第5级自动驾驶,NVDIA宣布自己是一个AI芯片公司,计算机视觉的发展速度一日千里,各种虚拟化、云技术也是如日中天。我们回头反思一下,公司员工的平均年龄三十出头,想想爆炸式发展的几十年后,是否有自己发展的空间。我们必须时刻保持学习,保持进步,形成自己的核心竞争力,否则将被淘汰,甚至是被机器淘汰。在前行的道路上没有捷径,美国著名科学家富兰克林认为:人生成败的关键就在于一个人能否每时每刻持之以恒地追求自己的目标。而“持之以恒地追求自己的目标”,就是意志的行为表现,也正是富兰克林成功的秘诀。作为技术人员,天赋不是最重要的,能否每时每刻的保持学习与进步才是从小工到专家的唯一途径。
莫见长安行乐处,空令岁月易蹉跎
在2017年职级晋升前夕,下面浅谈一下技术人员的修炼之道。
兴趣
百年云烟只过眼,不为繁华易素心。作为一个技术人员,你的经济收益只是你在追求技术道路上的副产品。你的能力提高了,有自己的核心竞争力,收益自然会提高。很多人在这个问题上面本末倒置了。在个人能力提高的过程中,无非要扩展知识的广度和深度,知识的广度让你工作变得得心应手,知识的深度决定了你的核心竞争力,在某一个领域做到TOP 1%,你就变得非常有竞争力了。而在知识的深度方面,必须经过长期的积累,没有兴趣是很难达到的,所以兴趣在一个技术人员的进步的过程中非常重要,决定了一个人能在技术的道路上走多远。把自己有兴趣领域的事情做精做深,这是一个很好的投资渠道。
这里我们要分清什么是技术什么是工具,比如Python,作为语言只是一种工具而已,就一种工具而言,你很难成为专家。云计算,网络安全,网络通信,这些就是技术,有一个完整的体系,需要你在体系内的各个维度都有深入才会有成果。
像企业家一样思考
有了兴趣之后,我们要提高自己的格局。我们不要把自己认为是雇员,这样的意识只会让自己消极怠工。我们应当认为自己就是一家IT公司的负责人,当然这个公司可能只有自己一个人,但这不是重点。Tencent就是我们自己公司的客户。我们向Tencent提供IT服务。
首先,我们作为IT公司需要盈利,我们向Tencent输出自己的服务,这是我们的核心竞争力,也是决定我们收入的指标。所以我们有足够的理由,持续优化自己的服务,提高自己的效率,提高自己的核心竞争力。当我们的角度不一样了以后很多问题迎刃而解了。
第二,自己作为公司的负责人,我们应该经营自己的资产——技术资产,并且规避各种风险。为了达到这个目标,我们理所当然应该不断的学习进步,因为技术资产的保质期比较短。同时我们应该关注热门技术,跟上行业的脚步。我们需要加强自己的学习适应能力,如果有需要的时候具有快速资产重组的能力。
长板
知识的广度让你更容易完成工作,你知识的深度让你提高竞争力。我们用性能优化来说明知识深度的问题。性能优化受到各个维度理论上限的制约。我们在某一个维度的优化首先要考虑极限性能。比如一个转发系统,cpu对数据的访问即使每次命中cache(L3)都需要30个左右时钟周期,这里cpu的主频就给你的转发系统划定了一个面,cpu的数据处理能力。网卡比如Intel 25G的网卡,这就就给转发系统在另外一个维度划定了一个面。我们只能在有限的空间内进行优化。
对于各个具体维度的优化来说,就是你知识深度的表现。比如内存子系统性能优化,普通工程师优化的是内存层面的东西,专家优化的可能是Cache,如何提高Cache命中率,如何Prefetch。或者考虑是否考虑使用Hugepage来提高TLB的命中率。对于cpu的深层次优化也有超标量,SIMD等方法。
下图是一个很简单的指令并发的例子,可以看到第二个循环里的两个语句因为没有前后数据依赖关系,可以被CPU并发,速度上有明显的优势。类似的代码在一些底层库中有比较普遍的应用。
运行时间对比
短板
每个人都有自己的短板,虽然长板决定了你的高度,但是作为技术人员,如果短板太短也是不行的,短板会决定你的工作效率。举个例子比如沟通能力,这是需求的输入,如果输入没有处理好,你如何开发呢?当然我们不排除你是一个系统底层的工程师,需求来源于自己,或者自己也兼职了产品的角色,给自己提需求。输入处理的好,可以事半功倍。以前项目组人少,我自己给自己提需求,开发效率非常高。后来团队的人多了,沟通成本也大了,我发现大家浪费在沟通上的时间非常多,造成了团队整体的输出效率变低。如果沟通效率非常高,会使整体的开发效率有一个比较大的提高。
自己上学的时候,语文成绩比较差,150分的卷子一般考100就谢天谢地了,主要写作是一个大问题。为了弥补自己的短板,我就开始写文章,坚持下去,在这个过程中,是一个知识总结沉淀的过程,也是定期检测自己是否进步的一个手段,如果你看到自己以前写的文章很好,那么证明自己退步了。
我们要分清什么是真正的短板,因为人的精力都有限,只可能选极少的方向进行深入的学习,比如网络安全这个方向,10多年以来我一直对这个方向很有兴趣,但这个方向需要花大量的时间深入研究才会有成功,虽然有兴趣经常关注,但是也停留在比较肤浅的阶段,但这个不算是短板,了解一些重要的概念原理就够了,但是我们要避免一无所知。
保持学习的态度
“业精于勤,荒于嬉”,这句古话至少在现在依然成立,想成为大牛,没有捷径,需要付出比别人更大的努力。追求卓越应该是技术人员的一种习惯。
选择了技术生涯,那是一艘贼船,理想是你的罗盘,而兴趣就是你的动力。没有风平浪静,只有惊天骇浪。我们必须时刻保持清醒,保持学习,保持进步,否则就会被巨浪淹没。在回家的飞机上翻了一本书《推理的迷宫》,这本书的初版是1987年。30年了只做了一些修订,有关哲学的知识保质期非常长。而技术方面呢?就拿网络优化来说,10多年前我们在谈论C10K,而现在我们谈论的是C10M,优化的手段和方面都不相同,10年前写的很多文章书籍,都已经过时,当然涉及底层的一些图书的生命力长一些。在技术栈里越靠近底层更新的越慢,越接近应用层,更新的越快。我们需要的持续的学习,跟上时代的脚步,不能仅仅停留在能解决工作中当前问题的状态。
我们所在的世界很浮躁,充满了各种诱惑。既然作为技术人员,就要能在浮躁的世界里静下心来,心素如简,人淡如菊,潜心学习,踽踽独行,而不是满足于可以做好当前的工作。只是能做好当前的工作,是没有什么核心竞争力的,是可以被随时替换的,关键是自己认为的好,其实换一个人来看,也许是很烂,因为自己没有见过更好的,多年以来一直在原地踏步而没有进步,仅仅是保持了一个能用的标准。
时间从哪里来?学会自我克制与时间管理。CPU可以超标量,我们的很多时间也可以复用。就说看美剧例如《BattlestarGalactica》,我们至少在娱乐,英文听力,思考人生哲理三个维度上都有收获。
为什么把兴趣放到第一位,兴趣是用来填补自己业余时间的,有了兴趣你的时间怎样都会挤出来的。想一想很多牛人比自己还努力,自己有什么理由不努力呢?人生短暂,每一天都应当寻找更好的自己,切莫辜负了岁月。
成功没有捷径,但是学习方面可以有捷径,学习的效率非常重要,否则你学习的速度会比知识淘汰的速度慢。例如,如何快速学习一个新框架呢?对于后台开发来说洛阳铲GDB这个时候就派上用场了。我们首先对这个框架要有一个大致的了解,然后就可以对测试代码打盗洞了。只需要很短的时间就可以大致了解这个框架的调用步骤,运行原理,效率高于直接阅读源码,尤其是对于C++这样特性复杂的语言。在洛阳铲下框架了无秘密,调用过程、变量变化,一切尽在掌握。当整个机制熟悉以后,有的放矢再来细看一些具体的源码,做到事半功倍。
人的潜能是可以挖掘出来的,当你说太晚的时候,一定要谨慎它可能是你退却的借口,没有谁能阻止你成功,除了你自己。——王德顺
追求卓越
技术人员必须要追求卓越,追求完美,具有工匠精神,并不是仅仅满足需求。代码是写给人看的,不是写给机器看的,代码是一种美,性能追求极致,这里有很多可以追求的东西。每天写一大堆代码,写的东西却缺乏灵魂,缺乏思考。代码不是以量取胜的,比如一个游戏你可以写出50万行代码,也可以仅有5万行代码。代码多少跟游戏收入,功能多少,用户体验没有任何关系,而且代码越多必然bug越多,甚至导致项目终结。
下面我们说说在性能方面追求极致的例子。在CPU领域,10多年前就是3Ghz这个标准,现在依然如此,CPU的发展趋势是多核,低功耗,架构优化等方面。最近加州大学伯克利团队创新发明“鳍式晶体管”,将晶体管做成垂直的薄膜,使晶体管密度增加,令半导体微型化大幅度再成长。只要薄膜做得更薄,晶体管微型化就能继续,从而不断提高电子产品的运算速度。发明者指出,现在晶体管的三极已经可以缩小到1纳米的宽度,未来半导体晶体管的密度还将再增加1000倍,这也就意味着互联网将来的速度和普及度也还有千百倍成长的空间。我们有理由相信很快会出现100核甚至1000核的通用CPU。其实在2016年已经有实验性的专用千核处理器诞生。
各大互联网公司在CPU方面基本都是一个收敛的趋势,主流采用1-2种cpu,比如亚马逊定制的E5-2666(12核,24线程)。由于机架,供电,散热等各种问题,采用核心数越多的CPU就可以更好的控制成本。然后利用VT-x,VT-d相关技术,在交付给业务方使用的时候用容器或者虚拟机的方式进行分割,因为很多业务无法有效的利用多核。对于游戏后台来说一般也就是简单的多进程方式,这种利用多核CPU的方式比较原始,存在负载不均,服务器性能以及资源浪费等一系列的问题。这种模式就相当于一辆重卡可以拉完的货物,拆分成了20辆小货车一起拉,效率和成本是比较低下的。
基于这些问题我们最近对游戏的框架也进行一些改造,使游戏服务器可以更好的利用多核的运算能力以及服务器资源,当然这是一个长期的过程,有些东西需要推动周边项目组配合。对于一些服务器端轻负载的滚服游戏,做到单物理机(取决于Core的数量)支撑300个区,30万以上同时在线是可能的,这将很大程度上节约服务器成本,降低部署代价。可能我们会想到网卡有瓶颈,其实问题不大,C1000K问题已经有几年了,25G网卡也在慢慢普及当中,linux协议栈对小包性能不佳的问题,也有各种解决方案(比如libuinet等用户态协议栈)并且在逐渐成熟。
单个服务器内部的系统结构
这个例子是分区分服的游戏,全区全服的类似。下面说说设计中的一些思想。
均衡:整个系统里运算能力是有限的,我们要把有限的运算能力(Core)分配到2个主要方面,网络IO(所有玩家产生的IO,DB通信的IO,周边系统SNS/Pay等通信的IO)和逻辑运算。整个系统里如何分配是可以配置的,根据不同类型的游戏得出的经验值来配置,以达到最大的利用率。
泛化,IO线程收敛。目前来说各种IO都有自己的代理(至少一个进程),既然要最大化的利用运算资源,我们的网络IO应该是混用一组线程,以期望达到最大的利用率。当然不收敛只是存在一点浪费的问题,并不是很大。网络线程会通过多条队列跟业务线程进行数据交换。
虚拟化,数据与运算资源分离。在单个服务器里我们有多个运算单元(thread/core),每个core管理了多个游戏分区。由于一个运算单元内部有多个游戏的虚拟分区,在资源利用率上面有很大的提高,在负载方面就更加平滑,对运算资源的利用也就更加有效。一个具体的逻辑分区可以通过配置或者自动分配到任意的core上面,以应对火热的分区和空闲的分区。
Lockless,在系统内每个线程都是独立运行的,内存资源都是独立的,所以不存在数据之间的竞争。另外对于任何2个需要通讯的线程之间都有一个通讯队列,总共需要n*(n-1)/2个队列,一个队列内部,由于生产者和消费者都只有一个,所以不存在锁。整个系统内部是以一个流水线的方式工作,尽最大可能利用硬件的计算能力。
不管是做什么业务,我们仍然是技术人员,我们不能放弃在技术的道路上持续前进,要做到未雨绸缪,不能等到问题来了在被动的进行优化改造。技术上的每次的改动都应当是平滑的,对业务层面是无感知的。有些人担心对业务有影响,担心Bug,那是因为作为一个技术人员对自己的能力还没有信心,还不能做到游刃有余。想一下建筑工程师,硬件工程师,机械工程师,同样在进行各种改进革新,但是Bug率远低于软件工程师。有些人担心会占用大量的开发时间,增加系统复杂性,就上个例子来说,其实系统的改动不大,而且是一个持续的过程,增加不了多少开发时间,其实在业余时间里就差不多能完成改造。至于复杂性,架构应该对业务透明,并不会引入多少复杂性。实际上只有缺乏思考的代码,在改造和重构的时候才会引入大量bug,影响业务,影响进度。
职级晋升之路
在职级晋升的路上,我们应该躬自厚而薄责于人,多反省自己,不要总是盯着别人的是非不放,技术人员不应追求偶然性而是要追求必然性。通道存在的目的是帮助大家成长,而不是故意设置障碍。通道的评委也是普通人,只能尽可能的保证公平,而无法保证绝对的公平,但是你的答辩足够优秀,绝对不会出现误判的情况。这里要说一下通道评审的过程。每个人答辩完成后,3个评委会对面试人打分,通常有3种情况,通过,不过,待定。优秀的人当场通过当然是少数,大部分人集中在待定的情况。而待定的情况基本是每天评审结束后评委会再次讨论一次。PPT中有亮点,评委在当天评审结束后的总结中能记起你的概率极大的提升了。
这里说说PPT应该怎么写,因为每年都会收到一些PPT,这些PPT一看就知道不用评了,肯定过不了。其实写清楚三个问题就可以了。我是谁,我从哪里来,我要到哪里去。我这里指你所负责的业务。
我是谁
首先要透彻的理解自己所做的事情,了解其中的难点与挑战。如果你认为自己所做的事情确实没有挑战,有没有想过把工作自动化,自己释放出来做其他的事情呢?或者自己依然有理想,怎么不换一个更适合自己发展的岗位呢?有兴趣做游戏开发的同事可以rtx联系我。
有的同事说自己做的工作很简单,比如做了一个日志系统。如果你自己已经认为是个很简单的东西,就属于自我放弃了。日志是分布式数据库系统以及实时计算系统的核心。Hadoop,Kafka ,Paxos等等都是基于日志的,日志是现代分布式系统的基石。系统容量提升了之后,如何提高I/O性能,如何压缩,如何容灾,如何保持时序,这都是需要考虑的问题。你还会认为日志是个很简单的系统?请注意,这里说的是让大家提高对自己所负责系统的理解,而不是让大家瞎吹牛。
我从哪里来
要把自己的业务介绍清楚从面到点,从项目背景起源、整体架构到难点亮点。首先是项目背景以及整体架构,这里不是重点,是为了避免评委后面听的一头雾水。清晰简单的介绍清楚自己项目的起源,架构即可,但是这里面各个细节都要清楚,不是让你讲出来,而是做到游刃有余,避免出现一被提问就出现“这块不是我做的,我不太清楚。”等类似回答。系统可能不全是我做的,但是系统里任何设计细节我都知道,有什么缺陷,应该如何改造我了如指掌。这是一种技术人员应有的态度。
重点的问题是介绍自己的遇到的困难和解决方式。这里是体现你能力的地方。
· 问题的背景是什么
· 一共有几种解决方案,各有什么优缺点
· 我为什么要这样解决
· 有什么值得改进的地方
· 后续做过什么样的优化
· 效果如何
可能会有人觉得工作中没有遇到什么有挑战的事情。你是否考虑跳出当前的环境?人的环境有三种:
· 适应,工作没有挑战,不需要动脑
· 学习,有挑战,必须时刻学习,才能做好
· 恐惧,无法胜任
只有呆在学习的环境中才能使自己进步,这个环境可以自己创造。呆在适应的环境只会温水煮死青蛙。当你觉得难点这个环节没有的时候,是你该仔细考虑一下自己的职业规划了。当然也可能是因为自己的知识水平有限无法发现能够突破的地方。
我要到哪里去
对自己今后工作的展望,这里也是亮点,可以起到画龙点睛的作用,让评委在最后的总结中还能记住你。这里是展示你思考的高度与广度的地方,但是要注意,要理论联系实际,不要天马行空,说的太空。
多年以前参加晋升答辩的时候,评委就问过我系统有什么缺点还能怎么优化,我说系统基本没有问题,由于游戏业务的特性决定了可优化的东西不多,已经能很好的承载当前的业务了。现在想一想,完全是自己当时思维的高度不够,同样的工作,我现在可以找出一大推值得挑战优化的地方,并且是按照年这个尺度来推进。
这里说的都是形象工程,锦上添花用的。冰冻三尺非一日之寒,能力的提升是日积月累,量变到质变的过程,不是精心准备一个PPT就能滥竽充数骗过评委的。从小工到专家,只有一条路,自己的努力前行与坚持不懈。
后记
一位得白血病的东京妇女被医院判了死刑,而IBM沃森用10分钟阅读了将近4千米厚的相关医学资料,随后给出医疗建议并救活了她。科技进步的速度远超我们想象,当我们曾认为是痴心妄想的各种技术,逐渐成为现实,我们曾经追求的永生也不是遥不可及,我们要严肃的开始思考,如何提高自己在科技爆炸时代的竞争力,自己与人工智能相比又有哪些优势。时代的奇点即将降临,2017年我们拭目以待。最后在鸡年新春,用自己多年前photoshop上色的一副图送给大家,祝大家2017找到自己前行的方向。
把握当下,恒持刹那
Jaco于2017年春节