Este documento habla sobre las técnicas de desarrollo Test Driven Development (TDD) y Clean Code. Explica que TDD involucra escribir pruebas unitarias primero y luego el código mínimo necesario para que pasen, y que esto permite que el diseño emerja del código. También describe principios de Clean Code como tener nombres significativos, funciones pequeñas, y formato uniforme. El documento concluye que usar TDD y Clean Code trae beneficios como seguridad, mantenibilidad y trabajo en equipo efectivo.
Mi presentación en el ITLA Tech Day 2018 #ITLATechDay #EncuentrosUniversitariosJava2018 #Java
@ ITLA Recinto Santiago, Santiago de los caballeros. 15 consejos prácticos sobre características fundamentales que todo programador Java debe tener en cuenta.
Mi presentación en el ITLA Tech Day 2018 #ITLATechDay #EncuentrosUniversitariosJava2018 #Java
@ ITLA Recinto Santiago, Santiago de los caballeros. 15 consejos prácticos sobre características fundamentales que todo programador Java debe tener en cuenta.
4. Programación con arrays, funciones, y objetos definidos por el usuarioLaura Folgado Galache
Ciclo: Desarrollo de Aplicaciones Web
Módulo: Desarrollo Web en Entorno Cliente
Unidad 4. Programación con arrays, funciones, y objetos definidos por el usuario
Slides de la tercera clase del curso de Java SCJP dictado en la Universidad Nacional de Centro de La Provincia de Buenos Aires.
Contenido:
1. Unidad 3: Asignaciones
Slides de la quinta clase del curso de Java SCJP dictado en la Universidad Nacional de Centro de La Provincia de Buenos Aires.
Contenido:
1. if, while, for, enhanced for.
2. break y continue
3. Exceptions
4. Assertions
Slides de la sexta clase del curso de Java SCJP dictado en la Universidad Nacional de Centro de La Provincia de Buenos Aires.
Contenido:
1. Collections
Mis Paginas Web :
Mi web Principal" Rivera & G ":
Descarga la biblia de java y manual de windows 8.
http://riverasn.p.ht/
Mi web Company.Rivera&G :
Descarga mis Aplicaciones y Proyectos en visual basic 2012 ,java,C#,PHP,HTML,JavaScript
http://santosrl.p.ht/
Mi web "El Hacker 2013":
Descarga el manual de visual basic 2010 y visual basic 6.0 portable a full
http://riverayg.zz.mu/
Mi facebook:
https://www.facebook.com/PatrickNilsdeAlesandro.RiveraLujan
Mi grupo de programadores :
https://www.facebook.com/groups/398604720248657/
Mi grupo de soporte tecnico PC :
https://www.facebook.com/groups/145173492332702/
Mi web JIMBO:
http://riverasn.jimdo.com/
Mi twitter.com:
https://twitter.com/RIVERALUJANSANT
4. Programación con arrays, funciones, y objetos definidos por el usuarioLaura Folgado Galache
Ciclo: Desarrollo de Aplicaciones Web
Módulo: Desarrollo Web en Entorno Cliente
Unidad 4. Programación con arrays, funciones, y objetos definidos por el usuario
Slides de la tercera clase del curso de Java SCJP dictado en la Universidad Nacional de Centro de La Provincia de Buenos Aires.
Contenido:
1. Unidad 3: Asignaciones
Slides de la quinta clase del curso de Java SCJP dictado en la Universidad Nacional de Centro de La Provincia de Buenos Aires.
Contenido:
1. if, while, for, enhanced for.
2. break y continue
3. Exceptions
4. Assertions
Slides de la sexta clase del curso de Java SCJP dictado en la Universidad Nacional de Centro de La Provincia de Buenos Aires.
Contenido:
1. Collections
Mis Paginas Web :
Mi web Principal" Rivera & G ":
Descarga la biblia de java y manual de windows 8.
http://riverasn.p.ht/
Mi web Company.Rivera&G :
Descarga mis Aplicaciones y Proyectos en visual basic 2012 ,java,C#,PHP,HTML,JavaScript
http://santosrl.p.ht/
Mi web "El Hacker 2013":
Descarga el manual de visual basic 2010 y visual basic 6.0 portable a full
http://riverayg.zz.mu/
Mi facebook:
https://www.facebook.com/PatrickNilsdeAlesandro.RiveraLujan
Mi grupo de programadores :
https://www.facebook.com/groups/398604720248657/
Mi grupo de soporte tecnico PC :
https://www.facebook.com/groups/145173492332702/
Mi web JIMBO:
http://riverasn.jimdo.com/
Mi twitter.com:
https://twitter.com/RIVERALUJANSANT
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAVíctor Bolinches
02/03/2017
Charla Universidad Politécnica de Valencia - https://www.upv.es/
Asingnatura : Auditoria, Calidad y Gestion de Sistemas de Información (ACG)
Máster Universitario en Ingeniería Informática - https://www.upv.es/titulaciones/MUIINF/
Estructuras de datos avanzadas: Casos de uso realesSoftware Guru
La utilización de estructuras de datos adecuadas para cada problema hace que se simplifiquen en gran medida los tiempos de respuestas y la cantidad de cómputo realizada.
Por Nelson González
Onboarding new members into an engineering team is not easy on anyone. In a short period of time, the new team member is required to be able to bring professional
Por Victoriya Kalmanovich
El secreto para ser un desarrollador SeniorSoftware Guru
En esta charla platicaremos sobre el “secreto” y el camino para llegar a ser un desarrollador Senior, experiencia, consejos y recomendaciones que en estos 8 años
Por René Sandoval
Apache Airflow es una plataforma en la que podemos crear flujos de datos de manera programática, planificarlos y monitorear de manera centralizada.
Por Yesi Díaz
How thick data can improve big data analysis for business:Software Guru
En esta presentación hablaré sobre cómo el Análisis de Datos Gruesos, específicamente el análisis antropológico y semiótico, puede ayudar a mejorar los resultados del Big Data
Por Martin Cuitzeo
CoDi® es la nueva forma de realizar pagos digitales desarrollada por el Banco de México. Por medio de CoDi puedes realizar cobros y pagos desde tu celular, utilizando una cuenta bancaria o de alguna institución financiera, sin comisiones.
Por Cristian Jaramillo
Gestionando la felicidad de los equipos con Management 3.0Software Guru
En las metodologías agiles hablamos de equipos colaborativos, autogestionados y felices. hablamos de lideres serviciales. El management 3.0 nos ayuda a cultivar el mindset correcto, aquel que servirá como el terreno fértil para que la agilidad florezca.
Por Andrea Vélez Cárdenas
Taller: Creación de Componentes Web re-usables con StencilJSSoftware Guru
Hoy por hoy las experiences de usuario pueden ser enriquecidas mediante el uso de Web Components, que son un estándar de la W3C soportado por la mayoría de los navegadores web modernos.
Por Alex Arriaga
Así publicamos las apps de Spotify sin stressSoftware Guru
En Spotify tenemos 1600+ ingenieros, trabajando en 280+ squads. Aún a esta escala, hemos logrado adoptar prácticas que nos han permitido acelerar la forma en que desarrollamos nuestro producto. Presentado por Erick Camacho en SG Virtual Conference 2020
Achieving Your Goals: 5 Tips to successfully achieve your goalsSoftware Guru
he measure of the executive, Peter F. Drucker reminds us, is the ability to "get the right things done." This involves having clarity on what are the right things as well as avoiding what is unproductive. Intelligence, creativity, and knowledge may all be wasted if not put to work on the things that matter.
Presentado por Cristina Nistor en SG Virtual Conference 2020
Acciones de comunidades tech en tiempos del Covid19Software Guru
Acciones de Comunidades Tech en tiempo del COVID-19 es una platica para informar acerca de las acciones que están realizando algunas comunidades de tecnología en México para luchar contra la propagación del COVID-19. Desde análisis de datos, visualizaciones, simulaciones de contagio, etc.
Presentado por Juana Martínez, Adriana Vallejo y Eduardo Ramírez en SG Virtual Conference 2020
De lo operativo a lo estratégico: un modelo de management de diseñoSoftware Guru
La charla presenta un modelo claro, generado por la ponente, para atender los niveles desde lo operativo a lo estratégico.
Presentado por Gabriela Salinas en SG Virtual Conference
Las lámparas de alta intensidad de descarga o lámparas de descarga de alta in...espinozaernesto427
Las lámparas de alta intensidad de descarga o lámparas de descarga de alta intensidad son un tipo de lámpara eléctrica de descarga de gas que produce luz por medio de un arco eléctrico entre electrodos de tungsteno alojados dentro de un tubo de alúmina o cuarzo moldeado translúcido o transparente.
lámparas más eficientes del mercado, debido a su menor consumo y por la cantidad de luz que emiten. Adquieren una vida útil de hasta 50.000 horas y no generan calor alguna. Si quieres cambiar la iluminación de tu hogar para hacerla mucho más eficiente, ¡esta es tu mejor opción!
Las nuevas lámparas de descarga de alta intensidad producen más luz visible por unidad de energía eléctrica consumida que las lámparas fluorescentes e incandescentes, ya que una mayor proporción de su radiación es luz visible, en contraste con la infrarroja. Sin embargo, la salida de lúmenes de la iluminación HID puede deteriorarse hasta en un 70% durante 10,000 horas de funcionamiento.
Muchos vehículos modernos usan bombillas HID para los principales sistemas de iluminación, aunque algunas aplicaciones ahora están pasando de bombillas HID a tecnología LED y láser.1 Modelos de lámparas van desde las típicas lámparas de 35 a 100 W de los autos, a las de más de 15 kW que se utilizan en los proyectores de cines IMAX.
Esta tecnología HID no es nueva y fue demostrada por primera vez por Francis Hauksbee en 1705. Lámpara de Nernst.
Lámpara incandescente.
Lámpara de descarga. Lámpara fluorescente. Lámpara fluorescente compacta. Lámpara de haluro metálico. Lámpara de vapor de sodio. Lámpara de vapor de mercurio. Lámpara de neón. Lámpara de deuterio. Lámpara xenón.
Lámpara LED.
Lámpara de plasma.
Flash (fotografía) Las lámparas de descarga de alta intensidad (HID) son un tipo de lámparas de descarga de gas muy utilizadas en la industria de la iluminación. Estas lámparas producen luz creando un arco eléctrico entre dos electrodos a través de un gas ionizado. Las lámparas HID son conocidas por su gran eficacia a la hora de convertir la electricidad en luz y por su larga vida útil.
A diferencia de las luces fluorescentes, que necesitan un recubrimiento de fósforo para emitir luz visible, las lámparas HID no necesitan ningún recubrimiento en el interior de sus tubos. El propio arco eléctrico emite luz visible. Sin embargo, algunas lámparas de halogenuros metálicos y muchas lámparas de vapor de mercurio tienen un recubrimiento de fósforo en el interior de la bombilla para mejorar el espectro luminoso y reproducción cromática. Las lámparas HID están disponibles en varias potencias, que van desde los 25 vatios de las lámparas de halogenuros metálicos autobalastradas y los 35 vatios de las lámparas de vapor de sodio de alta intensidad hasta los 1.000 vatios de las lámparas de vapor de mercurio y vapor de sodio de alta intensidad, e incluso hasta los 1.500 vatios de las lámparas de halogenuros metálicos.
Las lámparas HID requieren un equipo de control especial llamado balasto para funcionar
Inteligencia Artificial y Ciberseguridad.pdfEmilio Casbas
Recopilación de los puntos más interesantes de diversas presentaciones, desde los visionarios conceptos de Alan Turing, pasando por la paradoja de Hans Moravec y la descripcion de Singularidad de Max Tegmark, hasta los innovadores avances de ChatGPT, y de cómo la IA está transformando la seguridad digital y protegiendo nuestras vidas.
En este documento analizamos ciertos conceptos relacionados con la ficha 1 y 2. Y concluimos, dando el porque es importante desarrollar nuestras habilidades de pensamiento.
Sara Sofia Bedoya Montezuma.
9-1.
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informáticavazquezgarciajesusma
En este proyecto de investigación nos adentraremos en el fascinante mundo de la intersección entre el arte y los medios de comunicación en el campo de la informática.
La rápida evolución de la tecnología ha llevado a una fusión cada vez más estrecha entre el arte y los medios digitales, generando nuevas formas de expresión y comunicación.
Continuando con el desarrollo de nuestro proyecto haremos uso del método inductivo porque organizamos nuestra investigación a la particular a lo general. El diseño metodológico del trabajo es no experimental y transversal ya que no existe manipulación deliberada de las variables ni de la situación, si no que se observa los fundamental y como se dan en su contestó natural para después analizarlos.
El diseño es transversal porque los datos se recolectan en un solo momento y su propósito es describir variables y analizar su interrelación, solo se desea saber la incidencia y el valor de uno o más variables, el diseño será descriptivo porque se requiere establecer relación entre dos o más de estás.
Mediante una encuesta recopilamos la información de este proyecto los alumnos tengan conocimiento de la evolución del arte y los medios de comunicación en la información y su importancia para la institución.
Actualmente, y debido al desarrollo tecnológico de campos como la informática y la electrónica, la mayoría de las bases de datos están en formato digital, siendo este un componente electrónico, por tanto se ha desarrollado y se ofrece un amplio rango de soluciones al problema del almacenamiento de datos.
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Telefónica
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0xWord escrito por Ibón Reinoso ( https://mypublicinbox.com/IBhone ) con Prólogo de Chema Alonso ( https://mypublicinbox.com/ChemaAlonso ). Puedes comprarlo aquí: https://0xword.com/es/libros/233-big-data-tecnologias-para-arquitecturas-data-centric.html
7. Test Drive Development
“No soy un gran programador. Sólo
soy un buen programador con
grandes hábitos”
―Kent Beck
Inventor de TDD
www.sgcampus.com.mx @sgcampus
8. Test Drive Development
TDD es una técnica de desarrollo que nació con
XP (eXtreme Programming)
Se hace diseño y codificación guiado por las
pruebas unitarias
Con TDD podemos lograr que el diseño “emerja”
del código
www.sgcampus.com.mx @sgcampus
9. Test Drive Development
Pero antes…
1. Has una lista de las posibles pruebas que se
harán al requerimiento
2. Comienza con las pruebas más sencillas
3. Aquellas que rodean el requerimiento
4. DETÉN el impulso de programar todas las
reglas de negocio en una sola vez
www.sgcampus.com.mx @sgcampus
10. Test Drive Development
Consta de 3 pasos:
1. Escribes una prueba que falla
2. Escribes el MÍNIMO código productivo que
hace que la prueba pase
3. Haces Refactor usando Clean Code
www.sgcampus.com.mx @sgcampus
11. Clean Code
“Sabes que estás trabajando con Código Limpio
cuando cada rutina que lees resulta ser
exactamente lo que esperabas de ella”
-Ward Cunningan
“Sabes que ves un Código Limpio cuando:
• Corren todas las pruebas
• No tiene código duplicado
• Expresa todas las ideas que tiene el sistema
• Minimiza el número de entidades como clases,
métodos, y funciones”
-Ron Jeffries
www.sgcampus.com.mx Fuente: libro “Clean Code” por Bob Martin
@sgcampus
13. Clean Code
Mapa Mental por
Gustavo García en
base a los videos de
cleancoders.com
www.sgcampus.com.mx @sgcampus
14. Clean Code
Nombres:
Los nombres deben reflejar su intención
Deben poder pronunciarse
Usar nombres de acuerdo a las reglas de negocio
Evitar encodings (prefijos, tipos de datos)
Algunas reglas de nombrado:
Clases = Sustantivos
Variables = Nombres
Métodos = Verbos
Booleanos = “is” o “has”
www.sgcampus.com.mx @sgcampus
15. Clean Code
Nombres
VS
www.sgcampus.com.mx Fuente: libro “Clean Code” por Bob Martin
@sgcampus
16. Clean Code
Funciones:
Deben de ser pequeñas
Y más pequeñas aún: 4 a 6 líneas
Una función larga puede tener algunas clases
escondidas
No pasar más de 2 argumentos
Extraer hasta no poder extraer más, así
aseguramos un nivel de abstracción
“FUNCTIONS SHOULD DO ONE THING. THEY
SHOULD DO IT WELL. THEY SHOULD DO IT ONLY”
www.sgcampus.com.mx Fuente: libro “Clean Code” por Bob Martin
@sgcampus
17. Clean Code
Formato:
Comentarios: El mejor comentario es el que no se
escribe
Tamaño de archivos: entre más pequeños, mejor
Formato Vertical: uniformidad en interlineado,
sangría, ciclos, etc.
Step Down Rule: Organizar métodos del más
abstracto al más específico.
El código debe entenderse en secuencia de arriba
hacia abajo
www.sgcampus.com.mx Fuente: libro “Clean Code” por Bob Martin
@sgcampus
19. ¿Qué es una Kata?
Una Kata es una manera de poner en práctica y
aprender de manera segura
En una Kata, el aprendizaje es más importante
que el resultado (es decir, no importa si el
programa “no jala” o se queda incompleto)
Por eso, las Katas se tienen que hacer más de
una vez
www.sgcampus.com.mx @sgcampus
20. Kata Factores Primos
Prime Factors
+ generate(n : int)
Escribe un clase llamada “PrimeFactors” que tiene
un método estático: generate
El método generate toma un argumento entero y
regresa una lista de enteros “List<Integer>” Esta
lista contiene los factores primos en secuencia
numérica.
www.sgcampus.com.mx @sgcampus
21. Junit
@Test
public void dadoUno_regresaVacio() throws Exception {
FactoresPrimos factorador = new FactoresPrimos();
List<Integer> factores = factorador.buscarFactoresPrimos(1);
assertEquals(0, factores.size());
Productivo
}
public class FactoresPrimos {
public List<Integer>buscarFactoresPrimos(int i) {
return null;
}
}
www.sgcampus.com.mx @sgcampus
22. Junit
@Test
public void dadoUno_regresaVacio() throws Exception {
FactoresPrimos factorador = new FactoresPrimos();
List<Integer> factores = factorador.buscarFactoresPrimos(1);
assertEquals(0, factores.size());
www.sgcampus.com.mx @sgcampus
}
Productivo
public class FactoresPrimos {
public List<Integer>buscarFactoresPrimos(int i) {
return new ArrayList<Integer>();
}
}
27. public List<Integer> buscarFactoresPrimos(int numero) {
ArrayList<Integer> listaDeFactores = new ArrayList<Integer>();
for (int primo = 2; primo <= numero; primo++) {
añadirPrimo(listaDeFactores, primo, numero);
}
return listaDeFactores;
www.sgcampus.com.mx @sgcampus
}
private void añadirPrimo(ArrayList<Integer> listaDeFactores, int primo, int numero) {
if (numero % primo == 0) {
listaDeFactores.add(primo);
}
}
Productivo
28. Junit
List<Integer> factores = factorador.buscarFactoresPrimos(4);
assertEquals(2, factores.size());
assertEquals(2, factores.get(0).intValue());
assertEquals(2, factores.get(1).intValue());
Productivo
@Test
public void dadoCuatro_regresaDosYDos() throws Exception {
}
public List<Integer> buscarFactoresPrimos(int numero) {
int aEvaluar = numero;
final ArrayList<Integer> listaDeFactores = new ArrayList<Integer>();
for (int primo = 2; primo <= aEvaluar;) {
if (numero % primo == 0) {
listaDeFactores.add(primo);
aEvaluar = aEvaluar / primo;
} else {
primo++;
}
}
return listaDeFactores;
www.sgcampus.com.mx @sgcampus
}
}
29. public class FactoresPrimos {
private static final int PRIMER_FACTOR_PRIMO = 2;
public List<Integer> buscarFactoresPrimos(final int numero) {
siguientesFatoresPrimos(listaDeFactores, PRIMER_FACTOR_PRIMO, numero);
return listaDeFactores;
}
private void siguientesFatoresPrimos(final ArrayList<Integer> listaDeFactores, final int primo,
final int numero) {
if (primo <= numero) {
evaluaFactorPrimo(listaDeFactores, primo, numero);
}
}
private void evaluaFactorPrimo(final ArrayList<Integer> listaDeFactores, final int primo, final
int numero) {
if (numero % primo == 0) {
listaDeFactores.add(primo);
siguientesFatoresPrimos(listaDeFactores, primo, numero /
www.sgcampus.com.mx @sgcampus
primo);
} else {
siguientesFatoresPrimos(listaDeFactores, primo + 1, numero);
}
}
}
Productivo
30. Productivo
public class FactoresPrimos {
private static final int PRIMER_FACTOR_PRIMO = 2;
public List<Integer> buscarFactoresPrimos(final int numero) {
siguientesFatoresPrimos(listaDeFactores, PRIMER_FACTOR_PRIMO, numero);
return listaDeFactores;
www.sgcampus.com.mx @sgcampus
}
private void siguientesFatoresPrimos(final ArrayList<Integer> listaDeFactores, final int primo, final
int numero) {
if (primo <= numero) {
evaluaFactorPrimo(listaDeFactores, primo, numero);
}
}
private void evaluaFactorPrimo(final ArrayList<Integer> listaDeFactores, final int primo, final int
numero) {
if (numero % primo == 0) {
listaDeFactores.add(primo);
siguientesFatoresPrimos(listaDeFactores, primo, numero / primo);
} else {
siguientesFatoresPrimos(listaDeFactores, primo + 1, numero);
}
}
}
31. Junit
private void assertFactoresPrimos(final int numeroAEvaluar, final int... valores) {
final List<Integer> factores = factorador.buscarFactoresPrimos(numeroAEvaluar);
assertEquals(valores.length, factores.size());
for (int i = 0; i < valores.length; i++) {
assertEquals(valores[i], factores.get(i).intValue());
}
www.sgcampus.com.mx @sgcampus
}
@Test
public void dadoUno_regresaVacio() throws Exception {
assertFactoresPrimos(1);
}
@Test
public void dadoDos_regresaListaConSoloDos() throws Exception {
assertFactoresPrimos(2, 2);
}
@Test
public void dadoTres_regresaListaConSoloTres() throws Exception {
assertFactoresPrimos(3, 3);
}
@Test
public void dadoCuatro_regresaDosYDos() throws Exception {
assertFactoresPrimos(4, 2, 2);
}
32. Junit
public void dadoCinco_regresaCinco() throws Exception {
Productivo
@Test
assertFactoresPrimos(5, 5);
}
Pasa
www.sgcampus.com.mx @sgcampus
33. Junit
private void assertFactoresPrimos(final int numeroAEvaluar, final int... valores)
private void assertNumeroGeneraFactoresPrimos(final int numeroAEvaluar,
final int... valores)
@Test
public void dadoUno_regresaVacio() throws Exception {
assertFactoresPrimos(1);
}
@Test
public void dadoDos_regresaListaConSoloDos() throws Exception {
assertFactoresPrimos(2, 2);
}
@Test
public void dadoTres_regresaListaConSoloTres() throws Exception {
assertFactoresPrimos(3, 3);
}
@Test
public void dadoCuatro_regresaDosYDos() throws Exception {
assertFactoresPrimos(4, 2, 2);
}
@Test
public void dadoCinco_regresaCinco() throws Exception {
assertFactoresPrimos(5, 5);
}
public void dadoNumero_regresaSusFacotresPrimos() throws Exception {
assertNumeroGeneraFactoresPrimos(1);
assertNumeroGeneraFactoresPrimos(2, 2);
assertNumeroGeneraFactoresPrimos(3, 3);
assertNumeroGeneraFactoresPrimos(4, 2, 2);
assertNumeroGeneraFactoresPrimos(5, 5);
www.sgcampus.com.mx @sgcampus
}
35. Conclusiones
Utilizando TDD y Clean Code tendremos los siguientes
beneficios:
Seguridad al modificar código (red de protección de
pruebas unitarias)
Código mantenible para poder arreglar bugs o
implementar nuevos features
Mejor trabajo en equipo (¡por fin nos entendemos!)
Clientes satisfechos
Estimaciones más certeras
Enfocarnos en cosas más interesantes: nuevos
frameworks, Clean Architecture, Patrones, Sistemas
resistentes a fallos, Escalabilidad…
www.sgcampus.com.mx Fuente: libro “Clean Code” por Bob Martin
@sgcampus
36. Clean Code
“Deja el código mejor de cómo lo encontraste”
www.sgcampus.com.mx @sgcampus
37. Bibliografía
Clean code: A Handbook of Agile Software Craftsmanship
www.sgcampus.com.mx Fuente: libro “Clean Code” por Bob Martin
@sgcampus
(Robert C. Martin)
Test Driven Development: By Example (Kent Beck)
Refactoring: Improving the Design of Existing Code (Martin
Fowler)
Working Effectively with Legacy Code (Michael Feathers)
The Clean Coder: A Code of Conduct for Professional
Programmers (Robert C. Martin)
The Coding Dojo Handbook (Emily Bache)
CleanCoders.com