程式設計師出身的馬化騰,居然熱衷於偽代碼?你會寫嗎?

2020-12-05 電子工程專輯
關於馬化騰寫代碼的水平,網上有一個段子:曾經和pony(馬化騰)一起寫過代碼。當時我、pony、馬克3人擠在一個只有10個位置的房間裡,埋頭開發,用的啥語言我忘了。
馬克當時負責寫兩個bug,弄了10個月,沒有一點進展,下樓準備買點瑞士卷吃,消消愁。
回來發現pony光著膀子,啃著個豬蹄兒,站在陽臺,望著寂靜的夜,回頭冷靜地和馬克說了句:「幫你搞好了。」
當然,這只是個段子。但當年創業時,公司主頁確實也是馬化騰自己寫的代碼,並親手調試一些小細節。
「那時我們幾乎什麼都做,例如幫人家做一些網站的小項目,包括深圳信息局的郵件系統也是我們做的。
當時馬化騰和張志東都自己親手做網站,公司主頁也是馬化騰自己寫的代碼並親手調試一些小細節。這是馬化騰當年寫的代碼:
圖片右上角寫著編寫的日期是99年2月21日,21日是大年初六啊! 馬化騰當年作為一個程式設計師,大年期間也在苦逼的加班!
按時間推算,1971年出生的馬化騰,18年前還是一個28歲的小夥。而騰訊公司是在1998年成立,也就是說這條代碼還是在騰訊成立不久,馬化騰寫下的。
聽騰訊的大師兄Tony(張志東)說,騰訊最早的辦公室,是一間舞蹈室,還掛著80年代「迪斯科」風格的大燈球,後來才搬去賽格。
兄弟們加班累了,還可以舞一曲兒放鬆心情,比現在格子間的條件好多了,而最早的企鵝就在這誕生。

03
代碼寫累了,分分鐘嗨起來

後來騰訊就搬到了深圳華強北的賽格科技園,並一待就是6年,正是這6年為今天的騰訊打下了根基。
就是在這個地方,馬化騰和他的小夥伴熬夜修復了多少BUG,QQ誕生賺取第一桶金,香港上市都在這裡度過。(小貼士:騰訊是2004年在香港上市的)


04
偏愛偽代碼的馬總


有傳聞稱當年馬化騰最喜歡的就是編寫偽代碼,他的這點興趣愛好,也不知道是真是假,畢竟大佬不是隨便人都能見的。不知道各位對偽代碼的編寫有什麼心得,下面就來談談偽代碼應該怎麼寫!

偽代碼(Pseudocode)是一種算法描述語言。使用偽代碼的目的是為了使被描述的算法可以容易地以任何一種程式語言(Pascal,C,Java,etc)實現。因此,偽代碼必須結構清晰、代碼簡單、可讀性好,並且類似自然語言。介於自然語言與程式語言之間。
它以程式語言的書寫形式指明算法的職能。相比於程序語言(例如Java, C++,C, Dephi 等等)它更類似自然語言。它是半角式化、不標準的語言。我們可以將整個算法運行過程的結構用接近自然語言的形式(這裡,你可以使用任何一種你熟悉的文字,中文,英文 等等,關鍵是你把你程序的意思表達出來)描述出來. 使用偽代碼, 可以幫助我們更好的表述算法, 不用拘泥於具體的實現。

人們在用不同的程式語言實現同一個算法時意識到,他們的實現(注意:這裡是實現,不是功能)很不同。尤其是對於那些熟練於不同程式語言的程式設計師要理解一個(用其他程式語言編寫的程序的)功能時可能很難,因為程序語言的形式限制了程式設計師對程序關鍵部分的理解。這樣偽代碼就應運而生了。

當考慮算法功能(而不是其語言實現)時,偽代碼常常得到應用。計算機科學在教學中通常使用虛擬碼,以使得所有的程式設計師都能理解。

綜上,簡單的說,讓人便於理解的代碼。不依賴於語言的,用來表示程序執行過程,而不一定能編譯運行的代碼。在數據結構講算法的時候用的很多。

例如,類Pascal語言的偽代碼的語法規則是:在偽代碼中,每一條指令佔一行(else if,例外)。指令後不跟任何符號(Pascal和C中語句要以分號結尾)。書寫上的「縮進」表示程序中的分支程序結構。這種縮進風格也適用於if-then-else語句。用縮進取代傳統Pascal中的begin和end語句來表示程序的塊結構可以大大提高代碼的清晰性;同一模塊的語句有相同的縮進量,次一級模塊的語句相對與其父級模塊的語句縮進。

算法的偽代碼語言在某些方面可能顯得不太正規,但是給我們描述算法提供了很多方便,並且可以使我們忽略算法實現中很多麻煩的細節。通常每個算法開始時都要描述它的輸入和輸出,而且算法中的每一行都給編上號碼,在解釋算法的過程中會經常使用算法步驟中的行號來指代算法的步驟。算法的偽代碼描述形式上並不是非常嚴格,其主要特性和通常的規定如下:

1) 算法中出現的數組、變量可以是以下類型:整數、實數、字符、位串或指針。通常這些類型可以從算法的上下文來看是清楚的,並不需要額外加以說明。

2) 在算法中的某些指令或子任務可以用文字來敘述,例如,"設x是A中的最大項",這裡A是一個數組;或者"將x插入L中",這裡L是一個鍊表。這樣做的目的是為了避免因那些與主要問題無關的細節使算法本身雜亂無章。

3) 算術表達式可以使用通常的算術運算符(+,-,*,/,以及表示冪的^)。邏輯表達式可以使用關係運算符=,≠,<,>,≤和≥,以及邏輯運算符與(and),或(or),非(not)。

這裡a是變量、數組項,b是算術表達式、邏輯表達式或指針表達式。語句的含義是將b的值賦給a。

5) 若a和b都是變量、數組項,那麼記號a<->b 表示a和b的內容進行交換。
這裡c是邏輯表達式,s和s′是單一的語句或者是被括在do和end之間的語句串。對於上述兩種形式,假若c為真,則s被執行一次。假若c為假,則在第一種形式中,if語句的執行就完成了,而在第二種形式中,執行s′。在所有的情況下,控制就進行到了下一個語句,除非在s或s′中的goto語句使控制轉向到其它地方。

這裡c是邏輯表達式,而s是由一個或更多個語句組成的語句串。當c為真時,執行s。在每一次執行s之前,c都被檢查一下;假若c為假,控制就進行到緊跟在while語句後面的語句。注意,當控制第一次達到while語句時,假若c為假,則s一次也不執行。

for var init to limit by incr dosend


這裡var是變量,init、limit和incr都是算術表達式,而s是由一個或多個語句組成的語句串。初始時,var被賦予init的值。假若incr≥0,則只要var≤limit,就執行s並且將incr加到var上。(假若incr<0,則只要var≥limit,就執行s並且將incr加到var上)。incr的符號不能由s來該改變。

9) exit語句可以在通常的結束條件滿足之前,被用來結束while循環或者for循環的執行。exit導致轉向到緊接在包含exit的(最內層)while或者for循環後面的一個語句。

10) return用來指出一個算法執行的終點;如果算法在最後一條指令之後結束,它通常是被省略的;它被用得最多的場合是檢測到不合需要的條件時。return的後面可以緊接被括在引號的信息。

11) 算法中的注釋被括在/* */之中。諸如read和output之類的各種輸入或者輸出也在需要時被用到。

偽代碼只是像流程圖一樣用在程序設計的初期,幫助寫出程序流程。簡單的程序一般都不用寫流程、寫思路,但是複雜的代碼,最好還是把流程寫下來,總體上去考慮整個功能如何實現。寫完以後不僅可以用來作為以後測試,維護的基礎,還可用來與他人交流。但是,如果把全部的東西寫下來必定可能會讓費很多時間,那麼這個時候可以採用偽代碼方式。比如:

IF 九點以前 THEN do 私人事務; ELSE 9點到18點 THEN 工作; ELSE 下班; END IF


這樣不但可以達到文檔的效果,同時可以節約時間. 更重要的是,使結構比較清晰,表達方式更加直觀.

下面介紹一種類Pascal語言的偽代碼的語法規則。

在偽代碼中,每一條指令佔一行(else if 例外,),指令後不跟任何符號(Pascal和C中語句要以分號結尾);

書寫上的「縮進」表示程序中的分支程序結構。這種縮進風格也適用於if-then-else語句。用縮進取代傳統Pascal中的begin和end語句來表示程序的塊結構可以大大提高代碼的清晰性;同一模塊的語句有相同的縮進量,次一級模塊的語句相對與其父級模塊的語句縮進;

在偽代碼中,通常用連續的數字或字母來標示同一即模塊中的連續語句,有時也可省略標號。

在偽代碼中,變量名和保留字不區分大小寫,這一點和Pascal相同,與C或C++不同;

在偽代碼中,變量不需聲明,但變量局部於特定過程,不能不加顯示的說明就使用全局變量;

賦值語句用符號←表示,x←exp表示將exp的值賦給x,其中x是一個變量,exp是一個與x同類型的變量或表達式(該表達式的結果與x同類型);多重賦值i←j←e是將表達式e的值賦給變量i和j,這種表示與j←e和i←e等價。


x = y;x = 20*(y+1);x = y = 30;


選擇語句用if-then-else來表示,並且這種if-then-else可以嵌套,與Pascal中的if-then-else沒有什麼區別。

if (Condition1)then [ Block 1 ]else if (Condition2)then [ Block 2 ]else [ Block 3 ]


循環語句有三種:while循環、repeat-until循環和for循環,其語法均與Pascal類似,只是用縮進代替begin - end;

1. x02. y03. z ← 04. while x < N
1. do xx + 12. yx + y3. for t ← 0 to 10
1. do z ← ( z + x * y ) / 1002. repeat
1. yy + 12. z ← z - y3. until z < 04. z ← x * y5. yy / 2


x = y = z = 0;while( z < N ){x ++;y += x;for( t = 0; t < 10; t++ ){z = ( z + x * y ) / 100;do {y ++;z -= y;} while( z >= 0 );}z = x * y;}y /= 2;


數組元素的存取有數組名後跟「[下標]」表示。例如A[j]指示數組A的第j個元素。符號「 …」用來指示數組中值的範圍。

A[1…j]表示含元素A[1], A[2], … , A[j]的子數組;

複合數據用對象(Object)來表示,對象由屬性(attribute)和域(field)構成。域的存取是由域名後接由方括號括住的對象名表示。

數組可被看作是一個對象,其屬性有length,表示其中元素的個數,則length[A]就表示數組A中的元素的個數。在表示數組元素和對象屬性時都要用方括號,一般來說從上下文可以看出其含義。

用於表示一個數組或對象的變量被看作是指向表示數組或對象的數據的一個指針。對於某個對象x的所有域f,賦值y←x就使f[y]=f[x],更進一步,若有f[x]←3,則不僅有f[x]=3,同時有f[y]=3,換言之,在賦值y←x後,x和y指向同一個對象。
有時,一個指針不指向任何對象,這時我們賦給他nil。

函數值利用 「return (函數返回值)」 語句來返回,調用方法與Pascal類似;過程用 「call 過程名」語句來調用;

1. x ← t + 102. y ← sin(x)3. call CalValue(x,y)

參數用按值傳遞方式傳給一個過程:被調用過程接受參數的一份副本,若他對某個參數賦值,則這種變化對發出調用的過程是不可見的。當傳遞一個對象時,只是拷貝指向該對象的指針,而不拷貝其各個域。

開始置t的初值為1置i的初值為2當i<=5,執行下面操作:使t=t*i使i=i+1{循環體到此結束}輸出t的值結束

begini→t2→iwhile i<=5{t*i→ti+1→i}print tend


老師說編程序前要養成寫算法的好習慣,覺得流程圖太煩,比較喜歡偽代碼。感覺寫出偽代碼就等於編出程序了,所以很懶,很少寫算法。
馬化騰可以說是程式設計師界的傑出人才,想當年他也要苦逼的加班。馬化騰如今的成功,不知道是不是加班加多了,激發了他的鬥志。當然,這是玩笑話。畢竟作為程式設計師,相信大家加班都加習慣了。關於上面偽代碼的編寫,大家還有什麼看法,歡迎踴躍回復。

相關焦點

  • 馬化騰每天刷 Leetcode?代碼你打算寫到幾歲?雷軍、張一鳴都曾寫過...
    我當時負責寫一個通訊模塊,有一個 bug 弄了兩天,沒有一點進展,下樓準備買點東西吃,消消愁。回來發現 pony 光著膀子,捧著瓶啤酒,站在陽臺,望著寂靜的夜,回頭冷靜地和我說了句:"幫你搞好了。"雖然沒有確切材料能說明馬化騰當年的代碼水平,但他做碼農時的勤奮是有跡可循的。2015年8月,網上首次曝光馬化騰寫過的代碼,寫作日期是在1999年2月21日、大年初六。
  • Python零基礎入門—算法的實現與偽代碼
    老師在這裡寫出計算長方形面積算法的步驟,同學們可以和自己寫的算法步驟比較一下,看看哪個寫的更詳細和完善一些?下面我們給出計算長方形面積的算法步驟,不過這次的算法步驟是站在計算機角度來寫的:第一步,算法的輸入就是長方形面積的長和寬。因次要設置num1和num2兩個變量,接收用戶輸入的長度和寬度,並存儲到num1和num2兩個變量。
  • 福布斯中國發布50位最佳CEO,有多少是工程師出身?雷軍算嗎?
    出身工程師成為頂級公司的CEO,可能是EDN電子技術設計工程師粉絲們熱衷的一個話題。能夠做到頂級公司CEO也許是很多工程師的目標和希望。今天我們就盤點最新的福布斯中國發布的50位中國最佳CEO中有哪些是工程師出身。小米雷軍上榜了嗎?
  • 馬化騰語錄:騰訊沒有一天可以高枕無憂
    騰訊董事局主席馬化騰(資料圖)「在資本市場上,我是一個企業家;在技術領域,我是一個工程師。」技術出身的馬化騰更喜歡後者的角色,因為測試公司的產品是他最大的愛好。——摘自《馬化騰:網際網路新時代的晨光》一文4、不要老覺得你的公司大了,其實如果看一個具體的業務,和其他任何公司沒有任何的優勢,所以一定要把這個心態壓下來,像小公司那樣靈活,才有可能獲得成功。——馬化騰在Techcrunch北京大會的發言5、20歲之前我是一個非常內向的程式設計師,可能管幾個人小團隊的頭,跟在座很多開發者一樣。
  • 普通程式設計師與高級程式設計師有什麼差別?你知道嗎?
    世界上,程式設計師界的大神很多,諸如Margaret Hamilton(阿波羅計劃飛行控制軟體的幕後英雄)、Donald Knuth(《計算機編程藝術》的作者)、Ken Thompson(Unix 締造者)等等,當你去了解他們的經歷時,你會發現他們能夠達到這種登峰造極的境界,無非是天賦加上努力。
  • 程式設計師的這108個笑話 你都看得懂嗎?-程式設計師,笑話,編程, ——快...
    上帝說:「我的孩子,你去問Lippman,他現在領導的程式設計師的隊伍可能是地球上最大的」。於是他去問Lippman。Lippman說:「程式設計師的未來就是駕馭程式設計師」。這個程式設計師對這個未來不滿意,於是他又去問上帝。「萬能的上帝呀,請你告訴我,我的未來會怎樣?」。上帝說:「我的孩子,你去問Gates,他現在所擁有的財產可能是地球上最多的」。於是他去問Gates。
  • 外行人對程式設計師 職業的誤解有多深,你會修電腦嗎?
    數據顯示,46.1%的人都認為程式設計師很會修電腦;42.7%的人認為他們可以輕易開發出任何軟體;性格木訥沒有情趣、不修邊幅,著裝不將究、只喜歡討論技術問題等緊跟其後。一個普通程式設計師的他被當成了「IT萬事通」,自己曾被身邊的人提出過諸多要求,從改寫Excel表格到修復已經壞掉CPU(中央處理器)的電腦,有朋友甚至提出讓他修復一個天線壞掉的路由器。
  • 馬化騰登頂中國首富:一個性格內向的人,是如何成功的?
    讓我們看一下馬化騰是如何從一個羞澀內向的程式設計師,成長為騰訊帝國的掌門人。或許由於騰訊遊戲太火爆,馬化騰的輿論形象不太好,但那不是我們今天討論的重點。我們只講事實,不評價是非。1天文學家的夢想1971年,馬化騰出生在廣東省汕頭市,也就是傳統意義上的「潮汕人」。潮汕人天生會做生意,號稱東方猶太人。
  • 馬化騰的提問:未來十年哪些基礎科學突破會影響網際網路科技產業?
    馬化騰的提問:未來十年哪些基礎科學突破會影響網際網路科技產業?,高懸的果實終有一天會被採到。產業網際網路和消費網際網路融合創新,會帶來哪些改變?」 這不是典型的知乎式提問,它的經典句式是「如何評價xxx?」 馬化騰的提問像丟到深海的魚餌——更像是給1024程式設計師節送上的節日問候——迅速吸引了一群大魚小魚的圍觀,有網友驚呼:「沒想到大半夜居然看到馬化騰本人的提問。」
  • Linux之父Linus Torvalds:我已經不是程式設計師了,工作就是說不
    這也是他通常會寫一些代碼的地方,但並不像你想像的那樣。「我讀郵件,寫郵件,我完全不做編碼了,」Torvalds 說。「我寫的大部分代碼,其實都是在我的郵件閱讀器裡面寫的。所以有人給我發了一個補丁,或者更常見的是他們給我發了一個需求,或者有一個關於下一個需求的討論,有一些東西我就會反應過來說,『不,這很好,但是 ...』。
  • 馬雲、馬化騰隔空激辯:人工智慧會摧毀人類嗎?
    不過,馬化騰一方面表示在人工智慧方面加大投入的舉措,另一方面也向外界傳遞了自己的擔憂。「人工智慧是一個跨國跨學科的科學探索工程,正在將人類的認知推向更快更高更強,但目前人類對人工智慧等新科技的未知仍然大於已知,」馬化騰表示,要做到AI向善,就要努力讓人工智慧實現可知可控、可用可靠,這是騰訊的課題,也是一個需要全世界共同面對的課題。
  • 花四個月的工資給馬化騰買天文望遠鏡,你會為孩子特別愛好買單嗎
    馬化騰無疑是成功的,從穿越PC時代的人手一個「QQ」,再到今日成為國民應用的「微信」,都凝聚著這個騰訊掌門人的心血與智慧,關於馬化騰,我們不聊產品,也不說財富,就談談他的家庭,天文望遠鏡13歲正讀初二的馬化騰隨家人從海南遷至深圳 ,後轉入深圳中學,那時候的馬化騰是個酷愛天文的少年,14歲的馬化騰在生日時候,希望家裡送給他一臺準專業級八釐米口徑的天文望遠鏡,當時要700元,相當於他父親四個月的工資。
  • 如何評價馬化騰昨夜在知乎上提的這個靈魂拷問?
    馬化騰正在為改善騰訊的形象努力。昨夜,大概凌晨12點左右,沉寂知乎3年多的馬化騰突然在上面提了一個問題,涉及基礎科學:「未來十年哪些基礎科學突破會影響網際網路科技產業?產業網際網路和消費網際網路融合創新,會帶來哪些改變?」
  • 程式設計師:停電去網吧寫代碼,被當成黑客報警了,網友:想偷我戒指
    相信很多人對程式設計師這個行業有著很多看法,畢竟作為高薪行業,一直以來也是備受關注,但因為強大的工作壓力,也讓很多人望而卻步。甚至在很多人眼裡,這就是年薪百萬,一夜成名的職業了,也讓程式設計師這個行業增添了幾分神秘感,這也讓很多人好奇,究竟是做什麼能夠讓自己收入這麼多呢,他們為何有如此強大的吸金能力呢?有位網友就在論壇上發表自己作為一位程式設計師曾遇到的尷尬事情。
  • 好與壞的程式設計師:如何客觀評價程式設計師的水平?
    最近一段時間有點江郎才盡的感覺,寫不了大的主題,就寫點小東西吧。我們從知乎上面引用的這段小故事開始:魏文王問扁鵲家裡三兄弟誰的醫術最好。扁鵲回答說大哥最好,二哥次之,他自己最差。魏文王疑惑了,又問道,為什麼扁鵲最有名呢?扁鵲回答說因為大哥治病的時候人沒病就防止了,所以毫無名氣。二哥呢,病剛起來的時候,就給治好了,大家以為只能治小病。
  • 回答馬化騰-虎嗅網
    馬化騰六年磨一問。在1024程式設計師節到來前,闊別知乎六年的馬化騰提了兩個問題:未來十年哪些基礎科學突破會影響網際網路科技產業?產業網際網路和消費網際網路融合創新,會帶來哪些改變?這都不是本文想要探討的,如果你對這些感興趣,或許可以讀讀虎嗅站內文章《如何評價馬化騰昨夜在知乎上提的這個靈魂拷問?》。本文從目前的900多個答案中挑出了幾個具有代表性的精彩答案,想看看各位網友都是如何「回答馬化騰」的。必須說明的是,各位知乎用戶的答案都動輒5000字起步,篇幅較長,在此僅摘錄部分內容。對完整答案感興趣的朋友請移步原文。
  • 阿里傳奇程式設計師,只會寫代碼,卻從一名員工做到了合伙人
    而在阿里巴巴,也有一位和多隆一樣憨厚忠實的程式設計師工程師,他就是蔡景現,現在是阿里巴巴的合伙人之一,今天就來說說他的故事。阿里傳奇程式設計師,只會寫代碼,卻從一名員工做到了合伙人。1967年,蔡景現出生於浙江省蒼南縣一個貧困的農村家庭。小時候他學習一般,性格也比較內向,但在蔡景現平凡普通的校園成長經歷中,一本basic的程式語言書改變了他的生命歷程。
  • 暴漲的比特幣、特斯拉與被程式設計師統治的世界
    ,要不他們會膨脹到無以復加,男性程式設計師甚至有可能會因此迎風尿三丈。 2、人類的恐懼是什麼; 3、程式設計師真的在統治世界嗎?不確定性,就是不知道你不知道明天會發生什麼事情,甚至不知道下一秒會發生什麼。 而不確定性當中,最大的不確定性,就是對於框架的不確定性。就是你不知道會發生什麼事情,甚至你連可能性都不知道,因為這個世界的結構並不由你決定。 而人要怎麼去解決這個問題?
  • 世界頂級黑客一定是很牛的程式設計師嗎?
    要成為真正的黑客,本身必然是出色的程式設計師,黑客技術是變成中的某一類別。沒有真正的黑客技術,只是利用了一些BUG,下面來看看頂級黑客是否是一名出色的程式設計師凱文.米特尼克第一個被美國聯邦調查局通緝的黑客。被標上太多很牛的標籤了,第一個,美國聯邦調查局,黑客。感覺牛到不行米特尼克很小就迷上了無線電技術,並學到了高超的計算機專業知識和操作技能,所以不可否認他是個很出色的程式設計師。
  • 被嫌棄的35歲程式設計師
    打開不少社交平臺的相關話題頁,你很容易被各種憂心忡忡的情緒所感染,35+ 程式設計師懊惱失業,就連 20+ 的年輕人也開始擔憂未來會失業...InfoQ 接觸到的幾位 35+ 技術人坦言,自己曾因為年齡的問題而感到焦慮。