我的最糟糕代码列表
英文原文: swizec.com 编译: 伯乐在线- 唐小娟
昨天 HackerNews 上的一个讨论帖,让我想起了我小时候写的非常非常糟糕的代码。
老实说,我不是非常的害怕。每个人都会说类似的话:“我从十岁开始编程!”没有人会问他们十岁时写什么代码。大部分人直到长大,获得一个职业的时候才编写出像样的代码。
我现在很期待那些 12 岁就设计操作系统的人们的评论。:)
我从九岁就开始编程了,因为我们学校开了一门编程课。没有这门课的话,我可能变成一个作家或者语言学家。谢谢你 ZRI,还有那个我永远不记得名字的教授。你们太棒了!
那时我使用了 Logo,非常有趣,但真正有趣的是我十一岁时接触到了 Pascal。我不知道对于一个 11 岁的小孩来说什么样的才是一个好程序员,我所知道的是按照现实的标准来看,我是个可怕的程序员。
下面是过去的十三年里,我创造的可怕的代码的一个不完全列表。
1. 一个数学教学程序
年纪:11 岁
技术:Pascal 和文字的“图形”
我想做个数学练习题的程序,我用了随机,这样可以生成无穷多的例子。
但是,我不知道 GotoXY,所以不会在屏幕的某个位置打印些东西。所以我用了很多步在 WELCOME 这行前打印空行。
我需要很多步,因为我还不会循环 – 每行都是硬编码的空行。
已经淹没在历史中的代码。
2. 一个太空侵略者的游戏
年龄:11 岁
技术:Pascal 和 BGI 图形算法
这不是我做的太空入侵者(图片来源:Wikipedia)
我叫它太空入侵者 —— 我根本不知道真正的太空入侵者游戏。我的仅仅是在上空有两个太空飞船,可以从下面射击它们。
我发现了 BGI 图形算法,所以我可以在屏幕上绘制漂亮的图像。我这次知道了循环了。问题是我不知道矩阵,所以我几乎有 200 个全局变量。我记得最大的问题是,Pascal 会报错“嘿,你的代码不可以那么长!”所以我将变量定义分成了几行。
已经淹没在历史中的代码。
3. 一个“操作系统”
年纪:12 至 13 岁
技术:Pascal,文字图像和鼠标驱动
(类似这个)
我想在我的电脑上做一个基本的界面,看起来和 Turbo Pascal 7 一样酷。我管它叫操作系统尽管它仅仅是在 DOS 上的一个虚拟 Shell 上运行的程序。
它有很多完成多任务的程序 —— 我不记得到底有多少了,但我记得有很多菜单,你可以点击菜单到相应的地方。你甚至可以运行本地的程序(我经常用它来运行 Doom)。你当然可以对界面进行设置,甚至可以以不同的用户登陆。
有一种输入密码的秘密方法,所以你有可能进入管理模式,弄乱其他用户的设置。
第二个版本有更好的 GUI(没有截图,对不起)
我最后不得不学习使用函数,因为 GOTO 不能跳到超过 4000 行。所有的那些“程序”都可以运行吗?这是单一的代码库,而不是不同的程序。
哦,我仍旧有个问题,我不得不将全局变量的定义分成很多行。
这个程序也淹没在历史中了。
PS:后来我试着用 BGI 图形来实现它,但我没有完成绘制视窗。
4. 太空入侵者 v2
年纪: 12 或 13 岁
技术: Pascal 和 BGI
那时我还是不知道真正的太空入侵者游戏,所以我做的这个游戏中,你要射击上面来回飞的两个对手。当你把它们射下来后,又有新的飞出来。
我想可能是由于代码的限制,所以敌人才那么少(数组大小?为对手设置的变量数?不知道)。
这个游戏最棒的一点在于你可以买武器和弹药,而机器人玩家用光弹药时就会撞向你。
因为某种原因,在你的操作器上有一个头是土豆的人会给你提示。现在没有截图了,但我可以用纸和笔来重现画面。
那次我不再用 GOTO。我仍旧不知道代码的可读的重要性,所以大部分的变量都是a, aa, ab 等。但我开始缩进我的代码了!很好玩。
这个代码也淹没在历史中了。
5. 太空入侵者 v3(可能还有其他的名字)
年纪:13 岁
技术:Pascal, 24 位图像, 鼠标驱动, BMP 动画库
这是我创造的第一个看起来不错的游戏。但由于内存的限制,你仍然一次最多只有四个对手,但他们可以在二维空间里飞,而不是只在上面左右来回飞。
你可以用鼠标来操控,所以飞船上安置了鼠标,你可以通过点击来射击。非常好玩。这也是我第一次使用 BMP 动画库和 24 位图像 —— 真的很炫!
但为了给背景的星星制造视差效果,浪费了太多地资源,以致没有足够的资源留给移动和设计。数组的大小以及屏幕上子弹数仍旧给我带来了不少的麻烦。
最后我放弃了这个项目因为一直有“空指针”的错误,而那时我并不知道什么是指针。
这个代码也淹没在历史中了。
6. 太空入侵者 3D (可能还有其他的名字)
年纪:13 岁
技术:Pascal, 24 位图像
我想设计一个 3D 引擎,但不幸的是失败了。基于宇宙是立体的事实,我想更新屏幕上的一切,也包括看不见的。
但我加入了两个物体之后就用光了内存(16MB 的内存),仅能移动一步了,所以这个“游戏”是完全没用的。
这个代码也淹没在历史中了。
7. 一个日历应用
年龄:14 岁
技术:Delphi
我想这个应用可以追踪任务。它为你显示日历,当然也是由我手动开发的。你可以添加任务,之后提醒你。但我不知道闰年如何计算日期(并不仅仅是“除以4”)。它让我在全国程序开发竞赛中获得了第三。
这个代码也淹没在历史中了。
8. ww2 射击游戏
年龄:14 岁
技术:Delphi
当你想用 Delphi 开发一个 2D 游戏,想着能通过迅速变换视窗中的图像来做跑动的动画效果时,你很有可能失败。我用了几个月的时间才把菜单弄好,加上了不错的图片和音效,但我最终对开发游戏失去了兴趣。
这个代码也淹没在历史中了。
9. 早期网站
年纪:15-16 岁
技术:PHP
这段时期我不太记得某一个项目了。我为网络动漫做了许多小网站,以及几个大网站。
最主要的问题是我仍旧没有丢掉动态程序中所习惯的状态的概念,HTML 作为一种无状态协议一直困扰着我。所以我的代码中充斥着全局变量。我花了大量的时间学习 session 的工作原理。
已经淹没在历史中的代码。
10. Chlorine Boards – 制作网站的系统
年龄:17-20 岁
在我厌倦了 phpBB 的模块和插件后,我开始制作一个可以创建网站的开源系统,一个模块不需要知道另一个模块的信息。
甚至有某些很大型的网站都在使用它,我说服了一个网站中介雇佣我,因为我使用这个系统。
但有下面的失败:
* 使用关系型数据库的方式非常错误(最开始)。那时我不知道多对多关系的工作原理。
* 我自己写了模版,使用了非常差的模版-php 编译器来完成代码。
* 包管理器不能处理依赖
* 一切都是单态模式
* 还有我想不起来的
代码仍旧在 sourceforge 上:Chlorine Boards
11. 用 PHP 开发的文字挖掘引擎
年龄:19-20 岁
在 Zemanta 发布他的文字挖掘系统的同时,我也开始开发我的。用 PHP 从零开始。它产生自标签云,效果相当棒 —— 甚至可以完成造句,找词语搭配等。
但我发现用 Perl 来写正则式的时候有很严重的问题,因为 PHP 的正则式解析引擎不够快。
提醒一句:不要将语句提取器写成正则式,即使 PCRE 允许你这么做。
我想那些扩展了这个代码的人肯定很恨我。
淹没在 NDA 的代码。
12. Twitulater
Twitulater 截图
年龄:20-21 岁
技术:Javascript, Adobe AIR
想法很简单–一个 推ter 的客户端,让你根据正在发生的事情对对话进行筛选。可以将链接放在不同的标签页中,可以边 tweet 边对话。在 TweetDeck 之后进行了较大改动,但比 TweetDeck 在许多方面都做得更好一些!
但它有很多 bug,最终失败了。当你有一个 20,000 行的 javascript 代码时,而它是由一个不知道如何写出简单的代码的家伙写的(譬如他不知道 Javascript 如何处理闭包,事件如何工作),这是非常可怕的错误。
代码在 GitHub 上:Twitulater
13. 一个基于力的图团分析器
年龄:22 岁
技术:python, django, 数据库
没有许多机器学习的经验,我把图像分解物体的集合,有许多力作用在物体上。然后你可以运行物体模拟程序,最后属于一类的节点会飞到一起,你可以使用网格切分算法挑选出重叠的部分。
当新数据进入系统后,你可以给相关的节点加力。
很简单的东西。
但实际上我并没有实施真正的“寻找图团”的算法。我甚至不知道“寻找图团”的真正名称是什么,我想我是这个新领域的第一人。
开始我使用关系数据库,你应该猜得到,这行不通。计算仅仅一个结果就要很多秒,甚至几分钟。从数据库中取数据是难以维持的。我使用 App Engine 和它的 BigTable 时,情况稍稍有点改善。
现在回想起来,我应该使用图形数据库的,那时候它们正好很火!
或者,应该使用一个开始不是那么复杂的算法,可能会有帮助些。
这个代码我不要意思拿出来。