王俊煜
“我覺得,你們還是應(yīng)該下決心扔掉現(xiàn)在的包袱,重新開始?!币曨l會(huì)議對面的人說。大概是怕無意中冒犯到我們,畢竟這句話聽起來像是說給失足青年的,他又補(bǔ)充了一句,“可能是我站著說話不腰疼吧?!?/p>
我們在討論閱覽室的iOS App,對面是蘋果開發(fā)者部門工程師。這是一次一對一的技術(shù)咨詢,屬于蘋果為需要扶持的App開發(fā)者提供的服務(wù)。我在蘋果的官方渠道填寫表單申請的。
我們當(dāng)然需要扶持啊。我們正在開發(fā)App的兩位工程師,一個(gè)月前還不會(huì)寫iOS。一位是我們的合伙人范懷宇,我們一般管他叫范老師。我和范老師從2011年一起在豌豆莢工作,他是中國最早接觸安卓開發(fā)的那批工程師,著有一本叫《Android開發(fā)精要》的書,其豆瓣評分一直是我們調(diào)侃的對象。我是看范老師的blog認(rèn)識了他。因?yàn)榘沧康拈_放性,當(dāng)年我們對安卓都是真愛,可以說正因此我們才有機(jī)會(huì)在一起工作。時(shí)過境遷,范老師要開始學(xué)習(xí)寫iOS App了。
明明擅長安卓,但正式開始開發(fā)閱覽室App的時(shí)候,我們決定先做iOS版本。是沒有困難也要制造困難的意思嗎?也不是。定性和定量分析都可以充分支持一個(gè)判斷。盡管安卓絕對用戶量更大,那些喜歡認(rèn)真閱讀、對內(nèi)容品質(zhì)和體驗(yàn)有更高追求的人,還是更容易在iPhone用戶里找到,他們也應(yīng)該是最早開始使用閱覽室的一群用戶。
從前寫安卓,是對技術(shù)的癡迷和熱血;現(xiàn)在寫iOS,則是對閱讀對使命的熱愛。
可以說,從前寫安卓,是對技術(shù)的癡迷和熱血;現(xiàn)在寫iOS,則是對閱讀對使命的熱愛。一把年紀(jì)從頭開始學(xué)習(xí)一個(gè)新的平臺,讓人感動(dòng)。
范老師很自信,覺得沒有什么編程語言是他學(xué)不會(huì)的,而且學(xué)習(xí)新東西本來也是樂趣。事實(shí)證明……他是對的。范老師和我們另外一個(gè)安卓工程師楊佳東開始自學(xué)iOS開發(fā),沒多久,我們就在他的手機(jī)上看到一個(gè)新的App了。
新手畢竟是新手。盡管不同平臺在“道”上是相通的,作為資深工程師很容易上手,但iOS開發(fā)有一些特別入門的“術(shù)”。比如,范老師就一直沒有學(xué)會(huì)如何把App打包放到別人的手機(jī)上,我們一開始只能拿他的手機(jī)來看,遠(yuǎn)程的同學(xué)只能靠想象—似乎他到現(xiàn)在也還沒有學(xué)會(huì),只是他把這個(gè)工作交給了佳東。
這也是為什么我預(yù)約了蘋果的技術(shù)咨詢。
蘋果的工程師在開會(huì)之前并不知道我們是誰。讓我驚訝的是,我一說“閱覽室”,對方就知道了。原來他也看到了我們的“預(yù)售”,表示挺佩服的。他還說,以前住錦秋家園的時(shí)候可以搜索到我們辦公室的Wi-Fi—豌豆莢2011年的時(shí)候在錦秋家園租了一套住宅辦公。親切的寒暄結(jié)束后,范老師開始介紹App現(xiàn)在的架構(gòu)設(shè)計(jì),介紹到所用的某個(gè)框架時(shí),對方至少驚呼了三遍:
“你們用的這個(gè)也太老了吧!”
我們其實(shí)是在輕芒的基礎(chǔ)上開發(fā)閱覽室,而輕芒的前身又是豌豆莢在2014年前后開始開發(fā)的,也就是說,閱覽室App雖然是個(gè)“新”App,但里面的某些代碼已經(jīng)是8年前寫的了。被吐槽“古老”的框架,是8年前我們的工程師選擇的一個(gè)由Uber開發(fā)的框架。要知道,8年前Uber還是引領(lǐng)潮流的當(dāng)紅公司。但以我們這個(gè)行業(yè)的時(shí)間維度,8年前簡直就是上古時(shí)代—現(xiàn)在早就沒有人在繼續(xù)維護(hù)這些框架了。
那為什么要在一個(gè)老App的基礎(chǔ)上開發(fā)呢?因?yàn)橹拔覀冊诋a(chǎn)品規(guī)劃階段做的另一個(gè)決策,就是決定將輕芒在過去幾年開發(fā)過的功能,如果可以,盡量“遷徙”到閱覽室中。我管這個(gè)叫“大遷徙”。在吃完俄羅斯菜以后,我們決定閱覽室“先做做看吧”。我負(fù)責(zé)產(chǎn)品規(guī)劃,首先就是要決定這個(gè)App要包括什么功能。
“創(chuàng)業(yè)”就是要做新的事情,這好像是一個(gè)亙古不變的真理。我們這個(gè)行業(yè)尤其喜新厭舊。市場喜歡“全新”的東西,營銷部門總是把這個(gè)詞放在標(biāo)題中,iPhone每年都有新款,Chrome瀏覽器每四周會(huì)發(fā)布一個(gè)新版本。我偶爾寫寫前端頁面,大概幾個(gè)月一次,差不多每次都得重新學(xué)習(xí)最新的開發(fā)框架。做事情的人也喜歡“全新”的東西。沒有一個(gè)工程師愿意接手一個(gè)別人的項(xiàng)目。何況,我們之前的產(chǎn)品在商業(yè)上也不算成功,不保留之前任何的工作,全部推倒重來,也是合理的。
我不知道在大家的想象里,一個(gè)App的功能是如何決定的。在我過去的工作所建立的框架中,這既是一個(gè)創(chuàng)造性工作,又被嚴(yán)格的方法論約束,大概就像解一道幾何題。這次,我在紙上畫了一些設(shè)計(jì)稿草圖,又往下構(gòu)思了幾條功能,感覺似曾相識,這不都是我們在輕芒已經(jīng)解決過的問題嗎?雖然App首頁長得很不一樣,但要解決的用戶的具體問題,以及能想到的解決方案都沒有什么區(qū)別。打個(gè)比方,就像是拿起卷子,發(fā)現(xiàn)這不是我以前做過的題嗎?
連這個(gè)感受都是似曾相識的,我在專欄的第一期講述過當(dāng)我意識到“閱覽室”這個(gè)想法和輕芒沒有太大區(qū)別時(shí)的沮喪。我當(dāng)時(shí)自圓其說的方式都可以沿用—一個(gè)穩(wěn)定的系統(tǒng),輸入和外部條件沒有變化,輸出自然也不需要有變化。在這個(gè)案例中,輸入可以認(rèn)為是對用戶的理解,這幾年來有進(jìn)化,但沒有推翻;外部條件,可以說是市場環(huán)境和技術(shù)進(jìn)步,我認(rèn)為和一開始做輕芒時(shí)也沒有本質(zhì)變化。系統(tǒng),也就是我的腦子,我也認(rèn)為它作為一個(gè)決策系統(tǒng),是足夠穩(wěn)定的。那么,我們就直接拿以前的答案來,不是也很好嗎?
況且,這些問題我們已經(jīng)解了六年了,這里面應(yīng)該有很多寶貴的積累才是。
既然邏輯推導(dǎo)的結(jié)果是以前的功能就很好,那就用已有的功能吧。畢竟我們也不是典型的“創(chuàng)業(yè)”團(tuán)隊(duì),違反“常識”的地方多了。所以,閱覽室App第一期的規(guī)劃,可以說大量工作都是“新瓶裝舊酒”。
但也是有“全新”的工作的。比如我們做了新的視覺設(shè)計(jì),我也為閱覽室的新定位專門設(shè)計(jì)了2到3個(gè)亮點(diǎn)功能,還有圍繞幾個(gè)主題,比如強(qiáng)化“閱讀習(xí)慣養(yǎng)成”和“社區(qū)氛圍”等等做的小功能。補(bǔ)充一些理論背景,在整個(gè)行業(yè)充分競爭的背景下,一個(gè)App的大部分功能都不會(huì)是差異化的。比如,幾乎所有支持上傳頭像的App都提供剪裁功能,但做這個(gè)功能并不能創(chuàng)造獨(dú)特的、“非我不可”的價(jià)值。一般新產(chǎn)品在初期應(yīng)該更著重自己差異化的、“非我不可”的部分,再慢慢補(bǔ)齊一些“沒有不行”的功能。
所以,決定盡量“遷徙”我們之前的產(chǎn)品功能,其實(shí)是讓新的App一開始就擁有比較完善的“沒有不行”的功能,使其是一個(gè)相對成熟App的狀態(tài)。需要做出亮點(diǎn)的,還是要做亮點(diǎn)。“新瓶裝舊酒”,新瓶也要花很多功夫。至于推倒重來—人們總是覺得重來一次自己一定會(huì)比之前做得更好,但也往往無法正確預(yù)估自己的能力。我們上次大規(guī)模重寫的時(shí)候,原計(jì)劃花2個(gè)月,實(shí)際上花了15個(gè)月,質(zhì)量是否有提升不得而知。
保留之前的功能而不是推倒重來,看起來是一個(gè)理智的決定,但也是一個(gè)充滿風(fēng)險(xiǎn)的決定。我們要付出額外的財(cái)務(wù)成本才可以獲得之前代碼的使用許可,畢竟這是兩個(gè)不同的公司。我們也難以預(yù)料將舊的功能改造成我們滿意的狀態(tài)需要花費(fèi)多少時(shí)間,我們只是相信,總該比從頭再來快一些吧。只能說,在已知的信息下,“遷徙”看起來是一個(gè)好的決定。至于最后來看是不是一個(gè)好的決定,以后才有答案。
范老師另外一個(gè)自信,就是覺得沒有他看不懂的代碼。但即使好脾氣如他,我也不時(shí)聽到他在我對面的工位上抓著頭發(fā)說臟話。那一定是在讀之前留下來的代碼。之前做輕芒雜志的時(shí)候,受限于人手,不少功能和交互在質(zhì)量上其實(shí)都做了妥協(xié)?,F(xiàn)在,范老師和我制定了新的質(zhì)量標(biāo)準(zhǔn),如果一個(gè)舊的功能不費(fèi)什么力氣就可以符合質(zhì)量標(biāo)準(zhǔn),我們就會(huì)遷徙過來并啟用,然后再逐步重構(gòu)。否則,我們會(huì)先關(guān)閉這個(gè)功能。慢一點(diǎn)就慢一點(diǎn),功能一開始少一點(diǎn)就少一點(diǎn)。
傳承的另一種說法就是包袱。為了降低風(fēng)險(xiǎn),我們反而決定將風(fēng)險(xiǎn)最高的遷徙工作放在最前面。這部分工作的難度和工作量都難以估計(jì),數(shù)量、質(zhì)量和時(shí)間無法兼顧。按范老師的說法,起碼我們得先知道冰山底下有多深。我算了一下,過去在輕芒發(fā)布過的功能點(diǎn)大約有770個(gè),加上規(guī)劃中的總共有1600個(gè),有一些功能由于產(chǎn)品定位的變化,在一開始就明確了不會(huì)保留;其余的功能點(diǎn),到2月底為止我們做了徹底的整理,保留了其中的286個(gè)。冰山底下,看清楚了。
我借機(jī)做了許多處女座該做的事情,美其名曰“打好基礎(chǔ)”。我在整理自己的計(jì)時(shí)單時(shí)驚訝地發(fā)現(xiàn),我單單在整理已有功能并尋找一個(gè)較為漂亮的方法來組織整理上,就花了66小時(shí)。周夢婷聽說后語重心長地和我說,她也是處女座,但她覺得一個(gè)人在多大程度上能和不完美共存,會(huì)決定他的智慧的高度。
聽起來她的意思是我還有很大的進(jìn)步空間。但,我們決定“新瓶裝舊酒”而不是推倒重來,某種程度上也是選擇和不完美共存吧。