程序员出身的马化腾,居然热衷于伪代码?你会写吗?

21ic电子网 2020-06-17 00:00

他是不是中国写代码写得最好的,我们不知道;


但可以肯定的是,他一定是写代码赚钱最多的那个……

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都是变量、数组项,那么记号a<->b 表示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. 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

上述语句用C或C++来描述是:

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。

函数和过程语法与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%国产化的计算机诞生了

【3】终于整理齐了,电子工程师“设计锦囊”,你值得拥有!

【4】半导体行业的人都在关注这几个公众号


你和大牛工程师之间到底差了啥?
加入技术交流群,与高手面对面 
添加管理员微信

加入“中国电子网微信群”交流
21ic电子网 即时传播最新电子科技信息,汇聚业界精英精彩视点。
评论
  • 「他明明跟我同梯进来,为什么就是升得比我快?」许多人都有这样的疑问:明明就战绩也不比隔壁同事差,升迁之路却比别人苦。其实,之间的差异就在于「领导力」。並非必须当管理者才需要「领导力」,而是散发领导力特质的人,才更容易被晓明。许多领导力和特质,都可以通过努力和学习获得,因此就算不是天生的领导者,也能成为一个具备领导魅力的人,进而被老板看见,向你伸出升迁的橘子枝。领导力是什么?领导力是一种能力或特质,甚至可以说是一种「影响力」。好的领导者通常具备影响和鼓励他人的能力,并导引他们朝着共同的目标和愿景前
    优思学院 2025-01-08 14:54 82浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球中空长航时无人机产值达到9009百万美元,2024-2030年期间年复合增长率CAGR为8.0%。 环洋市场咨询机构出版了的【全球中空长航时无人机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球中空长航时无人机总体规模,包括产量、产值、消费量、主要生产地区、主要生产商及市场份额,同时分析中空长航时无人机市场主要驱动因素、阻碍因素、市场机遇、挑战、新产品发布等。报告从中空长航时
    GIRtina 2025-01-09 10:35 37浏览
  • 1月7日-10日,2025年国际消费电子产品展览会(CES 2025)盛大举行,广和通发布Fibocom AI Stack,赋智千行百业端侧应用。Fibocom AI Stack提供集高性能模组、AI工具链、高性能推理引擎、海量模型、支持与服务一体化的端侧AI解决方案,帮助智能设备快速实现AI能力商用。为适应不同端侧场景的应用,AI Stack具备海量端侧AI模型及行业端侧模型,基于不同等级算力的芯片平台或模组,Fibocom AI Stack可将TensorFlow、PyTorch、ONNX、
    物吾悟小通 2025-01-08 18:17 38浏览
  • 一个真正的质量工程师(QE)必须将一件产品设计的“意图”与系统的可制造性、可服务性以及资源在现实中实现设计和产品的能力结合起来。所以,可以说,这确实是一种工程学科。我们常开玩笑说,质量工程师是工程领域里的「侦探」、「警察」或「律师」,守护神是"墨菲”,信奉的哲学就是「墨菲定律」。(注:墨菲定律是一种启发性原则,常被表述为:任何可能出错的事情最终都会出错。)做质量工程师的,有时会不受欢迎,也会被忽视,甚至可能遭遇主动或被动的阻碍,而一旦出了问题,责任往往就落在质量工程师的头上。虽然质量工程师并不负
    优思学院 2025-01-09 11:48 51浏览
  • 本文介绍编译Android13 ROOT权限固件的方法,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。关闭selinux修改此文件("+"号为修改内容)device/rockchip/common/BoardConfig.mkBOARD_BOOT_HEADER_VERSION ?= 2BOARD_MKBOOTIMG_ARGS :=BOARD_PREBUILT_DTB
    Industio_触觉智能 2025-01-08 00:06 100浏览
  • 故障现象一辆2017款东风风神AX7车,搭载DFMA14T发动机,累计行驶里程约为13.7万km。该车冷起动后怠速运转正常,热机后怠速运转不稳,组合仪表上的发动机转速表指针上下轻微抖动。 故障诊断 用故障检测仪检测,发动机控制单元中无故障代码存储;读取发动机数据流,发现进气歧管绝对压力波动明显,有时能达到69 kPa,明显偏高,推断可能的原因有:进气系统漏气;进气歧管绝对压力传感器信号失真;发动机机械故障。首先从节气门处打烟雾,没有发现进气管周围有漏气的地方;接着拔下进气管上的两个真空
    虹科Pico汽车示波器 2025-01-08 16:51 94浏览
  • 在智能网联汽车中,各种通信技术如2G/3G/4G/5G、GNSS(全球导航卫星系统)、V2X(车联网通信)等在行业内被广泛使用。这些技术让汽车能够实现紧急呼叫、在线娱乐、导航等多种功能。EMC测试就是为了确保在复杂电磁环境下,汽车的通信系统仍然可以正常工作,保护驾乘者的安全。参考《QCT-基于LTE-V2X直连通信的车载信息交互系统技术要求及试验方法-1》标准10.5电磁兼容试验方法,下面将会从整车功能层面为大家解读V2X整车电磁兼容试验的过程。测试过程揭秘1. 设备准备为了进行电磁兼容试验,技
    北汇信息 2025-01-09 11:24 51浏览
  • 在过去十年中,自动驾驶和高级驾驶辅助系统(AD/ADAS)软件与硬件的快速发展对多传感器数据采集的设计需求提出了更高的要求。然而,目前仍缺乏能够高质量集成多传感器数据采集的解决方案。康谋ADTF正是应运而生,它提供了一个广受认可和广泛引用的软件框架,包含模块化的标准化应用程序和工具,旨在为ADAS功能的开发提供一站式体验。一、ADTF的关键之处!无论是奥迪、大众、宝马还是梅赛德斯-奔驰:他们都依赖我们不断发展的ADTF来开发智能驾驶辅助解决方案,直至实现自动驾驶的目标。从新功能的最初构思到批量生
    康谋 2025-01-09 10:04 40浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2025-01-09 09:58 33浏览
  •  在全球能源结构加速向清洁、可再生方向转型的今天,风力发电作为一种绿色能源,已成为各国新能源发展的重要组成部分。然而,风力发电系统在复杂的环境中长时间运行,对系统的安全性、稳定性和抗干扰能力提出了极高要求。光耦(光电耦合器)作为一种电气隔离与信号传输器件,凭借其优秀的隔离保护性能和信号传输能力,已成为风力发电系统中不可或缺的关键组件。 风力发电系统对隔离与控制的需求风力发电系统中,包括发电机、变流器、变压器和控制系统等多个部分,通常工作在高压、大功率的环境中。光耦在这里扮演了
    晶台光耦 2025-01-08 16:03 80浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦