是否因为它们都是用托管的垃圾收集语言而不是本机代码编写的?
不可以。慢速代码无论如何都会表现不佳。当然,一种特定的语言可能会在解决其他问题的同时引入某些问题。但是优秀的程序员在有足够的时间就可以找到解决方法。
是为这些设备编写软件的个人程序员吗?
部分地。在许多情况下,至少很有可能是一个促成因素。这是一个行业的不幸的副作用,在这个行业中,好的程序员需求旺盛,供应短缺。同样,各种技术能力水平之间的鸿沟也可能很大。因此,有理由说,有时为完成某些软件而工作的程序员可能会受到祝贺。
在所有这些情况下,应用程序开发人员都确切知道他们所针对的硬件平台以及其功能是什么。他们没有考虑到这一点吗?
部分地。首先,可能不知道确切的硬件平台,因为通常在软件开发过程中会与各个制造商并行协商。实际上,初始发行后甚至可能对基础硬件进行很小的更改(但不一定是无关紧要的)。但是,我同意将了解常规功能。
问题的一部分是软件可能不是在硬件上开发的,而是在模拟器中完成的。即使仿真器是100%准确的,这也很难考虑真实的设备性能,而事实并非如此。
当然,这并不能证明在发布之前没有在适当的原型硬件上进行足够的测试。怪罪可能不在dev / qa控制范围之内。
难道是那个反复说“优化是万恶之源”的家伙,他使他们误入歧途了吗?
不,我可以肯定他们不会听他的话。否则,他不会经常被错误引用(这应该是“ 过早的优化...”)。:-D
关于优化,太多的程序员可能会选择两个极端之一。
- 他们要么完全忽略它。
- 否则他们会沉迷于与实际性能要求无关的细节。最终结果是预算用完了,代码过于混乱,无法安全地优化实际性能问题。
直到所有这些毫秒数累加起来才是每次都会“额外增加100毫秒”的心态吗?
可能吧 显然,如果Sleep(100)
已将其用作与减缓肢体出血有关的面巾纸的等效物,那么将会出现问题。但是,我怀疑这个问题比这更棘手。
问题是现代计算硬件(包括嵌入式设备)的速度要比人们认为的要快得多。大多数人,甚至是“经验丰富”的程序员也无法理解计算机的速度。100ms是很长的时间- 很长的时间。碰巧的是,这种“很长的时间”削减了两种方式:
- 首先是程序员不必担心计算机的运行速度非常快。(碰巧的是,这样的担忧“ 每秒增加300次值 ”才使我首先来到这里。)
- 第二个问题是,当事情确实花费很长时间时(在计算时间尺度上),它们有时无法表现出应有的关注。所以:
- 通过网络或与存储设备进行通信时是否忽略了延迟的影响;
- 如果他们忽略线程阻塞并等待另一个线程的影响;
- 如果他们忘记了由于计算机运行速度如此之快,它能够重复执行任务的次数远远超过了应有的次数,而开发人员却没有意识到问题
- ...如果发生这种疏忽的任何组合,则例程将意外地非常缓慢地运行(在计算时间范围内)。重复几次,甚至会被人类注意到-但是固定下来可能很棘手,因为成百上千个相互关联的事物都是自己快速运行的。
首先购买这些产品是我的错吗?
当然是。好吧,不是您本人而是一般消费者。产品通过功能清单出售(和购买)。很少有消费者要求更好的性能。
为了说明我的观点:上一次我想购买手机时,商店甚至没有提供可以在店内玩的演示模型。他们所拥有的只是带有贴纸的塑料外壳,可以显示屏幕的外观。您甚至无法感觉到这样的重量-更不用说性能或可用性了。我的观点是,如果有足够多的人反对这种商业模式,并用他们的钱包投票反对他们的反对意见,那么我们将朝着正确的方向迈出一小步。
但是他们没有,所以我们不是。每年新手机在较快硬件上的运行速度都会变慢。
(未问的问题。)
- 是行销人员的责任?部分地。他们需要发布日期。当上述日期迫在眉睫时,在“使其工作”与“使其更快”之间进行选择就变得轻而易举了。
- 是销售人员的责任?部分地。他们想要清单中的更多功能。他们大肆宣传功能列表并忽略性能。他们(有时)做出不现实的承诺。
- 经理要怪吗?部分地。没有经验的经理可能会犯很多错误,但是即使是非常有经验的经理也可以(很正确)牺牲时间来解决绩效问题,而转向其他方面。
- 规格要怪吗?部分地。如果遗漏了某些规范,那么以后“忘记”它会容易得多。如果没有特别说明,目标是什么?(尽管我个人确实相信,如果团队为自己的工作感到自豪,那么他们将为绩效感到担忧。)
- 教育要怪吗?也许。教育可能永远会倒退。我当然不赞成“教育”,因为它对软件开发有肤浅的了解,因此会迅速吸引初学者。但是,以理论为后盾并灌输学习文化的教育也不错。
- 是要怪升级吗?部分地。新软件,旧硬件确实是诱人的命运。甚至在发布X版本之前,X + 1仍在计划中。新软件兼容,但是旧硬件是否足够快?经过测试了吗?特定的性能修复可能会纳入新软件中-鼓励进行不明智的软件升级。
基本上,我相信有很多贡献因素。因此,不幸的是没有解决之道。但这并不意味着它注定要失败。有一些方法可以改善事物。
那么,这些产品在什么时候出问题了?
恕我直言,我们不能真正确定任何一点。随着时间的流逝,有许多促成因素。
- 豆类专柜:削减成本,市场时机。但是,在没有压力的情况下,我们又可以取得进步吗?
- 行业技术人员的高需求和低供应。不仅是程序员,而且还有经理,测试人员,甚至是销售人员。缺乏技能和经验会导致错误。但话又说回来,它也导致学习。
- 尖端技术。在技术成熟之前,它会定期以意想不到的方式咬人。但是话又说回来,它通常首先提供了许多优势。
- 复合并发症。随着时间的流逝,该行业得到了发展:添加了更多的工具,技术,层,技术,抽象,硬件,语言,变体,选项。这使得对现代系统没有“全面”的了解是不可能的。但是,我们也有能力在更短的时间内做更多的事情。
作为程序员,我们如何做才能避免给我们自己的客户造成这种痛苦?
我有一些建议(技术性和非技术性的)都可以帮助您:
- 如果可能,请使用您自己的产品。没有什么比第一手经验更能揭示尴尬,缓慢或不便的事情了。但是,您将需要有意识地避免绕过“内幕知识”造成的缺陷。例如,如果您通过使用后门Python脚本来完成联系人同步时没有问题-您就不会使用“产品”。接下来是下一点...
- 倾听您的用户(最好是第一手,但至少要通过支持获得第二手)。我知道程序员(通常)更喜欢躲藏起来,避免人为干预。但这并不能帮助您发现其他人在使用您的产品时遇到的问题。例如,您可能不会注意到菜单选项很慢,因为您知道所有快捷方式并专门使用它们。即使手册完整记录了所有快捷方式,但有些人仍然会偏爱菜单-尽管速度很慢。
- 努力不断提高您的技术技能和知识。发展技能,以批判性地分析您学到的一切。定期重新评估您的知识。在某些情况下,请准备忘记您认为的知识。带来了...
- 一些技术可能会非常棘手,从而导致细微的误解和错误的实现。通过公知常识或可用工具发展而来的其他项目可能会受到青睐或失宠(例如Singletons)。一些主题非常棘手,以至于它们滋生出大量传播大量错误信息的“病态专家”。我的一个臭虫是围绕多线程的错误信息。好的多线程实现可以显着改善用户体验。不幸的是,许多错误的多线程方法会显着降低性能,增加不稳定的错误,增加死锁风险,使调试复杂化等。因此请记住:仅仅因为“专家”所说的,并没有使它成真。
- 取得所有权。(不,我不是在玩会议室宾果游戏。)与经理,产品负责人,销售人员进行谈判,以获取优先于某些清单项目的性能功能。需要更好的规格。并非幼稚,而是通过提出使人们思考性能的问题。
- 成为挑剔的消费者。选择功能较少但速度更快的手机。(没有更快的CPU,更快的UI。)然后吹牛吧!越来越多的消费者开始要求性能,更多的bean计数器将开始为此预算。