转载——原做者:赛门喵
连接:https://www.zhihu.com/question/29138020/answer/141170242html
我是真正零基础开始学Python的,从一开始的一窍不通,到3个月后成功搭建了一个动态网站(没有用任何框架)。相比于计算机大牛,我更加知道一个小白将会遇到什么坑,遇到哪些难点。我把个人学习过程写在下面,并附上在每一个阶段的学习资料,但愿对零基础的Python学习者有所帮助。前端
(注:本文只作经历分享,不是技术探讨)python
在知乎上经常看到想要转行IT,或者是想学习编程但不知如何开始的朋友。回答这类问题的人每每只是列出书单资源而后给出一个大体的方向。有些朋友一开始就扎入了理论学习的汪洋大海,从苦读相似《算法导论》开始,可以坚持读下来的寥寥无几,学习的积极性也被不断的挫败感消磨的所剩无几。git
一直以来,编程对我而言是一种「黑魔法」般的存在。今年阿里月饼门,当不少人都参与到是非之争的时候,我更加着迷于程序员区区几行代码的脚本所展示出的威力,对于外行而言,这是超乎他们想象以外的某种能力——为何我守在电脑面前盯着秒针而后拼命点击鼠标都不必定能抢到的礼物,程序员只须要提早花5分钟写3行代码就轻松搞定?程序员
因此,个人心底深处一直都想变成这样的一位魔法师。今年的8月,恰好工做上想要开发一个基于微信的英语学习网站,借此机会,我决定好好学习一下编程。在此以前,我全部关于程序的知识仅仅来源于两部分,一是本科时期的C语言必修课,如今已经忘的一干二净,不过好歹我从中明白编程是怎么回事;第二部分是大概两年前因为工做关系学的一些Python,不过只是皮毛,如今忘的七七八八。github
简单说,个人目标是创建一个网站,不过这个网站是动态的,也就是说它能识别谁登录,而后对不一样的人显示不一样的内容。而当时的现实是,我彻底不明白网页是如何显示出来的?譬如每一个人登录知乎的时候看到的是定制化的页面,后台是如何基于每一个ID来组织出不一样的页面的?全部咱们看到的问题,回答,参与的评论在背后的服务器上是以一种什么样的形式存在的?又好比为何有些页面只能在微信端打开,在电脑上就会出错?(不知道你有没有发现这一点)web
当时个人心中充满了无数个相似的问号?固然若是你也是小白,必定有着一样的疑问。算法
好处是一开始就明确了学习的目的:Web建站。因此个人学习方案基本就是经过作项目学习,哪里不懂就解决哪里,边作边学习,不断推动。另外,因为知道不少成功的网站在用Python作服务器开发,好比知乎,因此我就天然选择了Python。数据库
因而我就开始了我充满着挫败感和成就感的编程之路……编程
从8月到12月的四个月里,除去原本的工做,为了学习质量,我会保证平均天天4个小时的学习时间,周末也不例外。另外,全部的文档,问答都尽可能看英文的,这能够帮你剩下大量的时间。12月13日,我作的网站上线了,3天时间大概有5000人访问了这个网站,我有时在后台看着日志,难免有些心潮喷涌,我想把本身的经验写下来,但愿对于那些有心学习编程但无从下手的朋友提供一些帮助和鼓励。
刚开始的时候,我对搭建网站一无所知。为了给本身迅速创建一个框架,我在Google上面泡了整整一天,了解了HTML,CSS,JavaScript,Ajax,jQuery,React,SQL,服务器脚本等等知识,不求精通,只是了解每一项技术是干吗的,另外一方面创建起了一个学习的roadmap,这样大概知道作一个Web App须要哪些知识,分别学习的主次顺序。重点推荐两个资源:
Python基础知识:Learn Python the Hard Way
Web App基础知识:@张秋怡的答案写的通俗易懂,极力推荐。
有了这个roadmap,我明白了前端三大必须掌握技能HTML,CSS和JavaScript,花了大概10天左右把W3Schools上的教程所有过了一遍,而后试着写了几个网页,感受本身写的很没有底气。因而根据知乎和豆瓣上的推荐,买了《JaveScript DOM》和《Head First HTML与CSS》,边看书边把例子过了一遍。
W3Schools: www.w3schools.com/
JavaScript:JavaScript DOM编程艺术
HTML & CSS : Head First HTML与CSS(第2版)
前端是须要慢慢学习的,在看完上面的资料后,虽然能写出来一些挺漂亮的页面,可是我本身知道不少都是不符合标准的,更不要说代码风格什么的。这只能经过不断地积累和增长代码量来提升。因为明白服务器端须要耗费本身大量的时间,因此在发现本身可以按照构思勉强实现网页以后,我就把学习中心放到了服务器端上。不过天天仍是会抽空写一写网页,避免手生。
最早了解的是HTTP协议,也就是浏览器和服务器之间是如何通讯的。也就是当你在浏览器里键入网址按下回车直到网页显示在你浏览器的这个过程当中,浏览器和浏览器之间发生了什么事情。这是颇有意思的内容,我是以读小说的心情了解了这部份内容。了解这部分后,你就会明白相似为何有时候会有404页面?在百度搜索框里键入的搜索词是如何提交到百度服务器的?为何从新登陆知乎的时候就不用再输入密码了?之类的问题了。
HTTP协议学习资料:In Introduction to HTTP Basics
了解了HTTP协议以后,我就多少有些入迷了。看似神秘难懂的现象其实原理并不复杂,你反而会被吸引。接下来就进入到我投入时间最多的部分了——后端开发。记得当时了解Web开发的MVC(Model-View-Controller)模式后,有一种心血喷涌的感受,以为太有意思了(程序员别喷,我就是这么没见过世面)。咱们以知乎为例子来讲明MVC是个啥:
每一个人的主页都是相同的布局和风格,例如最上面的菜单搜索栏,颜色分割,左边显示动态等,右边是我的信息等,而后具体的内容却因人而异——每一个人的头像,名字,动态都是不同的。那么知乎是如何保证每个人看到的都是本身的主页呢?
你能够把这个相同的布局想象成一个模板,里面有一个个空格子,当你用你的帐户登录页面时,想象你的电脑里有无数个小人根据你的帐号从知乎后台的数据库里取出你的头像,动态,认证信息等等内容,而后对应着模板上规定好的位置,把对应的内容填进去。这些小人的动做实在是太快了,以致于你以为这是在瞬间完成的。
上面所说的模板就是MVC中的V,是View的缩写,负责显示。这样作的好处在于,若是知乎有一天忽然想改变一下我的主页的风格,那么只须要改变这一个模板,而后几千万注册用户的主页就相应的变化了,由于模板是公用的,是否是省了不少事情?(早期的Web开发可不是这样哟,你可能要一个个用户去改,很是麻烦。)
而这些小人除了摆放内容,它们真正负责的是业务逻辑,咱们把他们叫作Controller,也就是MVC中的C。例如当你登录的时候,这些小人要检查你的用户名是否是准确的,若是准确,它们要去数据库里取出你请求的信息等,若是用户名错误,它们要拦截住你的登录。它们的职责还有不少,没法一一列举。在实际中,这些小人作的事情其实就是Python(或者其它脚本语言)作的事情。
最后,MVC中的Model其实就是传给View的数据,包括上面的头像,用户名,动态等因人而异的数据。这些数据在知乎服务器上是以数据库表格(table)的形式存在的,你能够把它们想象成不少不一样的excel表格,不一样的表格储存着不一样的信息,有些记录着知乎用户的我的信息,有些记录着回答,有些记录着评论等等,而这些表格之间又彼此联系,当你在知乎的不一样网页间跳转的时候,上面说的那些小人就根据你的要求,组合对应的表格取出对应的数据,而后把他们放到模板对应的空格里,发送给浏览器。而后浏览器根据你写的CSS,用不一样的颜色,大小等等,将数据很漂亮的显示出来。
这样作的好处是什么呢?虽然你最终在浏览器里看到的是一个完整的页面,可是在后端逻辑上它们都是区分开的——模型(M),视图(V)和控制器(C)的区分就保证了较高的可维护性——我能够随时修改主页的显示并看到效果,一样我能够随时加入一些业务逻辑。
若是你的学习坚持到这里了,首先要恭喜你。其次你可能已经知道一些很是成熟的Python Web框架了,例如Django,Flask等等,而且你可能看到了不少小白教程教你直接使用,毕竟大部分人可能以为没有必要重复造轮子。
原本为了省事,我也打算直接用框架。我是在设计数据库的时候,当时在看SQLAlchemy文档,以为相对本身的项目SQLAlchemy太过复杂,因此我决定本身写本身的ORM(名词不懂不要紧),这对于当时的我来讲是一件难度很是大的事情。因而我投入了极大的精力天天都在看关于SQL和Python相关的教程和资料,Python核心编程(第二版) 给了我很大的启发。在本身完成了ORM后,又写了URL处理函数,一样没有用任何现成的Web框架。
如今回头看,我认为这一段时间的造轮子是提高编程能力最快的时候。好比为了写ORM,就必须去花不少时间学习SQL,去了解Python里面的metaclass,而若是用一个现成的框架,我颇有可能偷懒不去关注某些细节。而不出问题还好,一旦出问题,我就只能跪。另外,造轮子迫使我在开始的时候就构思整个框架,由于我必须尽量的考虑到全部的状况,因而就会不断的强迫本身完善知识体系,和别人的代码做对比从而改进本身的,这个过程充满了无尽的挫败感,可是得来的成就和快乐也是无可比拟的。
SQL书籍:Sams Teach Yourself MySQL in 21 Days
Python:Python核心编程(第二版)
Github上的优质Python资源:CodementorIO/Python-Learning-Resources
过程当中还牵涉到部署,个人网站是跑在Linux上的。关于部署网上有很是多的优质教程,一搜一大把。这里就再也不赘述。
这些是我学习大体路线,固然过程当中充满着小的磕磕绊绊,虽然网站上线了,貌似运行还比较顺利,可是若是以一个程序员的标准来要求本身,本身依然很是菜鸟。不过我并无之前那样害怕技术了,就像你明白魔术的背后的原理后,会更多的思考原理自己。
不少人都推荐小白第一门语言选Python,由于语法简单。这句话只说了一半,Python确实容易上手,对初学者的门槛很低。但我发现,对于小白真正的门槛在于系统知识,这就和用什么语言彻底没有任何关系了。例如不少人学完了Python的语法,以为确实简单,可是转头去用Python标准库的时候,却发现本身连文档都看不懂。标准库提供了Python和其它系统功能的接口,最终实现了Python和系统之间的互动。读标准库须要系统知识,好比操做系统,数据库,进程和线程,socket编程,网络协议等等,这些对于编程小白来才构成很高的门槛,可是只有学会这些,才能真正发挥出Python的威力来。
这也是我以为本身的经历对小白是有价值的一个缘由。由于设计一个动态的网页是一个很不错的练手Project。创建网页(Web App)会逼迫你了解从你在浏览器里键入地址按下回车到网页显示在浏览器的过程当中,浏览器,网络,服务器都干了些什么。具体到技术上面,你不得不去学习前端的HTML,CSS和JavaScript,后端的脚本,数据库,操做系统等。也就是说,这个过程可以促使你去主动学习上面提到的系统知识,若是你再作另一个项目,你就不会像如今这样无从下手,而有能力去进行一些技术性的探讨,因此我认为这是一个很是好的练手项目。
不少人会强调learn by doing,边作项目边学习,这也是我本身采用的方式。在这种方式中,你不断犯错,改正……学习效率很是高。可是,不少人走了极端,最后的结果就是不注意理论知识的学习。你会发现本身Google的能力愈来愈高,可是真实的编程能力并无获得提高。若是有这种状况,你须要反思一下。
一种多是你太过于依赖各类成熟的框架,结果编程就变成了用「胶水」去粘合不一样的框架完成需求。就比如你的Web App用了SQLAlchemy,虽然本身不太懂SQL,可是网站跑的也还不错。这时候若是数据库出现了问题,那你就只能跪了。
另一种多是你彻底沉浸在作项目中,忽略了学习理论知识。作项目虽然充满困难,但回报是强烈的成就感,很容易沉浸其中。我以为这是极其错误的。首先半路出家的程序员都没有通过系统的学习,没有造成本身的知识体系,若是你不懂数据结构,算法复杂度,操做系统这些理论,那么你能达到的高度就极其有限。因此,在天天作项目的同时,必定要保证抽出必定的时间,恶补理论知识。这部分的书单在豆瓣和知乎上都有不少总结,能够自行搜索。
好比什么框架好,XX语言比XX语言好啦这种问题。前期肯定了练手项目,就去专心积累代码量,积累基础知识。那些你如今还看不懂的炫酷技术你慢慢也就能明白是怎么回事了,反而没有基础,再炫酷的框架对你而言都是天书。
好问题是创建在你本身已经实践或者思考的基础上问出来的,这是对本身的负责,也是对别人的尊重。不要一遇到困难就喜欢直接上网搜索:「这个问题是怎么回事啊?」,「我不明白你能不能帮我看看……」。
THE END