架构师 2022年10月刊 本期主编凌敏 流程编辑丁晓昀 反馈feedback@geekbang.com 商务合作hezuo@geekbang.org 发行人霍泰稳 内容合作editors@geekbang.com CONTENTS/目录 热点|Hot JavaScript框架大战已结束,赢家只有一个 接手了一座年收入2000万美元的代码“屎山”,我到底是该重写还是该跳槽?谷歌推出Carbon后,我在思考为什么Rust没能成为C++的正式继任者 理论派|Theory 理想汽车:从Hadoop到云原生的演进与思考 去哪儿旅行微服务架构实践 推荐文章|Article 从一线研发到公司创始人,基础软件创业者迷雾中与市场赛跑 作为现代开发的基础,为什么TDD没有被广泛采用? 观点|Opinion React老矣,我建议大家用用别的框架 卷首语 Go语言专家曹大谈十年技术生涯:有理想,但不理想化 作者:贾亚宁 每一个互联网从业者可能都思考过这样的问题:如何能从人才大军中脱颖而出,如何能更高效率地获得成长和发展?关于这个话题,我们对Go语言专家曹大(曹春晖)老师进行了采访,一起来看看他的实践和思考吧。 InfoQ:你的职业生涯中印象最深刻的挑战是什么?你是如何解决的呢? 曹春晖:技术的挑战都不算什么大事,工程方面的问题一定可以找到解决方案,找不到方案的那就是世界难题了。在公司里最大的挑战是有idea的时候,要说服老板去做 (碰到太多次了),因为公司里的老板背景各异,不同的人不可能对一件事情有相同的看法,这时候要达成共识就需要反复沟通,拉齐、磨合、开会,摆出各种软件工程系统架构理论,再搬出硅谷的FAANG是怎么做的,很心累。能说服老板的话,其它事情都是小事,这很难避免,因为大公司都是这样的。 InfoQ:方便分享一下你的职业发展路径吗?你认为影响技术人的职业发展的重要因素有哪些? 曹春晖:我的职业发展参考价值不大,其实这么多年看下来,在同样靠谱的前提下,职业的发展顺利与否主要都是看运气……了解了一些公司运作的规律和招人的潜规则以 后,很多事情比较无奈,不太好说(真心话)。 学习方面给各位技术人的建议是要养成终生学习的习惯,不要学到某个程度就固步自封,即使是后端技术,五年前和现在其实差别已经挺大的了。我以前写过一篇《工程师应该如何学习》,介绍过一些学习的渠道和方法,可以参考。工作中打过交道的人,其实很多工作十年的人跟刚毕业的学生没什么区别,你看看你们公司的架构师,CRUD都能搬出100种理论来说明为什么要这么设计,这才是真水平。 另外,写代码以外的技能也是要刻意训练的,比如口才、演技等,很多踏实写代码的人其实在大公司里很吃亏,要理解什么是一定程度上的按闹分配。 InfoQ:作为常年在Go语言世界里探索的人,你认为什么是学习Go语言最高效的方法? 曹春晖:入门的话就看《TheGoProgrammingLanguage》,最好的学习方法就是把书上的例子都抄一遍。可以翻翻优秀的Go项目来学习他们是如何使用这门语言的,前面也提到了,awesome-go里有很多这样的项目。直到你觉得Go的所有语法都了熟于心,就算是入门了吧。 进阶要去学习怎么定位Go在线上系统的问题,成为一个Go的高级工程师。这部分需要大家了解一些Go的底层知识,学习基于goroutine和channel的各种并发编程模式,以及常用的工具链:比如pprof怎么用,怎么用--base去找内存泄露,出了性能问题怎么做优化等等。要达到的目标是:线上的Go系统出了问题,能够通过自己的知识储备快速定位。Go的底层知识现在国内比java圈还卷,文章很泛滥,可以随意搜搜,择优阅读。 下一步是要通过多接触各种场景(比如大流量,高并发的,业务的,基础设施的等等),同时与其它语言横向做对比,了解Go语言在各种场景下的优缺点,不要成为一个语言原教旨主义者,比如我在工作的过程中就看到过不少Go其实就没法应付的场景,大家硬着头皮用,硬着头皮hack,项目搞到最后优化起来也很痛苦,可能还不如直接去用Rust。尽量多思考,也不要忌讳与其它语言的熟手交流。 相比PHP之类的语言,Go的最大好处是可以跨越很多领域,从业务到基础设施,如果你业务干腻了,技术储备又足够,也可以去玩玩基础设施开发(当然,我不建议你总 是换,实在手痒可以业余时间给一些开源基础设施项目提提PR)。也就是大家的工作内容选择范围会大很多,这又需要考验你的智慧了,选择哪个领域才能赚到钱,我没法给出很具体的建议,哈哈。 InfoQ:你是如何做到长期内容输出的呢?对想要开始的小伙伴有什么建议吗? 曹春晖:要给自己设立一个简单的目标,同时不要影响到工作,我之前写了很多年blog,体感最合适的是一个月两篇文章。内容可以和工作相关,也可以无关。两周一篇,压力也不太大,可以没事想起来就写写。 输出是很重要的,费曼学习法告诉我们,你要把知识讲得明白,才能确定自己是真的会了,只是应付工作里的那点东西,很多时候人会变得懒惰,慢慢也就不想思考了。我曾经在某公司听到一个很高级别的人自豪地说他很多年没看一本书,还很骄傲地讲给他的下属听,我不认为新进入行业的人能够有像这位一样靠公司起飞的运气,还是要把学习当回事的。 因为增加了输入,这些输入一定会在某个时间点对你的工作产生帮助。在某大公司的时候我也看到内网上一些优秀的文章作者,他们基本上都保持了持续内容输出的习惯,这也意味着他们看了非常非常多的书。有些人的读书速度能快到匪夷所思的程度(一年68本),不知道他们是怎么做到的。 多积累一些知识以后的输出是很有价值的,我之前写的系统设计的文章被人看到以后会来问我是怎么做的,说不定聊着聊着就成同事了。 嘉宾简介 曹春晖,北航硕士,IT行业多年从业者,曾在某公司担任技术专家,畅销书《Go语言高级编程》的合著者,GoContributor,对Go的底层实现有深入理解。同时,曹春晖老师也是年初上线的QCon+案例研习社「Go语言与并发编程」专题的出品人,带队来分享Go解决并发问题的最佳实践。 JavaScript框架大战已结束,赢家只有一个 作者DavidRodenas译者冬雨 框架之战是JavaScript社区中的热门话题,也是业界众多圣战之一。一开始,jQuery崭露头角,接下来AngularJS初露锋芒,再到现代框架混战,战争一直很激烈。然而现在框架之战已经结束,是谁赢得了最终的胜利,它又是凭什么取胜,且看本文分解。 竞争者 框架之战是JavaScript社区中的热门话题,也是业界众多圣战之一。一开始,jQuery崭露头角,接下来AngularJS初露锋芒,再到现代框架混战,战争愈演愈烈。 如今,似Backbone或Sencha之流,许多竞争者已经马革裹尸倒在路边:只留下大量 必须维护的遗留代码。如jQuery等其他幸存者,仍然有着庞大的社区,实在令人惊讶。其他如Angular,似乎也未像预期或承诺的那样一飞冲天。 jQuery 它可能是现存年龄最大的竞争者。它非常受欢迎,因为它解决了浏览器之间的互操作性,但其应用程序很难扩展。 如今,jQuery已经不是主流,也不是大多数项目的最佳选择。 $(document).ready(()=>[ $("#app").html("HelloWorld!"); ]); AngularJS 它处于LTS模式,并且为了支持其老大哥已经退居二线。不过毫无疑问,它曾是框架生态系统一次巨大的飞跃,很多人仍然怀念它。 但是,由于它不再被积极维护,因此它不再是竞争者。 angular .module("app",[]) .controller("HelloWorldCtrl",($scope)=>[ $scope.message="HelloWorld!"; ]); Angular 它的出现是为了与React一决雌雄。AngularJS已经老了,它存在性能和健壮性问题,而随着React变得越来越好,许多程序员对其投出艳羡的目光。因此,Angular利用ECMAScript6的改进对AngularJS进行了现代化改造,试图履行与React的决战之约。 import[Component]from'@angular/core'; @Component([selector:'my-app', template:<h1>Hello[[name]]</h1>, ]) exportclassAppComponent[name='World';] Angular最突出的困难是其陡峭的学习曲线。它需要了解很多概念,而且并不是一下子直截了当给你的,很多时候会把你绕进死胡同。学好Angular是很困难的:它继承了AngularJS的学习曲线,但又有新的困难,比如RxJS或分层依赖注入。 本·纳德尔提供原始照片。 另一方面,让人担忧的是,Angular也违背了很多承诺。例如,自V2以来,大家都期望有一个创建服务器端呈现页面的简单方法,但截止到2022年2月24日,Angular.io网站本身在没有JavaScript的情况下都无法工作。 然而这还不是Angular的最大的问题,它最大的问题是碎片化和版本升级。升级版本非常困难,以至于用户不敢冒险升级其应用程序。 在npm官网中可以看到有很多旧版本的用户。 VueJS Vue是许多开发人员的答案,因为他们需要比AngularJS性能更高的、更稳定的,且更易于使用的框架。Vue的模板系统非常接近原始的Angular,也保持了AngularJS的简单性,与此同时,它又从React获得了一些能力。 但是VueJS在版本1和版本2中遇到了一个严重的问题:它不能很好地处理数组,作者指责JavaScript对更新算法的选择不佳。如果你不使用像Vuex或Redux这样的库,则可能会遇到严重的问题。你可以看到在AngularJS中可用的应用程序,但在VueJS中却不行。 从理论上讲,这个问题在版本3中得到了解决。但是,将自己的错误归咎于他人并不适合社区。 SvelteJS 它是战争中不断壮大的竞争者,并且正在做出巨大的承诺。它声称主要优势是将组件转换成命令式语言,根据他们的说法,它比React采用的声明性语言更好。 <script> letworld="World"; </script> <div> Hello[world]! </div> 毫无疑问,它使用起来更简单,但是转换为命令式以及由此产生的组件并不像看起来那么容易预测。在某些情况下,SvelteJS无法正确检测变化。发生这种情况时,状态可能已经被破坏了,而视图却未正确更新。这个问题引起了很多关注,所以很难证明SvelteJS中的任何项目都是合理的。 https://twitter.com/drpicox/status/1496461071334490112 StencilJS 嗯,从技术上讲,它不是一个框架,尽管它是。StencilJS允许编写组件,并将其转换为其他框架。如今,它将组件转换为Angular、React、Vue和WebComponents组件。 import[Component,Prop,h]from'@stencil/core'; @Component([tag:'app' ]) exportclassMyComponent[@Prop()world:string; render()[ return( <p> Hello[this.world] </p> ); ] ] 但是,这个类有一些奇怪的地方。它和另一个东西很相似,对吧? Mitosis 你可能没有听说过它,但正是因为它让我写下了这篇文章。Mitosis是由Angular的创建者MiskoHevery编写的最新框架。没错,它是Misko在Angular之后创建的另一个框架。 import[useState]from"@builder.io/mitosis"; exportd