Estoy tomando una clase de diseño de software donde debería elegir un software de código abierto para analizar desde el punto de vista del diseño de software.
Tiene que ser un gran proyecto: no menos de 100,000 líneas de código.
Realmente me gustaría elegir un software que esté muy bien diseñado y diseñado para tener una buena idea del buen diseño del software.
Por buen diseño me refiero a cosas como clases y arquitectura significativas, buen uso de patrones (de diseño), buen uso de abstracción, buena organización de componentes, alta cohesión y bajo acoplamiento entre componentes, etc.
¿Tienes algún software para sugerirme?
Tenga en cuenta que el software solo necesita tener un buen diseño, ¡el diseño no necesita ser documentado! :)
No necesita ser una aplicación para el usuario final ... También puede ser una biblioteca, una herramienta, etc.
fuente
Respuestas:
Primero, un software, bueno o malo, no vive en la soledad: modela un escenario del mundo real que los humanos conciben como un problema y, por lo tanto, siempre se asocia estrechamente con algo llamado "dominio de aplicación". Entonces, cada vez que hable sobre software, primero conozca y estudie el dominio, ya que solo entonces puede lograr la discreción de lo bueno y lo malo.
git : no solo bueno, sino un diseño increíble. En esencia, no es un control de versiones, solo un sistema de archivos. Una fina capa de funcionalidad en la parte superior del núcleo lo convierte en un sistema de control de versiones. Conozca los aspectos internos de git, y su sentido del diseño de software se iluminará.
jQuery : no es una biblioteca muy bien documentada (internamente), pero es una fuente inspiradora que demuestra cómo el código JavaScript del lado del cliente puede hacer maravillas.
NodeJS : si está interesado en crear servidores, este proyecto tiene nuevas ideas y patrones que ofrecer.
v8 : muy buen código C ++, biblioteca fantástica para aprender / estudiar implementaciones de máquinas virtuales.
Proyectos NoSQL - Couch, Mongo, Redis, Cassandra - estos proyectos demuestran formas inteligentes de resolver problemas de persistencia. También abrazan la idea de la persistencia políglota.
Impulsar bibliotecas : buena dosis de C ++.
OpenStack : muy buenos proyectos sobre computación en la nube y virtualización.
The Apache Software Foundation : elija cualquiera de sus proyectos y estudíelo. La estructura modular de HTTPd es una gran fuente si desea ver cómo se unen los componentes. APR (tiempo de ejecución portátil apache): una lib realmente buena también.
mod_wsgi : uno de los mejores programas en C que he encontrado.
"buen uso de patrones de diseño" - NO es importante que el código corresponda a un patrón de diseño bien conocido - es más importante que resuelva el problema "inteligentemente" - que sea mantenible, reutilizable y legible. Si el código está repleto de una "forma" particular, solo para adherirse a un patrón de diseño, puede ser un código incorrecto.
"no menos de 100,000 líneas de código", ya que cuando el número de líneas se convirtió en una métrica de buena calidad, probar el "software bien diseñado / con arquitectura" no requiere que sea GRANDE.
Nuevamente, recuerde estudiar primero la naturaleza y los matices del dominio del problema y luego profundizar en la lectura del código.
ACTUALIZACIÓN: octubre de 2015
InfluxDB - https://influxdb.com/ Este proyecto Go está en desarrollo activo y aún no es muy complejo. Por lo tanto, puede comenzar a cavar en el código con relativa facilidad que algo como OpenStack.
fuente
Tirar una moneda. Todos los grandes proyectos de código abierto tienen que ser brillantes para sobrevivir. Los proyectos Apache, Linux, GNU son todos brillantes.
fuente
fuente
Pitón. Específicamente, CPython, la implementación principal. Para la Versión 3.2, el intérprete ejecuta aproximadamente 50k sloc de código C, biblioteca estándar sobre 400k sloc de código Python. Dada la extremadamente alta calidad del lenguaje y su aliento a los principios de legibilidad y buen diseño, creo que todo este código sería bastante bueno.
fuente
Vale la pena estudiar TeX junto con MetaFont: http://www.tug.org/
Su biblioteca local puede ayudarlo con versiones impresas de las fuentes.
fuente
Recomiendo leer el siguiente libro antes de elegir un proyecto de código abierto. Esto le dará una idea de lo que puede considerarse un código bueno / malo.
Greg Wilson
haciendo software lo que realmente funciona y por qué creemos en
la arquitectura de las aplicaciones de código abierto
Aquí también está su entrevista de intercambio de pila de Blog si está interesado en escuchar al autor antes de mirar su
http://blog.stackoverflow.com/2011/06/se-podcast-09/
En general, ¿qué se considera software de alta calidad? La pregunta en sí es muy subjetiva. Los usuarios tienen diferentes medidas de calidad. Un usuario puede considerar que el paquete de software es de alta calidad dependiendo de los méritos técnicos. Donde otros usuarios pueden medir la calidad en función de la estética de la interfaz de usuario y la experiencia general del usuario.
Desde una perspectiva comercial, generalmente miden la calidad del software dependiendo de si cumple con las expectativas del cliente o si cumple con las obligaciones contractuales de un cliente. También hay una conducta profesional, pero eso depende de qué lado de la cerca lo veas.
Desde el punto de vista de los programadores, cuán elegante es el diseño y las construcciones de la API en el momento en que se creó el software. Se puede considerar que el mismo diseño o estándar de código no es profesional cuando las actitudes y opiniones de los programadores cambian con el tiempo.
fuente
Sugeriré la edición IntelliJ Community Edition ya que mencionas que te gustan las herramientas de software.
http://www.jetbrains.org/
Lo que me gusta de eso:
(Es cierto que soy un fanático de JetBrains)
fuente
He estado buscando un proyecto así, y me conformé con él
CLang
.No hay muchos patrones de diseño allí, algunos visitantes aquí y allá, pero eso es todo. Las jerarquías de clase son simples y directas ... En realidad, creo que la meta es la simplicidad , no parece haber ninguna ingeniería excesiva.
Dicho esto, al ser crítico para el rendimiento, una serie de decisiones de diseño pueden parecer dudosas (evitar funciones virtuales para numerosos objetos, compilar sin RTTI / excepciones), por lo que no todo es aplicable al software cotidiano.
fuente
Blender está bien estructurado y bien diseñado.
fuente
Joomla, está muy bien hecho. Pero no estoy seguro si son 100,000 líneas
fuente
Entonces, solo otra variante: ¿qué pasa con el lenguaje de programación Nemerle ?
No es tan popular (pero GitHub acaba de agregar resaltado para Nemerle) y puedes encontrar muchos puntos buenos allí.
fuente