21CTO社区导读:这是一篇关于技术人如何修炼内功的公开课,是由趣直播举办的一场技术人成长交流会,邀请了易宝支付产品中心首席架构师李艳鹏分享。
开发者要学习高并发服务、大数据、操作系统、算法和数据结构;学技术得学它的内功,内功就是基础。所以对于操作系统,我们一定了解它CPU、内存、磁盘IO和网络IO,并且据此粗略评估服务的性能;应用层面的小伙伴们可能对算法和数据结构的应用比较少,也比较简单,但是它代表了一个人的逻辑思维和思考能力;在互联网公司,高并发服务和大数据是两大方向。
解决高并发主要使用的就是分而治之的思想,但是也会产生一致性的问题;大数据是最近比较火的方向,所有的根基都来自Mapreduce、Gfs和Bigtable这三篇论文,推荐大家阅读。
以下为活动的视频内容。
接下来是分享文字与PPT版本:
有请李艳鹏老师!第一场分享是由艳鹏老师带来的,今天非常感谢大家来到现场。艳鹏老师是《分布式服务架构原理设计与实战》的作者,之前是一个朋友介绍他来我们平台做了一次直播,然后他相应的在服务器方面造诣比较深,他在易宝现在做首席架构师,也是技术经理,所谓修炼内功,我们会经常说,底层才是内功,在后端方面让李艳鹏老师来分享一下后端方面如何去修炼自己的内功?有请李艳鹏老师。
谢谢大家,大家下午好,我是来自易宝支付的李艳鹏,今天我给大家分享的主题就是技术人如何修炼好内功。这个内功包括技术的主题,也包括我们做人做事的主题。
第一个内容就是个人简介。
第二个内容就是分布式的服务架构。
第三个内容就是如何修炼技术的内功。
最后一个内容就是如何修炼我们做人做事的内功。
个人简介
首先第一部分就是个人简介,我个人是经历过几家公司,然后我从毕业开始进入花旗银行,又来到甲骨文,又在路透社和新浪微博工作过,然后我在这几家公司负责的系统主要包括 K12 的教育系统还有外汇的交易系统,以及一级市场的回购业务,最后在新浪微博我是负责视频的微博项目。
在不同公司,经历过金融公司,也经历过社交媒体的公司,不同公司业务有不同特点,比如说社交媒体其实它的量级比较大,但它的准确性并不是最大最好的,比如说在社交媒体的一家公司,其实有两千个出错的时候,只有一个会来反馈投诉,但是在金融公司是不一样的,在金融公司只要你有一例出错的,那要不是老板来找你,要不然就是你的客户来找你,所以金融公司的特点更注重准确性,当然他的量级也是很大的。
接下来我介绍一下我现在的工作,然后我现在在易宝支付,我是产品中心的首席架构师,我主要做产品中心的架构规划与落地,我还有一些其他职责,然后这些职责包括核心系统的建设与维护,主要包括交易,支付,渠道,还有商户平台等。
我还负责一些技术规范的建设和推广,以及金融行业中最重要的资金底线防火墙的建设,大家都知道金融行业是跟钱打交道的,那这个钱只要一有损失,这个损失就是非常大的,所以我在这边还负责资金底线的一个建设,然后还有,我还负责整体性能优化等等。
分布式的服务架构
第二部分就是分布式的服务架构,我们总体看一下它的目标,目标主要包含六个方面,这六个方面都是什么呢?
第一就是高可用,第二就是高性能,第三就是可伸缩性,第四就是可扩展性,第五就是安全性,第六就是一致性。我们一个一个来说这六个目标,它们是怎么实现的?
这六个目标,第一个就是可用性,我们在一般公司里边都会用 4 个 9 或者 5 个 9 来衡量,当然我们的易宝支付是可以达到 4 个 9,那 4 个 9 是怎么实现的呢?这个我们得从影响可用性的原因来分析,这个原因有很多。
例如我们统计了一下,去年影响可用性的主要原因包括什么?主要包括就是我们上线变更的时候,会影响我们 40%,50% 的可用性,那么我们就针对这个情况,我们就增加了架构评审和设计评审,还有技术评审等等,那我们就把这一块的窟窿堵住了,那我们可用性就可以提高上来,那下一个最重要的就是性能,大家常说性能的优化,但是性能的优化用什么方法来保证呢?
在我们分布式服务架构里边,最重要的就是一个分而治之的一个思想,我们通过分而治之的思想提高整个系统的吞吐量,然后另外一个就是由于分而治之,其实它会导致一些问题。
这个问题就是一致性问题。那么我们怎么解决这个一致性问题呢?是我们最困难的事,也是最有挑战的事,当然如果大家感兴趣,我这本书的第二章就是讲一致性的问题,讲一致性是怎么解决的?
第三个就是可伸缩性,是我们互联网项目中最重要的一个特性,为什么说它是最重要的呢?因为去垂直扩展,这个性价比已经变得很低了,所以我们都去采用水平扩展,包含应用层的和数据库层的,还有缓存等等,例如数据库的分库分表,缓存的分片,还有消息队列的消峰,其实我们都是为了让这个系统能够水平伸缩起来,然后提高它的性能。
下一个特性就是安全性,安全性其实大家常说的,就是有我们系统安全性,写代码的安全性,数据库的安全性,还有前端外部的安全性,但是总结起来安全性其实大家仔细想,其实只有五个目标,第一就是防泄漏,第二就是防窜改,第三就是防抵赖,第四是防偷窥,第五是防止中间人攻击,其实所有安全性最后的目标只有这五个目标,那这五个目标怎么实现呢?
就是现在密码学上的几个技术的点,那么第一个就是加密,第二个就是签名,第三个就是我们使用 HTTPS 的双向认证通道,防止中间人攻击。有了这些办法,我们刚才所说的那五个目标,其实都可以达到的,其实安全性也并没有那么负责,当然具体的答法和方式还是很多很多的。
然后我们下一个就是可扩展性,其实提到可扩展性,大家肯定觉得可扩展性和可伸缩性是一个概念,但是实际上这两个概念其实是不一样的,可扩展性指的这个系统的可修改性,将来能够进行比较快速功能的迭代,然后快速去满足新的市场需求,这个叫可扩展性,我们以前常说的可插拔,其实属于可扩展性,但并不是可伸缩性。
最后一个就是一致性,刚才我也说了,一致性是我们实施服务化或者微服务化以后,造成一个大的问题,我们都需要去保证。
那么接下来我们进行分布式服务架构,其实我刚才介绍了一些内容,但是实际上我们很难在 20 分钟内讲的比较透彻。然后我推荐三本书,第一本书就是京东开涛写的《亿级流量网站架构核心技术》,那这本书更偏向于高并发和高可用前端系统的一个架构分析和设计和方法还有实践。
第二本就是我和杨老师共同著的,分布式服务架构原理设计与实战,然后我这本书涉及到,包含了微服务化,一致性,可用性,还有大数据日志系统的建设,以及调用链系统建设,会包含一些 APM 的核心功能,再加上我们线上进行技术攻关和进行线上应急的一些经验总结,以及最后的容器化还有持续集成等主题,所以这些主题总体来讲更偏向于方法论和实战,还有一些案例,所以说推荐大家来看这本书。
最后一本书就是李智慧老师写的大规模网站核心技术,就是最后一本,大家看一下李智慧老师写的这本,大型网站技术架构核心原理与案例分析,李智慧老师写的,其实这本书应该有好几年了,应该好多年了,但是这本书讲的原理还有概念都非常的核心,非常的重要,推荐大家也读一下。
如何修炼技术的内功
下面是第三部分,其实我要分享的是如何去修炼技术的内功,我们要说如何去修炼技术的内功?我们先看一下,如果我们作为面试官,我们去面试一个候选人,我们从哪些方面全面评估这个人的技术能力?
大家看这三个图,还有底下的字,其实我会根据三个层面来评估一个候选人,包括广度,技术知识的广度和技术知识的深度,还有技术知识的高度,那对于广度指的是什么呢?指的是这个人做过什么事情?这个人学习过多少的知识?他用过多少语言?他属于使用多少工具等等,主要在他的知识面和他的经验,那什么是技术的深度呢?技术的深度就是期望每个人在某一方面一定是有造诣的,什么是造诣呢?
就比如说在 Java 上,你一定要了解 GC 的原理,你能够通过调节 GC 来提高它的性能,或者是你懂得我们 RDBMS 数据库的索引原理等等,并且能把这个原理应用到你的生产实践中,你一定要有几个主题或几个方面是你非常深入了解和学习过的。最后就是一个高度,高度这个事其实是我这两年才认识到的,以前我只是拿广度跟深度来看别人和看自己,现在又增加一个高度,高度是什么呢?就是你学这个技术有什么目的?学了这个技术能达到什么样的生产?学了这个技术是不是现在技术的一个前沿,还是说已经淘汰好多年的一门技术?
所以就是说,我们一定要站在很高的高度来看这些东西,学了是不是有用的?学了将来是不是有用的?将来十年有用,将来二十年是不是有用的?所以也跟我这门课一样,就是我们一定要修炼这个内功,因为内功是永远不变的,就是将来你可能过十年二十年,这个内功还是一样的。
下面主要是说我们如何去修炼这个内功?有多少方面需要我们掌握?一共有四个主题,我们先看下面两个主题,那就是操作系统,算法和数据结构,那先说操作系统,其实我们现在看各种新技术,还有我们用的各种技术,其实都跟我们操作系统有关,而且我们发现新技术新原理,很多东西从这个操作系统一些核心的原理上是能找到缩影的。
其实举一个非常小的例子,比如说大家说的微服务,大家是不是觉得微服务现在很火很新?但实际上在操作系统中是有微服务的,第一它的内核是微内核,第二我们想一下命令和管道,就是我们在实现一个复杂的日志搜索,我们一个命令接一个管道,再接一个命令,再接一个管道,其实每个命令是在完成自己它想做的事,有清晰的输入和输出,然后和其他的命令去配合着使用。
所以完全是一个微服务的思想,所以我说学技术得学它的内功,内功就是我们这些基础一定要掌握很扎实,所以对于操作系统来讲,我们一定要理解到它的 CPU,内存,磁盘还有网卡的 IO 等等这些原理,并且能够根据这些资源去评估你服务的吞吐量和 TPS 响应时间等等,这个评估指的是粗略评估,就是评估是没有精确评估的。
然后我们看一下算法跟数据结构,对于算法和数据结构,对于我们应用层的小伙伴们肯定是觉得,这个事,其实我们很少在应用层直接去使用到它,使用也非常简单,但是算法和数据结构象征着我们一个人的逻辑思维和一个人思考能力,所以一定对这个东西也要掌握一些,或者是要熟悉一些。我最后有一个高级算法,高级算法是指这些,比如说动态规划,贪婪,还有剪枝,递归等等,那为什么我说有高级算法呢?就是假设在座的每一位都是面试官,那来了一个小伙伴,小伙伴说我会动态规划,我可以写出来,我随便一个都可以写出来,那这个人要不是勤奋的,要不他就是非常聪明的,所以如果你会这个,一般都是会打动这个面试官的。
然后我们再看上边的两个主题,第一个是高并发的服务,第二个是大数据,其实在互联网公司里边主要有两个方向,就是这两个方向,一个就是高并发的服务,做线上服务的,一个就是大数据,那高并发的服务其实它的核心思想就是分而治之,就是我们单体系统架构,其实不是它的性能不能提高,是它在垂直扩展过程中,它的性价比非常低,非常贵,所以我们都用伸缩,采用分而治之的思想,但是分而治之以后产生的问题,那就是一致性的问题,因为分开了,他们的协调一定会有问题。
至于一致性怎么保证,还是在我书的第二章是有的。然后右上角就是大数据,其实大数据这些年特别火,但是大数据所有核心思想其实都来自于谷歌的三大论文,包括Mapreduce,Gfs,Bigtable,所有的大数据根基都来自于这三个论文,所以推荐大家都阅读一下这三篇论文,现在网上有一些中文翻译,当然如果英语比较好的是可以看英文版的。
其实我要跟大家分享的主要是目标方法论,然后这个目标方法论主要包含几个关键元素就是目标原则方法和结果,这个其实来自于我们易宝支付的文化,稍微有一点点变化,没有原封的拿过来,为什么说这个方法论非常重要呢?
因为我这两年在面试还有在评审的时候,我发现一些小伙伴在做一些事情,他们不知道做这个事情是解决什么问题的?还有一些小伙伴他知道是解决什么问题,但是这个问题其实根本就不需要解决,所以就是说做任何事情之前,一定要树立一个正确的目标,然后如果这个目标是抽象的,一定要把它分解成可衡量的一些目标,然后只有目标正确了,我们后边做的事情才是有意义的。
接下来就是第二个原则,原则是什么呢?是我为了实现这个目标不能做的事情,这个是底线,这个大家肯定都是理解的,就是生活中也有很多原则。
接下来就是方法,就是我们要实现一个目标,其实有各种各样的方法,方法都不一样,那么这些方法我们要去权衡,我们要权衡他们的利弊,还有权衡他们的成本,还有权衡他们达成的效果。
我们一定要找到一个最合适的方法,或者最适合的方法,而不是找到一个最高大上的方法,我也见过很多技术方案,其实是拿很多高大上的技术,最终解决了一个很挫的问题,其实这种事情性价比比较低了,所以选择方法一定要选择最适合的方法,就是做架构也是要做最适合的架构,要回归架构的简洁之美,不要所有的事情都拿一些高大上的技术招式来应付这个结构。
最后一个就是产出和结果,任何一个事情最后都会看它的产出和结果,这个产出和结果和第一个目标是相对应的,你这个产出结果如果跟目标不是对应的,那这个事情就是其实是白做了,或者是偏离了,也可能有一些副作用,作用有好有坏,但是没有满足我们的初衷。
04. 做人四原则
这个是我分享的最后一部分,就是如何修炼做事的内功,这一块可能跟我们技术内功不太一致,但是是我和身边的一些小伙伴们总结下来的一些生活和做事的经验,分享给大家,希望是能够起到一定的效果。
在这里我把它叫成一个做人的四原则,其实这四原则大家千万不要看这个内容比较少,大家一定要详细的去理解,可能等你时间久了,慢慢就理解到了。我们一个一个看,为什么我说它非常重要?
第一个就是靠谱,有脑子,衡量一个人,或者别人对你的印象,其实跑不出这两个因素,就是靠谱有脑子,什么是靠谱呢?靠谱就是别人一想起你觉得有一种信赖感,他觉得这个人行,那什么是有脑子呢?就是比较灵活,不做作,做事情总是有门路,那这个就叫有脑子。
第二项就是胆大心细,乐观,这个也是刚才李智维讲的,我们做事情一定要胆大,敢于去尝试,然后我们一定要乐观,为什么乐观呢?其实福祸是相通的,有福可能就有祸,有祸就有福,有句古语,我语文学的不好,忘记怎么说了,福兮祸所伏祸兮福所倚,就是无论发生什么事情,大家一定要乐观,可能一件坏事,等你过了一个月看仍然可能是一件坏事,但是你可能过了两个月或者两年或者十年一看,这个事有可能是好事,所以一定要乐观。
第三个好像正能量比较少,第三个就是要么忍,要么狠,要么滚。这句话什么时候适用呢?就是在座的小伙伴如果真的碰上一些坎坷了,尤其是在工作上碰到一些坎坷,不用纠结,也不用懊恼,也不用沮丧,这三条路中挑一个就可以了,往前走,因为纠结也没用。
最后一个就是要善于交流,大家听起来好像是,感觉是侃侃而谈的人就是善于交流,比较圆滑的人善于交流,但是实际上其实这个不是善于交流,什么是善于交流呢?第一你要善于思考,你要善于站在别人的角度来看待你自己,你也要善于站在别人的角度看他自己,这个才叫善于交流,这样你跟别人才能有交流,就拿现在一个心理学的非常流行的话,叫同理心,说白了就是你要能站在别人的角度来看事,但是我刚才说的那个,其实比这个要求更高,就是你站在别人的角度,不但能看他自己,你还要能看你自己,所以这个才叫善于交流。
成家立业还是立业成家?
这个其实跟技术没有关系,但是我真的十分十分想跟大家分享一下,就是我相信在座的小伙伴有些人没有成家,到底是先成家再立业呢?还是先立业再成家?这个事可能也说了几千年,但是古语是说先成家再立业,所以在这里我也推荐大家一定要早结婚,早生小孩,为什么呢?因为这样你就会早买房子,早买房子呢,因为房子长的太快,这个大家都懂得。
最后其实我的分享就结束了,然后非常感谢大家今天来参加,感谢李智维的这次组织,我觉得组织的特别棒,特别成功,然后现在这里边有两个二维码,一个二维码是我的公众号,一个二维码是我的博客,我们有兴趣可以关注。
同时大家有什么问题大家可以向我提问,第一个提问题的人我会赠一本书,之后提问的人,我会回答你们。
问答互动环节
Q:你好老师,我是 iOS 的一个小菜鸟,就是说我刚进入公司是一个初创公司,一直是一个人,就是说完全没有师父带,从 get set 请求都不会,到完成一个项目这样子,但是我发现其中走了很多弯路,包括就是很多的 bug 解决也好,如果在这种情况下,没有很多时间如何提升自己?还有如何小菜鸟独立开发能力,这个您认为怎么提高比较好?
A:好的,我先说,其实你最后一个问题,你一开始的叙述上已经解答了,因为你说你在公司其实没人去培训你或者培养你,但是你自己通过学习已经解决了这些事情,所以我相信你的自学能力肯定是很强的。
第二个事就是在时间上,人的时间,我干了这些活,然后我很难再有时间去给自己充电,去学习其他的内容,但是首先就是你干这些活,首先就是提高能力,再提高能力,而且在实践的过程中,其实提高的能力是最多的,你单纯的去学习很多东西,比如说我报一个大数据的班去学习它,可能未必有你真正的去找一个这样的地,没人带你,你每天去钻研,去学习,再去实践做的快,学习的快,所以个人来讲,这个事我觉得是没有问题的。
另外一个时间上,其实只要你去抽时间,其实总是能抽出一些时间去学习的,比如说我也是工作特别忙,有的时候加班到九点十点,但不会说通宵加班,然后我会上下班的时候,我坐地铁的时候一般都会拎本书,反正在坐地铁的时候没什么事嘛,要不我也在那站着,还不如我拿本书我看一看,上下班大家也知道北京生活是很苦逼的,上下班有一两个小时的时间也很正常,这段学习时间其实也是挺多的。
再有一个就是我觉得你这种情况,可以有个一年两年,但不适合十年八年这样,就是等你到一定程度了,你向再往高发展的时候,你一定找到一个,比如说他要经验比你更丰富的,能够带你的人,其实人生就是进圈子,加圈子,跟大师学习,就是这样嘛,每个人都跟上面的大师学习,所以说长时间来讲建议你还是走这个路,但是短时间我觉得这是没问题的,也是一个提高的过程,也是必须的过程。
Q:老师您好,我是做客户端的,大概做了两三年,如果想技术上有更好的提升,是不是应该有服务端的开发经验会比较好呢?
A:其实是这样的,这个问题我是觉得树业有专攻,我个人是更偏向于后端,因为我工作好多年了嘛,已经有十多年了,在工作的前些年,其实我是什么都做,那时候都叫全站工程师,从前端的 js,HTML,css,再到后端的服务,再到脚本上线等等,所有都是自己写,那时候叫全站工程师,现在其实互联网里边更倾向于把这些组分成前端后端或者 DBA 组,当然在微服务化下,其实不倡导这些分,微服务化倡导一个自治的团队,但是微服务化的实施在国内可以说没有特别真的跟微服务化这个理想说的,就是实施的靠近的,其实大家都是在说这个概念。
所以整体来说,我就说现在的市场上,基本上还是前端做前端,后端做后端,然后 DBA 做 DBA,就是体现你的专业性,所我是觉得做客户端我们就专心做客户端,因为客户端也是很深奥的,比如说客户端的一些缓存技术,客户端的一些性能提高,稳定性,兼容性等等,这些其实都是树业有专攻的事,其实你让后端的人去搞,他也未必能搞懂,所以我的建议是要学这个就把它学的很深入。
Q:你好,我是做客户端的,然后我想问一个问题,作为一些朋友,会认为客户端后端他们可能前途更好一点,有一些后端他又会去转客户端,他觉得客户端前途更好一点,你觉得呢?
A:我觉得这个整体来说,就是一个围城的概念,大家都觉得对方是好的,但实际上他们都是对的,为什么是对的呢?他都看到了对方最优秀的人,他不是看到整体情况,整体情况其实前端后端是一样的,我举个例子,我原来在甲骨文的时候,我有些同事,他别的什么都不做,别的一切活都拒绝,他只做前端 js,HTML,那么没有多久他就自己创业了,就是他达到了一个什么样的水平?
在浏览器下,那时候移动互联网还没有兴起,主要是 PC 端客户端的界面,无论你要什么效果他都能快速现场就给你实现,非常非常的快,所以这些专家级,前端也有专家级,后端也有专家级,前端也有小白,后端也有小白,所以我的意思并不一定后端就一定更有前途,当然这个前,哪个前都一样。
所以我还是刚才跟另外一位提问者观点是一样的,就是尽量还是树业有专攻,你一定要在这个领域达到一个非常专业水平,你再去看其他领域,因为你这个领域,比如说我前端还没做好,我就去做后端,你就一定能成为大师吗?那不一定,但是你说我前端成为了大师,你去后端去做,那你更有可能是成为大师了。
所以我是觉得在一个行业内,一定要成为专家级的,再去看其他的行业,但并不是说这一辈子都在这一个行业下做这一个事,就像我刚才技术里面广度,深度和高度,就是说深度一定要有那么一个两个,广度当然也要有,你要都了解,都会一些,最主要的是高度,高度主要是方向性,你做这一些东西到底能产生什么生产力?能够产生什么价值?给公司或者自己创业带来什么样的价值?
作者:李艳鹏。
说明:本文为投稿作品,内容来自其简书博客及其他友情媒体,一并致谢。
李艳鹏现任易宝支付产品中心首席架构师,著有《分布式服务架构:原理、设计与实战》一书,是【云时代架构】技术社区的发起者。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/256483.html