我们通过编写程序和从其他程序中学习来学习编程。 您建议哪些开源代码存储库/程序用于学习/改进编程?
引用参考时请同时提及您喜欢的内容。
答案 0 :(得分:19)
我会推荐Scott Hanselman的weekly source code articles,他的确提出了你的建议,即阅读更多源代码以获得更好的效果。值得一读。
答案 1 :(得分:13)
我可以推荐Simon Tatham's puzzle collection。这是一系列适用于Windows,OS X和Linux(以及作为Java小程序)的益智游戏(扫雷,数独,十五)。这个架构非常简单:有一个前端接口有三个实现(每个平台一个),一个后端接口,每个游戏有一个实现(我给出了三个例子)和一个让它们一起通话的中端,做序列化和其他整洁的东西。
基本上,这是一个很好的OOP。用C语言写的。很容易做出贡献(我实现了填充和范围游戏),因为它有很好的文档记录,而且很容易阅读。
答案 2 :(得分:9)
Disruptor的代码是示例性的,也可以从它为实现现代硬件的极端性能所做的工作中学到很多东西。
值得一读的是其Martin Fowler's explanation和the technical paper (PDF)架构的the QCon presentation。开发人员博客也包含了很多好的阅读材料 - 尤其是Mechanical Sympathy Blog,其中教授了很多关于现代CPU和内存如何工作的内容。
答案 3 :(得分:6)
这取决于你的兴趣,但我曾与Quake III codebase合作过,而且编写得非常好,很适合。它是用C语言编写的。
答案 4 :(得分:5)
Linux kernel是一种非常好的学习方式。
我知道可能很难深入研究,因为多架构结构和大量代码,但有一些非常好的文章可以慢慢进入,例如this one from Tim Jones。
通过查看特定主题,我学到了很多东西,比如FAT驱动程序实现和文件系统抽象。
答案 5 :(得分:5)
我发现的最清晰简洁的源代码之一就是jQuery来源。无论你是否喜欢Javascript,它都是针对“代码作为文档”的拥护者提出的一个很好的理由。
有很多评论,但它不是ascii艺术品,你可以看到明确的推理 - 评论让你确切地知道要实现的目标。
示例(full source):
(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 );
...
答案 6 :(得分:3)
你会发现很多例子。但吉姆巴克说,这取决于你的兴趣。我从SharpDevelop来源学到了大量的“东西”。
答案 7 :(得分:3)
相对较小,但有足够的复杂性可以学习,我的投票是:
Apache的Log4Net日志框架。
它的源代码非常易读,并且“跨平台”[可编译:.NET 1.0,1.1,2.0,CF,MONO ...],因此对于“跨平台”C#开发的教训非常有价值。 ..
答案 8 :(得分:2)
如果有人有Code Reading by Diomidis Spinellis的副本,他在那里写了哪些开源项目?
@Avinash:如果你想进一步了解编程,我会推荐Spinellis的代码阅读和代码质量。他们有来自各个项目的代码示例,我相信所有的FOSS,所以你不仅可以阅读它们,而且可以阅读书中讨论的版本和最新版本,从中阅读更多代码并学习。