Dropbox如何用四年完成400万行Python代码检查!

CentOS 7 下将 Dropbox 客户端部署为 systemd 用户服务 Dropbox 是一款广泛使用的云同步工具,其 Linux 客户端本质是一个依赖用户会话的守护进程(dropboxd),在无图形界面的服务器环境中无法原生作为系统服务运行。其核心原理是通过 Python 运行时加载私有二进制模块,与 Dropbox API 建立长连接并维护本地文件元数据缓存;技术价值在于提供轻量级、低侵入的跨平台文件同步能力,适用于日志归集、配置备份、团队文档共享等运维场景。然而在 CentOS 7 等传统企业级发行版中,因缺少 systemd --user 支持默认配置、SELinux 阅读详情

作为 Python 的大用户之一, Dropbox 公司内部聚集了数百万行 Python 代码,动态类型的存在让代码越来越难以理解。因此,公司开始利用 mypy 逐步将代码转换为静态类型。虽然效果得到了充分验证,但整个过程充满了各种错误和失败。本文,Dropbox 公司完整输出了从项目研究到实践的 Python 静态检查全过程,以期对各位开发者有所帮助。

Python资源共享群:626017123

事实上,Python 已经成为 Dropbox 公司使用范围最广的语言,其广泛适用于后端服务与桌面客户端应用程序等(当然,Dropbox 公司也在大量使用 Go 、TypeScript 以及 Rust 等语言)。在 Dropbox 公司数以百万计的 Python 代码行中,动态类型的存在让代码越来越难以理解,并严重影响生产力水平。为了缓解这一问题,Dropbox 公司一直在利用 mypy 逐步将代码转换为静态类型(顺带一提,mypy 可能是目前 Python 当中最流行的独立类型检查器,属于开源项目,其核心开发团队来自于 Dropbox。)。

截至目前,Dropbox 已经在成千上万个项目当中使用 mypy,而且效果都得到了很好地验证。但对于此次全方位检查 Python 代码,Dropbox 仍然抱着忐忑的心情,整个过程也充满了错误与失败。在今天的文章中,Dropbox 将向大家分享 Python 静态检查之旅——从最早的学术研究项目,到现在逐步让类型检查与类型提示成为 Python 社区中众多开发人员的常规操作。现在,已经有多种工具支持类型检查功能,包括各类 IDE 与代码分析器等。

为什么要进行类型检查?

如果开发者只使用过动态类型的 Python,当然有可能对静态类型以及 mypy 感到陌生。甚至,不少开发者就是因为动态类型而喜欢上 Python,但这事儿在逻辑上就有点莫名其妙。其关键应该在于,静态类型检查是实现规模化的前提: 项目越大,需要的静态类型就越多。

一旦项目中包含成千上万行代码,而且有多位工程师在同时使用,以往开发经验告诉我们,理解代码内容就成了保障开发人员工作效率的关键所在。如果没有类型注释,基本的代码作用推理(例如找到函数的有效参数,或者可能的返回值类型)就会成为一大难题。以下是几个在缺少类型注释时,开发人员难以回答的典型问题:

  • 这个函数能返回 None 吗?
  • 这里的 items 参数是干什么用的?
  • id 属性是什么类型:到底是 int、str、抑或是自定义类型?
  • 这个参数需要的是一份清单、一个元组还是一个组?

只要有了类型注释,开发者能够很轻松地回答这些与代码片段相关的问题,例如:

 复制代码

classResource:
id:bytes
...
defread_metadata(self,
items:Sequence[str]) -> Dict[str, MetadataItem]:
...
  • read_metadata 并不会返回 None,因为返回类型不是 Optional[…]
  • items 参数代表一系列字符串,其不可能随意迭代。
  • id 属性为字节字符串。

在理想情况下,我们当然希望把这一切都记录在文档中,但拥有从业经验的开发者肯定知道没这么好的事儿。即使存在此类文档,我们也无法完全信任其中的内容——例如内容含糊不清或者不够准确,因此带来巨大的误解空间。对于大型团队或代码库,这类问题可能产生巨大的影响:

虽然 Python 在项目早期与中期阶段表现良好,但当项目发展到特定阶段后,成功的项目与使用 Python 语言的企业可能面临一个关键性决定:我们是否需要利用静态类型语言重写所有内容?

类似 mypy 这样的类型检查器主要负责提供用于类型描述的形式语言,并通过验证所获得的类型与实现(以及可能存在的可选项)间的匹配解决这一难题。更具体地讲,类型检查器专门提供经过验证的文档。

当然,除此之外,类型检查器还可带来其它助益:

  • 类型检查器能够发现许多微妙(以及不那么微妙)的 bug。其中的典型例子,就是开发者忘记处理的 None 值或者其它一些特殊条件。
  • 重构更简单,因为类型检查器通常能够准确告诉我们需要变更的代码。我们不需要进行 100% 全覆盖测试,这本身也不具备可行性。另外,我们也不需要跟踪深层堆栈以了解到底出了什么问题。
  • 即使是在大型项目中 ,mypy 也能够在几分之一秒内完成完整的类型检查。运行测试通常需要几十秒或者几分钟。类型检查带来的快速反馈,能够帮助开发者更快实现迭代。这意味着不需要编写脆弱且难以维护的单元测试,用以模拟及修复现有代码以获取快速反馈。
  • 以 PyCharm 以及 Visual Studio Code 为代表的 IDE 和编辑器可利用类型注释实现代码补全、高亮显示错误并支持更好的定义功能——这里仅列出几项典型的功能性应用。对于一部分程序员而言,这些功能直接决定着他们的生产效率。这类用例不需要独立的类型检查工具。当然,像 mypy 这样的独立工具仍有助于保证注释与代码之间的同步。

启动迁移:性能成为瓶颈

在 Dropbox,我们成立了一个三人小队,从 2015 年底开始研究 mypy。成员分别是 Guido、Greg Price 以及 David Fisher。从那时起,工作开始快速推进。首先,在 mypy 采用面前的最大障碍就是性能。我们一直在将其运行在 CPython 解释器上,这对于 mypy 这样的工具来说速度有点不够用。(作为包含 JIT 编译器的 Python 替代性方案,PyPy 在这方面也帮不上什么忙。)

幸运的是,我们实现了一系列算法层面的改进。我们采用的第一项加速措施就是 增量检查。 其背后的思路非常简单:如果模块的所有依赖关系都与 mypy 运行前的状态毫无区别,那我们完全可以使用前一次运行的缓存数据获取依赖关系,意味着只需要类型检查修改了的文件及其依赖关系。mypy 则在此基础上更进一步:如果模块的外部接口没有改变,mypy 甚至不需要重新检查导入该模块的其它模块。

在对现有代码进行批量注释时,增量检查确实非常有用,因为其中往往涉及 mypy 的大量迭代运行,用以处理陆续插入且逐渐细化的类型。最初的 mypy 运行仍然相当缓慢,这是因为它需要处理大量依赖项。为此,我们实现了远程缓存。如果 mypy 检测到本地缓存可能已经过期,mypy 将从集中存储库下载整个代码库的最新缓存快照。在此之后,它会以下载到的缓存为基础执行增量构建。这又进一步提高了性能表现。

到 2016 年底,Dropbox 公司已经有大约 42 万行 Python 完成了类型注释。很多用户都热衷于类型检查,而 mypy 的使用则在 Dropbox 各团队之间迅速传播。

情况看起来相当不错,但距离真正的成功还有很长的路。我们开始定期进行内部用户调查,借以找出痛点,并确定需要优先考虑的工作(这种习惯直到今天也一直被保持下来)。其中,有两项请求始终排名最高: 更大的类型检查覆盖范围以及更快的 mypy 运行速度。 很明显,我们的性能与采用提升工作还没有全部完成。为此,我们还得在这两项任务上再多下点力气。

性能提升方法一:使用 mypy 守护进程

增量构建虽然提升了 mypy 的速度,但仍然没有达到顶峰。大量增量运行可能需要一分钟的处理时长。对于任何面对大型 Python 代码库的用户来讲,其中的原因相信并不难理解: 循环导入。

我们拥有数百个模块,模块相互间接导入。如果导入周期的任何文件发生变更,那么 mypy 就必须处理周期中的所有文件,同时还得处理在此周期内导入该模块的所有其它模块。其中最臭名昭著的循环就是“纠结(tangle)”,它给 Dropbox 带来了很大麻烦。其中一度包含有数百个模块,众多测试级乃至产品级功能都要或直接或间接地将其导入。

我们一直在考虑打理这种纠结无比的依赖关系,但却始终没有合适的方法着手进行。毕竟我们不熟悉的代码太多了。因此,我们想出了另一个办法——即使存在这种“纠结”,我们同样可以提升 mypy 速度。答案就是,使用 mypy 守护进程。守护进程是一项服务器进程,负责执行两项非常重要的工作。

首先,它将关于整体代码库的信息保存在内存中,这样每次 mypy 运行就不再需要加载数千条与所导入依赖项相对应的缓存数据。其次,它会跟踪函数与其构造之间的细粒度依赖关系。例如,如果函数 foo 调用函数 bar,那么就存在一项从 bar 到 foo 的依赖关系。当文件发生变更时,守护程序会首先单独处理已经变更的文件;接下来,它会查找该文件中包含的外部可见变更,例如变更的函数签名。守护程序所采用的细粒度依赖项管理机制,能够确保只重新检查实际变更的那些函数——换言之,只检查极少数函数。

实现上述目标当然是个巨大的挑战,因为我们最初的 mypy 实现方案只适合一次处理一个文件。但在实际需求发生变化之后——例如当某个类获得一个新的基类时,我们必须重新处理大量边缘情况。经过艰苦卓绝的努力与投入,我们成功将大部分增量运行缩短至几秒钟。这是一场伟大的胜利,至少在我们当事人看来相当伟大!

性能提升方法二:将 Python 编译为 C

配合之前提到的远程缓存,mypy 守护进程几乎完全解决了增量类用例,工程师们只需要对少量文件进行迭代变更即可。但是,最差情况下的性能表现仍然远未达到最佳状态。进行一次彻底的 mypy build 可能需要 15 分钟,这样的结果当然无法令人满意。由于工程师们在不断编写新代码,并在现有代码当中添加类型注释,因此情况每周都在恶化。我们的用户渴望获得更高的性能,而我们也自然不能让大家失望。

因此,我们决定延续 mypy 立项之初的重要想法—— 将 Python 编译为 C。 遗憾的是, Cython (一款现成的 Python 到 C 编译器)并不能提供任何显著的加速效果,因此 我们决定从零开始编写编译器。 由于 mypy 代码库(使用 Python 编写)已经全面完成类型注释,因此利用这些注释来加快速度自然是符合逻辑的选择。我构建了一套快速概念验证原型,其在各类微基准测试中将性能提升了 10 倍以上。我们的想法是将 Python 模块编译为 CPython C 扩展模块,并将类型注释转换为运行时类型检查(在运行时中通常被忽略的类型注释,仅供类型检查器使用)。我们开始着手将 mypy 实现由 Python 迁移至真正的静态类型语言,这恰好与 Python 的迁移思路完全匹配。(这种跨语言迁移正成为新的常态,mypy 最初由 Alore 编写,但后来则转换为 Java/Python 自定义语法的混合体。)

对 CPython 扩展 API 的定位,是保持项目整体可管理性的关键所在。我们不需要实现虚拟机或者 mypy 所需要的任何库。此外,我们仍然可以利用一切原有 Python 生态系统与工具(例如 pytest),并能够在开发期间继续使用经过解释的 Python 代码,从而实现极快的编辑测试周期且不必等待编译过程。

这款被我们命名为 mypyc 的编译器(因为它利用 mypy 作为前端来执行类型分析)非常成功。 总体而言,我们在不使用缓存的前提下实现了大约 4 倍的运行性能提升。 mypyc 项目的核心开发在小团队的推动之下用了大约 4 个月即告完成,团队成员包括 Michael Sullivan、Ivan Levkivskyi、Hugh Han 和我自己。很明显,这里的工作量远少于使用 C++ 或者 Go 完全重写 mypy,相关影响也要小得多。我们希望 mypyc 最终能够被交付至 Dropbox 的其他工程师手上,供他们编译并加速自己的更多代码。

在达成如此出色的性能提升效果的过程中,我们尝试了不少有趣的性能工程方法。编译器可以利用快速、低级 C 构造实现众多操作的加速。例如,对某个已编译函数的调用会被翻译成 C 函数调用,而后者要比调用解释函数快得多。另外,某些操作(例如字典查找)仍然会回退至常规的 CPython C API 调用,从而略微提升编译时的调用速度。总而言之,我们摆脱了解释带来的性能开销,从而稍稍改善了操作的速度表现。

我们还进行了一系列分析工作,希望了解“慢速操作”中的普遍共性。有了这些数据,我们尝试调整 mypyc 为这些操作生成速度更快的 C 代码,或者利用更快的操作方式重写相关 Python 代码(有时候确实没什么好办法,只能硬着头皮重写)。后者通常要比在编译器中自动转换容易得多,不过从长远来看,我们更倾向于实现自动化转换。但还是要具体问题具体分析,有时候为了以最低的投入获得更大的性能提升,我们也会抄近路。

实操:检查 400 万行代码

在完成上述工作后,还面临一个重要挑战(也是 mypy 用户调查中排名第二的重要要求) 就是提升类型检查的覆盖范围。 我们尝试了多种方法以实现这项目标:从有机增长,到专注于 mypy 团队的手动调整,再到静态与动态自动化类型推理等。最后,我们发现其中并不存在简单的实现策略,但我们将多种方法结合起来,从而显著提高了能够在代码库中实现的快速注释工作量。

结果就是,我们在最大的 Python 库(后端代码)中的注释行数在大约三年之内增长至近 400 万行,这些全都迁移成了静态类型代码。mypy 现在支持多种覆盖报告,能够帮助我们轻松跟踪相关进度。具体来讲,我们可以报告各类不够明确的类型来源——例如在注释中使用的显式、未经检查的类型,或者未进行类型注释的已导入第三方库等。为了在 Dropbox 当中改善类型检查精度,我们还在中央 Python 类型库中为不少流行的开源库提供经过针对性改进的类型定义(即 stub 文件)。

我们实现了(并在后续 PEP 当中标准化了)新的类型系统,旨在为某些惯用的 Python 模式提供更精确的类型。其中一个典型例子正是 TypeDict,其负责提供 JSON 类字典类型。字典当中包含一组固定的字符串键,各个字符串拥有不同的值类型。我们后续还将不断扩展这套类型系统,同时考虑改进对 Python 数字堆栈的支持能力。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以下是 Dropbox 在提升注释覆盖率时,设定的核心工作要点:

  • 严格性。逐渐增加了对新代码的严格要求。我们先从较为简单的角度入手,要求为原有文件补充注释。现在,我们则要求在继续补充注释的同时,在新的 Python 文件中使用类型注释。
  • 覆盖率报告。我们每周都会向各团队发送电子邮件报告,旨在统计他们的注释覆盖率,并提供关于最有必要注释的内容的相关建议。
  • 外展。我们与各团队就 mypy 进行交流,以帮助他们快速上手这款新工具。
  • 调查。我们定期进行用户调查以找到最重要的痛点,并竭尽全力解决这些问题(甚至可以发明一种新的语言来加快 mypy 的速度!)。
  • 性能。我们通过 mypy 守护程序与 mypyc 改进了 mypy 性能(p75 获得高达 44 倍的性能提升),从而减少注释流程中的阻碍,并允许用户根据需要扩展类型检查代码库的规模。
  • 编辑器集成。我们为 Dropbox 内部流行的各款编辑器提供了 mypy 运行集成,具体包括 PyCharm、Vim 以及 VS Code 等。这使得注释迭代变得更轻松,也提升了大家为遗留代码做注释的热情。
  • 静态分析。我们编写了一款利用静态分析来推断函数签名的工具。虽然目前它只能处理非常简单的场景,但仍然帮助我们快速提升了注释覆盖范围。
  • 第三方库支持。我们的不少代码都用到了 SQLAlchemy,它使用的很多动态 Python 函数无法由 PEP 484 类型进行直接建模。为此,我们制作了一个 PEP 561 stub 文件包及一款开源 mypy 插件以提供支持。

经验总结 检查 400 万行代码绝非易事,我们在整个过程中遇到不少挑战,当然也犯过错误。下面,我想总结经验教训,希望能给大家带来启示。

文件丢失。起步之初,我们的 mypy 版本只需处理少量内部文件——或者说,从未接触过 build 之外的一切。在添加第一条注释时,文件被隐式添加到 build 当中。如果从 build 外部的模块导入任何内容,则会获得 Any 类型的值——而这些值根本就不会被纳入检查范围。这导致类型分析精度大打折扣,并在迁移早期给我们带来了不少麻烦。虽然现在已经解决了,而且也算是一种典型做法,但在最糟糕的情况下,如果两个孤立的类型检查机制被合并起来,而这两种机制之间又互不兼容,那么我们就必须对注释进行大量更改! 回想起来,我们应该尽早将基础库模块添加到 mypy build 中。

注释遗留代码。在刚刚开始时,我们面对着超过 400 万行的现有 Python 代码。很明显,对如此规模的代码进行注释是项浩大的工程。我们编写了一款名为 PyAnnotate 的工具,它能够在运行测试的同时收集类型,并根据类型结果插入类型注释——但最终这款工具并没能得到广泛采用。理由很简单:收集类型的速度很慢,而生成的类型通常也需要大量人为调整。我们也考虑过在每一次 build 测试时对一小部分实时网络请求自动运行这款工具,但考虑到这两种方式都可能带来较大风险,最终只能作罢。

大多数代码都是由代码所有者手动注释。我们提供关于高价值模块与函数的报告,以帮助简化注释流程。那些在数百个位置使用的库模块,自然是注释工作中的优先考量对象;正在被替换的遗留服务同样值得关注。此外,我们还尝试利用静态分析为遗留代码生成静态注释。

导入周期。导入周期(也就是「tangle」或者说纠结周期)的存在令 mypy 提速变得非常困难。我们还需要努力让 mypy 支持来自导入周期的各种习惯。我们最近刚刚完成了一个重大项目的重新设计,最终解决了大多数导入周期问题。这些解决方案实际上源自项目早期研究中使用的 Alore 语言。 Alore 的语法使得导入周期的处理变得更轻松。当然,我们也在这种简单的实现中继承了某些限制因素(对 Alore 来说倒不是什么问题)。Python 之所以很难搞定导入周期,是因为其语句当中可能指代多种事物。例如,赋值可能实际上定义了一个类型别名,而且 mypy 在大部分导入周期处理完成之后一直无法检测到该类型。Alore 就不存在这种模糊性。总之,有些早期设计中不经意做出的决定,很可能成为多年之后的痛苦根源!

结束语

从早期原型设计到如今对 400 万行代码进行类型检查,这是一段漫长的旅程。在过程当中,我们对 Python 的类型提示进行了标准化,建立起围绕 Python 类型检查发展出的新兴生态系统、为 IDE 与编辑器开发出类型提示支持机制,在多种类型检查器之间进行功能权衡并实现了库支持能力。

虽然在 Dropbox 公司内部,类型检查已经被视为一项必要工作,但我相信就整个社区而言,对 Python 代码进行类型检查仍是种新生事物。当然,我也坚信这种好习惯将不断推广并给更多人带来助益。如果大家还没有在自己的大型 Python 项目中使用类型检查,那么现在就是最好的时机——根据我的交流整理,所有尝试类型检查的开发者都后悔没有早点参与。总而言之,类型检查正帮助 Python 成长为一款更适合大型项目的出色语言。

原文链接

Ubuntu 14.04 下将 Dropbox 部署为系统服务的完整实践 Dropbox 是一款广泛使用的跨平台云同步工具,其 Linux 客户端本质是一个依赖桌面会话环境(如 D-Bus、XDG 运行时目录)的用户级守护进程。理解 dropboxd 的启动原理与环境约束,是实现无人值守、开机自启、稳定驻留的关键前提。本文围绕 Ubuntu 14.04(Upstart 系统)这一典型遗留环境,深入解析 dropboxd 与 dropbox.py 的分工机制、D-Bus 会话总线的按需构建、XDG 环境变量的精准注入,以及基于 Upstart 的服务化封装方法。内容覆盖从环境依赖诊 阅读详情

相关推荐

Python工程化实战:21个生存级工具构建可复现、可追踪、可预期系统

Python工程化本质是解决环境不一致、逻辑难验证、协作低效三大痛点。其核心原理在于通过分层工具链建立确定性(如pyenv+poetry保障环境可复现)、静态与运行时双重校验(mypy+pydantic提升代码可信度)、以及标准化约束(black+ruff实现协作可预期)。这类技术方案显著降低新人上手门槛,同时加速老手交付节奏,广泛应用于Web服务、数据管道与边缘计算等场景。本文聚焦真实生产验证的21个不可替代工具,覆盖从本地开发到K8s部署的全生命周期。

weixin_33834628的博客 414

著名云存储网站DropBox疑似被墙(附应对方法)

Dropbox作为一个强大文件网络同步、备份、分享工具深受大家的喜爱,这两天也有很多名博相继发表文章介绍Dropbox以及使用技巧,不幸的是,本着凡是人们喜爱的网络服务就一定要屏蔽的原则,这个优秀的网络服务已经不能正常访问了。不过也不排除是中国刷Dropbox空间的太多而导致 Dropbox屏蔽国内IP如果想继续使用Dropbox,可以参照以下方法方法一:使用代理或VPN,

ren_xing的专栏 2048

Python密码安全实践:Passlib库的核心原理与工程应用

密码哈希是用户认证系统的安全基石,它通过将用户密码转换为不可逆的密文来保护敏感数据。与普通哈希函数追求速度不同,密码哈希函数的核心设计目标是可调节的计算成本,通过引入盐值和工作因子等机制,大幅增加暴力破解的难度。这种技术价值在于为应用提供可靠的密码存储方案,有效抵御彩虹表攻击和GPU暴力破解。在Python生态中,Passlib库将这些密码学最佳实践封装为简洁的API,支持bcrypt、Argon2等主流算法,并自动处理盐值生成、哈希值存储和算法升级等复杂问题。通过CryptContext的灵活配置,开发者

weixin_34200628的博客 509

写出高质量代码的10个Tips

转载自: http://www.jianshu.com/p/31b21a0bf1e1 很长一段时间以来,我都在关注如何提高代码质量,也为此做过一些尝试,我想这个话题可能大家会比较感兴趣,在这里分享一下我关于如何提高代码质量的一些体会。 1. 打好基础 写出高质量代码,并不是搭建空中楼阁,需要有一定的基础,这里我重点强调与代码质量密切相关的几点: 掌握好开发语言,比如做A

weizaishouex2010的专栏 466

DonkeyCar镜像发布:软硬件协同交付的闭环验证指南

嵌入式机器人镜像发布远不止‘dd命令’那么简单,它本质是面向树莓派等ARM平台的可复现固件交付过程。其核心原理在于镜像裁剪、设备身份净化与跨环境验证三重机制:通过gparted收缩分区实现体积压缩,删除.gitconfig和重置主机名保障协作安全,双环境(PC+Pi)测试规避OpenCV/TFLite/GPIO等硬件耦合陷阱。技术价值体现在降低分发门槛、消除隐私风险、提升团队复现效率;典型应用场景包括高校自动驾驶教学、开源社区二进制分发及学生项目成果固化。本文聚焦DonkeyCar入门教程中常被忽略的发布工

weixin_30530939的博客 406

基于CY7C68013A芯片的USB2.0设计

基于FPGA的USB2.0读写控制项目简介CY7C68013A芯片介绍CY7C68013A芯片读写时序控制CY7C68013A芯片读写代码USB2.0的测试结果结束语 项目简介 我们前面已经写过了USB3.0的FPGA实现,所用到的芯片是FX600Q芯片,这次我们讲解USB2.0的FPGA代码的编写。我们用到的芯片是Cypress厂家的Cy7C68013A,该款芯片在市场上的应用率极广,我们这里不...

zhangningning1996的博客 1万+

Python 定期检查Build_setting的编译情况

  #!/usr/bin/python #_*_ coding:utf-8 _*_ import time from email.MIMEText import MIMEText from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase from email import Utils, E...

weixin_33811961的博客 131

告别手动标注!用ENVI Classic高效搞定高光谱图像语义分割标签(以农业/地物分类为例)

本文详细介绍了如何利用ENVI Classic实现高光谱图像的半自动化智能标注,特别针对农业和地物分类场景。通过光谱特征分析、智能标注技巧和MAT文件转换,显著提升标注效率和质量,助力AI模型训练。

weixin_28694169的博客 251

十几年积累的 300 万行代码,领导要全部“快速”重写,我直接辞职了

LinkedIn 作为全球最大的职业社交平台,拥有数亿用户,其代码库规模也是相当庞大。2019 年时,其前端代码量就达到了 200 万行,构建时间长达 17 分钟。后端还有支持LinkedIn功能、广告销售平台等数以千计的服务。如此庞大的代码量,给维护和更新带来了巨大的挑战。更糟糕的是,由于长期以来为了快速推出新功能而忽视代码质量,导致系统问题频出,开发团队疲于应付:无论在 QA 环节上付出多少努力,都不可能彻底消除隐患。

IT界那些事儿 247

手把手用瑞萨E1仿真器调试RH850 CAN通信:从报文收发到底层寄存器监控

本文详细介绍了使用瑞萨E1仿真器调试RH850 CAN通信的全过程,包括硬件连接、CS+开发环境配置、CAN控制器寄存器解析以及双通道网关实战开发。通过实战案例和错误诊断技巧,帮助开发者快速掌握RH850F1L的RS-CAN控制器应用,提升车载网络开发效率。

weixin_30919429的博客 163

Multisim仿真入门:单相半波可控整流电路从搭建到波形分析(附避坑指南)

本文为电力电子技术初学者提供了一份详细的Multisim仿真指南,手把手教你从零搭建单相半波可控整流电路。通过对比纯电阻、阻感负载及加入续流二极管后的波形变化,直观理解晶闸管触发、电感续流等核心原理,并附有实用的参数设置与常见问题避坑指南,帮助你将抽象理论转化为可视化的工程实践。

weixin_29208077的博客 343

超详细的typeScript笔记(一)安装配置

文章目录1 安装2 配置3 运行第一个文件 1 安装 cnpm i typescript -g 查看版本 tsc -v 2 配置 基于vscode使用 1 创建.ts文件 2 生成配置文件tsc --init ----- tsconfig.json 3 自动编译配置 1 修改配置文件 2 运行指令 终端-----运行生成文件 3 运行第一个文件 自动生成js文件 浏览器不能编译ts文件 ts能使用ES6以上语法 编译时将ts转换成低级语法 ...

layxing27的博客 406

Ubuntu新手必看:3种方法快速查看和编辑JSON文件(附jq安装指南)

本文为Ubuntu新手详细介绍了三种查看和编辑JSON文件的核心方法:命令行利器jq、灵活脚本Python以及直观的图形化编辑器(如VS Code)。文章重点解析了jq的安装与核心用法,并对比了各方案的优缺点,帮助用户根据快速查询、复杂处理或直观编辑等不同场景,选择最合适的工具,从而高效处理JSON数据。

weixin_29229989的博客 416

Dropbox 如何用四年完成 400 万行 Python 代码检查

作为 Python 的大用户之一, Dropbox 公司内部聚集了数百万行 Python 代码,动态类型的存在让代码越来越难以理解。因此,公司开始利用 mypy 逐步将代码转换为静态类型。虽然效果得到了充分验证,但整个过程充满了各种错误和失败。本文,Dropbox 公司完整输出了从项目研究到实践的 Python 静态检查全过程,以期对各位开发者有所帮助。 事实上,Python 已经成为 Dropb...

LLand520的博客 262

【人工智能 Open AI】程序员怎样提升研发效率?从技术、业务、项目管理等等多个方面来阐述。

程序员要想提升研发效率,需要从技术、业务、项目管理等多方面着手,多靠工具配合实践实现,从而提升研发效率。

AI天才研究院 5527

从 VS Code 登录 ABAP Destination,一次把前后端连接跑通

最近很多 ABAP 开发者开始把 VS Code 纳入日常开发环境,原因很直接,VS Code 的轻量体验、命令面板、文件树、插件生态和 AI 编程能力,已经深深影响了现代开发者的工作方式。SAP 官方发布的 ABAP Development Tools for VS Code,也把 ABAP Cloud 开发模型带进了这个编辑器里。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 226

四年完成400万行Python代码检查,甚至顺手写了个编译器

作为 Python 的大用户之一,Dropbox 公司内部聚集了数百万行 Python 代码,动态类型的存在让代码越来越难以理解。因此,公司开始利用 mypy 逐步将代码...

cainiao_python的博客 332

Open3D (C++) 点云边界提取【2025最新版】

Compute the boundary points of a point cloud.The implementation is inspired by the PCL implementation. Reference:https://pointclouds.org/documentation/classpcl_1_1_boundary_estimation.html

点云侠的博客 871

使用 Python 下载 Dropbox 文件时遇到 backslashes 不允许的错误

在尝试实现一个下载文件从用户’s Dropbox 账户的 Dropbox 应用程序时,在用户’s 本地目录中创建目标路径时,会出现如下错误:通过分析代码,发现 dropbox’s 文件夹层次结构使用正斜杠来表示目录的嵌套,而 Windows 使用反斜杠。解决这个问题尝试了使用 Python’s BIF replace() 将反斜杠替换为正斜杠,但程序仍然崩溃。Dropbox 账户中的文件夹层次结构如下:Img1.jpgdtu.jpgimg.jpg。

D0126_的博客 307

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

跨浏览器书签同步方案:基于本地脚本与云存储实现Safari数据迁移

浏览器数据同步是现代多设备工作流中的基础需求,其核心原理在于将本地存储的书签、历史记录等数据转换为通用格式,并通过可靠的传输通道在不同平台间进行交换。从技术实现角度看,这通常涉及数据格式解析、自动化脚本编写以及云服务集成。对于开发者而言,掌握跨浏览器同步技术不仅能提升个人工作效率,还能为构建更复杂的应用集成方案提供思路。以Safari浏览器为例,其书签数据通常以SQLite数据库或plist文件形式存储,通过Python脚本结合sqlite3和plistlib库可以将其导出为标准HTML格式。这种基于本地脚

weixin_30723433的博客 298

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Python与Java技术选型实战指南:从设计哲学到生产落地

编程语言选型本质是工程约束下的理性决策,而非语法优劣之争。Python以动态类型、解释执行和丰富胶水生态著称,擅长快速原型、数据科学与自动化脚本;Java依托JVM平台、强类型系统与成熟企业级框架,保障高并发、长周期、多团队协作系统的稳定性与可维护性。二者差异根植于运行机制(解释器vsJIT)、类型模型(鸭子类型vs契约先行)与生态定位(轻量敏捷vs稳健可控)。在微服务架构、AI中台、金融核心等真实场景中,技术价值体现在开发效率、运行时确定性、运维可观测性及团队适配成本。本文基于2020年典型工程切片,解析

weixin_33700350的博客 315

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

5分钟掌握密码安全:zxcvbn密码强度评估终极指南

在数字世界中,你的密码安全吗?还是仅仅满足"必须包含大小写字母、数字和特殊符号"的刻板要求?今天,让我们一起探索一个能真正保护你数字资产的智能工具——zxcvbn密码强度评估器。这个由Dropbox团队开发的开源项目,正在重新定义密码安全评估的标准。 ## 核心理念:从规则到智能评估的转变 你是否曾因为系统要求"必须包含特殊字符"而将"password"改为"P@ssw0rd",并自以为很安全

gitblog_00431的博客 91

Python重试机制实战:Tenacity构建高韧性服务

重试机制是分布式系统弹性的基础能力,其本质是面向失败设计的状态机决策过程,而非简单的循环重试。它基于错误语义分类(如ConnectionError、429、503等)动态选择指数退避、固定间隔或随机等待策略,并通过可组合的布尔逻辑(与/或/非)表达复杂重试条件。Tenacity库将这一能力工程化为可配置、可观测、可测试的标准化组件,天然支持asyncio异步场景,无缝集成Prometheus监控与OpenTelemetry链路追踪,显著提升微服务调用成功率与SLO达成率。本文聚焦Python生态下生产级重试

weixin_33714884的博客 462

模板驱动文档自动化:零代码实现业务人员自助生成

模板驱动文档自动化是一种将内容与格式物理分离的文档生成范式,其核心原理是通过预定义结构化模板与动态占位符(如{{client_name}})实现数据与样式的解耦。相比AI生成的不可预测性或代码定制的高维护成本,该技术以可验证、易协作、低学习门槛为显著优势,具备强确定性与企业级稳定性。技术价值体现在大幅降低重复性文档工作出错率、缩短交付周期,并让市场、销售、HR等非技术人员获得自主生成能力。典型应用场景包括合同生成、财务对账单、客户反馈报告、Offer函等结构化高频文档。本文聚焦Sqribble平台实践,深入

weixin_34269583的博客 566

zxcvbn密码强度评估工具:如何快速提升密码安全性的完整指南

在数字时代,密码安全是保护个人信息的第一道防线。你是否曾经为了创建符合复杂规则的密码而烦恼?或者担心自己的密码容易被破解?zxcvbn密码强度评估工具正是为解决这些问题而生!作为Dropbox开发的智能密码评估库,zxcvbn采用创新的算法思维,通过模拟黑客破解思路来评估密码安全性,让密码创建既安全又简单。 ## 为什么传统密码策略已经过时? 传统的密码策略通常要求用户创建包含大小写字母、数字

gitblog_01040的博客 108
上一篇: 开发必学的验证码,教你用Python从零写一个验证码!
下一篇: 从0到1教你用Python来爬取整站天气网!
普通网友
博客等级 码龄7年 438粉丝 263原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值