0%

一个月的后端技术学习总结(一)

算是一次偶然意外

在申请出了一些问题(GRE分数不太理想,只够申请一般的学校)之后,我毅然选择从申请的死胡同里跳出来,去开始海投简历,想要寻找一份实习工作。申请的岗位主要是Python相关,如大数据、机器学习、爬虫、机器视觉CV相关的。但是不知是自己实力不足,还是此时运气不好,一些公司不是没有相关岗位,或者就是岗位要求比较苛刻(有些实习有最短时长要求,高达9个月),当然也有些是薪酬或者自身时间安排不符合公司的要求。

而在这样的情况下,我先是被一家世界500强(GE通用电气)拒绝了,然后其他公司还没有给确切答复,我最终不得不选择了一个初创公司的offer,职位是我本身没有报以希望的后端开发工程师。

原本只是抱着试一试的态度,算是一次偶然的意外。毕竟作为半条腿已经踏进学术道路的我,去为公司项目写代码而当码农显然是一件”不值得“的事情,但目前也没有更好的选择吧。说实在,我的后端实力也只是停留在做过一个简单的网站系统而已,面对相对产品化和庞大用户群的需求时还是捉襟见肘的。 我想,录取的原因或许仅仅是因为我比较会Python和用过一些Web框架而已。

明显的瓶颈,但想想还好

进入公司第一件事当然就是配置工作环境。平时只是偶尔用下Linux系统来做做Project,一直习惯用Windows的我,显然对上来就是一个不经常使用的操作系统而有些无助。由于快半年没有做项目,我努力地回想着一些残留的记忆,并尝试唤醒手指肌肉记忆,去敲打着一些久违的命令或者是只剩Level 1的熟练度去用Vim编辑系统配置文件,陆陆续续把需要的工具和框架(Tornado, Nginx, MySQL, Redis等)配置好。经过一个上午的捣鼓,我很快就进入了状态。

而在实习的头两天,我抽时间把以前不记得的的知识给温习了一番。如数据库,我重新看了下基本的CRUD操作,多层跨表联表查询,去重和排序等应用型操作等,以及学习了从未用过的内存缓存级、NoSQL的数据库Redis,基本学会基本的配置和使用。 以及后续开发时需要不断用到数据库,我现在能够熟练操作数据库,对其理解也因此加深了。 比如在建表时会注意冗余性的问题,结合了之前学的”范式“思想,在建表时简化表的字段,降低表的冗余性(但一些需要反复读取的表,尤其是需要跨表查询的时候,数据冗余也未尝不可)。

再者,技术上主要的问题在于工具的使用,而并非在开发本身——Coding。 如Git,由于原来项目都是个人或小团队来完成,我很少去了解Git分支管理的策略,往往就是简单地在Master分支上提交或者合并。经过在公司学习和使用后,我发现原来自身开发的弊端——对于产品而言,如果没有一个稳定的分支版本,直接在一个分支上进行开发和发布,Bug的情况都将会是未知和不可控的,这样的开发对产品相当致命。而在下面的干货部分也会更加详细介绍用Git的分支管理。

最后,产品的根本目的是解决需求。而在后端开发时,理解产品的需求相当重要,在正式Coding前,我常常会把整个思路写在一张纸上,缕清业务逻辑和”数据流向”,考虑各种不同的极端情况,从而来检查我现有的解决方案是否满足,而这些极端情况也可以作为到时测试的实例数据。最后结合产品的迭代周期,我也会考虑对接口封装是否合理及实现时对函数的抽象层级,使得代码解耦程度高和代码得以简单复用。

总的来说,我还是会看到自己在后端上明显的技术瓶颈。但一个月后的现在想想其实还好,并没有像做研究时那种认知的颠覆,需要不断的去夯实理论基础和拓展根基。

干货

抒发了一大段,到了本次文章的重点,总结一下一个月来的干货。大纲如下:

  • Deepin系统体验
  • Vim的Python开发环境配置
  • Git的分支管理
  • Python的包管理--虚拟环境VirtualEnv和VirtualEnvWrapper
  • Crontab在系统的用处
  • 异步处理框架Celery

讲实话,以上每个内容都足以让我写一篇比较详细的文章,所以对于入门或者相关的资料会以链接的形式给出,如果日后有机会再记录。

==(2016/12/31更新:最终还真的写成了三篇) ==

那么现在进入认真梳理模式,如果可以的话,我以下尽量少水:

Deepin系统体验

工作中用的是Ubuntu 14.04LTS,在这我惊喜地发现i3(4代)处理器+集成显卡竟然能够推得动两台显示屏和一个虚拟机(Windows 7 + 1G内存 +1CPU核心)。因此,面对正在使用且日渐臃肿的Win10,我果断打算“入坑”Linux,将其作为主用系统,也想看看自己能够在开源的世界坚持多久。

在选择时,对比了许多发行版,而最后选择了国产中最优秀(个人觉得没有之一)的发行版Deepin深度系统。一是设计上比较符合我个人审美的需求,其实是在用户使用上(工作区、快捷键、定制的软件商店)都能够很好地配合我的工作和娱乐,尤其是那个侧边的Setting Panel的设计,无疑是让我耳目一新。

1
这里有几张图

由于我有两块硬盘,一块SSD和一块HDD,参考网上的教程,我的分区方案如下:

  • SSD(120GB,实际只有111.79GB左右):
挂载点 分配大小 备注
/ 32GB 系统
/var 20GB 运行环境
/boot 300MB 引导区
/boot/efi 200MB EFI引导分区
未分配 59.3GB
  • HDD(1TB, 实际只有931.51GB)
挂载点 分配大小 备注
/home 600GB 用户文件分区
/swap 8GB 交换空间
260MB 硬盘隐藏分区
未分配 322.26GB

分区补充: 1. SSD有读取寿命,因此把需要经常读写的区域且无关紧要放在了HDD,但也有人说并不要紧。 2. /boot 和 /swap分区尽量放在扇区前部或者后部,减少寻道时间。 3. 目前来看的话,分区还是比较充裕的(根目录用了7.7GB,/var正常运行时保持在2到3GB,而/home因为存放了虚拟机的硬盘空间50G,已经使用了85.6GB) /home 区域最好独立分区,方便重装系统不会影响到该分区内容。

下面分享下目前主要的需求及解决方案: 1. 代码: 基本靠Vim, 一般初期不熟悉的Project,还是用IDE浏览下文件目录和阅读API函数方便。 2. 博客: Hexo + GitHub Page 3. Markdown: Remarkable , 目前遇到视觉效果最好的MD编辑器 4. 笔记、TODO List、Reminder、ReadLater: OneNote, WunderList, Google Keep, Pocket 5. 翻墙: Shadowsocks-Qt5 + 自搭VPS 6. 虚拟机: VirtualBox,可以直接apt-get,比较方便 7. AP热点: create_ap 8. 办公/通讯: 虚拟机跑WeChat, DingTalk, Office2013 9. 其他基本可以用Chrome解决