下面的回答我都很认真的逐一看过了。但是我希望的回答是全面的,深入的。有一些回答我不明白您是在抖机灵还是像轮子哥一样初中就开始编程,但是我是个普通人,我希望回答者能够抽出一点时间写个全面一点的回答,谢谢。 还有请不要在问题上评论,这种不说出论据直接甩出观点或者嘲讽,影响不大好… ps:题主的自学构架是和学校里计算机专业的构架同步 有兴趣的同学可以去看另一个题主的提问:计算机科班出身的优势是什么? …
感谢大家把这个回答又顶了上来,其实我原文写在两年前左右,我最近又录了个视频做补充。视频有半小时,暂时放在油管上,等我有空也认证一个b站帐户上传到国内。
吾之蜜糖,彼之砒霜,有人说这就是一篇毒鸡汤。我也不想本文成为年轻朋友辍学的借口,各位看官请慎入、请慎入。还有人说是我智商高,我只能敬谢不敏了,其实我只是出发的早而已。十几年来,我合作过的大牛程序员有小县城毕业的初中生、高中生,北清复交的毕业生, MIT,普林斯顿,斯坦福,伯克利的计算机博士,他们都有自己的特点,都有让我敬佩的地方。读好大学非常重要,但自己能学习并且会学习更重要,我写本文来分享我的经历,希望年轻的喜欢编程的朋友们,能够坚持下来。
我读了计算机的本科,硕士和博士,但我的编程是99%自学的。我大概12岁左右开始自学编程,并不需要什么其他知识,头两年也没有老师,书都很少。我都很熟练能写basic, c和pascal了,才在英语课本里学到return这个单词的意思,原来我一直不知道这是个单词(我小时候那会儿初一才开始学英语)。当时真的很难,每个指令都是一个一个字母死记硬背的。小时候信息学联赛也不是正经上课,基本都是赛后总结一下,大家分享一下题目咋做的。所以我的算法和数据结构也是自学的。我还记得少年宫的老师面试我,让我不用递归写一个树的遍历,因为我自学了半本数据结构,前天晚上刚好看到栈,就做出来了(其实也没完全做好)。很多时候这都是命运啊,我要是看的稍微慢点,就没戏了。
我本科时候基本没去上过编程的课程,本来就没几门,我也都逃了,当时年少轻狂,觉得太浅,而且C语言老师的宁波口音我实在听不明白(都是借口,我不爱上课)。博士期间我上过一两门编程的课,重温一下c++的感觉,而且其他课拿A还是要花点力气的。我从来没上过java的课,但十几年的职业生涯,我基本是已用java为主的。有朋友问,优秀的编程思想哪里来?老师能教吗?其实极少有老师能教你这个,我觉得99%还得从你自己多探索、多吃亏、多看别人怎么做中自己总结。以前有我带过的程序员跳槽以后,就照搬我做过的架构去其他公司,毕竟应用场景不同了,吃了好多亏,但几年下来,人家不断探索和总结,现在成为一个公司的技术负责人,解决各种问题都是妥妥的。
这也是我为什么在很多回答里都鼓励非科班的兄弟们自学编程,因为我觉得没有差别,你并不需要先学好数学和英语,一样可以写代码,一样可以当好程序员。计算机的数学很多是非常直观的,比如说n的平方和n的立方谁增长的快,快多少?你不学数学分析也能有大致的认识,不影响你学算法,当然建议你能从数学的角度思考,把这个问题真正的学明白。算法和数据结构里用到的数学知识是很少的,多项式和对数就涵盖99%了。至于英语,就算你看原版书,也不需要认识多少单词,一半都是代码和图。再不济你用谷歌翻译撸一撸,也就看懂了。编程和唱歌跳舞一样,如果你能找到个大师亲自指点你,那当然是最好不过,不过这种机会是可遇而不可求,就算在大学里,即使你是个博士生,你和导师交流也是很有限的,本科生更是一年和导师也说不了几句话。自学才是获得知识的最主要途径。在美国,一个博士往往要修50几个学分,我们学校还强迫每个方向的课程都要有,软件,硬件,数学,网络等等,这听起来好像很多,但和普通博士生自己看的论文、自学的知识比起来,那50几个学分真的不算什么。
我始终觉得高等教育不是知识和技巧的传授,大学不是技校,计算机专业和教你开挖掘机不一样。大学的教育主要是帮助你进行人格、性格和思维的塑造,比如说数学分析能让你更加理性坚韧而又不失变通,离散数学可以让你感受结绳记事以后,人类思维的演变。我一直非常感谢我的母校复旦大学,本科四年,她没有把我像工具或者螺丝钉一样培养。而我后来在美国的博士阶段教育,又让我更加懂得如何向未知领域探索,如何解决前进中难题。我觉得大学里的最终产品是大师,当然不可能出来的各个毕业生都立马成为大师,可能是在几十年后在大学里或者大学外成为大师,也有可能仅仅是出产一个个内心更加宁静和强大的懂得独立思考人,不会没事出来问自学和科班的差别在哪里,我的大学是不是白读了之类的问题。我觉得大学教育既不能工具化,也不能精英化,而是应该更加的个性化,每个人都应该有自己更独立的灵魂。
我比较自豪的是我多年来在技术上并没有走太多的弯路,我也比较少会有技术和人生选择上的迷茫,我想这也是科班教育给我带来的一个显著收益吧。
哇,这是我最火的一个回答了,感谢大家。谢谢大家夸我智商高,智商高到一定程度,学什么都会快,我见过这样的人,但我显然没高到那个水平。武功再高,也怕菜刀,我自学也是很苦难的,到现在也没把算法导论看完。趁机说一下感觉自学很困难怎么办。我老婆推荐我看过一本书,关于大脑脑回路(brain circuits好像是这个词吧)铺设的。人的大脑不是一成不变的,你可以通过训练让大脑里的回路铺设更适于干某一种事,我想这就是为什么有人说什么事做10万小时,你就是专家了,估计那时候你脑子都改变了,学类似的东西就会很快。这是很笨但是很稳妥的办法,只要花时间,总归能学得会。就是下面这本书。
还有一个技巧就是虚极静笃,很多时候你不接受一个概念,是因为你自己心里已有的观念太强了,让你不自觉地产生了排斥。比如说我学ruby的时候就很痛苦,因为我以前一直学习的都是静态类型的语言,很多概念在心里太强了,再来看ruby, 就什么都觉得奇怪,很多的怀疑让我静不下心。蹉跎了很久之后,我就开始尝试放下已有的知识,就好像是学习我的第一门语言,用ruby的哲学去学习ruby,效果就特别好了。
还有就是编程需不需要数学?我个人很喜欢数学,但我认为数学只是工具,而且是没那么常用的工具。不管怎样,作为一个程序员,学好数学肯定不是最终目的,数学家不等于好程序员。我们程序员写好代码才是目的。写好代码需要玩转数据结构和算法,算法需要使用一些很直观的数学,我自己的体会是不懂数学也能学算法,你可以在学习算法的过程中不经意间把数学也学了。但大学里开那么多数学课也不是白费的,这是思维的锻炼,你数学学的好能让你理解算法更快,而且从数学的角度来看算法,能让你看的更透彻。
关于编程等不等于计算机科学,我觉得是等于的。程序=数据结构+算法,我实在想不出计算机科学的什么分支,包括计算机原理,操作系统,编译原理,计算机网络,这些都没有什么逃出数据结构和算法的范畴,即便是学体系结构这样看似是硬件的课,其实也是为了让你更好的理解计算机系统,让你编写一些模拟计算机核心的算法,帮你以后写出更高效率和更健壮的程序。而且我们在计算机科学中所学的一切,都会最终落实到程序上。 自学编程,就是自学计算机科学,没有什么高低贵贱之分。或许有例外,请大家在评论中教我,谢谢!
还有些朋友抱怨自学很难,感觉很难入门,就算自己学了也觉得低科班的一头。其实你就算到大学的课堂上,你现在自学遇到的困难也一样会在大学课堂上遇到。讲台上的教授其实也不会给你什么直接的指导,大学不是高中,教授不会手把手的教。教授更多的作用是给你种个种子--让你很多年后成为大师的种子。

