如何自学编程
启蒙
「学编程应该学哪门语言?」这经常是初学者问的第一个问题,但这是一个错
误的问题,你最先考虑的问题应该是「哪些东西构成了编程学习的基础」?
编程知识的金字塔底部有三个关键的部分:
1.•算法思想:例如怎样找出一组数中最大的那个数?首先你得有一个
maxSoFar变量,之后对于每个数…
2.•语法:我怎样用某种编程语言表达这些算法,让计算机能够理解。
3.•系统基础:为什么while(1)时线程永远无法结束?为什么int*foo()
{intx=0;return&x;}是不可行的?
启蒙阶段的初学者若选择C语言作为第一门语言会很困难并且枯燥,这是因为
他们被迫要同时学习这三个部分,在能做出东西前要花费很多时间。
因此,为了尽量最小化「语法」与「系统基础」这两部分,建议使用Python作
为学习的第一门语言,虽然Python对初学者很友好,但这并不意味着它只是
一个「玩具」,在大型项目中你也能见到它强大而灵活的身影。熟悉Python后,
学习C语言是便是一个不错的选择了:学习C语言会帮助你以靠近底层的视
角思考问题,并且在后期帮助你理解操作系统层级的一些原理。
下面给出了一个可供参考的启蒙阶段导引,完成后你会在头脑中构建起一个整
体框架,帮助你进行自顶向下的探索。下面的材料没有先后顺序,如果卡壳的
话可以考虑换另一份材料。
1.•完成MIT6.00.1x(麻省理工:计算机科学和Python编程导论)。
虽然该课程的教学语言为Python,但作为一门优秀的导论课,它强调学
习计算机科学领域里的重要概念和范式,而不仅仅是教你特定的语言。
如果你不是科班生,这能让你在自学时开阔眼界;课程内容:计算概念,
Python编程语言,一些简单的数据结构与算法,测试与调试。
2.•完成HarvardCS50x(哈佛大学:计算机科学)。同样是导论课,但
这门课与MIT的导论课互补。教学语言涉及C,PHP,JavaScript+SQL,
HTML+CSS,内容的广度与深度十分合理,还能够了解到最新的一些科
技成果,可以很好激发学习计算机的兴趣。支线任务:阅读《编码》
3.•完成Python教程。
入门
结束启蒙阶段后,初学者积累了一定的代码量,对编程也有了一定的了解。这
时你可能想去学一门具体的技术,诸如Web开发,Android开发,iOS开
发什么的,你可以去尝试做一些尽可能简单的东西,给自己一些正反馈,补充
自己的推动力。但记住别深入,这些技术有无数的细节,将来会有时间去学习;
同样的,这时候也别过于深入特定的框架和语言,现在是学习计算机科学通用
基础知识的时候,不要试图去抄近路直接学你现在想学的东西,这是注定会失
败的。
那么入门阶段具体该做些什么呢?这时候你需要做的是反思自己曾经写过的程
序,去思考程序为什么(Why)要这样设计?,思考怎样(How)写出更好的程
序?试图去探寻理解编程的本质:利用计算机解决问题。
设想:
X=用于思考解决方案的时间,即「解决问题」部分
Y=用于实现代码的时间,即「利用计算机」部分」
编程能力=F(X,Y)(X>Y)
要想提高编程能力,就得优化X,Y与函数F(X,Y),很少有书的内容能同时
着重集中在这三点上,但有一本书做到了——StructureandInterpretationof
ComputerPrograms(SICP)《计算机程序的构造和解释》,它为你指明了这三
个变量的方向。在阅读SICP之前,你也许能通过调用几个函数解决一个简单
问题。但阅读完SICP之后,你会学会如何将问题抽象并且分解,从而处理更
复杂更庞大的问题,这是编程能力巨大的飞跃,这会在本质上改变你思考问题
以及用代码解决问题的方式。此外,SICP的教学语言为Scheme,可以让你
初步了解函数式编程。更重要的是,他的语法十分简单,你可以很快学会它,
从而把更多的时间用于学习书中的编程思想以及复杂问题的解决之道上。
PeterNorvig曾经写过一篇非常精彩的SICP书评,其中有这样一段:
Touananalogy,ifSICPwereaboutautomobiles,itwouldbeforthe
personwhowantstoknowhowcarswork,howtheyarebuilt,andhow
onemightdesignfuel-efficient,safe,reliablevehiclesforthe21st
plewhohateSICParetheoneswhojustwanttoknow
howtodrivetheircaronthehighway,justlikeeveryoneel.
如果你是文中的前者,阅读SICP将成为你衔接启蒙与入门阶段的关键点
虽然SICP是一本「入门书」,但对于初学者还是有一定的难度,以下是一些十
分有用的辅助资源:
1.•UdacityCS212DesignofComputerProgram:由上文提到的
Google研究主管PeterNorvig主讲,教学语言为Python,内容有一
定难度。
2.•HowtoDesignPrograms,SecondEdition:HtDP的起点比SICP
低,书中的内容循循善诱,对初学者很友好,如果觉得完成SICP过于困
难,可以考虑先读一读HtDP。
3.•UCBerkeleySICP授课视频以及SICP的两位作者给
Hewlett-Packard公司员工培训时的录像(中文化项目)
4.•ComposingPrograms:一个继承了SICP思想但使用Python作为教
学语言的编程导论(其中包含了一些小项目)
5.•SICP解题集:对于书后的习题,作为初学者应尽力并量力完成。
完成了这部分学习后,你会逐步建立起一个自己的程序设计模型,你的脑子里
不再是一团乱麻,你会意识到记住库和语法并不会教你如何解决编程问题,接
下来要学些什么,在你心里也会明朗了很多。这时候才是真正开始进行项目实
践,补充推动力的好时机。关于项目实践:对于入门阶段的初学者,参与开源
项目还为时过早,这时候应该开始一些简单的项目,诸如搭建一个网站并维护
它,或是编写一个小游戏再不断进行扩展,如果你自己的想法不明确,推荐你
关注炼瓜研究所,或者从MegaProjectList中选取自己喜欢的项目。
如果你觉得SICP就是搞不定,也不要强迫自己,先跳过,继续走常规路线:
开始读TheElementsofComputingSystems吧,它会教会你从最基本的
Nand门开始构建计算机,直到俄罗斯方块在你的计算机上顺利运行。具体内
容不多说了,这本书会贯穿你的整个编程入门阶段,你入门阶段的目标就是坚
持完成这本书的所有项目(包括一个最简的编译器与操作系统)。
为了完全搞定这本书,为了继续打好根基。为了将来的厚积薄发,在下面这几
个方面你还要做足功课(注意:下面的内容没有绝对意义上的先后顺序):
计算机系统基础
有了之前程序设计的基础后,想更加深入地把握计算机科学的脉络,不妨看看
这本书:ComputerSystems:AProgrammer'sPerspective,3/E《深入理解
计算机系统》。这里点名批评这本书的中译名,其实根本谈不上什么深入啦,
这本书只是CMU的「计算机系统导论」的教材而已。CMU的计算机科学专业
相对较偏软件,该书就是从一个程序员的视角观察计算机系统,以「程序在计
算机中如何执行」为主线,全面阐述计算机系统内部实现的诸多细节。
如果你看书觉得有些枯燥的话,可以跟一门Courra上的MOOC:The
Hardware/SoftwareInterface,这门课的内容是CSAPP的一个子集,但是最
经典的实验部分都移植过来了。同时,可以看看TheCProgramming
Language,回顾一下C语言的知识。
完成这本书后,你会具备坚实的系统基础,也具有了学习操作系统,编译器,
计算机网络等内容的先决条件。当学习更高级的系统内容时,翻阅一下此书的
相应章节,同时编程实现其中的例子,一定会对书本上的理论具有更加感性的
认识,真正做到经手的代码,从上层设计到底层实现都了然于胸,并能在脑中
回放数据在网络->内存->缓存->CPU的流向。
数据结构与算法基础
如今,很多人认为编程(特别是做web开发)的主要部分就是使用别人的代码,
能够用清晰简明的方式表达自己的想法比掌握硬核的数学与算法技巧重要的
多,数据结构排序函数二分搜索这不都内置了吗?工作中永远用不到,学算法
有啥用啊?这种扛着实用主义大旗的「码农」思想当然不可取。没有扎实的理
论背景,遭遇瓶颈是迟早的事。
数据结构和算法是配套的,入门阶段你应该掌握的主要内容应该是:这个问题
用什么算法和数据结构能更快解决。这就要求你对常见的数据结构和算法了熟
于心,你不一定要敲代码,用纸手写流程是更快的方式。对你不懂的数据结构
和算法,你要去搜它主要拿来干嘛的,使用场景是什么。
供你参考的学习资源:
1.•《算法导论》:有人说别把这本书当入门书,这本书本来就不是入门书
嘛,虽说书名是IntroductiontoAlgorithms,这只不过是因为作者不
想把这本书与其他书搞重名罢了。当然,也不是没办法拿此书入门,读
第一遍的时候跳过习题和证明就行了嘛,如果还觉得心虚先看看这本《数
据结构与算法分析》
2.•Algorithms:DesignandAnalysis[Part1]&[Part2]:Stanford开
的算法课,不限定语言,两个部分跟下来算法基础基本就有了;如果英
文不过关:麻省理工学院:算法导论
3.•入门阶段还要注意培养使用常规算法解决小规模问题的能力,结合前文
的SICP部分可以读读这几本书:《编程珠玑》,《程序设计实践》
编程语言基础
learningveraldifferentapproaches,youcanhelpbroadenyour
onally,learningmany
languagesisfareasiernow,thankstothewealthoffreelyavailable
softwareontheInternet
-ThePragmaticProgrammer
此外还要知道,学习第n门编程语言的难度是第(n-1)门的一半,所以尽量去
尝试不同的编程语言与编程范式,若你跟寻了前文的指引,你已经接触了:「干
净」的脚本语言Python,传统的命令式语言C,以及浪漫的函数式语言
Scheme三个好朋友。但仅仅是接触远远不够,你还需要不断继续加深与他们
的友谊,并尝试结交新朋友,美而雅的Ruby小姑娘,Hindley-Milner语言家
族的掌中宝Haskell都是不错的选择。至于C++,喜欢的话学学也无妨。
现实是残酷的,在软件工程领域仍旧充斥着一些狂热者,他们只掌握着一种编
程语言,也只想掌握一种语言,他们认为自己掌握的这门语言是最好的,其他
异端都是傻X。这种人也不是无药可救,有一种很简单的治疗方法:让他们写一
个编译器。要想真正理解编程语言,你必须亲自实现一个。现在是入门阶段,
不要求你去上一门编译器课程,但要求你能至少实现一个简单的解释器。
供你参考的学习资源:
1.•《程序设计语言-实践之路》:CMU编程语言原理的教材,程序语言入
门书,现在就可以看,会极大扩展你的眼界,拉开你与普通人的差距。
2.•ProgrammingLanguages:课堂上你能接触到极端FP(函数式)的
SML,中性偏FP的Racket,以及极端OOP(面向对象)的Ruby,
并学会问题的FP分解vsOOP分解、ML的模式匹配、Lisp宏、不
变性与可变性、解释器的实现原理等,让你在将来学习新语言时更加轻
松并写出更好的程序。
3.•UdacityCS262ProgrammingLanguage:热热身,教你写一个简单
的浏览器——其实就是一个JavaScript和HTML的解释器,完成后的
成品还是很有趣的;接下来,试着完成一个之前在SICP部分提到过的项
目:用Python写一个SchemeInterpreter
其他
编程入门阶段比较容易忽视的几点:
1.1学会提问:学习中肯定会遇到问题,应该学会正确的使用搜索引擎。
当单靠检索无法解决问题时,去StackOverflow或知乎提问,提问前
读读这篇文章:能有效解决问题的提问方法。
2.2不要做一匹独狼:尝试在CoCode与他人交流想法。尝试搭建一个像
这样简单的个人网站。试着在博客上记录自己的想法。订阅自己喜欢的
编程类博客,推荐几个供你参考:JoelonSoftware,PeterNorvig,
CodingHorror
3.3学好英语:英语是你获取高质量学习资源的主要工具,但在入门阶段,
所看的那些翻译书信息损耗也没那么严重,以你自己情况权衡吧。
小结
以上的内容你不应该感到惧怕,编程的入门不是几个星期就能完成的小项目。
期间你还会遇到无数的困难,当你碰壁时试着尝试「费曼」技巧:将难点分而
化之,切成小知识块,再逐个对付,之后通过向别人清楚地解说来检验自己是
否真的理解。当然,依旧会有你解决不了的问题,这时候不要强迫自己——很
多时候当你之后回过头来再看这个问题时,一切豁然开朗。
此外不要局限于上文提到的那些材料,还有一些值得在入门阶段以及将来的提
升阶段反复阅读的书籍。这里不得不提到在StackOverflow上票选得出的程
序员必读书单中,排在前两位的两本书:
CodeComplete:不管是对于经验丰富的程序员还是对于那些没有受过太多的
正规训练的新手程序员,此书都能用来填补自己的知识缺陷。对于入门阶段的
新手们,可以重点看看涉及变量名,测试,个人性格的章节。
ThePragmaticProgrammer:有人称这本书为代码小全:从DRY到KISS,
从做人到做程序员均有涉及。
这本书的作者Dave,在书中开篇留了这样一段话:
You’n’tweddedtoanyparticular
technology,butyouhaveabroadenoughbackgroundinthescience,
andyourexperiencewithpracticalprojectsallowsyoutochoogood
andpracticecombinetomake
ustyourapproachtosuitthecurrentcircumstances
dothiscontinuouslyastheworkprogress.
PragmaticProgrammersgetthejobdone,anddoitwell.
这段话以及他创立的ThePragmaticBookshelf一直以来都积极地影响着我,
因此这篇指南我也尽量贯彻了这个思想,引导并希望你们成为一名真正的
PragmaticProgrammer
本文发布于:2022-12-28 23:09:36,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/49593.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |