靠谱,这是我见过最好的编程指南了!
从大一入学被调剂到计算机专业,到喜欢上这个专业,再到毕业拿到 10 多个 offer,最终进入理想的大厂工作。回想起这些年确确实实踩过的坑,小北不慎感慨。和我一样,他在刚学习编程的时候也想一口气吃个大胖子,但却不尽人意。
我让小北把这些年来学习编程的一些经验梳理了出来,顺带挑选了一些我认为很值得注意的方面,分享给大家。希望初学编程的你,能少走一些弯路。可能文章比较长,但我真心希望你能一字一句地认真读完,至少,我认为如果我刚学编程的那会能看到这篇文章,绝逼是有一些帮助的。
作为一名计算机专业的学生,很多人会认为编程是在课堂上学到的,其实不是这样的。科班比非科班的优势可能在于知道该去学什么,知道哪些作业和项目是必须完成的,除此之外,真的是全靠自学。
对于自学编程,我认为首先应该考虑的是如何去避免一些坑,这样可以节约大把的时间。下面我就以问题的形式来分享一些我认为重要的方面。
01、应该选择哪一门编程语言
“我应该学习什么编程语言”,可能是困扰编程新手最多的一个问题。很多人一直在纠结这个问题,于是陷入了一种怪圈,这门语言学一点,那门语言学一点,最终什么也没学会,时间也白白浪费了。
刚上大一的时候,我也很想知道应该选择什么编程语言。网上查了很多资料,但答案都略显片面,无非是“这门编程语言难”,“那门编程语言性能好”,“某某编程语言生态好”。
作为初学者,我认为,没有哪门子编程语言是容易的吧?至于性能好不好,生态好不好,更没有概念。
如果你没有明确的方向,那么很好选择。如果你学历高,想走算法、机器学习方向,Python 就是最好的选择。如果学历一般,想做个 Web 后端开发工程师,Java 就是最好的选择。如果学历还行,想做更底层的工作,C 和 C++ 就是最好的选择。
可能很多人和我一样,上大学之前没怎么接触过计算机行业,各种编程语言也就是知道个名字,根本不知道它们之间有什么差别。那索性不要纠结了,我替你做个选择吧。
如果你是在校大学生,首选的当然是学校给你安排的编程语言,毕竟有个可以学习交流的氛围。如果学校选择的不是 C 或者 C++,那么就在私底下自学,千万不要不学,会在以后的工作中吃大亏的。
C 和 C++ 都很难,看起来似乎不适合入门。但学习编程不是只学习某一门编程语言的事,而是要学习一个庞大的计算机知识体系。C 和 C++ 可以帮助你更容易地理解操作系统、编译原理、计算机网络、计算机组成原理,因为底层的东西基本上都是靠它们实现的。
如果你已经参加工作了,但刚开始学习编程,C 和 C++ 对你来说有些复杂和困难,因为学习它们需要大量的时间,你又无法像在校大学生那样投入大把的时间。我建议你选择一门「就业条件更宽泛」的编程语言,比如说 Java,难度适中,生态又极其丰富,也能快速做出一些小的应用,在最短时间内看到学习的效果。
当然了,学习任何一门编程语言都需要看看与计算机系统相关的书籍,这样才能更深层次地去编程。我强烈推荐你啃一啃这本书——《深入理解计算机系统》。
多啃几遍后,你就能把整个计算机系统给串联起来了,学习编程也就更有底气了。
02、需要学习哪些课程
我已经毕业快十年了,偶尔同学们聚会的时候,总能听见一些同学抱怨说,“大学那会,学校安排的高数、离散数学、线性代数、概率论等等,这些课程对工作压根就没有一点帮助,不学也罢。”
对于某些工作来说,这些课程可能没用,但做算法和机器学习的同学肯定知道,这些课程有用到不行。
之前看过这样一个视频。有个同学问一名老师,“老师,学习古文诗歌有什么用啊?”老师一开始觉得很懵逼,因为他之前没想过这个问题,学习古文和诗歌又不能挣钱,又不能当官。但思索了片刻后答道,在教育学的理念当中,有 3 个因素是很重要的。第一就是想象,它决定了你有没有创造性,比如说李白说“为楼高百尺,手可摘星辰”。第二就是直觉敏不敏感,我们看月亮它可能是个月亮,但宋朝有个混蛋说月亮像寡妇的脸,因为他心情不好。第三就是逻辑严不严谨,有些古文严谨到滴水不漏。
同样的道理,你觉得某些课程没用,可能是因为你没用到而已。大学面向的是“面”的教育,什么课程都讲一点,但又不讲那么深。当你工作或者读研的时候,更多的则是面向“点”的学习,用到的知识更专业,更深入。
如果学校安排了某些课程,你感兴趣的话,就使劲学,如果不感兴趣的话,可以放轻松点,做到不挂科就行了,然后把精力投入到你更感兴趣的方面。没必要很抗拒,这门课没用,打死我都不学,这种态度是不可取的。
大学的时候,学校不知道你以后是搞算法还是搞架构,还是搞服务器开发或者搞硬件,所以学校需要你多学习一些课程,尽量都有个了解。对于学生来说,一方面可以从中选择自己感兴趣的方向,一方面对未来的就业方向有所启发。
我给大家一些建议吧。
如果你是在校大学生,可以在学习一段时间理论知识后,做个小项目,将做项目遇到的问题记录下来,针对性地学习相关知识,然后再实践,让知识成网络发射状地变大。
如果你已经参加工作,那么就针对工作中遇到的疑难杂症系统性地学习,做个能够解决问题的人,这样你不仅能够成为公司不可或缺的那个人,还可以最有价值的知识学到手。
03、学习编程是否需要指定计划
其实不只是学习编程需要制定计划,其他任何学习和工作都需要制定计划。小北在上大学的时候就开始定期给自己制定计划,这个习惯一直保持到他工作以后,按照他自己的话叫做受益匪浅。
我自己在平常学习的时候,也喜欢先做计划,然后按照计划表去落实。比如我在学习 Java 基础的时候,会先画一个思维导图,然后按照里面的每个节点再深入地去学习。
下图是 2016 年 10 月 30 日的计划,那时候小北已经大四了,并且已经找到了工作、签了满意的 offer。当时已经没有什么课了,按理说可以放松放松了,不过小北还是制定了一些学习计划,并且选择在 11 月去百度实习。
从内容上看,主要是学习英语和计算机专业课,因为大一大二的时候小北确实不明白为什么要学习专业课,到了大三想清楚原因后,就一直在重新学习,因为计算机专业课真的很重要!学好了这些课,能让你在日后的学习工作中轻松不少。
除了大四制定的计划外,大二的时候小北也制定过较为详细的学习计划,见下图,我都有点自愧不如,说实话,太强了。他把需要学习的内容编了号,存入表格,做起来就有条不紊了。当然了,很难完全按照计划去执行,不过制定相应的计划能让你清楚地知道自己应该干什么。
04、编程是否需要做笔记和写博客
反正我一开始的时候,把写博客当成了做笔记的形式。虽然博客写出来是给大家看的,但一开始没什么浏览量,读者就只有自己,很无所谓的心态。不管你写不写博客,我都强烈建议你记笔记,并且记笔记是一个长期的过程。
就编程而言,我们需要善用搜索引擎,因为搜索引擎会给我们提供各式各样的答案。但答案毕竟是别人的,如果只是照搬的话,可能有用,但你记不住,知识就不属于你,之后你遇到同样的问题,还是要再搜索一遍,并且搜索引擎提供的答案不是一成不变的,可能过了一段时间后,你就找不到原来你想要的那个答案了。
但记笔记不一样,笔记是定制化的,按照你自己的风格定制的,你用自己最喜欢的方式,自己既能看得懂,也能记得住。之后再遇到相同的问题时,也可以快速地通过笔记找得到。
另外,我需要特别提醒你的一点就是,笔记是一种不可多得的财富。如果你以后想写博客了,这些笔记就是最宝贵的素材,可以直接拿来用的。
小北已经记录了四年多了,总共积累了 1G 多的内容,已经形成了他自己的知识体系,给大家展示其中的一部分看一看。
05、需要刷题吗
不管你是刷 LeetCode,还是 OJ(Online Judge),我认识是需要的,但不要“走火入魔”!小北在上大学的时候,身边就遇到了很多搞计算机竞赛的人,他们之间都相互称对方为“XX 神”,使用某个算法,将程序的运行时间从 1 秒降低到 0.999 秒之类的。
我认为刷题不应该是奔着这个目的去的,而是适应写代码的感觉。在这个过程中你会遇到编译错误,你会慢慢去记住一些语法、关键字,并理解一些概念,还可以自己去使用它,比如实现数据结构。慢慢的你就会变得有经验,知道一些错误产生的原因。
刷题到一定程度后就没必要一直刷下去了,可以到 GitHub 上找一些优质的开源项目来看,然后尝试去增加一些功能或者优化一些代码,这样的话,编程能力就能够大幅度的提升。
刷题除了可以锻炼编程能力,对找工作也是有很大帮助的,因为大厂都喜欢这么干。
一开始,刷 LeetCode 可能会很吃力,怎么办呢?我强烈推荐这份谷歌大佬的 Leetcode 刷题笔记,这位谷歌大佬当年在美国卡内基梅隆大学攻读硕士学位时,为了准备实习秋招,他从夏天开始整理 Leetcode 上的题目,几个月的时间,刷了几百道题目。
凭借着扎实的基础和长期的勤奋,他很快找到了如愿的工作。后来,他想啊,自己刷了那么多题,而且对很多题目的解法都有着自己的理解,为什么不把这些题目归纳总结一下,做成一个便于后来者阅读学习的电子书呢?
于是他就把这份 PDF 开源了出来。我哥发给我后,我仔细看了一下,每一道题的题解都写得非常清楚。
引用大佬的话来说,就是:
本书分为算法和数据结构两大部分,又细分了十五个章节,详细讲解了刷 LeetCode 时常用的技巧。我把题目精简到了 101 道,一是呼应了本书的标题,二是不想让读者阅读和练习时间过长。
从我的直观感受来说,这是一本用心的数据结构算法类书籍,全书总共 143 页篇幅,详细讲解算法的内容有十五个章节。每个章节都是一些重要的知识点,伴有基础讲解和例题介绍,当然,也有一些推荐的练习题。
光看书的目录就觉得非常的震撼,相信你和我一样,都有这种强烈的感受。整本书,我仔细看了一遍,并对书中的一些解题思路和代码进行了校验,确实良心了。第 7 章是讲动态规划的,这里摘取了一点内容,你可以看到谷歌大佬对于知识点的讲解是非常透彻且细致的。
从排版上也可以看得出,整本书制作得非常精美。如果你需要这份 Leetcode 刷题笔记的话,可以在公众号后台回复「008」获取。
如果你想刷 OJ 的话,可以去北京大学、浙江大学、全美计算机奥林匹克竞赛的网站。里面有大量历年的竞赛题目,注册一个 ID,然后用自己熟悉的语言(一般有 Pascal/C/C++/Java)写好源代码提交即可,会实时返回信息告诉你是否正确。
北京大学:http://poj.org
浙江大学:https://zoj.pintia.cn/contests
全美计算机奥林匹克竞赛:http://www.usaco.org/index.php?page=contests
06、看书还是看视频
看视频入门,看书进阶。
视频能用较短的时间告诉你你现在所学的技术可以干什么,可能需要先修哪些知识,可以帮助我们搭建一个入门知识体系。
我最近在 B 站上发现了两个不错的视频,推荐给大家看一下。能坚持看完,绝对受益匪浅。
看书的重要性我就不再赘述了,不管到了什么时候,看书仍然是吸收知识最佳的途径。你渴望力量吗?机械工业引进的黑皮书系列,你值得收藏。这些板砖书无论是用来垫显示器还是桌子腿,都是非常好的选择。
《C 程序设计语言》、《算法导论》、《深入理解计算机系统》、《现代操作系统》、《计算机程序的构造和解释》、《编译原理》、《设计模式》、《计算机网络》、《数据库系统概论》等等,这些书啃下来确实比较吃力,可能不太适合初学者,但这些就是计算机方面的经典书籍,
这一套下去,你就会拥有知识与力量!!!等待着你的只会是重塑于新生!!!面试的时候更轻松了,写起代码更流利了,腰不酸了腿不痛了,颈椎也不难受了,高薪升职再也不是梦了!!!还等什么,心动不如行动,编程黑皮书,谁读谁知道,读了你不后悔,读了你不吃亏!成为大拿的机会就在眼前,还等什么,行动起来!!!
最好的编程指南,二哥和你一起学,冲!