急刹车的两个速度

ABS

现在的汽车通常配备了自动防抱死系统(ABS),当司机猛踩刹车的时候,刹车卡钳会紧紧刹住轮子,出现抱死的情况,也就是轮胎不转圈了。此时,如果车子速度较快,就会出现甩尾、侧滑等现象,导致汽车失控。而ABS的出现,就是为了解决这个问题。

当轮胎快抱死的时候,ABS会让刹车踏板给司机的脚一个反向的力,此时司机能感觉到脚要被弹起来了,且仪表盘出现“ABS”点亮的提示。通常,司机猛踩刹车,是因为遇到了紧急情况,所以,司机在受到这个反向的力时,可以继续保持踩下去的力。

当抱死现象消失时,这种反弹的力自然消失,仪表盘恢复到原来的状态。

轨迹

有时候我们在路面会看到黑色的轮胎痕迹,这是如何产生的呢?特别地,在配备了ABS的汽车上,为什么还会有这种情况出现呢?

关于速度,可以从两方面考虑:

因为有了卡钳的介入,导致轮胎转动速度发生变化,这里面有个临界值。我们可以定性地从以下两种极端情况考虑:

由于车身与轮胎的速度差,并且二者始终在一起(指汽车没有解体),那么,这个速度差就必须在某个地方体现出来!急刹车时的轮胎,受到的两个力是需要关注的:

代码可视化的自动化之路

你知道,当你忙于一个复杂算法时,不得不返工一百万次,因为你没有正确地掌握细节?或者在你读某人的代码时,你不能确定它在做什么?此时,我们希望拥有代码可视化(code visualization)工具,因为这会让编程生活如此简化。

本文,我将讨论一些现有的用于代码可视化的工具及其缺点,然后尽量总结它们背后的想法。为了创造得体的代码可视化工具、以及如何达到这个程度,接着我会分享必备条件,我将给出应该采取的最初几步。

工具

有很多不同的、显示代码可视化有用的情况。理解复杂的算法、理解其他人的函数,或在一个总体的不同范围下,理解一个新的代码库、或类、或函数集合。对于某些情况,可视化已经存在了。对于项目或代码级别的范围,有UML,各种图表。在算法的范围,有些网站企图可视化一部分最通用的算法。这些工具是伟大的,但是它们有一个大问题,使用它们要花费很长时间。在严峻的时间下,我们只有两周来开发下一个Facebook,你没有时间画复杂的UML图。第二个问题,即使通用算法可能有可视化了,而自定义算法可能从来不会有。

也有一些工具和编程语言采用了不同的方式,你编程一部分,很快就能看到交互、或至少你正在做的可视化的结果。我在讨论dat.GUI,你知道的,你在很多demo里看到过黑色和彩色控制面板吗?你能够看到我的优雅的文本生成器示例(不要在较慢的设备上打开)。另一个例子是Gooey,把Python命令行程序自动生成GUI,无需从技术上理解的、用户友好性。我过去在讨论的一种编程语言是JavaScript,从JavaScript刚刚出现的时候,它就与一种名叫HTML的接口结合在一起了。

允许你可视化代码(非自动地)的第一套工具,允许你把现有代码/配置转化成接口(自动地)的第二套工具。问题在于,我们是否能够自动产生接口,包括输入和输出。可视化只是输出。那么,我们为什么没有尽量可视化代码以使其易于理解的工具?听说过一个对象图表吗?它们是可视化了当前程序或程序子集的状态的图表。具有三种“水果”类型的对象的列表看起来是这样的:

Tekening-zonder-titel-300x155

如果能够使用这样的可视化来调试,是不是很好呀?

我对接口的定义是,它有输入、输出或二者都有,几乎任何东西都能用一到两种方式定义为接口,石头、键盘、乐器、人类……

实际上所有这些工具在做的,都是把一个想法、用代码或图表表达的想法,转化成一个或多个不同种类的接口。编程语言把想法(以文本形式)转化成不同的接口,可以是HMTL、可以是传统的GUI、命令行应用程序或app。UML把想法转化成优雅的可视化概括。dat.GUI用HTML把配置代码转化成清晰的配置GUI。Gooey把命令行程序转化成传统的GUI。

它们都使用一个接口,然后转化成一个或多个不同的接口。我乐于给出更多的例子,只是本文篇幅会过长。如果你对有趣的接口转化的更多例子感兴趣,看看

不只是写代码

很多开发人员普遍犯有一个错误,认为他们的工作就是写代码。这不是一个开发人员要做的事情。

一个开发人员的工作是解决问题。

解决问题的一部分过程通常涉及到写代码,但是这部分工作是非常非常小的。开发有用的东西才花更多时间。

明白如何迭代开发,随着对问题有更好的理解,你才能给难题增加一些小功能,因为从头开发完美的产品是不可能的。不用写代码就能验证功能,因为很明显,写代码是相当昂贵的。

用于测试、评测和抛弃想法的系统也是极其重要的,因为要是没有它,整个开发组将耗费越来越多的精力,还有用来帮助他们执行得更有效率的、有用想法的精神负担。

我可以继续,只是你要明白。

这些因素和写代码没有多少关系,不过它们是开发一款成功产品的、某些最重要的组成部分。还有,太多开发人员更关注能够凭记忆开发二叉树查找的、具有理想的、时间复杂度的解决方案。

这没错,只是不重要。我在软件行业工作15年了,就个人而言,我需要认真地遵循《计算机编程设计艺术》开发零次。【注1】

不要误解我——算法和数据结构是重要的。但是如果没人使用,世界上最完美、正确的软件也是徒费人力。掌握解决问题的艺术,学会迭代开发,成为协作开发的专家,然后为写出更好的代码而担忧。

因为不仅仅是写代码。