ChatGPT強悍的編程能力,讓我嚇出一身冷汗!
最近有好幾個人給我安利ChatGPT,說老劉快你去看看吧,這貨實在太強了,搞不好我們程序員都失業了。
剛開始我都是微微一笑,怎么可能?我之前的觀點一直都是在我的有生之年,AI絕對不可能干掉程序員。
但是安利的人實在是太多了,我忍不住要去注冊個賬號去看一下。
沒想到這貨竟然沒對中國開放,網上有些攻略,我嫌麻煩,趕緊呼叫在國外的好兄弟,請他幫忙注冊一個賬號。
嘗試開始,我決定跳過那些簡單的問答,例如:
如何反轉一個字符串?
如何發起一個HTTP調用?
因為這種東西對于閱碼無數的AI來說太小兒科了,根本測試不出來它的本事有多大。
程序員的一個核心能力就是拿到需求,能作出優雅的設計,咱們就拿這一點考考它。
先問一個簡單的問題:
(點擊看大圖)
不出所料,它“背誦”得非常好!
它說的最后一個原則是:盡量使用合成/聚合的方式,而不是繼承來達到復用目的。 這確實是面向對象一個重要的設計原則。
ChatGPT能運用這樣的原則嗎?
先問問它會不會做設計:
說得真不錯,咱們開始放大招,我手頭正好有一個經典案例:薪水支付,這是從經典書《敏捷軟件開發:原則,模式和實踐》中提取出來的。
這個案例的需求是這樣的:
該系統由一個公司數據庫以及和員工相關的數據組成,系統需要準時地按照規則給員工支付薪水
員工有三種類型
1.鐘點工,每個小時有固定報酬,他們每天提交工作時間卡,其中記錄了日期以及工作小時數,如果每天工作超過8小時,按1.5倍進行支付。每周五對他們進行支付。
2.月薪員工,工資固定,每個月的最后一個工作日對他們進行支付
3.銷售人員,有固定工資,但會根據他們的銷售情況,支付給他們一定數量的傭金,他們會提交銷售憑條,其中記錄了銷售的日期和數量。每隔一周的周五對他們進行支付。
員工可以選擇支付方式,可以把支票郵寄到他們指定的郵政地址,也可以保存在財務那里隨時支取,或者要求直接存入他們指定的銀行賬戶。
看了這個需求以后,一般的設計是這樣的:
Employee 作為基類,不同類型的雇員類來繼承。
但是這個需求會有變更,客戶要求員工類型可以變更,例如從鐘點工變成月薪雇員,這樣上面的設計就不行了。
這個時候應該做個抽象,,用一個類PaymentClassification來表達支付分類,然后讓Employee類持有這個實例,簡單說就是用組合代替繼承。
這相當于是個陷阱了,我們程序員能識別,抽象,這個ChatGPT可以嗎? 我還真有點好奇。
先問最初的需求,ChatGPT的回答是這樣的:
(點擊看大圖)
你別說,還真是不錯,它“理解”了需求,從中抽取出了名詞進行類的設計,并且設計好了類的繼承關系。
已經達到了面向對象設計的初級水平。
接下來是重點,給他挖坑:
非常驚艷,這貨竟然學會了抽象!
雖然它抽象出的類型叫EmployeeType,不如PaymentClassification那么精確,但是大方向是一致的:用EmployeeType來管理支付規則,員工類型發生變化時,Employee類不需要變化。
說實話,我看到它給出這個結果,內心是很吃驚的,可以說,能超越相當多的程序員了。
接下來我又問它關于支付周期怎么處理:
這一次它的抽象更加厲害,直接給出了精確的名稱:PaymentSchedule,還有相關的偽代碼!
它還特別提到了,當需要修改支付周期時,只需要更改PaymentSchedule即可,不用修改原有的員工類,組合優于繼承,再次體現出來。
這和書中的例子幾乎一樣了:
繼續問支付方法的處理方式:
不出所料,它的設計依然很棒:
實際上,ChatGPT的設計,已經非常接近書中的最終方案了:
嘗試到這里,心里有一絲失落和不甘,這個ChatGPT實在是太強悍了,展示出來很強的設計能力,并且對話過程非常流暢。
人工智能真的能理解需求,學會了抽象,能設計出漂亮的類結構了嗎?程序員的核心能力被替代,程序員的危機真的來了?
我又問了它一個問題,讓它把類圖畫一下:
等等,這里的類名怎么和之前的不一樣了,怎么出現了一個新的概念:工會成員? 我在這次對話中,可是從來沒有告訴過它這個概念啊!它從哪里知道的?
最大的可能是,這貨并沒有理解我告訴它的需求,它之前應該學過這個案例,依然是在“背誦”它學習的東西,自作主張把工會成員也給我弄出來了,從而露出了馬腳。
我關掉了ChatGPT網站,再次登錄,重新用同樣的內容和它交互,這次的結果徹底地把它暴露了。
看到沒有,這次它根本沒有抽象出PaymentClassification/EmployeeType,它竟然推薦了面向過程的思路,添加一個type的屬性,用switch來解決問題。這比之前的方案要差太多了。
最后聊一下感受吧!ChatGPT確實很厲害,應該是學習了海量的數據,肚子里貨很多,但是它依然沒有真正的理解需求,它告訴我們的答案就是在現有知識中做提煉和整合。
如果拋給它一個完全全新的領域問題,估計它會懵的,大家可以拿實際業務問題來玩一下。
所以,ChatGPT是一個好幫手,但是你要想完全依賴它,可要掂量掂量了,它告訴你的可能是優雅的代碼,也可能是垃圾代碼。