如何自学计算机编程?

做者:骸音
连接:https://www.zhihu.com/question/28354731/answer/138578609
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。javascript

前面的不少人写的回答都很好,答主本科研究生6年一直学的都是机械,学业中偶尔用到编程,都是很是简单的,写个function,写个loop,仅此而已,对计算机运行原理一窍不通,甚至分不清bit和byte的区别(毫无夸张)。找工做时候误打误撞进了软件行业,开始自学编程,利用天天下班时间看书看open course, 学会了一些计算机的和编程基础知识,如今就任谷歌,坐标美利坚。之因此想补充,是由于其余回答大多说的若是将编程做为一个兴趣学习,我的以为,要把编程,或者说软件工程师做为你将来的职业,仅仅pick up一门语言,写简单程序,是不够的。理解计算机程序的运行原理和理解不少相关的知识很重要,不然在学习的路上对不少概念只能是只知其一;不知其二,走不了太远。如下列一些计算机的基本概念和相关的课程,答主以为对成为一个优秀的程序员是颇有帮助的,也是必须的。1. 计算机系统,推荐课程: UC berkely CS61C,理解难度高,不过很是重要!link: https://www.youtube.com/watch?v=gJJeUFyuvvg&list=PL-XXv-cvA_iCl2-D-FS5mk0jFF6cYSJs_此课程讲述了计算机程序是如何运行的,一些计算机,程序的基本概念,例如计算机汇编指令,内存,寄存器的意义,进程和线程的区别。这些概念的理解对一个程序员是相当重要的。懂了这些,才能在程序设计和编写中考虑到一些基本的问题,例如如何和为何要防止内存泄漏,如何写程序能够减小cache miss提升performance.2. 数据结构和算法, 推荐课程:UC berkely CS61B, 理解难度中高,重要的不能再重要link: https://www.youtube.com/watch?v=mFPmKGIrQs4&list=PLZBP-86GmPTxpbvoFFzad0qYw5dKA8MV2若是不理解基本的数据结构和算法而编程,基本至关于不懂力学就去建造一个大楼,楼可能能建起来,可是你敢住,我可不敢。程序的基本做用是存储数据和处理数据,能够把数据结构和算法理解成完成这两项任务的基本工具和思想。3. 网络基础知识,推荐课程:Stanford Network, 理解难度中等,很重要link: Introduction to Computer Networking我就不用说网络在软件中有多重要了,除非你只是想写个计算器,不然这些基本概念确定要懂。这个课程基本讲解了网络building blocks, 浏览器是如何从你打入一个字母组成的网址,到把一个能够interactive(交互)的页面显示给你,虽然这发生在短短一秒内,但后台发生了不少事情,才能保证这个网页传到你的浏览器上。从dns ,router,到load balancer, 再到http, tcp/ip, html, css, javascript。上完这个课程,基本就清楚了。先写到这……有人有兴趣我再继续更新,后面还有,大概写了4分之一/*睡了一觉起来看到这么多赞同真实受宠若惊,既然你们这么有兴趣,我接着码字。我争取天天抽出一段时间更新,答主有个刚出生3个月的娃,时间比较不稳定。首先要解释几件事情,答主自学Computer Science或者说编程的过程彻底在国外完成,因此全部学习资料和视频都是英文的,不少术语我也只知道英文的,对你们理解带来的不便先表示歉意。不过说到这,我认为作到两件事情对高效学习CS有很大帮助. 第一,学好英文,尽可能用英文学习关于CS的概念。这么说并非由于我崇洋媚外,而是客观的说,就算我国科研技术和编程水平已经和美国差距不大,但就教学水平和教材质量来讲,还差了不少条街,并且不少CS的概念会直接用英文呈如今编程语言当中(stack, heap, tree, array, list, map, graph),即便你学的时候用的是中文,编程的时候仍是要知道英文,写英文,直接学英文省去了二次学习。第二,*。这一点的缘由不只仅是国外的教材和课程视频大多在墙外的网站(几乎全部公开课在youtube上,我会把上面提到课程的link)。还有就是,我去年曾经回国在公司的北京office工做过一段时间,试着用了一下百度,就搜索编程技术相关的问题上,百度的搜索结果质量被google甩了不知道多远。上面写过的课程我会贴YouTube连接,这些课程能写的做业强烈建议你们跟着写,由于编程水平是靠写代码写出来的。/4. 数据库这个topic我没有什么推荐的课程,由于大多数我看到的数据库课程都是在讲如何使用sql数据库。数据库的知识我认为分两部分,做为一个入门的程序员,可能只须要知道写简单的sql语句,如何create databse, create table, insert, update and query. 这是数据库学习的第一部分,我建议利用一些能够边学边写的网站学习这部分,实战才会印象深入,这里推荐一个网站(不知道需不须要)Learn to code, 他们家有不少课程,都不错,你们不须要用付费版本,免费版足够。 数据库的第二个层面,我认为才是数据库的精髓,这部分我是靠阅读网上的文章加继续搜索学习的,就是数据库的运行原理,具体说,就是数据库是怎么样实现快速查找的,想象一下,一个表有不少列,例如一我的的资料,姓名,性别,住址,年龄。那么好比我要查找一个年龄区间的人,数据库不可能每次都去根据年龄排序,再输出,排序的复杂度是nlogn, 就算不排序, 每次输出的复杂度也是n, 这对于动辄上百万记录的数据库来讲,速度是不能接受的,因此数据库会用到几种特殊结构的tree去存储这些列,保证在输出的时候,复杂度基本在logn。关于这些tree是如何实现的,能够独立写一篇很长的文章,建议你们先学会并理解几个基本的tree structure(数据结构和算法里有讲到),顺便在这里推荐一个微信公众号,事先声明,这个公众号跟我没有任何关系,只是他家文章水平广泛较高,公众号的名字叫"开点工做室“,里面有一片讲数据库实现的文章写的很是好,很深入。/ 这周一直在加班,外加出差,一直没有更新,十分很差意思,周末有点时间我来更新一下*/5. 操做系统 推荐课程 Berkeley CS 162link: https://www.youtube.com/watch?v=1IcZB26STUE&list=PL-XXv-cvA_iBDyz-ba4yDskqMDY6A1w_c推荐书:Computer Systems: A Programmer's Perspective操做系统(英文缩写OS)其实即便是经验丰富的软件工程师都不多有很是熟悉的,由于实在难点太多,太难理解,其中有不少鸡生蛋,蛋生鸡的问题,答主本身也并无理解的很是好,但我认为对于一些基本概念的粗浅理解也是很重要的,例如OS如何schedule process的,如何管理内存的,如何实现各个process切换的,文件系统是怎么实现的,还有最难理解但也必定要有一些理解的一个概念--锁(mutex lock)。我以前在Oracle的工做经历主要负责的提升操做系统的性能,因此理解较通常不在这个领域的程序员的会深入一些。说一说为何锁很重要,如今不多有程序是单线程了(javascript除外),在多线程的运行环境下,若是没有锁基本上就会天下大乱了。举个最简单的买牛奶的例子,假如你和别人合租有个室友,大家俩天天都喝牛奶,有一天你回家发现没有牛奶了出去买牛奶,然而在你室友回来后你还没回来以前你室友没法判断你是否已经去买牛奶了,若是他认为你已经去了而本身没去,大家家里会有一瓶牛奶,若是他认为你没去本身也去了,大家家里就会有两瓶牛奶,若是他认为你去了而你没去,大家家就没有牛奶了。这种在多线程程序中会出现不肯定结果或错误结果的状况很可怕,须要解决。那么解决方案就是锁,在这个例子里,锁就是一个贴纸,若是你去买牛奶后贴一张纸告诉你室友你去买了,那么对于你室友这个就很容易解决了,若是他看到没有牛奶,没有贴纸,他就去贴一张纸条告诉你他去买了,结果是大家家有一瓶牛奶。若是他看到没有牛奶但你贴了纸条,那他就知道你已经去买了,他就不用去买了,结果仍是大家家只会有一瓶牛奶。这样程序执行结果就不会有不肯定性。固然,真正的锁实现上比这个复杂并且会有不少种锁,但基本原理就是这样的。关于这方面,和第2点一块儿,推荐一本书,我写在了开头,这本书开头3章不太好懂,讲的是一些很基础的计算机实现原理,不过要坚持看下去,看不懂就多看几遍,配和网上搜索,也能够给我发信,不过我时间很是有限,尽可能回答,没时间回答你们不要怪罪。6. Version Control System. 推荐Git. 推荐教学网站: Learn Git with Bitbucket CloudVersion Control system,我不知道如何翻译比较靠谱,意思就是版本控制系统。先说说为何咱们须要它,版本控制系统帮助你更好管理你的程序,更好的帮助一个小组在程序上进行合做。举个例子,好比你用word写文章,想象每次你保存都不会覆盖,而会保存成一个新的文件,而且这个文件名会记录你和上一次保存的变化以及你的保存时间(这个保存叫commit),这样若是你在一次改动的时候若是以为改动的太差,你不用手动改回到上一次保存,这个系统会帮你一键回到任何一个你以前的保存,这样你在每次保存后就能够放心大胆的改动,不用担忧若是程序没改好致使前面的成果所有废掉,由于你随时能够回到任何一个前面的版本。再说说它的第二个做用,就是合做,假设你程序写到一半,发现这个程序须要的工做量远远超过你以前的预期而你须要别人的帮忙,因而你有了一个合做伙伴,这个合做伙伴用这个工具copy(这的copy通常叫clone)了你的文章,这样他瞬间就获得了你以前全部的版本。当大家俩分头编辑了不少以后,这个工具能够实现一键合并大家俩的修改的内容(merge),若是大家修改的内容有冲突(merge conflict),这个工具会告诉大家有冲突的地方并让大家逐一选择选择谁的修改,当合并好以后,此次合并对于大家俩来讲又都只是一次commit, 随时能够回到各自合并前的版本。Version Control有不少,比较popular的有git, perforce 和Mercury,我的最喜欢的是git, 你们能够先学学git.----------------------------------------------------------------------------------------------------css

相关文章
相关标签/搜索