程序員出身的馬化騰,居然熱衷于偽代碼?你會(huì)寫(xiě)嗎?
他是不是中國(guó)寫(xiě)代碼寫(xiě)得最好的,我們不知道;
但可以肯定的是,他一定是寫(xiě)代碼賺錢(qián)最多的那個(gè)……
01
小時(shí)候
看到上圖這個(gè)靦腆的男孩,你會(huì)聯(lián)想到什么?
他是中國(guó)第一代產(chǎn)品經(jīng)理,也是迄今為止最優(yōu)秀的產(chǎn)品經(jīng)理。
他自稱(chēng)宅男,自認(rèn)天性里就不愛(ài)和人打交道,卻是中國(guó)互聯(lián)網(wǎng)史上最激烈對(duì)戰(zhàn)的當(dāng)事人;
他打造了中國(guó)市值最高的公司,卻說(shuō):我就是一個(gè)工程師!
都說(shuō)馬化騰是無(wú)趣的老板
雖然已是連續(xù)四年代表,但或許讓身居騰訊董事局主席兼CEO的馬化騰感到最舒服和自在的角色依然是產(chǎn)品經(jīng)理。
知乎網(wǎng)友曾說(shuō):“馬化騰是個(gè)無(wú)趣的人,大約沒(méi)什么有趣的事?!?/span> 這點(diǎn),小編就不同意了!
每年春節(jié)后開(kāi)工,他都堅(jiān)持給每個(gè)員工發(fā)紅包。
去年騰訊18歲生日,他又給員工發(fā)了15億紅包!
如此愛(ài)發(fā)紅包的老板,哪里“無(wú)趣”了?
可能,說(shuō)他無(wú)趣的,是因?yàn)樗綍r(shí)的低調(diào)吧!馬化騰對(duì)自己的評(píng)價(jià)是,“我們開(kāi)發(fā)人員、軟件人員都這樣,比較內(nèi)向,比較喜歡做產(chǎn)品。對(duì)懂的東西,我可能說(shuō)得多點(diǎn),其他的事,我就不太知道怎么說(shuō)?!?/span>
02
馬化騰寫(xiě)代碼的水平如何
關(guān)于馬化騰寫(xiě)代碼的水平,網(wǎng)上有一個(gè)段子:曾經(jīng)和pony(馬化騰)一起寫(xiě)過(guò)代碼。當(dāng)時(shí)我、pony、馬克3人擠在一個(gè)只有10個(gè)位置的房間里,埋頭開(kāi)發(fā),用的啥語(yǔ)言我忘了。
馬克當(dāng)時(shí)負(fù)責(zé)寫(xiě)兩個(gè)bug,弄了10個(gè)月,沒(méi)有一點(diǎn)進(jìn)展,下樓準(zhǔn)備買(mǎi)點(diǎn)瑞士卷吃,消消愁。
回來(lái)發(fā)現(xiàn)pony光著膀子,啃著個(gè)豬蹄兒,站在陽(yáng)臺(tái),望著寂靜的夜,回頭冷靜地和馬克說(shuō)了句:“幫你搞好了?!?/span>
當(dāng)然,這只是個(gè)段子。但當(dāng)年創(chuàng)業(yè)時(shí),公司主頁(yè)確實(shí)也是馬化騰自己寫(xiě)的代碼,并親手調(diào)試一些小細(xì)節(jié)。
在《騰訊十年》“騰訊天性”一章中有寫(xiě)到:
為了“養(yǎng)活”這只企鵝,大家想盡了辦法。
“那時(shí)我們幾乎什么都做,例如幫人家做一些網(wǎng)站的小項(xiàng)目,包括深圳信息局的郵件系統(tǒng)也是我們做的。
當(dāng)時(shí)馬化騰和張志東都自己親手做網(wǎng)站,公司主頁(yè)也是馬化騰自己寫(xiě)的代碼并親手調(diào)試一些小細(xì)節(jié)。這是馬化騰當(dāng)年寫(xiě)的代碼:
圖片右上角寫(xiě)著編寫(xiě)的日期是99年2月21日,21日是大年初六啊! 馬化騰當(dāng)年作為一個(gè)程序員,大年期間也在苦逼的加班!
按時(shí)間推算,1971年出生的馬化騰,18年前還是一個(gè)28歲的小伙。而騰訊公司是在1998年成立,也就是說(shuō)這條代碼還是在騰訊成立不久,馬化騰寫(xiě)下的。
聽(tīng)騰訊的大師兄Tony(張志東)說(shuō),騰訊最早的辦公室,是一間舞蹈室,還掛著80年代“迪斯科”風(fēng)格的大燈球,后來(lái)才搬去賽格。
兄弟們加班累了,還可以舞一曲兒放松心情,比現(xiàn)在格子間的條件好多了,而最早的企鵝就在這誕生。
03
代碼寫(xiě)累了,分分鐘嗨起來(lái)
最早的騰訊五虎,左四就是騰訊的大師兄Tony
后來(lái)騰訊就搬到了深圳華強(qiáng)北的賽格科技園,并一待就是6年,正是這6年為今天的騰訊打下了根基。
就是在這個(gè)地方,馬化騰和他的小伙伴熬夜修復(fù)了多少BUG,QQ誕生賺取第一桶金,香港上市都在這里度過(guò)。(小貼士:騰訊是2004年在香港上市的)
04
偏愛(ài)偽代碼的馬總
偽代碼的寫(xiě)法
偽代碼(Pseudocode)是一種算法描述語(yǔ)言。使用偽代碼的目的是為了使被描述的算法可以容易地以任何一種編程語(yǔ)言(Pascal,C,Java,etc)實(shí)現(xiàn)。因此,偽代碼必須結(jié)構(gòu)清晰、代碼簡(jiǎn)單、可讀性好,并且類(lèi)似自然語(yǔ)言。介于自然語(yǔ)言與編程語(yǔ)言之間。
它以編程語(yǔ)言的書(shū)寫(xiě)形式指明算法的職能。相比于程序語(yǔ)言(例如Java, C++,C, Dephi 等等)它更類(lèi)似自然語(yǔ)言。它是半角式化、不標(biāo)準(zhǔn)的語(yǔ)言。我們可以將整個(gè)算法運(yùn)行過(guò)程的結(jié)構(gòu)用接近自然語(yǔ)言的形式(這里,你可以使用任何一種你熟悉的文字,中文,英文 等等,關(guān)鍵是你把你程序的意思表達(dá)出來(lái))描述出來(lái). 使用偽代碼, 可以幫助我們更好的表述算法, 不用拘泥于具體的實(shí)現(xiàn)。
人們?cè)谟貌煌木幊陶Z(yǔ)言實(shí)現(xiàn)同一個(gè)算法時(shí)意識(shí)到,他們的實(shí)現(xiàn)(注意:這里是實(shí)現(xiàn),不是功能)很不同。尤其是對(duì)于那些熟練于不同編程語(yǔ)言的程序員要理解一個(gè)(用其他編程語(yǔ)言編寫(xiě)的程序的)功能時(shí)可能很難,因?yàn)槌绦蛘Z(yǔ)言的形式限制了程序員對(duì)程序關(guān)鍵部分的理解。這樣偽代碼就應(yīng)運(yùn)而生了。
當(dāng)考慮算法功能(而不是其語(yǔ)言實(shí)現(xiàn))時(shí),偽代碼常常得到應(yīng)用。計(jì)算機(jī)科學(xué)在教學(xué)中通常使用虛擬碼,以使得所有的程序員都能理解。
綜上,簡(jiǎn)單的說(shuō),讓人便于理解的代碼。不依賴(lài)于語(yǔ)言的,用來(lái)表示程序執(zhí)行過(guò)程,而不一定能編譯運(yùn)行的代碼。在數(shù)據(jù)結(jié)構(gòu)講算法的時(shí)候用的很多。
語(yǔ)法規(guī)則
例如,類(lèi)Pascal語(yǔ)言的偽代碼的語(yǔ)法規(guī)則是:在偽代碼中,每一條指令占一行(else if,例外)。指令后不跟任何符號(hào)(Pascal和C中語(yǔ)句要以分號(hào)結(jié)尾)。書(shū)寫(xiě)上的“縮進(jìn)”表示程序中的分支程序結(jié)構(gòu)。這種縮進(jìn)風(fēng)格也適用于if-then-else語(yǔ)句。用縮進(jìn)取代傳統(tǒng)Pascal中的begin和end語(yǔ)句來(lái)表示程序的塊結(jié)構(gòu)可以大大提高代碼的清晰性;同一模塊的語(yǔ)句有相同的縮進(jìn)量,次一級(jí)模塊的語(yǔ)句相對(duì)與其父級(jí)模塊的語(yǔ)句縮進(jìn)。
算法的偽代碼語(yǔ)言在某些方面可能顯得不太正規(guī),但是給我們描述算法提供了很多方便,并且可以使我們忽略算法實(shí)現(xiàn)中很多麻煩的細(xì)節(jié)。通常每個(gè)算法開(kāi)始時(shí)都要描述它的輸入和輸出,而且算法中的每一行都給編上號(hào)碼,在解釋算法的過(guò)程中會(huì)經(jīng)常使用算法步驟中的行號(hào)來(lái)指代算法的步驟。算法的偽代碼描述形式上并不是非常嚴(yán)格,其主要特性和通常的規(guī)定如下:
1) 算法中出現(xiàn)的數(shù)組、變量可以是以下類(lèi)型:整數(shù)、實(shí)數(shù)、字符、位串或指針。通常這些類(lèi)型可以從算法的上下文來(lái)看是清楚的,并不需要額外加以說(shuō)明。
2) 在算法中的某些指令或子任務(wù)可以用文字來(lái)敘述,例如,"設(shè)x是A中的最大項(xiàng)",這里A是一個(gè)數(shù)組;或者"將x插入L中",這里L(fēng)是一個(gè)鏈表。這樣做的目的是為了避免因那些與主要問(wèn)題無(wú)關(guān)的細(xì)節(jié)使算法本身雜亂無(wú)章。
3) 算術(shù)表達(dá)式可以使用通常的算術(shù)運(yùn)算符(+,-,*,/,以及表示冪的^)。邏輯表達(dá)式可以使用關(guān)系運(yùn)算符=,≠,<,>,≤和≥,以及邏輯運(yùn)算符與(and),或(or),非(not)。
4) 賦值語(yǔ)句是如下形式的語(yǔ)句:a<-b 。
這里a是變量、數(shù)組項(xiàng),b是算術(shù)表達(dá)式、邏輯表達(dá)式或指針表達(dá)式。語(yǔ)句的含義是將b的值賦給a。
5) 若a和b都是變量、數(shù)組項(xiàng),那么記號(hào)ab 表示a和b的內(nèi)容進(jìn)行交換。
6) goto語(yǔ)句具有形式 goto label(goto標(biāo)號(hào)) 它將導(dǎo)致轉(zhuǎn)向具有指定標(biāo)號(hào)的語(yǔ)句。
7) 條件語(yǔ)句有以下兩種形式:
if c then s
或者
if c then selse s′
這里c是邏輯表達(dá)式,s和s′是單一的語(yǔ)句或者是被括在do和end之間的語(yǔ)句串。對(duì)于上述兩種形式,假若c為真,則s被執(zhí)行一次。假若c為假,則在第一種形式中,if語(yǔ)句的執(zhí)行就完成了,而在第二種形式中,執(zhí)行s′。在所有的情況下,控制就進(jìn)行到了下一個(gè)語(yǔ)句,除非在s或s′中的goto語(yǔ)句使控制轉(zhuǎn)向到其它地方。
8) 有兩種循環(huán)指令:while和for。
while語(yǔ)句的形式是
while c dosend
這里c是邏輯表達(dá)式,而s是由一個(gè)或更多個(gè)語(yǔ)句組成的語(yǔ)句串。當(dāng)c為真時(shí),執(zhí)行s。在每一次執(zhí)行s之前,c都被檢查一下;假若c為假,控制就進(jìn)行到緊跟在while語(yǔ)句后面的語(yǔ)句。注意,當(dāng)控制第一次達(dá)到while語(yǔ)句時(shí),假若c為假,則s一次也不執(zhí)行。
for語(yǔ)句的形式是
for var init to limit by incr dosend
這里var是變量,init、limit和incr都是算術(shù)表達(dá)式,而s是由一個(gè)或多個(gè)語(yǔ)句組成的語(yǔ)句串。初始時(shí),var被賦予init的值。假若incr≥0,則只要var≤limit,就執(zhí)行s并且將incr加到var上。(假若incr<0,則只要var≥limit,就執(zhí)行s并且將incr加到var上)。incr的符號(hào)不能由s來(lái)該改變。
9) exit語(yǔ)句可以在通常的結(jié)束條件滿(mǎn)足之前,被用來(lái)結(jié)束while循環(huán)或者for循環(huán)的執(zhí)行。exit導(dǎo)致轉(zhuǎn)向到緊接在包含exit的(最內(nèi)層)while或者for循環(huán)后面的一個(gè)語(yǔ)句。
10) return用來(lái)指出一個(gè)算法執(zhí)行的終點(diǎn);如果算法在最后一條指令之后結(jié)束,它通常是被省略的;它被用得最多的場(chǎng)合是檢測(cè)到不合需要的條件時(shí)。return的后面可以緊接被括在引號(hào)的信息。
11) 算法中的注釋被括在/* */之中。諸如read和output之類(lèi)的各種輸入或者輸出也在需要時(shí)被用到。
偽代碼實(shí)例
偽代碼只是像流程圖一樣用在程序設(shè)計(jì)的初期,幫助寫(xiě)出程序流程。簡(jiǎn)單的程序一般都不用寫(xiě)流程、寫(xiě)思路,但是復(fù)雜的代碼,最好還是把流程寫(xiě)下來(lái),總體上去考慮整個(gè)功能如何實(shí)現(xiàn)。寫(xiě)完以后不僅可以用來(lái)作為以后測(cè)試,維護(hù)的基礎(chǔ),還可用來(lái)與他人交流。但是,如果把全部的東西寫(xiě)下來(lái)必定可能會(huì)讓費(fèi)很多時(shí)間,那么這個(gè)時(shí)候可以采用偽代碼方式。比如:
IF 九點(diǎn)以前 THEN do 私人事務(wù); ELSE 9點(diǎn)到18點(diǎn) THEN 工作; ELSE 下班; END IF
這樣不但可以達(dá)到文檔的效果,同時(shí)可以節(jié)約時(shí)間. 更重要的是,使結(jié)構(gòu)比較清晰,表達(dá)方式更加直觀.
下面介紹一種類(lèi)Pascal語(yǔ)言的偽代碼的語(yǔ)法規(guī)則。
在偽代碼中,每一條指令占一行(else if 例外,),指令后不跟任何符號(hào)(Pascal和C中語(yǔ)句要以分號(hào)結(jié)尾);
書(shū)寫(xiě)上的“縮進(jìn)”表示程序中的分支程序結(jié)構(gòu)。這種縮進(jìn)風(fēng)格也適用于if-then-else語(yǔ)句。用縮進(jìn)取代傳統(tǒng)Pascal中的begin和end語(yǔ)句來(lái)表示程序的塊結(jié)構(gòu)可以大大提高代碼的清晰性;同一模塊的語(yǔ)句有相同的縮進(jìn)量,次一級(jí)模塊的語(yǔ)句相對(duì)與其父級(jí)模塊的語(yǔ)句縮進(jìn);
在偽代碼中,通常用連續(xù)的數(shù)字或字母來(lái)標(biāo)示同一即模塊中的連續(xù)語(yǔ)句,有時(shí)也可省略標(biāo)號(hào)。
符號(hào)△后的內(nèi)容表示注釋;
在偽代碼中,變量名和保留字不區(qū)分大小寫(xiě),這一點(diǎn)和Pascal相同,與C或C++不同;
在偽代碼中,變量不需聲明,但變量局部于特定過(guò)程,不能不加顯示的說(shuō)明就使用全局變量;
賦值語(yǔ)句用符號(hào)←表示,x←exp表示將exp的值賦給x,其中x是一個(gè)變量,exp是一個(gè)與x同類(lèi)型的變量或表達(dá)式(該表達(dá)式的結(jié)果與x同類(lèi)型);多重賦值i←j←e是將表達(dá)式e的值賦給變量i和j,這種表示與j←e和i←e等價(jià)。
例如:
x←yx←20*(y+1)x←y←30
以上語(yǔ)句用C分別表示為:
x = y;x = 20*(y+1);x = y = 30;
選擇語(yǔ)句用if-then-else來(lái)表示,并且這種if-then-else可以嵌套,與Pascal中的if-then-else沒(méi)有什么區(qū)別。
例如:
if (Condition1)then [ Block 1 ]else if (Condition2)then [ Block 2 ]else [ Block 3 ]
循環(huán)語(yǔ)句有三種:while循環(huán)、repeat-until循環(huán)和for循環(huán),其語(yǔ)法均與Pascal類(lèi)似,只是用縮進(jìn)代替begin - end;
例如:
1. x ← 02. y ← 03. z ← 04. while x < N 1. do x ← x + 12. y ← x + y3. for t ← 0 to 10 1. do z ← ( z + x * y ) / 1002. repeat 1. y ← y + 12. z ← z - y3. until z < 04. z ← x * y5. y ← y / 2
上述語(yǔ)句用C或C++來(lái)描述是:
x = y = z = 0;z < N ) {x ++;y += x;t = 0; t < 10; t++ ) {z = ( z + x * y ) / 100;do {y ++;z -= y;while( z >= 0 ); }z = x * y;}y /= 2;
數(shù)組元素的存取有數(shù)組名后跟“[下標(biāo)]”表示。例如A[j]指示數(shù)組A的第j個(gè)元素。符號(hào)“ …”用來(lái)指示數(shù)組中值的范圍。
例如:
A[1…j]表示含元素A[1], A[2], … , A[j]的子數(shù)組;
復(fù)合數(shù)據(jù)用對(duì)象(Object)來(lái)表示,對(duì)象由屬性(attribute)和域(field)構(gòu)成。域的存取是由域名后接由方括號(hào)括住的對(duì)象名表示。
例如:
數(shù)組可被看作是一個(gè)對(duì)象,其屬性有l(wèi)ength,表示其中元素的個(gè)數(shù),則length[A]就表示數(shù)組A中的元素的個(gè)數(shù)。在表示數(shù)組元素和對(duì)象屬性時(shí)都要用方括號(hào),一般來(lái)說(shuō)從上下文可以看出其含義。
用于表示一個(gè)數(shù)組或?qū)ο蟮淖兞勘豢醋魇侵赶虮硎緮?shù)組或?qū)ο蟮臄?shù)據(jù)的一個(gè)指針。對(duì)于某個(gè)對(duì)象x的所有域f,賦值y←x就使f[y]=f[x],更進(jìn)一步,若有f[x]←3,則不僅有f[x]=3,同時(shí)有f[y]=3,換言之,在賦值y←x后,x和y指向同一個(gè)對(duì)象。 有時(shí),一個(gè)指針不指向任何對(duì)象,這時(shí)我們賦給他nil。
函數(shù)和過(guò)程語(yǔ)法與Pascal類(lèi)似。
函數(shù)值利用 “return (函數(shù)返回值)” 語(yǔ)句來(lái)返回,調(diào)用方法與Pascal類(lèi)似;過(guò)程用 “call 過(guò)程名”語(yǔ)句來(lái)調(diào)用;
例如:
1. x ← t + 102. y ← sin(x)3. call CalValue(x,y)參數(shù)用按值傳遞方式傳給一個(gè)過(guò)程:被調(diào)用過(guò)程接受參數(shù)的一份副本,若他對(duì)某個(gè)參數(shù)賦值,則這種變化對(duì)發(fā)出調(diào)用的過(guò)程是不可見(jiàn)的。當(dāng)傳遞一個(gè)對(duì)象時(shí),只是拷貝指向該對(duì)象的指針,而不拷貝其各個(gè)域。 偽代碼算法格式
開(kāi)始置t的初值為1置i的初值為2當(dāng)i<=5,執(zhí)行下面操作:使t=t*i使i=i+1{循環(huán)體到此結(jié)束}輸出t的值結(jié)束
或
begini→t2→iwhile i<=5{t*i→ti+1→i}print tend
老師說(shuō)編程序前要養(yǎng)成寫(xiě)算法的好習(xí)慣,覺(jué)得流程圖太煩,比較喜歡偽代碼。感覺(jué)寫(xiě)出偽代碼就等于編出程序了,所以很懶,很少寫(xiě)算法。
馬化騰可以說(shuō)是程序員界的杰出人才,想當(dāng)年他也要苦逼的加班。馬化騰如今的成功,不知道是不是加班加多了,激發(fā)了他的斗志。當(dāng)然,這是玩笑話(huà)。畢竟作為程序員,相信大家加班都加習(xí)慣了。關(guān)于上面?zhèn)未a的編寫(xiě),大家還有什么看法,歡迎踴躍回復(fù)。
參考資料:
【1】佚名 . 你見(jiàn)過(guò)馬化騰17年前寫(xiě)的代碼嗎? 【2】簡(jiǎn)書(shū) . 偽代碼應(yīng)該這么寫(xiě)!
-END-
整理:付斌
推薦閱讀
【1】管理層與董事會(huì)“開(kāi)撕”?Arm中國(guó)CEO吳雄昂罷免之謎
【2】振奮人心!我國(guó)首臺(tái)核心元器件100%國(guó)產(chǎn)化的計(jì)算機(jī)誕生了
【3】終于整理齊了,電子工程師“設(shè)計(jì)錦囊”,你值得擁有!
【4】半導(dǎo)體行業(yè)的人都在關(guān)注這幾個(gè)公眾號(hào)
你和大牛工程師之間到底差了啥? 加入技術(shù)交流群,與高手面對(duì)面 添加管理員微信
加入“中國(guó)電子網(wǎng)微信群”交流
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!