wordpress审核教程,东莞网站快速排名优化,做p2p网站的公司,锦州网站建设更好前言
如今编程成为了一个越来越重要的「技能」#xff1a;作为设计师#xff0c;懂一些编程可能会帮你更好地理解自己的工作内容#xff1b;作为创业者#xff0c;技术创始人的身份则会让你的很多工作显得更容易。而作为刚想入门的新手#xff0c;面对眼前海量的信息作为设计师懂一些编程可能会帮你更好地理解自己的工作内容作为创业者技术创始人的身份则会让你的很多工作显得更容易。而作为刚想入门的新手面对眼前海量的信息或许根本不知道从哪里开始入门轻松度过初级材料的学习后发现学习越来越困难陡峭的学习曲线又让你望而却步你知道如何在页面上打印输出一些文本行但是你不知道何时该进行一个真正的有用的项目你不清楚自己还有哪些不知道的东西你甚至搞不清下一步该学什么。
这篇文章的内容对此不仅会有一些方向性的建议还会包含一个基础核心向的编程入门导引。当然Step by Step 的路线是不现实的并且每个人都会有自己的特点所以给出的这个编程入门导引更多的是为了引发读者的思考最终帮助你形成适用于自己的学习路线。
但要注意这篇文章是写给那些真心想学编程的人看的——那些憋着一股狠劲儿一定要做出个什么真东西不学好不罢休的人而不是那些「听说编程好玩」的人在我看来这种人永远都入不了编程的门更别提做出个像样的东西来了。
心态调整 01
确定目标
在你学习编程之前思考一下你的目标当你有最终目标时道路会更加的清晰。那么你想要写什么网站游戏 iOS 或者 Android 应用或是你是想自动化完成一些乏味的任务让你有更多的时间看窗外的风景也许你只是想更具有就业竞争力找个好工作。所有的这些都是有价值的目标这些目标都是你编程学习推动力的一部分没有推动力的人是无法在略显枯燥的漫长学习之旅中走远的。
这段视频也许能给你启发
http://v.youku.com/v_show/id_XNTIzNzE2NzQ4.html
02
不要浮躁
Bad programming is easy. Even Dummies can learn it in 21 days. Good programming requires thought, but everyone can do it and everyone can experience the extreme satisfaction that comes with it.
不管是在线下还是线上的书店满目都是《21天学通 X》这种速成书目它们都承诺在很短一段时间内就让你能够学会相关技术。Matthias Felleisen 在他的著作 How to Design Programs 一书中明确指出了这种「速成」的趋势并予以了以上的讽刺。
所谓的「捷径」或者说「银弹」是不存在的智者说过精通某个东西需要10年或10000个小时也就是汉语中的「十年磨一剑」所以不用着急功不唐捐。
03
培养兴趣
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.
– Linus Torvalds
沉醉于编程编程更是为了兴趣。兴趣是推动力的不竭源泉保持这种充满兴趣的感觉以便于你能将其投入到你的10年/10000小时的编程时间中。编程很有趣那是探索的喜悦。那是创造的喜悦。看到自己亲手完成的作品显示在屏幕上很有趣。有人为你的代码而惊叹很有趣。有人在公共场合称赞你的产品、邻居使用你的产品、以及在媒体上讨论你的产品很有趣。编程应该十分有趣若并非如此就找出导致编程无趣的问题然后解决之。
开始学习
01
令人警醒的故事
刚上初中时我便开始了编程学习很不幸我读完了好几本当时普遍存在的诸如《21天精通C》这类的垃圾书当时读完也无大碍甚至还能写点小程序。但是软件出故障了我不知道为什么稍显庞大的编程问题无从下手碰到现有的库做不到的事也只能两手一摊。虽然我每天不停地编码但我发现自己的编程能力却是提高的如此缓慢对于「迭代」与「递归」的概念只有极其有限的了解可以说只是把计算机当成了计算器来使用。
进入大学后我主修了物理学最初的一段时间里我一直在记忆背诵那些物理公式却不理解她们是如何得出的她们之间有什么联系亦或是她们的意义。我不停地学习如何计算解答一些常见的物理问题却对在这些 How 背后的 Why 一无所知。
而在我尝试做一些基于物理行为的电脑游戏时我再次遇到了之前的的困难面对新问题时无从下手面对新问题时的恐惧不断累积滋生我开始主动逃避不去真正地理解而是幻想能通过Google搜索复制粘贴代码解决问题。幸运的是大二时的一堂课完全改变了我的学习方法。那是第一次我有了「开天眼」的感觉我痛苦地意识到我对一些学科只有少的可怜的真正的理解包括我主修的物理与辅修的计算机科学。
关于那堂课那时我们刚刚学习完电学和狭义相对论的内容教授在黑板上写下了这两个主题并画了一根线将他们连了起来。「假设我们有一个电子沿导线以相对论级别的速度移动…」一开始教授只是写下了那些我们所熟悉的电学与狭义相对论的常见公式但在数个黑板的代数推导后磁场的公式神奇的出现了。虽然几年前我早已知道这个公式但那时我根本不知道这些现象间的有着这样潜在的联系。
磁与电之间的差别只是「观察角度」的问题我猛然醒悟此后我不再仅仅追求怎么做 (How)我开始问为什么 (why)开始回过头来拾起那些最基础的部分学习那些我之前我本该好好学的知识。这个回头的过程是痛苦的希望你们能就此警醒永远不要做这种傻事。
02
警醒后的反思 这幅图取自 Douglas Hofstadter 的著作 Gödel, Escher, Bach。图中的每一个字母都由其他更小的字母组成。在最高层级我们看的是 “MU”M 这个字母由三个 HOLISM 整全观构成U则是由一个 REDUCTIONISM 还原论构成前者的每一个字母都包含后者的后者整个词反之亦然。而在最低层级你会发现最小的字母又是由重复的 “MU” 组成的。
每一层次的抽象都蕴含着信息如果你只是幼稚地单一运用整体论在最高层级观察或运用还原论观察最低层级你所得到的只有 “MU” 在一些地区的方言中 mu 意味着什么都没有。
问题来了怎样才能尽可能多的获取每个层级的信息或者换句话说该怎样学习复杂领域诸如编程包含的众多知识
教育与学习过程中普遍存在一个关键问题初学者们的目标经常过于倾向整全观而忽略了基础举个常见的例子学生们非常想做一个机器人却对背后的
理解物理模型 → 理解电子工程基础 → 理解伺服系统与传感器 → 让机器人动起来这一过程完全提不起兴趣。
在这里对于初学者有两个大坑
1、如果初学者们只与预先构建好的「发动机和组件」接触没有理解和思考它们构造的原理这会严重限制他们在将来构建这些东西的能力并且在诊断解决问题时无从下手。
2、第二个坑没有第一个那么明显幼稚的「整体论」方法有些时候会显得很有效这有一定的隐蔽性与误导性但是一两年过后也许没那么长当你在学习路上走远时再想回过头来「补足基础」会有巨大的心理障碍你得抛弃之前自己狭隘的观念耐心地缓步前进这比你初学时学习基础知识困难得多。
但也不能矫枉过正陷入还原论的大坑初学时便一心试图做宏大的理论这样不仅有一切流于理论的危险枯燥和乏味还会让你失去推动力。这种情况经常发生在计算机科班生身上。
为了更好理解可以将学习编程类比为学习厨艺你为了烧得一手好菜买了一些关于菜谱的书如果你只是想为家人做菜这会是一个不错的主意你重复菜谱上的步骤也能做出不赖的菜肴但是如果你有更大的野心真的想在朋友面前露一手做一些独一无二的美味佳肴甚至成为「大厨」你必须理解这些菜谱背后大师的想法理解其中的理论而不仅仅是一味地实践。
但是如果你每天唯一的工作就是阅读那些厚重的理论书籍因为缺乏实践你只会成为一个糟糕的厨子甚至永远成为不了厨子因为看了几天书后你就因为枯燥放弃了厨艺的学习。
所以编程是连接理论与实践的纽带是计算机科学与计算机应用技术相交融的领域。正确的编程学习的方法应该是通过自顶而下的探索与项目实践获得编程直觉与推动力从自底向上的打基础过程中获得最重要的通用方法并巩固编程思想的理解。
作为初学者应以后者为主前者为辅。
启蒙 「学编程应该学哪门语言」这经常是初学者问的第一个问题但这是一个错误的问题你最先考虑的问题应该是「哪些东西构成了编程学习的基础」
编程知识的金字塔底部有三个关键的部分
• 算法思想例如怎样找出一组数中最大的那个数首先你得有一个 maxSoFar 变量之后对于每个数…
• 语法我怎样用某种编程语言表达这些算法让计算机能够理解。
• 系统基础为什么 while(1) 时线程永远无法结束为什么 int *foo() { int x 0; return x; } 是不可行的
启蒙阶段的初学者若选择C语言作为第一门语言会很困难并且枯燥这是因为他们被迫要同时学习这三个部分在能做出东西前要花费很多时间。
因此为了尽量最小化「语法」与「系统基础」这两部分建议使用 Python 作为学习的第一门语言虽然 Python 对初学者很友好但这并不意味着它只是一个「玩具」在大型项目中你也能见到它强大而灵活的身影。
熟悉 Python 后学习 C 语言是便是一个不错的选择了学习 C 语言会帮助你以靠近底层的视角思考问题并且在后期帮助你理解操作系统层级的一些原理。
下面给出了一个可供参考的启蒙阶段导引完成后你会在头脑中构建起一个整体框架帮助你进行自顶向下的探索。下面的材料没有先后顺序如果卡壳的话可以考虑换另一份材料。
• 完成 MIT 6.00.1x 麻省理工计算机科学和 Python 编程导论。虽然该课程的教学语言为 Python但作为一门优秀的导论课它强调学习计算机科学领域里的重要概念和范式而不仅仅是教你特定的语言。如果你不是科班生这能让你在自学时开阔眼界课程内容计算概念Python 编程语言一些简单的数据结构与算法测试与调试。
• 完成 Harvard CS50x 哈佛大学计算机科学。同样是导论课但这门课与MIT的导论课互补。教学语言涉及 C, PHP, JavaScript SQL, HTML CSS内容的广度与深度十分合理还能够了解到最新的一些科技成果可以很好激发学习计算机的兴趣。支线任务阅读《编码》
• 完成 Python 教程。
入门 结束启蒙阶段后初学者积累了一定的代码量对编程也有了一定的了解。这时你可能想去学一门具体的技术诸如 Web 开发 Android 开发iOS 开发什么的你可以去尝试做一些尽可能简单的东西给自己一些正反馈补充自己的推动力。
但记住别深入这些技术有无数的细节将来会有时间去学习同样的这时候也别过于深入特定的框架和语言现在是学习计算机科学通用基础知识的时候不要试图去抄近路直接学你现在想学的东西这是注定会失败的。
**那么入门阶段具体该做些什么呢**这时候你需要做的是反思自己曾经写过的程序去思考程序为什么 (Why) 要这样设计思考怎样 (How) 写出更好的程序试图去探寻理解编程的本质利用计算机解决问题。
设想
X 用于思考解决方案的时间即「解决问题」 部分
Y 用于实现代码的时间即「利用计算机」部分」
编程能力 F(X, Y) XY
要想提高编程能力就得优化 XY 与函数 F(X, Y)很少有书的内容能同时着重集中在这三点上但有一本书做到了——Structure and Interpretation of Computer Programs (SICP)《计算机程序的构造和解释》它为你指明了这三个变量的方向。
在阅读 SICP 之前你也许能通过调用几个函数解决一个简单问题。但阅读完 SICP 之后你会学会如何将问题抽象并且分解从而处理更复杂更庞大的问题这是编程能力巨大的飞跃这会在本质上改变你思考问题以及用代码解决问题的方式。此外SICP 的教学语言为 Scheme可以让你初步了解函数式编程。更重要的是他的语法十分简单你可以很快学会它从而把更多的时间用于学习书中的编程思想以及复杂问题的解决之道上。
Peter Norvig 曾经写过一篇非常精彩的 SICP 书评其中有这样一段 To use an analogy, if SICP were about automobiles, it would be for the person who wants to know how cars work, how they are built, and how one might design fuel-efficient, safe, reliable vehicles for the 21st century. The people who hate SICP are the ones who just want to know how to drive their car on the highway, just like everyone else. 如果你是文中的前者阅读SICP将成为你衔接启蒙与入门阶段的关键点。
虽然SICP是一本「入门书」但对于初学者还是有一定的难度以下是一些十分有用的辅助资源
• Udacity CS212 Design of Computer Program由上文提到的Google 研究主管 Peter Norvig 主讲教学语言为 Python内容有一定难度。
• How to Design Programs, Second EditionHtDP 的起点比SICP低书中的内容循循善诱对初学者很友好如果觉得完成SICP过于困难可以考虑先读一读 HtDP。
• UC Berkeley SICP 授课视频以及 SICP 的两位作者给 Hewlett-Packard 公司员工培训时的录像中文化项目
• Composing Programs一个继承了SICP思想但使用Python作为教学语言的编程导论其中包含了一些小项目
• SICP 解题集对于书后的习题作为初学者应尽力并量力完成。
完成了这部分学习后你会逐步建立起一个自己的程序设计模型你的脑子里不再是一团乱麻你会意识到记住库和语法并不会教你如何解决编程问题接下来要学些什么在你心里也会明朗了很多。这时候才是真正开始进行项目实践补充推动力的好时机。
关于项目实践对于入门阶段的初学者参与开源项目还为时过早这时候应该开始一些简单的项目诸如搭建一个网站并维护它或是编写一个小游戏再不断进行扩展。
如果你觉得 SICP 就是搞不定也不要强迫自己先跳过继续走常规路线开始读 The Elements of Computing Systems 吧它会教会你从最基本的 Nand 门开始构建计算机直到俄罗斯方块在你的计算机上顺利运行。
这本书会贯穿你的整个编程入门阶段你入门阶段的目标就是坚持完成这本书的所有项目包括一个最简的编译器与操作系统。
为了完全搞定这本书为了继续打好根基。为了将来的厚积薄发在下面这几个方面你还要做足功课注意下面的内容没有绝对意义上的先后顺序
01
计算机系统基础 有了之前程序设计的基础后想更加深入地把握计算机科学的脉络不妨看看这本书Computer Systems: A Programmer’s Perspective, 3/E《深入理解计算机系统》。这里点名批评这本书的中译名其实根本谈不上什么深入啦这本书只是 CMU 的「计算机系统导论」的教材而已。
CMU的计算机科学专业相对较偏软件该书就是从一个程序员的视角观察计算机系统以「程序在计算机中如何执行」为主线全面阐述计算机系统内部实现的诸多细节。
如果你看书觉得有些枯燥的话可以跟一门 Coursera 上的 MOOC: The Hardware/Software Interface这门课的内容是 CSAPP 的一个子集但是最经典的实验部分都移植过来了。同时可以看看 The C Programming Language回顾一下C语言的知识。
完成这本书后你会具备坚实的系统基础也具有了学习操作系统编译器计算机网络等内容的先决条件。当学习更高级的系统内容时翻阅一下此书的相应章节同时编程实现其中的例子一定会对书本上的理论具有更加感性的认识真正做到经手的代码从上层设计到底层实现都了然于胸并能在脑中回放数据在网络-内存-缓存-CPU 的流向。
02
数据结构与算法基础
如今很多人认为编程特别是做 web 开发的主要部分就是使用别人的代码能够用清晰简明的方式表达自己的想法比掌握硬核的数学与算法技巧重要的多数据结构排序函数二分搜索这不都内置了吗工作中永远用不到学算法有啥用啊这种扛着实用主义大旗的「码农」思想当然不可取。没有扎实的理论背景遭遇瓶颈是迟早的事。
数据结构和算法是配套的**入门阶段你应该掌握的主要内容应该是****这个问题用什么算法和数据结构能更快解决。**这就要求你对常见的数据结构和算法了熟于心你不一定要敲代码用纸手写流程是更快的方式。对你不懂的数据结构和算法你要去搜它主要拿来干嘛的使用场景是什么。
供你参考的学习资源
• 《算法导论》有人说别把这本书当入门书这本书本来就不是入门书嘛虽说书名是 Introduction to Algorithms这只不过是因为作者不想把这本书与其他书搞重名罢了。当然也不是没办法拿此书入门读第一遍的时候跳过习题和证明就行了嘛如果还觉得心虚先看看这本**《数据结构与算法分析》**
• Algorithms: Design and Analysis [Part 1] [Part 2] Stanford 开的算法课不限定语言两个部分跟下来算法基础基本就有了如果英文不过关麻省理工学院算法导论
• 入门阶段还要注意培养使用常规算法解决小规模问题的能力结合前文的SICP部分可以读读这几本书《编程珠玑》《程序设计实践 》
03
编程语言基础 Different languages solve the same problems in different ways. By learning several different approaches, you can help broaden your thinking and avoid getting stuck in a rut. Additionally, learning many languages is far easier now, thanks to the wealth of freely available software on the Internet
- The Pragmatic Programmer
此外还要知道学习第 n 门编程语言的难度是第 (n-1) 门的一半所以尽量去尝试不同的编程语言与编程范式若你跟寻了前文的指引你已经接触了「干净」的脚本语言 Python, 传统的命令式语言 C, 以及浪漫的函数式语言 Scheme 三个好朋友。
但仅仅是接触远远不够你还需要不断继续加深与他们的友谊并尝试结交新朋友美而雅的 Ruby 小姑娘Hindley-Milner 语言家族的掌中宝 Haskell 都是不错的选择。至于 C 喜欢的话学学也无妨。
现实是残酷的在软件工程领域仍旧充斥着一些狂热者他们只掌握着一种编程语言也只想掌握一种语言他们认为自己掌握的这门语言是最好的其他异端都是傻X。这种人也不是无药可救有一种很简单的治疗方法让他们写一个编译器。要想真正理解编程语言你必须亲自实现一个。现在是入门阶段不要求你去上一门编译器课程但要求你能至少实现一个简单的解释器。
供你参考的学习资源
• 《程序设计语言-实践之路》CMU 编程语言原理的教材程序语言入门书现在就可以看会极大扩展你的眼界拉开你与普通人的差距。
• Programming Languages课堂上你能接触到极端 FP 函数式的 SML中性偏 FP 的 Racket以及极端 OOP 面向对象的 Ruby并学会问题的 FP 分解 vs OOP 分解、ML 的模式匹配、Lisp 宏、不变性与可变性、解释器的实现原理等让你在将来学习新语言时更加轻松并写出更好的程序。
• Udacity CS262 Programming Language热热身教你写一个简单的浏览器——其实就是一个 JavaScript 和 HTML 的解释器完成后的成品还是很有趣的接下来试着完成一个之前在SICP部分提到过的项目用Python写一个 Scheme Interpreter
其他 编程入门阶段比较容易忽视的几点
1 学会提问学习中肯定会遇到问题应该学会正确的使用搜索引擎。当单靠检索无法解决问题时去 Stack Overflow 或知乎提问。
2 不要做一匹独狼尝试在 CoCode 与他人交流想法。试着在博客上记录自己的想法。订阅自己喜欢的编程类博客推荐几个供你参考Joel on Software, Peter Norvig, Coding Horror
3 学好英语英语是你获取高质量学习资源的主要工具但在入门阶段所看的那些翻译书信息损耗也没那么严重以你自己情况权衡吧。
小结
以上的内容你不应该感到惧怕******编程的入门不是几个星期就能完成的小项目。**期间你还会遇到无数的困难当你碰壁时试着尝试「费曼」技巧**将难点分而化之切成小知识块再逐个对付之后通过向别人清楚地解说来检验自己是否真的理解。**当然依旧会有你解决不了的问题这时候不要强迫自己——很多时候当你之后回过头来再看这个问题时一切豁然开朗。
此外不要局限于上文提到的那些材料还有一些值得在入门阶段以及将来的提升阶段反复阅读的书籍。
Code Complete不管是对于经验丰富的程序员还是对于那些没有受过太多的正规训练的新手程序员此书都能用来填补自己的知识缺陷。对于入门阶段的新手们可以重点看看涉及变量名测试个人性格的章节。
The Pragmatic Programmer :有人称这本书为代码小全从 DRY 到 KISS从做人到做程序员均有涉及。
这本书的作者 Dave 在书中开篇留了这样一段话 You’re a Pragmatic Programmer. You aren’t wedded to any particular technology, but you have a broad enough background in the science, and your experience with practical projects allows you to choose good solutions in particular situations. Theory and practice combine to make you strong. You adjust your approach to suit the current circumstances and environment. And you do this continuously as the work progresses. Pragmatic Programmers get the job done, and do it well. 这段话以及他创立的 The Pragmatic Bookshelf 一直以来都积极地影响着我因此这篇指南我也尽量贯彻了这个思想引导并希望你们成为一名真正的 Pragmatic Programmer 。
后记 如果你能设法完成以上的所有任务恭喜你你已经真正实现了编程入门。这意味着你在之后更深入的学习中不会畏惧那些学习新语言的任务不会畏惧那些「复杂」的 API更不会畏惧学习具体的技术甚至感觉很容易。
当然为了掌握这些东西你依旧需要大量的练习腰还是会疼走路还是会费劲一口气也上不了5楼。但我能保证你会在思想上有巨大的转变获得极大的自信虽然只是完成了编程入门但已经成为了程序员精神世界的高富帅。不我说错了即使是高富帅也不会有强力精神力他也会怀疑自己觉得自己没钱就什么都不是了。但总之你遵循指南好好看书那就会体验「会当凌绝顶」的感觉。 [
######学习资源推荐
零基础Python学习资源介绍
Python学习路线汇总 Python所有方向的技术点做的整理形成各个领域的知识点汇总它的用处就在于你可以按照上面的知识点去找对应的学习资源保证自己学得较为全面。学习教程文末领取哈
Python必备开发工具
温馨提示篇幅有限已打包文件夹获取方式在文末
Python学习视频600合集 观看零基础学习视频看视频学习是最快捷也是最有效果的方式跟着视频中老师的思路从基础到深入还是很容易入门的。
实战案例 光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这时候可以搞点实战案例来学习。
100道Python练习题 检查学习结果。 面试刷题
资料领取
上述这份完整版的Python全套学习资料已经上传CSDN官方朋友们如果需要可以微信扫描下方CSDN官方认证二维码输入“领取资料” 即可领取。