查看原文
其他

暑期2021优秀学生专访:李博文——不吝分享的开源力量

ALC Beijing 2022-04-06

The following article is from 开源之夏 Author 开源之夏



开源之夏【优秀学生专栏】正式开通了,本公众号将陆续分享开源之夏优秀/深度参与学生的专访文章,欢迎关注。同时欢迎推荐及自荐通过开源之夏活动在社区中不断成长的故事。


本期专访来自暑期2021最具潜力奖获得者李博文:不吝分享的开源力量。

迷你简历

姓名:李博文

性别:男

年龄:24

学校:复旦大学

喜欢的书:《Java编程思想》,《神雕侠侣》,《深入理解计算机系统》

兴趣爱好:运动,音乐,编程

最喜欢的技术明星:Linus Torvalds

最喜欢的开源软件:Apache Pulsar

最喜欢的数码产品:数码产品都喜欢

最喜欢的开源社区:Apache Pulsar 社区


自我介绍


哈喽,大家好,我是李博文,今天非常荣幸能够接受开源之夏的采访~我目前在复旦大学就读研究生,专业是软件工程,已经是研三的老学长了。大概算一算,我已经接触计算机六年啦,然而大一第一次接触编程的场景却仍历历在目:《程序设计基础》的课堂上,机房里的 720p 马赛克显示器,Windows 7,桌面上是 Visual Studio 2008,我茫然地跟着讲台上的老师,一步一步,敲出那一行经典的 cout << "Hello World" << endl ,黑底白字的“Hello World”出现在控制台中,仿佛计算机的世界在向我招手... 转眼间,六年过去了,C++的高级语法早已忘的一干二净,那折磨人的面包板,数电也再没有出现在我的生活中,然而计算机,是真的早已融入我的生活了。



Q:作为一个学霸,有提高代码质量的学习方法和技巧吗?


首先,我也算不上什么学霸啦,2015年我上大学的时候,计算机还不像现在这么火爆哈哈,所以也算是凭借一点点运气走到现在吧。说到代码质量,确实是一个非常重要的点,大到模块设计,小到变量命名,都可以体现代码质量,所以我认为,提升代码质量是“一辈子”的事情,包括我自己也一直在想办法提升自己的代码质量。那么我就分享一下自己的一点心得吧。


第一,先动脑,再动手。我们在写代码之前,最好是经历充分的思考,可以在草稿纸上涂涂画画,也可以用专业的工具画一画 UML 图,在脑海里对整个模块有一个完整的构思与初步的设计之后,再来动手写代码。正所谓磨刀不误砍柴功嘛,只有经历过充分的设计和思考,你写出的代码才有好的架构。当然,这要求我们对设计模式要有基本的了解,这里也推荐给大家一本书籍,《重构:改善既有代码的设计》,有兴趣的同学可以阅读一下。



第二,模仿学习。模仿和学习优秀代码是提高自身代码质量最方便最快捷的方式。咱们做开源的同学,可一定要利用好这笔宝贵的财富呀哈哈。一个优秀的开源项目,拥有较为正式的代码检查和发布流程,也有自己的一套代码规范,因此阅读和理解这份规范,并且将其应用在自己的代码中,就是最快的代码质量提升方式。想想看,在给开源社区提 PR 之后,还会有大佬来帮你 review 代码,提出修改建议,这简直就是手把手帮你提高代码质量啊,这么好的机会,你真的不去把握吗哈哈?(真的不是在打广告啊喂。


(图中是我第一个 PR,社区的小伙伴们不断给我提出修改建议)


Q:是在什么阶段开始接触开源的?可以跟我们分享一下最喜欢的开源项目吗?


最早是本科大三的时候吧,当时接触了云原生这个领域之后,就对 Kubernetes,OpenFaaS 等相关项目有了浓厚的兴趣,并且稍微研究了一点点源码,不过主要是自己一个人研究,没有深入地参与社区。研究生之后,在实验室导师和师兄的带领下,参与了我们实验室开源的微服务基准系统 Train Ticket,做出了一点微小的贡献。另外,因为需要接触消息队列,了解到了 Apache Pulsar,并且借助咱们开源之夏的机会真正参与了进来,感觉受益匪浅。


最喜欢的开源项目,当然是 Pulsar 了哈哈。Pulsar 社区真的很活跃,邮件列表里经常可以看到大家热烈的讨论。另外,Pulsar 文档也非常全面,而且更新得还非常及时,这点我觉得非常难得,说明这群人是真的投入了非常多心血的。


Q:据了解,你在2019年就参与开发了一个基于微服务架构开发的火车订票系统,可以简单介绍一下这段经历吗?


没问题。Train Ticket 是我们实验室开源的一个微服务基准系统,由 41 个微服务组成,是一个模拟 12306 的火车订票系统。那么为什么要做这个系统呢?最早的时候,在科研界,大家想要在微服务系统上做实验的时候,找不到一个合适的 benchmark,只能用一些规模很小,只有几个服务的系统(例如 Spring 开源的宠物商店之类的)。这些系统规模太小,服务架构设计太简单,因此不能很好地体现微服务系统架构复杂的特点。因此,我们实验室设计并实现了一个由 41 个服务组成的火车订票系统,规模应该算是不小了。之后就有很多相关论文利用我们的系统进行实验了。目前这个系统在 Github 上也有三百多个 star 啦,欢迎有兴趣的同学们多多关注 ^_^。


Train Ticket:

https://github.com/FudanSELab/train-ticket


Q:请简单介绍一下暑期2021中你的开源项目


我的项目名称是“将 broker 级别的消息元数据暴露给客户端”。简单来说的话,就是做了这么一件事情:在 Pulsar 的 Broker 中有一种元数据,叫做 broker entry metadata。这个元数据之前是只在 broker 中存储和使用的,而我要做的就是在 broker 和 client 之间通信的时候,根据当前的配置、客户端版本以及需求,来决定是否应该将该元数据传输给客户端,并且将其进行合适的序列化,发送给客户端。相应的,我也需要在客户端对该元数据做解析,提供 API 来帮助用户去使用它。客户端收到该元数据并作出相应解析后,就可以用它来干更多的事了,比如根据时间戳排序,提供连续ID之类的。


Q:在项目进行中遇到的印象最深刻的困难是什么?如何解决的?有什么收获吗?


最大的困难就是 Pulsar 作为一个生产级的消息中间件,功能非常丰富,代码量级也极其庞大,理解起来都已经很不容易了,更何况是修改/增加代码,这给项目初期的我带来了很大的挑战。


解决方案主要分为两个方面吧,一个是宏观学习,一个是代码推敲。


宏观学习,就是在架构设计,功能模块的角度上,对 Pulsar 有一个整体的了解。好在 Pulsar 社区的资料非常丰富,不仅有官方文档和博客,还有录制好的视频,每期一个专题,讲的非常详细。项目刚开始的一两周,我基本上将所有的文档和视频教程过了一遍,并且跟着官网的 Quick Start 尝试了 Pulsar 的各种功能,从而对它有了整体上的了解。


代码推敲,就是深入到代码内部,仔细地推敲逻辑。“啃代码”当然是一件枯燥和困难的事情,但作为一名程序员,这一定是逃不掉的。这时候上面的宏观学习就起到作用了,在对项目有了整体的了解后,看代码的时候就会有一丝水到渠成的感觉。当然,作为一个代码量级为百万的开源项目,研究所有的代码肯定是不现实的,这时候我就会根据自己的项目,快速找到相关代码进行研究。


另外,关于代码推敲,我也有一点点心得吧。在将项目导入到 IDEA 后,我会首先对整体的目录结构进行梳理,了解了每个目录下具体是干什么的,对整体代码结构有了一个初步的了解,与之前的宏观学习做一个对应。然后,我将项目跑起来之后,通过 IDEA 里提供的 Diagrams 功能,将感兴趣的类加入进去,做成一个 UML 图,从而帮助自己对一些关键类和方法有一些认识。另外,我还会通过在草稿纸上画图的方式,来帮助自己梳理代码结构。我会把自己的这些草稿保存起来,这样每次自己对某个类有所遗忘的时候,都可以通过这些图纸来帮助自己回忆它们的作用,从而节省大量的时间。


Q:通过参加暑期2021的开源活动,你对开源和开源社区有新的认识吗?


当然有。说实话,作为一名学生,在参与暑期2021活动之前,我并没有参与过大型活跃的开源社区,内心里一直觉得它离自己比较遥远...换句话说,我会认为参与开源社区的都是行业顶级大佬,一行代码可以顶我一百行的那种,所以总会有点感觉自己还没有到参与开源的时候(一条咸鱼的内心...)。但是当真正参与到开源社区之后,我发现也有很多跟我一样还在学习,还在成长的小伙伴们。或许我们的第一个 PR 还不成熟,有各种各样的小问题,但是整个社区都非常包容,会非常耐心,非常仔细地与我们交流,帮助我们成长,这是让我印象最深的一件事。所以最后我才认识到:原来作为一名学生,也可以非常开心地参与到开源!



Q:你认为,参与开源项目对做科研会有帮助吗?


当然有。首先我认为,科研和开源并不是毫无关联的两件事儿,其实很多科研论文会衍生一系列开源项目,也有很多开源项目在发展的过程中产出了一些科研论文,所以我认为两者之间是相辅相成的。然后具体到我自身的话,因为我的硕士研究方向是云原生与微服务领域,这是一个与工业结合十分紧密的领域,除了要拥有与软件工程有关的科研素养之外,我们还要对微服务相关的实践有比较多的了解,而这里就涉及大量开源项目了,容器编排平台 Kubernetes,微服务全家桶 Spring Cloud,分布式链路追踪 Zipkin,Jaeger,Skywalking 等,以及函数即服务里面的 OpenFaaS,OpenWhisk 等等,都是我们需要大量了解和学习的开源项目。因此我认为,参与开源项目对科研是有很大帮助的。


Q:请分享一下你对开源的理解,之后会继续参与开源吗?计划如何更深入地参与开源?


在我看来,开源意味着一群素不相识的人为了一个共同的目标去努力,并且这个过程是极其开放和包容的,任何人都可以随时参与进来。我想到一个比喻,感觉开源社区有点像我们大学里面的社团,大家真的是出于热爱去做这件事的,这意味着你要抽出自己工作和学习以外的时间来完成它,并且很可能是不会给你带来直接的物质上的收益的,因此我认为开源是一件有情怀的事情。


说到未来,我一定是会继续参与开源的。我一直认为开源是一件很有意义的事情。说的浪漫一点,参与开源可以让自己的代码在这个世界上留下痕迹,想想自己的代码可能在世界上任何一个角落运行,可能对远在天边的某个陌生人产生帮助,甚至有点让人感动哈哈。


Q:近年来开源概念越来越热,你认为参与开源对于计算机专业的大学生来说是必要的吗?


不敢说必要,但是我建议咱们计算机专业的同学,在保证自己学业的前提下,也就是说学有余力的情况下,可以多多参与开源社区,好处一定是不可估量的。


第一,在刚入门的时候,可以多多在开源社区中学习,增长见识,提高代码水平。想想当你正值学习的时期,有大把的优质开源项目摆在眼前,你可以随便阅读和学习,是一个多么宝贵的财富啊。所以在这个阶段,我们以学习为主,把开源社区作为自己学习的一个优质来源,快速提升自己。


第二,当你拥有了一定的技术水平,大概是有一门熟练的编程语言,对数据结构,操作系统等有了基本的了解之后,就可以考虑在课余时间真正参与开源社区了。其实作为一名学生,在学校里往往是缺乏接触实际工程的机会的,这个时候开源项目就是一个良好的契机了。很多开源项目都是经历生产考验的,所以你如果愿意仔细研究和学习它们的架构设计和代码风格,并且做出自己的一点贡献,将学过的理论知识与实际工程结合起来,一定会有意想不到的收获。


Q:你认为良好的英语阅读和沟通能力对于参与开源来说重要吗?可以分享一下英语学习的技巧吗?


非常重要。其实我认为不只是参与开源,所有计算机相关的同学都应该重视英语能力——无论是在科研中阅读论文,还是在工程中阅读官方文档,或者是遇到问题后在 Google 上搜索资料,英语都是不可或缺的能力。所以小伙伴们,一定要重视英语学习啊。


说到英语学习,讲一件印象深刻的事,记得刚上大二的时候,系里的《计算机系统基础》这门课附带了地狱级难度的编程任务(PA),对刚上大二的我可谓是极大的打击。并且,助教同学还特地制作英文版的讲义。。最开始的我其实是非常不理解的,大家都是中国人,给我来一份英文版的讲义干什么,本来就已经很难了,这不是平白无故地给我增加难度吗?




随着不断的深入学习,我渐渐理解到助教的一片苦心,这门课的很多资料,包括 i386 手册等等,都是只有英文原版的,也就是说只有在全英文的环境下,你才能够完全融入这个系统中,查手册,写代码,搜问题,一气呵成。这时候我才真正理解英语在计算机领域的重要性。


其实英语学习并不难,或者再说的准确一点,学到我们计算机同学需要的英语,一点都不难。这里其实没有什么技巧,无非就是坚持。本科的时候陈道蓄老师的一句话一直在我们耳边流传,原话我不太记得了,只记得大意是:当你刚开始阅读英文原版教材的时候,可能 1 天读 1 页;坚持一个月,可能 1 天读 2 页;坚持半年,一年以后,就可以正常阅读了。很多同学刚开始接触大段的英语时会感到害怕从而退缩,这样就永远无法进步了。其实只要你咬咬牙坚持下去,度过那个难熬的阶段,会发现英语其实不是什么跨不过去的坎,加油


END


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存