写得好的开源项目(用于学习)?

我们通过编写程序学习编程,并从其他程序中学习。 你build议哪些开源代码库/程序用于学习/改进编程?

同时引用参考,也请提到你喜欢的东西。

我会推荐Scott Hanselman的每周源代码文章 ,他确切地提出了你的build议,那就是阅读更多的源代码来改善。 这是值得的阅读。

我可以推荐Simon Tatham的拼图 。 这是一系列的益智游戏(扫雷,数独,十五)可用于Windows,OS X和Linux(和Java小程序)。 这个架构非常简单:有三个实现(每个平台一个)的前端接口,每个游戏实现一个实现的后端接口(我给出了三个例子)和一个让他们一起谈话的中端,做序列化和其他整洁的东西。

基本上,这是很好的面向对象。 用C写的,很容易做出贡献(我实现了填充和范围游戏),因为它是有据可查的,而且很容易阅读。

Disruptor的代码是典型的,也可以从它在现代硬件上实现极高性能的过程中学到许多东西。

值得一读的是Martin Fowler对其架构的解释 , 技术论文(PDF)和QCon演示文稿 。 另外开发者博客包含很多很好的阅读 – 尤其是机械同情博客 ,教导许多事情关于现代CPU和内存如何工作。

这取决于你的兴趣,但是我曾经和Quake III的代码库一起工作过,而且写得相当好,很好用。 它用C写成

Linux内核是学习的好方法。

我知道,由于多层架构和大量的代码,可能难以深入,但是有一些非常好的文章可以慢慢地进入,就像Tim Jones的这篇文章一样。

通过查看特定的主题,我学到了很多东西,比如FAT驱动程序实现和文件系统抽象。

我find的最清晰简洁的源代码之一是jQuery源代码。 无论您是否喜欢Javascript,都会对“代码为文档”的倡导者提供很好的帮助。

有很多评论,但它不是ascii艺术品,你可以看到明确的推理 – 评论让你知道什么是试图实现。

示例( 完整源代码 ):

(function(){ var // Will speed up references to window, and allows munging its name. window = this, // Will speed up references to undefined, and allows munging its name. undefined, // Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ in case of overwrite _$ = window.$, jQuery = window.jQuery = window.$ = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init( selector, context ); }, // A simple way to check for HTML strings or ID strings // (both of which we optimize for) quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/, // Is it a simple selector isSimple = /^.[^:#\[\.,]*$/; jQuery.fn = jQuery.prototype = { init: function( selector, context ) { // Make sure that a selection was provided selector = selector || document; // Handle $(DOMElement) if ( selector.nodeType ) { this[0] = selector; this.length = 1; this.context = selector; return this; } // Handle HTML strings if ( typeof selector === "string" ) { // Are we dealing with HTML string or an ID? var match = quickExpr.exec( selector ); // Verify a match, and that no context was specified for #id if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) selector = jQuery.clean( [ match[1] ], context ); // HANDLE: $("#id") else { var elem = document.getElementById( match[3] ); // Handle the case where IE and Opera return items // by name instead of ID if ( elem && elem.id != match[3] ) return jQuery().find( selector ); ... 

你会发现很多例子。 但吉姆·巴克说,这取决于你的兴趣。 我从SharpDevelop的源码中学到了一大堆“东西”。

比较小,但有足够的复杂性可以学习,我的投票结果是:

Apache的Log4Net日志框架。

它的源代码是非常可读的,“跨平台”[可编译:.NET 1.0,1.1,2.0,CF,MONO …],因此对于“跨平台”C#开发的课程非常有价值。

如果有人有Diomidis Spinellis的代码阅读副本,他在那里写了哪些开源项目?


@Avinash:如果您想了解更多关于编程的知识,我build议您使用Spinellis的代码阅读和代码质量。 他们有来自不同项目的代码样本,我相信所有的FOSS都是这样,所以你不仅可以阅读它们,而且还可以阅读本书和最新版本中讨论的版本,从中读取更多的代码并学习。


我彻底推荐由Steve McConnell编写的Code Complete 2nd Edition(ISBN:0735619670)。 大多数情况下,它使用C ++作为其通用语言,但偶尔也会提到Visual Basic代码。 事实上,这本书实际上是在我大学的计算机科学系中用于倡导良好的编码实践。 坦率地说,阅读本书后,我的编程技巧和生产力有了飞跃性的提高。