腾讯云
开发者社区
文档
建议反馈
控制台
登录/注册
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
搜索
搜索
关闭
发布
精选内容/技术社群/优惠产品,
尽在小程序
立即前往
首页
标签
开源
#
开源
开源是一种源代码可以任意获取的计算机软件,这种软件的版权持有人在软件协议的规定之下保留一部分权利并允许用户学习、修改以及以任何目的向任何人分发该软件。
关注
专栏文章
(30.4K)
技术视频
(18)
互动问答
(18.6K)
大型项目的关键因素有哪些?
3
回答
开源
、
系统架构
、
设计
、
腾讯云架构师技术同盟
架构师之路
“架构师之路”作者,到家集团技术VP,快狗打车CTO。前58同城技术委员会主席,前百度高级工程师。
15年加盟到家后,框架/组件/基础服务/技术平台,正好也是自己负责范围的一部分,开源还是自研,谈一谈自己的想法。 其一,早期不建议自研。 早期研发人数较少,公司也不确定能走多远,业务相对简单,业务以“快速迭代”为最高优先级,此时一般会选择“自己熟悉的技术”作为选型: (1)研发语言:熟PHP选PHP,熟Java选Java; (2)数据库:熟MySQL选MySQL,熟SQL-server选SQL-server; (3)框架组件:熟Ruby on Rails选ROR,熟ThinkPHP选ThinkPHP,熟Spring boot才选; (4)… 此时千万不要纠结选型,选自己熟悉的,业务以快速迭代为最优先,公司得先生存下来。 多说一句,此时对于技术合伙人的技术视野就有一定要求,如果早期方向不对,等公司发展若干年,数据量并发量上涨很多倍,成本以及未来的技术应对恐怕会有麻烦。 58早期选型是微软技术体系,后来数据量增大,并发量增大,机器数据库越来越多,性能扛不住,成本也扛不住,后来CTO带领大家转型开源阵营,虽然阵痛了1-2年,但长远来说,绝对是正确的决策。 如今,如果你再创业,选云,选Spring体系,八成不会走太大的弯路。 其二,随着规模的扩大,要控制技术栈。 随着业务越来越复杂,研发人数越来越多,如果每个leader都选择自己擅长的框架,就会出现这样的情况: (1)站点框架,team A用着SSH,team B用着Spring+SpringMVC+Mybatis; (2)服务框架,team C用着REST,team D用着dubbo,team E用着thrift; (3)数据库访问,team X用着mybatis,team Y用着DAO,team Z用着jdbc; (4)… 对于整体而言,跨部门的调用越来越麻烦,重复造的轮子越来越多,技术效率会逐步降低,研发+测试+运维成本都越来越高。 即使不自研,技术栈也请尽量统一。 其三,统一了技术栈,建议浅浅的封装一层。 统一了技术栈以后,如果不封装,redis官方Java客户端Jedis可能有这样一些接口: String Memcache::get(String key) String Memcache::set(String key, String value) String Memcache::del(String key) 浅浅的封装一层,会变成这样: String DaojiaKV::get(String key) { String result = Memcache::get(key); return result; } String DaojiaKV::set(String key, String value) { String result = Memcache::set(key, value); return result; } String DaojiaKV::del(String key) { String result = Memcache::del(key); return result; } 这有什么好处呢? (1)对上游屏蔽底层实现的细节,调用方不用关注缓存是memcache还是redis,调用方只关注DaojiaKV; (2)底层变化的时候,对上游透明,当memcache不能满足需求,要切换为redis时,所有调用方不需要大的变化,升级一个最新的DaojiaKV即可,DaojiaKV的接口不变,实现变为: String DaojiaKV::get(String key) { String result = Jedis::get(key); return result; } String DaojiaKV::set(String key, String value) { String result = Jedis::set(key, value); return result; } String DaojiaKV::del(String key) { String result = Jedis::del(key); return result; } (3)统一实现一些通用的功能,就不需要每一个上游升级了,例如,要实现一个缓存访问时间统计的功能,所有调用方不需要大的变化,升级一个最新的DaojiaKV即可: String DaojiaKV::get(String key) { Long startTime = now(); String result = Jedis::get(key); Long endTime = now(); reportKVTime(startTime- endTime); return result; } String DaojiaKV::set(String key, String value) { Long startTime = now(); String result = Jedis::set(key, value); Long endTime = now(); reportKVTime(startTime- endTime); return result; } String DaojiaKV::del(String key) { Long startTime = now(); String result = Jedis::del(key); Long endTime = now(); reportKVTime(startTime- endTime); return result; } 同理,如果要实现统一的告警,调用链跟踪,SQL执行时间,也可以用类似的方法。 其四,随着规模的进一步扩大,需要适当的造一些轮子。 业务进一步发展,研发团队进一步扩张,虽然使用了统一的技术栈,但不同研发团队的痛点是极其类似的: (1)有站点,监控服务的可用性,处理时间监控需求; (2)有告警需求; (3)有自动化发布,自动化运维需求; (4)有服务治理,服务自动发现需求; (5)有调用链跟踪需求; (6)有SQL监控需求; (7)有系统层面数据收集与可视化展现的需求; (8)… 此时,开源的框架可能满足不了需求了: (1)开源框架/组件太重了,我们需要的可能只是一个轻量级的框架/组件; (2)开源框架/组件,只能满足我们的一部分需求; (3)不了解开源框架/组件的设计理念,要二次开发成本更高(维护dubboX的同学,维护数据库中间件Atlas的同学可以出来说两句); (4)有些通用的需求是和业务紧密结合的,开源框架/组件可能满足不了; (5)… 此时,如果技术实力具备,可以统一研发一些框架和组件,解决所有技术团队的通用痛点,满足所有技术团队的通用需求。 总结:复用开源,还是造轮子自研? 初期建议:不自研,用熟悉的,业务快速迭代为优先,需要一定技术视野。 长远建议: (1)统一技术栈; (2)浅浅封装一层; (3)适当造轮子;...
展开详请
赞
4
收藏
0
评论
0
分享
15年加盟到家后,框架/组件/基础服务/技术平台,正好也是自己负责范围的一部分,开源还是自研,谈一谈自己的想法。 其一,早期不建议自研。 早期研发人数较少,公司也不确定能走多远,业务相对简单,业务以“快速迭代”为最高优先级,此时一般会选择“自己熟悉的技术”作为选型: (1)研发语言:熟PHP选PHP,熟Java选Java; (2)数据库:熟MySQL选MySQL,熟SQL-server选SQL-server; (3)框架组件:熟Ruby on Rails选ROR,熟ThinkPHP选ThinkPHP,熟Spring boot才选; (4)… 此时千万不要纠结选型,选自己熟悉的,业务以快速迭代为最优先,公司得先生存下来。 多说一句,此时对于技术合伙人的技术视野就有一定要求,如果早期方向不对,等公司发展若干年,数据量并发量上涨很多倍,成本以及未来的技术应对恐怕会有麻烦。 58早期选型是微软技术体系,后来数据量增大,并发量增大,机器数据库越来越多,性能扛不住,成本也扛不住,后来CTO带领大家转型开源阵营,虽然阵痛了1-2年,但长远来说,绝对是正确的决策。 如今,如果你再创业,选云,选Spring体系,八成不会走太大的弯路。 其二,随着规模的扩大,要控制技术栈。 随着业务越来越复杂,研发人数越来越多,如果每个leader都选择自己擅长的框架,就会出现这样的情况: (1)站点框架,team A用着SSH,team B用着Spring+SpringMVC+Mybatis; (2)服务框架,team C用着REST,team D用着dubbo,team E用着thrift; (3)数据库访问,team X用着mybatis,team Y用着DAO,team Z用着jdbc; (4)… 对于整体而言,跨部门的调用越来越麻烦,重复造的轮子越来越多,技术效率会逐步降低,研发+测试+运维成本都越来越高。 即使不自研,技术栈也请尽量统一。 其三,统一了技术栈,建议浅浅的封装一层。 统一了技术栈以后,如果不封装,redis官方Java客户端Jedis可能有这样一些接口: String Memcache::get(String key) String Memcache::set(String key, String value) String Memcache::del(String key) 浅浅的封装一层,会变成这样: String DaojiaKV::get(String key) { String result = Memcache::get(key); return result; } String DaojiaKV::set(String key, String value) { String result = Memcache::set(key, value); return result; } String DaojiaKV::del(String key) { String result = Memcache::del(key); return result; } 这有什么好处呢? (1)对上游屏蔽底层实现的细节,调用方不用关注缓存是memcache还是redis,调用方只关注DaojiaKV; (2)底层变化的时候,对上游透明,当memcache不能满足需求,要切换为redis时,所有调用方不需要大的变化,升级一个最新的DaojiaKV即可,DaojiaKV的接口不变,实现变为: String DaojiaKV::get(String key) { String result = Jedis::get(key); return result; } String DaojiaKV::set(String key, String value) { String result = Jedis::set(key, value); return result; } String DaojiaKV::del(String key) { String result = Jedis::del(key); return result; } (3)统一实现一些通用的功能,就不需要每一个上游升级了,例如,要实现一个缓存访问时间统计的功能,所有调用方不需要大的变化,升级一个最新的DaojiaKV即可: String DaojiaKV::get(String key) { Long startTime = now(); String result = Jedis::get(key); Long endTime = now(); reportKVTime(startTime- endTime); return result; } String DaojiaKV::set(String key, String value) { Long startTime = now(); String result = Jedis::set(key, value); Long endTime = now(); reportKVTime(startTime- endTime); return result; } String DaojiaKV::del(String key) { Long startTime = now(); String result = Jedis::del(key); Long endTime = now(); reportKVTime(startTime- endTime); return result; } 同理,如果要实现统一的告警,调用链跟踪,SQL执行时间,也可以用类似的方法。 其四,随着规模的进一步扩大,需要适当的造一些轮子。 业务进一步发展,研发团队进一步扩张,虽然使用了统一的技术栈,但不同研发团队的痛点是极其类似的: (1)有站点,监控服务的可用性,处理时间监控需求; (2)有告警需求; (3)有自动化发布,自动化运维需求; (4)有服务治理,服务自动发现需求; (5)有调用链跟踪需求; (6)有SQL监控需求; (7)有系统层面数据收集与可视化展现的需求; (8)… 此时,开源的框架可能满足不了需求了: (1)开源框架/组件太重了,我们需要的可能只是一个轻量级的框架/组件; (2)开源框架/组件,只能满足我们的一部分需求; (3)不了解开源框架/组件的设计理念,要二次开发成本更高(维护dubboX的同学,维护数据库中间件Atlas的同学可以出来说两句); (4)有些通用的需求是和业务紧密结合的,开源框架/组件可能满足不了; (5)… 此时,如果技术实力具备,可以统一研发一些框架和组件,解决所有技术团队的通用痛点,满足所有技术团队的通用需求。 总结:复用开源,还是造轮子自研? 初期建议:不自研,用熟悉的,业务快速迭代为优先,需要一定技术视野。 长远建议: (1)统一技术栈; (2)浅浅封装一层; (3)适当造轮子;
可以使用多个模板引擎吗?
0
回答
php
、
express
、
开源
、
插件
、
模板引擎
开源TencentOS Server 3 qcow2密码问题?
0
回答
开源
、
TencentOS Server
、
server
、
登录
、
镜像
想从事医疗软件开发,但资料太少,想问下大佬有这些资料能共享么?
0
回答
医疗
、
开源
、
system
、
工具
、
进程
请教div标签有属性w=“full“ py=“4“ ,是如何转换成对应css样式的?
0
回答
css
、
开源
、
标签
tdsql兼容mysql为什么不能和flinkcdc连接?
0
回答
TDSQL MySQL 版
、
开源
、
mysql
、
连接
、
同步
基于velero及minio实现etcd数据如何备份与恢复?
0
回答
开源
、
迁移
、
etcd
、
“v+”全真互联网全球创新创业挑战赛
、
备份
开发者参与开源软件项目有哪些好处?
1
回答
开源
、
黑客
、
行业
、
开发者
、
开源软件
用户10502741
纵观 IT 行业这二十多年的发展,开源软件从黑客的“理想之国”,已经形成了一股推进计算机及相关行业不停进步的巨大力量。如今大热的大数据、区块链、人工智能、物联网、数据库领域,其中最为重要的、最受欢迎的技术也都是开源的。但是尽管如此,还是有超过一半以上的国内开发者鲜少参与开源项目,这种情况多少都令人遗憾。想听一听大家的看法,您如果没有参与,请分享下参与开源项目少的原因?...
展开详请
赞
0
收藏
0
评论
0
分享
纵观 IT 行业这二十多年的发展,开源软件从黑客的“理想之国”,已经形成了一股推进计算机及相关行业不停进步的巨大力量。如今大热的大数据、区块链、人工智能、物联网、数据库领域,其中最为重要的、最受欢迎的技术也都是开源的。但是尽管如此,还是有超过一半以上的国内开发者鲜少参与开源项目,这种情况多少都令人遗憾。想听一听大家的看法,您如果没有参与,请分享下参与开源项目少的原因?
关于WSO2与MULE的对比?
0
回答
开源
、
esb
、
mule
、
wso2
、
wso2-esb
基于双目立体视觉法的三维重建?
0
回答
图像处理
、
开源
微搭的工作流是基于开源的camunda,flowable开发的嘛,还是自研的?
0
回答
java
、
网站
、
开源
github怎么打开?
2
回答
git
、
github
、
开源
用户10072077
1.修改DNS 这也是目前网络上流传的最广的方案,具体做法是修改本地的hosts中几个有关几个github资源的域名的对于ip地址。 GitHub520已经列举了所有的域名和对应的ip地址,可以直接拿来使用,每天都会自动更新。 如果嫌每天手动设置很麻烦,还可以下载SwitchHosts,每天自动更新GitHub520中的内容。 遗憾的是,这种方式似乎只能起到安慰作用,在访问github的过程中仍然会遇到无法访问的情况。 2.Steam++ Steam++看名字也知道是加速steam社区使用的,但是这个工具很不专一,除了steam,还能加速代理github,甚至还能访问到pixiv。 官方网站:https://steampp.net/ Gitee:https://gitee.com/rmbgame/SteamTools github:https://github.com/SteamTools-Team/SteamTools Windows10及以上用户还能直接从微软商店搜索Steam++下载。 说下使用体验: 功能很多,瑞士军刀型软件;但也正是因为功能太多,显得软件很繁杂。 在使用的过程中稳定性还可以,基本上能稳定访问到github,但是也有几次无法正常访问,总是还是比修改dns稳定。 3.开发者边车(推荐) 专门给开发者使用加速代理软件,可以加速github、Stack Overflow及npm。 Gitee:https://gitee.com/docmirror/dev-sidecar github:https://github.com/docmirror/dev-sidecar 使用体验: 使用electron制作,界面很漂亮,能加速的东西也很多。 在windows平台下使用如果在开着软件时关机,会在下一次开机时无法上网,这时只有打开软件才能上网,所以最好设置开机自启动。 第一次使用需要设置根证书。 开着软件时无法访问微软商店 4.FastGithub(Windows下超推荐) 这是我目前在使用的访问方案。因为我认为它是一款简洁且专一的软件。 https://github.com/dotnetcore/FastGithub 解压文件后可以在当前文件夹使用fastgithub.exe start(powershell下使用./fastgithub.exe start)命令以windows服务安装并启动。...
展开详请
赞
0
收藏
0
评论
0
分享
1.修改DNS 这也是目前网络上流传的最广的方案,具体做法是修改本地的hosts中几个有关几个github资源的域名的对于ip地址。 GitHub520已经列举了所有的域名和对应的ip地址,可以直接拿来使用,每天都会自动更新。 如果嫌每天手动设置很麻烦,还可以下载SwitchHosts,每天自动更新GitHub520中的内容。 遗憾的是,这种方式似乎只能起到安慰作用,在访问github的过程中仍然会遇到无法访问的情况。 2.Steam++ Steam++看名字也知道是加速steam社区使用的,但是这个工具很不专一,除了steam,还能加速代理github,甚至还能访问到pixiv。 官方网站:https://steampp.net/ Gitee:https://gitee.com/rmbgame/SteamTools github:https://github.com/SteamTools-Team/SteamTools Windows10及以上用户还能直接从微软商店搜索Steam++下载。 说下使用体验: 功能很多,瑞士军刀型软件;但也正是因为功能太多,显得软件很繁杂。 在使用的过程中稳定性还可以,基本上能稳定访问到github,但是也有几次无法正常访问,总是还是比修改dns稳定。 3.开发者边车(推荐) 专门给开发者使用加速代理软件,可以加速github、Stack Overflow及npm。 Gitee:https://gitee.com/docmirror/dev-sidecar github:https://github.com/docmirror/dev-sidecar 使用体验: 使用electron制作,界面很漂亮,能加速的东西也很多。 在windows平台下使用如果在开着软件时关机,会在下一次开机时无法上网,这时只有打开软件才能上网,所以最好设置开机自启动。 第一次使用需要设置根证书。 开着软件时无法访问微软商店 4.FastGithub(Windows下超推荐) 这是我目前在使用的访问方案。因为我认为它是一款简洁且专一的软件。 https://github.com/dotnetcore/FastGithub 解压文件后可以在当前文件夹使用fastgithub.exe start(powershell下使用./fastgithub.exe start)命令以windows服务安装并启动。
nuxt3搭建GitHubPages?
0
回答
css
、
html
、
git
、
github
、
开源
基于开源zuul的微服务网关,集成tsf后不支持路由转发通过URL吗?
0
回答
开发者实验室
、
php
、
开源
、
微服务
频繁调用gettimeofday性能有影响,DPDK有获取时间戳秒级和微妙级方法吗?
0
回答
c 语言
、
linux
、
unix
、
开源
Rust官方log库,还需要完善哪些地方?
0
回答
开源
、
rust
jupyter notebook如何同时打开多个csv文件?
0
回答
文件存储
、
开源
Rust迅速崛起,未来会取代C/C++吗?
0
回答
c++
、
android
、
ide
、
linux
、
开源
相关
产品
开源是一种源代码可以任意获取的计算机软件,这种软件的版权持有人在软件协议的规定之下保留一部分权利并允许用户学习、修改以及以任何目的向任何人分发该软件。
热门
专栏
Technology Share
70 文章
187 订阅
张戈的专栏
328 文章
102 订阅
刘笑江的专栏
34 文章
24 订阅
田飞雨的专栏
88 文章
55 订阅
领券