热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

#为99%的开发者构建

Web3 的火爆,已经让越来越多用户意识到在未来建成的元宇宙里拥有独立自主的身份数据和资产是多么的重要。而眼下 Web3 产品的匮乏,确实招致推特创始人 Jack Dorsey 关于 Web3 被 A

Web3 的火爆,已经让越来越多用户意识到在未来建成的元宇宙里拥有独立自主的身份数据和资产是多么的重要。而眼下 Web3 产品的匮乏,确实招致推特创始人 Jack Dorsey 关于 Web3 被 A16Z 等风投公司所垄断的讥讽 ,但为广大传统互联网开发者摆脱 Web 2.0 的内卷指出了明路。

不过,开发者在拥抱新世界的时候,必须意识到,无论是传统互联网还是 Web3 的技术产品开发,一样会面临本文指出的关于软件开发的神话和现实。

且看本文作者、Akita 软件的创始人和 CEO、前卡内基梅隆大学计算机科学教授 Jean Yang 提供什么样的洞察和建议。


你应该转向无服务器吗?GraphQL 是解决你的 API 困境的答案吗?你是否应该遵循最新的开发运维手册来提高你的系统可靠性?在技术工具的世界里,有很多的噪音。但它并不总是反映程序员的日常现实。

作为一个开发者工具创业公司的创始人,在过去几年里,在例行的用户研究过程中,我与成百上千、甚至成千上万的软件开发者交谈过。这些谈话的共同主题,甚至比我们正在构建的产品的需求还要大,是一个目前没有得到充分满足的总体需求:为真正的开发者,或者我喜欢称之为 99% 的开发者构建。

这些是在时髦的公司和框架之外完成工作的开发者,他们在关于「开发者想要什么」的对话中经常被忽视。在「网红开发者」所谈论的内容和大多数开发者的日常现实之间存在着巨大的差距。当你看到科技媒体报道的内容,或者顶级科技会议的演讲者,往往是来自 Airbnb 或 Stripe 这样高增长的宠儿,或者像 FAANG(Facebook、苹果、亚马逊、Netflix 和谷歌等科技巨头的缩写合称)这样成熟的高利润公司的人。

事实上,有一个长期的假设,即除了少数硅谷的独角兽公司之外,其他公司应该渴望拥有「小小 FAANG」的流程。但这越来越不真实。我们的用户会告诉我们,他们的做法与他们「应该」的样子完全不同。但对于这些如微软的 Scott Hanselman 所称呼[1]的「暗物质开发者」,Facebook 或 Pinterest 的做法是没有意义的。他们的用户需求不同,他们的团队需求也不同。

谈论 99% 的开发者很重要,因为这些开发者正在开发为我们的生活提供动力的软件 —— 保险、医疗保健、零售和银行,仅举几例。不仅仅是小公司不能轻易采用现代的、技术领先的公司的流程;大多数公司都不是围绕着技术建立的,它们有几十年的传统软件实践。许多这些公司都有相当多的资金流动。许多公司处理相当多的个人数据。如果技术创新不能让这些软件团队受益,我们就会失去对每个人生活质量的许多有意义的改善。

在这篇文章中,我将介绍一些企业软件购买者和开发者都可以接受的真理,以消除不利的误解,并提升所有人的开发体验。

「涓涓细流」的工具化是一种理想状态

神话

由于大量的编程和工具来自 Facebook、Netflix、LinkedIn、谷歌和亚马逊等公司,许多人认为有一种涓滴效应。那些有钱的公司的优秀工程师会想出很好的办法来解决其他人总有一天会遇到的问题。这只是一个时间问题,直到你的典型中小企业或财富 500 强公司遇到与亚马逊或 Facebook 一样的问题。

现实

类似 FAANG 的公司与中小企业或典型的财富 500 强公司在很多方面都不同,包括规模需求、对自建或购买的立场以及工程团队的构成。少数资本雄厚的大公司拥有整个团队,由世界上的专家专门负责可观察、测试、开发者生产力等等。除此之外,值得注意的是,FAANG 正在围绕一小部分产品进行优化,这些产品从一开始就是数字化的,这一点对于大多数软件开发商来说是不真实的。

许多非 FAANG 团队有一个小小的非专家团队,甚至是一小部分工程师并非专家,来做类似 FAANG 的公司有多个专家团队来做的事情。这些组织主要依靠外部工具和服务,而他们没有什么资源来进行定制。

该如何应对

首先,科技行业需要承认,在不同规模和不同工程预算下运营的组织有不同的需求。一个每天提供低至数百万用户请求的公司不需要像 Netflix 或谷歌那样优化其系统。大多数公司都没有延迟、数据存储和其他方面的问题,这导致他们编写自己的定制基础设施组件和工具,例如,Facebook 在其 Tao 数据存储[2]蜂巢数据仓库工具[3]方面所做的工作 —— 而且他们很可能没有必要使用这种工具。

承认不同的需求将为讨论更为广泛的组织的不同需求提供空间。例如,拥有遗留系统的公司没有能力迁移到最新的架构上,他们采用新工具的方式与新成立的公司不同,或者是那些能够拿出一个专门的团队进行大规模迁移的公司。

认识到没有一个理想的公司形象,可以帮助开发者在了解用户时跳出通常的假想。这对于以一种可实现的方式弥合软件需求和软件工具之间的差距至关重要。

没有黄金标准的开发环境

神话

如果你看了足够多的会议讲座或读了足够多的博客文章,就会发现有许多软件团队拥有纯洁的编码标准、无漏洞的单元测试、反映生产环境的暂存环境和/或应对事件的顺利的人员流程。要达到这一点,只需要一个强有力的指示和工程团队的纪律。

现实

就像任何其他领域的网红一样,网红开发者经常描述一种现实,甚至对他们自己的公司来说也是一种渴望。也许真的是这样,编写理想过程的人生活在一个理想化的环境中,这是有可能的,在这种情况下,他们是提供规则的例外。但大多数时候 —— 即使在一个组织的某个部分或某个时刻是真实的 —— 这种现实也不会在他们整个公司中永远存在。

例如,Spotify 承认,一旦他们的团队达到一定的规模,他们对开发运维的雄心勃勃的方法就无法扩展[4]。我们也看到一些例子,公司采用了新的热门技术,然后在事情没有按计划顺利进行的时候,又恢复了原状 —— 例如,Segment 从微服务转回到单体架构[5]

该如何应对

作为推动这一切的受众,开发者应该更加挑剔地要求获得真相。我们应该欢迎关于「真实的软件开发过程」的文章,就像我们对理想化内容的渴望一样。如果有人在一个理想化的过程中工作,有一个世界级的运营团队和整个团队,他们的存在是为了支持提高软件质量,那么应该让听众了解这一点!我们应该欢迎更多关于「真实的软件环境」的讲座、博文和书籍来提供指导:在人手不足的团队、没有专门的开发运维专家的团队、以及最初构建系统的人都已经离开的团队中,编码、测试和交付是什么样子的。

目标是进步,而不是完美

神话

太多的人认为,追求良好的软件质量意味着你需要完全采用那种新技术,无论是微服务、GraphQL,还是分布式跟踪。直到完全转换到理想的技术,你才算完成工作。

现实

今天,「真正的开发者」团队所处的位置和所给出的主流建议之间的不匹配,意味着许多团队在提高代码质量或系统可靠性时不知道从哪里开始。对于 99% 的开发者来说,他们的大部分代码永远不需要扩展到成千上万的组织,或者是数十亿的用户。这些开发者中的许多人所工作的代码库比他们整个职业生涯时间还要年长。这些组织大多数在内部没有专门的开发者工具或开发者生产力团队。

纯净的代码不是目标 —— 相反,目标是在其他限制条件下,代码的可靠性和安全性更有意义。例如,如果你的公司不在多个云上运行,每天部署数百个变化,那么像 Netflix 的 Spinnaker 这样的持续交付系统可能是不必要的。同样,在一个拥有开发运维专家的公司,如果他们知道如何设置和维护可观察性的「强力工具」,其开发者可能会比没有专家团队的公司在使用这些工具时要好得多。

该如何应对

认识到要取得进展 —— 从那些将整个团队投入到完善其流程的公司中可以学到一些经验,但在大多数情况下,完美是不现实的。与其全盘提升流程,不如看看哪些流程能很好地转化为资源较少的团队和具有不同目标的团队。

例如,谷歌的这篇博客文章[6]提供了这样的准则:60% 的测试覆盖率为「可接受」,75% 为「值得赞扬」,90% 为「模范」。当你是一个像谷歌这样成熟的公司,拥有谷歌工程团队的规模和水平,这可能是有意义的。但是对于大多数较小的、处于早期阶段的公司来说,尽管公司的目标是什么,但实际的测试覆盖率会少很多。随着面向服务的架构和外部 API 的兴起 —— 这些做法在谷歌之外更为普遍 —— 在生产环境中的测试[7]正在成为传统的单元和集成测试技术的一个可行替代方案,此时「代码覆盖」作为一个概念是有意义的。

在许多这样的现代系统中,正如 Honeycomb 联合创始人 Charity Majors 写道[8]:「一旦你部署,你就不再是在测试代码,而是在测试系统 —— 由用户、代码、环境、基础设施和一个时间点组成的复杂系统。」

一个好的产品演示不会显示出第 2 天的卡顿现象

神话

我们很容易陷入这样一个陷阱,即认为产品演示和上手培训能够反映出每天使用产品的体验。人们必须相对快速地对新产品做出购买决定,所以我们默认通过演示来判断一个产品。

现实

开发者的工具帝国是通过华丽的 GIF 动图和视频片段建立的。团队在看了几分钟的演示后,就对工具做出承诺 —— 有时甚至是几年。投资者根据演示进行投资。开发者被告知要专注于演示 —— 以及之后使用的前 60 秒 —— 作为产品的决定性部分。但是,虽然能够很好地进行演示可能表明团队能够在日常使用中执行开发者的经验,但这两者并不一定相关。

对于大多数值得他们标价的工具来说,开发者所经历的大部分事情 —— 以及围绕着这些事情的痛苦 —— 都发生在使用的第一分钟之外,这不应该是个意外。首先,与开发者的日常工作流程(例如,现有的代码审查、CI/CD 工作流程和协作模式)的整合是衡量一个产品是否具有粘性的更好指标,而不是最初的喜悦。例如,在开发者工具的创造者中,众所周知,与 GitHub 和 GitLab 的整合将有助于让你的工具更加有用和吸引人。

第二,有整类的工具,对其有效性的真正测试并不发生在第一天。一个例子是调试器。比起你的开发环境,比起你的 CI/CD 环境,你的调试工具箱是保证你作为一个开发者的生活质量的最关键因素。当你在部署前修复一个问题时,你是否有信心这个问题不会出现在生产环境中?当你因为生产事故而不得不加班或休息日工作时,你是否能够迅速找出根本原因并提出潜在的修复方法?由于这些工具的复杂性 —— 而且它们往往在你遇到重大问题时才显示出它们的真面目 —— 调试工具往往在良好的开发者体验方面得到最少的宣传和回报。

该如何应对

工具建造者经常极其关注第一天的体验,是因为用户如何评价工具。所以我在这里要特别呼吁一下用户。用户需要:

不要仅仅根据演示或第一天的体验来夸大工具;在你或你的开发团队花了一段时间日复一日地使用该工具之前,先不要承诺大金额合同来购买那些的工具;根据对你的团队生产力至关重要的不太「性感」的维度向其他人推荐工具,例如它们如何与工作流程整合,或者它们如何减少团队内部和跨团队的协作摩擦。

做好这些事情将为更好的开发者体验创造更大的空间。

异质性将继续存在

神话

经常有这样的假设:热门的新语言或框架就是某人系统中的全部。开发者和网红开发者都会对新的工具进行宣传,好像这些工具是唯一被使用的工具:例如,微服务架构、GraphQL 和基于 OpenTelemetry 的可观察性追踪。「一个真正的框架」的宣扬隐含着这样的假设:企业有可能完全转而使用这种新的语言、工具或框架。

现实

我遇到过很多团队,他们说迁移将在「下一季度」发生。现实情况是,即使他们设法最终开始,迁移还是成为连续的,而不是离散的过程。一个拥有原有代码的 99% 的开发者团队和一个精干的团队可能永远不会将他们的整个代码库转换为微服务或 GraphQL。对于大多数组织来说,技术栈和工具链是异质的,是多年来获得的各层语言、框架和工具的组合[9]

我们遇到的许多团队会告诉我们,他们正在开始采用微服务或 GraphQL 或 OpenTelemetry。当我问他们有多少服务已经在新的框架内时,答案往往是相当小的比例,特别是对于超过几年的组织。其中一些组织会告诉我,他们实际上并不期望转换他们的整个代码库(例如,组织将期望保持其传统的单体与微服务架构在一起,或 REST 和 gRPC 端点与 GraphQL 端点一起)。对于其他许多组织来说,当我在几个季度后检查时,他们往往在计划的迁移中没有达到预期的程度 —— 并且在现实中维持着跨框架和工具的软件。

该如何应对

软件买家,从个人开发者到主管和 CIO,都知道异质性的存在。但完全接受这一点意味着:

接受缓慢的迁移。 我遇到过很多团队,他们认为一旦完成了从过时的工具 X 到热门的新工具 Y 的迁移,他们的问题就会得到解决,每一个工具都生活在自己的解决方案生态系统中。不幸的是,对工具 X 的迁移可能直到热门的新工具 Z 才完成 —— 而现在你又有了两个生态系统的问题。接受遗留的子系统。 我遇到过很多团队,他们专注于围绕系统的较新部分进行工具箱的创新。不幸的是,遗留的子系统并没有消失 —— 它们的工具较少的情况意味着当出错时,你需要更长的分流和调试时间。

接受你的 API 不太可能汇聚到 GraphQL 上的事实,将让你投资于更可持续的、多 API 协议的工具。认识到你的组织可能不会将其所有的传统单体架构转换为微服务,将使你能够投资于那些不忽视对单体或微服务中的代码监控和调试的工具。

在开发者方面,传统的智慧是,你为「土地」努力追求同质性,为「扩展」拥抱异质性。你是否对异质性进行规划将极大地影响你的扩张速度。某些类型的开发者工具需要为每种新的语言或框架定制。例如,一个只为 GraphQL API 提供洞察的工具可能不容易扩展到其他类型的 API,特别是因为 GraphQL 包含比 REST 或 gRPC 更丰富的信息。

其他类型的开发者工具可以轻松地跨语言和框架进行扩展。一个只需要能够从不同的编程语言中调用的 SaaS 工具支持语言的异质性,因为主要的核心组件不需要被翻译来支持每一种新的语言。

References

[1] 如微软的 Scott Hanselman 所称呼: https://www.hanselman.com/blog/dark-matter-developers-the-unseen-99
[2] Tao 数据存储: https://engineering.fb.com/2013/06/25/core-data/tao-the-power-of-the-graph/
[3] 蜂巢数据仓库工具: https://engineering.fb.com/2014/04/10/core-data/scaling-the-facebook-data-warehouse-to-300-pb/
[4] 他们对开发运维的雄心勃勃的方法就无法扩展: https://www.jeremiahlee.com/posts/failed-squad-goals/
[5] Segment 从微服务转回到单体架构: https://www.infoq.com/news/2020/04/microservices-back-again/
[6] 谷歌的这篇博客文章: https://testing.googleblog.com/2020/08/code-coverage-best-practices.html
[7] 在生产环境中的测试: https://increment.com/testing/i-test-in-production/
[8] 正如 Honeycomb 联合创始人 Charity Majors 写道: https://increment.com/testing/i-test-in-production/
[9] 多年来获得的各层语言、框架和工具的组合: https://future.a16z.com/the-case-for-developer-experience/




推荐阅读
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 本文探讨了利用Python编程语言开发自动化脚本来实现文件的全量和增量备份方法。通过详细分析不同备份策略的特点,文章介绍了如何使用Python标准库中的os和shutil模块来高效地管理和执行备份任务。此外,还提供了示例代码和最佳实践,帮助读者快速掌握自动化备份技术,确保数据的安全性和完整性。 ... [详细]
  • 应用链时代,详解 Avalanche 与 Cosmos 的差异 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 解读中台架构:微服务与分布式技术的区别及应用
    中心化与去中心化是长期讨论的话题。中心化架构的优势在于部署和维护相对简单,尤其在服务负载较为稳定的情况下,能够提供高效稳定的性能。然而,随着业务规模的扩大和技术需求的多样化,中心化架构的局限性逐渐显现,如扩展性和故障恢复能力较差。相比之下,微服务和分布式技术通过解耦系统组件,提高了系统的灵活性和可扩展性,更适合处理复杂多变的业务场景。本文将深入探讨中台架构中微服务与分布式技术的区别及其应用场景,帮助读者更好地理解和选择适合自身业务的技术方案。 ... [详细]
  • 如果程序使用Go语言编写并涉及单向或双向TLS认证,可能会遭受CPU拒绝服务攻击(DoS)。本文深入分析了CVE-2018-16875漏洞,探讨其成因、影响及防范措施,为开发者提供全面的安全指导。 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • 本文深入探讨了 Git 与 SVN 的高效使用技巧,旨在帮助开发者轻松应对版本控制中的各种挑战。通过详细解析两种工具的核心功能与最佳实践,读者将能够更好地掌握版本管理的精髓,提高开发效率。 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
author-avatar
月芽2502915393
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有