我到底做了什么

earthharp 2003-11-22 04:54:13

我到底做了什么
For my love SunJing


许久不写文章的我忽然有一种冲动,这种冲动来源于Matrix(不是黑客帝国, 而是我写的一个Matrix class)。 虽然前几天才经历过Revolution的激烈, 不过可惜,驾上机器人去战斗的并不是我

代码的编写如同整天磨豆子一般无聊。我早已经习惯了C与C++里的Memory Access Violation, 还有那受人唾弃的Memory Leak。不再如几年前眼巴巴的看着那短短数十行C代码,闭上小眼睛,心里轻轻的叫: “阿门, 千万不要出现内存错误,千万不要出现逻辑错误,千万, 千万…”。当然,事情不会如我想象般顺利的进行。总是在我心跳最厉害的时刻屏幕上一定会跳出那个MB_ICONERROR的MessageBox, 我真的怕了,特别是在我已经不能满足于简单的Hello world而尝试更复杂的算法时。
记得第一个QuickSort吗? 我好象不记得是怎么写的了,但是我记得心跳的感觉。我那时候默默的说:不知道是那一个天才做出了递归函数,我算是理解了林锐的那句话了。那个QuickSort, 是我第一次用Single Step。花了好几个小时工夫, 总算是调试出来了。得出的结果是:C++为什么要用0作为数组第一元素的索引呢?真是笨透了,简直是让人不可接受。原来3个小时的努力,却发现只是有一段代码off by one。所以接着我就比较恨那本书--- Introduction to Algorithms, 那些笨蛋作者为什么要用1开头的数组!那个时候我不知道写这本书的人,和创作C的人都得到了Turning Award。 否则, 我会向上帝忏悔我所说的傻话。
选择了编程这条路,所以很懂得只能接受变化。因为世界主宰着我,而我还没有强大的足以改变整个世界。以后的日子里,我十分懂得小心的不再出现以前的错误,总结经验教训,并改进了Debug方法。一个普通人的脑子里产生不了很高级的调试工具,我所使用的方法是printf夹杀,后来又变成用std::cout夹。这个方法在我看来十分的受用,也一直用了很长时间。特别在我学了牛顿二分法之后我简直觉得自己是个天才,居然用了这么长时间伟人的思想,一直怀疑自己脑子里是否存在牛顿的一点基因 虽然过去很久,我还是推荐你在没有任何好用工具的情况下使用这种夹杀法,至少O(lgn)比O(n)要好的多了。
到了现在,写代码的时间却少的可怜了。为了弥补自己大量的好奇心,我开始阅读大量的书籍。什么设计的模式拉,重构啊,永恒的道啊,高手的言啊,还有好多厚的如同枕头可以拿去杀人的书。受益良多,我向大师致敬,五体投地。最后发现理论才是精髓,编写代码如同用人去耕田一样的浪费劳动。狂攻数月,学会了一套能让别人觉得你很厉害的招数,还有多的象毛一样的专业术语。忽然有一天,我又重新回到了一堆代码当中,我发现周围的一切都那么的亲切,比以前的感觉更加美妙。我百思不得其解,难道不编程反而能让自己进步的更快?后来有人问我怎么才能让自己上一个台阶,我以高手自居大言不惭的告诉他:你别怕,编程就如同华山派内功,只要不动七情六欲,功力也会自然增长。
别笑,我真是这么说的,我也真是这么想的。后来他又来问我,如果不编程还能提高, 那老百姓不都慢慢变成高手了? 我一想也对呀,这个怎么我就没有想到呢? 苦思后得到结果,理论很有用。 理论在很多方面起了确定性作用。再一想, 发现理论是从实践中来的, 理论是用到实践中去的。想通了之后, 我好好温习了一下C++语法, 又开始写一些希奇古怪的东西。
一本砖头里讲,class, routine, program, 在程序的每一个角落,都存在有变与不变的东西。而编程, 总体说来,是变变的东西,不变不变的东西。人作为Programming的主要建设者与参与者,应该明白自己所编写的程序是如何进行处理,哪些该变,哪些不该变,变的时机是什么, 是什么引起了变化。所以如果你所编写的程序意图是明显的,过程是明确的,你应该能在这些变与不变中做出正确的判断。如果在这些东西中留下轨迹,而它们在某些不该变的地方如果发生了变化,或者在该变化的地方发生非预期的变化,亦或它没有变化,你可以从这些轨迹中得到线索,总而知道这些混蛋代码到底跑到哪里去吃麻辣烫了。如果语言中能有这种路标型构造就好了… 想到这里,我脑子里呈现出6个字母: assert。狂笑之余我还翻了翻小林同志的那本书。然后我开始大量使用这个东西,这个受人唾弃的构造---宏assert。
出乎意料的是,我之后写程序很少对自己阿门了。 于是我觉得我进步了,虽然没有自己发明任何东西,只是学会了调用一个(或者是使用一个)很象函数的macro, 我依然认为,我一定敢去行政楼溜达溜达了。也许很多东西看起来是相同的多,可是对于不同的人来说,却有非常不同的意义。
C++在Java, .NET的疯狂侵略下似乎显得十分的无助。连号称中国最大程序员论坛的C++版里,除了那一群泪流满面的大学生热火朝天的要作业,还有那来自于C#, Java教徒们的强烈恐吓,这个号称人气最高的版,静的如同考试作弊。一个叫嚣的环境吓跑了我这个无助的人,我回到窝里好好考虑,最后绝对一口通吃,管你什么语言,我都要学,管你什么软件,我都要做。换上最坚固的战袍冲上战场,最后却被这几个大腕弄的我体无完肤。 痛定思痛,痛何如哉! 学了这么多,最后的体会是,语言都是败类,语言所能做的事情才是根本。我开始了解P = A + D, 开始明白为什么连设计的模式这样难读又难懂的书居然也能获大奖。有些东西变了,可有些东西永远都不会变。变与不变,只有在自己的掌控中,才是真正的不变。
大师们都用Java了, 我看重构时叹了口气。大师用的东西你用的起吗?庖丁的那把牛刀,估计给你你也杀不了牛。我就杀不了,所以我感受了一些大师的感觉之后就把那把刀放下了。我是个普通人,还是老实点好,所以一直用我的小刀,吃我最爱的苹果。如果哪天我的小刀不能满足要求了,我再看看是不是换一把刀吧。大刀小刀都是刀,可是刀法相同, 刀法不同。如果你两把都能用,那就用你喜欢那把。如果只能用一把,你应该学习使用另一把,继续精练你那把。因为,迟早有一天,你会骑上一头疯牛。我希望你还能看见那天的太阳。
有本薄的不象书的小本本,好象叫什么TDD来着的。据说也得了奖,所以石头拿来看看。似乎简单的不得了。我看不出和我以前所做的一切有什么不同。虽然自动的测试很先进,可是手动的测试很简单。如果只是拘泥于形式,你就无法体会到庖丁的刀和你的刀有什么不同。
一段长长回忆之后,我回到了现在。看书太多,以至于说东西总是不着边际了。我本想说Matrix来着,我那个Matrix… 对了。我那个Matrix是C++写的,有一个友元MatrixTester, 300行代码。我的MatrixTester也有300行代码,用了大概有30多个assert。值得一提的是,里面还有4个inline函数和一个模板构造函数。
我要说的是,这是一个类,我自己使用的类,不是面向对象设计,没有设计模式。这个类让我舒服,我喜欢这感觉。写这篇文章前,我做了什么?
我添加了4个assert,然后改变了3个函数,又添加了2个函数。重新编译了所有代码,结果有3个assert出错,我改正了它们。发现有一个问题很严重。assert帮了我一个忙。然后我觉得函数不够,我求解依然要写一些重复的代码来调换行与列,取得一些内部状态等。于是我有加了2个assert,然后小心的编写了2个inline函数。结果全pass, 我心情很好。我发现代码有些地方很难看懂。于是我又用几个函数封装了一些重复的代码,然后把那些代码替换成了函数。这次有6个assert出错。没关系,我忽然胆子很大的接受了自己的错误,再次pass。我觉得不会再有错了。有一个新的应用,需要对Matrix进行特殊操作,我觉得如果不做为成员函数真是可惜,所以我又添加了这些函数并添加了测试。编译成功,如我所想。这种工作让我觉得惬意,我很快发现自己对这个类十分放心,并从不担心错误是从Matrix中产生。我开始大量应用Matrix进行工作,结果发现有一个困难来源于书本,书本中的Matrix是1为基数的,而我所分配的Matrix以0为基数,这让很多算法不能直接的转化为我的代码,我需要花大量的时间考虑循环的次数问题,以及0与1之间的转换问题。我需要新的改变,我需要改变Base。我再次修改,加入了成员和函数,并使Matrix变成默认基数为1,而且这次改变需要保证以前的代码不会发生任何问题。我有些担心了。很轻松的实现了两个函数与测试,放下两个路标。编译,8个assert出现错误,没问题,我改。3分钟后,一切完成了。我觉得莫名的舒服。
我开始意识到,编程的乐趣来源于一种把握而不是没有根据的创造。不知不觉间,我不再对代码产生恐惧,不再惧怕那些让我心跳的虫。 这种感觉,让我想告诉你,让我写下这串东西。我想我好象做了一些东西,是重构吗?我不知道,我想的话这是种感觉,是进步的感觉。可能我又掌握了一个assert,可是这次好象用的还是以前那个assert呀…
奶酪说,变才是真正的不变。那到底是变还是不变呢?如果你不变,说明你不懂;如果你变了,说明你很笨。
                             
二〇〇三年十一月十六日
                              呆瓜石头作







--------------------------------------------------------------------------------


...全文
145 53 打赏 收藏 转发到动态 举报
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
laomai 2003-12-31
  • 打赏
  • 举报
回复
mark
flyelf 2003-12-31
  • 打赏
  • 举报
回复
up
antijpn 2003-12-30
  • 打赏
  • 举报
回复
楼主的名字是不是来源于Final Fantasy VII?
wildcat1984 2003-12-30
  • 打赏
  • 举报
回复
up
languagec 2003-12-30
  • 打赏
  • 举报
回复
ding
qfknet 2003-12-30
  • 打赏
  • 举报
回复
up
ChinaRitchie 2003-12-30
  • 打赏
  • 举报
回复
学习中...
liquanle 2003-12-30
  • 打赏
  • 举报
回复
我喜欢这种感觉。
ppgg1979 2003-12-30
  • 打赏
  • 举报
回复
good
littlebire 2003-12-30
  • 打赏
  • 举报
回复
mark
101monster 2003-12-22
  • 打赏
  • 举报
回复
收藏!顶!
101monster 2003-12-22
  • 打赏
  • 举报
回复
呵呵,但愿多一些人看到这篇文章,能少走点弯路。有时候,流行真的是一种惹不得的东西。
zhaochong12 2003-12-09
  • 打赏
  • 举报
回复
谢谢~
zhouqingyuan 2003-12-09
  • 打赏
  • 举报
回复
服了
daily1980 2003-12-09
  • 打赏
  • 举报
回复
学习ing
skywarship 2003-12-09
  • 打赏
  • 举报
回复
同感
Alaex 2003-12-09
  • 打赏
  • 举报
回复
我不知道你做了什么,
不明白是你想说什么,
只是觉得好象和你有一样的想法.
csdn5211 2003-12-09
  • 打赏
  • 举报
回复
有意思
101monster 2003-12-08
  • 打赏
  • 举报
回复
呵呵,真有意思!
wbh0360 2003-12-08
  • 打赏
  • 举报
回复
写的很好
加载更多回复(33)

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧