面向雲程式設計的宣言。
別誤會我的意思,我喜歡雲!它使我能夠建立令人驚嘆的東西,並徹底改變了我使用軟體創新和解決問題的方式。
它是「新電腦」、終極電腦、「無電腦電腦」。它可以彈性擴展,永遠在線,無處不在,可以做任何事情。這是無邊無際的。它肯定會留在這裡。
但天哪,這絕對不是我們在未來十年內建立雲端應用程式的方式。隨著雲端從“我不想讓伺服器放在我的辦公桌下”發展到“我的應用程式需要30 個不同的託管服務來執行其任務”,我們有點忘記了優秀的開發人員體驗是什麼樣子的。
為雲端建立應用程式有時感覺就像把我孩子的袋子裡未使用的樂高積木灑滿了客廳地板並試圖建造一座城堡。在經歷了撕碎的撲克牌、可怕的芭比娃娃頭和漏電的電池之後,你讀了第一百萬次說明書,卻發現你最終建造的東西與上次建造的東西基本上相同。
分類樂高積木很有趣!和孩子們一起打發時間。它甚至滿足了我的強迫症……但見鬼,這不是我想要建立專業軟體的方式!
讓我試著描述一下我和我的開發人員朋友正在努力解決的問題。
當我建立專業軟體時,我希望將大部分時間花在應用程式的功能領域,而不是我使用的平台的非功能機制。
每次我想要在 AWS Lambda 函數內執行程式碼時,我都必須了解它需要與 tree-shaken 依賴項捆綁在一起,作為 zip 檔案上傳到 S3 並透過 Terraform 部署,這是沒有意義的。或者,為了能夠向 SNS 發布訊息,我的 IAM 策略必須有一個允許對主題的 ARN 執行sns:Publish
操作的語句。每個開發人員都需要了解 ARN 是什麼嗎?
所有這些東西與我試圖為用戶創造的價值沒有任何關係。這是純粹的力學。我們能擺脫它嗎?
作為一名開發人員,最令人沮喪和最扼殺流程的情況之一是我必須停下來等待某人或某事才能繼續前進。
就像快樂地在空中滑翔,欣賞風景,欣賞優美的背景音樂,突然,砰!混凝土牆。
當您為雲端建立應用程式時,這堵混凝土牆有多種形狀和尺寸。是 DevOps 人員排隊;需要更新的是 IAM 策略;是只有外部兼職顧問才知道如何除錯的部署失敗;我們希望內部平台中不斷積壓的缺失旋鈕和 API 能夠改變一切。
這些障礙令人沮喪,因為它們迫使我切換環境,應用「臨時」安全策略,並發明我不想談論的醜陋駭客。這是一個破碎的世界。
我想獨立。我希望能夠把事情做好,保持順其自然。我想一次一點地改善世界,並在完成後繼續下一件事。我想要完成任務時的多巴胺激增,而不是另一個未完成的線程的羞恥感。
我說過我想要獨立,但不要誤以為我會寫完美的程式碼。這就是為什麼我想用鉛筆而不是鋼筆寫程式碼。
有些開發人員可以花一整天的時間進行編碼,甚至無需呼叫編譯器,最終,他們進行編譯和部署,然後就可以正常工作了。
我很欽佩他們,但我不是那種類型的開發人員。不,先生。對我來說,這就是迭代、迭代、迭代。我從小處開始,用輕鉛筆畫草圖,看一看,擦掉一堆東西,畫一條更粗的線,後退一步,瞇著眼睛,畫更多,擦掉更多,再看一眼,沖洗並重複。
這就是為什麼對我來說,最重要的是迭代速度。我越早執行並測試我的應用程式,我就能越快地返回並迭代。這就是我的流量所在。
當我開始程式設計時,我使用 Borland C++。過去,在 IBM PC AT 機器(TURBO ON)上編譯和執行一個程式大約需要 100ms。雲端中的平均迭代周期需要幾分鐘。分鐘!有時要幾十分鐘!
這是當今雲端中迭代的樣子:我對程式碼進行了更改;然後我需要編譯它;將其部署到我的測試帳戶;找到管理控制台的方式來實際觸發它;等待它執行並去搜尋
登入另一個服務。然後我意識到有一個錯誤回應告訴我我很愚蠢,因為我怎麼不知道我必須傳入 Accept-Content: application/json,否則我會得到一些名為「XML」的奇怪結果我不知道該怎麼辦(開個玩笑,XML 很棒,不是真的)。現在一切又重新來過…
因此,您說“編寫單元測試”,以居高臨下的方式試圖證明當前的現實是合理的。 「偉大的開發人員編寫單元測試」。好的!因此,現在我需要獲取我的程式碼,該程式碼進行了大約20 個外部API 呼叫,並透過從過時的文件中複製並貼上它們來以某種方式模擬API 回應,結果卻發現我的請求被拒絕了,因為我缺少了一些隱式操作我的 IAM 安全聲明。我們都去過那裡。
說實話,給我90年代的開發者經驗。我想要進行更改,並且希望能夠以互動方式或透過在幾毫秒內的單元測試來測試此更改,並且我想坐在沒有 WiFi 的飛機上執行此操作,好嗎? (我們在 90 年代沒有 WiFi)。
一定不行!我是電腦程式編制員。有時我覺得我從出生起就一直在寫軟體。我一直在社會危險的時期這樣做,當時成為電腦極客並不酷。
我一直喜歡成為開發人員,因為如果我對自己的工具不滿意,我可以製作自己的工具。畢竟,製造工具已經融入了我們的 DNA——人類製造工具的歷史已經超過一百萬年。
我對我的工具不滿意。
2022 年 4 月,我與好朋友、前微軟同事 [Shai Ber] 聯手,創立了 [Wing],其使命是為開發者解鎖雲端。我們聚集了一群令人難以置信的美麗極客,他們與我們一樣對開發人員體驗和開源充滿熱情,並開始了我們的旅程,使開發人員(即我們自己)能夠解決這些基本問題。
那麼我們該如何一次解決所有這些問題呢?
我們正在為雲端建立一種程式語言。
「一種程式語言!? 」你問。 “世界上沒有足夠的程式語言嗎? ”,“編寫一個編譯器真的很難嗎? ”, “開發人員想要學習一門全新語言的機會有多大? ”,“為什麼不能你侵入了現有的語言工具鏈,瞇起眼睛,然後就到此為止了嗎? ”
我不是一個心血來潮就建立程式語言的人。事實上,我花了過去五年的時間建立 [AWS CDK],這是一個多語言庫,它允許開發人員使用他們最喜歡的程式語言定義雲端基礎設施,從而解決了我正在談論的一些挑戰。
「滿足開發人員所在的位置」是 AWS 和 CDK 的美好宗旨,它激勵我們建立 [JSII] 和 [constructs] 等出色的技術。
但有時,「他們在哪裡」並不是一個足夠好的模型來創造所需的體驗。
用程式碼定義基礎設施確實使我們能夠建立更高層級的抽象,但只要我的應用程式程式碼需要與此基礎設施交互,抽象就變得太[洩漏]。我被迫要了解比我需要的更多的知識,而且我必須成為 IAM、VPC、ALB、EBS 等領域的專家,基本上還有比我想記住的更多的 TLA。
我們今天使用的語言都是圍繞著電腦是一台機器的想法而設計的。他們已經達到了能夠為我們提供對這些機器的可靠抽象的程度。它們抽象化了 CPU、記憶體、檔案系統、行程管理和網路。作為開發人員,我不必關心文件在磁碟上的佈局方式,甚至不必關心哈希映射需要多少記憶體。我只需寫readFile()
或new Dictionary()
即可開始我的一天。是的,對我來說,了解幕後發生的事情並不是一個壞主意,但我並不是被迫這樣做。
大多數這些語言還為我提供類型安全。當我使用錯誤數量的參數呼叫函數時,我的編譯器會對我大喊大叫。我不必等到我的應用程式執行時才意識到我忘記了參數,或者傳遞了錯誤的類型。
在雲端,我獨自一人。每當我的程式碼需要與雲端資源或服務互動時(隨著產業的發展,這種情況越來越多)我必須放棄程式語言的舒適性和安全性。我必須跳出機器的邊界,進入網路的狂野西部,而我的編譯器卻一無所知。
突然之間,所有痛苦的來源幾乎變得非常明顯。如今的雲端應用程式只是由互不相連的部分拼湊而成。我有一個用於我的基礎設施的編譯器,另一個用於我的函數,另一個用於我的容器,另一個用於我的 [CI/CD 管道]。每個機器都非常認真地對待自己的工作,並讓我在每台機器中保持安全和快樂,但我的應用程式不再在單台機器上執行,我的應用程式在雲端上執行。
雲就是計算機。
當新的程式設計範式出現時,語言需要時間來迎頭趕上。我曾經喜歡用 C 語言建立物件導向的程式碼,但它是一個有漏洞的抽象。我必須了解物件在記憶體中的佈局方式、[V 表] 的工作原理,並記住將物件作為每個函數的第一個參數傳遞。當程式語言開始像一等公民一樣支援物件導向的概念時,這種範式就民主化了,今天大多數開發人員甚至不知道 V 表是什麼,世界一直在旋轉。
Wing ,或者winglang,如果你想可愛一點的話,它擁有你所期望的現代、面向物件、強類型和通用語言的所有好東西,但它還包括一些額外的原語,旨在支持分佈式雲作為一等公民的基於服務的性質。
我們在 Wing 上的工作已經快一年了,我很高興邀請您查看並告訴我您的想法。雖然仍處於 Alpha 階段,尚未準備好投入生產使用,但已經可以用它來建立一些實際的應用程式。
https://github.com/winglang/wing