最近跟身边的程序员老杆子讨论需求时,惊奇的发现,他居然没使用AI编程助手。一时间有2个想法从大脑闪过,然后心里还带了一丝轻蔑:
不过确实有一些老杆子是用过AI编程助手,又选择了放弃,具体啥原因,我们来聊聊。首先说说市面上常用的几款AI编程助手。
GitHub Copilot是由GitHub和OpenAI联合推出的AI编程助手,是我最早使用的一款编程助手。刚推出时我立马尝鲜,真香!当时立马感觉解放了许多生产力。对于中文的理解以及生成的代码质量我还是满意的。
但是,因为价格的原因(一年需要1000多元),我一直使用的学生版和代理版。但是半年前发现GitHub对于代理版和学生版查的比较严,Copilot经常掉线,在加上服务器本来就在国外,有时候生成代码的响应速度确实有些慢,渐渐地放弃了。
文心快码(Comate),是百度推出的AI编程助手。放弃了GitHub Copilot之后,在国内寻找,当时发现可用的基本就是文心快码了。试用了一段时间后,觉得生成代码的速度还行,但是代码的准确率或者被采用率,有点堪忧。
不过当时想着免费嘛,就随便用用吧,不合适的代码一个ESC
键也就过了,合适的代码一个TAB
键就采纳了,多少也能节省些工作量吧。
毕竟当时我 对于 不熟悉的领域 或者 大片段的代码,都是让ChatGPT生成的,我使用文心快码的主要场景是辅助生成一些简单或重复的代码。
通义灵码是阿里巴巴推出的AI编程助手,基于强大的Qianwen2大模型。通义灵码是我最近正在使用的AI编程助手。
一次偶然的机会,我被邀参加阿里的一个AI沙龙会,当时有一个小专题是讲通义灵码的。本来用文心快码时觉得效果一般,心里想着,通义灵码估计也就那样吧。
后来看那位宣讲通义灵码的哥们,激情满满,特别自豪,好像这款产品是他造出来的。这倒引起了我的好奇心。当时,他自豪地说他们的大模型怎么好怎么牛,通义灵码做了多少多少的微调,做了多少多少的优化,他们对安全是怎么怎么重视。
虽说,他的话我不全信,但真的是被他当时的激情所感染(也许是出于一个产品人的同理心吧)。
当晚,我就试用了通义灵码。安不安全的我不知道,但是,生成代码的速度挺快。随后,我又写了1个小时的代码测试,发现生成的代码正确率和被采用率还不错,后来就一直在用了。
通过这次选择,更加说明一个道理自助者天助之。一个产品人一定要对自己的产品充满自行。即使是一名程序员,在AI时代,也要将自己看做一个产品人。
ChatGPT真的是永远的No1。要说生成代码的准确率和自然语言的理解力,即使是中文场景,ChatGPT也是最好的。
下面是一个ChatGPT与通义灵码针对同一需求实现代码的小示例,朋友们可以自行感受下。
需求
我有一个Html文件,想批量替换里面的font-size的数值,放大两倍。还要替换line-height的数值,也是放大两倍。请你用java写出代码
ChatGPT实现
import java.io.*;
import java.nio.file.*;
import java.util.regex.*;
public class HtmlFontSizeLineHeightMultiplier {
public static void main(String[] args) {
String filePath = "htmlFile.html";
try {
String content = new String(Files.readAllBytes(Paths.get(filePath)));
String updatedContent = updateFontSizeAndLineHeight(content);
Files.write(Paths.get("updatedHtmlFile.html"), updatedContent.getBytes());
System.out.println("File updated successfully.");
} catch (IOException e) {
e.printStackTrace();
}
}
private static String updateFontSizeAndLineHeight(String content) {
// Pattern to match font-size and line-height in CSS
Pattern fontSizePattern = Pattern.compile("font-size\\s*:\\s*(\\d+(\\.\\d+)?)(px|em|rem|%)", Pattern.CASE_INSENSITIVE);
Pattern lineHeightPattern = Pattern.compile("line-height\\s*:\\s*(\\d+(\\.\\d+)?)(px|em|rem|%)", Pattern.CASE_INSENSITIVE);
// Replace font-size values
Matcher fontSizeMatcher = fontSizePattern.matcher(content);
StringBuffer updatedContent = new StringBuffer();
while (fontSizeMatcher.find()) {
String originalValue = fontSizeMatcher.group(1);
String unit = fontSizeMatcher.group(3);
double newValue = Double.parseDouble(originalValue) * 2;
fontSizeMatcher.appendReplacement(updatedContent, "font-size: " + newValue + unit);
}
fontSizeMatcher.appendTail(updatedContent);
// Replace line-height values
Matcher lineHeightMatcher = lineHeightPattern.matcher(updatedContent.toString());
updatedContent = new StringBuffer();
while (lineHeightMatcher.find()) {
String originalValue = lineHeightMatcher.group(1);
String unit = lineHeightMatcher.group(3);
double newValue = Double.parseDouble(originalValue) * 2;
lineHeightMatcher.appendReplacement(updatedContent, "line-height: " + newValue + unit);
}
lineHeightMatcher.appendTail(updatedContent);
return updatedContent.toString();
}
}
通义灵码实现
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HtmlFontSizeModifier {
public static void main(String[] args) {
String inputFilePath = "path/to/input.html"; // 输入文件路径
String outputFilePath = "path/to/output.html"; // 输出文件路径
try {
modifyFontSizesAndLineHeights(inputFilePath, outputFilePath);
} catch (IOException e) {
System.err.println("Error processing file: " + e.getMessage());
}
}
/**
* 修改HTML文件中的font-size和line-height值为原来的两倍。
*
* @param inputPath 输入文件路径
* @param outputPath 输出文件路径
* @throws IOException 如果文件处理过程中出现错误
*/
public static void modifyFontSizesAndLineHeights(String inputPath, String outputPath) throws IOException {
try (BufferedReader reader = new BufferedReader(new FileReader(inputPath));
BufferedWriter writer = new BufferedWriter(new FileWriter(outputPath))) {
String line;
Pattern fontSizePattern = Pattern.compile("(font-size:\\s*([0-9]+)(px|em|rem))");
Pattern lineHeightPattern = Pattern.compile("(line-height:\\s*([0-9]+)(px|em|rem))");
while ((line = reader.readLine()) != null) {
Matcher fontSizeMatcher = fontSizePattern.matcher(line);
Matcher lineHeightMatcher = lineHeightPattern.matcher(line);
if (fontSizeMatcher.find()) {
String fontSize = fontSizeMatcher.group(2);
String unit = fontSizeMatcher.group(3);
double newSize = Double.parseDouble(fontSize) * 2;
line = line.replaceFirst(fontSizeMatcher.group(), "font-size: " + newSize + unit);
}
if (lineHeightMatcher.find()) {
String lineHeight = lineHeightMatcher.group(2);
String unit = lineHeightMatcher.group(3);
double newLineHeight = Double.parseDouble(lineHeight) * 2;
line = line.replaceFirst(lineHeightMatcher.group(), "line-height: " + newLineHeight + unit);
}
writer.write(line);
writer.newLine();
}
}
}
}
可以看到,在对于需求的理解上ChatGPT更好,在实现正则匹配的逻辑方面ChatGPT也更完善。
对于AI编程助手的选择,我的建议是双管齐下:ChatGPT + 国内某个大厂的AI编程助手。
核心原因有3个:
AI编程助手的背后是大语言模型和强大的算力。在大模型的基础上,进行了编程领域的代码和文档的微调训练,使其更加使用编程场景。
具体在编程时,AI助手会根据你的代码注释、函数名、代码文件等上下文信息,结合之前已经喂给它的开源代码库,生成与当前需求有相关性的代码片段。
目前,仍有许多开发者由于种种原因对AI编程助手持排斥态度,我们确实也要承认AI编程助手有缺点,但是也有许多优点。
之前看过一个数据,中国约有1000万程序员,预计有200多万在使用AI编程助手,而且数字一直在飙升。我也从一些渠道了解到有些开发者不愿意使用AI编程助手,原因如下:
对于部分开发者和企业担心的安全问题,我有几点想说:
AI的定位一直都是助手,而且AI会越来越强大。AI未来一定会淘汰码农,但是AI一定会与优秀的开发者共生。开发者应该抓住这个时代的机会,努力让自己成为一个超级个体。
在未来的超级个体时代,知识的掌握已经不再是唯一的重要因素。随着AI技术的发展,更多的创意、资源整合能力和产品能力将成为核心竞争力。
AI编程助手能够处理大量的重复性工作,释放开发者的创造力。开发者可以将更多的时间和精力投入到创新和创意上,开发出更好的产品。
经过了这一轮的经济的洗礼,有点企业倒闭了,有的企业活下来了。即使是活下来的企业,相信也学会了更灵活的用工方式。未来,有了AI的加持,个体的能力一定会被放大。届时,企业一定更倾向于找独立的个体合作。
本篇主要聊了几款AI编程助手、它的工作原理、它的优缺点、超级个体等等。我鼓励开发者积极拥抱AI,让自己成为一个全栈开发者和超级个体,让AI帮助自己释放更多的生产力和创意,让自己充满无限可能。
本篇完结!欢迎 关注、加微信(yclxiao)交流、全网可搜(程序员半支烟)!!!