惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
C
Cybersecurity and Infrastructure Security Agency CISA
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Know Your Adversary
Know Your Adversary
S
Securelist
I
Intezer
AWS News Blog
AWS News Blog
L
LINUX DO - 热门话题
P
Privacy International News Feed
Recent Announcements
Recent Announcements
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
博客园 - 聂微东
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Attack and Defense Labs
Attack and Defense Labs
N
News and Events Feed by Topic
The GitHub Blog
The GitHub Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Schneier on Security
Schneier on Security
N
Netflix TechBlog - Medium
爱范儿
爱范儿
B
Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
C
CERT Recently Published Vulnerability Notes
Hacker News: Ask HN
Hacker News: Ask HN
Google DeepMind News
Google DeepMind News
Engineering at Meta
Engineering at Meta
Blog — PlanetScale
Blog — PlanetScale
WordPress大学
WordPress大学
S
Secure Thoughts
K
Kaspersky official blog
N
News | PayPal Newsroom
O
OpenAI News
Last Week in AI
Last Week in AI
C
Check Point Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Cyberwarzone
Cyberwarzone
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Tor Project blog
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News
D
Docker
Hugging Face - Blog
Hugging Face - Blog
T
Threat Research - Cisco Blogs
Cisco Talos Blog
Cisco Talos Blog
The Register - Security
The Register - Security
博客园 - 司徒正美
Martin Fowler
Martin Fowler
人人都是产品经理
人人都是产品经理
P
Palo Alto Networks Blog

卡瓦邦噶!

服务器高性能网络调优 | 卡瓦邦噶! 为何写作 | 卡瓦邦噶! 读《金阁寺》 | 卡瓦邦噶! 雨季又来 | 卡瓦邦噶! MTU Probe 引起的初始延迟 | 卡瓦邦噶! 3.5 秒的固定延迟问题 | 卡瓦邦噶! 学习网络的一点经验 | 卡瓦邦噶! ARP 问题诊断 | 卡瓦邦噶! 网络断断续续…… | 卡瓦邦噶! Piccolo P2P 镜像分发 | 卡瓦邦噶! 一起看电影 | 卡瓦邦噶! 《征服C指针》 | 卡瓦邦噶! 我的姥姥 | 卡瓦邦噶! Python的哲学 Python 3.5的新特性 学校不教的计算机课 垃圾回收(GC)的三种基本方式 在编程中体验纯粹的快乐 从《美丽新世界》谈自由 在快钱实习 迷人的嗓音和迷人的故事——《Sleepyhead》 Python 的十个自然语言处理工具 记一个愚蠢的bug 一年炉石传说的游戏体验 《以撒的结合:重生》网页版图鉴 分清 C++的指针、引用和数组 笑话三则 自由比皇帝更伟大——《悲惨世界》笔记 Git 10 周年访谈:Linus 讲述背后故事 用 0x3f3f3f3f 设定最大int值的优点 Joel给计算机系学生的建议 一个词法分析器的简单实现 怎样才算健康的生活方式 MacVim 配置攻略 学习培训课程的视频效果好吗? 语言的控制 可悲的大多数 CSS样式思维导图 2014年终总结 奥巴马成为首位写程序的美国总统 青岛老城区的下水道好在哪里? 做优秀 UI 的七个建议(第二部分) 选择爱情的骑士 Git简明教程 Java集合总览 读 《1984》 java问答:终极父类(六)——等待/唤醒和接口 Java 问答:终极父类(五)——toString() Hyperlapse快速视频背后的技术细节 平庸之恶 Java程序员须知的七个日志管理工具 苏州 逛书摊随想 关于考试作弊 你的工作不仅仅是编程 推荐在线学习Java的英文资源 关注女性命运——《千禧年三部曲》 用好你的幻灯片——《演说之禅》 使用ReentrantLock和Lambda表达式让同步更纯净 新手学编程,从哪里开始? 程序员都是工程师吗? 不要学习代码,要学会思考 Java 问答:终极父类(四)——hashCode() Java 问答:终极父类(三)——finalize()和 getClass() 程序员职业之路的选择 我是一名摄影家 写给何小树的城市指南 为什么一些语言会比别的快? Java的常见误区与细节 跟朋友在一起玩游戏 死神永生——读《三体》 五种类型的程序员 创业圣经——读《黑客与画家》 纪念加西亚·马尔克斯 Junit中处理异常的另一种方式:catch-exception Java8采用Martin Fowler的方法创建内部DSL Linux HotSopt虚拟机GC线程的CPU占用率 J2EE概念介绍 如何成为一名黑客 Java 问答:终极父类(二)——equals()方法 为什么我喜欢Java Java 问答:终极父类(一)——clone()方法 七个改变世界的Java项目 java中默认类型转换的小问题 传统与创新 欢迎来到互联网 莫言和马尔克斯——读《生死疲劳》 位运算的妙用 读《人为什么活着》 写博客教会我的事情 中国特色操作系统 2013年总结 《永不妥协》影评 恨不相逢未嫁时——《廊桥遗梦》影评 如何优雅地使用PPT 给明年依然年轻的我们 天才与柱子 黑客守则和黑客精神 Looking for Freedom——《被解救的姜戈》 简洁之道
健康茁壮成长的Python项目需要什么?
laixintao · 2018-05-18 · via 卡瓦邦噶!

Python语言以简单易懂,上手难度低著称,遗憾的是,很多人保持着轻松上手后的水平,写了很多“面条式的”代码(我也写过很多)。一个项目如果想要写好,以可持续的方式发展,就不能和写练习的脚本一样,除了编程功底,一些保证项目质量的工具也必不可少。不然公司就像是个小作坊一样,以野路子的方式开发,浪费大量的人力,甚至把刚接触 Python 的新人带歪了。本文总结通常一个可持续交付的 Python 项目应该如何开发。这方便的知识也可以通过逛 Github,看一下一些经典的项目(例如 requests,django,sentry)是如何解决这些问题的。

1. 单元测试

王垠曾经说过:

我喜欢把编程比喻成开赛车,而测试就是放在路边用来防撞的轮胎护栏……

在没有测试的项目中写代码,就感觉在没有护栏的跑道上开车,心里很没有安全感。尤其是代码需要重构的时候。要么你要浪费时间每次都自己手动跑一下程序测试一下(测试也是自动化的一种),要么就要自信,相信自己的改动是绝对正确的。

Github 上面的代码就很方便了,有很多公开的服务可以使用,比如 travis,codecov.io 可以用。

私有项目就有点复杂了,需要自己搭建测试环境。之前用过 bitbucket,用我们自己开发的 CI badwolf 。这个是基于 docker 的,项目中有一个 Dockerfile,badwolf 负责以下一些工作:

  1. 对 PR 和 master 的代码在 Docker 中进行单元测试
  2. 对评论 “ci rebuild” 的时候重新从 Dockerfile build 一个image
  3. 3个人 approve PR 之后自动将 PR 合并

CI 要面对一个问题:测试环境和执行测试的命令如何分离?

Travis 是每次都会执行所有的命令,每次推送都会 install 依赖,运行测试。这样的好处是配置简单,配置环境和跑测试用一个文件就够了,清晰明了。缺点是每次都重新安装,速度慢,浪费资源。

badwolf 是只有 rebuild 的时候才会重新构建镜像,否则一直用同一个镜像来测试。这样的缺点是要制定 Dockerfile,并且要处理好环境,每次测试不能有副作用。优点是速度快。

现在我们用的是 Gitlab。Gitlab 有了 Runner 的概念,其实是更适合大团队一起。只要配置好了 shared runner,所有的项目都可以用,runner 跑完了一个去跑下一个,FIFO很公平,也节省了资源。缺点是,我觉得 Gitlab 是配置CI最复杂的,需要自己部署好 Docker 仓库,然后制定 .gitlab-ci.yml文件。

Gitlab其实比较灵活,你可以在Docker提供一个最基本的 Liunx 环境,在 yml 配置文件中写 install 的东西,每次 CI 都去安装。也可以将环境打包在后者,每次需要更新依赖就要重新 build image,但是 push 代码的时候速度快很多。个人偏爱后者。

2. 代码覆盖率

有了单元测试,如何说服同事保证写测试呢?靠价值观肯定是不行的。

对开源项目来说,有很棒的 codecov 可以用,能生成所有代码每一行跑的次数,覆盖率,changes 带来的覆盖率改变,这些都是最基本的功能了,还有什么 Github 机器人,pipeline(如果 PR 下降了覆盖率,或者新加的代码没有覆盖就不能 merge)更是酷炫。

但是对于私有项目来说,要么给钱,要么自己搞。badwolf 这种自己写的CI比较土,我们是直接在项目的最后打印出来 coverage.py 的输出结果,虽然土,但是有用。覆盖率的保证也需要我们的同事在对不好的 PR 下面留言: “testcase please!”

Gitlab 其实也好不了哪里去,除了打在 log 的最后,在它的 project settings 里面还有一个功能,写一个正则表达式,将覆盖率匹配出来显示。还是土了点,至少有点用吧。另外也可以用 coverage.py 生成的 html 报告推送到 pages 上面,这里有一篇教程,不过那样你又要去维护一个 pages 服务器(还要注意不对外网开放)。

3. 代码质量检查

PEP8,flake8,pylint 傻傻分不清楚?看这里吧

这种东西,一开始会挺痛苦的,后面对团队收益很多。

4. 保护master

组织任何人向 master push 代码。比较理想的情况是,develop 实时部署到 staging 情况,定期发布到 master。

5. issue追踪系统

类似 Github 的 issue,记录 bug 等未解决的问题,现在除了 bitbucket 丑的基本不能用,其余很多都不错的。

6. code review

对于开源项目或者团队合作来说,review 是非常重要的。

很多人觉得 review 太浪费时间了,业务这么紧,没空搞。但是我觉得这是去了解别人工作的一个好机会,并且互相学习,进步特别快。尤其是对一个刚毕业的同学来说,review几乎是快速成长的一条捷径。review由于合并速度,占用大家的时间等原因,慢是慢了一些。但是节省了很多潜在的时间,利远大于弊。

暂时想到这么多,里面每一个项目如果细开去说还有很多细节问题。甚至每一个点都够成立一个技术公司了。

一定要做正确的事情,不要被业务逼得去走歪路。