作者 | 马涛
来源 | 阿里开发者公众号
想知道内核研发是怎样的体验?操作系统的“冷板凳”得坐多久才有春天?本文对话龙蜥社区理事长马涛,畅所欲言聊开源,一起来看看那些开源润物细无声背后的故事以及龙蜥社区运营的道法术。
高门槛的 Linux 内核研发,如何支棱起来?
提问:首先想请马涛聊一聊自己的开源故事,介绍一下您最初是怎么与开源结缘的?
马涛:我是在 2006 年加入 Oracle 的,在 Oracle 之前是在 IBM 工作,那会儿其实不是做开源,但对 Linux 还是挺感兴趣,所以后面 Oracle 刚在中国成立一个做操作系统/做内核的团队,我就去参加了这个项目。刚去的时候,我的主管问我说你想干什么。由于我之前从来没做过开源,基础比较薄弱,就选择了做测试。可以认为最早我是从 Linux 测试开始干起的。过了大概四五个月后我就发现,好像我也可以做操作系统,内核也可以,然后就去做了开源。发现开源和测试一样,都要和研发人员交流。做了就发现,做内核开发的老外们都挺 nice 的,在沟通上、交流上都挺好。接触了后发现,开源真的是一件很有意思的事情。
我刚加入 Oracle 的时候有两个 mentor,其中一个 mentor 是老外,我个人觉得他是我的入门导师。从他身上我感觉到两点,让我对开源或者说对开源的这些人有一个初步的认识:第一个就是做开源的人,因为大家都是从零开始做起来的,所以他们对于这些刚加入做开源的人都是非常 nice,会提供各种各样无私的帮助。这个其实对我后面带一些新同学做开源有潜移默化的影响。
另一个就是我觉得刚加入内核这个大家庭的时候,Linux 内核都是通过邮件列表来做开发的。当你提一个 patch 到开源社区的时候,开源社区的资深开发人员都会对你的 patch 做详细 review,然后给你很多意见。虽然说你是一个入门的新人,你的 patch 也很 junior,但是他们都会很认真地 review 后给你一些意见,比如patch 应该怎么写、应该注意哪些格式问题等等。给我的第一感觉是整个开源对新入门的小白非常友好,第二是像一个大家庭。
给大家讲一个小笑话,我一开始做测试的时候,对于做开发还是没什么信心的,内心挺慌的。就因为特别慌,所以给 Linux 内核做第一个贡献(是很小的贡献),提交 patch 的时候,把自己的名字都写错了。当时是用英文的,所以我应该是“Tao Ma”,一慌就写成了“Tao Mao”。
提问:最初社区里他们给您很多的反馈,那么通常来说会是哪些方面的反馈?
马涛:各种的都有。我说一下 Linux 内核研发的流程是什么样的,还有对新手是怎么提供帮助的。
一般情况下对于内核开发者来说,会从最早最简单的一些问题开始。Linux 内核有一个专门针对新手学习的网站:https://kernelnewbies.org/,它里面会有适合新手看的一些文章。另外,当你真正进入内核研发的时候,一般情况下会提一个 RFC(Requestforchanges/comments),先把你的 idea 提给社区。比如,你觉得内核里某个模块、某个东西需要一些变化。
我认为内核是一个合作非常紧密的组织,内核代码有几千万行,它是分了不同的 maintainer,Linus 肯定是最大的 maintainer,下面分了很多级,每一级都有自己的 maintainer。比如说你想提一个 feature,你就找到这个 feature 所对应的组织,然后提个 RFC,接着这个小组的 maintainer 或者资深开发者就会给你提个 comments,会给你一个非常详细的解释。如果这个 maintainer 觉得你提出的是非常好的问题,那么基本上你就可以开始干了。
在很多情况下,当你提了一个 RFC 以后,相当于这个坑就被你占了,后续就可以不停地提交 patch。当你提交第一版 patch 的时候,maintainer 会 review,会给你些参考意见。一般最开始要求非常严格,从最简单的格式上有无问题,一行代码开头不能有空格、必须用 tab 键开头、一行的长度不能大于 80(最早)。再比如说,一个函数命名的时候要怎么写参数格式、哪个地方要空格、哪个地方不能有空格、等号之间要空格等等。
内核几千万行代码,如果没有非常严格的要求,大家可读性就很差,所以 coding style 是要严格要求的。从最简单的 coding style 开始就会给你提建议,再到后面代码设计的逻辑、错误处理有没有问题、结构上有没有问题,包括你对其他模块的修改会不会产生一些问题,都是非常非常详细的。
我有一个 patchset 大概写了二十多版最后才提交进去的,每次提上去 maintainer 都会给你反馈意见,最后我都麻木了。其实我这还不多的,我还看见还有发四、五十版的,所以 Linux 内核整个研发机制还是非常严格的,包括对代码要求、对工程质量把控。所以我觉得这个经历对自己的锻炼是非常非常大的。从事 Linux 内核研发,每一行代码都凝聚了很多心血。
提问:像您刚才描述 Linux 内核社区或者很多的开源社区,它相当于有一个非常好的培训机制。一个小白、一个学生甚至是一个爱好者,他只要胆子够大,敢开始提第一个 patch,就会有人来帮助他变得更好。但是为什么还是有很多人都不敢去干这件事情?
马涛:Linux 内核社区确实有非常好的培训机制。为什么很多人不敢去干这件事,我觉得是两个方面:第一个就是整个 Linux 内核代码太庞大了,对于一个新手来说,他可能会无所适从,不知道该从哪儿找到一个合适的切入点。虽然 kernelnewbies 网站上是列了一些东西,但对于新手还不是很友好,因为学习曲线太陡峭了。
第二,大部分人肯定都在欧洲和北美,尤其北美居多。很多情况下你发个邮件很可能就要等晚上或者第二天才回。另外就是,对新人虽然比较 nice,但是他们对代码要求会很严格。如果你不够坚定,可能你发了二十多版都进不去,你就放弃了,从入门到放弃可能就几天的功夫。
云的普及,重新定义操作系统的发展
提问:龙蜥社区是从哪年开始的?
马涛:2019 年就在酝酿这个事,2020 年年底开始的,正式对外宣布是在 2021 年云栖大会。
龙蜥社区第一是希望能够跟别的厂商、公司一起来做这个事情,我们有一些提问题的群,我们能知道用户的反馈,也能够帮助中国的其他企业的开发者有所成长。
(图/ 龙蜥操作系统首次亮相云栖大会)
当然更多的考虑是怎么把这个开源运营好,让更多人用起来。在中国操作系统开发人员里面能够普及起来,我觉得这是真正的一个良性循环。过去可能就三、五个人或者十几个人可以搞开源。但现在我们如果真的想把整个开源做起来,就要有很多配套,比如,去跟高校合作、企业合作、开发者合作等。
提问:我相信观众也会对龙蜥有更多的好奇,就龙蜥操作系统和其他基于 Linux 来做开发的操作系统有些什么样的区别?它的目标是什么?
马涛:我个人在阿里已经 11 年了,经常放在口头的一句话就是“客户第一”。我做龙蜥社区,需要思考的是——我到底想解决什么样的客户问题,如果是不解决客户的任何问题,瞎做或者就为了开源而做开源,其实长久不了的。
短期内,CentOS 停服是我们客户面临的非常迫切的问题。CentOS 8 于 2021 年 12 月底就已经停服了,CentOS 7 宣布在 2024 年停服,留给我们的时间很短很短。那在停服过程中会有什么问题?就是没有任何技术支持了。国内现在有大量的用户都在CentOS 7、CentOS 8 上。最简单、最基本地解决他们的生存问题,是龙蜥社区短期之内要做的事。
长期来看,替代后得有进步,在考虑客户需求或者燃眉之急以后,我们未来会尝试解决一些自主可控的问题。虽然说现在相对来说力量比较薄弱,但还是非常有机会的。因为都看到了这个问题,也在积蓄自己的力量,包括集合社区所有合作伙伴力量。
希望未来的操作系统应该长什么样子?我们会打造一个什么样的操作系统?我还想补充一点,就是在云计算这个领域,阿里云也是做了很多工作,计算、存储、网络、安全等领域的技术能力都是排第一的。既然在云计算领域里面做到了技术能力的领先,那如果我们能够把云的这些能力赋予到操作系统里面,让操作系统变得不一样,其实是有可能帮助我们在未来颠覆掉整个操作系统的设计和规划的。
如果说我们沿着 Linux 老路走,在积累上会比国外差距偏大,这个是事实,我们也不否认。但是随着云的普及,我们有机会重新定义。即使我们还是用 Linux,但我们尝试重新去规划这个操作系统的发展未来,我个人是有信心的。这也是为什么我觉得还是可以做一些事情,也算是时代给了我们一个机会。
提问:当我们去运营一个开源社区的时候,我们会以什么样的方式去运营?是把对方当成是社区的一份子,还是把他当成是客户?您在运营的时候会如何去看待这些社区里的成员、参与者、贡献者和爱好者?
马涛:社区里的角色还是挺多的。有使用者,会提一些问题,包括怎么安装、出了问题怎么修或者提一些 bug 之类的;也有一些合作开发者,想增加一些 feature、想做一些功能;还有高校一些学生,包括一些高校老师。
我个人觉得有两点:第一点,“客户第一”本身不存在一个非常冲突的关系,不管他的角色、身份,我们会笼统认为他是某种程度的客户。但如果说一定要细分,使用产品的肯定是我们的第一客户,这个是我们要明确的。开发者、学生、兴趣爱好者,是第二客户。为什么要区分第一客户、第二客户?因为当他们的观点或者意见发生冲突的时候,有一个法则约束,我们要遵循最终客户。如果说没有冲突的时候,需要都服务好他们。第二,龙蜥实验室的成立是希望大家能够用得更好,同时能够让大家更好地参与社区。我觉得本身做操作系统和其他的开源软件不一样的点是,或多或少都会用到操作系统,所以理论上来说,都是我的客户,或者未来可能都是我的客户。
提问:我们会讲一个客户满意度,这些都是做客户的思维。如果是做社区,我们经常会强调社区的归属感。您会怎么理解满意度和归属感之间的区别或者联系?
马涛:我觉得可以拿我自己来类比,我就讲我自己怎么获得社区归属感。还是在 Oracle 的那段经历,我那会儿在 Oracle 开发的是一个集群文件系统,我有 Oracle 的客户,他就是用这个集群文件系统的。个人认为对于一个开发者来说,他获得归属感的这个满足感要远远大于他满足客户的这个满足感。
当时我在做社区开发的时候,春节也在家里趴着写代码,然后去跟他们讨论问题。我的代码被社区接受起来,被用起来,在社区有影响力,这个对我来说非常非常有社区归属感。当我去服务我的客户的时候,要去考虑他们会不会用这个东西、有没有出bug。这是两种感情。
所以我认为,在龙蜥社区有归属感,是非常非常重要的事情。
提问:前面您在讲到个人经历的时候说,要想在操作系统内核社区能够参与开发,学习曲线是非常陡峭的,所以很多学生尤其是初学者都会望而却步。那么龙蜥社区在这方面有没有尝试着做出一些努力来帮助别人降低这种陡峭的学习曲线?
马涛:我们确实在做这方面的尝试。内核为什么学习曲线陡峭,因为它本身代码行数很大,涉及的模块特别多,如果对于一个完全不懂的门外汉来说,要接触的概念就非常多,包括内存管理、进程调度、存储管理、网络,而且代码与代码之间是藕断丝连的关系。这些对于新手来说真的是非常困难,尤其你今天看,明天可能就会忘掉。
所以从我入门的经验来看,是想先设计一些简单的任务,让初学者先做。怎么定义简单呢?我们会把操作系统拆分成各个模块,并对模块里面一些非常小的功能写非常明确的 guide(指导意见)给开发者,然后让开发者慢慢加入龙蜥共建。
做 Linux 内核社区还有一个好处。就是当你的 patch 进入到 Linux 内核主线的时候,相当于你的名字就进去了,你就会成为整个 Linux 内核的开发人员,你的名字也会出现在各个 Commit Log 里面。这对于开发人员来说,还是一个可以“吹牛”的地方。
我们能做的就是帮开发者搭一个梯子,让他们更容易去做这个事情。因为对于一个新手来说,没有人搭梯子还是很难。
(图/龙蜥社区开发者激励活动)
提问:龙蜥社区有和高校老师或者是学校合作操作系统的课程吗?
马涛:有和高校的合作。第一个是清华大学陈渝老师,他也是做操作系统的,之前有一个面向全国高校的操作系统大赛,龙蜥社区出了一些操作系统相关的题目,希望培养他们对于操作系统的兴趣。
另外就是和北大合作,龙蜥走进北大课堂,在北大软件与微电子学院面向研究生同学们开了一门精品课程,讲授怎么做操作系统里面的一些核心组件等。
(图/龙蜥社区走进北大课堂)
我们还参与了教育部产学合作协同育人计划,这个较前两个更宽泛一点。我们会跟高校老师一起合作,比如写一些教材、做一些实验等。我个人觉得,操作系统的书很多的,我们缺的是实验操作系统怎么去动手,让他们去提交 patch 也好、发补丁也好或者是给内核做优化,这是比较重要的。龙蜥实验室就是方便开发者实际动手操作,希望更多人能用起来。
提问:我觉得这件事情大家都知道要费很大的力气来做,而且需要做很长线的工作才有可能培养出一点操作系统的人才来。那现在的大学生最关注的开源技术领域可能还不是操作系统,龙蜥社区有什么办法把这种操作系统的价值或者说诱惑力给它表现出来呢?
马涛:操作系统我觉得最重要是搭个梯子、让大家都更容易地能做这个事。如果有这个梯子,我个人觉得很多人会愿意做。
本身对于整个高校的学生来说,做操作系统的人相对会偏少一点,这个我不否认。但是我想说,现在毕竟不像很久以前了,你做个系统可能都不一定找到工作,这样全中国想做操作系统的人或者愿意做操作系统的公司也没几个。现在全国做操作系统的公司很多,阿里、华为、腾讯、百度,还有包括很多互联网公司,包括 OPPO、vivo、小米。所以整个行业对大学生有潜移默化的影响,既能够给他们提供一个梯子,又能够在就业上有很多保障,慢慢地,这个情况会扭转过来。做操作系统,有几万人已经很不错了。
高质量发展助力生态繁荣
提问:从龙蜥的角度出发,如何去理解生态,怎么才能够称生态是繁荣的、成功的?
马涛:这个问题真的是一直在思考。其实我们做 Linux 操作系统的,肯定就看 Linux 内核。每年 Linux 内核的补丁数排名前面的有各种各样的公司,Intel、Google、Facebook 等都在做 Linux 内核,最核心一点就是所有参与开源社区做研发的公司,一定要有适合他公司的商业模式在里面。
因为看 Linux 内核的奉献者列表,排名前十的基本上都是各大公司,可能到排十几二十的时候会有一个 hobbyist。有 hobbyist 是很好的一件事,但是更重要的是需要头部的这些公司能够为这个社区做很大的贡献。这些大公司参与社区,他们愿意投几百甚至几千个人,我觉得这是这个社区存在的一个非常重要的意义。
社区要帮助参与进来的企业找到一个非常合理的商业模式,才是社区能够良性发展最核心的一点。我个人认为,做好以下两点,这个开源社区的生态才算比较成功的。第一,有很多公司参与进来为社区服务;第二,所有的公司都能在社区里找到自己合理的商业模式,并且能够围绕商业模式打造自己的核心竞争力。
提问:龙蜥社区要在众多的开源操作系统里面做好自己的生态建设,它的优势或者说它希望能够发挥的特点是什么?
马涛:我可以举几个例子解释。第一,龙蜥不能脱离中国国情和现在的发展。龙芯最近刚把 LoongArch 架构的 gcc 合并到 Linux gcc 主线上。但 LoongArch 体系架构出现已经有一两年了,在这一两年时间里是没有办法从上游社区得到任何帮助的,因为还没进去。那这时候如果国内企业又要用,怎么办?这时候就需要一个操作系统发行版来填补这个空白,龙蜥就能提供这样的平台,提前把龙芯包括国内其他芯片厂商的产品让客户用起来。
像国外的一些发行厂商,对于国内芯片支持不是很好,可能也有一些市场或者其他方面因素考虑。但国内的芯片厂商的正在快速增长,包括阿里倚天、龙芯、兆芯、申威,他们需要有一个操作系统来支撑,这些厂商能够从龙蜥获取到营养。
第二,云对于操作系统的影响还是有一些。阿里云在这里面做了很多的工作,有可能会影响到未来操作系统的发展。一是在国内的硬件、软件都在快速发展,需要像龙蜥这样的操作系统社区快速满足需求。二是在和上游地区达成一致以后,把上游补丁 backport 回来就可以。但是中间这段时间,我们是需要能够满足所有客户需求的,我觉得这个就是我们能够给企业带来的最大价值。
提问:您怎么看待社区和商业化之间的关系?
马涛:核心我觉得还是企业商业化,像统信软件、中科方德、万里红等企业,其实都会基于龙蜥出自己的商业发行版提供给客户。但因为毕竟是一个社区版本,所以有两个比较大的问题。
第一,响应客户肯定是不像商业公司那么快速。因为很可能你发个 issue,万一这个人比较忙,可能明天才能看到。当这种情况发生的时候,商业公司是可以提供明确的 SLA 保证。
第二,商业公司提供了非常严肃的兜底服务。比如说,派工程师去现场排查问题、提供软件升级服务、提供全生命周期管理等。那对于一个社区来说,往往就 focus 在最新的发行版本上,可能会有几个 LTS 版本,或者说如果有问题了也可能会考虑修复的成本。但对于商业化公司来说,有一整套完整的体系。我们把操作系统的能力贡献出去,他们围绕这些能力做自己的商业化服务,相当于是互补的模式。
提问:阿里在这个背后能赚到什么?
马涛:阿里是不做操作系统这个生意的。那我们的商业利益到底是什么?所有在龙蜥上跑的系统在阿里云上可以跑得很好。只要用到龙蜥,就会想到龙蜥是阿里参与并做出重大贡献的,那企业在选择上云的时候就会考虑上阿里云。
提问:就像 Chromium 是 Google 主导的。所以当你想要去做容器,想要去做云原生的时候,就会觉得 Chromium 那当然是谷歌。其实这就对于谷歌云会有很大的帮助作用。所以你们在做龙蜥社区时也是会有这样的一种目标在里面么?
马涛:我只能说这是阿里的一个商业利益。因为我现在代表龙蜥理事长,希望所有参与龙蜥的公司都能找到自己的商业利益。
提问:之前有同事说我既在开源社、又在华为,是怎么做到的。刚刚听您介绍也是这样一种状态,同时是龙蜥的理事长、又是阿里的员工,可能同时还是 Linux 社区的贡献者,也是有多顶帽子在自己的头上。那同样的问题抛给您,您是怎么做的呢?
马涛:我是这么想的,我也感谢龙蜥社区给了我一个机会,因为之前无论是在 Oracle、淘宝还是阿里云,其实都是代表公司在为这个社区做贡献。但如果说你跳出公司的思维,从社区的角度去看这个事情,你就会发现考虑问题的视角会发生不一样的变化,比如作为龙蜥社区的理事长,要考虑怎么让社区里所有的企业都能够从中获利。社区如果要长久发展,那就需要平衡制衡,不能阿里一家独大,如果一家独大,这个社区怎么玩呢?很多时候必须站在这个龙蜥社区理事长角度去考虑问题,才能让这个社区更加公正、公平、开放。
提问:现在需要您自己来运营一个本土的社区,面临的主要挑战是什么?
马涛:客观来说,龙蜥毕竟是个 Linux 社区,所以和 Linux 社区相比,有很多相同的也有很多不同。相同的点就是刚才前面提到的学习开源还是比较陡峭的,大家很难去把爱好者去培养成新的开发者,确实会比较费劲。
但我想说几点不同,第一点是,过去大部分中国做 Linux 开发的都是参与者,没有几个是主导者。现在有龙蜥和欧拉,我一直觉得我们有各自的特点和不同的出发点,但是有一点我认为是一致的,一起促进中国操作系统产业的发展,一起把中国整个操作系统人才的厚度聚起来。所以我觉得在中国做操作系统,第一要扎根中国,想着怎么去把中国的操作系统产业做起来,把中国的操作系统人才培养起来。这个事情很难,但时代赋予了我们机会,我们还是要坚持,还是有信心的。现在相对 2006 年那会儿已经好很多了。第二点是,现在国内对操作系统产业、对基础软件产业的重视程度也是今非昔比的,所以我觉得我们是有机会做出来的,也需要好好做。
提问:有一个灵魂拷问,您是要把龙蜥社区运营的更像一个 Linux 内核社区,还是选择立足中国、有自己的特色,运营出龙蜥社区自己的风格?您会怎么选?
马涛:首先从我的个人的观点来说,毕竟中国是需要跟国际有沟通和交流,可以看到最核心的 Linux 内核研发人才或者资深人士都在国际上的。所以我觉得首先要做到跟国际社区非常融洽的关系,和上下游打成一片。现在我们各种各样的补丁不会藏在龙蜥社区里面、不向 Linux 上游社区贡献,我们同时会不停地往上游社区去推。如果上游社区(就是 Linux)接受了,那么我就会再把它拉回来,这个工作我们会持续做的。
第二,我觉得是需要立足国内的不同环境,有一些不同的常识和打法。其实最简单的,比如老外其实在用邮件列表,国内有钉钉群、微信群,但是如何利用新形式,把钉钉群、微信群运营起来,把这些群成员吸引到社区里、让他们也能够参与到社区开发里面,也是跟国外不一样的点。
提问:现在假设你们社区里有一个非常优秀的开发者,您们会愿意帮助他、培养他直接到 Linux 内核社区去提交,还是在龙蜥干,干完了以后社区帮你提交到内核去?
马涛:这个我可以直接回答,没问题。我们第一条会鼓励他去上游社区,我们团队有一个同学刚刚提了一些 patch 到上游社区,被邀请去参加美国开的关于文件系统的峰会。我们会鼓励所有人参与国际社区,参与国际社区的标准制定。如果说你总是把他 keep 在自己的小圈里面,那他永远得不到成长的机会。就跟咱们培养小孩子一样,你要让他出去见世面,让他知道人外有人、山外有山,他才能够成长得更好。所以说,我们不但不会阻止,还会鼓励所有社区人积极参与上游社区的贡献,在上游社区里面建立影响力。我们的目标肯定是说影响整个未来 Linux 社区的发展,这是我们最核心的一个目的。
提问:龙蜥社区运营过程中有没有什么经验或者称为教训的事件?
马涛:教训、经验都有。我分享一个经验、一个教训。
我们本来认为在国内运营一个操作系统社区是很难的。但我发现,如果能够找到一个非常共性的点,同时能够为开发者构建一个非常好的基础设施或平台,其实还是相对可以的,即使在基础软件如此难的领域里面也是可以的。反过来说,国内开源社区的蓬勃发展是非常有希望的。现在在国内搞开源没有想象的那么难。如果你想在中国搞开源,想通过开源成立一个公司,我觉得真的是很有机会的。那接下来说一个教训,我觉得可能谈教训更有意思一点。开源是这样的,很多时候我的思维可能还停留在跟老外做事情的风格上面。其实在中国确实需要因地制宜做一些改变。在国内我们已经习惯了用钉钉、微信这种即时通讯工具了,国外的话可能还是在用邮件,你发个邮件可能第二天才会给你答案的,这是很正常的,因为时差。当我的用户提出一个问题的时候,你要是在钉钉群或者微信群里面一两个小时没人回,他可能就会有点不耐烦了。之前觉得老外响应快多了,但现在中国的节奏很快。所以在初级阶段,我们还是要积极响应所有的用户问题,尤其是大家适应了这种快节奏文化的。
在开技术委员会或者理事会会议时,我都会请求,碰到用户在群里提问时,尽快回答。现在我们也有一些值班制度,可以让用户在用操作系统或者在开发过程中遇到一些问题的时候,能够快速得到答案。龙蜥已经构建了比较完善的一个答疑体系,他们很多会问一些很着急的问题,比如安装,就非常希望你赶紧告诉我怎么回事,那我们的值班制度就可以非常快速地告诉他该怎么办。但老外的话经常要第二天才会有人会理你的,大家也习以为常。但在中国这块儿其实还是不一样。
(图/龙蜥社区首届理事大会)
提问:就是说在社区运营的过程中还是有很多细节问题,而且这些细节问题牵扯到一些非常困难的取舍。
马涛:对的。现在大家都是在摸索阶段,那其实如果未来有更多不同国家的人参与进来,就会有不一样的理念产生,我觉得这是一个社区走向成熟必然要面对的一些问题。龙蜥社区都是在摸索中前进的。
虽然我参与 Linux 上游社区这么多年,但在中国运作的社区,包括自己运作的社区,其实还有很多不一样的点需要去尝试的。包括我之前就是一个开发者,没做过运营,也没做过构建社区基础设施这整套东西,都是在不断的运营,不断的学习,不断的进步。
人人都可以参与开源
萌新小白、技术高手看过来,数千款任务,上万份礼品,还有实习证明和内推机会。