我的编程进化史

其实这篇博的题目原本是“我的C语言观”,这题目真扯淡,我是无论如何也不会想出要主动写这样的题目的,但是,因为表妹的狗P老师要求他们写这样的题目作为考试,虽然我不会帮她写作业,但是突然也想试试,对于一个这样大的题目,我都能写出什么来?所以,就试着写一下吧。

闭门造车

现在想起来,开始接触C语言已经是很久很久之前的事情了,嗯,大概是95年吧,那时候突然对计算机兴起了很大的兴趣,但是与别人不同的是,我是对计算机本身以及里面的程序感兴趣,而对于电脑游戏我有种出于本能的反感,所以在基本上学习电脑学习编程的前十年,我没接触过电脑游戏,而且偶尔的几次陪同学一起去玩游戏,也完全没感觉到好玩。

再说回学习编程语言的过程吧,最早接触编程语言我记得是在同学的学习机上,那上面提供了一种Basic语言,好像是QBasic吧,对这门语言的记忆只剩下需要在每行的前面标记行号,这是一件很不人道的事情,直到后来接触到C语言。

刚开始接触到C语言时,对于函数的定义之类的有些费解,不过好像用了不久的时间就适应了,并且很乐于使用函数,然后慢慢了解到变量范围,学会使用不同的作用范围的变量。对了,还有,go关键字,刚开始时还觉得这用起来很方便,但是时间久了发现,这并没有想象的那么容易使用,而且在程序中跳来跳去让逻辑变得很乱。

由于C语言是我真正学习的第一门编程语言,在初期,我并不知道需要把不同的函数按照功能分放在不同的文件里,这导致了刚开始写的一些小程序只有一个文件,当时觉得头文件没有必要使用,更不用说extern关键字了,我甚至以为我发现了C语言设计的一些问题。

当时因为用的操作系统是MS-DOS,使用的开发工具叫做Turbo C,虽然感觉用起来不方便,但是这总算是全屏幕编辑器,可以自由的在文件内移动光标,总比行编辑器要好。当时是不知道有Linux这种操作系统,更不知道在Linux下有编辑器之神Vi,也不知道有神的编辑器Emacs。

随着不断的学习,写的代码似乎也越来越长,这时就觉得在一个文件里写代码太麻烦了,打开文件慢,寻找相应的代码也很麻烦,这时我试着把代码按功能分置在不同的文件中。此时,我终于可以在代码中包含我自己的头文件,这突然让我感觉到一种莫名的成就感,当时甚至在考虑,我是不是有必要把自己写的代码提供给别人使用了,这样会不会让我更有成就感。

在这个过程中,我终于体会到了extern的用处,也算是学到正确的全局变量的使用方法。虽然我知道适当的质疑是有利于学习的,但是关于extern关键字的这件事让我明白,在学习初期,没有了解到一定程度时还是不要有质疑的好,因为在全面了解这门语言之前,我并不知道相应的设计到底有什么用处。

我认为这是我学习C语言的初级阶段,在这个阶段只能算是在单纯的学习,虽然学到不少东西,但是因为没有实践的机会,虽然有些想法想写些程序出来,但是一直觉得真正写出自己想要的东西太难,不敢开始,这个毛病直到现在都还有,只不过症状稍轻一些。

初级阶段的学习基本上只持续到98年,当时我读高二,偶然的机会进入当地ISP网站做兼职,当时是让我帮忙制作网上书城的程序,那是个读书程序,就是从数据库中取数据显示在页面上,记录用户的阅读进度等功能,这个程序使用的语言是Perl,在这之前我从来都不知道这种语言,不过看起来很像C语言,而且因为我是学生,当时的老大给了我学习的时间。

在这里的兼职持续了一年多,在这段时间内我基本上没再碰过C语言,不过由于Perl属于C系的语言,这让我后来再回到C语言时并没有感觉到陌生。在兼职期间的老大教了我很多东西,让我知道程序应该是怎样写,怎样划分模块,怎样降低程序的耦合。更值得庆幸的是,在这里我接触到了Unix和Linux,知道了Vi,这为我后来对C语言的学习提供了极大的便利。

工作中学习

进入大学的第一年,书本上、老师讲的内容全是我早就熟知的,这让我感觉很困惑,我想学习新的东西,可是课堂我接触不到,而且当时没有自己的电脑,学校的机房又不能随时进去。在困惑了一年后,我最终决定退学离开学校。

离开学校后我没有离开北京,而是在学校附近租了一间简单的小房子,买了一台电脑,当时电脑里装的是Win98。因为在兼职时已经习惯了Linux、习惯了Vi,我决定在我的电脑上安装Linux,由于担心把电脑搞到不能用,我选择了装双系统,这让我在装系统上浪费了很多时间,记得当时装的是RedHat7.3吧,安装好系统后发现中文显示、中文输入都不方便,然后又在网上各种搜索,在网上看到很多别人配置的很漂亮的Linux桌面,于是我又花很多时间在美化上,等我发现这样的做法很不对时已经过去了差不多半年的时间,就果断停止了这种浪费时间的事。

等我真正在Linux系统中开发C程序时我才发现,原来在Linux系统中学习C开发是多么的方便,写Perl的经历便我很熟悉文本处理,所以,重新回到C语言后我选择写的第一个程序是一个日志处理程序,我以为这个程序会很容易写出来,开始动手后我才发现,在文本处理方面C要比Perl弱了太多,当时我并不知道可以在网上找到很多公开的库来处理文本。

在这个程序的编写过程中,我遇到了可能是C语言最容易让人迷糊的知识点,那就是指针,因为并没有老师教我,所有的学习都是从书上查,那时候我不知道有Google的存在,而且那时的Google似乎也没有现在那么强大,我基本上都是从网易或雅虎寻找C语言相关的网站,然后再去这些网站去看一些零碎的C语言知识。

费了很多的时间,这个程序终于算是完成了,但是效率非常低,因为在匹配字符串的时候,我的做法全是完全匹配,每查找处理一行,都要回去查询相匹配的日期的统计数字,这就使程序的运行时间随着处理文件的增大而呈指数级的增加,这时在网上大牛们建议我学算法、数据结构,此时我又意识到自己的幼稚,因为我在学校的课程里就有一门叫做数据结构的课,可是我竟然觉得那没有用。

在我准备开始学习数据结构时又出现了问题,因为没有再读书,我羞于再跟家里要生活费了,我需要想办法养活自己然后才能接着学习,我决定出去找工作。

在出去找工作的过程中,我发现很多公司在招Java和PHP程序员,我更想去做C程序员,可是我发现社招C程序员的要求都很高,我还达不到要求,我想学习Java或PHP用于谋生,在比较过后,我发现Java的门槛有些高,我最终是决定学习PHP,花了并不太长的时间学会PHP,然后找到一份在现在看来很差的PHP工作,虽然收入不高,但是在当时想来,我满意,至少我可以养活自己了,那也是我真正独立的开始。

解决生计问题后,除了工作,我的业余时间全部都用来学习数据结构和C语言,在这段时间,似乎对C语言和算法的学习并没有得到应有的回报,但是,人总是会本能的珍惜自己的第一个,也许正是出于对C语言的感情,我并没有放弃学习。在这里工作期间,我把所有学习到的算法数据结构知识应用到日志处理程序中,总算是优化到效率基本高于同样的Perl程序。

时间到了2003年,当时在网上认识的一个朋友要开公司,他让我去浙江帮他忙,当时我没有犹豫就答应了,现在回想起来都觉得那时真的很单纯,如果放在现在我可能基本上不会同意去一个陌生的地方去帮一个当时还算陌生的人。

值得庆幸的是,我这个选择应该是正确的,因为那一次跳槽,我的C语言总算是真正的开始派上用场,朋友的公司是个小公司,当时准备做空间服务,而这之前他并没有任何的知识储备,于是我们一起设计业务流程,然后我加班搞定程序开发,刚开始的做法是用PHP接受前端的申请,保存到数据库,然后用C语言写的程序在后端处理这些请求,进行WEB和FTP的开通,但是这样的效率很低,空间的开通不够实时,而且,后面还会遇到用户修改空间大小的问题,而且因为服务运行在Windows上,FTP和WEB使用的帐号信息是分开的,这在同步时常遇到错误 ,而且IIS运行PHP也容易出现问题,更严重的问题是权限不易控制,于是,我们决定转移服务到Linux上。

因为涉及到数据迁移问题,而当时已经有不少付费用户运行在服务器上,我们不能让服务中断,这在当时我感觉非常棘手。最后想到的解决方案,先把用户信息独立出来,用户注册后的信息直接放入用户中心,不管新服务还是旧服务,获取用户信息都要通过用户中心。

这个需求又让我发现了需要学习的新知识,Socket编程,在完成用户中心后,我一直没停止对Socket方面知识的学习,任何一个方面的知识想要真正了解,深入下去就会发现,光这一方面就足够花费很长的时间了。

用户信息解决了之后,就要开始写WEB和FTP管理相关的程序,当时采用的方式是,用户注册的过程中就已经根据各个服务器的压力而分配到一台合适的服务器上,同时用户中心会把用户信息推送到相应服务器。因为注册过程是同步的,注册过程一返回,用户就可以直接根据网页中的信息登录服务器进行管理了,这在当时好像已经算是相对较高的水平了。在这个程序的编写过程中,我学会了编写Daemon进程,学会了select,学会了Apache模块的编写,扩展了vsftpd的功能,直到此时我才真正接触到了开源软件,意识到这是个学习的宝库。

自从意识到开源软件的存在后,我就养成了收集开源软件的癖好,但是真正认识读过的代码并不算太多。但是,不可否认的是,每个认真读过的开源软件都让我学到了很多,比如在Mysql学习到各种C语言的技巧的同时也学到了一些数据结构设计技巧和算法,比如在nginx中学到了epoll及kqueue,kevent等。

由实践中来到实践中去,在工作中应用C语言使我的进步非常快,而在编码能力进步的同时也更提高了工作的效率。我想,最好的学习方法就应该是这样,从使用中总结,再把得到的结论经验尽可能的应用到编码中,这在巩固的同时也更便于发现问题。

在合适的时候使用C语言

在深入掌握一门语言的同时,也应该更多的接触其它的语言,只有这样才发现各种语言的优势、缺点,比如,在Perl和C的比较中,很明显Perl更适用于文本处理中,在处理文本内容时用Perl的话,开发效率要远远高于C,而在开发常驻系统的程序时,使用C要方便于Perl。

任何一种语言都是如此,都有其适用的方面,不应该局限于某一种语言,在合适的地方使用合适的语言这可以使自己生活的更轻松。

结束

进入这一行就是一条不归路,这是一个需要终生学习的行业,如果不关于学习,那就趁早改行,早点死心,省得浪费时间害人害己,划不来。