[工作經驗] 用 ChatGPT 加速軟體開發流程

ChatGPT 問世已經一段時間了,但我一直沒試著將它融入平常的軟體開發,因為之前問的問題覺得好像還是無法取代 Google 或是 StackOverflow。直到同事說他用 ChatGPT 幫他寫平常不熟悉的程式語言,我才覺得好像應該來試用看看?

試用了一個月之後,我發現 ChatGPT 還真的對軟體開發加速了不少,以下是我平常愛用的一些方法。


結合多個簡單的答案: 1+1>2

我知道怎麼用 Python 讀取檔案嗎? 簡單,用 with open

我知道怎麼用 Python 搜尋資料夾底下所有的檔案嗎? 大概 Google 一下就知道

但我知道要如何計算資料夾底下、任何有包含某個字串的檔案數量嗎? 大概要花我 5 分鐘 Google 好幾篇文章然後自己想辦法用一些 for 迴圈組合起來。

但如果我把這樣的問題丟給 ChatGPT:


How do you find the number of files that contain a certain substring in all the files under a directory recursively with python 3?

ChatGPT 就能在 10 秒內給出答案:


import os
import fnmatch

def count_files_with_substring(directory, substring):
    count = 0
    for root, dirs, files in os.walk(directory):
        for file in files:
            file_path = os.path.join(root, file)
            if fnmatch.fnmatch(file, '*.*'):  # filter by file extension if needed
                with open(file_path, 'r') as f:
                    content = f.read()
                    if substring in content:
                        count += 1
    return count

# Example usage
directory_path = '/path/to/directory'
substring_to_search = 'example'

file_count = count_files_with_substring(directory_path, substring_to_search)
print(f"Number of files containing '{substring_to_search}': {file_count}")

繼續追問,修改答案

如果他給的答案我們覺得有修改的空間,那就可以繼續追問,跟他提出哪邊要修改的小建議,讓他把答案更完善。

因為我想搜尋的檔案可能都很大,如果我不想用 with open 去一行一行讀取,而是直接用 Linux 內建的工具 grep 來做呢? 我就可以繼續追問下去:


I want to call grep, don't open the file


我原本預期的可能只是把上面的答案做個小修改,只是改成用 subprocess 呼叫罷了。沒想到卻能出現更簡單的解法,直接靠 grep 本身就能做到:


import subprocess

def count_files_with_substring(directory, substring):
    command = ['grep', '-r', '-l', substring, directory]
    try:
        output = subprocess.check_output(command, universal_newlines=True)
        file_list = output.strip().split('\n')
        return len(file_list)
    except subprocess.CalledProcessError:
        return 0

# Example usage
directory_path = '/path/to/directory'
substring_to_search = 'example'

file_count = count_files_with_substring(directory_path, substring_to_search)
print(f"Number of files containing '{substring_to_search}': {file_count}")


也代表我對 grep 工具其實沒有這麼熟。

平常在實作上的一些小細節,我發現我已經慢慢喜歡用 ChatGPT 去問他怎麼把多個我覺得很簡單的解法拼湊在一起,讓我省下大量 Google 的時間。

快速上手新的程式語言/軟體/Library

由於公司內部的 C++ 編譯器並不是用 CMake,因此如果我們想使用像是 VSCode + clangd 強大的開發工具就會遇到一個小難題:沒有 compile_commands.json,而另一個常見的處理工具 Bear 也裝不起來。

在前公司習慣寫 Python scripts 去解決這樣問題的我,其實漸漸地對用 Python 寫 scripts 感到排斥,主要就是因為 Python 的 packages 很難管理。如果我們要讓 CLI scripts 好用,就不得不裝一些好用的 packages,但是要給同事使用時就會常常遇到版本或是 PYTHONPATH 的一些問題,最後導致一些 CLI 好用的功能我都不靠 packages 手刻出來,花了很多心力在維護 CLI scripts 的基礎問題:例如 readline 或是 colorful logging。

用過一些好用的 Rust CLI 工具之後,發現 Rust 最後的執行檔和 C++ 編譯出來的很像,只要有一個 executable 就能執行,我就想用 Rust 來寫 script 想很久了。

在假日有空的時候,我就想了一個辦法,雖然公司的 C++ 是用 Makefile,但是也會有 g++ 的 commands 留下來,我何不設計一個 Rust script 來把這些 C++ commands 轉換成 compile_commands.json 呢?

但我對 Rust 其實才剛開始學基礎,從來沒寫過比較複雜的程式。

沒錯,這時候我就想到可以請 ChatGPT 幫忙,從一些基礎的問題開始問 ChatGPT 如何用 Rust 來寫,流程大概是這樣:

  1. 先拼湊出外殼,我想要 parse arguments,於是 ChatGPT 教會我使用 clap
  2. 我想要讀取檔案,一行一行處理,於是 ChatGPT 告訴我可以使用 BufReader
  3. 我想要用 regex,於是我發現了可以用 once_cell + regex 產生 static Regex,我請教 ChatGPT 語法上要怎麼寫
  4. ChatGPT 告訴我可以用一個 function 去做 parsing,但他回傳的格式是 tuple,我問他如何改用類似 C++ struct/Python dataclass 的方式回傳,他就說,Rust 也有 struct 啊
  5. 我一開始都用 str& 處理字串,遇到了 scope 方面的 lifetime 問題,詢問 ChatGPT 某個錯誤訊息是什麼意思,後來大概搞懂,就不再堅持用 str&,開始改用回傳包含 String 的 struct
  6. 功能完成後,我問 ChatGPT 要如何用類似 Python 的 logging,並且讓 user 可以用 --log-level 的方式設定 level (e.g., Debug, Info, Warn, Error),我就請他教我如何用 log 來寫

整個 script 就在一天之內完成了,之後我也有點不敢置信,因為回頭看這個 script 我還是覺得好陌生,match 還有 Result 我很喜歡,但語法看起來總是很不直覺。

如果要我不靠 ChatGPT 來寫這個 script,我看我可能得花上一周的時間不斷地 Google 與自學才有辦法達到。

除了程式語言,同樣地 ChatGPT 也快速地幫助我了解一些我從來沒碰過的軟體或是剛剛上手的 library。當然要翻那些軟體的 documentation 也是可以找到答案,可是你知道有些文件就是寫的密密麻麻,或是一開始該找什麼樣的關鍵字都不知道。但 ChatGPT 能聰明地猜出來你想要做什麼。

了解軟體概念

最近在看 Clean Architecture 的書,但是對於其中的一些概念 (REP, CCP, CRP) 的三角關係怎麼想都想不懂,於是我就把這樣學術的問題丟給 ChatGPT,並且多問了他以下這些概念來讓我從不同面向瞭解這些術語:

  • 你能不能跟我解釋不用 REP/CCP/CRP 會發生什麼事?
  • 你能不能給我一些使用 REP/CCP/CRP 的例子?
  • REP 和 CRP 都有 reuse,他們的差異在哪裡?
  • 我們有辦法同時完美地達成 REP + CCP + CRP 嗎?

ChatGPT 跟我重複解釋了每個術語的定義好幾次,雖然有時候覺得好像懂了,但是回到三角關係圖還是覺得沒有完整理解,直到我逼他用生活例子解釋:

  • 你可以給我一些生活的比喻說明什麼是 REP/CCP/CRP 嗎?
  • REP 和 CRP 好像,你可以再用生活的比喻比較他們嗎?

ChatGPT 用番茄醬、工具箱、書架、還有 LEGO 來比喻,我終於才發現 REP 的專注點是一個 components 可以 reused 到多個 projects;而 CRP 專注在相似的 components 收集在同個位置。

於是我們可以學到,如果想要了解一個抽象的問題,或許可以請 ChatGPT 用不同角度來回答,而生活的例子就是其中一種我們熟悉的角度。

設計 Test Case

只要你給 ChatGPT 很詳盡的 design spec,他就可以寫出還不錯的程式碼給你。但我就發現有時候他會出錯。

這就讓我們有點不想使用 ChatGPT,我們會心想:你寫出來的 code 到底是不是對的?

很自然而然地,我們就會繼續追問 ChatGPT:你可以寫 unit test code 讓我們來測試看看你寫的 code 是不是正確的?

我才訝異地發現,他輕鬆地就寫出很容易看懂的 unit test code,讓我們很簡單地可以改成我們想要的樣子。

以下是我們在讀書會上和同事一起想到的例子:

  • 給了詳盡的 design spec 後 (function 名稱,有哪些 member variables,function 有什麼功能),請 ChatGPT 用 C++ 寫出一個可以處理 RGB 而且可以轉換成 HSV 的 C++ class
  • 再請 ChatGPT 用 GoogleTest 寫出 unit tests

寫文件

尤其在解釋某個網路上有大量資訊的概念時,例如我想要在文件中簡單介紹剛剛提到的 Clangd 有哪些功能,官方文件的文字實在太多了,我真的懶得一條一條吸收然後簡化,我就只是想要一個簡單的 bulleted list 而已啊。

於是我就問 ChatGPT 很簡單的問題:


what are the clangd features

沒想到他回答的就剛好是我預期的格式:


1. Code completion: Clangd offers intelligent code completion suggestions as you type, helping you quickly access relevant functions, variables, and symbols within your codebase.
2. Diagnostics and error checking: Clangd performs static analysis of your code and provides real-time diagnostics, highlighting syntax errors, semantic issues, and potential bugs. These diagnostics help you catch errors early in the development process.
3. Symbol navigation: Clangd allows you to navigate through your codebase efficiently. You can jump to the definition of a symbol, find all references to a symbol, or navigate through the hierarchy of classes, functions, and variables.
4. Refactoring support: Clangd assists with code refactoring by providing automated suggestions and tools for renaming symbols, extracting code into functions or methods, and organizing code into appropriate namespaces or modules.
5. Signature help: When writing function calls, Clangd provides signature help, displaying the parameters, types, and documentation for the function you are invoking. This feature helps you ensure that you provide the correct arguments to functions.
6. Find and rename symbols: Clangd allows you to search for specific symbols across your codebase and rename them consistently throughout your project. This feature saves time and ensures consistency when refactoring code.
7. Code formatting: Clangd supports code formatting based on the clang-format tool. It can automatically format your code according to predefined or custom formatting rules, improving code readability and maintainability.
8. Code documentation: Clangd assists with code documentation by providing information about symbols, including their documentation comments and associated Doxygen-style documentation. This helps you understand the purpose and usage of symbols in your codebase.
9. Integration with development environments: Clangd can be integrated with various development environments, such as Visual Studio Code, Vim, Emacs, and others, providing a consistent and feature-rich development experience across different editors.


但我嫌他有點太長了,於是我叫他把後面的文字弄短一點:


can you make the description after each colon shorter

於是他就改成我比較滿意的答案:


1. Code completion: Provides intelligent suggestions as you type.
2. Diagnostics and error checking: Performs static analysis and highlights issues in real-time.
3. Symbol navigation: Allows you to jump to definitions and find references.
4. Refactoring support: Assists with code refactoring and organization.
5. Signature help: Provides function parameter information when invoking functions.
6. Find and rename symbols: Enables searching and consistent renaming of symbols.
7. Code formatting: Supports automatic code formatting based on predefined rules.
8. Code documentation: Provides information about symbols and associated documentation.
9. Integration with development environments: Can be integrated with various editors for a consistent experience.


再經過一些手動修改,就可以放到我們團隊的內部文件中。

修飾回覆同事/客戶的英文

我們打的英文或許文法上沒有錯誤,但有時就覺得有點文謅謅的。如果我們這樣問 ChatGPT:


Is the sentence corrrect: "check the directory where the test case was"

ChatGPT 會說文法沒有錯,但會建議你其實可以改成:


Check the directory where the test case was located


讓我們不管在回覆客戶或是寫 spec 的時候更順暢自然。

這在公司內部的聊天軟體也非常適用,如果同事跟你說了不好意思,我或許就會問 ChatGPT 要如何 "簡短地" 回覆同事:


my colleague said "sorry for inconvience", how should I reply to him in chat, indicating that it's okay but don't be too polite, give me some examples


ChatGPT 就會給一些比較自然的回覆:

  • No worries, it's all good!
  • No problem, no need to apologize.
  • It's alright, don't sweat it.
  • No big deal, we can handle it.
  • Thanks for letting me know, but no inconvenience at all.

對於經常 WFH 的我們來說,這樣回覆也比較貼近面對面的交談的感覺。

問 ChatGPT 如何問 ChatGPT

這是我在某一篇 Medium 文章看到的技巧,有時候我們要的東西還很模糊,不太確定到底要問些什麼,就像在對於不熟主題的會議中硬要我問些什麼問題,也會很吃力,拜託別問我這種感覺。

例如我們已經寫 code 寫了一陣子了,但是如果想做一份投影片把某個心得分享給同事或主管,要如何問 ChatGPT 要怎麼準備投影片呢? 投影片有一堆呈現的方式,像圖片一堆的、文字為主的、各種動畫亂跑的、還有各種酷炫的流程圖,我到底要注意哪些地方? 

這時候我們就可以問 ChatGPT,如何問問題:


how do I write a good ChatGPT prompt to ask about how to design good PowerPoint slides to present to my managers

ChatGPT 就會給出我們問問題很常遺漏的細節,例如:

  • 記得說簡報的目標是什麼
  • 問如何抓住觀眾的注意力
  • 可以問如果要保持專業,如何選字體、顏色、背景
  • 我們的 topic 是什麼

也會給出問句的範例。

但這一招我很少使用,通常只有在想了解比較抽象的概念時才會用這一招。

防止商業機密外洩

公司最怕的就是我們把程式碼或是商業機密丟到 ChatGPT 中,不然有可能就會發生例如 Samsung 員工在 ChatGPT 上洩密的事件。

因此如果公司信任我們使用 ChatGPT,也有相關的 policy,我們更應該要遵守,並且謹慎地把包含商業機密或是可以辨認的細節給 censor 掉。

在前面的例子中,其實有不少例子都是我真實用在工作上問 ChatGPT 的問題,但我已經把包含商業機密的部分拿掉了,例如說上面 Python 要搜尋什麼樣的字串,這個就可能含有商業機密,所以我只說 "a certain substring"。

當問句同時出現多個商業機密的時候,其實簡單地用 A, B, C 代替就可以了,例如:


In Python 3, I have two functions A and B that both call function C multiple times but function A does some extra processing at the end.
How do I refactor the code to maximize reusability?


我們要想成在 ChatGPT 上面問的問題,就好比在 StackOverflow 上問問題一樣。我們不想給其他公司工程師看到的細節,也不要在 ChatGPT 透漏。

結語

在還沒使用 ChatGPT 之前,我很難想像 ChatGPT 到底對於我們幫助在哪。我們都對自己的專業很有信心,但我們沒想過 ChatGPT 可以幫助我們探索一些從來不知道的解法,也其實可以簡化我們平常工作的一些繁瑣細節。

據說 ChatGPT 使用率不到 20%,或許只是我們還尚未了解到底要怎麼使用 (就要靠 prompt engineering 了)。除了軟體開發以外,我也經常用在生活方向上,對我來說 AI 已經是一個滿可靠的小幫手了。


留言

此網誌的熱門文章

[試算表] 追蹤台股 Google Spreadsheet (未實現損益/已實現損益)

[Side Project] 互動式教學神經網路反向傳播 Interactive Computational Graph

[插件] 在 Chrome 網頁做區分大小寫的搜尋