设计良好/高质量的开源软件


32

我正在参加软件设计课程,我应该从软件设计的角度选择一个开源软件进行分析。

它必须是一个大项目:不少于100,000行代码。

我真的很想选择一种设计和架构都很好的软件,以便对好的软件设计有深刻的见解。

所谓好的设计,是指诸如有意义的类和体系结构,(设计)模式的良好使用,抽象的良好使用,组件的良好组织,组件之间的高内聚和低耦合等。

您有什么软件可以建议我吗?

请注意,软件只需要具有良好的设计,而无需将设计记录在案!:)

它不一定是最终用户的应用程序...也可以是库,工具等...


3
为什么要问我们?您有什么兴趣?如果我建议使用一个会计软件包,而您发现会计很无聊,那不是一个很好的答案吗?您对哪种包装感兴趣?首先查看这些内容,然后向我们询问您所查看的特定软件包。
S.Lott

感谢您指出。我不得不说软件开发工具对我来说很有趣。
Andrea Zilio

您想使用任何特定的平台吗?

3
看一看《开源应用程序的体系结构》,它描述了许多设计良好的开源应用程序。
理查德

代码量度的行是不明确的。可执行文件的大小及其依赖的所有dll可能会告诉您一些信息。如果那里有一个很好的库,那才有意义。然后,我是否将库的行计入我的总LOC计数中?我要说的是,许多框架(库,API,SDK或您喜欢的任何一个名称)往往都非常好(它们从各个角度都受到了很大的冲击,因此错误很容易找到并且应该很快得到解决)。由于优秀的编码人员将利用其他优秀的库,因此对于复杂的应用程序,实际的LOC不必很大。
工作

Answers:


23

所谓好的设计,是指诸如有意义的类和体系结构,对设计模式的充分利用,对抽象的良好利用,对组件的良好组织,对组件的高内聚和低耦合等事物。

首先,无论好坏,软件都不是孤立无援的。它可以模拟现实世界中人们认为是问题的场景,因此始终与称为“应用程序域”的事物紧密相关。因此,每当您谈论软件时,首先要了解和研究领域-只有这样,您才能获得好与坏的判断力。

  • git –不仅好,而且是一个了不起的设计。它不是版本控制的核心,而只是文件系统。核心之上的功能薄板使其成为版本控制系统。了解git的内部知识,您的软件设计意识将得到启发。

  • jQuery –不是一个非常完善的(内部)文档库,而是一个鼓舞人心的资源,展示了客户端JavaScript代码如何产生奇迹。

  • NodeJS –如果您打算制造服务器,则此项目将提供令人耳目一新的新想法和模式。

  • v8 –很好的C ++代码,很棒的库,用于学习/研究虚拟机实现。

  • NoSQL项目 – Couch,Mongo,Redis和Cassandra –这些项目展示了解决持久性问题的明智方法。他们也接受多语言持久性的想法。

  • Boost库 –大量的C ++。

  • OpenStack –关于云计算和虚拟化的非常好的项目。

  • Apache软件基金会 –选择他们的任何项目并进行研究。如果您想了解组件如何组合,HTTPd的模块化结构是一个很好的来源。APR(Apache可移植运行时)–一个非常好的lib。

  • mod_wsgi –我遇到的最好的C程序之一。

“良好地使用设计模式” –对于与众所周知的设计模式相对应的代码并不重要–“智能”解决问题–可维护,可重用和可读性更为重要。如果将代码挤满特定的“形状”(仅遵循设计模式),则可能是不好的代码。

“不少于100,000行代码” –因为行数何时成为衡量质量的标准–尝尝“精心设计/架构的软件”并不需要它很大。

同样,请记住先研究问题域的性质和细微差别,然后再深入阅读代码。

更新:2015年10月

InfluxDB- https: //influxdb.com/ 这个Go项目正在积极开发中,仍然不是很复杂。因此,比起OpenStack之类的工具,您可以相对轻松地开始研究代码。


13

抛硬币。所有大型开源项目都必须精采才能生存。Apache,Linux,GNU项目都很出色。


4
所有大型社区运营的 OSS项目都必须至少体面才能生存。不会说辉煌。对于大多数说来的事情,政府项目完全是由员工完成的,代码质量并不总是优先事项上的最高要求。但您的示例+1。
TZHX 2011年

8
WordPress出色吗?
德鲁

9
  • 火狐浏览器
  • 阿帕奇
  • 的MySQL
  • PostgreSQL的
  • 的Linux
  • GNU

2
您确定Firefox不会被90年代初期编写的停滞代码所困扰吗?这似乎不是学习现代编码实践的好代码
TheLQ 2011年

3
Firefox和MySQL的源代码令人毛骨悚然,切勿用作良好软件设计的示例。
约旦

7

蟒蛇。具体来说,CPython是主要的实现。对于版本3.2,解释器运行大约50k的C代码,标准库运行超过400k的Python代码。鉴于该语言的极高品质及其对可读性和良好设计原则的鼓励,我认为所有这些代码都将是相当不错的。


4

TeX和MetaFont一起真的值得研究:http ://www.tug.org/

您当地的图书馆可以为您提供印刷版的资源。


3

我建议您在选择一个开源项目之前先阅读以下书籍。这将使您深入了解什么可以视为好/坏代码。

格雷格·威尔逊(Greg Wilson)
制造的软件真正起作用,为什么我们相信
开源应用程序的体系结构

如果您有兴趣在探究他的http://blog.stackoverflow.com/2011/06/se-podcast-09/之前听作者的话,这也是他的Blog堆栈交换访谈。

总体而言,什么是高质量软件?这个问题本身是非常主观的。用户有不同的质量衡量标准。一个用户可能会根据技术优点认为软件包是高质量的。其他用户可以根据用户界面的美感和整体用户体验来评估质量。

从业务角度看,他们通常根据软件质量是否满足客户的期望或他们是否满足客户的合同义务来衡量软件质量。也有专业行为,但这取决于您从栅栏的哪一侧看。

从程序员的角度来看,在创建软件时,API的设计和构造有多优雅。当程序员的态度和观点随时间变化时,相同的设计或代码标准可能被认为是不专业的。


2

我会建议您使用IntelliJ社区版,因为您提到自己喜欢软件工具。

http://www.jetbrains.org/

我喜欢什么:

  1. 它是一个执行某些任务的工具,而不是一个框架
  2. 他们做了非常有趣的事情,例如静态代码分析和数据流分析,我发现看到这些细节真的很有趣。
  3. 一件好事是,您可以使用它来执行学习,因为它还可以自行运行所有代码分析。

(诚​​然,我是JetBrains的狂热男孩)


2

我本人一直在寻找这样的项目,并选择了解决CLang

  • 它是相对较新的(只有10年历史的LLVM的后代),因此没有(或者我没有看到)过时的代码
  • 经过深思熟虑的模块化设计(如LLVM),我认为这在当今非常重要
  • 非常干净的代码,注释良好(您经常会看到标准中的引号来解释情况)
  • 设计良好的测试套件/测试环境

那里的设计模式不多,四处都是一些访客,仅此而已。类层次结构很简单,而且直截了当……实际上,我认为简单是目标,似乎没有进行任何过度设计。

就是说,由于性能至关重要,因此许多设计决策似乎都是可疑的(避免对多个对象使用虚拟功能,无需使用RTTI /异常进行编译),因此并非所有事物都适用于日常软件。




0

因此,只是另一个变体-Nemerle编程语言呢?

它并不那么受欢迎(但是GitHub刚刚为Nemerle添加了突出显示功能),在那里您可以找到很多不错的地方。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.