英文原文:The Problem with Measuring Experience
我已经编程很长时间了。
我第一次自学编程是在一台老式的 Tandy 机器上,1 MB 的硬盘,一个 3.5 英寸软盘驱动器(A:/),一个 5 英寸软盘驱动器(B:/),运行着 MS-DOS,使用 QBasic。
当时,我 10 岁,没有其他科学或技术头脑的家庭成员,我完全靠自己。我拥有的所有东西就是那台机器,和一些厚重的 MS-DOS 用户手册。
我的第一个程序是简单的命令行计算器。它接受简单的数学问题作为输入,比如 1+1 或 1000/10,并输出结果。它只有四种功能(+ – * /),不能接受复杂等式。只有一个数字、一个运算符、和另一个数字。
然而,累积起来的过程花费了很多时间,因为我从来没有编程经验。我记得从一个简单的“Hello World”输出到把玩 goto 语句,感到如此兴奋。我不厌其烦地数了数程序中的语句,以便于我能随意跳转。我尝试了 if-then-else 结构。开发这个简单的计算器是贯穿于自我实验当中的、逻辑演进的结果。
我家人从妈妈的朋友那儿买了这台机器,二手的。人家只是把自己家里的电脑换成了一台 Windows 95 电脑。我记得,去我朋友家里,我们要在那台电脑花上数个小时,浏览早期的因特网(AOL 3.0)。真的,对于真正的互联网历史时期来说,这不算“早”,但这是我第一次上网。
我朋友有一个盗版的 Visual Basic 3.0,这也是我的另一次逻辑演进。他发现了一些论坛,人们在那儿贴出程序代码供其他人使用,他设法拷贝-粘贴,弄了一个可运行的“punter”。对于不了解的人,“punter”就是一个程序,它可以用来把某个人踢出他们的网络链接,甚至让他们的机器出现可怕的蓝屏死机【注1】。
我从来没有看过这个 punter 的代码(他对我用过一次,有效地结束了我们的友谊),但是这个经历常常让我着迷——学习和提高一个人技能的方式通常需要一种逻辑演进、或遍历特定集合里的所有已知元素、或者从外部资源引入更高阶的概念。
这对于编程和任何其它领域都是正确的。
我最后一次涉足 Visual Basic 3.0,拷贝-粘贴出了一个“文本加密”工具,还真正编写了一个程序,把我在 MS-Paint 画图程序里手动画的一些图片做成了动画。动画是一颗陨石撞向了地球,引起了核爆炸。
到了一定阶段,我拿了一本“Visual C++”方面的书,因为我在某个地方看到过,C++ 是所有真正程序员用来开发电脑游戏的语言。然而,当时它极度晦涩,难以理解。
有段时间我转而学习 HTML 以及如何创建简单的网站。我有 Angelfire 账号【注2】,创建了一个受欢迎的最终幻想 VII【注3】的粉丝网站。当时我对 MS-Paint 手到擒来,格外留意细节和设计(注意,我还不知道 JavaScript 或其它东东)。
一直没有老师教我编程,到了 10 年级,我在弗吉尼亚的汉普顿伯特利中学学习“计算机数学”课程。“计算机数学”是真正地“用 Pascal 编程”,包含了一个人可以期望在任何编程课程介绍里学到的、所有的重要范式:语句、分支、循环、函数、递归等。我们在课堂上写的最后一个游戏是二十一点【注4】。
此后,我搬到了德克萨斯州的圣安东尼奥。父亲从海军退休了,筹划着再婚,想对他的父母和兄弟再亲近些。因此,剩下的高中时光都花在了桑德拉·戴·奥康纳中学。
我的“计算机数学”课程、合理的计算机科学总课程,被挪到了代数 1 的第二年。我在 7 年级的时候就学过代数 1 了。为什么它要被挪到代数 1 的第二年呢?
我应该对他们的决定做了反抗。尽管如此,我那时还不了解反抗。
因此,我上了“Computer Science 1 Honors”(荣誉课程【注5】),C++ 的课程。我早就学过这些材料,它超级容易。语法远比 Pascal 优美,我们配备了不错的电脑,还有不差的 IDE。我们在计算机数学上使用的 Pascal IDE 大部分是拖放配置【注6】,不让我像 C++ IDE 里那样去敲出所有程序。
第二年,AP 课程理事会【注5】由于某种原因把计算机课程标准从 C++ 改成了 Java,因此我被迫重修了“Computer Science 1”,但是这一次是作为 AP 课程。再一次,我无视了材料。我在 AP 考试中拿到了最高分:5 分,满分 5 分。
没有深挖我的大学教育,此时,我想使用这些编程背景作为本文要说话题的基础:人们该如何衡量年限?
在 10~18 岁,我用 QBasic 和 Visual Basic 3.0 自学了 BASIC 编程、借助 Angelfire、用 HTML 做了基本的网站开发,还接受过 Pascal、C++ 和 Java 的正规教育。
然而,我不是 7×24 不间断地做着这些事情。因此很难说,比如,我有 2 或 3 年 BASIC,5 年 HTML,和 Pascal、 C++、Java 各 1 年的经验。
大多数现实中的开发人员可能没有做过这些。在很多职业场景里,大多数开发人员每周工作 40 小时,在 8 小时工作日里,他们也没有全部投入编程。
让我们考虑一个示例场景:在公司上班的一名 C++ 程序员按照每周工作 40 小时、每天 8 小时的标准,每年 52 周,或许有 2 周休假,因此每年有 50 周。
每年 50 周,乘以每周 40 小时,就等于每年 2000 个小时。
每年有 8760 小时。
因此,如果那名程序员,在工作了一年之后,就声称又有了一年 C++ 经验,它们会是不真实的吧?毕竟,2000 小时只占到了 1 年的 22.831050228%。实际上,他们不得不工作 4 年,才能接近于 1 个“整年”的经验。
当然,这有些荒唐,但是它让我考虑:我们该怎样界定“真实的经验”?
为什么它是荒唐的?因为没有程序员(有,可能也是凤毛麟角)日复一日地在真正地编程、而没有了编写代码之外的生活。我们的日子要过。我们很多人有了家庭或在尽量组建家庭,更不要说所有的“个人时间”还需要防止过度劳累。编程是艰苦卓绝的工作。开发也是艰苦卓绝的工作。相较于单纯地写代码,为了成为一名有竞争力且成功的开发人员,还有更多的工作要做。为了推动项目,一个人或许不得不和一些人互动。一个人或许不得不(但愿不要发生)参加很多会议,每周或(甚至)每天,只是为了推进项目。有时候,研究工作必须得做。技术规则必须得写,等等。这个清单还在继续。
因此,当招聘信息要求某人具有特定编程语言的具体年限时,我觉得具有轻蔑之意。这不是现实中开发工作的样子。某人声称已经使用一种语言 N 年了,肯定没有使用到实际要求的时间数量,而雇主只是根据他们所说的在某种语言具备了 N 年经验,也无法精确地看到应聘人员的技能。
整个情况就变成了——正常情况:一切都面目全非。换句话说,这成为了完全的标准程序,实际上对于整个 IT 界而言,一切照旧,但是没有人提出来。人们只是期望坐下来谈,而不管他们的实际经验是多少。
尽管如此,仅仅因为我在既定语言、或开发理念、或环境等等地方没有足够的经验,并不代表我不能快速学习、以足够交付对我要求的东东。
但是,很多雇主愿意为写代码或开发软件应用的人们支付薪水,通常不会考虑挑选那些按照既定要求而没有可衡量经验的人。他们想让你能够说出,你使用某项技能有着 1、或 2、或某些好听的大概年限数字经验。
最糟糕的是那些雇佣移动应用开发(我最近的领域)的人们。一些雇主明确要求具备在市场上有 app 的人。根据我的情况,这是相当有问题的,理由如下:
在愿意为软件开发支付的大部分人和实际的开发人员之间,存在着巨大的鸿沟。我想,聪明的开发人员,直觉上理解这一点,如果他们可以从工作中得到报酬,通常选择沉默而只是按要求做他们的事情,只要他们的报酬足够多。
从长期看,我认为这种情况是不可持续的,很多开发人员可能也认识到了。随着管理层向开发人员施加的不合理期望,随着“SCRUM”、“敏捷”之类的东西继续强势进入主流,情况只会变得更糟。
还有糟糕的是,我对这个问题还没有建设性的解决方案。
然而,我意识到了该情况,我还能看到同时要做的一件简单事情就是保持平静、坚持 hacking。
在某些条件下,我说的话将给有影响的人们留下印象。我没有做过巨大影响的事情(除了创建 peopleokwithmurderingassange.com,目前不可访问),已经给某些人留下了印象。考虑到我没有受过正式的 PHP 培训,基本上是在圣诞前夜搞出来的,后来不断更新和修改,这个项目写得相当烂了。我没有从这个项目中得到报酬,但是它给我带来了快乐,我知道它已经引起了很多人的关注。它让我明白,甚至像我这种没有影响力的人,也能给讨论前沿带来重要话题,并影响公众舆论,创造社会变化。
因为,代码不像过去的老套模式,它是一种社会行为。Hacking、开发、写代码,这些都是社会行为。曾经在生活中使用过电脑、智能手机、实际上任何电子设备的人,都接触到了无限多的时间,在这些时间里创造了精心制作的东东,最终让我们的协作人类生活更便利、更多彩、更创新、以及更加社会化。
我总是说,电脑游戏已经成为了我所有伟大社交关系的来源,如果不是任天堂娱乐平台的超级玛丽,我将不会成为一名程序员。
我 29 岁了。我编程已经差不多 20 年了。
你的经验从哪里开始,又是在哪里结束的?
译文: 《衡量年限的问题 》 腊八粥