Pulpcode

捕获,搅碎,拼接,吞咽

0%

准备web开发

大学的时候想过做c,c++和底层,因为书上说c++很难。还想过实现自己的梦想,做游戏。也研究过些算法,还写过些android程序,打算做手机app。也跟着学校做jsp开发。

不知不觉已经毕业快两年,也明白自己的许多。所以在这里规划自己的学习路线和发展方向。

web方向

我的web方向,不是以流程业务为主的web开发,此类开发java和c#,php的开发较多,大多外包企业做管理系统。这方面我最多可能也就用django。

我主要做的是面向协议接口的web开发。这些用python开发居多,比如tornado,或者flask。这些web主要提供某些专一的服务,比如支付相关的url-api。

这里的技术要点,还要能够处理大量的连接请求。能够高效的使用数据库。这就需要掌握,python语言本身,保证代码易扩展易维护,关注于web框架,web服务器本身。

架构设计

设计模式,面对面向对象无法解决的问题,也就是说有更大的模型需要去建立,仅仅靠面相对象本身提供的东西是不够的,这个时候就需要设计模式了。比如说一个web框架,这东西就需要设计模式去构架它。做一个可重用的框架,和一个可重用的库,都离不开设计模式的思路。再比如python的WSGI能够将python服务器和python框架解耦。我知道在这方面自己一直有所欠缺,缺少一种大局观,对大模型的理解。

web框架

首先flask和tornado的源码是需要阅读的,tornado作为web框架可能没什么特别的,基本是web.py,但是作为服务器部分的代码很值得一读,使用epoll处理千以万计的链接。
而flask也是公认的pythonic代码,包括它所实用的werkzeug,也是值得一读的代码。

最后能达到的效果就是能够根据需求去修改tornado,flask的部分源码,甚至是自己写个服务器。

django会看文档实用就行了,我知道自己也不会对那种源码感兴趣。

核心就是WSGI了,相关的pep文档应该是pep333和pep3333。

开发工具

开发库

urllib2,url和http请求的相关使用库。

requests,据说python的http库很难用,而requests就方便很多。无论是写爬虫,测试自己的服务器,还是反向代理,都会用到这个库。

ElementTree,这个用来解析xml,面相协议的web应用,经常传输的就是xml,或者json

等等…

数据库

mysql,这里一直是我的弱项,sql的基础知识没什么好说的了,什么连接,子查询,都应该能玩的很熟,这些知识本身也是和函数式编程息息相关。其它的我只能想到性能,优化,orm,事务,备份,等关键字了,其它的我也不知道要如何去入手。

编辑器

vim还是emacs,爱选啥选啥啥,无所谓了,懒得吵了,虽然我现在基本使用emacs,但我还是觉得vs最强大。

版本控制器

你可以深挖git的每一个细节操作,比如当年没有版本控制器的时候,前辈们是怎么用diff和patch命令玩的,甚至是git的一些实现细节,但是你会发现这简直是事倍功半,所以我也不建议去深度的研究,符合工作流的操作,能在几种常用的工作流中熟练开发,这就足够了。但是你一定要有一个清晰的思路,比如什么情况才会产生冲突,什么branch,fetch,pull,merge到底在干什么。

还有一点要去领会的是,在使用这些经典的开发工具时,一定要多去想想,它为什么会这么设计。为什么这个操作要这么繁琐,实现的方式是什么,这些实现的方法,在你开发自己的系统总会用得到,比如全备份和增量备份,比如只做加法不做减法,如何去“静态”的设计的项目每个模块,如何去动态的载入它们。我在学emacs的时候,就对一些设计思路叹为观止。

安全性

即使你不做web安全方面的工作,在开发系统中,大大小小的名词,概念,原理也是你需要明白的。

比如签名,证书,公钥和私钥等等一系列的内容需要学习理解。

需要注意的是,这些知识在网上都能找到,但是常常比较碎,需要自己慢慢的去整理,有些东西需要花大量时间,才能吃透,否者常常是以为自己明白了,但是遇到新问题又发现自己不明白了。

部署与运维

即使不是一个运维,部署web相关的知识也要了解。包括nginx,linux的相关操作。

其实基本可以概括为理解web开发的方方面面,因为一般做技术要么就是精通某一个方向,要么就是能做全栈工程师的职位,web方向本身并不算是一个细的能够深入精通的方向(我觉得算法才算),大多数本科生也很难说精通某一细的领域,大多数公司也很少有这样的岗位,所以像全栈是一个比较实际的发展方向。当然切记不要做一个什么都会,但是什么都不会的人。

语言相关

语言基础

一些关于语言细节的时候,我们根本就没有想过为什么会这样,比如trycatch,比如assert,很多时候我们也是瞎用,却不知道为什么要这么用。
曾经我就听一个大牛讲各种语言的异常处理机制,讲到自己高潮,反正我没听懂。。。。。

面向对象,虽然面向对象被骂了很久,但是不得不否认面向对象是一种很好的编程工具,它可以写出模块化的代码,因为面向对象符合人的思维方式,软件又是人去书写的,所以面向对象一直是很好的开发方式。

函数式编程,有人说函数式编程是最近被炒起来的,我并不这么认为。因为我之前说到我主要的方向是面向协议接口的web服务,所以数据的处理也是关键的一部分。而函数式编程就是用来处理数据处理的。

python

首先python的面向对象与java,c#并不同,它更灵活,包括dict,装饰方法,元类,MOR和多继承等等,这里面能引出很多奇特的用法,从《pythoncookbook》这本书中就包含很多类似的主题。

而设计模式模式也因为python的许多特性会与c++类语言有所不同。比如很多模式可能在静态语言中很麻烦,但是在python中根本不是事儿。

而python中函数也是一阶公民,可能与纯函数式语言不能比,但是map,filter,reduce,和functools库的功能如果熟悉,那么大多数的任务是完全胜任的。

lisp

如果你总觉得你的设计会有重复,或者你发现了一个什么语言特性,你就要去学学lisp了,那是你对代码的抽象思维,又会到一个高度。能够熟悉lisp,真的是明白编程的本质,我们到底在做什么,我们不应该像个孩子一样,对这个世界大大小小的事情充满兴趣,应该像个智者一样,看穿这一切。

javascript

这里的javascript应该主要是负责解析json,向服务器发送ajax之类为主。熟练使用jquery就完全够用了。再别去写一些很怪的js代码或者去玩一些作为纯面向对象语言的特性。工作的第一年写javascript比较多,不知道以后还会不会用上。

css和html

每次一提到精通web开发,就有人提到这两个东西也要精通,呵呵了我。我的html和css的水平已经足够了,我的博客页面基本就是自己慢慢折腾的,我觉得真没必要这么折腾。

核心知识

人们都说程序员要学的东西太多了,那是因为你再不停的学工具而已,事实上,学好核心知识才能以不变应万变。比如一门语言本身,就是核心知识。比如数据结构和操作系统的相关知识,就是核心知识,这些东西基本不会变的。

http协议

包括http请求协议的样子,响应协议的样子。

如何用现成的库去操作request,response,url。

POST,GET,PUT等方式的不同用法,这里就不得不提到rest和restful。

还有SOAP,WSDL,RPC这这些东西。

还有http1.0和1.1的区别。

再比如https。

其实很多人,尤其不是面相服务的web开发,面向业务流程开发的那些童鞋,很少去关注url,这里甚至需要了解到底什么是http,它被设计出来到底是什么的。

服务器推送技术,ajax的相关知识,甚至是类似http隧道这类知识。

协议这东西要慢慢的去积累记忆,基本没什么要理解的,甚至就算去背一次,也是一件一劳永逸的事情。

操作系统

这里的操作系统并不是指熟练各种shell命令,而是了解操作系统原理和系统编程的相关知识。对于web开发而言,能搭建好一个服务器,能用好一个服务器,甚至是去写一个服务器,这离不开操作系统的知识。比如进程,线程,信号,同步异步,阻塞非阻塞,网络IO模型,TCP/IP协议,套接字,缓存。如果你能精通这些原理,那么最近炒起来的协程gevent,还是什么支持并行设计的语言,或是新出来的异步框架就都难不倒你了。

如果熟悉这些知识,就可以深入python的许多底层知识,比如GIL,解释器是如何创建和回收垃圾的。

编译原理

这里不是指什么龙书鲸书之类的,而是类似领域编程,这在平时解析文件做事情都会用到。

我们所处理的大多数解析任务,可能就是解析一个CSV,json,xml,读取数据而已。但是想想一个这样的场景,你要把一个类似makefile,ANT的文件读入,解析后执行一系列的动作,这个解析的过程就需要写一个解释器,这就算是语言的设计与实现相关的知识。

很多软件也在后台实现了一个解释器,比较出名的像是emacs,这样的设计非常易于扩展。想想一下,你将会设计这样一个服务器,接受一些语句,然后解析执行,这是不是一件很酷的事情。

我还是比较倾向于这种实践性比较强的学习,在本文最后推荐的那本书就是比较偏实践的,因为学习本身就是一种投资,是有亏本和收益这么一说的。如果学习只是为了这个我知道你不知道,我比你牛逼,那还是不要去学的好。

开发技巧

我一直不明白应该给这节取一个什么样的名字,或者说我不知道该不该放到开发工具下,因为我一直觉得,一个人开发久了,应该回去不停反思什么样的开发技巧最适合他。

比如我不喜欢100%的TDD开发方式,但是能从中吸取借鉴精华,肯定对开发效率有所提升,比如坚持写单元测试,甚至是先写单元测试,这就算是一种开发技巧。

如果你开发久了也会有一些自己的开发技巧,比如先画设计图,或者先做一个能用的,然后再去重构。

甚至是对一次行动的抉择,比如你能判断没必要在某个技术上浪费时间,或者选择某个框架是最优解。

甚至是一些看似于编程技术关系不大的书籍,也能够梳理你的思维,给你一些技巧。

这些都需要不断的反思和总结。也是web开发之路上必不可少的环节。经验和大脑,也是开发工具的一部分,只属于你一个人。

书籍阅读

通过以上的介绍,列出如下知道性质的书单。唉,不知拖延症患者的我什么时候才能读完。

《pythoncookbook》

《unix环境高级编程》

《实用commonlisp编程》

《代码大全》

《设计模式》

《禅与摩托车维修艺术》

《Unix 编程艺术》

《计算机程序的构造和解释》

《Restful Web Service》

《编程语言实现模式》

《重构:改善既有代码的设计》

《修改代码的艺术》

《Python源码剖析》

《企业应用架构模式》