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