什么样的代码让人一眼就能看出是AI写的?
作为一个前端老coder🙎♂️,经常写业务代码且使用AI工具,我谈谈自己的看法。
🔍要回答这个问题,首先我们要明确人和AI的区别。
用户在写代码时,是有“感情的”:
用户的语法可能不完美,但通常较简单,会为自己留后路。用户可能在“屎山”代码上不断加工,最终形成一坨臃肿的代码,也许自己都不完全理解。用户可能不写注释,也可能写很多自己能看懂的注释。用户拥有创新力,代码有时天马行空,令人匪夷所思。
而AI通过大量数据进行训练,依赖预定的算法和目标函数生成答案,追求最优解,但始终是“冷血”的、机械的🙅。
由此,我们可以推断AI代码的风格:
1️⃣ 过度简洁标准化
AI生成的代码,不会考虑新手还是老手,它会力求简洁,可能用到一些不常用的属新。
比如,要实现一个空数组的过滤,普通人可能都会这么写
const filterEmptyData = (data) => {
if (!data.length) return []
const filterData = data.filter(item => {
return item !== null && item !== undefined && item !== '';
});
return filterData;
}
上述代码虽然冗长,但几乎所有开发都能看懂它在干什么。我们在看看AI生成的代码:
const filterEmptyData = (data) => data.filter(Boolean)
AI代码非常简洁,它也实现了同样的效果,但基础不好的人根本看不懂这段代码的意思,不明白它的工作原理。
2️⃣ “没有感情”的注释
用户的注释可能很粗糙,可能下次看自己也看不懂
再看看AI的注释,很完整全面,但又很机械,谁写true还用truthy?谁会写这么多无意义且格式一样的注释?
console.log(!!0); // false
// 数字0是假值,!0 的结果是 true,再次取反,!!0的结果就是false
console.log(!!'0'); // truthy
// 字符0是真值,!'0' 的结果是 false,再次取反,!!'0'的结果就是 true
console.log(!!1); // truthy
// 数字1是真值,!1 的结果是 false,再次取反,!!1的结果就是true
console.log(!!''); // false
// 字符''是假值,!'' 的结果是 true,再次取反,!!''的结果就是false
console.log(!!'hello'); // truthy
// hello是真值,!'' 的结果是 false,!!''的结果就是true
3️⃣ 复杂但完美的代码
AI在写代码时,考虑的会很通用,很多时候,它写的代码包含冗长的错误处理,力求代码完美。
function sortByKey(arr, key) {
// Check if the input is an array
if (!Array.isArray(arr)) {
throw new Error('Input must be an array');
}
// Check if the key is provided and is a string
if (typeof key !== 'string') {
throw new Error('Key must be a string');
}
// Handle empty array case
if (arr.length === 0) {
return [];
}
// Sort the array by the specified key, handling missing keys and nested objects
return arr.sort((a, b) => {
let aValue = a[key] !== undefined ? String(a[key]) : '';
let bValue = b[key] !== undefined ? String(b[key]) : '';
// Return comparison result (ascending order)
if (aValue bValue) {
return -1;
}
if (aValue > bValue) {
return 1;
}
return 0;
});
}
// Example usage:
const data = [
{ id: 2, name: 'John' },
{ id: 1, name: 'Jane' },
{ id: 3, name: 'Alice' }
];
console.log(sortByKey(data, 'name'));
上面的代码用于给一个复杂对象进行排序,它很全面,代码非常健壮,处理了多种潜在的边界情况。但如果让我们自己来写,他可能长这样
function sortByKey(arr, key) {
return arr.sort((a, b) => {
if (a[key] b[key]) return -1;
if (a[key] > b[key]) return 1;
return 0;
});
}
写代码时,首先我考虑的是简单易懂。对于边界情况,那不是我需要考虑的事情,这个方法的数据永远是后端返回的,格式是固定的,如果数据有问题,那是后端的问题,与我无关。
4️⃣ 死板的代码
比如我们的项目已经引入有dayjs,要生成一个日期格式化函数,我们可能会这么写
export const formatTime = time => {
if (!time) return '--';
return dayjs(Number(time)).format('YYYY.MM.DD HH:mm:ss');
};
但AI不知道我们有dayjs,它生成的代码就比较通用,不考虑上下文内容,令人难以维护
export const formatDate = (date, fmt) => {
if (!date) return '--';
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
}
}
🎯 综上所述,判断代码是人写的还是AI生成的其实并不难。
通常,人写的代码更通俗易懂,虽然有时会存在一些“小瑕疵”,但这种“瑕疵”正是人类开发者的创造力和灵活性的体现 🎉。相比之下,AI生成的代码往往更加简洁、规范且“完美”,但它缺乏情感和上下文的考虑,常常显得机械和脱离实际业务需求。总的来说,人写的代码更有“温度”,而AI写的代码则更为冷静、无懈可击,但也因此缺乏了某些灵活性和人性化的细节。
赞34
踩0