如何在21天内精通C++:
前言:
我很少转载,不论是微博还是文章。因为一般被大众广泛转载的流行内容我认为没有转载的价值,而看到被转载的有价值的文章我就会立刻记下来,不会转载然后说mark一下,回来看。
至于说向大众传播有价值的东西,我认为,目前笔者的影响力非常小,并不会得到一呼百应的结果。再如何传播也跑不出那个圈子。
在这个博客中大家也可以看到我的文章,除了原创,就是翻译。
这个转载,是第一次。或许也是唯一一次。
以下是我决定转载此文的由来:
前几天听到班里同学在感慨,编程能力非常差,连学弟学妹都不如。
其实类似的感慨早就不绝于耳了,我一直希望可以帮到大家,哪怕是一点点。而这,也是我开设这个博客的目的。每天讲一点编程知识,一年下来,就有几百点,大学结束,就有近千点了,如果里面有一个点能让大家有所受益,那这每天的半小时也就不会感到浪费了。
恰巧,这几天看到了这篇文章,非常犀利的阐述了如何在21天内精通C++。
于是,我在这里将其转述给大家(根据大家情况,有添加批注及大幅度删减)。
声明:本文转载自酷壳网的这篇文章:http://coolshell.cn/articles/2250.html 著作权及解释权归酷壳网所有。
另外,向大家隆重推荐此网站,如果你想做一个优秀的程序员的话,你应该看看这里。
另外,我考虑到大家时间有限,如果你不愿意读下去的话,也请扫一眼着色的文字以及结语,那些是本文的精华部分。(当然,我认为如果你来到了这里,为什么不读下去呢?有时候多花几分钟,能比别人节省几年的时间。)
用十年来学编程
Peter Norvig
为什么每个人都急不可耐?
Basic、Windows、Internet等等,而只需要几天甚至几小时。
- 学会:在3天时间里,你不够时间写一些有意义的程序,并从它们的失败与成功中学习。你不够时间跟一些有经验的程序员一起工作,你不会知道在C++那样的环境中是什么滋味。简而言之,没有足够的时间让你学到很多东西。所以这些书谈论的只是表面上的精通,而非深入的理解。如著名诗人Pope所言,一知半解是危险的。
- C++:在3天时间里你可以学会C++的语法(如果你已经会一门类似的语言),但你无法学到多少如何运用这些语法。简而言之,如果你是,比如说一个Basic程序员,你可以学会用C++语法写出Basic风格的程序,但你学不到C++真正的优点(和缺点)。那关键在哪里?ACM第一任主席Alan
Perlis曾经说过:“如果一门语言不能影响你对编程的想法,那它就不值得去学”。另一种观点是,有时候你不得不学一点C++(更可能是javascript和Flash Flex之类)的皮毛,因为你需要接触现有的工具,用来完成特定的任务。但此时你不是在学习如何编程,你是在学习如何完成任务。
- 3天:不幸的是,这是不够的,正如下一节所言。
十年学编程
- 对编程感兴趣,因为乐趣而去编程。确定始终都能保持足够的乐趣,以致你能够将10年时间投入其中(笔者注:我喜欢编程,这就是我能将它从高中时代开始持续五年并会一直进行下去的原因)。
- 跟其他程序员交谈;阅读其他程序。这比任何书籍或训练课程都更重要。
- 编程。最好的学习是从实践中学习。用更加技术性的语言来讲,“个体在特定领域最高水平的表现不是作为长期的经验的结果而自动获得的,但即使是非常富有经验的个体也可以通过刻意的努力而提高其表现水平”,而且“最有效的学习要求为特定个体制定适当难度的任务,有意义的反馈,以及重复及改正错误的机会。”
- 如果你愿意,在大学里花上4年时间(或者再花几年读研究生)。这能让你获得一些工作的入门资格,还能让你对此领域有更深入的理解,但如果你不喜欢进学校,(作出一点牺牲)你在工作中也同样能获得类似的经验。在任何情况下,单从书本上学习都是不够的。“计算机科学的教育不会让任何人成为内行的程序员,正如研究画笔和颜料不会让任何人成为内行的画家”,
Eric Raymond,《新黑客字典》的作者如是说。我曾经雇用过的最优秀的程序员之一仅有高中学历;但他创造出了许多伟大的软件(笔者注:其中之一是火狐浏览器)。
- 跟别的程序员一起完成项目。在一些项目中成为最好的程序员;在其他一些项目中当最差的一个。当你是最好的程序员时,你要测试自己领导项目的能力,并通过你的洞见鼓舞其他人。当你是最差的时候,你学习高手们在做些什么,以及他们不喜欢做什么(因为他们让你帮他们做那些事)。
- 接手别的程序员完成项目。用心理解别人编写的程序。看看在没有最初的程序员在场的时候理解和修改程序需要些什么。想一想怎样设计你的程序才能让别人接手维护你的程序时更容易一些。
- 学会至少半打编程语言。包括一门支持类抽象的语言(如Java或C++),一门支持函数抽象的语言(如Lisp或ML),一门支持句法抽象的语言(如Lisp),一门支持说明性规约的语言(如Prolog或C++模版),一门支持协同程序的语言(如Icon或Scheme,笔者注:我更喜欢Lua),以及一门支持并行处理的语言(如Sisal)。
- 记住在“计算机科学”这个词组里包含“计算机”这个词。了解你的计算机执行一条指令要多长时间,从内存中取一个word要多长时间(包括缓存命中和未命中的情况),从磁盘上读取连续的数据要多长时间,定位到磁盘上的新位置又要多长时间。(答案见底部)
结语:
附,上述问题答案:
执行一条指令 1 纳秒 =1/1,000,000,000 秒
从L1缓存中获取数据0.5 纳秒
分支误预测5纳秒
从L2缓存中获取数据7 纳秒
互斥锁/解锁25 纳秒
从主内存中获取数据100 纳秒
使用1Gbps的网络发送2K字节20,000 纳秒
从内存中读取连续1M数据250,000 纳秒
定位到硬盘中的新位置8,000,000 纳秒
从硬盘中读取连续1M数据20,000,000 纳秒
从美国发送数据包到欧洲并返回150,000,000 纳秒 =150 毫秒