¿Cuáles son algunos hábitos efectivos de lectura de códigos?

Depende de lo complicado que sea el código base y también el propósito de la lectura del código (por ejemplo, corrección de errores, nueva función, solo aprendizaje, …).

Para algo simple (unos pocos miles de líneas), puede simplemente recorrer cada archivo para dibujar el gráfico de llamadas y el gráfico de clase. Lo principal es centrarse en imágenes grandes en lugar de detalles hasta que sea necesario. Para proyectos complejos (por ejemplo, cuando comencé en Bing, la base del código tiene millones de líneas), debe leer algunos documentos y / o tener a alguien que lo guíe brevemente. Luego establecí un punto de interrupción en varios archivos para tener una idea del panorama general. Nuevamente, esto es como dibujar un gráfico de llamadas y familias de clases.

Para el código C / C ++, los archivos de encabezado deben proporcionar suficiente información (si no, se necesitan más comentarios) para que otra persona comprenda qué se usa cada variable / función miembro y cómo usar cada función.

En general, trato de averiguar dónde está el punto de entrada de la aplicación o al menos el punto de entrada para la funcionalidad que se está examinando.

Si la aplicación fue escrita por seres humanos decentes que se preocupan por la cordura de las personas, no debería ser demasiado difícil encontrar esto. A partir de ahí, puede rastrear el flujo de la aplicación.

Normalmente escribo notas y / o mapeo el flujo con lápiz y papel, ya que me ayuda a absorber la aplicación a un alto nivel.

Una vez que tengo una comprensión decente de alto nivel de cómo se junta la aplicación, comienzo un estudio más profundo.

Para retroceder un poco, las aplicaciones generalmente están en capas en sus dependencias, lo que significa que la capa más inferior es un módulo que no depende de nada más y la siguiente capa depende del módulo debajo de ella. Esto se repite hasta que llegas a la capa superior, una que depende de una o más cosas, pero nada depende de ella.

Lo que me gusta hacer es identificar qué módulos / clases / objetos están en la capa más inferior, ya que pueden estudiarse por sí solos sin conocimiento previo de nada más. Por lo general, no heredan ni usan ningún otro objeto que no sea el que proporciona el lenguaje o la plataforma.

El podcast de Software Engineering Radio tuvo un episodio hace varios años sobre este tema y vale la pena escucharlo. Uno de los consejos más útiles que uso una y otra vez es alejar el código fuente a aproximadamente 4 puntos, para que no pueda leerlo, pero puede ver la forma del código. Me ha ayudado infinitamente a ver códigos repetidos y tener una idea de la estructura del código (declaraciones de decisión, bucles, … (y la longitud de los diferentes métodos y clases).

Episodio 148: Arqueología de software con Dave Thomas

La mejor manera de entender el código es resolviendo errores. Abre JIRA y agrieta.

Sigo un patrón similar al de Allan. También trato de estar atento a cualquier patrón de diseño o patrón de código que se haya aplicado. Es mucho más fácil razonar sobre algo, si puedo llamarlo “ThingFactory” o “ThatStrategy”.

También encontré que este video (Play by Play: Katrina Owen) con Katrina Owen es realmente genial para examinar un proceso del mundo real de cómo alguien puede tomar una base de código que nunca ha visto e intentar averiguar qué está sucediendo.

La otra cosa que hacer es mirar las pruebas. Las pruebas son un conjunto extraído de lógica que debe representar la ejecución de su base de código. Esperemos que puedan proporcionar alguna información sobre el funcionamiento del sistema.

Casi todos los IDE / editores tienen las mismas características. Puede usar cualquier IDE que conozca sus características. Y hay algunos sitios web que puede codificar en muchos lenguajes de programación. Puedes usarlos. Escriba su código y convierta cualquier otro idioma para que pueda ver cuáles son las diferencias. En realidad es un trabajo divertido, creo: D.

More Interesting

¿Cuál es la mejor manera de comenzar una carrera en tecnología (UX, UI, ingeniero front-end) sin un título en informática?

¿Es el desarrollo ágil algo real, o incluso vale la pena aprenderlo? ¿Es una broma?

¿Debo estudiar ingeniería mecánica, eléctrica, aeroespacial o de software?

¿Cuál es la mejor manera de implementar ITIL en una organización que hace UX (diseño de experiencia de usuario)?

¿Es obligatorio aprender todos los idiomas para las pruebas de software?

¿Qué opinas de Hack, el nuevo lenguaje de programación de código abierto de Facebook? ¿Por qué?

¿Cuáles son algunas señales de que alguien debería considerar PM en lugar de la ingeniería clásica?

¿Los programadores tienen algunos secretos de codificación que solo se aprenden por experiencia?

¿El mercado del software es realmente malo?

¿Cuál es la diferencia entre typedef struct y struct?

¿Qué patrones de diseño se usan popularmente en el desarrollo de software?

Dado el número cada vez mayor de utilidades (Puppet, Chef, Redis, MemCache, Selenium, etc.) agregadas a la pila de aplicaciones principales (HTML, CSS, JS, DB e idiomas de back-end de elección), qué es una base pila 'completa' para dominar para el desarrollo general de aplicaciones de nivel de producción

¿No sería un enfoque más ordenado usar EventBus en lugar de Listener para un Model View Presenter?

¿Qué profesores o estudiantes están haciendo las cosas más emocionantes en aprendizaje automático e ingeniería de software en CMU?

Cómo desarrollar una aplicación que reemplace PuTTy (modo serie)