4

前哈佛计算机教授、谷歌工程总监:AI将在3-5年内取代程序员

 1 year ago
source link: http://www.gamelook.com.cn/2023/03/512878
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

前哈佛计算机教授、谷歌工程总监:AI将在3-5年内取代程序员

2023-03-20 • 人物观点程序开发
Programming.jpg

图片来源:Pixabay

【GameLook专稿,未经授权不得转载!】

GameLook报道/人类对未知的恐惧,似乎是天生的。这也是每当新技术出现,都会有人对其感到不安的原因。比如最近的生成型AI,就导致很多的美术师担心被夺走饭碗,甚至出现过大量美术师集体对抗AI作品的现象。

实际上,生成型AI除了画图之外,还可以写代码,甚至比人类程序员速度更快、效率更高,而且成本更低。

此前的线上演讲中,Fixie联合创始人剑CEO、前谷歌Chrome移动团队工程总监Matt Welsh表示,程序员这个工作或许在三五年内不复存在,甚至编程这个学科都会被终结。他在题为“大型语言模型(Large Language Models)和编程的终结”的演讲中提到,尽管人们一直在努力让编程变得更容易,但实际上,过去50年来的编程探索一点作用都没有。

“人们如今研发的程序还是一样复杂、一样难于维护,还是那样难以理解,依旧是像以往那样满是bug。我没有看到这个问题能在短期内解决,我们已经忍受这个问题很长时间。从1957年到2010年,编程语言难懂的困境并没有多大的改观,它依旧非常复杂,需要理解很多的语法。”

生成型AI技术的出现,让这个问题大有改观,他认为,随着AI技术的发展,编程工作将不再需要,人类程序员更多的是需要培训AI模型,“随着时间的变化,编程将会转变为教学,也就是教这些AI模型新技能”。

以下是Gamelook听译的完整内容:

Matt Welsh:

某种意义上说,今天的分享可能是有关我看到的,计算机科学领域面临挑战方面的夸夸其谈或长篇大论,毕竟,你现在已经可以用AI写一个程序,我觉得这是一件很奇妙的事,也是很有挑战性、很有趣的事情。

lazy.png

简短介绍一下我自己,我是西雅图初创公司fixie.ai的CEO兼联合创始人,你在网络上可能找不到我们太多的信息,但今天我会介绍一点点我们正在做的事情。剧透一下,它和大型语言模型有关。我想团队里的工程师们可能对此有意见,这当然不是编程的终结,我们仍然还在做大量的编程。

在fixie之前,我去过很多地方,曾经在大量的AI初创公司工作,我最近的一份工作是在OctoML担任工程高级副总裁。在这之前,我在苹果公司呆了一段时间,主要是因为我工作的初创公司Xnor.ai被苹果收购。更早之前,我在谷歌Chrome团队工作了八年半。

回到从前的话,我曾是哈佛大学计算机科学(computer science,以下简称CS)专业的教授,我的博士学位在伯克利(加州大学伯克利分校)拿到的。

可以说我从事编程有相当一段时间,参与AI也有些时日,我发现新一代的AI模型真的在改变格局,我认为对所有人都重要的是思考它的应用、我们所在的领域将如何随着这个技术升级。

我这里想要说的是,CS是注定要失败的。我说这话的意思是,我认为这个领域将会发生巨大的变化。如果我们来看计算机科学作为一门学科,它始终最主要的一件事,就是将想法翻译成程序,包括整个领域,系统、数据库、理论,所有都是和这个概念有关。具体来说,就是研究如何解决问题并将其映射为可以被“冯·诺依曼机器”(即电脑,Von Neumann是计算机之父)执行的指令。

所以,这就是我对CS的简单定义。非常需要注意的是,CS始终有这样一个假设,那就是我们这里所说的程序一直是由人类部署、维护和理解的。然而,可能让所有人震惊的是,人类在这些事情上面做的很糟糕,打造软件、维护软件,确保它处于可维护状态需要大量的努力,这并不容易,我觉从根本上说是很难的,因为计算机程序本身是非常复杂的。

lazy.png

很长时间以来,这个问题的答案,一直都是让编程变得更容易,这应该是个可以被直接解决的问题。我们会开发新的编程语言和解决这个问题的编程概念,我想要在这里做一个大胆的声明,如果过于直接,还请谅解,但我要说的是,过去这50年的编程语言研究对解决这个问题一点用都没有。

我们所做的一切,输入系统、debugging、静态分析等等,没有任何一样能解决这个问题。人们如今研发的程序还是一样复杂、一样难于维护,还是那样难以理解,依旧是像以往那样满是bug。我没有看到这个问题能在短期内解决,我们已经忍受这个问题很长时间。

如果这是个刚出现10年的行业,有人可能说即将有一个答案,我们总会解决这个问题,但我并不认为这能够发生。

过去几十年的编程历史

接下来我举一些例子,展示一下过去几十年的编程进展:

lazy.png

最开始是1957年的FORTRAN,我记得好像这里大部分的案例都是《康威生命游戏(Conway’s Game of Life)》这样的代码,有些可能并不是,甚至这张图片里的代码也和1957年的FORTRAN有些差别,但是有人认识吗?我做了很久的编程,很难一眼看出来它是否能运行。

lazy.png

BASIC(1964)的目的是让编程变得容易,并将它带向大众用户,这是我学编程的第一个语言,我并不认为这个语言很容易处理,它相对友好一些,但依然非常复杂。

lazy.png

那么APL(1966)怎么样呢?这是用APL写的《康威生命游戏》代码,我是从一个网站摘抄的这段代码。如果有人拿枪指着我的脑袋解释这个程序,显然我是做不到的。我不确定这段代码发生的事情,也不知道设计者语言的人,以及他们为何觉得这是一个编程方面的进步,但很明显,总有人喜欢做这种事情。

lazy.png

接下来,我们说一个有点搞笑的语言Malbolge(1998),我对它的理解是,Malbolge让代码在运行的时候自我修正,它用了很模糊的方式呈现数据,实际上我觉得这个语言的研发和第一个真正用它编程的程序之间相差了很多年。我想这是用Malbolge写出来的《康威生命游戏》,当然它就是个笑话。

lazy.png

或许最简明的是Whitespace(2003),这是另一种的编程语言内行笑料,这个语言当中,所有东西都用空格、标签和回车代替。图片中实际上就是用Whitespace写出的《康威生命游戏》,你是看不到的。

lazy.png

好吧,不开玩笑了。我们所有人都知道和喜欢的Rust(2010)这样的现代编程语言做的如何呢?很多人都对Rust感到兴奋,这曾是当时的热点,是为21世纪设计的并发安全编程语言。

我想要说的是,从1957年到2010年,编程语言难懂的困境并没有多大的改观,它依旧非常复杂,需要理解很多的语法。以Rust为例,你需要了解输入系统、归属权和所有事情,对于人类来说,它并不容易处理。

好吧,我觉得如果求助我们的好朋友ChatGPT可能是最容易的方式,让它来替我们写程序,告诉它我们做这些的目标,将我们的想法变成能在计算机上运行的代码。我们都见过CoPilot和GPT3都完全能胜任编写很复杂的电脑程序,所以我们让ChatGPT写出《康威生命游戏》的代码,比如x86汇编代码。

lazy.png

然而,ChatGPT更聪明,它并没有被愚弄,而是说,“很抱歉,用x86汇编代码写《康威生命游戏》是个复杂的任务,而且需要大量的汇编程序知识”。所以,如果觉得写代码很容易,连ChatGPT都不信。

无论如何,AI给出的这个有些俏皮的答案,很好地说明了我们行业正在发生的事情,甚至连AI都不想写令人沮丧的代码。

lazy.png

回到让AI帮我们写代码的事情,如今,我认识的大多数软件开发者都在使用GitHub的CoPilot,它是一个存在于编辑器里的程序,可以在你敲代码的时候自动帮你完成。如果没有使用CoPilot,我觉得你做编程就像是图片里的山顶洞人在击石取火,CoPilot极大改变了我们写代码的方式,据我个人的经历,这是加速研发的一种非凡而深刻的方式。

lazy.png

所以与山顶洞人对比,我觉得用CoPilot写编程就像是个黑客在做这些事。CoPilot有很多不可思议的能力,如果没有尝试过,我非常推荐你使用。当我开始使用CoPilot的时候,我有一个想法,觉得它只能做一些大学生作业那样的解决方案,认为它只能理解一些基础的事情, 比如链接列表,或者返回一些琐碎的反应。

lazy.png

但情况完全不是那样。作为一个每天都需要写编程的人,它让我感到惊讶,CoPilot经常能补全我的想法,甚至觉得它会读心术。比如我最近为我们的项目写测试案例的时候,我写完前两个单位测试之后,它直接给我写出了接下来的三个测试案例,在了解了前两个之后,它觉得这些是接下来需要发生的一些事,所以它在这方面真的令人惊奇。

大型模型语言将取代程序员

我感觉CoPilot是非常出色的效率提升工具,因为当我不确定如何做某些事的时候,它让我不用切换情景。例如我在写一些代码,而且知道这个库(library)能够完成在一个字符串列表里搜索或者其他的事情,但我想不起来我需要输入的东西。

我可能在几个月前用这个API的时候做过这件事,过去,解决这个问题的事情是查找IDE或求助于搜索引擎,然后可能会看到大量的博客,希望能有一个告诉我该怎么做,所以简单的事情往往会变得这么复杂。对于更复杂的事情,我之前可能需要读很多东西,然后用一些时间组织出一个答案。

有了CoPilot,你不用离开IDE,只需要输入你想做的事,比如生成一个RSA key,它就会立即为你做出来。有时候得到的答案可能有些细微错误,你需要调整,但这节约了多少的时间?!

另一方面,如果我离开了IDE,然后用谷歌搜索stack overflow,有一半的可能是在45分钟之后,我在Reddit或者维基百科做一些完全随机的事情且浪费时间,因为我离开了编程地带。所以,如果有更多的CoPilot这样的工具,就会大幅提高效率,我可以避免经常遇到的减缓写代码速度的事情。

很多人批评CoPilot有一些花里胡哨,它不能解决一些真正困难的问题,只是鹦鹉学舌地返回一些从GitHub或互联网摘抄的东西。它并没有真正的智能,只是每次给我们一些少量的代码,并不能为我们写整个模块。

lazy.png

所有这些抱怨在如今都是真实可信的,我希望我们能够意识到的是,真正阻止CoPilot变得更好的只有一件事,那就是更多数据和更强大的计算能力。

你猜怎么着?这两个方面都是非常充裕的。所以,随着我们有了更多数据、更多代码、更多算力,我不觉得一年或者三年之后CoPilot可以做到,你只需要在源文件上输入几行代码,它就能把其他的写出来,对我来说,如果这样的事情发生,我并不觉得疯狂。

很多人不相信这件事会发生,他们觉得不可能。但是,我觉得如果历史告诉了我们什么东西,那就是人类对于从近代历史中的几个数据点推断事情很不擅长。这是我们所在的指数曲线,你回顾过去的一些数据点,并不能发现指数,但随后处于指数上升期的时候,变化发生的非常快,你可能意识不到。

所以,设想CoPilot不只是软件开发者的一个必备工具,而是一个完全有可能在未来取代人类程序员的机制。就像我说的那样,现在还没有到时候,但我不认为这一切发生需要很长时间。

我们来看数字,用AI替代一个程序员需要的代价是多少?我们看一个人类程序员的正常工作效率,我曾经在谷歌这样的公司工作,我认为平均而言,程序员每天能够检查和最终提交的代码大约是100行,注意,这还不是写代码。

我之所以这么说,是因为如果真的敲代码,你可能写几千行,但是你需要复查代码、测试、部署和大量的流程,所以每天100行代码对我来说是可以的,或许这里少说了10行甚至100行,但没有关系。

lazy.png

如果找一个大部分编程语言的源文件代码,把它分解成GPT3 tokenizer使用的token,把它放到CoPilot里,会发现平均每行代码有10个token,哪怕有稍微的不准确,但我的观点依然成立。如果计算价格,那么GPT3处理1000个token的价格是2美分。

但我们假设,为了给GPT3提供生成所有这些代码需要的上下文环境,通常这需要是输入的五倍多,所以你依然需要为之付费。所以,加上这一切之后,我们发现一个人类软件工程师使用AI的工作成本是0.12美元。

这个价格只会越来越低,因为这个技术才刚刚开始。我们再来看人类程序员一天需要多少成本。这里我做的是一个粗略计算,包括薪水、福利、咖啡间、按摩椅、保龄球场等等,假设人类工程师每天的成本是1200美元,那就是一万倍的差距。

lazy.png

如果你是个工程师,而且觉得自己做的很好,你需要努力注意这些数字,因为我认为,不招聘人类做这些工作,将会极大改变整个行业。这个语言可能还需要10年,哪怕如此,考虑到有些人刚开始上大学,那么就需要考虑一旦被AI取代,他们如何规划职业生涯。

我们对AI和机器人已经有了很多的了解,机器人不需要休息。我说的是每天生成100行代码,机器人并不一定局限于此,它可以生成数千倍多的代码。比较有趣的是,不论你让它做粗略的创意原型,还是做一个最注重测试产品质量,需要生成代码的时间都是一样的。

lazy.png

如果交给人类工程师,一两天的时间可以做出创意原型,但想要进入制作阶段最起码还需要三周以上的时间,因为我们需要重写、重构、测试、审核,知道所有人确认一切正常。因此从粗略代码到能够制作的代码,这个过程需要大量时间。

另一件事是,人们说AI的生成质量并不是那么好,所以一定会出错。这绝对是真的,但我们现在的一个优势是,AI现在可以如此快速的犯错,我们可以快速在这些代码变体之上进行迭代。过去这是个瓶颈,因为它需要人类坐下来写代码,还需要思考。

如果换成了机器,你可以生成2万份同样的代码,然后测试并挑选最好的那一个,你没理由不这么做。

那么,如果我们在这个环节将人类踢出去会怎样?我在想,未来产品经理可能是一个职业生涯的选择,因为仍然需要产品经理来决定计算机应该做什么,产品看起来是怎样、它如何运行、我们如何与它互动?

这是来自微软的一个视频,主题是产品经理是做什么的?这是一个持续了几十年的话题,我们经常不知道产品经理在做什么。

我觉得未来的软件团队可能是这样的:

lazy.png

试想一个仍然能用英语写产品描述或产品需求文档的产品经理,告诉这个软件应该做什么。实际上产品经理已经在这么做了,他们已经在做决策,决定产品应该是什么样。他们将产品需求文档交给工程团队,问能否进行部署,工程团队说,这可能需要六周的时间。

在我设想的AI未来,你只需要将文档交给AI,它就会在几秒内生成代码。那么,我们如何知道这些代码能不能用、够不够好?这当然需要不断的测试,人类仍然是需要参与的,但如果更多的工作是阅读、审核代码而不是写代码,我觉得这个速度可能会比写代码快100倍,至少我个人经验是这样。

所以,我们依然需要人类写产品文档,然后交给AI写代码,最后QA环节仍然需要人类,这可能是未来的产品团队构成模式。

人们对AI的担心源于不了解

过去几个月来,我观察到的现象是,人们对ChatGPT感到极度不安,不管是正面还是负面方式,我发现我们感到不安的原因在于,它就像是一个外星技术那样,在几个月前降落到了我们的后院,此前从来没有这样一个能在浏览器里直接使用的AI。

lazy.png

用一个类比,这就像是计算机图形技术,直接从1972年的《Pong》直接转到了2018年超级写实的《荒野大镖客2》。这就像是我们某一天醒来,计算机图形技术发生了如此之大的升级,如果是首次看到这样的量变,人们的确会觉得不安。

今天的AI就是如此,人们从来没有见过AI、更没有和它们互动过,我们之前可能听说过AI,阅读过相关的文章或者进行过讨论,但在ChatGPT之前,人们从来没有通过这种方式上手使用过。

lazy.png

我们也看到了人们讨论AI方式的变化,可以看到,1972年Hubert Dreyfus讨论的是“电脑不能做什么?”他的这个观点在当时是有争论的,比如“AI永远不能取代认知”,因为认知是基于很多东西、它很复杂,而且很神秘,以至于计算机系统永远不可能将它做出来。

很快到了2014年,Nick Bostrom的书籍“SuperIntelligence”讲了一个完全不同的故事,它担心的不是AI不能做什么,而是在一个AI变得超级智能的世界会发生什么?那时候AI比人类更智能,以至于从根本上在我们社会中的很多部分取代了人类。这样的讨论有很多,我们还可以说《黑客帝国》、《终结者》等等,但这个话题值得讨论。

这里展示一些之前的东西,是我在寻找早期自驾汽车的时候发现的,1986年CMU NavLab的这个项目可能很多人都已经忘了,接下来我们展示这个简短的视频:

我觉得这个视频很神奇的是,这个大卡车里有很多的计算机,向我们解释了电脑是如何理解路况的,当然它的速度一小时也不到一英里,但这是1986年。

编程学科的进化

lazy.png

所以我们来说编程是如何成为一个学科或领域的。这是编程时代的黎明,那时候还需要人类向计算机输入指令,比如卡片穿孔或者旋转开关。

lazy.png

没过多久,大概10到20年后,我们已经开始写高级语言并开始用高级语言写程序,这是C++之父本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)穿着球鞋坐在自己桌子前的照片。这是很长时间依赖的编程方式:你用高级语言写程序,计算机将它编程低级机器指令。

lazy.png

接下来是现代,也就是我们今天在做的,人类用高级语言写程序,但AI帮助他们,比如我刚开始举例的CoPilot,这是我早期写的代码,我想要一个生成RSA key pair的函数,我知道这个函数的签名(signature)应该是什么,但我不需要查找需要做的具体代码,CoPilot就给我呈现了,我可以点击tab,然后继续。

lazy.png

然后是未来,我觉得这时候事情会变得很有趣。我认为未来的AI模型会变得非常好,以至于他们可以直接解决问题,我们将不需要其他软件,只要有AI模型即可。你找到AI,用英语告诉它你想要什么,AI就会执行你想做的事情,不只是生成代码,而是随后可以编译、运行测试。我们在教AI如何解决问题,而不是电脑程序,AI就是代码。

我们还没有见到ChatGPT这样的大型语言模型的思维链推理,我非常鼓励人们这么做,因为这对于没见过的人来说,可能会令人震惊。

lazy.png

我们来看GPT-3这样的大型语言模型,它们已经展示出了推理能力,你可以将一个复杂的问题声明交给模型,模型会将它分成很多步骤,然后每次执行一步,控制一个世界模型作为其执行流程。

所以,随着时间的推移,这些大型语言模型会越来越像通用问题解决器。它们不只是鹦鹉学舌,不再只是自动完成,不再是只能写故事或营销话题,而是真正在解决问题。

这里我展示一个案例,当然有很多方式可以这么做。我使用了ChatGPT,给出了一个问题:这里有一个谜题,桌子上有三堆卡,分为红色、蓝色和绿色,它们混在了一起,我希望ChatGPT告诉我,如何为这些卡排序,以便做到一堆卡全部是红色、一堆全部是绿色,另一堆全部是蓝色,然后告诉我每一步怎么做。

为了解决这个问题,你的脑海中需要有一个模型,然后思考如何对这些卡分组。如果你问ChatGPT,它会给出一个非常详细的步骤列表:

lazy.png

第一步,将第一堆的蓝卡拿出来,放到单门的一个蓝色卡堆;第二步,从第二堆抽出红色卡放到第一堆….

这可以让所有人震惊,因为我们需要知道,无论是GPT-3还是ChatGPT,它们都不是为了解决这些问题而训练的,这个问题是随机的,似乎这些模型已经有了一些简单的逻辑能力,所以能得到这样详细的指令,是令人惊讶的。

lazy.png

所以,我的观点是,随着时间的变化,编程将会转变为教学,也就是教这些AI模型新技能,比如如何接一个API、如何从数据库抽数据、如何转换数据、如何为人类使用软件方法?如今这些领域已经有了很多公司,基本上都还在打造做这些事情的基础设施或者工具。

Fixie的愿景是将AI写代码变成现实

lazy.png

我想要借这个机会说一点和fixie.ai有关的东西,这是我们尚未宣布的东西,未来几周我们会讨论它。我们相信,2023年的AI模型,已经足够好到可以取代大量的手写软件工作,我们试图在今天用这个想法打造未来的明天。

我们的想法是,你给出想做事情的描述,fixie.ai拿到描述,用很多大型语言模型加上能连接外部系统的代理,它可以为你产出一个结果,比如回答一个问题、调用API,或者援引一个工具、对数据库做出改变,这些都是模型可以做到的事情。

重要的是,我们并不是写代码实现这些事情,而是教这些AI模型如何完成这些事。

再举个例子,“找到一个GitHub问题列表,并且给每个分配到任务的人发送邮件提醒在今天下午4点之前更新它们”。

lazy.png

Fixie接到这个指令,它意识到这是个多步骤任务,它要做的第一件事是找到一个能够与GitHub联系的代理,发送给它一个描述,比如“找到所有GitHub问题”,这个代理有一个大型语言模型。然后问题会被交给JSON代理,这时候JSON需要找到这些问题的解决者,第三个代理会找到所有人的邮件地址,最后一个代理会通过API给所有人发送邮件。

问题是,我可以写一个程序做这件事,可能需要大量的代码,很多公司也都有大量这样的工具。然而在AI情况下,我只需要说想做的事情,AI模型就可以和代理一起完成。我们认为这是打造软件的一种很有吸引力的方法,因为需要处理的代码少了太多,AI做了这些累活。

在这个系统里打造代理也很容易,因为我们在利用少样本示例学习,培养这些语言模型的能力,在Fixie获得一个代理告诉GitHub需要十分钟,因为我所要做的是给出使用GitHub API的七个案例。

lazy.png

用英语提问,以及答案应该是什么样的,我写了七个案例,但这些模型可以从这些案例中找到共同点,这是很强大的,刚开始的简单问题,现在成为了从未见过的请求,这是打造软件非常强大的方式。

Fixie另一个强大的地方在于,可以生成和控制图片。比如我八岁的儿子非常喜欢红色熊猫,输入指令“生成一个红色熊猫图片,然后把它放到夜空图片之上”,在Fixie当中,我们的方式是用代理分别生成夜空和熊猫,第二个代理将熊猫图片遮盖背景,第三个代理将两个图片结合起来。

同样,我不需要写任何代码,只要说出我想做的事情,Fixie就会帮我协调这些代理得出我想要的结果。

AI在三五年内将取代程序员

所以,在这个新技术的影响下,我们需要重新思考计算机科学的升级,我觉得这不会太长,而是三五年内就可能出现的变化。

lazy.png

如果你的年纪足够大,可能要学习如何使用尺子,每个人都有一把尺子,它是计算的基础,也是交易的主要方式。我没有用过,也不知道怎么用,但我在网上买过一个。我觉得这和现代计算机科学很像,我担心按照AI的进化,我们思考计算机科学的方式可能是错误的。

我们可以想象2030年,或者离现在不太远的时间之后,坐在电脑前使用IDE写代码,就像是之前用尺子计算那样少见。

或许,CS未来会更像EE(电子工程),它会逐渐消失,就像现在并不是所有高中都有EE课程,他们进入大学也不都会学EE。我相信在未来,大多数人们打造今天的“软件”,不再是通过编程,而是通过与AI互动而完成。

lazy.png

虽然对我们的行业听起来有些可怕,但这个未来有一个非常好的地方在于,AI可以让所有人接触计算。现在,如果你会编程语言,就像是拥有了很多人不具备的超能力,有了AI的帮助,我们可以让全球所有人都通过和AI的互动打造他们想要的程序,我觉得这是个巨大的机会,会在很多方面改变这个世界。

当然,我们还面临大量的挑战,这里不会全部列举。但我不希望这听起来就像是探囊取物那般简单。

lazy.png

这里有一个小秘密,那就是没有人理解大型AI模型是如何工作的,哪怕是设计它的那些人。我们今天都在被迫通过经验主义来学习它们是如何工作的,很多事情都是通过经验发现的,人们不知道GPT可以做这些事,只是有人发现了这些事。

所以,如果我们持续地打造越来越大的模型,一个全新的领域就会开放,我们如何了解他们的行为、管理它们的行为,如何更好的教学和指引它们?如何保证安全、如何评估它?所有这些都会是非常重要的问题。

我不认为人类可以简单的说“我拒绝使用AI”就能避开它,这是不太可能的结果。

最后想要分享的是,很多人担心AI可能会砸掉程序员的饭碗,但是,严肃点说,我们没有人喜欢写代码,不如让机器人去写,让我们好好享受人生。让机器人做写程序那样的事情,我们所有人都可以做更伟大的事情。

如若转载,请注明出处:http://www.gamelook.com.cn/2023/03/512878


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK