2008-08-26 28 views
39

Chúng tôi học lập trình bằng cách viết chương trình và học hỏi từ các chương trình khác. Các kho/mã nguồn mở nào bạn đề xuất cho việc học/cải thiện lập trình?Cũng viết các dự án nguồn mở (cho việc học)?

Trong khi trích dẫn tham chiếu, vui lòng đề cập đến điều bạn thích về nó.

Trả lời

6

Điều đó phụ thuộc vào sở thích của bạn, nhưng tôi đã làm việc với Quake III codebase và điều đó được viết khá tốt và phù hợp để làm việc. Nó được viết bằng C.

17

Tôi muốn giới thiệu Scott Hanselman's weekly source code articles, anh ấy thực hiện chính xác những gì bạn đề xuất, đó là đọc thêm mã nguồn để cải thiện. Nó đáng đọc.

3

Bạn sẽ tìm thấy rất nhiều ví dụ. Nhưng Jim Buck đã nói, nó phụ thuộc vào sở thích của bạn. Tôi đã học được một chỉ số s-- "công cụ" từ nguồn SharpDevelop.

2

Nếu có ai có bản sao Code Reading by Diomidis Spinellis, anh ấy viết gì về dự án nguồn mở?


@Avinash: Nếu bạn muốn tìm hiểu thêm về lập trình nói chung, tôi muốn giới thiệu cả Đọc mã và Chất lượng mã theo Spinellis. Họ có các mẫu mã từ các dự án khác nhau, tất cả các PMNM, tôi tin, vì vậy bạn không chỉ có thể đọc về chúng, mà còn đi và lấy phiên bản được thảo luận trong sách và phiên bản mới nhất để đọc thêm mã từ chúng và tìm hiểu.


5

Linux kernel là một cách rất hay để học.

Tôi biết rất khó để đi sâu vào cấu trúc đa kiến ​​trúc và số lượng lớn mã nhưng có một số bài viết rất hay để chuyển từ từ bên trong, như this one from Tim Jones.

Tôi đã học được rất nhiều bằng cách xem một chủ đề cụ thể, như việc triển khai trình điều khiển FAT và hệ thống tập tin trừu tượng.

12

Tôi có thể đề xuất Simon Tatham's puzzle collection. Đó là một loạt các trò chơi câu đố (tàu quét mìn, sudoku, mười lăm) có sẵn cho Windows, OS X và Linux (và như là các applet java). Kiến trúc khá đơn giản: có giao diện front-end với ba triển khai (một nền tảng cho mỗi nền tảng), giao diện back-end với một triển khai cho mỗi trò chơi (tôi đã đưa ra ba ví dụ) và trung gian giúp họ nói chuyện cùng nhau, làm serialization và các công cụ gọn gàng khác.

Về cơ bản, đó là OOP tốt. Được viết bằng C. Thật dễ dàng để đóng góp (Tôi đã triển khai trò chơi Điền và Phạm vi) vì nó được viết thành tài liệu và dễ đọc.

3

tương đối nhỏ, nhưng với đủ phức tạp để có thể học hỏi từ, phiếu bầu của tôi đi vào:

khuôn khổ Log4Net khai thác gỗ của Apache.

Đó là mã nguồn rất dễ đọc và "nền tảng chéo" [compilable trên: .NET 1.0, 1.1, 2.0, CF, MONO ...], do đó có giá trị cho bài học trong "đa nền tảng" C# phát triển ...

5

Một trong những phần hay nhất tôi đã tìm thấy mã nguồn rõ ràng và súc tích là nguồn jQuery. Cho dù bạn có thích Javascript hay không, nó tạo ra một trường hợp tuyệt vời chống lại những người ủng hộ mã số "là tài liệu".

Có rất nhiều nhận xét nhưng nó không phải là tác phẩm nghệ thuật ascii và bạn có thể thấy lý do rõ ràng - ý kiến ​​giúp bạn biết chính xác những gì đang cố gắng đạt được.

Một ví dụ (full source):

đang
(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); 

... 
+1

Hầu hết các nhận xét đều có thể tránh được. "mã là tài liệu" không phải là về việc xả rác mã với các bình luận, thực sự. Martin fowler đã chứng ngộ tôi khi tôi đọc nhận xét đó là mùi mã. – rpattabi

+2

Tôi thích hầu hết những nhận xét đó. Họ theo kịp với chính sách bình luận của tôi không nêu rõ TÔI đang làm gì nhưng TẠI SAO. –

+1

@sebstian chính xác, không có ý kiến ​​bạn sẽ không biết tại sao 'window = this' đang được sử dụng. @ ragu.pattabi bạn đang đề cập đến điều này: http://martinfowler.com/bliki/CodeAsDocumentation.html? Anh ta không đề cập đến bất cứ điều gì về ý kiến, chỉ là đoạn mã rõ ràng đó là tự ghi lại tài liệu. –

7

Disruptor 's là gương mẫu và cũng nhiều có thể học được từ những gì nó làm để đạt được hiệu suất cực trên phần cứng hiện đại.

Đọc có giá trị là Martin Fowler's explanation kiến ​​trúc của nó, the technical paper (PDF)the QCon presentation. Ngoài ra, các blog của nhà phát triển có chứa nhiều bài đọc hay - đặc biệt là Mechanical Sympathy Blog, điều này dạy nhiều điều về cách các CPU và bộ nhớ hiện đại hoạt động.

Các vấn đề liên quan