怎么提升写代码的能力

简介: 对于程序员而言,我始终认为代码是展现能力的关键,一个优秀程序员写的代码,和一个普通程序员写的代码是很容易看出差别的,代码作为程序员的硬实力和名片的展示,怎么提升写代码的能力始终是一个关键的话题,不过很遗憾这篇文章其实也不是讲具体的步骤、银弹方法、武功秘籍什么的,这篇文章讲讲我自己印象中对我写代码能力提升比较大的四段经历,也许可供参考。

 

头图.png

 

第一段:第一次感受每天亿级系统的挑战

2008 年,HSF 的第二个版本,在当时淘宝最重要的交易中心上线,上线当天造成淘宝网站访问巨慢,交易类的页面几乎打不开,最后靠下线 HSF 才恢复。

下线后开始查问题,HSF 的第二个版本基于的是 jboss-remoting,jboss-remoting 在当时的版本里远程同步调用的超时时间是写死在代码里的 60s,而调用的服务确实会有一些超过 10 几秒的现象出现,导致了 web 应用处理 web 请求的线程池被这些慢请求给逐渐占据,请求堆积,最终呈现出了页面打开非常慢的现象。

查清原因后,决定基于当时的 Mina 重写整个 HSF 的通信,重写的这两个月时间对我自己写代码的能力有很大的提升,无论是对网络 IO 方面处理的深入学习,还是在高并发系统上的深入学习,现在想想学习的方式也就是翻各类网络 IO 的科普资料,然后是读 Mina 的源码、Java 网络 IO 的源码,并发这块的学习主要还是靠那本经典的《Java 并发编程实战》,以及读 Java J.U.C 里的代码,这段时间的学习相比以往翻 Think in Java 之类的最大区别是,学习后付诸实践,随着 HSF 这个新的重写的版本的上线,基本算是逐渐真正掌握了这些部分的代码能力。

除了代码能力的提升外,得到了另外一个最大的教训就是,对于一个亿级且长时间运行的系统,很多看起来的小概率的问题都一定会成为严重的问题,这也是为什么写高并发系统的难度,要求了必须对自己写的代码,以及自己代码调用到的各种 API 里的实现都非常的清楚,这样才能真正确保最终代码的鲁棒性。

第二段:民间“消防队”的故事

第二段对我自己写代码能力提升特别大的经历是在民间"消防队"的那段日子,淘宝在 2009 年故障特别多,但处理故障还没有一个标准的体系和组织,导致很多时候会出现故障出了都没什么人处理,或者处理效率不高,于是当时有个运维团队的同学拉了一些人组建了一个群,群的名字叫淘宝消防队,用来处理淘宝出现的各种故障,我很凑巧的也加入了这个群,这个群里还有另外一个整个阿里公认的超级技术大神:多隆。

一开始看到各种故障的时候,压根就不知道怎么下手,处理故障会需要的通常不仅仅是写代码的能力,还需要对一个系统全貌要有一定的掌握,例如前几年一篇特别火的文章,当点击搜索背后发生了什么这样的文章,其实就是要对一个系统的处理流程特别的熟悉,这在处理故障的时候是非常重要的,在有了故障大概在哪个环节后,很重要的就是对这个环节代码运行机制的细节掌控了,这个时候通常来说各种工具非常重要,可以有效的帮助你知道具体发生了什么,例如像系统层面的 top -H 之类的, java 层面的 btrace 等等,都可以让你根据运行情况去定位问题的点。

这段时间我觉得我的提升就是靠大量的练手,故障确实有点多,一开始就靠看人怎么处理,主要是从多隆这里学,然后是尝试自己解决一些故障,解决的越来越多后慢慢熟练度就上去了,除了解决故障能力的提升外,因为看了很多由于代码层面造成的故障,对自己在写代码时如何更好的保证鲁棒性,来避免故障,是非常有帮助的,例如,我看过很多滥用线程池造成创建了大量线程,最终导致线程创建不出来的 case,就会明白自己在用线程池的场景里一定要非常清楚的控制最大的数量,包括堆积的策略等,又例如我看过 N 多的因为自增长容量的数据结构导致的 OOM 的 case,就会明白在写代码的时候不能认为一定不会发生数据结构增长到超级大,所以不做任何保护的 case,这个时间我明白到的就是写一段能运转,实现需求的代码不难,但要写一段在各种情况下都能长期稳定运行的代码是真心不容易,这我觉得是一个职业的写商业系统的程序员和只是写程序玩玩的最大差别。

第三段:重写通信框架

2010 年,我从中间件团队离开,去做 HBase,那个时候的 HBase 里面的通信还是用一个非常简单的写法实现的,我想着要么就把以前 HSF 里用的移植到 HBase 里用,这个时候刚好多隆在用 c 给各类 c 的应用写一个通用的通信框架 libeasy,于是就有了一次测试,我记得第一次测试结果看到原来 HSF 里面的通信框架的高并发能力和 libeasy 比相差无比巨大,我和多隆便探讨他是怎么实现的,我看看能不能学习下在 Java 这边的版本里也改改,所以有了这段重写通信框架的经历。

本来以为之前在写 HSF 的那几年应该算是对通信框架这块的代码相关的能力掌握的不错了,在和多隆一起重写的这段过程中,才发现差距还是很大的,多隆教会了很多细节的问题,基于 NIO 的通信框架的核心是用非常少的 IO 线程来处理 IO 事件(太多也没用,因为有些部分就只能串行),所以怎么高效的使用好这几个 IO 线程是非常关键的,要尽量减少这几个 IO 线程处理一些不相关的动作,另外一点就是尽量减少 IO 线程和业务处理线程的切换,例如后来常见的批量把一个流里的多个请求一次性丢给业务处理线程。

这段经历对自己更加深入的掌握在代码逻辑整体的细节层面是非常有帮助的,这对于写要求很高的系统是非常重要的,毕竟对于一个超大规模的系统而言,1% 的提升还是可观的。

第四段:学习 JVM

之前因为处理故障比较多,有段时间我开始给公司同事们分享如何处理故障,后来发现有些问题自己也讲不清楚,或者也不知道怎么处理,必须深入学习 JVM 才行,但其实一开始我完全摸不着门路,JVM 代码打开都不知道从哪看起。

很幸运,碰到了一个同样爱好又比我强很多的同学,就是撒迦,圈内通常叫 R 大,我和撒迦好几个周末约着在公司一起看 JVM 代码,有撒迦的指点,我终于是入门了,知道大概怎么去看了,而且两个人一起看代码,互相分享和探讨,效率是非常高的。

有了这段经历,再加上继续处理着一些故障,基本上逐渐对 JVM 的代码实现有了更多的理解,在后来做故障分享、问题解决什么的时候终于能更好的做到知其然知所以然,同样,这对处理故障的能力,写代码的能力也是非常有帮助的,例如会更加明白以前认为的所谓的面向 GC 友好的代码是几个意思,也会有了更深的感受是其实 Java 的代码呢,通常不会写的太烂,因为 JVM 在运行期会做很多的尽可能的优化,拉到一个平均线,但要写的很好,难度是非常大的,因为需要懂 JVM,懂 JVM 下面的 OS。

总结

其实也总结不出什么,因为每个人的环境什么的不太一样,也有适合各自提升的方法,我看自己的经历呢,我觉得:

  • 如果环境不具备,就给自己一个挑战的命题,例如要学高并发的通信,可以尝试自己写一个和其他的做对比,做性能等的 pk,这个通常提升还是会很大的,要学 GC,可以尝试给自己几个题目,来控制 GC 的行为等,如果环境具备的话,确实会更加有利。
  • 多和优秀的程序员一起,我自己从多隆、撒迦身上学习到了很多很多,从很多优秀的开源代码,像 Netty,OpenJDK 里面也学习到了很多很多,所以多参与一些优秀的开源项目也是一个很好的提升方法,看优秀的书(例如并发里的那本 Java 并发编程实战,JVM 里的 Oracle JRockit: The Definitive Guide,深入理解 Java 虚拟机等),也同样是一种向优秀程序员学习的好方法。
  • 多多尝试解决问题/故障,这绝对是提升代码综合能力非常好的一个方法,自己工作里机会少的话,网上有大把,像 stackoverflow 之类的,都是很好的练习场。

最后的最后,我还是想说,代码能力作为程序员的硬名片,始终是最有效的区分程序员能力的东西,"talk is cheap, show me the code" 这句话我觉得是永远成立的。

作者:毕玄

本文为阿里云原创内容,未经允许不得转载

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514432.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

发力LPWAN 升哲打磨数智城市物联网通信之“芯”

8月上旬,随着多项物联网芯片与通信领域技术发明专利证书的下发,升哲科技(SENSORO)已在低功耗广域物联网(LPWAN)及相关领域拥有近百项独家专利,突破国外专利封锁实现国产、自主、可控。这些专利技…

android studio证件照代码,Android 修图(换证件照背景,污点修复)

背景前段时间的一个周末,一个女生让我帮她换一下他的证件照背景,我又没带电脑。我又不好意思拒接,怎么办呢?应用商店下载一个证件照换背景的APP,瞬间换完,我正准备保存时,跳出来一个支付框&…

闲鱼是怎么让二手属性抽取准确率达到95%+的?

闲鱼是怎么让二手属性抽取准确率达到95%的? 先上效果 图1 - 二手属性抽取算法效果Demo(1) 背景 闲鱼作为一款C2X的app,站在商品发布的角度,闲鱼商品相对于淘宝商品的特点有: 轻发布导致商品信息不足 闲鱼采用图文描述的轻发布模…

代号红狗:那些站在微软云起点的中国创业者

作者:亲爱的数据 来源:亲爱的数据011996年的北京。上高中二年级的左玥,代表崇文区参加市一级"四通杯"青少年计算机程序设计竞赛,得了一等奖。据左玥回忆,在去参赛的路上,辅导老师还在吐槽&#x…

如何迁移 Flink 任务到实时计算

简介: 本文由阿里巴巴技术专家景丽宁(砚田)分享,主要介绍如何迁移Flink任务到实时计算 Flink 中来。 通常用户在线下主要使用 Flink run,这会造成一些问题,比如:同一个配置因版本而变化&#xf…

如何落地云原生DevOps?

简介: 什么是云原生DevOps?在阿里内部有怎样的实践?企业又该如何落地?阿里云云效专家团队提出了下一代精益产品开发方法体系——ALPD,提供了系统的云原生DevOps落地的方法支撑,帮助企业渐进式地迈入云原生D…

亚马逊独霸美国安云计算未来十年订单;英伟达推出首个元宇宙平台;华为云、天翼云会合并吗?...

NEWS本周新闻回顾亚马逊独霸美国安云计算未来十年订单,微软表示不服亚马逊AWS获得美国国家安全局100亿美元云计算合同。得知亚马逊拿下订单后,微软已向政府问责提交文件,提出抗议。最终……还是亚马逊笑到了最后英伟达推出全球首个元宇宙平台…

如何做好技术 Team Leader?

简介: 作为一个技术TL(Team Leader),除了自身技能,还会面临诸多团队管理上的困难和挑战。如何定义和明确团队的目标?怎样建立优秀的工程文化?让团队长期发挥战斗力和创新能力的核心是什么&#…

android应用控制百度地图,Android中应用百度地图API开发地图APP实例-显示百度地图...

场景效果在使用百度地图API之前需要先在百度地图开放平台中申请API_KEY申请API_KEY登录百度开放平台后找到控制台下的应用管理-创建应用依次输入应用名,应用类型选择Android SDK然后下面需要输入发布版SHA1和包名获取应用SHA1首先来到.Android文件所在的位置&#x…

数禾云上数据湖最佳实践

简介: 数禾科技从成立伊始就组建了大数据团队并搭建了大数据平台。并在ECS上搭建了自己的Cloudera Hadoop集群。但随着公司互联网金融业务的快速扩张发展,大数据团队承担的责任也越来越重,实时数仓需求,日志分析需求,即…

程序员只能吃“青春饭”?IT行业年龄焦虑如何破局?

2019 年搜狐科技《中国互联网简史》报告显示,国内近一半的程序员年龄在 25-29 岁之间,其次为 30-34岁,占比 24.6%,35 岁 -39 岁的程序员占比 6.1%,而 40岁 的程序员仅占 1.2%。由于程序员需要长时间面对电脑工作&#…

对容器镜像的思考和讨论

简介: 常言道,startup 有 startup 的好,大厂有大厂的好,那么大厂究竟好在哪呢?拿硅谷老牌大厂们 FLG 来说,如果要问最令人怀念的是什么?Free food 和基础设施(Infrastructure)一定是会上榜的&am…

android 高度上分权重,Android LinearLayout weight权重使用

在日常的开发过程中,我们通常或多或少会使用到LinearLayout的weight属性来进行权重设置,进而达到按比例显示布局的意图通常我们在使用时,会这样使用android:layout_width"match_parent"android:layout_height"match_parent&qu…

实时计算pv/uv Demo

简介: 本文由阿里巴巴高级技术专家邓小勇(静行)分享,主要用 Demo 演示如何通过实时计算 Flink 实时计算pv/uv的场景。 本文由阿里巴巴高级技术专家邓小勇(静行)分享,主要用 Demo 演示如何通过实…

《天际友盟DRP数字风险防护报告(2021年上半年)》重磅发布

今天,数字化正在发生,整个社会正在步入数字化革新。根据市场研究公司IDC的预测,到2023年超过50%的全球经济将由数字经济所驱动。在中国,2021-2024数字化转型总支出将达到1.5万亿美元,年均增长率超过17%。由此可见&…

Android Native crash 处理案例分享

简介: Android Native crash 处理案例分享 1. 背景 目前 mPaas[1] Android使用Crash SDK对闪退进行的处理,CrashSDK 是 Android 平台上一款功能强大的崩溃日志收集 SDK,有着极高的崩溃收集率和完整、全面的崩溃日志信息,生成的日…

Mendix:低代码与无代码的异同点与用例

投稿 | Mendix 编辑 | 宋 慧 头图 | 付费下载于 IC photo 低代码和无代码应用开发都遵循着代码抽象化原则来实现建模的可视化。但基于这两种方法构建的应用在规模和类型却有着根本性的区别。 低代码与无代码的相同之处 低代码和无代码开发平台都无需编写代码就能构建软件应用…

解读:云原生下的可观察性发展方向

简介: 非常有幸参加了云原生社区Meetup北京站,有机会和众多业内的大牛一起讨论云原生相关的技术和应用,本次Meetup上我和大家分享了关于云原生下的可观察性相关的议题,本篇文章主要是视频的文字性总结,欢迎大家留言讨论…

一文读懂 Serverless,将配置化思想复用到平台系统中

简介: 搭建一个 aPaaS 平台是需要很长时间的,当然也可以基于一些公有云产品的 Serverless 方案实现现有系统的灵活性与扩展性,从而实现针对于不同客户的定制。 写在前面 在 SaaS 领域 Salesforce 是佼佼者,其 CRM 的概念已经扩展…

9.9 元福利价,解锁校园满分计划

移动云开发者社区致力于为广大开发者提供技术交流和能力输出,是移动云开发者交流汇聚地、移动云产品首席体验官工作台、移动云技术能力布道者讲台和移动云能力输出窗口。通过移动云开发者社区,在帮助移动云开发者用好云、好用云的同时,还可以…