2005年07月06日

学好VC++的十大良好习惯(立华软件园)

一、充分利用MSDN,因为我个人觉得它胜过任何一本编程参考书
  MSDN是 Microsoft 当前提供的有关编程信息的最全面的资源,它包含微软最新的技术数据库,加上易学易用的全文检索功能,让您迅速找到任何您需要的技术参考数据,让您随时拥有与全世界菁英同步的技术,掌握最丰富的程序开发资源。我经常收到很多朋友的EMAILS,他们所提的问题往往都非常的简单,MSDN完全可以解答这些问题,但他们好象不太喜欢用,这是让我郁闷的地方,是因为英文不好呢,还是没有学会充分利用各种资源来解决问题的方法呢?


二、提高英文水平,养成多上英文网站多看英文资料多买老外原版英文书
  有关程序员与英文水平的讨论已太多太多,我个人认为要成为程序员,高中的英语水平够了,甚至不懂英语的一些人,也同样可以成为较好的程序员,因为开发工具的发展将是越来越傻瓜,但如果你是仅仅满足于能运用某种工具开发某个软件模块,那是没话说了。真正热衷技术肯干钻研乐于接受挑战的程序员是不满足于现状的,他们总感觉有太多的未知,于是总在不停地学习,如今信息技术发展得太快,而大部分的技术最先出现的时候都是英文版本的,要几个月或者几年以后才有中文版本的书出来,因此要想跟上步伐,一定要努力提高自己的英文水平,这样才能同步跟上信息技术。

  你可能担心自己的英语水平不行,没关系,刚开始多查字典,“万事开头难”,必须有持之以恒的精神,不久你就会发现计算机英语其实很容易的。何况很多英文技术站点确实比国内做得好啊!比如http://www.codeguru.com,http://www.codeproject.com,http://www.programmersheaven.com 等等。


三、加强自我管理,善于作自我总结,分析自已的优点及缺点
  中国境内百分之八十以上的领导人在百分之八十以上的场合的讲话中都有类似的观点,所以在这里我是不多说了,反正这一条用在什么行业什么地方都不会有错的,人生最大的敌人不是就是自已吗?管好自已认清自已,那还有什么搞不定的?


四、养成良好的文档习惯
  程序员大多都不喜欢写文档,我以前也是特讨厌,在我的思想里,所谓的文档就是一些废话,一句话硬是用十句话来代替的无聊透顶,就如同部分中文系男生的爱情表白,明明就是“我爱你”三个字,他硬是把月亮啊太阳啊大海啊高山啊石头啊天使啊乱七八糟的都拉上关系了,尽管听起来浪漫,但在我认为不实用,:),甚至太肉麻了,一个男子汉干嘛这么罗里罗嗦的。。。。。。良好的文档是正规研发流程中非常重要的环节,一个好的程序是先写好设计文档再进行编程的,在设计文档的指导下,才能写出安全的代码。如果你不写文档,一开始就写程序,这样你就不会按已设计好的路线走,而是想到哪写到哪。小功能还好说,要是大功能,就容易混乱甚至失控。

  那么如何写文档呢?其实我认为没有统一的标准,虽然国家及一些NB的人总结了很多的模板,但每个人的习惯不同,如果你不加以修改或创新,就套用某个标准,我相信写起来会很吃力及说不清的难受,因此我觉得只要能将你的设计思想及实现算法或步骤描述清楚就是好的文档,我强烈建议广大程序员朋友们在写文档时要善于用图表来说明你的思想,我们不是作家,也可能作文都经常性地不及格,写出五官端正的文章对我们来说可能不容易啊!好好地利用VISIO,ROSE或别的工具来表达你的思想吧!


五、代码风格要规范,严谨,效率要高
  这个不用说了,所以一定要记住了!不过,这一点有时可能与人的性格有关,如果你是经常丢三落四经常胡子长长经常钮扣扣错经常吃个快餐要一个小时的人,那你在CODING的时候可千万要注意了,CODING是CODING,生活是生活,不要写出的程序也是那样就不好了!


六、掌握好跟踪调试技巧
  跟踪调试程序是一件繁琐而又复杂的事情,所以掌握必要的调试策略及技巧却可以使这些工作变得轻松起来。强烈建议你去看一下老美Everett N。McKay及Mike Wooding写的书<<Debugging Windows Programs>>,你一不定受益匪浅。


七、养成自我测试的习惯
  测试工作应由测试工程师来做,但在你写完一个模块或一个软件时,还是要自已先测试一下,保证不要出现一些低级的错误,何况这些错误让测试工程师看到了,狂扁你一顿,你很没FACES的。


八、善于交流善于沟通,特别是经常与一些高手交流一下学习的心得体会
  有人说,程序员的性格大多内向不喜欢说话,其实是有些误会了,不是不喜欢而是话不投机,我的脑袋一天到晚都在不停地转,函数,数据,算法啊充满了我的世界,我那还有时间与你谈一些无聊的话题,话要找对人了,才容易谈下去,书上说过“听君一席话,胜读十年书”,你要找的就是这种豁然开朗!现在技术的论坛越来越来,这将成为程序员交流一个重要的地方,也有人说:“读君一长贴,胜读十年书” :)


九、阶段性地做一下专题总结
  知识要温故而知新,因此我建议程序员要养成阶段性地做专题总结的习惯,比如你这个月学习或在做与多线程有关的模块或项目,那么在你做完后,你就可以好好地总结一下所有与多线程相关的技术,包括理论知识,实践方法以及各种技巧及优秀文章等等,这对你各种能力的提高将有很大的帮助,你试过了吗,如果没有,那就快点行动吧!


十、要有持之以恒的精神
  这是废话,因为我揍不齐十大,所以将它也算上,中国自古以来喜欢号召大众学习某种精神,比如马克思的,列宁的,毛_泽东的,邓_小平的,雷峰的等,这些精神使社会更安定人民生活更美好,那么程序员要有什么样的精神呢?我不是我说了就算了的,我只是想说明要学好任何一门技术,最好要有持之以恒精益求精的精神,特别是学一些比较抽象比较难的技术,比如VC++,我想它应比别的开发语言都要难学些,或许你已经开始了两年了,但感觉还是不爽仿佛也没掌握什么,这个时候你除了思考一下你的学习方法以外,还必须坚定你的目标及信念!

2005年05月16日

1.把C++当成一门新的语言学习(和C没啥关系!真的。);
2.看《Thinking In C++》,不要看《C++变成死相》;
3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看;
4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境,而我们要学的是一门语言;
5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点;
6.会用Visual C++,并不说明你会C++;
7.学class并不难,template、STL、generic programming也不过如此——难的是长期坚持实践和不遗余力的博览群书;
8.如果不是天才的话,想学编程就不要想玩游戏——你以为你做到了,其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住:学C++是为了编游戏的;
9.看Visual C++的书,是学不了C++语言的;
10.浮躁的人容易说:XX语言不行了,应该学YY;——是你自己不行了吧!?
11.浮躁的人容易问:我到底该学什么;——别问,学就对了;
12.浮躁的人容易问:XX有钱途吗;——建议你去抢银行;
13.浮躁的人容易说:我要中文版!我英文不行!——不行?学呀!
14.浮躁的人容易问:XX和YY哪个好;——告诉你吧,都好——只要你学就行;
15.浮躁的人分两种:a)只观望而不学的人;b)只学而不坚持的人;
16.把时髦的技术挂在嘴边,还不如把过时的技术记在心里;
17.C++不仅仅是支持面向对象的程序设计语言;
18.学习编程最好的方法之一就是阅读源代码;
19.在任何时刻都不要认为自己手中的书已经足够了;
20.请阅读《The Standard C++ Bible》(中文版:标准C++宝典),掌握C++标准;
21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;
22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;
23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》;
24.不要停留在集成开发环境的摇篮上,要学会控制集成开发环境,还要学会用命令行方式处理程序;
25.和别人一起讨论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪个好;
26.请看《程序设计实践》,并严格的按照其要求去做;
27.不要因为C和C++中有一些语法和关键字看上去相同,就认为它们的意义和作用完全一样;
28.C++绝不是所谓的C的“扩充”——如果C++一开始就起名叫Z语言,你一定不会把C和Z语言联系得那么紧密;
29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已;
30.读完了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++;
31.学习编程的秘诀是:编程,编程,再编程;
32.请留意下列书籍:《C++面向对象高效编程(C++ Effective Object-Oriented Soft ware Construction)》《面向对象软件构造(Object-Oriented Software Construction)》《设计模式(Design Patterns)》《The Art of Computer Programming》;
33.记住:面向对象技术不只是C++专有的;
34.请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码;
35.把在书中看到的有意义的例子扩充;
36.请重视C++中的异常处理技术,并将其切实的运用到自己的程序中;
37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去;
38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路;
39.C++语言和C++的集成开发环境要同时学习和掌握;
40.既然决定了学C++,就请坚持学下去,因为学习程序设计语言的目的是掌握程序设计技术,而程序设计技术是跨语言的;
41.就让C++语言的各种平台和开发环境去激烈的竞争吧,我们要以学习C++语言本身为主;
42.当你写C++程序写到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,然后分析自己的错误并重新设计和编写(参见43);
43.别心急,设计C++的class确实不容易;自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的;
44.决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的;
45.每学到一个C++难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了;
46.记录下在和别人交流时发现的自己忽视或不理解的知识点;
47.请不断的对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX;
48.保存好你写过的所有的程序——那是你最好的积累之一;
49.请不要做浮躁的人;
50.请热爱C++!

2004年11月03日

我认为有些人的观点错了。
对于这个问题,我的基本观点是:任何实践都是理论的载体或表现形式。而理论也是由实践上升而来的。两者是辨证的。今天,我们只关注它的前一部分:任何实践都是理论的载体和表现形式。
我不是想故弄玄虚,但真理的外表看上去往往就是这么奇形怪状、难以理解。让我来给你解释一下吧。
比如:战争是军事理论的实践,也是它的表现形式。战争的胜负取决于指挥者军事理论的掌握程度(别给我举赵括这类“纸上谈兵”的反例,他们根本算不上掌握了军事理论,充其量只算是“背”下了军事理论。“掌握”和“倒背如流”这是两个概念。)

VC、VB、Delphi …… ,你该学哪个?
具体到编程而言,我要告诉你:任何一种计算机语言,都是计算机科学理论的载体或表现形式。C++很神吗?Java很酷吗?它们差距很远吗?是的。但从理论的层面上讲,它们没有区别,都是“面向对象”理论的一个具体形式而已。
现在的程序员们被发行编译软件(通常我们将其称为“系统软件”)的商家不断推出的产品搞得眼花缭乱,头痛欲裂。不断地跟在新语言后面跑,这条路还没跑到头,那边的“新路”又鸣锣开张了,于是再跟着跑……渐渐地有些人开始感叹:学海无涯、学无止境,或什么“程序员是青春饭,过了三十别想干”……
在此我不得不叹息:中国的教育真是一种“形而上学”的教育。早在高中时代我们就学过“辨证唯物主义”的基本理论:做事情要抓主要矛盾。这一条恐怕谁都知道,却鲜见谁能在实践中把这一理论运用得“炉火纯青”的。把这一理论运用到编程上来讲就是:
理论是主要矛盾,语言是次要矛盾,学会了理论,再具体到学一种语言时,你只不过是在进行某种消遣而已。
现在学VC的普遍看不起学VB的或学Delphi的。但如果一个用Delphi的人,在需要写web程序时,用TCP/IP做了一个构架,嵌入到应用程序中;而另一个用VC的人却只会把一个又一个的组件拖来拉去的做些个“例子程序”的翻版。你说他们两个谁历害?Delphi和VC谁历害?
真应了这样一段话,问:纽约好还是上海好?答:有钱哪儿都好,没钱哪儿都不好。上海的富人并不比纽约的富人少多少的优越感,而纽约的乞丐也不比上海的乞丐多多少幸福感。
现在你还会说学VC的人就一定比学Delphi的人水平高、“钱景”好吗?

“浅薄”绝不该是中国程序员的性格特征!!!
想问一句:中国程序员这么多,你们真地把基础理论学好了吗?别用你现有的编程经历告诉我:编程不需要数学,不需要数据结构,不需要编译原理…… ……说话得负责任,您知道吗?我之所以发表这篇文章,就是因为再也看不下去这种在中国编程界漫延的歪理邪说了!邪教害死的是人的个体,你们害死的是中国软件业的未来!如果再让这种理论继续毒害编程新手的思想,中国将在计算机领域失去民族的尊严!!!
请问,操作系统、编译软件、数据库系统…… 这些被称为“系统软件”的东东,中国有几样拿得出手的产品?也许是我孤陋寡闻,据我所知:我们国家一件像样的也没有。
不错,我们是有一些网站的股票在西方上市了,我们是有一些人被国外公司请去做高级职员了,我们也有一些人把西方的官方网站给黑了……但是,我们用的编译工具是谁的产品?我们微机里装得是谁做出的操作系统?我们的程序跑在谁的芯片上?
爱之深,恨之切。我爱的是中国,但我痛恨不是中国,而是在中国编程界普遍流行的“浅薄”和“自以为是”,这是我们民族软件业的一颗毒瘤!
是的,现在编程方面快速入门的书满天飞,让程序员的门槛越来越低。我这个外行就得益于这个“低门槛”,跑了进来。但进来后,我们就不能再这样浅薄下去了——我的兄弟们!
用他国提供的工具做几个网站,写几个应用程序,弄出几个病毒…… 是振兴不了民族软件业的。顺便说一句:我尊敬求伯君,但我不认为金山公司和其系列产品配得上被称为“民族软件业”的大旗,相对这个称号,它差得太远了。
…… ……
写flash软件的人会认为用flash做动画的人比他历害吗?Adobe公司真的认为考取Adobe证书的人是“人才”吗?MSCE、MSCD…… 通过这类考试得到微软徽章的人,在微软眼里是“人才”还是“义务推销员”?持这类证书以及其他一些大软件公司认证的人,你们还在以为自己是“中国软件业的精英”而感叹“怀才不遇”、工资太少吗?
醒醒吧,朋友。别再用编程不需要理论的话来自欺欺人了,别再用自己的浅薄来教导别人像自己一样浅薄了。我想问问那些称数学、数据结构等基础课程对编程没用的人:
请你们搞清一个概念:是这些理论“没用”,还是你们“没用到”;是你们“没用到”,还是你们的水平根本“用不到”;是你们“不需要用”,还是你们根本“不会用”?
举个例子,操作系统中的工作调度,若工作优先权相同,用什么方法进行调度?当然是“先到先做”——这就是数据结构中“队列”的应用。你们说“用不到”,只怕是因为到目前为止还没机会接触这类“高端编程”的挑战吧?这样的话,那就算了,挣你的钱去,但别再来这里误人子弟,吹嘘什么优秀的程序员不需要理论。
是谁说系统软件发展的黄金时代已经过去了?Linux不就是在MS操作系统雄霸多年的情况下一举成名的吗?中国难道就找不到这样一个机会? 不,如果我们的程序员克服了现在的浮燥与急功近利,我们一样可以在“系统软件”这一软件业的“高端”树立自己的品牌!所以请看下面——

年轻人应该有宏伟的志向
用别人的产品做自己的东西,你永远只是个“高级客户”,成不了真正的开发者。不管你用他国的系统软件开发出多少好的产品,挣了多少钱,只要人家一升级、或一推出新产品,你口袋里的银子连同最后一条小裤叉也会被剥夺得一干二净。你,只不过是一个高级打工仔。
我希望打算进入编程界的朋友们,特别是现在还很年轻的朋友,能有一个比较高的志向。更希望已经进到这行的朋友们能有以“振兴民族软件业”为己任,力争成为中国软件业的“旗手”。
我不赞同方东兴把微软骂得一无是处。更不赞同年轻人学他那样,一赌气而拒绝用微软的产品,拒绝Windows、拒绝VC 、拒绝IE ……
我认为方东兴只是个狭隘的民族主义者。他看到了中国软件业民族的一面,却不愿承认我们落后的一面。毫无根据的“自尊”等于自取灭亡。清朝末年,我们的科技并不落后于西方多少,但我们过分“自尊”的“大国思想”却使我们失去了向其他国家学习的机会。当我们嘲笑西方人的蓝眼睛、大鼻子的时候,他们的坚船利炮,却把我们“央央大国”的皇帝、太后打得满世界逃难。慈禧太后被打得满地找牙的时候,不得不说出“量中华之物力,博与国之欢欣”的龌龊话,此时,她“大国皇太后”的自尊何在呢?前面自尊过了头,事后必遭报应。这报应一持续,就是几百年,直到现在。难道我们还要继续闭门造车,再走老路吗?
我们现在承认微软比我们强,向微软学习,并不等于我们永远要跟在他后面跑!在我们低下头的时候,我们就应该想到,何时能再抬起这颗高贵的头颅!!!而且是“一定”!!!!!自尊不是错,错是错在“太盲目”——妄自尊大,你就要和慈禧一样被打得满地找牙。做为一个大国,一个明智的民族,我们不能讳疾忌医。
年轻人,志当存高远。相信我,当你以民族振兴为己任的时候,封王称帝、富贵荣华,都只不过是千秋伟业的一个副产品。在这个尊重知识、崇尚科学的年代,志向高远的人,永远不必担心自己的“钱途”。
不必讳言,我承认我当初进入编程领域不完全出于兴趣,也有“钱途”方面的考虑。但就好像当年参加八路的战士当中,有些只是报着能吃上军粮或打鬼子报家仇的思想入伍的,但后来却学习了马列,提高了觉悟,转为以兴国救民为目标一样,当我一步步深入到这行以后,当我决定考研并慢慢提高了认识以后,我的目的变了。我觉得应该有个更高的人生目标,更高志向和追求来支持我的行动。这个目标就是:为民族软件业尽一把自己的力。
真心希望你与我同行。

几点建议
建议大家耐下心来先学好理论,然后再选择具体的工具或语言。不过,在所有这一切开始以前,先打好C语言和汇编基础。
能不能得道,就看你在见到别人做出一些花里胡哨的东西时,是不是能坚定信心、耐住寂寞、抵御诱惑了。
一个和我一起学习C语言的人,学完就直接开始玩VC,而我则潜下心来学了些C++和理论方面的东西。早早地,他就能仿照书上用VC做些界面似的东西在我面前炫耀,可后来,当我基础理论的学习告一段落,做个图书管理程序卖了800大洋时,他还只是停留在做“例子程序”的水平上。现在我们谈论起编程,深度早已不可同日而语了。他起跑领先,却落在了后面。
我不敢自以为是,只是想用这个亲身经历告诉大家:学编程,决不可心浮气燥。
 
 
 

2004年09月10日

作者: 刘巍
我始终认为,对一个初学者来说,IT界的技术风潮是不可以追赶的,而且也没有能力去追赶。我时常看见自己的DDMM们把课本扔了,去卖些价格不菲的诸如C#, VB.Net 这样的大部头,这让我感到非常痛心。而许多搞不清指针是咋回事的BBS站友眉飞色舞的讨论C#里面可以不用指针等等则让我觉得好笑。C#就象当年的ASP一样,“忽如一夜春风来,千树万树梨花开”,结果许多学校的信息学院成了“Web 学院”。96,97级的不少大学生都去做Web 了。当然我没有任何歧视某一行业的意识。我只是觉得如果他们把追赶这些时髦技术的时间多花一点在基础的课程上应该是可以走得更远的。

几个误区
 
初学者对C#风潮的追赶其实也只是学习过程中经常遇到的几个误区之一。我将用一些实际的例子来说明这些现象,你可以按部就班的看看自己是不是属于其中的一种或者几种:

认为计算机技术等于编程技术:

有些人即使没有这个想法,在潜意识中也有这样的冲动。让我奇怪的是,许多信息学院的学生也有这样的念头。认为计算机专业就是编程专业,与编程无关的,或者不太相关的课程他统统都不管,极端的学生只要书上没带“编程”两个字他就不看。

其实编程只是计算机技术应用过程中一种复杂性最低的劳动,这就是为什么IT业最底层的人是程序员(CODER)。计算机技术包括了多媒体,计算机网络,人工智能,模式识别,管理信息系统等等这些方面。编程工作只是在这些具体技术在理论研究或者工程实践的过程中表达算法的过程。编程的人不一定对计算机技术的了解就一定很高。而一个有趣的现象是,不少大师级的计算机技术研究者是不懂编程的。网上的炒作和现实中良好的工作待遇把编程这种劳动神秘化了。其实每一个程序员心里都明白,自己这些东西,学的时候并不比其它专业难,所以自然也不会高档到哪里去。

咬文嚼字的孔已己作风:

我见过一本女生的《计算机网络原理》教材,这个女生象小学生一样在书上划满了横杠杠,笔记做得满满的,打印出来一定比教材还厚。我不明白的是,象计算机网络原理这样的课程有必要做笔记?我们的应试教育的确害了不少学生,在上《原理》这一类课程的时候许多学生象学《马列原理》一样逐字背诵记忆。这乃是我见过的最愚蠢的行为。所谓《原理》,即是需要掌握它为什么这样做,学习why,而不是how(怎样做)。极端认真的学生背下以太网的网线最大长度,数据帧的长度,每个字段的意义,IP报头的格式等等,但是忘了路由的原则,忘了TCP/IP协议设计的宗旨。总之许多人花了大量的时间把书背得滚瓜烂熟却等于什么也没学。

在学习编程的时候这些学生也是这样,他们确切的记得C++语法的各个细节。看完了C++教程后看《Thinking in C++》(确实是好书),《Inside C++》,《C++ reference》,this C++, that C++……,然后是网上各种各样的关于C++语法的奇闻逸事,然后发现自己又忘了C++的一些语法,最后回头继续恶补…。有个师弟就跟我说:“C++ 太难了,学了这里忘了那里,学了继承忘了模板。”我的回答道:“你不去学就容易了”。我并没有教坏他,只是告诉他,死抠C++的语法就和孔已己炫耀茴香豆的茴字有几种写法一样毫无意义。你根本不需要对的C++语法太关心,动手编程就是了,有不记得的地方一查MSDN就立马搞定。我有个结论就是,实际的开发过程中对程序语法的了解是最微不足道的知识。这是为什么我在为同学用Basic(我以前从没有学过它)写一个小程序的时候,只花了半个小时看了看语法,然后再用半个小时完成了程序,而一个小时后我又完全忘记了Basic 的所有关键字。

不顾基础,盲目追赶时髦技术:

终于点到题目上来了。大多数的人都希望自己的东西能够马上跑起来,变成钱。这种想法对一个已经进入职业领域的程序员或者项目经理来说是合理的,而且IT技术进步是如此的快,不跟进就是失业。但是对于初学者来说(尤其是时间充裕的大中专在校生),这种想法是另人费解的。一个并未进入到行业竞争中来的初学者最大的资本便是他有足够的时间沉下心来学习基础性的东西,学习why 而不是how。时髦的技术往往容易掌握,而且越来越容易掌握,这是商业利益的驱使,为了最大化的降低软件开发的成本。但在IT领域内的现实就是这样,越容易掌握的东西,学习的人越多,而且淘汰得越快。每一次新的技术出来,都有许多初学者跟进,这些初学者由于缺乏必要的基础而使得自己在跟进的过程中花费大量的时间,而等他学会了,这种技术也快淘汰了。基础的课程,比方数据结构,操作系统原理等等虽然不能让你立马就实现一个linux(这是许多人嘲笑理论课程无用的原因),但它们能够显著的减少你在学习新技术时学习曲线的坡度。而且对于许多关键的技术(比方Win32 SDK 程序的设计,DDK的编程)来说甚至是不可或缺的。

一个活生生的例子是我和我的一个同学,在大一时我还找不到开机按纽,他已经会写些简单的汇编程序了。我把大二的所有时间花在了汇编,计算机体系结构,数据结构,操作系统原理等等这些课程的学习上,而他则开始学习HTML和VB,并追赶ASP的潮流。大三的时候我开始学习Windows 操作系统原理,学习SDK编程,时间是漫长的,这时我才能够用VC开发出象模象样的应用程序。我曾一度因为同学的程序已经能够运行而自己还在学习如何创建对话框而懊恼不已,但临到毕业才发现自己的选择是何等的正确。和我谈判的公司开出的薪水是他的两倍还多。下面有一个不很恰当的比方:假设学习VB编程需要4个月,学习基础课程和VC的程序设计需要1年。那么如果你先学VB,再来学习后者,时间不会减少,还是1年,而反过来,如果先学习后者,再来学VB,也许你只需要1个星期就能学得非常熟练。

几个重要的基础课程
 
如果你是学生,或者如果你有充足的时间。我建议你仔细的掌握下面的知识。我的建议是针对那些希望在IT技术上有所成就的初学者。同时我还列出了一些书目,这些书应该都还可以在书店买到。说实在的,我在读其他人的文章时最大的心愿就是希望作者列出一个书单。

大学英语-不要觉得好笑。我极力推荐这门课程是因为没有专业文档的阅读能力是不可想象的。中文的翻译往往在猴年马月才会出来,而现在的许多出版社干脆就直接把E文印刷上去。学习的方法是强迫自己看原版的教材,开始会看不懂,用多了自然熟练。吃得苦下得狠心绝对是任何行业都需要的品质。

计算机体系结构和汇编语言-关于体系结构的书遍地都是,而且也大同小异,倒是汇编有一本非常好的书。《80×86汇编语言程序设计教程》(清华大学出版社,黑色封面,杨季文著)。你需要着重学习386后保护模式的程序设计。否则你在学习现代操作系统底层的一些东西的时候会觉得是在看天书。

计算机操作系统原理-我们的开发总是在特定的操作系统上进行,如果不是,只有一种可能:你在自己实现一个操作系统。无论如何,操作系统原理是必读的。这就象我们为一个芯片制作外围设备时,芯片基本的工作时序是必需了解的。这一类书也很多,我没有发现哪一本书非常出众。只是觉得在看完了这些书后如果有空就应该看看《Inside Windows 2000》(微软出版社,我看的是E文版的,中文的书名想必是Windows 2000 技术内幕之类吧)。关于学习它的必要性,ZDNET上的另一篇文章已经有过论述。

数据结构和算法-这门课程能够决定一个人程序设计水平的高低,是一门核心课程。我首选的是清华版的(朱战立,刘天时)。很多人喜欢买C++版的,但我觉得没有必要。C++的语法让算法实现过程变得复杂多了,而且许多老师喜欢用模块这一东西让算法变得更复杂。倒是在学完了C版的书以后再来浏览一下C++的版的书是最好的。

软件工程-这门课程是越到后来就越发现它的重要,虽然刚开始看时就象看马哲一样不知所云。我的建议是看《实用软件工程》(黄色,清华)。不要花太多的时间去记条条框框,看不懂就跳过去。在每次自己完成了一个软件设计任务(不管是练习还是工作)以后再来回顾回顾,每次都会有收获。

Windows 程序设计-《北京大学出版社,Petzold著》我建议任何企图设计Windows 程序的人在学习VC以前仔细的学完它。而且前面的那本《Inside Windows 2000》也最好放到这本书的后面读。在这本书中,没有C++,没有GUI,没有控件。有的就是如何用原始的C语言来完成Windows 程序设计。在学完了它以后,你才会发现VC其实是很容易学的。千万不要在没有看完这本书以前提前学习VC,你最好碰都不要碰。我知道的许多名校甚至都已经用它作为教材进行授课。可见其重要。

上面的几门课程我认为是必学的重要课程(如果你想做Windows 程序员)。

对于其它的课程有这样简单的选择方法:如果你是计算机系的,请学好你所有的专业基础课。如果不是,请参照计算机系的课程表。如果你发现自己看一本书时无法看下去了,请翻到书的最后,看看它的参考文献,找到它们并学习它们,再回头看这本书。如果一本书的书名中带有“原理”两个字,你一定不要去记忆它其中的细节,你应该以一天至少50页的速度掌握其要领。尽可能多的在计算机上实践一种理论或者算法。

你还可以在CSDN上阅读到许多书评。这些书评能够帮助你决定读什么样的书。

日三省乎己
每天读的书太多,容易让人迷失方向。一定要在每天晚上想想自己学了些什么,还有些什么相关的东西需要掌握,自己对什么最感兴趣,在一本书上花的时间太长还是不够等等。同时也应该多想想未来最有可能出现的应用,这样能够让你不是追赶技术潮流而是引领技术潮流。同时,努力使用现在已经掌握的技术和理论去制作具有一定新意的东西。坚持这样做能够让你真正成为一个软件“研发者”而不仅仅是一个CODER。

把最多的时间花在学习上
这是对初学者最后的忠告。把每个星期玩SC或者CS的时间压缩到最少,不玩它们是最好的。同时,如果你的ASP技术已经能够来钱,甚至有公司请你兼职的话,这就证明你的天份能够保证你在努力的学习之后取得更好的收益,你应该去做更复杂的东西。眼光放长远一些,这无论是对谁都是适用的。

相信你已经能够决定是否学习C#或者什么时候去学它了。

 

2004年07月30日

* 比较宽的知识面,并且能够时时补充自己的知识和完善自己的知识结构

* 耐心好,特别是在调试和学习阶段,世界上没有聪明的人只有刻苦的人。做开发其实
就两件事情学习和改错,在这两件事情中间的开发过程其实是比较简单的

* 永远记住:代码是给人看的而不是给机器运行的,计算机在执行程序时是不怕累的,
而人在看代码时是非常累的

* 良好的编码习惯,至少保证自己能够随时看懂几个月前自己所写的代码

* 尽量让你的代码能够很容易的被别人理解,写代码时想想你会不会在两个月后被别人

* 不要容忍自己犯重复的错误和写重复的代码

* 知道如何做比得到代码更重要

* 尽量不要做已经有很多人已经做过的事情

* 学会尊重别人的开发成果,除非不得已不要下决定全面替换以前的系统

* 珍惜自己的时间与工作成果,尽量让别人分享自己的开发成果

* 避免假设,多思考极端情况与引起错误的可能性,努力减少低级错误

* 不要相信至少是不要轻信自己为自己所做的测试结果

* 懂得坚持自己的开发思路,并懂得理解与吸收别人的思想

* 学会与其他人保持一致,但不能放弃自己的开发特色

* 懂得向你周围的人学习,不论是开发能力上的还是开发经验上的

* 懂得软件结构的的重要性,分析代码前先分析代码的结构

* 学会总结,定期总结自己所学会的知识,看看自己前段时间因为各种原因所浪费的时

* 学会计划,尽量不要认为通过延长自己的工作时间来完成任务

* 学会正确估计自己的能力和工作时间

下面这些是我认为一些比较适合我自己的方面,不一定对每个人都合适:

* 多看些杂志,没事情的时候可以看看以前看过的参考书,书中很可能有你以前没有注
意到的一些细节

* 不要太早去做一些与开发无关的事情,因为学习的黄金时期是很短暂的

* 学会分析别人的系统,多看看别人所开发的系统的先进的一面。这里包括别人的开发
思路,实现时所采用的结构

* 时常感到自己将被淘汰,经常埋怨自己的不努力

* 知道自己缺少什么

* 强迫自己做一些自己不喜欢做的事情,比如说写文档

* 能够有勇气重写自己所开发的系统,但当你重做时你应该采取和前一次不同的工作方
式和方法,否则重做就没有必要

* 将问题简单化而不是复杂化

* 将维护时会产生的一部分问题转移到开发时或是设计时来解决

* 有时候也不妨问问自己:我不做开发时去做什么

* 坚持为自己做每周的开发计划,在事情没有做完以前不要轻易转移自己的注意力

* 尽可能多的将你所做的教给别人,因为你有一天可能不再负责这个系统

* 做事一定要有始有终,除非是有不得已的理由否则不要在工作完成前提前离开

* 不要将你为公司做的东西带走,你因该带走的是开发经验和对开发的认识而不是代码
和产品

* 感到累时就休息一下,给自己放个假也无妨,毕竟人不是机器

  做程序员很累的,够你受的,加油吧!

1)学习应该从基础打起,不要一开始就尝试最高深的技术。

2)每看一本书,不要说这章我以前学习过了,也掌握的很好,因此我可以跳过这一章看
更重要的了。

3)对于作业,遇到不会的尽量不要立刻向别人请教。如果实在解决不了的问题,可以先
完成你会的,然后把一些特别的难点提炼出来,向高手请教。

3)不要指望书本和行家能帮你解决一切问题,因为并不是所有问题都能由别人教给你。

4)向别人请教问题应该把问题说明白。对于错误提示信息应该原样提供出来,不要按自
己理解的信息提供。因为既然你自己做不了,说明你理解一般都有问题。

5)问问题最好能带代码。

6)不要说“编译通过,可是运行时…”,因为编译错误和运行错误可能根本没有关系。
一般来说,编译是语法问题,而运行是逻辑问题。

7) 书看千遍不如做程序一遍,应该尽量尝试去写程序。

8)做程序千个不如做好程序一个。应该尽量完善你现在做的程序,而不要不断开新的计
划,而每个计划都虎头蛇尾。

9)要想到你不是一个人写程序,而是和大家一起写程序。

10)高深的技巧虽然显示了高深的本领,但是对于合作往往是有害的,应该尽量写出简
单易读的代码。

11)编制程序应该尽量做到自注释,即代码本身一读就懂,好象自己在说明自己的逻辑
一样。

12)复杂的代码如果实在做不到自注释,应该给出适量的注释。

13)注释在修改代码的时候应该相应修改,不能用陈旧的注释去误导别人。

14)代码应该尽量可重用,相同功能的代码应该由相同的函数完成,重要函数应该给出调
试信息,以便调试时及早发现问题。

15)应该尽量写小函数,每个函数尽量不要超过40行或者更少。这样不用滚动屏幕也许
就可以读完整个函数。

16)对于switch语句,尽量不要有过多的分支,如果分支太多,可以考虑用跳转表。

17)尽量少使用一些有争议的语句,如goto和三目运算符,既然有争议,它肯定有一定
的缺点。

18)对于goto,许多工程师技术高到可以合理使用,而不至于导致问题。但是你的程序
并不一定给你同水平的人看和修改,他们可不能保证合理的读和修改这些相关代码。

19)代码编写时应该有一定的格式,其基本要求是对理解代码有一定帮助。

20)如果数据是多个模块共有的,应该提供一个封装的类来管理它,并提供一个合适的
接口给各个模块。这样,如果数据内容有重大修改,则只要接口不变,基本上可以保证
程序不要很复杂的修改。

21)应该尽量考虑到数据的并发控制。

22)数据的并发控制应该封装在接口内,而不要暴露给其他模块,这样可以减少因为并
发原因导致的程序死锁。

23)数据本身结构不可以太复杂。应该尽量把不相关的数据分割成为两组数据。

24)对于数据量比较大的情况,应该考虑数据库。

25)数据库接口应该采用标准ODBC或者ADO接口,尽量不要根据实际数据库DBMS提供的接
口来处理,因为你可能在实际使用中更换DBMS。

26)小的数据可以考虑文件,文件路径应该必须设计成相对路径。

27)在一个函数中,应该尽量打开文件后使用完后立刻关闭,这样其他程序可能使用文
件。

28)不要尝试把文件全部读到内存中,应该分次处理大文件。

29)编写程序应该提供相关的测试程序,以提供测试手段。

30)应该考虑代码、函数的使用情况,不要超越函数可以使用的范围使用之。

2004年07月05日

做为一名大四的学生,我面试过不少的单位,有成功的也有失败的,但是对我来说所有的失败在某种意义上都是一种成功,特别是我下面写的这些,写这篇文章的时候,我已经签了南京的一家软件公司,但是想起今年2月21日我面试苏州台湾的IT公司的经历联想到我们现在 
学习编程的一些情况我真的深有感触,这次面试使我深深的体会到了失败但也收获了很多。我要说的将分成三部分,
1.是我面试的具体经过
2.是由面试想到的
3.现今我应该做的。
当然这些话很大程度上是我个人的意见,不可能完全得到大家的赞同,所以在某些观点上如果哪位朋友觉得跟我的有很大出入,请不要介意,也不要对我攻击,就当我没有说过,欢迎和我联系共同探讨这些问题!我的EMAIL:wutao8@263.net 
1.面试经过 
大约在年前我接到了台湾瑞晟(Realtek)苏州公司的面试通知,通知我2月21日到苏州工业园区面试,接到面试后的几天我把一些专业 
课温习了一遍,特别是C++和数据结构,由于大学几年里,我一直专研这些方面,加上通过了高级程序员的考试,对于一些常用的算法 
我差不多也达到了烂熟于胸的地步,当时的感觉是如果问了我这些方面的问题我应该是没有问题的! 
21日那天我被安排在4:30面试,由一位技术人员单独给我面试,在问了一些简单的问题之后他给我出了一道编程题目,题目是这样的: 
(由于具体面试的题目比较烦琐,我将其核心思想提取出来分解成了两个独立的简单的问题,有可能问题分解的不当,请大家见谅,实际面试了一个的问题但比其复杂很多,而且涉及一些高等数学变换) 
1) 写一个函数计算当参数为n(n很大)时的值 1-2+3-4+5-6+7……+n 
哼,我的心里冷笑一声!没想到这么简单,我有点紧张的心情顿时放松起来! 
于是很快我给出我的解法: 
long fn(long n) 

long temp=0; 
int i,flag=1; 
if(n<=0) 

printf(“error: n must > 0); 
exit(1); 

for(i=1;i<=n;i++) 

temp=temp+flag*i; 
flag=(-1)*flag; 

return temp; 

搞定!当我用期待的目光看着面试官的时候,他微笑着跟我说,执行结果肯定是没有问题!但当n很大的时候我这个程序执行效率很低,在嵌入式系统的开发中,程序的运行效率很重要,能让CPU少执行一条指令都是好的,他让我看看这个程序还有什么可以修改的地方, 
把程序优化一下!

听了这些话,我的心情当时变的有点沉重,没想到他的要求很严格,之后我对程序进行了严格的分析,给出了改进了的方案! 
long fn(long n) 

long temp=0; 
int j=1,i=1,flag=1; 
if(n<=0) 

printf(“error: n must > 0); 
exit(1); 

while(j<=n) 

temp=temp+i; 
i=-i; 
i>0?i++:i–; 
j++; 

return temp; 

虽然我不敢保证我这个算法是最优的,但是比起上一个程序,我将所有涉及到乘法指令的语句改为执行加法指令,既达到要题目的要求而且 
运算时间上缩短了很多!而代价仅仅是增加了一个整型变量!但是我现在的信心已经受了一点打击,我将信将疑的看者面试官,他还是微笑着 
跟我说:“不错,这个程序确实在效率上有的很大的提高!”我心里一阵暗喜!但他接着说这个程序仍然不能达到他的要求,要我给出更优的 
方案!天啊!还有优化!我当时真的有点崩溃了,想了一会后,我请求他给出他的方案!然后他很爽快的给出了他的程序! 
long fn(long n) 

if(n<=0) 

printf(“error: n must > 0); 
exit(1); 

if(0==n%2) 
return (n/2)*(-1); 
else 
return (n/2)*(-1)+n; 

搞笑,当时我目瞪口呆,没想到他是这个意思,这么简单的代码我真的不会写吗,但是我为什么没有往那方面上想呢!他说的没有错,在n很大很大的时候这三个程序运行时间的差别简直是天壤之别!当我刚想开口说点什么的时候,他却先开口了:“不要认为CPU运算速度快就把所有的问题都推给它去做,程序员应该将代码优化再优化,我们自己能做的决不要让CPU做,因为CPU是为用户服务的,不是为我们程序员服务的!”多么精辟的语言,我已经不想再说什么了

接着是第二个问题:
2),他要求我用一种技巧性的编程方法来用一个函数实现两个函数的功能n为如:fn1(n)=n/2!+n/3!+n/4!+n/5!+n/6! 
fn2(n)=n/5!+n/6!+n/7!+n/8!+n/9! 现在用一个函数fn(int n,int flag)实现,当flag为0时,实现fn1功能,如果flag为1时 
实现fn2功能!他的要求还是效率,效率,效率!说实在话,如果我心情好的话我应该能给出一种比较好的算法,但我那时真的没有什么心思 
再想了,我在纸上胡乱画了一些诸如6!=6*5!的公式后直截了当的跟他说要他给出他的答案!面试官也没有说什么,给出了他的思路: 
定义一个二维数组 float t[2][5]存入[2!,3!,4!,5!,6!},{5!,6!,7!,8!,9!]然后给出一个循环: 
for(i=0;i<6;i++) 

temp=temp+n/t[flag]; 

最后得到计算值!呵呵,典型的空间换时间的算法! 
这些总共花了50分钟的时间,还有十分钟我就跟他很随意的聊聊天,聊了一些编程以及生活的问题,那时的我已经很放松了, 因为我知道这次面试结果只有一个:失败。5:30的时候面试官要我等通知,于是我离开了他们公司。这就是面试的整个经过!

2.由面试想到的 
真的是很失败啊!我记得那天下好大的雨,气温也很低,我边走边想,从5:30一直走到7:30,全身都湿透了,又冷又饿,但是我只是一直走,脑子里面充满了疑惑,我也想让雨把自己淋醒!看到这里有些朋友可能觉得那些面试题目不算什么如果让自己做的话肯定能全部答对,我肯定相信你,因为我从未怀疑过中国程序员的能力,我认为中国有世界上最好的程序员,我也从未认为自己是高手,所以我做不出来不代表中国程序员比台湾或者别的地方的程序员差,所以我就从我的角度,我的所见所想来谈一些感想: 
不错全世界都有优秀的程序员,中国也不例外,但是我疑惑的是:到底中国和台湾或者国外的优秀的程序员的比例到底是多少?台湾我不知道,中国100个程序员里有几个是优秀的呢?我根本算不上,从上面的表现就足以说明一切了!是1个?5个?10个?50个?这个数字我不敢乱猜,恐遭网友一顿痛骂,那么我们国内有多少人学习计算机呢?拿我们学校来说,计算机97级4个班,98级5个班,99级10个班,2000级17个班,人多了,老师怎么办?我们学校的做法是让研究生上课,然后呢?补考一抓一大把,大把大把的补考费落入了学校的口袋,还说现在的学生素质低!真是好笑,我都不知道学校这么做是为了什么,为国内培养大量的程序员吗?学生们能真正学到计算机知识吗?好了,我敢讲,在我们学校学习编程学生和优秀程序员(注意我指的是优秀,只会编几个糟烂程序的人算不上)的比例应该是100:0.1

在这种比例下虽然我们中国学习编程的人铺天盖地,但是想想有多少个人能真正为中国软件业发展作出贡献,有多少人能真正写出优秀的程序名扬海外! 
我从学习编程以来,不管是自学还是老师指导,从来都是解决问题就好,编出程序来就行,我的疑惑是:我们有真正的强调过程序的效率,程序的质量吗?我们有仔细分析过我们写的东西,看看有没有可以改进的地方,看看有没有简单的方法来达到同样的目的呢?我问心自问,我发现,我从来没有对我写出来的程序进行过优化,最多就是进行详细的测试,然后Debug,但是这就足够了吗?这些天我偶尔发现我曾经写过的一个游戏,那是一年前我刚加www.vcroad.net做为其中一员时候,感觉应该拿点东西出来,然后花了一个星期的时间写出来的!程序不算复杂,但是用到了不少数据结构的东西,也用到了一些精彩的算法,加上windows的界面和游戏的可玩性,写完后受到了不少好评,我当时真的很佩服自己!但是现在看呢:没有一句注释,好多丑陋的函数名比如:void chushihua(),好多没有必要的变量,可以用简单语句完成工作的我使用华丽的算法,大量使用全局变量…..,说不好听的话,六百多行的程序除了能运行之外就是一陀屎!如果一年前我能听到一些反面意见的话,大概我能早一点觉悟,但是自从原代码在网站发布以来听到的都是赞美之词,没有一个人向我提出程序改进的意见,这又说明了一个什么问题呢?很值得思考啊! 
还有一个疑惑是:我们说的和做的真的一样吗?我在学校的时候曾经受学院指派承办过一个计算机大赛,请了一个老师出决赛的题目,主要是一些算法题目,这个老师可能是我上大学以来唯一敬佩的老师了,从程序调试到打分,对于每个程序都仔细分析其时间效率和空间效率,然后综合打分,四十个人的卷子,老师从下午三点一直调试到晚上十点,在有些写的精彩的语句后还加上批注。我真是高兴很遇到这样的老师并且和他做深入的交流,但在事后,却发生了一件不愉快的事,在比赛中获得第二名的学生找到我,说他程序全部调试成功应该给他满分,并且应该得第一,我说不过他,最后调出了他的原程序和第一名的原程序对比,不错,两个程序都运行的很好,这时,那个同学开口了:“我的程序写的十分简捷明了,仅仅数行就完成了题目要求,而他的却写了一大堆,为什么给他的分多过给我的分。”我当时很是气愤,如果不是老师负责的话,那么现在第一名和第二名的位置真的要互调了,拜托,不是程序的行数越少程序的质量就越高,我记得我跟他大谈这方面的道理,最后说服他了!哈哈,但是我,只能说说而已,我不知道还有多少人一样,说起来头头是道,但心里却压根就从未重视过它! 

3.我打算做的! 
其实那天我想到的远不止上面那么多,但是我不想再说了,因为我猜想看这篇文章的网友大概都有一肚子的感想,一肚子的抱怨,借用这篇文章发泄可不是我想达到的目的,在上面我把自己骂的一文不值也不是妄自菲薄,但是在某些方面我真的做错了,或者说是偏离了正确方向,现在是矫正方向和重整旗鼓的时候了,就象我前面说过的,我相信中国有世界上最好的程序员,我也相信我的水平不会一直保持现状,我现在就收拾起牢骚真正的实干起来!
真的很巧,就写到这里的时候我在网上偶尔发现了这篇手册,我不知道这预示着什么,但是我想如果我照下面这个基本原则一直踏实做下去,我一定会实现我的理想—一名优秀的软件设计师! 
(下面这些文字不是我的原创,是我偶尔在网上发现的,我真的很幸运能看到这些,这篇文章也随着下面的文字而结束,我真心的希望您能从这篇文章中得到启发,这篇文章欢迎大家随意转载,您可以不写作者是谁,但是请您写www.vcroad.net原创,谢谢您的支持) 
作者:金蝶中间件公司CTO袁红岗 
不知不觉做软件已经做了十年,有成功的喜悦,也有失败的痛苦,但总不敢称自己是高手,因为和我心目中真正的高手们比起来,还差的太远。世界上并没有成为高手的捷径,但一些基本原则是可以遵循的。 
  1. 扎实的基础。数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握他们,很难写出高水平的程序。据我的观察,学计算机专业的人比学其他专业的人更能写出高质量的软件。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。 
  2. 丰富的想象力。不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想象力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。另外,多看科幻电影也是一个很好的途径。 
  3. 最简单的是最好的。这也许是所有科学都遵循的一条准则,如此复杂的质能互换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc2。简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。 
  4. 不钻牛角尖。当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,而且是那种极暴力的打斗类游戏,当负责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。 
  5. 对答案的渴求。人类自然科学的发展史就是一个渴求得到答案的过程,即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念,一定要找到问题的答案,你才会付出精力去探索,即使最后没有得到答案,在过程中你也会学到很多东西。 
  6. 多与别人交流。三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。多上上网,看看别人对同一问题的看法,会给你很大的启发。 
  7. 良好的编程风格。注意养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致。大家都知道如何排除代码中错误,却往往忽视了对注释的排错。注释是程序的一个重要组成部分,它可以使你的代码更容易理解,而如果代码已经清楚地表达了你的思想,就不必再加注释了,如果注释和代码不一致,那就更加糟糕。 
  8. 韧性和毅力。这也许是”高手”和一般程序员最大的区别。A good programming is 99 weat and 1ffee。高手们并不是天才,他们是在无数个日日夜夜中磨练出来的。成功能给我们带来无比的喜悦,但过程却是无比的枯燥乏味。你不妨做个测试,找个10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条。


[前言:]软件业在国内热了起来,程序员也抢手了,程序员高额的薪水吸引了越来越多的人加入程序员行列。程序员的经历也是很多准程序员们急于想知道的,本文特选了四个具有代表性、取得了一定成功的程序员,他们的程序人生和总结的经验或许对准程序员们有一定的启发。
Fishman:程序员到CEO

  Fishman接受采访时说,”我除了能编写程序之外,一无是处。”其实,Fishman从”IT蓝领”到”IT白领”,经历了程序员→项目主管→开发经理→CTO→CEO的历程。做一个成功的程序员,不但要考虑如何让代码转化为产品,还得预见转化出的产品的市场占有率。技术不能墨守成规,需要推陈出新。如何把握,这就需要你对技术发展有一种预见性,而他具备这种能力。在他看来,发掘的旅程,不在于发现新大陆,而在于发现新视野。Fishman对技术的超前敏感,从”IT蓝领”到”IT白领”,一切都显得那么自然。

  出师获胜

  Fishman属于科班出生的程序员,进入大学第一学期,就有了自己的第一部作品,是用Pascal编写的”Hello world!”程序,虽然简单,却是开始。此后的日子里,Fishman经常泡在系里的电脑机房,从《计算机世界》、《电脑》和《中国计算机用户》等专业报刊中吸取营养,并用于实践。Fishman刚开始是依样画葫芦,渐渐地有了自己的思维,逐渐懂得软件开发是一项非常辛苦的工作。尽管很累,但”求伯君,王志东,鲍岳桥等人的开发事迹,让我看完之后就觉得热血沸腾。软件开发就是靠无数个日夜的血汗凝铸,就是追求完美的艺术。他们登峰造极的技术水平就是我一直追寻的梦。许多年来,这种动力一直驱使我为中国的软件行业而努力。”Fishman能够取得今天的成功,与这种信念不无关系。

  94年,对Fishman来说,是他走向成功的一个转折点。他的导师–著名计算机专家吴恭顺教授把《南粤多媒体开发平台》的项目交给了他。当时随着Windows编程和多媒体技术的兴起,出现了许多各种题材的多媒体光盘, Fishman就根据这种发展现状,使用原型开发工具技术,成功地完成了《南粤多媒体开发平台》(可以用这个工具制作多媒体光盘,软件演示和多媒体课件等等。)并且通过了广东省科委专家的鉴定,并在1995年广东省高校杯软件比赛得第一名,且获得《计算机世界》奖学金。后来这个软件还代表暨南大学参加1995年12月在武汉大学举行的”挑战杯”全国大学生竞赛,并取得了广东省高校历年来最好成绩。这是Fishman的第一次大获全胜! 

  创业

  一个香港的富商看上了Fishman的能力,给了30万,帮助他在1995年底开设了自己的第一个公司–广州飞鹰电脑公司,最初公司只有三个人。Fishman带着初生牛犊不畏虎的创业激情投入到飞鹰3.0(即《南粤多媒体开发平台》的升级版)的开发当中,他把自己汗流浃背地关在屋子里几个月,终于完成了。负责飞鹰3.0的推广,吴恭顺老师给了他很多帮助,包括让飞鹰获得很多合作伙伴、参与很多演示和评选活动,并获得很多奖,这些都是老师帮助他完成的。

  飞鹰3.0的成功是Fishman最高兴的事,”我一个人编写的软件–飞鹰3.0版在97年底获得了中国PC应用软件大奖赛工具类的第一名,这是对我程序员生涯和技术水平的最大肯定。”也因为飞鹰3.0带来的机遇,Fishman强烈要求开发飞鹰4.0版。遗憾的是,他没有把它做起来,其中重要的原因是与投资方意见不合。98年7月,随着飞鹰4.0版的夭折,心力交瘁的他病倒了,最后选择了离开。可以说,正是”飞鹰”,成为了Fishman再一次的转折点。 

  网络风暴开始悄无声息的刮了起来,99年1月,Fishman加盟了刚成立的博大国际互联网公司,成为了博大公司的第二位员工。当时邮件列表引擎在国内还不成熟,但是Fishman感觉到这个会有前途,于是,在他的带领下,博大推出了邮件列表引擎、调查引擎、域名转向和网络辞海等产品。 

  当Fishman遇上了中文热讯的创始人之一的陈仲文后,两人对软件的热爱和共同的想法促成了他们决定一起创业,成立了仙童数码科技有限公司(CNTOMI.COM),Fishman任CTO。在仙童数码,他将自己的理念灌注其中,每个职位都准备一份工作职责范围、日常工作内容和工作规范。把如何做好该工作岗位,如何书写工作报告,如何制订工作计划等内容都通过规范文档详细做好。他强调团队作战能力,市场部及产品部携手负责产品开发的前期准备工作,开发部准备需求分析、技术可行性分析和系统分析文档,然后提供工作文档给质检部和产品部。开发部负责程序编写,质检部准备测试文档,产品部设计网站界面。编码和测试交替进行,当产品质量达到要求后,才发布新的软件产品。靠着Fishman的理念,仙童数码取得了成功。

  看着自己一手带大的仙童数码更加不断的成熟和发展,他的内心却充满着另外一种渴望。因为他的游戏情节,Fishman卖掉了自己在仙童数码的股份,转到了同样是他一手参与创建起来的从事网络游戏开发的天夏科技有限公司,这次担任的是CEO。 

  尽管已经做了CEO,但Fishman对编程仍有很深的情节,他认为做一个程序员,机遇与挑战并存,成败只能亲自去经历和感受。

碧海一舟:超级爱好者

  相对于Fishman这个专业的程序员,碧海一舟应该算作超级的程序爱好者。第一次听说碧海一舟,是在电视上播放2001年3月举行的”首届中国共享软件及自由软件评选活动”上从主持人嘴里听说的。也是那一次,通过电视屏幕见到了这个山东汉子。在评选中,他凭借自己编的共享软件”青岛够级2000扑克游戏”与智能五笔的作者陈虎、foxmail的作者张小龙、网络蚂蚁的作者洪以容等一起获得”优秀开发者”称号。

  286上编出第一个软件

  碧海一舟读大学时虽然在计算机系,但学的是计算机的外部设备,只是作为基础专业课学习了汇编语言、basic、PASCAL等。学习了这些语言后,学硬件的碧海一舟开始喜欢上了编程,”从大学里用DEBUG写汇编,到大学毕业后自学Turbo Pascal,直到现在用的VB,我一直非常喜欢编程,甚至可以说达到入迷的程度。”凭着自己对编程的喜好,碧海一舟在仅有20M的硬盘、10MHz的主频、操作系统为MS-DOS的一台286上完成了他的第一个实用性软件–用汇编语言写的驻留内存程序(主要功能是完成检测电脑的工作状态)。因为硬件的限制和该程序直接对内存和端口操作,经常死机,286重新启动一次得好几分钟,浪费了他不少的时间。一时解决不了的问题他就带着睡觉,半夜醒来,突然想起什么,就一咕噜爬起来,开机再试,如此反复,直到完善地解决问题。 

  调查和推广,成就够级2000

  毕业后,碧海一舟的工作以管理和行政为主,但也经常需要编写一些实用软件,所以学编程都是靠他自己的毅力,利用一点一滴的工作间隙和业余时间来完成。”青岛够级2000扑克游戏” 就是利用业余时间完成的。开始编写之前,他在互联网上做调查,发现网上还没有人编写同类型的软件,而够级扑克玩法因为其有趣、互助、体现高尚的联邦精神等特点,在很多省非常流行,他立即意识到这个软件编好了一定能成功。但由于够级规则非常复杂,对人工智能的要求也较高,实现起来并不容易。而且他刚刚从DOS下的Turbo Pascal编程转移到Windows下的VB编程,对VB也需要重新学习。从编写第一行代码开始,就一直修改。”我编这个软件最初的内核不是完全采用面向对象的编程方法,CPU的资源占用率竟然达到了100%,为此我用了近2个月的业余时间,重新设计了软件的内核,使CPU的平均占用率下降到了20-30%。”

  程序编好了,接下来就是推广。他自己为这个软件专门做了一个网页,然后去一些网站如chinabyte、水木清华等人气比较旺的BBS上宣传。第一次在BBS上宣传后,软件的下载率由0增加到百,碧海一舟意识到这种宣传很有效果,开始和传统媒体如《电脑报》等编辑联络,加上其软件的下载率越来越高,《电脑报》专门介绍了他的软件,通过这个介绍,够级2000的点击率开始猛增。几年下来,碧海一舟在这个共享软件上花费了太多的精力,支撑着他继续做下去的是他坚信”We can,just to do”和二十万用户的期望。

  ”证书只是敲门砖,并不是万无一失”

  虽然获得了”优秀开发者”称号,但是碧海一舟至今也没有报考国家的程序员水平考试。他本人有时倒也想去考微软的MSCD认证,苦于没有时间,一直未能成行。自己虽然没有考过证书,但是他还是希望大学生有机会去考一两门专业的、含金量高的证书,”作为一名大学生,证书是向用人单位证明你能力的一个方面,这是一块有力的敲门砖。但千万不可认为拿到证书就万无一失了,因为实际工作当中,还有许多东西要学:技术水平还需要不断提高,交往能力、语言表达能力、团队协作精神、吃苦耐劳的精神等,还都需要增强和加强锻炼的,而且计算机的新技术层出不穷,一年不学习,恐怕就成了’半文盲’了。”

小林:徒手攀登高峰

  人们常认为要成为程序员要么如Fishman一样是科班出身,要么如碧海一舟一样,以本科的功底起家成为超级的爱好者,但小林与他们都不一样,他像一个在程序编写领域中徒手攀登高峰的登山者,以初中文化功底,靠自学成为一个出色的程序员。他和刘韧、杜红超一道创办知名的”斗牛士”写作社区网站,,负责它的前期设计和后期一些技术支持,现在某无线互联公司从事基于无线互联及PDA的行业解决方案、个性化方面的研发工作。
1993年,小林初中辍学后,家里买了一台电脑,从最基本的DOS学起,把DOS里的基本命令背熟,重装了n(n> 10)遍机器后,对电脑比较熟悉了。当时最为常用的办公软件就是金山WPS软件,打开这个软件就可以看到”作者:求伯君、李明”字样。紧盯着屏幕上的”作者:求伯君、李明”,小林的眼前幻化出了”作者:小林”的字样,这种想法推动着小林更渴望去了解其它程序。   小林开始走上了编程之路。对只有初中文化的小林来说,要啃透那些代码,虽要相当大的毅力,当现在问及小林对当初走上程序员之路有何评价时,他说:”程序员是最能突出’只有偏执狂才可能成功’这句话的人。”从这里也可以看出小林对于程序有着多么执着的热爱。

  ”少年壮志不言愁”。开发出程序,对只有初中文化的小林来说,无疑是困难的。他接触到的计算机知识相对于程序开发来说,皮毛都很难算上,要想开发程序谈何容易?少年不识愁滋味,初生牛犊不怕虎,小林从C语言开始学起,英语水平很低,书上的英文靠查字典读懂。除了读专业书,他还从报刊上获取编程方面的知识,经常到深圳的”赛格市场”和别人交流软件并学习到一些知识,也在那里认识了几个大小林十几岁的开发人员,对他帮助很大。
  
  一般情况下,小林是边看书边操作,把自己认为有用的和自己在运用过程中的心得体会都记在事先准备好的记事本上,并背得滚瓜烂熟。死记硬背虽然不是一个好办法,但对于只有初中文化程度的小林来说却是登堂入室最有效的办法。小林认为:”书,是永远的最忠实的老师,但国内某些专业技术的书出版得要较外语版的晚上一年左右,所以如果能够较好的理解读懂英文资料将占较大的优势,此外在学习的过程中,多看别人的经典的实例程序,编程中就会少走些弯路。”就是到现在,小林在工作中遇到问题,仍然是看书、翻阅杂志、求教有经验的朋友。接触到互联网之后,增加了获取知识的途径,利用搜索引擎到相关的垂直网站、到网上社区去求教,当所有这些途径都无法解决问题时,小林最后才去找人登门求教。

  ”删繁就简三秋树,标新立异二月花。”什么是程序员?也许我们会认为是学会了很多编程语言或者考了程序员证的人,然而小林不这样认为:”程序员不一定必须持有程序员证书,作为程序员最为重要的是具有创新、钻研、好学等精神和能写出好的程序。”小林是完全依靠自学,几乎是在”一穷二白”的基础上开发程序的,创作中所遇到的困难非一般人所能够想象,然而小林坚持下来,并获得了成功,那么是什么力量使小林克服困难、不舍昼夜奋然前行呢?他的回答是:”追求成就感、追求完美!比如做一个同类的程序,某些程序员用100行较复杂的代码完成,而我只用10行代码即可完成等同的功能时,这种小成就感会让我沾沾自喜。”

  ”我拿青春赌明天”?有人说程序员就犹吃青春饭一样,到了30岁还不能做到一个职位,就应该从程序员里退出?小林并不认同这一点,他举例说:”记得今年4月1日《程序员》杂志和中国软件协会举办的一个活动里,原微软公司的戴习为老师及金山公司的雷军,他们提出了程序员可以当一辈子的观点。对于我,未来的职业应该还是会和技术沾边。”对于程序员来说,加班原本很正常,不加班才不正常,做大项目搞封闭式开发是常有的事。而对于小林来说,几乎没有真正很好休息过,如果项目不急,他就会把大量时间用来为升级自己的知识结构、刷新自己能力的读书上。

  ”漫漫长路远,冷冷幽梦情,万水千山独行,找我登天路径,我要把美丽拥抱,摘下闪闪满天星。”忽然觉得这首歌似乎正是为小林的奋斗历程和创业心态而写。 
岑绍辉:我是一个幸运的程序员

  岑绍辉与碧海一舟一样,大学学专业的与程序无关,但又与碧海一舟不一样,成为了一个专业的程序员。

  金山老总雷军曾以”蓬头垢面、衣冠不整、谈吐不清、no money no women……”形容当今的程序员,在程序员中广为流传。但是你要看到岑绍辉本人,你就会打破雷军关于程序员形象描述的定论。笔者在采访他之前,不少朋友都说这是个人物,可能不容易采访得到,其实不然,当笔者对他说出来意,他很爽快地答应了,一点也没有名人的架子,感觉就是身边一个很熟的朋友。

  接触编程是为了女朋友

  当岑绍辉在中国农业大学电力系统自动化专业学习时,计算机课学得不好,那时他怎么也没有想到自己现在会做个程序员,对计算机课,也没有多大兴趣,而正规接触编程,竟是为了女朋友。94年,已经毕业两年的岑绍辉因为女朋友在国外,为了节约国际长话费,就开始琢磨起互联网,打起电信的主意,希望怎样既可以打电话又可以少花钱。有了这个想法,他开始动手写程序。”我学习的第一种语言VFP非常简单,一个星期就差不多弄懂了,也没有细想能不能写出我需要的软件,后来在实际运用中才发现学习的语言知识不够用,遇到编程难题时就狂翻书找答案,也没有人指点,不像现在互联网的资源丰富,很容易在三个人中找到”我师。” 95年岑绍辉终于写出了他的第一个软件也是他当时最需要的freefax(免费国际传真系统)。使用该软件后,自己觉得不错,就把它借给朋友使用,朋友又流传给朋友,freefax就这样流传开来。后来觉得这上面有点商业价值,他就把该软件在电视上宣传了一次,宣传效果出奇的好。”我从开始编程就很幸运,编了一个很实用的软件,也因为当时的环境以及IP通讯的地位成全了我。”岑绍辉对自己第一个软件的成功看成是自己的幸运。

  国外之行:写程序必须严格要求

  免费国际传真系统的成功,为岑绍辉赢得了钱和名声,96年他应邀去新加坡任高级程序员进行大型商业数据库平台开发工作,在新加坡工作、生活了三年,三年的国外生活,使他感慨颇多。在国外工作,见那里的程序员对一个程序反复测试,哪怕一个很小的bug也不放过,因为作为程序员你对某一个bug可以修改,但是绝大部分用户,他们都不会调试程序,对修改等其他工作更不用说了。这一现象他深刻地体会了写程序必须严格要求,编写的时候尽量尽善尽美。

  ”登陆奇兵,为我赢得优秀程序员称号”

  2001年3月的”首届中国共享软件及自由软件评选活动”中,岑绍辉的《登陆奇兵》软件获得最佳商务工具奖,也为他赢得了优秀程序员的称号。说到这项荣誉时,岑绍辉谦虚地认为自己并不是合格的。”我只是比较幸运而已,只是把我自己在实际中需要的用语言编写成程序,对大家都比较实用而已,也才得已推广。”编写《登陆奇兵》前,岑绍辉注册了很多老外的登陆软件,结果都不理想,而登陆软件又必须经常用,于是决定自己开发。”抓住实际运用中灵光一闪的思想,然后实现这种思想,你就成功了。”

  ”程序员不是吃青春饭,年轻应为老年做准备”

  ”程序员不是吃青春饭,也不需要刻意的追求新技术”,在谈到作为程序员的感受时,岑绍辉说了自己的看法。”程序员根本不需要跟着新技术走的,只要能写出好东西、大家需要的东西,用什么语言写不是重要的!最重要的就是创意!有了好的创意,不管你懂不懂程序,不管你的年龄,只要你能通过你的勤奋抓住机会去实现你的创意,你就一定能成功!机会只等待有准备的头脑!” 

  程序员中流行30岁后不做程序员。岑绍辉不这样认为,”30岁不是一个槛,但作为一个优秀的程序员,最好选择在年轻时赚足money和经验。没有任何一个程序员愿意老了再去唱’人生豪迈,只不过是从头再来’。”

  程序员的”三不”主义

  作为一名老一辈的优秀程序员,岑绍辉对成为程序员的后来者说出了他的”三不”主义:”不要成为只能写代码的程序员;不要成为无法与其他人合作的程序员;不要成为只能做程序员的程序员。”他也寄希望所有的程序员不再是眼里只有代码,不再每天像老鼠一样熬夜,摆脱只是见到新的源代码时才兴奋的代码机器。对目前很多人选择程序员的现象,他认为是好现象,但前提是选择程序员这个职业者是真正喜欢程序员的工作,”如果仅仅只是因为程序员高薪而选择,那就是不明智了。”

1. 生活
wrong:每天用两分钟刷牙洗脸,冲出房间的时候扣子还没扣上
right:提前一个小时起床,花五分钟刷牙,洗个澡,挑件干净点的衣服去上班

wrong:每天早晨经过超市买一包烟,我不吃早餐已经很多年
right:经过超市买一听牛奶,其他的根据个人兴趣了

wrong:我吃麦当劳肚子起泡泡了,或者,昨天那箱方便面吃完了。
right:租一个有厨房房子,去超市买现成的菜调剂一下,心情好添一只啤酒,有人来添一双碗筷

wrong:我从来不收拾房间,有必要么,一个人住。
right:一周拖一次地,洗次衣服,收拾房子,环境影响心情;买束花,使用一下芳香剂都不错

wrong:从来没有早于1点睡觉,睡不着,我的眼袋赶上熊猫了。
right:洗个热水澡,就会很困很困了

2. 朋友
wrong:朋友就是在一起吃吃喝喝一起玩闹,除了同事没有什么朋友。
right:在周围有比自己年长的朋友,他可以指导你的人生;在网上有技术上的朋友,可以在工作上给你帮助;有那么一两个损友,干点一个人不敢干的事;有些玩友,空闲的时候不至于无聊;知心朋友么,不好找,QQ上泡七八个MM勉勉强强了。

3. 运动
wrong::一天工作累死了,动也不想动
right:运动是最好的放松

wrong:我想动也动不了了,你瞧我的身材
right:不要不好意思到健身房show你的身材,这样永远没有抬起头那一天

wrong:我对运动从不感兴趣
right:其实运动最容易上瘾了

4. 休闲
wrong:我最大的爱好是当蜘蛛,蹲在网上一动不动。
right:你该出去走走了,或者找本书读读。

wrong:我是路盲,离开住的地方1000m就得打的回去了,并且对住的地方一无所知
right:知道附近去那里看电影,去那里喝茶,去那里有特色的美味

wrong:我不抽烟,也不喝酒
right:你是不是程序员?抽烟可以找到灵感,喝酒可以找到朋友。

5. 爱情
wrong:我相信一见钟情,相信缘分天定,不需要进一步的表示了。
right:算了吧,还是拿出诚意和恒心去打动对方吧,要做吃苦在先享受在后的打算。

wrong:我懒得找女朋友,现在的女子太那个;不要跟我提这个,我头好痛敖~
right:吃不到葡萄就说葡萄酸,更不能逃避内心的欲望

wrong:我也想过,总是碰不上合适的
right:你肯定有看着远去背影直咽口水的,下一次鼓足勇气说小姐可以认识你呢,只要不收到一个耳光就可以继续尝试下去。(当然你首先要帅到她不忍心下手才行)

wrong:我想过了,我想从网络开始,或者看看HGame,Hardcore DVD是怎么样的
right:~!@#$%^&*……还是从现实开始吧。

对了,我相信程序员不是太花心,就是有,也没有时间太花心。

6. 工作
wrong:程序员是青春饭,我什么时候才可以从后山跳出去
right:既入此门,当不做他念,要出去也要打了木人阵从正门出去

wrong:工作时间长,加班也没有加班费,环境也老差,午餐的水果都是烂的
right:我们度过了这个难关,产品上市一切就会好起来。适当的发泄一下,但是不要让谈话在抱怨中结束。

wrong:不用想了,我打赌这样做肯定无法实现! 
right:这中间还有疑点,我先做一个评估,再给您一个详细的文档。说服你的上级,要有凭有据。

wrong:这个问题啊,哎呀,还是交给我来吧。 
right:这里有一些文档你看一下,有问题可以来问我。让新手迅速成长起来成为你的左膀右臂。

wrong:啊,是我忘记checkin了,等一下,现在好了
right:不要在细节的地方重复性的范小错误,虽然不是问题,可会降低自己的威信。

wrong:这个绝对不是我的问题
right:永远不要这么自信

wrong:我的这个模块写得太精湛了,延误了一点时间而已
right:我们成功地抵达了这个里程碑,一切以项目为重。

7. 事业
wrong:天生我才必有用,安得倚天抽宝剑,直挂云帆济沧海,打倒微软,把他踩在脚下,使劲踩,我踩,踩,踩……
right:都一把年纪了,还做梦呢

wrong:我已经烂掉了
right:我不能像他一样烂掉

wrong:一次付出不会成功,但是不懈的付出一定会成功
right:你还经历的起多少失败?

你说我虚伪,我是虚伪,虚伪要是有一颗仁慈的心,就不是虚伪,是虚心.