大厂资深程序员编程自学方案指南

Time will tell.

回忆这些年的学习过程中,整理了一些自己认为需要注意的几个方面,分享给大家。希望能让初学编程的你,少走一些弯路,文章篇幅比较长,但至少,我认为如果是我刚学编程时看到这篇文章,那对我或多或少是有些帮助的。

我认为科班出身和非科班出身的学生最大区别在于科班出身的学生知道去学什么,知道每一门课程是干什么的;还有一些必须完成的作业、小项目,促使他们去做一些实际的编码练习,除此之外,真的全靠自学。

对于自学编程,我认为首先应该谈的是如何去避免一些坑,这样就可能节约大把的时间。下面我以问题的形式来分享一些我认为重要的方面。

1、我应该选择什么编程语言?

这个可能是困扰新手最多的一个问题是,很多人一直纠结这个问题,然后东学一点、西看一点,到头来什么也没学好,这会很浪费时间。

刚上大一的时候,我也很想知道选什么语言好。问了很多人,网上各种查资料,但所能得到的答案都很片面,多数对这个问题答非所问,总是回答:“某某编程语言难”,“某某编程语言性能好”。

其实作为初学者,我们对计算机体系都不了解,就不要过多地去纠结性能,或者难易等因素,原因等下再说。

如果你有明确的方向,那很好选择。如果你想做算法、机器学习方向,那么 python 是最好的选择。如果你想做 web 开发, java 、 php 等都可以。

如果想做一些更底层的工作,那么就可以选 c 。当然这是建立在你有明确方向的基础上。可是,很多人都没怎么接触过计算机行业,特别是和我一样刚入学就被调剂到计算机专业的人。对这些同学来说,各个编程语言就只是个名字,除了叫法不一样,你根本不知道它们有什么差别。索性就不纠结了,我替你选一个吧。


如果你是在校大学生:

那么你有大把连续的时间,可以先学习 c ,然后再学 c++ 。我个人是学 c 入门的,也许很多人不理解我为什么推荐学 c ,因为 c 和 c++ 都很难、很复杂,看起来并不适合入门。然而正是它们的难和复杂才能让你更好地理解计算机系统。

学习编程不是学习编程语言,而是学习一个计算机生态,即一个庞大的知识体系。只会编程语言而不理解整个计算机的体系,就像只会写字而写不出好文章。了解 c/c++ 和了解计算机系统是极为贴合的,向下可以帮助你更容易地理解操作系统、编译原理、计算机网络、计算机组成原理,为什么呢?

因为较为底层的东西很多都是用 c 实现的,和系统的贴合度极高,很多教材源码甚至教程,在讲述这些知识的时候都是用 c 或 c++ 作为媒介。而向上, c++ 面向对象的机制,也可以做出一些应用,譬如五子棋游戏等,也不会显得那么枯燥。花个小半年时间了解 c 和 c++ ,之后你就会觉得看书、看资料可以轻松很多。


如果你是上班族:

但是刚刚学习编程,可能学 c 和 c++ 对你来说有些复杂和困难,因为学习它们确实是很需要时间。你们不像在校生那样有大把连续的时间,而零碎的时间去学习一个比较复杂的东西效果不见得有那么好,所以可以先学一些更容易见效的编程语言。

从 python 入手吧,至少能快速做出一些小应用,不至于丢失了兴趣,但是真的要入门编程又还得看看与计算机系统相关的书籍,这样才能更深层次地去编程,把整个计算机系统给串起来。

2、学习编程,我需要学习哪些课程?

我要学哪些课程?为什么要学习高数、离散数学、线性代数、概率论等课程?

这个问题之前也困扰了我很久。不过我现在想通了,对于高数、离散、线性代数、概率论等课程,很好解释。做算法的同学肯定知道为啥要学习这些课程,机器学习中会大量用到上述提到的课程,所以会比较好理解。

对在校生而言,学校开设的很多课程我们不知道为什么要学,我们很疑惑,不知道学它有什么用,这个时候我们就会很纠结,还会产生抵触情绪。这很正常,因为我们学习得并不深,自然不能理解它们的用处。

在我看来,大学本科课程更多的是面向 “面” 的教学,即什么课程都教给你一些,但是又讲得不那么深入;而工作或者读研,更多的则是面向 “点” 的学习,用到的知识更专。

本科时,学校也不知道你以后是去搞算法、还是搞架构、还是搞服务器开发,甚至去搞硬件,所以学校需要你学很多课程,至少有个了解。对学生来说,一方面可以从中选择自己感兴趣的点;一方面也可以对未来的就业方向有些启发。所以即使像数电、模电等课程,虽然之后可能用不着,但是你也要学,并且会花费大量的时间。虽然你最后不一定去搞硬件,但是这些课程也会让你更容易去理解一些知识,比如 cpu 中的逻辑器件

如果你在大一的时候就有一个明确的定位,知道自己今后想从事哪方面的工作,课程与课程之间是可以调一下优先级的。不过像大学物理,这种课程确实是对编程没有帮助,但是像我前面所说的,大学教育更注重广度,大物等课程可能就是为了给你普及生活常识吧。

其实,大学教育的问题是普遍存在的,我认为我们学习一项技能的时候,应该采取的是项目驱动式学习,即需要用到什么东西时不会了再去学,而不是先填鸭式的都填进脑子,并且在学习的过程中我们还不知道它这是干嘛用的,等之后用到了,甚至不记得自己学过,反而查资料才会想起:“哦,原来我之前学的 xx科目 是这个用处啊。”

很多时候学生时间的浪费可能还是要怪老师、怪学校,他们一开始没给我们做好充分的课程介绍。所以,在经过比较多的编程和项目实践后,我认为一个比较好的学习方式是,改良版的项目驱动学习法。即:

学习一段时间,做一个小项目。将做项目遇到的问题记下来,针对性地学习相关知识,然后再实践,再学一段时间理论,让知识成网状发射状地变大。当然,项目驱动式学习有一个弊端,就是每次学习的知识都是项目所需要的,很零碎、不成体系,所以需要改良,即在采取项目驱动学习法的时候每天抽一段时间去完整地读一本书,或者一个相关问题的完整介绍,这样就很容易把一些知识成体系地串起来。这样一段时间下来,慢慢的,你就知道我们为什么要学那么多科目,学这些科目能干什么。

3、学习编程是否需要制定计划?

我认为不只是编程需要制定计划,其他的任何的学习和工作都需要制定计划。从13年上大学就开始给自己制定计划,这个习惯也一直坚持到了现在,受益匪浅。当然也不只是制定学习计划,还可以列一些自己需要做的其他的事情。我最近在整理笔记的时候也发现了一些之前记录的计划和清单,可以给大家看看。比如下图就是我早年年写的笔记,笔记上都留下了最后一次打开的时间,因为当时不太懂得规划,所以比较乱。


把需要学习的内容进行了编号,存入表格,这样才能让你过得有条不紊。当然,很难完全去按照计划执行,不过制定相应的计划能让你清楚地知道自己应该干什么。


如果你是在校生,那么好好制定一个计划吧,因为你有大把的时间。当然,如果你已经毕业了,没关系,我现在也在上班,同样也列举了自己最近要学习的内容,如下图:

4、编程需不需要做笔记和写博客?

我觉得,写不写博客无所谓,因为博客是要写出来是给大家看的,可能要保证格式美观、语法也要尽量准确,最好比较有文采,我觉得挺麻烦的。

而笔记则是必须要做的,并且记笔记是一个长期的过程。在学习的过程中,我们一直都在追求一种最高效的学习方法,比如,同一个班的同学,他用他的学习方法考上了清华,而你用同样的方法就不行,为什么?

因为他的方法对他自己而言是定制化的,可能且大概率不适合你,比如他的笔记你不一定能看懂,因为他可能设计了一套属于自己的符号。而就编程而言,很多同学说善用搜索引擎,是对的,可是搜索引擎搜出来的是别人的答案。你照搬过来,也许可以用,但是你没有记住,这些知识并不属于你,之后你可能还会遇到同样的问题,又要再搜索一遍,可能很难找到之前的那个答案了。

但是记笔记就不一样,记笔记是完全定制化的,对你自己定制的,你可以用自己最爽的表达方式来描述一个问题,是自己写给自己看的东西,看了几遍之后就能非常迅速、容易地理解。之后遇到相同的问题可以快速地通过找笔记解决。

记笔记的习惯一定要坚持,等过个一年或者两年,这就是你巨大的财富,因为那是只有你才能看懂的东西。我已经记录了4年多、1G多的内容,现在的笔记基本已经形成了体系,可以给大家展示其中一部分看下:


5、有什么比较好的编程方法?

除了上述分享的方法,我认为在同一时间段不要学习太多类别的课程。比如你可以同时学习 python 和 html/css ,但是你不要同时学 python 、操作系统、编译原理、计算机组成、数据结构、网络。

我曾经试过,一门课没学一会儿就学下一门,其实上一门根本学不到什么实际的知识。因为记忆知识是符合艾宾浩斯记忆曲线的。对于一门课,特别是很难的专业课,譬如操作系统,你每天看半小时,效果是比较差的,可能你热身就得半小时。所以宁可每天学两门,然后每一门学长一点的时间,比如两小时。毕竟学校上课,一次课也得两小时,要避免贪多,一口吃不成个胖子。

6、我需要刷 oj 么?

我认为刚开始编程的时候还是应该刷的,但是一定要注意,不要被你周围的“X神”给误导了。因为我上学的时候,身边是有很多搞计算机竞赛的人,他们之间都互相称对方为 “X神” ,某某神又使用一个牛逼的算法,将程序时间从1秒降低到了0.999秒。我要劝大家的是,刷题不是为了达到这个目的,不是说非要在竞赛中拿奖,除非你是特别喜欢,否则,没必要去背代码。

我们刷题的目的是适应写代码的感觉,在这个过程中你会遇到编译错误,你会慢慢去记住一些语法、关键字,并理解一些概念,还可以自己去使用它,比如实现数据结构。慢慢的你就会变得有经验,知道一些错误产生的原因。我也是慢慢这样过来的,我现在在工作和下班以后写代码时,基本都不用 IDE 了,比如写 c++ ,要么 vim ,要么就是 sublime ,而调试用的是我前面提到的工具 gdb 。即,有一个文本编辑器就能写代码,脱离了 IDE 的束缚。在写 oj 之后一段时间,在比较熟练了之后,就可以不去刷题了,可以去譬如 github 这样的网站上找点项目来看,然后自己跟着写一下,编程能力慢慢地也就提升上来了。

7、看书还是看视频?

我认为看视频是一个很好的学习方式。不过我们得明白看书和看视频的优缺点。

我很建议看视频入门,因为目前网上的应用型视频都是很简单的,很多是面向初学者的,视频能用较短的时间告诉你你现在所学的技术可以干什么,需要先修哪些知识,可以帮助我们搭建一个项目驱动式学习的网络。

可是视频也有缺点:就是知识非常的杂,很不系统。虽然现在很多教学网站都提供了学习路径,但是这些路径中的视频很多时候都不是同一个老师录制的,只是按照知识的依赖关系排的顺序。所以,如果想通过视频去系统地学习一门知识,是比较困难的。

而应用型的,比如 web开发等知识,还是得看书。书籍等特点就是系统化,由浅入深,你可以定制化地看自己薄弱的章节。

8、多久能学会编程?

其实这个问题是没有答案的,如果只是想做出一个小应用,2个月足矣,而就我个人而言,我认为学习编程不是学习一种编程语言,而是学习一个生态,一个计算机系统,所以无止境。

9、我应该选择什么资料,看什么书?

这个问题也是很多编程新手容易困惑的问题。网络上拥有我们一辈子都看不完的教程和资料,所以现在应该不会存在找不着视频教程、找不着书看的问题。而问题就是我们不知道看什么视频、看什么书。

从开始学编程到现在,我也买了上百本书,而真正适合自己的好书并不多。而视频教程的问题就更严重了,东看一点、西看一点,知识很难组织成体系。所以学习编程的过程中,我们遇到的最大问题是:当我们遇到问题时,在大量资料面前,我们不知道选择什么资料去学习。即使我们使用项目驱动式学习方法找到了方向,但是同一个路径下,也有很多资料。前文列举的项目驱动式学习的图中,我们是自上而下的去发现问题,然后再解决问题。如果能有人帮我们组织好学习路径,然后自下而上地去学习,那么效率会提高很多。


好了,以上内容就分享到这里,如果你对Python自动化软件测试、面试题、及更多内容感兴趣的话可以加入我们175317069一起学习。群里会有各项测试学习资源发放,更有行业深潜多年的技术人分析讲解。

欢迎【点赞】、【评论】、【关注】~

Time will tell.(时间会证明一切)

Java语言是SUN公司开发的一种编程语言。 1.1 Java语言产生和发展的背景   Java语言源于Oak语言,这是SUN公司在一项消费性电子产品软件发展方案中采用的语言。Oak的设计目标是用以开发可靠、紧凑、易于移植的分布式嵌入系统。尽管Oak语言在技术上颇为成功,但由于商业上的原因,却未能在市场的激烈竞争中站稳脚跟。然而,Internet和WWW日新月异的发展却为Oak创造了新的生存空间。Oak经过改进,成为一种非常适合网络开发的独特语言——Java,从而脱颖而出,一举成名。   Internet,中译为“因特网”或“互联网”,是当今最大的国际性计算机互联网络。它源于美国国防部高级研究计划局(Advanced Research Project Agency)的网络ARPANET,但发展到今天,已成为一个庞大的全球网。顾名思义,这是一个“网间网”它把各种异构网络联接一起,使位于世界各地、不同网络中的人们能够自由地交换信息。Internet在全球的用户以千万计,并在不断激增;被它直接、间接连通的国家也越来越多。Internet上的协议标准也日益受到广泛支持并在不断地得到扩充。   WWW全称为World Wide Web,中译为“万维网”、“全球网”等,是Internet中最为直观和富有魅力的资源。它运用超文本(Hypertext)技术将信息组织成文字、声音、图像,用户可以用浏览器读取这些信息。WWW上信息种类繁多,用户可以根据自己的需要在任何时间访问自己所需的信息。WWW上的信息由页面组成,页面中包含超文本链接(Hypertext Link),把位于不同页面的相关内容链在一起,因而检索信息非常方便。WWW的发展也是日新月异,它已不止局限于展示静止信息,正在不断增强交互和动态性。许多商家和企业也把目光瞄准了WWW,可以预料,WWW世界将变得越来越丰富多彩。   Internet(含WWW)为人们提供了许多有用的信息,然而,Internet上的用户使用着各种各样的计算机,系统软件和用户软件也缺乏兼容性。在这些不兼容的平台间交换信息,就像对许多语言不通的人讲话一样,是非常困难的。而Java与生俱来的特性刚好可以解决这道电脑界的“世纪难题”。它建立的虚拟环境运行标准解决了软件跨平台执行的问题,使不同的平台都能理解用Java编写的程序,命名Java语言成了网络世界的通用语言。因此,Java在Internet和WWW环境下如鱼得水,迅速风靡全球。   总之,Java作为一种独特的语言,诞生于Internet和WWW蓬勃发展的时期,可谓恰逢其时。如今的Java与当初的Oak语言已不可同日而语。而且,Java技术的创始者SUN公司采用了一种“开放”策略,将它公诸于众,更激发了第三方软件开发商的极大热情,纷纷发展Java技术。Java的前景是非常广阔的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值