学习的三大要素:方向、路径、动手。
计算机博大精深,初学者很容易迷失其中。选定一个方向并坚持下去很重要,Web开发是初学者的最佳选择。
计算机语言众多,选择一门最容易入门的语言即可,JavaScript就很适合。
计算机属于工科,需要的是大量动手实践,而不是死记硬背。
学编程的三大要素:英语、逻辑、细心:
英语好的同学看英文书籍、文档,写代码非常流畅,所以印度人比中国人在这块更有优势;
编程最重要的就是培养你的逻辑思维,永远记住:思维是人脑最核心的东西;
在编程中经常被一个符号、一个字母的拼写错误而卡住半天,所以优秀的程序员永远都是粗中带细。
关于编程的三个错误认识:枯燥无味、烧脑、青春饭。
会编程的人都是奇葩,这种整天和英文字母、数字待在一起的工作枯燥无味。
编程太烧脑,里面各种算法、数据结构要让人疯掉,编程纯粹就是个烧脑的工作。
搞编程的经常加班,这个行业就是个吃青春饭的行业,30岁必须得转行。
关于编程的三个正确认识:有趣、不烧脑、铁饭碗。
字母和数字的无限组合就能创造出那么多有趣的网站、游戏、软件,这是非常让人着迷的,也非常培养一个人的专注力。
学编程不是搞计算机科学,你不需要接触那么高深的算法、数据结构、高等数学,它并不烧脑,但却烧手(需要每个人手动敲大量代码)。
只要你会编程,能解决问题,没有人在乎你今年是81岁、还是18岁,编程这门技能会成为你一辈子的铁饭碗,
学习编程的至理名言:Learning by doing 实践是学习编程的重中之重
任何你能看到、听到的东西都是他人总结的知识点,如果你不实践、不消化、不转化成自己的东西,那这些知识永远是他人的,不是你自己的。
在掌握最小知识点后,就应该立刻开始实践,在实践中发现更多知识点;
英文是学习编程的最大障碍,所以一款好用的中英文词典是你的好帮手。传送门
找一个安静的环境,把手机静音,集中注意力开始我们的互动课程吧。
准备好了,GO!
之前有不少学弟学妹问我如何学习编程,根据DRY法则(Don't Repeat Yourself),还是把自己学习过程中的一些经验整理成一篇博客吧。由于本人目前也处在学习的阶段,文章中列出来的内容也并未全部学习过,所以文章的客观性可能存在一些问题,还望读者自行判断。
这份指南会不定期更新,有好的建议也可以留言或者给我发邮件。
准备
需要的所有工具就是一台可以连接上网络的电脑以及你本人。
科学上网
很可惜,即使是现在,大部分学习计算机的学生还是不会科学上网。在当前的网络环境下,不会科学上网,意味着你不能用Google查资料,不能再Reddit看最新的资讯,需要忍受龟速的GitHub,云云。然而,科学上网本身却是一件成本非常低的事情,不想折腾的话,一年花个几百块钱买个现成的服务;有折腾精神的人,可以买个服务器自己假设架设上网工具。这一步很重要,不能跳过,否则后面指南中的许多内容对你来说只能是404了。
关于科学上网的具体内容,就不再多说了,给你一个关键词:Lantern。
学会使用Google搜索
学会了科学上网,你就能够使用Google了,为什么不是Baidu?相信你用了Google之后就自然明白了。
当了一个学期的助教之后发现,很多的同学其实是没有使用搜索引擎的意识的,遇到问题要么自己死磕,或者就直接求助于他人。这两种都不是很好的办法,正确的做法是在自己思考后没有结果,然后使用搜索引擎查找问题,现阶段,你遇到的所有问题(几乎)都能在Google上找到现成的答案,如果没找到,肯定是你搜索的方式不正确。
使用Google的基本搜索功能就能够解决大部分问题了,当然,如果想要学习更加高级的技巧,这里有一份指南:如何用好Google等搜索引擎?。
英语
你不得不承认,目前为止,编程世界的主流语言还是英文,所以英语能力的好坏决定了你编程能力的上界。中文资料和英文资料相比,实在是太匮乏了,就质量而言,也相对较低。比如我后面提到的很多的课程,都是英文的内容。
值得庆幸的是,阅读编程资料所需要的英文水平并不需要很高,就个人经验来说,基本上四级水平就足够了,可能还会存在一些生词,但是基本上并不妨碍理解。
英文的学习应该一直贯穿于编程的学习之中,作为一门工具语言,只需要花少量时间就可以带来比较大的收益(2/8法则)。
本人的英文水平也不算好,但是基本上能够阅读技术书籍和文档,能够听懂公开课,所以还是有一些简单的经验可以分享一下。
把系统换成英文的
有些同学可能看到英文就头疼,这很正常,因为在中文的环境下面生活的太久了。为此,可以试着将平常用的系统换成英文的,虽说不能学到几个单词(Copy/Paste 之类的词),但是可以让你不那么排斥英文,顺便还可以提升一下B格(误)。
安装电子词典
OS X下推荐欧路词典,在APP Store中购买完整版的,因为需要添加外部的词典。
这里推荐一部比较好的词典:《Collins 英汉双解词典》,它是这个样子的:
主要看它的英文解释,一个词看得次数多了也就记住了。
每天阅读英文的资料
一些个人经常阅读的网站:
Quora:一个类似于知乎的问答类网站,可以挑自己感兴趣的内容来阅读。
Hacker News:IT资讯,IT界发生的最新的事件都会在上面。
PROGRAMMING:Reddit的Programming板块,和Hacker News类似,不过更加专注于技术内容方面。
不要花太多时间在上面,每天浏览一下就行。
英文学习的总结
英语不是能够速成的东西,也不是三言两语能够讲完的东西,这里只是提供一个简单的指导,具体的学习计划还请自行搜索更加专业的学习指南。
编程基础
完成了这一部分内容的学习后你应该具备:
了解什么是Computer Science
基本的计算机数学能力
基本的程序开发能力
基本的算法与数据结构的知识
计算机科学导论
Introduction to Computer Science and Programming:面向无编程基础或者只有一点基础的人群,使用Python作为教学语言。
Intensive Introduction to Computer Science Open Learning Course:CS50,哈佛很火的一门课,在网易公开课上可以找到翻译的视频内容。涵盖的主题有算法(设计、应用、分析);软件开发(抽象、封装、数据结构、Debug、测试);计算机体系结构等等。基本上是一门大杂烩的导论课。使用的语言是C、PHP、JavaScript。
Programming Abstractions:介绍了更加高级的编程主题(递归、算法分析、数据抽象等等),使用C++作为教学语言。
数学
Mathematics for Computer Science:介绍了学习计算机所需要的一些数学知识,内容包括集合、关系、证明方法、数论、图论等等。
Discrete Mathematics:离散数学。
编程语言
Learn to Program: The Fundamentals:面向无编程基础或者只有一点基础的人群,使用Python作为教学语言。
Learn to Program: Crafting Quality Code:如何编写高效与正确的代码。需要有Learn to Program: The Fundamentals的基础。
The Structure and Interpretation of Computer Programs:经典的SICP的Python版。
计算理论
Introduction to the Theory of Computation
Principles of Computing (Part 1):介绍了CS中基本的数学和编程理论,需要有Python基础。
算法与数据结构
Introduction to Algorithms:MIT的算法导论课,用《算法导论》作为教材,网上可以找到视频资源,网易公开课上有老版的翻译。
核心课程
学完了「编程基础」部分的内容后,应该已经可以开发一些简单的程序了,「核心课程」的内容将深入学习计算机科学理论的几个重要的内容。
数学
Coding the Matrix: Linear Algebra through Computer Science Applications:线性代数以及在计算机中的应用。
Discrete Mathematics and Probability Theory:离散数学与概率论。
计算理论
Theory of Computation - Fall 2011:介绍了机器模型、上下文无关文法、图灵机等,使用的教材是Michael Sipser的Introduction to the Theory of Computation。
算法与数据结构
Data Structures and Advanced Programming
Efficient Algorithms and Intractable Problems
操作系统
Operating Systems and Systems Programming:UCB经典的操作系统课程,介绍了操作系统的基本概念、系统编程、网络、分布式系统、内存分配、多线程等等。
Introduction to Linux:介绍了Linux以及一些简单的命令行使用。
程序语言理论
Programming Paradigms:编程范式。
Compilers:Stanford的编译原理课。
Principles of Programming Languages
计算机体系结构
Computer Architecture:CMU
Computer Architecture
计算机网络
Computer Networks
Fundamentals of Computer Networking
编程工具
IDE
Python: PyCharm
Java:IntelliJ IDEA
C/C++: Visual Studio
编辑器
Emacs/Vim
Sublime Text 3
VS Code
Atom
并不一定要用Emacs或者Vim,ST其实已经很强大了,足够做日常简单的编辑工作。(这里黑一下Atom,启动速度太感人了,所以放在最后一个。)
Git & GitHub
使用版本控制来管理自己平时写的代码。
推荐阅读:
git-recipes
Pro Git 2nd Edition
Git教程 - 廖雪峰
如何克服拖延
资料是有了,但是拖延症不去学怎么办?
番茄工作法
参考资料
https://github.com/prakhar1989/awesome-courses
http://blog.agupieware.com/2014/05/online-learning-bachelors-level.html
https://docs.google.com/spreadsheets/d/1_kdHrT8izbROJNaxGflpcZm2ivsjRGF8j1hMzl3b8O0/htmlview
https://www.reddit.com/r/programming/wiki/faq
热门评论
除了学生,其他的选项都是工程师,设计师,对于进入任何一个新的行业来说,可不就是学生吗?
除了学生,其他的选项都是工程师,设计师,对于进入任何一个新的行业来说,可不就是学生吗?
学无止境,何况在乎所谓的标签马甲。
“人这一辈子,大家都要努力的做个学生,因为这个生代表着生生不息,不断进步,你是学生,我也是学生。”
老祖宗还曾曰:“三人行,则必有我师。是故弟子不必不如师,师不必贤于弟子,闻道有先后,术业有专攻,如是而已。”
大家可以相互借鉴经验,共同进步。