Gut gestaltete / hochwertige Open-Source-Software [geschlossen]


32

Ich nehme an einem Software-Design-Kurs teil, in dem ich eine Open-Source-Software zur Analyse aus Sicht des Software-Designs auswählen sollte.

Es muss ein großes Projekt sein: mindestens 100.000 Codezeilen.

Ich würde wirklich gerne eine Software wählen, die sehr gut entworfen und aufgebaut ist, um gute Einblicke in gutes Software-Design zu haben.

Mit gutem Design meine ich Dinge wie sinnvolle Klassen und Architektur, gute Verwendung von (Design-) Mustern, gute Verwendung von Abstraktion, gute Organisation von Komponenten, hohe Kohäsion und geringe Kopplung zwischen Komponenten usw.

Haben Sie eine Software, die mir einen Vorschlag macht?

Beachten Sie, dass die Software nur ein gutes Design haben muss, das Design muss nicht dokumentiert werden! :)

Es muss keine Anwendung für den Endbenutzer sein. Es kann sich auch um eine Bibliothek, ein Tool usw. handeln.


3
Warum fragen Sie uns? Was interessiert dich? Wenn ich ein Buchhaltungspaket vorschlage und Sie finden, dass Buchhaltung langweilig ist, wäre es keine gute Antwort, oder? Was für ein Paket interessiert dich? Schauen Sie sich diese zuerst an und fragen Sie uns dann nach bestimmten Paketen, die Sie sich angesehen haben.
S.Lott

Vielen Dank für den Hinweis. Ich muss sagen, dass Softwareentwicklungstools für mich von Interesse wären.
Andrea Zilio

Welche Plattform möchten Sie nutzen?

3
Schauen Sie sich die Architektur von Open Source-Anwendungen an, die eine Reihe gut gestalteter Open Source-Anwendungen beschreibt.
Richard

Die Codezeile ist mehrdeutig. Die Größe der ausführbaren Datei und alle DLLs, von denen sie abhängen, können Ihnen möglicherweise etwas mitteilen. Wenn es eine gute Bibliothek gibt, ist es nur sinnvoll, sie zu benutzen. Zähle ich dann die Zeilen der Bibliothek als Teil meiner gesamten LOC-Zählung oder nicht? Ich würde sagen, dass viele der Frameworks (Bibliotheken, APIs, SDKs oder welcher Name auch immer Sie bevorzugen) in der Regel sehr gut sind (sie werden aus jedem Blickwinkel stark getroffen, daher sind Fehler schnell zu finden und sollten sich schnell beheben lassen). Da gute Codierer andere gute Bibliotheken nutzen, muss der tatsächliche LOC für eine komplexe Anwendung nicht groß sein.
Job

Antworten:


23

Mit gutem Design meine ich Dinge wie sinnvolle Klassen und Architektur, gute Verwendung von Designmustern, gute Verwendung von Abstraktion, gute Organisation von Komponenten, hohe Kohäsion und geringe Kopplung zwischen Komponenten

Erstens lebt eine Software, ob gut oder schlecht, nicht in der Einsamkeit - sie modelliert ein reales Szenario, das von Menschen als Problem aufgefasst und daher immer eng mit einer sogenannten "Anwendungsdomäne" verknüpft wird. Wenn Sie also über Software sprechen, müssen Sie zuerst die Domäne kennen und studieren - denn nur dann können Sie die Entscheidung über Gut und Böse treffen.

  • git - nicht nur gut, sondern ein tolles design. Im Kern handelt es sich nicht um eine Versionskontrolle, sondern nur um ein Dateisystem. Ein dünnes Furnier an Funktionalität über dem Kern macht es zu einem Versionskontrollsystem. Lernen Sie die Interna von git kennen und Ihr Gespür für Software-Design wird aufgeklärt.

  • jQuery - keine sehr gut (intern) dokumentierte Bibliothek, aber eine inspirierende Quelle, die zeigt, wie clientseitiger JavaScript-Code Wunder bewirken kann.

  • NodeJS - Wenn Sie Server bauen möchten , bietet dieses Projekt erfrischend neue Ideen und Muster.

  • v8 - sehr guter C ++ - Code, fantastische Bibliothek zum Erlernen / Studieren von Implementierungen virtueller Maschinen.

  • NoSQL-Projekte - Couch, Mongo, Redis, Cassandra - diese Projekte demonstrieren intelligente Wege zur Lösung von Persistenzproblemen. Sie befürworten auch die Idee der polyglotten Persistenz.

  • Boost-Bibliotheken - gute Dosis C ++.

  • OpenStack - sehr gute Projekte zu Cloud Computing und Virtualisierung.

  • The Apache Software Foundation - Wählen Sie eines ihrer Projekte aus und untersuchen Sie es. Der modulare Aufbau von HTTPd ist eine großartige Quelle, wenn Sie sehen möchten, wie Komponenten zusammenkommen. APR (Apache Portable Runtime) - auch eine wirklich gute Bibliothek.

  • mod_wsgi - eines der besten C-Programme, auf die ich gestoßen bin.

"Gute Verwendung von Entwurfsmustern" - Es ist NICHT wichtig, dass der Code einem bekannten Entwurfsmuster entspricht. Es ist wichtiger, dass das Problem "intelligent" gelöst wird - dass er wartbar, wiederverwendbar und lesbar ist. Wenn Code in eine bestimmte "Form" gepresst wird - nur um ein Entwurfsmuster einzuhalten - kann es sich um schlechten Code handeln.

"Nicht weniger als 100.000 Codezeilen" - seit wann ist die Anzahl der Zeilen ein Maß für gute Qualität geworden - um einen Eindruck von "gut gestalteter / architektonischer Software" zu bekommen, muss sie nicht BIG sein.

Denken Sie auch hier daran, zunächst die Natur und die Nuancen der Problemdomäne zu untersuchen und dann den Code zu lesen.

UPDATE: Okt. 2015

InfluxDB - https://influxdb.com/ Dieses Go-Projekt befindet sich in aktiver Entwicklung und ist noch NICHT sehr komplex. Sie können also relativ einfach mit dem Einstieg in Code beginnen als mit OpenStack.


13

Wirf eine Münze. Alle großen Open Source-Projekte müssen brillant sein, um zu überleben. Apache-, Linux- und GNU-Projekte sind alle brillant.


4
Alle großen gemeindenahen OSS-Projekte müssen mindestens anständig sein, um zu überleben. Ich würde nicht brillant sagen. Für Dinge, die meistens gesagt werden, Regierungsprojekte, die ausschließlich von Mitarbeitern durchgeführt werden, ist die Codequalität nicht immer das Höchste auf einer Prioritätenliste. Aber +1 für deine Beispiele.
TZHX

8
ist Wordpress brillant?
Drew

9
  • Chrom
  • Feuerfuchs
  • Apache
  • MySQL
  • PostgreSQL
  • Linux
  • GNU

2
Sind Sie sicher, dass Firefox nicht mit stagnierenden Codeteilen übersät ist, die in den frühen 90ern geschrieben wurden? Das scheint kein guter Code für das Erlernen moderner Codierungspraktiken zu sein
TheLQ

3
Der Quellcode für Firefox und MySQL ist schrecklicher Mist, der niemals als Beispiel für gutes Softwaredesign dienen sollte.
Jordanien

7

Python. Insbesondere CPython, die primäre Implementierung. In Version 3.2 führt der Interpreter etwa 50 KByte C-Code aus, die Standardbibliothek über 400 KByte Python-Code. Angesichts der extrem hohen Qualität der Sprache und der Förderung der Grundsätze der Lesbarkeit und des guten Designs würde ich den gesamten Code für recht gut halten.


4

TeX und MetaFont sind wirklich eine Studie wert: http://www.tug.org/

Ihre lokale Bibliothek kann Ihnen bei gedruckten Versionen der Quellen behilflich sein.


3

Ich würde empfehlen, das folgende Buch zu lesen, bevor Sie sich für ein Open Source-Projekt entscheiden. Dies gibt Ihnen einen Einblick in das, was als guter / schlechter Code angesehen werden kann.

Greg Wilson
Making Software Was wirklich funktioniert und warum wir an
die Architektur von Open Source-Anwendungen glauben

Hier ist auch sein Blog Stack Exchange-Interview, wenn Sie dem Autor zuhören möchten, bevor Sie in seinem
http://blog.stackoverflow.com/2011/06/se-podcast-09/ nachsehen.

Was ist insgesamt als hochwertige Software zu bezeichnen? Die Frage selbst ist sehr subjektiv. Benutzer haben unterschiedliche Qualitätsmessungen. Ein Benutzer kann das Softwarepaket abhängig von den technischen Vorzügen als qualitativ hochwertig betrachten. Wo ein anderer Benutzer die Qualität basierend auf der Ästhetik der Benutzeroberfläche und der gesamten Benutzererfahrung beurteilen kann.

Aus geschäftlicher Sicht messen sie die Softwarequalität in der Regel danach, ob sie den Erwartungen des Kunden entspricht oder ob sie die vertraglichen Verpflichtungen eines Kunden erfüllen. Es gibt auch professionelles Verhalten, aber das hängt davon ab, von welcher Seite des Zauns Sie es betrachten.

Aus Sicht des Programmierers ist das Design und die Konstruktion der API zu dem Zeitpunkt, als die Software erstellt wurde, wie elegant. Derselbe Design- oder Codestandard kann als unprofessionell angesehen werden, wenn sich Einstellungen und Ansichten von Programmierern im Laufe der Zeit ändern.


2

Ich werde die IntelliJ Community Edition vorschlagen, da Sie erwähnen, dass Sie Software-Tools mögen.

http://www.jetbrains.org/

Was mir daran gefällt:

  1. Es ist ein Werkzeug, das eher etwas tut als ein Framework
  2. Sie machen wirklich interessante Dinge wie statische Code-Analyse und Datenfluss-Analyse. Ich finde es sehr angenehm, die Details von zu sehen.
  3. Eine nette Sache ist, dass Sie es verwenden können, um Ihre Studie durchzuführen, da es die Möglichkeit hat, die gesamte Code-Analyse auch für sich selbst auszuführen.

(Zugegeben, ich bin ein JetBrains-Fan)


2

Ich habe selbst nach einem solchen Projekt gesucht und mich entschieden CLang.

  • Es ist relativ neu (Nachkommen von LLVM, die erst 10 Jahre alt sind), also kein (oder nicht, was ich gesehen habe) veralteter Code
  • Ein modulares Design (als LLVM), sehr gut durchdacht, was ich heutzutage für sehr wichtig halte
  • Sehr sauberer Code, gut kommentiert (oft sehen Sie Anführungszeichen aus dem Standard, um die Dinge zu erklären)
  • Eine sehr schön gestaltete Testsuite / Testumgebung

Es gibt dort nicht viele Designmuster, ein paar Besucher hier und da, aber das war es auch schon. Die Klassenhierarchien sind einfach und unkompliziert ... Eigentlich denke ich, dass Einfachheit das Ziel ist, es scheint keine Überentwicklung zu geben.

Da jedoch eine Reihe von Entwurfsentscheidungen von entscheidender Bedeutung für die Leistung sind, können sie zweifelhaft erscheinen (Vermeidung virtueller Funktionen für zahlreiche Objekte, Kompilieren ohne RTTI / Ausnahmen). Daher ist nicht alles auf alltägliche Software anwendbar.




0

Also, nur eine andere Variante - Was ist mit der Programmiersprache Nemerle ?

Es ist nicht so beliebt (aber GitHub hat gerade eine Hervorhebung für Nemerle hinzugefügt) und Sie können dort viele gute Punkte finden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.