自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

AI編程助手那些事兒

人工智能
本篇主要聊了幾款 AI 編程助手、它的工作原理、它的優(yōu)缺點(diǎn)、超級個(gè)體等等。

最近跟身邊的程序員老桿子討論需求時(shí),驚奇的發(fā)現(xiàn),他居然沒使用AI編程助手。一時(shí)間有2個(gè)想法從大腦閃過,然后心里還帶了一絲輕蔑:

  • AI編程助手這么好的東西,你居然不用。
  • 作為老程序員,你居然不跟上時(shí)代步伐,在想啥呢。

不過確實(shí)有一些老桿子是用過AI編程助手,又選擇了放棄,具體啥原因,我們來聊聊。首先說說市面上常用的幾款A(yù)I編程助手。

一、幾款A(yù)I編程助手

1.GitHub Copilot

GitHub Copilot是由GitHub和OpenAI聯(lián)合推出的AI編程助手,是我最早使用的一款編程助手。剛推出時(shí)我立馬嘗鮮,真香!當(dāng)時(shí)立馬感覺解放了許多生產(chǎn)力。對于中文的理解以及生成的代碼質(zhì)量我還是滿意的。

但是,因?yàn)閮r(jià)格的原因(一年需要1000多元),我一直使用的學(xué)生版和代理版。但是半年前發(fā)現(xiàn)GitHub對于代理版和學(xué)生版查的比較嚴(yán),Copilot經(jīng)常掉線,在加上服務(wù)器本來就在國外,有時(shí)候生成代碼的響應(yīng)速度確實(shí)有些慢,漸漸地放棄了。

2.文心快碼

文心快碼(Comate),是百度推出的AI編程助手。放棄了GitHub Copilot之后,在國內(nèi)尋找,當(dāng)時(shí)發(fā)現(xiàn)可用的基本就是文心快碼了。試用了一段時(shí)間后,覺得生成代碼的速度還行,但是代碼的準(zhǔn)確率或者被采用率,有點(diǎn)堪憂。

不過當(dāng)時(shí)想著免費(fèi)嘛,就隨便用用吧,不合適的代碼一個(gè)ESC鍵也就過了,合適的代碼一個(gè)TAB鍵就采納了,多少也能節(jié)省些工作量吧。

畢竟當(dāng)時(shí)我 對于 不熟悉的領(lǐng)域 或者 大片段的代碼,都是讓ChatGPT生成的,我使用文心快碼的主要場景是輔助生成一些簡單或重復(fù)的代碼。

3.通義靈碼

通義靈碼是阿里巴巴推出的AI編程助手,基于強(qiáng)大的Qianwen2大模型。通義靈碼是我最近正在使用的AI編程助手。

一次偶然的機(jī)會,我被邀參加阿里的一個(gè)AI沙龍會,當(dāng)時(shí)有一個(gè)小專題是講通義靈碼的。本來用文心快碼時(shí)覺得效果一般,心里想著,通義靈碼估計(jì)也就那樣吧。

后來看那位宣講通義靈碼的哥們,激情滿滿,特別自豪,好像這款產(chǎn)品是他造出來的。這倒引起了我的好奇心。當(dāng)時(shí),他自豪地說他們的大模型怎么好怎么牛,通義靈碼做了多少多少的微調(diào),做了多少多少的優(yōu)化,他們對安全是怎么怎么重視。

雖說,他的話我不全信,但真的是被他當(dāng)時(shí)的激情所感染(也許是出于一個(gè)產(chǎn)品人的同理心吧)。

當(dāng)晚,我就試用了通義靈碼。安不安全的我不知道,但是,生成代碼的速度挺快。隨后,我又寫了1個(gè)小時(shí)的代碼測試,發(fā)現(xiàn)生成的代碼正確率和被采用率還不錯(cuò),后來就一直在用了。

通過這次選擇,更加說明一個(gè)道理自助者天助之。一個(gè)產(chǎn)品人一定要對自己的產(chǎn)品充滿自行。即使是一名程序員,在AI時(shí)代,也要將自己看做一個(gè)產(chǎn)品人。

4.ChatGPT

ChatGPT真的是永遠(yuǎn)的No1。要說生成代碼的準(zhǔn)確率和自然語言的理解力,即使是中文場景,ChatGPT也是最好的。

下面是一個(gè)ChatGPT與通義靈碼針對同一需求實(shí)現(xiàn)代碼的小示例,朋友們可以自行感受下。

需求:

我有一個(gè)Html文件,想批量替換里面的font-size的數(shù)值,放大兩倍。還要替換line-height的數(shù)值,也是放大兩倍。請你用java寫出代碼

ChatGPT實(shí)現(xiàn):

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();
    }
}

通義靈碼實(shí)現(xiàn):

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 如果文件處理過程中出現(xiàn)錯(cuò)誤
     */
    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更好,在實(shí)現(xiàn)正則匹配的邏輯方面ChatGPT也更完善。

5.我推薦的用法

對于AI編程助手的選擇,我的建議是雙管齊下:ChatGPT + 國內(nèi)某個(gè)大廠的AI編程助手。

核心原因有3個(gè):

  • ChatGPT的自然語言理解能力是最強(qiáng)的,生成代碼的準(zhǔn)確率也是最強(qiáng)的,可以用來生成小塊需求代碼。
  • 國內(nèi)某個(gè)大廠的AI編程助手雖說在 自然語言理解能力 和 代碼的準(zhǔn)確率 方面可能弱一些,但是用來生成簡單重復(fù)代碼 和 完成簡單需求 這些方面是OK的。而且國內(nèi)的編程助手,生成代碼的速度都比較快。
  • 國內(nèi)大模型的發(fā)展速度我們親眼所見,雖說跟國外的大模型還有些差距,但也在不停的追趕。我們要對國內(nèi)大模型的發(fā)展有信心。

二、AI編程助手的工作原理

AI編程助手的背后是大語言模型和強(qiáng)大的算力。在大模型的基礎(chǔ)上,進(jìn)行了編程領(lǐng)域的代碼和文檔的微調(diào)訓(xùn)練,使其更加使用編程場景。

具體在編程時(shí),AI助手會根據(jù)你的代碼注釋、函數(shù)名、代碼文件等上下文信息,結(jié)合之前已經(jīng)喂給它的開源代碼庫,生成與當(dāng)前需求有相關(guān)性的代碼片段。

三、AI編程助手的優(yōu)缺點(diǎn)

目前,仍有許多開發(fā)者由于種種原因?qū)I編程助手持排斥態(tài)度,我們確實(shí)也要承認(rèn)AI編程助手有缺點(diǎn),但是也有許多優(yōu)點(diǎn)。

優(yōu)點(diǎn):

  • 提升效率節(jié)省時(shí)間:AI編程助手可以快速生成代碼,減少手動(dòng)編寫的工作量。尤其是在重復(fù)性高 和 常規(guī)邏輯的編程任務(wù)中,它能夠顯著提升效率,讓開發(fā)者有更多時(shí)間專注于核心邏輯和創(chuàng)新。
  • 代碼質(zhì)量的提升:有時(shí)候能感覺到,AI生成代碼質(zhì)量比我自己寫的好。
  • 加速獲取知識:通過AI編程助手,開發(fā)者可以快速獲取各種編程知識和技術(shù)方案,明顯縮短學(xué)習(xí)曲線。在寫代碼時(shí),它也能夠提供即時(shí)的建議,避免開發(fā)者長時(shí)間的搜索和查閱資料。這一點(diǎn),我感受非常深刻,記得兩年前學(xué)Flink和Golang時(shí),當(dāng)時(shí)掃過文檔之后,對應(yīng)如何實(shí)踐項(xiàng)目還是無從下手,幸好有AI編程助手,讓我快速學(xué)會了未知領(lǐng)域的知識,并且能快速做出項(xiàng)目。
  • 向AI學(xué)習(xí):開發(fā)者在與AI的交互過程中,也會不斷地接觸到新的代碼模式和最佳實(shí)踐,從而提升自己的編程能力和技術(shù)水平。

缺點(diǎn):

對復(fù)雜邏輯的處理能力有限:雖然編程助手在處理簡單和常見的代碼片段上的表現(xiàn)挺好,但是對于復(fù)雜邏輯的處理能力較弱。在涉及到復(fù)雜算法或者業(yè)務(wù)邏輯的情況下,基本上給不出合適的代碼。所以,大部分時(shí)候,AI編程助手生成的代碼仍然需要自己過一遍。

  • 存在安全隱患:在使用AI編程助手時(shí),需要將代碼丟給AI編程助手,然后它去猜測相關(guān)代碼。至于它拿到代碼,會不會做點(diǎn)什么,我們無從得知。
  • 容易存在依賴性:對于長期使用AI編程助手的開發(fā)者,很容易形成依賴性。大部分場景會養(yǎng)成等待AI生成的習(xí)慣,一旦離開了AI編程助手,確實(shí)有些不習(xí)慣。不過這一點(diǎn)算是仁者見仁智者見智吧,AI的發(fā)展是大勢,就像當(dāng)年的互聯(lián)網(wǎng)一樣,所有的不習(xí)慣未來都會變得像空氣一樣無處不在。
  • 容易養(yǎng)成不思考的習(xí)慣:長期使用AI編程助手的開發(fā)者,除了思考業(yè)務(wù)邏輯之外,大部分的代碼實(shí)現(xiàn)都懶得自己思考了。為了避免自己變得懶惰,每次AI助手生成代碼之后,我都會翻閱一遍,再與自己的思路做個(gè)對比。不過這也不一定算缺點(diǎn)吧,AI的出現(xiàn)不就是為了解放我們的思想和生產(chǎn)力嘛,不就是為了讓我們從一個(gè)簡單的執(zhí)行者,變成一個(gè)操盤者嘛。

四、為什么有的開發(fā)者不使用AI編程助手

之前看過一個(gè)數(shù)據(jù),中國約有1000萬程序員,預(yù)計(jì)有200多萬在使用AI編程助手,而且數(shù)字一直在飆升。我也從一些渠道了解到有些開發(fā)者不愿意使用AI編程助手,原因如下:

  • 自動(dòng)提示的災(zāi)難:在使用AI編程助手時(shí),幾乎每次敲擊都會生成提示代碼,這讓許多開發(fā)者覺得AI會打斷自己的思路,或者有時(shí)強(qiáng)迫癥,非要去看一眼AI提示代碼是否正確。這個(gè)痛點(diǎn)各大廠商都在極力解決,最近我已經(jīng)明顯感覺到觸發(fā)提示的地方變少了,相信會越來越智能的。
  • 安全隱患:部分個(gè)人和企業(yè)比較擔(dān)心使用AI助手會泄露自己的核心代碼,所以一直不敢用。雖然各大廠商都在極力宣傳自己的安全策略,極力強(qiáng)調(diào)自己不會存儲和使用代碼,但是好像沒人信。
  • 不愿意跟進(jìn)時(shí)代:有些開發(fā)者確實(shí)比較保守,故步自封,不愿意嘗試新事物。我倒是覺得,不管一個(gè)新事物好壞,起碼先嘗試下。
  • 低估AI的能力:有些開發(fā)者覺得AI的能力不行,寫的代碼不好。我倒是覺得AI的能力一直在增強(qiáng),而且某些方面比人強(qiáng)多了,沒必要那么自信,多嘗試幾次,你會發(fā)現(xiàn)AI在寫重復(fù)代碼和簡單邏輯方面還是很強(qiáng)的。把雜事兒丟給AI,自己多留點(diǎn)精力想想復(fù)雜業(yè)務(wù)問題,不是更香嘛。

對于部分開發(fā)者和企業(yè)擔(dān)心的安全問題,我有幾點(diǎn)想說:

  • 大廠沒必要拿你的代碼做二次訓(xùn)練,因?yàn)榇髲S如果想AI助手變得更好,他需要更多優(yōu)質(zhì)的代碼。你的代碼質(zhì)量未必有多好,他只會拿優(yōu)質(zhì)的開源代碼做訓(xùn)練。
  • 如果你的主營業(yè)務(wù)是賣代碼,估計(jì)你會擔(dān)心自己的核心資產(chǎn)泄露。大可不必?fù)?dān)心。因?yàn)锳I只會小片段的生成代碼,AI無法生成一個(gè)項(xiàng)目的完整代碼。
  • 如果你擔(dān)心大廠拿你的代碼去做業(yè)務(wù),那也不可能。以大廠的能力,要想做某塊業(yè)務(wù),肯定會與自己的也有業(yè)務(wù)相結(jié)合,不可能直接用你的代碼。而且,要是真想做某塊業(yè)務(wù),最好的辦法是收購你,不會拿你的代碼去用。講實(shí)在話,代碼有時(shí)候是負(fù)債,真正值錢的是你的業(yè)務(wù)。

五、未來的超級個(gè)體時(shí)代

AI的定位一直都是助手,而且AI會越來越強(qiáng)大。AI未來一定會淘汰碼農(nóng),但是AI一定會與優(yōu)秀的開發(fā)者共生。開發(fā)者應(yīng)該抓住這個(gè)時(shí)代的機(jī)會,努力讓自己成為一個(gè)超級個(gè)體。

在未來的超級個(gè)體時(shí)代,知識的掌握已經(jīng)不再是唯一的重要因素。隨著AI技術(shù)的發(fā)展,更多的創(chuàng)意、資源整合能力和產(chǎn)品能力將成為核心競爭力。

AI編程助手能夠處理大量的重復(fù)性工作,釋放開發(fā)者的創(chuàng)造力。開發(fā)者可以將更多的時(shí)間和精力投入到創(chuàng)新和創(chuàng)意上,開發(fā)出更好的產(chǎn)品。

經(jīng)過了這一輪的經(jīng)濟(jì)的洗禮,有點(diǎn)企業(yè)倒閉了,有的企業(yè)活下來了。即使是活下來的企業(yè),相信也學(xué)會了更靈活的用工方式。未來,有了AI的加持,個(gè)體的能力一定會被放大。屆時(shí),企業(yè)一定更傾向于找獨(dú)立的個(gè)體合作。

六、總結(jié)

本篇主要聊了幾款A(yù)I編程助手、它的工作原理、它的優(yōu)缺點(diǎn)、超級個(gè)體等等。我鼓勵(lì)開發(fā)者積極擁抱AI,讓自己成為一個(gè)全棧開發(fā)者和超級個(gè)體,讓AI幫助自己釋放更多的生產(chǎn)力和創(chuàng)意,讓自己充滿無限可能。

責(zé)任編輯:趙寧寧 來源: 程序員半支煙
相關(guān)推薦

2022-11-04 07:57:59

編程編碼編譯器

2011-06-08 09:19:26

Android JNI

2011-02-25 14:35:00

2018-09-26 06:50:19

2021-06-02 08:33:31

TPCTPC-H系統(tǒng)

2022-02-08 17:39:04

MySQL服務(wù)器存儲

2013-12-26 14:23:03

定位系統(tǒng)GPS監(jiān)測

2021-06-09 13:28:40

密碼安全身份認(rèn)證數(shù)據(jù)安全

2022-04-08 09:47:55

性能優(yōu)化開發(fā)

2022-05-13 14:36:12

網(wǎng)絡(luò)犯罪網(wǎng)絡(luò)攻擊密碼

2022-10-08 00:02:00

CSS工具系統(tǒng)

2017-05-18 16:30:29

Linux內(nèi)存管理

2010-09-14 11:36:24

上網(wǎng)行為管理網(wǎng)絡(luò)安全網(wǎng)康科技

2012-03-12 13:55:22

交互設(shè)計(jì)

2017-08-21 17:00:55

2016-03-02 09:34:03

runtime消息ios開發(fā)

2022-04-13 10:03:59

性能優(yōu)化性能分析工具JVM

2022-05-23 08:34:08

微前端微服務(wù)開發(fā)

2022-02-18 19:24:15

性能優(yōu)化代碼

2024-11-18 15:30:53

Linux目錄權(quán)限
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號