如何高效地学习编程语言

计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

学习编程语言是一种技巧:做好了,你会感受到掌握新事物之后的快感;做不好,就会接二连三的沮丧,甚至放弃。下面我将介绍一些技巧与方法,以便帮助大家高效地学习。

持续测试自己以抵抗胜任力错觉

最不济的学习方法中的一种就是重读或者重看材料。这种重复会给你一种感觉——似乎不用花什么气力,你就理解了话题所涵盖的内容。研究者们把这种现象称作胜任力错觉。

更好的一种方式(你可以掌握的最佳技巧之一)则是持续地测试自己。不要重读一个函数、类或者一个对象是什么,而是让自己定义这些概念或者把它们用到短小的程序当中——强迫你用某种方式显示自己的理解。这一过程常常很不舒服的,但是对形成长期记忆非常有效。更进一步,你可以在阅读材料之前先去行测试,举个例子,尝试在阅读一个章节之前做做练习。值得一提的是,这也被证明有助于记忆的形成。

测试对于学习的显著影响被称为测试效用 ,下面是一些具体方法可以利用:在阅读章节或者看视频之前,尝试猜测你将要学习的东西,并写下来。

在阅读章节之前先做做这个章节的练习题。一直做练习,即使是最难的那些。暂时(永远)放弃一个练习也是可以的,不过至少要尝试一遍。(下个章节会详细谈到)阅读短小的程序并且尝试不看源码重新写一个。或者,再小一些,写个函数也行。在学习了对象、类、方法或者高阶函数等新概念之后,立即编码做示例。创建阐述这些概念的图示,以及这些概念之间的区别和联系。把你刚刚学到的概念写成博客。尝试把概念解释给非技术的朋友听。

这些技巧的大部分都要规约到编写代码上!说到编程,由于程序都是重文本和概念性的,所以很容易以为我们仅仅通过阅读(代码)就在学习。但是程序同时也是一门手艺,就像其它手艺一样你得操练才能娴熟。编码是暴露你对程序作有错误假设的最佳方式。你越快地这么做,就会越快地纠正错误和提升技能。

花时间放空自己

如果你纠结在一个问题上,或者对刚才读到的东西不能理解,就去散散步甚或洗个澡 —— 只要能进入一种舒缓、放空的状态就行。解除障碍的最佳方式之一就是歇一会儿,这可能听上去有点反直觉,但确实如此。

问题是,当全神贯注解决问题时,我们很容易陷入思维障碍。我的意思是,这差不多就是“关注”(字面上)的意思。不过,全神贯注会导致我们只能一直探索解决方案空间的一小部分。一旦放空,我们的潜意识就可以探索并联结我们经验中的广泛领域。

对我来说,这就像当你试图在纸质地图上找到一个目的地(是否还记得?)。你不用刻意就确信你想抵达的城市应该就在这里!在地图的左上角的区域,所以你看了一遍又一遍,都没有成功。然后你放下地图,做了深呼吸并让目光游离了一会儿。当你重新看地图时,确切的地点立马映入眼帘。我们曾经都有过这样的经验,在洗澡的时候突发灵感。现在你对于为什么这么做有了更好的了解,那么也就能刻意地使用这个技巧。个人来讲,如果纠结在某事上,我真的会洗个澡,这个技巧的功效显著。

别浪费时间沮丧

和上一个章节相关:别浪费时间为代码沮丧了。沮丧会让我们做一些愚蠢的事情,比如重新编译或者重刷浏览器,期望这次会有所不同。

把沮丧看作你的知识有差距的信号。一旦你意识到自己沮丧了,它可以帮你后退一步,清晰地识别问题。如果你写的代码不起作用,坦率地向自己或者别人说明你期望的结果。使用科学的方法,就非预期行为的根因提出一个假说。然后测试你的假说。再次试验后,如果依然解决不了,就把这个问题放到一边,待会儿回来。在此我向大家推荐一个大数据技术交流圈: 658558542  突破技术瓶颈,提升思维能力 。

在一些似乎没法解决的问题上,我不知有多少次恼怒地扔掉了自己的笔记本电脑。隔天再看,一个显而易见的解决方案立马跳入脑海。甚至上周就发生过。

确认你正在处理语言的哪个方面

个人观点,我觉得记住这些是有用的——当学习一门编程语言的时候,你实际上正在学四件事情。怎么写代码:语法、语义以及资源管理

语言的范式:面向对象,函数式,逻辑等;产出物的生态圈:如何构建、运行可执行文件以及如何使用库;工具:编辑器,编译器,调试器,代码质量检测器;这四项很容易搞混,不幸的结果是,当你遇到问题最终完全找错了地方。

举个例子,某些完全的编程新手,可能准备开始构建iOS应用。他们可能会试着让自己的应用在朋友的手机上运行,只看得到有关需要开发人员证书或其他信息的消息。这是产出物生态圈的一部分,不过小白可能将此视为编写代码的问题。他们可能会浏览自己写的每行代码来尝试解决问题,尽管问题和代码没有半毛钱关系。

如果我系统地处理这些方面,我会发现学习一种语言会更加容易。我将在其它的博客文章中罗列一些待回答的宽泛问题的列表,应该能帮助你学习任何语言。

明确目的,外部模型,内部模型

任何时候你学习使用新工具,明确学习的目的,外部模型和内部模型都是十分有用的。

当你了解了工具的目的时,你的大脑会加载有用的上下文细节,使你更容易吸收新知识。这就好比拼图:当你看到完整拼图之后,更容易把各部件拼到一起。这个道理适用于语言本身以及语言库。

工具的外部模型就是它呈现出来的接口以及它想让你思考问题解决的方式。Clojure 的外部模型就是一个 Lisp,它想让你把编程当做大部分以数据为中心,不可变的转换过程。Ansible 希望你把服务器的整备工作想成定义最终状态,而不是定义抵达那种状态所要采取的步骤。

工具的内部模型就是如何将输入到其接口转换成一些底层的抽象。Clojure 把 Lisp 转换成 JVM 的字节码。Ansible 把任务定义转换成了 shell 命令。在一个理想国中,你不需要理解工具的内部模型,但事实上,理解内部模型总是有用的,因为在某些看上去迷惑或者矛盾的部分,它可以让你有个统一视图。举个例子,当 DNA 双螺旋模型被发现的时候,它帮助科学家们了解更高层次的现象。从我的角度来讲,当然,这篇博文也是历来所有伟大科学成就之一。

很多教程经常混淆工具的外部和内部模型,使学习者感到困惑。意识到这点可以帮你轻松辨别何时你会感到沮丧。

间隔重复帮助记忆

间隔重复被证明是长期记忆中新信息编码的最佳方法之一。 这个想法是以不断增加的时间间隔来测验自己,使用最少重复次数来最小化记忆衰减。

睡眠和练习

保重身体!身体可不仅仅是你脑袋的载体。如果你想保持专注和高效的学习,就要足够的睡眠和练习,而不是狂饮咖啡因和能量饮料。

在此我向大家推荐一个大数据开发交流圈:

658558542    (☛点击即可加入群聊)

里面整理了一大份学习资料,全都是些干货,包括大数据技术入门,大数据离线处理、数据实时处理、Hadoop 、Spark、Flink、推荐系统算法以及源码解析等,送给每一位大数据小伙伴,让自学更轻松。这里不止是小白聚集地,还有大牛在线解答!欢迎初学和进阶中的小伙伴一起进群学习交流,共同进步!

最后祝福所有遇到瓶颈的大数据程序员们突破自己,祝福大家在往后的工作与面试中一切顺利。
————————————————
版权声明:本文为CSDN博主「程序の之道」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44233163/article/details/88396861

通过这段时间的看书学习和对编程的思考,结合自己的亲身的学习经历,今天想和大家聊一聊如何高效学习编程技术。

我们可以把学习编程技术的人分为下面四种情况。

第一种是既懂方法又努力的,学的又快又好,但大家会觉得这是他们有天赋,甚至称他们是天才,而并没有看到他们的方法和努力。

第二种是不懂方法但努力了,这类人学的不快但愿意花时间学,不过由于学习编程技术所需的时间一般比较长,一些人没有坚持下去便放弃了,而一些人则坚持了下来,最后学的很好。

第三种是知道方法但并不是一直都很努力,这类人学习的持续性比较差,一些技术学的比较好,而另外一些技术学的不好。

第四种是既不懂方法又不肯努力的,这类人自然是学不好编程技术的。

注意我这里说的只是对于学习编程技术的,并不代表编程学的不好的,学习其他事情也是这样,切莫以偏概全。比如在实际生活中,一个编程学的不好的,但唱歌唱的却特别好。

我公众号读者,大都也是和编程专业有关的学生或者是已经工作了的前辈,群里也经常把那些技术比他们好的人称为大佬或大神,除了羡慕外,也能看到他们对于成为大佬的渴望。按照上面的情况划分,他们可能是属于第二种或第三种情况。一个人的努力是看自己,这个别人也教不了,所以我这里和大家聊的是学习编程技术的一些方法,这是对我学习编程技术的总结,这些方法可能并不一定对你有效,所以你大可作为一种参考。

学习编程技术,最开始都是从某一门编程语言开始学起的,拿我来说,之前我也不知道学什么语言好,听别人说 Java 好,才学的 Java(现在看,觉得 Java 真的很好,至少现在来说,在企业级的项目开发中,Java 还是应用最广泛的)。所以往往我们对于一门语言并不知道他们能干什么的时候,或者说是他们的优势在哪,就急于开始学习了,很可能到最后才发现原来有更好的语言做这个,当时花了那么大力气,反而效果并不好。对于语言是这样,对于框架也是这样,就像我之前并不知道 Shiro 的优势是什么,自己手动写权限控制,最后发现还是框架好用(这里先不谈该不该自己造轮子的话题)。

所以学习一门语言或者框架时,第一步并不是上来就扎进去学,而是应该站在”远处“,用客观的眼光去看待它,找出它的优点和缺点,看看是不是符合自己的需要。比如说,你要从事人工智能方面的研究,目前来说 Python 是最好的选择(这里先不谈 Python 的性能问题)。对于语言的认识,对于新手来说,并不简单。看网上的文章,肯定也是各执一词,因为没有哪一种语言是完美的,没有缺点的,知乎上的大牛还是比较多的,你可以去那里看看他们对该语言的评价,好的坏的都看看,相信你应该可以得出自己要不要学的结论。而对于框架,我觉得认识它的最好方法是去它的官网,看官方文档,因为这是最一手的资料。但这些资料往往是英文的,所以英语对我们学习技术是至关重要的(老实讲,现在我们用的编程技术 99% 是来自西方,我们还停留在全面模仿和学习西方的阶段),所以在很长一段时间,我们都要接受英文文档,同时提高自己的英文阅读能力。实际上,文档中框架介绍的英文并不多,少的也就几个关键字就把框架的特点概括了,学习过英语的人借助字典翻译都是可以看懂的,只是需要你耐着性子看下去罢了。

上面便是学习编程技术的第一步——认识它,就算你现在用不上,了解一下也是挺好的。现在每个人都订阅了不少的微信公众号,群消息和朋友圈也被公众号文章充斥着。我也订阅了不下几十个的公众号,大多是编程技术方面的,也有一些投资理财的(个人对这些也比较感兴趣)。而我看的更多的是介绍技术或者某个知识点的背景,除非我对某个技术比较熟悉,不然很少看涉及很多具体细节的文章。我的看法是,公众号是一种碎片化学习的一种方式,一些作者的实践总结和经验之谈,一些优秀的文章还是值得一看的。但倘若只靠看公众号文章学习,知识是成不了体系的。所以一些公众号文章作为认识技术的一种方式,是个不错的选择,当然一些优秀的博客也可以。认识了技术之后,即使时是向别人介绍时,也可以说出来一些。你也可以试着介绍自己学过的一些技术,看自己能否清晰的说出来你对它的认识,或者只是知道一些技术细节,对整体的认识并不够。

学习编程技术的第二阶段就是学着使用它,如果已经有书籍和视频可以帮你学习它,那么这两种方式肯定是比较好的。学习语言和一些常见的框架,基本上都是有视频和书籍的,视频可以在网上找些培训机构(这里也不谈培训结构好不好),只要对你有帮助的资源你就应该利用起来学习,我学习使用某项技术时,也是看了不少视频。如果某个框架没有相关的书籍和视频,那么只能找些文档和去官网学习了,对于前端框架(库)来说,这是很常见的。学习需要一个过程,没有基础,看视频是最好的方式。有了基础后,我觉得看书是更好的选择,也可以节省你的时间,我就是买了很多书,现在学习也基本都是看书来的。当然没基础的时候还是推荐看视频,虽然要花很长时间,但是后面你就会发现自己学习其他技术会越来越快。在这个阶段遇到问题,也是很正常的,在网上一般都是可以找到答案的,自己解决问题的能力也会慢慢锻炼出来。在一些社区也可以发你的问题,CSDN、知乎、Stack Overflow 都很不错。

学习编程技术的第三个阶段是掌握(第二阶段和第三阶段的分界线其实并不是很明显),能够用这个技术做出一点东西来,就说明你逐渐掌握它了,比如你学完 Java Web,自己可以动手做出来一个简单的管理系统网站,这就可以了,并不需要考虑复杂的业务场景,这些在工作时会学到的。这个阶段更多的关注技术本身的细节,比如 Java 中的多线程编程有几种方式,最好自己动手写写笔记或者博客,这些都是很好的学习方式。学习框架,也可以看看官方文档,部分技术文档也有中文版的,毕竟写官方文档的人一般都是这个技术的开发者,他们肯定是最懂这个的。学习编程技术就像铸剑一样,需要经过反复的淬火,剑才能变得更加锋刃,学习也是需要不断地回顾和总结的过程,这样才能强化和巩固所学的知识。每个人的记忆力都是不一样的,根据自己的情况,时不时的复习非常非常有必要的。

学习编程技术的第四个阶段是深入,对于语言,可以看看实现的源码(这里又要提到 Java 的好处了),在第二个阶段学着使用它时,肯定会有一些概念和知识点,比如在 Java 中,ArrayList 对象中的数组是可以动态扩容的,但是你是否知道在 Java 中具体是怎么实现自动扩容的呢?如果你回答不了这个问题,那只能说明你还需要进一步的学习 Java,大部分的 Java 源码你都可以直接反编译查看,这里推荐 Intellij IDEA IDE,查看 Java 源码非常的方便(但 Java 也有一些本地化的方法,和操作系统关系密切,并不是 Java 写的,不能直接查看),而 Eclipse 还需要手动导入源码,不是很方便。学习框架,这个阶段要关注框架的设计思想和实现,也需要看源码,一些热门的框架,找几本经典的书籍来看也是不错的。还是推荐国外的书籍,毕竟很多框架都是从国外传入国内的,国外优秀的书籍会比较多些,当然我们国内也有一些,但总体还是国外多些。如果没有相关的书籍,那么就只能去相关的技术社区和看源码了。如果是开源的技术,一般都会推管到 GitHub 上,可以去 GitHub 上看看,不懂的可以提个 Issue,甚至学到一定程度也可以贡献你的智慧,到这个阶段,不用我说,你都知道该怎么做了。

如果身边有和自己学习同一种编程技术的,可以多多交流,肯定可以碰撞出思维火花的。没有的话,也可以加一些群,比如公众号的这个群(后台回复 ”交流群“ 获取加群方式),大家可以一起交流。或者看一些优秀作者的书籍,我读了杨冠宝大牛(孤尽,也就是《阿里巴巴Java开发手册》的作者,下面称之为杨老师)的《码出高效——Java开发手册》,当一些观点和作者不谋而合时,那种感觉非常爽。比如在谈到面向对象时,杨老师说可以从哲学的角度看 Object 类中的方法,我是谁(getClass 方法、toString 方法),从哪里来(Object 构造方法、clone 方法),到哪里去(finalize 方法),之前我也这样想过,但是没杨老师总结的好。有时,你也可以从书中发现一些错误和不恰当的地方,比如刘欣老师在《码农翻身》一书中,举 Maven 和 Ant 对比的例子时说这是 ”约定重于配置“,而 ”约定重于配置“ 是在对比注解和配置时才会说的,是明显地举例不当,但这些都是很正常的,每个人都难免会有出错的时候。有时候读书发现这些,也是很有趣的。在读吴军博士的《态度》一书时,他给二女儿讲为什么要读非小说类的名著时,说阅读不能只看一些期刊和杂志,即使严肃杂志上的文章质量非常高,但作者观点的前因后果由于篇幅都被省略掉了。零星的观点也是形不成知识体系的,而书的知识完整性是比较高的。所以在学习编程技术时,读书是很有必要的。但是也不要因为学习编程技术,而只看相关的书籍,这样你的视野会受限制,这点我这段时间才感受到,也是最近才开始看些编程无关的书籍,包括金融和经济学相关的。读这些看似与编程无关的书,能开阔人的眼界,增长人的见识,码农只是程序员的下限,优秀的程序员绝对不只会写程序。上面提到的的书籍,如果你感兴趣也可以看一看,相信你会从中受益的。

考虑到这篇文章的受众,所以写的是比较基础的,我这段时间也在思考如何写好公众号文章。我算是比身边的人多学习了点东西,不能保证这篇文章就是很好的高效学习编程技术的方式。所以这里谈谈到的一些做法,未必对你来说就是有效的。这段时间看刘欣老师的《码农翻身》,很佩服他能够将一些技术由来和关键点融入到故事中,并且还能讲的那么有趣。如何写好文章也是我今后的学习方向,也欢迎你在后台留言,提出你的建议和观点。
————————————————
版权声明:本文为CSDN博主「文士心」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pofeng23/article/details/84595168

老实说,学习编程的确不是件容易的事,需要你有一定文化基础、足够的逻辑思维和持续学习能力。因此,你如果是个不爱思考,无法静下心来打持久战的人,那还洗洗睡吧。如果以上条件你都具备了,那么恭喜你,你可以考虑步入程序员的殿堂了。

接下来,我们就要思考如何在有限的时间里快速掌握编程技术了。这个很重要,如果长时间掌握不了一门技术,我们就会对此失去兴趣,半途而废。下面,结合自己这些年来学习编程的经验,我总结了几点,如果说得不到位的话,希望高手斧正。

一、循序渐进,先易后难

记住永远不要让自己失去了信心。如果一上来就进入难点技术,就会接二连三的沮丧,最后只能放弃。所以,我不建议一开始就学习C语言、汇编语言、数据结构这些晦涩难懂的东西,可以先从可视化编程开始,比如Microsoft Visual Studio,先快速上手做一些小程序,有了小成功,就有了兴趣,再慢慢地根据项目需要,有针对性去研究难点技术。

二、多实践,少理论

理论可以看,但不要太多,多看实例并亲自敲出来运行它,发现问题时,去解决问题的过程才最能学到并记住知识。编程绝对不是捧着一本书就能学会的,你首先需要一台电脑,将书中将学到的任何东西都做一个程序去验证学习成果,“学以致用”是学习任何知识都行之有效的手段,说一万遍也不为过。

三、化繁为简,总结提炼

要善于总结学到的知识,将书读薄,总结成自己容易记住的图表、符号,并心领神会。有一办法就是将学到的内容讲给同行朋友听,或写成日记,你如果能脱开书本讲出来或写出来,就说明自己真的掌握了。

四、虚心请教,知识分享

多和同行讨论分享,有问题虚心请教,或者去网上搜索,如果网上没有现成的答案,也可以去相关的技术论坛发贴求助。有时一个小问题,你可能一个星期也想不出办法,搞过的人可能1秒钟就给你点化了,大大节省了学习时间和成本。

五、曲不离口、剑不离手

不要停止学习和使用自己学到的编程知识,有时自己写的代码如果不注释好,三个月不看,就看不懂了;好不容易掌握的编程技术,如果长时间不用,一样会忘记干净的。所以,作为程序员,要不停地接项目,写程序。现在网上的项目交易平台很多,只要想做,不愁接不到项目,再者,自己以前开发的产品,也可以进行迭代,所以,理论上你应有做不完的开发,而不能用没有项目做作为借口。

六、用“偷懒”的思维来学习编程

要有“偷懒”的思维,很多发明的出发点,都是为了偷懒,懒人是推动社会进步的原动力。学习编程也是一样道理,代码中如果有重复的部分,就要考虑到写一个函数或类什么的,不重复靠轮子,提高代码复用率可以大大提高编程效率,同时可以积累大量基础代码,用于以后其他项目,就是我们常说的技术积淀,技术积淀越多越深,你就离成功不远了。

七、专注和坚持

IT技术日新月异,各种语言、技术、框架层出不穷,令人眼花缭乱,我们程序员不要象猴子下山,三心二意,见异思迁。要根据自己的定位和目标,专攻一门技术,持续深入即可,除非这门技术真的没有了前途。其实任何一门语言均有其存在的必然,比如C语言很早就有了,到现在依然未见过时,大有用场。

以上是我个人多年来学习编程的一些心得,不一定正确,但毕竟是经验之谈,希望对你编程学习之路有所帮助。

猜你喜欢

转载自www.cnblogs.com/qzhj-pipeofnaturalrule/p/11914409.html