程序员出身的马化腾,居然热衷于伪代码?你会写吗?
扫描二维码
随时随地手机看文章
他是不是中国写代码写得最好的,我们不知道;
但可以肯定的是,他一定是写代码赚钱最多的那个……
01
小时候
看到上图这个腼腆的男孩,你会联想到什么?
他是中国第一代产品经理,也是迄今为止最优秀的产品经理。
他自称宅男,自认天性里就不爱和人打交道,却是中国互联网史上最激烈对战的当事人;
他打造了中国市值最高的公司,却说:我就是一个工程师!
都说马化腾是无趣的老板
虽然已是连续四年代表,但或许让身居腾讯董事局主席兼CEO的马化腾感到最舒服和自在的角色依然是产品经理。
知乎网友曾说:“马化腾是个无趣的人,大约没什么有趣的事。” 这点,小编就不同意了!
每年春节后开工,他都坚持给每个员工发红包。
去年腾讯18岁生日,他又给员工发了15亿红包!
如此爱发红包的老板,哪里“无趣”了?
可能,说他无趣的,是因为他平时的低调吧!马化腾对自己的评价是,“我们开发人员、软件人员都这样,比较内向,比较喜欢做产品。对懂的东西,我可能说得多点,其他的事,我就不太知道怎么说。”
02
马化腾写代码的水平如何
关于马化腾写代码的水平,网上有一个段子:曾经和pony(马化腾)一起写过代码。当时我、pony、马克3人挤在一个只有10个位置的房间里,埋头开发,用的啥语言我忘了。
马克当时负责写两个bug,弄了10个月,没有一点进展,下楼准备买点瑞士卷吃,消消愁。
回来发现pony光着膀子,啃着个猪蹄儿,站在阳台,望着寂静的夜,回头冷静地和马克说了句:“帮你搞好了。”
当然,这只是个段子。但当年创业时,公司主页确实也是马化腾自己写的代码,并亲手调试一些小细节。
在《腾讯十年》“腾讯天性”一章中有写到:
为了“养活”这只企鹅,大家想尽了办法。
“那时我们几乎什么都做,例如帮人家做一些网站的小项目,包括深圳信息局的邮件系统也是我们做的。
当时马化腾和张志东都自己亲手做网站,公司主页也是马化腾自己写的代码并亲手调试一些小细节。这是马化腾当年写的代码:
图片右上角写着编写的日期是99年2月21日,21日是大年初六啊! 马化腾当年作为一个程序员,大年期间也在苦逼的加班!
按时间推算,1971年出生的马化腾,18年前还是一个28岁的小伙。而腾讯公司是在1998年成立,也就是说这条代码还是在腾讯成立不久,马化腾写下的。
听腾讯的大师兄Tony(张志东)说,腾讯最早的办公室,是一间舞蹈室,还挂着80年代“迪斯科”风格的大灯球,后来才搬去赛格。
兄弟们加班累了,还可以舞一曲儿放松心情,比现在格子间的条件好多了,而最早的企鹅就在这诞生。
03
代码写累了,分分钟嗨起来
最早的腾讯五虎,左四就是腾讯的大师兄Tony
后来腾讯就搬到了深圳华强北的赛格科技园,并一待就是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)。
4) 赋值语句是如下形式的语句:a<-b 。
这里a是变量、数组项,b是算术表达式、逻辑表达式或指针表达式。语句的含义是将b的值赋给a。
5) 若a和b都是变量、数组项,那么记号ab 表示a和b的内容进行交换。
6) goto语句具有形式 goto label(goto标号) 它将导致转向具有指定标号的语句。
7) 条件语句有以下两种形式:
if c then s
或者
if c then selse s′
这里c是逻辑表达式,s和s′是单一的语句或者是被括在do和end之间的语句串。对于上述两种形式,假若c为真,则s被执行一次。假若c为假,则在第一种形式中,if语句的执行就完成了,而在第二种形式中,执行s′。在所有的情况下,控制就进行到了下一个语句,除非在s或s′中的goto语句使控制转向到其它地方。
8) 有两种循环指令:while和for。
while语句的形式是
while c dosend
这里c是逻辑表达式,而s是由一个或更多个语句组成的语句串。当c为真时,执行s。在每一次执行s之前,c都被检查一下;假若c为假,控制就进行到紧跟在while语句后面的语句。注意,当控制第一次达到while语句时,假若c为假,则s一次也不执行。
for语句的形式是
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←yx←20*(y+1)x←y←30
以上语句用C分别表示为:
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. 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
上述语句用C或C++来描述是:
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;
数组元素的存取有数组名后跟“[下标]”表示。例如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。
函数和过程语法与Pascal类似。
函数值利用 “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
老师说编程序前要养成写算法的好习惯,觉得流程图太烦,比较喜欢伪代码。感觉写出伪代码就等于编出程序了,所以很懒,很少写算法。
马化腾可以说是程序员界的杰出人才,想当年他也要苦逼的加班。马化腾如今的成功,不知道是不是加班加多了,激发了他的斗志。当然,这是玩笑话。毕竟作为程序员,相信大家加班都加习惯了。关于上面伪代码的编写,大家还有什么看法,欢迎踊跃回复。
参考资料:
【1】佚名 . 你见过马化腾17年前写的代码吗? 【2】简书 . 伪代码应该这么写!
-END-
整理:付斌
推荐阅读
【1】管理层与董事会“开撕”?Arm中国CEO吴雄昂罢免之谜
【2】振奋人心!我国首台核心元器件100%国产化的计算机诞生了
你和大牛工程师之间到底差了啥? 加入技术交流群,与高手面对面 添加管理员微信
加入“中国电子网微信群”交流
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!