ChatGPT強悍的編程能力,讓我嚇出一身冷汗!
最近有好幾個人給我安利ChatGPT,說老劉快你去看看吧,這貨實在太強了,搞不好我們程序員都失業(yè)了。
剛開始我都是微微一笑,怎么可能?我之前的觀點一直都是在我的有生之年,AI絕對不可能干掉程序員。
但是安利的人實在是太多了,我忍不住要去注冊個賬號去看一下。
沒想到這貨竟然沒對中國開放,網(wǎng)上有些攻略,我嫌麻煩,趕緊呼叫在國外的好兄弟,請他幫忙注冊一個賬號。
嘗試開始,我決定跳過那些簡單的問答,例如:
如何反轉一個字符串?
如何發(fā)起一個HTTP調用?
因為這種東西對于閱碼無數(shù)的AI來說太小兒科了,根本測試不出來它的本事有多大。
程序員的一個核心能力就是拿到需求,能作出優(yōu)雅的設計,咱們就拿這一點考考它。
先問一個簡單的問題:

(點擊看大圖)
不出所料,它“背誦”得非常好!
它說的最后一個原則是:盡量使用合成/聚合的方式,而不是繼承來達到復用目的。 這確實是面向對象一個重要的設計原則。
ChatGPT能運用這樣的原則嗎?
先問問它會不會做設計:

說得真不錯,咱們開始放大招,我手頭正好有一個經(jīng)典案例:薪水支付,這是從經(jīng)典書《敏捷軟件開發(fā):原則,模式和實踐》中提取出來的。
這個案例的需求是這樣的:
該系統(tǒng)由一個公司數(shù)據(jù)庫以及和員工相關的數(shù)據(jù)組成,系統(tǒng)需要準時地按照規(guī)則給員工支付薪水
員工有三種類型
1.鐘點工,每個小時有固定報酬,他們每天提交工作時間卡,其中記錄了日期以及工作小時數(shù),如果每天工作超過8小時,按1.5倍進行支付。每周五對他們進行支付。
2.月薪員工,工資固定,每個月的最后一個工作日對他們進行支付
3.銷售人員,有固定工資,但會根據(jù)他們的銷售情況,支付給他們一定數(shù)量的傭金,他們會提交銷售憑條,其中記錄了銷售的日期和數(shù)量。每隔一周的周五對他們進行支付。
員工可以選擇支付方式,可以把支票郵寄到他們指定的郵政地址,也可以保存在財務那里隨時支取,或者要求直接存入他們指定的銀行賬戶。
看了這個需求以后,一般的設計是這樣的:

Employee 作為基類,不同類型的雇員類來繼承。
但是這個需求會有變更,客戶要求員工類型可以變更,例如從鐘點工變成月薪雇員,這樣上面的設計就不行了。
這個時候應該做個抽象,,用一個類PaymentClassification來表達支付分類,然后讓Employee類持有這個實例,簡單說就是用組合代替繼承。

這相當于是個陷阱了,我們程序員能識別,抽象,這個ChatGPT可以嗎? 我還真有點好奇。
先問最初的需求,ChatGPT的回答是這樣的:

(點擊看大圖)
你別說,還真是不錯,它“理解”了需求,從中抽取出了名詞進行類的設計,并且設計好了類的繼承關系。
已經(jīng)達到了面向對象設計的初級水平。
接下來是重點,給他挖坑:



非常驚艷,這貨竟然學會了抽象!
雖然它抽象出的類型叫EmployeeType,不如PaymentClassification那么精確,但是大方向是一致的:用EmployeeType來管理支付規(guī)則,員工類型發(fā)生變化時,Employee類不需要變化。
說實話,我看到它給出這個結果,內心是很吃驚的,可以說,能超越相當多的程序員了。
接下來我又問它關于支付周期怎么處理:

這一次它的抽象更加厲害,直接給出了精確的名稱:PaymentSchedule,還有相關的偽代碼!

它還特別提到了,當需要修改支付周期時,只需要更改PaymentSchedule即可,不用修改原有的員工類,組合優(yōu)于繼承,再次體現(xiàn)出來。
這和書中的例子幾乎一樣了:

繼續(xù)問支付方法的處理方式:

不出所料,它的設計依然很棒:

實際上,ChatGPT的設計,已經(jīng)非常接近書中的最終方案了:

嘗試到這里,心里有一絲失落和不甘,這個ChatGPT實在是太強悍了,展示出來很強的設計能力,并且對話過程非常流暢。
人工智能真的能理解需求,學會了抽象,能設計出漂亮的類結構了嗎?程序員的核心能力被替代,程序員的危機真的來了?
我又問了它一個問題,讓它把類圖畫一下:



等等,這里的類名怎么和之前的不一樣了,怎么出現(xiàn)了一個新的概念:工會成員? 我在這次對話中,可是從來沒有告訴過它這個概念??!它從哪里知道的?
最大的可能是,這貨并沒有理解我告訴它的需求,它之前應該學過這個案例,依然是在“背誦”它學習的東西,自作主張把工會成員也給我弄出來了,從而露出了馬腳。
我關掉了ChatGPT網(wǎng)站,再次登錄,重新用同樣的內容和它交互,這次的結果徹底地把它暴露了。


看到?jīng)]有,這次它根本沒有抽象出PaymentClassification/EmployeeType,它竟然推薦了面向過程的思路,添加一個type的屬性,用switch來解決問題。這比之前的方案要差太多了。
最后聊一下感受吧!ChatGPT確實很厲害,應該是學習了海量的數(shù)據(jù),肚子里貨很多,但是它依然沒有真正的理解需求,它告訴我們的答案就是在現(xiàn)有知識中做提煉和整合。
如果拋給它一個完全全新的領域問題,估計它會懵的,大家可以拿實際業(yè)務問題來玩一下。
所以,ChatGPT是一個好幫手,但是你要想完全依賴它,可要掂量掂量了,它告訴你的可能是優(yōu)雅的代碼,也可能是垃圾代碼。



























