—“聽說我們的PM被綁票了!綁匪要我們送200萬不然就要澆汽油把他燒死!你要不要捐點(diǎn)?好多人都捐了?!? —“一般是捐多少?” —“不好說,有捐10升的,也有捐5升的?!?/p>
使用“碼農(nóng)”這個(gè)說法純粹是一種個(gè)人習(xí)慣。我有不少程序員朋友,這個(gè)稱謂并不包含任何貶義或侮辱。事實(shí)上,他們也經(jīng)常自稱“碼農(nóng)”——有時(shí)還自稱“碼畜”,這種惡習(xí)你就當(dāng)沒看見好了。
小時(shí)候,90年代初,我學(xué)過一點(diǎn)編程。當(dāng)時(shí)用的機(jī)器是Laser310,語言是BASIC。后來上大學(xué),學(xué)了一陣Fortran;2000年網(wǎng)絡(luò)時(shí)代開啟,研究了一點(diǎn)HTML、Javascript;再往后因?yàn)楦銛?shù)值策劃要用Excel,還用過Excel里的VBA。我的主業(yè)是PM也即產(chǎn)品經(jīng)理,但粗通一點(diǎn)最基本的編程算法,這是個(gè)大前提。
接下來插播個(gè)老笑話:
“聽說我們的PM被綁票了!綁匪要我們送200萬不然就要澆汽油把他燒死!你要不要捐點(diǎn)?好多人都捐了?!?/p>
“一般是捐多少?”
“不好說,有捐10升的,也有捐5升的?!?/p>
這個(gè)老段子說明PM與碼農(nóng)之間的干群關(guān)系那是相當(dāng)緊張了。作為粗通編程的PM,我有時(shí)會(跳出工作)思考一個(gè)問題,那就是編程到底有多難?如果難,有可能是難在什么地方?(還有一個(gè)問題就是“我要怎么學(xué)會編程,成為一個(gè)內(nèi)行,然后再抽打這幫碼農(nóng)干活”,不過僅是想像)這種思考的歷史相當(dāng)悠久,有時(shí)會促使我去自學(xué)編程,但往往由于沒有專業(yè)指導(dǎo)、缺乏實(shí)例,最后不了了之。
恰好最近出了個(gè)游戲《Human Resource Machine》,中文或可稱為《碼農(nóng)游戲》。作者號稱……(省略200字常見忽悠)基于上述原因,我斥資人民幣30元,全款購置了這款游戲。玩了2個(gè)小時(shí)后,獲得一些感受,現(xiàn)在與大家分享。
第一個(gè)感慨是“需求”。我玩的是英文版本——下載下來就是英文,沒找到在哪改語言選項(xiàng)。反正也勉強(qiáng)能看懂,就湊合著玩了(據(jù)說中文版是機(jī)翻,比英文版還要難懂)。但是人生總有不能湊合之處,比如在第4關(guān)就整了半天過不去,最后發(fā)現(xiàn)是讀常量后取常量的順序不對……
這讓我想到碼農(nóng)們平時(shí)的抱怨:你們PM連個(gè)需求都提不好!天地良心,我本人做的策劃和提的需求都無懈可擊,因?yàn)槲沂蔷庉嫵錾恚懊枋觥庇谖叶圆贿^是雕蟲小技——但我也確實(shí)看過一些略顯猙獰的需求文檔。假如一定要下個(gè)結(jié)論,我覺得市面上起碼有70%的需求文檔、產(chǎn)品文檔是有問題的,強(qiáng)于Sense,但輸在Description。
為了避開這個(gè)問題,很多情況下PM提的需求是“下載xxx(APP名),然后照著抄一個(gè)!”這個(gè)段子經(jīng)常被拿來調(diào)侃PM的無能。事實(shí)上在我們看來,效率最高的方法就是最好的方法;所以如果這種方法程序員能理解,那也沒有什么不可以,反正也沒有更好的方法。但不管怎么樣,需求,或說為了實(shí)現(xiàn)需求而必不可少的溝通,是PM和碼農(nóng)之間最重要、同時(shí)也是最困難的事。
本著有限的編程知識,我曾作出總結(jié):算法就是條件跳轉(zhuǎn)+定義過的數(shù)組存取。在這么說的時(shí)候,我并沒有意識到自己用的是何等高級的語言——BASIC很高級嗎?好像還真是,因?yàn)長aser310上可以跑匯編語言(我不會,學(xué)長們用過)。當(dāng)我開始玩這個(gè)游戲時(shí),才明白BASIC、C、Python是何等方便……
舉個(gè)例子。游戲里有一關(guān)要求你取兩個(gè)數(shù);如果它們同為正或同為負(fù),輸出結(jié)果0,否則輸出結(jié)果1。這聽起來非常容易且清晰,if a*b=|a*b| then print 0 esle print 1,一句話的事(||是數(shù)學(xué)上的絕對值符號,函數(shù)形式是Sab())。在不同語言里它的寫法可能略有區(qū)別,但意思是清楚的。問題是,這一關(guān)里根本沒有乘法讓你用!不但沒有乘法,當(dāng)然也沒有絕對值函數(shù),沒有條件判斷或說不支持這個(gè)格式的條件判斷……你定睛一看,除了最后輸出的部分,這整行命令里沒一條是能使的,好比讓你造條航母但不給螺絲刀,你得徒手去把螺絲都給擰上……
后來我是用一個(gè)三叉判斷實(shí)現(xiàn)了目的:英語不好的人想不出一個(gè)意思怎么說,就用一個(gè)從句代替,最后句子里從句套從句像野生糖葫蘆。算法思路不清晰的人會大量使用條件判斷,最后整個(gè)程序里滿是條件判斷和跳轉(zhuǎn),是數(shù)碼版野生糖葫蘆。這樣做的惡果,下面馬上就要講到。
游戲大概有30多關(guān)(我現(xiàn)在玩到19關(guān)),過關(guān)條件是完成經(jīng)理的要求,但還有2個(gè)獎勵(lì)目標(biāo)(類似手游里的三星過關(guān),打不到三星就掃蕩不了,這么說你應(yīng)該懂了),分別是命令數(shù)和步驟數(shù)。前者要求你盡可能少用命令,多用循環(huán);后者相反,希望你提高效率少用循環(huán)。這兩個(gè)目標(biāo)一定程度上可以說是對立的,所以你往往需要寫出兩種風(fēng)格截然不同的程序,分兩次來完成。
還有一種可能就是兩個(gè)目標(biāo)都完成不了,對于那些半路出家的PM尤其如此——我寫的程序,我自己都覺得臃腫而笨拙。我知道它一定能跑通,也知道它一定能實(shí)現(xiàn)需求,但同時(shí)我也知道它效率極低:游戲提示若只用30步實(shí)現(xiàn)就可完成任務(wù),而我用了60多步!這個(gè)事情告訴我們老程序員的意義,那就是提高程序的整體效率。
諷刺的是,這種提高很多時(shí)候并不能體現(xiàn)出價(jià)值。王小波講過一個(gè)故事,那是他在美國跟著導(dǎo)師(又叫“老板”)做項(xiàng)目、寫程序的故事。第一個(gè)程序?qū)懲炅耍貏e短,老師驚呆了。結(jié)果一跑之下居然沒問題,老師大喜,但最后算錢時(shí)他的錢最少,原來程序是按行算錢。這可把他氣壞了,第二次他就拼命往長里寫——我們知道這相當(dāng)簡單——結(jié)果程序交上去老師一看長度,根本沒問能不能跑,直接給他退回來了。
(這事情還有個(gè)后續(xù)。他被老師整得不輕,敢怒而不敢言,就把程序名取成"Caonima1",“Caonima2”這樣。老外不發(fā)“C”這個(gè)音,導(dǎo)師老是念成“Kaonima”,他就糾正,不是Kaonima,是Caonima!)
確實(shí)“效率”二字很難具現(xiàn)化為KPI。評論車的好壞,一個(gè)標(biāo)準(zhǔn)是“百碼加速”,加速時(shí)間越短就越好,但程序卻沒有類似的“百毫秒響應(yīng)值”,即便有,在整個(gè)產(chǎn)品流程里究竟占多大比重也值得懷疑。我看過一些關(guān)于傳奇程序員約翰·卡馬克的故事,內(nèi)中提到他如何用一個(gè)天才公式進(jìn)行顯卡的多邊形貼圖運(yùn)算。毫無疑問,卡馬克是一個(gè)出類拔萃的程序員,碼農(nóng)之王。但說實(shí)話,他做的引擎不錯(cuò),他出品的游戲(比如Doom4)卻相當(dāng)垃圾;他知道怎么讓畫面精美,卻無法設(shè)計(jì)出有游戲性的關(guān)卡,更不知道怎么搞市場營銷。他是碼農(nóng)之王,不是游戲制作人之王,更不是CEO之王。
不幸的是,今天的行業(yè)里,經(jīng)常要求一個(gè)人同時(shí)成為碼農(nóng)之王,制作人之王,CEO之王,甚至包括美術(shù)之王、市場之王、運(yùn)維之王乃至成本控制之王。更不幸的是,一位碼農(nóng)如果真的精于Coding,他就難得在其他方面亦有建樹。小團(tuán)隊(duì)的悲哀,一部分就在于此。
(反例肯定是有的。比如那位在常用表情里睜大眼睛對你說“想想如果不花錢你會變得更強(qiáng)嗎”的人,他就是碼農(nóng)出身。但話說回來,這樣的例子相當(dāng)少啊)
還有一點(diǎn)小感受是UI方面的。這個(gè)游戲非常不友好地禁止了路標(biāo)(或許是因?yàn)閰R編語言特性),從而BASIC語言里極為方便的“Goto 行號”用法不可能有了,你必須手動把箭頭拖曳至目標(biāo)位置。當(dāng)條件跳轉(zhuǎn)超過5個(gè)時(shí)(由于沒有循環(huán),這個(gè)數(shù)量很容易達(dá)到),你會看到滿天都是跳轉(zhuǎn)軌跡。另一方面,屏幕所能顯示的命令行有限,在拖動時(shí)又可能誤操作、拖到跳轉(zhuǎn)軌跡。而你根本不可能記住“那個(gè)箭頭之前在什么位置”,于是唯一的解決方案就是拉到最下去使用游戲提供的“Undo”按鈕,但這個(gè)拉動本身又可能觸發(fā)其他的誤操作……
我的意思是,一個(gè)好的編輯器很關(guān)鍵。我現(xiàn)在用的Sublime Text是以前一個(gè)寫Python的好漢推薦的,當(dāng)然我主要用它來做文字錄入(取代了以前用的Notepad)。編輯器具體要用什么,碼農(nóng)朋友們肯定各有各的愛好,而類似的道理也可以應(yīng)用在其他方面。就像我組電腦時(shí),別的無所謂,但屏幕和鍵盤一定要選最好的。這個(gè)道理是這樣的:屏幕天天看,鍵盤天天打,不選好的那不是和自己過不去?CPU慢你可以少開幾個(gè)窗口,硬盤小之前下的片子你就勤刪一點(diǎn),未必屏幕15寸的你還能在自己臉上架個(gè)放大鏡假裝是17寸?
找到工作中的“關(guān)鍵點(diǎn)”,也是一種能力。當(dāng)然,這個(gè)能力的主要因變量是工作經(jīng)驗(yàn)。
現(xiàn)在我卡在第19關(guān)了。這關(guān)要求對4個(gè)量進(jìn)行排序然后依次輸出,如果用BASIC來操作可能早已完成,但這該死的匯編……我現(xiàn)在寫到69行了,還有最復(fù)雜的一個(gè)情況沒有處理,最終結(jié)果應(yīng)該會超過100行,這一定有什么地方不對:游戲給了Bump+、Bump-兩個(gè)操作到底要怎么用?昨天玩到3點(diǎn)鐘含恨睡下,今早8點(diǎn)起來之后還一直在思考——這游戲是有點(diǎn)燒腦子。有鑒于此我想起另一個(gè)關(guān)于碼農(nóng)的段子:
“昨天晚上我走的時(shí)候問你什么時(shí)候好,你不是說下班前一定給我?怎么今早來了你還沒弄完?”
“我也沒說我已經(jīng)下班了?。俊?/p>
* 本文系作者投稿,不代表觸樂網(wǎng)站觀點(diǎn)。