程序员从初级到中级的10个秘诀

#1: 学习另一门语言

其实你学的是哪一门语言并没有关系,但是学习另一门语言(不管你已经了解多少种语言)将把你打造为更好的程序员。能学会一门与你日常使用的语言风格迥异的语言则更佳。打个比方,如果你是C#程序员,学习VB.NET或者Java对你的帮助就没有学习Ruby或者Groovy大。

我说“学另一门语言”的意思是要真正学会它。学习一门语言包括三个领域的知识:语法、内置操作符和库,以及“如何使用”。前面两个简单;我认为一名有经验的程序员,根据语言的不同,能在半小时到几小时内掌握足以维护代码的语法知识。操作符和库只不过是知识逐步积累的过程,你什么时候想清楚要了解什么了,再去查阅参考材料也不迟。只有第三项,“如何使用它”
- 要花上你几个月的时间去跟这门语言打交道,真正的奇迹就在此发生。我建议用这门语言的风格去做一个适合该语言的项目。

真正学会了另一门语言之后,我敢保证你的程序员水平一定会突飞猛进。

#2: 学习先进的搜索技术、手段和及策略

作为一名好的程序员,不仅仅是技能的问题了,而是你寻找信息的技巧,这个趋势越来越明显。对大部分人而言,仅仅输入“现代语言及开发框架”,这都是泛泛之谈,记不住多少的。因此,你完成工作的能力通常取决于你的检索能力。不幸的是,了解到如何找到准确而高质量的信息可不仅仅是跑到TechRepublic来找答案,或者在你选好的搜索引擎上敲几个字那么简单。

“技术(Techniques)”、
“手段(tactics)”和“策略(strategies)”看起来是一回事,实际上并非如此。你需要学会的技术是掌握你喜爱的搜索引擎的高级搜索系统;你需要了解诸如布尔操作符,如何过滤结果(像“非”关键字,域限制等等),关键字的词序扮演什么角色,等等。一句话,RTFM(Read
The Fucking Manual,读那些他妈的手册)吧。

你应该学会这些手段,诸如如何接近特定的搜索,以及了解自己实际上想查些什么。查错误很容易 — 只需查出错代码即可 —
但是许多搜索的关键字选择要困难得多。

至于策略,你需要学会的东西,包括像应该使用哪种搜索引擎(提示:普通的搜索引擎不一定就是最佳选择),
使用普通搜索引擎前应该访问哪个网站,甚至是应该到哪个论坛去寻求帮助,等等。

#3: 帮助别人

教别人始终是学习一切东西的最好方法之一。相对而言,由于你在开发领域还是个新手,认为自己没什么可教给人家的,这可以理解。但这毫无意义。记住,你所学到的一切都是你从别人或别处学到的;因此请尝试一下,成为另外一个人要请教的“别人”。每天尽量花一点时间试着回答TechRepublic上的问题,其他网站的亦可。读读其他会员的回答,你也可以学到很多东西。

#4: 有耐心,常练习

研究表明,要成为一名“专家”,需要花费10年,或者10000到20000小时的刻意练习时间。 真的很久。还有,成为专家不尽然就是执行10年同样的任务;通常这意味着要在特定领域内执行广泛的任务。需要花费大量的时间和精力才能成为”专家”;做几年程序员是不够的。想在30岁左右成为一名高级软件开发工程师 ?要么尽早接受教育/培训,要么你得愿意在闲暇时间进行大量的工作、阅读和练习。我从高中开始编程,还牺牲了许多休息时间去跟踪行业发展、学习新技能等等。结果,我获得中级和高级程序员的时间就比我的大部分同事都要早得多,随着时间的推移,这些就转化成为很多的金钱。

#5: 对教条拒之门外

是时候开诚布公了:也许初级程序员了解的东西还不足以说出做某件事情有一种最好的方式。尊重朋友或者权威的观点是好的,但直到你更有经验之前,不要把他们的观点说成是你自己的。很简单,如果你所了解的不足以让你独立地找出这些东西来,你又怎么会认为你知道哪一位“专家”是对的呢?话是难听了点,不过请相信我;由于受某些愚蠢建议的蛊惑,或者追随某些根本不知道自己在说些什么的所谓专家,白白把自己的职业生涯耽搁了几年,这样毛头小伙程序员,我见过多了。 这一点有一个很好的例子,就是面向对象结构的滥用。 比如说,许多初级者读了一些有关面向对象的信息后,突然间,他们那简单的应用程序的类图看起来就像埃菲尔铁塔一样了。

#6: 深入学习一点先进理念

成为一名中级程序员,很大一部分是要在代码里面体现出一些所擅长的概念。就我而言,是多线程/并行性,
是正则表达式,以及如何对动态语言进行变化(后两个在我离Perl渐行渐远后开始退化)。这是如何发生的?多线程和并行处理是因为我读了相关文章,觉得它看起来很有趣,然后再自己把它弄清楚了;然后我就一直使用这些技术来写应用。我做过一件工作,是用Perl写的,里面运用了大量的正则表达式。我也用一个过程引擎模板和内置数据库系统写过我自己的电子商务引擎;那时我几乎花了2年时间在这上面。

找到真正令你着迷的东西。也许是图像处理,也许是数据库设计,等等。即便你是一个入门级的程序员,也要尝试一下成为某一自己所关注领域的专家。这会让你相当快速地进入到中级水平,一旦你到了那个水平,你的专家之路也走到一半了。

#7: 学习你的领域里面的基本理论

写出“Hello
World”,跟理解那些字是如何显示到屏幕上的是两码事。通过学习支撑你所从事的工作的“基础/底层工作(groundwork)”,你会变得更加在行。为什么?因为你会理解事物为何会以这种方式运作,当东西坏了就能知道是哪里的问题,等等。通过掌握工作的底层机制,你变会得更出色。

如果你是Web程序员,读读HTTP RFCHTML规范。如果你使用代码生成器,好好看看它生成的代码;如果你使用数据库工具,看看它生成的底层SQL语句,不一而足。

#8: 看看高级程序员的代码

在工作中看看高级程序员写的代码,然后问一问事情是如何以某种特别的方式完成的,为什么?可能的话看看开源的项目。甚至即使其他程序员没有最好的编程习惯,你也会学到许多编程经验。当然,要小心别学到坏习惯。我的意思是说不要生搬硬套人家的东西;你要能领会到哪些是能行的通的,哪些是有道理的,然后再模仿人家。

#9: 学习好的习惯

愚蠢的变量名,糟糕的缩进习惯以及其他一些凌乱的迹象就是一个没有经验的程序员的最好标记。一个程序员在学会如何编程时,却经常没有被传授到那些不那么有趣的细节,像代码格式编排
。甚至尽管学习这些东西并不会令你的代码更好,也不会令你成为更好的程序员,它也会确保你不被同事视为入门级的程序员。甚至即使某人是高级程序员,如果他的变量是以他那97只猫的名字来命名,或者其函数叫做“doSomething()”的,他们看起来也不像是知道自己在干什么的人。而且会令其代码在过程中更难以维护。

#10: 要玩的开心

想要痴迷于单调乏味的工作?痛恨工作吧。要想升级为中级程序员可不仅仅是为了拿到不断增长的工资不达目的誓不罢休,而是要真正享受工作。如果你不喜欢自己的工作,且还是初级程序员,你怎么会认为成为中级或高级程序员情况就会有所好转呢?换工作或改职业吧。反过来说,如果你喜爱所从事的工作,那就好!只要你坚持下去,我保证你能成为一名更好的程序员。

高质量C++教程 — 第2章 程序的版式

高质量C++教程 -- 第2章 程序的版式
来源:www.vcworld.net 

版式虽然不会影响程序的功能,但会影响可读性。程序的版式追求清晰、美观,是程序风格的重要构成因素。

可以把程序的版式比喻为“书法”。好的“书法”可让人对程序一目了然,看得兴致勃勃。差的程序“书法”如螃蟹爬行,让人看得索然无味,更令维护者烦恼有加。请程序员们学习程序的“书法”,弥补大学计算机教育的漏洞,实在很有必要。

 

2.1 空行

空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰。空行不会浪费内存,虽然打印含有空行的程序是会多消耗一些纸张,但是值得。所以不要舍不得用空行。

 

●【规则2-1-1】在每个类声明之后、每个函数定义结束之后都要加空行。参见示例2-1(a)

●【规则2-1-2】在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。参见示例2-1(b )

// 空行

void Function1(…)

{

}

// 空行

void Function2(…)

{

}

// 空行

void Function3(…)

{

}

// 空行

while (condition)

{

statement1;

// 空行

if (condition)

{

statement2;

}

else

{

statement3;

}

// 空行

statement4;

}

示例2-1(a)
函数之间的空行      
示例2-1(b) 函数内部的空行

 

2.2 代码行

●【规则2-2-1】一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。

●【规则2-2-2】if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。

int width; // 宽度

int height; // 高度

int depth; // 深度

int width, height, depth; // 宽度高度深度

x = a + b;

y = c + d;

z = e + f;

X = a + b; y = c + d; z = e + f;

if (width < height)

{

dosomething();

}

if (width < height) dosomething();

for (initialization; condition; update)

{

dosomething();

}

// 空行

other();

for (initialization; condition; update)

dosomething();

other();

示例2-2(a)
风格良好的代码行        
示例2-2(b) 风格不良的代码行

 

●【建议2-2-1】尽可能在定义变量的同时初始化该变量(就近原则)

如果变量的引用处和其定义处相隔比较远,变量的初始化很容易被忘记。如果引用了未被初始化的变量,可能会导致程序错误。本建议可以减少隐患。例如

int width = 10; // 定义并初绐化width

int height = 10; // 定义并初绐化height

int depth = 10; // 定义并初绐化depth

 

 

2.3 代码行内的空格

●【规则2-3-1】关键字之后要留空格。象const、virtual、inline、case
等关键字之后至少要留一个空格,否则无法辨析关键字。象if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。

●【规则2-3-2】函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。

●【规则2-3-3】‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。

●【规则2-3-4】‘,’之后要留空格,如Function(x, y,
z)。如果‘;’不是一行的结束符号,其后要留空格,如for (initialization; condition;
update)。

●【规则2-3-5】赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=”
“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格。

●【规则2-3-6】一元操作符如“!”、“~”、“++”、“--”、“&”(地址运算符)等前后不加空格。

●【规则2-3-7】象“[]”、“.”、“->”这类操作符前后不加空格。

●【建议2-3-1】对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for (i=0;
i<10; i++)和if ((a<=b)
&& (c<=d))

void Func1(int x, int y, int z); // 良好的风格

void Func1 (int x,int y,int z); // 不良的风格

if (year >= 2000) // 良好的风格

if(year>=2000) // 不良的风格

if ((a>=b) &&
(c<=d)) // 良好的风格

if(a>=b&&c<=d)
// 不良的风格

for (i=0; i<10; i++) // 良好的风格

for(i=0;i<10;i++) // 不良的风格

for (i = 0; I < 10; i ++) // 过多的空格

x = a < b ? a : b; // 良好的风格

x=a
<>

int *x = &y; // 良好的风格

int * x = & y; // 不良的风格

array[5] = 0; // 不要写成 array [ 5 ] = 0;

a.Function(); // 不要写成 a . Function();

b->Function(); // 不要写成 b ->
Function();

示例2-3 代码行内的空格

 

2.4 对齐

●【规则2-4-1】程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。

●【规则2-4-2】{ }之内的代码块在‘{’右边数格处左对齐。

void Function(int x)

{

… // program code

}

void Function(int x){

… // program code

}

if (condition)

{

… // program code

}

else

{

… // program code

}

if (condition){

… // program code

}

else {

… // program code

}

for (initialization; condition; update)

{

… // program code

}

for (initialization; condition; update){

… // program code

}

While (condition)

{

… // program code

}

while (condition){

… // program code

}

如果出现嵌套的{},则使用缩进对齐,如:

{

    …

    {

        …

    }

    …

}

 

示例2-4(a)
风格良好的对齐        
示例2-4(b) 风格不良的对齐

 

2.5 长行拆分

●【规则2-5-1】代码行最大长度宜控制在70至80个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。

●【规则2-5-2】长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。

if ((very_longer_variable1 >=
very_longer_variable12)

     &&
(very_longer_variable3 <=
very_longer_variable14)

     &&
(very_longer_variable5 <=
very_longer_variable16))

{

     dosomething();

}

virtual CMatrix CMultiplyMatrix (CMatrix leftMatrix,

                                 CMatrix
rightMatrix);

for (very_longer_initialization;

     very_longer_condition;

     very_longer_update)

{

     dosomething();

}

示例2-5 长行的拆分

 

2.6 修饰符的位置

修饰符 * 和 & 应该靠近数据类型还是该靠近变量名,是个有争议的活题。

若将修饰符 * 靠近数据类型,例如:int* x; 从语义上讲此写法比较直观,即x是int 类型的指针。

上述写法的弊端是容易引起误解,例如:int* x, y;
此处y容易被误解为指针变量。虽然将x和y分行定义可以避免误解,但并不是人人都愿意这样做。

 

●【规则2-6-1】应当将修饰符 * 和 & 紧靠变量名

例如:

char *name;

int *x, y; // 此处y不会被误解为指针

 

2.7 注释

C语言的注释符为“”。C++语言中,程序块的注释常采用“”,行注释一般采用“//…”。注释通常用于:

(1)版本、版权声明;

(2)函数接口说明;

(3)重要的代码行或段落提示。

虽然注释有助于理解代码,但注意不可过多地使用注释。参见示例2-6。

 

●【规则2-7-1】注释是对代码的“提示”,而不是文档。程序中的注释不可喧宾夺主,注释太多了会让人眼花缭乱。注释的花样要少。

●【规则2-7-2】如果代码本来就是清楚的,则不必加注释。否则多此一举,令人厌烦。例如

i++; // i 加 1,多余的注释

●【规则2-7-3】边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。

●【规则2-7-4】注释应当准确、易懂,防止注释有二义性。错误的注释不但无益反而有害。

●【规则2-7-5】尽量避免在注释中使用缩写,特别是不常用缩写。

●【规则2-7-6】注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。

●【规则2-7-8】当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。

 

void Function(float x, float y, float z)

{

    …

}

if (…)

{

    …

    while
(…)

    {

        …

    }
// end of while

    …

} // end of if

示例2-6 程序的注释

 

2.8 类的版式

类可以将数据和函数封装在一起,其中函数表示了类的行为(或称服务)。类提供关键字public、protected和private,分别用于声明哪些数据和函数是公有的、受保护的或者是私有的。这样可以达到信息隐藏的目的,即让类仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。我们不可以滥用类的封装功能,不要把它当成火锅,什么东西都往里扔。

类的版式主要有两种方式:

(1)将private类型的数据写在前面,而将public类型的函数写在后面,如示例8-3(a)。采用这种版式的程序员主张类的设计“以数据为中心”,重点关注类的内部结构。

(2)将public类型的函数写在前面,而将private类型的数据写在后面,如示例8.3(b)采用这种版式的程序员主张类的设计“以行为为中心”,重点关注的是类应该提供什么样的接口(或服务)。

很多C++教课书受到Biarne
Stroustrup第一本著作的影响,不知不觉地采用了“以数据为中心”的书写方式,并不见得有多少道理。

我建议读者采用“以行为为中心”的书写方式,即首先考虑类应该提供什么样的函数。这是很多人的经验——“这样做不仅让自己在设计类时思路清晰,而且方便别人阅读。因为用户最关心的是接口,谁愿意先看到一堆私有数据成员!”

class A

{

private:

int i, j;

float x, y;

public:

void Func1(void);

void Func2(void);

}

class A

{

public:

void Func1(void);

void Func2(void);

private:

int i, j;

float x, y;

}

示例8.3(a) 以数据为中心版式
       示例8.3(b)
以行为为中心的版式