Performance 编写傻瓜式应用程序与编写性能应用程序

Performance 编写傻瓜式应用程序与编写性能应用程序,performance,Performance,我倾向于编写傻瓜式的应用程序。例如,对于PHP站点,我使用JS验证客户端的所有输入。在服务器端,我再次验证。在这两个方面,我都对空白和其他模式(电子邮件、电话、url、号码等)进行验证,然后剥离恶意标记或字符,在服务器端对其进行修剪。之后,我将输入转换为所需的格式/数据类型string、int、float等。如果库仅用于服务器端,我甚至会给开发人员提供优雅降级的机会,并允许最差的输入,并将其标准化为我预定义的可接受的输入集 现在我正在读一年半前我写的图书馆。我想知道开发人员是否如此邪恶或缺乏智商

我倾向于编写傻瓜式的应用程序。例如,对于PHP站点,我使用JS验证客户端的所有输入。在服务器端,我再次验证。在这两个方面,我都对空白和其他模式(电子邮件、电话、url、号码等)进行验证,然后剥离恶意标记或字符,在服务器端对其进行修剪。之后,我将输入转换为所需的格式/数据类型string、int、float等。如果库仅用于服务器端,我甚至会给开发人员提供优雅降级的机会,并允许最差的输入,并将其标准化为我预定义的可接受的输入集


现在我正在读一年半前我写的图书馆。我想知道开发人员是否如此邪恶或缺乏智商,对我来说,他们做了这么多优雅的降格,找到一切可能的机会让这些家伙变得正确,甚至他们提供了糟糕的输入,这严重损害了性能。或者我应该做最少的检查,期望开发人员能够并且愿意提供适当的输入?我对最终用户没有希望,但我是否应该更加信任开发人员,让他们的应用程序/库具有更好的性能?

常见的策略是在服务器上验证从客户端发送的任何内容,因为您不能完全确定发送它的真的是您的客户端。你不想更信任开发者,在这个过程中,你会发现你更信任你网站的黑客


自动修复无效输入可能是一种诅咒,也可能是一种祝福-您基本上已经承诺接受无效输入作为协议的有效部分,即,在未来版本中,如果您做出的更改将破坏您正在纠正的无效输入,它不再向后兼容已编写的客户端代码。在极端情况下,你可能会这样把自己画到一个角落里。此外,无效调用往往会传播到新代码中——人们通常复制并粘贴示例代码,然后修改它以满足他们的需要。如果他们复制了您在服务器上纠正的错误代码,您可能会发现您收到的错误数据越来越多,并且会让新程序员感到困惑,他们认为这看起来不应该是正确的,但这是每个人都在使用的示例—也许我根本不明白这一点。

常见的策略是在服务器上验证从客户端发送的任何内容,因为您不能完全确定发送它的确实是您的客户端。你不想更信任开发者,在这个过程中,你会发现你更信任你网站的黑客


自动修复无效输入可能是一种诅咒,也可能是一种祝福-您基本上已经承诺接受无效输入作为协议的有效部分,即,在未来版本中,如果您做出的更改将破坏您正在纠正的无效输入,它不再向后兼容已编写的客户端代码。在极端情况下,你可能会这样把自己画到一个角落里。此外,无效调用往往会传播到新代码中——人们通常复制并粘贴示例代码,然后修改它以满足他们的需要。如果他们复制了您在服务器上纠正的错误代码,您可能会发现您收到的错误数据越来越多,并且会让新程序员感到困惑,他们认为这看起来不应该是正确的,但这正是每个人都在使用的例子——也许我根本不明白这一点。

永远不要指望开发人员的勤奋。如果可以的话,请始终验证代码中的任何输入,特别是当它通过网络时。

永远不要期望开发人员的努力。如果可以,请始终验证代码中的任何输入,尤其是通过网络输入的输入。

最终用户无论是使用您的工具的程序员还是使用您的应用程序的非程序员,都不必愚蠢或邪恶地输入错误的内容。作为程序员,我们经常对他们显而易见的事情做出错误的假设

这是第一件事,它本身就证明了全面验证的合理性。但是验证并不等同于从他们输入的内容中猜出他们的意思,从错误的输入中推断出正确的输入——除非推理规则也为用户所熟知,比如Word的自动更正

但你追求的是什么样的表现?没有任何客户端或服务器端验证需要比第二次运行更长的时间,这是一个可接受的响应时间


验证,并确保它不会作为首要任务中断。然后担心它是否足够聪明,以可靠地知道它们的意思。在那之后,担心它有多快。在现实世界中,语法验证不会对用户输入占用大部分时间的任何事情产生可测量的影响。

最终用户,无论他们是使用您的工具的程序员,还是使用您的工具的非程序员 你的应用程序不一定是愚蠢或邪恶的输入错误的东西。作为程序员,我们经常对他们显而易见的事情做出错误的假设

这是第一件事,它本身就证明了全面验证的合理性。但是验证并不等同于从他们输入的内容中猜出他们的意思,从错误的输入中推断出正确的输入——除非推理规则也为用户所熟知,比如Word的自动更正

但你追求的是什么样的表现?没有任何客户端或服务器端验证需要比第二次运行更长的时间,这是一个可接受的响应时间


验证,并确保它不会作为首要任务中断。然后担心它是否足够聪明,以可靠地知道它们的意思。在那之后,担心它有多快。在现实世界中,语法验证对于用户输入占用大部分时间的任何事情都不会产生可测量的影响。

早在Windows 3.1和Windows 95时代,Microsoft就犯了一个错误,相信程序员做正确的事。你只需要一个来自雷蒙德·陈(Raymond Chen)的建议,就可以看到这条路最终走向何方


顺便说一句,这不是对微软的挖苦——这是一个关于程序员如何故意或出于无知滥用更自由的Win16的事实声明。

早在Windows 3.1时代,微软就犯了一个错误,相信程序员会做正确的事情,而在Windows 95的程度上则更低。你只需要一个来自雷蒙德·陈(Raymond Chen)的建议,就可以看到这条路最终走向何方


顺便说一句,这不是对微软的挖苦——这是一个关于程序员如何故意或出于无知滥用更自由的Win16的事实声明。我认为你对防傻瓜应用程序的偏见是正确的。我不认为这会使性能下降到令人担忧的程度。相反,我会单独解决性能问题,从分析或我最喜欢的方法开始。必须有一种方法可以在PHP中实现这些功能。

我认为您偏向于傻瓜式应用程序是正确的。我不认为这会使性能下降到令人担忧的程度。相反,我会单独解决性能问题,从分析或我最喜欢的方法开始。一定有办法在PHP中获取这些信息。

除了这一条,我真的没有什么意见:无论你选择哪一条,都要记录下来。谢谢迈克。你能给出更多的理由或详细说明吗?谢谢。万无一失+性能?越南:听起来你是在为第三方开发者编写库,但听起来它也是一个公共终端用户系统,我有点困惑。不管怎样,在我看来,没有取舍;使API的句柄输入正确无上下文转义或安全问题是正确性的一部分;没有其他的方法可以考虑这样做。提出一个基于客户/用户的需求列表,将这些需求视为一个高层次的规范,并将其编码为规格。这包括使用场景、PERP需求、可靠性要求、可用性要求。等等。当你没有目标时,很难确定目标或知道何时达到目标:对于你编写的每一个软件来说,这都是不同的,除非你可以重用你以前制作的模型,例如,你的受众/市场是相同的。一旦你有了这个文档,就要努力确保它的正确性和可维护性,直到它打破你的性能要求。除了这一点,我真的没有什么意见:无论你选择哪一个,都要记录下来。谢谢迈克。你能给出更多的理由或详细说明吗?谢谢。万无一失+性能?越南:听起来你是在为第三方开发者编写库,但听起来它也是一个公共终端用户系统,我有点困惑。不管怎样,在我看来,没有取舍;使API的句柄输入正确无上下文转义或安全问题是正确性的一部分;没有其他的方法可以考虑这样做。提出一个基于客户/用户的需求列表,将这些需求视为一个高层次的规范,并将其编码为规格。这包括使用场景、PERP需求、可靠性要求、可用性要求。等等。当你没有目标时,很难确定目标或知道何时达到目标:对于你编写的每一个软件来说,这都是不同的,除非你可以重用你以前制作的模型,例如,你的受众/市场是相同的。一旦你有了这个文档,就要努力保持正确性和可维护性,直到它打破你的性能要求。自动修复无效输入的+1可能是祸福一样多。自动修复无效输入的+1可能是祸福一样多。