大咖访谈 | 做开源,最核心的就是要随缘 —— Apache SkyWalking 创始人吴晟-程序员宅基地

技术标签: python  java  编程语言  人工智能  大数据  

aca522c3f009da808b34e05f259cf5c4.gif

673d0c1f616de273deea4c821da35b7c.jpeg

转载自 | 开源雨林

编辑 | 高旖阳

责编 | 钱英宇

83f3eb0c860b1475cf3b070c3d685641.png

本期访谈阵容

e77673aa6f4244d47f5727a3f25cc33a.png

嘉宾:吴晟 ShengWu

•Tetrate 创始工程师,Apache 软件基金会首位华人董事,开源 APM 项目 Apache SkyWalking 创始人,分布式追踪与诊断技术专家,骨灰级开源社区爱好者。

主持:庄表伟

•开源社理事、华为开源管理中心开源专家。常年参与社区各类活动,热心开源治理、开源成长、开源学术等方面的研究与分享。

21eb2a25c20ffcae35f61d5e560f6bbf.jpeg

Q:最早接触开源是基于怎样的机缘,有些什么值得分享的趣闻轶事?

吴晟 ShengWu:我大概是从 2015 年开始做开源,其实就是从 SkyWalking 开始的。在 2010-2015 年期间,我参加过很多运营商的全国级项目,由于项目涉及较多企业之间的合作,所以接触到了较为早期的分布式系统。

SkyWalking 最初是为了解决手上的问题,也是因为自己的爱好,希望能用开源的方案来做这个东西。但其实当时不管是软件基金会,还是对开源应该怎么做,都没有太多的概念,就是自己写了点代码,放在 GitHub 上面,娱乐性质地参与一下。

庄表伟:其实我挺好奇的,因为我也做过好几个开源项目,但是非常令人惊讶的是,你的第一个开源项目就能够做到这么高的用户量,成为非常著名的 Apache 顶级项目。开始做 SkyWalking 的时候是怎么想的,为什么一开始就选了这个领域,还一下子就选中了,这其中有怎样的故事?

吴晟 ShengWu:当时,我们在网上找了很多应用性能监控项目,做了半年的调研,发现市面上有商业的,有非商业的,但并没有开源的。其实,我们了解到 Zipkin、Pinpoint 可能有开源,但试用后发现它们并不能满足我们的要求,不是一个完整的 APM 解决方案,基本上就是基于非常简单的诉求做出来的。既然没有,我们又想做,那干脆做一个好了。刚好公司侧也不涉及这方面的商业、战略等问题,就说如果业余时间我们愿意做,那就做,日后公司也可以拿来用。在这样一个契机下,做了决定把这个事情做起来。

但我们真正认真做这件事情,大概是在项目开始一年后。当时,OneAPM 关注到了 SkyWalking,他们很认可我们的技术,觉得我们写的东西和他们公司的非常像,所以就把我们招过去了。当年更多的是工作角色,OneAPM 认为,既然我们能写出来 SkyWalking,是不是能帮助他们把公司的 APM 的探针和后端也进行优化。

OneAPM 不反对我们继续做 SkyWalking,且提供了很多一线 APM 公司面临用户相对较为苛刻的生产环境上的一些要求,让我们在早期就了解到未来会面临的环境是怎样的,这对我们后面迭代开源产品来说,是一个很好的背景。

Q:什么时候决定把 SkyWalking 捐赠给 Apache 的呢?

吴晟 ShengWu:把 SkyWalking 捐赠给 Apache 和之前我在华为的经历有关系。早期在 OneAPM 跟姜宁姜老师是同事,他告诉我要跟公司签备忘录,以保证我做的开源项目和公司的知识产权是分开的。到华为后,因为华为是支持开源基金会的,所以就有了两种想法,一个是让华为参与这个项目,由华为主导;另一个是把项目捐赠给基金会,不论是我个人还是华为,都不对项目进行控制。评估之后,觉得捐赠给基金会既能最快速执行,又能保证中立性,所以就选择了这个最简单可行的模式。

其实大家现在在 Google 上搜,还能搜到当年 SkyWalking 申请 CNCF 孵化项目的邮件,CNCF 也给了做 Presentation 的流程,但我们看到 CNCF 的流程跟企业关系太大,做起来会很麻烦,还是觉得干脆快一点,所以就把 SkyWalking 送进了 Apache。

Q:开源项目的捐赠其实有很多选择,可以捐赠给 Apache,也可以捐赠给 Linux Foundation、CNCF 或其他基金会。通常来说,开源项目捐赠时选择基金会的逻辑是什么?这几家基金会背后的气质或者说它们的倾向性有什么区别?对于开源项目的捐赠,有什么好的建议吗?

吴晟 ShengWu:其实区别还是比较大的。Apache 基金会偏向于个人团体或者小团体,在没有非常强烈的公司背景下,一个开源项目想在更为开放的环境做开源,个人会比较建议选择 Apache 基金会。CNCF 很明确的是多家厂商做联盟项目,从 Kubernetes 到现在任何一个国内的项目,基本上都是 3-5 家厂家一起抱团做开源项目。Linux Foundation 的目标是做子基金会,基本上背后都有会员企业 Sponsor 项目。Linux Foundation 最大的优势是它会管理子基金会,可以省掉很多麻烦事。

Q:SkyWalking 发展到今天,已经非常的成功。它大概经历了哪些阶段?目前的阶段和状态是怎样的?

吴晟 ShengWu:第一个阶段大概有两年的时间,SkyWalking 当时在 GitHub 上的文档、注释等,所有东西都是拿中文写的,算是一个比较娱乐性的环节。第二个阶段大概有三年的时间,我们把主要精力放在了 APM 里基于分布式追踪的探针技术方向。第三个阶段,大概从 V6.0 到 V7.0 开始,我们社区有了足够的资源,也真正决定做 APM 的软件。我们现在处于第三阶段的尾部状态。同时,我们也在计划第四阶段向更庞大的生态发展,比如说我们开始有自己的数据库,开始更多的和其他技术栈做融合,做生态概念的项目。

大概是这样的四个阶段。最终的目标,希望 SkyWalking 能在开源领域是一个很好的原型,不管是想做商业的 APM,还是想借鉴以后自己去做相关的东西,都可以从它上面看到一些经过很多复杂场景验证、使用之后的一些结论或经验。

Q:在四个阶段中,你的个人角色有什么变化?

吴晟 ShengWu:因为起初我们一共就两三个人,所以第一个阶段我和普通的 Developer 是一样的,就是埋头写程序。第二个阶段更多的是和最初的种子用户做沟通,我开始想知道大家对 SkyWalking 是怎么看的,想知道大家觉得我还能做什么,或者怎么做会让 SkyWalking 做得更好,有点像 Product Manager。

第三个阶段更多偏 Social 一些,基本疫情之前全球到处走,国内更多的是参加各种会议,走访各大公司等,国内外的商业公司也好,其他的项目也罢,希望知道 SkyWalking 在他们这种超大规模的公司里是怎么应用的?他们的项目和 SkyWalking 是如何集成的?SkyWalking 在全球、在中国,有哪些典型的使用的方式?

第四个阶段,到目前为止,更多的是两方面。一方面,SkyWalking 作为我们公司创业商业化的一部分,我们会花更多的时间在商业化上。另一方面,我们会花更多时间挖一些很细节的功能,例如 SkyWalking 基于 APM 的专有数据库,或者用 Linux 内核的一些技术做性能监控,和传统的探针做集成等等一些比较深入到生态里面的话题,反而对 SkyWalking 本身的控制或者状态,相对以前会少一些。

Q:在这几个阶段当中,SkyWalking 社区发生了什么变化?

吴晟 ShengWu:第一阶段可以先跳过,因为当时也不存在所谓的社区。第二阶段会碰到一些比较爱技术、爱折腾的人,给我们很多鼓励。他们不会参与这个项目,但是会和我们做点对点的沟通、反馈,对我们来说更多的是鼓励。个人认为,第二阶段没人敢拿 SkyWalking 上生产,当时也确实不具备相应的能力,但是大家会认可 SkyWalking,觉得 SkyWalking 的方向很好,是不是能做的更好一点?反而我觉得这个阶段是最有用的,今后的商业用户,或者说潜在的购买者,都是从那时候来的,也是他们告诉我们要站在用户的角度思考,什么是用户想要的,什么是市面上稀缺。

第二阶段我们一直有问大家一些问题,想要了解为什么大家想要用 SkyWalking,当前市面上的有哪些点是不符合他们要求的?是觉得我们不收钱,还是就是觉得它们功能或性能做得不够好、不够细致?国外的巨头们,他们又做到了什么程度?

第三阶段其实是整个 Apache 孵化期,以及毕业后的很长一段时间。前期,我们会偏向于比较鼓励大家是不是能参与进来写代码吗?三个人肯定是干不成这个事情的。所以我们需要鼓励更多的人进来,所以会去更多的精力会和大家交流的时候,识别大家是不是有能力?或者是有时间参与到这个项目里面来。这个过程相对来说会比较疲惫,因为大家有走的,有来的,有做几个月的,有做几年的,有做了几年走了又回来的,我们都有碰到,所以,这个阶段就是和大家去讲程序了,我觉得这可能目前经历过时间比较长的这三个阶段,参与社区的人的角色不一样了。

Q:第四阶段的社区是种什么感觉?

吴晟 ShengWu:现阶段,整个梯队以及大家的职责是很分散的,SkyWalking 也有将近 30 个涉及不同技术栈、编程语言、使用环境的子项目。目前我在 SkyWalking 里并非 Leader 角色,这么多项目对于我来说也是不可能完成的任务,我只会了解 SkyWalking 作为 APM 主线的一部分,例如我会花较多的时间在 SkyWalking 的后端以及 Java Agent,及其他我比较感兴趣的技术。可能有时候会提醒有些地方是不是可以优化一下,但绝大部分的决定是对应项目管理的 PMC 或 Committer 处理的。

Q:现在成立了创业公司做 SkyWalking 的商业化吗?接下来的打算是什么?

吴晟 ShengWu:站在全球角度看,如果不是在特定节点,我并不希望做纯 SkyWalking 的商业化。SkyWalking 是用开源的方式在做 APM,而 APM 恰恰又是一片红海,所以如果 SkyWalking 直接商业化,需要和现在商用的 APM 做非常多的竞争,倒不是说比谁做的好,更多的是不感兴趣。

2018 年,我和 Google、Twitter 以及 IBM 几位工程师认为 Service Mesh 的商业化是一个非常好的方向,但 Service Mesh 只有管理的一面,没有性能监控面和安全面,而 SkyWalking 作为 Service Mesh 整个商业化产品里闭环的一部分,可以充当性能监控、安全的角色组件,与 Service Mesh 共同构建出横跨 CNCF、Apache 软件基金会的商业级解决方案。这是我们从 2018 年到现在,作为商业来说我最感兴趣的地方。

庄表伟:过于专业化的能力商业化是比较难的,但完整的解决方案商业化会容易很多。

Q:你们的商业模式是将开源的东西拼在一起,再加上定制,做商业化解决方案的 Service Mesh。如果你们的竞争对手也用开源的东西做解决方案(可能会用到 SkyWalking),跟你们会有直接的竞争吗?如果有,你们的优势是什么?

吴晟 ShengWu:一定会有竞争的,哪怕他们没有用 SkyWalking,他们很有可能用 Istio、Envoy。SkyWalking、Istio、Envoy 这三个组件作为主流基金会的顶级项目,一定有大量的竞争对手在使用。一个公司里,有多少人在控制社区的发展方向,有多少人真正了解社区代码的走向,这些对于商业发展起到了至关重要的作用,因为这才是整个技术最核心的点。

Tetrate 在 SkyWalking 上投入针对 Service Mesh 监控的解决方案,全球只有我们在这么做。我们的工程师对 Envoy、Istio、SkyWalking 也足够熟悉,基于此,我们给出集成解决方案,即使这个解决方案是开源的,但是对方案的理解如果只是抄了个皮毛,能做的东西其实还是很有限的。

Q:你们公司现在有多少人?都分布在哪些城市?

吴晟 ShengWu:现在大概有 110 多人。因为 SkyWalking、Envoy、Istio 的贡献者来自于全球不同的地方,所以我们公司的组成形式其实不是很主流。这 110 多人分布在全世界的任何一个时区,从最东的日本时区到最西的美国西南岸和夏威夷,基本上是一个纯异步的工作环境。在某些领域里,也会有地域性的概念,比如说 SkyWalking 绝大部分在亚洲,Envoy 基本上是美国和日本。

Q:如何看待社区里的人员流动(留存率)?

吴晟 ShengWu:我的想法是,除了我自己,所有人都会走。也许有一天我也会走。

举两个可以在 GitHub 上可以看到的例子。第一个例子是 SkyWalking 在 3.0、5.0、6.0 时期,有一位非常重度的贡献者,甚至现在他的提交在主库仍然排名第二,但是他离开项目已经有两三年时间了。他在那个阶段有很多个人的诉求,他想借这个项目完成他个人的证明题,在他完成后就离开了。第二个例子是 SkyWalking 的 .net 探针。.net 探针是 SkyWalking 的第一个子项目,也是  SkyWalking 在 Apache 孵化期第一个吸纳的 PMC 成员,他在 2017 - 2018 年为 SkyWalking  写了 .net 探针,但中间有很长一段时间因为工作原因没有时间和精力维护,交给了其他人,后来忙完又回来继续做了一段时间。

其实有很多这样的人在一个项目进进出出,所以更多的还是需要调整好自己的心态,没有必要一定把大家都绑在里面。另外,一定不能觉得离开了或不贡献代码有什么不好,其实和表伟我们俩都认识的朋友,绝大部分都没有人帮 SkyWalking 写过代码,但在平时很多的活动上都会提到 SkyWalking。口口相传对项目是非常有帮助的,因为绝大部分人更愿意相信朋友的分享,而非从新闻媒体里面看到一个离自己很遥远的东西。

Q:有没有哪些你觉得很离谱的故事可以分享的?

吴晟 ShengWu:在已经推广开源这么多年的情况下,很多普通工程师依然认为开源软件的作者对开源软件负有责任。维护、修BUG的责任也好,答疑的责任也罢,这种强加给开源开发者的责任是我觉得最离谱的一件事情,会从本质上最大范围的破坏相对比较少数派开源软件的开发者。

庄表伟:开源项目有一个地方叫 Issue List,创作开源项目的人难道没有义务回答问题吗?

吴晟ShengWu:个人而言,我会回答,但我不认为那是我的义务。在北美公司的四五年,我最大的收获是:如果你疲于应付一件事,那么这件事一定做不好。我不强求改变其他人,但我觉得一个好的开源项目作者,要有那种我就是不想回答的勇气,如果别人一提软件哪里有问题,你就非常焦虑的想去解决这个问题,我觉得项目不到 SkyWalking 这么大就会被拖死。

Q:除了这种离谱的事情,有没有什么让你气愤的?

吴晟 ShengWu:比较让我气愤的有两点。第一点是把语言和爱国捆绑,处理技术问题就够麻烦了,还要在这些问题上浪费时间,这个对于项目本身或者我们平时的日常工作来说,是很令人气愤的。

第二个是环境上变化比较大的点。很多公司以前不做开源的时候会疯狂的贬低开源,但可能因为有竞争关系,也发现了开源目前是趋势所向,决定自己要开源,就说开源能解决所有问题。开源只是一种合作模式,并不能仅凭是否开源来评判软件的好坏。

Q:有没有其他想分享给大家的故事?

吴晟 ShengWu:分享两件事吧,首先说说基金会里最常见的一个事情:达成共识。共识是大家一直在推崇的概念,但我觉得达成共识是一件很难的事情,很多时候我们达成的所谓的共识,其实是一个妥协的产物。是否能够真正的做到换位思考是我们面临的最大的挑战,特别是走出国门做开源,和国外的人在宗教和价值观上面的差异会是一个很大的障碍,需要我们更多的换位思考、妥协。

第二件事是在开源的推广上,我们可能太标榜一些事情。任何一个开源项目都有其好与不好,但开源项目本质上是多元的,对于成功的标准也应该是多元的。所以我认为,想让更多的人能更客观地看待开源,应该更多讲讲多元。

庄表伟:聊得差不多,正好跟你介绍一下开源雨林。开源雨林跟你所秉承的多样性理念非常契合,为什么叫雨林?因为我们觉得雨林是全球范围内生物多样性最好、最健康的地方,我们非常希望开源的生态能像热带雨林一样蓬勃发展,做这样的访谈也是希望能够跟更多的朋友一起,聊聊开源生态相关的各种话题。我们也想听听看,你对开源生态,对开源雨林,有哪些意见或建议?

吴晟 ShengWu:我们参加过很多开源相关或文化相关的活动,我觉得有两个点。一个是怎么能更多的听到大家想要什么,因为我一直感觉开源文化这个话题听众是比较有限的。首先,它是一个相对小众的话题,其次,很多做开源的人其实不太喜欢听文化这个话题,所以如果我们能有更多的活动或者是沟通的机会,多了解一下开源新人的困惑或者是他们能分享的一些感受,我觉得可能会产生很多共鸣。

今年,ApacheCon 把 Panel 完全让出来,把 Keynote 的位置拿出来给了 Apache 项目里面很多暑期 2020、暑期 2021、暑期 2022 的学生。他们之间如果没有我们这些人在那坐着,是不是会更多的表达他们比较有共性的情感,我很想看看那样一期节目大家会有什么反应,甚至我觉得他们可能会对普通的开源开发者产生更多的启示。我不太希望开源是少部分人管理开源项目的过程,因为创建项目、带项目,和很多人参加项目的体验感差别还是蛮大的。作为新人,参与感受会很不一样,可能给学生做访谈或采访,那样的主题对新人来说会更有教育意义。

相关阅读 | Related Reading

97922d09d56b6590ba620bc9d229ed8d.jpeg

世界上最大的开源基金会 Apache 是如何运作的?


d03171fc420c63bb3c70444313e6ecda.jpeg

专访|带着问题去学习,Apache DolphinScheduler 王福政


c2ad2ee31ee9b9c071d878168e101878.png

一份开源领域知识的学习清单

开源社简介

开源社成立于 2014 年,是由志愿贡献于开源事业的个人成员,依 “贡献、共识、共治” 原则所组成,始终维持厂商中立、公益、非营利的特点,是最早以 “开源治理、国际接轨、社区发展、开源项目” 为使命的开源社区联合体。开源社积极与支持开源的社区、企业以及政府相关单位紧密合作,以 “立足中国、贡献全球” 为愿景,旨在共创健康可持续发展的开源生态,推动中国开源社区成为全球开源体系的积极参与及贡献者。

2017 年,开源社转型为完全由个人成员组成,参照 ASF 等国际顶级开源基金会的治理模式运作。近七年来,链接了数万名开源人,集聚了上千名社区成员及志愿者、海内外数百位讲师,合作了近百家赞助、媒体、社区伙伴。

52a4e7b4f97eca8cd84a849941c7bcf3.gif

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kaiyuanshe/article/details/126151489

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法