我的朋友Clift Norris发现了一个基本常数。我称之为Norris常数,一个未经培训的程序猿在他或她遇到瓶颈之前能写出的平均代码量。Clift预计这个值是1500行。

超过这个数以后,代码会变得如此混乱,以至于本人都无法轻而易举的进行调试和改动。

  我还不了解足够多的0基础程序猿来验证这一结果,只是我自己认识到,程序猿生涯的下一个瓶颈将发生在20,000行。我把Norris常数改成2,000那样正好变成十倍。

  在我离开大学之后的第一份工作中。我和我的同事一样(和我差点儿相同年纪)重复遇到了20,000行的瓶颈。在梦工厂我们有950个程序给动画师使用,行数统计显示多的一些基本在20,000 至25,000行。

超过这个数的话即再多的努力也无法添加新特性了。

  在1996年年中的时候我负责编写梦工厂的照明工具(和另外两个程序猿)。我知道这将远远超过20,000行代码。

我改变了我的编程方法而且这个工具一年后以大约200,000行的代码量成功交付。

(这个工具计划于2013年退役,在16年时间里它被每天使用并用来拍摄了21部电影。

)我由于写了好几个行数在10万到20万的程序,我非常确定我遇到了下一个瓶颈。我已经可以能感觉到它。

  特别难的部分是和一些没有像你一样打破了好几道瓶颈的人讨论技术。打破这些瓶颈意味着做出不同的取舍。特别是一些短期内看起来不合理但以后会有所帮助决定。

这非常难去争论,短期内的长处是显而易见的。但我无法说服不论什么人说从如今起一年内可能有人会做出一个看似无害可是会破坏现有代码的修改。

  Edsger Dijkstra 在1969年写道:

  一个一岁多的孩子会以一定的速度匍匐前进。比方说每小时一英里。但每小时一千英里的速度就是一架超音速喷气机。就物体的移动能力而言这两者是没有可比性的。不论什么当中一个能够到的可是还有一个不能做到,反之亦然。

  一个Clift 所指的0基础程序猿,学会了爬行,接着蹒跚学步,然后行走,然后慢跑。然后再跑步,最后冲刺。他觉得,“以这样加速度前进我能够赶上超音速喷气机的速度!“但他跑进了2,000行的极限,由于他的技能不会再按比例添加。他必须改变移动方式,比方开车去获得更快的速度。然后,他就学会了开车,開始非常慢。然后越来越快,但有进入到了20000行极限。驾驶汽车的技术不会变成开喷气式飞机。

  我的朋友Brad Grantham用新手程序猿用“蛮力”解决这个问题来说明了这一点。我觉得这是正确的:当代码是在2,000行下面,你能够写不论什么混乱肮脏的代码并依靠你的记忆解救你。

深思熟虑的类和包分解会让你的代规模达到20,000行。

  突破这个瓶颈的关键是什么?

对我而言。就是让事情保持简单。除非如今就很须要,否则全然拒绝加入不论什么新特性或者新代码。我已经在Every Line Is a Potential Bug中提高了这一点(在Simple
is Good之前还是一知半解)。梦工厂的首席特效架构师是这么理解的:

  对我而言。照明工具成功的地方在于他选择了一系列easy使用和维护的小功能而且强大到足够成为一个很棒的照明工具。

  作为一名技术领导我明确我基本的贡献是对那些同事认为很重要但不能证明其合理的需求说“不”。但真正的诀窍是知道什么需求添加了线性的复杂度(仅仅和自身相关)和指数级复杂度(和别的需求有关联)。两者都因该去避免,但后者须要更令人信服的理由。

  举个样例。在2012年,Linux内核有1500万行代码。当中75%是具有线性复杂度的(驱动。文件系统和处理器结构相关的代码)。你可能有很多视屏驱动。但他们之间没有不论什么(或非常少)的交互。

剩下的则有很多其它的依赖关系。

  Dijkstra认为非常难去教授这些先进的方法。由于他们仅仅对那些2万行或者20万行的程序才有意义。不论什么的类或者规范必须限制其演示样例在几百行以内,暴力方法在这里也相同适用。你真的须要范例给你显示30,000行代码然后证实由于程序上手并非非常复杂所以新功能可以非常easy的被加入。但这实际上是不可能的。.

  我不知道做出什么改变来突破20万行的瓶颈。我近期已经切换到了更纯粹的函数式风格并降低了可变状态,或许这些能让我有所突破。

  并且我非常想知道到代码量达到2000万行的时候会变成什么样子。

程序猿职业生涯中的 Norris 常数的更多相关文章

  1. 教你摆脱低级程序猿 项目中cocopads的安装使用

    小农今天聊聊一款作为iOS开发者必备的第三方管理软件.希望程序猿朋友们看到小农的这篇文章后.可以真正的学会怎样灵活管理你项目中的第三方. (一)CocoaPods是什么? 首先我们来认识一下这款第三方 ...

  2. 黑马程序猿——Java中的类载入器

    ------- android培训.java培训.期待与您交流! -------- 类载入器 Java虚拟机中能够安装多个类载入器,系统默认三个主要类载入器,每一个类负责载入特定位置的类: BootS ...

  3. 谈谈如何在面试中发掘程序猿的核心竞争力zz

    早两天看了知乎日报的这篇文章<什么是程序员的核心竞争力?>,caoz讲的几点是让我感同身受.这让我联想起了给程序猿的面试,其实也就是通过短暂的接触来发掘程序猿的核心竞争力.接下来我就谈谈我 ...

  4. css中那些容易被我们程序猿所忽略的选择器

    css中那些容易被我们程序猿所忽略的选择器 作为一个程序猿,我们可能会遇到这样的问题,假如:有5个li,要求给第三个li设置背景颜色怎么办?有人会说,用JS啊,循环遍历出第三个不就行了.但是,用JS解 ...

  5. 程序猿大牛 Jeff Atwood 的两本中文书

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/happydeer/article/details/17094271 watermark/2/text ...

  6. 从程序猿到SAP产品经理,我是如何转型的?

    文章作者:Jason Xia(夏建军) Jerry: 今天的文章来自Jason Xia, 我的老同事,和我一样从2007年进入SAP成都研究院工作至今.这篇文章讲述了Jason是如何从一名SAP资深开 ...

  7. 关于App程序猿泡沫

    前言 做开发快七年了,对于程序猿,外行人总有着数不完的讽刺和误解,可是我都懒得去解释.代码搬运工人也好,民工也罢,随他们去说吧.可是网上近期流传的程序猿泡沫,尤其是APP程序猿泡沫的文章导致非常多我们 ...

  8. 不懂CSS的后端难道就不是好程序猿?

    由于H5在移动端的发展如日中天,现在大部分公司对高级前端需求也是到处挖墙角,前端薪资也随之水涨船高,那公司没有配备专用的前端怎么办呢? 作为老板眼中的“程序猿” 前端都不会是非常无能的表现,那作为后端 ...

  9. 站在风口,你或许就是那年薪20w+的程序猿

    最近面试了一些人,也在群上跟一些群友聊起,发现现在的互联网真是热,一些工作才两三年的期望的薪资都是十几K的起,这真是让我们这些早几年就成为程序猿的情何以堪!正所谓是站在风口上,猪也能飞起来!我在这里就 ...

随机推荐

  1. SaltStack salt-key 命令

    salt-key is used to manage Salt authentication keys [root@localhost ~]$ salt-key -L # 查看有哪些minion公钥过 ...

  2. 第二篇:Hadoop 在Ubuntu Kylin系统上的搭建[图解]

    前言 本文介绍如何在Ubuntu Kylin操作系统上搭建Hadoop平台. 配置 1. 操作系统: Ubuntu Kylin 14.04 2. 编程语言: JDK 1.8 3. 通信协议: SSH ...

  3. VS中快捷键修改以及快捷键的查看

    eclipse用习惯了一直想把VS中的alt+/改为自动补全,同时自定义一下C#环境下自动加入命名控件的快捷键,前段时间摸索了一下,找到了比较好的方法 首先是vs中修改快捷键的方法:工具->选项 ...

  4. Android学习之Gallery

    在Android中,画廊控件Gallery用来显示图片列表,可以用手指直接拖动图片左右移动.Gallery只能水平显示一行,且Gallery列表中的图片会根据不同的拖动情况向左或向右移动,直到显示到最 ...

  5. JS使用中碰到的一些问题

    settimeout: 1.setTimeout(function () {//这个则会在1秒后进行弹出1 alert(1); }, 1000); 2.setTimeout(alert(1), 100 ...

  6. 安卓APP动态调试-IDA实用攻略

    0x00 前言 随着智能手机的普及,移动APP已经贯穿到人们生活的各个领域.越来越多的人甚至已经对这些APP应用产生了依赖,包括手机QQ.游戏.导航地图.微博.微信.手机支付等等,尤其2015年春节期 ...

  7. LeetCode 24 Swap Nodes in Pairs (交换相邻节点)

    题目链接: https://leetcode.com/problems/swap-nodes-in-pairs/?tab=Description   Problem: 交换相邻的两个节点     如上 ...

  8. JVM垃圾收集器组合--各种组合对应的虚拟机参数实践

    前言 相信很多人都看过下面这张图,(来自<深入理解Java虚拟机:JVM高级特性与最佳实践>) 在学完几种垃圾收集器类型及组合后,打算看看实际中程序用到的垃圾收集器. 但是在jconsol ...

  9. 如何在Computer下添加System Folder

    1.创建一个GUID标识该系统目录,比如:{7854FF7A-470F-4D04-9FC5-4CFC7B2A0E89}.下面的操作步骤将全部使用这个示例GUID. 2.打开注册表编辑器(Registr ...

  10. 提高VS2010运行速度的技巧

    任务管理器,CPU和内存都不高,为何?原因就是VS2010不停地读硬盘导致的; 写代码2/3的时间都耗在卡上了,太难受了; 研究发现,VS2010如果你装了VC等语言,那么它就会自动装SQL Serv ...