转载

衡量年限的问题

  英文原文: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 的人。根据我的情况,这是相当有问题的,理由如下:

  1. 我工作的第一个 app 不是我自己的,已经被另一家开发公司接管了。
  2. 我工作的第二个 app,也是我的第一款游戏,并没有推向市场,因为它未完工。投资这个开发的人在完工之前撤资了。
  3. 我最近在忙的 app 也不是我自己的,除了我之外还有一些人,需要遵守保密协议。

  在愿意为软件开发支付的大部分人和实际的开发人员之间,存在着巨大的鸿沟。我想,聪明的开发人员,直觉上理解这一点,如果他们可以从工作中得到报酬,通常选择沉默而只是按要求做他们的事情,只要他们的报酬足够多。

  从长期看,我认为这种情况是不可持续的,很多开发人员可能也认识到了。随着管理层向开发人员施加的不合理期望,随着“SCRUM”、“敏捷”之类的东西继续强势进入主流,情况只会变得更糟。

  还有糟糕的是,我对这个问题还没有建设性的解决方案。

  然而,我意识到了该情况,我还能看到同时要做的一件简单事情就是保持平静、坚持 hacking。

  在某些条件下,我说的话将给有影响的人们留下印象。我没有做过巨大影响的事情(除了创建 peopleokwithmurderingassange.com,目前不可访问),已经给某些人留下了印象。考虑到我没有受过正式的 PHP 培训,基本上是在圣诞前夜搞出来的,后来不断更新和修改,这个项目写得相当烂了。我没有从这个项目中得到报酬,但是它给我带来了快乐,我知道它已经引起了很多人的关注。它让我明白,甚至像我这种没有影响力的人,也能给讨论前沿带来重要话题,并影响公众舆论,创造社会变化。

  因为,代码不像过去的老套模式,它是一种社会行为。Hacking、开发、写代码,这些都是社会行为。曾经在生活中使用过电脑、智能手机、实际上任何电子设备的人,都接触到了无限多的时间,在这些时间里创造了精心制作的东东,最终让我们的协作人类生活更便利、更多彩、更创新、以及更加社会化。

  我总是说,电脑游戏已经成为了我所有伟大社交关系的来源,如果不是任天堂娱乐平台的超级玛丽,我将不会成为一名程序员。

  我 29 岁了。我编程已经差不多 20 年了。

  你的经验从哪里开始,又是在哪里结束的?


  • 注1:蓝屏死机(英语:Blue Screen of Death,缩写为:BSoD)指的是微软 Windows 操作系统在无法从一个系统错误中恢复过来时所显示的屏幕图像。Windows 中有两个图像都被称为蓝屏死机,其中一个要比另一个严重得多。http://zh.wikipedia.org/wiki/%E8%93%9D%E5%B1%8F%E6%AD%BB%E6%9C%BA
  • 注2:Angelfire 是一种为网站提供免费空间的互联网服务。http://en.wikipedia.org/wiki/Angelfire
  • 注3:《最终幻想 VII》(日语:ファイナルファンタジーVII,英语:Final Fantasy VII)是由史克威尔(今史克威尔艾尼克斯)开发的电子角色扮演游戏,是最终幻想系列第七部本传。http://zh.wikipedia.org/wiki/%E6%9C%80%E7%BB%88%E5%B9%BB%E6%83%B3VII
  • 注4:二十一点(英文:Blackjack),是一种使用扑克牌玩的赌博游戏。亦是唯一一种在赌埸中可以在概率中战胜庄家的一种赌博游戏。http://zh.wikipedia.org/wiki/%E5%BB%BF%E4%B8%80%E9%BB%9E
  • 注5:荣誉课程是美国特有的区别于标准课程的一种课程形式。相对于普通课程,荣誉课程的量并不一定更多,其区别更多在于课程程度更深和学习节奏更快。荣誉课程强调的是通过批判和独立的思考。为鼓励课堂参与度,荣誉课程一般安排更小的师生比例。美国的高中大多都有荣誉(Honor)课。http://www.findingschool.net/bbs/thread/675
  • 注6:拖放(Drag-and-drop)指的是图形使用者界面(Graphical user interface)中,“在一个虚拟的物件上按著鼠标键将之拖曳到另一个地方或另一个虚拟物件之上”的动作(或是支持着这样的界面的技术)。一般而言,这可以用来产生很多种动作,或是在两个抽象物件当中产生各式各样的连结。http://zh.wikipedia.org/wiki/%E6%8B%96%E6%94%BE

  译文: 《衡量年限的问题 》 腊八粥

正文到此结束
Loading...