我们通过编写程序和从其他程序学习来学习编程.您建议哪些开源代码存储库/程序用于学习/改进编程?
引用参考时请同时提及您喜欢的内容.
我会推荐Scott Hanselman的每周源代码文章,他确实提出了你的建议,即阅读更多源代码以获得更好.值得一读.
我可以推荐Simon Tatham的拼图系列.这是一系列适用于Windows,OS X和Linux(以及作为Java小程序)的益智游戏(扫雷,数独,十五).这个架构非常简单:有一个前端接口有三个实现(每个平台一个),一个后端接口,每个游戏有一个实现(我给出了三个例子)和一个让它们一起通话的中端,做序列化和其他整洁的东西.
基本上,这是很好的OOP.用C语言写的.很容易做出贡献(我实现了Filling和Range游戏),因为它有很好的文档记录,而且很容易阅读.
Disruptor的代码是典型的,也可以从它为实现现代硬件的极端性能所做的工作中学到很多东西.
值得一读的是Martin Fowler对其架构,技术论文(PDF)和QCon演示的解释.此外,开发人员博客还包含很多好的阅读内容 - 尤其是Mechanical Sympathy Blog,其中教授了许多关于现代CPU和内存如何工作的内容.
这取决于你的兴趣,但我曾使用Quake III代码库,而且编写得非常好并且很好用.它用C语写.
在Linux内核是学习的很好的办法.
我知道可能很难潜入,因为多架构结构和大量的代码,但有一些非常好的文章慢慢进去,像蒂姆琼斯这样.
通过查看特定主题,我学到了很多东西,比如FAT驱动程序实现和文件系统抽象.
我发现清晰简洁的源代码的最好的部分之一是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 ); ...