sicppython
1. 如何学习编程
最近有几个朋友私信问我如何学编程。我上知乎基本就是随便写点代码来着,这种误人子弟的问题我真的不敢乱说。也罢,找个问题随便谈谈吧,聊胜于无。千万不要当真。
我觉得SICP作为第一本编程书非常合适。SICP可以让我们从零开始建立起整个对于程序语言和程序语言如何被解释的粗浅认识。
知道什么是数据,数据结构如何用一个小小的cons组织起来,什么是过程,过程可以接受过程做参数并且返回过程,还有和解释器息息相关的囿变量、自由变量、环境,等等这些重要的概念。
然后我们需要接触机器相关的知识了。我建议学汇编。8086汇编就行了(硬核的话,或许可以学PDP-6汇编)。注意一开始从最基础的move,add,lea开始。
然后引入栈的push和pop指令,有了栈就可以很方便的复用过程了。栈一定要好好理解,这是过程在机器里面如何抽象的关键。然后引入call和ret两个语法糖。学会汇编写二叉树就够了。
因为用汇编写二叉树,一大堆dword,lea,肯定迷糊死了。这个时候可以上C语言了。看TCPL就行,简单了解C语法就够了。
C语言有指针和int等基础类型,用C写一遍二叉树,明显能体会到类型的好处。另外,C是汇编语言的又一层抽象,这里可以结合SICP里的数据抽象和过程抽象好好理解,C到底是怎么抽象汇编的。
写过一些C之后,了解类型的好处了。这个时候可以看TAPL。结合SICP就知道scheme基本上就是λNB的少糖形式。TAPL也是SICP这种从零开始逐渐复杂的结构,非常适合萌新看。完全弄懂λ cube和subtype就够了。TAPL里面还有很多细节,萌新看的时候可以忽略。
到这,编程基本上就入门了。对机器底层感兴趣的去学体系结构;对数据结构和算法感兴趣的去打ACM;对PLT感兴趣的继续看ATTAPL,SF;对钱感兴趣的忍着自己对C++语法的恶心去学C++;对John McCarthy感兴趣的去学ML,等等。安排的明明白白。
2. python 在编程语言中是什么地位为什么很多大学不教 Python
十分想炮轰一下,所谓“大学学习的基本设计思想,老师教授一两张语言即可,关键自己得去钻研,看自己喜欢什么就去多看多练习多钻研才可以”根本就站不住脚。首先,既然是教授一两门语言,为何这门语言是C而不是python?教授什么语言,跟你怎么才能把计算机语言写好跟你要钻研,完全就是两回事。(我并不否认强调学习要有钻研的精神,我十分认同在没有其他办法的情况下用这种论调来自我安慰,但是认为钻研的精神最重要,学习什么东西不重要,并不是一个让人停止思考的好答案) 从国内的计算机科学教育来看,“计算机语言”(Computer Language)其实从来没有获得很高的地位,在认知上就没有真正把计算机语言拉到一个较高的级别来看,相反的,可能还有鄙视代码,觉得语言只是知识的底层,不是上台面有得研究的东西。出现这种情况的原因我不大清楚,反正我身边很多的老师其实都是平时跑跑算法就行了——用自己用熟的C来跑,完全足够了。如果你的代码只是用来演示一个小程序的算法,实际上就是一个伪代码到可以编译的代码的转变,其实真的是没有多大区别了。 想想哪些老师在教计算机语言?基本都是教数据结构啊、算法啊之类的拉过来客串一下,这些老师往往没有面对复杂的系统的经验,也没有对一个有表达力的语言的需求在。而计算机语言的区别,所谓的表达力,优雅,抽象的角度,思维,全部都不是可以发到paper的东西,都是确确实实需要将语言工具用于应用和抽象才能体会到的。老师实际上一无使用一门好的语言的需求,二也很少做这些研究的。 计算机语言被拆成了很多门课,从语言、抽象和设计的角度来观察语言本身,大学应该是没有这种课程的。以我们学院来说,程序设计1根本就不是教程序设计,就是一个充水的C语言参考指导,程序设计2也不是教程序设计,就是一个充水的C++语言参考顺便教你用C++的OO语法来实现点数据结构和算法。你真正使用计算机语言是因为你要写数据结构和算法的作业。然后呢?因为要学计组你才需要学点汇编,一些老师可能对编程语言最大的体会是win32写个贪吃蛇。然后等到你大三了你学“编译原理”的时候是教你如何实现一个编译器(而不是如何设乎芹计一门语言,用语言来思考和抽象)。 大学既不是专才教育,也不是通才教育。大学是基本能力教育,它只有义务教会大多数学生在他专业领域中的基本能力。这句话本没有错,但是这句模糊的话,实际上却成为了放弃一个更好的选择的托词。大学当然不是专才教育,和型大学是基本能力教育也没有错,但是,使用C一定是掌握基本能力的最好选择吗?上面扯的“python不够clean”,“Python 的集成性并不比 C 好”也站不住脚。python在大部分情况下都比C要clean多了吧。。。大学教育哪里会在乎你的集成性。大家用 Python 是因为它的资源能够帮助很多人解决问题,这个大致我也认同。但是,python除了类库丰富,还是有很多好东西的。 从语言上看,python远远比C更适合教学啊。比如,python会让你的 1 < a < 2 是对的,不会让你栽入C的所谓的 (1<a) 是一个布尔值,然后跟2比较——这种设计真的是对的吗?人岁棚毕类真的就应该迁就这种设计吗?然后不要说 scanf("%d", &a) 这个a前面要加&这种了。你不是在学习程序语言设计,你是在学习如何躲开C的坑。。。好吧,你说学习C可以了解底层——你确认要在程序语言设计的课程里面来学习计算机底层真的很有意义而且值得坚持? 新人如果真的要学计算机语言的话,还是跟着MIT从python开始吧。不推荐C、不推荐C++、不推荐javascript、不推荐haskell、不推荐汇编、不推荐ruby,啃的下的可以试试看SICP里面的scheme,不然python也是个不错的选择。然后,C和C++一定要学好。。。haskell、lisp这些FP也挺有趣的可以看看。。。。不要挑热门的,不要挑应用广泛的,挑真的适合学习,能够启发你看到本质的。 ps:据说我院大三有门专选是python,然后还有haskell这种专选。了解了课程设计的动机和目的,其实这些都挺自然的。
3. 学习c++以后想学习第二门编程语言,请问学习什么好一些
C#。
如果一开始把C++学成Better C了,C#可以在一定程度上引导你到面向对象去:和C++一样是以静态类型为主的语言,语法和C++接近,但是它对象都是“引用”类型的,我认为这是一个很好的特性,相对于C++中对象作为值类型处理更能引导你往面向对象方面去走。
4. 怎样才能算是熟悉python会什么具体。招聘网页上写着熟悉python.高手,指导,谢谢。
熟知主流硬件体系(x86, x64)
熟知 CPython 的具体实现,如若可能至少通读源码三遍以上
熟知每条 Python bytecode 如何被解释执行
熟知每条 Python 语句如何 compile 成 bytecode
熟知 Python 主要数据结构所采用的优化手段
熟知 JIT 以及哪些场合下 PyPy 会比 CPython 有较大性能提高、以及有什么代价
所以我一直只敢称自己为 “中级 Pythonista”。对于那些仅仅知道怎么用 Python 就敢自称“精通”的人:专家不是那么好当的,没有金刚钻别揽瓷器活。不懂那么多底层细节就不要随便说自己“精通”,说自己“擅长”不会被人看不起。
@米嘉 引用的 StackOverflow 上列的那几项条件是作为将 Python 用于主要工作语言所需要的基本条件,敢于因此而称自己“精通 Python”要让不少人笑掉大牙。况且那几项还有几个严重问题:
第3点:如若可能,尽量避免 map/rece/fitler,而用 list/generator/set comprehension,代码要清晰得多,GvR 如此说。xrange 和 range 的区别在 Python 3 中马上就要滚蛋了,所以如非必要,不要大量使用 xrange。
第5点:敢于在 CPython 中大量使用递归是对 CPython 实现的公然侮辱。Python 的多个稳定实现都没有 TCO,递归会让性能迅速下降。记住一点:Python 中函数调用非常昂贵,可读性、可维护性影响不大的情况下,能展开函数调用的时候尽量展开、递归能转化成循环的尽量转化。递归也不是人类自然的思考方式。
第7点:看书是对的,但不要把 Python 当作一门经典函数式语言对待,因为它不是。你当它是,它会很痛苦(“为毛要这样滥用我!?”),你也会很痛苦(“为毛你不这样实现 blah blah!?”)。SICP 是本好书,但不要因此而教条。要清楚的知道什么时候用函数式,什么时候用面向对象,什么时候用面向过程,什么时候用面向任务,什么时候用面向结果。在一棵树上吊死是大多数非理性死忠的表现。
5. 如何评价 Racket 这门编程语言
Racket的诞生与发展
简单介绍一下Racket的发展,详见知乎的一个关于Racket的问题回答:
1958年,人工智能之父John McCarthy 发明了一种以 Lambda 演算为基础的符号处理语言,1960年 McCarthy 发表着名论文Recursive Functions of Symbolic Expressions and Their Computation by Machine, 从此这种语言被命名为 LSIP (List Processor),其语法被命名为:符号表达式(S-Expression)。LISP构建在7个函数[atom car cdr cond cons eq quote]和2个特型[lambda label]之上。
Lisp诞生之初是为了纯粹的科学研究,代码执行像数学公式一样,以人的大脑来演算。直到麦卡锡的学生斯蒂芬·罗素将eval函数在IBM 704机器上实现后,才开启了Lisp作为一种计算机语言的历史。1962年,第一个完整的Lisp编译器在MIT诞生,从此之后Lisp以MIT为中心向全世界传播。之后十多年,出现了各种Lisp方言。
1975年,Scheme诞生。Scheme同样诞生与MIT,它的设计哲学是最小极简主义,它只提供必须的少数几个原语,所有其他的实用功能都由库来实现。在极简主义的设计思想下,Scheme趋于极致的优雅,并作为计算机教学语言在教育界广泛使用。
1984年,Common Lisp诞生。在二十世纪七八十年代,由于Lisp方言过多,社区分裂,不利于lisp整体的发展。从1981年开始,在一个Lisp黑客组织的运作下,经过三年的努力整合后,于1984年推出了Common Lisp。由于Scheme的设计理念和其他Lisp版本不同,所以尽管Common Lisp借鉴了Scheme的一些特点,但没有把Scheme整合进来。此后Lisp仅剩下两支方言: Common Lisp 和 Scheme。
从二十世纪九十年代开始,由于C++、Java、C#的兴起,Lisp逐渐没落。直到2005年后,随着科学计算的升温,动态语言JavaScript、Python、Ruby的流行,Lisp又渐渐的回到人们的视线。不过在Lisp的传统阵地教育界,Python作为强有力的挑战者对Scheme发起冲锋;在2008年,MIT放弃了使用Scheme作为教学语言的SICP(计算机程序的构造和解释)课程,而启用Python进行基础教学。同时美国东北大学另立炉灶,其主导的科学计算系统PLT Scheme开始迅猛发展;2010年,PLT Scheme改名为Racket。近几年,The Racket Language连续成为年度最活跃语言网站,并驾齐驱的还有haskell网站。
符号表达式 S-Expression
首先说一下S表达式:S-表达式的基本元素是list与atom。list由括号包围,可包涵任何数量的由空格所分隔的元素,原子是其它内容。其使用前缀表示法,在Lisp中既用作代码,也用作数据。如:1+2*3 写成前缀表达式就是(+ 1 (* 2 3)) 。
优点:容易parse,简单纯粹,不用考虑什么优先级等,也是实现代码即数据的前提;
缺点:可读性不是很强;
高阶函数
高阶函数至少满足下列一个条件:
接受一个或多个函数作为输入;
输出一个函数;
微积分中的导数就是一个例子,映射一个函数到另一个函数。在无类型 lambda 演算中,所有函数都是高阶的。在函数式编程中,返回另一个函数的高阶函数被称为Curry化的函数。Curry化即把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。如 f(x,y)=x+y, 如果给定了 y=1,则就得到了 g(x)=x+1 这个函数。
Lambda 表达式
Racket中实用Lambda表达式来定义匿名函数,《如何设计程序》书中给出的使用原则是:如果某个非递归函数只需要当参数使用一次,实用Lambda表达式。如果想用Lambda表达式来表达递归,就需要引入Y组合子,Y 就是这样一个操作符,它作用于任何一个 (接受一个函数作为参数的) 函数 F,就会返回一个函数 X。再把 F 作用于这个函数 X,还是得到 X。所以 X 被叫做 F 的不动点(fixed point),即 (Y F) = (F (Y F)) 。
惰性求值
惰性求值(Lazy Evaluation),说白了就是某些中间结果不需要被求出来,求出来反而不利于后面的计算也浪费了时间。参见:惰性求值与惰性编程。
惰性求值是一个计算机编程中的一个概念,它的目的是要最小化计算机要做的工作。惰性计算的最重要的好处是它可以构造一个无限的数据类型。使用惰性求值的时候,表达式不在它被绑定到变量之后就立即求值,而是在该值被取用的时候求值。语句如 x:=expression; (把一个表达式的结果赋值给一个变量)明显的调用这个表达式并把计算并把结果放置到 x 中,但是先不管实际在 x 中的是什么,直到通过后面的表达式中到 x 的引用而有了对它的值的需求的时候,而后面表达式自身的求值也可以被延迟,最终为了生成让外界看到的某个符号而计算这个快速增长的依赖树。
闭包
闭包在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。自由变量是在表达式中用于表示一个位置或一些位置的符号,比如 f(x,y) 对 x 求偏导时,y就是自由变量。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。在函数中(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。运行时,一旦外部的 函数被执行,一个闭包就形成了,闭包中包含了内部函数的代码,以及所需外部函数中的变量的引用。其中所引用的变量称作上值(upvalue)。网上有很多将JavaScript闭包的文章,如果你对LISP有系统的了解,那么这个概念自然会很清楚了。
快排的Racket实现
#langracket
(define(quick-sortarray)
(cond
[(empty?array)empty];快排的思想是分治+递归
[else(append
(quick-sort(filter(lambda(x)(<x(firstarray)))array));这里的array就是闭包
(filter(lambda(x)(=x(firstarray)))array)
(quick-sort(filter(lambda(x)(>x(firstarray)))array)))]))
(quick-sort'(132534509824))
;;运行结果'(012334455982)
通过这个例子,就可以感受到基于lambda算子的 Racket 语言强大的表达能力了,高阶函数、lambda表达式和闭包的使用是Racket所描述的快排十分的精炼,这和 基于冯诺依曼模型C语言是迥然不容的思维模式。后面,随着Racket 学习的进一步深入,尝试写一下解释器
6. 求编程菜鸟自学书籍!
编程电子书|增长黑客手册如何用数据驱动爆发式增长?增长黑客PDF,免费下载
下载 链接: https://pan..com/s/1gWGJFVj2Ikt095XvDsCNxA
编程是编定程序的中文简称,就是让计算机代码解决某个问题,对某个计算体系规定一定的运算方式,使计算体系按照该计算方式运行,并最终得到相应结果的过程。
7. 学python对金融有用吗
链接:http://pan..com/s/1djPqbCXnQrRpW0dgi2MCJg
华尔街学堂 python金融实务从入门到精通。最近,越来越多的研究员、基金经理甚至财务会计领域的朋友,向小编咨询:金融人需要学Python么?事实上在现在,这已经不是一个问题了。Python已成为国内很多顶级投行、基金、咨询等泛金融、商科领域的必备技能。中金公司、银河证券、南方基金、银华基金在招聘分析师岗位时,纷纷要求熟练掌握Python数据分析技能。
课程目录:
Python在金融资管领域中的应用
安装anaconda步骤
Python基础知识
Python基础金融分析应用
成为编程能手:Python知识进阶
利用Python实现金融数据收集、分析与可视化
......
8. 如何从零开始学编程
在你学习编程之前思考一下你的目标,当你有最终目标时道路会更加的清晰。那么,你想要写什么?网站?游戏?iOS或者Android应用?或是你是想自动化完成一些乏味的任务让你有更多的时间看窗外的风景?也许你只是想更具有就业竞争力找个好工作。所有的这些都是有价值的目标,这些目标都是你编程学习推动力的一部分,没有推动力的人,是无法在略显枯燥的漫长学习之旅中走远的。
不要浮躁
Badprogrammingiseasy.EvenDummiescanlearnitin21days.,meswithit.
不管是在线下还是线上的书店,满目都是《21天学通Java》这种速成书目,它们都承诺在很短一段时间内就让你能够学会相关技术。MatthiasFelleisen在他的着作HowtoDesignPrograms,SecondEdition一书中明确指出了这种“速成”的趋势并予以了以上的讽刺。
所谓的“捷径”或者说“银弹”是不存在的,智者说过,精通某个东西需要10年或10000个小时,也就是汉语中的“十年磨一剑”,所以不用着急,功不唐捐。
培养兴趣
ionbythepublic,butbecauseitisfuntoprogram.
_LinusTorvalds
沉醉于编程,编程更是为了兴趣。兴趣是推动力的不竭源泉,保持这种充满兴趣的感觉,以便于你能将其投入到你的10年/10000小时的编程时间中。编程很有趣,那是探索的喜悦。那是创造的喜悦。看到自己亲手完成的作品显示在屏幕上很有趣。有人为你的代码而惊叹很有趣。有人在公共场合称赞你的产品、邻居使用你的产品、以及在媒体上讨论你的产品很有趣。编程应该十分有趣,若并非如此,就找出导致编程无趣的问题,然后解决之。
在这里对于初学者有两个大坑:
如果初学者们只与预先构建好的“发动机和组件”接触(没有理解和思考它们构造的原理),这会严重限制他们在将来构建这些东西的能力,并且在诊断解决问题时无从下手。
第二个坑没有第一个那么明显:幼稚的“整体论”方法有些时候会显得很有效,这有一定的隐蔽性与误导性,但是一两年过后(也许没那么长),当你在学习路上走远时,再想回过头来“补足基础”会有巨大的心理障碍,你得抛弃之前自己狭隘的观念,耐心地缓步前进,这比你初学时学习基础知识困难得多。
但腊敏茄也不能矫枉过正,陷入还原论的大坑,初学时便一心试图做宏大的理论,这样不仅有一切流于理论的危险,枯燥和乏味还会让你失去推动力。这种情况经常发生在计算机科班生身上。
为了更好理解,可以将学习编程类比为学习厨艺:你为了烧得一手好菜买了一些关于菜谱的书,如果你只是想为家人做菜,这会是一个不错的主意,你重复菜谱上的步骤也能做出不赖的菜肴,但是如果你有更大的野心,真的想在朋友面前露一手,做一些独一无二的美味佳肴,甚至成为“大厨”,你必须理解这些菜谱背后大师的想法,理解其中的理论,而不仅仅是一味地实践。但拿猛是如果你每天唯一的工作就是阅读那些厚重的理论书籍,因为缺乏实践,你只会成为一个糟糕的厨子,甚至永远成为不了厨子,因为看了几天书后你就因为枯燥放弃了厨艺的学习。
总之,编程是连接理论与实践的纽带,是计算机科学与计算机应用技术相交融的领域。正确的编程学习方法应该是:通过自顶而下的探索与项目实践,获得编程直觉与推动力;从自底向上的打基础过程中,获得最重要的通用方法并巩固编程思想的理解。
作为初学者,应以后者为主,前者为轮察辅。
启蒙
“学编程应该学哪门语言?”这经常是初学者问的第一个问题,但这是一个错误的问题,你最先考虑的问题应该是“哪些东西构成了编程学习的基础”?
编程知识的金字塔底部有三个关键的部分:
算法思想:例如怎样找出一组数中最大的那个数?首先你得有一个maxSoFar变量,之后对于每个数
语法:我怎样用某种编程语言表达这些算法,让计算机能够理解。
系统基础:为什么while(1)时线程永远无法结束?为什么int*foo(){intx=0;return&x;}是不可行的?
启蒙阶段的初学者若选择C语言作为第一门语言会很困难并且枯燥,这是因为他们被迫要同时学习这三个部分,在能做出东西前要花费很多时间。
因此,为了尽量最小化“语法”与“系统基础”这两部分,建议使用Python作为学习的第一门语言,虽然Python对初学者很友好,但这并不意味着它只是一个“玩具”,在大型项目中你也能见到它强大而灵活的身影。熟悉Python后,学习C语言是便是一个不错的选择了:学习C语言会帮助你以靠近底层的视角思考问题,并且在后期帮助你理解操作系统层级的一些原理,如果你只想成为一个普通(平庸)的开发者你可以不学习它。
下面给出了一个可供参考的启蒙阶段导引,完成后你会在头脑中构建起一个整体框架,帮助你进行自顶向下的探索。
完成Codecademy的Python部分。这只是热身部分,尽快完成它,因为你永远只是在浏览器里,你不会学到如何搭建开发环境。在Codecademy这类的编程学习网站学到的那点儿东西,哪怕你只想做一个小的不能再小的项目,你都不知道该从哪儿开始。
完成MIT6.00.1x(中文化)(如果你英语不过关,完成麻省理工学院公开课:计算机科学及编程导论。MOOC是学习编程的一个有效途径。虽然该课程的教学语言为Python,但作为一门优秀的导论课,它强调学习计算机科学领域里的重要概念和范式,而不仅仅是教你特定的语言。如果你不是科班生,这能让你在自学时开阔眼界;课程内容:计算概念,python编程语言,一些简单的数据结构与算法,测试与调试。支线任务:
完成Python核心编程
完成HarvardCS50(如果你英语不过关:完成哈佛大学公开课:计算机科学cs50。同样是导论课,但这门课与MIT的导论课互补。教学语言涉及C,php,JavaScript+SQL,HTML+CSS,内容的广度与深度十分合理,还能够了解到最新的一些科技成果,可以很好激发学习计算机的兴趣。支线任务:
阅读《编码的奥秘》
完成《C语言编程》
[可选]如果你的目标是成为一名Hacker:阅读Hacker'sDelight
PS:如果教育对象还是一个孩子,以下的资源会很有帮助:
5-8岁:TurtleAcademy
8-12岁:PythonforKids
12岁以上:MITScratch或KhanAcademy
入门
结束启蒙阶段后,初学者积累了一定的代码量,对编程也有了一定的了解。这时你可能想去学一门具体的技术,诸如Web开发,Android开发,iOS开发什么的,你可以去尝试做一些尽可能简单的东西,给自己一些正反馈,补充自己的推动力。但记住别深入,这些技术有无数的细节,将来会有时间去学习;同样的,这时候也别过于深入特定的框架和语言,现在是学习计算机科学通用基础知识的时候,不要试图去抄近路直接学你现在想学的东西,这是注定会失败的。
那么入门阶段具体该做些什么呢?这时候你需要做的是反思自己曾经写过的程序,去思考程序为什么(Why)要这样设计?,思考怎样(How)写出更好的程序?试图去探寻理解编程的本质:利用计算机解决问题。
设想:
X=用于思考解决方案的时间,即“解决问题”部分
Y=用于实现代码的时间,即“利用计算机”部分”
编程能力=F(X,Y)(X>Y)
要想提高编程能力,就得优化X,Y与函数F(X,Y),很少有书的内容能同时着重集中在这三点上,但有一本书做到了——(SICP)《计算机程序的构造和解释》,它为你指明了这三个变量的方向。在阅读SICP之前,你也许能通过调用几个函数解决一个简单问题。但阅读完SICP之后,你会学会如何将问题抽象并且分解,从而处理更复杂更庞大的问题,这是编程能力巨大的飞跃,这会在本质上改变你思考问题以及用代码解决问题的方式。此外,SICP的教学语言为Scheme,可以让你初步了解函数式编程。更重要的是,他的语法十分简单,你可以很快学会它,从而把更多的时间用于学习书中的编程思想以及复杂问题的解决之道上。
PeterNorvig曾经写过一篇非常精彩的SICP书评,其中有这样一段:
Touseananalogy,ifSICPwereaboutautomobiles,,howtheyarebuilt,andhowonemightdesignfuel-efficient,safe,.highway,justlikeeveryoneelse.
如果你是文中的前者,阅读SICP将成为你衔接启蒙与入门阶段的关键点
虽然SICP是一本“入门书”,但对于初学者还是有一定的难度,以下是一些十分有用的辅助资源:
):由上文提到的Google研究主管PeterNorvig主讲,教学语言为Python,内容有一定难度。
HowtoDesignPrograms,SecondEdition:HtDP的起点比SICP低,书中的内容循循善诱,对初学者很友好,如果觉得完成SICP过于困难,可以考虑先读一读HtDP。
UCBerkeleySICP授课视频以及SICP的两位作者给Hewlett-Packard公司员工培训时的录像(中文化项目)
ComposingPrograms:一个继承了SICP思想但使用Python作为教学语言的编程导论(其中包含了一些小项目)
SICP解题集:对于书后的习题,作为初学者应尽力并量力完成。
完成了这部分学习后,你会逐步建立起一个自己的程序设计模型,你的脑子里不再是一团乱麻,你会意识到记住库和语法并不会教你如何解决编程问题,接下来要学些什么,在你心里也会明朗了很多。这时候才是真正开始进行项目实践,补充推动力的好时机。
关于项目实践:对于入门阶段的初学者,参与开源项目还为时过早,这时候应该开始一些简单的项目,诸如搭建一个网站并维护它,或是编写一个小游戏再不断进行扩展,如果你自己的想法不明确,MegaProjectList中选取项目。总之,务必在这时拿下你项目实践的第一滴血。
与此同时,别忘了继续打好根基。为了将来的厚积薄发,在下面这几个方面你还要继续做足功课(注意:下面的内容没有绝对意义上的先后顺序):
计算机系统基础
有了之前程序设计的基础后,想更加深入地把握计算机科学的脉络,不妨看看这本书:《深入理解计算机系统》ComputerSystemsAProgrammer'sPerspective。这里点名批评这本书的中译名,其实根本谈不上什么深入啦,这本书只是CMU的“计算机系统导论”的教材而已。CMU的计算机科学专业相对较偏软件,该书就是从一个程序员的视角观察计算机系统,以“程序在计算机中如何执行”为主线,全面阐述计算机系统内部实现的诸多细节。
如果你看书觉得有些枯燥的话,可以跟一门Coursera上的MOOC:TheHardware/SoftwareInterface,这门课的内容是CSAPP的一个子集,但是最经典的实验部分都移植过来了。同时,可以看看TheCProgrammingLanguage,回顾一下C语言的知识。
完成这本书后,你会具备坚实的系统基础,也具有了学习操作系统,编译器,计算机网络等内容的先决条件。当学习更高级的系统内容时,翻阅一下此书的相应章节,同时编程实现其中的例子,一定会对书本上的理论具有更加感性的认识,真正做到经手的代码,从上层设计到底层实现都了然于胸,并能在脑中回放数据在网络->内存->缓存->CPU的流向。
此外,也是时候去接触UNIX哲学了:KISS-KeepitSimple,Stupid.在实践中,这意味着你要开始熟悉命令行界面,配置文件。并且在开发中逐渐脱离之前使用的IDE,学会使用Vim或Emacs(或者最好两者都去尝试)。
阅读《UNIX编程环境》
阅读《UNIX编程艺术》
折腾你的UN*X系统
数据结构与算法基础
如今,很多人认为编程(特别是做web开发)的主要部分就是使用别人的代码,能够用清晰简明的方式表达自己的想法比掌握硬核的数学与算法技巧重要的多,数据结构排序函数二分搜索这不都内置了吗?工作中永远用不到,学算法有啥用啊?这种扛着实用主义大旗的“码农”思想当然不可取。没有扎实的理论背景,遭遇瓶颈是迟早的事。
数据结构和算法是配套的,入门阶段你应该掌握的主要内容应该是:这个问题用什么算法和数据结构能更快解决。这就要求你对常见的数据结构和算法了熟于心,你不一定要敲代码,用纸手写流程是更快的方式。对你不懂的数据结构和算法,你要去搜它主要拿来干嘛的,使用场景是什么。
供你参考的学习资源:
《算法导论》:有人说别把这本书当入门书,这本书本来就不是入门书嘛,虽说书名是IntroctiontoAlgorithms,这只不过是因为作者不想把这本书与其他书搞重名罢了。当然,也不是没办法拿此书入门,读第一遍的时候跳过习题和证明就行了嘛,如果还觉得心虚先看看这本《数据结构与算法分析》
CourseraAlgorithms:DesignandAnalysis[Part1]&[Part2]:Stanford开的算法课,不限定语言,两个部分跟下来算法基础基本就有了;英语没过关的:麻省理工学院公开课:算法导论
入门阶段还要注意培养使用常规算法解决小规模问题的能力,结合前文的SICP部分可以读读这几本书:《编程珠玑》,《程序设计实践》
编程语言基础
.,.Additionally,,
-ThePragmaticProgrammer
此外还要知道,学习第n门编程语言的难度是第(n-1)门的一半,所以尽量去尝试不同的编程语言与编程范式,若你跟寻了前文的指引,你已经接触了:“干净”的脚本语言Python,传统的命令式语言C,以及浪漫的函数式语言Scheme/Racket三个好朋友。但仅仅是接触远远不够,你还需要不断继续加深与他们的友谊,并尝试结交新朋友,美而雅的Ruby小姑娘,Hindley-Milner语言家族的掌中宝Haskell都是不错的选择。但有这么一位你躲不开的,必须得认识的大伙伴—C++,你得做好与他深交的准备:
入门:C++Primer
[可选]进阶:
高效使用:EffectiveC++
深入了解:《深度探索C++对象模型》;C++Templates
研究反思:TheDesignandEvolutionofC++;对于C++这个NecessaryEvil,看这本书可以让你选择是成为守夜人还是守日人。
现实是残酷的,在软件工程领域仍旧充斥着一些狂热者,他们只掌握着一种编程语言,也只想掌握一种语言,他们认为自己掌握的这门语言是最好的,其他异端都是傻X。这种人也不是无药可救,有一种很简单的治疗方法:让他们写一个编译器。要想真正理解编程语言,你必须亲自实现一个。现在是入门阶段,不要求你去上一门编译器课程,但要求你能至少实现一个简单的解释器。
供你参考的学习资源:
《程序设计语言-实践之路》:CMU编程语言原理的教材,程序语言入门书,现在就可以看,会极大扩展你的眼界,拉开你与普通人的差距。
Coursera编程语言MOOC:课堂上你能接触到极端FP(函数式)的SML,中性偏FP的Racket,以及极端OOP(面向对象)的Ruby,并学会问题的FP分解vsOOP分解、ML的模式匹配、Lisp宏、不变性与可变性、解释器的实现原理等,让你在将来学习新语言时更加轻松并写出更好的程序。
:热热身,教你写一个简单的浏览器——其实就是一个javascript和html的解释器,完成后的成品还是很有趣的;接下来,试着完成一个之前在SICP部分提到过的项目:用Python写一个SchemeInterpreter
其他
编程入门阶段比较容易忽视的几点:
学好英语:英语是你获取高质量学习资源的主要工具,但在入门阶段,所看的那些翻译书信息损耗也没那么严重,以你自己情况权衡吧。此外英语的重要性更体现在沟通交流上,LinusTorvalds一个芬兰人,一口流利的英语一直是他招募开发者为Linux干活的的法宝,这是你的榜样。
学会提问:学习中肯定会遇到问题,首先应该学会搜索引擎的“高级搜索”,当单靠检索无法解决问题时,去StackOverflow或知乎提问,提问前读读这篇文章:Whathaveyoutried?
不要做一匹独狼:尝试搭建一个像这样简单的个人网站,不要只是一个孤零零的About页面,去学习Markdown与LaTeX,试着在Blog上记录自己的想法,并订阅自己喜欢的编程类博客。推荐几个供你参考:JoelonSoftware,PeterNorvig,CodingHorror
小结
以上的内容你不应该感到惧怕,编程的入门不是几个星期就能完成的小项目。期间你还会遇到无数的困难,当你碰壁时试着尝试“费曼”技巧:将难点分而化之,切成小知识块,再逐个对付,之后通过向别人清楚地解说来检验自己是否真的理解。当然,依旧会有你解决不了的问题,这时候不要强迫自己——很多时候当你之后回过头来再看这个问题时,一切豁然开朗。
此外不要局限与上文提到的那些材料,还有一些值得在入门阶段以及将来的提升阶段反复阅读的书籍。ThePragmaticProgrammer就是这样一本程序员入门书,终极书。有人称这本书为代码小全:从DRY到KISS,从做人到做程序员,这本书教给了你一切,你所需的只是遵循书上的指导。
后记
如果你能设法完成以上的所有任务,恭喜你,你已经真正实现了编程入门。这意味着你在之后更深入的学习中,不会畏惧那些学习新语言的任务,不会畏惧那些“复杂”的API,更不会畏惧学习具体的技术,甚至感觉很容易。当然,为了掌握这些东西你依旧需要大量的练习,腰还是会疼,走路还是会费劲,一口气也上不了5楼。但我能保证你会在思想上有巨大的转变,获得极大的自信,看老师同学和csdn的眼光会变得非常微妙,虽然只是完成了编程入门,但已经成为了程序员精神世界的高富帅。不,我说错了,即使是高富帅也不会有强力精神力,他也会怀疑自己,觉得自己没钱就什么都不是了。但总之,你遵循指南好好看书,那就会体验“会当凌绝顶”的感觉。
首先要想学编程,选一门合适的计算机语言就十分重要了,怎么去选择就显得尤为重要了,这要根据自己的兴趣爱好及每个语言的特性来选择,比如说PHP适合做web开发,易学习,易上手,非常流行的一门计算机语言了,我个人比较推荐php语言。
java可以做web开发,做安卓app开发也用的是java,在学习程度上上可能比php稍微难上手一点,不过也是没问题的,如果对java感兴趣可以尝试一下。
python是目前比较火的一门语言了,比较适合做人工智能领域,另外写网络爬虫类的程序,用python也是非常合适的了,看个人兴趣来选择了。
c,c++,c#这些语言就不推荐给了,特别是c#,已经是比较过时的一门语言了,即使学习好了,也不太适合去找工作,c与c++并不是十分适合初学者来学习,因此也是没必要进行考虑了,还有一些更小众的语言,更是没有必要去考虑,因此关于语言的学习就从上面3种语言去选择一门自己所感兴趣的吧!
研发搭建环境
如果选择好计算机语言,那么接下来就是研发环境的搭建了,因为只有研发环境搭建好了,才可以进行后续的编程工作,比如说PHP,那么就从网络上搜一下如何安装PHP环境,能搜出一些简单的教程,初学者按照教程一步一步来,顶多半天时间就可以把研发环境装好了,如果是java,就需要先安装jdk,进行环境变量的配置等,网上也有相关的教程,也是十分容易的,相信大家只要按照教程来做,都可以很轻易的把研发环境搭建起来的
选好视频和书籍,辅助学习。既然是零基础学习,就需要进行系统的学习,而不是到处网络零基础的知识点进行学习。
代码练习
跟随教程一个一个章节的进行学习,需要注意的一点就是不能只是去看,那样不行,要对每一个章节的知识点要亲自用代码敲一遍,运行一下试试效果才行,这样才能提高自己的动手能力,才开始会觉得有一点生疏,慢慢的就会熟练起来,逐渐会增加编程的兴趣。这个过程就是需要反复的进行练习,大量的代码练习才行。这个过程是5步中最关键的阶段了,重在代码亲自练习,对编程中有的章节不明白的地方,千万不要放过去,可以在网上找一些相关的编程交流群,参加进去,在线上咨询一些过来人,也许就可以轻松帮你解决疑问了,对你的学习十分帮助,并且整个过程也都是免费的。
项目实战
如果说基础教程都按部就班的都实践过一遍了,那么你就有一定的编程的基本功了,那么自己就可以尝试着做一些小项目,把学到的知识给串起来,进入项目实战阶段,比如说自己设计一个学生管理系统,并把它完成,如果不了解怎么设计,可以去网上搜索。慢慢就有思路了。
我也在学习这方面,视频书籍看过不少,最推荐的还是北京尚学堂的学习资料,Java.300集,Python400集,都是很经典的入门基础教程,而且是结合项目学习的,很有意思,干货满满,还都是免费的,推荐你可以去看看,相信可以带你走进变成的世界。
从零开始学编程,第一关就是要选择你所要学习的编程语言。面对着琳琅满目的编程语言,初学者常常一筹莫展,拿不定主意,不知该选哪
9. 怎么学习编程
1.明确学习目的 学习编程对大多数IT业人员来说都是非常有用的。学编程,做一名编程人员,从个人角度讲,可以解决在软件使用中所遇到的问题,改进现有软件,可以为自己找到一份理想的工作添加重要得砝码,有利于在求职道路上谋得一个好的职位;从国家的角度,可以为中国的软件产业做出应有的贡献,一名优秀的程序员永远是被争夺的对象。学晌掘习编程还能锻炼思维,使我们的逻辑思维更加严密;能够不断享受到创新的乐趣,将一直有机会走在高科技的前沿,因为程序设计本身是一种创造性的工作。知识经济时代给我们带来了无限的机会,要想真正掌握计算机技术,并在IT行业里干出一番事业来,有所作为,具有一定的编程能力是一个基本条件和要求。 2.打好基础 学编程要具备一定的基础,总结之有以下几方面: (1)数学基础 从计算机发展和应用的历史来看计算机的数学模型和体系结构等都是有数学家提出的,最早的计算机也是为数值计算而设计的。因此,要学好计算机就要有一定的数学基础,出学者有高中水平就差不多了。 (2)逻辑思维能力的培养学程序设计要有一定的逻辑思维能力,“逻思力”的培养要长时间的实践锻炼。要想成为一名优秀的程序员,最重要的是掌握编程思想。要做到这一点必须在反复的实践、观察、分析、比较、总结中逐渐地积累。因此在学习编程过程中,我们不必等到什么都完全明白了才去动手实践,只要明白了大概,就要敢于自己动手去体验。谁都有第一次。有些问题只有通过实践后才能明白,也只有实践才能把老师和书上的知识变成自己的,高手都是这样成材的。 (3)选择一种合适的入门语言 面对各种各样的语言,应按什么样的顺序学呢?程序设计工具不外乎如下几类: 1)本地开发应用软件开发的工具有:Visual Basic 、Delphi 、VC++ ( C++ Builder ) 等;数据库开发工具有:Visual Foxpro 、Oracle Developer 、Power Builder 等。 2)跨平台开发开发工具如 Java 等。 3)网络开发对客户端开发工具如:Java Script 等;对服务器开发工具如:PHP 、ASP 、JSP 、ISAPI 、NSAPI 、CGI 等。以上不同的环境下几种开发工具中 VB 法简单并容易理解,界面设计是可设化的,易学、易用。选 VB 作为入门的方向对出学者是较为适合的。 3. 注意理解一些重要概念 一本程序设计的书看到的无非就是变量、函数、烂绝条件语句、循环语句等概念,但要真正能进行编程应用,需要深入理解这些宴历核概念,在理解的基础上应用,不要只简单地学习语法、结构,而要吃透针对这些语法、结构的应用例子,做到举一反三,触类旁通。 4.掌握编程思想 学习一门语言或开发工具,语法结构、功能调用是次要的,最主要是学习它的思想。例如学习 VC 就要学习 Windows 的内在机理、什么是线程......;学习 COM 就要知道 VTALBE 、类厂、接口、idl......,关键是学一种思想,有了思想,那么我们就可以触类旁通。 5.多实践、多交流 掌握编程思想必须在编程实际工作中去实践和体会。编程起步阶段要经常自己动手设计程序,具体设计时不要拘泥于固定的思维方式,遇到问题要多想几种解决的方案。这就要多交流,各人的思维方式不同、角度各异,各有高招,通过交流可不断吸收别人的长处,丰富编程实践,帮助自己提高水平。亲自动手进行程序设计是创造性思维应用的体现,也是培养逻辑思维的好方法。 6.养成良好的编程习惯 编程入门不难,但入门后不断学习是十分重要的,相对来说较为漫长。在此期间要注意养成一些良好的编程习惯。编程风格的好坏很大程度影响程序质量。良好的编程风格可以使程序结构清晰合理,且使程序代码便于维护。如代码的缩进编排、变量命令规则的一致性、代码的注释等。 7.上网学编程 在网上可以学到很多不同的编程思想、方法、经验和技巧,有大量的工具和作品及相关的辅导材料供下载。例如网站“编程课堂”( http://best.yeah.net/ )主要以 VB 和 Delph;教学和交流为主,提供大量实用技巧;网站“现在时编程学园”( http://pshool.yeah.net/ )是专门介绍C、VC、VB、Delphi 等的综合编程网站;网站“ VB 编程乐园 ”( http://www.vbeden.com/ )提供内容丰富而且实用的编程技术文章、精选控件、源代码下载、计算机考试、相关软件以及编程书籍推荐等等。 8.加强计算机理论知识的再学习 学编程是符合“理论→实践→再理论→再实践”的一个认识过程。一开始要具有一定的计算机理论基础知识,包括编程所需的数学基础知识,具备了入门的条件,就可以开始编程的实践,从实践中可以发现问题需要加强计算机理论知识的再学习。程序人人皆可编,但当你发现编到一定程度很难再提高的时候,就要回头来学习一些计算机科学和数学基础理论。学过之后,很多以前遇到的问题都会迎刃而解,使人有豁然开朗之感。因此在学习编程的过程中要不断地针对应用中的困惑和问题深入学习数据结构、算法、计算机原理、编译原理、操作系统原理、软件工程等计算机科学的理论基础和数理逻辑、代数系统、图论、离散数学等数学理论基础知识。这样经过不断的学习,再努力地实践,编程水平一定会不断提高到一个新高度。
10. 求推荐一本大学Python教材
《Python编程:从入门到实践》
2016年出版的书,基于 Python3.5 同时也兼顾 Python2.7,书中涵盖的内容是比较精简的,没有艰深晦涩的概念。
每个小结都附带练习题,它可以帮助你更快的上手编写程序,解决实际编程问题。
上到有编程基础的程序员,下到10岁少年,想入门Python并达到可以开发实际项目的水平,这本书都是不错的选择。