如何学好编程?学习经验汇总

标题

  • 量产型炮灰程序员
  • 成为优秀Java程序员的10个要点
  • 是时候改变自学编程方法了,这篇国外网友的分享被fast.ai创始人等点赞

初级##

培训班能帮你入门嘛?
放弃吧,如果你没有能力自学,培训班根本帮不了你。
写代码没有捷径,如果你希望在这条路上继续走下去,你必须打好基础,不断学习新的知识才有可能。

如何学?
学习要经历很多阶段:1.基本语法;2.编码实践;3.技近乎道;4.创造新世界。
A(基本语法):学习任何东西,都是一个由表及里的过程。对于一门编程语言来说,“表” 就是基本词汇和语法。对于基础语法的学习,我们可以看一些简短而又系统的教程。B:要掌握基础,持续练习。每一门编程语言的学习容都会涉及:1,运行环境;2,数据类型(数字、字符串、数组、集合、映射字典等);3,表达式;4,流程控制;5,类、方法与函数,等基本内容;6,不同的语言还有一些不同的特性。
看经典书+优秀的视频 应该是最好的入门。

“里”就是思想。深入了解面向对象编程OOP、函数式编程FP、并发、异常、文件IO、网络、标准库等内容。

B(编码实践):
在实践中,我们逐步熟练使用很多API库、框架,也不断踩坑填坑、看源代码、不断解决问题,不断加深对语言的理解,同时会看一些优秀的框架源代码。
如果还有精力,我们再去学习语言更底层的东西,而不仅仅停留在应用层面。如Java中的集合类实现的算法与数据结构。
如JVM是如何执行Java代码的。如Java的线程和操作系统线程的关系。以及一些操作系统方面的知识。
所有数据结构和算法用Java 都实现一遍。
Java集合框架, 不但要学会用, 我还会尝试着实现一遍,List, ArrayList, Set ,HashSet, Map ,HashSet 等等

C:“无他唯手熟尔”
《敏捷软件开发, 原则,模式,实践》,里边详细的讲解了一个薪水支付案例,是迄今为止最好的面向对象设计的例子

在学习Java SE和Java EE的同时, 我会读一下这些源代码:

D(技近乎道):“运用之妙,存乎一心”

E(创造新世界):
“编程的本质就是创造世界。”达到这个境界的,基本都是世界顶尖大牛了。

工欲善其事必先利其器
工具用的顺手,能让你事半功倍,所以需要把工具,环境搭建好。效率提升的同时,也能让你少踩坑,少走弯路。

搭好环境+配好工具

重点内容
计算一段程序的时间复杂度、空间复杂度,如何理解栈、队列等数据结构,了解网络协议的基础。

  • 程序员技术练级攻略

提问式
不要先讲概念。直接上代码,让学生尝试着解答(引发学生主动思考)。答疑的过程中讲解概念。

中级##

SICP

  • 编程能力与编程年龄
  • Is Programming Knowledge Related To Age?

上手开发后,你就要理解原理,懂得调优。

如何快速上手新技术

分5步走:1. 建立基本概念;2. 按照User Guide/Tutorial写例子,写个Demo;3. 扩展;4. 深入技术原理;5. 输出。讲解,写博客,讨论都可。

初入职场的“菜鸟”,怎么攻克一门看起来很难的技术?

螺旋上升

学习是一个螺旋上升的过程,想要上升就得深度思考,多问几个为什么。 基于为什么进行思考。思考多了,积累到一定程度,量变就会引起质变,整个系统就被你看透了,你的知识又扩大了一圈,更多的疑问出现了…

三步走

吃透基础技术
养成良好的阅读源码的习惯
制定长期的技术学习规划

进阶##

高级

你主动去发现应用中的问题,以及找解决方案来解决问题,这个时候就不仅限于眼前的某一种技术了,需要有一个大局观,如何培养你的这种大局观呢,多混社区多和优秀的同行交流,多看源码多学习优秀的开源项目。最好是能够成为优秀开源项目的contributor甚至commiter。

统筹

学习代码的历程,你会发现都是类似的,是螺旋上升的,是循序渐进的。你是从先会一些最简单的逻辑,到开始写一些能用但不好的代码,慢慢自己通过阅读文档、阅读别人的源码来慢慢提升。
写代码一方面需要灵性,需要实践经验的积累,另一方面需要打好基础。在这行业里奋斗的同学们能沉下心多钻研,不要相信有所谓的捷径。

从局部到整体。说得通俗一点就是要脚踏实地,不要老是飘在天上,因为在天上看到的是一整个生态,你当然会看到有很多很多东西,但是如果你不走近看的话你是不会知道,其实有很多东西都是类似的,经典的理论就那么几个,大家的系统很多都是照着这些理论去实现的,只是实现的方式会有些不一样,所以同类型的产品可能场景会稍有不同,但是架构是非常类似的,熟悉了之后你会发现,大部分系统万变不离其宗。

指导方针

  • 时刻提醒自己:学习
    学习某件事的第一步是承认你不知道。刚毕业的人,所谓的“我知道最好的”,其实只是一种虚张声势。他们不知道从哪里来的自信,就好像他们什么都知道,并且需要向每一位新同事强烈的证明这一点。换句话说:你所谓的“我知道我在做什么!”这种态度会妨碍你学习新的东西。
  • 不要试图证明自己是正确的
    要想成为优秀的人,必须学会吃一堑长一智。但是千万小心,经验也可能教会我们重复一些不良行为,甚至也教会我们养成一些不好的习惯。为了避免这种综合症,看看你做的每一种事情,然后问自己:“我怎样才能让它变得更好?”新手试图证明他们写的代码是可以运行的,而不是试图让它运行失败。真正优秀的程序员会积极地寻找他们的错误在哪里,因为他们知道最终用户会发现这些遗漏的bug。
  • 代码可以运行了”这个目标不是终点,而是起点
    伟大的程序员都知道第一次迭代只是一次迭代。接着这个过程就是在定义“更好”的含义。反问自己:让它变得更快能有什么价值吗?可重用更高有什么好处吗?更可靠吗?答案随着每个应用程序的不同而不同,但是过程都是一样的。
  • 写三次代码

学习新技术

    1. 将其与类似的语言进行比较。
      看有关该语言的第一个教程或阅读代码时,请尝试猜测该语言的每个部分将会做什么,并检查你的判断是否正确。 并记下三个列表:
      看起来很熟悉的东西,并且做了预期中的事
      看起来很熟悉的东西,但做了意料之外的事
      看起来完全是新的东西
    1. 阅读语言的官方文档。
      吸收大量信息,从阅读语言的参考资料中可能会受益。参考文献通常是用于查找使用,而不是用来记忆。
    1. 使用互联网搜索。
    1. 与社区接触。
      当提出问题时,请务必先总结准备做什么、已做过的东西以及发生的情况。尽量为专家提供足够的上下文来了解问题,但不需要无关紧要的细节。提出问题后,请务必坚持一段时间来听取建议或会回答你的疑问可能产生的后续问题。
    1. 编写玩具程序。
      一次练习一个新的概念,将重点放在尽可能让你的代码清洁和惯用性上。
      Rosetta_Code
      projecteuler
    1. 使用该语言编写 “生产就绪(Production-Ready)” 的代码。
      考虑将一个熟悉的、相对较小的、经过良好测试的程序移植到新的语言,以探索其在现实使用的应用。
    1. 阅读一本关于这门语言的书籍。
    1. 观看讲座和课程。
    1. 阅读示例代码。
    1. 阅读生产代码。
    1. 寻找好的工具。
      调查在新语言生态系统中管理依赖关系、格式化、模糊化和单元测试代码的选项。
    1. 保持你的热情。
      入门新的语言很容易,但变得真正精通它通常是一个需要多年的旅程。

要利用以前所学的语言的功底,但是也要保持开放的心态。这些在认知心理学中有相应的讲述。

学习方向

底层知识永远都不过时。算法数据结构永远都不过时。基本的程序设计理论永远都不过时。良好的编码习惯永远都不过时。分析问题和解决问题的能力永远都不过时。强大的学习能力和旺盛的求知欲永远都不过时。你大脑的思维方式永远都不过时。

如何学

以终为始先定一个目标,比如学完后写一篇教程,然后去学习,这样更加有动力,有意思的刻意练习,更为有效。知识经过整理,才更容易理解,容易理解的只是才更容易记忆。

通过PDCA控制。PDCA循环又叫质量环,是管理学中的一个通用模型,最早由休哈特于1930年构想,后来被美国质量管理专家戴明博士在1950年再度挖掘出来,并加以广泛宣传和运用于持续改善产品质量的过程。
PDCA是英语单词Plan(计划)、Do(执行)、Check(检查)和Adjust(纠正)

P (plan) 计划,包括方针和目标的确定,以及活动规划的制定。

D (Do) 执行,根据已知的信息,设计具体的方法、方案和计划布局;再根据设计和布局,进行具体运作,实现计划中的内容。

C (check) 检查,总结执行计划的结果,分清哪些对了,哪些错了,明确效果,找出问题。

A (Adjust)纠正,对总结检查的结果进行处理,对成功的经验加以肯定,并予以标准化;对于失败的教训也要总结,引起重视。对于没有解决的问题,应提交给下一个PDCA循环中去解决。

以上四个过程不是运行一次就结束,而是周而复始的进行。

总结:前期准备、中期执行、后期回顾

人性天生懒惰,大部分的人都是半途而废的专家,其实很多时候,不是我们比别人笨,而是别人比我们更坚持。高德纳先生曾经说过“过早退出是一切失败的根源。 兴趣遍地都是,专注和持之以恒才是真正稀缺的。”

如何坚持下去?给任务作出规划,按进度一步步执行。完成后,反思自己的计划和执行情况。

过不断跳出自己的舒适区,使得自己快速的成长。

通过对比学习来加深理解,并通过大量实践深入理解,达到熟练使用。

深度广度辩证
深度和广度,虽然表明看起来是相悖的,但是我认为其本质是统一的。一个卓越的程序员,其最终都应该是一门精通多门熟悉的人。在早期的时候,程序员是在学习基础课程。到工作以后就需要通过实践来加深自己的技术深度,否则将很难通过大公司的技术面试,这个时候深度要比广度重要。而当程序员的技术达到一定高度后,你的岗位职责就要求你有更高的视野,而只有扩展技术栈才能提高技术视野,这个时候广度就优先于深度了。

程序员的不同阶段,广度和深度的优先级也不尽相同。最终,程序员所掌握的每个技术栈都将构成他的一部分,而这些技术栈一起合力打造一个最完美的程序员。所以,不存在转行一说,只是有时候程序员需要去接触更多的技术。

你可能感兴趣的:(学习规划)