在打破东西

其中我们改变了数据库中的一些东西,这不是一个简单的任务,有些东西坏了。吸取的教训。线上金沙指定注册网址等。

喜爱的 最喜欢的 0

TL;医生:金沙线上娱乐场Sparkfun昨晚停了一会儿,他在做一些数据库方面的工作。我们应该提高正常运行时间,但现在我们主要是想在数据库方面做得更好。今天早上我们意识到我们打破了货币兑换,因此价格的显示,在现场。昨晚的停机信息/网络书呆子沉思和一些事后调查,我们搞砸了什么,跟踪美洲驼,thoseinterested。

骆驼

所以今晚,金沙线上娱乐场sparkfun.com将会关闭一段时间。我们希望不超过一两个小时,尽管它可以运行得更久。

我承认在这里我们可以更好地保持现场的整洁。所有的时间比我们现在的情况要好。我们正在努力,但现在我想谈论的是数据库。

大约从时间的黎明开始(也就是说,从过去十年的某个时候开始,在我工作之前),金沙线上娱乐场SparkFun的核心业务是在mysql上运行(最近也是如此)MariaDB)。当我在2007年秋天被雇佣的时候,很多重要的代码仍然在黑客之间被分割。osCommerce安装和一堆MS Access客户端。这些东西已经消失多年了,但数据库本身仍然存在。在某些地方,它显然是2003年某个时候其他人编写购物车时随意设计决策的化石记录。

这可能发生在任何地方。应用程序代码可能会发生巨大变化,但是在一个工作间,数据存储以一种方式成为周围的脚手架(无论好坏),一切都是构建的,并且必须进行维护。

碰巧,当我们第一次意识到我们需要一个比不太面向对象的老式PHP更好的工具集时,我们做了一些具有长期影响的决定:

  • 我们决定继续使用PHP,而不是用Ruby重写一切。
  • 我们决定编写自己的轻量级web应用程序框架,而不是使用现有的PHP项目。金沙线上娱乐场
  • 我们决定自己写奥姆层而不是使用现有库。

很多事情决定了这些决定:我们不想为了使用更好的工具来编写新代码而必须一次替换所有的工作软件。我们团队的每个人都知道PHP。我们所看到的框架似乎与我们在Ruby和Perl等语言中使用的东西缺乏兼容性。可用的php-orm库要么比我们想要的要重,要么构建的假设不符合我们现有的(通常很糟糕)模式。最后,滚动我们自己的听起来很有趣,我们有不知道。我们让自己陷入了什么。

(好吧,为了全面披露,发生的是,我比那些知道我们将要进入的人更大声地说话。)

在接下来的几年里,我们雇佣了更多的程序员,SparkFun又获得了50万份订单。金沙线上娱乐场我们坐在山里,喝着啤酒,谈论着我们真正应该如何更好地解决PostgreSQL的问题。

看到的,MySQL及其分支,在过去的十年里,他们建造了很多巨大而神奇的建筑,有一些缺点。在这一点上,我可能会从那些对数据库有强烈感觉的人那里引发很多强烈的感觉,所以现在,让我们这么说吧,我们开始觉得在数据库上编写业务软件会更好,因为数据库体现了对正式类型和关系更严格的方法。因为多年来我们的书呆子朋友告诉我们,我们应该使用PostgreSQL,看起来PostgreSQL可能就是那个数据库,特别是因为我们已经知道要在开放代码中使用某些东西。

所以我们又喝了些啤酒,聊了一会,又喝了些啤酒,聊了一会,也许六个月后,我们最终决定去做。

这就是我们要做的。

排序的。

结果是,当你用MySQL这样的软件编写你自己的特别ORM层时,你根本不知道你会有多困难,我们很容易在没有注意到的情况下做出一堆假设。Rumsfeldian未知的未知,如果你愿意,随时都可以进来。比如鱼和水的概念,长时间使用给定数据存储的人开始忘记某些抽象甚至是需要考虑的对象。这些数据位在PHP中表示为字符串?好吧,这很自然,正确的?还有什么呢?选择的数据库中的字符串比较都不区分大小写吗?好吧,真见鬼,这几乎是一个特征,正确的?

然后你决定你要把东西指向另一个不同的数据库然后你得到一个速成班关于所有你错了的东西,所有你无法测试的东西,你对两个或三个或五个不同类型的系统所做的所有牵连假设,你所依赖的跨语言和模型的表示,实际上都是错误的和微妙的。

所以今晚我们要做的是重新排列一堆MySQL模式,并部署一长串令人恐惧的代码更改,这些更改使我们能够在不让所有软件持续爆炸的情况下实际迁移到PostgreSQL中,而这一过程只需要三分之二的时间。我们真诚的希望。(如regardsexploding软件,我也有很多最近开发的想法,关于如何在没有吨级的单元测试的情况下,再也不会用动态语言编写大型项目。)金沙线上娱乐场

我应该写一些连贯的东西,但我刚刚意识到我们现在需要部署代码。

不管怎样,感谢您在网站关闭时与我们合作。彩色电线和炫目的灯光等将很快再次出售。


后期好的,所以部署所有这些东西比预期的要顺利。今天早上我醒来发现,我们已经向那些在午夜后登录MDT的客户展示了大多数产品的0.00美元(或以您最喜爱的货币表示的等值价格)的价格。

这是一个令人愤怒的错误,因为它归结为一行代码,我个人错过了更改,而做了几千个真正机械的、直接的调整。这就是它实际的样子:

diff--git a/services/update_currencys.php b/services/update_currencys.phpindex 8c59226..a504378 100644---a/services/update_currencys.php+++b/services/update_currencys.php@-135,7+135,7@@类交换率处理器如果($row=currencysaurus::findbycurrencycode($this-$code))-$row->value=self::$dbi->escape($this->multiplex);+$row->value=$this->乘数;$row->last_updated=$date;打印“更新记录{$this->code}: {$this->multiplier}…”如果($行- >更新()){

那叫$ dbi - > escape()永远是多余的,但在它没有破坏任何东西之前。在对其他库进行更改之后,它增加了一些引用标记,当我们在午夜更新所有的therates时,我们把0存起来。

当然,其实没那么简单,因为事实证明:

  • 显然,超出范围的值不会导致货币更新崩溃。
  • 我们在两个地方而不是一个地方缓存货币兑换率。其中之一恰好是用户的会话。
  • 尽管我们所有的业务都是用美元进行的,我们把每一个价格我们显示,包括购物车和结账时显示的分类汇总。
  • 所有涉及这个的代码是,经过4年的累积黑客攻击,令人难忘的纠结和完全未经测试。

简而言之,这是一个教科书上的例子在网上做六件事。

也许我们将开始一个常规的“从SparkFun的web开发错误中学习”系线上金沙指定注册网址列。金沙线上娱乐场

如果你注意到这里有别的东西坏了,帮我个忙,在下面留言。感谢每一个对破损感到超级冷静的人。你们几乎都是一个书呆子所希望的最善良、最宽容的客户。


评论55岁的评论

  • Rohar / 大约5年前 / 17

    我,首先,真的很欣赏你们对你们所做的每一件事的透明度和真正的开源思想。我送你两条大拇指和一条粉色羽毛围巾。

  • 我喜欢读这些东西。它提醒我我们都是人类。正如我最喜欢的办公室标语所说:“我们明天要犯更好的错误。”

  • 我看到布伦南从他的帽子里迅速地拿出一些惊人的快速更新和实现,以至于只有凡人会放下他们的嘴。我的身材,错误,你还是一流的。

  • 你认为你的客户是“一个书呆子所希望的最善良、最宽容的客户”,我相信这是因为我们是那种在类似情况下的修补工。也许不是数据库,也许是网络基础设施坏了,复杂的防火墙配置,PLD设计,或者一些甚至与之无关的东西,根据我们自己的经验,周围没有人能了解情况,更不用说帮助解决它了。我们喜欢在你通宵达旦的时候和你一起吃“虚拟的披萨和可乐”。喜欢听到你为修复它所经历的步骤,很高兴听到还有其他人在这样的环境中工作当我们回头看的时候,你可以诚实地说“这是一个愚蠢的设计,我从来不会那样做"但事实上,多年来,是你……你就是这样设计和建造的,因为没有后见之明,这在当时是正确的做法,现在你正在努力处理它。令人欣慰的是,我们并不孤单!

    正是这样的帖子让我们中的许多人来到你们的网站,一天又一天,一个星期又一个星期,即使我们不在项目中,金沙线上娱乐场不需要任何部件。保持透明度!!

    • 172飞行员说得很好。很容易批评人们做事的方式,我自己对此感到非常内疚,但是当我读到像这样的故事和你们的评论时,我知道我也经常犯这些错误,不应该对犯这些错误的人太挑剔。尤其是当,就像你说的“周围没有其他人能理解这种情况,更别说帮助解决问题了"-我经常遇到的情况。当你在软件中开发新东西时,你经常这样做只是为了实现一个特定的功能,用一种特别的方式去做似乎没什么问题,因为它在当时“完成了工作”。但是多年以后,这可能会给你带来各种各样的头痛和问题。事后诸葛亮太容易了。

    • 自从90年代以来,我就没喝过一瓶提神可乐。自从我戒了汽水,但我很确定如果我在商店里看到一个,我无法抗拒。他们还在卖吗?

      就个人而言,我发现搞砸很重要,因为他们让你谦逊。不仅如此,但你也更有可能保留学到的经验教训。线上金沙指定注册网址也就是说,我更希望我们没有定价问题。

      • 你知道. .我不确定我自己是否喝过这些东西,但它确实代表了那个时候的极客通宵达旦的传统观念。:-)

        我很好奇,确实发现是的,他们仍然成功了,甚至有摇一摇可乐-“是的,他们还在努力。”在亚马逊的描述中:-)

        我同意“把事情搞砸很重要”的说法——我的老板曾经说过“我怎么能指望你来解决它呢?”如果你甚至不知道如何打破它,这是真的…

  • 正如一位IRC用户指出的,定价有太多的重要数字。我相信乔希正在努力。

    • 我认为实际上有一个修复方案正在等待批准,但不管怎样,它都会被修复:)

  • 伟大的写,为此你应该得到t恤:o)

  • DIY总是有它的问题!但这就是为什么它很有趣!!你们太棒了,读到这些让我想起,仍然有一些公司是用心经营的。继续做你该做的!

  • 在这里,我想我能买到100万个Arduino's和Rasp。Pi是免费的,没有运费!讨厌它。去找一秒钟,第三,第四份工作是付款购买!j / k:)

    • 对不起的,我已经点击并拖拽了“火花电子产品”到我的篮子里,金沙线上娱乐场所以什么都没有留下。

  • MySQL的主-主复制可以很好地实现5个9。数据库模式更改可以在零停机的情况下完成,方法是一次在对的一半上执行更改,同时适当地调整应用程序。我知道,因为我在一家年收入达1000万美元的在线零售商工作的六年中,部署了这样一个系统。我不会像担心离开使用自制ORMs和web框架的PHP平台那样担心切换到PostgreSQL。

    PHP:糟糕设计的分形

    • PHP:糟糕设计的分形

      php是,周围,非常糟糕的语言。(也有PHP的悲伤,把投诉分类列得很好。)我认为刚开始上网的人最好先学习其他的东西,线上金沙指定注册网址在真空中考虑,在新项目中使用PHP是很难证明的。金沙线上娱乐场我可以讲一会儿。

      这也是我们在任何一天中遇到的最少的问题,这十年的任何时候都不会消失,里面有一堆我们不急着写的东西。

      事实证明,你在互联网上用你今天能做的软件卖东西。通常这不是你想要的软件,更不用说满足矛盾约束的软件了,即避免在互联网上被别人告知你做错了。

  • Brennen—货币数量显示小数位数过多的错误表明您使用浮点数来表示货币。这通常是不受欢迎的,因为大多数浮点表示法为了能够表示大量的值而牺牲了准确性。如果您的系统使用的是浮点货币,它会彻底打乱你的金融交易,以至于你永远无法完全理清事情。

    • 使用浮点数来计算屏幕上的值并不意味着它们用于所有计算。

      像sparkfun这样价值数百万美元的公司有像你这样的人,他们甚至不用看一眼就能指出会计系统的基本缺陷,这是一件好事。金沙线上娱乐场

  • 所有价格显示美元,小数点后5位,尾数002例如:$10.00002,我的标价是英镑

    浏览器测试谷歌Chrome,火狐,歌剧,Safari和一些叫IE8的老东西。

  • 我的心愿单是在IE和火狐中删除尾随零。

    +美洲驼1个

  • 啊……我有点希望这是一个没有惊喜的日子。Sparkfun Twitter账户上有一些神秘的tweet,上面说“如果你想知道金沙线上娱乐场我们为什么会失败,现在就去查看sparkfun.com。”但那里没有信息,除了所有的价格都是0美元。这要么是在Twitter上宣传的一个微妙的免费日,要么是一个bug。;)

  • 一个词-django。

  • 我看到加元和美元的价格完全一样(小数点后4位),这说明有些东西还是有一点坏。:)

  • 我看到所有价格后面都是002美元,大概是4.95002美元。复制,转到“新产品”。我在Win 7 64上运行Chrome。

    • 谢谢你的报告!我们已经在开发环境中修复了这个问题,但是要到明天早上才能推出。

  • Bug:我的心愿单总计缺少尾随的0(显示44.9美元而不是44.90美元)。

  • 什么,没有开发服务器和数据库克隆从当前的live server+数据库只是为了测试?这不像你在使用别人的尖端软件产品。不妨这样想:SparkFun Inc.。金沙线上娱乐场目前正在使用SparkFun公司的开发金沙线上娱乐场商AG的软件产品。这有意义吗?您使用的是一个内部产品,其测试似乎很少。在开发中的事物不应该作为业务模型的核心而存在,除非您知道它是正确和可靠的。通过拥有一个正在被积极攻击的内部beta服务器,你可以尝试用不同的数据库,模拟购买,并执行生产服务器当前所做的所有工作,而不是实际执行它。您可以通过跟踪开发服务器上的主服务器的当前活动来测试它。这是最好的测试,跟踪实时使用情况,看看结果是否一致。较小的更改和正确性验证非常重要。一次性更改的较小单元测试非常重要。对于开发人员来说,不进行测试几乎是不可原谅的。这就像焊接一个PCB,然后连接一个电路,你知道它会被插到墙上,然后在没有检查短路的情况下画出几十安培。

    • 我是怎么跟你说的?

      每个在SFE上编写web代码的人都至少运行一个VM,它将我们的生产服务器镜像到一个非常好的近似,并且希望能够从头开始安装应用程序。我们通常会在一到两天的时间内处理生产数据库的快照。我认为我们目前正在运行6个专门的beta安装,这样内部用户就可以在不同的开发阶段测试分支。

      我们可以做得更好,特别是自动化测试覆盖,但这里不是1998年。

      • 让我问您一个问题——这些生产数据库快照是否包含持卡人数据?只是好奇您如何管理PCI DSS遵从性。

        • 不。

          • 不同的数据库,还是使用类似StrongAuth的黑盒解决方案?

            • 甚至我们生成快照的实时生产数据库也不包含持卡人数据。当持卡人的数据被存储时,它是由我们的信用卡网关和处理器FirstData加密的。我们只是存储一个处理器生成的令牌,用于后续的收费。到目前为止,这是处理持卡人数据最安全的方式,因为我们只需将其加密,而无需查看它,更不用说储存了。该程序的详细信息可以在这里找到。

              • 听你这么说真高兴。我全心全意地支持这样的黑盒解决方案金沙官方娱乐场。StrongAuth的工作方式完全相同(令牌)。

    • 根据brennen所写的,听起来他们确实有测试/开发环境。至于您所说的,在开发到生产迁移执行的过程中,似乎会出现一些错误。我不知道这是否会被检测到。如

      很久以前,在一个遥远的星系里,我写了一些错误检查代码来测试硬盘是否有足够的空间来安装我们的产品。那时候,MS-DOS上有1000万至2000万硬盘驱动器。1998年之前brennen:)是的,该模块在各种硬件配置假设下进行了测试。除了一位客户打电话来说:“嘿,你的产品不会安装,因为它说我没有足够的可用空间!”我问显而易见的“你有多少钱?”他回答“700米”。

      因此,我了解到现实世界总是线上金沙指定注册网址在运动的,对于今天的整数来说,它看起来是一个很好的大小。明天可能完全不够!另一个教训是不要假设你知道别人在做什么。

  • 该死的!我错过了sparkfun的“自由之夜”!金沙线上娱乐场

    我曾经是UI测试的超级粉丝(我正在为几个作业编写Selenium测试),除了它们是高度不稳定的,当你在内部或在互联网上访问网站时,会遇到这样的延迟。然而,我认为UI测试系统的基本功能,或者“我们不想出错的是什么”场景(免费提供所有东西)是UI测试套件的好候选。

    你们有没有集成测试可以在更高的层次上测试底层服务?

    • brennen / 大约5年前* /

      我们有一组小而有用的UI测试来导航站点,订单,等。现在我们正在使用卡斯佩尔JS的。今天之后,我们可能会在价格显示中添加一些完整性检查。

      我们得到的其余内容主要是一组编写的单元式测试水龙头.它们中的一些是可扩展的和交叉的,足以捕获第三方api的问题以及我们对这些数据的解释,但显然存在着比实际应该存在的更大的差距。

      编辑:嘿,如果任何人的找个演出我们可能在重新思考我们希望这份工作描述是什么样的,但无论如何,自动化测试技能是一个重要的加分项。

      • 我猜你们没有远程工作者。我刚在佤邦买了一所房子。当然,在Sparkfun工作的一半乐趣是我在非工作时间可以使用的所有小工具金沙线上娱乐场,还有一群完全了解戴伊的人。

        • 我猜你们没有远程工作者。

          是啊,不管好坏,大部分时间我们都把精力放在办公室里,而且华盛顿将是一个非常通勤的地方…

  • 中间点击和控制点击在链接上不起作用。如果不单击鼠标右键,我的标签就不能以接近几何的速度展开,我就会变得急躁起来。听起来好像有更重要的事情要做,希望在炸大鱼之前,星期五。

    • 像埃里克说,我们一直在努力寻找它,尽管在最近的Firefox版本中似乎已经修复了这个问题。我只想表达我的同情。我想我今天至少打开了25个标签。通过点击鼠标,我自己。

      • 只有25 ?

        我刚在午休时间开通了Spar金沙线上娱乐场kFun.com。是121号标签。

        我真的应该清理一些…

        • 我大概有50个,问题是,一旦他们从屏幕上滚动下来,我就会忘记他们,所以任何比这更有用的东西都没有用。

          • 我还没用过这么多,但我刚遇到OneTabChrome。解决这个问题的有趣方法——基本上就是在单击按钮时将所有(非固定的)选项卡压缩到单个页面上的列表中。

    • 我能问一下你用的是什么浏览器版本吗?我在Firefox 21.0中遇到了同样的问题,但是当Ubuntu在几周前升级时,问题消失了。我们还在研究它,我只是好奇这是不是一个孤立的问题。

      • sudoer发挥了他们的魔力,Firefox 22.0现在可以在SparkFun中进行中等点击了!金沙线上娱乐场

      • 3.8.13-100.fc17.i686.PAE上的Firefox 21.0。我将把这个添加到我想让系统管理员修复的洗衣清单中。

        • 非常感谢!谢谢您。也许这实际上仅限于Firefox的一个版本。也许吧。

          很明显,在我们这一边,尽管如此,因为在该特定浏览器版本的其他网站上,功能似乎不受影响。

  • 请清除缓存并重新启动服务。我们有工作要做,有产品要订购,没时间给巨魔编号了,呵呵

  • 最近我学到了一件事(也是我第一次申请),线上金沙指定注册网址那就是测试一切。极端的做法是先编写测试,然后编写代码来满足它,但我并不总是这样做。为了便于测试,我一直在用PHP重写所有东西,使其面向对象。我发现了phpunit和它的数据库插件来测试我的代码。我可以使用它自动创建带有固定数据的模拟数据库,以便于对代码进行测试。然后,在提交之前,我只是定期在脚本中运行phpunit命令,这是Jenkins作业的一部分,该作业在钩子脚本触发时轮询git存储库中的代码更改。

    http://phpunit.de/manual/current/en/index.html

    • 设计模式正式称为测试驱动开发。TDD的唯一问题是,如果您没有正式的QA团队来编写独立于代码实现人员的测试,然后,开发人员常常会修改代码,使其符合测试的怪癖(这并不总是一件坏事),或者修改测试,使其通过代码(非常,非常糟糕的事情)。你也会倾向于真理的测试,而不是那些实际探索边界情况,因为你太熟悉代码库,你下意识地开始思考“没有人会使用这个像这样…”作为一般的经验法则程序员应该打击自己如果他们抓住自己这样做。总有人会以一种你意想不到的方式使用你的代码。

      • 你下意识地开始想“没有人会这样使用它……”作为一个经验法则,程序员如果发现自己这样做了,就应该经常敲打自己。

        阿门。我养成了从不信任的习惯任何东西我从客户机/浏览器/邪恶的小妖精那里收到的。如果对a的检查是明显的并且总是错误的,条件返回true,那么我要么把它们吐回登陆页面,要么销毁所有的东西,让它们重新开始。(这就是他们试图传递一个不在自己账户下的ID所得到的结果。):-))

    • 我们正在研究类似的东西,我们已经有了大量的脚本来检查代码和功能的正确性。也就是说,我们还有很长的路要走,定价的问题是基于一个服务,它不运行在我们的测试环境中(但可能应该运行)。我们部署的时候一切都很好,第一批命令下达了,所以我们回家了……然后服务就开始了。一切都出了问题。

  • 再来一个虫子,本页(美国)价格以5位数的美分显示://www.pontait.com/categories/242/金沙线上娱乐场

    • 主页上有四个。但我注意到它总是这样加载,在我的浏览器去掉后面的0之前。但这次他们留下来了。

    • CF / 大约5年前 / 1

      让我想起了办公空间!

      MICHAELIt很辉煌。它所做的是在有银行交易的地方,而利息是以每天数千次一美分的违法行为计算的,通常是四舍五入。这样做的目的是把剩下的人变成你的账户。

相关的帖子

引擎日:宇宙

近期职位

无线遥控与微:位

魔戒之光

标签


所有标签