前言
幾個月前在Discord上看到有人直播分享螢幕,縮圖是vscode,不免好奇點進去看看在做些什麼有趣的事。
只見他輸入描述到對話框中,等待幾十秒檢視專案後,畫面跳出更新專案的對話確認框,詢問是否採用此版本。採用後,程式依然有問題,於是他又直接輸入對話,表示程式有bug,要求重新檢視並進行修復,就這樣重複了3輪一樣的動作。
眼看他一直鬼打牆,忍不住提醒了一句:下方的log有告訴你在第幾行第幾列出現錯誤哦!然後,他停頓了半秒,平淡的回覆我:我不會寫程式,我只是在讓AI幫我做事。幾個禮拜後,陸陸續續在國外各討論區看到Vibe coding一詞,才知道原來是這麼一回事。
AI工具協作
作為軟體開發,現階段工作上的使用,AI對我來說是一個更高階的搜索工具,也許以前要爬好爬滿stackoverflow、CSDN、GeeksforGeeks、reddit等討論區或技術文章,拼拼湊湊才能完成預想的功能實作,現在只要下好問題描述,很快就能得到一版可以動的雛形。
案例
使用copilot做為測試,要求提供一個程式,讀取資料庫拿到資料後轉成csv格式的檔案,實際描述我會傾向給予較明確的關鍵詞,例如:
給我一個java撰寫的程式,把oracle內資料表透過JDBC讀取後,輸出成csv檔案
import java.io.FileWriter;
import java.io.IOException;
import java.sql.*;
public class OracleToCSV {
public static void main(String[] args) {
String jdbcUrl = "jdbc:oracle:thin:@your_host:1521:your_db";
String username = "your_username";
String password = "your_password";
String query = "SELECT * FROM your_table";
String csvFile = "output.csv";
try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);
FileWriter writer = new FileWriter(csvFile)) {
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
// 寫入 CSV 標頭
for (int i = 1; i <= columnCount; i++) {
writer.append(metaData.getColumnName(i));
if (i < columnCount) writer.append(",");
}
writer.append("\n");
// 寫入 CSV 資料
while (rs.next()) {
for (int i = 1; i <= columnCount; i++) {
writer.append(rs.getString(i));
if (i < columnCount) writer.append(",");
}
writer.append("\n");
}
System.out.println("CSV 檔案已成功產生:" + csvFile);
} catch (SQLException | IOException e) {
e.printStackTrace();
}
}
}
優化
如果要進行優化,你會如何重構
要優化這段程式碼,我會考慮以下幾個方面:
1. 使用參數化 SQL 來防止 SQL 注入,並提高查詢的安全性。
2. 使用try-with-resources
來確保資源正確釋放,這樣程式碼會更簡潔且降低潛在的記憶體洩漏風險。
3. 利用StringBuilder
來提高字串處理效率,特別是在寫入 CSV 檔案時。
4. 允許動態指定輸出檔案,讓程式更加靈活。
5. 考慮使用 OpenCSV 或 Apache Commons CSV 來簡化 CSV 生成流程。
import java.io.FileWriter;
import java.io.IOException;
import java.sql.*;
public class OracleToCSV {
private static final String JDBC_URL = "jdbc:oracle:thin:@your_host:1521:your_db";
private static final String USERNAME = "your_username";
private static final String PASSWORD = "your_password";
private static final String QUERY = "SELECT * FROM your_table";
public static void main(String[] args) {
String outputFile = args.length > 0 ? args[0] : "output.csv";
exportToCSV(outputFile);
}
public static void exportToCSV(String csvFile) {
try (Connection conn = DriverManager.getConnection(JDBC_URL, USERNAME, PASSWORD);
PreparedStatement stmt = conn.prepareStatement(QUERY);
ResultSet rs = stmt.executeQuery();
FileWriter writer = new FileWriter(csvFile)) {
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
StringBuilder sb = new StringBuilder();
// 寫入 CSV 標頭
for (int i = 1; i <= columnCount; i++) {
sb.append(metaData.getColumnName(i));
if (i < columnCount) sb.append(",");
}
sb.append("\n");
writer.write(sb.toString());
// 清空 StringBuilder 用於寫入資料
sb.setLength(0);
// 寫入 CSV 資料
while (rs.next()) {
for (int i = 1; i <= columnCount; i++) {
sb.append(rs.getString(i));
if (i < columnCount) sb.append(",");
}
sb.append("\n");
}
writer.write(sb.toString());
System.out.println("CSV 檔案已成功產生:" + csvFile);
} catch (SQLException | IOException e) {
e.printStackTrace();
}
}
}
結語
姑且不論產業影響或人力取代,可以確定的是熟悉使用AI工具的人肯定更有優勢,技術學習成本也會越來越低,整體市場也更加競爭,因此訓練洞察力,能夠精準定位問題,會是凸顯能力的一大方向。