第一篇:一位小学文化的程序员成长之路
鲁山县,一个河南最贫穷的小县城中一个最穷的家。
78年我从另外的一个无知的世界降临到了这个有知的世界,这一年我母亲43岁,倍着我母亲一起生活。
我长大了,带着迷惘的心走入了学校。
我母亲所在的五金厂,规定女职工50退休,可是我母亲为了把我养长大,给厂里的领导说,在工作两年。厂里的领导同意了。于是又工作了两三年。
中间发些了一些事情,改变了我的生活,我的家,把我的人生走向了死亡。
经济、家和其它原因,93年也许是94年带着迷惘的心和一种无法言语、一种迷迷的伤感告别了学校,回到了我原来的地方。
我的人生为什么不如别人,前面一片迷茫„„
校外的我能有什么知识?有什么能力?面对社会?小学五年,初一读过半年,还有一年的幼儿园,知识就是这些了。
除了在租书店看武侠小说之外,就是泡在游戏厅中,在这些地方我能找到自己的存在,没有迷茫,离开以后一片空虚。
在看古龙的武侠小说中,有些书中会有个代序,代序中经常提到一些很奇怪的书名,像《战争与和平》、《老人与海》、《小妇人》、《简*爱》等。看名子不像是武侠小说,奇奇怪怪的。于是就跃跃欲试的去看这些书,第一次看这些书,好难看懂,放弃过好多次,最后还是把这些书看懂了。原来世界上除于武侠小说,还有文学小说,而且还是世界文学名著。
97年2月,我得到了一个份工作,一个月差不多300-340元钱。这可是救命粮啊,我和母亲也就不用在去吃人家吃剩下的饭菜了。解决了我和母亲吃的问题。
„..97年11月,偶尔遇见一种件改变我命运,也许是更走向死亡。某一天我又来到了游戏厅,和认识的游戏玩伴们一起玩。某位游戏玩们说,那边有一种新的游戏。上面有小坦克,还有大坦克,还会发导弹。经过和几个游戏玩伴们的对话中,才知道听明白那叫电脑游戏。小坦克像绿豆大小,大坦克像黄豆那么大。
电脑游戏,什么是电脑,没有听说过,更新没有见过。我说:“在那儿,走,看看去!”
当我走进来,看到放在白色桌子上的一些电脑后,我突然感觉到一种静,一种空,没有直觉,没意识,一种天下万物都不存在,只有我一个人站在这里。听到同伴叫我,我都没有动,想动,但是动不了。于是他们也就不在叫我,自己找地方看别人玩了。
一会儿我有直觉了,我也找了一个角落。
------这就是电脑吗?
看着小坦克在上面跑来跑去的。
看着他们的右手中那个带绳子的东西,晃来晃去。
看着左手下面的那个大白方块上有很多小白方块。
心中不时的问,这些是什么东西啊。
但是并没有很快的追求这些答案。
我向里面移动,移动,人太多,不好移动,但是还是移动到了里面的桌子榜边,因为桌子上有两本书。一个书面比较花,另外一本不太花。
那本不太花的离我比较近,我担心的把它拿了过来,书面上写着《电脑报》几个大字,翻了几页,字那么小,看不懂。就放下了。几年后我才能确定《电脑报》是干什么用的。
看那本花的书,书面上写着《游戏攻略》,内容图多字少,图中有字,字在图中。
我喜欢上这东西了,我爱上这东西,我特别的感动。
事后,我问同伴们,那里有学电脑的。
同伴说,学电脑,那有什么用。
我再问:咱这儿,有吗?
同伴说:我也不知道。
另外一个同伴听道了说:琴台和文化馆都有。我心中记下了这两个地方。
周末,我看了这两个地方,最后定在文化馆。学习时间是每天的晚上和周末。初级班教:先是练习指法。然后学习五笔、WPS和DOS。学了几天后,越学越爱,但是只有晚上两个小时右左的时间,学不到什么东东,也练不出什么水平来。于是就辞掉工作,全心全意的学电脑。
两个星期后,在南阳农校毕业的两个男生接管了这个电脑培训班。他们可以全天制的教课。一位王老师,一位董老师。
学完了初级班后,我又学了中级班,中级班教FoxBase 和高级DOS。学FoxBase为我以后自学C/C++鉴定了基础。
这两位老师从学校带来了许多他们上学的书,没事的时候就去翻这些书看和他们聊天。知道了什么是编程,编程是干什么用的。也知道了FoxBase语言是无法编译为可执行文件(.exe)。
后来了解到世界上除了FoxBase语言之外,还有C/C++语言。可是老师只有一本C语言书,没有C++,于是就根据这本书自己读起来了,幸好有FoxBase编程基础,学习起来不太难。一遍看不懂,多看几遍就懂了。
把这本只有250页的C语言教程看完后,已经基本上掌握的C,只是上机的时间比较少,这个时候我就想,能有一台自己的电脑该多好啊。
98年8月,去参家计算机一级考试,有机会在计算机书店买了一本《C++语言大全》的书,开始进军C++。但也是我离开培训班的时候。离开培训班就等于是离开了电脑,因为俺是一位穷光蛋。吃的问题就难解决,还想拥有电脑,只能去做梦了。
人生就此要结束了吗?
不,不能就这样结束。
------放弃就是死亡,放弃就是失败。
奋斗
告别电脑培训班后,在家中日夜倍着我那心爱的、挚爱的、生命般的书《C++语言大全》,没有电脑,先把书看懂,以后有机会用电脑时在练习。一个月下来,什么面向对象,多态性,重载,继承的思想都存在脑中。唯一不完美就是装备不全。
98年11月,我听以前在一起学电脑的同学说:“有人要开个电脑公司,他们来培训班招人,老师把你推荐给了他们,你去找老师,那个人留下的有传呼号。”这是个天大的好消息,我特别激动,不是因为有工作有钱赚,而是因为有电脑用了。
找到了传呼号,打了传呼。他来了。我们聊了会儿天,他说,公司明年开业,现在招人。他告诉我公司在那个地方。他就走了,他叫邢五中。
是我的两位老师,告诉我很多软件都是用C语言和C++语言写的,引入到了软件开发的天堂,是邢五中给了我一年的时间锻炼C++,把C++学通,但是另外一个人把我又入了迷雾,也许不是。他说:“学完C++后,在学Borland C++”。
就去学 BorlandC++ 5.0 学那个什么OWL库,又迷迷茫茫的走到了Borland C++ Builder的怀包中。(多年后才知道,VC)..98年12至1999年12月我就在他和其它人开的电脑公司的一个电脑培训班教课。哈哈,学了不足八个月的电脑的我也要当老师了。不过,教初级班和中级班是不成问题的。一个月300元钱。
在这一年里上午,下午,晚上,除了教课时间外,其它的时间(时间比较多)就是我的自己的,还有一台CPU166MH、内存32MB、硬盘2G的工作站,这就是我的最爱。其它都是Novell无盘工作站。
其中1至7月在家里住,7月后我就住在公司了,这样就有更多的时间。
经过一年的时间终于把Borland C++ Builder给拿了下来。虽然不敢说精通,但已经能进行开发了(二年后才知道,软件开发并不是一门语言那么简单,很多东西比语言更重要)。
我今生最难忘的一年时间,和那台电脑。
最难忘,今生不忘记。
很不幸2000年12底离开这家电脑公司,去了另外一个新成立公司,在这里同样是教课,更不幸在这家公司工作了6.7个月后,无可奈何。离工作而去。
在这2000年里,鲁山的电脑业发展起来了,城里出生6、7家网吧,而我就成了网吧玩家中的一员。在三联科技网吧,他的网管人很好,我告诉他们说我在你们这里办个上机,在你们的电脑上安装我的编程软件BorlandC++Builder,他同意了。
就这样第一次开始接处了网络,写了个FTP、Email、Socket试验程序,了解基本的网络编程知识。
很快钱花没有了。
如何在找不到工作,我和母亲就又要去吃剩饭了。
什么时候才能,吃饱啊,睡好啊。
2000年我已经22岁了。
我试一试从曾经在一起学电脑的学员那里借了200元钱,没有想到他没有拒绝。给我母亲留下了50元,可能加起来不足150元吧,这是我家唯一财产了(在一个月后我才知道比这个数还少,不足100元)。
于是我带着另外150元,到了平顶山市,长这么大了,还是第一次去这么远的地方。在去之前我遇见了一位朋友,他说我去那儿,我很自豪说去平顶山,我以为他会说些什么。谁知道„..咳-----!
2000年9月份,在平顶山找到了个程序员的工作,好像平顶山只有这么一家软件开发公司,一个500元钱。生活似乎有了起色。
2002年2月,傻乎乎的一个人跑到了心目中的圣地----中关村,又非常幸运的找到一份工作,他是新成立的一家小公司,正需要人,我的月薪要求又不高才2500元,于是就留下来。
2002年8月份,我老板家的网吧不在营业,我用1600元买了一台从网吧旧的电脑,圆了这3年的梦。电脑配置不好:CPU:赛扬0.733G,内存:126MB、20G硬盘。但是够我学习用了。
战士手中有枪,程序员面前有电脑,十指轻弹百键争鸣。
生命复活,人生开始。
每逢周末,海淀图书城的人群中就有一个是我。这里的书真多啊,比我买的书不知道多出来多少本(„)。在这里开拓了视野,以前就知道软件是用语言写的,就知道C++,还有一个Delphi,其它什么都不知道。
白天在公司用Delphi开发,晚上在家读软件开发相关的书籍,像《数据结构》、《软件工程》、《操作系统》、《数据库原理》等。最重要的是学Win32 sdk。不知道为什么对MFC一直没有好感,但是用MFC库做开发的公司又那么多,这个时候才知道外面招VC和Delphi的人多。而我却用着那个Borland C++ Builder.从2002年2月至2003年8月,一直就在家公司工作,其中想找一家好一些的公司,能学到更多的知识、更高深的编程技术和更广阔前途,并不是全部是为了月薪, 还有就是团队开发,大家可以在一起说说笑笑。但是那些好公司的门槛太高,我这位小学生难等高雅之堂。也不给面试机会,简历都没法写。
我不怕别人要技术、悟性、创意、精神、创新、吃苦、自学能力等,就怕人家向你要学历。
“你是那个大学毕业的?“
我怎么说:“小学生”,“没有上过大学,是自学的”
我说不出口啊。
面对学历我就傻了。
没有学历,只能是硬靠技术和知名度,还有就是个人写成的作品,来证明自己的能力。
学历和技术是人进入公司的第一本钱,而创意、创新、悟性、自学能力等,这是你进入公司后所展现出来的。
第一步都无法实现,后面还能说?
----不能。
对,作品。
只能是作品。
一边工作一边学习时间太少,晚上一两个小时和一个周末。于是在2003年7月份我做出的决定,辞去工作,带着那台唯
一、生命般的电脑回到了老家,把全部时间投入。
在家还能装宽带联网,网上的资源更多,更有益学习,网络上有许多大学的视频教程。像《东华大学、UML面向对象建模技术》、吉林大学的《操作系统》、《数据结构》,清华大学等优秀课程。
不上大学,并不能证明咱不可以读大学的书。
在这段时间学习中,自己试着设计一个介面类库并与STL结合在一起,封装了Windows中的标准控件Edit、Button、TreeCtrl等。控件中的字符串操作用 STL中的string类。其中CListBox和CComboBox中的项操作,采用VCL的TListBox、TcomboBox现个类的Strings设计思想。不是为了发布,而是为了学习。
试着设计一个类似于Access 的数据库应用程序,写了很久,最后以失败告终,这当然是必然的结果。
不过在其中了解到许多软件架构知识和一些问题的处理,这才是最重要的。
„..2006年七月,告别了家乡,第二次来到北京,开始人生的发展。
第二篇:java程序员的成长之路
Java目前是最流行的语言之一,是很多公司和程序员喜爱的一门程序语言.而且, Java的入门比C++相对来说要简单一些, 所以有很大一部分程序员都选择Java作为自己的开发语言.我也是其中之一, 就是因为觉得学C++太难, 当初在学校学了将近一个学期的C++, 啥进步都没有, 哈哈, 天资太差, 所以才选择自学Java(当时学校并没有开设Java的课程), 才走上了程序开发这条路.Java虽然入门要容易, 然而要精通它, 要成为专家却很难.主要原因是Java所涉及的技术面比较宽, 人的精力总是有限的.有些Java方面的技术是必须要要掌握的, 钻研得越深入越好, 比如多线程技术.1.基础阶段
基础阶段, 可能需要经历1-2年吧.这个时段, 应该多写一些基础的小程序(自己动手写的越多越好).计算机是一门实践性很强的学科, 自己动手的东西, 记忆非常深刻, 效果要胜过读好多书.当然, 学Java基础的时候, 书籍的选择也非常重要, 好的书籍事半功倍, 能让你打个非常好的基础.而差的书籍, 很容易将你带入歧途, 多走很多弯路.书籍不在多, 而在乎读得精(有些书, 你读十遍都不为过).我记得我学Java的第一本书是
2.中级阶段
中级阶段, 是一个更漫长的时期, 能否突破此阶段, 跟个人的努力和天资有着很大的关系.你不得不承认, 同样一门新技术, 有些人一个月领悟到的东西, 比你一年的都多.这就是天资, 程序员是一个需要天才的工作.我想, 很多人听说李一男吧, 此君就是这样的人物, 三个月的时间就能解决好大一帮人几年解决不了的问题, 给华为某部门带来了很多的收益.哦, 这是题外话了, 与此篇的主题无关, 只是本人偶尔的感慨而已:).这个阶段, 就需要研究很多专题性的东西了, 比如: IO的实现原理, 多线程和Java的线程模型, 网络编程, swing, RMI, reflect, EJB, JDBC等等很多很多的专题技术, 钻研得越深越好.为了更好的提高, 研究的更深入, 你需要经常到网络上搜索资料, 这个时候往往一本书起不来很大的作用.选一个JDK版本吧, 目前建议选用1.6, 多多研究它, 尤其是源
代码(尽量!就是尽自己最大的努力, 虽然研究透是不可能滴).比如
说: util, collection, io, nio, concurrent等等包.可能有人会反对我说, 不是有API文档吗, 为什么还要研究这么多的源代码? 错了, 有API文档, 你仅仅只是知道怎么用而已, 而认真仔细的研读这些大牛的源码, 你就会深入更高的一个阶层, 自己的编码, 设计都会有很大的提高.如果有能力和精力, 我建议你把JDK的每一行代码都熟悉一遍, 绝对只有好处, 没有坏处!而且你会有些意外的收获, 比如, 当你仔细地读完concurrent包的时候(不多, 好像总共是86个类吧), 你就会对Doug Lea佩服得五体投地.这个时候最忌碰到难题就去寻找帮助, 去网上找答案!先把自己的脑袋想破吧, 或者等你的老板拿着砍刀冲过来要把你杀了, 再去寻求帮助吧.对于专题的学习, 英文原版的阅读是非常必要的, 看的越多越好, 多上上IBM的developer, SUN的网站吧, 当然Javaeye也很不错:), 有很多大牛, 呵呵.这个时候, 你应该建立自己的代码库了, 你应该自己去研究很多有意思的东西了.从一个200多M的文件中寻找一个字段, 最坏情况(在文件的末尾咯)也只需要1秒左右的时间, 你知道吗?这个阶段, 有很多很多类似的有趣的东西可以供你去研究, 你需要更多地关注性能, 规范性, 多解决一些疑难问题.需要学会所有的调试技术, 运用各种性能工具, 还有JDK附带的很多工具, 这些你都要熟练得跟屠夫操刀一样.也可以看看
3.高级阶段
高级阶段, 我就不敢妄言了.呵呵, 我感觉自己也是处于中级阶段吧.也是根据自己的一些经验, 谈谈自己的理解吧:
这个阶段, 需要研究各种框
架, Spring, struts, Junit, Hibernate, iBatis, Jboss, Tomcat, snmp4j等等, 我觉得这个时候, 只要是用Java实现的经典框架, 你都可以去研究.------在此申明一下, 我的意思不是说会用.光会用其实是远远不够的, 你可以选择自己喜欢钻研的框架, 去好好研究一下, 兴趣是最好的老师嘛.建议开始的时候, 研究Junit和Struts吧, 小一点, 里面都采用了很多的模式, 呵呵, 可以熟悉一下, 尽量想想人家为什么这么做.我建议主要的精力可以花在spring和jboss上, 尤其是jboss,经典中的经典, 设计, 性能, 多线程, 资源管理等等, 你从中可以学到的东西简直是太多了.而且它还有一本写得很好的参考书, 叫
程和UML方面的资料, 或者自己主持一个项目玩玩, 不一定非得出去拉项目赚钱(能赚钱当然更好), 不管成功或失败, 都是很宝贵的经验, 都能提高很多!
第三篇:程序员的成长之路(最终版)
程序员的成长之路
想要学习一种技能,先要知道这个技能是什么,有什么用,尤其对于零基础又想学习或者转行做PHP程序员的朋友,更应该对PHP学习有大致的了解,因为学编程是一件需要大量耐心去坚持才能掌握的事,虽然难度并不大,但需要日积月累的练习。不少人因好奇而学习,中途又因苦闷枯燥而放弃。半途而废是最为可惜的,不仅是前功尽弃,而且还会对自己学习新事物的信心造成打击,觉得自己不是学编程的料。其实,PHP在诸多编程语言中,相对而言是比较容易上手的,很适合新手学习。PHP好不好学完全取决于你这个人好不好学。出问题首先从自己身上找原因,这是程序员必备的素养。程序的执行是不会错的,bug肯定是程序员的错误导致的。PHP在WEB领域应用最为广泛,大多数中小网站都是用PHP做的。单纯掌握PHP并不难,难就难在PHP程序员必须懂前端,后端,数据库,服务器。下面我们先来看看PHP的五个学习阶段,具体学习程序如下:
第一阶段:扫盲。了解什么是B/S模式,原理上知道从浏览器输入一个url是如何获取到信息的流程。熟悉html,能快速地用div+css写出静态页面,熟悉js,掌握jquery。在不少小公司,PHP程序员是连前端的活都一起做了的。即使公司有专职做前端的,PHP程序员也必须会看懂,能更改css,会写基本的js效果,用jquery会大大加快工作的效率,写出风骚的代码。
第二阶段:PHP基础语法。掌握基本的语法,弄明白什么是变量、常量、数据类型、熟悉常用的函数。PHP的函数库特别丰富,不可能全部都记住,但至少要将手册上的常用函数都练习过几遍,以后需要用到时才有印象。不至于自己写了半天,才发现原来这个功能用一个内置的函数就能解决。
第三阶段:数据库,WEB服务器的学习。PHP的最佳搭档是:Mysql(数据库),Apache(web服务器), 对于Apache,平时操作得比较少,懂得其配置即可。而Mysql则特别重要。初期懂得如何用PHP操作Mysql进行增删改查,了解常用的Mysql优化原则,能使用PHP+Mysql写出简单的留言板页面。
第四阶段:PHP深化。掌握Ajax异步传输,学习面向对象,学习MVC框架并掌握流行的PHP框架,如Yii框架,国内的ThinkPHP框架,形成良好的编码习惯。能快速用框架开发网站。
第五阶段:大型网站的优化技术:如页面静态化,Memcached缓存技术,MySql数据库深度优化等。
以上五个阶段仅是PHP初级到中级的水平,距离高级水平(充当WEB架构师)还有较远的路要走。而且不是单单学一门PHP就可以无所不能,PHP不是万能的,各种编程语言都有其优劣点,语言本身没有高低之差,语言只是实现功能的工具。如果能达到高水平(掌握多种语言,精通一两种语言),就会发现,语言本身并不重要,编程思想才是最重要的。源码时代PHP教学老师有着多年的项目实战及教学经验,对PHP有独到的见解。由浅至深、循序渐进的安排教学,实现学员由零基础成长为PHP大神。
第四篇:程序员之路
程序员之路
“程序员”,提起这个名称便让我们的脑海中闪出一长串名字:一手开创现代软件业恐龙——Microsoft的比尔·盖茨;现在中华民族软件业之代表金山公司的掌门人——求伯君;微软的噩梦、自由软件的代表、Linux之父芬兰小伙Linus Torvalds……这些在IT业内被无数人津津乐道的名字,都是从一个小小的程序员开始做起的。随着他们的软件日益流行,他们的名字也逐渐为人人所推崇和尊敬。很多年轻人也以他们为榜样,梦想着做一名程序员,最后成为新一代的IT英雄。在这里,笔者作为一个职业程序员的角度,想和大家谈谈自己的感受。为什么要做一个程序员
谈到这个问题似乎会让人觉得太简单、太幼稚。看看现在程序员舒适的工作环境、丰厚的薪水、过着“快乐”的白领生活一切仿佛都不言自明。其实这是只看到了程序员的一面。我们的另一面则不为关注:没日没夜的工作,通宵加班是家常便饭;整天和键盘打交道,把自己的代码改来改去几十甚至上百遍,目的只是为了想抓住一个小小的Bug……这种枯燥的生活又有谁能切身体会?没有对软件事业本身的执著、对源代码近乎朝圣般的痴迷,这一切都是普通人不能忍受的。但是当你的程序完全通过了测试,成为一个合格的产品。这个时候的喜悦,又是如此强烈地激荡在你胸中。也只有真正热爱编程的人,才会感到其中真正的快乐。所以如果有人问你为什么要做一个程序员,那就告诉他你有足够的勇气面对每一次调试失败、有坚定耐心和信心来写好每一行代码。这是我的热爱,编程就是一种乐趣!
学编程是先学什么?
对于广大编程初学者来说,存在着这样普遍的认识:学习程序设计选择编程语言很重要,开口闭口就是Visual Basic、Visual C++、Delphi、Power Builder等一些现在一些比较流行的开发工具。经常看见有初学者问:我学C/C++,究竟是学Visual C++好呢,还是学Borland C++ Builder好呢?或者就是要求在Visual Basic和Delphi之间做出选择。学习程序设计和学习程序设计语言究竟是怎么一种关系呢?初学者究竟应该如何取舍呢?就此我们打个简单的比方:学习程序设计就好比学习射击,而程序设计语言就对应射击中的气枪、手枪、步枪等各种枪械。学习射击必须要选择一种枪械,不可能没有枪还能学好射击的,也不可能同时学会使用所有的枪械。但是,如果掌握一种枪械的射击,再学别的枪就触类旁通了。因为在熟悉一种枪械的同时,也学习了射击技术本身。再学其他的,自然事半功倍。学习程序设计也是一样,必然要从学习一门程序设计语言开始入手。同时在学习的过程中,不但要掌握这门语言语法本身,还要学会编程的思想,这是所有程序设计语言的基础。程序设计语言,是“一法通,万法皆通”的。
建议:学习程序设计不必苛求一定要从某一种语言入手,可以在Visual Basic、Delphi、Borland C++ Builder、DOS下的Pascal、Turbo C(或Borland C)等中间选择自己比较容易接受的一种进行学习。从中主要学习的是编程本身的思想,学习的是用程序设计的眼光来看待问题。或许,学习的效果不能马上看到,但是可以学到扎实的基本功,而这对于将来的进一步发展是有很大好处的。这些基本功包括:
一、强化逻辑分析和建立数学模型的能力 编程的目的是什么?是要解决现实中的问题。而现实中的问题是用自然语言描述
1 的,目前的计算机对之是无法理解。我们要做的就是必须用计算机能理解的方式将之“告诉”计算机。也就需要我们对现实问题进行逻辑分析,建立合适的数学模型,然后以程序和数据的形式输入计算机,让计算机帮我们来分析解决。一个简单的例子就是计算机对于颜色的处理办法:用R、G、B三色分量来各表示一种颜色,对于颜色的处理被转化为对R、G、B三个整数的处理。我们只要改变这三个整数,就可以改变成为另外一种颜色。对于其他的现实问题,我们也要象这样使之可以被计算机所“理解”。这是编程所要解决的第一步,否则就根本没有程可编。这是建立在“经验”上的,是要在学习过程中逐步积累的。
二、数据结构和算法知识
程序设计发展到现在,已经有了一套比较普遍、完整的数学模型(我们称之为数据结构)和对应这些数学模型的处理方法(也就是算法)。目前的程序就是以之为基础的。在程序员中间流传着一句经验之谈:“好的数据结构是程序的一半。”其重要性可见一斑。作为一个程序员,如果不知道数据结构中堆栈、队列、链表、树,不知道算法中的查找、排序、树的遍历、递归,这简直是不可想象的。我们所说的“编程的思想”也就是具体表现为这两点。所以,一般的数据结构和算法知识是学习程序设计过程中必须掌握的,这样在以后的程序开发过程中就可以觉得得心应手。
三、丰富的实践经验
程序设计本身就是一门实践性很强的学科。一个只存在于纸上的程序如同没有翅膀的鸟永远不能飞翔在现实的天空。任由代码写得再巧妙,风格再优美,也是一张纸上的一连串字符而已。就好比是一份作文练习,或许写得很好,但是不交给老师去批阅,和一张白纸又有什么区别呢?在这里,程序就是作文,而计算机就是老师。只有把“作文”交给“老师”,只有从通过调试的程序中才能印证自己的构想是否正确,或者看到有什么缺陷。当然也少不了要多和同行交流,尤其是随着互联网的普及,在网上我们也可以看到别人编写的例子和源程序,作为现代的程序员,这也是千万不可错过的好机会。
最后,作为一个程序员还有一点小要求:身体素质比较好,能熬夜才行。有规矩,成方圆
程序开发是一件灵活性很强的工作。例如:变量I增加1,在C语言里面可以有I++、++I、I+=
1、I=I+1等多种写法。但是,这并不说明编程就可以顺心所欲,天马行空。良好的编程习惯可以提高工作效率,减少不必要的失误。尤其是对于初学者来说更是要注意的:
第一点:编程的时候,首先要建立好的数据结构。在前面已指出“好的数据结构是程序的一半。”,这句经验之谈自然有其道理所在。编程序的时候,如果在开始的时候设计错数据结构,那么在后来不得不花大代价修改程序。笔者自己就曾有过这样的惨痛教训:一个程序写了2500多行,突然发现基本数据结构不合理,结果全部推翻重写。“磨刀不误砍柴工”绝对不是老生常谈。在开始写代码之前做好数据结构的研究和准备工作往往可以达到事半功倍的效果。
第二点:代码尽可能重用,尽量模块化。无论是面向过程还是面向对象,代码重用都是基本原则之一。例如:如果要画一个青苹果和一个红苹果,就写一个函数来画苹果,把颜色作为参数传进去。这样只要调用同一个函数传不同参数就可以实现画不同的苹果。这样做的好处一是程序比较容易理解,另外修改也方便,只要修改一个地方就可以让两个苹果都发生改变。这点在开发一些短小程序中还感觉不出,但是在以后开发大型程序的时候,工作的效率就明显提高不少。这就是
2 聪明人做聪明事,以最小的代价取得最大的收获。
第三点:良好的编写风格。一个程序,不可能是绝对完美,以后永不用修改的。既然要修改,就必然要重读和理解原来的代码。而良好的编程风格,可以使人更方便和迅速理解程序的结构,从而可以最大限度地提高修改的效率。在这里,笔者举出一些比较好编程的风格要求:1.统一有意义的命名规范:一个变量叫nCount明显比叫iii更容易被理解其真实逻辑含义和数据类型。所以不要怕麻烦,变量和函数名多起几个字母,有意义一点,将来理解起来比较方便。2.代码的逐层缩进格式。这几乎已经成为一种标准,这种格式使得代码之间的层次关系非常明显,对于程序的逻辑理解有很大的帮助。3.代码位置的有条理性。把相关功能的代码集中起来,放在一起,这样在以后阅读代码的时候,可以尽量避免在不同文件模块之间频繁切换。函数内部的逻辑不要太复杂,代码行数不要太长:由于要考虑到以后的理解,所以函数内部的逻辑不要写得很复杂,例如循环嵌套以三层为宜,代码行数以一屏左右为好,太长的代码不利于理解。如果循环的确多、代码的确长,就应该考虑重新再划分为更细的子函数。好的编程风格当然不止这些,这也需要在学习过程中慢慢体会。
第四点:注重程序测试,注意异常处理。这是业余编程爱好者和职业程序员的一个很明显的差别。业余编程爱好者往往只注重程序可以正常运行,而职业程序员除此之外还必须关注程序在异常情况下也必须正常运行,至少可以正常终止。而这是建立在对程序进行充分测试的基础上的。多用不同情况去测试自己的程序,可以发现更多的隐藏的Bug,从而提高自己程序的质量。
千里之行始于足下。做程序员也是这样,这世上不仅没有平坦大道,还有更多的曲折和困难。但是只要真心热爱软件开发,愿意为之而付出,最后胜利的金苹果必将使你体会到个中乐趣。来吧,还犹豫什么,踏上这条程序员之路,昂首向前走吧!
3
第五篇:北风网谈PHP程序员成长之路
北风教育谈PHP程序员成长之路
“投之以桃,报之以李”一直以来都是北风教育秉承的授人以渔的美德。今天北风教育结合前人的经验,整理出作为PHP程序员的三个阶段的成长路线,希望能对您的程序员之路提供有用的指导:
开始阶段:基础阶段(基础PHP程序员)
重点:把LNMP搞熟练(核心是安装配置基本操作)
目标:能够完成基本的LNMP系统安装,简单配置维护;能够做基本的简单系统的PHP开发;能够在PHP中型系统中支持某个PHP功能模块的开发。
时间:完成本阶段的时间因人而异,有的成长快半年一年就过了,成长慢的两三年也有。
1.Linux 基本命令、操作、启动、基本服务配置(包括rpm安装文件,各种服务配置等);会写简单的shell脚本和awk/sed 脚本命令等。2.Nginx 做到能够安装配置nginx+php,知道基本的nginx核心配置选项,知道
server/fastcgi_pass/access_log 等基础配置,目标是能够让nginx+php_fpm顺利工作。3.MySQL 会自己搭建mysql,知道基本的mysql配置选项;知道innodb和myisam的区别,知道针对InnoDB和MyISAM两个引擎的不同配置选项;知道基本的两个引擎的差异和选择上面的区别;能够纯手工编译搭建一个MySQL数据库并且配置好编码等正常稳定运行;核心主旨是能够搭建一个可运行的MySQL数据库。4.PHP 基本语法数组、字符串、数据库、XML、Socket、GD/ImageMgk图片处理等等;熟悉各种跟MySQL操作链接的api(mysql/mysqli/PDO),知道各种编码问题的解决;知道常规熟练使用的PHP框架(ThinkPHP、Zendframework、Yii、Yaf等);了解基本MVC的运行机制和为什么这么做,稍微知道不同的PHP框架之间的区别;能够快速学习一个MVC框架。能够知道开发工程中的文件目录组织,有基本的良好的代码结构和风格,能够完成小系统的开发和中型系统中某个模块的开发工作。5.前端
如果条件时间允许,可以适当学习下 HTML/CSS/JS 等相关知识,知道什么web标准,div+css的web/wap页面模式,知道HTML5和HTML4的区别;了解一些基本的前端只是和JS框架(jQuery之类的);了解一些基本的JavaScript编程知识;(本项不是必须项,如果有时间,稍微了解一下是可以的,不过不建议作为重点,除非个人有强烈兴趣)。6.系统设计
能够完成小型系统的基本设计,包括简单的数据库设计,能够完成基本的:浏览器-> Nginx+PHP-> 数据库 架构的设计开发工作;能够支撑每天几十万到数百万流量网站的开发维护工作;
第二阶段:提高阶段(中级PHP程序员)
重点:提高针对LNMP的技能,能够更全面的对LNMP有熟练的应用。
目标:能够随时随地搭建好LNMP环境,快速完成常规配置;能够追查解决大部分遇到的开发和线上环境的问题;能够独立承担中型系统的构架和开发工作;能够在大型系统中承担某个中型模块的开发工作。1.Linux 在开始阶段的基础上面,能够流畅的使用Shell脚本来完成很多自动化的工作;awk/sed/perl 也操作的不错,能够完成很多文本处理和数据统计等工作;基本能够安装大部分非特殊的Linux程序(包括各种库、包、第三方依赖等等,比如MongoDB/Redis/Sphinx/Luncene/SVN之类的);了解基本的Linux服务,知道如何查看Linux的性能指标数据,知道基本的Linux下面的问题跟踪等。2.Nginx 在开始阶段的基础上面,了解复杂一些的Nginx配置;包括 多核配置、events、proxy_pass,sendfile/tcp_*配置,知道超时等相关配置和性能影响;知道nginx除了web server,还能够承担代理服务器、反向静态服务器等配置;知道基本的nginx配置调优;知道如何配置权限、编译一个nginx扩展到nginx;知道基本的nginx运行原理(master/worker机制,epoll),知道为什么nginx性能比apache性能好等知识。3.MySQL/MongoDB 在开始阶段的基础上面,在MySQL开发方面,掌握很多小技巧,包括常规SQL优化(group by/order by/rand优化等);除了能够搭建MySQL,还能够冷热备份MySQL数据,还知道影响innodb/myisam性能的配置选项(比如key_buffer/query_cache/sort_buffer/innodb_buffer_pool_size/innodb_flush_log_at_trx_commit等),也知道这些选项配置成为多少值合适;另外也了解一些特殊的配置选项,比如
知道如何搭建mysql主从同步的环境,知道各个binlog_format的区别;知道MySQL的性能追查,包括slow_log/explain等,还能够知道基本的索引建立处理等知识;原理方面了解基本的MySQL的架构(Server+存储引擎),知道基本的InnoDB/MyISAM索引存储结构和不同(聚簇索引,B树);知道基本的InnoDB事务处理机制;了解大部分MySQL异常情况的处理方案(或者知道哪儿找到处理方案)。条件允许的情况,建议了解一下NoSQL的代表MongoDB数据库,顺便对比跟MySQL的差别,同事能够在合适的应用场景安全谨慎的使用MongoDB,知道基本的PHP与MongoDB的结合开发。4.Redis/Memcached 在大部分中型系统里面一定会涉及到缓存处理,所以一定要了解基本的缓存;知道Memcached和Redis的异同和应用场景,能够独立安装 Redis/Memcached,了解Memcahed的一些基本特性和限制,比如最大的value值,知道PHP跟他们的使用结合;Redis了解基本工作原理和使用,了解常规的数据类型,知道什么场景应用什么类型,了解Redis的事务等等。原理部分,能够大概了解Memcached的内存结构(slab机制),redis就了解常用数据类型底层实现存储结构(SDS/链表/SkipList/HashTable)等等,顺便了解一下Redis的事务、RDB、AOF等机制更好。5.PHP 除了开始阶段的能力,安装配置方面能够随意安装PHP和各种第三方扩展的编译安装配置;了解php-fpm的大部分配置选项和含义(如max_requests/max_children/request_terminate_timeout之类的影响性能的配置),知道mod_php/fastcgi的区别;在PHP方面已经能够熟练各种基础技术,还包括各种深入些的PHP,包括对PHP面向对象的深入理解/SPL/语法层面的特殊特性比如反射之类的;在框架方面已经阅读过最少一个以上常规PHP MVC框架的代码了,知道基本PHP框架内部实现机制和设计思想;在PHP开发中已经能够熟练使用常规的设计模式来应用开发(抽象工厂/单例/观察者/命令链/策略/适配器 等模式);建议开发自己的PHP MVC框架来充分让开发自由化,让自己深入理解MVC模式,也让自己能够在业务项目开发里快速升级;熟悉PHP的各种代码优化方法,熟悉大部分PHP安全方面问题的解决处理;熟悉基本的PHP执行的机制原理(Zend引擎/扩展基本工作机制)。6.C/C++ 开始涉猎一定的C/C++语言,能够写基本的C/C++代码,对基本的C/C++语法熟悉(指针、数组操作、字符串、常规标准API)和数据结构(链表、树、哈希、队列)有一定的熟悉下;对Linux下面的C语言开发有基本的了解概念,会简单的makefile文件编写,能够使用简单的GCC/GDB的程序编译简单调试工作;对基本的网络编程有大概了解。(本项是为了向更高层次打下基础)。7.前端
在开始阶段的基础上面,熟悉基本的HTTP协议(协议代码200/300/400/500,基本的HTTP交互头);条件允许,可以在深入写出稍微优雅的HTML+CSS+JavaScript,或者能够大致简单使用某些前端框架(jQuery/YUI/ExtJS/RequireJS/BootStrap之类);如果条件允许,可以深入学习JavaScript编程,比如闭包机制、DOM处理;再深入些可以读读jQuery源码做深入学习。(本项不做重点学习,除非对前端有兴趣)。8.系统设计
能够设计大部分中型系统的网站架构、数据库、基本PHP框架选型;性能测试排查处理等;能够完成类似:浏览器-> CDN(Squid)-> Nginx+PHP-> 缓存-> 数据库 结构网站的基本设计开发维护;能够支撑每天数百万到千万流量基本网站的开发维护工作。
第三阶段:高级阶段(高级PHP程序员)
重点:除了基本的LNMP程序,还能够在某个方向或领域有深入学习。(纵深维度发展)目标:除了能够完成基本的PHP业务开发,还能够解决大部分深入复杂的技术问题,并且可以独立设计完成中大型的系统设计和开发工作;自己能够独立hold深入某个技术方向,在这块比较专业。(比如在MySQL、Nginx、PHP、Redis等等任一方向深入研究)1.Linux 除了第二阶段的能力,在Linux下面除了常规的操作和性能监控跟踪,还能够使用很多高级复杂的命令完成工作(watch/tcpdump/starce/ldd/ar等);在shell脚本方面,已经能够编写比较复杂的shell脚本(超过500行)来协助完成很多包括备份、自动化处理、监控等工作的shell;对awk/sed/perl 等应用已经如火纯青,能够随意操作控制处理文本统计分析各种复杂格式的数据;对Linux内部机制有一些了解,对内核模块加载,启动错误处理等等有个基本的处理;同时对一些其他相关的东西也了解,比如NFS、磁盘管理等等; 2.Nginx 在第二阶段的基础上面,已经能够把Nginx操作的很熟练,能够对Nginx进行更深入的运维工作,比如监控、性能优化,复杂问题处理等等;看个人兴趣,更多方面可以考虑侧重在关于Nginx工作原理部分的深入学习,主要表现在阅读源码开始,比如具体的master/worker工作机制,Nginx内部的事件处理,内存管理等等;同时可以学习Nginx扩展的开发,可以定制一些自己私有的扩展;同时可以对Nginx+Lua有一定程度的了解,看看是否可以结合应用出更好模式;这个阶段的要求是对Nginx原理的深入理解,可以考虑成为Nginx方向的深入专业者。
3.MySQL/MongoDB 在第二阶段的基础上面,在MySQL应用方面,除了之前的基本SQL优化,还能够在完成一些复杂操作,比如大批量数据的导入导出,线上大批量数据的更改表结构或者增删索引字段等等高危操作;除了安装配置,已经能够处理更多复杂的MySQL的问题,比如各种问题的追查,主从同步延迟问题的解决、跨机房同步数据方案、MySQL高可用架构等都有涉及了解;对MySQL应用层面,对MySQL的核心关键技术比较熟悉,比如事务机制(隔离级别、锁等)、对触发器、分区等技术有一定了解和应用;对MySQL性能方面,有包括磁盘优化(SAS迁移到SSD)、服务器优化(内存、服务器本身配置)、除了二阶段的其他核心性能优化选项(innodb_log_buffer_size/back_log/table_open_cache/thread_cache_size/innodb_lock_wait_timeout等)、连接池软件选择应用,对show *(show status/show profile)类的操作语句有深入了解,能够完成大部分的性能问题追查;MySQL备份技术的深入熟悉,包括灾备还原、对Binlog的深入理解,冷热备份,多IDC备份等;在MySQL原理方面,有更多了解,比如对MySQL的工作机制开始阅读部分源码,比如对主从同步(复制)技术的源码学习,或者对某个存储引擎(MyISAM/Innodb/TokuDB)等等的源码学习理解,如果条件允许,可以参考CSV引擎开发自己简单的存储引擎来保存一些数据,增强对MySQL的理解;在这个过程,如果自己有兴趣,也可以考虑往DBA方向发展。MongoDB层面,可以考虑比如说在写少读多的情况开始在线上应用MongoDB,或者是做一些线上的数据分析处理的操作,具体场景可以按照工作来,不过核心是要更好的深入理解RMDBS和NoSQL的不同场景下面的应用,如果条件或者兴趣允许,可以开始深入学习一下MongoDB的工作机制。4.Redis/Memcached 在第二阶段的基础上面,能够更深入的应用和学习。因为Memcached不是特别复杂,建议可以把源码进行阅读,特别是内存管理部分,方便深入理解;Redis部分,可以多做一些复杂的数据结构的应用(zset来做排行榜排序操作/事务处理用来保证原子性在秒杀类场景应用之类的使用操作);多涉及aof等同步机制的学习应用,设计一个高可用的Redis应用架构和集群;建议可以深入的学习一下Redis的源码,把在第二阶段积累的知识都可以应用上,特别可以阅读一下包括核心事件管理、内存管理、内部核心数据结构等充分学习了解一下。如果兴趣允许,可以成为一个Redis方面非常专业的使用者。5.PHP 作为基础核心技能,我们在第二阶段的基础上面,需要有更深入的学习和应用。从基本代码应用上面来说,能够解决在PHP开发中遇到95%的问题,了解大部分PHP的技巧;对大部分的PHP框架能够迅速在一天内上手使用,并且了解各个主流PHP框架的优缺点,能够迅速方便项目开发中做技术选型;在配置方面,除了常规第二阶段会的知识,会了解一些比较偏门的配置选项(php auto_prepend_file/auto_append_file),包括扩展中的一些复杂高级配置和原理(比如memcached扩展配置中的memcache.hash_strategy、apc扩展配置中的apc.mmap_file_mask/apc.slam_defense/apc.file_update_protection之类的);对php的工作机制比较了解,包括php-fpm工作机制(比如php-fpm在不同配置机器下面开启进程数量计算以及原理),对zend引擎有基本熟悉(vm/gc/stream处理),阅读过基本的PHP内核源码(或者阅读过相关文章),对PHP内部机制的大部分核心数据结构(基础类型/Array/Object)实现有了解,对于核心基础结构(zval/hashtable/gc)有深入学习了解;能够进行基本的PHP扩展开发,了解一些扩展开发的中高级知识(minit/rinit等),熟悉php跟apache/nginx不同的通信交互方式细节(mod_php/fastcgi);除了开发PHP扩展,可以考虑学习开发Zend扩展,从更底层去了解PHP。6.C/C++ 在第二阶段基础上面,能够在C/C++语言方面有更深入的学习了解,能够完成中小型C/C++系统的开发工作;除了基本第二阶段的基础C/C++语法和数据结构,也能够学习一些特殊数据结构(b-tree/rb-tree/skiplist/lsm-tree/trie-tree等)方便在特殊工作中需求;在系统编程方面,熟悉多进程、多线程编程;多进程情况下面了解大部分多进程之间的通信方式,能够灵活选择通信方式(共享内存/信号量/管道等);多线程编程能够良好的解决锁冲突问题,并且能够进行多线程程序的开发调试工作;同时对网络编程比较熟悉,了解多进程模型/多线程模型/异步网络IO模型的差别和选型,熟悉不同异步网络IO模型的原理和差异(select/poll/epoll/iocp等),并且熟悉常见的异步框架(ACE/ICE/libev/libevent/libuv/Boost.ASIO等)和使用,如果闲暇也可以看看一些国产自己开发的库(比如muduo);同时能够设计好的高并发程序架构(leader-follow/master-worker等);了解大部分C/C++后端Server开发中的问题(内存管理、日志打印、高并发、前后端通信协议、服务监控),知道各个后端服务RPC通信问题(struct/http/thirft/protobuf等);能够更熟络的使用GCC和GDB来开发编译调试程序,在线上程序core掉后能够迅速追查跟踪解决问题;通用模块开发方面,可以积累或者开发一些通用的工具或库(比如异步网络框架、日志库、内存池、线程池等),不过开发后是否应用要谨慎,省的埋坑去追bug。7.前端
深入了解HTTP协议(包括各个细致协议特殊协议代码和背后原因,比如302静态文件缓存了,502是nginx后面php挂了之类的);除了之前的前端方面的各种框架应用整合能力,前端方面的学习如果有兴趣可以更深入,表现形式是,可以自己开发一些类似jQuery的前端框架,或者开发一个富文本编辑器之类的比较琐碎考验JavaScript功力。8.其他领域语言学习
在基础的PHP/C/C++语言方面有基本积累,建议在当前阶段可以尝试学习不同的编程语言,看个人兴趣爱好,脚本类语言可以学学 Python/Ruby 之类的,函数式编程语言可以试试 Lisp/Haskell/Scala/Erlang 之类的,静态语言可以试试 Java/Golang,数据统计分析可以了解了解R语言,如果想换个视角做后端业务,可以试试 Node.js还有前面提到的跟Nginx结合的Nginx_Lua等。学习不同的语言主要是提升自己的视野和解决问题手段的差异,比如会了解除了进程/线程,还有轻量级协程;比如在跨机器通信场景下面,Erlang的解决方案简单的惊人;比如在不想选择C/C++的情况下,还有类似高效的Erlang/Golang可用等等;主要是提升视野。
9.其他专业方向学习
在本阶段里面,会除了基本的LNMP技能之外,会考虑一些其他领域知识的学习,这些都是可以的,看个人兴趣和长期的目标方向。目前情况能够选择的领域比较多,比如、云计算(分布式存储、分布式计算、虚拟机等),机器学习(数据挖掘、模式识别等,应用到统计、个性化推荐),自然语言处理(中文分词等),搜索引擎技术、图形图像、语音识别等等。除了这些高大上的,也有很多偏工程方面可以学习的地方,比如高性能系统、移动开发(Android/IOS)、计算机安全、嵌入式系统、硬件等方向。10.系统设计
系统设计在第二阶段的基础之上,能够应用掌握的经验技能,设计出比较复杂的中大型系统,能够解决大部分线上的各种复杂系统的问题,完成类似 浏览器-> CDN-> 负载均衡->接入层-> Nginx+PHP-> 业务缓存-> 数据库-> 各路复杂后端RPC交互(存储后端、逻辑后端、反作弊后端、外部服务)-> 更多后端 酱紫的复杂业务;能够支撑每天数千万到数亿流量网站的正常开发维护工作。