
【1024实训营公开课】许式伟:Go+ Whole Picture
大家好!欢迎大家来到 1024 实训营。作为 1024 活动的一部分,我们希望通过本实训营,能够帮助大家培养良好的工程习惯,工程规范。同时也能让大家了解到实际的生产项目到底应该怎么做。虽然是面向内部的培训,但是我们把它打造成公开课形式,是因为在工程习惯日趋同质化的今天,我们认为,还是有很多细节是不尽相同又非常重要的,我们希望大家能了解,在七牛云我们是如何思考工程相关的问题,也为大家分享我们的最佳实践。
我今天选择 Go+ 来作为实训的主题。
之所以这么选,是因为我们认为 Go+ 已经迈进了生产级的门槛。作为一门新语言,我们可以借助它做出足够有意思、足够有价值的产品。当然在此之前,让我们先来看看 Go+ 的全景图,看看我们为什么这么说。
让 Go+ 成为语言榜排第一的语言,是我对这门语言的愿景。虽然听起来可能有些不切实际,但是我仍然对此深信不疑。相信通过全景图,你也能了解到其中的原因。
What Go+ would be
那么首先要和大家介绍的是,Go+ 到底是什么?
今年是很特别的一年,是 ChatGPT 大火出圈的一年,那么由此引出两个问题:这个世界为什么需要 Go+?在未来人们还写不写代码?
这两个问题其实已经在程序员圈子里被广泛讨论,很多人担心自己会不会因为人工智能的兴起而被取代。那么究竟未来需要更多的代码还是更少的代码?持有不同观点意味着对未来发展方向有着不同的判断。而我个人坚定认为:未来会有更大量的代码。
我们相信 AI 会诞生更多的代码,AI 也会让更多人可以写代码,由此产生更大量的代码。正是基于这样的判断,我认为未来会有更多的人会去写代码,全民编程时代必然会到来。而目前的编程语言,所有主流语言的视角都是精英视角,也就是说编程语言是给精英群体用的。但 Go+ 是少有的面向大众的语言,Go+ 核心观点是让所有人都可以使用。正因如此我相信 Go+ 会成为排行榜第一的语言。
当然随着 ChatGPT 的发展,有人会说我们某天通过自然语言就可以编程,不再需要学编程语言了,因此未来的代码量会减少。我是反对这个观点的,因为自然语言的不准确,导致它无法应对追求确定性的软件工程。而编程语言最核心的逻辑就是确定性,工程实践的核心思想也是确定性。比如说我们的代码管理,大家都知道代码管理遵循的是版本。版本背后是确定性的基线,基线的概念是只读,只读的目的就是为了确定性。所以,在所有的工程实践里都是反不确定性的。所谓的自然语言编程,也无非是将其转化成某一种编程语言,而这个准确率再高也不可能达到百分百。所以在这样的一个情况下,编程语言依然会被作为不可或缺的工程基础。
基于这样的逻辑,Go+ 有两个先天优势。首先是易于学习,既然是面向全民,那么我们希望全民都能够掌握。Python 是目前所有语言里面最趋向于全民编程的一门语言,我们希望 Go+ 的最佳实践的语法量是小于 Python 的。
第二是我们希望 Go+ 是面向大型工程的,也就意味着它可以写非常庞大的软件而不只是初学者随便用一用。刚才提到的 Python 虽然容易学,但是在大型工程上的能力有所不足,我们希望 Go+ 在这方面做到更好。
那么 Go+ 究竟是什么样?我想通过对比的方式和大家进一步解释。
首先是目前在数据科学领域最流行的 Python,由于 AI 很火,所以 Python 也很火,一跃成为语言榜的第一,我们希望 Go+ 更简单,同时具备面向大型工程的能力。第二是 Scratch,一门面向儿童的编程语言,可能这个语言很多程序员没听说过,但是它同样榜上有名,就是因为它门槛极低,所以我们也把它作为一个对比的对象。第三个是 Go,其实从名字上来看,Go+ 的工程能力都继承于 Go,是在 Go 的基础上发展而来的,Go 的语法最少,是工程领域里最简洁的一门语言,没有之一。使得它成为云计算领域里最流行的语言。
当年乔布斯发布 iPhone 的时候,为我们留下一场精彩的演讲,他把 iPhone 看作是 iPod、Internet 和 Phone 的三合一,重新定义了移动电话。而我希望 Go+ 能和 iPhone 一样,等于 Go 加上 Python 加 Scratch,重新发明编程。因为它能够搞定庞大的工程、简便易学、面向数据科学。
这三个领域都是 Go+ 关注的范畴,但其实它们有着同样的内核——让所有人都能用 Go+ ,来创建产品级的应用。这是 Go+ 的目标,也是全民编程的必由之路。
今天所有的代码都是程序员产生的,而未来产生最多代码的是 GPT,所以希望 ChatGPT 能够用 Go+ 产生最多代码,因为 AI 产生的代码量最多的语言,一定会成为语言榜第一的语言。ChatGPT 如果能用 Go+ 产生更多代码,那自然而然也会有更多的人用 Go+ 来写代码。
An example:Go+ vs. Python vs. Go
那么 Go+ 到底长啥样,在这里给大家举一个很小的例子。这是一个对话的场景,在程序开始的时候,角色一会说一句话,然后广播一个消息给另外一个人,另外的人收到这个消息以后会继续广播,以此类推。大家会发现 Go+ 的代码非常简短,但是他能够完成多个角色对话的能力,非常精简,也很直白易懂。
那相同能力的代码,在 Python 里面长这样。首先它会定一个类,然后再定类里面的一个函数,这个函数是启动的时候会自动执行的。
相比而言,Go+ 的语法的简洁程度明显更好,这是因为 Go+ 基本上只有函数,「If」「else」等等这样的一些控制语句,然后再加上变量等等这样最基础的一些元素,没有类,就可以做完所有的事情。
Go+ 推荐的语法题是非常小的。这也是它能成为真正全民编程,被所有人能掌握的低门槛语言的核心逻辑。同时 Go+ 兼容 Go 的语法,支持范型的调用,虽然不支持 cGo,但是和 Go 的混合编程,我们可以在 Go 的部分使用 cGo。
以上是 Go+ 的简要介绍,那么接下来我们看全景图。
刚才提到 Go+ 是 for engineering、for STEM education、for data science 这三个领域,当然在这三个领域,它的成熟度是不一样的。我就重点围绕 Go+ 在这三方面的成熟度展开。
Go+ for engineering
首先看工程领域,这显然是最成熟的部分。正是由于它支持和 Go 的混合编程,所以在工程领域它是没有什么做不到的。在下图大家可以看到详情。
我想重点和大家介绍 IDE 和 GitHub action 的部分,有了这两个部分可以说 Go+ 在工程实践方面就非常完备了。首先前段时间我们发布了 Go+ 的 IDE 插件,可以说非常好用。而在进行工程的时候,我们需要做单元测试、自动编译这样的 CICD,那 GitHub action 可以让 Go+ 迅速被 CICD 所使用。这是非常重要的进步,并且已经被很多 Go+ 项目实际使用。
另外 Go+ 在和 Go 的兼容上也花了不少功夫,现在 Go+ 的 project 或者 model 可以看作是 Go 的,这也就意味着 Go+ 和 Go 可以互相引用对方的包,它们在二进制上是契合而兼容的,这在工程领域的推广非常关键。另外 Go+ 不仅支持 Go 官方的编译器,也支持第三方如 TinyGo 和 c2go,这为 Go+ 带来了在云计算、嵌入式设备等更多的优秀兼容性。
下面是 Go+ 的一些插件,大家可以在列表中看到大概有 42 项,目前已经实现了最为重要的 30 项,完成度是非常高的。
Document outline
首先我们看 Document outline,通过它我们可以在打开 Go+ 文件后,快速看到其中有哪些函数并且跳转,为我们的代码写作提供便利。
Format and organize imports
接下来是格式化。在 Go 语言中,通过 bs code 插件已经能实现这样的功能,在 Go+ 中也是同样,它会自动帮我们写包中的语句。比如图片上的示例,不仅格式变漂亮,语句也被自动加上了。
Code completion
第三个是大家最熟悉的功能,自动完成。这个功能其实非常复杂,涉及到的内容特别多。在这里就举一个简单的例子,通过在类后打一个点,就能把所有公开的方法和变量列出来,这是大家已经非常习惯的功能。
Quick info on hover
还有一个非常重要的功能,就是提示。我们把鼠标移到某一个符号的时候,就会有这个符号的提示。
Go to definition
跳转功能是我自己用的非常频繁的功能,特别是在阅读别人代码的时候,可以通过快捷键跳转到某一个符号。
Find references
刚才是跳转到定义,这个功能是从定义跳转到所有。我们想要找一个符号在哪些地方用到了,通过这个功能就能非常方便。
Code Lenses
Code Lenses 也是我常用的功能,比如你有一个测试案例的代码,它会在旁边自动提示运行,这也是非常实用的功能。
Run Tests
当然运行单行测试就更不在话下,可以通过快捷键就能自动运行测试。
以上是一些比较典型的功能分享,当然远不止如此,Go+ 的 vscode 完成度已经非常高。并且所有的插件不仅支持 Go+ 还支持 Go ,这也是非常重要的特性。当然大家会注意到,我们现在的版本号还是 0.8,是 beta 版本,也欢迎大家在使用中提意见。
再向大家展开介绍一下 GitHub action。在下图的例子中,我们可以看到在工程中加上 uses 的这样一个语句,就可以在工程中实现编译、单元测试这样的功能。也可以做格式化的测试,这样可以避免写作过程中一些过于个性化的格式。
通过以上我们可以看到,Go+ 不仅在功能上,也在实际生产上具备很好的工程能力。
Go+ for STEM education
接下来是 Go+ 在教育方面的情况。
众所周知,目前 STEM 教育和生产非常脱节,在 STEM 上常用的 Scratch,其实是不具备生产能力的,正因如此,目前 Scratch 的教育顶多覆盖到初中,之后就鲜有人使用了。这其实是编程的一个怪现象,我们希望学习者能有一个可以从始至终进行学习并使用的语言。
所以 Go+ 做了一个游戏引擎,它的关注点是如何简洁地让大家完成各类图形化的内容。这个引擎基本兼容 Scratch,让 Scratch 的代码通过转换工具变成这个架构的代码,并且可以被执行。
当然这还不够,我们还在进行新的尝试,就是 Go+ smart blocks。由此我们不仅可以用文本查看代码,也可以像 Scratch 一样用块的形式来查看。它具备块编程简单直观的特点,同时「smart」也提高了它的生产效率。
下图是 smart block 的展示。它最大的优势在于不会写错语法,虽然没有 vs code 的效率高,但是因为块编程是固定的,更适合低龄学习者,降低他们的入门门槛,并且能够一直用下去。我相信再过一段时间,会有更多小朋友会选择 Go+ 来入门,并且到他大学毕业也可以一直用下去。
Go+ for data science (in roadmap)
第三个方面是数据科学。
AI 是大家非常关注的领域,发展十分迅速,但是目前 Go+ 在数据科学领域的成熟度还有待提高。但是我们确实在不断进步,比如语法、操作符重载、有理数、列表理解等功能在 Go+ 中已经得到支持。
目前 Go+ 在数据科学的能力还相对薄弱,我们也在寻找加速追赶的思路。其实对照 Go+ 在工程领域借势 Go,在教育领域借势 Scratch,我们在数据科学领域的借势目标是 Python,我们希望能够让 Go+ 全面兼容 Python 的资产。也就是让 Python 的包去让 Go+ 完全引用,这是我们目前探索的方向。从 roadmap 角度来说,在 Go+ 的 2.0 版本,可以全面兼容 Python,在 1.x 的版本中,我们的重点还是会放在工程和教育领域。
以上就是 Go+ 目前的主要情况,也欢迎大家了解 Go+,使用 Go+,加入我们的布道师团队!
最后,让我们再来总结下本次分享的重点:
谢谢大家。如果你有任何问题、建议,欢迎给我们反馈。