軟件、軟件開(kāi)發(fā)與演化
軟件是人類制造的最復(fù)雜制品,軟件開(kāi)發(fā)和演化是人類針對(duì)所解決問(wèn)題的創(chuàng)造性思維活動(dòng)??茖W(xué)家探索世界、工程師改造世界、計(jì)算機(jī)科學(xué)家和軟件工程師是創(chuàng)造世界的。具體來(lái)講,軟件是人類大腦思維活動(dòng)的體現(xiàn)。認(rèn)識(shí)和理解人的思維活動(dòng)是非常困難的,因?yàn)檐浖侨祟惔竽X邏輯思維活動(dòng)的體現(xiàn),所以認(rèn)識(shí)與理解人的思維活動(dòng)非常困難,理解軟件系統(tǒng)也非常困難,這是最基本的觀點(diǎn),也是核心觀點(diǎn)。
軟件的創(chuàng)造過(guò)程與制造過(guò)程合二為一,所以軟件系統(tǒng)開(kāi)發(fā)出來(lái)之前沒(méi)有參考樣品,而且?guī)?lái)很多問(wèn)題,比如軟件系統(tǒng)是難以估算成本的,所以投資軟件具有相當(dāng)大的風(fēng)險(xiǎn)和不確定性。
人是軟件開(kāi)發(fā)與演化的主體,而軟件開(kāi)發(fā)與演化是把現(xiàn)實(shí)世界復(fù)雜的問(wèn)題模型轉(zhuǎn)換為計(jì)算模型。目標(biāo)是追求高效、高質(zhì)量、低成本,而解決的核心問(wèn)題是如何使得軟件系統(tǒng)滿足需求,擺脫缺陷。這兩個(gè)問(wèn)題和人密切相關(guān),人是軟件需求產(chǎn)生、認(rèn)識(shí)、確認(rèn)的主體,需求是人類在認(rèn)識(shí)復(fù)雜世界的基礎(chǔ)上形成的主觀意圖,經(jīng)常不斷變化。從軟件工程師角度說(shuō),經(jīng)常面對(duì)按照錯(cuò)誤的需求開(kāi)發(fā)出正確軟件的困局。
另外一個(gè)方面,人在軟件開(kāi)發(fā)演化中會(huì)犯錯(cuò),因?yàn)槿藢?duì)復(fù)雜事物的認(rèn)識(shí)不是一蹴而就,需要經(jīng)歷循環(huán)反復(fù)、不斷探索的過(guò)程,所以軟件系統(tǒng)的缺陷是難以避免的。軟件可信保障成本很高,其實(shí)大家都知道,任何人和機(jī)構(gòu)都不能確保軟件質(zhì)量。通俗說(shuō)大家都知道,軟件產(chǎn)品是沒(méi)有三包的。曾經(jīng)軟件質(zhì)量是以正確性為目標(biāo)的,強(qiáng)調(diào)軟件系統(tǒng)的絕對(duì)正確性,要形成客觀認(rèn)識(shí)。但那個(gè)時(shí)候軟件系統(tǒng)是運(yùn)行在封閉靜態(tài)環(huán)境中的系統(tǒng),可以看成是個(gè)數(shù)學(xué)系統(tǒng)。希望基于這種數(shù)學(xué)證明基礎(chǔ)之上對(duì)軟件正確性形成客觀認(rèn)識(shí)。基本條件是軟件需求由形式化規(guī)約描述,形成人對(duì)軟件系統(tǒng)的確認(rèn)關(guān)系,但是實(shí)際上現(xiàn)實(shí)中做不到,是一個(gè)理想。所以現(xiàn)在軟件質(zhì)量是以可信性為目標(biāo),退了一步,強(qiáng)調(diào)相對(duì)可信,主觀認(rèn)識(shí),這是因?yàn)檐浖到y(tǒng)是在開(kāi)放動(dòng)態(tài)環(huán)境下不斷演化的系統(tǒng)。
沒(méi)有辦法把它看成數(shù)學(xué)系統(tǒng),由于復(fù)雜性和規(guī)模不斷地增大,數(shù)學(xué)證明這種需要投入巨大的成本,現(xiàn)實(shí)中沒(méi)法投入,也做不到。所以后退一步是強(qiáng)調(diào)可信性,可信性是基于認(rèn)識(shí)與理解、獲取客觀證據(jù)基礎(chǔ)之上形成主觀認(rèn)識(shí),人為判斷這個(gè)軟件可以運(yùn)行或不可運(yùn)行。前提條件是軟件需求是自然語(yǔ)言來(lái)描述,形成人類與軟件系統(tǒng)的一種信用關(guān)系。
再看軟件開(kāi)發(fā)與演化任務(wù),人類在現(xiàn)實(shí)世界中所承擔(dān)的任務(wù)分為兩大類:一類是預(yù)測(cè)性任務(wù),通常不需要承擔(dān)風(fēng)險(xiǎn)責(zé)任,沒(méi)有可信保障需求。另外一類是是決策性任務(wù),要完成決策性任務(wù),通常是需要承擔(dān)相應(yīng)的風(fēng)險(xiǎn)責(zé)任,有可信保障需求。比方天氣預(yù)報(bào)就是典型的預(yù)測(cè)性任務(wù)。人在軟件開(kāi)發(fā)與演化中完成的是決策性任務(wù),需要對(duì)任務(wù)完成正確與否作出可信性判斷,需要對(duì)軟件系統(tǒng)是否滿足需求、擺脫缺陷作出可信性判斷,承擔(dān)相應(yīng)的風(fēng)險(xiǎn)增長(zhǎng),在此基礎(chǔ)上構(gòu)成一定的可信保障。
具體來(lái)說(shuō),軟件開(kāi)發(fā)與演化過(guò)程是把自然語(yǔ)言的需求轉(zhuǎn)換成為滿足需求的程序代碼,這是一個(gè)創(chuàng)造性過(guò)程,也是一個(gè)決策性過(guò)程。所以動(dòng)作難度很大,而且人力成本很高,需要經(jīng)過(guò)一系列的工作才能最終達(dá)到的目標(biāo)。在這個(gè)過(guò)程里面,主要設(shè)計(jì)兩種語(yǔ)言:一種是自然語(yǔ)言,一種是程序語(yǔ)言。正是因?yàn)檐浖_(kāi)發(fā)與演化是創(chuàng)造性的過(guò)程,是決策性任務(wù),非常困難,所以就想辦法通過(guò)開(kāi)發(fā)研制各種各樣的軟件工具給人提供幫助和支持,提高軟件開(kāi)發(fā)與演化各個(gè)階段的自動(dòng)化程度,從而希望形成一種人機(jī)協(xié)同的軟件開(kāi)發(fā)與演化環(huán)境。但在現(xiàn)有軟件工具有兩方面的弱點(diǎn):
一方面現(xiàn)有軟件工具很少考慮按照自然語(yǔ)言需求直接生成程序代碼,這是因?yàn)閷⒆匀徽Z(yǔ)言描述需求轉(zhuǎn)換為滿足需求的程序代碼,這是不可判定的計(jì)算問(wèn)題?,F(xiàn)有的軟件工具難以突破自然交互障礙,缺乏自然語(yǔ)言接口與人交互,所以人機(jī)協(xié)同的工作空間、有效性和靈活性受到了大量的限制。這兩個(gè)薄弱環(huán)節(jié)其實(shí)在大語(yǔ)言模型出來(lái)以后,應(yīng)該來(lái)說(shuō)都有了比較大的突破。
軟件系統(tǒng)是通過(guò)算法解決問(wèn)題的,而算法是求解問(wèn)題需要遵循的被清楚指定簡(jiǎn)單指令的集合。現(xiàn)實(shí)世界中能用計(jì)算機(jī)解決的問(wèn)題和不能用計(jì)算機(jī)解決的問(wèn)題,分別稱為可判定計(jì)算問(wèn)題與不可判定計(jì)算問(wèn)題。而這兩類問(wèn)題的分類基本條件或基本依據(jù),是否存在解決問(wèn)題的算法,當(dāng)然算法解決問(wèn)題需要消耗資源,所以有算法復(fù)雜性,有易解問(wèn)題和難解問(wèn)題。
現(xiàn)在討論的算法都是基于邏輯設(shè)計(jì)的算法,也就是說(shuō)求解問(wèn)題需要遵循清楚指令的簡(jiǎn)單指令集合,算法每一步都有內(nèi)在的解釋,理論上算法的正確性是可證明的,也就是可以證明算法的輸出結(jié)果是滿足需求公約的。
神經(jīng)網(wǎng)絡(luò)模型的出現(xiàn)和大量的使用,現(xiàn)在又有了另外一類算法,稱之為是預(yù)測(cè)性算法。這個(gè)預(yù)測(cè)性是算法是基于概率與統(tǒng)計(jì)原理以及訓(xùn)練數(shù)據(jù)形成的數(shù)學(xué)模型。典型的特征是輸出結(jié)果是預(yù)測(cè)性結(jié)果,可以輸出預(yù)測(cè)性判斷、預(yù)測(cè)性的內(nèi)容生成。既然是預(yù)測(cè)性結(jié)果,就像天氣預(yù)報(bào)是不負(fù)責(zé)任的,不一定滿足數(shù)據(jù)公約,輸出結(jié)果缺失可信性判斷。相比于前面的基于邏輯設(shè)計(jì)的算法,具有內(nèi)在不可解釋、易受數(shù)據(jù)擾動(dòng)、輸出結(jié)果不一定滿足需求規(guī)約、缺失可信性判斷。
這些算法打開(kāi)了解決問(wèn)題的新空間,給軟件可信保障帶來(lái)挑戰(zhàn),預(yù)測(cè)性算法基于給定數(shù)據(jù)進(jìn)行預(yù)測(cè),基于預(yù)測(cè)結(jié)果解決實(shí)際問(wèn)題,可以使用預(yù)測(cè)性任務(wù),但直接用于決策存在的問(wèn)題會(huì)存在風(fēng)險(xiǎn)。所以,預(yù)測(cè)性算法打開(kāi)了解決問(wèn)題的新空間,但是給軟件可信保障帶來(lái)挑戰(zhàn)。
大語(yǔ)言模型就是這樣的產(chǎn)物,大語(yǔ)言模型本身是神經(jīng)網(wǎng)絡(luò)模型,同時(shí)由于采用大量的語(yǔ)料進(jìn)行訓(xùn)練,突破了工程化的訓(xùn)練技術(shù),所以使得可以高效地利用互聯(lián)網(wǎng)和圖書(shū)資料中所積累的海量文本進(jìn)行訓(xùn)練。因而匯聚豐富知識(shí)的基礎(chǔ)上形成了強(qiáng)大自然語(yǔ)言生成能力,簡(jiǎn)單說(shuō)可以針對(duì)自然語(yǔ)言提問(wèn),生成預(yù)測(cè)性的回答。同時(shí)還通過(guò)一系列的技術(shù)創(chuàng)新,使得它的能力進(jìn)一步增強(qiáng)。
這樣一個(gè)自然語(yǔ)言問(wèn)答的工具,在訓(xùn)練的時(shí)候也采用了大量程序語(yǔ)言的語(yǔ)料,所以通過(guò)類似自然語(yǔ)言的處理方式采用大量程序語(yǔ)言相關(guān)語(yǔ)料進(jìn)行訓(xùn)練,所以也積累了豐富的軟件開(kāi)發(fā)與演化知識(shí)。因而,它也可以通過(guò)自然語(yǔ)言與軟件開(kāi)發(fā)與人工交互,通過(guò)給給的軟件開(kāi)發(fā)與演化任務(wù)生成預(yù)測(cè)性內(nèi)容,所生成的預(yù)測(cè)性內(nèi)容折戟軟件開(kāi)發(fā)與演化各個(gè)階段。因而給軟件開(kāi)發(fā)和演化人員完成相應(yīng)任務(wù)提供一定程度的幫助。所以把大語(yǔ)言模型又稱之為是基于自然語(yǔ)言交互的軟件工具。大語(yǔ)言模型一方面是基于自然語(yǔ)言的人機(jī)交互的特征,再就是針對(duì)軟件開(kāi)發(fā)與演化的預(yù)測(cè)性內(nèi)容生成,這兩大特征使它成為人機(jī)協(xié)同軟件開(kāi)發(fā)與演化工具。但是所生成的預(yù)測(cè)性內(nèi)容是缺失可信性判斷,需要人工分析理解和確認(rèn),這使得這樣一種工具也帶來(lái)了巨大的挑戰(zhàn)。
大模型打開(kāi)了解決問(wèn)題的新空間、帶來(lái)了新挑戰(zhàn)
大語(yǔ)言模型打開(kāi)了解決問(wèn)題的新空間,帶來(lái)了新挑戰(zhàn)。而帶來(lái)的挑戰(zhàn)就是軟件開(kāi)發(fā)與演化人員如何基于大模型生成的預(yù)測(cè)性內(nèi)容進(jìn)行開(kāi)發(fā)和演化高質(zhì)量的軟件系統(tǒng)。
大模型模型支持從自然語(yǔ)言需求生成預(yù)測(cè)性代碼,將自然語(yǔ)言的語(yǔ)言描述的需求轉(zhuǎn)換為滿足需求的程序代碼是不可判定的計(jì)算問(wèn)題,大模型所生成的是不一定滿足需求的預(yù)測(cè)性代碼,其實(shí)是放棄了可信約束條件生成預(yù)測(cè)性代碼。軟件開(kāi)發(fā)和演化的過(guò)程可以簡(jiǎn)單分為從無(wú)到有,從有到對(duì),大模型解決了從無(wú)到有,但是留下的問(wèn)題是從有到對(duì)的問(wèn)題。也就是說(shuō)可信性保障的問(wèn)題,如何基于大模型的預(yù)測(cè)性代碼得到滿足需求的程序。
簡(jiǎn)單對(duì)比一下人工編程和基于大模型的人機(jī)協(xié)同編程。人工編程是程序員編寫(xiě)代碼和文檔,同時(shí)自身也對(duì)代碼和文檔分析和理解進(jìn)行了過(guò)程,所以程序員編寫(xiě)完代碼之后,對(duì)代碼的理解是相當(dāng)深刻的。然后在此基礎(chǔ)上程序員再完成其他可信保障的活動(dòng)。基于大模型的人機(jī)協(xié)同編程,首先是編程人員引導(dǎo)大模型生成預(yù)測(cè)性代碼,然后大模型需要分析理解預(yù)測(cè)性代碼、修改和確認(rèn)代碼,如果這一步缺失,或者說(shuō)做得不好,其實(shí)無(wú)法支撐編碼這樣決策性任務(wù)的完成。再是編程人員完成其他相關(guān)可信保障的活動(dòng)。
現(xiàn)在要做到基于大模型的人機(jī)協(xié)同編程,希望人機(jī)協(xié)同編程的可信度要和人工編程可信度一樣,在這個(gè)基礎(chǔ)上,人機(jī)協(xié)同編程的效率要大于等于人工編程的效率。這里打了兩個(gè)問(wèn)號(hào),要實(shí)現(xiàn)這兩個(gè)問(wèn)號(hào),既然大模型生成是預(yù)測(cè)性代碼,需要進(jìn)行人工分析理解和確認(rèn)。而人工分析理解和確認(rèn)意味著編程人員要理解代碼,其實(shí)在軟件工程領(lǐng)域,有一句行話:寧可自己寫(xiě)代碼,也不愿意讀別人的代碼。說(shuō)明編程人員理解代碼的難度通常高于寫(xiě)代碼的難度,這也說(shuō)明軟件是人類制造最復(fù)雜的制品。比如說(shuō)讓大模型寫(xiě)一個(gè)講稿,其實(shí)花5分鐘讀一下就知道可用不可用。但是如果讓大模型生成一段預(yù)測(cè)性代碼,花5分鐘是絕對(duì)不可能的,除非是高手。還有一個(gè)問(wèn)題是,大模型從無(wú)到有生成預(yù)測(cè)性代碼,關(guān)鍵問(wèn)題是要解決人性所致的程序員松懈、偷懶和犯錯(cuò),可能不認(rèn)真分析預(yù)測(cè)性代碼,直接提交,這都是有可能的。
所以說(shuō)大模型如同專業(yè)相機(jī),大模型是傻瓜相機(jī)還是專業(yè)相機(jī)?首先是自然語(yǔ)言交互能力使得大模型成為傻瓜相機(jī),人人都可以使用,這是從使用角度,大模型是傻瓜相機(jī)。
但是大模型的預(yù)測(cè)性內(nèi)容生成對(duì)于軟件開(kāi)發(fā)演化來(lái)講是專業(yè)相機(jī),也就是說(shuō)因?yàn)轭A(yù)測(cè)性的生成內(nèi)容缺乏可信判斷,需要人工分析和理解,修改和確認(rèn)。從解決問(wèn)題的角度看,大模型是專業(yè)相機(jī)。正是因?yàn)榇竽P褪菍I(yè)相機(jī),你就需要有駕馭專業(yè)相機(jī)的專業(yè)能力,所以駕馭大模型需要具備更強(qiáng)專業(yè)能力,需要對(duì)大模型生成預(yù)測(cè)性內(nèi)容進(jìn)行判斷的能力,目前來(lái)講,解決這樣需要更強(qiáng)的能力的問(wèn)題有兩個(gè)視角:一個(gè)是從企業(yè)應(yīng)對(duì)視角來(lái)講,專業(yè)能力達(dá)不到要求要禁止使用大模型。但并不意味著要把專業(yè)能力達(dá)不到要求都開(kāi)了,沒(méi)有初級(jí)程序員哪來(lái)高級(jí)程序員,因?yàn)槿艘袛啻a是不是符合要求,判斷代碼是否符合要求的能力比寫(xiě)代碼的能力還要高,而不具備寫(xiě)代碼的能力,肯定不具備判斷代碼是否符合要求的能力。所以從這個(gè)角度講,要保留人工編程流程和初級(jí)程序員的崗位?,F(xiàn)在很多媒體說(shuō)初級(jí)程序員要下崗,人工變成被大模型替代,其實(shí)不是這個(gè)概念。
從個(gè)人應(yīng)對(duì)的視角,要不斷夯實(shí)專業(yè)基礎(chǔ),全面提升專業(yè)能力。其實(shí)企業(yè)要裁掉沒(méi)有專業(yè)能力提升空間的人。整個(gè)軟件開(kāi)發(fā)與演化是人類針對(duì)所解決問(wèn)題的創(chuàng)新性思維活動(dòng)。從自然語(yǔ)言需求到滿足需求的程序代碼是有可信保障需求的決策性任務(wù)。大語(yǔ)言模型打開(kāi)自然語(yǔ)言到程序代碼的空間,因?yàn)榭梢陨深A(yù)測(cè)性內(nèi)容,可以實(shí)現(xiàn)從無(wú)到有,但是又缺失可信性判斷,對(duì)從有到對(duì)的過(guò)程,帶來(lái)了可信保障難題與挑戰(zhàn)。
而解決問(wèn)題、應(yīng)對(duì)挑戰(zhàn)的途徑,一方面從技術(shù)角度講,希望不斷地通過(guò)各種各樣的辦法降低可信性判斷的復(fù)雜性。另外一方面最重要的是全面提升專業(yè)能力駕馭大模型。