如今,接触CS几近八年,不学无术,所精之物鲜也,以至一事无成。
现回忆吾程序之生涯,以整理繁杂之心绪。
02年始大学,DOS机学Pascal,一去不返矣,直到07年在做一Pascal软件的反汇编时才再对Pascal有点回忆。是时,Pascal与计算机导论并开,终于导论没导好,而Pascal也尚未触及指针话题就匆匆而终也,但明白了程序设计最基本的语句结构、条件判断结构及循环控制结构,以此为根,方可后进,也不错了。
03年来了个跳跃,未学C而直接开设C++课程。一天,任课教师有事,其夫代之,仅一言令吾有所体悟:你们这样C语言学不好,C++也学不好。诚然!课程快结束时,面向对象部分匆匆了事,好在当时知道了类的样子,知道有OOP这么个东西。最大的欣慰是认真学了C++的C语言部分,初步理解了指针这个东西。学习效果显然不好,加上自己很懒惰,这对我随后几年的影响颇大,譬如对C语言的printf给予100%的憎恶,人家问我会什么语言时,我只能说什么都不会,勉强说我会C++中的C语言!
03年底,开设数据结构。现在回想,可叹,自己为何总是差一拍呢?学数据结构时没有体会到数据结构的精髓,反而是在利用课程练习提高编程能力,练习类如何用,当然当时还是不懂OOP的,只是为了用类而为之,但仍有程序设计的自我满足感,因为能把自己想的用程序表达出来,特别是调试解决问题的过程很刺激。
同时,那一年伴随着一个挺热门的东西,就是有同学自已学习VC(平常上课是不会教这东西的),学习做界面,牛的一塌糊涂,就跟风,其实就是买本教材照着点击鼠标罢了,在不懂面向对象的时候学习这个,回想起来真是可笑!
随后还有一些课程,能够练习到编程,譬如数值分析、操作系统、数据库、计算机图形学等等,或多或少,总是有些提高,但并没有本质性的改变。
后来学习汇编,也没多大感觉,加上自己没认真学组成原理、微机原理等课,认定自己不适合搞硬件,其实这缘于自己的颓废。
04年下半年开始随后的两年是这辈子最不齿提起的阶段。同寝者共事网游,与吸毒无二,越陷越深,终不可拔。于其中也,迷之又迷;而于其外,则痛苦不堪,愧对师亲,自责良心,毒瘾侵之,难忍而入网吧者再。学习成绩骤降,一等奖学金至二等,再三等,再到无,乃至逢试只望及格。也就是在那个时代,学会了如何应付考试,我们知道及格是不能违背的下限,故每临考试,皆群起合作之,依重点作分工,各自发愤,互讲所学,一起过关,未曾挂课,此乃唯一无憾之事。但最大的痛恨,乃专业之废!那会儿简直傻的可爱!一舍友,到了大四,让他用C++写程序时,上来就begin,end,大哥,感情现在咱还停留在大一Pascal的阶段呀!
一晃,到了大四,要考虑人生怎么走了,大学如此颓废,专业能力底子差,害怕面对找工作,遂考研,也就在这个时候停止了网游,否则此生废矣!研考上了,凭的还是大学开始时的基础,但这确实是我的一个转折性的新起点。
大四下学期,也就是06年上半年,做毕业设计,头疼了吧!还好,自己命好,能遇贵人,两人一起用VC做一软件,全靠人家了,也亏得人家帮助,自己才又能回到程序设计的路上来了,但对C++、MFC、面向对象这三者还只是了解,甚至三者的关系都不能理解清楚。想想当时很好笑,用了STL的vector,然后在论文中就描述使用了一种数据结构的新技术,哈哈!然后买了本《深入牵出MFC》,浅尝辄止,虽然现在想看但没多少时间了。
06年下半年开始上研究生,亦相当于重新做人,老师要我参与的是硬件的项目,兴趣不大,又因课业繁重,后退出项目忙考试,这半年从程序设计角度进步不大。
07年上半年是个转折,那会课少了,自己业余时随手从同学那拿《absolute c++》来看,系统学习了一遍C++。这时,才对面向对象有了点认识,有了点体悟,然后就结合着MFC想为什么框架是那个样子。那个学期开设有专门的面向对象课程,跟着去听了,拿来印证自己的所思所想所学,进步很快。那一年,腾讯为了扩大自己的影响力,就在各个高校开设腾讯创新俱乐部,参加之,正好是锻炼编程的机会,于是基本上自己主导做了一个软件,并提交了作品。那个学期锻炼机会还真挺多,算法设计与分析课程要做大作业,面向对象课程要做大作业。进步很快,以至于多数人都认为较难的面向对象大作业,我在两天时间内就结束了,包括设计和编程。
那个时候真的是重新拾起了自信心,而且自己在周围同学中有优越感,也感谢导师对我的鼓励,这才使我以后能继续提升。
然后研二的一年,自己的提升又是一个很大的转折点。
07年下半年,分了课题方向,主要是看论文,痛苦的坚持,直至08年上半年,自认为研究生没白上,因为认真做研究了,知道了如何做研究。本文主线是程序员之路,故做研究之事,略过不谈,其实大多数学生也并不关心如何做研究。
在这个阶段中,最有意义的是,软件和程序设计的思想意识提升了。
首先缘于本科隔壁宿舍一小伙,特别是研究生时候,其技术很强势,深知编程水平远不及他,与他交流总能有些体会。受其最大的影响就是去买一些相关技术方面最牛的书籍,知道了学习不要靠学校那些教材,学就学最牛的专家的书,特别是国外的经典书籍,然后就养成了定期逛书店的习惯。
从《编程高手箴言》中知道了软件不等于程序,也知道了程序员原来那么神圣,本书对欲加入程序员大军的人极具煽动性,最起码对我是这样子。我此刻知道,国内程序员基本是第二等的,于是定位自己成为第三到四等的程序员,而最高等级的程序员,除了高德纳能胜任,世间还有几人欤?
随后,无意中发现《计算机系统概论》一书,欣喜若狂,可能是我基础太差了吧,所以跟找到了宝一样。加之前边的认识,我从中知道了学习计算机原来是应该这样子学的呀:自底向上,bottoms-up!!至此刻,我才意识到学计算机是需要不断提升自己的意识层次的,知道对底层不了解,用高级语言写出来的代码是莫名其妙的!
之后,受隔壁宿舍小伙的推荐,看《深入理解计算机系统》一书,其实也是自底向上的理论,但内容含金量简直是神级!
自己又在闲逛时,发现并买下了《代码大全》,我对其评价是学软件者可师承于此书!简直是理念风暴,处处有感悟,处处有所得,爱不释手。正如一本好的武功秘籍,绝对不仅仅是教招式,而最重要的是传授心法。例如,从中体会什么是抽象,再次品味面向对象的特性,特别是数据封装,再比如对变量命名以及高效注释的讨论高度绝非一般编程规范(比如林锐的那个)所能比,以及后文我提到的对程序性能优化的策略性指导,等等。
总之,直到现在,我也这样认为,做为一个程序员,把软件做好要看《代码大全》,把代码写好写懂还要看《深入理解计算机系统》。
就这样,思想意识提高了不少,其实这比编程语言本身进步要强的多,因为内心底气足了,有了方法论了,有了战略性指导了,到时用到什么知识学什么就行了。而且,在实践中逐渐培养自己一些优秀的编码习惯非常重要,比如成对编码(即new完就想着何时delete,并先写好),保持程序的完整性,保持程序的可调试性等等。或许正是这些习惯的培养,使我自己写代码时基本不用调试器,因为系统一直是完好的,加些代码就编译测试,出了问题稍一分析,肯定容易定位的(直到后来,工作时,要维护别人事先的代码,出了问题解bug,这时调试器就不得不拉上战场)。我想,这些是我与当时周围同学最大的差异性,并坚信自己日后能成为一名真正的优秀的程序员。
换句话讲,代码需要优化。
其实也不尽然,严格来讲,就是有高性能要求的程序,其代码才需要认真优化,而一般的应用层程序并无性能方面的特别要求。
08年初,我开始做研究生毕业的课题,通俗讲是做一个正则表达式引擎,但并非易事,因DFA处理字符的速度快,所以要将大数量的规则转化成DFA,问题是要将DFA的存储空间降下来。理论方法倒还顺利,新算法也想出来了。于是乎信心十足的去编程实现之,做为学生,自认为拥有着较好的编程意识及思维,再加上疯狂运用STL,程序很快就OK了。这时,问题出现了,仅仅一个普通的正则表达式,在转化时就可能耗掉半个小时的时间。这无异于在自己盛气凌人的头上浇冷水,为什么会这样?没错呀,我的代码全都是按照算法写的,而且算法是都经过复杂度分析的,为何会如此之慢?
于是,狠下心来,花了一个暑假的时间,做程序性能优化,参考了许多资料,开始时也是不得章法,胡乱为之。但随即,《代码大全》又不失为我做软件的最佳导师,虽然没有教我如何具体地做程序性能优化,但教给了我战略性的指导步骤,非常关键,也阐释了许多优化的思想,譬如80-20原则等等。按照上边的步骤,首先做需求方法的分析,如果有些需求可以砍掉,那显然会提高运行效率;再次做算法方面的优化,特别是一些细节的实现,这方面我也改进了许多,包括NFA的实现方法都整个推翻了重来,前边这些没有什么参考书而言,主要是去查参考文献再去反复理解;然后是能提高性能的一些编码技巧,比如缓存技术、延迟计算等等,这个在《代码大全》中有论述;再下来是程序设计语言本身的问题,比如C++本身的还有STL本身的,那会儿才知道滥用STL的后果有多惨重,不细述,主要参考《Effective STL》,还有一本IBM的《C++程序性能优化》;最后的优化可以考虑将代码写成什么样子更易于编译器将其编译成高效的汇编代码,我甚至将编译器的优化级别都调高了,真可谓为了提升程序性能而无所不用其极,当时参考的《深入理解计算机系统》,也是从中知道可以去调编译器的优化等级的,《代码大全》中关于这方面也有讨论。其实到了现在回想,应该再看一些内存优化方法的资料,主要是提升外存的应用效率等,windows的内存映射一直还未研究,有空得补上。
这样坚持下来,是一个很好的提高,牵扯的方面从底层汇编直上,一直到需求分析、架构设计、算法和数据结构,当然更包括编码本身。最为关键的,那会拥有的成就感时至今日再未曾有过,即体会了这样的过程:把运行半个小时的程序一点点的改进到只运行十几个毫秒,而中间用一个个表格记录了不断引入新方法、新技巧后所带来的性能提升比。
后来与上文提到的技术牛人小伙讨论性能优化的问题,他直接就说“你编程语言选错了,你当时就应当和我商量的,做正则表达式就应该用perl”。那会确实不知perl为何物,但其实也应该说是从那会,学会了要独立思考,不要盲从与盲信于他人(特别是技术强人)。问题应当一分为二的看,perl是很精通文本处理,以及支持强大的正则表达式功能。但现在的问题是自己要做正则表达式引擎呀,能调用perl么?如果加上大数据量的规则以及被匹配的数据,我敢肯定perl不行,因为其原理是构造NFA进行处理,处理速度跟不上的。perl正则的强大缘于他的“花架子”,这些花架子对于大多数应用级开发就足够了,而且还很实用,但如果写高性能的东东,确实就不实用了。
现在回到主题,算法不等于程序,换句话说,同样的算法给不同的程序员所写出来的代码效率绝对不一样,也因此知道了做一个真正的程序员是不易的,当然一个真正的程序员是绝对比大众程序员优秀的多。
本着做一名优秀程序员和软件架构师的目标,兼顾离家近,公司又给解决户口,于是09年在北京一倍受社会争议的台企工作。
既然写到这里了,就好好回忆一下在公司的若干点滴,以免日后忘却。
时至今日,回想在公司的日子,也并未有多少令我遗憾之处。
刚进公司,皆是新鲜,加上对未来的憧憬,以及对新知识、新技术的敬畏,于是倍加努力,而进步也是神速,包括技术及职业素质等方面,简言之即在正规军中接受训练和洗礼。
下边是我入职两个月后的转正申请(故作缩减以避嫌),实发自肺腑:
“
自今年4月20日入职以来,已近两个月时间,期间感受颇多,收获颇多。
(1).工作环境
从学校走入公司,确实在经历着一个很大的转变,而且公司的主管和同仁也在不停的帮助我完成从学生到职业人的转化。......
对于工作环境,除了良好的硬件设施,我认为最重要的是公司有着和谐的人际氛围,从主管到身边的同仁都给人一种温馨的感觉,......。
无论何时有学习工作上的问题,无论求助于谁都会得到热心的帮助。公司里是用一种鼓励和引导的方式去培养新员工。......
公司的活动比较丰富,能对工作起到很好的调节作用。运动会期间,大家都去积极的准备,......
(2).学习成长
两个月的时间很快就过去了,回想一下,已经学到了非常多的东西。
在职业人的塑造方面。参加了新人活力营培训,感触最深地是团队和分工合作的力量,以及积极主动的重要性,并在培训过程中积极锻炼自己,提高了自己的表达能力以及与人沟通的能力。
在专业技术方面。由于有专门的师傅来指导,并且平日里能够与许多身边的同仁去交流和请教,所以进步很快。而且,公司里有比较好的检验和督促学习的机制,对于学的不到位的地方会及时补上。对比学校而言,公司里还是要紧张一些,但活得很充实,成长速度很快。在工作期间,有时心里也会觉得有些压力,这就伴随着自己心态的调整和对公司环境的适应,以及学着调整工作和休息的关系,我觉得能处理好这些事情是所学到的最宝贵的东西。总之,在公司里与其说是一个工作的过程,不如说是一个学习成长的过程。
(3).职业发展
梁肇新将程序员的成长划分为了六个阶段:第一阶段,主要是能熟练地使用某种语言;第二阶段,能精通基于某种平台的接口以及所对应语言自身的函数库;第三阶段,能深入地了解某个平台系统的底层。这些阶段是要一步一步走下去的,姑且不管后边几个阶段是什么,我觉得当前最重要的是先把自己的位置定准,不浮躁老老实实地先做好第二阶段的程序员。
公司为我提供了这样的职业发展和成长的平台,于此,我非常庆幸。现在公司里的学习方式就是从底层向上学,明白底层的原理后再用上边的接口,而且以后坚持这样来学习,并不断补充新知识,我相信自己在公司的环境里,不久的将来就会做好第二阶段到第三阶段的程序员。契而不舍,金石可镂,现在我唯一能做而且必须去做的就是坚定自己的信念,在程序员这条路上坚定的走下去。
”
回忆至此,对于后边工作不到一年就离职,有些惭愧,是我自己将在公司发展程序员的路给枪毙掉了,但当时原因颇多,现在唯一良心难安的是没有“不浮躁老老实实地先做好第二阶段的程序员”!
其实在公司的成长先是短时间的指数级进步,然后是长时间的线性级进步。我是凡人,所以在线性增长阶段还是浮躁了!
后来体会到,公司的原则很简单:就是按职位的需求,把你培训成盯在那个职位上的人。公司最喜欢的人是吃苦耐劳的人,多聪明不需要,看过一本书,忘记什么名字了,好像是《大道至简》,写软件开发的,上边就说,“是人都可以做程序员,只要你知道夏天热了少穿衣服,冬天冷了添衣服”,很形象。
在此无意说公司坏话,因为这很可能是我这辈子进过的唯一一个公司,可以称为母公司,因为毕竟我除了索取工资和技术,对公司的贡献几乎为零,且公司里的很多同事还很怀念,特别是我从心里敬佩台湾人,他们的技术水平很高,他们的吃苦耐劳能力很强,他们很虚心。
回到正题,现将在公司最大的收获小结于下:
(1). 在公司能使一个程序员正规划,包括做事情、做软件正规划,写代码正规划等等。没有这个,在学校中学到的软件工程就是纸上谈兵,如何写文档都不会,也不要谈学生能形成自己的编程规范。
(2). 学习公司的管理模式,比如如何制定schedule,如何组织会议讨论问题,如何做报告,如何与人协调等等。这些对以后在学校的项目管理有绝对性的指导性。
(3). 与老程序员的交往,回忆跟我有直接关系的两个人。
第一个人是我师傅,严谨严厉,我对其态度的转变过程为:害怕->讨厌->敬佩->朋友。刚入公司,我师傅一副正经的样子,害怕自然正常。然后体会了他的严厉,有时要求很苛刻,比如我去听一个报告,他就事先给报告者打电话,说要报告期间给我提几个问题,意即去听可以,但不能白听,这样能不让人讨厌么。但与此同时,跟我同期入职的小伙,其师傅就感觉起来人不错,平时较松,而且笑脸相迎。随后阶段是做个小功能,以检验学习效果,我师傅对我要求更严,每天检查一次进度,然后每天检查三次进度,早上、中午和晚上都过来,这样从需求分析、详细设计文档、编码以及测试等一路跟下来。但我从那会开始敬佩我师傅,因为他教会了我许多好的习惯,比如写FAQ将学习中问题和收获记录下来,跟我讨论程序中的数据存储等问题,记得当时有一个关于指针的数据结构就改了三次,我们俩当时称之为“一波三折”问题,引导我自己把最佳的方法想出来,还有就是特意会传授我一些他自己的编程思想,也就是在那时我明白了C语言的代码要写成支持多实例的,也就是在那时开始思考如何把面向对象的思维用C语言展现出来。随后在作这段工作的汇报时,我才是最感激我师傅的时候,正是他的严厉和悉心指导,才使我顺利过关;然而,另一小伙,就不太顺利了,被大主管说道“整体下来感觉你写的程序太随便了”,以至于回去重改再作报告。也就是在那个时候,我师傅也开始放下了平时一本正经的面孔,把我交给了事先定好的项目组。然后,我跟我师傅一直是一种朋友关系,平时一起参加登山社,感觉我师傅还有我小师叔就是娘家的人,我是他们带出来的,到时项目组里遇到棘手的问题,还可以把他们拉过来帮忙解决。
第二人是我前面提到的项目组组长,特温和、特有耐心,很老练的程序员,作报告很有条理性,做事情很负责任。他跟我师傅性格完全不一样,从来不会批评人,再大的问题也是温和的讲。我组长是有问必答,不管多简单的问题,亦或是多困难的问题,他都会放下手头的事情,帮提问者解决。当时一堆新人围着他问问题,然后他就独自一人晚上加班把白天的时间补上,而又毫无怨言,这种精神不能不让人敬佩。有了任务,他总是笑呵呵的过来,“行不行?”,若见面有难色,就说“没事,你先做,遇到问题咱们一起解决”,完全没有组长的架子,但更是一种完全值得我学习的人格魅力。
随后就是我离职的事了,很对不起组里的人,其实我不是放弃了程序员这条路,而是放弃了以在公司工作的形式来做程序员这条路,我始终认为程序员的职业是神圣的,现在只是用自认为的一种捷径来延续这条路,即通过读博士来加深内功的修为。
我离职的原因是要去读博士,而读博士的原因就很多。首先是那时在公司的实际情况,不得不让我内心浮躁,因为我是凡人,也不甘于现状,觉得那会在公司的定位很难实现自己预先规划的程序员之路。然后的萌芽是我投在《软件学报》的论文被录用了,很受鼓舞,而在公司同期培训的一小伙更是煽动我去读博士,并给我介绍了许多学术这条路上的事情。有所心动,就与同学、朋友、家人和导师交流此事,在获取了广泛的支持之后,遂决定辞掉工作去攻读博士。当时还有一件事,一本科同学给我打电话,其并不知道我有想读博士的想法,而他却起了这个话头,大肆渲染读博士有多好,并建议我去读,真是这种巧合使我坚定了当时的信心。于是今年(2010年)再回学校读博士。在原导师处读博士的主要原因,一个是信得过原导师,可以认真指导我,可以为我提供潜心研究的环境,另一个是延续原来的专业和方向,可以保证在算法上精进。
其实,我并非故意将现在的我与程序员联系在一起,而是事实上即使计算机科学的博士还是教授都与编码是离不开的,国外大学的计算机教授哪个不是编码高手,哪个不是优秀的程序员?国内学术界的态度本身就不对,认为程序员低他们一等,本文不作过多评述。若按梁肇新所作程序员之分级:当前在现实公司里的绝大多数程序员是第二等;能达到第三等就得看个人造化和努力了,当然也离不开公司给予的机会,否则一辈子就可能是第二等;而第四等者绝对是大公司里的骨干架构师和程序员;而第五等乃至第六等者,没有相当的理论功底一辈子都不可达,高德纳曾言自己是世界上最优秀的程序员之一,也就是这个层次的。
近段时日虽没什么进步,但意识到读好博士并非我原来想的那么简单。国内的高等教育呈现一种严重的延后性状态,也即多数人与其学位并不对称,我单论计算机科学学科。本科生应该学习并理解计算机系统,并打下扎实的程序实践能力;硕士生应该能将问题抽象成计算机算法或相关知识的模型,并给予代码实现以解决实际问题。事实上有多少计算机科班出身的人是合格的?现在看来,拿一般重点大学而言,硕士生中有良好程序设计能力的就很稀少,更别提本科生了,可读硕士的目的并非培养编程,而是学习如何做研究。事先,本想读博士无非就是把问题抽象成算法,或者原来人家就提出了现成的模型,再优化或提出新的方法即可,我天,这实际还停留在硕士的认知水平上,若此,以后怎可有质的提高和突破?即使混个毕业,而且不难,但被宣称建议授予工学博士学位的时候,是不是很羞耻呢?再退一步,如果一个博士还拿着工程实践能力来炫耀,简直太可笑了!合格的博士生,不要自己骗自己,无论如何,至少都得为所研究问题提出一个更好的算法或者数学的模型,甚至要建立一套新的理论体系,这就是第五等程序员,任重道远,但值得去追求!
前一阵,百度要出语音搜索功能了,CSDN上一牛人是这样说的:“个人推测,百度的算法是这样的:基于隐马尔科夫模型(HMM),或者一些其他的时间序列模型,比如CRF等,进行用户输入的声音串进行识别,然后跟已有的音乐库进行对比。这里主要用到了维特比算法。更重要的是如何训练这个HMM?估计会搞海量的音乐进行训练,由于人工标注成本高,因此会用无监督学习,EM和向前向后算法,这样模型就建好了。两个关键点:选择什么作为feature,也就是训练特征,相应的HMM的阶数也会增加;如何组织海量数据训练和识别,提高运算速度?百度应该擅长,分布计算吗,另外EM算法也支持多线程了。疑问:要不要用歌词?或者说是否把歌词作为一个特征;如果要提高精度,是否要采用其他类似模型,前面提到的CRF应该很理想,但是速度慢,不过就看百度的并行运算功夫了。这个没有上千台服务器,是没法做的”。
对其评述,无论好坏,我唯有佩服,若无一定功底,何出此言!而一般程序员又距其甚远!一研究生舍友,弃中兴而去迅雷,乃向前之所为,吾赞之!数同门,谈及专业,面露苦色,不以为荣,无心尽力,妄自菲薄者,吾叹之!
已之算法与数学薄弱至极,愧对师门,怎能不痛下功夫而恶补之?缘于以前的无知,竞说学概率何用之有?而且视数学为负担,乃学位毕业的条件,学完赶紧扔掉,然后抱着编程语言的书去啃,舍本逐末,有几人能见其明?糊涂透顶也!人最重要的还是要踏实,此时潜心向学并未晚矣。苏洵,年二七始发愤为学,归家悉焚以前所作文章,闭关读书五六年,遂通六经百家之说,下笔顷刻千言,乃为唐宋八大家之一。吾亦二七之龄,发愤向学,不读六经而习算法,勿使功利熏心,数载之后学术岂无不成?
我并不赞成执编码之业以糊口故,否则痛苦不可免。
至于成功,不同之人定义不同。钱不可购万物,万物亦非为钱而生,故勿奉钱为上。而后,定一方向,视为寄托,心于其上,毕生为之,终有所成。致若左手程式右手诗,岂非同道?
兹文乃拙人之鄙见,供读者一笑耳,若可拾得一二,甚为安慰;闻道有先后,术业以专攻,真正牛人,为人敬者,不为炫耀,乃为布施,愈盼高见,我当谛听。
CSDN的各位朋友,在下有礼了,感谢阅读此文!
我是CSDN新手,实际上确实也是程序员之中的新手。CSDN高手甚多,小弟初来,若要在CSDN写此类文章,怎么也论不到我。本人只不过闲来写写自己的想法,对先前走过的路总结一下,整理一下思路罢了。所以我不曾想此文会被置于首页,但既然如此,索性请大家对我进行批评指正,亦请CSDN的高手不吝赐教。
此外,说到古文,我确实喜欢,当然也喜欢国学,但正如duguao1415所言,我根底尚浅。现在是为了写而写,依葫芦画瓢,以致成文生硬,错误百出,大家见笑了!再次感谢duguao1415,我业余会下功夫,应该像写代码一样,保持一个严谨的态度,今后不再乱写,先沉淀下去学习。
水滴
http://blog.csdn.net/water_drops
水静,水滴之,荡漾而复静;石固,水滴之,复然则石穿