如何从零开始学习编程?
不要冲动
Badprogrammingiseasy。evendummiescanlearninit 21天。好的编程需要思考,但每个人都可以体验随之而来的极度满足感。
无论是线上还是线下,书店里都充斥着“21天学会Java”这样的速成书籍,承诺能让你在短时间内学会相关技术。MatthiasFelleisen在他的著作《如何设计程序》第二版中明确指出了这种“崩溃”的趋势,并做出了上述讽刺。
所谓的“捷径”或“银弹”是不存在的。一位智者说,掌握一件事需要65,438+00年或者65,438+00,000个小时,也就是中国的“十年磨一剑”,所以不要担心,你不会做出贡献的。
培养兴趣
最优秀的程序员不是因为他们期望togetpaidorgetadulationbythepublic,而是因为它是funtoprogram。
_LinusTorvalds
沉迷编程,编程是为了兴趣。兴趣是不竭的动力源泉。让这种感觉充满兴趣,这样你就可以把它放进你10 /10000小时的编程时间里。编程很有趣,那就是探索的乐趣。那是创造的快乐。看到自己的作品显示在屏幕上很有意思。有趣的是,有人对你的代码感到惊讶。有人在公开场合夸你的产品,邻居用你的产品,在媒体上讨论你的产品,这很有意思。编程应该是非常有趣的,如果不是,找出让编程变得无趣的问题,然后解决它。
这里有两个适合新手的大坑:
如果初学者只接触到预先构建好的“引擎和组件”(没有了解和思考它们的构建原理),这将严重限制他们以后构建这些东西的能力,在诊断和解决问题时无从下手。
第二个坑没有第一个坑明显:幼稚的“整体论”方法有时候看起来很有效,有些隐蔽性和误导性,但是一两年后(可能没那么久),当你在学习路上走远了,再试图“补基础”就会有巨大的心理障碍。你要抛弃之前狭隘的观念,耐心的往前走,这比你刚入门的时候学习基础知识要难得多。
但也不能过犹不及,掉进还原论的坑里,刚入门就想搞个宏大的理论。这不仅会导致一切成为空谈的危险,还会让你失去动力。这种情况经常发生在计算机专业的学生身上。
为了更好的理解,学习编程可以比喻为学习烹饪:你为了做好烹饪,买了一些关于菜谱的书。如果你只是想为家人做饭,这将是一个好主意,重复食谱上的步骤,你就可以做出好菜。但如果你有更大的野心,真的想在朋友面前炫耀,做一些独特的美食,甚至成为一名“厨师”,你就必须了解这些食谱背后的大师们的想法。但如果你每天唯一的工作就是看那些沉重的理论书,因为缺乏实践,你只会成为一个糟糕的厨师,甚至永远不会成为一个厨师,因为看了几天书,你就会因为无聊而放弃学习烹饪。
总之,编程是理论和实践的纽带,是计算机科学和计算机应用技术交融的领域。正确的编程学习方法应该是:通过自上而下的探索和项目实践,获得编程直觉和驱动力;在自下而上打基础的过程中,获得最重要的通用方法,巩固对编程思路的理解。
作为初学者,应以后者为主,前者为辅。
启发
“我应该学习什么语言来编程?这往往是新手问的第一个问题,但却是一个错误的问题。你的第一个问题应该是“什么构成了编程学习的基础”?
编程知识金字塔的底部有三个关键部分:
算法思路:比如如何求一组中最大的数?首先你必须有一个maxSoFar变量,然后对于每个数字,
语法:如何用编程语言表达这些算法,让计算机能够理解?
系统基础:为什么线程永远不能结束while(1)?为什么int * foo(){ intx = 0;返回& ampx;}不可行?
对于初级阶段的初学者来说,选择C作为第一语言会比较困难和枯燥,因为他们是被迫同时学习这三个部分的,要花很多时间才能做出点东西来。
所以为了尽量减少“语法”和“系统基础”这两个部分,建议把Python作为第一语言来学习。Python虽然对初学者比较友好,但并不意味着它只是一个“玩具”,在大型项目中也可以看到它强大灵活的身影。在你熟悉Python之后,学习C语言是一个不错的选择:学习C语言有助于你从接近底层的角度去思考,也有助于你以后理解操作系统层面的一些原理。如果你只是想做一个普通(平庸)的开发者,可以不学。
下面是启蒙阶段的参考指南。完成后,你会在脑海中构建一个整体框架,帮助你从上到下的探索。
完成Codecademy的Python部分。这只是热身部分,所以尽快完成,因为你永远都在浏览器里,你不会学到如何构建开发环境。你不知道从哪里开始,即使你只是想做一个小项目。
完成MIT6.00.1x(中国文化)(如果英语不过关,完成MIT公开课:计算机科学与编程导论)。大型开放式网络课程是学习编程的有效途径。虽然这门课程的教学语言是Python,但是作为一门优秀的入门课程,它强调的是学习计算机科学领域的重要概念和范式,而不仅仅是教你一门特定的语言。如果你不是普通学生,这可以在你自学的时候开阔你的视野;课程内容:计算概念,python编程语言,一些简单的数据结构和算法,测试和调试。附带任务:
完整的Python核心编程
完成HarvardCS50(如果没有通过英语:完成哈佛大学开放课程:计算机科学CS50)。也是入门课,但这门课是对麻省理工学院入门课的补充。教学语言涉及C,PHP,JavaScript+SQL,HTML+CSS。内容的广度和深度都很合理,还可以学习最新的科技成果,可以激发你学习计算机的兴趣。附带任务:
阅读编码的奥秘
完成《C语言程序设计》
[可选]如果你的目标是成为一名黑客:请阅读《黑客之光》。
PS:如果教育的对象还是孩子,以下资源会很有帮助:
5-8岁:海龟学院
8-12岁:PythonforKids
12岁以上:MITScratch或KhanAcademy。
初级课程
启蒙阶段结束后,初学者积累了一定的代码,对编程有了一定的了解。这时候你可能想学一门特定的技术,比如Web开发,Android开发,iOS开发等等。你可以试着做一些尽量简单的事情,给自己一些积极的反馈,补充自己的动力。但是切记不要深究,这些技术有无数的细节,以后有时间学习;同样,这个时候也不要太深入具体的框架和语言。现在是学习计算机科学一般基础知识的时候了。不要试图走捷径,现在就去学自己想学的东西,这样注定是失败的。
那么初期应该怎么做呢?这个时候你需要做的就是反思自己写的程序,思考程序为什么要这样设计。思考如何写出更好的程序?试图探索和理解编程的本质:利用计算机解决问题。
想象一下:
X=思考解决方案的时间,即“解决问题”部分。
Y=执行代码所用的时间,即“使用计算机”部分
编程能力= f (x,y)(x >;y)
想提高编程能力,就得优化X,Y和函数F(X,Y)。很少有书能同时关注这三点,但有一本书做到了——计算机程序的结构化解释(SICP),它向你展示了这三个变量的方向。在阅读SICP之前,你也许可以通过调用几个函数来解决一个简单的问题。但读完SICP,你会学会如何抽象和分解问题,从而处理更复杂和巨大的问题。这是编程能力的巨大飞跃,将从本质上改变你思考问题和用代码解决问题的方式。另外,SICP的教学语言是Scheme,可以让你初步了解函数式编程。更重要的是,他的语法非常简单,你可以很快学会,这样你就可以花更多的时间研究书中的编程思路,解决复杂的问题。
PeterNorvig曾经写过一篇精彩的SICP书评,其中有这样一段话:
打个比方,如果是关于汽车的,它将会为那些想知道汽车如何工作,如何制造,以及如何为21世纪设计省油、安全、可靠的汽车的人所用。那些想开车的人是想知道如何在高速公路上开车的人,就像其他人一样。
如果你是文章中的前者,阅读SICP将是你连接启蒙和入门阶段的关键点。
虽然《SICP》是一本“入门书”,但对初学者来说仍然很难。以下是一些非常有用的辅助资源:
Udacitycs212计算机程序的设计):主讲人是上面提到的Google的研究总监PeterNorvig。教学语言是Python,内容有些难。
如何设计程序,第二版:HtDP的起点比SICP低。书中的内容对初学者有说服力,也很友好。如果你觉得完成《SICP》太难,可以考虑先读HTDP。
UCBerkeleySICP教学视频和《SICP》两位作者培训惠普公司员工的视频(中国文化项目)。
ComposingPrograms:继承SICP思想但使用Python作为教学语言的编程入门(包括一些小项目)。
SICP解题集:作为初学者,你应该尽力完成书后的练习。
完成这部分学习后,你会逐渐建立起自己的编程模型,你的脑子也不会再乱糟糟了。你会意识到背库和语法并不会教会你如何解决编程问题,接下来学什么你心里会清楚很多。这是真正开始项目实践和补充驱动力的好时机。
关于项目实践:初学者参与开源项目为时尚早。这时候你应该开始做一些简单的项目,比如建一个网站并维护,或者写一个小游戏并扩展。如果你自己的想法不清楚,从MegaProjectList中选择一个项目。总之,这个时候一定要从你的项目实践中抽走第一滴血。
同时,别忘了继续打好基础。为了以后积累财富,你要在以下几个方面继续做功课(注意:以下内容没有绝对顺序):
计算机系统基础
有了之前编程的基础,如果想更深入地把握计算机科学的脉络,不妨看看这本书:《深入理解计算机系统》。在这里点名批评这本书的中译本,其实是远远不够深入的。这本书只是CMU介绍计算机系统的教科书。CMU的计算机科学专业相对偏爱软件。本书是以一个程序员的视角来观察计算机系统,以“如何在计算机中执行程序”为主线,全面阐述计算机系统内部实现的诸多细节。
如果你觉得阅读有点无聊,你可以关注一个大型开放式网络课程:Coursera上的硬件/软件界面。这门课的内容是CSAPP的子集,但是最经典的实验部分都被移植了。同时可以看看ProgrammingLanguage,复习一下C语言的知识。
学完这本书,你就有了扎实的系统基础,也有了学习操作系统、编译器、计算机网络等的前提条件。在学习更高级的系统内容时,通读本书的相应章节,并编程实现其中的实例,一定会对书中的理论有更感性的理解,这样处理的代码从上层设计到底层实现都能看得一清二楚,数据也能在网络上的大脑中回放-& gt;内存-& gt;缓存-& gt;CPU的流向。
另外,是时候接触一下UNIX哲学了:kiss-keeptsimple,笨蛋。实际上,这意味着您应该熟悉命令行界面和配置文件。并且在开发中逐渐摆脱之前使用的IDE,学会使用Vim或者Emacs(或者最好两者都试试)。
阅读UNIX编程环境
阅读UNIX编程的艺术
扔掉你的UN*X系统
数据结构和算法基础
现在很多人认为编程(尤其是web开发)的主要部分就是用别人的代码。能够清晰简洁地表达自己的想法,比掌握硬核的数学和算法技能重要得多。数据结构排序函数的二分搜索法不是内置的吗?你在工作中永远不会需要它。学习算法有什么用?这种打着实用主义旗号的“码农”思想当然不可取。没有扎实的理论背景,遇到瓶颈只是时间问题。
数据结构和算法匹配。初始阶段你要掌握的主要内容应该是:什么算法和数据结构能更快的解决这个问题?这需要你熟悉常用的数据结构和算法。你不必键入代码。用纸手写是一种更快的方法。对于不了解的数据结构和算法,要搜索它们主要用来做什么,使用场景是什么。
供您参考的学习资源:
IntroductiontoAlgorithms:有人说这本书不应该被视为入门书。这本书根本不是一本入门书。虽然它的标题是算法导论,但这只是因为作者不想将这本书与其他书籍重复。当然,这本书不是不能入门。第一遍看的时候跳过习题和证明就行了。如果你还觉得愧疚,先看看这个数据结构和算法分析。
课程算法:设计与分析。【Part 2】:斯坦福的算法课不局限于语言,两部分基本都会有算法基础;英语不及格:麻省理工学院开放课程:算法导论
在初始阶段,还要注意培养运用常规算法解决小规模问题的能力。我们可以结合上一篇文章《编程明珠与编程实践》的SICP部分来阅读这些书籍。
编程语言基础
不同的语言用不同的方式解决同样的问题。通过学习多种不同的方法,你可以拓宽你的思路。此外,学习learningmanylanguagesisfareasiernow,thankstothewealthoffreelyavailablesoftware on the internet
-预演节目
另外要知道,学习第n种编程语言的难度是学习(n-1)种编程语言的一半,所以要尽可能尝试不同的编程语言和编程范式。如果按照前面的指导,你已经接触到了三个好朋友:“干净”的脚本语言Python,传统的命令式语言C,浪漫的函数式语言Scheme/rack。但是仅仅接触是不够的。你需要继续加深和他们的友谊,努力结交新朋友。美丽优雅的红宝石少女,Hindley-Milner语族的掌中之宝Haskell都是不错的选择。但是有这么一个大伙伴,你躲都躲不开又不得不知道———c++,你得做好和他交朋友的准备:
简介:c++初级读本
[可选]高级:
高效使用:EffectiveC++
深度理解:《C++对象模型深度探索》;c++模板
研究反思:thedesignandevolutionofc++;+;为了C++的必要,阅读这本书可以让你选择是做一个守夜人还是一个守夜人。
现实是残酷的。软件工程领域还是有一些发烧友的。他们只掌握一门编程语言,只想掌握一门语言。他们认为自己掌握的语言是最好的,其他的异端都是愚蠢的。这种人不是没救了。有一个简单的处理方法:让他们写一个编译器。要真正理解一门编程语言,你必须自己实现一门。现在是入门阶段,不要求你上编译器课程,但要求你至少实现一个简单的解释器。
供您参考的学习资源:
“编程语言-实践之路”:一本关于CMU编程语言原理的教科书和一本关于编程语言的入门书。现在就可以读,会大大开阔你的眼界,拉大你和普通人的差距。
Coursera编程语言大型开放式网络课程:在课堂上,你可以接触到extreme FP(函数式)SML、neutral FP球拍、extreme OOP(面向对象)Ruby,学习问题的FP分解、vsOOP分解、ML模式匹配、Lisp宏、不变性和可变性、解释器的实现原理,这样你可以更轻松地学习一门新的语言,将来可以写出更好的程序。
Udacitycs 262编程语言:预热,教你写一个简单的浏览器——其实就是一个javascript和html解释器,成品还是很有意思的;接下来,尝试完成SICP部分提到的一个项目:用Python写一个SchemeInterpreter。
其他的
编程初期容易忽略的几点:
学好英语:英语是你获取优质学习资源的主要工具,但在起步阶段,你看的那些译著的信息流失并没有那么严重,要根据自己的情况权衡。另外,英语的重要性更多体现在交流上。LinusTorvalds是芬兰人,流利的英语一直是他招募开发人员为Linux工作的法宝。这是你的例子。
学会提问:学习中肯定会遇到问题。首先,你要学习搜索引擎的“高级搜索”。当问题单靠搜索无法解决时,去找StackOverflow或者知乎提问。在提问之前,请阅读这篇文章:你得到了什么?
不要做独狼:尝试建立一个简单的个人网站,而不只是一个孤独的About page,学习Markdown和LaTeX,尝试在博客上记录自己的想法,订阅自己喜欢的编程博客。推荐几个给你参考:Joel on Software,Peternorvig,Coding Horror。
总结
以上你不要怕,编程入门不是几个星期就能完成的小项目。在此期间,你会遇到无数的困难。当你碰壁的时候,试试费曼技巧:把难点分成小块知识,然后一个一个处理,然后通过向别人解释清楚来检验自己是否真正理解。当然,还是会有你解决不了的问题,所以这个时候不要勉强自己——很多时候当你以后回头看这个问题的时候,一切都会豁然开朗。
另外,不要把自己局限在上面提到的材料上。还有一些书值得在入门阶段和以后的提升阶段反复阅读。《程序员入门》就是这样一本程序员入门书籍,也是一本终极书籍。有人称这本书为代码百科全书:从干到吻,从做人到做程序员,这本书教会你一切,你需要的只是按照书中的指示去做。
附言
如果你能设法完成以上所有任务,那么恭喜你,你真的实现了编程入门。这意味着你将不会害怕学习一门新语言的任务,“复杂”的API,特定的技术,甚至在进一步的学习中感到轻松。当然,为了掌握这些东西,你还是需要大量的练习,腰还是会疼,走路还是会有困难,一口气上不了五楼。但我可以保证,你会在思想上有很大的转变,获得很大的自信,对老师、同学、csdn的眼光也会变得很微妙。虽然你刚刚完成编程入门,但你已经成为程序员精神世界的高富帅。不,我错了。即使是高富帅也不会有强大的精神力。他会怀疑自己,觉得自己没钱什么都不是。但简而言之,如果你按照指南并努力学习,你会体验到“一旦爬到山顶,就会看到”的感觉。
首先,如果你想学习编程,选择一门合适的计算机语言是非常重要的。如何选择尤为重要。这取决于你的爱好和每种语言的特点。例如,php是一种非常流行的适合web开发的计算机语言,易学易用。我个人推荐PHP语言。
Java可以用于web开发,也可以用于Android app开发。可能比php难学一点,但没问题。如果对java感兴趣,可以试试。
Python是目前比较流行的语言,适用于人工智能领域。另外,也很适合给网络爬虫写程序,看个人兴趣。
不建议用C,c++,C #,尤其是c#,已经是比较过时的语言了。就算学得好,也不适合找工作。C和c++不是很适合初学者学习,没必要考虑。还有一些小语种,就更没必要考虑了。所以,你应该从以上三种语言中选择一种你感兴趣的语言进行语言学习。
R&D与建筑环境
如果你选择了好的计算机语言,那么接下来就是设置R&D环境,因为只有设置了R&D环境,你才能进行后续的编程工作,比如PHP,然后从百度上搜索如何安装PHP环境,就可以找到一些简单的教程。新手可以一步一步的设置R&D环境,最多也就半天的时间。如果是java,需要先安装jdk,配置环境变量。网上也有相关教程。
选择视频和书籍来帮助你学习。既然是零基础学习,就要进行系统的学习,而不是到处从零基础的知识点开始学习。
代码实践
一章一章的跟着教程走,需要注意的是不能只看。那不行。你得自己用代码敲打每一章的知识点,运行一下试试效果。只有这样才能提高自己的动手能力,刚开始会觉得有点生疏,慢慢就会熟练起来,增加对编程的兴趣。这个过程需要反复练习,大量的代码练习。这个过程是五个步骤中最关键的阶段。自己练习代码很重要。编程中一些不懂的章节不要放过。可以在网上找一些相关的编程交流群,加入其中,也可以在网上咨询一些有经验的人。也许可以轻松帮你解决问题,对你的学习很有帮助,而且全程免费。
项目实战
如果基础课已经按部就班的练好了,那么你有了一些编程的基本功,那么你可以尝试做一些小项目,把你学到的知识串起来,进入项目的实战阶段,比如自己设计一个学生管理系统,并完成。如果不知道怎么设计,可以去网上搜一下。慢慢的,我有想法了。
我也在研究这方面。看了很多视频书,最推荐的是北京上学堂的学习资料,有Java.300集,Python400集。都是经典的基础入门课程,结合项目学习。他们很有意思,干货满满,免费。我推荐你去读它们,我相信它们能带你进入改变的世界。
从零开始学编程,第一关就是选择你想学的编程语言。面对种类繁多的编程语言,初学者往往无所适从,拿不定主意,不知道选择哪一种。