写点什么

我用十几年时间自创了两门编程语言,它们都还挺知名

  • 2024-03-28
    北京
  • 本文字数:8130 字

    阅读完需:约 27 分钟

我用十几年时间自创了两门编程语言,它们都还挺知名

AI 大模型超全落地场景&金融应用实践,8 月 16 - 19 日 FCon x AICon 大会联诀来袭、干货翻倍!

“大模型时代,需要一门真正的为 AI 交互的编程语言。”ReScriptMoonBit 作者张宏波对 InfoQ 说。


或许很多程序员都有过一个梦想,自创一门编程语言。但自创一门玩具语言是一回事,自创一门真正可以上生产环境、支撑企业级落地的编程语言又是另一回事。而在这一极具挑战性的探索道路上,粤港澳大湾区数字经济研究院(后简写为 IDEA 研究院)基础软件研究中心首席科学家张宏波已坚持不懈地耕耘了十数年之久。


他是斩获 2023 SIGPLAN 软件大奖 的 OCaml 语言的前核心开发人员。2013 年受 Bloomberg 邀请,他从学术界转入工业界,主导开发了 BuckleScript 编译器,后演变为 ReScript 并被 Facebook(Meta)等大型企业用于商业开发。这门名为 ReScript 的编程语言是首个由中国人主导的有一定国际影响力的通用编程语言。


2022 年,在正式加入 IDEA 研究院之后,他又领导开发 MoonBit 编程语言及其整套开发环境。MoonBit 曾登上 Hacker News 头版头条,接连获得著名前端框架工具 Vue.js 作者尤雨溪、 Scala 和函数式编程专家 John A De Goes 等国际知名专家点赞。


从 ReScript 到 MoonBit,张宏波一直坚持在编程语言的道路上,哪怕这条路其实并不好走。4 月 11-13 日,他也将以「AI 云原生时代的语言生态」专场出品人的身份,亲临 QCon 全球软件开发大会(北京站)现场,与听众交流。借此机会,近日,InfoQ 对其展开了深度访谈。本文根据访谈内容做了不改变原意的整理。



让人羡慕的幸运:总有公司高薪聘请他做喜欢的事情


如果重来一次,ReScript 有机会成为现象级编程语言


在张宏波看来,自己在编程语言这个领域无疑是一个幸运儿。


在职业生涯的第一站,公司就高薪聘请他做自己喜欢的事情,且没有任何管束,这种模式一直到现在,这是第一点幸运之处。个人主导的编程语言能被商业化,并被上百家世界各地的商业公司使用,难度不亚于创办一家独角兽企业,他做到了,这是第二点幸运之处。


自 2017 年起,他回国并成为 Facebook(Meta)在中国大陆工作的唯一软件工程师,负责维护 ReScript 并参与编程语言 Flow 的开发工作。后来,他把 ReScript 完全交给了社区打理,而该项目现在依然进展活跃。“这也是一件值得终身自豪的事情,我太幸运了。”


但对于 ReScript,他是有很深的遗憾的——相较于微软的 TypeScript 或者谷歌的 Dart,ReScript 的影响力远没有达到它应该到达的高度,但这门语言的技术实力比很多编程语言都要好。


“这里面有很多原因,如果让我重新来一次,我相信有机会做成一个现象级的编程语言。”


怀揣着理想与遗憾,张宏波在深圳遇到了以前的导师、微软原全球执行副总裁、后来的 IDEA 研究院创院理事长、美国国家工程院外籍院士沈向洋,得到了他的大力支持。


这几年国家大力扶持基础软件的发展,可谓天时,地利,人和。在这样的背景下,他选择离开工作了 5 年的 Meta,加入了 IDEA 研究院,并从 0 到 1 快速搭建起一个非常年轻的团队,继续开展编程语言研究。


“我相信在 IDEA 基础软件中心能实现我的梦想,完成一个现象级的编程平台,同时也为国家的基础软件行业培养一大批人才。我们到目前的进展总的来说是非常超预期的,当然我们还需继续努力,一步一个脚印地走下去。”


MoonBit 诞生,承载着他的理想与遗憾


对 MoonBit 的构想,不只是编程语言


2022 年 10 月,张宏波带领团队推出了 MoonBit 这门完全由国人自主研发的编程语言。


关于 MoonBit,张宏波有非常完整而宏大的构想。“我们对 MoonBit 平台的定位,不只是一门编程语言,我们更希望提供的是一个完整的开发工具链,包括 IDE、编译器、构建系统、包管理器等。”


这个构想是基于他的个人开发经历的、经过深思熟虑的,为了证明这一点,他分享了两点经验,分别是关于 ReScript 和 Flow。


在负责 ReScript 全套供应链的工作中,他清楚编译构建系统和 IDE 响应性的协同效应,以及它们之间如何有效配合的必要性。如果从一开始就将这些因素纳入考虑,我们能够更好地规避潜在的问题,提升开发效率。


另一个经验来自于张宏波在 Meta 参与过的另一个语言项目 Flow。这是一款 JavaScript 的静态类型检查器,Meta 使用 Monorepo 架构对其做代码管理。随着项目的日渐庞大,Monorepo 劣势越发突出,带来了一系列挑战,比如如何在巨大的代码库中保持 IDE 的实时响应。而这种挑战在大型科技公司中尤为常见,因为他们处理的代码量通常远超普通开发团队。


“ReScript 让我体会到了快速编译的重要性。编译速度远超同类工具的性能,如果只是 10%,20% 的提升并不能引起用户很强烈的体验,但如果是提升 10 倍,就变成一个显著的速度的优势,也可以是吸引用户的一大卖点,就像 Go 语言之所以受欢迎部分原因在于其相比 C++ 的快速编译一样,是极其吸引人的。”


MoonBit 设计初衷,和大模型的需求一致


MoonBit 极为注重语法本身的清晰性和表达力,且关注如何内建支持 AI 技术。而在其推出之时,又恰逢 ChatGPT 问世,这也给 MoonBit、也给张宏波的团队提供了一个难得的机会,去重新思考编程语言工具链应该如何更有效地与 AI 协同工作。


其实,张宏波并不是一个会追逐热点的人,虽然也有使用过 GPT,Copilot 等编程助手,也承认它们的能力确实很强,但由于这些编程助手并没有开源,存在被突然“断供”的风险,而且对于开发人员而言没办法进行深度定制和调整,所以他长期以来并没有特别关注 AI。


“直到 Meta 开源了 LLaMA ,我才真正开始注意到大模型的潜力,”他表示,“与 ChatGPT 等“黑盒子”模型不同,LLaMA 等开源大模型更像是一个“白盒子”。它不仅让我们能看到里面的运作机制,还能根据我们的需求进行调整。编程本质上是一种纯技术活动,它与那些可能触及敏感话题的内容区别明显,我们不需要担心政治正确性,因为代码本身不承载政治观点,它仅仅代表了一系列的逻辑和指令,代码领域在开源大模型下是可以寻求到突破的。我们团队也把这个看成一个重要的方向,比如如何将大模型智能和 IDE 智能很好的结合起来。我们的团队成员也非常给力地实现了这个想法,今年还在国际上发表了相关的论文。”


回到 MoonBit 的设计初衷上,张宏波表示,这和大模型的需求是一致的。 从一开始,他就希望 MoonBit 不仅仅是另一种编程语言,而是一个能够让 IDE 快速响应、静态分析工具能够迅速理解代码的开发者工具平台。这个理念和大模型的目标——让机器更好地理解代码,实际上是相同的方向。如果一种语言从设计之初就能被静态分析得很快,那么大模型也能更快地理解它,这两者之间其实是相辅相成的。


他认为,大模型时代下的编程语言有几个特性显得尤为重要。首先,编程语言的可验证性:随着大模型能够生成大量代码,快速验证代码的正确性变得非常关键。其次,强大的静态分析能力也十分必要,因为使用大模型生成的代码可能会出现一些不符合实际的“幻觉”,例如生成不存在的方法。代码安全性也是需要重点考虑的一个方向:由于机器生成的代码可能引入安全漏洞。


“大模型的出现,也正好进一步强化了我们对 MoonBit 设计的一些核心要求。MoonBit 的快速静态分析能力,设计上就考虑到了三重的安全保障,比如安全的类型系统、WebAssembly 的安全沙箱机制,以及我们的死代码删除技术,这些都是为了维护代码的安全性和提升代码准确性提供的保障。”


在 MoonBit 设计之初,张宏波还考虑到了与大模型的融合和互动,例如通过提供易于与 AI 工具集成的接口,或者优化编译器以支持 AI 辅助的代码分析和建议。“MoonBit 通过局部重采样和全局重采样技术,已经实现了对智能代码生成的调整和修正,这一策略既确保了 AI 生成代码的实时调整以符合语法规范,也进一步验证了代码的语义正确性。然后,我们还开发了一款基于 Token 的实时语义分析工具,保证了大模型输出的更高准确性。”


不同于 ChatGPT,MoonBit AI 可以实现从需求设定到代码实现,再到运行调试的无缝衔接,确保编程过程更加流畅高效。“用户可以实时修改 MoonBit AI 生成的代码,获得即时反馈。同时,MoonBit AI 重视用户体验,为大家提供一个更加便捷易用的用户界面。无论是编程新手还是资深的开发者,都能轻松上手一键部署。”


MoonBit 的未来,一个面向未来的编程平台


谈及 MoonBit 的未来,张宏波表示:“我觉得是值得期待的,回顾过去一年半到两年的时间里,我们的进展十分显著。一开始,我对这个项目有一个明确的愿景,或者说一个范围,这随着我们团队能力的增强而逐步扩大。起初,我认为如果我们能在特定的细分领域达到卓越是足够的。但随着团队整体实力的不断提升,我开始意识到 MoonBit 有潜力成长为更加宏大的事物——一个面向未来的编程平台。”


他表示,这个平台不会局限于仅提供基于 WebAssembly 的解决方案,虽然他们会持续关注 WebAssembly 生态,但随着拥有更多的资源,MoonBit 还计划支持多种后端,包括 JS 平台和 JVM 平台,甚至是针对操作系统开发的原生支持。他们的目标是开发一套完整的、为 MoonBit 优化的开发者工具,包括 IDE、调试系统和构建系统,使得 MoonBit 成为一个功能强大的平台。


“MoonBit 未来是一个平台级的产品,它的应用领域将非常广泛,覆盖各种开发需求。从 UI 开发到 Web 服务器开发,乃至更底层的系统编程,MoonBit 都可以提供全方位的支持。”


大模型时代的编程语言趋势


有人说,大模型正在杀死编程语言。那么,在大模型时代,编程语言还重要吗?

大模型正在杀死编程语言吗?


张宏波认为,在现有的基于 Transformer 架构的大型模型框架下,大模型如果要全方位取代还有很长的路要走。目前,如果把大模型智能分为快速直觉反应的“系统 1”和需要深思熟虑的“系统 2”,大多数现代 AI 技术都倾向于前者:能够迅速给出回应,但在处理需要深层次思考的问题时,它们的表现就不那么令人印象深刻了。这主要是因为无论问题有多复杂,AI 生成答案的速度都差不多,这与人脑处理复杂问题时速度的变化不同。


此外,由于 Transformer 模型的复杂度随着输入长度的增加而呈平方增长,这限制了模型能处理的上下文长度。即便我们能开发出能处理百万级 Token 的模型,它处理的信息量和代码规模仍然受限。因此,现阶段的 AI 技术更像是驾驶辅助系统中的 L2 或 L3 级别,而不是完全自动的 L4 级别。


未来编程语言背后的技术还是会存在。张宏波举了个例子:“就像我们身处通信时代,尽管大多数人可能不会深入了解基站的工作原理,但基站还是有存在的必要性。这种情况在编程语言和背后的技术上也同样适用。尽管终端用户可能并不直接感受到这些技术的存在,比如编程语言背后的各种路由和线路,但它们仍然是支撑运转的基础设施。”

编程语言的主要功能变化


张宏波表示,在大模型时代,编程语言的主要功能确实发生了一些变化。


他解释,随着大模型的进步,编程语言的主要功能更多的是作为一个桥梁,这种变化意味着未来的编程重点可能会从具体的工具转移到提供端到端体验上。在开发应用程序的过程中,比如开发者在创建应用程序时,可能仅需简单阐述他们的构想,之后 AI 就能自动编写出相应的代码。举个例子,想象一下在开发一个天气预报应用的场景中,开发者几乎能立即看到一个初步的用户界面草图,并能根据实时反馈对其进行调整,进一步完善应用的性能和功能。


在这样的工作流程下,编程语言转化为了一种桥梁,而非最终用户的直接关注点。这不意味着这些语言变得不重要或是被取代了,而是它们的作用发生了转变。迁移成本的下降可以使得程序员更快地完成跨领域的工作,之前可能需要大量研究和准备的任务,现在可以通过 AI 的辅助迅速完成,理解这些工具的工作原理以及获取自己调用工具的能力仍然非常关键。这种变化有可能将一些程序员转变为“超级程序员”,使他们能够以前所未有的速度和效率完成工作,但这也意味着对于那些技能平庸的程序员来说,他们可能会发现自己在新的技术环境中缺乏竞争力,那么他们与普通人使用这些模型后的编程能力可能差别不大。

大模型时代,需要一门真正的为 AI 交互的编程语言


“我个人觉得大模型时代,需要一门真正的为 AI 交互的编程语言。”


随后,张宏波对此做了解释。今天大模型在不同编程语言上的智能是不太一样的,比如现在最流行的编程语言 Python 和 JavaScript 上表现最好,这个最可能是因为数据集比较大。


“但是我读到一篇很有趣的文章叫 Will LLM kill Python?里面有个很有意思的观点说,Python 可能会在大模型时代被淘汰,因为未来大部分的程序都会是由 AI 辅助生成的,但是 Python 是一门动态语言,非常不利于验证,Python 的代码也不高效,Python 便于人快速上手的这个优点在大模型时代反而不那么重要了,一些语言优势在大模型的冲击下可能不再那么明显。”


他表示,未来,这门编程语言会趋向于向语言的易验证性、快速静态分析的能力以及安全性这几个方向去发展。首先,编程语言的易验证性对于开发过程中快速确认代码的正确性极为关键。一个容易验证的语言可以显著减少开发者在 Debug 和确保代码质量上的时间投入。此外,快速的静态分析能力使得开发者能够及时发现和纠正代码中的潜在错误,这种“纠正幻觉”的能力对于保持代码的清晰和准确性非常有帮助。在安全性方面,大量代码被训练;编程语言和开发环境应当能够有效地隔离和减少安全漏洞。比如利用安全沙箱技术,来隔离执行环境,从而保护开发过程和最终产品不受恶意代码和攻击的影响。这是未来编程语言发展的一个趋势。

大一统编程语言的诞生?可能性较小


“但未来并不会诞生一个统一的编程语言,或者严谨一点的说,我觉得这个可能性相对较小。”张宏波说,“我认为每种编程语言都拥有自己独特的优势和适用场景,正是这种多样性不仅丰富了技术生态,也为解决不同领域的问题提供了广泛的选择。”


编程语言自身的生命周期是很持久的,比如 Java 已经陪伴我们几十年,并且预计在未来二三十年仍将保持其重要性。另一方面,像 Perl 这样的语言,尽管使用率正在缓慢下降,但由于它曾经积累了庞大的社区和市场份额,其衰退过程将非常缓慢。所以一旦一个编程语言形成了稳定的社区,它的消逝将是一个漫长的过程。随着技术的发展,特别是大模型技术的进步,我们开始见证到一种趋势,就是不同编程语言在表达逻辑上的越来越多的相似性。这种同质化的现象可能会使得未来的编程语言界限变得模糊。


“从某种意义上说,项目如 MoonBit 尝试通过一种统一的方法来表达各种逻辑,就是对这一现象的积极响应。MoonBit 的目标是利用单一的编程语言来表述所有的逻辑,并且能够支持跨平台的编译,从而让开发者无需深入掌握各个平台的复杂细节,通过一个统一的平台模型来解决各类问题。”


他认为,虽然我们在可见的未来内可能不会见到一个彻底统一的编程语言出现,但随着大模型等技术的推进,我们可能会看到更加一致和通用的编程范式的发展。这将有助于提高编程语言之间的互操作性和移植性,为开发者提供更为高效灵活的解决方案。


随着大模型的智能化,未来编程语言的另一趋势是迁移切换的成本将大大降低,以往区分一个成熟的 Java 工程师与一个专业的 Java 工程师往往取决于对不同库的熟悉程度以及使用直觉,这是因为学习 Java 可能只需要三两天,但是熟悉 JVM 的生态却可能需要几年的时间,但现在生成式 AI 能够自动推荐和挑选最适合程序员的工具,还能对不熟悉的代码片段进行解释。生成式 AI 会加速这种趋势,开发人员可以根据实际场景,去灵活地掌握和切换不同语言。

编程语言、工具链、开发者的黄金时刻


比起编程语言,编程生态在大模型时代发生的变化更为明显。


张宏波倾向于关注工具链的根本性变化。他表示,VS Code 已经在这方面做了一些尝试。比如当你执行命令遇到问题时,它能立刻提出建议,询问你是否需要 GPT 模型的帮助来解释问题。从他的角度看,这种整合在未来有潜力做到更加极致。


他举了一个例子来说明这个观点:用户在发出命令后,如果遇到错误,系统能够即时自动提供解释,直接指出可能的问题所在。这意味着,在 debug 的过程中,你可能连主动触发 GPT 功能的需求都没有,因为 AI IDE 已经能够实时地协助你解决问题了。未来的 IDE 不仅是一个简单的代码编辑器,它将成为开发者的全面助手,能够深入理解代码,主动预见并解释潜在问题,甚至在开发者完全意识到问题之前就提供解决方案。


“基于我对当前技术趋势的理解,我相信这是我们即将面临的编程工具链发展的方向。”

机遇大于挑战


在大模型时代,对编程语言和工具链来说,他认为这是一个机遇大于挑战的时刻。变化本身就带来了机会。传统上,从一种编程语言切换到另一种语言的成本非常高,涉及到人员培训、适配和学习新的生态系统等方面。然而,借助大模型的能力,这一过程可能变得更加简便。如果工具链能够与 AI 有效结合,那么创新的出现就会更加容易。


以 MoonBit 为例,张宏波团队内部已经进行了一些测试,即使在 1 个亿参数的规模下,他们也已经看到了一些令人印象深刻的 AI 效果。他认为,在编程语言领域,可能不需要像 ChatGPT 那样庞大的模型。 编程是一个相对狭窄的问题领域,不依赖于历史知识或对人文典故的引用。随着技术的进步,我们可以预见大模型将逐步被蒸馏成更小型的模型,这些模型适合在边缘设备上运行。我们可以将参数量减少到几十亿,如 70 亿、10 亿或 100 亿参数的模型。


同时,大模型下的数据安全也是一个问题,如何通过静态分析来加快开发过程,提高安全性,并快速进行验证、测试是一个值得讨论的问题。他表示,实际上,测试本身也是一种验证形式。MoonBit 已经提供了原生的测试工具(Debugger),这是相对于其他语言通常在成熟阶段才拥有的功能。目前,这个功能已支持源码映射、基于源码设置断点、输出 sourcemap 等,在浏览器中进行源码调试。这项功能的推出可以减轻了开发者在代码调试方面的负担,同时提升开发和调试的流畅性。


大模型还有一个挑战是上下文理解能力,尽管现在的大模型能够处理大量的 Token,它们在理解上下文方面的能力还是有限的。面对这一挑战,张宏波的团队探索了几种方法以增强模型的上下文理解能力和提高代码生成的准确性。MoonBit 采用了基于“block”的设计,这可能是编程语言的一个新方向。与传统的基于文本的编程语言不同,MoonBit 通过层次化的方式处理代码,使得函数之间能够以模块化的形式相互移动,且每个“block”都在独立的环境中运行。这种方法不仅使得代码更容易扩展,还简化了将上下文信息提供给 AI 的过程,这对于精确地给 AI 提供简单上下文至关重要。


张宏波最后表示,在未来,学习新语言将变得更加直观和简单。 因为编程语言之间的差异不再限制显著,随之带来的是编程语言的学习门槛降低。目前学习一门新的编程语言,其中一个关键点在于掌握其生态系统,包括语法和库的使用。未来,大模型 AI 的存在可能极大地简化这一过程。例如,当需要进行 JSON 解析时,大模型 AI 可以自动推荐合适的库,语法和库的学习曲线不再陡峭。因此,学习新语言将变得更加直观和简单。


嘉宾介绍:


张宏波,本科清华大学电子工程系,美国宾夕法尼亚大学博士候选人 (硕士毕业),现任 IDEA 基础软件研究中心首席科学家,领导 MoonBit 编程语言及其工具链的开发,他是通用程序语言 ReScript(前称 ReasonML&BuckleScript,首个由中国人主导的有一定国际影响力的通用编程语言) 的作者,OCaml(2023 SIGPLAN 软件大奖)前核心开发人员。2013 年受 Bloomberg 邀请,他从学术界转入工业界,主导开发的 BuckleScript 编译器为该公司最受欢迎的开源项目,后演变为 ReScript 并被 Facebook(Meta)等大型企业用于商业开发。2017 年,他回国并成为 Facebook(Meta)在中国大陆工作的唯一软件工程师,负责维护 ReScript 并参与编程语言 Flow 的开发工作。2022 年,他正式加入 IDEA 研究院领导开发 MoonBit (www.moonbitlang.com) 编程语言及其整套开发环境。


活动推荐


探索软件开发的新境界!QCon 全球软件开发大会迎来全新升级,现已华丽转型为【QCon 全球软件开发大会暨智能软件开发生态展】。这不仅是一场技术盛宴,更是深度交流与创新展示的交汇点。我们诚邀您于 2024 年 4 月 11 日至 13 日,莅临北京·国测国际会议会展中心,共同见证并参与这场融合技术分享、深度研讨与前沿展览的综合性盛会。让我们携手开启智能软件开发的新篇章!



QCon 精华内容上线 92%,全面覆盖“人工智能 +”的典型案例!联系票务经理 17310043226 。点击此处可了解大会最新日程,期待与各位开发者现场交流。


2024-03-28 14:516827

评论

发布
暂无评论
发现更多内容

CEF | CEF浏览器客户端功能扩展:实现下载列表功能

YOLO.

qt 10月月更 C++

Linux下RTC驱动开发(硬件采用DS1302)

DS小龙哥

10月月更

部署 SAP UI5 应用到 SAP BTP 时遇到的 error retrieving MTA 错误消息

汪子熙

云原生 Cloud 云平台 SAP 10月月更

go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务

六月的

Docker-compose go-zero

HashMap源码分析(一)

知识浅谈

hashmap 10月月更

react源码分析:组件的创建和更新

flyzz177

React

Linux下IIC驱动编写,介绍IIC子系统框架的使用

DS小龙哥

10月月更

你知道Redis为什么要设计成单线程吗

芥末拌个饭吧

后端 redis 底层原理 10月月更

Java中的接口详解

共饮一杯无

Java 接口 10月月更

react源码中的协调与调度

flyzz177

React

go-zero docker-compose 搭建课件服务(一):编写服务api和proto

六月的

Docker-compose go-zero

无法吃午餐的学生数量

掘金安东尼

算法 10月月更

实现etcd服务注册与发现

六月的

Docker-compose go-zero

go-zero docker-compose 搭建课件服务(七):prometheus+grafana服务监控

六月的

Docker-compose go-zero

go-zero docker-compose搭建课件服务(四):生成Dockerfile

六月的

Docker-compose go-zero

react源码分析:babel如何解析jsx

flyzz177

React

【LeetCode】水果成篮Java题解

Albert

算法 LeetCode 10月月更

go-zero docker-compose 搭建课件服务(五):完善user服务

六月的

Docker-compose go-zero

Linux下驱动开发_块设备驱动开发(内存模拟存储)

DS小龙哥

10月月更

Linux下驱动开发_块设备驱动开发(硬件上采用SD卡+SPI协议)

DS小龙哥

10月月更

一种基于柔性事务的分布式事务解决方案设计探究

京东科技开发者

分布式事务 事务 分布式架构 事务回滚 分布式处理

Redis是如何保证数据一致性的

芥末拌个饭吧

后端 redis 底层原理 10月月更

react源码中的fiber架构

flyzz177

React

数据驱动型企业如何借助「新一代智能协作」提升研发效能?

LigaAI

人工智能 数据驱动 亚马逊云科技 企业号十月PK榜

谈谈spark性能调优的方法

芥末拌个饭吧

spark 后端 10月月更

go-zero docker-compose 搭建课件服务(三):编写courseware api服务

六月的

Docker-compose go-zero

CEF | CEF浏览器客户端功能扩展:实现前进、后退、刷新、调用控制台、设置cookie、网页自适应窗体大小

YOLO.

qt 10月月更 C++

掌握这个方法,让工作经验配得上工作时间!

博文视点Broadview

Lerna最佳实践(内含大量代码)

鲸品堂

代码 lerna

OKR之剑·理念篇03:OKR理念认同

vivo互联网技术

团队管理 OKR 目标管理

go-zero docker-compose 搭建课件服务(六):完善jwt鉴权和返回结构

六月的

Docker-compose go-zero

我用十几年时间自创了两门编程语言,它们都还挺知名_编程语言_张宏波_InfoQ精选文章