我正在参加软件设计课程,我应该从软件设计的角度选择一个开源软件进行分析。
它必须是一个大项目:不少于100,000行代码。
我真的很想选择一种设计和架构都很好的软件,以便对好的软件设计有深刻的见解。
所谓好的设计,是指诸如有意义的类和体系结构,(设计)模式的良好使用,抽象的良好使用,组件的良好组织,组件之间的高内聚和低耦合等。
您有什么软件可以建议我吗?
请注意,软件只需要具有良好的设计,而无需将设计记录在案!:)
它不一定是最终用户的应用程序...也可以是库,工具等...
我正在参加软件设计课程,我应该从软件设计的角度选择一个开源软件进行分析。
它必须是一个大项目:不少于100,000行代码。
我真的很想选择一种设计和架构都很好的软件,以便对好的软件设计有深刻的见解。
所谓好的设计,是指诸如有意义的类和体系结构,(设计)模式的良好使用,抽象的良好使用,组件的良好组织,组件之间的高内聚和低耦合等。
您有什么软件可以建议我吗?
请注意,软件只需要具有良好的设计,而无需将设计记录在案!:)
它不一定是最终用户的应用程序...也可以是库,工具等...
Answers:
所谓好的设计,是指诸如有意义的类和体系结构,对设计模式的充分利用,对抽象的良好利用,对组件的良好组织,对组件的高内聚和低耦合等事物。
首先,无论好坏,软件都不是孤立无援的。它可以模拟现实世界中人们认为是问题的场景,因此始终与称为“应用程序域”的事物紧密相关。因此,每当您谈论软件时,首先要了解和研究领域-只有这样,您才能获得好与坏的判断力。
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之类的工具,您可以相对轻松地开始研究代码。
抛硬币。所有大型开源项目都必须精采才能生存。Apache,Linux,GNU项目都很出色。
TeX和MetaFont一起真的值得研究:http ://www.tug.org/
您当地的图书馆可以为您提供印刷版的资源。
我建议您在选择一个开源项目之前先阅读以下书籍。这将使您深入了解什么可以视为好/坏代码。
格雷格·威尔逊(Greg Wilson)
制造的软件真正起作用,为什么我们相信
开源应用程序的体系结构
如果您有兴趣在探究他的http://blog.stackoverflow.com/2011/06/se-podcast-09/之前听作者的话,这也是他的Blog堆栈交换访谈。
总体而言,什么是高质量软件?这个问题本身是非常主观的。用户有不同的质量衡量标准。一个用户可能会根据技术优点认为软件包是高质量的。其他用户可以根据用户界面的美感和整体用户体验来评估质量。
从业务角度看,他们通常根据软件质量是否满足客户的期望或他们是否满足客户的合同义务来衡量软件质量。也有专业行为,但这取决于您从栅栏的哪一侧看。
从程序员的角度来看,在创建软件时,API的设计和构造有多优雅。当程序员的态度和观点随时间变化时,相同的设计或代码标准可能被认为是不专业的。
我会建议您使用IntelliJ社区版,因为您提到自己喜欢软件工具。
我喜欢什么:
(诚然,我是JetBrains的狂热男孩)
我本人一直在寻找这样的项目,并选择了解决CLang
。
那里的设计模式不多,四处都是一些访客,仅此而已。类层次结构很简单,而且直截了当……实际上,我认为简单是目标,似乎没有进行任何过度设计。
就是说,由于性能至关重要,因此许多设计决策似乎都是可疑的(避免对多个对象使用虚拟功能,无需使用RTTI /异常进行编译),因此并非所有事物都适用于日常软件。
因此,只是另一个变体-Nemerle编程语言呢?
它并不那么受欢迎(但是GitHub刚刚为Nemerle添加了突出显示功能),在那里您可以找到很多不错的地方。