只要人工智能(AI)是充當(dāng)副駕駛而不是自動(dòng)駕駛的角色,就存在開(kāi)發(fā)一種促進(jìn)人類(lèi)與人工智能之間有效協(xié)作語(yǔ)言的空間。這可以通過(guò)減少認(rèn)知負(fù)荷并支持快速測(cè)試來(lái)實(shí)現(xiàn),從而顯著地縮短迭代時(shí)間。此外,人工智能簡(jiǎn)化了新語(yǔ)言的采用。
那么,在人工智能快速發(fā)展并接管了更多編碼任務(wù)的今天,為什么還要投入時(shí)間和精力來(lái)開(kāi)發(fā)一種新的編程語(yǔ)言(面向人類(lèi)的)呢?
我經(jīng)常會(huì)以各種形式遇到以下的問(wèn)題:
難道人工智能最終不會(huì)直接編寫(xiě)機(jī)器碼而使編程語(yǔ)言過(guò)時(shí)嗎?
一種新的語(yǔ)言能否引入人工智能使用現(xiàn)有語(yǔ)言無(wú)法實(shí)現(xiàn)的特性或功能?(例如,當(dāng)人工智能可以為特定的云編寫(xiě)代碼,然后為另一個(gè)云重寫(xiě)代碼時(shí),為什么要?jiǎng)?chuàng)建一種云可移植語(yǔ)言呢?)
為可能很快就會(huì)被人工智能所取代的開(kāi)發(fā)人員創(chuàng)建工具值得嗎?
首先,我必須承認(rèn),我無(wú)法預(yù)測(cè)人工智能的發(fā)展速度。對(duì)于人工智能何時(shí)或是否會(huì)取代人類(lèi)開(kāi)發(fā)人員,知名專(zhuān)家持有不同的意見(jiàn)。
然而,即使人工智能最終取代了人類(lèi)開(kāi)發(fā)人員,它也未必能直接編寫(xiě)機(jī)器碼。當(dāng)人工智能可以依賴(lài)于成熟的抽象層和編譯器,使其能夠有效地專(zhuān)注于其所服務(wù)的業(yè)務(wù)的獨(dú)特面時(shí),為什么還要選擇通過(guò)直接編寫(xiě)機(jī)器碼來(lái)為每個(gè)應(yīng)用程序重新發(fā)明輪子呢?通過(guò)在現(xiàn)有工作的基礎(chǔ)上再接再厲,專(zhuān)注于更小、更簡(jiǎn)單的任務(wù),人工智能可以獲得更快、更高質(zhì)量的結(jié)果。
在討論了更遙遠(yuǎn)的未來(lái)之后,我現(xiàn)在想在這篇文章的剩余部分重點(diǎn)討論一些更近期的未來(lái)。
我相信,考慮到人類(lèi)的局限性和心理,盡管人工智能發(fā)展迅速,但變化可能是漸進(jìn)式的,從而導(dǎo)致人類(lèi)仍處于一個(gè)重要的過(guò)渡期中。例如,很難想象組織不希望人類(lèi)對(duì)人工智能的輸出負(fù)責(zé)。人類(lèi)將非常不愿意讓人工智能以一種人類(lèi)無(wú)法理解、修改和維護(hù)的方式工作。
想想看,你會(huì)讓 ChatGPT 以你的名義,用你不會(huì)說(shuō)的語(yǔ)言,為你的同行寫(xiě)一篇專(zhuān)業(yè)文章嗎?你會(huì)在無(wú)法閱讀的情況下發(fā)表它嗎?可能不會(huì)。同樣地,工程經(jīng)理是否會(huì)在明知道某個(gè)關(guān)鍵任務(wù)的應(yīng)用程序是由人工智能編寫(xiě)的情況下,還要將其發(fā)布到生產(chǎn)中?如果出了問(wèn)題,人類(lèi)很難介入。
此外,雖然人工智能在某種程度上確實(shí)是工具之間的均衡器,但它仍然不能完全解決問(wèn)題。讓我們以上面的云可移植性為例:即使人工智能可以在云之間移植代碼,但我仍然希望能夠讀取和修改它。因此,我必須在人工智能所使用的抽象級(jí)別上成為所有這些云的專(zhuān)家。如果一門(mén)新的語(yǔ)言允許它在更高的抽象級(jí)別上編寫(xiě),那么我也能更容易地理解并修改它。
假設(shè)人工智能使我們快速生成了大量的代碼,那么瓶頸不可避免地就會(huì)轉(zhuǎn)移到測(cè)試和驗(yàn)證階段。這種情況的發(fā)生不僅是因?yàn)槿斯ぶ悄艿墓逃芯窒扌?,而且主要是因?yàn)槲覀冏鳛槿祟?lèi)自身的不完美。我們無(wú)法完美地闡明我們的需求,這就需要體驗(yàn)最終產(chǎn)品的工作版本,與之互動(dòng),并確定它是否滿(mǎn)足我們的需求,或者我們是否忽略了任何的邊緣案例。這個(gè)迭代過(guò)程會(huì)一直持續(xù),直到我們的創(chuàng)作達(dá)到完美狀態(tài)為止。
在測(cè)試和驗(yàn)證消耗了大部分軟件交付時(shí)間的情況中,對(duì)于使用工具來(lái)顯著簡(jiǎn)化這一階段來(lái)說(shuō)有足夠的機(jī)會(huì)。通過(guò)減少在開(kāi)發(fā)環(huán)境中部署和評(píng)估應(yīng)用程序所需的時(shí)間,這些工具可以大大提高整體效率。
因此,我相信,在可預(yù)見(jiàn)的未來(lái),有一些工具可以讓人類(lèi)和人工智能更容易地快速編寫(xiě)出高質(zhì)量的代碼、并有效地協(xié)作更快地測(cè)試。這些工具能幫我們提高應(yīng)用程序的交付質(zhì)量和速度。
關(guān)鍵:減少認(rèn)知負(fù)荷,加速迭代
無(wú)論你是人工智能還是人類(lèi)開(kāi)發(fā)人員,降低復(fù)雜度并加快迭代速度都能更快地開(kāi)發(fā)出更好的應(yīng)用程序。
那么,我們可以做些什么來(lái)實(shí)現(xiàn)這些改進(jìn)呢?
在更高的抽象級(jí)別上工作
利用更高級(jí)別的抽象可以為人類(lèi)和人工智能編碼者提供如下的好處:
通過(guò)關(guān)注應(yīng)用程序的業(yè)務(wù)邏輯而不是實(shí)現(xiàn)細(xì)節(jié),可以減少開(kāi)發(fā)人員的認(rèn)知負(fù)荷。這使開(kāi)發(fā)人員能夠?qū)W⒂诟〉膯?wèn)題(例如,指示汽車(chē)右轉(zhuǎn),而不是教它如何右轉(zhuǎn)),處理更小級(jí)別的堆棧,編寫(xiě)更少的代碼,并最大限度地減少錯(cuò)誤的表面積。
可以減少人工智能的認(rèn)知負(fù)荷。
這一概念可能需要進(jìn)一步澄清。人工智能系統(tǒng)預(yù)訓(xùn)練了所有級(jí)別的堆棧知識(shí),因此知道得越少并不是一個(gè)顯著的優(yōu)勢(shì),專(zhuān)注于一個(gè)較小的問(wèn)題也不像人類(lèi)那樣有益,因?yàn)橹灰斯ぶ悄苤懒巳绾沃甘酒?chē)轉(zhuǎn)彎,那么在教它如何轉(zhuǎn)彎就不應(yīng)該遇到問(wèn)題,而不僅僅是告訴它要轉(zhuǎn)向。但如上所述,這仍然是有利的,因?yàn)樗鼫p少了問(wèn)題面,使人工智能能夠更快、更高質(zhì)量地生成代碼。然而,允許人工智能編寫(xiě)更少的代碼并減少其出錯(cuò)的機(jī)會(huì)是非常有益的,因?yàn)槿斯ぶ悄懿⒎侨f(wàn)無(wú)一失。任何目睹過(guò)它產(chǎn)生幻覺(jué)的接口或生成斷開(kāi)連接代碼的人都可以證明這一點(diǎn)。此外,人工智能還受到其在失去上下文之前可以生成的代碼量的限制。因此,編寫(xiě)更少的代碼使人工智能編碼器能夠創(chuàng)建更大、更復(fù)雜的應(yīng)用程序。
可以加快迭代速度,因?yàn)樗枰帉?xiě)更少的代碼,減少了編寫(xiě)和維護(hù)代碼所需的時(shí)間。雖然這看起來(lái)可能并不直觀,但這對(duì)人類(lèi)和人工智能程序員來(lái)說(shuō)同樣重要,因?yàn)槿斯ぶ悄芤淮紊梢粋€(gè)令牌代碼,與人類(lèi)的編寫(xiě)方式類(lèi)似。
可以改善人類(lèi)和人工智能編碼者之間的協(xié)作。以更高抽象級(jí)別編寫(xiě)的更小的代碼庫(kù)使人類(lèi)開(kāi)發(fā)人員能夠更快、更容易地理解、修改并維護(hù)人工智能生成的代碼,從而更快地開(kāi)發(fā)出更高質(zhì)量的代碼。
更快的部署和測(cè)試
目前,部署和測(cè)試云應(yīng)用程序可能需要幾分鐘。當(dāng)多迭代周期疊加時(shí),就會(huì)有很大的改進(jìn)潛力。特別是,隨著我們的人工智能朋友幫我們加速了代碼編寫(xiě),與代碼編寫(xiě)相比,在每個(gè)迭代周期中測(cè)試和驗(yàn)證所花費(fèi)的時(shí)間比例就變得越來(lái)越重要了。
一種普遍的解決方案是在本地運(yùn)行測(cè)試,繞過(guò)云部署。然而,這種方法也帶來(lái)了自身的挑戰(zhàn),因?yàn)樗枰?a href="http://www.ttokpm.com/analog/" target="_blank">模擬測(cè)試組件周?chē)脑骗h(huán)境。因此,這些測(cè)試的范圍受到了限制,通常需要在云上運(yùn)行的補(bǔ)充測(cè)試來(lái)確認(rèn)實(shí)際環(huán)境中的代碼功能。
然而,這并不是旅程的終點(diǎn)。此類(lèi)解決方案主要用于自動(dòng)化測(cè)試,而開(kāi)發(fā)人員經(jīng)常希望在開(kāi)發(fā)過(guò)程中與應(yīng)用程序進(jìn)行手動(dòng)交互,或?qū)で蟾鞣N利益相關(guān)方(產(chǎn)品、銷(xiāo)售、管理、潛在用戶(hù)等)的反饋。在沒(méi)有云部署及其相關(guān)時(shí)間損失的情況下實(shí)現(xiàn)這一點(diǎn)仍然是一個(gè)挑戰(zhàn)。
因此,我們需要能夠生成既可以在本地運(yùn)行,也可以在云上運(yùn)行,并能快速執(zhí)行的測(cè)試。此外,我們必須支持云應(yīng)用程序的快速部署,并為利益相關(guān)方的驗(yàn)證提供方便。
通過(guò)實(shí)現(xiàn)這一點(diǎn),我們可以顯著地提高迭代速度,無(wú)論代碼是由人工智能、人類(lèi)還是它們一起協(xié)作創(chuàng)建的。
那么,我們?nèi)绾螌⑦@一愿景變?yōu)楝F(xiàn)實(shí)呢?
引入 Wing
Wing 是一種用于云開(kāi)發(fā)的新編程語(yǔ)言,它使人類(lèi)和 AI 開(kāi)發(fā)人員都能在更高的抽象級(jí)別上編寫(xiě)云代碼,并且它還附帶了一個(gè)本地模擬器,可以讓開(kāi)發(fā)人員快速地進(jìn)行測(cè)試。
?
量化改進(jìn)
正如我們將在下面演示的那樣,我們討論的是代碼減少 90%-95%,測(cè)試速度提高幾個(gè)數(shù)量級(jí)。
我們來(lái)看一下代碼
以下是一個(gè)小應(yīng)用程序的示例,它使用了云函數(shù)(AWS Lambda、Azure Function 或 GCP Cloud Function)將文件上傳到 bucket(比如 AWS S3、Azure Blob Storage 或 GCP Bucket)上。
這是 Wing 中的代碼:
?
bring cloud; let bucket = new cloud.Bucket(); new cloud.Function(inflight () => { bucket.put("hello.txt", "world!"); });
?
正如你所看到的那樣,無(wú)論是人類(lèi)還是 AI 編碼者編寫(xiě)的 Wing 代碼,它們都是在較高的抽象級(jí)別上工作的,使 Wing 編譯器能夠處理底層的云機(jī)制,如 IAM 策略和網(wǎng)絡(luò)(別擔(dān)心,它是可定制和可擴(kuò)展的,能確保你在需要時(shí)對(duì)其進(jìn)行控制)。
與人類(lèi)和 AI 編碼者不同,編譯器是絕對(duì)可靠的。此外,它的速度更快,更具確定性,并且不會(huì)隨著時(shí)間的推移而丟失上下文。因此,我們把更多的責(zé)任委托給編譯器,而不是給人類(lèi)或人工智能,結(jié)果也就更好。
編譯器可以為任何云提供商調(diào)整應(yīng)用程序,從而人們只需知道并維護(hù)更高級(jí)別的、與云無(wú)關(guān)的代碼即可。生成的編譯構(gòu)件、Terraform 和 JavaScript 可以使用經(jīng)過(guò)驗(yàn)證的可靠工具進(jìn)行部署。
現(xiàn)在,讓我們來(lái)看看同樣的代碼在當(dāng)今領(lǐng)先的云開(kāi)發(fā)棧之一——Terraform+JavaScript 中的表現(xiàn)。
?
main.tf: terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 3.0" } } } provider "aws" { region = "us-west-2" } locals { lambda_function_name = "upload_hello_txt_lambda" } resource "aws_s3_bucket" "this" { bucket = "my-s3-bucket" acl = "private" } data "archive_file" "lambda_zip" { type = "zip" source_file = "index.js" output_path = "${path.module}/lambda.zip" } resource "aws_lambda_function" "this" { function_name = local.lambda_function_name role = aws_iam_role.lambda_role.arn handler = "index.handler" runtime = "nodejs14.x" filename = data.archive_file.lambda_zip.output_path timeout = 10 environment { variables = { BUCKET_NAME = aws_s3_bucket.this.bucket } } } resource "aws_iam_role" "lambda_role" { name = "lambda_role" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "lambda.amazonaws.com" } } ] }) } resource "aws_iam_role_policy" "lambda_policy" { name = "lambda_policy" role = aws_iam_role.lambda_role.id policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ] Effect = "Allow" Resource = "arnlogs*:*" }, { Action = [ "s3:PutObject" ] Effect = "Allow" Resource = "${aws_s3_bucket.this.arn}/*" } ] }) } output "bucket_name" { value = aws_s3_bucket.this.bucket } output "lambda_function_name" { value = aws_lambda_function.this.function_name } index.js: const AWS = require('aws-sdk'); const S3 = new AWS.S3(); exports.handler = async (event) => { const bucketName = process.env.BUCKET_NAME; const key = 'hello.txt'; const content = 'Hello world!'; const params = { Bucket: bucketName, Key: key, Body: content, }; try { await S3.putObject(params).promise(); return { statusCode: 200, body: JSON.stringify('File uploaded successfully.'), }; } catch (error) { console.error(error); return { statusCode: 500, body: JSON.stringify('Error uploading the file.'), }; } };
?
正如你所看到的那樣,Wing 代碼只有 7 行長(zhǎng),而 Terraform 和 JavaScript 的代碼有 122 行,或者說(shuō)多了 17 倍的代碼。不僅如此,它還深入到了云堆棧的較低層。
你可能想知道是否還有更新的解決方案能將 Wing 的收益比下去,或者是否可以通過(guò)庫(kù)或語(yǔ)言擴(kuò)展實(shí)現(xiàn)相同的結(jié)果。你可以在這里查看 Wing 與其他解決方案的比較,以及為什么它是一種新語(yǔ)言而其他解決方案不是。
用 Wing 進(jìn)行測(cè)試
Wing 開(kāi)箱即用,配有一個(gè)本地模擬器和一個(gè)可視化的調(diào)試控制臺(tái)。
這些工具使開(kāi)發(fā)人員能夠通過(guò)近乎即時(shí)的熱重載方式來(lái)處理代碼,并可以非常容易地測(cè)試云應(yīng)用程序,而無(wú)需模擬周?chē)脑骗h(huán)境。
在上面我們那個(gè)非常簡(jiǎn)單的應(yīng)用程序示例中,為了運(yùn)行測(cè)試而部署到任何云提供商都需要將近一分鐘的時(shí)間,而使用 Wing Simulator 只需要不到一秒鐘的時(shí)間,或者說(shuō)少了兩個(gè)數(shù)量級(jí)。此外,使用 Wing,你可以在不模擬云的情況下編寫(xiě)測(cè)試,并在模擬器和云上運(yùn)行相同的測(cè)試。
你可以在 Wing Playground 上親身體驗(yàn)。
結(jié)? ?論
盡管 Wing 在云開(kāi)發(fā)方面引入了重大的改進(jìn),但我們知道,遷移到一種新語(yǔ)言是一項(xiàng)艱巨的任務(wù),在許多情況下可能難以證明其合理性。
我們竭盡全力通過(guò)以下功能來(lái)使該語(yǔ)言的采用變得盡可能容易:
很容易學(xué),因?yàn)樗推渌Z(yǔ)言很相似。
能與現(xiàn)有的堆棧和工具(尤其是部署和管理)無(wú)縫協(xié)作。
成熟的生態(tài)系統(tǒng)——能將任何的 NPM 模塊或 Terraform 資源導(dǎo)入到代碼中。
集成到現(xiàn)有的代碼庫(kù)中——能用其他語(yǔ)言編寫(xiě)運(yùn)行時(shí)代碼,并用 Wing 引用該代碼。
此外,我們相信,在人工智能時(shí)代,采用 Winglang 這樣的新語(yǔ)言對(duì)人類(lèi)來(lái)說(shuō)更容易,因?yàn)槿斯ぶ悄苡兄谟貌皇煜さ恼Z(yǔ)言和框架來(lái)編寫(xiě)代碼,并簡(jiǎn)化了現(xiàn)有代碼向新語(yǔ)言的遷移。
隨著我們邁向人工智能在代碼開(kāi)發(fā)中扮演更重要角色的未來(lái),像 Winglang 這樣語(yǔ)言的創(chuàng)建和采用將確保人類(lèi)和 AI 開(kāi)發(fā)人員更好的協(xié)作、更快的開(kāi)發(fā)和更高質(zhì)量的應(yīng)用。
想要一窺未來(lái),體驗(yàn)在 Wing 中編寫(xiě)代碼并立即進(jìn)行測(cè)試,可以訪問(wèn)我們的游樂(lè)場(chǎng)。
審核編輯:劉清
評(píng)論
查看更多