关于参与阿里巴巴编程之夏Asoc-Nacos的感悟

今天,阿里巴巴编程之夏答辩结束并顺利通过!经过近两个月的方案设计、导师沟通及代码实现,从零开始参与顶级开源项目并且得到导师的认可,还是十分开心的,心情和考研上岸一样的十分激动。为了更好的提升与更多的人参与到这样的项目,我在此分享一下自己的心得感悟,也算是为此段经历画上圆满的句号,为后续的继续参与打上开启的感叹号。


一、背景

为了更好地了解参与项目的情况,我介绍了个人背景,如果想直接了解参与的过程方面,则可直接跳至第二部分。

  1. 个人背景

学历:南京信息工程大学,信管专业转至软件工程;今年考研至南软

校园经历:

  • 阿里巴巴编程之夏学员(2022年暑假)
  • 参与华信互联公司(创业公司)实习(2022上半年)
  • 参与全国高数竞赛预赛获一等奖(2021上半年)
  • 参与蓝桥杯Java组获全国三等奖(2021上半年)
  • 参与导师的地图二次开发项目(2020下半年)
  • 参与省级大创项目,做脑电波存储管理后台(2020下半年)
  • 参与省级大创项目,做企业员工健康管理系统(2020年暑假)
  • 参与江苏省高数竞赛获二等奖(2019年)
  • 参与公益社的创办与管理(2018下半年)
  1. 参与背景

在2022年上半年,是我人生中最大转折点半年。从二月份开始大概是大年初二,为了保证考研复试的顺利通过以及防止复试被刷,我只身一人来到了南京并租房,准备实习和考研复试。经过近一个月的实习后查初试成绩,发现擦边进复试,便辞掉了实习,全心投入考研复试,并陆续投递简历至一些中大厂(美团,携程,小红书,华为等)。在此过程中,我进行了一个个人项目的复盘与面试表达的准备以及八股文的背诵,也养成了诸多好习惯(例如excel每天去计划事项,xmind去分析思考总结),便在日复一日地提升中,复试得到逆袭,也顺利拿下携程的offer(五月通知的)。

五月份时,考虑到不能给企业添堵(考上研还去就职)就谢绝了携程。然后想着暑假很长,不能荒废,需要做一些有意义的事情,于是就开始物色一下南京的还不错的小公司去打打工,在此过程中也发现几乎没有公司愿意在这个情况要考上研的人去实习,因此我转换了思路。思考有没有线上实习的项目,便在六月初发现了开源之夏和编程之夏的项目,经过和项目的筛选和导师的沟通,便确定了下来。


二、参与的初衷

  1. 参与开源,了解企业项目

首先,我十分渴望知道大厂里面进行项目管理、开发等流程和机制并且参与进去。虽然有过一段实习经历,但是在小公司基本上追求快速上线,在设计以及实现方面都是追求能够完成,并不或欠缺考虑性能优化,可拓展性,可维护性等因素,同时应用场景也是比较简单的,对功底的练就是比较欠缺。而nacos作为拥有数万级的企业用户及百万级实例的分布式服务注册、配置管理中心,必然具有很好的应用场景去体验与思考。另外,nacos作为开源项目,社区内有诸多大牛进行开发和讨论,在此过程中可以与其沟通,提升。

  1. 了解学习分布式、云原生

从面试角度来说,分布式渐渐作为大厂面试必考题,因此掌握该块的知识是十分有益的,退一步讲去大厂面试和大厂面试官也能聊几句。

从未来发展角度来说,随着数字经济的发展,西数东算工程的实施,云计算、云原生必然是未来的发展趋势,更多的企业也会选择上云。

从个人发展角度练,可以锻炼思维能力,更加深入地去思考如何解决复杂问题。

  1. 提升自我设计、编程能力

在阅读源码的时候,就会看到很多大牛的代码,就可以学习他们的设计思维以及编程规范、思维等。

  1. 获得与大牛的沟通机会

我觉得除了参与项目实现本身之外,还可以获得与大牛的沟通机会,从他们身上学习他们是如何思考,如何去设计代码,解决问题的,另外也可以通过他们的指导,发现自身的不足,更有利于更快地提升自我。

  1. 丰富经历,更好地就业

该点其实和第一、二点重合,在参与项目的过程中,除了自身的提升外,也会获得一些附加的IP人设影响力,(例如成为项目的commiter,或者参与过nacos的开发),去工作面试时,至少相对于大多人均的论坛系统更会有一定的优势。


三、参与的过程

  1. 初步了解编程之夏的项目,并选题

六月初,我选择了nacos的配置变更插件化这个题目,然后进行了SpringCloudAlibaba组件的学习及着重nacos的学习,此时学习比较无头绪,只能浅浅地知道简单使用,然后又觉得nacos的配置变更插件化这个题目比较贴切适合,并选择了它,并与导师取得了联系。

  1. 初步了解nacos项目,并进行方案设计

六月中下旬,经过初步的了解(主要是通过 nacos架构&原理 这本书,阿里巴巴的藏经阁还是很香的 ),便开始了初步的方案设计。由于时间比较紧迫,很快设计出了初步的方案,当时虽然心想可能没戏了,但是想着不到最后还是不要放弃,于是在截止提交方案之前我有时间都在完善方案设计并与导师保持沟通,导师也十分耐心,面对我一些低级问题也十分温和、耐心地回答。

  1. 进一步了解nacos,并完善方案设计

七月初,名单公布,我入选了,十分高兴。接下来便在导师的指引下,进一步阅读架构&原理那本书,并全貌地去看源代码,发现了原有设计的诸多不妥之处,便进行了进一步的修改与完善(其中印象比较深的便是 面向失败设计思想)。

  1. 进行初步代码实现

七月中旬,便开始想通过调试的方式(刚开始就静态方式看代码)去看代码,结果上来就当头一棒,也是很多nacos初学者会遇到的问题,由于没有安装grpc的插件,导致protobuf没有编译便运行不起来,由于初次接触grpc不懂,便通过百度/谷歌的方式进行搜索并解决。代码跑起来后,进行代码的设计实现,那便进了一大步,不管什么项目,能够先跑起来是关键。与此同时,我也发现了一个请求日志切面的参数不一致的小Bug,为了保证的确存在此问题我便进行了打断点、调试,看日志确认,经过再三确认,便十分紧张地进行了提issue并PR,当PR成功那一刻是十分开心的一刻,虽然只是fix了一个小Bug,但是成就感还是十分足的。

在代码实现的过程中,也出现过设计时考虑不周以及nacos的理解不够等问题导致多次反复修改、完善(告诫我们,务必多思考,设计先行,花90%时间去思考设计、10%的时间写出高质量的代码以及进行测试,不要着急实现)

  1. 代码PR并评审,结项

八月中下旬,进行PR,在提交过程中,刚开始未创建对应的分支,我便直接PR到主分支,经过机器自动化的测试,发现一些代码规范问题便进行修改。然后导师进行评审过程中也发现一些代码规范以及设计臃肿,不优雅等问题。感觉在此阶段与导师反馈问题并给出建议是收获最多的时候(每次沟通也是促进成长最快的时候),关于具体收获放在感悟谈。不过整体的设计与实现都还是OK的,于是顺利结项。

  1. 后续

虽然,此次项目顺利结项了,但是发现还有诸多不足,在未来的日子里将会进一步完善和深入参与。


四、参与的感悟

  1. 大胆尝试,勇于挑战

有机会就要大胆去尝试,不管行不行只要对自己是有益的,就勇敢地去做。回顾我的个人经历,不管是考研还是参与此次开源项目,在参与之前都觉得不可能成功,但是勇敢地去尝试与坚持,定会给你意想不到的收获。

  1. 它山之石,可以攻玉

人生的意义在于不断追求目标,而此过程则是能力完善的过程。对于个人 的缺点发现 则是提升自我的第一步(类似定位问题bug),而发现定位问题则是最关键且艰难的一步,通过自己去发现更为困难,此时通过更优秀的人(此次,要特别感谢导师彦林以及Nacos其他导师们)来给你建议,你将会收益颇丰,闭门造车只会故步自封。

  1. 万物皆有度,学会把控

个人认为,学习是一个输入(学习,借鉴,例如阅读源码)+加工(思考,设计)+输出(实现,方案,总结)的过程,每一环都需要均衡,有时容易重输入(狂看视频,只听不动),有时重输出(进行项目设计,实现)。无论怎么样我觉得都不是有效地学习、成长,都需要去均衡每个环节,在合适的时间做合适的事,不要操之过急。

  1. 一些技术方面的收获
  • 面向失败设计

在设计webhook时,涉及第三方系统的推送,则存在第三方宕机,不能正常推送的情况。而且在代码设计时的IO操作的重操作或其他的异常情况,也需要着重考虑,思考如何降级,打日志,方便后续的问题排查。其实面向失败也是作为三大控制逻辑的分支逻辑的一个考虑,则是考虑问题的全面性,而考虑问题如何全面则是一个比较经验的事情,需要多去学习借鉴,多阅读源代码,多按逻辑链思考分析,不要着急实现。

  • 学会分类思考

分类则让事件管理有序,有条理,也是让后续开发者更容易去维护开发。而针对开发我将其分类为多线程的管理,网络通信的管理(nacos中的http,grpc通信是十分值得去思考的),逻辑控制处理(涉及集合的使用,常量,变量的使用),然后在此基础上进行类抽象、对象为中心去进行设计,管理,优质的设计(nacos的通知机制的观察者模式实现可以值得阅读)是让代码更为简洁,可用性和拓展性更高。

  • 了解到SPI、EB等设计机制及产品

了解到通过SPI机制更好地去实现拓展,也了解到EventBridge这样的事件驱动的云产品,在此过程中也去看了些rocketmq的源码设计及云原生消息队列的书籍,对思维的拓展以及方案设计的考虑更为全面有了一定提升。


最后,十分有幸参与该次项目,认识优秀的导师及小伙伴,感谢他们的指点与帮助,未来的路还长,今天只是踏出的一步。希望以后更够更加深入地参与nacos开源社区的建设,早日成为committer。另外,也欢迎有兴趣参与nacos开源项目或者对阿里云云原生的朋友,联系我!

你可能感兴趣的:(软件架构&设计方案,java)