在我刚学python的时候,每天除去白天上班,为了保证学习质量,我会每天花三四个小时来学习,天天如此。所有的文档资料,问答我都尽量去看英文版,这可以省下大量时间。在我做的网站上线后,3天大约有9000多人访问了这个网站,我在后台看着日志的时候,内心不免有些激动,我想将自己的经验写下,希望帮助鼓励到那些想学习python但无从下手的朋友。
我的自学编程之路
1、基础
刚开始我对搭建网站一脸懵逼。为了给自己快速建立一个框架,我在电脑面前呆了整整一天,了解了html,css,javascript,ajax,jquery,react,sql,服务器脚本等等知识,不奢望说要全学会精通,只是了解每一项都是用来干嘛的,然后建立起了一个学习路线图,这样就知道做一个web app大概需要哪些技能知识,安排好学习的规划顺序。小编在这里推荐两个资源:
python基础知识:笨方法学python
web app基础知识:张秋怡的答案写的通俗易懂
有了这个学习路线图,我了解了前端三大必备技能html、css、javascript,大概花了10天的样子把w3schools上的相关内容都看了一遍,然后写了几个网页,感觉自己写的很抠脚。于是我根据知乎豆瓣上的推荐,购买了《javescript dom》、《head first html与css》两本书,边看边把案例过了遍。
w3schools: w3schools
javascript:javascript dom编程艺术
html、 css: head first html与css
前端需要我去慢慢学习,看完那些资料后,虽然我能写出还不错的页面,但我知道很多都不符合标准,更别说代码风格啥的。这些只有在自己不断地积累和增加代码量中来提高。我明白服务器端需要耗费太多时间,所以发现我能够按构思勉勉强强来实现网页后,我就专心学服务器端去了。但是每天还是会抽时间写一写网页,免得手生了嘛。
2、服务器端
首先要了解什么是http协议,就是服务器和浏览器之间是如何通信的。比如当你在浏览器里输入网址按回车一直到网页在你浏览器显示的这个过程期间,浏览器和浏览器之间发生了什么事情。这是非常有意思的内容,了解这些内容之后,你就会知道像有时候为什么会有404页面?在搜索引擎搜索框里输入的关键词是怎么提交到百度服务器的?为何很多网站重新登录就不用输入密码?等等相关的问题了。
在了解过http协议后,我就开始入迷了。很多看似晦涩难懂的现象其实原理很简单,然后你会被吸引。之后就开始到我花时间最多的部分——后端开发。还记得当时在了解 web开发的 mvc(model-view-controller)模式后,有一种灰常激动的感觉,感觉太有意思了(大家别喷哈,年轻人没见过世面)。
我们每个人的主页都是差不多的布局风格,比如菜单搜索栏、左边显示动态、颜色分割等,右边是个人信息等,具体的内容却因人而异——每个人的名字、头像、动态都是不一样的。那么问题来了,知乎是怎样保证我们每个人所看到的都是自己的主页呢?
你可以把这个相同的布局想象成一个模板,里面有一个个空格子,在你登陆页面的时候,想象一下你电脑里有无数个小人根据你输入的账号从知乎后台数据库里取出你的填写过的所有信息,然后对应模板规定好的位置,把相应内容填进去。这些小人动作很快,以至于让你感觉这是瞬间完成的。
之前说的模板是 mvc 中的 v(view),它负责显示。这样做好处在于如果知乎有一天突然想改变个人主页风格,那就只要改这一个模板,然后所有的注册用户其主页就相应变化了,模板是公用的,省了很多事情?(早期的web开发还需要一个个用户去改,超级麻烦)
这些小人除去摆放内容,它们主要负责业务逻辑,一般叫做 controller,也就 v(view);比如在你登陆时,这些小人需要检查你的用户名是否准确,准确的话它们要去数据库中取出你的请求信息,错误的话它们要拦截你的登陆。它们的职责太多无法一一去列举。而在实际中,这些小人做的事情就是python做的事情。
mvc 中的 model 就是传给 view 的数据,包括用户名、头像、动态等数据。这些数据在服务器上以数据库表格的形式存在,我们可以把它们想象成许多不同的excel表格,每个表格储存着不同的信息,如用户个人信息,回答,评论等等,而这些表格之间却又彼此联系,当你在跳转知乎中不同网页的时候,那些小人就会根据你的需求,组合对应表格取出对应数据,把他们放到模板对应空格中,发送给浏览器。浏览器再根据你写的css,用不同的大小、颜色等等,将数据非常漂亮的显示出来。
这样做有什么好处呢?虽然最终在浏览器看到的是一个完整页面,但在后端逻辑上它们是区分开的——视图(v)、模型(m)和控制器(c)他们的区分就保证了非常高的可维护性——我随时可以修改主页显示看到效果,我还可以随时加入一些业务逻辑。
当你的学习坚持到这里了,那么我要恭喜你。可能你知道一些成熟常用的django,flask等python web框架了,可能你看到一些小白教程直接教你使用,可能大部分人会觉得没有必要重复造轮子。
原本为了省事,我准备直接用框架。但是我在设计数据库时,那时候在看sqlalchemy文档,觉得自己的项目sqlalchemy太复杂了,所以我决定写自己的orm,当时对我来说是一件非常有难度的事。于是乎我投入了大量精力每天看关于sql和python的教程资料,《python核心编程》给予我很多启发。在完成了orm后,又去写url处理函数,没有去用现成的web框架。
如今回头去看,我觉得这段时间的造轮子是我提升编程能力最快的时期。像为了写orm,就得去花大量时间学习sql,了解python里面的metaclass,要是我用一个现成的框架,很有可能就偷懒不去关注很多小细节。不出问题的话还好,出问题就gg。造轮子让我在一开始就必须去构思整个框架,我必须要考虑到所有情况,就只能不断的强迫自己去完善知识体系,跟别人的代码对比来精进自己的,尽管这个过程中充满了挫败感,但是所获得的成就和快乐却是无可比拟的。
在这过程中还牵涉到部署,我的网站是在linux上跑的。部署的话可以在网上搜一下教程。这里我就不多说了。这些是我大概的学习路线,过程中充满磕磕绊绊,网站虽然上线了,运行还算比较顺利,但以一个程序员的标准要求自己的话,自己还是非常菜鸟的。但我不像以前那样惧怕技术了,就比如你明白魔术的原理之后,就会更多去的思考这个原理本身。
自学编程需要注意的问题
现在很多人都推荐将python作为第一门入门语言,因为其语法简单。不过这话只说了一半,python虽然容易上手,对初学者没什么门槛。但是对于小白最大的门槛在于系统知识,这个就跟你用什么语言没有任何关系了。就像很多人看完python语法,感觉好简单,但转头在用python标准库时,才发现自己看文档都看不懂。标准库提供了python和其它系统功能的接口,最终实现了python和系统之间的互动。读标准库需要很多系统知识,如:操作系统、数据库、socket编程、进程和线程、网络协议等等,而这些东西对编程小白构成了比较高的门槛,但只有学会这些东西,你才能真正释放出python的真正的威力。
这是我觉得自己的经历对编程小白有价值的原因之一。设计一个动态的网页是非常不错的的练手project。建立网页(web app)会让你自己了解从在浏览器输入地址回车到网页显示在浏览器的过程中,浏览器,服务器,网络都做了些什么。具体到技术层面,迫使你不得不去学前端的html,css和javascript,后端的操作系统,脚本,数据库等等。在这个过程中可以促使自己主动学习上面那些系统知识,等再做下一个项目,就不会像现在这样不知道怎么下手,有能力来进行一些技术性的探讨,所以说我觉得这是一个非常好的练手项目。
1、一定要多补充理论知识
大多数人会强调边做项目边学习,这也是我使用的学习方式。在这种方式中,我们不断犯错,然后去改正……学习效率确实高。但很多人却走了极端,不注意理论知识的学习。最后发现自己去百度的能力超级厉害,然而真正的编程能力没有一点提升。出现这种情况,你就需要反思一下了。
原因大概就两点:
①、太依赖各种成熟的框架,结果编程变成了用「胶水」去粘合不同的框架来完成你自己的需求。比如你的web app用了sqlalchemy,自己虽然不太懂sql,但网站跑的还行。但是这时候数据库出现问题,你怎么办呢?gg吧
②、你可能沉浸在做项目的快感中无法自拔,却忽略了学习理论知识。做项目过程中虽然很困难,但是强烈的成就感让你很爽,沉浸其中。我觉得这是非常愚蠢的。半路出家的程序员没有系统的学习过,没有形成一个自己的知识体系,假如你不懂算法复杂度,数据结构,操作系统这些理论,那注定你所能达到的高度非常有限。所以我们在每天做项目的同时,一定一定要保证抽出时间,来恶补一下理论知识。这些书在知乎豆瓣都太多总结,可以去搜搜看。
2、别去纠结那些毫无意义的问题,像哪个框架好,某某语言比某某语言好呢这种没营养的问题。前期确定好练手项目后,就专心去积累代码量基础知识。那些你现在还看不懂感觉超级吊的技术慢慢的就能明白原理做法了,没有基础,再炫酷吊的不要不要的框架对你而言都是天书,从小就学的万丈高楼平地起都被抛之脑后了。
3、学会去问。好问题建立于你已经实践过或者思考过之后再问出来的,这不仅是对自己的一种负责,也是对他人的一种尊重。别有问题就百度或者直接甩给别人:「这个问题是怎么回事啊?」,「我不明白你能不能帮我看看……」。
4、最后有条件尽量学好英语,这样看一些官方文档,国外网站都很方便,也可以及时学到国外一些新技术。
好了 小编我就啰嗦到这里,先吃饭去了。