simplicity is prerequisite for reliability

前几天同事来找我看一个问题,说是一个 Python 进程完全堵住了。从日志来看确实是堵住了,卡在了一个奇怪的地方:尝试获取文件锁。比较悲催的是这段堵住的代码是我写的,简单地包装了一下领域相关的 Cgroups 操作和一些目录、权限的创建和回收。之前这份差事在我眼中属于「无聊的日常」。

工作并不总是充满挑战和乐趣,正因为大部分工作都是无聊的日常和琐碎的协作,有时候还有无奈的填坑和妥协的背锅,挑战和乐趣才显得难能可贵。

Read More...

上一篇博文「魔改 pip 的快乐与痛苦」中,我提到魔改开源代码,一个需要时刻考虑的事情,就是如何方便地合并上游变更。为了合并上游变更,我们要尽量克制自己乱写代码的冲动,不要作出那些使得合并代码变得困难重重的事情,比如像我曾经干出的修改包目录的蠢事。

为了修正我犯下的错,我决定在 mpip 代码仓库中保持基本 pip 一样的包目录,改换包目录这种事情放到编译过程里做。于是我不仅要在编译过程里把代码复制一份,还得把包目录从 pip 移动到 mpip,然后把代码里各种和 pip 相关的包目录、文件路径、常量定义、环境变量,总之一切有可能让 pip 和 mpip 之间不清不楚互相干扰的,都得改干净,这样才能让 mpip 和 pip 和平共处。

Read More...

半年前我做了一个 side project,把 pip 魔改一番,使得我能够将 Maven 的 Nexus 仓库作为 pip 的后端仓库。于是原本通过 pip install xxx==version 命令,我们可以从 https://pypi.python.org/simple/ 把指定版本的包下载下来然后安装,我可以用 mpip install xxx==version 从公司内网的 Nexus 仓库下载包然后安装。

之所以做这么个工具,是因为公司没有提供一个内部的 pypi 服务器。Python 不是公司的主流语言,公司自然不会投人力物力去维护这么一个服务,如果由我所在团队自行维护,又得付出额外的人力物力,并不是十分划算。于是我们之前的做法是将系统依赖的三方包,不管是 whl 还是 tgz,直接放在代码目录里,然后在生成部署包的时候再复制、安装。

Read More...

After working as a software engineer for two years, I find writing weekly report a really tough experience.

I spent lots of time doing trivial daily works and finally I can't recall them when I need to write the fucking report.

I have to spend time writing what I did this week instead of creating useful code pieces, reading some books or having some fun.

Read More...

春花秋月何时了?往事知多少。小楼昨夜又东风,故国不堪回首月明中。雕栏玉砌应犹在,只是朱颜改。问君能有几多愁?恰似一江春水向东流。

问君能有几多愁?为了一份周报想破头。

要说工作之后最让我头大的事情,其中一件就是每周都得写周报了。实习的时候,还曾经因为周报太简单,被大老板批评「要是再这么写周报,以后都别写了」。

Read More...

最近写了一些关于 Python 远程调试的扯淡向博文,第一篇是「远程调试你的 Python 代码」,第二篇是「使用 VS Code 远程调试 Python 程序」。前些日子开了一个叫做「第八个手艺人」的微信公众号,本想混个原创,骗点零花钱,于是把这些文章首发在公众号上了。可惜微信始终不给我原创标记,微信文章的阅读量也上不去,我也就渐渐失去了玩公众号兴致。

后来看到耗子叔的新博文「为什么我不在微信公众号上写文章」,想想自己写博客的初心,果然还是不要整公众号这些幺蛾子了,回到我的博客,回到我这个可以被 Google 爬取、索引,被同行轻易搜索到的博客。

Read More...

在上一篇文章 远程调试你的 Python 代码 中,我简单介绍了 Python 世界中的两种远程调试模型:PyCharm 选择的 debugger as debug server 模式和 VS Code 提供的 debugger as debug client 模式,并分享了 PyCharm 的远程调试适用于单体应用,VS Code 的远程调试适用于大规模的分布式应用的观点。

随后有同行来信咨询我具体如何使用 VS Code 来远程调试。由于 VS Code Python Plugin 的文档并不完善,我只好再写一篇博文来介绍如何使用 VS Code 去远程调试 Python 程序。

Read More...

虽然我之前一直自称「Python 汪」,但是实际上我并没有在生产环境中大规模使用 Python 的经验,更多的是用 Python 来处理日常生活中的数据处理、自动化等需求。

几个月前我加入了一个除了 Java 之外还大量使用 Python、Erlang,少量使用 Golang 的团队,甚至 Python 在团队中的地位要高于 Java。于是我终于成了名副其实的 Python 汪。

Read More...

刚毕业之后工作的头一年多的时间里,我的工作都是围绕一个业务系统展开的。开发业务系统的一个感觉就是,作为开发者基本上不用去考虑 RPC 应该怎么写,消息队列、数据库、缓存应该怎么选型,配置文件用 ini 还是 YMAL 之类的问题,只需要专注在借助集团多年沉淀下来的技术栈上把业务系统搭建出来,确保系统稳定运行,帮助业务团队实现业绩目标就好了。

因为一直写的都是业务代码,在大量调用其他团队提供的 API 的同时,也大量提供 API 供其他团队调用,然后就渐渐地形成了一种思维惯性,理所当然地认为 API 的行为和它的命名是一致的,如果我调用某个 API 之后发现它的行为不符合它的命名描述,还可以推动 API 的维护团队去提供一个「政治正确」的 API。

Read More...

周日深夜,我把代码分享到了 Github,用的 MIT 协议,详见 JamesPan/pdf-smart-crop。原本还想着把注释文档和单元测试写了再分享代码的,后来实在是懒了。所以说啊,这些东西如果开发的时候不好好写,以后就更没有动力去写了。

前作「Smart Crop,一种切除 PDF 扫描文档白边的新选择(算法篇)」分享了 Smart Crop 的算法设计、基本用法和脑洞,这里分享一下实现过程中遇到的问题和妥协。

Read More...