草庐IT

为什么说“大公司的技术顽疾根本挽救不了”?,java大数据开发面试题

阿里自研院 2023-04-21 原文

在很多开发者看来,提升敏捷性是解决技术难题的不二法则。但本文的作者作为一家有着一百多年历史的大公司的技术援助顾问却认为,由于历史遗留、文化隔阂等原因决定:在大公司,所谓的敏捷性开发其实并不是人们以为的管用。

为什么他会这么说呢?一起来看看。

以下为译文:

在硅谷流传着很多油嘴滑舌、哗众取宠的肤浅言论,这些言论都是关于开发过程中保持敏捷的重要性的。关于引入敏捷技术的容易性,以及哪些问题可以通过敏捷技术解决,有太多的假设。在这篇文章中,我试图纠正其中的一些错误看法。

在过去的20年里,我曾经是三家初创公司的技术合伙创始人,其中两家公司发展到中等规模后被卖掉了,后来我给一些中型到大型规模的公司做一些咨询工作。这些公司通常有几个办公室,最多可能有3000人。特别是我在2009年搬到纽约后,我成了一名技术救援人员,试图帮助拯救那些技术落后于时代的老媒体公司,让他们迎头赶上新技术。

现在我正在为我曾经合作过的最大的集团公司工作。它拥有11000名员工,旗下有180家公司在运营。这是一家你们大多数人可能都认识的著名公司,你们中的许多人可能还是它的客户。在本文中,我将它称为“SuperRentalCorp”。

关于“初创企业很敏捷,而大公司就像转个身都困难的恐龙一样难以成事”这一主题的文章,已经比

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

浏览器打开:qq.cn.hn/FTf 免费领取

比皆是。许多商业作家甚至写了一些有趣的书,来介绍大公司如何重组以使其更加敏捷。例如,埃里克·里斯在他的书《创业之路》中提出过一些有趣的想法。

但拯救一家大公司的技术是如此困难,原因何在呢?

在SuperRentalCorp发生的一些问题就是一个很好的例子。

当我最初被告知这家公司需要帮助时,是这样的情形。我的一个给这家公司做咨询工作的朋友这样对我说:“嘿,这家公司需要帮助构建一个API。你知道如何构建API吗?你能帮他们吗?”他告诉我,这家公司尝试构建这个API已经两年了,但到目前为止他们还在失败。

我心里想,“用两年的时间来构建一个API,并且还失败了!看在上帝的份上,现在都已经是2019年了,有几百万个工具可以用来轻松构建API。他们怎么可能认为这很困难呢?一个好的工程师可以在一天内把这件事解决掉。他们为什么苦苦挣扎这么久?”

但是我最初的想法是基于这样的一种场景假设:你只有一个数据库,而你想要做的只是将API置于你的数据库和外部世界之间。这是我在早期初创公司工作时的常见场景。如果使用一个新建的Ruby on Rails项目,说正经的,你可以在一个小时内构建出这种API。

然而,对大公司来讲,有两个大问题困扰着大公司的技术救援:历史和信任。

——我先谈谈历史。

当我提到“历史”这个词时,我指的不是简单地解决历史遗留应用程序的问题,而是处理过去30或40年间不同CEO所做决定的遗留后果,因为公司对过去每个十年时代的变化趋势都得适应。

SuperRentalCorp成立于100多年前,当时世界大部分地区由几个欧洲帝国统治,而大多数公司都是依托他们在西方国家内的公司来经营全球业务。但在1948年至1980年的那个时代,所有的旧帝国都解体了,取而代之的是一百多个新的国家,而这些新国家都保护着自己的独立性。因此,SuperRentalCorp决定采用分散结构。它在大多数国家中设立了子公司,并且子公司作为独立公司运营。有时子公司的部分所有权被出售给他人。这意味着,当上世纪70年代末第一批大型数据库来到时,这家公司没有中央数据库、中央IT部门、也没有首席技术官或首席信息官。

不久之后,由于政治形势似乎变得安全了一些,合并一些服务的好处变得显而易见,因此一些子公司被合并,组建了区域性公司。例如,中东和北非有一家,欧洲有一家,北美有一家,亚洲有一家,南美有一家。通过这种结构,这家公司进入了90年代,这时它开始认真考虑通过网络数据库来管理它所提供的所有服务。

20世纪90年代,面对激烈的全球竞争,这家公司决定通过收购最成功的竞争对手们来实现增长。如果我告诉这些被收购的所有的品牌名字,你会认出其中的大多数,但你可能会惊讶地发现他们现在都为一家公司所拥有。我也很惊讶,因为我也认为这些公司是竞争对手。但事实上他们不再是了。

然后,大约在2005年Web2.0时代的到来,导致竞争对手大量涌现,这些竞争对手提供类似于SuperRentalCorp的服务,但是他们通过使用互联网技术,以新的方式来提供这些服务。同样地,SuperRentalCorp收购了其中的几家初创公司,通过吸收竞争对手来赢得竞争的胜利。许多被收购的初创公司只在单一国家,或单一的市场(如欧盟)内运营。

就在最近,这家公司的新首席执行官决定最好把公司统一起来。一些国际子公司已被全资收购,目前正在进行重组,因此它们将作为公司内部的部门而非独立公司运营。

作为对公司统一的新的重点工作的一部分,SuperRentalCorp希望构建一个统一的API,以便外界认为该公司具有内部统一的技术架构。也就是说,SuperRentalCorp希望给外界一个这样的假象:即该公司只有一个统一的数据库,并且与该数据库的交互很容易。

然而,真实的情况是怎样呢?真实的情况是:SuperRentalCorp拥有20个主要数据库,由20个不同的团队在至少10个不同的国家/地区运行,其中许多拥有独立公司的运营历史,每个团队都保护自己的数据,部分出于安全担忧,部分出于对有关用户隐私的本地法律和对国际用户数据传输的监管的担忧,还有部分原因是纯粹的顽固。

和任何数据库的操作一样,这里有两个需要关注的问题:读取和写入。数据库读取并不难。我们可以从20个不同的数据库中提取(必要的)数据,将数据存储在一个作为缓存的集中数据库中,并在该数据库和外部世界之间放置一个API。数据的时效会出现一些小问题,我们必须进行实验,以确定哪些数据是高优先级的,需要在几秒钟内复制过来。不太重要的数据可以每5分钟复制一次,或者在更新时触发一次复制操作。

有关为什么说“大公司的技术顽疾根本挽救不了”?,java大数据开发面试题的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  6. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  7. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  8. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  9. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  10. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

随机推荐