你的代碼值多少錢 ?你算過嗎
老板雇傭程序員來寫代碼,程序員的薪水是成本,產(chǎn)生的有效代碼是產(chǎn)品?;蛘哒f老板從程序員那里買代碼。程序員每寫一行代碼究竟能賺多少錢?不妨來推導(dǎo)一下。
我們規(guī)定程序員書寫、重構(gòu)、改bug產(chǎn)生的變化行數(shù)都算做生產(chǎn)行(Line),把所有生產(chǎn)行分為三個(gè)等級:框架(structure)、功能(feature)、邏輯(logic);將程序員在單位時(shí)間內(nèi)寫的三類生產(chǎn)行分別設(shè)為Ls、Lf、Ll;每種生產(chǎn)行的權(quán)值分別為Ws、Wf、Wl。生產(chǎn)行失效率為P(0到1之間),失效的生產(chǎn)行指在老代碼運(yùn)行過若干次后被重構(gòu)成了新的代碼(在開發(fā)階段快速迭代重構(gòu)只計(jì)算最終的生產(chǎn)行不算失效)或者被驗(yàn)證有bug后改正的代碼。則該程序員在單位時(shí)間內(nèi)寫的代碼的價(jià)值為Vt = (Ls×Ws+Lf×Wf+Ll×Wl);有效代碼價(jià)值Ve = Vt×(1-P)。設(shè)該程序員單位時(shí)間內(nèi)的薪水為S,進(jìn)一步可以得到該程序員的性價(jià)比C = Ve / S。
公式只有這些,接下來隨便假設(shè)一些數(shù)值代入公式做下計(jì)算。設(shè)有兩個(gè)程序員:a(高級)、b(初級),假定a月薪5000,日代碼價(jià)值50,(按22工作日計(jì)算,下同)月代碼價(jià)值Vt(a) = 50×22 = 1100,則a的性價(jià)比為C(a) = Vt(a)×(1-P(a)) / S(a) = 1100×(1-P(a)) / 5000。同理可得b的性價(jià)比C(b) = Vt(b)×(1-P(b)) / S(b)??紤]理想情況,a、b的代碼失效率都為0即P(a) = P(b) = 0,若要a、b程序員的性價(jià)比相同則有C(a) = 1100 / 5000 = Vt(b) / S(b) = C(b);如果b的日有效代碼價(jià)值25,月有效代碼價(jià)值25×22 = 550,月薪2500,則剛好C(a) = C(b),公司的薪資結(jié)構(gòu)是平衡的。下面說一些你們可能有的問題和一些引申想法。
“我看到一些公司拿錢多職位高的寫的代碼量很少,貢獻(xiàn)代碼最多的是一些新人,性價(jià)比怎么會平衡?”代碼行數(shù)不直接代表代碼價(jià)值,這也是三種代碼權(quán)值W存在的意義,寫框架性的代碼靠深厚的功底??蚣?、功能、邏輯的權(quán)值是依次遞減的即Ws > Wf > Wl。項(xiàng)目初期高級程序員基本全部精力都在寫底層框架而幾乎不寫上層應(yīng)用,往往是每天想4個(gè)小時(shí)寫2個(gè)小時(shí)再花2個(gè)小時(shí)重構(gòu),項(xiàng)目中后期在框架實(shí)在無事可做時(shí)高級程序員又往往在寫功能、邏輯時(shí)貢獻(xiàn)的代碼量又是最多的。每天框架代碼的生產(chǎn)量可能是很低的但是含金量很高,是整個(gè)項(xiàng)目存活與維持的基礎(chǔ)。
“高級與初級程序員的性價(jià)比真的很理想化的相等嗎?”不。理想化的性價(jià)比比在實(shí)驗(yàn)室里創(chuàng)建高溫超導(dǎo)體還困難重重。原因在于很多不確定和隨機(jī)因素。任何程序員都不可能一輩子一直寫出滴水不漏不需要返工的高質(zhì)量代碼。上面的計(jì)算已經(jīng)是把代碼失效率當(dāng)成理想的0來算的了,如果高級程序員更了解代碼中的陷阱與欺騙從而能更好的避開,那就能寫出失效率更低的代碼,也就是說出錯(cuò)率高的新人要寫更多的代碼才能像高級程序員一樣劃算。
“行業(yè)薪資標(biāo)準(zhǔn)該怎么算?”在求職、入職與人事部門談?wù)撔劫Y待遇時(shí)他們都會說:按掌握的行業(yè)統(tǒng)計(jì)數(shù)據(jù)給你的薪資為XXXX。這句話表面意思我非常理解,即行業(yè)薪資標(biāo)準(zhǔn)的建立需要大量統(tǒng)計(jì)數(shù)據(jù)。但我不知道各個(gè)公司是怎么統(tǒng)計(jì)與處理數(shù)據(jù)的。我想這么算一下:需要統(tǒng)計(jì)兩樣數(shù)據(jù),程序員有效代碼價(jià)值Ve,薪資數(shù)目S,這兩樣數(shù)據(jù)計(jì)算得到的就是上面推導(dǎo)過的性價(jià)比C = Ve / S。當(dāng)有大量數(shù)據(jù)時(shí)我們可以得到性價(jià)比的一個(gè)行業(yè)平均值Cavg(如需做其它分析還要得到***值、最小值、方差等)。在對一個(gè)程序員筆試面試過后可對其生產(chǎn)有效代碼價(jià)值的能力做個(gè)初步評估,在此基礎(chǔ)上可以給出該程序員的薪水,如果老板開給公司里大多數(shù)程序員的薪水過低,性價(jià)比高于Cavg則可能發(fā)生頻繁跳槽與被挖角現(xiàn)象;如果開的薪水很高性價(jià)比過低,那也許能籠絡(luò)到大量人才,但是那老板真有錢,還很闊綽。想穩(wěn)穩(wěn)當(dāng)當(dāng)就構(gòu)建和Cavg持平的性價(jià)比即可。
“那身為老板,我為什么不全都雇傭性價(jià)比***的高級程序員?”不可能也沒好處。從業(yè)人員不可能每個(gè)人都有很到位的技術(shù)火候。如果老板雇到的全是最***的程序大師卻又安排不好這些人員那溝通與管理成本就會上升很多。一個(gè)高級程序員帶隊(duì)幾個(gè)溝通順暢的人(不管高級還是初級)那么做起事來會很有效率,如果是幾個(gè)固執(zhí)的高級程序員聚在一起吵來吵去那么生產(chǎn)效率還不如兩個(gè)平庸的程序員加一個(gè)好的指導(dǎo)思想。此文只說和上面的公式相關(guān)的問題,公司內(nèi)部的管理平衡本文不談。
“怎樣節(jié)省成本?”我一向吹噓的兩個(gè)程序開發(fā)原則是復(fù)雜度隔離和代碼復(fù)用。降低了復(fù)雜度,代碼閱讀修改會變?nèi)菀?,擴(kuò)展維護(hù)成本會變低;書寫并使用能充分復(fù)用的代碼也會減少repeat yourself的機(jī)會。發(fā)展與使用開源軟件也是個(gè)好的方法。如果一個(gè)管理者成天摧程序團(tuán)隊(duì)把某某某功能做出來,那真的該反思一下這種只要盡快看到短期結(jié)果不求深謀遠(yuǎn)慮的施壓造成的是什么情況:程序員趕工,效果是快速出來了,但代碼經(jīng)過推敲的時(shí)間少了,復(fù)雜性可能高了,潛藏的bug可能多了,以后復(fù)用的機(jī)會非常渺茫了……長遠(yuǎn)來講,不如平心靜氣鼓勵(lì)程序員寫出高質(zhì)量的可復(fù)用代碼,使用、參與、投入幾個(gè)開源項(xiàng)目,甚至鼓勵(lì)程序員用一定自由時(shí)間做自己想寫的程序(Google有此一招,每周一天,其若干商業(yè)項(xiàng)目起源于員工個(gè)人項(xiàng)目),這樣公司的成本更低。假設(shè)一套代碼(自己員工寫的可復(fù)用代碼或現(xiàn)成開源項(xiàng)目)有10萬有效代碼價(jià)值,還是按一個(gè)高級程序員1100月代碼價(jià)值來算,在不出錯(cuò)的理想情況下這套代碼可能為老板節(jié)省100000 / 1100 = 90.91人月的成本,5個(gè)高級程序員也要干18.19個(gè)月才能做出來,而老板能節(jié)省99.91×5000 = 45.45萬元的金錢成本,又省時(shí)又省錢,何樂而不為?為什么不拿使用開源項(xiàng)目節(jié)省下來的開支給員工多加一些人性化的福利待遇?良好的企業(yè)文化不就這么出來了。我想大多數(shù)商業(yè)游戲引擎都出自國外的原因也就是因?yàn)樗麄儾磺蠖唐谏秸瞿茯_錢的游戲而是想安下心給程序員一定自由做出非??岬某绦虺鰜恚L遠(yuǎn)來講,這些公司***了行業(yè)標(biāo)準(zhǔn),賣引擎就賺翻了。你還會一味盲目壓進(jìn)度嗎。
“看你擺了這么一套,我很有收獲或啟發(fā)。我很認(rèn)真!”認(rèn)真你就輸了!僅靠這種簡單粗暴的公式就能量化出價(jià)值的程序員都不是將才!任何工程,說白了管理的不是項(xiàng)目而是人。而一個(gè)程序員最獨(dú)特有力的價(jià)值可能不在實(shí)現(xiàn)某個(gè)功能寫一篇代碼上面,在于很多很雜,比如:能給團(tuán)隊(duì)帶來什么樣的提升,能在眾人就某一問題困苦時(shí)靈感一現(xiàn)提出創(chuàng)造性的建議,人品***能協(xié)調(diào)好程序團(tuán)隊(duì)內(nèi)外事務(wù)……
“身為程序員,我該怎樣提高自我價(jià)值?”讓自己寫的代碼不容易出錯(cuò),讓自己能從只會寫簡單代碼的初級程序員上升為火候更到位的高級程序員……今天累了,改天再談。






