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