编程已经成为了我生命中的一部分
我很享受编程或者阅读别人代码过程中带来的快乐。很多人可能会认为“学”编程学到某个阶段就可以毫不费力得阅读所有的代码。但是事实是要真的读懂,尤其是读懂一个大型项目的代码,依然要付出一定的努力。
编程是一段需要不断磨练的不归路
每学一个新的技能,我们都像是蹒跚学步的孩子。最开始的我们总是笨拙的,不过当我们看到一个专家时只看到的是他成功的样子,却忘记了最初他可能和我们一样的笨拙。
今天就来回顾一下我编程道路上蹒跚学步的样子,或许对你有一点启发。
无知的大学
在这里讲大学时候的糗事,不知道会不会被宿舍的哥们暴打。我保证,这绝对是真实的故事。
当年我们进大学的时候,电脑还是个稀罕的奢侈品
当时我啥都不懂,跟着宿舍哥们跑到了中关村攒了人生中第一台电脑。攒机的小哥溜得不要不要的,分分钟就把电脑系统装好。那人尽皆知的草原界面头一次出现在我的眼前。就这么屁颠屁颠抱着电脑回到了宿舍。没错,是抱,还是两个人抱。一个人抱机箱,一个人抱显示器,当时的电脑就是这么大。
买的时候是说为了学习,可是买回来后最大的功效是游戏。此处省略三万八千字。
还是回到编程的话题上来。
你很难想象当时我们作为北邮的学生,编出的第一个程序尽然是这样的。
这件事我记得特别清楚,因为这时我们宿舍老二在我机器上打出的第一个程序。然后还特意让我们老大亲自运行了一把他的大作。
PS:老二现在在北交是(副?)教授
迷茫的工作
毕业之后就走上了编程的道路,正式成为了一名程序员。
虽然我很幸运,毕业就去了一家传说中非常牛逼的企业,但是这家公司的几年时间中我并没有获得一些实质性的成长。
当时我们的项目主要做的是集成性的工作,也就是底层核心的代码由设备商提供,我们需要做的就是调用各种不同的接口,来完成各种逻辑,最后实现用户的需求。
所以在这个过程中,最重要的就是查看各种手册,确认是否能够实现需求,并且验证功能。虽然这也是一个技术活,但是我却觉得不好玩。因为我们根本看不到底层的逻辑是如何实现的,这样对自己的技术能力的成长并没有太大的好处。一旦别人的底层逻辑变化了,接口变化了,我们也要跟着变。
也正是基于这样的原因,我尝试选择新的方向。
执着的开源
进入开源世界是巧合也不是巧合。
早在学校的时候就听说过开源,如果没有记错当年还在学校里见过Richard Stallman来做过讲座。当时觉得一个老大爷,拿着个光盘放头顶还挺神神叨叨的。后来才知道他是开源界的精神领袖。
自己一直都对开源软件有着特别的向往,觉得一群牛人在一起尽然能整出这么大的一个动静,如果有机会自己也一定要参与一下。
很幸运,当年IBM时隔好些年之后又在中国成立开源团队,我就这么走上了开源软件的贼船。
PS:当我离开后不久,这个团队尽然解散了,不禁唏嘘。
故事扯远了,还是说道我编程的经历。在IBM这段日子,是我编程能力大幅提高的时光。当然我要感谢公司,感谢团队,感谢老板能让我参与这样有意义的项目。
在这个过程中,我总结出对一个编程人员成长最为有意义的事情是
独立分析
刚进入开源世界,我确实有点不适应。因为开源世界的特点就是没有文档。之前的工作基本都是分工明确的,我们按照手册和接口说明调用即可。但是在开源软件中,出了代码只有代码。想找个人问,还不一定有人能回答。大神们都在网络上,就算是不排斥你的问题,也得有时间理你。
没办法,只好硬着头皮往下啃。啃一天没结果,就啃两天。两天不行就三天。刚开始的时候确实很懵,就跟老师说的一样。没有过做成的经验,就不知道究竟能不能成。我想很多学了一点编程,开始会写一点代码的,在看到大型项目的时候多少会有点木。因为项目太大,不知道从哪里开始入手。
一开始我也是这样的。有的文件动辄上千行,连头都找不到。后来我慢慢形成了自己的一套方法。今天就先讲一个。这个办法其实也很土,就是拆分。看到庞大的函数,根本分不清这个函数什么功能的时候,我就把函数中被调用的函数列出,先去理解被调用的函数。如果被调用的函数还是不懂,就再进一层去看。这样就形成了一个递归。总会遇到最基本的,能够理解的函数或者定义,然后再反推。这个方法确实土,不过对我来说很管用。在这个过程中,我对代码,对整个项目的理解变得更加深入。
就这么类似于王强一日十字的速度,把整个模块啃了下来。最后啃完后那畅快淋漓,豁然开朗,并不亚于看一本优美小说。
这里我再补充一点,大家很可能会觉得在这段日子中每天都是痛苦的。确实,在没有理清所有细节时心里总会有牵挂。但是我想用陶渊明的一句话来形容可能更为贴切。
好读书,不求甚解;每有会意,便欣然忘食。
虽然这个过程中都处于似懂非懂的状态,但每天都会多懂那么一点点。这种感觉陶渊明先生形容的非常生动。
从此以后我就好像进入了另一个境界。
不知道是我穿透了代码,还是代码穿透了我
回头来看
大致这么回顾,我的编程经历基本上经历了这么三个阶段
- 几乎是一无所知
- 一定的使用能力
- 无师的自学能力
可以看到,大家可能和我一样,在初期对编程是一无所知的。能写出的代码就像那个“傻”一样的醒目。在这里,需要的最少必要知识是一定的语法和简单的运行操作。
而经过一定的学习,掌握了基本的技能,我们就可以胜任日常的工作了。就像文中说的,这里的最少必要知识是对接口文档的理解和运用。
然而要再往下继续走一层则需要付出更多时间和耐心。在这里就是不断的实践、总结、再实践。
记得一位钢琴老师曾经说过,钢琴其实没有大家想象这么难,钢琴的入门相对于其它的乐器可能要更简单一些。但是真的要练好刚琴,要展现钢琴自身的魅力则需要花费更多的时间和耐心。
这点和学习编程我觉得是一模一样的。要成为大师不容易,要弹一首简单的生日快乐并没有想象的那么难。