一年一度的年终小结又到了,今年似乎做了不少事情,又似乎没做什么,是时候写下来好好的审视一下了。

技术上

主要做了两个开源项目:

  • Easy-Karabiner: Karabiner 是 macOS 上一款改键神器,几乎能实现任何形式的改键,而且内存和 CPU 占用都很少,但是它是通过 XML 进行配置,配置不难但是麻烦,维护十分蛋疼,每次要改什么都得去重新翻文档。基于此,Easy-Karabiner 诞生了,它读取写在 python 文件中的配置,将其导出成 XML,使得配置简化了不少;
  • shadowsocks-rust: shadowsocks 是由 clowwindy 实现的一款 SOCKS5 代理,速度快、占用资源少,shadowsocks-rust 是它的 rust 实现,实现了绝大部分功能,性能同样很好。造这个轮子的出发点是为了学习 rust,实现 shadowsocks 涉及到方方面面的知识,而且工程量适中,代码易懂,很适合用来练习编程语言。

其次是:

  • 学会了 Rust,加深了对类型系统和编程语言的理解;
  • 完成了部分 JOS 的任务(由于考试的缘故中断了,后来就续不上了……),加深了对操作系统的理解,现在我能够读写简单的汇编了;
  • 进一步完善了博客,并将其 docker 化了,现在几行命令就可以搭建起来了;
  • 给各种各样的开源项目做出了贡献(提 issue 或 PR,PR 主要是修 bug……),献上我的贡献图:

    github-2016-contribution.png

再就是在开普勒数据科技有限公司为期三个月的实习了:

  • 为合作的公司实现个性化推荐系统。我负责的模块是将发送来的数据序列化后存储到 HBase 中,同时根据各字段间的关系生成某些指标,由于数据量较大,这部分得考虑清楚用什么策略来做,否则可能出现数据源源不断的过来,系统却在“慢吞吞”的处理,导致未处理完的数据堆积得越来越多。另外,还要对接受到的 RPC 请求进行处理,然后响应结果给请求方,这部分就是普通的 RPC 服务器,只需要注意性能跟得上就行;
  • 由于业务需要,得实现各种各样的爬虫。写爬虫是个体力活,也不是很难,我在实现这几个爬虫的时候,流程基本上是固定的:

    1. 分析需要爬取的数据是怎么得到的,直接请求 HTML 是否有;
    2. 如果没有,试试看移动端的页面;
    3. 如果还是没有,抓包看有没有隐藏的接口可以用;
    4. 如果数据是通过 js 获取的,可能得考虑用 headless browser
    5. 搞清数据来源后,用 scrapy 之类的框架来做;
    6. 如果出现 40x 了,可能是有限速或限 IP,那么就得在程序中限制请求频率或加代理。

仔细想想,在完成自己的开源项目上花费了很多时间,比如:Easy-Karabiner 花了一两个月,shadowsocks-rust 花了三四个月。实际有 80% 的时间在完善 20% 的细节或琐事上,比如:新想出来一个点子,要实现;发现一个错误没处理,要搞定;文档没写清楚,要完善。每每做这些事情的时候都是「痛并快乐着」,一方面费时费力,却对整个项目只有很少的贡献;一方面就像打磨璞玉一样,看着它逐渐圆润的过程是很有成就感、很让人快乐的。

生活上

和恋爱近三年的女朋友分手了,有成长,也有伤感,意识到自己有一些以往没有注意到的问题,会注意到它们,尝试克服它们。发现自己的身体变得更差了,就连小小的感冒也会十分难受,为了改善这一点,开始参加实验室的运动,有规律的去健身房。

接下来

希望今年能完成下面这些「小目标」:

  • 看论文,写爬虫爬取毕设需要的数据,考虑毕设怎么做;
  • leetcode 上的算法题,完成 medium 和 hard 难度的题;
  • 坚持健身和胡吃海喝,超越 55 公斤;
  • 练习英语,做到能像写中文一样写英文。

实现下面两个开源项目中的一个:

  • 实现一个简单的 NoSQL 数据库,考虑用 Go、Rust 或 C 来做;
  • 实现一个支持插件的代理,要做到:性能匹敌 shadowsocks、不依赖 OpenSSL、跨平台。

如果还有时间: