从开源小白到 Apache Member ,阿里工程师的成长笔记

2023-11-03

640?wx_fmt=jpeg

阿里妹导读:2019年5月4日,Apache 基金会官方 Blog 中宣布全球新增40位 Apache Member,阿里巴巴技术专家望陶成为其中之一。全球共有771位 ASF Member,中国仅13位。他从一个0基础的开源小白,一路走来,感触颇深。今天,望陶把这段经历分享出来,让更多的人能够看到,其实参与开源并没有那么难,只要持续的付出,总会有所收获。


阿里巴巴编程之夏火热报名中,点击文末“阅读原文”,参与开源共建!


初次参与开源


2014年我加入阿里巴巴中间件团队,开始接手阿里巴巴集团应用容器的维护工作。当时集团的应用容器绝大部分都是基于 JBoss,老旧且无人维护,另外有一小部分跑在 Jetty 和 Tomcat 之上,当时中间件团队维护了 Tomcat 的一个私有分支,最大的目标就是要统一所有集团的应用容器为 Tomcat 。而在那之前我从未接触过 Tomcat 的开发和运维,对我来说挑战还是很大的。然而更大的挑战来自于当时带领中间件的大老板,大老板提出了一个在当时的我看来几乎无法实现的目标——成为 Apache Tomcat 的 committer。


要知道,作为 Apache 的核心项目之一,Tomcat 自1999年发布第一版以来,一直是开源届和 Apache 基金会明星项目,至今仍然在应用容器领域市场占有率保持第一,历经20年发展依旧热度不减。Tomcat 历经这么多年的发展,却从未出现过一个中国人的 committer。而我们小团队只有4个人,根本没有任何搞开源的经验,完全不知道从何做起。老板向我们交代这个任务,问我们谁愿意挑战一下的时候,我也没有多想,就承担了下来。就这样,我开始了 Apache 开源之旅。


说实话,一开始其实自己并没有太多的思路,于是开始反复浏览 Tomcat 官网,希望能够查询到一些有用的信息。所有的 Apache 项目几乎都会有新用户指南,一般会介绍如何参与到此开源项目当中,Tomcat 也不例外。很快我从修复 bug 开始,第一个 patch 是修复一个 Websocket 测试用例失败的问题,修复该问题涉及到了对代码的一些重构。


还记得当时提交之前我非常谨慎,和老板一起反复讨论了很多次,终于形成了一个比较满意的方案。提交给 Tomcat 社区之后,很快社区便有了响应,并合并了我提交的补丁。第一次提交便获得了认可,心里很开心,紧张的情绪也缓解了。看到 Tomcat 的 release note 里面出现了自己的名字,真的非常开心。


640?wx_fmt=png


Apache Roadshow China


2015年10月,我有幸在北京参加了 Apache Roadshow China,算是第一次和Apache 基金会有了亲密接触。在大会上亲眼目睹了时任 Apache 基金会主席 Brett Porter、Apache 基金会副总裁 Niclas Hedhman 等大佬们的演讲,以及在 Panel Disussion 里面,几位大佬和几位来自中国的 Apache 成员的一起探讨社区领导的开发流程等。


当时觉得自己离他们似乎非常遥远。2015年的时候,国内参与开源  Apache 社区的几乎全是在外企工作的华人。而如今来看,国内公司参与开源的程度已经显著地提升。这次参与中国路演,有幸和 Niclas heldman 做了一些交流,我问了他一个问题:我正在参与 Tomcat 社区,如何才能成为 committer?他给了我一些至今对我影响依然非常深远的建议:参与社区讨论,从简单的新手任务入手修复 bug,以及参与 release vote。而这么多年过去了,这些建议依旧适用。


Tomcat committer


尝到了贡献的甜头后,后面团队的目标也有所调整,内部版本的 Tomcat 和开源版本的结构,保持完全一致:一方面使得合并开源 Apache Tomcat 变得非常容易;另一方面,内部做的增强也更加方便合并到社区。后续向社区的贡献主要来源于三个方面:


第一个方面是阿里内使用 Tomcat 在大规模、高并发场景下遇到的问题修复。比较典型的是当时无线网关应用采用的是 Tomcat NIO+Async Servlet 的架构。作为一个入口应用,曾经因为 Tomcat 在高并发下的异常出现过一个比较大的故障,后来排查这个问题花了非常多的精力,最终彻底修复了这个问题。详细的排查过程记录在《逆流而上-阿里巴巴技术成长之路》一书的《山洪暴发,高流量触发 Tomcat bug引起集群崩溃》文章中。修复方案也一起提交给了 Tomcat 社区,虽然改动量不大,但其中凝聚了团队相当多的心血。


第二个方面是 Tomcat 大面积在阿里铺开的、遇到的问题修复,比如发现了一些不符合 servlet 规范的行为等,包括双十一应对的时候所做的一些优化、并行类加载等等。


第三个方面是主动参与开源社区,针对一些一直存在的问题的修复。经过一年多的持续投入贡献,2016年8月23日,在一个平常的工作日的上午,我打开邮箱,看到一封来自 Tomcat 社区核心开发、Java EE 规范专家组成员、时任 Apache 基金会董事会成员 Mark Thomas 的来信,邀请我成为 Tomcat committer。打开邮件那一刻感觉自己的心都在颤抖,激动之情有点不能自已。当时的确出乎自己意料,没有想到梦想的那一天真的会到来。


640?wx_fmt=png


Tomcat PMC Member


成为 committer 之后,有了代码的直接提交权限,其实意味着更大的责任。那一年  Tomcat 已经成为了阿里内部应用容器的标准,集群的规模在国内外也是领先的。而我也并没有停止社区的参与,直到2017年,ApacheCon 北美大会即将在5月美国迈阿密召开,收到 Call for participation 邮件的时候,我突然萌生了一个想法,为什么不把阿里巴巴在大规模高并发下遇到的挑战在 ApacheCon 大会上分享呢?每年的 ApacheCon 基本都会为 Tomcat 开设专场,TomcatCon。之前从来没有在国外大会上分享的经验,也不知道能否被大会接受,我怀着忐忑的心情提交了提案,也没有抱太大的信心。直到那年3月,我收到一封邮件,通知我的提案被 ApacheCon 大会接受了,那种被认可的感觉真的很棒。


在5月份的大会上,我有幸见到了经常在社区里面交流却素未见面的一群开发者,比如来自英国的 Mark Thomas、来自美国的 Christopher Schultz、来自法国的 Jean-Frederic Clere 等等,他们都是 Tomcat 社区的顶尖专家,有的甚至10余年来一直参与在 Tomcat 社区。和之前邮件讨论起问题来非常的直率、甚至是严厉的印象不同,他们都非常的亲切,演讲当天也在场下默默地支持我,演讲很成功,让世界看到了一个中国公司在 Tomcat 社区所作出的贡献努力,我觉得挺骄傲的。演讲第二天的晚宴上,气氛很轻松,台上正在进行着闪电演讲,Mark 拿着啤酒走过来和我说,邀请我成为了 Tomcat PMC member。天啊,我完全没有想到能够和面前这群大神们站在同样的位置上,很开心地接受了。


结缘 Dubbo


2017年,阿里正好开始重启了 Dubbo 开源的维护工作,而团队正好承担了这一重要使命。当时 Dubbo 在之前的一段时间里面停止了维护,社区的很多用户只能选择 fork 分支自己维护。重启维护之后,需要思考的问题是,社区会不会有类似的担心。为了打消这个顾虑,团队决定把 Dubbo 捐献给 Apache 基金会,希望能够通过“社区大于代码“,“公开透明“、“共识决策“等 Apache 之道,打消顾虑。已经有过几年 Apache 社区参与经验的我,自然地承担起帮助 Dubbo 进入 Apache 基金会孵化的工作,从联系导师到修改提案,终于 Dubbo 通过了 Apache 孵化器社区投票,正式加入 Apache 孵化器进行孵化。那天是2017年的大年三十,我坐在家里的电脑前,发送出正式投票结果邮件的那一刻,我在想这注定是个值得铭记的日子。


在 Apache 孵化器中孵化,就像一个浪子在江湖上横冲直撞了很多年后,突然静下心来开始求学,自然要循序很多规则,也会有很多的文化和意识心态上的冲突。我开始思考如何能够帮助 Dubbo 更好地践行 Apache 之道,这里面有很多东西需要做。Dubbo 和其他项目不同的一点是,Dubbo 在加入 Apache 之前已经是一个巨无霸级别的项目了,上万的 star、庞大的社区、国内大规模被采用,社区一天的活动量所发送的邮件就会让导师觉得无所适从,简直没有办法看了。如何能让这个巨无霸按照Apache 之道发展,成为了一个很大的挑战。


有一个很鲜活的例子,当时社区在讨论到底应该在邮件列表上还是在 Github issue 上讨论问题。而 Dubbo 的用户早已经习惯了在 Github issue 上讨论,但是导师之一的 Mark 却指出,邮件列表仍然是这个星球上最为普适的通讯工具。当我们习惯了中国近几年互联网迅猛发展带来的红利的时候,却忘记了这世界上还有一些国家,在某些环境下上网的网速可能只有几十k/s,甚至只能拨号上网。如果在 Github 上讨论,那对于这些环境下想参与社区的人就是灾难性的。或许我们可以放弃那部分用户,但这并不是 Apache 的价值观。类似的例子还有很多,我有点遗憾没有及时把他们都记录下来。我会尝试在另外一篇文章中分享。


第一次的 release 是孵化过程中很重要的一个里程碑,在我看来 release 的意义远大于代码层面的工作,还包括了准确的 License 和版权声明、符合规范的代码及依赖、准确一致的签名等,Dubbo 花了很多时间准备,也把整个过程完全的文档化,整个孵化过程中,由7位不同的 release manger 轮流负责,确保不同的人都可以完成发布。


孵化的过程中,知识产权清理也是一个重要的环节,Apache 对于商标和 License 的有着近乎严苛的要求,每次 release 的时候都会仔细检查,最典型的例子就是github.com/dubbo 这个 group。在国人看来其实正常,但是在 Apache 基金会的视角来看,由于 Dubbo 这个商标已经被转移给 Apache,任何第三方的使用都会构成侵权,因此也是不被允许的。最终的解决方案是把这个 group 下的所有项目清空,一部分迁移到 Apache,另一部分迁移回其他 group。


其他还有很多问题,比如发展社区 committer/PMC member、举办一场符合规范的 meetup 等等,有机会在单独的文章分享。


成为 Apache Member


在 Dubbo 即将毕业的前夕,突然有一天,我按惯例打开邮箱,突然发现躺了一封Invitation to join The Apache Software Foundation Membership。我心中一阵惊喜,点开之后发现是一封邀请我成为 Apache Member 的邮件,非常的出乎意料。


640?wx_fmt=png


说实话也曾梦想过未来有一天能成为 Apache Member,但没有想到这一天来得如此之快。成为 Apache Member 意味着作为771成员之一,从法律上成为了 Apache 基金会的股东。但是这并不意味着,贡献的终止。就像打怪升级,当你通过了当前这一关,你会遇到更大的 boss。


作为 ASF member 更多的是从一个个独立的项目中抽离出来,更多的关注基金会层面横向的事务。但我觉得成为 Member 最大的意义是在于我的贡献,包括 Apache 之道的开源价值观得到了 Apache 基金会的认可,让我觉得在开源这条路上并不孤独,尤其是还有这么多来自中国的 Member,更加坚定了这条路是可以在中国走下去的。


成为 Member 之后,我相信借助 Apache 基金会,能够帮助中国的开源软件及开发者和全世界建立更广泛深入的连接。一方面是走进来,帮助扩大 Apache 基金会在中国的影响力,让更多的开发者参与到世界顶级的优秀开源项目中来;另一方面是走出去,帮助中国开源项目进入到 Apache 基金会孵化,提升中国开源软件的国际影响力。其实国内有很多非常优秀的开源项目,只是缺少一个向世界展示的窗口,希望 Apache 基金会能够作为这样一座桥梁。


写在最后


这里要特别感谢提名我的 Mark Thomas , 他是 ASF 基金会前董事会成员,分管品牌的 V.P、Tomcat 社区的核心维护者、Dubbo 的导师,也感谢为我投票的其他伙伴。他似乎是我在整个 Apache 基金会的导师,带领我一步步地往前走,没有他及 Tomcat 社区、Dubbo 社区其他伙伴的支持,我绝对无法走到今天这个地步。还要感谢一下公司各位领导的信任,没有他们的支持,我不可能全身心地投入到开源的社区中。最后还要感谢阿里这个场景,只有在如此大规模的场景下,才会有如此多的机会可以参与贡献这么多高质量的代码和优秀的项目给到开源社区。




640?wx_fmt=png


近日,阿里巴巴集团启动了全球性的开源协作项目“阿里巴巴编程之夏”,通过这个项目,学生可以在线参与开源软件开发,每周约 50 小时的 coding 时间,项目持续 2 个月。在开源导师的指导下,在暑期深度体验真实世界的软件开发,感受开源技术共建的魅力。6月14日报名截止,点击文末“阅读原文”,赶快报名!


640?wx_fmt=gif

你可能还喜欢

点击下方图片即可阅读


640?wx_fmt=jpeg开放下载!《阿里语音与信号处理技术》精选集


640?wx_fmt=jpeg

蚂蚁金服何昌华:实时大数据系统才是未来的基石


640?wx_fmt=jpeg

当你打开天猫的那一刻,推荐系统做了哪些工作?



640?wx_fmt=jpeg

关注「阿里技术」

把握前沿技术脉搏

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从开源小白到 Apache Member ,阿里工程师的成长笔记 的相关文章

  • idea eclipse 快捷键全局搜索替换代码 修改包名

    全局搜索替换 选中项目右击 点击Replace in files 在文件中替换 输入查找 替换的内容 replaceAll 替换所有 全局搜索查找代码Ctrl H File mask 选择文件类型 可以更精确查找 文件查找Ctrl Shif
  • STM32+LZMA的移植经历

    连续一天加一个晚上 查资料 发现无解 压缩不可能在STM32上进行的 因为代码中那个内存分配的结构体占内存太大了 解压是可以实现的 因此这个算法在STM32上也是有一些作用 在某些场合可以在PC机进行压缩存入ARM中 然后ARM解压 比如某
  • Sql Server判断数据库、表、存储过程、函数是否存在

    判断数据库是否存在 if exists select from sys databases where name 数据库名 drop database 数据库名 判断表是否存在 if exists select from sysobject
  • 【无标题】vxworks ARM Pl330DMA 数据传输指令流创建

    pl330DmaChanMicroCodeCreate create micro code for dma transfer This routine create micro code for dma transfer RETURNS O
  • Linux chromium 源码下载及编译

    1 Chromium Souce Code Download 1 1 download source code 1 gt 方法一 获得所有发布tag的信息 git fetch tags 根据37 0 2062 103版本建立一个你自己的分支
  • 实现一款高可用的 TCP 数据传输服务器(Java版)

    1 netty能做什么 首先netty是一款高性能 封装性良好且灵活 基于NIO 真 非阻塞IO 的开源框架 可以用来手写web服务器 TCP服务器等 支持的协议丰富 如 常用的HTTP HTTPS WEBSOCKET 并且提供的大量的方法
  • STM32 之五 Core Coupled Memory(CCM)内存

    写在前面 今天在搞STM32F4时 用到了一部分特殊内存 CCM 搜了搜网上没多少介绍 索性自己查手册 某些芯片没有CCM 基本架构 废话少说 先看看这块内存特殊在哪里 官方的基本架构说明如下 The main system consist
  • VSCode 菜单栏不见了,该怎么办

    问题描述 某一天 自己独自一人使用VSCode写代码正嗨的时候 不晓得按到哪个快捷键了 导致菜单栏不见了 这下可慌了 以前从未遇到过这样的事情 界面如下 问题解决办法 经过各种尝试 终于找到了 解决办法 先将解决办法贴在下面 第一步 使用快
  • 华为OD机试 - 阿里巴巴找黄金宝箱(III) (Java & JS & Python)

    题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上 无意中发现了强盗集团的藏宝地 藏宝地有编号从0 N的箱子 每个箱子上面贴有一个数字 阿里巴巴念出一个咒语数字 查看宝箱是否存在两个不同箱子 这两个箱子上贴的数字相同 同时这两个箱了的编号之差的
  • Java小练习01

    猜数字0 9 package day2 import java util Random import java util Scanner public class day2 4 public static void main String
  • python中函数和属性的区别

    函数 有括号 属性 没有括号
  • 二维码Data Matrix编码、解码使用举例

    二维码Data Matrix的介绍见 http blog csdn net fengbingchun article details 44279967 这里简单写了个生成二维码和对二维码进行识别的测试例子 如下 int test data
  • 服务器要如何提高性能

    服务器要如何提高性能 一 将服务器虚拟化 如果同期拥有多个项目 增加额外服务器会显得浪费 成本费用也会大幅度上升 这时不妨通过技术将其划分成多个虚拟空间 而每个空间又可以使用不同操作系统 运行不同应用程序 使得符合项目要求 这种方式通常能增
  • Java 多线程 线程8锁(含示例代码)

    以下内容根据视频https www bilibili com video BV1vE411D7KE p 6学习整理 线程8锁 目录 1 标准访问 2 线程休眠 3 新增普通方法 4 两个对象调用两个线程 5 一个对象调用两个静态同步方法 6
  • Unity中加入虚拟按钮不可见

    忙活了一个多小时 按钮老是看不到 调整了半天按钮坐标 最后发现首先将主角 first person control 的x y轴坐标调整到 0 0 Z轴坐标无所谓 再将按钮坐标调整到 0 0 就会在屏幕出现按钮了 此时再随意调整主角坐标 按钮
  • Android OTA 相关工具(八) 使用 lpadd 添加镜像到 super.img

    文章目录 1 lpadd 的编译 2 lpadd 的帮助信息 3 lpadd 的用法 3 1 准备工作 empty 的 super 设备镜像 raw 格式的 super 设备镜像 sparse 格式的 super 设备镜像 3 1 lpad
  • [Android5.1][RK3288] LCD Mipi 调试方法及问题汇总

    调试流程 设置 dts 中的参数 并 配置管脚 背光部分 LCD 初始化序列 cmds 打开 config 检查电压 调试顺序 1 背光有没有亮 2 开机 以及 从休眠状态唤醒 都没有显示内容 3 我碰到的 cmds 问题 问题集锦 我调试
  • (Redis) RDB与AOP持久化的实现与本质区别

    Redis服务器 Redis是一个键值对数据库服务器 服务器中通常包含着任意个非空数据库 而每个非空数据库中又可以包含任意个键值对 我们将服务器中的非空数据库以及它们的键值对统称为数据库状态 例如 下图就是一个包含三个数据库以及数据控中的键
  • 数组扁平化和去重

    数组扁平化和去重 引入题目 已知有数组 1 2 2 3 4 5 5 6 7 8 9 11 12 12 13 14 10 扁平化数组后应该得到的数组为 1 2 2 3 4 5 5 6 7 8 9 11 12 12 13 14 10 一 数组扁
  • Android Studio基础输入文本框EditText

    Android Studio基础输入文本框EditText 接续上一节 Android Studio 基础按钮使用 1 提示文本框 输入文本框 在布局xml编写

随机推荐

  • gitlab-ci docker maven 自动化流水线部署 springboot多模块项目

    一 准备 首先 需要两台服务器 这里为了下面方便理解 我们约定这两台服务器地址 名称和系统 1 gitlab 服务器 服务器A 地址10 10 10 7 内存大于4g不然会一直死 CentOS Linux 7 Core 2 springbo
  • 大白话讲懂word2vec原理和如何使用

    前言 做自然语言处理 Natural Language Processing NLP 这个领域的小伙伴们肯定对word2vec这个模型很熟悉了 它就是一种最为常见的文本表示的算法 是将文本数据转换成计算机能够运算的数字或者向量 在自然语言处
  • 八十二.将整数的奇偶位互换(位运算)

    将整数的奇偶位互换 import java util Scanner public class LianXi public static int exchange int i 和10101010 做与运算取出偶数位 int ou i 0xa
  • IDEF1X

    IDEF系列方法是由美国空军的ICAM Integrated Computer Aided Manufacturing 计划中首次提出一种复杂系统分析与设计方法 它包括了功能建模 IDEF0 信息建模 IDEF1 动态建模 IDEF2 数据
  • 如何测网络稳定性_如何测试无线WiFi系统的信号强度?这篇文章告诉你

    前言 在智能化弱电行业中 我们也会接触无线网络覆盖的项目 比如一个酒店 校园 园区 小区的无线网络覆盖 项目部署实施结束之后 我们怎样才能确定这个无线网络系统符合建设标准了 今天我们一起来聊聊 无线网络信号强度的测试方式 正文 无线网络可通
  • 如何构造大根堆

    如何构造一个大顶堆 C实现 基础知识 堆是一种二叉树结构 但是他的物理保存是一个数组 如下图 实际的保存形式为 5 4 1 25 68 8 1 5 2 3 设每个结点下标为i 则左孩子 2i 1 右孩子 2i 2 最后一个非叶子结点 arr
  • 汇编语言——第13章 int指令

    13 1 int指令 int指令的格式为 int n n为中断类型码 它的功能是引发中断过程 CPU执行int n指令 相当于引发一个n号中断的中断过程 执行过程如下 1 取中断类型码n 2 标志寄存器入栈 IF 0 TF 0 3 CS I
  • c#-中级篇知识合集-part01

    c 中级篇知识合集 part01 001 调试和错误处理 002 中断模式下的调试 003 错误处理 异常处理 004 异常处理 案例2 005 面向对象编程 类 006 类的定义和声明 Program cs Vector3 cs Vehi
  • 小鹏前自动驾驶AI负责人刘兰个川转投安克,研发具身智能

    作者 StrongerTang 编辑 自动驾驶Daily 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 本文只做学术分享 如有侵权 联系删文 据新智驾消息 小鹏前自动驾驶AI负责人刘兰个川 Patrick 近期已加入
  • 基于FPGA的混沌信号发生器设计与实现

    提出基于FPGA设计混沌信号发生器的一种改进方法 首先 采用Euler算法 将连续混沌系统转换为离散混沌系统 其次 基于IEEE 754单精度浮点数标准和模块化设计理念 利用Quartus II软件 采用VHDL和原理图相结合的方式设计混沌
  • Druid无效链接回收策略(源码分析)(mysql 8小时连接失效问题)

    目录 问题背景 异常Communications link failure druid数据库连接池关键配置说明 注意标红配置 druid数据库连接池超时连接回收源码分析 第一种方式 获取连接时校验 第二种方式 Destroy 定时任务检查需
  • Python中关于序列化的讨论,以及dump、dumps和load、loads区别的对比

    序列化 序列化 pickle模块 json模块 shelve模块一 pickle模块1 pickle模块1 可以将对象转换为一种可以传输或存储的格式 2 pickle模块将任意一个python对象换成一个系统字节的操作过程叫做串行化对象 3
  • buck电路_简单电源(1)从电阻分压、稳压管、线性稳压器到BUCK变换器

    电阻分压就是BUCK降压器最基本的原理 惊讶吧 如果有一个10V的电压 要想得到5V的电压 怎么办 非常简单 用二个阻值相同的电阻R1 R2串联起来 从接地电阻R2上取电压 就直接得到5V电压 图1 串联电阻分压 如果给这个电压加负载 二个
  • element 中 el-date-picker 时间选择器时间跨度设置 7天

    用 el date picker 实现日历的跨度 七天
  • VS中“生成事件”的问题

    转载自 http hi baidu com gisince item 7f0439ee610c94255a2d64b4 今天写了生成事件的处理 如下 从网上Down了一个例子 运行时提示错误 命令 copy F F 已退出 返回值为 1 以
  • win10桌面突然显示未激活

    1 以管理员身份打开cmd C Windows system32 cmd exe 2 输入sfc scannow命令自动修复系统文件 sfc scannow 3 修复完成后重启电脑
  • 2023除夕倒计时~HTML代码

  • 【超细节】Vue3组件事件怎么声明,defineEmits与emit

    目录 前言 一 基本语法 1 子组件触发 2 父组件监听 二 事件参数 1 传值 2 接收值 三 事件校验 四 注意事项 前言 组件事件是 Vue 组件之间进行通信的一种方式 它允许一个组件触发一个自定义事件 并且其他组件可以监听并响应这个
  • dw自动滚动图片_DW里怎么做图片自动播放

    匿名用户 1级 2018 12 29 回答 是做个简单的相册 漂亮的Flash动画人人喜欢 不过制作起来的确有一些技术难度 你知道吗 Dreamweaver作为一个网页制作工具 还可以创建好玩的Flash相册 插入Flash元素 运行Dre
  • 从开源小白到 Apache Member ,阿里工程师的成长笔记

    阿里妹导读 2019年5月4日 Apache 基金会官方 Blog 中宣布全球新增40位 Apache Member 阿里巴巴技术专家望陶成为其中之一 全球共有771位 ASF Member 中国仅13位 他从一个0基础的开源小白 一路走来