AI便簽工具的正式版終于開發(fā)完了。最后一步,將版本號修改為1.0.0,提交,發(fā)布。
斷斷續(xù)續(xù)地,這個“小”產(chǎn)品居然開發(fā)了一年多,遠(yuǎn)遠(yuǎn)超過了我最初的預(yù)期。除了一部分工作由閱覽室的兩位創(chuàng)始讀者兼職完成,大部分的設(shè)計、研發(fā)工作都是我自己動手完成的。這是我第一次從0到1地獨(dú)立完成一個產(chǎn)品的開發(fā)和上線,我也算是“獨(dú)立開發(fā)者”了—我并不以此為豪,因為如果純粹從商業(yè)角度考慮,這并不是一個具有性價比的理智決定。我沒有想過要將生命中整整一年的時間花在這樣的一個“小”產(chǎn)品上,而且還是以工程師的角色。這肯定不是我擅長的事情。
雖然如此,我還是很高興自己堅持把它做完了。完成一個事情,對我來說很重要。
那么,如果再做一次,會有什么區(qū)別?
回想2023年7月重啟閱覽室的工作,當(dāng)時我的想法很簡單:每周做一個不同的產(chǎn)品原型,這樣子一個月可以做出4個,借此“熱身”,進(jìn)入工作狀態(tài)。一開始決定自己來寫代碼而不是招人來做,是考慮到原型對代碼質(zhì)量的要求不高,我作為一個三腳貓功夫的程序員在AI的輔助下完全可以勝任,另一方面是認(rèn)為對于這個階段的AI產(chǎn)品來說,要做出創(chuàng)新和突破,設(shè)計和工程無法分開,需要一邊開發(fā)一邊摸索可能性。自己來做,雖然工程上沒有那么熟練,效率可能反而會更高一些,迭代速度更快(見2023年9月刊《一個不同的主意》)。
從原型制作階段的實踐來看,這些想法大體是對的。以可以上線邀請朋友來內(nèi)測為標(biāo)準(zhǔn),制作一個原型實際上大約要花一個月的時間,而不是一周,這當(dāng)中的差異主要還是我高估了自己學(xué)習(xí)新技術(shù)和編寫代碼的能力,但應(yīng)該還是比找人來做要快的。
AI便簽是其中的2號原型。原型制作完成后,我們覺得這個產(chǎn)品應(yīng)該能在市場上占有一席之地,決定再花一些時間把它開發(fā)成可以正式發(fā)布的產(chǎn)品(2023年10月刊《解鎖創(chuàng)造力的驚喜》)。那是2023年9月,這個“一些時間”,當(dāng)時我們的估計是一個月。
首先,一個再簡單的產(chǎn)品,只要它是一個完整的產(chǎn)品,就沒法太簡單。
拿這個AI便簽產(chǎn)品來說,最初的原型我只寫了千余行代碼,到現(xiàn)在,則已經(jīng)超過萬行了。代碼量增加了10倍,核心功能其實沒有增加。那增加了什么東西呢?作為原型和作為一個供人使用、還打算賣錢的正式產(chǎn)品,要求多少還是有些區(qū)別的。舉個例子,這個產(chǎn)品有一個核心功能是將筆記保存到用戶的Notion賬號中,一開始為了節(jié)約開發(fā)成本,我們請用戶手動綁定Notion賬號,用戶需要在電腦上手動操作十余步,將兩串代碼復(fù)制粘貼到我們的輸入框中。能完成這個流程的用戶不足10%?,F(xiàn)在,用戶只需要點(diǎn)擊兩次確認(rèn),就可以完成這個過程。代價,是2000多行代碼。
這是一個付費(fèi)產(chǎn)品,我們需要開發(fā)對應(yīng)的支付系統(tǒng)和權(quán)限管理;原型代碼的穩(wěn)定性不足,用戶經(jīng)常無法及時得到結(jié)果,也需要改進(jìn);還有語音輸入、幫助和新手引導(dǎo)、營銷用的官網(wǎng)、注冊表單……等等。做原型的時候不需要考慮這些,正式上線的時候都需要。
所以說,只要是個完整產(chǎn)品,就不要太輕視它的復(fù)雜度,這些“沒有不行”的功能,大概就要占90%的工作量。需求文檔中每個小小的點(diǎn),都是工作量。
兩三周前的一天,我在制作產(chǎn)品的注冊表單。為了節(jié)約時間,我用的是現(xiàn)成的表單工具,即使是這樣,從早上開始做,等做完的時候天也已經(jīng)黑了?;叵胍徽斓墓ぷ?,也沒有什么浪費(fèi)時間的地方。只能說,這些工作本來就要花這么多時間,只是因為大部分的工作都由自己完成,這些工作量體現(xiàn)得更加明顯而已。
這些雖然占了工作量的大部分,畢竟還算是確定的工作量,做一件少一件。這一年中的大部分時間,并不是花在這類問題上的。
2023年9月,決定將原型開發(fā)成正式上線的產(chǎn)品時,我也清楚自己的工程能力不足以完成這項軟件工程工作,于是決定找專業(yè)的人來幫忙(2023年10月刊《解鎖創(chuàng)造力的驚喜》)。我在社交平臺上發(fā)布招聘帖后,有3位閱覽室的創(chuàng)始讀者以兼職的形式加入了我們,他們都是工程師。
我本來以為,從原型到正式產(chǎn)品是一個水到渠成的過程,對有經(jīng)驗的工程師們來說,都是迎刃而解的“已知問題”。實際上,一個AI產(chǎn)品的開發(fā),即使是在原型的基礎(chǔ)上將它完善成符合正式上線質(zhì)量標(biāo)準(zhǔn)的產(chǎn)品,也有一些開發(fā)其他產(chǎn)品時沒有的挑戰(zhàn)。其中,我認(rèn)為最重要的是大語言模型的輸出質(zhì)量不夠穩(wěn)定可靠的問題。來幫忙的幾位工程師之前都沒有開發(fā)過大語言模型應(yīng)用,要解決這個問題,對他們來說也需要重新學(xué)習(xí)、探索如何解決(2023年11月刊《有不確定性,才可能創(chuàng)新,才能自由自在》)。
由于這項工作需要不斷調(diào)整提示詞、參數(shù)、重新設(shè)計與模型的交互,和產(chǎn)品設(shè)計的意圖緊密相關(guān),最后還是我自己完成的。今年從年初到夏天,我都在做這個工作,在2024年8月刊的《從60分到90分》中我做了詳細(xì)的記錄。
如果僅從結(jié)果的角度考慮,再來一次的話,我想,也許及時知難而退是效率更高的做法。只是未知的領(lǐng)域往往會引起我學(xué)習(xí)的興趣,這樣的一個挑戰(zhàn)反而對我來說充滿了吸引力。而一旦開始深入研究,能探究的東西又越多,就越來越難收場了。
解決這個問題的過程同樣是一個軟件工程工作,說到底我也還是沒能逃開,只能硬上。AI編程在過去這一年中有很明顯的進(jìn)步。我剛開始開發(fā)原型的時候,主要是依靠AI局部補(bǔ)全代碼,今天的AI已經(jīng)可以按照你提出的需求,憑空寫出來一個完整的應(yīng)用了—但寫出來的代碼質(zhì)量也只能說勉強(qiáng)能運(yùn)行。我覺得今天的AI編程其實特別適合用來做一些“日拋型”的產(chǎn)品,比如給自己寫個一次性使用的數(shù)據(jù)處理腳本,給孩子寫個小游戲,或者,就像之前一樣用來做個產(chǎn)品原型,這些都可以全自動完成,效率和一年前相比可以說有10倍的提升。但我們在做的是一個有一定復(fù)雜度的、嚴(yán)肅的軟件工程項目,AI仍然很難獨(dú)立將代碼一次性寫對,這種情況下仍然需要開發(fā)者去理解其實現(xiàn)原理、給出更詳細(xì)和有針對性的指令。這對人的要求其實并沒有降低,因為你要作的是軟件架構(gòu)、設(shè)計方面的決策,這甚至不是剛?cè)腴T的工程師能完成的。
我只能說我努力去學(xué)了。我的學(xué)習(xí)習(xí)慣,往好的說是比較追求系統(tǒng)性,很難滿足于只得到一個不求甚解的答案,一定要搞清楚為什么;說不好的,就是太慢。
回頭來看,放棄可能是更理性的決定。某種程度上,我們這個AI便簽產(chǎn)品也在探索大語言模型的能力邊界。問題是,我的主要興趣實際是在產(chǎn)品交互上,花時間去探索這個邊界,以性價比考慮的話,是不太理智的。如果回到那個時候,如果確信大語言模型的能力無法輕而易舉地實現(xiàn)我想實現(xiàn)的效果,我應(yīng)該果斷擱置這個產(chǎn)品,去做那些大語言模型已經(jīng)被證明能做得很好的事情。等大語言模型的能力演進(jìn)后,再回來。
如果僅僅追求效率,就應(yīng)該盡量多做自己熟悉的事情,少做自己沒做過的事情。在過去幾年的工作中,由于我經(jīng)常成為團(tuán)隊瓶頸,答應(yīng)的事情沒有辦法按時完成,我真的定量統(tǒng)計過,自己估算的時間和實際花費(fèi)時間的差別。數(shù)據(jù)統(tǒng)計表明,在那些我最熟悉和擅長的領(lǐng)域,我所花的時間和預(yù)估的時間差別是最小的,甚至?xí)阮A(yù)估時間更快,例如產(chǎn)品策略、信息架構(gòu)設(shè)計、界面設(shè)計等。而一個領(lǐng)域我越不熟悉,預(yù)估時間的偏差就越大。
這里面還有一個因素是,即使是一個自己不擅長的領(lǐng)域,我也很難放棄對質(zhì)量標(biāo)準(zhǔn)的要求,這也導(dǎo)致我要花更多的時間去學(xué)習(xí),每個問題世界上最好的解法是什么。雖然最后出來的效果往往都不錯,但就是過程所花的時間是不可控的。一個典型的例子,就是產(chǎn)品的視覺設(shè)計。前面說到的軟件工程問題、提升大語言模型的輸出可靠性問題,都屬于此類。
這個過程中最痛苦的還是工作量永遠(yuǎn)沒有辦法預(yù)估。朋友問我什么時候能上線,我永遠(yuǎn)都回答“下周”—我每次這么回答的時候,都是真的覺得眼前的工作量不多了。我猜這大概和在沙漠里看到海市蜃樓的感受是類似的,總是覺得終點(diǎn)近在咫尺,卻永遠(yuǎn)走不到。這個狀態(tài)持續(xù)得久了,希望慢慢變成絕望,對自己的信心是很大的打擊,也容易迷失方向,不知道自己今天起床工作是為了什么,和目標(biāo)結(jié)果有什么關(guān)系。我倒不擔(dān)心自己做得不夠好,只擔(dān)心做得不夠快,還沒有走到終點(diǎn)的時候就已經(jīng)渴死了。這種情緒在過去幾年一直圍繞著我,在過去這一年中更加登峰造極。
當(dāng)然,站在今天的角度,那些曾經(jīng)不熟悉的事情,到今天都已經(jīng)變成我掌握的技能了。就拿大語言模型的輸出可靠性來說,現(xiàn)在我可以說自己對于怎么做出一個質(zhì)量較高的大語言模型應(yīng)用,已經(jīng)有明確的概念了。而且我也發(fā)現(xiàn),大部分的產(chǎn)品團(tuán)隊并沒有花時間去做這個事情,那么這就變成我的一個優(yōu)勢了。
回想起第一個版本的原型,去年夏天的一個下午,我利用prompt在ChatGPT中模擬了設(shè)想中的交互場景,興奮地認(rèn)為自己找到了一個新的產(chǎn)品方向,然后開始依葫蘆畫瓢地學(xué)寫代碼—如今真是已經(jīng)走了很遠(yuǎn)。
上線后,要走的路還更遠(yuǎn)。
第一財經(jīng)2024年12期