第1周总结

2017-07-28  本文已影响0人  Tim_Lee

1 面向对象还是面向过程

没有思路的时候,以实现功能为主,先用面向过程的方法把功能排下来。写到一定程度,就可以把功能内聚,入口单一、出口单一的一部分,归总到一个函数中,做成面向对象的方法。如果多个函数实现的都是针对同一件事情,就可以放在一个类中。当然封装涉及到传参、构造函数、类属性、类方法、私有变量等内容。

2 怎么使用框架

框架只是一个高度的抽象集合,通常已经封装好各种的常用功能。如果在使用框架的时候,发现框架已经无法满足某些个性化的需求,比如产品需要与数据库快速交互,又或者开发过程中需要经常直接更改数据库表结构,不希望被框架束缚,这个时候就可以根据需要替换、自己重写框架中的功能,比如数据库交互的部分、或者比如用户验证的部分。

实际上,Django 可以只剩下 http、request/response 部分,其余部分都可以自己重新写,而剩下的这部分,完全可以换成其他的框架,比如 Flask 或者 Tornado,所以框架是为人服务的,而不是框架束缚人。当然,能够重写框架的时候,往往已经到了架构师的级别。在最开始,就要根据公司实际情况(包括人员水平、产品属性等),考虑上不上框架、上什么框架、使用框架中的那些模块,而决策的能力是构建在多年积累的基础上,以及对公司实际情况的权衡与把握。

3 性价比高的学习投资

所以实际上而言,性价比最高的学习投资是对语言、数据结构、软件工程、数据库、工具与算法等基础知识的熟练掌握。有一定基础知识之后,再去学习框架、甚至看框架的源码,相对会比较轻松。

3.1 语言

总的来说,先把一种语言熟练掌握,知道这门语言的边界在哪里,把可以做的事情都做一遍或者了解到,把这门语言能做得好的事情尽量熟透。避免在一门语言不熟悉的情况下,去学习多门语言,造成精力分散、且没有形成生产力。

对语言的基本要求是熟悉语言各种常用功能,进阶一步是深刻理解语言自带的标准库(built-in standard library)。对于 Python 而言,Python 的标准库中自带了大量的内置模块,好处是随用随取,不会存在当前 Python 版本与这些模块的版本冲突。而且这些库已经进行了大量优化,比如底层用C语言实现、使用了最优算法等。况且这些标准库在常年使用中久经考验,bug 相对少很多。

标准库中比如 Python 的 logging, json, Queue, Thread, zip, time, glob 等模块可能在平常会用到。当然, Python 的魅力之一是大众造轮子,如果内置的标准库满足不了日常要求时,有大量的第三方包可以使用,甚至可以自己写第三方包贡献到 pypi。比如内置的 urllib 不好用时,可以使用第三方的包 requests。对于第三方包,要了解的就更多,比如下载要用 requests。做图片处理要用 pillow, imagehash 和 distance。数据分析要用 pandas 和 jupyter notebook。甚至一些供应商提供的 sdk,比如七牛提供的 qiniu,可以方便上传图片到七牛的空间。

3.2 数据结构

import json
data = {
  "key1": "value1",
  "key2": "value2"
}

with open("somefile.json", "w") as f:
    json.dump(data, f)
with open("somefile.json", "w") as f:
    data = json.load(f)
# 首先用 type() 确定是否是 unicode,如果是 unicode,Python 2 中需要 decode 到 utf-8编码
a_list = u'["Monday", "Tuesday", "Wednesday"]'
a_list_trans = json.loads(u.decode('utf8'))

或者参照 Convert string representation of list to list in Python 使用 ast,好处是无须解码,坏处是 ast 比较小众。

import ast
a_list = u'["Monday", "Tuesday", "Wednesday"]'
a_list_trans = ast.literal_eval(x)

3.3 软件工程

面向对象内容是基础。

设计模式的使用:

3.4 数据库

对于后端而言,数据库的掌握很重要,不管是实现业务逻辑,还是进行数据分析,都离不开对数据库的使用。

数据库的基本操作,增删查改(CRUD,create, retrieve, update and delete)。主要是 MySQL 的操作,包括多表联合查询。另外,对于一个不了解的数据库,不能一上来就使用 SELECT * FROM SOME_TABLE,因为如果查询的这张表比较大,比如25G,那么不限制条数的查询就会被系统杀掉进程,直接退出 MySQL,所以这时候需要在后面加上限定查询记录条数的语句,比如 SELECT * FROM SOME_TABLE LIMIT 5,只插5条。查看表结构使用 DESCRIBE SOME_TABLE 或者 DESC SOME_TABLE。另外还需要了解,group by, order by, count等。

Python (或者其他语言)中对数据库的增删查改,基本分为:

数据库的导入导出,特别是大表的处理,以及导出为 csv 文件,便于 pandas 处理。或者 pandas 直接读取 MySQL 的数据,注意使用 chunksize 避免内存爆炸。Django 可以自己识别数据库结构,用 inspectdb 自动生成 models,然而这会导致一些数据关系的遗失和错误,比如数据库中 INT设定超过了255,在 Django 中就会报错,而且主键、外键等也可能出错。另外 Django 的导入大表容易出错,有了结构以后,建议直接用 MySQL 复制进去数据。

对于多个数据库的操作,要设置多个连接。要么自己设计出相应的类,要么使用 Django 的数据库路由等。

3.5 工具

服务器上的工具需要掌握

3.6 算法

对于遍历,需要考虑优化:

对于图片和文字的处理,都可以进行 hash。

对于相似程度,考虑计算各种距离:

上一篇 下一篇

猜你喜欢

热点阅读