新技术总是让工程师兴奋不已。新的编程范式、新的编程语言、不同的库、不同的数据库。我们总是在寻找新奇并渴望学习,但用户并不关心你的公司使用什么技术。只要你的产品有效,他们就会很高兴。
《Choose Boring Technology》这篇文章由Dan McKinley撰写,发表在Choose Boring Technology网站上。文章的主要观点是提倡在技术选型和系统设计中优先考虑“无聊的技术”(即成熟、稳定、经过验证的技术),而不是追求最新、最酷的技术。
观点解读
以下是文章的主要内容和核心观点的解读:
主要内容
- 技术债务:
- 定义:技术债务是指在软件开发过程中为了快速交付而采取的捷径,这些捷径会在未来导致额外的成本和维护负担。
- 影响:技术债务会逐渐累积,导致系统变得难以维护和扩展,最终影响业务的发展。
- 新技术的风险:
- 不稳定性:新技术往往不够成熟,可能存在未发现的bug和性能问题。
- 缺乏文档和支持:新技术的文档和社区支持通常不如成熟技术完善。
- 学习成本:团队需要花费时间和精力来学习和适应新技术,这会影响项目的进度。
- 成熟技术的优势:
- 稳定性:成熟技术经过长时间的使用和测试,已经证明了其可靠性和稳定性。
- 社区支持:成熟的社区可以提供丰富的文档、教程和解决方案,帮助团队快速解决问题。
- 降低风险:使用成熟技术可以降低项目失败的风险,提高项目的成功率。
- 案例研究:
- Etsy:Dan McKinley在Etsy工作时,强调了使用成熟技术的重要性。Etsy的成功部分归功于他们在技术选型上的保守态度,选择了经过验证的技术栈,如MySQL、Perl和Nginx。
- Netflix:Netflix虽然在技术创新方面走在前列,但在某些关键系统中仍然使用了成熟的技术,如Apache Cassandra和Amazon Web Services(AWS)。
- 如何选择技术:
- 评估需求:根据项目的实际需求和技术栈的现状,选择最适合的技术。
- 风险管理:评估新技术引入的风险,并权衡其潜在的好处。
- 逐步引入:如果确实需要引入新技术,可以先在小范围内进行试点,逐步推广。
核心思想
- 稳定性和可靠性:
- 经过时间考验的技术通常更为稳定和可靠。它们已经在各种环境和使用场景中被广泛测试,并且其缺陷和局限性也更为人所知。
- 选择这些技术可以减少意外问题的发生,提高系统的整体稳定性。
- 社区支持和文档:
- 成熟的技术通常拥有强大的社区支持和丰富的文档资源。开发者可以更容易地找到帮助、解决问题和学习最佳实践。
- 丰富的第三方库和工具链也使得开发过程更加高效。
- 降低风险:
- 使用新兴或未经验证的技术可能带来不可预见的风险,包括安全漏洞、缺乏支持、文档不足以及技术被废弃的可能性。
- 选择成熟技术可以降低这些风险,使项目更具可预测性。
- 维护成本:
- 成熟技术的维护成本通常较低,因为它们的生态系统更为完善,开发者在这些技术上的经验也更为丰富。
- 这可以降低长期的技术债务和维护难度。
- 人才获取:
- 由于成熟技术被广泛使用,拥有相关技能的开发者更容易找到。这可以降低招聘难度,并加快团队的成长。
核心观点
- 优先考虑成熟技术:
- 在技术选型时,优先考虑那些已经被广泛使用和验证的技术,而不是追求最新的技术潮流。
- 成熟技术的稳定性和可靠性可以显著降低项目失败的风险,提高项目的成功率。
- 避免过度创新:
- 过度追求新技术可能会带来不必要的复杂性和风险,影响项目的进度和质量。
- 技术创新应该服务于业务需求,而不是为了创新而创新。
- 平衡创新与稳定:
- 在某些情况下,引入新技术是必要的,但应该谨慎评估其风险和收益。
- 通过逐步引入和试点,可以在控制风险的前提下,逐步实现技术升级。
实际应用
- 企业级项目:
- 对于大型企业级项目,选择成熟技术可以确保系统的稳定性和可靠性,降低维护成本。
- 例如,金融行业通常会选择成熟的技术栈,以确保系统的安全性和合规性。
- 初创公司:
- 初创公司在资源有限的情况下,选择成熟技术可以加快产品上市速度,减少开发成本。
- 但在某些特定领域,创新技术可能带来竞争优势,因此需要权衡利弊。
- 个人开发者:
- 个人开发者在选择技术时,可以根据项目的规模和复杂度,灵活选择合适的技术。
- 对于小型项目,使用成熟技术可以更快地完成开发;对于大型项目,可以考虑引入一些创新技术来提升性能和用户体验。
《Boring Technology》这篇文章强调了在技术选型和系统设计中优先考虑成熟、稳定的技术的重要性。通过选择成熟技术,可以降低项目风险,提高项目的成功率。然而,这并不意味着完全排斥新技术,而是要在充分评估风险和收益的基础上,合理选择和引入新技术。文章的观点对于企业和个人开发者都有重要的参考价值。
相关想法
1、远离最新最精端技术
在网站/应用开发中,避免使用新技术可能有以下几个原因:
- 稳定性和可靠性:新技术往往未经充分验证,可能存在未发现的错误或漏洞。使用成熟的技术可以提供更高的稳定性和可靠性,减少潜在的风险。
- 支持和社区:成熟技术通常拥有更大的用户社区和更完善的支持体系,开发者在遇到问题时更容易找到解决方案。而新技术可能缺乏足够的文档、教程和社区支持。
- 兼容性:在开发过程中,确保新技术与现有系统和工具的兼容性可能是一个挑战。使用成熟技术可以减少集成和兼容性问题。
- 学习曲线:采用新技术可能需要团队进行额外的学习和培训,这会增加开发时间和成本。对于时间紧迫的项目,使用团队已经熟悉的技术可能更为高效。
- 长期维护:新技术的未来发展方向和长期支持可能不明确,选择被广泛采用和支持的技术可以确保项目的长期可维护性。
- 成本考虑:新技术可能需要额外的投资,包括培训、工具购买以及潜在的技术债务,而成熟技术的成本往往是已知和可控的。
- 业务需求:如果现有技术能够满足业务需求,没有必要引入新技术增加复杂性和风险。
当然,这并不意味着应该完全避免使用新技术。在某些情况下,新技术可能提供显著的优势,如性能提升或新功能,但在决定采用之前,需仔细评估其潜在风险和收益。
一般来说,如果一个项目已经存在足够长的时间,人们已经遇到了每个问题并分享了每个解决方案。
2、这项技术适合当前业务场景吗?
不同规模的项目和团队对技术的需求是不一样的:
- 技术适用性:在选择技术时,需要考虑它是否适合你的项目规模和团队能力。某些技术是为处理大规模系统的复杂性而设计的,可能并不适合较小的项目。
- 复杂性与收益:对于大公司来说,采用复杂技术以获得小的性能提升(例如10%的速度提高)是有意义的,因为他们有足够的资源来管理这种复杂性,并且这种提升可以带来显著的经济效益。然而,对于中小型公司或项目,这种复杂性可能导致不必要的开销和管理负担,而收益却不明显。
- 资源和资本:大公司通常拥有大量的开发人员和资金,可以支持复杂技术的实施和维护。他们能够通过分工和管理机制来处理高复杂度的系统。
- 开发者角色:在大公司中,开发者可能被视为大系统中的一个小部分,系统的设计允许快速替换和故障恢复。这种方法在资源丰富的环境中是可行的,但对于资源有限的小团队来说,可能不具备同样的可行性。
- 管理费用:大公司能够承担因复杂技术带来的管理费用,因为它们的系统规模使得这些费用相对于整体收益是合理的。对于较小的团队,这种管理费用可能会对资源造成不合理的负担。
在选择技术时应考虑项目的实际需求和团队的能力,而不是盲目追随潮流或大公司的技术选择。适合的技术选择应该是根据具体情况量身定制的,以平衡复杂性、成本和收益。
类似“微服务”就是一个很好的反面教材。
3、这项技术在未来5年会变成什么样?
在选择技术时应该考虑该技术在未来4-5年内是否会保持相对稳定。
- 技术的稳定性:选择一种在未来几年内不会发生剧烈变化的技术,可以降低项目的长期风险。技术的稳定性意味着开发者可以预期其在可预见的未来中不会有重大变化,从而减少频繁的重构和适应成本。
- 长期支持和维护:如果一种技术已经存在了5年,并且在这段时间内保持稳定或持续发展,通常意味着它拥有一个成熟的生态系统和社区支持。这种技术更有可能在未来继续得到支持和更新。
- 减少不确定性:新技术往往伴随着不确定性,尤其是它们未来的发展方向和市场接受度。如果一项技术历史较短,其未来的变化和持久性难以预测,这可能会增加项目的风险。
- 投资回报:在技术选型时,投入学习和实施的成本是一个重要考虑因素。选择相对成熟且稳定的技术,可以确保这些投入在未来几年内仍然有价值,而不需要频繁地转向其他技术。
- 简化选择过程:通过考虑技术的长期稳定性,可以在技术选型过程中快速排除那些不够成熟或未来发展不确定的选项,从而简化决策过程。
总之,这种评估方法旨在帮助团队做出更为稳健和可持续的技术选择,尤其是在资源有限的情况下,需要确保技术选择能够支持项目的长期发展目标。
很多“JavaScript 框架”的半衰期都不到1年!
4、不要仅因为某项技术“酷”或“流行”就盲目采用
- 情感与理性:选择技术时,应明确区分是因为技术的实用性和解决实际问题的能力,还是因为其新颖性和吸引力。过于依赖情感因素可能导致不必要的复杂性和未来的问题。
- 理智评估:当你发现自己在为使用某项技术找理由时,可能需要停下来重新评估。这种自我反思可以帮助避免因为一时冲动做出不成熟的决策。
- 影响者的角色:开发社区中的影响者往往会迅速关注和推广新技术,因为这对他们的职业和影响力有利。然而,他们的动机可能与实际项目的长期需求不一致。他们可能不需要面对长期维护的挑战,也可能有资源在技术不再合适时进行重写。
- 长期项目的可持续性:对于需要长期维护的项目,选择稳定且可靠的技术至关重要。对于那些需要在几年后对项目进行重写的可能性,需要谨慎考虑。多数情况下,客户或项目方可能不会愿意为因为技术选择不当而导致的重写买单。
- 经济和实践约束:在项目中引入新技术时,需要考虑到实际的经济约束和长期维护的可行性。确保选择的技术在未来几年内仍然适用,并且不会因为技术潮流的变化而需要额外的投资。
总之,在技术选择中保持理性,开发者在决策过程中以实际需求为导向,而不是被技术的表面吸引力所左右。
5、项目利益高于个人成长
在项目开发中责任感和对项目长期利益的重视。
- 开发者的选择与责任:开发者在选择技术时,不应只考虑个人的兴趣或学习机会,而应优先考虑项目的需求和可持续性。选择适合项目的技术,而不是单纯因为个人想尝试新技术。
- 交付时间与项目成本:选择不熟悉或新兴的技术可能会导致开发时间加倍,增加项目成本和延误交付。对于项目和团队来说,使用成熟且团队熟悉的技术通常更有效率。
- 项目的可维护性:当开发者选择新技术而不是成熟技术时,可能会在离开项目后留下一个难以维护的系统。接手维护的团队可能会面临更陡峭的学习曲线和维护挑战。
- 个人成长与项目需求的平衡:虽然学习和使用新技术对开发者个人成长有益,但在商业项目中,开发者需要在个人兴趣和项目需求之间找到平衡。
- 长期视角:开发者应从项目的长期利益出发做出技术决策,而不是只关注短期的个人收益。项目的成功和可持续性应该是首要考虑因素。
- 总的来说,发者在技术选择中要有责任感和长远眼光,确保技术选择不仅对个人有利,更对项目的成功和长期维护有利。
6、客户需求比技术更重要
在技术选型时强调客户需求的重要性是因为:
- 专注于业务问题:重点应放在解决实际的业务问题上,而不是追逐技术潮流。技术应该服务于业务目标,而不是为了技术而技术。
- 满足实际需求:技术的最终目的是解决客户的实际问题和需求。如果技术选型偏离了客户需求,即使技术再先进,也可能无法实现项目的核心目标。
- 用户体验:客户需求直接影响用户体验。选择能够最佳满足客户需求的技术,可以提高产品的用户友好性和满意度。
- 成本效益:过于复杂或不必要的技术可能增加开发和维护成本。通过关注客户的实际需求,可以选择最具成本效益的解决方案。
- 项目成功:项目的成功通常以客户的满意度为衡量标准。技术选择应服务于项目目标和客户期望,以确保项目成功交付。
- 灵活性和适应性:以客户需求为导向的技术选型可以提高项目的灵活性和适应性,使其更容易随着客户需求的变化而调整。
- 长期关系:满足客户需求的项目更可能建立长期的客户关系,带来持续的业务机会。
总之,在技术选型中优先考虑客户需求可以确保项目的相关性和成功,提高客户满意度,并优化资源的使用。
最好的决策
最好的技术决策往往是那些在被证明是错误的情况下不会让你陷入困境的决策。
如果您考虑向技术栈中添加新技术,您应该问自己以下五个问题:
- 我们如何部署它?
- 我们如何维护它?(几年后这仍然有效吗?)
- 我们如何训练人们使用它?(我能让新员工在这方面快速提高工作效率吗?)
- 当失败时我们如何恢复?(如果我意识到这是一个错误的决定,我是否能够及时切换到不同的技术?)
- 我们如何在本地开发它?