当前位置: 首页 > Web前端 > vue.js

如何提高写代码的能力

时间:2023-03-31 21:01:11 vue.js

介绍:对于程序员来说,我一直认为代码是展示能力的关键。很容易看出优秀程序员写的代码和普通程序员写的代码的区别,代码是程序员的硬实力和名片展示,如何提高写代码的能力一直是一个重点话题,但是可惜这篇文章其实不讲具体步骤、银弹方法、武功秘籍等,这篇文章讲的是我自己印象中对自己写代码能力有很大提升的四次经历,或许可以供参考。第一段:第一次体验天天亿级系统的挑战。2008年,HSF第二版在当时淘宝最重要的交易中心上线。上线当天,淘宝网站访问速度极慢,交易页面几乎无法访问。上,最后通过下线恢复HSF。下线后,我开始排查问题。HSF的第二个版本基于jboss-remoting。在目前版本的jboss-remoting中,代码中写了远程同步调用的超时时间是60s,被调用的服务确实出现了一些持续10多秒的现象,导致web应用的线程池无法处理web请求逐渐被这些慢请求占据,请求堆积起来,最后页面打开的很慢。查明原因后,当时决定基于Mina重写整个HSF通信。两个月的重写,大大提高了我写代码的能力,无论是网络IO处理的深入研究,还是高并发系统的深入研究,现在想想学习的方式就是看各种类型网络IO科普资料,然后阅读Mina和Java网络IO的源码。并发的学习主要靠那篇经典的《Java 并发编程实战》,看JavaJ.U.C.里面的代码。这段时间的学习和之前的ThinkinJava最大的区别在于,学完之后,付诸实践,随着HSF新改写版本的上线,基本上逐渐掌握了这部分的代码能力。除了代码能力的提升,还有一个最大的教训就是,对于一个十亿级、长时间运行的系统来说,很多看似小概率的问题,肯定会变成严重的问题,这也是为什么要写一个高并发系统的原因难度要求你必须非常清楚自己写的代码和代码调用的各种API中的实现,这样才能真正保证最终代码的健壮性。第二段:民间“救火队”的故事第二段在民间“救火队”的日子里,大大提高了自己的代码编写能力。一个标准的制度和组织,导致很多故障没人处理,或者处理效率不高,所以当时运维组的一个同学招了一些人组个群,名字群是淘宝火队,用来处理淘宝的各种故障,我也是机缘巧合加入了这个群,这个群里还有一个全阿里公认的超级技术高手:多龙。一开始看到各种故障,不知如何下手。处理故障,通常不仅需要编写代码的能力,还需要对系统的全局有一定的把握。比如几年前的一篇特别火爆的文章,当你点击搜索一篇类似幕后发生的文章时,其实需要非常熟悉一个系统的处理流程,这在当处理故障。重要的是在这个环节把控代码运行机制的细节。这时候各种工具通常就很重要了,可以有效的帮助你知道发生了什么,比如系统级别的top-H,java级别的btrace等,让你根据运行情况定位问题点.这段时间,我觉得自己的进步靠的是大量的练习。确实有很多毛病。一开始,我取决于人们如何对待他们。我主要是向多龙学习,然后自己尝试解决一些故障,解决的问题越来越多。之后,熟练度逐渐提高。除了解决故障能力的提升之外,因为我看到了很多代码层面导致的故障,对我在写代码的时候更好的保证健壮性,避免故障有很大的帮助。有帮助,比如我见过很多因为滥用线程池导致创建大量线程,最终导致线程无法创建的案例。比如我看过N多自增数据结构导致OOM的案例,我就会明白,写代码的时候,总不能认为数据结构不会增长到超大,所以我不会做任何事。保护的情况,我这时候才明白,写一段可以运行并满足要求的代码并不难,但是写一段可以长期稳定运行的代码真的不容易各种情况下的时间,我觉得这是职业程序员和写商业系统的程序员和只是为了好玩而写程序的最大区别。第三段:重写通信框架2010年,我离开中间件团队,开始做HBase。当时HBase中的通信实现方式非常简单。它被移植到HBase。这时候多龙正在用c写一个通用的通信框架libeasy,用于各种c的应用,于是就有了测试。记得第一次测试的结果,在HSF看到了原来的通信框架,高并发能力和libeasy有很大的不同。多隆和我将讨论他是如何实现的。我看看能不能学会在Java版改一下,于是就有了这个重写的通信框架。经验。以为自己在写HSF的时候,这几年对通信框架的代码相关能力有了很好的把握。在用多隆改写的过程中,发现还是有很大的差距。多隆我教了很多细节。基于NIO的通信框架的核心是使用极少的IO线程来处理IO事件(太多了也没用,因为有些部分只能序列化),那么如何高效的使用这几个线程呢?一个IO线程非常关键。有必要尽量减少这些IO线程来处理一些不相关的动作。还有一点就是尽量减少IO线程和业务处理线程之间的切换。例如,常见的是将一个流中的多个请求批量一次性丢给业务处理线程。这段经历对我更深入地把握代码逻辑的整体细节很有帮助。这对于编写要求高的系统非常重要。毕竟对于一个超大规模的系统来说,1%的提升还是很可观的。第四段:在学习JVM之前,因为要处理的fault比较多,开始和公司的同事分享了一段时间如何处理fault,后来发现有些问题我解释不清楚,或者我不知道如何与他们打交道。我必须深入学习JVM,但其实一开始想不通,打开JVM代码的时候不知道从何下手。幸运的是,我遇到了一个和我有相同爱好,而且实力比我强很多的同学,那就是释迦,圈内通常叫R。我和萨迦约好几个周末一起在公司看JVM代码。在Sakya的指导下,我终于入门了,也知道怎么读了,而且两个人一起读代码,互相分享讨论,效率很高。有了这段经历,再加上不断处理一些故障,基本上逐渐对JVM代码实现有了更深的理解,在分享故障和解决问题的时候也终于能更好的理解了。知道为什么,同样,这对处理故障的能力和写代码的能力也很有帮助。比如,你会更加理解你以前认为的所谓GC-friendly代码的含义,你会有更深的感受。其实Java代码通常不会写的太烂,因为JVM在运行时会尽可能的做很多优化,拉到平均线,但是写好是非常难的,因为需要了解JVM,了解JVM下的OS。其实也没什么好总结的,因为每个人的环境不同,每个人都有提升的方法。我看自己的经历,我觉得:如果环境不合适,给自己一个有挑战性的命题,比如你想学高并发通信,你可以试着写个pk跟别人对比一下,做表现。这通常会改善很多。如果你想学习GC,可以尝试给自己出几个问题来控制GC的行为等等,如果环境可以的话,确实会更有好处。与优秀的程序员一起工作。我从多龙和Saga那里学到了很多东西,也从很多优秀的开源代码中学到了很多东西,比如Netty和OpenJDK,所以参与一些优秀的开源项目也是一个不错的主意。提高的一个好方法就是多看优秀的书籍(比如《并发中的Java并发编程实战》、《OracleJRockit:JVM权威指南》、《深入理解Java虚拟机》等),这也是一种方法向优秀的程序员学习。好办法。多尝试解决问题/故障,这绝对是一个很好的提高代码综合能力的方法,如果你工作中机会不多,网上有很多,比如stackoverflow,都是很好的练习场。最后还是想说,代码能力作为程序员的硬名片,永远是区分程序员能力最有效的东西。我认为“说话很便宜,给我看代码”这句话总是正确的。作者:毕轩原文链接本文为阿里云原创内容,未经允许不得转载