首页 > Architecture, Developers, FLOSS & Business > 值得关注的开源软件推荐:问答实录

值得关注的开源软件推荐:问答实录

2017年11月15日 发表评论 阅读评论

作者:灰狐 Allen 来源:GitChat

内容提要:

  • 小企业的架构受限于技术人员已掌握了什么,怎么选一个容易兼容扩展的框架?
  • 有哪些能提高开发效率的软件,如何通过开源软件提高开发效率?
  • 如何参与到开源软件的开发中去,开源软件如何评估其在生产环节中的安全性和可靠性?
  • 想问一下学习开源软件的时候,什么时候应该阅读源码?阅读源码的方法是什么?
  • 如何根据自身需要快速辨别一个开源软件是否适合自己?
  • 开源软件有很多,你对每个开源软件都会了解吗?了解到什么程度,而且开源会跨语言、跨平台,请问你如何学习、解决、应对的?
  • 怎么开启开源软件源码学习,在没有文档的情况下,又怎么了解开源软件架构?
  • 本群的主题是开源软件,和我们平常所说的开源项目(如github)是一回事吗?
  • 对于大的开源项目,如何学习和参与?
  • 若自己项目要上传到github上,readme.md要写哪些东西可以吸引其他人看我项目,对我的项目能有足够认知?

问:小企业的架构受限于技术人员已掌握了什么,怎么选一个容易兼容扩展的框架?

答:这个问题可从以下几点来试着去思考:

  1. 开源软件生态系统是一个框架兼容、扩展性的重要特征,Node.js有47.5万、Meteor有近13000个软件包和扩展;
  2. 团队试着开发一些小的扩展和应用来验证使用框架的兼容与扩展性;
  3. 未来可行的话,将公司开发的扩展开源出来提交公共仓库,形成良好工程师文化;
  4. 保持公司架构的兼容和扩展性需要整个研发团队达成共识,而不是某个人的喜好,团队要长期填坑和沉淀,最好更多地参与此开源软件的社区贡献。

问:有哪些能提高开发效率的软件,如何通过开源软件提高开发效率?

答:这个问题可以简单理解为开源生产力工具,通过以下7点来解答。

  1. 框架:一站式框架能极大地提高开发效率,如:Meteor、Angular、Qt、Django;
  2. 编辑器:更高效的编码,如Emacs、Vim;
  3. 消息队列:建立应用的消息总线Hub,消息队列是重要的软件基础设施,因为它解耦、连接各种数据、应用和服务,给企业带来更高的实时响应;
  4. 编程语言:使用函数式编程语言,它能带来更高的生产力;
  5. CI/CD等工具的高效使用;
  6. 敏捷开发、看板、项目管理工具的使用;
  7. Git & GitHub熟练使用等等。

问:如何参与到开源软件的开发中去,开源软件如何评估其在生产环节中的安全性和可靠性?

答:这个问题包含两个问题,首先回答第一个部分:如何参与开源项目。

参与开源软件的开发这个话题有点多、有点大,我这里简单做些整理供参考:

  1. 首先让自己编程水平不断提供,变得更牛,你厉害了,很多开源软件项目都愿意邀请你加入进来;
  2. 模仿大牛,了解他们是如何参与开源软件开发的,他们的博客时常会给出一些意见、建议;
  3. 有机会和开源软件Leader和开发者建立直接交流的机会;
  4. 先从一些小项目、不太知名的开源软件入手,不要一来就要成为Linux核心和Apache开发者(能力强悍的同学就另当别论了);
  5. 评估自己的工作、生活,确保有足够的精力和时间参与到开源软件中去,若你的公司是付工资让你参与的,那就恭喜你了;
  6. 在GitHub上找自己感兴趣且能帮上忙的项目入手;
  7. 开源软件贡献不一定都是参与代码贡献,还有其他很多工作可做,如:找Bug、修复Bug、文档、社区等等。当然,代码贡献成就感是最大的;
  8. 熟悉自由、开源软件文化,将开源软件的学习、使用、贡献逐步变成一种工作、生活方式。

接下来是第二部分:生产环节中的安全性和可靠性的评估。这个话题很广,我想从这几个方面入手:

  1. 先看看这个开源软件成功案例,若有很多大厂在用,软件的安全性和可靠性应该是不错的,若没有什么用户在用就需谨慎评估了;
  2. 然后使用有long-term support (LTS)版本的开源软件进行开发和部署,尤其是GNU/Linux这样的操作系统和核心。LTS在文章中有提及,大家可去看看;
  3. 在Git中使用多个分支进行开发和Bug修复:主分支、功能分支、Bug修复分支等;
  4. 留出充分的测试时间:单元测试、集成测试、验收测试;
  5. 估算和测试负载:可能多少并发用户、一个用户生成的数据量、用户分布等等;
  6. 除了公司内部的安全人员外,可和一些白帽子团队建立长期合作;
  7. CI/CD基础设施的引入和完善,它是软件系统安全性、可靠性的重要支撑和保障;
  8. 在安装部署环节:公有云、私有云、混合云带来安全性、可靠性的不同解决方案;
  9. 这点很重要,若公司的核心关键业务基于这些开源软件,公司尽可能安排专人深度跟进和参与到这个开源软件中来,这是技术保障。举个例子:小米就有4个HBase Committer参与HBase,这极大地保障了公司基础设施的可维护性和可靠性,若没有,如果出了一个难搞的问题,没办法解决,去问原开发者,因为交流、时间等因素总会有耽搁和延迟,而核心关键业务是不能等人的。

问:想问一下学习开源软件的时候,什么时候应该阅读源码?阅读源码的方法是什么?

答:阅读源码是为了更好的理解软件背后的实现机制和细节,为了满足好奇心,什么时候阅读都行。不过,若软件规模庞大,要去看源码就先放一下,先熟练使用它后再说。阅读方法可参考以下几点:

  1. 搜一下是否有朋友在做这件事,若有,可以和他一起,这样有交流,进步更快,GitHub上已有不少对源代码做中文注解的项目,如:带有详细注释的 Redis 3.0 代码 
  2. 若没有借鉴第1点的做法,将你要分析的源代码导入类似GitHub的代码仓库,然后边看代码边写注释;
  3. 买相关书籍,我为了看GCC源代码,买了本《编译系统透视:图解编译原理》。因为工作量太庞大,这个研读过程就先放下了;
  4. 去折腾、重构、编译源代码也是个好方法。

问:如何根据自身需要快速辨别一个开源软件是否适合自己?

答:先想一下你的最基本需求有哪些,就说三点,然后再看看这款开源软件它的特性是否能满足你的这三点需求,这也是我在文章中拟软件特性和要点的原因。

举一个例子,我想找一个特别酷的编辑器,需求点有三个:

  1. 能编程,支持大多数主流编程语言;
  2. 能写文档、支持Markdown等格式;
  3. 能完成我一天大部分的工作。

我选择Emacs,原因如下:

  1. 因为Emacs是迄今为止功能最为强大的文本编辑器,能编写代码、能写文档;
  2. Emacs是模块化的,遵循do one thing, and do it well原则,需要什么就安装什么,你可以像搭积木的方式搭建自己的环境和系统;
  3. Everything Emacs,你可以在Emacs完成你几乎所有的工作:编程、写作、浏览网页、收发邮件、日程、娱乐游戏、它是个人操作系统。

当然,你觉得没有适合自己的,自己可以发起一个开源软件项目,将自己的一个软件作品发布出去。若没有软件作品,也可以将自己心得、整理的文档、博客、各种开放资源以开源项目的方式发布出去,如:开放文档资源索引


问:开源软件有很多,你对每个开源软件都会了解吗?了解到什么程度,而且开源会跨语言、跨平台,请问你如何学习、解决、应对的?

答:对开源软件的关注程度我会在了解、学习、深入等几个方面加以平衡。

  1. 我感兴趣的开源软件,我会从背景、它是什么、为什么是它、应用、开发、部署实施、成功案例、资源等几个方面去大致了解。
  2. 应用到工作中的,我会在第1点这个基础上深入每个环节。
  3. 对生命周期很长的,如操作系统、编译器、数据库等,我会长时间跟进和学习,几年甚至更长时间。
  4. 这么多开源软件、知识、总结等如何管理?我采用的是用Wiki的方式,从2011年我就开始这个工作,每天都会学习、更新自己的学习总结,渐渐的就有了几千个开源软件条目,近4000万的浏览量,有的条目我编辑了几百次,而这个就是我非常关注度的项目,如:PostgreSQL

大家可以通过类似方法总结、整理自己的开源软件知识体系,工作量有些大,更多需要兴趣驱动。


问:怎么开启开源软件源码学习,在没有文档的情况下,又怎么了解开源软件架构?

答:这个问题和问题4很类似,可参考。若作者没有提供架构图的,可试着自己去画一个,若可以,可提交原作者,若他赞同或有修改补充,相信你对此款开源软件的整体架构有了更进一步认识,另外,结合类似印象笔记和Wiki的工具,不断总结你的学习过程。


问:本群的主题是开源软件,和我们平常所说的开源项目(如github)是一回事吗?

答:开源软件和开源项目在这里等同,主要有的开源项目是开放文档或开放硬件设计的。GitHub本身不是开源项目,它是一个托管开源项目进行分布式协作开发的网络平台,它上面托管了大多数热门主流的开源项目。GitHub是寻找、选择开源项目的首选。


问:对于大的开源项目,如何学习和参与?

答:大的开源项目,如操作系统、大数据、云计算平台等,因为涉及东西很多,学习是个很系统、漫长的过程,可参考问题6的学习建议。

大项目,知名度很高,参与的难度会比较高,首先让自己成为编程高手或社区运营高手,通过问题3所提到的8点建议入手。


问:若自己项目要上传到github上,readme.md要写哪些东西可以吸引其他人看我项目,对我的项目能有足够认知?

答:中英文、有简介、快速入门、有图、有案例,许可协议可选Apache或MIT或BSD。另外,参考一些热门项目的介绍。

开源软件许可协议选择。许可证基本考虑:Apache、MIT、BSD、GPL/LGPL等,这几个许可协议应用非常广泛,大家更容易接受和采纳。Apache、MIT、BSD这三个许可协议很相似,都很友好和自由,是首选。

Apache:其主要附加条款就是Apache的商标不与该软件一同授权。因此,如果你对Apache项目的源代码进行了修改并希望发行修改后的版本,你不能把你修改过的软件称为Apache。如:Apache Hadoop的分发版HDP、CDH。

BSD:修改并发布你的软件,却不需要公布你修改后的源代码,BSD许可证允许你将代码私有化并在私有许可证下发布BSD这也是很多防火墙等安全软件基于BSD构建的原因。

MIT:一个没有对代码使用方式有任何限制的许可证,主流的JavaScript项目大多采用MIT许可证,如:Angular、Meteor、Node.js等。

GPL:Linux核心和GNU/Linux各种发行版使用的许可证,此许可证要求对GPL下的代码进行任何修改以及你发布的修改都应该对社区开放,可以说大部分开源软件采用了GPL。

LGPL:是个较宽松的GPL,它用来解决GPL授权库(Library)的问题,如glibc,许多应用程序都依赖这个核心系统运行库,通过在LGPL下授权glibc,商业应用链接到glibc而不用担心该程序被要求在GPL下授权。如果你开发了一个开源软件,也允许商业授权的软件使用你的技术,LGPL是个不错的选择。

另外补充一些大教堂与集市的知识。

大教堂是传统的软件开发模式,开发团队规模较小,在开发开始前,设计和功能要求已全部明确。架构、设计、编码、测试不仅被完全确定,还会被全部写成文档。开发阶段几乎没有循环迭代发布过程,获得外界反馈是在alpha和beta测试阶段,所有人员仅限于公司内部员工。

集市开发会将目前可以完成且实用的功能组成一个版本发布,普遍欠缺一些功能和带有一些缺陷,但没关系,版本的循环发布会非常频繁(常常以小时计算)。采用集市会尽可能早、尽可能频繁地发布软件寻求反馈。任何地方的任何人,只要有好的想法,都可以参与贡献,发现、修复Bug,完善文档,增加新的功能等。当软件维护者认为一切已经准备就绪,就进行正式的发布。GNU/Linux、FreeBSD等重多开源软件,就是通过集式开发模式获得巨大成功的。

GitHub也将集市开发模式推向一个新高度。企业开发思路的转变,要更快的交付产品服务和即时响应客户需求,请采用集市。

给大家提一些学习的建议和总结:

  1. 不要把GitHub作为敏感话题的博客,可作为技术博客;
  2. 广泛和学习各种开源软件,了解的越多越能帮助你更好的选择和判断,但要平衡好自己的工作、兴趣和时间;
  3. 可以从一个非编程的任务开始自己的GitHub之旅,如建立一个技术博客、资源索引,参与已有项目的贡献;
  4. 个人的选型路线:
  5. 企业的选型路线,软件开发和编程语言,不存在谁好谁坏,因为它们都在相互学习也互相都看不起;
  6. 好的程序员之所以出色是因为熟能生巧,想想玩转Emacs的家伙;
  7. 随时都可以学习一门新语言,拓展自己思路,可选择JVM、.NET、Erlang VM虚拟机之上的语言,因为生态系统和相互借鉴;
  8. Lisp和Emacs都是受益终生的投资;
  9. 做技术的不要忘了自嘲:长得一般、做饭一般、家务一般、编程一般……给人一般的感觉,而背后是不一般和惊喜;
  10. 有关数学,每天都浏览一下维基百科,它把数学的整个体系整理的很全;
  11. 多看些非技术类丛书,让自己的思路发散和飘逸,软件需要哲学家,自由社会、自由软件可作为大家的入门书。

本文首发于GitChat,未经授权不得转载,转载需与GitChat联系。


在此感谢异步社区为本次活动提供的赠书《C++Primer Plus(第6版)中文版》。

异步社区是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架。


微信打赏
赞助我们,灰狐需要一杯热咖啡。
请微信扫码



除非注明,开放博客文章均为原创,转载请以超链接形式标明原始出处:开放博客,谢谢。

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.