你可知道,大名鼎鼎的 eBay 在当年就是 由 副业项目发展 壮大起来的。今天,摸鱼大神 Zed A. Shaw 给我们娓娓道来他的摸鱼经验,要知道,他在上班期间就摸了好多鱼,不仅开发了网站,还在业余时间写了一套丛书。 另外副业 也 是你对抗贪婪企业的主要手段 。
这是一则关于 eBay 的 Java 企业版程序员的故事。
eBay 刚成立的时候,Java 正如日中天。彼时,每个人都在用 Java 编程。如果你是一名真正的程序员,那么你所做的一切都是 基于 Java。我之所以知道这一点,是因为我曾被卷入到一个无休止的、可怕的 Java 项目中。直到 2008 年银行倒闭潮,这个糟糕的 Java 项目才随之而去。
2008 年银行的倒闭潮确实对 Java 企业版带来了毁灭性的打击,该事件最终还扼杀掉了 Sun (2009 年被 Oracle 公司收购,Java 是 Sun 在 1995 年 5 月正式发布的产品)。在 2008 年,Sun 大约 40~50% 的资金来自运行 Java 的各个银行。当银行因为 抵押贷款欺诈而倒闭时,Sun 的一大笔 收入 几乎在一夜之间蒸发殆尽。随着较小的银行被并入其余三家较大的银行,对 Sun 的合同义务也随即被取消了。
还有一种形式的 “罪恶关联” ,因为 Java 与僵化的旧系统联系在一起,这些旧系统无法以足够快的速度做出改变,以至于未能在 2008 年的崩溃事件中幸存下来。要问我怎么知道的,那是因为我曾在 Bear Stearns(贝尔斯登公司,成立于 1923 年的美国第五大投资银行与主要证劵交易公司之一)一个僵化的 Java 系统上工作过,亲眼见证了整个崩溃的过程。
要不是因为 Android,Java 这门语言早就在 2008 年悲惨地消亡了。这就是我为什么一直说 “企业版” 的原因,因为这个版本的 Java 比较特殊,从那时起,大多数程序员都很讨厌这个版本。这种怪异的、无限的、迂回的、晦涩的代码,似乎是为了让企业程序员保住饭碗才存在的。我至今还记得那些令人讨厌的 “老胡子” Java 程序员,如果你没有把所有的东西都封包在 中,他们就会 辱骂 你、骚扰你。
这种使用错综复杂、晦涩难解的代码写法,因其充满 特征,确实起到了将新人排除在行业之外的壁垒作用,同时也保住了程序员的饭碗。
你不能解雇那些 Java 企业版程序员,因为只有他们才懂那 些 令人难以置信的晦涩代码,每年一次的 Bug 修复还得靠他们,而且这 Bug 还有一个诡异之处:每次在他们应该得到奖金的时候就会出现。你不得不一年又一年地支付 8000 人的工资,而他们上班所做的事基本就是:坐在那里,看着一堆 Java 虚拟机无所事事,否则有一天(就在要发奖金之前),这些虚拟机就会崩溃,到那时你就找不到人来修复它们了。
这些企业 版 Java 程序员存在的问题是,一旦公司倒闭,你就需要找到一份新工作。你可能会认为,2008 年那场崩溃事件会给这些程序员上一课,但他们根本就没有吸取教训。你可能还会以为,他们已经意识到没有一份工作是安全的,他们需要掌握第二门编程语言,并有大量替代项目,以防万一因公司倒闭而失业。
eBay 的程序员就是一个很好的例子。
我曾用过几次 eBay,即使到了 2014 年,它的用户界面仍然是恐龙级老古董。当用户结账时,它会把 标签注入到自己的服务中,显示比如发票之类的简单内容。这种做法在某些地方用用还是可以的,但在 eBay 上,到处都是这些 “蟑螂” 。Paypal(当时为 eBay 所有)差不多也是这样的情况,到处都是糟糕的用户界面、陈旧的基础设施。
这些糟糕的用户界面万年不变,原因在于它是企业 版 Java 程序员及其工作的保护代码。为了保住饭碗,他们创建了 在 没有他们帮助的情况下很难更改的系统。但这是一把双刃剑,这一策略也使得他们 自己 难以更改代码,所以当公司要求他们让网站的风格看上去更 “现代化” 一些时,他们会声称: “这是不可能的任务。” 你可能会问他们,是否可以只使用诸如 bootstrap 之类的东西,企业 版 Java 程序员就会看着他们的老古董 Java 代码,用手工编码的 HTML 代码嵌入到 中,然后说: “不,那是不可能的。”
然而,这种 “不可能” 被证明是一个谎言。最终,PayPal 独立出来了,用户界面突然开始改善。PayPal 与 eBay 原本共享同一批程序员,但在分拆之后,他们解雇了那些老气横秋的企业 版 Java 程序员,并雇佣 了 一些更好的用户界面设计人员来改进应用。PayPal 之所以要这样做,是因为面临 Stripe 的竞争,后者凭借漂亮的用户界面和文档占据了开发商市场。
在 PayPal 给你展示了这个所谓 “不可能” 的 代码 其实 可以改进之后,这事儿在 eBay 内部引发了一场战争,最终,eBay 解雇了大约 3000 名企业 版 Java 程序员。官方虽然没有给出数字,但我从内部得到的信息是,有 3000~8000 名左右的企业 版 Java 程序员被炒了鱿鱼,因为 CTO 想找别人来改进公司。
只要你去看看 2008 年以来的许多银行,你会发现总有一些由程序员控制的僵化技术,他们认为保持僵化就可以保住饭碗。这种态度的讽刺之处在于,这种顽冥不化最终会毁了公司,从而让他们丢掉工作,而且也让他们以后很难找到工作。
eBay 程序员就是这种恶果的极好例证。他们中的许多人甚至无法切换到 Android 开发。我知道有很多人转而从事与编程无关的工作,或者干脆退休。他们中的大多数人在 eBay 工作了几十年,没有其他成就,也没有能力学习任何新的编程语言。他们没有潜在的副业可做,没有额外的技能可供展示,也没有办法解释他们是如何花了 20 年时间来维持 虚拟机的运行。
很多人会告诉你:不要在家里用额外的时间来写代码,他们试图把这种观点看作是无产阶级对晚期资本主义机器的某种反抗。我出生在一个非常贫穷的家庭,我可以告诉你,这些人没有一个是真正贫穷的。那些真正贫穷的人想要工作,他们知道有可能会在一瞬间失去一切,所以,他们会尽其所能继续工作。工作并不可耻,也不是失败的标志。
但凡让你少工作的人都不是你的朋友。对于任何想赚更多钱而感到羞耻的人也是如此。通常情况下,这号人一般都有家庭或配偶罩着。如果他们突然失去了工作,他们还有第二学位,而编程技能只不过是通往其他工作的一块小小的踏脚石;或者他们只是在妄想,认为自己会永远拥有轻松的工作。他们的经历和你我完全不同,所以,如果你需要工作,并且你还想继续从事 程序员这份职业 ,那么你绝对应该离那些在一家公司只学习一门编程语言的人远点儿。
事实上, 做副业就是你对抗公司贪婪的主要手段 。要利用一个拥有选择权的人很难,根据我的经验,工作之余从事一些额外项目,给我带来的好处比任何工作都要多得多。我可以有把握地说,我在职业生涯中所学到的一切都是从我的个人项目中学到的,而不是从我从事的工作中学到的。我还可以说,我在编程中最大的乐趣和享受,就是从事我自己的项目。
因此,我将给你列举一些理由,来说明副业对任何经验水平的程序员都是有好处的。
时至今日,仍然有一大群程序员还天真地认为从事副业是一种压迫。但事实是,副业给了你选择权,而拥有选择权就意味着自由。如果副业是用另一种编程语言完成的,当你用新语言找到更好的职位时,你就可以选择离开。你也可以把这些副业转化为你自己的新业务。
如果你所做的全部工作就是处理公司的代码,那么你实际上就会陷入他们特定的代码品牌和做事方式中。 除非那家公司是 Facebook、Apple、Amazon、Netflix、Google 等科技巨擘之一,否则,在找新工作时,你的经验在很多方面都会对你不利。
你工作的公司就喜欢这样的,因为他们知道你永远不会跳槽,因为你已经没有新技术的经验,而且新技术学习起来非常困难。你将只需坐在那里看护 JVM,而不是试图找一份依靠 Go 编程语言的新工作,因为学习 Go 非常难。
你不应该把副业看成是不情愿的事儿,这样,一旦公司倒闭后,你还能找到新工作。你应该将它看作是通过培训和学习让你有更多的选择余地,这样你就可以更自由地找到一份新工作。
公司永远不会给程序员与他们影响力相匹配的工资。你每年可能会得到 2% 的加薪,这还赶不上货币的通胀率。当然你也可能会得到一点点奖金。但与此同时,你的代码却是你的公司赚取数十亿美元乃至数万亿美元的主要原因。你也许会得到一些股票期权,这大概是你得到加薪的唯一途径,永远。
这个行业经常需要新的人才,所以加薪的最简单方法就是换一位工作。换工作可以让你因为做同样的事情而得到增长 20% 到 100% 的报酬。
如果你认为你的老板会把你的最大利益放在心上,那么你就是在妄想。他们只想从你身上得到最大的回报,同时又能给你尽可能少的报酬。你也应该采取相应的行动,保持掌握你的技能,并找到你所能找到的、最好的工作。有一个好方法可以让你的选择留有余地,那就是你有公开可用的副业项目。
将工作换到一种新的热门编程语言是提高工资的有效方法。如果你坚持让古老代码正常工作,你就别想能够跳槽到薪水更高的职位。你需要证明你可以用 Go、Rust、Nim、Zig 或其他热门编程语言来编写代码。公司雇佣你就是为了让你能够开发一些东西,通过在副业项目中使用新技术开发东西,而你可以很容易证明这一点。
如果一门语言是新的,那么你该如何获得这份工作呢?最近有一则新闻说 IBM 想招聘在 Kubernetes 上具有 12 年工作经验的程序员,要知道 Kubernetes 诞生才 6 年,但要求有一定的工作经验实际上是非常普遍。那你该如何获得新技术方面的经验呢?答案就是:副业项目。
公司知道,如果他们在新技术方面提供培训,员工学成后就会选择离开。当你的代码是该公司市值达到一万亿美元的原因时,你为什么还不离开一家拒绝给你加薪的公司呢?
在工作中,你会因为试图使用任何新技术而被指责为 “特立独行” ,哪怕这项技术在性能上是一个巨大的飞跃,并被 Google 或 Facebook 使用。
所以,获得新技术唯一途径就是自己培训自己,而在编程方面唯一有效的培训就是去构建东西。人们付钱给你不是为了让你知道 Haskell 中的 Monad 是如何工作的,而是为了让你用 Haskell 中的 Monad 来构建东西。所以,如果你从来没有构建过什么东西的话,那他们怎么相信你能真正做出他们需要的东西呢?
你永远不会因为你的工作而收到任何实质形式的“致谢”。你只不过是机器上的一个小小齿轮,没有直接证据可以证明你在大多数公司做过什么。如果在 eBay 只用 完成所有的工作,找新工作时就只得撒谎了。但是在副业项目上使用一门新的编程语言,可以表明你实际上是能胜任的。
除非电影风格的致谢名单成为编程的规范之前,你还得需要副业项目来展示你的技能。
你可能会感到奇怪,为什么 eBay 的 Java 程序员不能直接去做另一个 Java 工作呢?为什么不直接进入 Android 开发领域呢?那是因为他们实际并不懂 Java,他们懂的只是 。
程序员都有一种错觉,认为自己在公司里所使用的语言是 “标准” 的,然而事实并非如此。你对这种语言的使用是非常特殊的,并且还是为这家公司量身定做的,它基于错综复杂的历史,这使得它与其他人对这门语言的使用相比,显得很奇怪(因为其他人也都认为自己对这种语言的使用是标准的)。
要打破这种错觉(并使自己保持清醒)的唯一方法,就是在公司代码库之外,用完全不同的编程语言做一个副业项目。这将帮助你在未来找到新工作,因为从外部经验来看,你更符合新的编程趋势。
如果仅在 上编程,就意味着你将只能在 上工作。行业变化是很快的,新工作紧跟潮流,所以当你需要或想要一份新工作的时候,你需要做的是:紧跟趋势。
鉴于编程工作的创造性,许多公司的工作环境对程序员来说是令人难以置信的压抑。当你在一家公司工作时,你将被迫使用他们认为你应该使用的工具,而不是最适合你的工具。如果这家公司采用 Eclipse 和 Java,那么你将使用他们特有的 Eclipse 品牌。要是他们使用 WebStorm,那你也将会使用 WebStorm。如果你使用了任何不同的东西,等待你的就是不断的嘲笑和骚扰。许多编程环境对程序员的效率和技能来说,都是压迫性的虐待和威胁,而他们希望通过这样的方式,让程序员随时可以被替代。
那些 MBA 们喜欢整齐划一的齿轮,让他们可以随时更换,他们并不认为你是一个有创造力的人。你只不过是一台机器,他们将模糊的句子灌输进去,然后期望后端能生产出可靠的软件。任何不够通用的东西,都会被视为对企业的冒犯而被关闭。如果你重视自己心智的健全,你就会花一些空暇时间做一些你喜欢的事情。
很多人认为公司在招聘之前要求查看他们作品是不公平的。他们觉得,有些公司竟然还敢要求他们证明自己会编程,认为这很令人反感:编程可不是表演艺术!
而现实是,编程确实已经成为一种表演艺术。你必须展示你的工作,参与团队协作,提交代码审查。你必须将想法写在白板上,并谈论你想要做的事情。你必须参加会议,将你的东西兜售给其他人。
但是,那些能用副业项目来证明自己确实能写代码的人,他们同时对其他任何形式的行业表演都没有问题。他们管理着一个精心策划的 LinkedIn、Instagram 和 Twitter 账户,这些社交网站支持他们展示在开发方面的杰出工作,每年在 30 个会议上发表演讲,还拍了一些梦幻般的专业照片……
事实上,你的副业项目已经证明你可以胜任这项工作,而且可以独立完成。现在编程是表演性质的,这很令人讨厌,但我们必须接受。
你不一定非要写老板让你编写的代码。你可以去做任何你想做的事,那么为什么不去编写能改善你生活的代码呢?如果你所有的编程经验仅仅是你在公司所做的工作,那么很显然你会讨厌它的。
如果你回家后,做一些你感兴趣或者对你生活有直接影响的事,那么这就是学习编程的力量来源。我能理解为什么有些程序员新手认为编程只是他们的第一份工作中要做的事情,但实际上,它远不止这些。当你掌握了这项技能,你甚至可以让你的生活实现自动化。
我用代码研究新的音乐理论,将枯燥的税收工作自动化,为亲朋好友搭建商业网站,还创建了我的整个网络业务,这些最初只是我的一个副业。副业给我了行动和旅行的自由,让我不再惧怕冒险。它们成为了我抵御糟糕的经济、糟糕的老板、糟糕的公司以及全球大瘟疫的安全网。我有信心,我可以在任何地方工作,我可以证明我可以在任何地方做任何事。
当然了,下班后写代码并不是必须的,但如果你想在你的职业生涯中能有所选择,并且充分利用这项技能,那么我强烈建议你这样做。
那些哀叹不得不从事副业的人,没有意识到编程能力就是你的生产资料。现在,你几乎可以不花一分美元就能开展线上业务。很多服务都是免费开始的,甚至不需要招聘一位额外的程序员就可以启动项目。
作为程序员,你自己就拥有终极工具,可以无成本的开创自己的新事业。你可以设置自己的虚拟主机,注册你的公司,创建你的域名,甚至可以使用 btcpayserver 之类的东西来接收你的比特币。你也可以做顾问,在你所在的地区提供编程服务,帮助小微企业等等。
我能理解那些有孩子、家庭的人可能没有时间,但是,绝大多数抱怨自己没有时间做副业的人显然是有时间的。我想起一个人,他每天发布大约 200 条推文,但就是 “没有时间做副业” 。
我建议,如果你认为自己没有时间,就每半个小时记录一次,连续两周,看看你把时间都花在哪里了。老实说,如果你不去干一些傻事,你就会发现自己实际有大把大把的时间。
我非常喜欢做那些最终能让自己感到快乐的事情。如果不得不在家里从事副业,让你感到悲伤和愤怒,我劝你还是别做了。找点别的事情来打发你的时间吧。但是,如果你想在这个行业拥有长久的职业生涯和最终的自由,那么你就必须接纳这份工作的表演性质,并在业余时间独立工作。老实说,副业项目就是确保你不会因为悲剧性的事件而失业的唯一方法,而且,副业也是编程中真正乐趣所在。
作者介绍:
Zed A. Shaw,由 Addison/Wesley 出版的《 “笨办法” 学……》系列丛书(The Hard Way Series)的作者,包括《 “笨办法” 学 Python》(Learn Python The Hard Way)等等。
原文链接:
https://learnjsthehardway.com/blog/07-your-side-projects-are-your-future
在 2G 落后、3G 跟随、4G 并跑之后,中国在 5G 时代成为领跑角色。
属于中国的 5G 时代开启,除了资金投入、基站建设、5G 新机价格,还有一个焦点问题备受关注:5G 到底能怎么用?有哪些具备潜力的“5G+”行业应用值得关注?
近日山东省工业化信息化厅会同山东联通、山东移动、山东电信对接集团总部,在全国范围内提出了 100 个可复制、可推广的解决方案,共 136 页的报告中包含 300 个 5G 应用场景案例集,为加快我国 5G 行业应用提供参考。
想要了解 5G 在哪些行业应用最为广泛?
想了解上海商飞如何通过 5G 把运营成本降低 20% 以上、生产效率提高 20% 以上?
想知道火爆的 5G+ 医疗、5G+ 教育都有什么典型的应用实践?
点击下方链接,即可免费下载 300 个 5G 案例集。
【 PDF 下载链接】: http://gk.link/a/10kv9
(报告部分内容截图)
5G 已落地应用于制造、医疗、新媒体、能源、教育、交通、安防、文旅、农业、金融等数十个不同行业, 其中以工业互联网、制造和能源、医疗、教育和交通安防行业的 5G 应用最为广泛 。
5G+ 制造: 上海商飞、宝马数字工厂、一汽、京东物流、雅戈尔、青岛港、福州港、山东钢铁等企业均将 5G 与 AI 等前沿技术结合,用于生产制造过程。其中上海商飞通过将 5G 带入车间工厂,实现将 C919 大飞机复杂无比的系统工程化繁为简,运营成本降低 20% 以上,生产效率提高 20% 以上。
5G+ 医疗: 浙江邵逸夫医院、清华大学长庚医院、山东省立医院、首都医科大学附属北京朝阳医院等全国多所医院正在探索将 5G 用于医疗急救、远程会诊、远程示教 / 直播、远程手术、远程监护、移动查房等不同医疗场景。2019 年 9 月,青岛大学附属医院副院长牛海涛教授带领团队,借助 5G 网络与 3000 公里外的贵州省安顺市西秀区人民医院实验室连线,完成国内跨距最大的远程实验动物微创手术,这也是全球首例基于 5G 网络环境下的超远程自主原研机器人手术。
5G+ 教育: 5G 正帮助贵州师大、克孜勒苏柯尔克孜自治州、成都泡桐树小学、凉山小学等偏远地区学校的学生得到更好的教学环境和教学效果,通过 5G 网络进行 VR 远程授课,可以让多个学校的师生在同一个虚拟世界中进行沉浸式学习。
5G+ 交通: 借助 5G 网络,可以实现公交车无人驾驶和远程驾驶,同时可以将车内视频和车辆信息实时回传到调度中心,实现公交车的智能化调度和运行,目前 5G 智能公交已经落地青岛、杭州、武汉、郑州、雄安等地。
……
想要了解更多“5G+”行业应用典型案例,点击 http://gk.link/a/10kv9 ,即刻免费下载 300 个 5G 案例集吧。
各位程序员大佬们们,激动的消息来了,平时调侃的“祖传代码”真的实现了,哈哈!
图片来自 Pexels
GitHub 前不久公布了一组照片,你的代码已经被打包运往北极保存。只要你 2020 年 2 月 2 日以前贡献过的开源代码,现在都已经被埋在北极的冰雪之下,保存一千年。
据 GitHub 官方统计,已经有数百万的程序为这个北极代码仓库(Arctic Code Vault)计划做出了贡献。
为了表彰这些程序员们,GitHub 还设计了荣誉徽章。只要鼠标在开发者主页资料介绍部分悬停,就能看到有哪些项目被放到了北极,下面是网友的主页勋章,哈哈。
本来 GitHub 在去年 11 月的 Universe 2019 大会上公布了这项激动人心的计划:将开源代码作为人类文明的火种留给后台,放在一个环境稳定、远离人类战火的地方。
具体的存放位置是在北极圈内一个岛上的地窖里,这个岛位于下面地图中最北边的红圈。
今年 2 月 2 日,GitHub 对网站上所有开源项目进行了一次快照存档,然后计划让团队成员亲自护送这批代码到北极。
然而万万没想到,疫情爆发了。GitHub 团队只能与合作方,也就是胶片数据存储公司 Piql 保持远程联系。
他们先将 21TB 的代码数据交到这家公司位于挪威德拉门的工厂。代码被写在了 186 箱胶片里,胶片每帧都包含 880 万个像素点,源代码以 QR 码的形式存储其中。
然后这 186 箱胶片被运到挪威首都奥斯陆,装上飞机运往距离欧洲大陆北部 1000 公里远的斯瓦尔巴群岛。
代码最终降落在斯瓦尔巴群岛上一个只有几千人的小镇朗伊尔城。这里人迹罕至、气温寒冷,有几百米厚的冻土层,非常适宜存放胶片。
当地的山上有个退役煤矿,相当于一座人类文明的“诺亚方舟”,许多国际组织在这里存放重要物品,还有一个保存全世界农作物种子的全球种子库,GitHub 的代码就被安放在这里,预计可以保存 1000 年以上。
未来将用玻璃存代码,用胶片存代码不是 GitHub 的唯一手段。被微软收购后,GitHub 将有幸尝试微软的最新“黑科技”。
去年微软对外公布了一个 Project Silica 项目,就是用激光刻蚀石英玻璃来存储数据。
石英玻璃是一种耐用的存储介质,抗电磁干扰、抗水、抗热,可提供保存数据长达几万年之久。
GitHub 说,石英玻璃是永远为后代保留世界开源软件的理想存储介质,所以将这项黑科技作为新的代码保存手段。
现在,GitHub 已经在玻璃中存档了 6000 个世界上最受欢迎的开源存储库。等到该技术成熟且成本下降后,应该会有更多的代码被写到玻璃中。
到那时你的代码可以被保存几万年,想想是不是更激动了呢?先别想那么多,快去看看你的哪些代码被存放在北极了吧!
网友们看到这个消息后,都乐了,纷纷表示自己的 Bug 再也洗不白了!
出处:转载自微信公众号码农每日一题(ID:DailyQueation)
对我来说,在我二十多年的工作经历来看,期间经历了很多技术的更新换代,整个技术模式、业务模式也是一直变来变去,我们这群老程序员成长中所经历的技术比今天的程序员玩的还更杂更多。
图片来自 Pexels
我罗列一下我学过的,而且还被淘汰掉的技术,大家先感受一下:
- MIS应用开发:FoxPro,PowerBuilder,Delphi - OA:Lotus Notes,VBScripts - 微软:ODBC/ADO,COM/DCOM,MFC/ATL,J++ - 服务器:AIX,HP-UX,SCO Unix - Web:CGI,ISAPI,SOAP - RPC:CICS,Tuxedo - J2EE:Websphere,Weblogic - DB:Sybase,Informix
我想说的是,无论过去还是今天,我们这些后浪和你们前浪所面对的技术的挑战和对技术的焦虑感是相似的,我们那个时候不但玩 996,还玩封闭开发(就是一周只能回家一天)。
当然,唯一好的东西,就是比起今天的程序员来说,我们那个年代没有像微信、微博、知乎,抖音这些巨大消耗你人生的东西。
所以,我们的工作、生活和成长都有很效率,不会被打断、喜欢看书、Google 还没有被封……
当然,那时代没有 StackOverlow 和 Github 这样的东西,所以,能完成的东西或质量都一般。
当然,这里并不是想做一个比较,只是想让大家了解一下两代程序员间的一些问题各有千秋,大同小异。
在整个成长过程中,其实有很多东西是相通的,其本上来说,就是下面的三件事:
第一,如果想要把控技术,应对这个世界的一些变化,需要大致知道这个世界的一些规律和发展趋势,另外还得认识自己,自己到底适合做什么?
在这个趋势和规律下属于自己的发挥领域到底是什么?这是我们每个人都需要了解的。
第二,打牢基础,以不变应万变,不管世界怎样变化,我都能很快适应它。基础的重要程度对于你能够飞多高是相当有影响的,懂原理的人比不懂原理的人能做出来的事情或是能解决的问题完全是两个层级的。
第三,提升成长的效率,因为现在社会的节奏实在太快了,比二十年前快得太多,技术层出不穷,所以我们的成长也要更有效率。
效率并不单指的快,效率是怎么样更有效,是有用功除以总功(参看《加班与效率》),怎么学到更有效的东西,或者怎么更有效学习,是我们需要掌握的另一关键。
下面是我这多年来的一些认识,希望对你有帮助。
世界发展趋势
我个人经历的信息化革命应该分成三个阶段:
1990 年代到 2000 年,这个时代 MB 时代,是雅虎、新浪、搜狐、网易门户网站的时代,这个时代就是 ISP/ICP 互联网提供商,把一些资讯数字化,然后发布到网络上。
2000 年到 2010 年,这个时代叫 GB 时代,或是叫多媒体或 UGC 时代,上网开始变得普遍了,每个人手里的数码设备开始变得多了起来,可以上传照片,可以上传视频,甚至可以在网上做社交。
2010 年到 2020 年,这个时代叫 TB 时代,这过去的十年是移动互联网时代,移动互联网只需要手机在线,不需要依靠电脑。
因为手机随时在线,所以个人的各种各样的数据始终在被收集,只要用户上网就会产生数据,所以人的行为最终也被数字化了。
所有的硬件和软件都是跟着需要处理的数据而演进的,我们需要更大的带宽,更大的硬盘,更多的处理器……
大到一定时候就只能进入分布式化的技术架构了,再大,数据中心也顶不住了,就会要引入更为分布式的边缘计算了。
另一方面,从业务上来看,我们可以看到整个世界就在不断地进行数字化,因为,只要数字化了,就可以进行复制传播和计算。
只要可以进行计算了,就可以进行数学建模,就可以自动化,只要可以自动化了就可以规模化,只要可能规模化了,就可以改变整个行业。
人类的近代史的大趋势基本上都是在解决能源和自动化的事,源源不断的能源是让机器不知疲倦的前提条件,用机器代替牲口,代替人类进行工作是规模化的前提条件。
所以,技术的演进规律基本是自动化加规模化,从而降低成本,提升效率。这就是为什么世界变得越来越快,人类都快跟不上节奏的原因,主要是整个社会不断被机器、数据所驱动。
人才需求
在这个过程中,需要什么样的人?下面是我的一些认识:
技工,在机器和自动化面前,肯定是需要能够操作机器的技术工人了,这类人是有技术的劳动力。
在编程的圈子里俗称“码农”,他们并不是真正的工程师,他们只是电脑程序的操作员,所以,随着技术门槛的下降或是技术形式的变更他可能就会变得越来越不值钱,直到被淘汰掉。
特种工,这种人是必须了解原理和解决难题的一类人,他们是解决比较难的、特定的一些技术问题。
当一种技术被淘汰,他并不容易被淘汰,因为他懂原理,原理就是解决问题的能力,是解决问题的套路和方法。
工程师,不但是使用技术,还可以把活儿做好,他们认为代码更多的时间是在维护,这些人使用各种各样的手段和各种技术,精益求精地持续不断地提高代码的易读性、扩展性、可维护性和重用性,这个过程似乎永无止境。
对于这些有“洁癖”,有“工匠精精”,有“修养”的技术人员,我们称他们为工程师。这种人做事又稳又快,而且可以做出很多称手的工具和方法论。
再往上是设计师和架构人员,这些人主要是开发一些工具,框架,模式,提升软件开发和维护效率,同时也提升用户体验,和提升稳定性、性能、代码重用等,总的来说就是为了降本增效。
这类人的工作降低了技术得到门槛,他们把技术门槛降低了以后,就可以把这个技术普及开来,就可以由广大劳工、技工、特殊工人使用了。
还有一类人是经理,经理主要是组织团队、完成项目、创造利润。这类人中,即有身先士卒的 Leader,也有高高在上的 Boss。
但无论怎么样,这些人只不过是为了让一个公司或是一个团队更好组织在一起的“粘合剂”,这类人只有在大公司中才会变成更有价值。
这就是我总结的世界需要哪些人才,我们了解这些东西以后大概就明白我们现在所处的位置有什么样的问题,我们应该去什么样的地方。
Google 评分卡
接下来,我们再来看看 Google 的 SRE 的自我评分卡:
0 – 对于相关的技术领域还不熟悉。
1 – 可以读懂这个领域的基础知识。
2 – 可以实现一些小的改动,清楚基本的原理,并能够在简单的指导下自己找到更多的细节。
3 – 基本精通这个技术领域,完全不需要别人的帮助。
4 – 对这个技术领域非常的熟悉和舒适,可以应对和完成所有的日常工作。
对于软件领域 – 有能力开发中等规模的程序,能够熟练和掌握并使用所有的语言特性,而不是需要翻书,并且能够找到所有的冷知识。
对于系统领域 – 掌握网络和系统管理的很多基础知识,并能够掌握一些内核知识以运维一个小型的网络系统,包括恢复、调试和能解决一些不常见的故障。
5 – 对于该技术领域有非常底层的了解和深入的技能。
6 – 能够从零开发大规模的程序和系统,掌握底层和内在原理,能够设计和部署大规模的分布式系统架构。
7 – 理解并能利用高级技术,以及相关的内在原理,并可以从根本上自动化大量的系统管理和运维工作。
8 – 对于一些边角和晦涩的技术、协议和系统工作原理有很深入的理解和经验。能够设计,部署并负责非常关键以及规模很大的基础设施,并能够构建相应的自动化设施。
9 – 能够在该技术领域出一本经典的书。并和标准委员会的人一起工作制定相关的技术标准和方法。
10 – 在该领域写过一本书,被业内尊为专家,并是该技术的发明人。
SRE 需要自评如下这些技术或技能:
– TCP/IP Networking (OSI stack, DNS etc) – Unix/Linux internals – Unix/Linux Systems administration – Algorithms and Data Structures – C/C++ – Python – Java – Perl – Go – Shell Scripting (sh, Bash, ksh, csh) – SQL and/or Database Admin – Scripting language of your choice (not already mentioned) _____________ – People Management – Project Management
这个评分卡是面试 Google 前需要候选人对自己的各种技术进行自评,也算是一种技术人员的等级的度量尺,其把技术的能分成 11 个等级,希望这个评份卡能够给你一个能力提升的参考标准。
认识自己
知识了世界是怎么发展的,也知道技术人员的种类和层级,那么还要了解一下自己,因为如果不了解自己,那么你也无法找到自己的路和适合自己的地方。
我觉得,一个人要认识自己就需要认识自己的特长、兴趣、热情、擅长等,下面是一个认识自己的标准方法:
特长:首先你要找得到自己特长。你要认识自己的特长,找到自己的天赋,找到你在 DNA 里比别人强的东西,就拿你的 DNA 跟别人竞争就好了。
所以你要找到自己可以干成的事,找到别人找你请教的事,你身边人找你请教就是说明你有特长。这是找到自己特长非常非常重要,扬长避短。
兴趣:如果你没有找到自己特长,就找自己有兴趣有热情的东西。什么叫兴趣?兴趣是再难再累都不会放弃的事。
如果你遇到困难就会放弃不叫兴趣,那叫叶公好龙。不怕困难,痴迷其中,就算你没有特长,有了这种特质,你也是头部的人才。
方法:如果你没有特长,没有兴趣和热情就要学方法。这种方法就是要有时间观念,要会做计划,要懂统筹、规划对于做过的事情,犯过的错误多总结,举一反三,喜欢自己找答案,自己探究因果关系,这是一些方法,自己总结一些套路。
勤奋:如果你没有特长,没有兴趣,也没有方法,你还能做的事就是勤奋,勤奋注定会让你成为一个比较劳累的人,也是很有可能被淘汰的人随着你的年纪越来越大,你的勤奋也会越来越不值钱。
因为年轻人会比你更勤奋,比你更勤奋、比你斗志更强,比你能力更强,比你要钱更少的人会出现。勤奋最不值钱,但是只要你勤奋至少能够自食其力。
以上就是为了应对未来技术变化,作为个人必须要从特长、兴趣、方法一层一层筛选挖掘,如果没有这些你就要努力和勤奋。就只能接受“福报”了。
从我个人而言,我不算是特别聪明的人,但自认为对技术还是比较感兴趣的,难的我不怕。
有很多比较难啃的技术,聪明点的人啃一个月就懂了,我不行,我可能啃半年。
但是没有关系,知识都是死的,只要不怕困难总有一天会懂的。最可怕是畏难,为自己找借口,这样就不太好了。
打好基础
最前面提到我学的各式各样的被淘汰的技术,会让你感觉很迷茫,或是迷失。
但前面也提到了“谷歌评分卡”,在这个评分卡中,我们看到了许多基础原理方面的内容,其实要应对未来的变化,很重要的一点就是无招胜有招,以不变应万变。
变化都是表面的东西,内在的东西其实并没有太多的变化。理论层面上变得不多,反而形式上的东西今天一个花样,明天一个花样,所以如果要去应对这种变化,就一定要打牢自己的基础,提升内功休养。
比如像编程的一些方式和套路,修饰模式原理本质,解耦,提升代码的重用度等。
提升代码重用度必须解耦,要跟现实解耦,提升抽象,这些都是一些技术基础。无论用什么语言,都是这么做的。
打牢基础就可以突破瓶颈,不打牢基础没有办法突破瓶颈。在技术世界不要觉得量变会造成质变,这是不可能的。
技术这个东西就像搞建筑砌砖头,砌砖头砌的再多也不可能让你能成为一个架构师的,因为你不懂原理,不懂科学方法,你就不可能成长上去的。
就像学数学一样,当你掌握了微积分这种大杀器后,你解题的能力是无所披靡,而微积分这种方式绝对不是你能“量变”出来的。
所以你必须学习基础的理论知识,如果不学这些基础理论知识,还要学习解题思路和方法,如果你只学在表面,那么当这个技术的形式有变化,就会发现以前学的都没用了,要重头学一遍。
掌握技术基础可以让自己找到答案和知识,基础是抽象和归纳,很容易形成进一步的推论。
我们学的很多技术实现都逃不脱基础原理,不管是 Java,还是其他语言,只要用 TCP 用的都是相同的原理,逃不出范围,只要抓住原理,举一反三,时间一长了,甚至还可以自己推导答案。
对于技术的基础,我会把它分成四类:
程序语言:语言的原理,类库的实现,编程技术(并发、异步等),编程范式,设计模式……
系统原理:计算机系统,操作系统,网络协议,数据库原理……
中间件:消息队列,缓存系统,网关代理,调度系统 ……
理论知识:算法和数据结构,数据库范式,网络七屋模型,分布式系统……
这些知识其实就是一个计算机科学专业的学生他所要学习的原理,但可惜的是,我们的一些学校教得也很糟糕,不但老师能力不足,而且放着世界上最优秀的教课书不用了,一定要自己写一本。
讲也讲不全,还有各种错误,总之,如果你学习用用到的教材不行,那么可以肯定的是你的学习效率一定是很糟糕的。
这就是为什么我们大学上完了,还是跟个傻瓜一样,还要在工作中再重新自学。不过,就算自学,这些基础技术大概需要四五年的时间堆叠。
我工作二十年了,这二十年来基本还是这些原理没变,无论形式怎么变,但是核心永远还是这些,理论创新很难,这是以不变应万变。
学习效率
谈到学习效率,就需要拿出这张学习金字塔的图来了。
从图可以看到学习方法分布两层,一种是被动学习,也是浅度学习,听讲,阅读,视听,演示都是在被动学习,而与人讨论,自己动手实践,教授给别人是主动学习。
主动学习我们称之为深度学习,如果你不能深度学习,你就不能真正学到东西。这也是你会经常有“学那么多干什么,不用就忘了”,这就是浅度学习的症状了。
下面,我给出一些我自己觉得不错的学习经验:
①挑选一手知识和信息源
对于学习方法:第一我们一定要到知识源去挑选知识,知识信息源非常关键,二手信息丢失太大了,谭浩强写的书就丢失太多信息了。
目前计算机一手知识基本都是国外的,所以英文非常重要。我鼓励大家一定读第一手的资料。
如果你英语有问题,至少要看翻译过来,最好是原汁原味翻译的,不要我理解了给你讲那种,那种也是被别人嚼一遍再讲给你你没有体会,是别人带着你,别人的体会会影响你,也许你的体会会比他更好,因为是你自己总结出来的东西,所以知识源很重要。
②注意原理和基础
虽然可以忘记这个技术,但是原理记在心里,我可以徒手实现出来,而且通过原理可以更快学习其他类似的技术。所以原理很重要!当你学会 C、C++ 要学 Java 和 GO 都很快。
③使用知识图谱一定要学会使用知识图,把知识结构化
从一个技术关键点开始不断地关联和细化下去,比如:关于 TCP 协议,首先第一个要记住状态图,怎么建立连接,怎么断连接,状态怎么变迁。
TCP 没有连接,是靠状态维护连接的。其次,要了解 TCP 怎么保证可靠性,就是丢包以后怎么重传,重传有哪些技术点。然后,重传会让你联想到拥塞控制,拥塞控制到滑动窗口。
这基本就是 TCP 的所有东西了,找到关键点,然后顺着这个脉络一点点往下想,通过知识图关联就可以进行顺藤摸瓜。
我们不需要记所有知识,那些手册的知识不需要记,你知道在哪里能找到就可以了。
你脑子里面要有地图,学一个东西就跟在城市生活一样,闭上眼睛就知道地图,A 点到 B 点怎么去大概方向要知道。我在北京我去广州,广州在南边,我大概坐飞机还是火车要心里有数。。
④学会举一反三
就是用不同方法学一个东西,比如说学 TCP 协议,看书是一种方法,编程是另外一种方法,还有用做 Debug 去看的,用不同方法学一个东西会让你更加熟悉,你学一个知识的同时把周边也学了。
比如说学前端能不能把 HTTP 学一下,比如说长连接、短连接,包括 hp1、hp2 有一些不一样的东西。
⑤总结和归纳
只有学会总结和归纳,才能形成自己的思维框架、自己的套路、自己的方法论,以后学这个东西应该怎么学。
就像学一门新的语言,不管 GO 语言,还是 Rust 语言,第一件事情就是了解内存是怎么管理的,数据类型什么样,第二是泛型怎么搞,第三是并发怎么弄。
还有一些抽象怎么弄,比如说怎么解耦,怎么实现多态?套路这种东西只有学的多了以后才能形成套路。
如果你只学会一门语言不会有套路,你要每年学门语言,不用学多精,你思考这个语言有什么不一样,为什么这个这种有玩法,那个有那种玩法,这些东西思考多了套路方法论就出来了。
比如说 Windows 和 Linux 有什么不同,Linux 和 Unix 又有什么不同?只有总结自己的框架、套路和方法,这些才永远不会被淘汰。
⑥实践和坚持
剩下就是多做多练,多坚持,只有实践才会有经验,只有锻炼了才能够把自己的脂肪变没,所以,要把知识变成技能必须练,就像小学生学会加减乘除,还是要演练,必须多做题,题目做得多了,自然掌握得好。
要挑选好的知识源,注重原理技术,有一些原理的基础的书太枯燥,但是我告诉你学习这些基础太值得投入时间,搬砖赚几十元不值得,因为赚的是辛苦钱,老了就赚不了,必须要赚更有能力的钱,这是学习投资。
小结
如果你想更好的把握时代,提升自己,你需要知道这个时代的趋势是什么,需要什么样的人,这些人需要什么样的能力,这些能力是怎么获得的。
投入到基础知识的学习就像“基建”一样,如果基础不好,不能长高,学习能力也是需要适应这个快速时代的重要的基础能力,没有好的学习能力,很快就会掉队被淘汰。
这些东西,是我从业二十年来的总结和体会,希望对你有用。
作者:陈皓(左耳朵耗子)
简介:20 年软件开发相关工作经验,10 年以上项目和团队管理经验。擅长底层技术架构,团队建设,软件工程,软件研发咨询,以及全球软件团队协作管理。对高性能,高可用性,分布式,高并发,以及大规模数据处理系统有一些经验和心得。喜欢关注底层技术平台和互联网行业应用。技术擅长 C/C++/Java 和 Unix/Linux/Windows。曾于 Amazon 中国任研发经理,负责电子商务全球化业务(全球开店)和全球库存预测系统的研发。曾在阿里巴巴北京研发中心、商家业务部曾任资深专家一职,负责电商云平台、开放平台,云监控和电商多媒体平台。曾在阿里巴巴核心系统专家组从事阿里核心系统和阿里云 ECS 相关的虚拟化平台的开发工作。现在创业中,MegaEase 创始人,致力于为企业的高并发高可用架构提供一整套的技术解决方案和产品。
编辑:陶家龙
出处:https://coolshell.cn/articles/20977.html
数据迁移的重要性和挑战性不言而喻。它涉及在服务器的升级、合并、以及维护的过程中,将数据重新放置到另一个数据中心;或是向某个重要的流程中添加数据湖(data lakes)与数据仓库(warehouses,请参见--https://developers.paragon-software.com/blog/data-warehouse-vs-data-lake/?utm_source=dzone.com&utm_medium=guest_articles&utm_campaign=concise_guide_to_data_migration)。
数据迁移本身具有一定的复杂性。由之产生的停机时间,以及数据被损坏、甚至是丢失等风险,迫使我们需要在了解其流程的基础上,制定出可靠的数据迁移与实施方案。
下面,我将为您准备一份简明的数据迁移指南,您可以从中了解到如下方面内容:
数据迁移的定义以及原因;
数据迁移的不同阶段、类别和策略;
数据迁移的关键实施步骤;
数据迁移的三种常用工具。
什么是数据迁移?
顾名思义,数据迁移就是将数据从一个计算环境转移到另一个计算环境中。而在实际传输数据之前,我们需要对数据依次进行选择,准备,提取和转换。此外,数据的迁移过程还包括验证已迁移的数据质量,以及关闭旧的数据系统等方面。
迁移数据的原因
如开头所述,数据迁移的原因五花八门。总的说来,我们可归纳为如下原因:
服务器例行维护;
服务器或存储设备的更换、升级、以及合并;
应用程序的迁移;
灾难恢复操作;
迁移到新的数据中心。
迁移数据的好处
数据迁移可以帮助公司在提高或维持系统性能的同时,保持在业内的竞争优势。数据存储运能、以及存储数据本身的质量,会随着时间的推移而逐渐变得低下,因此我们应当采取相应的步骤,通过将数据升级或迁移到另一个数据存储系统中,来提高自身的价值。此外,数据迁移对于识别和消除系统中的无用数据,以及协调各个数据库之间的关系,也是非常实用的。
数据迁移、转换与集成
数据转换只是整个数据迁移过程中的一个步骤,该过程主要是将数据从一种格式转换为另一种格式。而数据集成则是合并来自不同源头的数据,并为用户提供该统一的数据视图。
数据迁移阶段
数据的整个迁移过程大致可分为三个主要阶段:计划、迁移和迁移后。下面我们来详细讨论每个阶段中的具体行动步骤。
规划
确定需要迁移的数据,包括:数据的格式、所在的位置、及其敏感性。
定义数据迁移的范围,包括:需要分配的资源和实际可用的预算。
对源系统和目标系统,分别进行深入分析。
确定数据迁移的过程是否会影响到正常的业务运营,进而通过对其进行调整,以避免业务的中断。
迁移
验证对于硬、软件的需求。
确保迁移的过程可以被定制,并能够按预期运行。
从旧系统中读取并提取数据。
将数据加载到新的系统中。
验证迁移过程是否已完成。
迁移后
验证转换后数据的准确性和完整性。
通过并行运行两套系统,以发现存在的差异或数据是否有丢失。
记录与报告。
最终淘汰旧的系统。
数据迁移的类别
存储迁移(Storage migration)是一个将大量数据从旧的存储系统,移动到新的存储系统的过程。数据既可以位于磁盘上,也可以位于云端。而存储迁移的主要因素包括如下三个方面:
技术上的更新。
通过数据的验证和优化,以发现过时或被损坏的数据。
针对存储效率低下的问题实施整改。
数据库迁移(Database migration)是将数据从一个数据库移动到另一个数据库的过程。如下三大因素往往会触发数据库的迁移:
需要升级到最新版本的数据库。
通过将数据迁移到另一个数据库,以降低成本并提高性能。
将多个数据库中的数据合并到一个数据库中。
应用迁移(Application migration)是指在应用的内部、应用之间、不同应用提供商之间、以及不同的平台之间移动数据的过程。应用迁移是一个复杂的过程,源环境与目标环境之间可能存在着巨大的差异。由于某些应用程序依赖于特定的平台与设计,因此为了保证在迁移后能够平稳地运行,它们往往需要某些中间件来弥合技术之间的鸿沟,以及切换过程中的复杂性。
云迁移(Cloud migration)是将数据、应用程序和其他业务元素,迁移到云计算环境中的过程。云迁移有多种形式,例如:我们既可以从本地数据中心转移到公有云上,也可以将数据从一个云平台移到另一个云平台,甚至可以将数据移出云端环境(即:云退还,cloud repatriation)。
数据迁移策略
我们可以在实践中用来实现数据迁移的方法可谓不胜枚举。总的说来主要有两种策略,它们分别是:Big Bang迁移和Trickle迁移。其中Big Bang迁移倡导的是将数据的迁移操作作为一项一站式的活动。也就是说:所有实时系统都会在数据经历ETL(Extract-Transform-Load)流程,以及过渡到新系统时,会出现宕机时间。而Trickle迁移则提倡采用增量的方法,分阶段进行数据迁移,从而保证新旧系统能够处于并行运行的状态。
数据迁移的关键实施步骤
尽管具体实施的方法因行业而异,但是我在此为您总结了如下通用的数据迁移步骤:
检索和评估源系统;
定义和设计迁移步骤;
建立迁移的实施方案;
执行现场测试;
在迁移前备份源数据;
采用变更管理并执行数据迁移;
执行实施后的数据质量审核。
数据迁移的三大工具
Paragon Drive Copy Professional(https://www.paragon-software.com/home/drive-copy/?utm_source=dzone.com&utm_medium=guest_articles&utm_campaign=concise_guide_to_data_migration)
Paragon Drive Copy是Hard Disk Manager(硬盘管理器)的一部分。作为一款既易用又实用的软件,它可以让您将任何源数据迁移至任何目标位置。Drive Copy的主要功能包括如下几个方面:
能够创建不同的备份,并管理各种分区;
可实现数据迁移(例如:将旧的操作系统迁移到新的PC上);
将操作系统克隆到USB闪存驱动器上;
将硬盘克隆到更大的HDD上;
将数据复制、或恢复到具有不同扇区大小的HDD、或其他存储设备上。
家用版:$ 79.95
商业版:从$ 99到$ 899不等,可被订阅使用。
Acronis True Image(https://www.acronis.com/en-eu/personal/computer-backup/)
Acronis能够将可靠的备份方案,与复杂的反恶意软件技术相结合,以提供增值的安全功能。在数据迁移方面,Acronis Disk Cloning(磁盘克隆)工具提供了如下功能:
可实现可靠的备份和恢复;
可将存储介质从HDD轻松地转变为SSD;
可对HDD的镜像采取复制、格式化、以及分区等操作。
软件费用每年从 49.99至 99.99不等。
Zinstall(https://www.zinstall.com/)
作为一个完整而直观的数据迁移软件包,Zinstall Migration Kit Pro可用于如下场景:
将数据从外部HDD传输到SSD上;
无需网络连接即可传输数据;
选择性地传输虚拟化的数据;
迁移到那些基于Apple Mac的Windows环境中。
专业版售价:169美元
【原标题】Concise Guide to Data Migration (作者: Dmitry Rogov)
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】
据外媒报道,美国芯片巨头英伟达收购日本软银集团旗下英国芯片设计子公司Arm的谈判正在加快进行,双方进入排他性谈判阶段。预计今年夏末完成!收购价格将达到最高400亿英镑!(按当前汇率约为524亿美元)
软银CEO孙正义此前曾对于ARM接下来的处境表示:全部出售、部分出售或者IPO上市都有可能。
消息人士称,这次收购对Arm的估值可能高达400亿英镑,有望在今年夏末完成。
今年4月,总部位于剑桥的ARM首次被软银(Softbank)挂牌出售,当时高盛(Goldman Sachs)受雇四处试探买家。当时,据称软银代表已经接触了英伟达、台积电、富士康、苹果、高通和三星在内的几家,针对收购 Arm意向进行多方问询。
今年4月,高盛与苹果进行了接洽,后者对收购没兴趣。标准晚报了解到,摩根大通随后试图想组建一个包括高通、三星和英伟达在内的财团,让这些财团都持有 Arm 的股份。
三星显然已经远离谈判桌,英伟达处于领先地位,其次是台积电和富士康。现在看来,英伟达开出的400亿英镑价格,让其「稳操胜券」。
今年来,软银一直在苦苦挣扎,在 WeWork 等标志性投资失败后,该公司出现了严重亏损。
从这个意义上讲,可以理解软银创始人孙正义希望ARM能卖出400亿英镑(根据现在汇率约为524亿美元),远远超出了2016年买Arm时花费的240亿英镑(普遍报道为320亿美元)。这约为200亿美元的「溢价」可以很大程度上缓解软银的资金困难。
与此同时,很多问题还面临着不确定性,英国政府曾坚持要求软银保留 Arm 在英国的总部,这笔交易可能会受到英国政府的严厉批评。目前尚不清楚在英伟达收购达成后,Arm总部是否还是会继续留在英国。
英国议员们敦促,政府应该干预ARM与英伟达之间的谈判,以确保继续在英国创造就业机会,并将总部保留在剑桥。另外,剑桥工党议员丹尼尔·泽克纳称,政府应该确保这些条款在出售的情况下依然能够得到执行。
其实早在多年前,ARM联合创始人赫尔曼·豪瑟(Hermann Hauser)曾批评出售给软银这一举措,并表示,出售给NVIDIA将会是一场「灾难」。将会损害ARM的中立性和满足多家不同公司和供应商需求的能力。
他上周表示:「如果它成为英伟达的一部分,那么,大多数被许可人都是英伟达的竞争对手,「他们可能会放弃ARM。」豪瑟已要求英国政府进行干预,以期在允许英国唯一一家真正的科技巨头落入外国所有之后,恢复某种民族自豪感。
Evening Standard报道称,这项交易还可能导致英日贸易谈判紧张。英国原本希望在明年永久脱欧之前,与日本迅速达成一项贸易协定。
各方均拒绝置评。
在8月初的报道中就提出,这次交易或将是芯片行业史上最大的一笔收购案。
如交易完成,NVIDIA 将从收购 Arm 带来的协同效应中获益。这一进展也标志着这家 GPU 制造商最近疯狂收购的延续。英伟达于4月27日正式完成了对以色列 Mellanox 技术公司的收购,结束了长达13个月的艰难跋涉。此外,在5月4日,NVIDIA 宣布将收购开放网络软件公司 Cumulus Networks,收购金额不详。
wccftech报道,迄今为止,英伟达的股价已经距离去年同期上涨了95% 左右,超过了英特尔市值765.4亿美元。
近年来,英伟达已经将自家在图形图像处理芯片方面的主导地位,转移到了人工智能处理等新领域,并在新兴的自动驾驶市场也占据了一席之地。甚至在AI芯片领域,英伟达一骑绝尘,和一直以来的劲敌英特尔拉开了不小的差距。
就在今年7月初,英伟达股价再创新高,一度超越英特尔成为美国「最有价值」芯片公司,当时市值约2513.1亿美元,而英特尔市值约2481.6亿美元。其股价在过去五年暴增1900%,芯片新势力英伟达市值反超竟然成为事实。黄教主的霸主梦似乎近在咫尺。
这几年,英伟达的GPU让英特尔有点吃不消了。虽然目前ARM对英特尔的X86够不成威胁,但是如果英伟达搞ARM CPU+GPU 的方案,将对英特尔造成实质性打击,有可能促使英特尔和AMD关系升温,来对抗英伟达+Arm。
如果这一交易最终达成,对国产 ARM CPU 厂商将造成很大打击,ARM在美有重要的研发中心,英伟达收购ARM后,是否会受到美国禁令的影响?国内厂商还能否得到Arm的授权,都存在很大问题。
要知道,英伟达可是一家美国企业。到时候他可以随意「操纵」Arm在各国的「许可证」。
另外,苹果、三星、华为等大厂的芯片都是在ARM基础上构建的。此前就有消息说,受美国禁令影响,Arm官方曾指示员工暂停与华为海思的「所有有效合同、支持津贴,以及任何尚未签订的合约」,彼时Arm还在英国,如果Arm被英伟达收购,对华为来说形势就更严峻了。
评论预测称,一旦Arm成为了英伟达旗下子公司,如果美国政府仍不对华为技术解封,那么华为就永远都无法获得ARM公司的最新芯片架构授权,而目前华为只拥有ARM V8芯片架构的永久授权,这表明华为海思芯片只能够使用老版本的CPU、GPU芯片架构。
看来要想冲出「断供」重围,还得靠自己,不依赖别人的技术。
在网友看来,英伟达收购Arm简直吊打英特尔和AMD。
网友表示,「结合三星和AMD联合搞猎户座GPU,明年移动端GPU或许可以看见AMD、英伟达、苹果和高通互锤的壮观场面!?」
英伟达收购Arm,对于Arm客户之后的选择,网友这样认为,「Arm 的客户可能也会开始寻找代替方案。无论届时Arm如何保证自己的中立性,美国公司对其收购后,Arm作为唯一非美国主流计算平台的优势都会消失。因此,Arm老客户可能会转向RISC-V这样的开源指令集架构」。
还有网友心存疑惑,「英伟达完成收购后,Arm的GPU业务还会保留吗?」
这位网友的评论瞬间亮了!他给演算了一下英伟达收购Arm之后的芯片命名。
「A78芯片架构之后的命名应该是这样的:
A79、A79Ti、A79Super、A79Ti Super、A79(1W)、A79 Max-Q ......」手动捂脸
一位外国网友发表了一篇文章,称英伟达对Arm的收购十分「不明智」。「他们可能有一个Nvidia-Arm组合的愿景。不过,首先,他们不得不克服一系列的监管障碍。」
总体来说,沸沸扬扬的「英伟达收购Arm」已一锤定音。就像评论家和网友们所分析的,今后的路要复杂得多。
但不管怎样,400亿英镑,芯片史上的收购案,又被改写了。
虽然COVID-19的疫情还远未结束,在不太遥远的将来,可能还会突然出现更多的麻烦。现在是IT领导们开始为今年冬天可能出现的第二波爆发做好准备的时候了。
乔治梅森大学Volgenau工程学院的信息科学与技术教授Massimiliano Albanese警告称,最糟糕的情况可能还没有到来。“虽然我们从未真正从第一次COVID-19的疫情中恢复过来,但是我们可能会再次看到第二波的感染,这将迫使那些开始让人们回到实体办公室的组织重新开始完全的远程办公。”他说。
让你的组织准备好应对另一次大规模的COVID-19爆发需要一个有洞察力的、详细的计划,能够针对最坏的情况,但希望它永远不会到来。遵循以下的七个步骤将可以帮助你开始做好准备。
1. 建立弹性文化
斯蒂文斯理工学院信息系统项目主任兼副教授Paul Rohmeyer建议,IT应该接受自己作为内部关键基础设施提供者的角色,并相应地设定自己的运营预期。“具体而言,IT需要建立一种文化,这种文化将能够认识到未来的中断、大流行或其他的一些情况肯定会导致对IT专业人员的需求的增加。”
IT领导们还应该让他们的团队做好准备,以应对COVID-19的第二次大爆发,这可能会要求他们工作更长的时间,而且可能还要在大多数员工都将在当地得到庇护的情况下前往数据中心和其他地点。这种意识应该体现在两方面,Rohmeyer指出。“员工需要做好在危机中被召唤的准备,管理层也需要认可和奖励那些负责维持企业生存的个人和部门。”他说。
黛博拉心肺中心的副总裁兼首席信息官Rich Temple建议,在当下这个不确定的环境下,保持灵活和沟通是很重要的。“没有人确切知道下一次疫情会以何种形式爆发,但我们知道的是,我们必须集体推倒壁垒,迅速转向,并做好能够瞬间成功部署的新技术和工作流程的准备。”
医疗成本分摊部门和计划提供商OneShare Health的首席信息官Toby Buckalew建议,加快抛弃那些可能会妨碍或阻碍分散团队成功部署的遗留基础设施和系统。“你需要重新思考做事的方式;重新考虑你的路线图,”他说。今天就开始为即将到来的新常态做好准备吧。“这意味着你需要与高级管理层合作,以了解新的业务运营战略,”Buckalew指出。
计划固然重要,拥有一定的决断力也是必要的。“你可以拥有世界上所有的ITIL和最佳实践,但如果你不能在紧急情况发生时跳上船,并快速做出决定……你就真的死在水里了,”Temple说。“每个人都必须做好准备,不惜一切代价来解决眼前的危机。”
2. 评估可用的IT资源
IT应该确保远程员工拥有在家有效工作所需的所有资源,包括硬件和软件。
“第一波的新冠疫情的确让我们措手不及--尽管我们本应对此有更深刻的认识--而且我们向远程工作过渡的情况也远非理想,”Albanese说。
在第一次停工期间,糟糕的计划和准备让昂贵的IT资源都闲置在了废弃的办公室和实验室里,而员工却在家里使用着劣质的硬件和软件平台工作。
“我们本可以更好地规划未来,以便更有效地利用资源,”他说。Albanese还建议IT部门的领导检查他们的协作工具组合是否有足够的冗余和多样性。如果协作平台突然发生故障或变得无法访问,那么访问替代工具对于确保工作流的不间断就是至关重要的了。
Rohmeyer还建议让远程访问尽可能简单和直观,因为在最初的COVID爆发期间,许多帮助台都被困惑和沮丧的用户支持请求搞得不知所措了。“访问控制,包括多因素认证,都需要以一种一致的、简单的方式呈现,以便使具有一般技术技能的用户也能够接受,”他解释说。
另外,保持对升级的了解和保持关键资源的更新也是很重要的。“例如,当大流行来袭时,对Windows 7的支持在几个月前就结束了,很多机器仍然需要升级到Windows 10,”Albanese说。“许多被带回家的机器无法进行远程升级,许多被留在家里的机器也无法升级,因为没有人在那里重启它们。”
3. 评估和更新在家工作的连接工具
连通性是使在家工作成为可能的基础,然而许多组织在最初的COVID爆发期间却经历了严重的容量问题。
“确保你的安全远程访问平台是可扩展的,能够支持100%的用户,”技术咨询公司DMW Group的负责人James Breeze建议。“通常,组织会将其远程访问平台的并发性调整为20%到50%,但当需求显著增加时,就可能会遇到性能或可用性的问题了。”
根据特定的远程访问平台,获取和安装能够扩展到支持所有用户水平的硬件和网络连接可能需要相当长的时间。“而使用基于云的等效方案取代旧的远程访问解决方案……将可以在不需要硬件投资的情况下实现快速扩展,”Breeze观察到。
4. 从第一次COVID关闭期间所犯的错误中学习
随着IT团队将注意力集中在新的、更直接的问题上,几个月前学到的经验将被逐渐遗忘。例如,一个组织可能会在大流行的头几天里努力获得足够的虚拟专用网容量和带宽,并意识到尽快部署额外的虚拟专用网端点或增加带宽会是一个好主意。
“然而,随着疫情的继续蔓延,他们可能从未执行过这一意图,也没有找到解决办法,”数据中心支持服务提供商Park Place Technologies的首席信息官Michael Cantor表示。“现在是时候检讨这些变化,并在下一次疫情爆发前实施它们了。”
5. 更新你的业务连续性计划
为确保在另一次严重的COVID关闭期间,运营不会被中断或延迟,请更新组织的当前业务连续性计划(BCP),以包括从第一次爆发中所吸取的教训。
“每个组织都应该有一个BCP,并且希望在他们将员工转移到新的地点时也能遵循它,”Cantor说。“花时间审查目前的BCP,确认它已经包含了从第一次执行中所学到的所有教训,然后现在就应用这些教训,这可以确保组织能够为下一次爆发做好准备。”
6. 把数字化转型项目放在最重要的位置
在前COVID时代,数字化转型和相关的商业项目,如在线订购、路边取货和非接触式采购,经常面临资金不足的状况。“但大流行已经把这些举措变成了企业生存的必要条件,”商业咨询公司Capgemini的人工智能工程副总裁Goutham Belliappa指出。IT可能需要与其他技术部门合作,以迅速将创新概念部署到生产当中,同时发现与客户互动的新方式,并保持其业务的开放和繁荣,他指出。
虽然许多企业在过去几年中会在现代化项目上节省开支,但最初的COVID爆发也证明了持续的IT基础设施发展的价值。“在一个组织的基础设施中创造灵活性,将是在另一场大流行浪潮或其他可能迫使企业迁移业务的事件中幸存下来的关键,”Buckalew说。
Buckalew建议,无论何时何地,都要提倡虚拟化。“虚拟化基础设施和工作站可以解决组织即将面临的大多数挑战,”他说。做好测试是成功的虚拟化基础设施部署的关键。“测试不需要具有侵入性,但它应该是有效的,”Buckalew指出。“派遣关键员工远程工作一两天是对他们完成工作能力的良好测试。”在多个地点执行测试,参与者可以来自整个组织,这将进一步提高识别任何需要解决的问题的机会。
7. 加倍投入网络安全
对于网络犯罪分子来说,企业的混乱就是他们的梦想,他们会非常渴望利用新的、而且往往保护不力的远程访问技术所造成的安全漏洞。大流行病的爆发会导致安全团队的衰弱,这为数据小偷和其他系统攻击者创造了一个理想的机会。
Breeze建议,IT主管们需要让他们的网络安全团队比平时更加警觉。“随着员工的减少...IT安全和支持团队可能会受到限制,而未修补的系统或响应事件的延迟也为网络攻击者提供了更多机会,”他解释道。“随着工作和个人生活之间的界限越来越模糊,”Breeze补充道,在办公室之外工作的人将越来越多,这也可能使企业更容易受到网络钓鱼或恶意网络的攻击了。
随着前端工程的发展,组件化的思想早已深入人心;现代的前端框架 React/Vue 等,都是围绕组件设计;组件化的开发模式,大大提高了开发效率;设计和开发高质量高复用性的公共组件,可以更好地保持产品迭代的高效和稳定。
我们以 React 的技术栈为背景,在日常的需求与迭代中, 历时两年多时间,沉淀出了携程用车各大产线(接送机 / 包车 / 打车服务等)的公共组件(机场、航班、城市、地址、时间控件等)。通过持续交付了一系列的组件库,让各个产线的开发小组不用再各自维护重复而难以迭代的代码,完成了前端组件与公共方法的收口,解决了用车前端业务组件一致性的问题。同时随着组件库工作流上的逐步完善,让前端开发同学脱离了刀耕火种的开发方式,进入了全新的自动化构建与高效开发的时代。
开发和维护一个可持续迭代的组件库,从来都不是一件容易的事情。本文将从组件库的基础搭建开始,从开发、打包、发布、拆包、优化、自动化测试等各方面,由浅及深地进行介绍,给大家分享一个相对完善的组件库落地的过程。同时也会介绍组件库的迭代过程中真正会遇到哪些问题,以及我们是如何解决这些问题的。希望这些实战中的经验,可以带给大家一些启发和想法。
在组件库的设计之初,我们最先需要考虑的是,如何让 npm 包的发布流程安全、可靠可行。为了保证代码的安全性,公司内部会独立维护内网的 npm 管理平台。
在最早的发布设计中,我们仍然通过官方定义的 cli 命令,在本地通过设置 registry 指向内网仓库后,执行 npm publish 进行发布。
可是对于公司内部而言,平台开放而 BU 众多,任何人都可以对任何已发布的包进行常规操作,这会带来一系列的不安全因素。最终在前端委员会的推动下,我司实现了内网 npm 与 gitlab ci 的关联。将发布操作迁移到了 gitlab 上,在发布权限上有一定的约束;通过开启 npm deploy 插件,以实现可视化交互式的发布管理,同时得益于 gitlab hook 的强大, 我们更是在流程实现了 push event 来触发 auto publish,这一系列的进步,让我们的组件库在后续的发布流程上变得更加正式、稳定而可靠。
Npm 关联 gitlab 后,通过指定指定分支下特定目录的 package.json,实现版本升级后自动发布
我们的技术栈涉及 ReactWeb 与 React Native, 对于 RN 的代码,我们一般会走源码直接发布,RN 项目中的编译过程会自动处理 node_modules 里的源文件。但是对于 Web 组件库而言,更传统的做法,则是需要在发布之前进行一些编译和转码,这样才能确保发布之后的 npm 包,可以在大多数环境下正常运行起来。
对于 Web 端组件库的打包,我们进行了多次的探索和优化。
使用 webpack 对每个组件进行单独打包,打包类型由 umd 改为 commonjs2。
module.exports = {
output: {
filename: '[name].js',
path: path.resolve(__dirname, '..', 'dist'),
library: 'Tha',
libraryTarget: 'commonjs2' // umd
}
}
通常我们对组件库的建议是 umd 打包,因为这样可以实现多种模块方案的加载通用性。但在实践过程中发现,每个组件都需要单独打包时,UMD 的打包方式,会显著增大每个文件的基础体积;而且我们 99% 的场景下,其实已经并不用再去兼容 AMD、CMD 等模块加载方式。
在确保我们的代码一定是通过 node 模块方式加载的时候,我们只需要打出 commonjs2 的模块即可。这一步的调整,显著地提升了打包速度,也明显减小了各个文件的打包体积。
进一步编译优化
对于组件库而言,使用 webpack 进行打包,即使是使用了 commonjs2 的模式,繁重的配置工具仍然是显得重了一些,而且需要额外配置各种 external 规则,以防止打包时打入了额外的第三方库的代码。使用 rollup 来处理组件库的打包固然比 webpack 要合适,但是又会额外引入新的构建工具,增加学习成本。
最终我们选择的更优化的方案,是使用 babel 直接做编译转换,不使用任何额外的构建工具,也不做压缩优化处理 ---- 这些工作,在现代化的前端项目中,都会自动处理,不需要组件库再做多余的构建动作。Babel 直接转码的方式,帮助我们省去了很多复杂的配置工作,并且让组件库打出来的生产代码更加容易调试。
优化前,使用 webpack 等构建工具打包组件:
{
"scripts": {
"build:components": "webpack --config https://www.easemob.com/news/build/webpack.config.js --color",
"build": "npm run build:components && npm run build:css && npm run copy_package"
}
}
优化后, 编写脚本直接对组件源文件转码
{
"scripts": {
"build:components": "cross-env NODE_ENV=production node https://www.easemob.com/news/build/trans"
}
}
提取组件中的样式文件,单独打包
Css-in-js 的开发方式固然是方便许多,但是在打正式包时,内嵌的 css 实际会占用更多的代码体积,并且 node_modules 里的 js 代码中如果有显式 require css 的语句时,在同构项目中,可能会遇到服务端解析 css 文件的各种问题。
为了解决这个问题,我们提取了所有组件的 css 进行单独打包。其中所有的基础组件样式,会整体打包成一个 main.css;而复杂业务组件的样式,则会以组件为单位进行单独打包,以便实现后续流程中业务组件的按需加载。
与各大知名的开源组件库类似,为了减少项目的打包体积,我们对组件库中的复杂业务组件,如航班组件、机场组件、城市选择组件等,设计了按需加载的模式。
对 RN 而言,我们直接利用了 require 的特性,通过修改导出对象的 get 方法,显式地声明了 lazyLoad 的组件程式。
module.exports = {
// 按需动态加载的模块
get AddressList() { return require('https://www.easemob.com/news/Address/List').default; }
};
对于 Web 而言,我们采用了类似 ant-design 的方式,在前面对业务组件的 css 进行单独打包处理后,通过在项目中引入 babel 插件的方式,实现组件的按需加载。
import { Address } from '@ctrip/thanos-ctrip-mobile/components.biz'
随着组件库的不断迭代,组件代码会不断增多,需求也会越来越复杂。其他研发同学也可能会开发独立的 npm 组件包,但是会基于已开发完成的组件库的部分功能来实现。
这种情况下,开发其他 npm 包的同学,可能只想使用当前已有库中的部分功能,而不太愿意引入一个完整而庞大的组件库。为了使组件库的功能更加独立且通用,让 UI 组件与功能模块之间更好地解耦,我们需要对组件库进行拆子包处理。
如组件项目中基础 UI 部分,从组件库中剥离,拆分成独立的 ui-basic 组件库;组件项目中工具方法(表单校验、环境判断、正则处理、时间日期格式化等),拆分成独立的 util 库。这种拆分组件包的开发形式,组件库不再是所有功能都揉在一个仓库中,开发和维护将变得更加灵活且易于扩展。
拆包前,core 的部分将随着功能的增加而越来越臃肿:
拆包后的结构:
如图所示,拆分独立功能包后,可以让我们扩展和组合出更多灵活多样的组件库,让组件库不再单一而臃肿。
拆分子组件包后,给组件库的多样性扩展带来了极大的便利,但随之而来的问题便是,每一个子组件包都需要单独维护,在开发子组件包时,每一个包都需要一个可运行的本地开发环境。
随着子组件包的数量逐渐增多,给每一个包都单独设立一个开发环境,必然会带来更大的维护成本。我们目前选择的解决方案是,对于粒度更细的子组件包,所有的子包会公用一套 dev 的开发仓库,通过 git modules 在开发仓库中嵌套子模块仓库,实现了只维护一套开发环境,产出多个子模块包的组件库工厂。
在这种环境下,还可以做到当子模块之间存在相互依赖时,可以直接引用相对路径下其他模块的源码,不必为了调试某个模块的代码,而跑到 node_modules 里去翻找,徒增调试难度。
为了让组件库的开发流程更加规范,减少接入方的沟通成本,对组件库进行适当的文档梳理是十分必要的,我们使用 gitbook 编写组件库的文档,并部署到公司内部的 books 平台上。同样借助于 gitlab 强大的 web hook 的能力,实现了文档仓库的自动更新与发布。
与此同时,我们也启用了协同开发的模式,让组件库成为一个内部的开源库,用车产线的研发同学,可以通过提交 issuse 和 merge request 的方式,自行对组件库中的个别需求进行开发,提升开发效率。
单元测试
当组件库在开发和交付流程上趋于完善后,在公司 G2 战略背景下,为了保证代码的高质量,我们开始在组件库中接入自动化单元测试。接入单元测试也是一项十分曲折的过程。在测试技术框架的选型上,综合考虑了当前技术栈、框架市面通用性等多种因素,最终选择如下:
测试框架:Jest
选取原因:对 React 技术栈友好,同时也是 React-Native 官方推荐的测试框架
测试库:
web 端 -> @testing-library/react
RN ->@testing-library/react-native
选取原因:React 的官方测试库,对 hooks 类型的组件支持度高,选择这两个库,也是为了能够保持后续与 react 官方版本更新的同步
自动化与持续集成
在接入单元测试后,我们依然借助 gitlab 的 CI/CD,对整个组件库的流程进行自动化构建与持续集成交付,在内置 CtripDevOps 或者自定义 gitlab-ci.yml 的配置下,我们将单元测试的环节加入到了 pipeline 中,同时通过公司统一的 sonar 检测,提供最终的组件库质量统计报告。
要搭建一个相对完善的组件库,都是需要经过一系列项目的沉淀的。目前而言,组件库的开发流程上依然会存在一些问题,比如版本管理、升级回退等。时间是最好的老师,相信在后面的迭代中,我们依然能够保持初心与热情,积极探索与发现,构建出更加完善的前端工程体系。
作者介绍:
剑桥,携程资深前端开发工程师,关注自动化工具开发、前端工程自动构建相关技术。
本文转载自公众号携程技术(ID:ctriptech)。
原文链接:
https://mp.weixin.qq.com/s/ZIRV8zHf_hQNhRZJx-q6UA
Hans Ulrich Obrist 曾说过:“我所做的一切都与速度有关”。我们非常赞同。与大多数公司一样,无论是远程办公的新方式、预算变化,还是其他各种原因,总有一些事情会影响你团队的速度。这些影响因素,你无法控制,因此你怎样确保开发人员能以最佳速度工作?
我们联系了一些客户,对这个主题进行了一些研究。我们发现,导致他们开发速度下降的主要原因有5 个。虽然很多看起来很平常,但我敢保证,它们同样至关重要,应该尽快解决,以确保你的团队能在生产力和效率方面有所提升。
必须赶在 Deadline 之前完成任务的压力是众所周知的。按时交付成果绝非易事,根据具体情况,这几乎是不可能的。无论你处理的是远程团队管理、裁员、削减财务预算,还是其他各种障碍,压力都是真实存在的。
更进一步,当人们只是简单地专注于维持速度时,谁还会想到提高速度呢?当在 Deadline 前完成任务是你的唯一目标时,想办法做得更好并不是你的首要任务。
那么,解决方案是什么呢?首先,对初学者来说,你要明确团队大部分的时间都浪费在哪些地方。我们建议首先询问你的开发人员他们在哪里浪费了最多时间,然后深入。一旦你深入挖掘并找到痛苦的根源,也就能找到合适的工具来解决它了。
例如,我们的一个客户发现他们在调试时浪费了很多时间。他们的开发人员反复执行整个部署过程,等待设置日志行,然后等待获得所需的信息,并希望这些信息是正确的,以便修复他们正在处理的 bug。一旦他们解决了这种痛苦的重复过程,就能大大加快他们上市的时间了。
你有没有做过这样的噩梦:有人在追你,但你只能以慢动作逃跑?有时候开发软件就是这样。是慢动作这部分,而不是疯狂的斧头杀手那一部分。就速度而言,没有什么比感觉自己举步维艰更令人沮丧了。如果是由于公司内部流程缓慢而造成的,情况就更糟了。
软件开发周期可能会很长。无论你是在等待代码审批,还是必须经过另一个 CI/CD 周期(yawn),遇到部署瓶颈或其他各种障碍,它都会非常缓慢。以部署为例,你需要部署的越多,需要等待部署瓶颈释放的时间就越长。因此,你坐下来,喝着咖啡,等待瓶颈释放,并想知道为什么这些循环有时比最初编写实际代码所花的时间还要长。
我们的客户也有同样疑问。他们发现,当他们对代码进行故障排除时,依赖于添加日志行并等待多个周期或重新构建- 测试- 重新部署。这是一个极其漫长的过程,每次他们需要排除故障时,都会浪费开发人员的大量时间。
不过,实际上不一定非要这样,我们不是故意的。说真的,通过将需要继续进行的流程与开发周期的其他部分分开,可以使自己和开发人员免于陷入到缓慢的开发周期中。想象一下,在这样一个世界中,你可以直接从设置的断点跳到获取修复正在处理的问题所需的数据上。
有时候,你会发现作为一个开发经理,你的工作精力有限。无论在什么情况下,拥有合适的开发人员以及拥有足够的开发人员,这对于团队的成功至关重要。然而,你会发现自己陷入了困境。如果你需要雇佣新员工来完成更多工作,那就意味着需要招募大量员工,而这需要大量的时间和资源,而这些是你本来就没有的。如果你不雇佣新人,那就意味着要用有限的精力来实现你的目标。显然,这两种情况都不理想。
正如我们的一位客户提到的那样,他们意识到他们并没有充分利用自己的资源来最大程度地提高效率,而且他们的开发人员将大量时间花在研究生产环境的问题上。他们找到了一种工具,可以帮助开发人员在生产环境中进行调试,并最终为他们在每个 bug 上节省了大约 1 个小时或更多时间,让他们能专注于创造价值的任务。
像我们的客户那样做,通过事半功倍来避免选择。找到可以让你能充分利用现有资源的工具和方法,特别是开发人员。其中一些工具能帮助你实现代码的自动化或减少代码的复杂性。与其制定一个新员工的入职流程或试图在有限的资源下工作,不如充分利用现有工具,以确保你不必在这两个选项中做出选择。
速度降低的另一个原因是修复 bug 所花费的时间和资源。你会发现开发人员的大部分时间都花在修复 bug 上,而不是花在开发新代码或创建新功能上。调试对于运行良好的机器(即你的软件)来说是必不可少的。然而,它完全耗尽了开发人员的时间(准确地说是 60% ),从而降低了开发速度。
对那些花了无数时间进行调试的人来说,即使你认为已经结束了,但它并没有。这可以 从“完成”(done)的定义中看出,“完成”指的是“当软件产品必须满足的所有条件或验收标准都得到满足,并准备被用户、客户、团队或消费团队所接受时”。无论你是如何实现它的,这都意味着每个使用该软件的人(不论他们在软件的哪一端)的所有需求都得到了满足, 它才会被认为是真正完成了。然而,获得这种水平的成品可能需要投入大量时间,这使得开发人员无法专注于产品的其他方面(这些方面同样需要他们关注)。
那该怎么办?你是选择做得好的产品,还是持续优化的半成品?相反,我们建议尽快找到能为你提供所需数据的工具和方法,以解决bug 并缩短解决bug 的时间。通过释放开发人员处理bug 的时间,让他们有更多的时间来处理其他事情,包括确保你的软件达到完美状态。
我们一个客户提到他们缺少合适的Lambda 调试工具。这大大降低了他们开发新特性的时间,延长了发布新补丁所需的时间。他们了解到,无论如何,他们都需要找到一种方法来帮助他们的开发人员进行调试。
数据使世界运转。但通常情况下,你的开发人员可能会被大量数据所淹没。实际上,软件开发的每个方面都需要数据。然而,这种对数据的迫切需求导致开发人员积累了大量数据,这些数据大多会在代码中制造噪音并分散开发人员的注意力。
通常,正如我们的一位客户所发现的那样,这种过剩的数据可能是由一种称为 Logging FOMO 的现象造成的。它代表了对丢失日志行及其所包含数据的恐惧。开发人员非常害怕丢失某些内容,以至于他们设置了过多日志行,希望其中的某个能为他们带来所需的数据。然而,这些日志会在系统中产生过多的噪音,并且维护这么多的日志会导致高昂的成本。
另一方面,有时开发人员并没有编写足够的日志,从而阻碍他们获取所需的数据点来继续前进并解决问题。这是一个陷阱,但它有解决办法!有些工具既可以帮你准确地获取所需的日志,也能让你在事后进行日志记录,从而避免数据过多的问题。
虽然前进的道路可能会很艰难,但这并不意味着需要沿着艰难的道路继续前进。不管环境如何影响你团队的速度,都有各种各样的解决方案可以帮他们提高速度。如果有正确的工具和方法,上述所有痛苦都可能只是一段记忆。例如,在 Rookout 中,我们搭建了一台机器,让开发人员可以毫不费力地调试,立即获得他们所需要的数据,并随时记录任何内容,即使是在 prod 中也是如此。找出团队的弱点,并消除挫折感。
原文链接:
https://www.rookout.com/blog/five-ways-to-improve-developer-velocity