如何打好编程基础
如何打好编程基础
这篇⽂章是写给那些真⼼想学编程的⼈看的——那些憋着⼀股狠劲⼉,⼀定要做出个什么真东西,不学好不罢休的⼈;⽽不是那些「听说编程好玩」的⼈,在我看来,这种⼈永远都⼊不了编程的门,更别提做出个像样的东西来了。
⼼态调整
确定⽬标
在你学习编程之前思考⼀下你的⽬标,当你有最终⽬标时道路会更加的清晰。
那么,你想要写什么?⽹站?游戏?iOS或者Android应⽤?或是你是想⾃动化完成⼀些乏味的任务让你有更多的时间看窗外的风景?也许你只是想更具有就业竞争⼒个好⼯作。所有的这些都是有价值的⽬标,这些⽬标都是你编程学习推动⼒的⼀部分,没有推动⼒的⼈,是⽆法在略显枯燥的漫长学习之旅中⾛远。
不要浮躁
不管是在线下还是线上的书店,满⽬都是《21天学通Java》这种速成书⽬,它们都承诺在很短⼀段时间内就让你能够学会相关技术。Matthias Felleisen在他的著作 How to Design Programs, Second Edition⼀书中明确指出了这种「速成」的趋势并予以了以上的讽刺。所谓的「捷径」或者说「银弹」是不存在的,智者说过,精通某个东西需要10年或10000个⼩时,也就是汉语中的「⼗年磨⼀剑」,所以不⽤着急,功不唐捐。
培养兴趣
沉醉于编程,编程更是为了兴趣。兴趣是推动⼒的不竭源泉,保持这种充满兴趣的感觉,以便于你能将其投⼊到你的10年/10000⼩时的编程时间中。编程很有趣,那是探索的喜悦。那是创造的喜悦。看到⾃⼰亲⼿完成的作品显⽰在屏幕上很有趣。有⼈为你的代码⽽惊叹很有趣。有⼈在公共场合称赞你的产品、邻居使⽤你的产品、以及在媒体上讨论你的产品很有趣。编程应该⼗分有趣,若并⾮如此,
就出导致编程⽆趣的问题,然后解决之。
可以将学习编程类⽐为学习厨艺:你为了烧得⼀⼿好菜买了⼀些关于菜谱的书,如果你只是想为家⼈做菜,这会是⼀个不错的主意,你重复菜谱上的步骤也能做出不赖的菜肴,但是如果你有更⼤的野⼼,真的想在朋友⾯前露⼀⼿,做⼀些独⼀⽆⼆的美味佳肴,甚⾄成为「⼤厨」,你必须理解这些菜谱背后⼤师的想法,理解其中的理论,⽽不仅仅是⼀味地实践。但是如果你每天唯⼀的⼯作就是阅读那些厚重的理论书籍,因为缺乏实践,你只会成为⼀个糟糕的厨⼦,甚⾄永远成为不了厨⼦,因为看了⼏天书后你就因为枯燥放弃了厨艺的学习。总之,编程是连接理论与实践的纽带,是计算机科学与计算机应⽤技术相交融的领域。正确的编程学习⽅法应该是:通过⾃顶⽽下的探索与项⽬实践,获得编程直觉与推动⼒;从⾃底向上的打基础过程中,获得最重要的通⽤⽅法并巩固编程思想的理解。作为初学者,应以后者为主,前者为辅。
启蒙
「学编程应该学哪门语⾔?」这经常是初学者问的第⼀个问题,但这是⼀个错误的问题,你最先考虑的问题应该是「哪些东西构成了编程学习的基础」?
编程知识的⾦字塔底部有三个关键的部分:
算法思想:例如怎样出⼀组数中最⼤的那个数?⾸先你得有⼀个 maxSoFar 变量,之后对于每个数…
语法:我怎样⽤某种编程语⾔表达这些算法,让计算机能够理解。
系统基础:为什么 while(1) 时线程永远⽆法结束?为什么 int *foo() { int x = 0; return &x; } 是不可⾏的?
启蒙阶段的初学者若选择C语⾔作为第⼀门语⾔会很困难并且枯燥,这是因为他们被迫要同时学习这三个部分,在能做出东西前要花费很多时间。android编程入门指南 pdf
因此,为了尽量最⼩化「语法」与「系统基础」这两部分,建议使⽤ Python 作为学习的第⼀门语⾔,虽然Python对初学者很友好,但这并不意味着它只是⼀个「玩具」,在⼤型项⽬中你也能见到它强⼤⽽灵活的⾝影。熟悉Python后,学习C语⾔是便是⼀个不错的选择了:学习C语⾔会帮助你以靠近底层的视⾓思考问题,并且在后期帮助你理解操作系统层级的⼀些原理,如果你只想成为⼀个普通(平庸)的开发者你可以不学习它。
⼊门结束启蒙阶段后,初学者积累了⼀定的代码量,对编程也有了⼀定的了解。这时你可能想去学⼀门具体的技术,诸如Web开
发,Android开发,iOS开发什么的,你可以去尝试做⼀些尽可能简单的东西,给⾃⼰⼀些正反馈,补充⾃⼰的推动⼒。但记住别深⼊,这些技术有⽆数的细节,将来会有时间去学习;同样的,这时候也别过于深⼊特定的框架和语⾔,现在是学习计算机科学通⽤基础知识的时候,不要试图去抄近路直接学你现在想学的东西,这是注定会失败的。
那么⼊门阶段具体该做些什么呢?这时候你需要做的是反思⾃⼰曾经写过的程序,去思考程序为什么(Why)要这样设计?,思考怎样(How)写出更好的程序?试图去探寻理解编程的本质:利⽤计算机解决问题。
设想 :
X = ⽤于思考解决⽅案的时间,即「解决问题」 部分
Y = ⽤于实现代码的时间,即「利⽤计算机」部分」
编程能⼒ = F(X, Y) (X>Y)
要想提⾼编程能⼒,就得优化 X,Y 与函数 F(X, Y),很少有书的内容能同时着重集中在这三点上,但有⼀本书做到了——Structure and Interpretation of Computer Programs(SICP)《计算机程序的构造和解释》,它为你指明了这三个变量的⽅向。在阅读SICP之前,你也许能通过调⽤⼏个函数解决⼀个简
单问题。但阅读完SICP之后,你会学会如何将问题抽象并且分解,从⽽处理更复杂更庞⼤的问题,这是编程能⼒巨⼤的飞跃,这会在本质上改变你思考问题以及⽤代码解决问题的⽅式。此外,SICP的教学语⾔为 Scheme,可以让你初步了解函数式编程。更重要的是,他的语法⼗分简单,你可以很快学会它,从⽽把更多的时间⽤于学习书中的编程思想以及复杂问题的解决之道上。
计算机系统基础
有了之前程序设计的基础后,想更加深⼊地把握计算机科学的脉络,不妨看看这本书:《深⼊理解计算机系统》 Computer Systems A Programmer’s Perspective 。这⾥点名批评这本书的中译名,其实根本谈不上什么深⼊啦,这本书只是 CMU的「计算机系统导论」的教材⽽已。CMU的计算机科学专业相对较偏软件,该书就是从⼀个程序员的视⾓观察计算机系统,以「程序在计算机中如何执⾏」为主线,全⾯阐述计算机系统内部实现的诸多细节。
如果你看书觉得有些枯燥的话,可以跟⼀门 Coursera 上的 MOOC: The Hardware/Software Interface,这门课的内容是 CSAPP 的⼀个⼦集,但是最经典的实验部分都移植过来了。同时,可以看看 The C Programming Language,回顾⼀下C语⾔的知识。
完成这本书后,你会具备坚实的系统基础,也具有了学习操作系统,编译器,计算机⽹络等内容的先决条件。当学习更⾼级的系统内容时,翻阅⼀下此书的相应章节,同时编程实现其中的例⼦,⼀定会
对书本上的理论具有更加感性的认识,真正做到经⼿的代码,从上层设计到底层实现都了然于胸,并能在脑中回放数据在⽹络->内存->缓存->CPU的流向。
此外,也是时候去接触 UNIX 哲学了: KISS - Keep it Simple, Stupid. 在实践中,这意味着你要开始熟悉命令⾏界⾯,配置⽂件。并且在开发中逐渐脱离之前使⽤的IDE,学会使⽤Vim或Emacs(或者最好两者都去尝试)。
数据结构与算法基础
如今,很多⼈认为编程(特别是做web开发)的主要部分就是使⽤别⼈的代码,能够⽤清晰简明的⽅式表达⾃⼰的想法⽐掌握硬核的数学与算法技巧重要的多,数据结构排序函数⼆分搜索这不都内置了吗?⼯作中永远⽤不到,学算法有啥⽤啊?这种扛着实⽤主义⼤旗的「码农」思想当然不可取。没有扎实的理论背景,遭遇瓶颈是迟早的事。
数据结构和算法是配套的,⼊门阶段你应该掌握的主要内容应该是:这个问题⽤什么算法和数据结构能更快解决。这就要求你对常见的数据结构和算法了熟于⼼,你不⼀定要敲代码,⽤纸⼿写流程是更快的⽅式。对你不懂的数据结构和算法,你要去搜它主要拿来⼲嘛的,使⽤场景是什么。
供你参考的学习资源:
《算法导论 》:有⼈说别把这本书当⼊门书,这本书本来就不是⼊门书嘛,虽说书名是 Introduction to Algorithms,这只不过是因为作者不想把这本书与其他书搞重名罢了。当然,也不是没办法拿此书⼊门,读第⼀遍的时候跳过习题和证明就⾏了嘛,如果还觉得⼼虚先看看这本《数据结构与算法分析》
Coursera Algorithms: Design and Analysis [Part 1] & [Part 2]: Stanford 开的算法课,不限定语⾔,两个部分跟下来算法基础基本就有了;英语没过关的:⿇省理⼯学院公开课:算法导论
⼊门阶段
还要注意培养使⽤常规算法解决⼩规模问题的能⼒,结合前⽂的SICP部分可以读读这⼏本书:《编程珠玑 》,《程序设计实践 》编程语⾔基础
此外还要知道,学习第n门编程语⾔的难度是第(n-1)门的⼀半,所以尽量去尝试不同的编程语⾔与编程范式,若你跟寻了前⽂的指引,你已经接触了:「⼲净」的脚本语⾔ Python, 传统的命令式语⾔ C, 以及浪漫的函数式语⾔ Scheme/Racket 三个好朋友。但仅仅是接触远远不够,你还需要不断继续加深与他们的友谊,并尝试结交新朋友,美⽽雅的 Ruby ⼩姑娘,Hindley-Milner 语⾔家族的掌中宝 Haskell 都是不错的选择。但有这么⼀位你躲不开的,必须得认识的⼤伙伴 — C++,你得做好与他深交的准备:
如果你能设法完成以上的所有任务,恭喜你,你已经真正实现了编程⼊门。这意味着你在之后更深⼊的学习中,不会畏惧那些学习新语⾔的任务,不会畏惧那些「复杂」的API,更不会畏惧学习具体的技术,甚⾄感觉很容易。当然,为了掌握这些东西你依旧需要⼤量的练习,腰还是会疼,⾛路还是会费劲,⼀⼝⽓也上不了5楼。但我能保证你会在思想上有巨⼤的转变,获得极⼤的⾃信,看⽼师同学和 CSDN 的眼光会变得⾮常微妙,虽然只是完成了编程⼊门,但已经成为了程序员精神世界的⾼富帅。不,我说错了,即使是⾼富帅也不会有强⼒精神⼒,他也会怀疑⾃⼰,觉得⾃⼰没钱就什么都不是了。但总之,你遵循指南好好看书,那就会体验「会当凌绝顶」的感觉。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。