我的最糟糕代碼列表
昨天HackerNews上的一個(gè)討論帖,讓我想起了我小時(shí)候?qū)懙姆浅7浅T愀獾拇a。
老實(shí)說,我不是非常的害怕。每個(gè)人都會(huì)說類似的話:“我從十歲開始編程!”沒有人會(huì)問他們十歲時(shí)寫什么代碼。大部分人直到長(zhǎng)大,獲得一個(gè)職業(yè)的時(shí)候才編寫出像樣的代碼。
我現(xiàn)在很期待那些12歲就設(shè)計(jì)操作系統(tǒng)的人們的評(píng)論。:)
我從九歲就開始編程了,因?yàn)槲覀儗W(xué)校開了一門編程課。沒有這門課的話,我可能變成一個(gè)作家或者語言學(xué)家。謝謝你ZRI,還有那個(gè)我永遠(yuǎn)不記得名字的教授。你們太棒了!
那時(shí)我使用了Logo,非常有趣,但真正有趣的是我十一歲時(shí)接觸到了Pascal。我不知道對(duì)于一個(gè)11歲的小孩來說什么樣的才是一個(gè)好程序員,我所知道的是按照現(xiàn)實(shí)的標(biāo)準(zhǔn)來看,我是個(gè)可怕的程序員。
下面是過去的十三年里,我創(chuàng)造的可怕的代碼的一個(gè)不完全列表。
1. 一個(gè)數(shù)學(xué)教學(xué)程序
年紀(jì):11歲
技術(shù):Pascal和文字的“圖形”
我想做個(gè)數(shù)學(xué)練習(xí)題的程序,我用了隨機(jī),這樣可以生成無窮多的例子。
但是,我不知道GotoXY,所以不會(huì)在屏幕的某個(gè)位置打印些東西。所以我用了很多步在 WELCOME 這行前打印空行。
我需要很多步,因?yàn)槲疫€不會(huì)循環(huán) – 每行都是硬編碼的空行。
已經(jīng)淹沒在歷史中的代碼。
2. 一個(gè)太空侵略者的游戲
年齡:11歲
技術(shù):Pascal和BGI圖形算法
這不是我做的太空入侵者(圖片來源:Wikipedia)
我叫它太空入侵者 —— 我根本不知道真正的太空入侵者游戲。我的僅僅是在上空有兩個(gè)太空飛船,可以從下面射擊它們。
我發(fā)現(xiàn)了BGI圖形算法,所以我可以在屏幕上繪制漂亮的圖像。我這次知道了循環(huán)了。問題是我不知道矩陣,所以我?guī)缀跤?00個(gè)全局變量。我記得最大的問題是,Pascal會(huì)報(bào)錯(cuò)“嘿,你的代碼不可以那么長(zhǎng)!”所以我將變量定義分成了幾行。
已經(jīng)淹沒在歷史中的代碼。
3. 一個(gè)“操作系統(tǒng)”
年紀(jì):12至13歲
技術(shù):Pascal,文字圖像和鼠標(biāo)驅(qū)動(dòng)
(類似這個(gè))
我想在我的電腦上做一個(gè)基本的界面,看起來和Turbo Pascal 7一樣酷。我管它叫操作系統(tǒng)盡管它僅僅是在DOS上的一個(gè)虛擬Shell上運(yùn)行的程序。
它有很多完成多任務(wù)的程序 —— 我不記得到底有多少了,但我記得有很多菜單,你可以點(diǎn)擊菜單到相應(yīng)的地方。你甚至可以運(yùn)行本地的程序(我經(jīng)常用它來運(yùn)行Doom)。你當(dāng)然可以對(duì)界面進(jìn)行設(shè)置,甚至可以以不同的用戶登陸。
有一種輸入密碼的秘密方法,所以你有可能進(jìn)入管理模式,弄亂其他用戶的設(shè)置。
第二個(gè)版本有更好的GUI(沒有截圖,對(duì)不起)
我最后不得不學(xué)習(xí)使用函數(shù),因?yàn)镚OTO不能跳到超過4000行。所有的那些“程序”都可以運(yùn)行嗎?這是單一的代碼庫(kù),而不是不同的程序。
哦,我仍舊有個(gè)問題,我不得不將全局變量的定義分成很多行。
這個(gè)程序也淹沒在歷史中了。
PS:后來我試著用BGI圖形來實(shí)現(xiàn)它,但我沒有完成繪制視窗。
4. 太空入侵者 v2
年紀(jì): 12或13歲
技術(shù): Pascal和BGI
那時(shí)我還是不知道真正的太空入侵者游戲,所以我做的這個(gè)游戲中,你要射擊上面來回飛的兩個(gè)對(duì)手。當(dāng)你把它們射下來后,又有新的飛出來。
我想可能是由于代碼的限制,所以敵人才那么少(數(shù)組大小?為對(duì)手設(shè)置的變量數(shù)?不知道)。
這個(gè)游戲最棒的一點(diǎn)在于你可以買武器和彈藥,而機(jī)器人玩家用光彈藥時(shí)就會(huì)撞向你。
因?yàn)槟撤N原因,在你的操作器上有一個(gè)頭是土豆的人會(huì)給你提示?,F(xiàn)在沒有截圖了,但我可以用紙和筆來重現(xiàn)畫面。
那次我不再用GOTO。我仍舊不知道代碼的可讀的重要性,所以大部分的變量都是a, aa, ab等。但我開始縮進(jìn)我的代碼了!很好玩。
這個(gè)代碼也淹沒在歷史中了。
5. 太空入侵者 v3(可能還有其他的名字)
年紀(jì):13歲
技術(shù):Pascal, 24位圖像, 鼠標(biāo)驅(qū)動(dòng), BMP動(dòng)畫庫(kù)
這是我創(chuàng)造的第一個(gè)看起來不錯(cuò)的游戲。但由于內(nèi)存的限制,你仍然一次最多只有四個(gè)對(duì)手,但他們可以在二維空間里飛,而不是只在上面左右來回飛。
你可以用鼠標(biāo)來操控,所以飛船上安置了鼠標(biāo),你可以通過點(diǎn)擊來射擊。非常好玩。這也是我第一次使用BMP動(dòng)畫庫(kù)和24位圖像 —— 真的很炫!
但為了給背景的星星制造視差效果,浪費(fèi)了太多地資源,以致沒有足夠的資源留給移動(dòng)和設(shè)計(jì)。數(shù)組的大小以及屏幕上子彈數(shù)仍舊給我?guī)砹瞬簧俚穆闊?/p>
最后我放棄了這個(gè)項(xiàng)目因?yàn)橐恢庇?ldquo;空指針”的錯(cuò)誤,而那時(shí)我并不知道什么是指針。
這個(gè)代碼也淹沒在歷史中了。
6. 太空入侵者3D(可能還有其他的名字)
年紀(jì):13歲
技術(shù):Pascal, 24位圖像
我想設(shè)計(jì)一個(gè)3D引擎,但不幸的是失敗了?;谟钪媸橇Ⅲw的事實(shí),我想更新屏幕上的一切,也包括看不見的。
但我加入了兩個(gè)物體之后就用光了內(nèi)存(16MB的內(nèi)存),僅能移動(dòng)一步了,所以這個(gè)“游戲”是完全沒用的。
這個(gè)代碼也淹沒在歷史中了。
7. 一個(gè)日歷應(yīng)用
年齡:14歲
技術(shù):Delphi
我想這個(gè)應(yīng)用可以追蹤任務(wù)。它為你顯示日歷,當(dāng)然也是由我手動(dòng)開發(fā)的。你可以添加任務(wù),之后提醒你。但我不知道閏年如何計(jì)算日期(并不僅僅是“除以4”)。它讓我在全國(guó)程序開發(fā)競(jìng)賽中獲得了第三。
這個(gè)代碼也淹沒在歷史中了。
8. ww2射擊游戲
年齡:14歲
技術(shù):Delphi
當(dāng)你想用Delphi開發(fā)一個(gè)2D游戲,想著能通過迅速變換視窗中的圖像來做跑動(dòng)的動(dòng)畫效果時(shí),你很有可能失敗。我用了幾個(gè)月的時(shí)間才把菜單弄好,加上了不錯(cuò)的圖片和音效,但我最終對(duì)開發(fā)游戲失去了興趣。
這個(gè)代碼也淹沒在歷史中了。
9. 早期網(wǎng)站
年紀(jì):15-16歲
技術(shù):PHP
這段時(shí)期我不太記得某一個(gè)項(xiàng)目了。我為網(wǎng)絡(luò)動(dòng)漫做了許多小網(wǎng)站,以及幾個(gè)大網(wǎng)站。
最主要的問題是我仍舊沒有丟掉動(dòng)態(tài)程序中所習(xí)慣的狀態(tài)的概念,HTML作為一種無狀態(tài)協(xié)議一直困擾著我。所以我的代碼中充斥著全局變量。我花了大量的時(shí)間學(xué)習(xí)session的工作原理。
已經(jīng)淹沒在歷史中的代碼。
10. Chlorine Boards – 制作網(wǎng)站的系統(tǒng)
年齡:17-20歲
在我厭倦了phpBB的模塊和插件后,我開始制作一個(gè)可以創(chuàng)建網(wǎng)站的開源系統(tǒng),一個(gè)模塊不需要知道另一個(gè)模塊的信息。
甚至有某些很大型的網(wǎng)站都在使用它,我說服了一個(gè)網(wǎng)站中介雇傭我,因?yàn)槲沂褂眠@個(gè)系統(tǒng)。
但有下面的失?。?/p>
* 使用關(guān)系型數(shù)據(jù)庫(kù)的方式非常錯(cuò)誤(最開始)。那時(shí)我不知道多對(duì)多關(guān)系的工作原理。
* 我自己寫了模版,使用了非常差的 模版-php 編譯器來完成代碼。
* 包管理器不能處理依賴
* 一切都是單態(tài)模式
* 還有我想不起來的
代碼仍舊在sourceforge上:Chlorine Boards
11. 用PHP開發(fā)的文字挖掘引擎
年齡:19-20歲
在Zemanta發(fā)布他的文字挖掘系統(tǒng)的同時(shí),我也開始開發(fā)我的。用PHP從零開始。它產(chǎn)生自標(biāo)簽云,效果相當(dāng)棒 —— 甚至可以完成造句,找詞語搭配等。
但我發(fā)現(xiàn)用Perl來寫正則式的時(shí)候有很嚴(yán)重的問題,因?yàn)镻HP的正則式解析引擎不夠快。
提醒一句:不要將語句提取器寫成正則式,即使PCRE允許你這么做。
我想那些擴(kuò)展了這個(gè)代碼的人肯定很恨我。
淹沒在NDA的代碼。
12. Twitulater
年齡:20-21歲
技術(shù):Javascript, Adobe AIR
想法很簡(jiǎn)單–一個(gè)twitter的客戶端,讓你根據(jù)正在發(fā)生的事情對(duì)對(duì)話進(jìn)行篩選。可以將鏈接放在不同的標(biāo)簽頁中,可以邊tweet邊對(duì)話。在TweetDeck之后進(jìn)行了較大改動(dòng),但比TweetDeck在許多方面都做得更好一些!
但它有很多bug,最終失敗了。當(dāng)你有一個(gè)20,000行的javascript代碼時(shí),而它是由一個(gè)不知道如何寫出簡(jiǎn)單的代碼的家伙寫的(譬如他不知道Javascript如何處理閉包,事件如何工作),這是非??膳碌腻e(cuò)誤。
代碼在GitHub上:Twitulater
13. 一個(gè)基于力的圖團(tuán)分析器
年齡:22歲
技術(shù):python, django, 數(shù)據(jù)庫(kù)
沒有許多機(jī)器學(xué)習(xí)的經(jīng)驗(yàn),我把圖像分解物體的集合,有許多力作用在物體上。然后你可以運(yùn)行物體模擬程序,最后屬于一類的節(jié)點(diǎn)會(huì)飛到一起,你可以使用網(wǎng)格切分算法挑選出重疊的部分。
當(dāng)新數(shù)據(jù)進(jìn)入系統(tǒng)后,你可以給相關(guān)的節(jié)點(diǎn)加力。
很簡(jiǎn)單的東西。
但實(shí)際上我并沒有實(shí)施真正的“尋找圖團(tuán)”的算法。我甚至不知道“尋找圖團(tuán)”的真正名稱是什么,我想我是這個(gè)新領(lǐng)域的第一人。
開始我使用關(guān)系數(shù)據(jù)庫(kù),你應(yīng)該猜得到,這行不通。計(jì)算僅僅一個(gè)結(jié)果就要很多秒,甚至幾分鐘。從數(shù)據(jù)庫(kù)中取數(shù)據(jù)是難以維持的。我使用App Engine和它的BigTable時(shí),情況稍稍有點(diǎn)改善。
現(xiàn)在回想起來,我應(yīng)該使用圖形數(shù)據(jù)庫(kù)的,那時(shí)候它們正好很火!
或者,應(yīng)該使用一個(gè)開始不是那么復(fù)雜的算法,可能會(huì)有幫助些。
這個(gè)代碼我不要意思拿出來。
原文鏈接:http://blog.jobbole.com/24624/
【編輯推薦】
- 2013年開發(fā)者需要了解的開發(fā)趨勢(shì)和技能
- 一個(gè)程序員的哲學(xué)思考(關(guān)于編程、關(guān)于人生)
- 簡(jiǎn)析Go與其他語言不同的類型
- 致諸位新程序員:來自Chuck Jazdzewski慈父般的忠告
- 十四歲程序員的黃金時(shí)代