维护任何应用程序、框架或系统的一个重要部分是处理历史代码。...无论一个系统的架构有多好,历史遗留问题总是会随着时间的推移而被建立起来——这可能是因为底层SDK的变化,因为功能集的扩展,或者仅仅是因为团队中没有人真正知道某个特定部分是如何工作的。...选择你的目标 我们要做的第一件事是选择我们应用程序中需要重构的部分。它可以是一个经常导致问题和bug的子系统,它也许使实现新功能比正常情况下更难,或者是团队中大多数人都不敢碰的东西,因为它太复杂了。...最后,我们可以从我们的项目中删除LegacyDatabase——我们已经成功地用一个闪亮的新类取代了一个历史遗留类——所有这些对我们应用程序的其他部分的影响和风险都是最小的。...你最喜欢的重构技术是什么,你觉得用这种方式替换历史遗留代码有用吗?
DevOps 将发布所需的所有技能带入了一个团队,这减轻了开发人员的一些认知负担,他们不再需要——过多地——担心代码之上的安全性、支持和成本,因为他们团队中的运维工程师已经涵盖了。...但是,Bangser 继续说道,这也导致了大型组织的大量重复工作,在这些组织中,DevOps 团队并没有 100% 专注于为最终用户创造价值,因为他们仍然关心基础架构、扩展和安全性。...“所以你有一个团队来生产和操作工具来帮助其他团队为他们的最终用户生产和操作他们的软件应用程序,”Bangser 说,提供了平台工程的最新定义。...主要是应用程序开发人员,但也不要忘记可能需要硬件或其他不同功能的数据科学家和机器学习工程师。她还观察到,在平台设计中需要考虑领导和治理社区——包括监管和金融。...这些边界可能因利益相关者而异,但请记住记录这些差异,包括: 平台是做什么的? 平台团队负责什么? 应用程序团队负责什么?
接着,Desai 发现了一个有趣的现象,即与运行 CUDA 图形或自定义内核相比,Pytorch Eager 模式会导致更响的 GPU 线圈噪音 ——Desai 表示甚至能听到代码运行的声音!...Desai 推测这可能是因为 Eager 模式在内核启动之间有更长的延迟,导致 GPU 核心负载的变化更大,从而在 GPU 的电感器中产生更强的磁场振荡。...为了测试这一点,Desai 编写了一个内核,该内核可以从全局内存中执行大量加载,这是一项非常耗能的操作,并改变内核启动之间的持续时间,Desai 发现确实可以通过这种方式控制线圈噪音!...SRAM 单元由 6 - 晶体管触发器电路组成,并且由于这里涉及到的唯一电容是晶体管栅极,因此访问数据的速度变快了很多。 但是,SRAM 也有缺点,它的芯片面积和制造复杂性导致了更高的成本。...80-90% 的内存带宽,而你原本可能会天真地认为这些内核应该接近 100%,而且这个问题的复杂性非常深。
上篇文章(【i.MX6ULL】驱动开发4--点亮LED(寄存器版))介绍了在驱动程序中,直接操作寄存器了点亮LED。...本篇,介绍另外一种点亮LED的方式——设备树,该方式的本质也是操作寄存器,只是寄存器的相关信息放在了设备树中,配置寄存器时需要使用OF函数从设备树中读取处寄存器数据后再进行配置。...对应ARM-Linux开发,这些板级描述文件存放在linux内核的/arch/arm/plat-xxx和/arch/arm/mach-xxx中。...LED是应用程序不需要修改,仍使用上一篇文章中的程序即可。...测试方法与之前基本相同: 使用设备树的方式,再次点亮LED: 5 总结 本篇介绍了设备树的基本原理以及设备树的使用方法,在上一篇点亮LED的代码基础上,通过设备树的方式,实现了LED点灯,总结一下主要的修改就是先在设备树中添加
但切记搜索框的设计必须与你的网站或应用程序的主题相吻合,并同时确保它足够引人注目。 Youtube新的(令人惊叹的)黑色主题通过保持搜索模式与其他元素的一致性就完美地阐述了这一点。...3.透明占位符 为输入的占位符文本使用适当的副本很重要,它们通常是暗示用户可以搜索的内容。 这确保了他们知道要搜索什么,并且不会因编写错误导致查询失败而感到沮丧。...因此,尽量保持用于占位符文本的副本简短而直接。使用较长的提示会增加用户的认知负荷,从而损害用户体验。你可以在这里了解更多有关有害标签和占位符的信息。 在某些项目中可能需要设计一个更具体的搜索功能。...在这里,自动提示就可以派上用场了。 采用自动提示的目的不是为了使搜索速度更快,而是在用户查询构建中提供一点帮助。 你可以通过执行预测的搜索模式来实现这一点。例如用户想问这个可怕的词是什么?...搜索是一个不断发展的模式,我知道这篇文章没有涵盖所有现有的指导方针。了解这一点,我希望这篇文章能够帮助到你们当中的一些初学者,甚至UX和UI设计的老手。
与此同时,在现实世界中,我们往往在数据与我们的直觉相冲突之前才以数据为导向,研究已经揭示了这一点很多年。...上周 Jan Lieke 辞去了 OpenAI 的工作,原因之一是他担心“安全文化和流程在 OpenAI 中已经让位于闪亮的产品”,即使风险迫在眉睫。...这可能也是 Mims 第一个观点背后的一个关键因素:颠覆被高估了。...的终结,但只要应用程序在该代码上运行,就会有人受雇维护该系统——永远。 考虑到 AWS 现在是一项年收入 1000 亿美元的业务,但在整个 IT 市场中仍然是一个舍入误差。...云计算代表着数亿美元的 IT 支出,但绝大多数企业 IT 美元服务于内部工作负载。这种情况正在改变,但很缓慢。为什么?因为人们实施了这些内部应用程序,并将继续维护它们很多年。
软件世界前进的改革步伐是无情的。我们的周围充斥着各种所谓闪亮和新的东西,其概念本身开始瓦解,一遍一遍又一遍地重复这些陈词滥调,直到它们成为无意义的名词。“闪亮”和“新颖”最终成为平凡,甚至是司空见惯。...亚精英(高级)开发人员跟随精英开发人员的脚步,也来学习新语言,开辟了书籍、培训等的市场,同时也加速了语言的开发和测试。...Andy Hunt和Dave Thomas的看法是,Pragmatic Programmers(实用型程序员)是Ruby中最后一波改变的重要组成部分,这在一份2004年的IEEE column中说得非常详细...追逐技术的前沿,还不如专注于[用COBOL]为自己或客户建立一个有效的系统。不但易于使用,还易于理解和快速部署。框架使用多种技术的混合:用于建模的技术,用于代码生成的技术,还有一些可重用的组件,等等。...不要在不知不觉中让追求新的、闪亮的东西成为你的目标。不要成为喜鹊开发人员。有选择性地追求闪亮和新颖的东西,有助于你成为一个更好的开发人员。
回退 当连接到外部系统时,我们通常不会考虑如果远程系统停机我们应该支持什么回退操作,我们倾向于乐观并假设,在99%的情况下,这个系统将在没有任何错误的情况下做出响应并且响应速度非常快。...一些更成熟的开发人员将处理大多数可预测的错误,记录它们并可能通知用户操作失败。如果我们开始使用Hystrix会有什么变化?...当然,我们会鼓励(或者甚至强迫)我们考虑在出现错误时应该做些什么,因为Hystrix的基本配置包括为指定的业务操作定义了回退。 让我们假设我们正在设计一种管理我们书籍的服务。...在发送电子邮件之前,用户填写的表单将有一个等待显示正在进行的操作。 如果SMTP服务器开始响应非常慢,会发生什么?当花费太长等待时间,用户会尝试再次执行它。...线程池分离 外部系统慢还导致一个问题 - 线程池会用光,当越来越多的线程执行远程调用并且它们永远留在那里无法收回到线程池时会发生什么?当然我们所有的线程都挂在这个调用上,我们正在消耗越来越多的线程。
应用程序性能中的问题最常见于应用程序代码或基础架构服务。...在代码错误之外,性能问题始终源自应用程序与外部系统接口这一点。容器,虚拟机,存储或网络. 数字服务现在必须在非常复杂的基础设施中进行大规模和高速度的转变,这些基础设施可以包括混合云和软件定义的网络。...由于基于微服务的应用架构变得更加常见, 应用程序的依赖性变得更加分散和动态。如果车轮上的单个齿轮失效,整个系统可能停止工作,导致减速(性能下降),用户体验受挫和收入损失。...影响这些应用程序性能的主要因素之一是他们必须连接的大量第三方。事实上,第三方组件占应用程序体验的2/3. 随着第三方增加, 复杂性和错误风险增加,可用性差和响应时间慢。...如果用户和服务器之间的延迟较高,最成熟的应用程序都将非常慢。最烂的应用程序都可以在一切都是本地的时候获得各种赞誉。我认为低延迟是IT经理在其网络上可以拥有的最重要的资产。
这样,我们就不再依赖人类对我们的代码进行手动测试;取而代之的是,我们设置了在引入的每一个微小变化上运行的自动化测试。 通过增加测试频率和测试数量,我们减少了将错误引入生产系统的机会。...它还为我们的系统和流程提供了更多信心,消除了人为错误和沟通不畅,并提高了团队的绩效。 6. 在开发生命周期的早期加入安全性 安全性不应该是集成到软件开发中的最后一件事。...在基础设施领域,即使是最微小的错误也可能导致严重中断。...在寻求采用 DevOps 实践的过程中,人们误解了他们的范围并犯了导致常见反模式的错误。让我们看看公司在实施 DevOps 原则时面临的一些常见挑战、陷阱和误解。 1....这可能是由于积累的知识、更高水平的经验或一个人增加的努力。当这种模式出现时,它可能会迅速导致 DevOps 英雄反模式,在这种模式中,特定的团队成员对团队来说变得不可或缺。
本文将深入探讨这两种垃圾回收类型,提供代码示例,帮助您更好地理解它们。 什么是垃圾回收? 垃圾回收是一种自动管理内存的技术,它追踪和释放不再被程序使用的内存对象。...在不使用垃圾回收的情况下,程序员需要手动分配和释放内存,这容易导致内存泄漏和程序错误。垃圾回收器负责在程序运行时识别和回收不再需要的对象,以便将内存用于其他目的。...老年代存放的是生命周期较长的对象。 Full GC通常比Minor GC慢,因为它需要检查整个堆内存,包括大量对象。这个过程可能会导致应用程序的停顿,因此需要谨慎使用。...在实际应用程序中,垃圾回收的性能和效率非常重要。合理的内存管理和垃圾回收策略可以显著提高应用程序的性能和稳定性。因此,程序员需要深入了解 垃圾回收的工作原理,以便根据应用程序的需求进行优化和调整。...希望本文能够帮助您更好地理解Minor GC和Full GC的概念,并为您在实际编程中更好地利用垃圾回收提供了一些启发。
而且,有了这个原则,你的发布也会更流畅。 原则 8: 我们都喜欢闪亮的设计,但是不要将您永远不需要的特性和解决方案引入到架构中。 可选的原则 原则 9: 要完全考虑用户将如何使用我们的产品是不可能的。...如果你这样做了,系统就会像骡子一样慢。 分布式系统 原则 16:状态系统是可扩展的和直接的。尽可能了解和使用无共享架构。...严格执行这一点可能是错误的,有时我们发现我们添加的特性根本没用,然后所有额外的工作都白白地浪费掉了。最后,如果这导致了多个团队之间的协商,那么这个特性可能永远无法完成。...现在回过头来看,当我试图消除复制导致的显著复杂性时,我愿意忍受重复。治愈可能比疾病更糟糕。 结论 作为架构师,一个人应该像一个园丁一样思考,他塑造、管理和清除杂草,而不是定义和建造。...虽然在短期内支配体系结构可能更便宜、更容易,但从长期来看,指导和让团队找到他们的方法是有好处的。 如果你不小心,那么你就更容易从架构出发,因为设计师只告诉你他的架构是错误的,而不告诉你为什么是错误的。
没有可靠基准的情况下尝试不同的优化方法很可能导致时间的浪费和不成熟的优化。无用的优化可能使代码更糟,更不易懂,甚至更慢。有用的优化必须至少让程序加速5%。...应该手工重复测试,以得到稳定的结果。 优化是非常花时间的,所以最好能专注那些耗费最多CPU的函数。为了找到这些函数,Python提供了cProfile和用来记录每个函数时间消耗的profile模块。...也有一些用来优化Python的非常手段,但是应该避免使用它们,因为这一点点的速度提升会丧失代码的可读性。 Python之禅(PEP 20)说:“应该有一种—最好只有一种—显而易见的方式去实现。”...另一个稍微复杂的方式是编写异步代码。Twisted、Tornado和Tulip都是利用了这一技术的面向网络的库。 你见过最多的导致性能差的“错误”是什么?...没有很好地理解Python就可能写出效率低的代码。例如,我见过在不需要复制时错误地使用了copy.deepcopy()。 另一个性能杀手是低效的数据结构。
这种错误的产生有两种可能 1、前端代码写的文案错误 2、接口返回值错误 功能错误 功能错误是在测试过程中最常见的类型之一,也就是产品的功能没有实现。比如图中的公众号登录不成功的问题。...界面展示错乱 产品界面上的元素展示重叠(如下图),这类型的错误一般是前端代码问题。 界面展示后台信息 前端页面展示了不应该出现的后端日志信息(如下图),这类的错误一般是由于后端服务错误导致。...产生崩溃的原因有很多,有可能是代码中存在多余空格、开发人员对该段代码的处理欠佳,未做异常处理等等。...这些异常在最坏的情况下,不仅影响本 app 的使用也可能会导致系统故障,操作系统崩溃,整个 app 无法再继续使用。 这一类的问题会导致客户体验非常差,影响产品的口碑。...太耗电和流量 在使用应用的过程中,点击某一个事件进入的页面出现白屏的闪动等
解决 Ruby 代码中的性能问题轻而易举:只需增加更多服务器。然而,解决数据库性能问题就没那么容易了,因为扩大关系数据库规模困难重重,甚至有时不可能。...这对所有软件都是如此,但 Ruby 放大了这一点。Rails 的 163500 行 Ruby 代码当然无助于加快速度。 “代码行” 并非性能指标,但它们是一种指示。...我们没有看到这一点,因为在开发和测试中,性能从未下降。但我们应该注意到的是,这种错误在代码库中比比皆是。...这些项目之所以继续运行,唯一的原因是 Heroku 服务器的巨大成本(1200 美元 / 月),能为数百访问者提供服务一天。这样的错误不会导致数据库集群崩溃,而是逐渐累积成昂贵且性能糟糕的应用程序。...未优化的连接。添加简单的 has_many 太容易了,这使得开发人员可以在数据库中启动过于繁重的查询。一旦通过应用程序引入和传播,这几乎不可能解决。
本文将着重于在Firefox的开发工具中调试JavaScript代码。Firefox中的开发工具是一个非常强大的工具,可以加速您的bug查找和修复过程! 我们将要采取的步骤如下: 1、示例项目介绍。...步骤2、分析Raygun错误报告 进入Raygun的错误报告有很多信息可以用来查找和修复错误,让我们看看我们正在处理什么。 ? 调试错误所需的信息位于堆栈跟踪模块中。...堆栈跟踪的消息部分是错误的简要概述。在本例中,对未定义的值调用toUpperCase方法。 堆栈跟踪告诉您错误发生的位置和导致错误的函数调用序列。...现在,您可以使用“Step In”按钮移动到对capitalizeString函数的调用中。 ? 导航调用堆栈 当您像这样浏览代码时,您可能想要跳转回父函数,以检查此时发生了什么。...既然已经导航到错误发生的位置,我们需要检查应用程序的状态并找出导致错误的原因。 在代码继续之前,有很多选项可以用来确定变量包含的值和表达式的值。我们将依次研究每一个。
[850269ad71a52d7b9ce0cc6df0d6b3ccf4d779fc.png] 界面展示后台信息 前端页面展示了不应该出现的后端日志信息(如下图),这类的错误一般是由于后端服务错误导致。...产生崩溃的原因有很多,有可能是代码中存在多余空格、开发人员对该段代码的处理欠佳,未做异常处理等等。...这些异常在最坏的情况下,不仅影响本 app 的使用也可能会导致系统故障,操作系统崩溃,整个 app 无法再继续使用。 这一类的问题会导致客户体验非常差,影响产品的口碑。...性能Bug 加载速度慢 应用程序第一次启动速度慢 进入到某一个界面加载速度慢 启动某一个有动画效果的界面,动画执行过程加载速度慢并且有卡顿 响应某一个用户事件时,长时间无响应(ANR) 其他 太占用手机内存...太耗电和流量 在使用应用的过程中,点击某一个事件进入的页面出现白屏的闪动等
但是,当 API 速度慢、返回错误或不可用时会发生什么?你最不想看到的就是当你的应用程序坏了时,一个愤怒的客户给你打电话。但是,当你不控制集成的 API 时,很难模拟你的应用将如何处理这些场景。...假设您正在构建一个连接到 API 以获取产品的应用程序。您还可以与外部服务集成以获取其他产品信息。在开发中,你使用这两个 API 的开发版本,只有你和团队中的其他几个开发人员使用。...你能预料到这一点吗?您能否以不同的方式构建应用来处理这种情况? 模拟 API 错误和行为(如速率限制或限制)并非不可能,但很难。...,我们将使用默认的 Dev Proxy 配置,该配置模拟了几个常见的 API 错误,以及延迟和限制。...虽然该应用程序内置了弹性功能,但它还是并行发出多个请求,这使得它看起来不遵循后退并导致 Dev Proxy 使请求失败。在几次尝试调用 API 失败后,应用放弃并在浏览器中显示原始堆栈跟踪。
本系列文章重点阐述了当应用程序不能应用于WebRTC补丁程序以及通信和安全问题通知中断时可能出问题的方面。...相反,我使用符号编译了适用于Android的WebRTC,并将其加载到IDA中。然后,我浏览了可用的对象类型,以查看是否存在明显可用于移动指令指针或改善错误功能的东西。结果,我什么都没找到。...我不确定现在要进行什么操作,所以我在Android上触发了数十次CVE-2020-6389,以查看是否存在超过16位宽的地址崩溃,希望它们能为我提供一些方法在除了覆盖无效的16位值的指针之外,此错误可能会影响代码的行为...通过使用TCP服务器使连接非常慢,可以增加堆上这些对象的数量和发送它们之前的时间量,但即使这样,我也只能在不到10%的时间内命中结构。...我最终放弃了这种方法,因为我认为我可能既无法做到足够可靠,也无法通过合理的努力将其用于BUG利用程序中。同样地,被攻击的应用程序的崩溃行为也很重要。
此外,根据这一原则,您的版本将更加顺畅。 原则8:留意“谷歌嫉妒”。我们都喜欢闪亮的设计。您可以轻松地将功能和解决方案引入您永远不需要的架构中。...调试时,无提示配置错误是许多丢失时间的来源。 难题 原则29:梦想新语言很容易,但要做到正确是非常困难的。除非团队可以花费至少十个人年,否则尽量不要这样做。...严格执行这一点可能是一个错误,特别是在新功能的初始状态,其中简单的功能可以级联到大的变化,因为我们试图使一切正交。有时我们发现我们添加的功能毕竟没用,然后所有额外的工作都没有用。...最后,如果这导致多个团队之间的协商,该功能可能永远不会完成。 事后来看,现在我愿意在尝试删除它时带来重复,导致重大的复杂性。治愈可能比疾病更糟。...虽然短期内可能会更便宜,更容易决定架构,但从长远来看,指导并让团队找到自己的方式会带来好处。 如果你不小心,建筑飞行更容易,设计师只告诉他的架构是错误的,但不是为什么它是错的。
领取专属 10元无门槛券
手把手带您无忧上云