开源代码只是心里安慰,开源软件如何选择?

news2025/1/16 17:59:00

大家好,欢迎来到停止重构的频道。

本期我们聊一个比较开放的话题,也是项目中经常遇到的问题。

在实际项目当中,由于开发成本、上线周期等因素,不可避免地需要使用开源软件。

开源软件意味着源码公开。

但是,使用开源软件是否意味着易维护呢? 

是否选择一个功能差不多的开源软件,再根据实际需要改动一下,成本就会大幅下降呢?

关于问题的答案,欢迎大家把自己的实践经历写在评论区。

而我们的实践结论是:不一定,特别是当项目需要持续维护升级的时候

我们按这样的顺序阐明我们的观点:

1、  开源软件维护的真正难点在哪 

2、  开源代码为什么难以理解 

3、  开源代码改起来为什么尴尬 

4、  如何选择开源软件 

开源软件维护的真正难点在哪 

实际上,绝大部分的开源软件都是不易维护的,除非只有几百或几千行代码。

开源软件虽然是代码公开的,但是维护开源软件的难点正是源代码的理解上

无论是修改开源软件自身的bug,还是对开源软件追加功能,都是建立在代码理解的基础上的。

 

对于不能理解和掌控的源码,其实等于没有源码。

不能理解和掌控源码,就必定会出现修改一个bug出现十个bug,追加一个功能瘫痪几个功能的情况。

对于这些黑盒一样的源码,是无法较为准确地评估成本的,往往忙了很久,天天加班也只会跟计划越走越远。

即使很幸运地理解到源码的结构、脉络,也能顺利的添加功能,但是随着版本迭代,势必会越来越乱,维护难度会越来越高。

开源代码为什么难以理解 

那为什么开源代码难以理解呢?

其实不仅是开源代码难以理解,别人写的代码、甚至是自己几周前写的代码往往都是难以理解

 

这跟是否有注释、文档是否完备、选用什么基础框架都关系不大,因为代码编写是非常开放。现有代码里有很多个if/else、有很多层函数/类调用、甚至有很多极具个性的算法。

理解现有代码无疑是理解一张蜘蛛网

值得注意的是,理解代码,并不是仅仅看懂了代码,理解代码意味着掌控了它,真正理解、掌控开源代码,也意味着需要花费很多不可评估的试错成本。

在之前讨论前端、后端架构时,我们都十分强调规整化的重要性,也提出了顶层架构的概念。

规整化是从根本上缓解现有代码理解困难的问题,如果可以拥有十分明确且简明的编码规则,千人一面地写代码,那么就可以大幅减少代码理解的成本,这会一连让开发效率、沟通成本、bug响应时间、维护升级成本大幅减少。

 

这并不是任何一个基础框架可以保证的,这也是为什么同是使用vue、SpringBoot 有的项目质量很高,有的项目大幅延期、成本超支的原因。

开源代码改起来为什么尴尬 

在我们看来,开源软件的源码,很多时候只是心理安慰

即使掌控了开源代码,在出现bug时,只能避开,而不能直接修改。我们经常翻看vue、springboot、FFmpeg的源码,也发现了一些bug,但从来都是绕开这些bug,而不直接修改源码。

因为修改这些源码会陷入十分尴尬的地步,开源软件的升级将会变得非常困难,不升级又可能存在一些埋得很深的BUG,如内存泄漏等。而且别忘了,开发团队的人是流动的,这会让升级难上加难。

如何选择开源软件 

但是说了这么多,开源软件是不可能不选用的

大部分情况下,不可能去开发一个十分成熟的组件,如文本编辑器、播放器等 ;不可能去开发一个基础框架,如Vue、SpringBoot等;不可能去开发一个不熟悉领域的软件,如编解码处理的FFmpeg等;大多数情况下会直接选用一些十分成熟的业务系统,如商城系统、cms等。

在选择开源软件之前,我们需要抱的是使用的心态,而非抱着不行可以改的心态。

所以流行度、文档完备程度是首要指标

需要特别说明的是:流行度并不是听说某个大厂在用、听谁谁谁也在用就是流行的,而是网上能搜索到很多使用问题的答案。​

 

有时候,开源软件的功能契合度并不是100%的,特别是业务系统,如商城系统等。对于这些软件,最好还是获取他们的技术支持,而不是瞎评估工作量。

单靠几张架构图、几篇文档,即使比较熟悉使用的基础框架如SpringCloud,工作量也是评估不出来的,往往就是你以为1天,最后花了大半个月。

如果没有技术支持,那就需要详细评估软件架构是否便于维护,而且这时候,软件架构的质量比功能满足程度还要重要。

当然软件架构是很难通过“看”就能看出个好坏的,我们的习惯是先尝试修改一个比较典型的功能,如果这个功能修改起来特别麻烦,那就不要用了。

 

总结

开源软件往往都只是看起来可维护罢了,毕竟软件是人写的,必须由人参与的劳动,产出的质量就会存在很大的差距。

所以我们在讨论大型网站架构时,总是提到规则、规整化、顶层架构,而非讨论哪个技术、框架、工具的使用。

因为并没有任何的框架、工具能保证最终的质量,软件质量是项目过程决定的。

​项目过程并不是八仙过海各显神通,而是一个团队统一按照明确且简明的规则完成任务,项目周期、项目成本、软件质量就会自然提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/415589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[零刻]EQ12EQ12Pro安装软路由教程

OpenWRT系统安装 安装前准备 1.U盘一个 2.WePE写盘工具 3.Openwrt固件 4.Img镜像写盘工具 安装步骤: 1.首先下载WePE写盘工具,制作一个PE系统安装环境,启动软件后,选择安装PE到U盘 2.插入U盘后,刷新一下设备&#x…

【多微电网】计及碳排放的基于交替方向乘子法(ADMM)的多微网电能交互分布式运行策略研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Vue2 API-源码解析

目录 Vue.extend(option) delimiters functional Vue.component(id, Function | Object) Vue.directive( id, [definition] ) Vue.filter( id, function) Vue.nextTick() Vue.set() Vue.delete(target, index/key) Vue.compile(template) Vue.observable(object) …

相机的内参和外参介绍

注:以下相机内参与外参介绍除来自网络整理外全部来自于《视觉SLAM十四讲从理论到实践 第2版》中的第5讲:相机与图像,为了方便查看,我将每节合并到了一幅图像中 相机与摄像机区别:相机着重于拍摄静态图像&#x…

智安网络|Ddos攻击原理和防范方法,你值得拥有

这几年网络越来越容易崩溃,今天不是这个网站崩,就是那个网站进不去,去年各个省份的健康码也接连崩溃,大家在寒风冷冽的冬天排队几小时做核酸,为什么现在的APP、网页都那么容易崩?还是同样的理由&#xff0c…

[Java·算法·困难]LeetCode10. 正则表达式匹配

每天一题,防止痴呆题目示例分析思路1题解1👉️ 力扣原文 题目 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符 * 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整…

Doubbo

目录 1.简介 2.架构 3.配置监控中心 4.模拟服务提供者 5.模拟服务消费者 6.消费者的其他配置 6.1协议 6.2启动时检查 6.3超时和重试 6.4负载均衡 7.补充 1.简介 Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RP…

【Vue-Spring跨域Bug已解决】has been blocked by CORS policy: The value of the······

文章目录一.问题发现二.问题解决过程2.1 询问AI结果2.2 问题解决三.知识点一.问题发现 报错内容: p://localhost:8001/user/login’ from origin ‘http://localhost:3001’ has been blocked by CORS policy: The value of the ‘Access-Control-Allow-Credentia…

我决定给 ChatGPT 做个缓存层 Hello GPTCache

🌟 写在前面黄老板的一句【AI 的 iPhone 时刻已至】震撼了半个科技圈。或许,应该把这句话再扩展一下:AI 的 iPhone 时刻早已势不可挡,它不是平静随和地跟大家 say hi,而是作为一个强悍的巨人携着一把名为 ChatGPT 的斧…

leetcode每日一题:数组专练篇第二期(2/2)

😚一个不甘平凡的普通人,日更算法学习和打卡,期待您的关注和认可,陪您一起学习打卡!!!😘😘😘 🤗专栏:每日算法学习 💬个人…

【LeetCode: 剑指 Offer II 089. 房屋偷盗(打家窃舍) | 暴力递归=>记忆化搜索=>动态规划】

🍎作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎 🍎座右…

Adept AI,颠覆“产品学“的产品

1.三体降临,产品学不存在了? 兄弟们,你们敢想象以后我们都会有用自己的贾维斯吗?我们不需要在安装一大堆APP,不需要适应各种APP交互,只需一句话你能快速达到你想要的目的吗?你能想象那种科幻大…

Nacos 客户端服务注册源码分析-篇二

Nacos 客户端服务注册源码分析-篇二 继续接上回,上回分析到 NacosNamingService 的整个注册的流程,其实是通过 NacosFactory.createNamingService 方法,反射获取 NacosNamingService 接口的实现类 NacosNamingService ,而 NacosN…

基于粒子群算法的含风光燃储微网优化调度

说明书 MATLAB代码:基于粒子群算法的含风光燃储微网优化调度 关键词:微网优化调度 粒子群算法 风光燃储 参考文档:《基于多目标粒子群算法的微电网优化调度_王金全》仅参考部分模型,非完全复现 优势:代码注释详实&…

【通过Cpython3.9源码看看python中的大小整数】

小整数 /* interpreter state */#define _PY_NSMALLPOSINTS 257 #define _PY_NSMALLNEGINTS 5这是CPython中定义的两个常量,它们用于控制解释器状态中的小整数对象池。在CPython中,小整数对象池是一种优化机制,用于减少…

轨迹相似度整理

1 基于点之间的距离 1.1 欧几里得距离 优点:线性计算时间缺点:轨迹长度必须一样 1.2 DTW DTW 笔记: Dynamic Time Warping 动态时间规整 (&DTW的python实现) 【DDTW,WDTW】_UQI-LIUWJ的博客-CSDN博客 …

Golang流媒体实战之六:lal拉流服务源码阅读

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 《Golang流媒体实战》系列的链接 体验开源项目lal回源转推和录制lalserver的启动源码阅读Golang流媒体实战之五:lal推流服务源码阅读Golang流媒体…

大数据3 -Hadoop HDFS-分布式文件系统

目录 1.为什么需要分布式存储? 2. HDFS的基础架构 3. HDFS存储原理 4. NameNode是如何管理Block块的 5. HDFS数据的读写流程 1.为什么需要分布式存储? •数据量太大,单机存储能力有上限,需要靠数量来解决问题•数量的提升带…

【区块链】走进web3的世界-合约交互中的异常/边界处理

在以太坊智能合约中,异常处理是一个非常重要的问题,因为任何一个函数调用都有可能导致异常。常见的异常包括函数调用失败、无效参数、内部错误等。 在 Solidity 中,可以使用 require、assert 和 revert 等关键字来处理异常。这些关键字可以用…

第一章 序言:Pytorch在自然语言处理中的应用

01 序言:Pytorch在自然语言处理中的应用 目录01 序言:Pytorch在自然语言处理中的应用1. PyTorch简介2. 自然语言处理3. PyTorch在自然语言处理中的应用3.1 文本分类3.2 情感分析3.3 机器翻译4. 结论1. PyTorch简介 首先,我们需要介绍一下PyT…