隨著 AI 技術的快速發展,軟體開發領域正經歷著巨大的變革。GitHub Copilot 和 ChatGPT 等 AI 輔助工具的出現,不僅大幅提升了開發效率,也改變了開發者的工作流程。這些工具能夠自動生成程式碼、提供程式碼建議、協助除錯,甚至參與到軟體設計的早期階段。然而,許多開發者尚未充分意識到這些工具的潛力,也缺乏有效使用這些工具的技巧。本文旨在彌合這一差距,提供關於 AI 輔助程式設計的全面,幫助開發者掌握這些新興技術,並將其應用於日常工作中。從程式語言的演進歷程到 AI 工具的實際應用,本文涵蓋了廣泛的主題,包括提示工程、GitHub Copilot 的進階用法、ChatGPT 的多種應用場景,以及其他 AI 輔助程式設計工具的介紹。

人工智慧輔助程式設計

在六週內將向量搜尋整合到 Cassandra 中的過程中,GitHub Copilot 和 ChatGPT 成為我們達到期限的關鍵,然而大多數開發者尚未充分利用這些 AI 工具。Tom Taulli 的《人工智慧輔助程式設計》是一本讓開發者輕鬆上手的人工智慧工具的入門書,能夠節省你大量的試錯時間。

—Jonathan Ellis,DataStax 共同創辦人兼技術長

《人工智慧輔助程式設計》是一本出色的資源,展示了 Tom 專業技術知識,並為讀者提供了軟體開發當前演進的工具,讓每個人都能更輕鬆地編寫程式。

—Justin Dorfman,Sourcegraph 開源社群經理

AI 快速改變了開發者構建軟體的方式。從程式碼編輯器到終端機等各種工具中,AI 助手正變得無所不在。任何希望從日常工作流程中最大化 AI 功能的開發者,都應該把《人工智慧輔助程式設計》作為第一本參考書。

—Zach Lloyd,Warp 執行長兼共同創辦人

Tom Taulli 的這本文是一場探討如何利用 AI 工具如 ChatGPT 改變開發者命運的旅程,無論你是新手還是經驗豐富的專家。它分享了 AI 助力編寫程式的起起落落,就像我從行銷和業務轉向生產環境中推播功能的旅程一樣。對於希望利用 AI 作為其工具箱的一部分的程式設計師來說,這本文非常適合。

—Titus Capilnean,Private Market Labs 共同創辦人

AI 已經改變了開發遊戲規則。每位程式設計師都需要了解如何使用像 GitHub Copilot 這樣的工具。Tom 的這本文展示瞭如何做到這一點。

—Muddu Sudhakar,Aisera 執行長兼共同創辦人

AI 已改變開發遊戲規則

玄貓認為AI已經顯著改變了軟體開發的遊戲規則。從最初的向量搜尋整合到 Cassandra 中,GitHub Copilot 和 ChatGPT 已經成為不可或缺的工具。這些工具不僅加快了開發速度,還提高了程式碼品質和開發效率。然而,許多開發者仍未充分利用這些先進技術。

向量搜尋整合案例

在六週內將向量搜尋整合到 Cassandra 中的過程中,我們面臨許多挑戰。首先,我們需要理解向量搜尋的基本原理和應用場景。向量搜尋是一種高效的資料檢索方法,透過將資料轉換為向量形式來進行比較和查詢。

from cassandra.cluster import Cluster
from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np

# 連線到 Cassandra 叢集
cluster = Cluster(['127.0.0.1'])
session = cluster.connect('my_keyspace')

# 初始化 TF-IDF Vectorizer
vectorizer = TfidfVectorizer()

# 模擬資料
documents = ["This is a sample document.", "Another sample document."]

# 轉換文字資料為向量
tfidf_matrix = vectorizer.fit_transform(documents)

#### 內容解密:
這段程式碼展示瞭如何將文字資料轉換為向量形式以進行向量搜尋
首先我們使用 Cassandra  Python 驅動程式連線到 Cassandra 叢集
接著我們初始化了一個 TF-IDF Vectorizer 物件來進行文字轉換
最後我們將模擬資料轉換為 TF-IDF 向量矩陣

在實際應用中,我們需要處理更複雜的資料集和更高效的向量化方法。此外,我們還需要考慮向量儲存和檢索的效能問題。

GitHub Copilot 和 ChatGPT 的應用

在這個案例中,GitHub Copilot 和 ChatGPT 成為我們達到期限的關鍵。這些 AI 工具能夠自動生成程式碼、提供建議並幫助除錯問題。例如,當我們需要快速生成某些函式或類別時,Copilot 可以根據上下文自動完成程式碼。

def calculate_similarity(vector1, vector2):
    # 計算兩個向量之間的相似度
    return np.dot(vector1, vector2) / (np.linalg.norm(vector1) * np.linalg.norm(vector2))

#### 內容解密:
這段程式碼定義了一個計算兩個向量相似度的函式
它使用點積除以兩個向量長度之積來計算餘弦相似度
GitHub Copilot  ChatGPT 在這個過程中提供了顯著幫助

除了自動生成程式碼外,ChatGPT 還可以幫助我們解釋複雜的演算法和概念。例如,當我們需要了解某個特定演算法的細節時,ChatGPT 可以提供詳細解釋和範例程式碼。

# 使用 ChatGPT 提供詳細解釋
print("ChatGPT can provide detailed explanations of algorithms and concepts.")

未來趨勢與預測

隨著 AI 技術不斷進步,《AI-Assisted Programming》將成為每位開發者必備的一本文籍。玄貓預測未來 AI 助力編寫會更加普遍化並且逐漸深入各行各業中。

AI 是軟體開發新紀元

AI 已經顯著改變了軟體開發的方式,《人工智慧輔助程式設計》展示瞭如何利用這些先進技術來提高效率和程式碼品質。隨著更多開發者採用 AI 工具,軟體開發將進入一個全新時代。玄貓認為AI是軟體開發新紀元之始端。

新世代程式開發者的世界

從基礎到現代:AI工具改變一切

玄貓在1980年代初期開始寫程式,第一台電腦是Atari 400。當時的電腦並不強大,只有膜鍵盤、8KB的記憶體,且程式是從錄音帶中讀取。玄貓學習了BASIC語言,創作了簡單的遊戲和實用應用程式。隨著時間的推移,玄貓升級到更強大的機器,並學習了Pascal、C和C++等語言。當時的整合開發環境(IDE)除了一些語法顯示和除錯功能外,沒有太多變化。

然而,隨著GitHub Copilot和ChatGPT的出現,一切都改變了。這些工具讓玄貓感受到像第一次拿到iPhone那樣的驚喜。透過自然語言,玄貓可以要求ChatGPT寫程式碼。在VS Code中,輸入函式片段後,GitHub Copilot可以生成完整的程式碼塊。這些工具不僅可以處理許多繁瑣的任務,還能幫助開發者進行腦力激盪、草擬需求檔案,甚至編寫單元測試。

AI輔助程式設計:未來必備技能

玄貓深信AI輔助程式設計將成為程式開發者必備的技能之一。這些工具不僅可以生成程式碼,還能幫助開發者進行腦力激盪、草擬需求檔案,甚至編寫單元測試。這本文旨在幫助開發者理解和掌握這些新興技術,並提供實用的指導和建議。

本文內容概覽

以下是本文各章節的簡要介紹:

第一章:「新世代程式開發者的世界」

本章探討生成式AI如何改變程式設計師的工作方式。這些AI工具幫助開發者更多地關注宏觀思維,而不是微觀細節。此外,本章還回顧了程式語言的歷史演進和先進AI技術如GPT-4。

第二章:「AI程式設計技術的運作原理」

本章介紹生成式AI及其在程式設計中的應用。進一步探討了轉換模型和大語言模型(LLM)在程式設計中的重要性,並透過OpenAI Playground展示如何操作這些AI模型。

第三章:「提示工程(Prompt Engineering)」

本章提供關於如何有效使用AI輔助程式設計工具的實用建議。包括如何處理冗長或模糊的提示以及避免AI生成錯誤資訊等技巧。

第四章:「GitHub Copilot」

本章深入介紹GitHub Copilot這一強大工具。涵蓋了其核心功能如建立帶有註解的程式碼、Chat功能以及AI驅動的命令列介面。還介紹瞭如何自定義系統以適應專有程式碼函式庫。

第五章:「其他AI輔助程式設計工具」

本章詳細介紹了其他頂級AI輔助程式設計工具,如Amazon CodeWhisperer、Google Duet AI 和Replit等。

第六章:「ChatGPT及其他通用LLMs」

本章探討如何使用這些工具來處理正規表示式、起始程式碼和GitHub Actions等任務。

第七章:「創意、規劃與需求分析」

本章重點介紹如何使用聊天機器人啟動軟體專案。包括創意激盪、市場調查、需求檔案撰寫和測試驅動開發等主題。

第八章:「編碼」

本章涵蓋了常見的開發情景,無論是處理API、使用模組化程式設計還是重構程式碼。還介紹了函式處理和麵向物件程式設計等內容。

第九章:「除錯、測試與佈署」

本章聚焦於開發中的不那麼光鮮亮麗的一面。包括如何修復錯誤、使用AI輔助程式設計工具進行程式碼審查、撰寫單元測試以及描述提取請求等內容。

本文獨特之處

軟體開發者通常依賴確定性來確保輸入特定資料時總能獲得相同的輸出結果。然而,使用AI輔助程式設計工具時,結果會因為機率性而有所不同。每次使用相同提示進行操作時可能會獲得不同的結果。雖然這看似有些混亂,但一旦適應之後會發現其價值所在。因此書中特別安排了一章關於提示工程(Prompt Engineering),以幫助讀者適應這種新型態的編寫方式。

誰應該閱讀這本文

這本文適合任何程度的開發者閱讀,無論你是剛起步還是已經有多年經驗。

本文使用約定

以下是本文中使用的一些排版約定:

  • 斜體:表示新詞彙、網址、電子郵件地址、檔案名稱和檔案副檔名。
  • 等寬字型:用於程式列表及段落中參照的專案(例如變數或函式名稱)。

開發者的新世界

在斯坦福大學進行密集的神經網路架構和電腦視覺研究期間(2011至2016年),Andrej Karpathy同時也在Google任職。在那裡,他開發了一個用於YouTube影片的特徵學習系統。之後,他成為OpenAI的創始成員之一,並在特斯拉擔任AI高階總監,帶領團隊開發自動駕駛系統。

毫無疑問,Karpathy是全球頂尖的程式設計師之一。他也擁有出色的文字表達能力,Twitter(或X)追隨者近80萬。當ChatGPT登上舞台時,他發推文說:

最新流行的程式語言是英語。

這不是單純的詩意表達,而是對未來的展望:使用自然語言提示即可生成程式碼。這就像電腦裡有一個能理解英文指令並轉換為程式碼命令的雙語精靈。

接著又有一條推文反映了許多開發者的心聲:

Copilot顯著加快了我的編碼速度,很難再回到「手動編碼」。雖然還在學習如何使用它,但它已經寫了我約80%的程式碼,準確率約80%。我幾乎不再編碼,我只需要提示並編輯。

Karpathy這樣說是在致敬Microsoft的GitHub Copilot,這是一款AI輔助編碼工具。但很快,許多其他工具也相繼登場。創新速度之快令人驚嘆。

對於所有程式設計師來說,這個新世界可能看起來像是密林。AI工具在哪裡表現出色?在哪裡表現平平?又該如何在這些工具中找到自己的方向?

這本文將引導你回答這些問題——以及更多。重點將放在如何利用這些工具進行更快、更聰明且有趣的編碼。讓我們捲起袖子,開始這次AI輔助編碼的旅程。

抽象化的演變與革命

程式語言演變的一個關鍵主題是抽象化。這是描述系統變得更容易被開發者使用的一種方式。當繁瑣的細節被處理在背後時,開發者可以專注於最重要的事情。這一直是推動創新的動力,促成了像網際網路、雲端計算、移動裝置和AI等突破。

圖 1-1 展示了幾十年來抽象化的演變。

圖示1-1:幾十年來程式語言和工具抽象化演變

graph TD
    A[機器語言] --> B[組合語言]
    B --> C[高階語言]
    C --> D[現代語言及AI輔助編碼]

此圖示展示了從機器語言到高階語言再到現代語言及AI輔助編碼工具的演變過程。

詳細探討

從1940年代開始:

機器語言到組合語言

在電腦時代的黎明期,程式設計師必須使用0和1來操控機器。隨後,組合語言出現了。它提供了字母數字指令,使編碼更加簡單且不容易出錯。

高階語言

1950年代帶來了Fortran和COBOL等語言,這些語言允許程式設計師使用類別似簡單英文的指令進行編碼,如DISPLAY、READ、WRITE和IF/THEN/ELSE。編譯器會將這些指令轉換為電腦可以理解的0和1。同時,即使是非技術背景的人也能夠理解程式碼工作流程。高階語言的出現將成為電腦革命的一大催化劑。

接下來我們將探討現代語言及其應用情境、潛在優缺點、以及如何選擇適合自己的工具與策略。

# 假設這是一段Python程式碼範例
def greet(name):
    return f"Hello, {name}!"

print(greet("World"))

內容解密:

  • 功能定義def greet(name)定義了一個名為greet的函式,它接受一個引數name
  • 字串格式化f"Hello, {name}!"使用Python 3.6引入的f-string來格式化字串。
  • 函式呼叫print(greet("World"))呼叫greet函式並傳遞引數"World",然後列印傳回結果。
  • 技術選型考量:此範例選擇Python作為示範語言因為其簡潔且易於理解。
  • 潛在改進點:可以考慮增加錯誤處理以應對空引數或非字串型別引數。

未來章節將探討更多具體案例與技術細節。

程式設計與程式語言的演進

程式設計的歷史可以追溯到數十年前,當時的程式語言如C和Pascal引入了程式設計中的「程式式程式設計」,這種方式將複雜的任務封裝成稱為函式的小模組。這種抽象化技術使得程式碼可以重複使用和維護,大大簡化了管理龐大軟體專案的難度。

物件導向程式設計(OOP)

隨著時間的推移,物件導向程式設計(OOP)成為另一種重要的程式設計正規化。C++和Java是這類別語言的代表,OOP透過類別和物件來模擬真實世界中的實體,將資料和行為封裝在一起。這種方法促進了模組化,並使問題解決更加直觀。

指令碼語言與網頁開發

Python、Ruby和JavaScript等指令碼語言則進一步抽象化了程式設計中的低階任務。它們提供豐富的函式庫和內建資料結構,簡化了常見的程式設計任務,減少了實作這些任務所需的程式碼量。

機器學習與人工智慧

隨著人工智慧(AI)和機器學習(ML)的興起,TensorFlow和PyTorch等專門函式庫和框架抽象化了許多複雜的數學細節。這使得開發者能夠專注於模型架構和訓練過程。

AI輔助程式設計

最近進入這個抽象化故事的是AI輔助程式設計,例如GPT-4和其他大語言模型(LLMs)。這些模型就像你背後的工作人員,隨時準備在你需要時生成程式碼。

具體範例

讓我們看一個簡單的例子。假設我們使用ChatGPT來生成Python程式碼,檢查一個給定的整數是否為偶數或奇數。我們可以給它以下提示:

# 提示:在Python中寫一個程式,檢查給定的整數是否為偶數或奇數並列印結果。

這樣我們就能得到如圖所示的回應。

內容解密:

  • 提示設計:這裡我們設計了一個簡單明瞭的提示,要求生成特定功能的Python程式碼。
  • 回應形式:ChatGPT會提供完整的程式碼列表,並附上有用的註解來說明每一部分功能。
  • 執行與驗證:可以直接將生成的程式碼複製到IDE中執行。

生成式AI

在探討AI輔助程式設計工具之前,我們先了解一下生成式AI。這是這些系統的基礎。

生成式AI是人工智慧的一個分支,能夠創造新穎且獨特的內容。以下圖示展示了不同AI型別之間的關係。

graph TD
    A[AI] --> B[Machine Learning]
    B --> C[Deep Learning]
    C --> D[Generative AI]
    D --> E[Large Language Models]

AI架構

人工智慧是一個大範疇,包括所有能夠完成需要人類智慧才能解決任務的系統。在AI之下是機器學習(ML),它不依賴明確指令而是根據大量資料來產生見解。機器學習通常根據複雜演算法進行預測或決策,而不需要硬編碼。

進一步來看深度學習(DL),這是機器學習的一部分,利用多層神經網路進行深度學習。這些模型在影像識別和語音識別等領域表現出色。

在深度學習之中,我們找到生成式AI(GenAI)。GenAI模型創造新資料以反映其訓練資料。

而在最核心處坐落的是大語言模型(LLMs),如GPT-4、Gemini、Claude和LLaMA 2等。這些強大模型利用先進演算法和巨量資料生成接近人類文字。

然而生成式AI不僅僅是LLMs。它也具備多模態能力,即能夠創造影像、音訊和影片等多種形式內容。

接下來我們將探討如何使用生成式AI來輔助編寫程式碼。

AI輔助編寫工具

AI輔助編寫工具旨在提升開發者能力,使其能夠專注於高階問題解決及創新而非陷入單調重複或複雜細節中。因此GitHub稱其為「Copilot」很貼切。「Copilot」就像你駕駛太空梭時那個可靠的飛行員同事,協助你穿越編寫過程中的繁瑣細節並集中精力於真正重要之處。

搜尋時間減少

開發者經常需要花費大量時間尋找錯誤或理解難解程式碼。當遇到困難時他們通常會上網搜尋Google或存取Stack Overflow尋求答案。但有時候這會變得困難重重:Stack Overflow上的討論可能毫無幫助;更多搜尋也未必能找到精確答案;甚至需要從相關話題中延伸探索;看YouTube影片試圖解答問題;花上30分鐘甚至更久才能解決問題。

據Stack Overflow 2022年開發者調查顯示:62%的開發者每天花超過30分鐘尋找答案;25%的人則每天花超過一小時。據此調查結果計算:「對於50人的團隊而言,每週因尋找答案而浪費時間總計達333至651小時。」

假如有一種方法可以快速穿越搜尋困境直接找到解決方案呢?AI輔助編寫即是為此而生。微軟研究顯示:90%以上使用GitHub Copilot 的開發者可以更快完成工作;微軟甚至進行了一場對決:他們邀請95位專業開發者進行JavaScript HTTP伺服器撰寫比賽;結果使用GitHub Copilot 的開發者比不使用者快55%完成任務。而McKinsey & Company研究也顯示類別似結果支援GitHub Copilot效率提升效果。

  graph TD
    G[G]
    A[需求] --> B[搜尋答案]
    B --> C[網頁搜尋]
    B --> D[Stack Overflow]
    B --> E[相關話題探索]
    B --> F[YouTube影片]
    C --> G{有效答案?}
    D --> G
    E --> G
    F --> G
    G -- 無效 --> B
    G -- 有效 --> H[實施解決方案]

內容解密:

  • 需求驅動:開發者遇到問題時首先會嘗試網路搜尋、存取Stack Overflow、探索相關話題或觀看YouTube影片。
  • 決策點:如果找到有效答案則實施解決方案;反之則繼續搜尋。
  • 效率問題:傳統方法耗時且效率低下。
  • 最佳化方案:AI輔助工具如GitHub Copilot可快速提供有效答案減少搜尋時間。

在接下來章節中我們將進一步探討這些強大系統具體應用及好處。