关于“灰胡子”编程的5个永恒教训

青年可能是人力资源部想要的,但没有人像长期编程专业人士一样突出代码

硅谷的人力资源部门和招聘经理面临着一个挑战。他们不能问求职者的年龄,因为他们的公司多年来都在残酷的歧视诉讼中败诉。相反,他们会想出一些小伎俩,比如在开场白中隐晦地提到《布雷迪家族》(The Brady Bunch)中的“玛西亚,玛西亚,玛西亚!”(Marcia, Marcia, Marcia!)如果应聘者咯咯笑,就会被认为不符合企业文化,并被拒之门外。

可惜的是,计算机行业对新技术、新范式,当然还有新程序员有着一种奇怪的、狂热的迷恋。它的魅力大于现实,因为旧技术永远不会真正消亡。像大型机这样的老发明可能不再成为头条新闻,但它们一直在运行。在我写这篇文章时,Dice显示的关键词“Cobol”的招聘信息(522个)是“OCaml”、“Erlang”和“Haskell”的总和(分别为11个、52个和27个)的五倍多。

年龄歧视的故事很常见,合理化也是如此。年轻的程序员头脑中不会充满旧的想法,所以他们学得更快。自以为是的人更专注、更勤奋。他们不受干扰,比如拥有家庭,或者至少他们的干扰让他们与个人电脑和智能手机捆绑在一起。

即使这些都是真的——有证据表明它们不是——编程怪杰们拥有宝贵的智慧,你不能仅仅通过在YouTube上观看TED演讲或通过MOOC快进来吸收。他们更了解电脑是如何工作的,因为他们不得不回到电脑有开关的前面板的时候。他们没有ide层、优化编译器和持续集成来拯救自己。如果他们不从一开始就把它建好,它就根本无法运行。年轻的小混混们好几年都不会知道。

我们最后一个故事是编程“灰胡子”的7个永恒教训引起了很多人的反应,所以我们又回来了,每个人都应该从他们干瘪、坚强的同事身上学习或重新学习5个教训。

汇编程序

大多数50岁以下的人都听不出这样的话mov啊,09年h或者cmp eax, ebx.许多人可能认为计算机自然需要大量的卷曲括号,因为主要语言使用它们来分隔代码块。即使是那些了解像Java或C这样的语言的人也必须转化为二进制,通常没有经验制作它。

许多较旧的程序员花了他们的日子编写汇编代码,所以给出了Lew Binary Machine代码的人类可读版本的名称。有些人实际上可以用手转换汇编代码并将其转换为十六进制字节。然后,最好的可以翻转前面板上的切换开关来编程计算机。

并不是说编写汇编程序是伟大的或必要的。这是一个充满重复的漫长过程,有很多机会让你犯草率的错误。编译器已经足够好,可以识别可以优化的复杂模式;事实上,一些编译器的创造者喜欢吹嘘他们能写出比人类更好的代码。

这可能是真的,但即使是一个汇编者而学习的优势就是你了解计算机的工作原理。高阶语言可以提供许多用于标准操作的快速快捷方式,例如连接字符串,但这些可以是陷阱,因为程序员开始思考加上的顺序(“+)无论是两个整数相加还是连接两个字符串都需要相同的时间。它不是。一种操作需要的时间要长得多,理解汇编代码和JMP(跳转)操作工作方式的人将做出正确的决定。

理解对象是如何打包在内存中并在必要时加载到CPU中的,这对于最大限度地减少可能产生慢代码的复制和过度计算有很大帮助。在汇编程序中长大的人可能不太记得编写x86代码,但当他们开始做一些本来就很慢的事情时,他们仍然有一种本能。这些自以为是的人没有这些本能,除非他们通过经验训练自己。

声音和灯光

很久以前,一个程序员告诉我他讨厌Unix。为什么?他开始编写单用户微型计算机,比如牵牛星或Sol 20,每次只运行一个代码块。

他告诉我:“Unix电脑在任何时候都会开始运行其他东西。”“你会听到软盘启动的声音,但你不知道为什么。”

这让他心烦意乱,因为他正在失去一种理解计算机正在做的事情的强大手段。没有人真正知道现代计算机发生了什么。在四个或八个核心上运行无数的软件层。病毒和蠕虫可以永远活着,没有用户注意到滞后。

老程序员仍然关注视觉和听觉线索,以帮助他们理解和调试代码。他们看着RJ-45以太网接口上的光在数据流动时闪烁。他们听硬盘,并能听到磁盘开始改变磁道,这表明有东西在读或写硬盘。真正优秀的索引可以区分内存满时发生的分页和作为索引一部分的持续读写之间的区别。

随着硬盘被固态硬盘取代,越来越多的数据通过无线传输而不是通过闪烁的路由器传输,这些线索的价值正在逐渐消失。但只要智能手机上没有显示数据何时流动的指标,这样的侦查技能就会有价值。

禁止

在过去,程序员会将多达8个不同的布尔值打包到一个字节中。他们把每一个比特都翻转过来,因为他们不想浪费任何一个比特。

现代数据结构非常浪费。XML填充有长名称的标签,每个标签都有一个匹配的截止标记,额外的斜杠。看到超过90%的绒毛绒毛难以满足严格的解析规则并不罕见。

JSON被认为是一种改进,因为它更小一些,但这仅仅是因为它没有结束标记——只有花括号。在所有的标签和字符串上仍然有太多的引号。

好消息是,现代压缩算法通常可以从数据结构中挤出大部分脂肪。但他们不可能得到全部。灰胡子知道如何从一开始就避免把它放进去。这就是为什么像MS-DOS 3.0这样的代码可以在不超过32MB的分区中又快又轻地运行。注意修饰符:不超过.这是3200万字节最大磁盘分区大小。

MS-DOS 3.0的这些细节可以追溯到20世纪80年代初,当时个人电脑已经普及,计算机革命也远远超过了起步阶段。如果你再往回看一点,1970年代的代码甚至更简洁。20世纪60年代的代码非常惊人。

二进制数学

对于早期的程序员来说,测试和翻转比特的操作不仅仅是新奇的;他们是必需品。有些操作非常慢,程序员不得不寻找他们能找到的任何优势。最好的方法是理解除以2等于向右移动一个二进制数,就像除以10等于向右移动一个十进制数一样。

移位所有位是cpu上的标准操作,与基本的除法相比,它通常要快得多。优秀的程序员利用这一优势编写更快的代码,无需等待乘法和除法,而移位也可以完成同样的工作。

我们失去了与2的幂的联系。过去,设计师会本能地选择2的幂数,因为它们会带来更高的效率。像512或4096这样的数字经常出现,因为处理2的幂的极限更容易。

小细节加起来

在许多早期处理器上,一些操作比其他操作要长得多。在原始的8086上,除以80到190次时钟周期的任何地方都花了一个数字,而添加两个数字只有三个周期。即使CPU可以在5MHz运行时,它仍然可以在一次又一次地进行操作时仍然有很大的不同。

较旧的程序员知道,不是每一行代码或每条指令都将在相同的时间内执行。他们明白计算不含释放,而不是每一行代码都是等效的。选择错误的操作,您的机器将大幅减速。

人们忘记了选择错误的数据类型也会有后果。在某些芯片上,使用double或long变量仍然会比较慢。当你扩展时,使用错误的数据结构会把程序变成垃圾。

太多的年轻人认为计算是瞬时的,cpu可以在眨眼之间进行无限次的计算。他们的前辈还记得,cpu速度很慢,做加法的时候会拖拖拉拉,做除法的时候就会卡住。这些年来,我通过破解、调试和重新破解他们的代码,收集了很多细节。获得这些知识的唯一方法就是时间。

相关文章

这个故事,“5个永恒的编程经验”最初发表于信息世界

加入网络世界社区有个足球雷竞技app脸谱网LinkedIn对自己最关心的话题发表评论。

版权所有©2016 IDG ComRaybet2munications, Inc.

SD-WAN买家指南:要询问供应商(和您自己)的关键问题