我们通过编写程序和从其他程序中学习来学习编程。
您建议使用哪些开放源代码存储库/程序来学习/改进编程?
在引用参考时,请同时提及您喜欢的东西。
我会推荐Scott Hanselman的每周源代码文章,他完全按照您的建议去做,即阅读更多源代码以使它变得更好。值得一读。
我可以推荐西蒙·塔瑟姆(Simon Tatham)的拼图系列。这是一系列益智游戏(扫雷,数独,十五个),可用于Windows,OS X和Linux(以及Java小程序)。架构非常简单:有一个前端接口,具有三种实现方式(每个平台一个),一个后端接口,每个游戏具有一种实现方式(我已经给出了三个示例),以及一个使它们能够相互交谈的中端,做序列化和其他整洁的东西。
基本上,这是很好的OOP。用C编写。它有很好的文档记录,而且很容易阅读,因此很容易做出贡献(我实现了Filling and Range游戏)。
Disruptor的代码是示例性的,从它为实现现代硬件上的卓越性能所做的工作中也可以学到很多。
值得一读的是Martin Fowler对它的体系结构的解释,技术论文(PDF)和QCon演示。此外,开发人员博客还包含许多不错的读物,尤其是《机械同情博客》,其中讲述了许多有关现代CPU和内存如何工作的知识。
这取决于您的兴趣,但是我使用过Quake III代码库,因此编写得相当好,很不错。它是用C编写的。
我发现的简洁明了的源代码最好的作品之一就是jQuery源代码。无论您是否喜欢Javascript,它都非常适合反对"代码即文档"的提倡者。
有很多评论,但不是ascii艺术品,您可以看到清楚的推理-这些评论使您确切地知道要实现的目标。
一个例子(全文):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| (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 );
... |
Linux内核是学习的很好方法。
我知道由于多架构的结构和大量的代码,可能很难深入研究,但是里面有一些很好的文章要慢慢介绍,例如Tim Jones的这篇文章。
通过研究特定主题,例如FAT驱动程序实现和文件系统抽象,我学到了很多东西。
相对较小,但是具有足够的复杂性可以学习,我的投票是:
Apache的Log4Net日志记录框架。
它的源代码非常易读,并且是"跨平台的" [可在.NET 1.0、1.1、2.0,CF,MONO ...上编译],因此对于"跨平台的" C#开发中的课程很有用...
您会发现很多示例。但是吉姆·巴克(Jim Buck)说过,这取决于您的兴趣。我已经从SharpDevelop来源中学到了一吨的"东西"。
如果有人抄袭了Diomidis Spinellis的Code Reading,那么他在那里写了哪些开源项目?
@Avinash:如果您想了解一般的编程知识,建议您同时阅读Spinellis的Code Reading和Code Quality。我相信,它们具有来自各个项目(所有FOSS)的代码示例,因此您不仅可以阅读它们,还可以获取书中讨论的版本以及最新版本以从中阅读更多代码并学习。