国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

與AI結(jié)對:一位高級開發(fā)人員構(gòu)建插件的歷程

人工智能
James 使用 ChatGPT 來啟動訪問者模式在 Go 中的慣用實現(xiàn)。這包括學習如何為訪問者函數(shù)定義一個類型,然后聲明一個函數(shù)來滿足類型。

作者分享了他使用 ChatGPT 學習 Go、瀏覽 Kolide API 以及構(gòu)建一個復雜的 Steampipe 插件的經(jīng)驗。

譯自Pairing With AI: A Senior Developer's Journey Building a Plugin,作者 Jon Udell。

雖然改進開發(fā)人員文檔始終有幫助,但許多人(包括我自己)更喜歡在實踐中學習。這是我在七項指導原則中提出的第七項,也是最重要的一項:因為你在面向任務(wù)的可教授時刻獲取知識,所以學習不是前瞻性的,而是直接且切實的。

當經(jīng)驗豐富的開發(fā)人員與 LLM 合作時,其機器智能會支持并增強你的智力。

好處對我來說很明顯。在 LLM 時代編寫Steampipe 的 ODBC 插件比我在沒有此類幫助的情況下編寫插件的體驗容易得多。但那公認是一個主觀評估,所以我一直在尋找一個機會與另一位插件開發(fā)人員比較筆記,當James Ramirez在我們的社區(qū) Slack 中出現(xiàn)并宣布一個新插件用于Kolide API時。我邀請他告訴我他構(gòu)建它的經(jīng)歷,他親切地帶我進行了一次與 ChatGPT 的長時間對話,在此對話中,他熟悉了三個對他來說都是新知識的技術(shù)領(lǐng)域:Kolide API、Go 語言和 Steampipe 插件架構(gòu)。

作為一個額外的挑戰(zhàn):雖然插件開發(fā)人員通常為其插件針對的 API 找到合適的 Go SDK,但這里并非如此。因此,有必要為 Kolide API 創(chuàng)建一個 Go 封裝,然后將其集成到插件中。

測試 ChatGPT 的 Go 能力

James 從一些熱身練習開始。首先,為了測試 ChatGPT 的 Go 能力,他提供了一對 Go 函數(shù),他編寫了這些函數(shù)來調(diào)用相關(guān)的 API/devices/和/devices/ID,并要求對它們之間的共享邏輯進行慣用重構(gòu)。

接下來,他使用簡單的可變參數(shù)而不是更復雜的函數(shù)選項模式探索了函數(shù)的可選參數(shù),并確定了簡單的方法——使用Search結(jié)構(gòu)的切片來封裝 Kolide 的查詢參數(shù)的字段/運算符/值樣式——就足夠了。他要求一個函數(shù)將Search結(jié)構(gòu)的切片序列化為一個 REST URL,然后優(yōu)化 ChatGPT 提出的版本以創(chuàng)建最終的serializeSearches,該版本增加了對將友好名稱映射到參數(shù)的支持并使用字符串構(gòu)建器。

AI 處理吹毛求疵,并經(jīng)常提供可提交的建議。

其中一些優(yōu)化,包括使用字符串構(gòu)建器,是由 AI 驅(qū)動的機器人CodeRabbit提出的,它提供了有用的代碼審查。他說,這是幫助你和你的團隊專注于全局的反饋,因為它處理吹毛求疵,并經(jīng)常(但并非總是)提供可提交的建議。它還采取更廣泛的視角來總結(jié)拉取請求并評估已關(guān)閉的 PR 是否解決了其關(guān)聯(lián)問題中陳述的目標。

映射運算符

他繼續(xù)探索將 Steampipe 運算符(如QualOperatorEqual)映射到 Kolide 運算符(如Equals)的方法。同樣,ChatGPT 提出的方法也變成了一個一次性方案,朝著一個干凈簡單的方案前進。但正如 James 在我們的采訪中證實的那樣,由于你無論如何都會迭代一次性版本,所以能夠生成合理的迭代而不是通過手工更繁瑣地對它們進行編碼是有幫助的。在此過程中,他正在學習基本的 Go 慣用語。

James:

Go 中有 do-while 循環(huán)嗎?

ChatGPT

沒有,但是……

James:

Go 中有三元運算符嗎?

ChatGPT

沒有,但是……

James:

我如何追加到map[string]string?

ChatGPT

像這樣……

使用反射增強的訪問者模式

在理解了基礎(chǔ)知識并為 Kolide API 開發(fā)了一個 Go 客戶端后,James 準備解決插件開發(fā)的實際工作:定義從 API 封裝返回的 Go 類型映射到控制針對這些表的 SQL 查詢的 Steampipe 架構(gòu)的表。

與所有插件開發(fā)者一樣,他從一個可以列出資源集的表開始,然后通過過濾和分頁對其進行增強。在添加第二個表后,是時候考慮如何抽象出公共模式和行為。最終結(jié)果是訪問者模式的優(yōu)雅實現(xiàn)。以下是與表kolide_device和kolide_issue相對應的 SteampipeList函數(shù)。

func listDevices(ctx context.Context, d *plugin.QueryData, h *plugin.HydrateData) (interface{}, error) {
  var visitor ListPredicate = func(client *kolide.Client, cursor string, limit int32, searches ...kolide.Search) (interface{}, error) {
    return client.GetDevices(cursor, limit, searches...)
  }


  return listAnything(ctx, d, h, "kolide_device.listDevices", visitor, "Devices")
}




func listAdminUsers(ctx context.Context, d *plugin.QueryData, h *plugin.HydrateData) (interface{}, error) {
  var visitor ListPredicate = func(client *kolide.Client, cursor string, limit int32, searches ...kolide.Search) (interface{}, error) {
    return client.GetAdminUsers(cursor, limit, searches...)
  }


  return listAnything(ctx, d, h, "kolide_admin_user.listAdminUsers", visitor, "AdminUsers")
}

以下是所有插件表通用的列表清單函數(shù)。

func listAnything(ctx context.Context, d *plugin.QueryData, h *plugin.HydrateData, callee string, visitor ListPredicate, target string) (interface{}, error) {
  // Create a slice to hold search queries
  searches, err := query(ctx, d)
  if err != nil {
    plugin.Logger(ctx).Error(callee, "qualifier_operator_error", err)
    return nil, err
  }


  // Establish connection to Kolide client
  client, err := connect(ctx, d)
  if err != nil {
    plugin.Logger(ctx).Error(callee, "connection_error", err)
    return nil, err
  }


  // Iterate through pagination cursors, with smallest number of pages
  var maxLimit int32 = kolide.MaxPaging
  if d.QueryContext.Limit != nil {
    limit := int32(*d.QueryContext.Limit)
    if limit < maxLimit {
      maxLimit = limit
    }
  }


  cursor := ""


  for {
    // Respect rate limiting
    d.WaitForListRateLimit(ctx)


    res, err := visitor(client, cursor, maxLimit, searches...)
    if err != nil {
      plugin.Logger(ctx).Error(callee, err)
      return nil, err
    }


    // Stream retrieved results
    collection := reflect.ValueOf(res).Elem().FieldByName(target)
    if collection.IsValid() {
      for i := 0; i < collection.Len(); i++ {
        d.StreamListItem(ctx, collection.Index(i).Interface())


        // Context can be cancelled due to manual cancellation or the limit has been hit
        if d.RowsRemaining(ctx) == 0 {
          return nil, nil
        }
      }
    }


    next := reflect.ValueOf(res).Elem().FieldByName("Pagination").FieldByName("NextCursor")
    if next.IsValid() {
      cursor = next.Interface().(string)
    }


    if cursor == "" {
      break
    }
  }


  return nil, nil
}

有了此設(shè)置,向插件添加新表幾乎完全是聲明式的:你僅需定義架構(gòu)及 KeyColumns,以及在 SQL 查詢中的 where(或 join)子句與 API 級過濾器之間形成橋梁的相關(guān)運算符。然后編寫一個微小的 List 函數(shù),該函數(shù)定義一個訪問器,并將該函數(shù)傳遞到 common listAnything 函數(shù)中,該函數(shù)封裝查詢參數(shù)編組、連接至 API 客戶端、調(diào)用 API、將響應解壓縮到一個集合中以及迭代集合以將數(shù)據(jù)項傳輸?shù)?Steampipe 的外部數(shù)據(jù)包裝器的功能。

James 使用 ChatGPT 來啟動訪問者模式在 Go 中的慣用實現(xiàn)。這包括學習如何為訪問者函數(shù)定義一個類型,然后聲明一個函數(shù)來滿足類型。每個表的訪問者都封裝對 API 客戶端的調(diào)用,并返回一個接口。所有這些都相當通用,但訪問者的響應特定于包裝的 API 響應的 Go 類型,這意味著需要為每個表編寫一個不同的 List 函數(shù)。如何避免這種情況?James 問道:“res 變量上的字段引用需要是可變類型,在執(zhí)行時指定。你能建議一種方法嗎?”

ChatGPT 的建議(他采納了)是使用反射,以便調(diào)用 listAnything(如 listAnything(ctx, d, h, “kolide_device.listDevices”, visitor, “Devices”))可以傳遞一個名稱("Devices"),使 listAnything 能夠以與類型無關(guān)的方式訪問響應結(jié)構(gòu)的字段,例如,此處的 Devices 字段。

type DeviceListResponse struct {
      Devices    []Device   `json:"data"`
      Pagination Pagination `json:"pagination"`
    }

正因如此,listAnything 終于如其名,成為一個通用的 Steampipe List 函數(shù)。該解決方案很少使用反射,并在 API 層和 Steampipe 層中都保留了 Go 的強類型檢查。

LLM 協(xié)助真正意味著什么?

它肯定不意味著 LLM 根據(jù)以下提示編寫了一個體現(xiàn)復雜設(shè)計模式的插件:“我需要一個用于 Kolide API 的 Steampipe 插件,請創(chuàng)建它。”對我來說,以及對 James 來說,它的含義更有趣:“讓我們討論為 Kolide API 編寫插件的過程。”這就像與一只橡皮鴨交談,以便大聲思考需求和策略。但 LLM 是一只會說話的橡皮鴨。有時響應直接適用,有時不適用,但無論哪種方式,它們通常可以幫助你獲得清晰度。

作為一名經(jīng)驗豐富的軟件工程師,James 本可以想出辦法——但這需要更長的時間。

James 說:“對話要求我對所問的問題非常具體。”雖然他從頭開始使用 Go,但他帶來了豐富的經(jīng)驗,使他能夠快速定位并找出哪些是需要問的正確問題。作為一名經(jīng)驗豐富的軟件工程師,James 本可以自己想出所有這些。但這需要更長的時間,而且他將花費大量時間預先閱讀文章和文檔,而不是通過實踐學習。而且可能沒有時間!正如我現(xiàn)在從許多其他人那里聽到的那樣,LLM 提供的加速通常決定了擁有一個想法和能夠執(zhí)行它之間的區(qū)別。

James 還提到了我未考慮過的開源角度。在 LLM 之前,他不會以完全公開的方式完成這項工作。“我會一直保密,直到我更有信心,”他說,“但這從一開始就在那里,我很高興它在那里。”這使得與 Turbot 團隊的接觸盡早成為可能。

這不是一個自動化故事,而是一個增強故事。當像 James Ramirez 這樣的經(jīng)驗豐富的開發(fā)人員與 LLM 合作時,其機器智能支持并放大了他的智力。兩者協(xié)同工作——不僅編寫代碼,更重要的是,思考架構(gòu)和設(shè)計。

     

責任編輯:武曉燕 來源: 云云眾生s
相關(guān)推薦

2024-01-04 10:02:55

開發(fā)插件

2025-09-15 02:22:00

2019-08-07 11:00:07

程序員技能開發(fā)者

2013-09-25 09:20:39

iOS開發(fā)iOS7iPhone5s

2010-08-09 16:09:25

2012-05-30 15:15:42

ibmdw

2023-03-15 07:12:53

企業(yè)開發(fā)人員提供商

2009-11-23 20:07:51

ibmdw開發(fā)

2021-02-19 09:33:01

kubernetesJAVA服務(wù)

2025-04-09 08:10:00

AI代碼生成器網(wǎng)絡(luò)安全人工智能

2009-12-11 14:50:14

Visual Basi

2020-01-27 16:28:57

開發(fā)命令遠程服務(wù)器

2021-01-30 10:51:07

Python編程語言開發(fā)

2022-02-17 16:05:58

SQL開發(fā)招聘

2023-02-17 15:01:15

2021-12-10 23:48:19

Java開發(fā)技術(shù)

2012-12-14 08:55:45

開發(fā)人員產(chǎn)品經(jīng)理

2010-08-16 09:21:35

Windows Pho

2009-07-20 16:11:41

JRuby Swing

2024-09-27 17:06:13

點贊
收藏

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

韩国精品视频在线观看| 老司机午夜在线视频| 不卡av一区二区| 色噜噜狠狠狠综合曰曰曰| 黄网在线播放| 亚洲欧美综合久久久| 色av吧综合网| 小视频免费在线观看| 在线观看区一区二| 在线播放中文字幕| 一区二区三区四区五区视频在线观看 | 精品国产一区二区三区不卡 | 亚洲主播在线播放| 精品人妻人人做人人爽| 卡一卡二国产精品| 久久久久久九九九九| 亚洲精品护士| 亚洲三级av在线| 天堂√8在线中文| 91麻豆精品国产| 成人影院在线播放| 欧美日韩在线不卡| 免费黄色在线看| 日韩欧美国产三级| 日本电影在线观看| 亚洲国产小视频在线观看| 麻豆网站在线| 国产视频久久久久| 日韩成人18| 国产精品扒开腿做爽爽爽视频 | 26uuu成人网一区二区三区| 无码人妻少妇伦在线电影| eeuss影院一区二区三区| 五月婷婷之综合激情| 婷婷中文字幕一区三区| 欧美香蕉爽爽人人爽| 99在线视频精品| 中文字幕一区二区三区四区五区| 成人黄色一级视频| 青柠在线影院观看日本| 在线看日韩精品电影| 中文视频在线| 亚洲欧美另类人妖| 美日韩中文字幕| 91在线视频一区| 九九**精品视频免费播放| 国产精品久久久久av福利动漫| 欧美在线色图| 欧美一区视频在线| 精品国产乱码久久久久久蜜坠欲下 | 欧美人与禽性xxxxx杂性| 中文字幕在线视频日韩| 黑人一区二区三区四区五区| 乱妇乱女熟妇熟女网站| 成人午夜视频网站| 国产激情在线播放| 欧美三级视频在线观看| 疯狂欧洲av久久成人av电影 | 美女精品久久| 日韩欧美亚洲v片| 色图在线观看| 欧美国产日韩中文字幕在线| 首页亚洲欧美制服丝腿| 91理论电影在线观看| 国产精品1区| 亚洲国产高清在线| 一区二区三区在线免费观看| av天天av| 色妞一区二区三区| 免费亚洲网站| 在线天堂av| 久久免费成人精品视频| 欧美一级欧美一级| 欧美一区二区视频网站| 日韩精品看片| 欧美成人蜜桃| 亚洲毛片av在线| 日韩欧美午夜| 中文字幕一区二区三区最新| 久久久噜噜噜| 亚洲高清在线观看一区| 不卡视频在线观看| 91福利国产成人精品播放| www.色精品| 可播放的18gay1069| 在线观看一区二区视频| 中文字幕国产免费| 亚洲国产精久久久久久| 国产中文一区| 91在线观看| 国产精品一区二区三区成人| 国产精品毛片无遮挡高清| eeuss鲁片一区二区三区| 久久久久九九九| 国产网红主播福利一区二区| 国产成人在线中文字幕| 一本大道熟女人妻中文字幕在线| 超碰91人人草人人干| 亚洲欧洲99久久| 欧美激情日韩| 麻豆mv在线看| 3d动漫一区二区三区| 日韩视频一区二区三区| 一区二区三区四区五区精品视频| 欧美aaa免费| 可以在线看的黄色网址| 国产日韩av在线播放| 日韩国产欧美精品在线| 一区二区三区四区五区视频在线观看| 成人av色在线观看| 日韩一区二区三区视频| 99国产精品久久久久| 欧美啪啪一区| 都市激情亚洲| av在线二区| 免费国产黄色网址| 久久99精品久久久久久久久久 | 综合色天天鬼久久鬼色| 亚洲国产影院| 大奶在线精品| gogo在线观看| 在线人体午夜视频| 一区二区三区我不卡| 91色在线视频| 久久久久久com| 在线中文字幕日韩| 久久婷婷成人综合色| 欧美三级电影网址| 黄色激情网站| 成人免费视频网站在线看| 欧美一区二区视频97| 欧美乱大交xxxxx另类电影| 欧美成人r级一区二区三区| 日韩欧美a级成人黄色| 不卡的av网站| 91精品国产福利在线观看麻豆| 精品久久国产一区| 欧美二区观看| 亚洲伦理在线| 在线免费视频一区| 日本va中文字幕| 无码内射中文字幕岛国片| 婷婷无套内射影院| 在线观看三级网站| 日韩欧美在线播放视频| 91视频 -- 69xx| 国产视频手机在线播放| 精品久久一二三| 日本老熟妇毛茸茸| 草草草在线视频| 成人av小说网| 韩国免费在线视频| 在线heyzo| 97色婷婷成人综合在线观看| 哥也色在线视频| 日韩三区免费| 亚洲盗摄视频| 好吊一区二区三区| 国产在线国偷精品产拍免费yy| 韩国午夜理伦三级不卡影院| av网站免费线看精品| 一区二区三区在线免费视频| 在线欧美小视频| 深夜福利亚洲导航| 国产欧美最新羞羞视频在线观看| 91精品国产综合久久久久久久久| 日本一区二区三不卡| 少妇一级淫免费放| 欧美日韩在线中文字幕| 男女在线视频| 高清精品xnxxcom| 国产精品v日韩精品v欧美精品网站| 麻豆成人久久精品二区三区小说| 中文在线日韩| 成人一区在线观看| 亚洲一区二区三区美女| 亚洲图片在区色| 亚洲一区二区三区乱码aⅴ| 精品视频在线观看一区二区| jizzjizzjizz亚洲女| 国产.com| 午夜精品久久久久久毛片| 日本系列欧美系列| 欧美三级免费观看| 欧美激情一区二区三区高清视频 | 成人自拍视频网| 欧美xxxx免费虐| 在线三级电影| 91在线视频免费看| 韩国中文字幕在线| 97香蕉久久| 大香煮伊手机一区| 一区二区在线中文字幕电影视频| www.中文字幕在线| 丝袜美腿av在线| 欧美私人啪啪vps| 成人妖精视频yjsp地址| 国产一区二区三区在线观看视频 | 蜜桃视频一区二区| 欧美日韩国产a|