第一篇:一个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 程序,不要因此得意洋洋,这只是程序员基本的技能要求而已。如果把系统分析和系统设计比作“战略决策”,那么编程充其量只是“战术”。如果指挥官是个大笨蛋,士兵再勇敢也会吃败仗。所以我们程序员不要只把眼光盯在程序上,要让自己博学多才。我们应该向北京胡同里的小孩们学习,他们小小年纪就能指点江山,评论世界大事。
第二篇:一个C++程序员的学习经历
正在上网的时候有这个念头的,所以急急忙忙找了一些学习编程的高人的感想:
我开始学VC时就是自己一个人在啃,也没什么人指导,当时没有条件上网,资料特别少,在书店里随便买本书就学了,在学VC的过程中走了许多弯路,现在回想起来觉得做了很多无用功。看见大家在这里畅所欲言,有高手也有新入门的ddmm,我也来谈谈学VC的一点“捷径”吧,这条“捷径”纯粹走的是C/C++的路子,不考虑学习其他语言。(我只会C/C++,略懂VB和Java,所以对于通过其他语言来切入VC的没有体验,不置评论)
1.必须对C/C++非常熟悉
如果C不熟,可以看清华谭浩强的书,经典之作。(学习时间1到2个月,对函数、指针和链表须滚瓜烂熟)
如果C++不熟,可以看电子工业出版社的《面向对象的程序设计于C++教程》,张国锋写的,既讲面向对象的思想又讲C++的语法,是我见过的讲C++最全最好的书,里面的例子都是精心设计的,值得好好体会。好像清华也出过一本张国锋的,不过我没看过。(学习时间2到4个月,关键在于理解OO概念和C++中的多态,对此应挥洒自如)
2.最好/应该对Windows结构相当熟悉。
如果你很牛,非要从MFC下手来了解Windows结构,当然也不是不可以,但我以为从MFC来学习Windows有雾里看花的感觉,很容易陷入迷惘中,我吃过这种苦头,希望后来者不要走这条路。
如果对Windows结构不熟,可以看Microsoft Press的Windosw95 Programing,清华翻译出版了中译本《Windows95程序设计》,后来北大翻译出版了最新的版本。清华版的译得不错,北大版的没看过,好坏不知道。这本书讲的是怎么样用C语言编写Windows程序,不讲什么MFC或OWL的,看过后对Windows能有相当清晰的认识。(学习时间3~6个月,GUI对象和消息很熟,多线程、dll有一定认识)
3.以上两部为准备工作,OK后就可以continue学习VC了。
学VC看Microsoft Press的《Inside Visual C++》清华翻译出版了中译本《Visual C++技术内幕(第四版)》比较容易上手,看《技术内幕》一定要看清华,有一本希望出版社翻译出版的第五版技术内幕翻译的太烂了,看希望的不如直接看英文原版。(学习时间4到7个月)
4.学习VC是为了在Windows平台下做开发,所以当你对一上三步都很熟后应该进一步深入学习Windows体系才能开发出高性能的Windows程序,你也只有在这个时候才会明白为什么说VC是真正程序员用的工具而VB只是玩具。如果你在finish第三步之后已经忘记怎样在Windows下用C语言编写一个Windows程序,那么你应该把第2步Refresh一下。在这一层次应该深入研究Windows操作系统内的进程、线程、虚拟内存等知识,还应该了解Windows网络程序的设计。这一步推荐的书是Microsoft Press的《Advanced Windows》清华翻译出版了此书的中译本《Windows高级程序设计(第三版)》,读此书时很多东西有相见恨晚的感觉。机械工业出版社翻译出版的《Windows核心编程》是这本书的第四版,结构上重新组织过了,内容没有细看过,应该还可以。网络编程有一本也是MicrosoftPress的,好像是叫《Windows Network Program》吧,机械工业出版社翻译出版了此书的中译本《Windows网络编程》还不错的。
5.往后你就看自己需要了,有兴趣可以学习COM/DCOM/COM+,这套东西是现在Windows系统的核心架构。
用VC学VC两年了,自认为不是什么高手,精通更谈不上了,因为VC的功能实在太强大了。我只想谈一谈自己的学习过程和体会,总结一下自己的编程之路。
一开始也和大家一样,对VC、VB、DELPHI、JAVA非常感兴趣,但是学什么好呢?毕业设计来了,导师要求要么用VB要么用VC,听说VC难学但很有用,于是狠狠心用VC吧。对于一个对编程一点都不感兴趣的人我想他是学不好的,没有强烈的动力和恒心也很难掌握一门知识。怎么办呢?你总要毕业吧,这就是我的驱动力,而且编程还可以挣钱:),学吧!
对于一个一点都不懂的人来说,下面的知识应该补一补:程序算法和数据结构,C语言的变量、数组、指针、内存、文件、函数等等基本概念和用法,有的人说学c++可以不用学c,我个人认为还是从C学起好,因为c++对c是兼容的。
有了最根本的编程基础之后,我们就可以学习c++的编程思想,就是面向对象(oo),自然对于什么是类、对象、成员、成员函数、构造函数、析构函数、虚函数、模板,最开始可能用不上析构函数虚函数什么的,但要想精通深入就必须掌握(当然可以以后再学)。可以说面向对象是c++对c的一个最重要的扩展,而这也恰恰是我们理解和深入的基础,这部分越扎实以后理解和掌握就越快。
再下来就是MFC了,MFC是一个很好的封装类库,它诚如大家所说对用户屏蔽了很多实现机制,以致很多人只知其所以然,而不知其然。要想知其所以然,当然是学习windows编程,熟悉windows的消息、窗口、api函数。可惜当初我只是为了快,没有深入地学,留下了现在地恶果,对MFC及其机制仍不甚明了。一则MFC已经封装好了,二则自己觉得麻烦和累,一大堆长长的函数名和长长的函数参数把我吓晕了,大家千万不要学我^-^。基本观点就是如果只求使用,不学api也可以,如果想做得更好精通,非学不可。对于MFC,对我帮助最大是www.xiexiebang.com、程序员大本营、和MSDN,有了这三大法宝加上自己的刻苦钻研,一定可以成为大虾。前提是有一定的英文基础,并且已经知道如MFC frame及application的基本运行机制,对对话框、编辑框、组合框、列表框、进度条、标签.......等控件的基本功能都自己试过。我就是从这些开始学习MFC的,另外还学了一些和数据库打叫道的东东,如ODBC之类的,我觉得如果仅仅是界面开发,这些东西还是可以胜任的,都是些简单易学的在哪里设置什么属性,添加变量和调用成员函数就行了,不笨的人都会,当然如果你不知道在哪里加又会变得很神秘和难于上青天,夸张了呵呵。这时候你就要查书问别人上internet和帮助网站去找了,具体成员函数的用法可以看MSDN。总之对于没有学api耿耿于怀,对于没有了解MFC机制也愧疚于心,因此把自己归于初级水平还是可以的:
VC是一个开发工具和环境,在你需要的时候你可以边学边用。比如你要编网络方面的东东,好!先去看看别人是怎么做的,有哪些基础,另外你自己也要针对需求学一些网络知识。微软的主页还是不错的,英文好的话可以找到很多很好的东东。你要编关于数据库的程序,请先了解一下数据库的基本概念和它们在VC中的使用。你可能还有各种各样的编程需求,如游戏、小程序、动态连接库、静态连接库,COM,ActiveX等等,学习吧,这是唯一的捷径。我的体会是,边学边用,边用边学。学习先打好一定的基础,磨刀不误砍柴功,看似浪费时间实则受益匪浅。学习要利用一切可以利用的资源,书(包括电子的,不过我很少看电子版本)、BBS、网站(比如VChelp)和高手,勤学好问,搜索不倦,想必你肯定也会成为高手的:)。书我是狂看、乱看、瞎看,主要是没有条件和时间,当时也没人指点应该看那一本好书,原则就是找到自己需要的东西的书就可以拿来翻一番(当然我有图书馆这个资源,学生借本书应该没有问题的)。BBS主要去精华区溜达溜达,里面都会有你要问的一般性问题,如果实在找不到答案,请去codeguru,微软网站和MSDN查找搜索,应该可以找到蛛丝马迹。这样还是很费精,如果有高手指点就不一样了,他们做过的话,这可能就是小差一叠,随便说一个关键词就可以帮了你的大忙,可惜高手毕竟是少数,正好碰上做过的高手的概率就更小了。所以各式各样的网站就显得那么的重要,它们一天二十四小时都在,而且可能是很多高手都在,因此在它们身上可以找到一些参考答案。问专家我觉得不错,VChelp更全面和包罗万象。说了这么多,都是自己的胡思乱想了,一点个人体会,不当之处,各位多多批评指正了*^-^*
下面是我的一些建议,如有不对,请批评指正.谢谢!我想现在大部分的初学者都在问,怎么样学C/C++最快?确实,这是个比较重要的问题,但对于初学者来说,最重要的,是你对学习C/C++的恒心!学习C/C++并不容易,我想这是每个初学者很清楚的事情.之所以选中C/C++是因为它的涉及面广,并且强大.但自学想很快掌握C/C++编程那是不太可能的,除非你是个天才,或有专家专门对你进行辅导.如果学习方法和路线正确,的确可以提升学习的速度和效率.下面是我对怎样学习C/C++的一些看法.总共分三步.第一步.系统的学习C/C++语言,(不要涉及MFC.)并且学习操作系统,对操作系统的运作有清楚的概念.这一阶段,可以把重心放到研究算法上.(估计时间将会是一年.如果有人帮助的话,可能会减短.)第二步.开始学习MFC,并选择发展的方向.一个程序员,很难做到各方面的编程技术都精通,所以要有选择的学习你感兴趣或有钱途的技术发展.如果做游戏,则可放弃对于MFC的学习,因为游戏不需要MFC.(估计时间将会是半年.)第三步.开始对各种技术的涉及.因为本人还没有考虑到这一步,所以,不做多提,但如果你已经学到了这一步,也不用我再废话了.(时间未定.)当然,以上的时间估计,是在假设你努力学习的情况下定的,并不具有实际意义.对于书籍的选择,有很多人想用电子书.我提议,如果是初学,最好不要用电子书,来学习.还有些初学者对于编程工具不知如何选择.我想无论是C或者是C++,VC都是一种不错的选择.如果机器配制不高,可以使用版本低的VC.VC1.52版本是个不错的选择.我在工作中,接触到印度软件公司开发出来的软件:整个体系架构非常清晰,按照我们的要求实现了全部功能,而且相当稳定。但是打开具体的代码一看,拖沓冗长,水平不咋样。我们自己的一些程序员就有怪话了,说他们水平真低。
但是!印度人能够把软件整体把握得很好,能够完成软件,并得到相当好的设计文档。而中国人在那里琢磨数据结构、算法,界面人员就还没编码就想着是Outlook式的还是VisualStudio式的界面。到最后就成为Code高手,对某些特定的开发工具精通,但是就是不能保证能够把一个软件稳当、完整的开发出来。
举个简单的例子:软件中需要一个列表,用来表示我们处理的事务。该类表在业务繁忙的时候将变得很大。中国人就用双向链表,抱着《数据结构》书在那里写链表的类。印度人开了一个大数组,然后就开始干。为什么印度人不用链表,他们说:
1、你们给出的设备(小型机),最少具备512M内存,浪费一些没有什么。
2、数组方式访问方便、效率高。看出了一拿到东西就吭哧吭哧作Code,和好好进行软件分析的不同了吗? 正好前几天我有几个同事从印度回来和我们交流,那家公司是CMM4级公司.我感受的几点:1,流程重于项目2,QC(就是QA)独立于研发部门,专门检查研发部门的开发流程是不是按照既定流程走.如果QC觉得流程不对,他会直接上报高层,项目定就此停止.3,所谓的项目经理(PC)一般也是从编码人员升上来的,并不是所谓的不懂技术,一般都至少有四年以上的经验4,PC主要就是制定开发计划,负责协调,填写各种表格.5,所有的东西(包括草稿)都有文档.6,详细文档要求达到只有这个文档就可以编码的程度,一般写文档时间占60,编码时间极少7,有各种详细的review(同行评审),项目组内的,项目组之间的,客户的...8,计划很详细,的确能达到小时级,但是实际情况还是误差比较大,所以他们也有加班.先学习UML和Rose以及RU P,不要总是要找着证据。在中国的软件开发水平下,很难给你一个好的例子,OK?中国人总是要看到一个东西有了试验田,而且稻子长得好,才换稻种。要知道在国外上述的软件开发模式的应用,大可以看看Rational网页上的story。Justdoit!一句话,中国的软件开发水平低得很。赶不上印度人,印度的软件公司可以让高中生编代码,它的软件工程水平可想而知。当然,你如果是个很牛的程序员。估计够呛,因为中国的气氛中,很牛的程序员都很难接受软件工程的。你可以测试一下自己,看看自己适不适合现在学习软件工程:
1、你是不是不能忍受一个编程序不如你的人做你的项目经理?
2、你是不是觉得你的老板对客户吹牛皮、夸大自己而感到不舒服?
3、你是不是一个拿到一个需求脑袋里第一念头就是如何实现的人?
4、你是不是很崇拜Stallman,Linus,很讨厌Microsoft?
5、你是不是曾经在深夜编码的时候,突然感觉到一种乏味,对Code的生涯感到一种无趣?以管窥豹──印度神话作者:“Kino”我们现在处于深深的自卑当中,感到中国的软件工程水平的低下已经是牵涉到民族劣根性的问题了。
1、他们的软件教育水平:我们招聘印度人,给应聘者出了一份与国内差不多的试卷,有基础概念和编程题目。等到他们完成后,我们这些中国的自认高手惊呆了!他们的编程题目简直象是抄袭的?nbsp;?nbsp;程序结构,注释,变量命名就不说了吧,全部都是极其类似!反观中国的牛人、高手,每个人有自己的一套。到了新的岗位,先把前任的程序贬损一通,然后自己再开发更多的问题的代码来代替。我的公司统计,一个软件中有4个以上CSocket版本,每个人都觉得别人做得差,自己再搞一套。中国人,就是这个样子,还会辩解说“我们这样有创造性”。
其实软件发展,早就走过了求伯君那个编码英雄的年代,程序员已经是个坐办公室的蓝领了。你具备拧好一个螺丝钉的能力就可以了。Code是最低级的事情 了。
2、他们许多公司的项目经理根本就不懂技术。中国的项目经理如果不能在技术上压服下属,那么下属将与他搞鬼,越是高手越喜欢搞鬼,根本不知道作软件的终极目的是从别人兜里掏钱,而在内部搞不团结。技术高手都会纠集一些对他技术上崇拜的菜鸟,与管理层作对。而印度的软件经理根本就不懂正在做的东西,许多甚至直接就是MBA,或者是领域专家(工业设计、地理专家等),而不是编码 的专家。但是却能够领导大群素质良好的程序员把工作做好,没有内部不团结的情况。许多印度的程序员加入一个公司很长时间,都不知道自己整天编的代码是干什么用的。给他们的任务可能就是一个函数的声明以及该函数要实现的功能。我们呢?
3、他们的编程人员的流动率达到30!他们的编程人员流动率(包括内部项目之间的流动)高达30,可以想见他们的文档水平如何。他们的产品不依赖任何一个人,谁都可以立即辞职,产品的开发还是会正常进行。而中国,是老板怕总工。技术骨干拥兵自重,抗拒管理。任何制定好的计划,都有可能被技术人员推翻或者跟你消极怠工。
4、他们的开发计划能够做到小时级别。如果一个印度公司的项目经理没有上班,那么他的下属将可能不知道作什么。他们的计划一般都定到天,每个基层开发人员每天的工作量就是8小时。而我们能够给出月度计划的 公司就很少,而给出的月度计划要么不可能实现,要么就可能被取消。开发人员 被初略的给个任务,他在月初,可以慢慢琢磨是做成什么样子,然后上上网,聊聊天。到了月中和月末,就开始熬夜编码。看到每年,从各大高校不尽牛人滚滚来,我们是不得不要召人,同时又是不抱希望。我公司现在有意以后将核心软件开发外包给印度公司,中国人?做做界面吧,中国人做界面会极尽奇技淫巧,搞得花里胡哨的。BTW,我公司非外企,大家不要误会我们有什么种族歧视。但是我们现在就是对自己歧视,自卑得很。中科院那么多研究院,连个能用的操作系统都搞不定。北大开发一些东西,比如什么青鸟CASE,就是给一帮人评职称的。杨芙清院士整天搞来搞去,搞出了什么东西?B大,T大的人最难管理,牛得看不见人。中国的程序员骂微软,追Linux是全世界最狠的,可是我们除了汉化Linux,做了什么东西出来。CDE是瑞典人写的,Linus是芬兰的,GNome是墨西哥人写的。哎,我们曾经是多么的瞧不起印度人。
现在,越来越多的人开始学习VC了,如果能精通VC,就象精通了九阴真经一样,可以天下无敌了。我想很多VC爱好者都有这种追求武学至高境界的心理。
我就是抱着这种心理开始学习VC了,至今已近三年了,其间经历过无数的困惑和磨难.....可是我最终没有放弃,到如今已经有一定的功力 :
以下就把我修炼中获得的经验与大家分享,一起提升修行!
首先要搞清楚VC能干什么.很多人只是听说VC是最好的开发语言,便去学习,就象大家听说辟邪剑谱厉害,便都去抢着学一样,都是很盲目的。其实语言并没有好坏之分,我在用C之前,一直觉的BASIC 是最好用的语言。现在在WINDOWS平台下编程,VB和DELPHI可以满足大多数的应用,而且速度不会很慢。使用VC主要是用来开发系统软件和大型工具软件以及开发游戏。现在比较流行的操作系统主要是WINDOWS系列和UNIX系列。这些操作系统都是复杂的多任务系统,在设计操作系统的时候就提供了一大堆应用编程接口(API,通常是C语言的函数),编程者使用C语言调用这些API便可以开发该系统下的应用程序了。这与DOS时代的 编程接口是不一样的,那时侯的函数库是由开发环境提供的(如Turbo C),不具有很好的封装性和设备无关性。
每当新版的WINDOWS操作系统发行,便会提供一个相应的plantform SDK(软件开发包),开发者可以用SDK 编译C程序。在没有VC和VB的时候,WINDOWS程序就是用SDK编出来的。
VC跟这些乱七八糟的东西有什么关系呢?
其实VC的核心就是MFC,MFC是个C++类库,就象结构化程序设计时代的C语言函数库一样,给程序员提供了丰富的编程接口,简化了程序的设计。而MFC就是直接把WINDOWS的C语言编程接口API函数用C++的类封装而成!这样既实现了面向对象的编程思想,又直接使用了WINDOWS的原始编程接口,代码的效率是 最高的!当然很多人不适应C++的编程方法,他们依然使用C语言编写WinMain()和窗口 过程,VC同样为他们提供了很大的便利,因为VC可以很方便的管理资源和代码!
明白了以上关系,学习VC的步骤应该也明确了:首先要学习C语言(如果你还不会的话)!这是非常重要的。如果C语言不懂的话,一切都无从谈起。懂了C语言,你就可以研究 WINDOWS系统的工作原理和WINDOWS应用程序的工作原理了。这也非常重要。VC只能用来 开发WINDOWS系列操作系统下的应用程序,如果不懂WINDOWS下的程序的工作原理就去写WINDOWS 程序,那也是比较盲目的。主要是体会一下WINDOWS的多任务和消息驱动机制。然后就可以使用API编程了。这个过程是比较痛苦的,因为一切都变的复杂起来,你会遇到很多新的方法和概念!比如消息队列,消息发送,窗口过程,GDI,设备上下文,句柄,线程,消息循环,绘图对象......当你可以熟练的使用C语言进行WINDOWS程序设计了,你可以尝试 面向对象的方法了。
这时你需要学习C++语言(最好是ANSI C++),这不是浅尝则止,你要深入的理解C++语言的精髓!经过一定的努力,你可以用面向对象的思想去考虑问题了,这时一切都水道渠成,你可以很自然的使用MFC来编程了,有时你觉的MFC的类不好用,你可以从头作自己的类,而不去继承 MFC!
我每天要收到很多朋友的来信,有很大一部分朋友都询问学习VC的方法和途径,还有相当一些朋友对C/C++语言的前途感到担心,总觉得学习C语言在开发效率上没有赶上其他的开发工具,今天我就借“开发有感”这个栏目谈谈我的一些浅见。
首先来讲我使用C/C++语言开发已经有六年多的时间了,在使用C以前我是用汇编语言的所以我转变到C时就很自然和顺利。但就目前的情况来讲大家都不再需要学习汇编语言了,所以在进入C语言的世界时就会遇到一些困难这主要表现在指针的使用上。由于没有亲身的经历所以我很难想象这个困难有多大,但我在这点上的建议就是开始时尽量避免使用指针,至于一些必须使用指针的C函数只要记住用法就可以了。当然这种情况不会持续太久,因为但你对语言的熟悉程度增加后自然也就会有使用指针进行开发的需求,那时候如果对指针的用法还没有深刻的了解再学习也很容易,这就是主动学习与被动学习的区别。
其次很多朋友都问我如何学好VC,我想对于初学者首先应该掌握的是C/C++,VC只是C/C++的一种开发工具。如果是刚接触C/C++则最好不要使用VC做为开发工具,因为VC的各种特性会分散你的注意力。我建议使用Turbo C++或Boland C++集成平台做为开发工具,这两个平台虽然都是DOS下的但是对于初学者真是在适合不过了(当然MSC也可以)。
此外刚开始时开发一些字符界面的程序(也可以说是DOS程序,Console控制台程序)来加深对语言的熟悉。在掌握了C/C++语言后就可以开始利用VC编写基于Windows的窗口程序了,这时候就是一个转折点,因为这时候Windows系统是基于消息机制的,这和单流程的程序有些区别。所以这时候也不要急着去写学习开发和写代码而是应该先对Windows系统的消息机制做一些了解然后才开始学写程序。其实我的主张是一开始用基本的SDK形式(也就是用WinMain函数的那种,不用MFC功能)来开发几个程序做为入门,然后再使用MFC来开发程序。MFC开发的方式与SDK开发方式的最大区别就是MFC隐藏了很多细节,这是优点也是缺点对于初学者来讲我认为是一个缺点,所以我建议初学者先用WinMain的形式写程序,即使不亲手写也可以看几个基本的程序来加深认识。
上面这些话都是为了说明一个问题“磨刀不误砍柴工”,学习开发一定要打好基础,还有一点就是一定要想办法激发自己的学习积极性让自己进入一个主动学习的境界。
下面我再分析一下C/C++与其他开发语言之间的差别,C/C++,(object)PASCAL,JAVA,PERL都是我认为比较通用而且是比较好的开发语言,但C的语法比PASCAL自由,PASCAL开发比其他结构化强,但这一点上C语言也能够做到。至于JAVA和C++非常类似而且能够跨平台这一点上是很大的优势,但JAVA开发的程序效率差。PERL也是一中我很喜欢的开发语言,虽然PERL没有面向对象的特性(至少我认为它的面向对象很糟糕)但我喜欢PERL中自由的语法和各种时常让人感到惊奇的用法。
如果说到Windows下的可视化开发工具现在大家接触得最多的就是VC,VB,DELPHI,BCB,一些可视化开发的JAVA。其实我觉得VC并不能完全算是一个可视化工具,这表现在VC中编写代码还是占了开发工作的大部分时间。而其他的可视化工具中都在界面设计中耗费了大量的开发时间。我一直使用VC的原因就是因为我能够一直将注意力集中在软件功能开发上而不是界面设计上。我认为这样能够在开发的过程中更加自由和有更多的控制权。而且这种情况下产生的代码维护性更强。举个简单的例子,在维护VB代码时如果没有一份详细的说明和流程就会使维护变得不可能,我想其他的基于界面开发的工具都会或多或少的产生这样的问题,因为在开发过程中开发工具将一个完整的流程分离成为多个部分,在开发完成后这些部分就很难统一起来。
选择什么样的工具的前提是你的开发目标,如果你希望开发一个很大的系统你就不应该选择面向基于界面开发的工具,但你可能会选择VB来开发前端的客户软件,而后台使用VC来实现。
对于一些并不是很复杂的软件来讲,界面和操作方式可能是非常重要的,所以选择VB,CBC都可以缩短开发时间。这时候选择VC就有些不智。
所以我认为使用VC开发的朋友应该将更多的注意力集中在实现软件功能的流程上,多从整体角度看问题。我想这一点来说其他的可视化开发工具是很难达到的,因为VB,CBC等开发的程序在很大程度上都是用各种控件“堆”出来的,这会在后期的维护升级过程中带来很多的不便,例如要替换掉一个控件就可能会对整个程序的结构产生非常大的影响。
最后我想说的是每种开发工具都有它的价值,也各有优缺点,更重要的是如何根据具体的任务选择合适的工具并利用这些工具来完成工作。
软件开发高手:十年磨一剑
要成为武林高手,需要长时间的勤学苦练。要成为软件开发高手,又需要多长时间呢?《Modern C++ Design》的作者Andrei Alexandrescu认为:一个人有可能在20几岁就成为编程高手,但要成为设计高手却需要熬到35岁左右。以23岁大学毕业计算,要经过漫长的12年时间。
以我个人为例(我尚不敢自认是设计高手),22岁大学毕业后,在某研究所用8086汇编语言写一些小规模的程序,颇觉得心应手。凡是能用流传图表示的问题,都似乎不在话下。工作中,与同事共同切磋结构化程序设计,并能有意识地用于实践中。
三年后,承接一个纵向课题:在Windows上开发一个交互式排版系统。用Windows SDK开发。兴奋之余,自然想起用结构化方法进行设计:把整个系统当成一个黑盒子(black box),输出当然是排版结果,不管是什么格式,输入是···。我卡住了。难道用户操作是输入吗?但用户操作有那么多,怎么表示呢?系统的数据流图该怎么画?数据字典该怎么写?和同事讨论n次后,仍不得其解。懊丧之余,先模仿Quark Express搭个界面吧。然后研究排版算法。程序结构经过至少三次大规模修改,终于能排出一些版式,并在两年后通过了鉴定(鉴定后当然是将其束之高阁)。我从中体会到结构化开发方法不适合开发交互式系统。在开发初期,你不太可能正确地画出数据流图,而结构化设计方法完全依赖数据流图。数据流图发生改变,整个程序结构就要随之改变。
后来,加入一家合资公司,担任开发组长,有五、六个组员。这时我已读过了邵维忠等译的《面向对象的分析》、杨芙清等编译的《面向对象的设计》和《Code Complete》中译本。对面向对象的程序设计虽有所了解但仍是一知半解。
首先,我们用MSVC 1.5开发一个图形编辑软件。我用纸画了20几张对象图,与同事讨论通过后,开始编程。有人负责数据模型,有人负责用户界面,有人负责图形显示。几个月后,老板已可向潜在用户进行展示,反应良好。老板和开发人员都被一种兴奋的心情笼罩着。我们不断地加新功能,老板不时地到展览会上做演示。功能加齐了,开始让潜在用户试用。老板和我们都松了一口气:就剩下改错了,咱们是兵来将挡、水来土屯,没什么可怕的。错误报告来了。我们信心满满地开始查错改错。有些错误很快地被改掉了。但最后我们发现错误源源不断。改了一个错误有可能引起别的错误。软件永远达不到能用的地步。最后,时机被错过。该软件不得不被砍掉。懊丧之余,我们做了反省。大家都认为应尽早改错。同时模模糊糊地觉得数据模型和用户界面的程序一定要严格分开,否则程序极难修改。
后来,我们又开发一个类似Adobe Acrobat Exchange的PDF文件浏览器兼编辑器(当时Acrobat Exchange还不能显示中、日、韩文)。这时,老板带来一些过期的《C/C++ Users’ Journal》《Dr.Dobbs’ Journal》杂志。从书评中,我被几本书吸引住了。一本是James Rumbough等著的《Object-Oriented Modeling and Design》,一本是现在大名鼎鼎的《Design Patterns》,还有就是Scott Meyers著的《Effective C++》和《More Effective C++》。我劝说老板买了这几本书,并撺掇他买了一个CASE(计算机辅助软件工程)工具:Select OMT 仔细研读这几本书后,颇有顿开茅塞之感。最大的收获在于了解到降低类之间耦合度的重要性。一个类的实现细节发生变化,不应该影响使用该类的其它类的内部实现。更妙的是有不少Design Pattern能马上用到我们的软件中。
我用Select OMT软件画了一些高层的类图、状态图和数据流图等,并让同事们审查。同事们都觉得通过这些图对软件的总体设计有了更好的把握。在写程序的过程中,我们不断调整程序结构以尽可能减小类之间的耦合度。老板很早就安排了专职测试人员。发现问题,马上修改。一年后,我们的软件终于通过了用户的试用,卖出去了。当时,我可说是信心满满。
此后,我做了一年半多媒体编程。发现还是对系统开发更感兴趣。于是加入了Quark软件公司,开发一个基于CORBA的文件管理系统。这是我第一次参与异地开发,也是第一次大规模使用STL。我惊叹于STL设计之妙,同时也对自己的信心打了折扣。此后,我阅读了Martin Fowler著的《UML Distilled》、Bertrand Meyer著的《Object Oriented Software Construction》等书籍。并开始使用Rational Rose。Quark公司的技术文档管理、设计复查、代码复查、质量管理以及德国人(Quark公司德国分公司)严谨的工作态度都给我留下了深刻印象。
项目组下分开发组和测试组。开发组中有一个4到5人组成的设计小组负责软件总体设计,其中一个人负责技术文档,确保文档反映最新的设计。定期进行设计复查。复查时,项目组成员全部参加,并可提出问题或建议。得出结论后,马上付诸实施。开发组下又设若干小组。小组内定期进行代码复查。由组长选出每个组员的源文件,交其他组员复查,尽量挑出所有的毛病。如果代码太次,要打回从新写过。代码复查既能保证软件质量,又是大家学习的一个机会。
一年半后,我离开Quark,加盟Sybase,参与PowerBuilder的维护和新版本的开发。这是我第一次参与软件维护,令我认识到软件维护的重要性,认识到编写可维护的代码是软件开发的一个重要课题。Sybase系统化的质量跟踪系统和用户支援系统让我获益匪浅。在此期间,我阅读了《Large-scale Software Development in C++》、Martin Fowler著的《Refectoring》、Andrei Alexandrescu著的《Modern C++ Design》,Herb Sutter著的《Exceptional C++》和《More exceptional C++》,以及Kent Beck著的《Extreme Programming Explained》等书籍。对软件开发与维护有了进一步了解,但同时也更认识到软件开发之难。
回想十几年蹒跚走过的路,好像也略有所悟。试总结出以供参考:
1)要熟练掌握至少一种编程语言。我觉得最好是C++。掌握了C++,学习其它语言如Java或C#等并非难事,因为各种面向对象的程序语言尽管在语法上可能有很大区别,在语义上却大同小异。
2)不要寄希望于一次就把软件设计好。在开发初期,要尽量用最简单的设计实现最基本的功能,以使你的软件尽早地能实际运行,不要过于拘泥于细节。这样你才能尽早得到反馈,才能更直观更全面地理解你所面对的问题。你所关注的重点应依次是Make it work, make it right, make it fast。
3)软件结构要分块分层。低层模块不要依赖于上层模块。一个类、一个接口或一个函数都应只做一件事。没有本质联系的类或接口就不应有耦合关系。举例而言,要用MVC(Model View Controller)Design Pattern切断用户界面与数据模型之间的直接关联。
4)软件设计的主要工作是给类分配责任(responsibilities)。尽量不要把类设计成控制者(controller),而要设计成协调者(coordinator)。控制者凡事自己做,协调者让别人做。控制者的逻辑往往很复杂,难于维护;协调者逻辑简单,易于维护。要站在类的使用者角度设计类的外部行为。要讲究一点软件美学,即简单、清晰、一致、平衡等。
5)了解并运用UML、Design Patterns、Unit Test、Design by Contract等。6)使用代码管理系统和质量跟踪系统。
7)了解各种软件开发过程控制方法,并找出适合你的方法。8)阅读经典书籍,研读经典代码,订阅杂志,与同行切磋。
在这行越久越觉得软件开发难。软件开发历史还很短,才50年,还不是一门系统化的学科。有些人甚至认为软件设计与编程是一门艺术。但软件艺术大师还太少,而且我们很难直接欣赏到他们的杰作,除非所有的设计文档和代码都公开。软件更容易藏污纳垢。一个用户界面很漂亮的软件,内部设计和代码却很可能臭不可闻。一个地板倾斜、墙壁裂缝、屋顶漏水的房子没有人会买。一个设计很烂的软件却可能卖得不错。但这样的软件能撑多久呢? 软件设计与编程已经很难,而这仅仅是软件开发的一个方面,软件开发过程控制也很难,也许更难。成为软件开发高手要走一条漫长的路,何日才能仗剑走天涯?
第三篇:C++程序员求职信
C++程序员求职信
光阴如水,找工作的黄金时间马上就要到来,是时候好好地琢磨一下写求职信的事情了哦。相信写求职信是一个让许多人都头痛的问题,以下是小编帮大家整理的C++程序员求职信,仅供参考,欢迎大家阅读。
尊敬的公司领导:
您好!
非常感谢您在百忙之中抽出宝贵的时间来垂览我的求职材料!
我叫xx,是南开大学计算机系的一名本科大学生,即将面临毕业。怀着对贵公司强烈的渴望和满怀的激情,我十分希望成为贵公司的一份子!恳请贵公司给我这个机会!我也会向贵公司证明我的能力!
4年多以来,在老师的教育及个人的努力下,我具备了扎实的专业基础知识,系统地掌握了c++语言、汇编语言、单片机原理、电子电路、计算机组成原理、数据结构、数据库等有关理论,以及嵌入式系统开发的一些理论,同时也拥有一定的分析和设计能力。通过在校期间的试验实习和课程设计的训练我具备了较强的动手能力。
除了对计算机热爱,在大学四年里我还不断的学习英语知识,我深切的`感受到当今社会以及计算机行业,没有过硬的英语能力是不行的,并且将会成为我们事业前进的瓶颈。我在大二上学期就通过了全国大学生英语四级考试。此外,我还积极参加校内的各种活动以及校外的各种社会活动,抓住每一个机会,锻炼自己的能力。
我通过各种渠道大致了解了贵公司的情况,知道贵公司是个很有发展前途的具有现代潮流的公司,具有很大的活力,而我也非常希望能加入这样的企业,尽自己最大努力为公司的发展奉献自己的微薄之力。
我十分热爱贵单位所从事的事业,殷切地期望能够在您的领导下,为贵公司添砖加瓦;同时也在您的领导下发挥出我的实力与才能,在实践中不断学习、进步,在能力和素质方面进一步完善自我,为贵公司做出更大的贡献。无论您是否选择我,我都祝愿贵公司的事业蒸蒸日上!
此致
敬礼!
第四篇:一个老程序员的心得
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以内的素数 表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这 一条。
这些是我这几年程序员生涯的一点体会,希望能够给大家有所帮助。
第五篇:C++ 心得
2010.10.13
今天在学习用windows自带的dos命令提示符窗口的命令:
列文件名dir,创建文件夹md(其他文件不能通过该命令创建,即使用了该类文件的后缀名,也只是将该名称和后缀名一块作为了一个新建文件夹的名字,例如md aa.txt的作用是建立一个名为aa.txt的文件夹),删除文件夹下的所有文件del(但是不包括该文件夹下的子文件夹。网上还有人说用deltree可以删除目录树,但是我试了不管用),删除文件夹rmdir或者rd(必须是空的,不能含文件或者文件夹),重命名文件或者文件夹ren x y(将x改名为y,如果是文件则应包括后缀名,如果是文件夹只是名字就可以),移动文件或者文件夹(没找到),复制文件copy a b(a和b可以是文件夹,这时候会复制a中的所有文件但不包括子文件夹到b中,遇到同名文件会询问是否覆盖;如果a和b是文件,则要包括后缀名,而且不只是相同后缀的可以复制,例如两个txt文件,而且非同后缀的文件也可以,例如txt复制到doc文件或者rar文件,这种复制后会连txt的属性一起复制给doc或rar,包括大小和占用空间这两个属性,doc的话还是可以打开,但是rar会损坏掉),创建文本文件copy con A.txt(或者用edit A.txt,区别是前一个会在输完命令后让你再输入文本内容,输完用ctrl+z结束,而后一个会跳出一个类似turbo-c的界面让你输入文字再保存),以树形结构显示出目录tree(用参数-f 将列出第个文件夹中文件名称)。
然后我想解压一个再f盘的压缩文件B,发现在ms-dos里进入B的目录后,直接输入
B.rar或者B.rar /x都会直接打开B,和双击B的效果相同(之前装.NET 3.5 Framework的时候用过这个命令dotnetfx35.exe /x来解压,我想用类似命令解压B的,结果证明不行,上面这个命令应该是只针对.EXE文件有效果,而且不是普通的EXE文件,应该是压缩类的exe文件)。但是我在实验exe文件的时候发现一个有用的办法。平时在有些文件夹里会有一些exe文件,双击之后有些可以运行,但是dos窗口一闪之后就没有了,看不到内容,但是先打开ms-dos,再进入该exe文件目录后输入名称回车则会看到运行内容,并且ms-dos窗口不会关闭。这可以用到C++编程之中。C++编程中,程序运行后有时候也会出现上面的情况,dos窗口一闪而过,看不到运行结果,以前都是直接在程序末尾加入system(”pause”)命令,现在也可以先将程序编译并生成exe文件,再打开MS-DOS,进入exe文件所在文件夹,输入该exe名称的方法来运行,这时候一定可以看到结果。