第一篇:程序员培养心得
中专一年级的第二学期,我决定选择电脑作为我的主攻方向。最开始我选择计算机等级考试作为检验自己能力的一种手段。计算机等级考试只是一种能力的证明。它不与任何职称、待遇挂上勾。二年级的时候,我通过了全国计算机二级考试;同时这一年,我决定选择软件开发作为我今后的道路。三年级的时候,我通过了全国三级(B)。
后来我和老虎了解到国家有一个软件水平与资格考试。它由是软件行业最权威的考试,通过率极低,当时每年的通过率仅在10%左右。不知现在有没有变化。并且它的通过与职称评定相结合。也就是现在常说的以考代评。当时软件水平考试通过的级别与职称的关系是这样子的:
初级程序员 技术员 ;程序员 助理工程师;高级程序员 工程师;系统分析员 高级工程师
通过全国三级(B)以后,我们原打算再报考全国四级的。但了解到软件水平考试后,我们决定放弃全国四级,参加软件水平考试。--正是由于它极低的通过率与相关的待遇吸引了我们去挑战。
买来大纲,研究一番后,我们决定先考程序员。也就是相当于助理工程师一级。那时我们刚18岁,也不知天高地厚。买来几本参考书,一阵乱啃。然而老天呀,没有任何人给我们上过计算机课,编译原理里的那些什么形式语言/制导翻译、数据库原理中的什么模型定义/函数依赖,一开始就把我给弄得昏头转向。但这关总要挺过的。于是我把书看过一遍又一遍,书都翻烂。周六周日就到省图书馆去参考大学计算机专业的教材,竟然后来都看懂了。理论性的东西十分好办。只有理解了,要背要记很容易。
软件水平考试真正有难度的地方是下午场的考试。因为上午考基础知识,大家只要死记硬背就没有什么大问题。下午场考程序设计,题型比较灵活,难度也比较大。那时我已有一定的C语言基础,也用C写过一些小程序。考试要求的一些数据结构实现、算法求解之类的问题觉得比较好对付。例如用递归算法找个什么数列呀,如何用回溯法解决狼怎样才能抓到小羊呀,还有什么猴儿吃桃、皇后走棋、查找排序之类的问题,也挺容易的实现了。对于下午场,我很有把握。
进考场。上午考得还算顺利。一些涉及高数和英语的分数估计会丢掉不少。下午场的考试同样考得很辛苦,那些指向指针的指针七指八指,指得我心慌意乱。不过总的感觉还好。出考场,一对答案,有几成把握能通过。上午场可能比较险点,但估计问题不大;下午场通过肯定是铁定了的。
哪知考试成绩一出来,顿时让我傻了眼。上午场竟然考得奇好,50多分(总分75分),下午场则惨不忍睹,才40多分。老虎和我也差不多,都是输在了下午场。
第二年,我们决定放弃程序员,直接考高级程序员。总结经验,还是在于自己的基础不牢固,准备不充分。这一次,我制订了一个详细的安排表,根据计划安排进度。遇到难题今时求证。不可否认,高级程序员比程序员要难多了。所面对的问题了不再是解决猴儿吃桃那么简单。那段时日时间本来就比较紧张。记得有次晚上躺在床上点烛看书,看得迷迷糊糊之际,蜡烛倒了下来,把书给烧着了。幸亏发现得早。--否则后果不堪设想。我把理论
知识搞定后,然后花大力气对付下午场的程序设计。CASL汇编、测试用例、软件工程方法、C程序的实例应用,我一个一个地来啃。我没有基础,没有人教,甚至连一个可以问的人也没有。学得还是比较艰难和辛苦。但是,每当想起我们现在为之付出的努力对将来是值的时,我们便又恢复了信心。我们利用一切可利用的时间备战。我甚至想方设法通过各种途径弄来历年试卷,一一进行分析。--那个时候,互联网还刚刚起步,不象现在这样要查个资料,通过网络很方便地就搞定了。
同时我们还报了四门自考。我以高程为主。高程在10月12日考试。自考在10月28日开始。这一两个月的努力终于得到了回报:高程和自考全部通过了!
很多朋友经常写信问我怎样应付程序员/高级程序员的考试。就我的经验来说,有这么几点:
1.掌握好的学习方法,合理安排时间。--这是最重要的。
2.基础理论要吃透。对于程序设计,一定要多动手,多实践。
3.一定要找出以前的试卷,进行分析了解。
我想,不论什么事,只要认准了一个目标,然后朝之不懈地努力,就一定实现。考试是这样,干事业是这样,甚至追求爱情也是这样。这个道理,每个人都懂。关键在于实际行动
第二篇:SAS程序员高级程序员考试心得
摘自:http://forum.yorkbbs.ca/showtopic-611095.aspx forcode:一个牛人,34天把初级高级sas认证全过了
SAS程序员/高级程序员考试心得
一、为什么要考SAS程序员/高级程序员
我选择考SAS主要是因为三个原因:其一,我读的研究导向的金融硕士有一门课需要用到SAS,我想先熟悉一下;其二,一位在Hedge Fund工作的前任校友,在介绍求职经验谈到SAS时说The much the better;其三,网上大家的评论都是:SAS是在实业界使用最广泛,雇主最认可的企业级统计软件。那么是不是这样呢,我做了一点研究工作:我打开网站,登录后点击JobSearch,分别输入各个统计相关软件的名称,从而得到和统计软件相匹配的工作的数目如下:
1.SAS: Jobs 1-25 of 2989 matches.2.Stata: Jobs 1-25 of 40 matches.3.SPSS: Jobs 1-25 of 768 matches.4.SPlus: Jobs 1-25 of 26 matches.5.Eviews: Jobs 1-15 of 15 matches.6.Matlab: Jobs 1-25 of 1043 matches
7.tsp: Jobs 1-25 of 76 matches.8.limdep: Jobs 1-3 of 3 matches.9.Minitab: Jobs 1-25 of 224 matches.10.Statistica: Jobs 1-6 of 6 matches.11.Excel: Jobs 1-25 of thousands.由上可见,Excel是使用最广泛的,这也很合理。然后就是SAS和Matlab,其他软件在某个特定领域可能有较广泛的应用,但是在实业界的雇 主认可方面就要差一些。Stata很强大,也很好用(比SAS易学易用),很多搞研究的朋友都用它。但在实业界的认可实在是低了一些。但是有一点要注意,以上只是对SAS的雇主认可程度,不是对SAS认证的认可程度。我感觉这个认证知道的人是不多的。不过得到这个认证应该能够向雇主证明自己在SAS应用方 面达到了专业水准,这就足够了。
我觉得一个东西有用,而且对于自己的职业,自己的job market niche有帮助,就有必要掌握它。古人云,工欲善其事,必先利其器。又有俗语说,磨刀不误砍柴工。能够先系统地把一个软件学习一下,在应用的时候就能节 省大量的时间和精力,也为工作提供更大的灵活性。通过考试以后,事实也证明了我的设想,对SAS的各个模块特别是Macro和Proc SQL的掌握(都是Advanced Programming的内容),给我以后的research project带来很多便利。我只需要所有的输入,然后一切都在SAS中解决,而没有学过SAS的同学就非常吃亏,一边上专业课,一边学SAS。很多 data manipulation一复杂,就傻眼了。只好或者手动操作,或者在Excel做运算,再导入到SAS中进行分析。
潜在的陷阱
SAS程序员/高级程序员考试涉及的是纯编程的内容,完全不涉及SAS的各个功能强大的模块。雇主很可能不了解这一点,我们就有可能获得更多的机 会。但是,自己不要陷入这个陷阱。对雇主所要求的功能模块要熟悉,不要等到要用的时候说,对不起,虽然我是SAS程序员/高级程序员,但是我没有学过这个 模块。
SAS程序员/高级程序员考试并不难,认真看资料,认真看Practice Exam,仔细记笔记。大家投入合理的时间,应该都可以通过。此外,我考SAS是在2006年的夏天,对于资料的时效性以及SAS公司可能有的改动,大家 要注意(这个考试不是太热门,改动即使有也不会太大)。
二、SAS程序员考试心得
我先在网上查了一下SAS认证的信息,看了一下别人的考试心得。主要的网站有:
SAS Certification Home :
等相关网址查看购买方法。
全部准备完毕,花了约14天时间。然后去考试,考试费用同样5折,是US $75(我和SAS联系,得知上次使用的Promotional Code还没有过期,这次在Prometric上注册考试时可以继续使用)。考试也没有什么问题。对于SAS Advanced Programming, 只要认真看了资料4、5、6,考试一定过。
欢迎大家讨论。
因为我家里不能上网,没能及时回复,请谅解。我觉得你不要太着急,如果你觉得SAS对你有帮助,多花
点时间准备也不影响大局。况且现在在网上预约考试很方 便,你完全可以准备好了再预约。我都是复习得差不多了才预约两三天以后的考试。文中的资料1、2、3都是在SASOR网站上下载的。
培训教材下载网址:
Summaries and Quizzes of SAS Online Tutor for Base Programming:
http://sasor.feoh.net/modules.php?name=Downloads&d_op=getit&lid=2
Base Programming Practice Exam
http://sasor.feoh.net/modules.php?name=Forums&file=viewtopic&t=1404&highlight=Practice+Exam&sid=ff7e5483bd780a7cba125f74db103706
我记得我还下载到过答案和解释的,不过现在找不到了。
希望这些能够对你有所帮助。
Alternative Download address
little sas book:
http://newdisk.cn/pick.aspx?code=902832243
SAS online tutor base:
http://newdisk.cn/pick.aspx?code=1951014386
SAS online tutor advance:
http://newdisk.cn/pick.aspx?code=370540326
第三篇:一个C++程序员的心得
六年前,我刚热恋“面向对象”(Object-Oriented)时,一口气记住了近十个定义。六年后,我从几十万行程序中滚爬出来准备写点心得体会时,却无法解释什么是“面向对象”,就象说不清楚什么是数学那样。软件工程中的时髦术语“面向对象分析”和“面向对象设计”,通常是针对“需求分析”和“系统设计”环节的。“面向对象”有几大学派,就象如来佛、上帝和真主用各自的方式定义了这个世界,并留下一堆经书来解释这个世界。
有些学者建议这样找“对象”:分析一个句子的语法,找出名词和动词,名词就是对象,动词则是对象的方法(即函数)。
当年国民党的文人为了对抗毛泽东的《沁园春·雪》,特意请清朝遗老们写了一些对仗工整的诗,请蒋介石过目。老蒋看了气得大骂:“娘希匹,全都有一股棺材里腐尸的气味。”我看了几千页的软件工程资料,终于发现自己有些“弱智”,无法理解“面向对象”的理论,同时醒悟到“编程是硬道理。”
面向对象程序设计语言很多,如Smalltalk、Ada、Eiffel、Object Pascal、Visual Basic、C++等等。C++语言最讨人喜欢,因为它兼容C 语言,并且具备C 语言的性能。近几年,一种叫Java 的纯面向对象语言红极一时,不少人叫喊着要用Java 革C++的命。我认为Java 好比是C++的外甥,虽然不是直接遗传的,但也几分象样。外甥在舅舅身上玩耍时洒了一泡尿,俩人不该为此而争吵。
关于C++程序设计的书藉非常多,本章不讲C++的语法,只讲一些小小的编程道理。如果我能早几年明白这些小道理,就可以大大改善数十万行程序的质量了。
1.C++面向对象程序设计的重要概念
早期革命影片里有这样一个角色,他说:“我是党代表,我代表党,我就是党。”后来他给同志们带来了灾难。
会用C++的程序员一定懂得面向对象程序设计吗?
不会用C++的程序员一定不懂得面向对象程序设计吗?
两者都未必。就象坏蛋入党后未必能成为好人,好人不入党未必变成坏蛋那样。
我不怕触犯众怒地说句大话:“C++没有高手,C 语言才有高手。”在用C 和C++编程8年之后,我深深地遗憾自己不是C 语言的高手,更遗憾没有人点拨我如何进行面向对象程序设计。我和很多C++程序员一样,在享用到C++语法的好处时便以为自己已经明白了面向对象程序设计。就象挤掉牙膏卖牙膏皮那样,真是暴殄天物呀。
人们不懂拼音也会讲普通话,如果懂得拼音则会把普通话讲得更好。不懂面向对象程序设计也可以用C++编程,如果懂得面向对象程序设计则会把C++程序编得更好。本节讲述三个非常基础的概念:“类与对象”、“继承与组合”、“虚函数与多态”。理解这些概念,有助于提高程序的质量,特别是提高“可复用性”与“可扩充性”。1.1 类与对象
对象(Object)是类(Class)的一个实例(Instance)。如果将对象比作房子,那么类就是房子的设计图纸。所以面向对象程序设计的重点是类的设计,而不是对象的设计。类可以将数据和函数封装在一起,其中函数表示了类的行为(或称服务)。类提供关键字public、protected 和private 用于声明哪些数据和函数是公有的、受保护的或者是私有的。
这样可以达到信息隐藏的目的,即让类仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。我们不可以滥用类的封装功能,不要把它当成火锅,什么东西都往里扔。
类的设计是以数据为中心,还是以行为为中心?
主张“以数据为中心”的那一派人关注类的内部数据结构,他们习惯上将private 类型的数据写在前面,而将public 类型的函数写在后面,如表8.1(a)所示。
主张“以行为为中心”的那一派人关注类应该提供什么样的服务和接口,他们习惯上将public 类型的函数写在前面,而将private 类型的数据写在后面,如表8.1(b)所示。
很多C++教课书主张在设计类时“以数据为中心”。我坚持并且建议读者在设计类时“以行为为中心”,即首先考虑类应该提供什么样的函数。Microsoft 公司的COM 规范的核心是接口设计,COM 的接口就相当于类的公有函数[Rogerson 1999]。在程序设计方面,咱们不要怀疑Microsoft 公司的风格。
设计孤立的类是比较容易的,难的是正确设计基类及其派生类。因为有些程序员搞不清楚“继承”(Inheritance)、“组合”(Composition)、“多态”(Polymorphism)这些概念。2回顶部 1.2 继承与组合
如果A 是基类,B 是A 的派生类,那么B 将继承A 的数据和函数。示例程序如下: class A { public: void Func1(void);void Func2(void);};class B : public A { public: void Func3(void);void Func4(void);};// Example main(){ B b;// B的一个对象
b.Func1();// B 从A 继承了函数Func1 b.Func2();// B 从A 继承了函数Func2 b.Func3();b.Func4();}
这个简单的示例程序说明了一个事实:C++的“继承”特性可以提高程序的可复用性。正因为“继承”太有用、太容易用,才要防止乱用“继承”。我们要给“继承”立一些使用规则:
一、如果类A 和类B 毫不相关,不可以为了使B 的功能更多些而让B 继承A 的功能。
不要觉得“不吃白不吃”,让一个好端端的健壮青年无缘无故地吃人参补身体。
二、如果类B 有必要使用A 的功能,则要分两种情况考虑:
(1)若在逻辑上B 是A 的“一种”(a kind of),则允许B 继承A 的功能。如男人(Man)是人(Human)的一种,男孩(Boy)是男人的一种。那么类Man 可以从类Human 派生,类Boy 可以从类Man 派生。示例程序如下: class Human { „ };class Man : public Human { „ };class Boy : public Man { „ };
(2)若在逻辑上A 是B 的“一部分”(a part of),则不允许B 继承A 的功能,而是要用A和其它东西组合出B。例如眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,所以类Head 应该由类Eye、Nose、Mouth、Ear 组合而成,不是派生而成。示例程序如下: class Eye { public: void Look(void);};class Nose { public: void Smell(void);};class Mouth { public: void Eat(void);};class Ear { public: void Listen(void);};// 正确的设计,冗长的程序 class Head { public: void Look(void){ m_eye.Look();} void Smell(void){ m_nose.Smell();} void Eat(void){ m_mouth.Eat();} void Listen(void){ m_ear.Listen();} private: Eye m_eye;Nose m_nose;Mouth m_mouth;Ear m_ear;};
如果允许Head 从Eye、Nose、Mouth、Ear 派生而成,那么Head 将自动具有Look、Smell、Eat、Listen 这些功能: // 错误的设计
class Head : public Eye, public Nose, public Mouth, public Ear { };
上述程序十分简短并且运行正确,但是这种设计却是错误的。很多程序员经不起“继承”的诱惑而犯下设计错误。
一只公鸡使劲地追打一只刚下了蛋的母鸡,你知道为什么吗?
因为母鸡下了鸭蛋。
本书3.3 节讲过“运行正确”的程序不见得就是高质量的程序,此处就是一个例证。3回顶部 1.3 虚函数与多态
除了继承外,C++的另一个优良特性是支持多态,即允许将派生类的对象当作基类的对象使用。如果A 是基类,B 和C 是A 的派生类,多态函数Test 的参数是A 的 指针。那么Test 函数可以引用A、B、C 的对象。示例程序如下: class A { public: void Func1(void);};void Test(A *a){ a->Func1();} class B : public A { „ };class C : public A { „ };// Example main(){ A a;B b;C c;Test(&a);Test(&b);Test(&c);};
以上程序看不出“多态”有什么价值,加上虚函数和抽象基类后,“多态”的威力就显示出来了。
C++用关键字virtual 来声明一个函数为虚函数,派生类的虚函数将(override)基类对应的虚函数的功能。示例程序如下: class A { public: virtual void Func1(void){ cout<< “This is A::Func1 n”} };void Test(A *a){ a->Func1();} class B : public A { public: virtual void Func1(void){ cout<< “This is B::Func1 n”} };class C : public A { public: virtual void Func1(void){ cout<< “This is C::Func1 n”} };// Example main(){ A a;B b;C c;Test(&a);// 输出This is A::Func1 Test(&b);// 输出This is B::Func1 Test(&c);// 输出This is C::Func1 };
如果基类A 定义如下: class A { public: virtual void Func1(void)=0;};
那么函数Func1 叫作纯虚函数,含有纯虚函数的类叫作抽象基类。抽象基类只管定义纯虚函数的形式,具体的功能由派生类实现。
结合“抽象基类”和“多态”有如下突出优点:
(1)应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。这一招叫“以不变应万变”,可以大大提高程序的可复用性(这是接口设计的复用,而不是代码实现的复用)。
(2)派生类的功能可以被基类指针引用,这叫向后兼容,可以提高程序的可扩充性和可维护性。以前写的程序可以被将来写的程序调用不足为奇,但是将来写的程序可以被以前写的程序调用那可了不起。4回顶部 良好的编程风格
内功深厚的武林高手出招往往平淡无奇。同理,编程高手也不会用奇门怪招写程序。良好的编程风格是产生高质量程序的前提。2.1 命名约定
有不少人编程时用拼音给函数或变量命名,这样做并不能说明你很爱国,却会让用此程序的人迷糊(很多南方人不懂拼音,我就不懂)。程序中的英文一般不会太复杂,用词要力求准确。匈牙利命名法是Microsoft 公司倡导的[Maguire 1993],虽然很烦琐,但用习惯了也就成了自然。没有人强迫你采用何种命名法,但有一点应该做到:自己的程序命名必须一致。
以下是我编程时采用的命名约定:
(1)宏定义用大写字母加下划线表示,如MAX_LENGTH;
(2)函数用大写字母开头的单词组合而成,如SetName, GetName ;
(3)指针变量加前缀p,如*pNode ;
(4)BOOL 变量加前缀b,如bFlag ;
(5)int 变量加前缀i,如iWidth ;
(6)float 变量加前缀f,如fWidth ;
(7)double 变量加前缀d,如dWidth ;
(8)字符串变量加前缀str,如strName ;
(9)枚举变量加前缀e,如eDrawMode ;
(10)类的成员变量加前缀m_,如m_strName, m_iWidth ;
对于int, float, double 型的变量,如果变量名的含义十分明显,则不加前缀,避免烦琐。如用于循环的int 型变量i,j,k ;float 型的三维坐标(x,y,z)等。2.2 使用断言
程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。断言assert 是仅在Debug 版本起作用的宏,它用于检查“不应该”发生的情况。以下是一个内存复制程序,在运行过程中,如果assert 的参数为假,那么程序就会中止(一般地还会出现提示对话,说明在什么地方引发了assert)。//复制不重叠的内存块
void memcpy(void *pvTo, void *pvFrom, size_t size){ void *pbTo =(byte *)pvTo;void *pbFrom =(byte *)pvFrom;assert(pvTo!= NULL && pvFrom!= NULL);while(size--> 0)*pbTo + + = *pbFrom + +;return(pvTo);}
assert 不是一个仓促拼凑起来的宏,为了不在程序的Debug 版本和Release 版本引起差别,assert 不应该产生任何副作用。所以assert 不是函数,而是宏。程序员可以把assert 看成一个在任何系统状态下都可以安全使用的无害测试手段。
很少有比跟踪到程序的断言,却不知道该断言的作用更让人沮丧的事了。你化了很多时间,不是为了排除错误,而只是为了弄清楚这个错误到底是什么。有的时候,程序员偶尔还会设计出有错误的断言。所以如果搞不清楚断言检查的是什么,就很难判断错误是出现在程序中,还是出现在断言中。幸运的是这个问题很好解决,只要加上清晰的注释即可。这本是显而易见的事情,可是很少有程序员这样做。这好比一个人在森林里,看到树上钉着一块“危险”的大牌子。但危险到底是什么?树要倒?有废井?有野兽?除非告诉人们“危险”是什么,否则这个警告牌难以起到积极有效的作用。难以理解的断言常常被程序员忽略,甚至被删除。[Maguire 1993]
以下是使用断言的几个原则:
(1)使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。
(2)使用断言对函数的参数进行确认。
(3)在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的
假定,就要使用断言对假定进行检查。
(4)一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐瞒错误。当进行防错性编程时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。5回顶部
2.3 new、delete 与指针
在C++中,操作符new 用于申请内存,操作符delete 用于释放内存。在C 语言中,函数malloc 用于申请内存,函数free 用于释放内 存。由于C++兼容C 语言,所以new、delete、malloc、free 都有可能一起使用。new 能比malloc 干更多的事,它可以申请对象的内存,而malloc 不能。C++和C 语言中的指针威猛无比,用错了会带来灾难。对于一个指针p,如果是用new申请的内存,则必须用delete 而不能用free 来释放。如果是用malloc 申请的内存,则必须用free 而不能用delete 来释放。在用delete 或用free 释放p 所指的内存后,应该马上显式地将p 置为NULL,以防下次使用p 时发生错误。示例程序如下: void Test(void){ float *p;p = new float[100];if(p==NULL)return;„// do something delete p;p=NULL;// 良好的编程风格 // 可以继续使用p p = new float[500];if(p==NULL)return;„// do something else delete p;p=NULL;}
我们还要预防“野指针”,“野指针”是指向“垃圾”内存的指针,主要成因有两种:
(1)指针没有初始化。
(2)指针指向已经释放的内存,这种情况最让人防不胜防,示例程序如下: class A { public: void Func(void){„} };void Test(void){ A *p;{ A a;p = &a;// 注意a 的生命期 } p->Func();// p 是“野指针”,程序出错 } 2.4 使用const
在定义一个常量时,const 比#define 更加灵活。用const 定义的常量含有数据类型,该常量可以参与逻辑运算。例如: const int LENGTH = 100;// LENGTH 是int 类型 const float MAX=100;// MAX 是float 类型 #define LENGTH 100 // LENGTH 无类型 #define MAX 100 // MAX 无类型
除了能定义常量外,const 还有两个“保护”功能:
一、强制保护函数的参数值不发生变化
以下程序中,函数f 不会改变输入参数name 的值,但是函数g 和h 都有可能改变name的值。void f(String s);// pass by value void g(String &s);// pass by referance void h(String *s);// pass by pointer main(){ String name=“Dog”;f(name);// name 的值不会改变 g(name);// name 的值可能改变 h(name);// name 的值可能改变 }
对于一个函数而言,如果其‘&’或‘*’类型的参数只作输入用,不作输出用,那么应当在该参数前加上const,以确保函数的代码不会改变该参数的值(如果改变了该参数的值,编译器会出现错误警告)。因此上述程序中的函数g 和h 应该定义成: void g(const String &s);void h(const String *s);
二、强制保护类的成员函数不改变任何数据成员的值
以下程序中,类stack 的成员函数Count 仅用于计数,为了确保Count 不改变类中的任何数据成员的值,应将函数Count 定义成const 类型。class Stack { public: void push(int elem);void pop(void);int Count(void)const;// const 类型的函数 private: int num;int data[100];};int Stack::Count(void)const { ++ num;// 编译错误,num 值发生变化 pop();// 编译错误,pop 将改变成员变量的值 return num;} 6回顶部 2.5 其它建议
(1)不要编写一条过分复杂的语句,紧凑的C++/C 代码并不见到能得到高效率的机器代码,却会降低程序的可理解性,程序出错误的几率也会提高。
(2)不要编写集多种功能于一身的函数,在函数的返回值中,不要将正常值和错误标志混在一起。
(3)不要将BOOL 值TRUE 和FALSE 对应于1 和0 进行编程。大多数编程语言将FALSE定义为0,任何非0 值都是TRUE。Visual C++将TRUE 定义为1,而Visual Basic 则将TRUE定义为-1。示例程序如下: BOOL flag;„
if(flag){ // do something } // 正确的用法 if(flag==TRUE){ // do something } // 危险的用法 if(flag==1){ // do something } // 危险的用法 if(!flag){ // do something } // 正确的用法
if(flag==FALSE){ // do something } // 不合理的用法 if(flag==0){ // do something } // 不合理的用法
(4)小心不要将“= =”写成“=”,编译器不会自动发现这种错误。
(5)不要将123 写成0123,后者是八进制的数值。
(6)将自己经常犯的编程错误记录下来,制成表格贴在计算机旁边。小结
C++/C 程序设计如同少林寺的武功一样博大精深,我练了8 年,大概只学到二三成。所以无论什么时候,都不要觉得自己的编程水平天下第一,看到别人好的技术和风格,要虚心学习。本章的内容少得可怜,就象口渴时只给你一颗杨梅吃,你一定不过瘾。我借花献佛,推荐一本好书:Marshall P.Cline 著的《C++ FAQs》[Cline 1995]。你看了后一定会赞不绝口。会编写C++/C 程序,不要因此得意洋洋,这只是程序员基本的技能要求而已。如果把系统分析和系统设计比作“战略决策”,那么编程充其量只是“战术”。如果指挥官是个大笨蛋,士兵再勇敢也会吃败仗。所以我们程序员不要只把眼光盯在程序上,要让自己博学多才。我们应该向北京胡同里的小孩们学习,他们小小年纪就能指点江山,评论世界大事。
第四篇:SAS程序员高级程序员考试心得
摘自:http://forum.yorkbbs.ca/showtopic-611095.aspx forcode:一个牛人,34天把初级高级sas认证全过了
SAS程序员/高级程序员考试心得
一、为什么要考SAS程序员/高级程序员
我选择考SAS主要是因为三个原因:其一,我读的研究导向的金融硕士有一门课需要用到SAS,我想先熟悉一下;其二,一位在Hedge Fund工作的前任校友,在介绍求职经验谈到SAS时说The much the better;其三,网上大家的评论都是:SAS是在实业界使用最广泛,雇主最认可的企业级统计软件。
那么是不是这样呢,我做了一点研究工作:我打开www.xiexiebang.com/pick.aspx?code=1951014386 SAS online tutor advance:
http://newdisk.cn/pick.aspx?code=370540326
第五篇:一个老程序员的心得
1个老程序员的心得
[size=4]不知不觉做软件已经做了十年,有成功的喜悦,也有失败的痛苦,但总不敢称自己是高手,因为和我心目中真正的高手们比起来,还差的太远。世界上并没有成为高手的捷径,但一些基本原则是可以遵循的。
1.扎实的基础。数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握他们,很难写出高水平的程序。据我的观察,学计算机专业的人比学其他专业的人更能写出高质量的软件。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。
2.丰富的想象力。不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想象力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。另外,多看科幻电影也是一个很好的途径。
3.最简单的是最好的。这也许是所有科学都遵循的一条准则,如此复杂的质能互换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc2。简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。
4.不钻牛角尖。当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,而且是那种极暴力的打斗类游戏,当负责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。
5.对答案的渴求。人类自然科学的发展史就是一个渴求得到答案的过程,即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念,一定要找到问题的答案,你才会付出精力去探索,即使最后没有得到答案,在过程中你也会学到很多东西。
6.多与别人交流。三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。多上上网,看看别人对同一问题的看法,会给你很大的启发。
7.良好的编程风格。注意养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致。大家都知道如何排除代码中错误,却往往忽视了对注释的排错。注释是程序的一个重要组成部分,它可以使你的代码更容易理解,而如果代码已经清楚地表达了你的思想,就不必再加注释了,如果注释和代码不一致,那就更加糟糕。
8.韧性和毅力。这也许是“高手”和一般程序员最大的区别。A good programming is 99% sweat and 1% coffee。高手们并不是天才,他们是在无数个日日夜夜中磨练出来的。成功能给我们带来无比的喜悦,但过程却是无比的枯燥乏味。你不妨做个测试,找个10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条。
这些是我这几年程序员生涯的一点体会,希望能够给大家有所帮助 做了快三年的程序员了,有一点小体会和大家分享一下.1.好钢是由铁炼成的.一名好的程序员必须经过千锤百炼才行, 挫折是程序员最大的宝,要能承受挫折,战胜挫折,只有不断经受挫折,从挫折中吸取经验,教训,这样你才能成为真正的程序员.2.手是好汉,眼是懒汉.看会不是目的,要会写,勤动手,熟练书写各种常用代码,在学习之初 可以不借助IDE来书写代码,反复练习,熟能成巧,毋庸置疑.3.稳中求胜,小心使得万年船.程序员最忌讳毛躁.代码多,项目大的时候,错误是在所难免的,但低级错误一定不能犯,尽量把错误压到最低,这就要求我们程序员养成稳重,多思维的方式,切忌浮躁,养成良好的书写习惯和正确的思维方式.4.做就做程序员,不要做高级打字员.每个程序员都是从基础学起的,在学的时候一定要把握好方向不要被众多的语言,概念所迷惑,学的是语言,学的是编程思想不要在IDE上下功夫,研究哪个好,哪个坏,要敢于创新,程序是死的人是活的,在活人手里,也要让程序活起来.多学多看数据结构等书多看别人的成型代码,学习别人的思想,使自己成为真正的程序员.5.敢想敢做,持之以恒,一切皆有可能!
一点薄思庸见送给赛迪网java版的初学者们,仅代表本人个人意见,如有任何各位大虾有好的方法或意见可以跟帖提出.java开发八荣八耻
以动手实践为荣,以只看不练为耻。以打印日志为荣,以出错不报为耻。以局部变量为荣,以全局变量为耻。以单元测试为荣,以手工测试为耻。以代码重用为荣,以复制粘贴为耻。以多态应用为荣,以分支判断为耻。以定义常量为荣,以魔法数字为耻。以总结思考为荣,以不求甚解为耻。
从大学开始到现在,学习编程已经四年了,在过去的四年里学了不少的东西,总感觉自已还行吧。怎么着也能找个好的工作。加上在学校表现良好,大专一毕业就顺利应聘上一个政府机构的工作。虽然工资不算多,但也稳定。但总觉得自己有点屈才.一天,见到本市的一家知名软件企业的招聘信息,就把自己从大学三年到现在写过的一些东西简单地写了一份求职信过去(不是想跳槽,只是想测试一下我现在这份工作丢了,在社会上我能够达到什么程度)。
没想到,第二天,那家公司就叫我过去应聘了。感觉很突然,总觉得一些软件公司在人才网站上打一些招聘信息总是借此做大做广告,并不是想招聘人,就是要招聘人,可能因为这种因素的机率都很小吧。(这是我一直以来对人才网站上某些软件公司的招聘信息的看法),不过却增加了几分信心,于是我便兴冲冲的去了。
到了公司,首先就让我填写一张表格,填写完一张表格以后安排一个技术主管过来与我谈,谈的倒不是一些深入的技术问题,我基本上的都能应上来。接着就是上机测试。测试的题目是写一个人员信息的插入、修改、显示。主考官说只需要写一个功能就是,只是希望看看我的编程风格。于是我把数据操作写了一个类,然后在按钮的事件里得到输入框值,组合一个SQL,传到数据操作类里面去执行,然后返回插入结果就可以了。完了,很快搞定。马上叫主考官过来看吧。呵呵,小意思。
主考官过来了,首先就在姓名的地方输入好长的一串字符串,接着一阵乱输,完了,出问题。名字太长了,邮件没有限制,身份证没有限制,生日没有限制,完了,完了,我想,这么点东西,就出问题了,我心里好一阵紧张。还好就是主考官的态度还不错,说:“虽然你做了足够的注释,缩近也注意了,但是却没有对输入的值进行判断,我们这为合理的判断也是好的编程风格,再者,你虽然把数据操作写成了类,但也有很多的改进,一是。。二是。。”说完以后还鼓励我接着写刚才的代码。当时真是很是感动,但感动归感动,说老实话,这些判断平时还真的没有写过多少,都是写一个以后,COPY过去COPY过来的用,现在一时还觉得有些短路,不知道如何是好,然后,就是按钮的事件中写对数值的判断。终于完成了,再看看表,时间距刚开始测试已经快一个小时了。
主考官过来看了,觉得功能都实现了,就叫了公司的一个副经理(后来才知道的)来继续面试我。这个副总就到我到另外的一个会议室去,问了我一些技术概念的问题,结果我基本上都答不过来(我以前觉得我能够用就够了啥,没有太大的必有对这写概念的条款记得这么清楚啥),结果,那位副经理训斥了我一下,说:“你对这些概念都不清楚,怎么了解其间的性能呢,不了解性能如何开发高效率的程序呢?”(整个谈话这句最让我满意,其他的都是“我们是专业的软件公司,很注重软件的性能,编程风格等等如事云云”),最后问了我的薪水要求和能不能适应公司的开发等就叫我回家去等消息。
当然,由于后面没有过关当然也没有应聘得上。更当然,我吸取了这次应聘的经验,总结以下几条来做为以后学习的信条,写出来与大家共勉:
一,学习应该从基础抓起,注意学习的每个细节,争取学精,避免为了开发而开发。
二,在以一门语言为主功语言的同时,要学习一下与之相关的其它技术。
三,长常保持对新技术的关注,了解未来发展的方向,做到有的放矢。
四,多参与项目开发,在项目中发现问题,解决问题,才能更好的了解学习中的细节问题。
五,加强交流,多写文章,多发源码,多收取意见,在交流学习并提高,才能更快了解自已的不足。
六, 永远相信下一个作品是最好的....业余程序员最喜欢做的一件事就是对不同的语言进行比较。Java是否比C++好?C#是否会成为终极语言?凡此种种。从专业程序员的角度看来,这是最低级无趣的游戏。
其一,在项目诸元确定之后,通常并没有选择语言的余地;其二,语言的生存本身就是一个达尔文主义的问题:设若两种语言有明确的可比较性,其中较劣的那一种必定早已被淘汰出局,又何来比较的必要?所以,有“C++之父”美称的Bjarne Stroustrup博士常常声明自己不会拿C++与其他语言比较——偏偏每次接受采访时,必定有外行的记者或听众提出这一类最令他反感的问题,这是题外话,按下不表。
丢开实用主义的观点,从美学(或者说,计算机科学)的角度来看,语言的比较似乎并不像它通常所表现的那么低级。毕竟,既然维特根斯坦反复强调“语言制订游戏的规则”、“凡不可言说者必保持沉默”,可见语言并非仅仅是可通约的思想的映射,语言本身就决定思想的方式。使这个问题显得那么低级而业余的,往往是业余程序员讨论它的方式:仅仅凭着自己对几种语言一知半解的认识、仅仅凭着使用一种语言的习惯、甚至仅仅凭着一种宗教狂热来展开讨论,这样的讨论自然是不值一哂的。
我是不是已经提到了“宗教狂热”这个词?如果说对语言的喜爱(或者憎恶)可以成为一种宗教狂热,就有那么一些人可以凭着宗教般的狂热成为开发高手,Ian Joyner无疑属于这种人。1992年,在Unisys用C++开发UNIXX.500时,Joyner感到C++让他“不自在”,于是就写了一篇题为《C++批判》的报告,张贴在Unisys的内部新闻组上。到此为止,一切都没有什么不同。但Joyner与其他宗教狂热者的区别在于:他有着远为深厚的理论基础,以及锲而不舍的毅力。于是,《C++批判》有了第二版和在Internet上广为流传的第三版。到1998年,这篇典型的论坛文章终于变成了一本书,“批判”也彻底变成了语言之间的比较(参与比较的另外两种语言是Java和Eiffel),这就是我手上的《对象揭秘:Java、Eiffel和C++》(Object Unencapsulated:Java,Eiffeland C++,人民邮电出版社2003年7月)。
尽管宣称自己反对“宗教战争”,但显然Ian Joyner是深谙宗教战争之道的。从批评的方式来说,他与其他人并无不同:首先立论(“Eiffel是最好的语言”),然后不断变换角度批评对手——时而是数学理论的完备性、时而是使用的便利和可靠、时而是命名的清晰„„论据的选取完全只是为论点服务。也正因为此,这本《对象揭秘》足以让绝大多数的语言比较者感到羞赧,因为在同样的批评套路上,Joyner探索的深度和广度令他们望尘莫及。譬如说,任何一个负责的语言比较者都必然会提到“继承和类型系统”这一话题,但Joyner却把这个话题写成了长达63页的一章(第5章,“类型扩展:继承与虚拟”),并在后面的章节(第9章,“类型转换”)中继续讨论相关的问题。抛开篇幅不谈,单是Joyner习以为常的文法解读、Lamda演算法和签名变化理论,就足以使不够水准的批评者自惭形秽了。
因此,在我看来,这本《对象揭秘》完全有理由成为所有语言比较者的必读书目——也许说“入门书目”会更准确一些?因为你能想到的任何一条批评,Ian Joyner很可能早已做了鞭辟入里的阐述。如果在细读《对象揭秘》之前妄自作评,结果很可能是贻笑大方。另一方面,在批评的方法上,Joyner为后来者作出了表率:简单的反对与谩骂毫无意义,用钱钟书的话来说,“反其道以行也是一种模仿”;只有拿出充足的论据,再拿出合理的解决方案,才称得上一个高明的批评者。当然,这样的“入门书目”也许让门槛显得太高了一点。但对于“Java和C++谁更好”这样一个通常只会令人感到莫名烦躁的话题,门槛总是不厌其高的。
像我一样的Java人常常会抱怨“Java的经典书籍太少了”。C++的经典好书总是层出不穷,实在令人艳羡——当然真正拥有这些书的人也同时拥有不少的烦恼,我就有最深切的体会。在这本《对象揭秘》中,IanJoyner顺便也半开玩笑地揭开了这个秘密。也许,这句半开玩笑的话会成为Java人喜爱这本书的另一个理由:
“„„学习C++要花那么长时间„„,要比Eiffel和Java都长得多。花那么长时间还未必掌握编程或者面向对象设计技术。这也是为什么关于C++的书籍那么多而Eiffel和Java不需要那么多书的原因。”
我是初中时接触编程的。那时父亲厂里买了一台微电脑,而我父亲,当时正好可以接触到这台微机,于是,颇具战略眼光的父亲便开始帮我寻找各种书籍资料,让我学起了计算机。
第一眼看到它,我就被吸引住了。那是在当时也很差的一种名叫“R1”的微机,可是颜色实在漂亮,典雅的奶黄色,配着深绿的按键,按下不同的键还有不同音调的悦耳的声音。跟当时风行的大多数八位微电脑一样,整个机身实际就是一个键盘,比现在PC机通常的键盘还要小,显示器就用电视机。当我第一次把从书上抄下来的寥寥几句的一个Basic程序从嘀嘀作响的键盘上敲入,最后再打进了“RUN”,而屏幕上忠实地显示出了结果后,我就不可救药地迷上了编程。父亲的厂离家有五公里,每个星期天我都要自己一个人步行五公里,把一个星期里自己写下的一大堆Basic程序拿来调试,当然一大半都被它冷酷的拒绝了,所以每次有一个程序通过了,我都会兴奋的叫起来。那时我的体力不好,五公里走下来,相当累,还经常小腿抽筋,可是一坐到电脑前,听见打开时“嘀”的提示音,一切的痛和累都消失了。
渐渐地我的程序通过率越来越高了,程序的规模也在增长。但是,那台外表可爱的电脑却开始不堪重负了,运行速度本来就慢,又加上效率低下的解释性Basic语言,让我实在不可忍受。于是,父亲又到新华书店为我订下了一本《Z80汇编语言》的书。书一到,我就捧起这部大块头的书,开始用我初中的程度一点点地啃。边啃边实验,终于掌握了Z80汇编语言,又在电脑不具备输入汇编语言能力的情况下,手工翻译成机器语言,再通过Basic语言中的Poke语句把二进制代码输入内存,然后用Basic程序调用。在不懈的努力下,终于成功地做出了一个汇编语言的动画程序!在这次成功之后,我就开始相信,只要肯钻研,没有学不会的技术,没有克服不了的难题。
初中毕业后,我以全县第一的成绩进入了一所附近城市的省重点中学,从此我的眼界开始逐渐拓宽了,以后,我用到的电脑越来越高级,从高档八位机苹果电脑,到今天主频以G计,内存以M计的奔四电脑,当年那台主频内存都只能以K计的八位机已是进了历史博物馆。但是这台引领我进入编程领域,并且更驱使我深入钻研汇编语言的电脑,将是我记忆中最珍贵的收藏之一。
在重点中学,学业的压力是很重的,又是住校独立生活,对于体力已较大程度下降、行动已呈现出不少不便的我,平添了几许额外的困难。高中的第一年没有计算机课,我只能在假期回家后才能有机会继续学习编程,也以此来忘记一学期的压力和苦累。高二时,终于盼到了计算机课,也见到了当时相对高档的苹果电脑。而我此时已有的基础令老师吃惊,同学惊服。我加入了计算机兴趣小组,开始在性能远远好于原来那台电脑的苹果机上快乐的编程了。在高二的暑假我和计算机老师一起给学校做个工资管理软件。在学校里的一周时间内,由于宿舍已经锁掉不能住,我就睡在了办公室里。位于郊区的校园,蚊子格外多,咬的我一直睡不着。到了后半夜,我索性爬起来,打开了电脑干活。就这样,我帮着老师写程序、录入数据,并且在即将交货时找出了一个大BUG,又正确地判断出问题根源在内存不足,算是立下了一个小功劳。
由于高考发挥出色(尤其是物理的满分),我进入了北京大学物理系。在大学里,计算机上机条件就更好了。当时苹果的Macintosh刚刚推出,给我们系捐了好多台组建了计算机室。这个计算机室从此就成了我大学四年最常去的地方。一年级的时候有两门计算机课,一门是Fortran语言,一门是Pascal语言。而Pascal语言基本是我们自己学,每到晚上计算机室向我们开放。那是我第一次见识“窗口”形式的操作界面。第二年,计算机室的机器换成了386和Dos系统了,但是上机机时却被限制住了。不能满足的我到处找不喜欢计算机的同学借机时卡,好让我有足够的时间调试自己写的程序。到了第三年,北大招生更多,系计算机室天天爆满,所以上午只要没课,我就会起个大早到机房门口等待开门。在一个寒冷的冬晨,还因此着凉发烧而晕倒在机房门口。就这样,我熟练地掌握了Turbo Pascal和Turbo C++,也学习了好多相关的理论知识。
毕业后,我终于如愿以尝当上了程序员。我被分配的任务,起先是用Delphi做一些文字处理的工具,供编辑部和数据部使用。后来Internet开始兴起,又委派我写为网络版期刊使用的一些CGI程序。工作一直都很顺利,我的眼界与编程水平也在稳步成长。两年后,为了有更好的发展,我离开了我工作的第一家公司。这时,我把求职的阵地移到了网上。不久,就在某网站上看到了一家合资软件企业的招聘启事。尽管启事上说明不接受来访,我仍然勇敢地拿着简历于第二天赶到公司所在的翠宫饭店去求职了。幸运仍然在笼罩着我,这次我直接见到了经理,向他表达了自己对于编程的热爱。我说,我梦想着成为IT业的传奇英雄。也许是这句话感动了他,我成功的通过了面试。在这家公司,我第一次作为一个庞大项目组的一员,感受到了现代化的软件项目管理,接受了团队精神的洗礼。
在北京做了五年的程序员,这时候,我听到了来自深圳的召唤。早在99年,我就在网络上找到了一个位于深圳的名为“中华残疾人服务网”的残疾人网站。一天,我在这个网站的留言本上看到了站长的一席因残疾人网络事业缺少技术支持而发的感慨,不由心有所感,便留言说,愿投入残疾人网络事业,而不计待遇。从此,我的人生翻开了辉煌的一页。那是2002年的10月6日。
起初以为,这个网站会类似于仅仅出于兴趣的个人网站,走进去才真正发现,这是个志存高远的团队。而我真正感觉到了团结一致共创大业的团队精神。在同样因病致残的站长有力领导下,这里基本解决了残疾人在生活会有的种种不便,克服了许多社会上普遍存在的障碍,从而可以让我充分发挥聪明才智,全身心地去攀登IT技术的高峰。
加入网站之后,我完成的第一个任务是改进网站新闻系统,增加图片上传和自动图文排版功能。以前没有做过ASP程序的我在原有的ASP程序的基础上,通过学习和分析源代码,完成了这个任务,同时也掌握了基本的ASP编程技术。然后,我又独立完成了一套社区论坛程序,这套程序受到了全国以至海外残疾朋友的欢迎,成为了许多足不出户的残疾朋友与网友热烈交流的园地。也让我从中看到了自己的价值。后来,因为网站的网管不辞而别,我又接过了网管的重任,从此一面开发程序,一面又管理着我们自己的两台服务器。尽管压力和工作量成倍地增加了,却使我同时掌握了两个领域的技术,而这两方面的技术又互相促进,使我的知识结构更为全面。
由于我们没有外来资金的支持,要维持中华残疾人服务网这个福利公益网站的运转,必须走以网养网的道路,即为企业、政府提供信息化建设服务,以获得经济收入。所以,在给网站开发和升级程序之余,我又开始进行商业网站后台程序的开发。仅网站新闻系统,就在两年内从1.0版升级到了6.0版;还有大量为企业量身定做的功能程序。这些程序在网站原本就强大的前台设计的包装下,受到了市场的欢迎。网站也由此发展壮大。今天中华残疾人服务网在全球排名中稳步上扬,进入了三万以内的行列。
在承接网站建设工程的同时,一些客户也开始找我们开发应用软件。第一个应用软件项目是一家与广东移动通信有业务关系的公司,因为自身没有软件开发能力,便请我们合作为广东移动通信做一个《“测试卡”管理系统》。根据要求,我设计了使用条形码的输入方案,又使用SQL数据库作为局域网联网的后台数据库解决方案。由于是第一次全程的开发与服务,在进行以前没有接触过的安装过程中出现了大量问题,又没有充分做好应对的准备,造成了一些被动局面。但是最终我仍然想出了临时的解决方法,顺利地完成了测试版的交付。遗憾的是由于中介的公司人事调动,这个项目最终没有进行下去。
很快又一个重大考验落在了以我为首的网站开发队伍身上。这是一直从各方面扶持我们的深圳市信息化办公室交给我们的任务。要求是我们收集深圳市所有的网站,以PDF电子书的形式印刷在光盘上。同时要有一个完善的分类搜索系统。时间紧、数据量大,而且不允许出现任何差错。为了证明残疾人团队的开发能力,我和大伙都拼上了。而在送交初稿的前一天晚上,更是全民动员,站长第二天一大早要亲自带上光盘送去,但他也一起在熬夜。那个不眠之夜是我编程生涯中效率最高的一夜。不久后,这个项目终于完成,看着出自我们的头脑和双手的几千张光盘,我知道自己的努力没有白费,而自己的能力也提升到了一个新的境界。这个项目,在那些大公司看来也许是不值一提,可是对于一个核心成员仅五六人、而且全部是残疾人组成的一个项目组,是非常了不起的成就!
2003年12月,世界残疾人职业技能奥林匹克在印度新德里举行,我有幸代表中国的残疾人参加了其中编程项目的比赛。在中国,残疾人的就业问题是一个大问题,因此,这种残疾人的职业技能竞赛尤其有意义。2002年12月,我以广东省冠军的身份取得了2003年在上海参加全国比赛的资格。2003年8月,我在上海凭着多年的编程经验和创新精神,又取得了参加中国残疾人代表团出征印度的资格。遗憾的是,在赛场上,为了追求更好的界面效果,我耽误了一些时间,以至在最后因时间过于紧张,出现了一个致命的失误,将本来有希望得到的奖牌拱手相让。唯一的安慰,就是我的程序界面受到了印度裁判的称赞。
从国外回来,我又打开了.NET的大门,准备带领网站的几个做程序的残疾朋友进入.NET的开发。对未来,我充满了信心,而新的梦想,又开始浮现在我眼前!
现在我的身份,一半是软件工程师,一半是高级程序员。随着网站这个实体的发展,我也许会逐渐成长转型为软件架构师,但是我仍然会梦想着掌握最高的编程技术,仍然愿意承担基础性的编码工作。我相信,保持开放的心态,保持年轻的心态,再老也能做程序。当今的数字化时代给残疾人士尤其是肢残人士带来了新的机会和挑战。现在,纯粹脑力劳动的门槛,因为程序员门槛的大幅度降低而降低,给更多由于社会原因而教育程度相对偏低肢残人士提供了经过培训进入初级程序员行列的机会。但是,这些机会要想转化为现实,还需要更多更广泛的“无障碍”环境的支持。我的第二个梦想,就是梦想中国能够出现更多的“软件工厂”,而这些“工厂”又是向残疾人敞开大门的。
十年编程生涯,历经了风雨坎坷,而程序代码给我插上的翅膀在风雨中更加硬朗。今天,我喜欢在程序代码的世界中自由飞翔。让病魔去禁锢我的身躯吧,我的灵魂仍然在广阔的世界里翱翔„„
“我不是程序员”,杨过在电话那头淡淡的说。杨过是大学同学叫他的外号,因为他的气质和金庸造的杨过最像,连一些感情遭遇都像。
拒绝做程序员,虽然很火
杨过毕业那年软件公司很火,据说在中关村随便一个刚毕业的写C程序的毕业生月薪一不小心会上万。于是乎杨过不少的同学们毕业后纷纷改行编起了程序,跳进了大家现在也没说清楚的IT行业。说改行是因为杨过学的不是计算机专业,只是沾上边。
杨过那时根本不屑于做编程,虽然那时班里就他最喜欢打软件游戏。他觉得去编程不是什么“正经事”,所以毕业后他去了大连一家生产粮油的集团企业,杨过说是“一颗红心投入四化建设”。
由于不想拍马逢迎,杨过彻底打消了“磨豆油”的念头。不过他没有直接留在大连找工作,而是跑到偏远的老家和他青梅竹马的高中同学结婚去了。杨过的感情故事太有传奇色彩,跟金庸那个杨过有一拼。因为新婚的妻子在大连不好找工作,当时他留在家里,找了一个小公司用电脑给人设计零件图。
本来大多数人的工作就是混口饭吃,杨过也不嫌公司小,老老实实过日子吧。可让他接受不了是,公司的老板经常借口让他熟悉工作为名把他当民工使,一气之下杨过回了大连,几个月也是白干,工资没拿到一分钱,因为工资是三个月一发。杨过借口看病从老板那里借了几百块钱,老板也明白怎么回事,就给他了。直到现在,杨过还算是借着这个公司的几百块钱。
还得做程序员
杨过先自己回到大连,到人才市场一看,铺天盖地都是要程序员。“唉,不服气不行,社会发展趋势啊”。电话那头的杨过一直在叹气。
毕竟杨过是重点大学毕业的和计算机相关专业,那时还很吃香。他很快找到一家做寻呼台业务的软件公司。由于以前“没睡决时还看看计算机书”,他上手还挺快。干了一年,他跳到现在的这家公司,工资涨了一大截,在大连还算可以,老婆也接过来了。
杨过老婆刚开始在影楼做过一段,后来生病就没再做。杨过说现在工资也够两个人花的,也不逼她找了,也不好找。
我不是程序员,也不考虑明天
杨过现在的这家公司虽然也不算小,主要是做政府机构的一些单子,但为了生存业务还是比较杂。杨过感觉自己“天天这编一点、那写一点,从来没有好好从头做过一个正式的项目”。“我不是程序员,”他说,“可大家都这个样子。”
公司里只有杨过一个人结婚了,其它都是小伙子。“以前没睡觉还看看书,现在没心思了”,杨过调侃。
由于换了几个工作,杨过的国家基本保险也搞的乱七八糟。“我仔细研究过国家的一些文件,自己掏钱交那些基本保险没有什么用”,杨过现在和老婆都没有基本保险,自己存钱保险。
杨过无奈的笑笑,“也存了一些钱,前一段老婆病了都交给医院了。”
最近,看到论坛一贴子,主题是:我从校园出来的这几年。里面可热闹了,回复次数竟然达1425次,我读了几个钟都没看完,最后只能大概浏览一下了,不过里面大多数都说自己是程序员,并且出来工作都不容易,可谓是一部“千人辛酸史”了,从中多少反映出了中国不少程序员的生活状况,不知道打算做程序员或者现在正入门的程序员朋友看了作何感想?
说实在的,目前在中国的程序员大都过得不容易,而且普遍表现为“青春饭”状态,工作量大,导致对新知识的吸收能力随着年龄增大而降低,到了一定年龄(30后)后因为跟不上时代发展面临淘汰的厄运。虽然如此,但让我觉得欣慰的是的不少程序员或打算做程序员的朋友都表示坚持在程序员的路上走下去,因为我也是一名程序员,而且我对未来充满阳光,充满希望。
我记住了这样一个简单的道理:过去并不代表未来!相信没有人会不知道这个道理吧!大多程序员过去的辛酸大都可以归结于中国软件产业的发展的不成熟,而现在,中国政府制定政策大力扶持软件产业的发展,而且不少国际软件企业也看好中国的软件产业,纷纷把投资向中国倾斜,而且国内也开始有了不少比较成熟的软件企业,当然与国外的一些软件企业相比,还有一大段距离。但它表明中国的软件产业开始向规模化,规范化的方向发展了。
印度在软件方面,在我们看来是成功,印度政府在1991年就制定相关扶持政策,到现在也有10多年了,才取得成功,另一个在软件方面比较成功的亚洲国家——韩国,它也在1998年就制定了相关扶持政策,到现在也取得了一定的成功,用时不过4-5年,那么中国的软件产业呢?要多久才能成熟起来呢?引金山总裁雷军的话,3年左右有所成就,到全面成熟那就要比较长的时候了,但中国软件产业的成熟和前述国家成熟概念不一致:印度是定位于软件外包而取得成功,韩国定位于网络游戏取得一定成就,而中国呢?定位于什么呢?中国的定位是组合式的,不是某一方面,而是全面的。
可以相信:在未来,中国的软件产业无论在产业结构上,还是人才结构上都会具有优势。关于后者,你只要看看中国建立的50多所软件学院就可见一斑了,而且还有很多像印度的NIIT,北大青鸟(中外合资)等著名的国外软件开发教育机构进入中国,把先进成熟的教育模式带入了中国。
但是,以上的教育机构培养目标都不是精英程序员,而是最近大家抄的很热的“高级软件蓝领”,成熟模式中的软件开发团队中需要“金领”,“白领”,再到“蓝领”,而中国软件企业大多是小企业,最需要的是能独挡一面的“金领”,“白领”程序员,并不需要那么多只会Coding的“蓝领”程序员,我想很多混的不那么好的程序员,大概你是属于“蓝领”程序员吧!
任何时代,任何时候,机遇总是垂青于有能耐的人的。但是,即使你现在不是“金领”,或者“白领”程序员,你还不是精英,而仅仅是“蓝领”程序员或者还不是而想成为程序员的你听到这句话,千万不要泄气,要相信你自己是将来的精英,虽然现在的生存环境不是那么好,但是,恰恰有更多机会让培养自己独挡一面的能力,随着中国软件产业的发展,将会需要大量有数年工作经验,有整体系统架构能力的人才,而这些恰恰是任何学校都无法培养的人才,而现在的程序员,只要你们不放弃梦想,不放弃追求,继续努力,你们将成为软件产业的中坚力量!软件人才的佼佼者。
最好,告诉大家一项调查,硅谷的程序员的平均年龄是35岁左右,而且微软公司的核心开心者大都在35岁以上,可以遇见,程序员不在是“青春饭”,也会有“老来悄”的“老资格”了!
冬天来了,春天还会远吗?——谨饬送给所有的中国程序员。
如同一首民歌《三十里铺》所言,路行三十要有个歇脚的地方,人行三十也要喘口气。在IT,特别是程序员这个特殊的职业,流传一种说法:30岁是职场上的一道槛,事业上此时会发生了许多变化。30岁和程序员真有某种特殊的联系吗?程序员到底能不能做到30岁以上呢?
J曾是一名计算机老师,因为厌倦了学校平淡的生活,应聘到一家开发嵌入式系统的公司做底层程序员。刚开始的一两年,凭着一股热情和钻劲儿,投入到如火如荼的开发中,甚至购置了睡袋以备晚上加班。两年中,他掌握了极其专门的硬件参数、规格、开发细节等知识,成为部门的骨干。
逼近30岁的那几个月,他开始感到有些困惑。自己在公司虽然还算受重视,但是技术上翻来覆去就是那几样烂熟于心的东西,公司只需要自己惯性运作,实际不愿支付经验转换的成本;而公司的原始积累还远远未完成,自己仍然要和刚毕业的大学生一起加班,通宵达旦的干。因为缺乏人际交往,家里一直催着的婚姻大事,至今还八字没一撇。很多同时期来的人都打算往管理转了,可是自己对管理缺乏兴趣,还是乐于从事技术工作。下一步怎么办?J想到了辞职,但还没有什么方向。
相比J,M要幸运得多。作为清华计算机本科、中科院研究生毕业的高材生,M在做项目经理时就能够月收入2万,先后换过3家公司,对所谓30岁的说法不以为然。M以前的项目都是用CMM做,项目管理很好,而核心的也就几个人。手下带过的人,当然是刚毕业的最差,因为要获得30岁时的经验,显然需要一个过程。M最开始做程序是用Debug单步跟踪、分析、定位;后来开发图形界面的上层程序,哪怕半年写1万行,也觉得不叫程序;只有到后来转到做底层开发以后,虽然半年只写到2000行,但是却感到了写程序的快乐。M认为30岁以后程序员的体力不是问题,好的程序员不经常熬夜,有也是临时的。M接触过国外、比如印度的一些公司,技术人员们没有固定办公室,用互联网联系;很多人年龄都在35岁以上,技术很熟练,思想敏捷,让人敬佩。
M的职业观也很灵活。刚刚辞职在家,接点活干,非常忙。M有几个同学在外企做程序,日子过得更舒服,但是几年下来,个人、技术均无进展。究其原因,除了像微软研究院、Intel等一些少数外企还做些研发外,其它外企都是挑国外剩下的做,反而是国外一些小公司倒是把最核心技术放在中国来开发。其它像金山这样的一些本土企业应该也不错。做为程序员,机遇、环境、职业(项目)都很重要,它不但直接决定现在的收入水平,更决定未来不同的命运。而程序员这个行业又有极强的主导性,如何做好职业生涯的规划,恰恰是决定乾坤的关键棋子。
程序员圈子里流传过一套书叫做《编程之禅》和《编程之道》。创造力、逻辑、判断、体力、智力、手段都是所谓道的一部分,书中有个比喻,程序员编程时,只有硬盘在响。创造本身是一项神圣的工作,但是创造者的果实却是世俗的。换句话说,年龄的问题本是见仁见智的,但是“30岁的槛”却是世俗的。国内大部分公司还没有好到为程序员做好一生的职业规划的地步,因此路还得自己来走。不要让过度的重复劳动损害了创造力,也不要太迷信技术的力量,而忽略了世俗世界的张力。“三十里铺是一个小村庄,小村庄是我们经过的地方。经过的地方向着遥远的别处,遥远的别处还是三十里铺。”
做为一名大四的学生,我面试过不少的单位,有成功的也有失败的,但是对我来说所有的失败在某种意义上都是一种成功,特别是我下面写的这些,写这篇文章的时,我已经签了南京的一家软件公司,但是想起今年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是为用户服务的,不是为我们程序员服务的!”多么精辟的语言,我已经不想再说 什么了!接着是第二个问题:
他要求我用一种技巧性的编程方法来用一个函数实现两个函数的功能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][i];}
最后得到计算值!呵呵,典型的空间换时间的算法!这些总共花了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,但是这就足够了吗?这些天我偶尔发现我曾经写过的一个游戏,那是一年做为 其中一员时候,感觉应该拿点东西出来,然后花了一个星期的时间写出来的!程序不算复杂,但是用到了不少数据结构的东西,也用到了一些精彩的算法,加上windows的界面和游戏的可 玩性,写完后受到了不少好评,我当时真的很佩服自己!但是现在看呢:没有一句注释,好多 丑陋的函数名比如:void chushihua(),好多没有必要的变量,可以用简单语句完成工作的我 使用华丽的算法,大量使用全局变量.....,说不好听的话,六百多行的程序除了能运行之外就 是一陀屎!如果一年前我能听到一些反面意见的话,大概我能早一点觉悟,但是自原代码在 网站发布以来听到的都是赞美之词,没有一个人向我提出程序改进的意见,这又说明了一个什 么问题呢?很值得思考啊!
还有一个疑惑是:我们说的和做的真的一样吗?我在学校的时候曾经受学院指派承办过一个 计算机大赛,请了一个老师出决赛的题目,主要是一些算法题目,这个老师可能是我上大学以 来唯一敬佩的老师了,从程序调试到打分,对于每个程序都仔细分析其时间效率和空间效率,然后综合打分,四十个人的卷子,老师从下午三点一直调试到晚上十点,在有些写的精彩的语 句后还加上批注。我真是高兴很遇到这样的老师并且和他做深入的交流,但在事后,却发生了 一件不愉快的事,在比赛中获得第二名的学生找到我,说他程序全部调试成功应该给他满分,并且应该得第一,我说不过他,最后调出了他的原程序和第一名的原程序对比,错,两个程 序都运行的很好,这时,那个同学开口了:“我的程序写的十分简捷明了,仅仅数行就完成了 题目要求,而他的却写了一大堆,为什么给他的分多过给我的分。”我当时很是气愤,如果不 是老师负责的话,那么现在第一名和第二名的位置真的要互调了,拜托,不是程序的行数越少 程序的质量就越高,我记得我跟他大谈这方面的道理,最后说服他了!哈哈,但是我,只能说 说而已,我不知道还有多少人一样,说起来头头是道,但心里却压根就从未重视过它!
3.我打算做的!
其实那天我想到的远不止上面那么多,但是我不想再说了,因为我猜想看这篇文章的网友大 概都有一肚子的感想,一肚子的抱怨,借用这篇文章发泄可不是我想达到的目的,在上面我把 自己骂的一文不值也不是妄自菲薄,但是在某些方面我真的做错了,或者说是偏离了正确方向,现在是矫正方向和重整旗鼓的时候了,就象我前面说过的,我相信中国有世界上最好的程序 员,我也相信我的水平不会一直保持现状,我现在就收拾起牢骚真正的实干起来!真的很巧,就写到这里的时候我在网上偶尔发现了这篇手册,我不知道这预示着什么,但是 我想如果我照下面这个基本原则一直踏实做下去,我一定会实现我的理想---一名优秀的软件设计师!
(下面这些文字不是我的原创,是我偶尔在网上发现的,我真的很幸运能看到这些,这篇文 章也随着下面的文字而结束,我真心的希望您能从这篇文章中得到启发,这篇文章欢迎大家随 意转载!)
作者:金蝶中间件公司CTO袁红岗
不知不觉做软件已经做了十年,有成功的喜悦,也有失败的痛苦,但总不敢称自己是高手,因为和我心目中真正的高手们比起来,还差的太远。世界上并没有成为高手的捷径,但一些基 本原则是可以遵循的。
1.扎实的基础。数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果 不掌握他们,很难写出高水平的程序。据我的观察,学计算机专业的人比学其他专业的人更能 写出高质量的软件。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想 想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP,即使你再精通OOP,遇到 一些基本算法的时候可能也会束手无策。
2.丰富的想象力。不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的 方案,试试别人从没想过的方法。丰富的想象力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。另外,多看科幻电影也是一个很好的途径。
3.最简单的是最好的。这也许是所有科学都遵循的一条准则,如此复杂的质能互换原理 在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc^2。简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要 求时再考虑复杂的方案。
4.不钻牛角尖。当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音 乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,而且是那种极暴力的打斗类游戏,当负 责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。
5.对答案的渴求。人类自然科学的发展史就是一个渴求得到答案的过程,即使只能知道 答案的一小部分也值得我们去付出。只要你坚定信念,一定要找到问题的答案,你才会付出精 力去探索,即使最后没有得到答案,在过程中你也会学到很多东西。
6.多与别人交流。三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵 感的火花。多上上网,看看别人对同一问题的看法,会给你很大的启发。
7.良好的编程风格。注意养成良好的习惯,代码的缩进编排,变量的命名规则要始终保 持一致。大家都知道如何排除代码中错误,却往往忽视了对注释的排错。注释是程序的一个重 要组成部分,它可以使你的代码更容易理解,而如果代码已经清楚地表达了你的思想,就不必 再加注释了,如果注释和代码不一致,那就更加糟糕。
8.韧性和毅力。这也许是”高手"和一般程序员最大的区别。A good programming is 99 weat and 1ffee。高手们并不是天才,他们是在无数个日日夜夜中磨练出来的。成功能给 我们带来无比的喜悦,但过程却是无比的枯燥乏味。你不妨做个测试,找个10000以内的素数 表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这 一条。
这些是我这几年程序员生涯的一点体会,希望能够给大家有所帮助。