作者 | Jared Toporek
編譯 | 徐杰承
最近幾個(gè)月,關(guān)于人工智能的驚人文章在互聯(lián)網(wǎng)泛濫。這也引發(fā)了很多人的擔(dān)心——軟件開發(fā)人員可能很快就會(huì)失業(yè),被人工智能取代。他們想象所有的企業(yè)高管和產(chǎn)品研究人員將繞過大多數(shù)或所有的軟件開發(fā)人員,直接要求人工智能構(gòu)建他們想要或需要的東西。但作為一個(gè)擁有15年一線開發(fā)經(jīng)驗(yàn)的人,我覺得這些擔(dān)心有點(diǎn)危言聳聽。
編碼可能是一項(xiàng)挑戰(zhàn),但是我從來沒有在寫單一任務(wù)上花費(fèi)過太多時(shí)間。一旦掌握了語法、邏輯和技術(shù),這在大多數(shù)時(shí)候是一個(gè)非常簡單的過程。在軟件構(gòu)建過程中,真正的問題通常集中在軟件應(yīng)該做什么。創(chuàng)建軟件最難的部分不是編寫代碼,而是創(chuàng)建需求,而這些軟件需求仍然是由人類定義的。
等等,好像這是個(gè)錯(cuò)誤
在我職業(yè)生涯的早期,為了幫助提高某個(gè)團(tuán)隊(duì)的研發(fā)效率,我被安排中途接手一個(gè)項(xiàng)目——軟件的主要目的是在電子商務(wù)網(wǎng)站上配置定制產(chǎn)品。
我的任務(wù)是負(fù)責(zé)動(dòng)態(tài)的條款和條件。有條件的關(guān)鍵詞取決于所購買產(chǎn)品的類型,以及由于法律要求客戶所在的地區(qū)。
在某種程度上,我認(rèn)為我發(fā)現(xiàn)了一個(gè)潛在的缺陷,用戶將選擇一種產(chǎn)品類型,這將生成適當(dāng)?shù)臈l款和條件,但是在工作流中,它將允許用戶選擇不同的產(chǎn)品類型和預(yù)定義的條款和條件,這將違反在有客戶簽名的業(yè)務(wù)需求中明確約定的特性之一。
我天真地問客戶,“我應(yīng)該刪除允許用戶覆蓋正確條款和條件的輸入嗎?”從那以后,我得到的回答就烙在了我的腦海里。他的原話是完全自信地說出來的:“這永遠(yuǎn)不會(huì)發(fā)生?!?/p>
這是一位在公司工作多年的高級(jí)管理人員所說的,他了解公司的業(yè)務(wù)流程。更何況我有什么資格去質(zhì)疑他,更別說他是一家付錢給我來制造這種產(chǎn)品的公司的高管了。
幾個(gè)月后,就在軟件上線前幾周,客戶端的一名測試人員發(fā)現(xiàn)了一個(gè)缺陷,并將其分配給了我。當(dāng)我看到缺陷的細(xì)節(jié)時(shí),我笑出聲來。這個(gè)Bug正是我所擔(dān)心的覆蓋默認(rèn)條款和條件的事情,我被告知永遠(yuǎn)不會(huì)發(fā)生的問題。
修復(fù)相對(duì)容易,錯(cuò)誤的后果也很低,但這種經(jīng)歷在我的職業(yè)生涯建設(shè)軟件中是一個(gè)反復(fù)出現(xiàn)的主題。我和大量的軟件工程師同事交談過,知道我并不孤單。問題如果不被發(fā)現(xiàn),就總會(huì)變得更大,更難解決,修復(fù)成本更高,但是問題的根源通常是相同的:需求不清楚,不一致,或者是錯(cuò)誤的。
圖片
2、人工智能:國際象棋/自動(dòng)駕駛
人工智能的概念已經(jīng)存在了很長一段時(shí)間近來高調(diào)的進(jìn)步也引起了媒體的關(guān)注。我們可以說的是,人工智能在某些領(lǐng)域已經(jīng)非常成功了。
早在20世紀(jì)80年代,人工智能就已經(jīng)被應(yīng)用于國際象棋。人們普遍認(rèn)為,人工智能已經(jīng)超過了人類在國際象棋中的能力。這不奇怪,因?yàn)閲H象棋的參數(shù)是有限的)。
國際象棋總是從64個(gè)方格上的32個(gè)棋子開始,有很好的記錄和官方認(rèn)可的規(guī)則,最重要的是有明確的目標(biāo)。下棋只是遵循一個(gè)規(guī)則引擎。人工智能系統(tǒng)可以計(jì)算每一步棋的影響,以選擇最有可能的結(jié)果來擊敗對(duì)手的棋子或獲得位置,并最取勝。
人工智能一直非常活躍的另一個(gè)領(lǐng)域是自動(dòng)駕駛汽車,制造商承諾自動(dòng)駕駛汽車已經(jīng)有一段時(shí)間了。但在絕大部分情況下,汽車仍需要主動(dòng)監(jiān)督;駕駛員可能需要將手放在方向盤上,自動(dòng)駕駛功能目前仍然不是自主的。
像下棋的人工智能程序一樣,自動(dòng)駕駛汽車在很大程度上也使用基于規(guī)則的引擎做決定。與國際象棋程序不同,如何在每種可能的情況下導(dǎo)航的規(guī)則沒有明確定義。在給定的行程中,司機(jī)會(huì)做出成千上萬個(gè)小判斷,比如避開行人、繞開并排停放的汽車、在繁忙的十字路口轉(zhuǎn)彎。做出正確的判斷意味著你最終會(huì)到達(dá)商場還是到達(dá)醫(yī)院。
在技術(shù)上,網(wǎng)站或服務(wù)的標(biāo)準(zhǔn)是5—6個(gè)9,也就是在99.999%(或99.9999%)的時(shí)間內(nèi)可用。實(shí)現(xiàn)前99%的成本并不算高。這意味著你的網(wǎng)站或服務(wù)一年中可能會(huì)有三天(87.6小時(shí))的停機(jī)時(shí)間。然而,每增加一個(gè)9,實(shí)現(xiàn)的成本就會(huì)指數(shù)級(jí)增長。當(dāng)你達(dá)到99.9999%時(shí),一年只能允許31.5秒的停機(jī)時(shí)間。它需要更多的計(jì)劃和努力,當(dāng)然也更昂貴。獲得前99%可能不容易,但按比例來說,這比最后那一小部分要容易得多,也便宜得多。
無論自動(dòng)駕駛離足夠好有多近,總有發(fā)生事故的風(fēng)險(xiǎn)。人類開車時(shí),這些風(fēng)險(xiǎn)也會(huì)每天發(fā)生。我不知道政府可以接受的事故率和死亡率是多少,但自動(dòng)駕駛想要實(shí)現(xiàn)大范圍普及,它至少要和人類做得一樣好。
之所以如此難以達(dá)到可接受的安全水平,是因?yàn)轳{駛汽車比下棋需要更多的變量,而這些變量是無限的。前95%或99%可能是可預(yù)測的,也很容易解釋。然而,在那第之后有如此多的邊緣案例,并且每一個(gè)都可能是獨(dú)特的;道路上其他人駕駛的其他車輛、道路封閉、施工、事故、天氣事件等等。
讓人工智能模型解釋和識(shí)別這些異常和邊緣情況明顯更難,更重要的是如何在不發(fā)生事故的情況下做出適當(dāng)?shù)姆磻?yīng)。每個(gè)邊緣案例可能共享一些特征,但它們很少相同,這使得人工智能更難確定適當(dāng)?shù)膽?yīng)對(duì)方式。
3、AI不能創(chuàng)造軟件,只能創(chuàng)造代碼
相比于下棋,創(chuàng)建和維護(hù)軟件與開車的邏輯更加接近,涉及的變量很多。當(dāng)你在構(gòu)建軟件時(shí),你可能會(huì)有一個(gè)期望的結(jié)果,但它不太可能像國際象棋一樣單一。軟件總會(huì)面臨功能增加與錯(cuò)誤修復(fù),這是一個(gè)持續(xù)的過程。這并不像下棋,一旦贏了或輸了就結(jié)束了。
在軟件開發(fā)中,我們確實(shí)有一個(gè)工具可以讓我們的軟件設(shè)計(jì)更接近嚴(yán)格控制的國際象棋規(guī)則引擎:技術(shù)規(guī)范。在最好的情況下,規(guī)范會(huì)遍歷預(yù)期的用戶行為和程序流。用戶是這樣購買產(chǎn)品的:點(diǎn)擊這個(gè)按鈕,創(chuàng)建這個(gè)數(shù)據(jù)結(jié)構(gòu),運(yùn)行這個(gè)服務(wù)。然而太多時(shí)候,我們得到的需求清單是功能規(guī)格、架構(gòu)圖和不清楚的需求文檔,并被告知要在此基礎(chǔ)上做好判斷。
更糟糕的是,需求常常會(huì)發(fā)生變化或者被忽略。最近,我被要求構(gòu)建一個(gè)可以讓用戶通過做有關(guān)自己身體感覺的選擇題來判斷是否感染新冠的功能。該應(yīng)用程序?qū)⒂糜谌驔]有可靠WIFI的地區(qū)。團(tuán)隊(duì)希望我?guī)椭鷺?gòu)建一個(gè)可以通過SMS(手機(jī)短信)進(jìn)行調(diào)查的應(yīng)用程序。
起初我對(duì)此很感興趣,但當(dāng)我聽到團(tuán)隊(duì)描述他們想要什么時(shí),我意識(shí)到這將是一個(gè)問題。對(duì)于零售公司來說,以1-10為標(biāo)準(zhǔn)詢問您再次光顧他們商店的可能性是一回事,這與用多項(xiàng)選擇題詢問關(guān)于用戶感染新冠時(shí)的癥狀的多步調(diào)查是非常不同的。我提出了這個(gè)過程中所有可能的失敗點(diǎn),并希望團(tuán)隊(duì)明確定義我們將如何處理所有問題的答案。
在明確所有這些問題之后,團(tuán)隊(duì)得出了相同的結(jié)論——我們決定暫時(shí)放棄這項(xiàng)功能,這實(shí)際上是一個(gè)成功的結(jié)果。如果在提交無效用戶數(shù)據(jù)時(shí)沒有明確解決所有潛在的問題,那將造成是更大的浪費(fèi)。
使用人工智能創(chuàng)建軟件背后的想法是讓這些利益相關(guān)者直接與計(jì)算機(jī)對(duì)話來創(chuàng)建基于SMS的調(diào)查,但AI并不會(huì)問一些試探性的問題,比如如何處理通過短信收集調(diào)查數(shù)據(jù)時(shí)可能出現(xiàn)的問題,它無法解釋人類可能會(huì)做錯(cuò)的事情,也不知道該如何處理這些失誤。
為了利用人工智能構(gòu)建一個(gè)功能性的軟件,你需要知道你想要什么,并且能夠清楚準(zhǔn)確地定義它。盡管有時(shí)候我只是為自己寫軟件,但往往直到我真正開始寫代碼時(shí),我才意識(shí)到其中的困難和挑戰(zhàn)。
4、瀑布vs敏捷,AI做不到的事
在過去的十年中,軟件行業(yè)已經(jīng)從瀑布方法過渡到了敏捷。瀑布在編寫任何代碼之前會(huì)準(zhǔn)確定義你想要的內(nèi)容,而敏捷則提供了足夠的靈活性,因此開發(fā)者可以在編寫過程中進(jìn)行調(diào)整。
但是事實(shí),很多使用瀑布的軟件項(xiàng)目都失敗了,因?yàn)轭I(lǐng)導(dǎo)者認(rèn)為他們知道他們想要什么,并認(rèn)為他們可以準(zhǔn)確地描述它并記錄它,但是當(dāng)最終產(chǎn)品交付時(shí)卻并不是這樣。最終,敏捷軟件開發(fā)模式成為了這個(gè)問題的解毒劑。
人工智能最適合做的,可能是用更成熟的語言重寫我們已經(jīng)擁有的軟件。目前仍然有很多機(jī)構(gòu)使用非常古老的軟件,而這些軟件通常是由非常古老的語言所構(gòu)建的,但是學(xué)習(xí)如何使用它們的程序員越來越少,這會(huì)是將來人工智能的一大優(yōu)勢。如果你確切地知道你想要什么,也許你可以讓人工智能比人類程序員更快更便宜地生產(chǎn)軟件。我相信人工智能可以創(chuàng)造出比人類程序員更快的軟件,但那是因?yàn)橛腥嗽谶@個(gè)過程中發(fā)現(xiàn)了軟件應(yīng)該做什么。
人工智能實(shí)際上在使用瀑布方式構(gòu)建軟件方面做得更好,而人類通常并不擅長于此。但開發(fā)一款成功軟件的流程并不單單是將文檔交給一個(gè)研發(fā)團(tuán)隊(duì),然后由他們完全按照文檔進(jìn)行編碼。人工智能可以做一些非凡的事情,但它不能讀懂你的思想,也不能告訴你你到底應(yīng)該做些什么。