先记下学习 —— 他山之石

来源:互联网 发布:一楼土木人淘宝网 编辑:程序博客网 时间:2024/05/17 22:01

不知道对与否,先转载收下,以后再修改!

C++程序员学习历程

1、《 C程序设计语言(第2版) 》

2、《 Essential C++中文版》非常适合初学,一个礼拜就可以看完,看了它可以快速对C++的全貌有个了解,虽然不会马上熟练掌握C++

3、《数据结构算法与应用C++语言描述》是本好书,它提供了很多实际的例子,比如火车站调度、走迷宫,相比于“百钱买百鸡”这种问题又提高了一个层次

4、接下来专心提高C++的水平,可以选择《 C++编程思想 》

5、再看《 Effective C++中文版 2nd Edition 》和《 More Effective C++中文版》,这两本书介绍了高效使用C++的宝贵经验,语言很幽默

 

下面介绍几本书,有兴趣的朋友可以选读。如果想高效地使用C++开发软件,STL一定要学!《 C++标准程序库—自修教程与参考手册》可以帮你学会STL的使用,而且开发时可以拿它做手册,有了前面数据结构的基础,学习STL的使用不会遇到什么困难。如果你还想知道STL的设计思想及原理,不妨看看《泛型编程与STL 》。有些朋友可能会问,C++的面向对象机制是怎么实现的?《深度探索C++对象模型》给了你答案,它剖析了C++底层的实现。最后,如果想有一本C++大百科全书,那非《 C++程序设计语言(特别版) 》莫属!这本书是C++之父Bjarne Stroustrup的大作,算是书中权威。

世界上并没有成为高手的捷径,但一些基本原则是可以遵循的。

  1. 扎实的基础。数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握他们,很难写出高水平的程序。据我的观察,学计算机专业的人比学其他专业的人更能写出高质量的软件。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。

  2. 丰富的想象力。不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想象力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。另外,多看科幻电影也是一个很好的途径。

  3. 最简单的是最好的。这也许是所有科学都遵循的一条准则,如此复杂的质能互换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc2。简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。

  4. 不钻牛角尖。当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,而且是那种极暴力的打斗类游戏,当负责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。

  5. 对答案的渴求。人类自然科学的发展史就是一个渴求得到答案的过程,即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念,一定要找到问题的答案,你才会付出精力去探索,即使最后没有得到答案,在过程中你也会学到很多东西。

  6. 多与别人交流。三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。多上上网,看看别人对同一问题的看法,会给你很大的启发。

  7. 良好的编程风格。注意养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致。大家都知道如何排除代码中错误,却往往忽视了对注释的排错。注释是程序的一个重要组成部分,它可以使你的代码更容易理解,而如果代码已经清楚地表达了你的思想,就不必再加注释了,如果注释和代码不一致,那就更加糟糕。

  8. 韧性和毅力。这也许是"高手"和一般程序员最大的区别。A good programming is 99 weat and 1 ffee。高手们并不是天才,他们是在无数个日日夜夜中磨练出来的。成功能给我们带来无比的喜悦,但过程却是无比的枯燥乏味。你不妨做个测试,找个10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条。


    我的学习技术历程主要为书本知识学习,项目经验积累。从最初的课堂上学习《c语言程序设计》,然后自学《c++ primer》,对c++的语法有了较清晰的认识之后,开始着手研究c++编程效率的书籍,类似于《effective C++》和《more effective C++》,《c++编程思想》等。学习完了这些之后,有时我会对比同一段代码在不同的编译器下得出的不同结果,这令人困惑的结果在《深度探索C++物件模型》得到了一定的解答。学习了这么多关于c++的知识,在实际的项目开发中,仍然遇到了一些关于软件工程的问题。

    程序越来越臃肿,程序改动会出现牵一发而动全身的情况,程序离不开原作者,最终导致自己陷入了泥潭。改还是不改,还是推倒前面的代码重新写程序,这是个艰难的选择。这种问题可能长期会困扰程序员,幸亏在这个世界上总有人比我早些经历这种痛苦,并且他们能够给我答案。他们总结了这种问题的答案,并汇集成册。在这种驱动下,我阅读了《设计模式》、《代码大全》、《实现模式》《C++ Template Metaprogramming : Concepts, Tools, and Techniques from Boost and Beyond》、《代码整洁之道》、《重构与模式 = Refactoring to patterns 》等相关书籍,给我一种醍醐灌顶,如释重负的感觉。

   不断的学习、总结,我开始注意在软件的架构上,将功能进行划分,时刻牢记解耦、聚合、封装等思想,在复杂的问题巧妙运用设计模式中的方法;在程序的编写过程中,注意代码的编程规范,同时恰当地运用STL和开源库;而在维护上注意代码的重构,不断的精简代码,提高代码的复用率(其实这一步与程序的编写过程是不会分开的)。

    在这个学习过程中,个人真正体会到码农与高级软件工程师之间的差别。高级工程师写出的高质量代码就是在格式上整洁,这里整洁既包含了格式又包含了代码的内容简单而不冗余。c++语言发明者Bjarne Stroustrup对高质量代码的定义有个概括:代码逻辑应用直截了当,叫缺陷难以隐藏;尽量减少依赖关系,使之便于维护;依据某种分层战略完善错误处理代码;性能调至最优,省得引诱别人做没规矩的优化,倒导致一堆混乱。

     程序编写不可避免的会接触到算法和数据结构的问题,两者相辅相成。在算法的学习过程中,主要是参考了《算法导论》,以及《算法设计》两本书籍,以及《计算机程序设计艺术 . 第1卷 , 基本算法》。在研究生阶段,为了实现人脸识别的算法——SVM,专门参考了数据《数据挖掘中的新方法 : 支持向量机 》,学习了SVM的基本原理,开始领略到机器学习领域的神奇。


0 0
原创粉丝点击