刚开始学习编程的时候,
- 想写段不报错的代码吧,需要耗时十几分钟到一个小时。
- 刷一道 Leetcode 上面的算法题呀,需要一个到几个小时。
- 实现一个稍微复杂点的功能需求,跑通时间无比长。。。
当时,想一夜之前变成写代码的高手。
现在,为什么当时的自己会觉得编程很难?
其实,学习编程的正确方式 和 传统教育的学习方式 是不一样的,甚至是相违背的。
我们从小被教育的绝大部分知识都是通过老师传授,自己记忆,反复刷题来记住的。
而自己动手的部分极少,想想高中的实验那些化学物理实验基本都是老师在讲台上做的。
我们需要做的只是记忆知识点,以及为什么实验会出现这个结果。
我们从小被告知的成功标准就是获得考试中的高分。
可笑的是,这个标准在大学毕业之后立马变成了买车买房,结婚生子。
在我看来,语文是一个还比较有创造力的学科,因为至少还有作文这个领域你是可以自由发挥的。
其他的学科在应试教育下都失去了学科本有的魅力。
而编程,恰好是一个实践性和创造性很强的东西。
需要大量的代码实践。
只有动手写代码了才能知道输出是什么。
同样的需求可以有 1-n 种实现方式,实现方式上又各有自己的优缺点,根据场景的不同需要采用不同的实现方式。
这就和高考考卷只有一个正确答案有很大的区别。。。
所以初学者觉得写代码难,本质上是无法适应 学习模式的改变。
好了,废话说了这么多,其实想表达的只有一个。
要提高自己的编程能力,第一步需要的是转变自己的学习模式。
编程语言
- 数据结构
- 算法
- 系统理解
为了简短起见,就不给大家推荐书籍啦,只会大概讲下。
编程语言
编程语言可以多学几种,切勿将自己局限于一种语言。
最好是一种面向过程,一种面向对象,一种脚本语言。
目前来看市面上主流的主要是 JAVA 和 C++ , GO 语言这几年也比较火,是类 C 的语言,有 C 语言的基础学起来是很快的。
- Java 是综合能力很强的语言,Java 的生态也非常的强大,企业一般都是基于 Java 生态来快速实现自己的业务需求,Java 的生态也能让你有更多的大局思维。
- C 语言偏底层,操作系统和很多优秀的组件也都是通过 C 语言实现的。
学习 C 语言可以更好的了解计算机的底层。 - C++ 是一门又强大又很难的语言,很多大厂用 C++ 开发核心架构,比如腾讯、百度、谷歌等。
但是,请勿尝试在短时间内学习过多的语言。
不要只关注语言的语法。要专注于语言的范式,其弱点和强项。
了解每种语言适合的位置,语言的生态等。
数据结构
经常会有同学问,这个数据结构的代码是 Java 的还是 C 的还是 C++ 的。
在我看来,数据结构是不分语言的。
在维基百科上面,数据结构的定义如下:
常见的数据结构
- 堆栈(Stack)
- 队列(Queue)
- 数组(Array)
- 链表(Linked List)
- 树(Tree)
- 图(Graph)
- 堆积(Heap)
- 散列表(Hash table)
想要提高自己的编程能力,可以
用自己所知道的任何语言来实现数据结构。
了解这些数据结构的基本操作(插入数据,删除数据,随机读写等)的时间复杂度。
了解每个数据结构优点和缺点和适用场景。
算法
同样的,算法也是不区分语言的
好的算法可以最大程度的节省我们的成本和资源。
- 基本算法
- 深度优先搜索
- 广度优先搜索
- 启发式搜索
- 遗传算法
- 枚举
- 搜索
- 数据结构的算法
- 数论与代数算法
- 图论的算法
- 哈夫曼编码
- 树的遍历
- 最短路径算法
- 最小生成树算法
- 最小树形图
- 网络流算法
- 匹配算法
- 分团问题
- 动态规划
系统理解
我们都知道,程序都是要在一定的环境下才能运行的。
比如,JAVA 程序就是跑在 JVM 上面的,如果你想成为一个优秀的 JAVA 程序员,就避免不了要去了解 JVM。
而 C 程序和 C++ 程序则是直接跑在我们的操作系统上的。
所以我们还必须要去了解操作系统的底层原理和系统编程。
那作为转专业的同学呢,就还需要自己下去多补课,了解计算机组成原理,计算机体系结构等等。