好吧,或者开始做对了。
如果要求我指出一个杀死大多数软件产品的特定问题,那么我肯定会渴望开发人员预见遥远的未来。 这可以用多种方式表示,但一般方案大致如下:
“尽管{Y}对我们来说有一个更简单,更合适的解决方案,但我们仍需要实施解决方案{X},因为将来{Z}发生时,{X}会比{Y}更好。” 。此外,关于事件{Z}的发生概率,也没有确切的信息。
以下是几个示例:
- 我们需要使用kubernetes和docker! 是的,单个服务器可以应付当前的负载,并且易于配置和维护,但是当我们需要十几个服务器时,使用kubernetes和docker部署它们将变得更加容易。
- 我们需要一个分布式的数据处理架构! 是的,到目前为止,一台普通的PC可以处理所有事情,但是当我们拥有工业级解决方案并且客户要求SLA的正常运行时间为五个九时,我们将为此做好准备。
- 我们需要雇用一个开发团队并从头开始创建一个网站,尽管事实是,基于wordpress部署某些东西要快得多,因为当我们的客户数量比现在多100倍时,wordpress将不会那么方便。
- 我们需要使用继承而不是组合,因为5年后代码库将不断增长,因此没有它,就没有办法。
- 我们需要用C ++编写此代码,尽管事实上它在Python中会快几倍,因为在数年后它将处理数TB的数据,而Python在这里可能无法应付。
最近,我写
了一篇有关虚构问题
的文章 -那些解决方案的人们会乐于接受,因为解决它们比解决实际问题更有趣。 这也包括这些预见未来的尝试。 您甚至可以说更多-这是大多数小型初创公司最喜欢的假想问题。
但是,让我们不要将所有内容放在一起:如果您明智地进行尝试,那么为将来做好准备可能会很有用。 但是很少有人明智地出现-人们有幻想,恐惧,情感和其他人的感觉。
实现成功比生活已经获得的成功更加困难
每个人有时幻想着如果他是别人会怎样。 富有,有名,坚强,有能力的人。 考虑它很有趣,它以某种方式自身发生,是不由自主的。 因此,您在杂志的封面上看到了一张照片-并且您想,代替这个名人我该怎么办? 哦,所以我会花这笔钱,如果我愿意的话,就这样做。 还有那个。 如果您仍然可以飞翔并拥有超能力! 是的,那太好了!
软件开发人员也是人们,他们也可以接受幻想。 因此,这意味着Facebook就是基于这样的技术构建其平台,并且可以扩展到十亿用户...嗯,我们还不错,而且这些技术都可以使用,我们也做得很好,拥有十亿用户(尽管到目前为止有100个)。 但是,Facebook的魔力并未扩展到十亿用户的技术中。 她能够在正确的时间和地点为人们提供正确的产品。 能够扩展到十亿用户的软件是公司的次要和次要部分。 它仅在需要时才创建,并且仅在需要时才创建。
奖牌有两个方面:
a)实现增长比维持规模更具挑战性。
b)大多数非常合格和有才华的程序员致力于需要良好可伸缩性的产品。
点
“ a”很容易识别。 自己想想-在曾经创建的所有软件公司中,大概只有0.05%达到了数百万用户和数十亿利润的水平。 其余的崩溃更早或收到的更少。
因此,关于软件将来需要的功能的大多数幻想通常归结为试图解决这0.05%的公司的问题。 “在这里,我们有一个由1000名开发人员,1000万用户和十几个具有复杂需求的大型企业客户组成的团队,然后我们将需要……” 不,您不需要。 发生率为99.95%。
但是,对这种诱人的想法说不就很难了,因为它破坏了人们对成功几率的很小一部分的信任。 我们必须停止自我介绍自己成为新亚马逊的所有者,而回到今天的问题。 今天,您有50位用户,其中30位是家人和朋友。 是的,对当前事务状态的了解可能会降低动力。
点
“ b”也无助于解决困扰。 显然,最好的程序员在顶尖公司工作。 要么是由于他们的才华创造了他们,要么是因为顶级公司能够聘请最好的程序员。 Pareto原则在这里对我们不利:程序员最好写书,做演示和设计更好的系统。 我们每个人都从这些令人着迷的故事中听到了关于分布在数千个节点上的容错集群的迷人故事,这些故事使用经过优化以达到令人难以置信的性能指标的软件来处理PB级数据。 但是,我们大多数人现在和现在都不需要考虑如何在我们的公司中构建这样的集群。 他只是不需要。
因此,闭上眼睛并在5年内代表您的公司是一件大事-会有所帮助吗? 真的有必要停止思考未来吗?
当然不是 思考未来是好的。 设计具有未来基础的软件也很有用,但是您需要正确地做。
灵活设计,实施不完善
少做多好,但是好。 实际上,很少有产品能够满足其客户的需求。 这样您就完成了
A,并且90%的用户完全需要
A-永远不会。 您90%的潜在用户需要某种
B ,而您的
A只是
B的最接近替代者,而且没人亲自出售
B ,因此有些买家会对他们的山雀感到满意。
在这种情况下有什么好处? 一旦找到买家,您仍然可以尝试了解他们的真正需求,并最终意识到这一点。 好吧,或者比这更好的选择。 用户群可以帮助您研究市场,找到合适的市场并填补市场。 一旦您摸索到这个利基市场,就开始工作-从这里开始您的成长。
而且这种方法非常有效。 您实施了一些小东西,但效果很好,将其提供给用户-然后听听他们对您产品的想法。 您不再猜测,不解决想象中的问题,不增加不必要的复杂性。 您适应,添加了一些东西,删除了一些东西。 这将创建您独特的产品。
这样一来,您的代码库最初越小,就越容易适应新的代码。
“我讨厌代码,并希望在我们的产品中看到很少的代码。”-Jack Diederich
如果您使某件事完美地工作,那么您做错了。 您必须在此过程中做出太大的牺牲。 也许是浪费时间或金钱,也许您放弃了灵活性,也许还有其他事情。 理想不是免费实现的。
不是理想的软件更可行。 可以在合理的时间内以合理的价格创建它。 它经常足以完成所有必要的事情或几乎所有必要的事情。 顾名思义,它是不完美的,为其发展和机动自由留有余地。
乐观的软件架构设计-未来可以愉快地唤醒
重要的是要记住,周围的世界不是一成不变的。 几年后,借助于现有技术可以很容易地解决出现在您面前的问题。 许多人在设计某些东西时,不仅没有考虑到未来的机会,而且通常只依赖已经使用了几十年的工具。 他们限制自己甚至不是今天,而是昨天。
让我谈一个具体的例子:设计分布式系统,并期望为任何增长做好准备。 导致创建此类系统的常见担忧之一是担心您的服务器有时无法为所有用户提供服务。 确实如此。 有时候 但不是在小公司,也不是在初创公司。 此外,由于某种原因,大多数在2018年编写软件的人都可以确定它可以在2005年创建的服务器上运行。 每年计算机都在进步,可以租用好的服务器并不昂贵。
让我描述这样一个初始的“真实”服务器:
- 两个Xeons E5-2680v4(28核和56个线程,在2.4GHz到3.3GHz时处于克隆状态)
- 512 GB DDR4-2400 RAM
- 2个每个1.2TB的NVMe SSD(每个读取〜3GB /秒,每个写入〜1.5GB /秒)。
是的,我敢打赌,全球一半的分布式系统将完全在此服务器上运行,其所有组件和依赖项都将作为其所有现有用户群的正常服务。 到目前为止,这还不是最酷的服务器。 可以按每月800到1300美元的价格购买(取决于在哪里获得)。 您可以租用其中一打来支付伦敦一名合格工程师的薪水。
该服务器的优点还在于,它在2年内的租金价格将下降2倍。
计算机以非常线性且可预测的方式发展,演化,并将继续按预期发展,直到2020年代末。 很难进一步猜测,但是人类不太可能提出新的东西。 人们仍然记得本世纪初的烙印,并且担心仅此一天不足以满足他们成千上万的请求。
但是我们在谈论铁。 并考虑出现和开发的所有软件。 20年前很少有人认真考虑过语音控制。 看看当今世界-“好吧Google”,“你好,Alexa”,“ Siri,现在的天气如何?” 在2016年开始编写语音前端的任何人-刚好达到2018年。
从2018年开始写什么? 啊,如果我知道:)这已经出现在地平线上了,但是还没有变得太大以至于遮盖了太阳。 环顾四周,也许您注意到类似的东西?
软件的进步令人难以置信。 随着WASM的到来,完全没有引起注意的是,浏览器已成为通用的虚拟机。 2年后,您可以针对一个平台(Web程序集)进行编译,从而构建通用,复杂且高性能的应用程序。 它将随处开始。
但是人们在2012年仍然生活在某个地方。 他们使用Babel,尽管99%的用户至少拥有一个支持ES6的浏览器。
新的编程语言不断出现。 其中一些还不错。 仅在过去的8年中,我们获得了Go,Rust,Scale和D-都找到了自己的利基市场。 在接下来的两年中,我希望看到Julia将如何为科学编程做出贡献。 这就是我个人和我所关注的。 技术和知识的总量令人难以置信。
但是我离题了...
激发未来相对容易。 但是坦率地说,除了生产力增长的线性进步之外,很难想象在2到5年内会发生什么。 一些想法浮出水面,团队正在从事各种软件和硬件项目,但是对此有何“启发”?
但是,如果您想为将来的软件做准备,则必须首先了解当前情况。 当前的好处是它已经存在,可以观察,可测量。 而且它仍然存在一段时间。 使您的软件至少今天与之相关是一个好主意。 使用2000年的方法您将无法为2020年的现实做好准备。 但是用与2018年相关的方法编写的软件在2020年可以很好地运行。
因此,不要否认自己为将来的基础开发软件的乐趣。 只是做得更正确。 不仅要考虑您未来产品的开发,还要考虑其周围生态系统的开发。 可以灵活设计的所有事物都必须灵活设计。 当您确定应该以哪种方式完成该操作时,这将为您提供操作的机会。 这样可以避免您花时间准备永远不会发生的事情。