如何成为程序员:如何成为一名C++程序员

入门:  入门就是要初步对编程的思想有个了解,并且能编程解决一些小问题。入门一定要选好书,难度如果太低了会造成对读者的误导,以为编程就是这么回事;也不能太高深,免的打击读者的信心。既然编程的入门要求是编一些小程序解决小问题,那么就没必要直接学习C++,我觉得循环、判断、跳转、指针才是最基本的编程思想,学通了这些对以后学习C++很有帮助。
  我建议应该先把C扎实地学好,不光要掌握C的语法,因为学习编程的最终目的是解决实际问题,所以还要适当掌握把实际问题与编程联系在一起的能力,我推荐《 C程序设计语言(第2版) 》,这本书是C语言之父写的,不仅详尽介绍了C的语法,还提供了很多实际的小问题作为实例,可以说看了这本书之后能为以后的编程学习打下一个扎实的基础!
  提高:
  学了《 C程序设计语言(第2版) 》后可以开始学习C++,一开始没必要钻很深的大部头书,《 Essential C++中文版 》非常适合初学,一个礼拜就可以看完,看了它可以快速对C++的全貌有个了解,虽然不会马上熟练掌握C++。
  我们不能满足于解决“百钱买百鸡”,真正实现程序还有很多非功能上的问题,比如怎样做才能使用更少的内存?怎样做才能更快?在熟悉一门语言后,一定要认真学习的就是数据结构!数据结构保证了我们的程序能以高效的方式运行。《 数据结构算法与应用C++语言描述 》是本好书,它提供了很多实际的例子,比如火车站调度、走迷宫,相比于“百钱买百鸡”这种问题又提高了一个层次。
  接下来专心提高C++的水平,可以选择《 C++编程思想 》,然后再看《 Effective C++中文版 2nd Edition 》和《 More Effective C++中文版 》,这两本书介绍了高效使用C++的宝贵经验,语言很幽默。至此,你已经可以自称是C++程序员了,恭喜!
  下面介绍几本书,有兴趣的朋友可以选读。如果想高效地使用C++开发软件,STL一定要学!《 C++标准程序库—自修教程与参考手册 》可以帮你学会STL的使用,而且开发时可以拿它做手册,有了前面数据结构的基础,学习STL的使用不会遇到什么困难。如果你还想知道STL的设计思想及原理,不妨看看《 泛型编程与STL 》。有些朋友可能会问,C++的面向对象机制是怎么实现的?《 深度探索C++对象模型 》给了你答案,它剖析了C++底层的实现。最后,如果想有一本C++大百科全书,那非《 C++程序设计语言(特别版) 》莫属!这本书是C++之父Bjarne Stroustrup的大作,算是书中权威。
  再提高:
  到现在为止,你已经熟练掌握C++语言了,现在需要提高的就是设计思想,面向对象(OO)的最大特点是把我们的注意力从系统的执行体系结构转移到概念体系结构,因此利用OO开发大型系统会更轻松。但是经常可以看到人们拿着C++用面向过程的思想解决问题,缺乏的就是面向对象的设计思想,也难怪,在这里之前看的书都没有教你怎样用面向对象的方法开发系统,顶多介绍了面向对象是什么,看了这么多书难免会先入为主,《C语言程序设计》(或者你看的第一本编程书)中的思路潜在的影响着我们。这条鸿沟就由《 设计模式--可复用面向对象软件的基础 》来补救吧!所谓模式就是前人总结出来的、经过千锤百炼的一种系统结构,设计模式展示了23个经典的模式,通过学习、理解,你可以看到什么是真正的面向对象。
  看了《 设计模式--可复用面向对象软件的基础 》后,有时间不妨看看《 重构--改善既有代码的设计(中文版) 》,学了面向对象的设计思想后看它,可以站在一定高度重新审视一下自己的C++编程水平。
  结束语:
  在学习编程的过程中一定要注意多实践!学习时到专业论坛同大家讨论是个不错的办法,你会找到许多热心的朋友与您一起学习,能通过学习编程交些朋友不是更好吗?最后,希望您能成为优秀的程序设计师,为中国软件的发展贡献一份力量!
发表于 @ 2005-11-29 02:39 ryudo 阅读(270) | 评论 (0) | 编辑 收藏
勿在浮沙筑高楼:给编程入门者的建议
前几天重读Eric S. Raymond的How to become a hacker,看到他推荐编程入门选用Python,突然觉得很压抑,有了些想法。我建议编程入门的人学C或者Pascal,如果更进一步的话可以用汇编语言,因为这样能更清楚的了解底层。
  下面针对一些支持选用Java, Python, C++(指用了非C特性的C++)等高级的OO语言入门的人可能的原因作些说明。
  1. Pascal, C太老了,过时了,平时用得很少,现在流行Java等等。
  标准Pascal的确是比较老了,不过有Delphi后继呢,说C老恐怕就是无知了,C现在用得很广泛,似乎sourceforge.net上的项目还是C的最多。推荐Pascal不是因为Delphi。选择Pascal, C是觉得两个现在很常见,语法很有代表性,简洁明了。
  不要动不动觉得什么东西过时了,COBOL还有OO版本面世,还有FORTRAN,LISP,好古老的语言吧,现在还用得很广呢。
  2.入门要从OO开始,培养用OO方式思考的习惯。
  首先要说明,OO是方法,不是语言,初学者一入门便摆弄Java, Python, Delphi等很容易形成误解,似乎OO=Java, Python, C++...
  其次,过程式语言(或者说结构化方法)的精髓不会消亡,OO里面也不可能摆脱掉一条条的语句、函数调用,结构化方法还是需要提倡的。OO方法不是那么容易学会的(OO语言的语法弄得很熟练不代表你懂OO),而结构化那套方法,自个写个千把行的程序就很能体会了,我是说写个实用点的东西,比如试着自个实现一些数据结构和算法,写几个小游戏等。写个一千行Hello world等于没写。
  我觉得方法是实践中体会出来的,不是看看书就能学会的,你看Design Patterns等把模式背的滚瓜烂熟很可能会陷入过度设计的泥潭,你写了几千行代码,然后再去读一读,改改调试调试,慢慢增加功能,你就会发现自己代码写的有多么臭了,然后看看书听听别人意见你就知道什么叫Best practice了,最好的经验就是在焦头烂额之际得到的。
  过程式语言的代码一般比较简练,我们编程序最终的目的是要解决问题,是要计算,是要获取信息,不要被OO, pattern, EJB, Web Services等迷糊了(我不是反对这些技术).
  强烈建议各位多读代码,你去看看莱昂氏的那本UNIX v6源码分析,仔细看,慢慢看,你就能体会到什么叫精致的代码了,然后尝试按照那个风格写代码。
  3.过程式语言弄久了,很难转入OO的思维模式
  我以前也没有深想过这个理由,不过时间久了,发觉自己不过是把数据和方法集中在一起而已,看着方便,其实有很多不合理的东西,这里头就需要OO的理论指导了,还是需要时间来体会。我相信有很多用OO语言的人也不过是在框架里头添添代码,调用来调用去而已,把人类当作数据和操作的打包器。
  个人觉得只有在用过程式方法做了十来年,编码上十万行后才有思维定势,难以习惯用OO的眼光看待系统,然而这个转变,我仍觉得比改变一个人的恶习容易许多。OO方法不是学了个Java, Python, C++等就能掌握的,需要实践,需要时间。过程式语言也容易培养一个人严谨的做事态度,比如用Pascal, C等写代码,没有namespace,没有function overload, 没有reference(Pascal有,呵呵,我喜欢),没有template, 没有exception, 你要花很多心思处理一些细节,比如警惕数组索引越界,悬挂指针,野指针等等,请不要觉得麻烦,这个就是计算机啊,底层就是这样的啊。 4.别用C, Pascal了,看我用Java, Python, Delphi, VB, VC等轻轻松松就写了个PP的GUI,NB的分布式应用...
  这篇文章是给初学者看的,也可以给一些浮躁的人看看(我也反省,呵呵),初学编程的人精力应该放在数据结构、算法上面,尽量多看一些底层的东西,数字逻辑,操作系统,编译原理,计算机组成、体系结构,计算机网络等等基础知识。编写GUI拖几个控件有什么好吹的,你懂界面设计的原则么,你知道窗口消息怎么回事么,你编的界面是把易用放在第一位呢还是把漂亮放在第一位呢,你的GUI程序容易修改吗?比如我一会要加个button,一会去个listbox,你会不会改的疯掉呢?你是不是在OnClick里头写了大段大段的代码,做类似“从edit1.text中去掉不是数字的字符,搜索xxx再转成16进制,再复制到edit2.text”的事?
  嗯,你socket弄得熟练,recv来,send去,可是如果你不懂tcp/ip协议那就有点可笑了,除了用别人做好的函数库你还能搞出什么新花样?弄分布式应用的知道“分布式”怎么回事吗,
  你是否只是在用API堆砌代码呢?倘若有一天这个函数库没人支持了,你是不是就傻眼了?
  比如编游戏,没看过3D图形学便搞DirectX,也是比较可笑的。
  我并不是说你编比较高层的东西就必须先得透彻了解底层怎么实现的,我只是建议你好歹把底层的东西混个脸熟,遇到问题时心里有个谱,查查资料,别动不动扑某个论坛求救。以前在BBS上看到某人的话,说BBS不是学习的地方,是开拓眼界的地方。深以为然。
  学习还是找纸版的书老实的看比较好,想想你积攒了多少电子书而又看了多少。
  底层不了解,仅多也就飘在别人上头,别人一闪身,你就得摔下来。
  初学编程的人一来就IDE, GUI, Network啥的猛搞,能不浮躁么?还是沉下心来研究一下基础知识吧,我以脑袋担保你有生之年会觉得他们有用的(呵呵,你转行我就没辙了),别看着别人弄JFC, Socket了你还在头大这个quick sort怎么就不对呢就心里惶惶的,你要知道在一批API不被支持后不少人心里空空的没个着落:天啊,我除了那个就啥都不会了,郁闷啊,花了我那么久时间钻研那套API,呜呜。。。。
  5. C好难啊,我入门还是从Java,Python开始吧
  首先,是自个要做程序员的吗?是想编程还是想赚钱啊?
  其次,我们来比较一下难易:
  C: k&r那本书真的不算厚,经典的C的书很少,说C难,大概是传说中C的指针很难吧,C的语法很简明的,就是指针,只要你认真看看书,写几个程序试一试,那几个指针的用法不难掌握,另外大家千万不要去死钻*++ ++*之类的语法,关于这点在《开发高手》最后一期上裘宗燕老师有一篇精彩的文章。大家记住写代码是要维护的,别耍弄语法技巧给自己或后人制造麻烦,你想想自己看别人写的天书代码是赞叹还是咒骂?
  Java: 书太多了啊,就说Gosling(没拼错吧)那本,相当厚,学Java的人一开始都被classpath和package的问题烦过吧,还有Java的关键字,语法,Sun鼓捣出来的一堆堆Java技术名词,是不是有点晕了?
  C++的确有难度,你可以看看C++语言的设计和演化,就可以知道C++怎么这个德行了,呵呵。有意思的是Java现在加入模版,而且因为伪模版的实现被人诟病,还有那个EJB的转变,有意思,大家可以思考一下“复杂”、“实用”这些词。
  Python的确比较清爽,不过深入一点后其内部对象模型也不简单,想想操作一个列表有多少方法,各种功能强大的操作符,而且现在的OO语言逼着你OO, 结果往往是语法OO而已,没多大新意,我还是欣赏Perl, C++这类语言,你想怎么就怎么,重要的是要用合适方法,趁手工具,最少的时间做有价值的东西,把你钻研语言的语法的时间拿来锻炼一下身体,泡杯茶看看小说我觉得更好一些。
  语言只是表达思想的工具,不要只局限于一种语言,不要狂热于某一门语言。
  学编程时选书最好先看一看书中的代码,是取自实际应用中的吗?写的漂亮吗?(指代码自身的精致,以及排版是否工整)代码中有语法错误吗?(鄙视某些没编译试试就把代码copy到书里的作者)
  有本Essential C#,取的是.Net类库的代码,很棒,讲delegate(希望没拼错,好久没弄这个了)时举的例子很清楚地让人看到这个东西该怎么用。
  另外推荐Learning Perl,我个人觉得是我看过的最好的关于编程的书,该讲么,不该讲什么,按什么顺序讲,很好,也许是Perl的精神的感染吧,当初看这本书很有震惊的感觉,原来程序设计语言还可以这么使!爽!
  断断续续写了这么长,xxx的xx布,又x又长,呵呵,希望大家踏实一些,不要浮躁。
发表于 @ 2005-11-29 02:39 ryudo 阅读(242) | 评论 (0) | 编辑 收藏
程序员的个人性格
提要:软件开发是一个“以人的智力为加工原料”的工程活动,在开发过程中会不断的对智力和性格作研究。需要注意20/80原则,并不是最勤奋的才是最优秀的。编程的工作难以检查,是否成为高手和个人性格有关。你无法改变智力,但可以改变性格。在软件开发者的成长过程中,EQ还是占主要因素。
1. 聪明和谦逊
一个人越谦虚进步越快,承认自己的无知才会去正视和弥补自己的错误。理解程序需要通常很强的对细节把握和理解能力,这对程序员的智力有很大要求,但是很好的利用聪明要比你到底有多聪明要重要的多。有个程序员需要也需要谦虚,用谦虚去促进自己的智慧,使得自己更加聪明。这是软件开发者的两个基本素质要求,它们互相依赖促进,有时候也互相排斥,把握好自己的才智和谦虚就能更大程度提高能力。
也许某些事情很麻烦和困难,我们这时就需要使用一些方法去聪明的解决它们。比如:采用良好的程序风格便于理解、采用分解的办法使复杂问题简单化、多进行评审和测试,多和别人讨论和关注软件质量问题、尽量使用高度抽象的思维使问题一般化,提高重用率减少工作量、如果问题走进一个“死胡同”不妨和杯咖啡放松情绪,或和别人交谈交流观点,这是解决钻牛角尖的好方法。
2. 好奇心
一旦你认为自己理解程序的能力是有限的,而且你意识到,进行有效编程是补偿自己能力的方法时,你就开始了你职业生涯中漫长的探索过程。对技术的好奇很重要,否则你将在知识爆炸的时代迅速落伍。别在忙碌的工作或琐事中,失去了对学术,自然和生活的好奇心和激情。我们可以在:
1 开发过程中建立自我意识。通过在开发中有意识的可以使用进行新技能的锻炼,多对开发工程进行观察,和学习其他解决方法,这样就对整个项目有很强的把握能力,甚至可以带领整个团队走向更好的方向。如果你现在做的是市场前景很好的工作,那也意味着工作中的某些技术可能会很快被淘汰,注意保持好奇心和创造力。
2 实验。了解编程的一个有效方法就是对编程和开发过程做实验。你可以编写一个程序并观察它是如何工作的,调试器里跟踪程序的执行把握它的特性。用个小程序去检验一个不太了解的概念,这对增进理解有非常大的帮助。或者用一个短程序,去试图制造一些错误,通过错误去学习。错误不是罪过,没有从错误中学到什么那才是罪过。
3 阅读解决问题的有关方法。解决问题是软件开发过程核心的活动。一个奇怪的现象:人们通常不能从自己面临的问题找出解决的方法,即使这个方法很简单。
4 行动前先做好分析和设计。尽管实践和分析设计过程有很大的矛盾,但是好的分析会避免让你过早走向一个错误的方向,好的设计可以避免混乱。
5 学习成功或失败项目的开发经验。学习编程的好方法是向一些优秀的程序员学习。应该要注重项目的战略思想,把握项目中解决关键难点的战术。任何成熟的科学,都是通过解决问题发展起来的。这些问题通常被看一些被良好解决的例子,并可为将来工作做指导。(这可能也是目前很多公司注重工作经验的原因吧?)我们应该努力对别人工作存在的问题做研究,学习别人的无论成败的解决办法都是很有意义的。多拿自己的代码和比你优秀人的代码做比较,看看你们间有什么异同?为什么会有这样的差异?谁的更好?为什么?也要多让自己的代码让别人评价,这样可以提高自己的程序质量。
6 阅读手册,书籍和期刊。手册中往往对带有些可以直接调用的子程序,这对我们研究和解决具体问题有很大帮助。书籍中往往是介绍系统理论,多阅读可以提高专业能力;期刊中常常包含着流行的技术和观点可以开阔眼界。
3. 诚实
编程生涯成熟的部分标志是坚持诚实。通常是:不假装自己是高手、乐于承认错误、尊重编译器的警告、对程序有清晰的了解,而不是编译看其是否有错、提高实际状态报告、提供实际方案评估,在上级面前坚持自己的意见。你最好假装自己知之甚少,听别人的解释,向他们学习,并且评估他们是否了解其正在讨论的东西:)
你应该对自己能力做某种程度评估,认为自己完美是一个不妙的信号。错误正如潮流一样是一个复杂的活动,如果你过去没犯过错误,那么没有人会将错误归咎于你。所以正视自己的错误。当你并不了解程序时,编译运行并不是解决问题的方法。测试是证明错误的存在,而不是保证没有错误。如果不能深入理解程序,就不能深入测试。依据事实给出准确的状态报告,不能欺骗自己和别人,这是充分合作的前提。不能因为压力而否定符合规律的做法——这个项目需要10人月,要用5人月完成除非降低性能或其他做法——准确的向上司说明情况。
4. 交流与合作
真正优秀的程序员应学会怎样和别人工作和娱乐。真正阅读你写出的程序是人,而不是给计算机——注意代码的可读性。绝多数高水平的程序员坚持自己代码的可读性,并抽出充足时间这么做。对程序员能力的界定标准:
1 初学者
是能使用一种语言基本能力的程序员,他能使用子程序、循环、条件语句或其他许多语言特征。
2 中间者
有使用许多语言的能力,并且至少非常熟悉某一种语言。
3 专家
对其语言或环境或这二者有很深的造诣。这种级别的程序员对公司是有价值的,而且有些程序员往往就停留在这个水平上。
4 大师
有着专家那样的专业知识,并且意识到编程只是15%和计算机交流,其余85%是和人打交道。一般程序员只有30%时间或更少。而且大师注重给人看的清晰易懂的代码,并注意建立有关文档。
不强调可读性的高水平代码者可能停留在级别3上面。并且根据经验,编写不可读代码的主要原因是:代码质量差或是编写者自己并不能完整地理解自己的代码。当你知道自己的水平后,不必内疚和自愧。在你知道如何提高水平后,你倒应该为自己停留在初学者或专家水平上有多长时间而内疚。
5. 创造力和纪律
虽然一些有创造力的程序员将各种标准和约定视为对其创造力的阻碍,但是没有这些约束项目实现是不可能的。不要在无关紧要的领域建立约定,应该在值得的地方发挥你的创造力。一个杰出的程序员需要遵守许多规则。如果编码之前不分析需求就设计,那么你就学不到项目的许多东西,那样工作就像小孩画画而不是艺术品。
6. 懒惰
懒惰的三种形式:1 拖延自己讨厌的工作 2 迅速解决讨厌的任务以摆脱任务 3 写一个工具来完成讨厌的工作解脱自己。当你不是透过玻璃看问题的时候,你就看到了懒惰的另一方面。“赶着做”是一种多余和没有必要的“努力”。有效的工作最重要的现象是人们在思考种往往显得冷静而不忙。一个一直很忙碌的程序员不是好程序员,因为他并不是在使用对于他来说最有价值的工具和头脑。
7. 并不是你想象中起作用的性格
坚持:这是一笔财富也是不利的条件。你可以称它为顽固或者坚强,这完全取决于应用它的场合。在多数情况下,软件开发的“坚持”就是顽固的意思!当你遇到新问题时候,你再固执己见并不是好事。你应该迅速适应它,或原方案并不起作用时,学会用另一种解决方法。调试中,当你发现一个困扰你4个小时之久的错误时,你一定感到非常满意。但是实际上,如果你在一段时间——通常为15分钟没有取得任何进展时,你应该放弃找错。用你的潜意识去思考问题,尝试用别的方法解决问题,甚至重写厌烦的代码段。和计算机错误做斗争时不明智的,你应该尽量避免它们。知道在时候需要放弃时困难的,但是必须面对一个问题:当你觉得自己受挫折时,是否考虑尝试其他不同的方法。
经验:过于依赖经验会导致知识的落伍。今天的经验必须为明天的工作服务。如果不在过去经验中去归纳总结出一些有价值的原则或规律并改变自己去适应它们,那么经验也将一文不值。如果你的经验还是停留在上一次战斗而不是下一次,也不因时间做出应变,那么经验更像是一个阻碍。此外,错误的经验往往得不到客观的评价。错误的经验可以让你得出重要的不同结论,学习其他人的错误经验是一个好方法——你更可以对它做客观的检查。其他领域有成功经验的专业人员往往使人放心,而在软件开发中,知识更新迅速使得此领域中“经验”处于一个奇怪的地位。为了使自己有所价值,你必须紧跟潮流,对于年轻求知欲旺盛的程序员在这点有优势,而有些年老的程序员认为自己有所资格而厌倦一年接一年都要证实自己的能力。如果你已工作了10年,你得到了10年的经验未必是真正的经验——你如果坚持不断地学习,你就能得到经验,但如果你并不想学到什么,不管多少年你也学不到什么。
编程狂:如果你还没有至少在一个相同的项目上花费一个月的时间——一天工作 16 个小时;为了发现你的程序中最后一个错误睡眠中你也念念不忘它,你接连几天没日没夜地工作——即使你所编的程序并不复杂,那么你可能不会意识到编程中有某种令人兴奋的东西。 Edward Yourdon
这种对编程的痴迷纯粹是胡闹,并且几乎注定要失败。但是那些通宵程序员使你觉得他们是世界上最好的程序员,但是随后你不得不花费几周的时间来修正你在这短时间的辉煌中所带来的错误,你可能对编程非常热爱,但是你应能冷静地处理这个问题。
8. 习惯
好的习惯起作用是由于你为一个程序员所作的大部分事情是你在无意识中所完成的。成为某方面好的或差的程序员,主要是靠你自己的所作所为。你所作所为习惯,决定了你的编程品行。最终,你的习惯好坏决定了你是否能成为一位好的程序员。当你开始学习某一件事时,你应按正确的方式学好它。当你开始学时,你已对其进行了思考,并且你可在正确或错误的途径间作出轻易的选择。在你作过一段时间后,你对你所作的不太注意,此时“习惯的力量”会开始起作用。确保起作用的习惯是你所希望的。
小结
你的个人性格直接影响你编写计算机程序的能力。
最有明显作用的性格为:谦虚、好奇心、诚实、创造性和纪律,还有文明的“懒惰”。
高级程序员的发展和生成与天才并无多大联系,任何事情都和个人的发展有关。
令人吃惊的是,小聪明、经验、坚持和欲望既可帮助你也能妨碍你。
许多程序员不主动去吸收新信息和新技术,而是靠偶然地上获得一些新信息,如果你
抽出少量时间学习别人的编程经验,过一段时间后,你将在你的同行中脱颖而出。
Tags:  c语言程序员 如何成为程序员

延伸阅读

最新评论

发表评论