mobile menu icon

Using code smells to refactor to more OO code (an example with temporary field, solution sprawl and feature envy)

14/03/2024

Introduction. During our deliberate practice program[1], we were working on a modified version of the CoffeeMachine kata[2]. After some sessions we had implemented the following functionality documented by the tests: Tests describing the behaviour of the coffee machine. which was implemented by the following code in the CoffeeMachine class: and...

"Split or condition in if" refactoring in TypeScript

30/12/2022

In a previous post we documented the Split or condition in if refactoring. This refactoring works fine for most languages. Unfortunately, it may occasionally present some problems in TypeScript because of how its compiler works. After applying the Split or condition in if refactoring, the resulting code will contain duplication,...

Caring Work and where to find it: concerns mechanism

30/11/2022

Caring work. In our previous post about caring work we described how the concept of caring work[1] had been very useful for us in the coaching work we did with several teams during all of 2019 and a big part of 2020. We used the concept of caring work to...

On code smells catalogues and taxonomies

05/11/2022

This post is an English translation of the original post: De taxonomías y catálogos de code smells. Index. Introduction: code smells and refactoring. Martin Fowler: code smells and catalogues. Taxonomies. Wake’s taxonomy 2003. Mäntylä et al taxonomy 2003. Mäntylä et al taxonomy 2006. Jerzyk et al taxonomy 2022. Jerzyk’s extended...

Eliminando código comentado

18/10/2022

Dead Code es un smell clasificado dentro de la taxonomía de Wake[1] en la categoría de Complejidad Innecesaria. Normalmente, suele aparecer en forma de variables, parámetros, campos, fragmentos de código, funciones o clases que no se ejecutan más. El problema es que la mayoría de las veces no estamos seguros...

"Split or condition in if" refactoring

08/10/2022

We’d like to document a refactoring that we usually teach to teams we work with: the Split or condition in if refactoring. Split or condition in if. Motivation. Sometimes we have nested conditionals that are branching depending on the same information. When an outer if condition contains an or which...

Simplifying jest stubs using jest-when

29/09/2022

In a recent deliberate practice session with some developers from Audiense (with whom we’re doing the Codesai’s Practice Program twice a month), we were solving the Unusual Spending Kata in JavaScript. While test-driving the UnusualSpendingDetector class we found that writing stubs using plain jest can be a bit hard. The...

De taxonomías y catálogos de code smells

15/09/2022

Índice. Introducción: refactoring y code smells. Martin Fowler, Code Smells y Catálogos. Taxonomías Taxonomías de Wake 2003 Taxonomía de Mäntylä et al 2003 Taxonomía de Mäntylä et al 2006 Taxonomía de Jerzyk et al 2022 Catálogo de Code Smells Catálogo online. Conclusiones. Agradecimientos. Referencias. Introducción: refactoring y code smells. Refactorizar...

Un caso de Shotgun Surgery

12/09/2022

Colaboramos con un cliente en cuyo producto, el SEO es un aspecto muy importante del negocio. En general, el SEO suele ser un aspecto a cuidar, pero en el caso de este cliente el SEO supone una fuente de ingresos considerable. Cuando los buscadores analizan las páginas de un producto...

Example of role tests in JavaScript with Jest

04/08/2022

In this post we’ll show our last example applying the concept of role tests, this time in JavaScript using Jest. Have a look at our previous posts on this topic. This example comes from a deliberate practice session we did recently with some developers from Audiense with whom we’re doing...

Example of role tests in Java with Junit

02/08/2022

I’d like to continue with the topic of role tests that we wrote about in a previous post, by showing an example of how it can be applied in Java to reduce duplication in your tests. This example comes from a deliberate practice session I did recently with some people...

Simple example of property-based testing

20/06/2022

Introduction. We were recently writing tests to characterise a legacy code at a client that was being used to encrypt and decrypt UUIDs using a cipher algorithm. We have simplified the client’s code to remove some distracting details and try to highlight the key ideas we’d like to transmit. In...

Listening to test smells: detecting lack of cohesion and violations of encapsulation

04/05/2022

Introduction. We’d like to show another example of how difficulties found while testing can signal design problems in our code[1]. We believe that a good design is one that supports the evolution of a code base at a sustainable pace and that testability is a requirement for evolvability. This is...

Role tests for implementation of interfaces discovered through TDD

03/04/2022

Introduction. Working through the first three iterations of a workshop’s exercise, we produced several application services that at some point collaborated with a users repository that we hadn’t yet created so we used a test double in its place in their tests. These are the tests: In these tests, every...

Restringiendo interfaces II: Modelando apariencias

19/02/2022

Volvemos con la segunda parte de Restringiendo Interfaces. En esta ocasión hablaremos de cómo heredar modelos existentes puede adulterar su diseño, provocando la ilusión de que es la forma más fiel de modelar el dominio del problema. En este post veremos que, para implementar diseños más fieles al problema, debemos...

Notes on LSP from Agile Principles, Practices and Patterns book

14/02/2022

I continue sharing my notes on SOLID to prepare the ground for the upcoming The Big Branch Theory Podcast episode about Liskov Substitution Principle. Ok, so these are the raw notes I took while reading the chapter devoted to Liskov Substitution Principle (LSP) in Robert C. Martin’s Agile Principles, Practices...

Mutando para simplificar

11/02/2022

Una de las herramientas que mencionamos en nuestro curso de TDD es mutation testing[1]. Para quien no esté familiarizado, es una herramienta que, en líneas generales, lanza nuestra batería de tests haciendo modificaciones (mutaciones) del código de producción que introducen defectos. Si un test falla, significa que nuestros tests protegen...

Restringiendo interfaces

31/01/2022

Una heurística que empleo para diseñar software, y considero fundamental a la hora de crear interfaces o APIs claras y orientadas al negocio, es restringir con tipos los errores que podemos introducir en nuestro diseño al consumir estas APIs dentro de nuestro propio sistema o al ofrecerlas como parte de...

Huyendo de las ramas

25/01/2022

El pasado mes de diciembre, mi compañero Alfredo y yo tuvimos el placer de compartir un par de horas con el equipo de Declarando para hablar sobre feature branching, continuous integration, continuous delivery y algunas técnicas como feature flags y cambio en paralelo. Hace unos años dimos una charla parecida...

Entrevistas para la Agile Alliance

10/02/2021

Hace unos meses, nuestros compañeros de Codesai, Toño de la Torre y Miguel Viera participaron en una serie de entrevistas para la Agile Alliance de mano de Juan Banda, quién en una iniciativa por llevar más representación de la opinión técnica al mundo Agile, contactó con ellos para hablar de...

Recapitulando nuestra experiencia con Connectsai

04/02/2021

Este post viene a solucionar una de las espinas clavadas que quedaban en nuestro backlog de publicaciones pendientes. Y esto es contaros nuestra experiencia con el Open Space remoto Connectsai. Hace unos meses (el sábado 17 de octubre) montamos conjuntamente con Lifull Connect el que sería nuestro primer evento de...

Notes on OCP from Agile Principles, Practices and Patterns book

29/01/2021

Some time ago I wrote a post sharing my notes on SRP from Agile Principles, Practices and Patterns book because I was making an effort to get closer to the sources of some object-oriented concepts. I didn’t continue sharing my notes on SOLID because I thought they might not be...

Solving the Beverages Prices Refactoring kata (2): limiting the options on the menu

20/01/2021

Introduction. This is the second and last post in a series of posts showing a possible solution to the Beverages Prices Refactoring kata that I recently developed with some people from Women Tech Makers Barcelona with whom I’m working through Codesai’s Practice Program twice a month. In the previous post...

Testeando una integración con SNS

07/12/2020

En un post anterior hablamos sobre cómo desarrollamos y testeamos una integración con S3 en uno de nuestros clientes. En esta segunda parte queríamos contar cómo ha sido nuestra experiencia con otro servicio de AWS: SNS. ¿Para qué usamos SNS? Amazon SNS (Simple Notification Service) es un servicio de mensajería...

Solving the Beverages Prices Refactoring kata (1): composition over inheritance

30/11/2020

Introduction. We are going to show a possible solution to the Beverages Prices Refactoring kata that we developed recently with some people from Women Tech Makers Barcelona with whom I’m doing Codesai’s Practice Program twice a month. The Beverages Prices Refactoring kata shows an example of inheritance gone astray. The...

Testeando una integración con S3

28/10/2020

En uno de nuestros clientes actuales estamos ayudando en el desarrollo de un nuevo sistema que utiliza servicios de Amazon Web Services. Nos gustaría contarles el enfoque de testing que hemos seguido al integrarnos con S3, combinando tests locales contra imágenes Docker con tests en producción que se ejecutan periódicamente....

Sleeping is not the best option

17/10/2020

Introduction. Some time ago we were developing a code that stored some data with a given TTL. We wanted to check not only that the data was stored correctly but also that it expired after the given TTL. This is an example of testing asynchronous code. When testing asynchronous code...

The value of caring

11/06/2020

Introduction We’d like to tell you about a narrative that has been very useful for us in the coaching work we have been doing with several teams during the last year. Origin It all started during a consultancy work that Joan Valduvieco and I did at the beginning of 2019...

SPIDR, criterios para dividir historias de usuario

10/05/2020

Las historias de usuarios son una gran herramienta para entender lo que se quiere hacer, por qué y para quién. Ron Jeffries en el libro Extreme Programming Installed, describe los tres aspectos críticos de las historias de usuario como Card, Conversation, Confirmation, dónde la tarjeta (Card) simplemente recoge el texto...

¡Habemus podcast!

08/05/2020

Haciendo caso omiso de todas las recomendaciones sanitarias para este confinamiento hemos decidido, como podréis adivinar por el título, ¡crear un podcast! La realidad es que ya llevábamos tiempo con ganas de hacerlo y estas últimas fechas no han sido más que la excusa perfecta para encontrar el tiempo que...

¡Bienvenido a Codesai, Rubén!

17/04/2020

Contamos hoy con una buena noticia, bien recibida dada la situación actual, y es que a partir de ahora somos uno más en Codesai! Queríamos escribir un pequeño post dándole la bienvenida a Rubén, presentándole un poquito desde mi perspectiva y luego la suya. En su día, junto con Rubén...

El valor de escribir el test primero

16/02/2020

Toda persona que haya investigado un poco el Test Driven Development estará familiarizada con los 3 pasos que implica: Red, escribir primero un test que falla Green, escribir el código de producción para pasar el test Refactor, evaluar una posible mejora en la implementación Y repetimos indefinidamente hasta obtener funcionalidades...

Me vuelvo a Subversion!

28/12/2019

Estaba el otro día viendo la charla Continuous delivery and the theory of constraints de Steve Smith, que de paso os recomiendo, y en un momento de la charla el autor relatando una experiencia pasada en un equipo que usaba subversion en lugar de git u otro DVCS, decía algo...

Funny Docker Workshop to learn from scratch

17/12/2019

Introduction In one of our current clients we are taking some learning time for new things outside of our current context/stack. One of the proposals of the team was a Docker workshop because I introduced it for our CI and our local testing environments to avoid connecting to production from...

Playing Fizzbuzz with property-based testing

29/07/2019

Introduction. Lately, I’ve been playing a bit with property-based testing. I practised doing the FizzBuzz kata in Clojure and used the following constraints for fun[1]: Add one property at a time before writing the code to make the property hold. Make the failing test pass before writing a new property....

La kata Gilded Rose en PL/SQL: escribiendo los tests

07/07/2019

Contexto. En uno de nuestros actuales clientes, Mutua Tinerfeña, estamos trabajando diferentes técnicas para construir software de manera progresiva y confiable. Aunque el equipo es pequeño, sus miembros usan y conocen tecnologías muy diferentes, por lo que necesitábamos practicar dichas técnicas usando como vehículo un lenguaje que dominaran todos los...

An example of listening to the tests to improve a design

29/06/2019

Introduction. Recently in the B2B team at LIFULL Connect, we improved the validation of the clicks our API receive using a service that detects whether the clicks were made by a bot or a human being. So we used TDD to add this new validation to the previously existing validation...

The curious case of the negative builder

24/05/2019

Introduction. Recently, one of the teams I’m coaching at my current client, asked me to help them with a problem, they were experiencing while using TDD to add and validate new mandatory query string parameters[1]. This is a shortened version (validating fewer parameters than the original code) of the tests...

CAS 2018: Una vida descubriendo Agile

23/05/2019

Todos los derechos reservados por conferenciaagilespain “Una vida descubriendo Agile” es el título de la charla que di en la pasada CAS2018 en Alicante. El vídeo ya está disponible desde hace tiempo (gracias Autentia!), y desde que salió, tenía ganas de hacer este post de “cómo se hizo”. ¿Cómo surgió...

Killing mutants to improve your tests

14/05/2019

At my current client we’re working on having a frontend architecture for writing SPAs in JavaScript similar to re-frame’s one: an event-driven bus with effects and coeffects for state management[1] (commands) and subscriptions using reselect’s selectors (queries). One of the pieces we have developed to achieved that goal is reffects-store....

The Beverages Prices Refactoring kata: a kata to practice refactoring away from an awful application of inheritance.

07/04/2019

I created the Beverages Prices Refactoring kata for the Deliberate Practice Program I’m running at Lifull Connect offices in Barcelona (previously Trovit). Its goal is to practice refactoring away from a bad usage of inheritance. The code computes the price of the different beverages that are sold in a coffee...

Our experience at ClojureBridge Bilbao 2018

23/03/2019

ClojureBridge is an all-volunteer organization inspired by RailsBridge that provides free, introductory workshops to increase diversity in the Clojure community. I first learned about ClojureBridge thanks to a talk by Ali King at EuroClojure 2015 in Barcelona: ClojureBridge, Building a more diverse Clojure community. I really liked the idea and...

Charla Pyday Tenerife

31/01/2019

El pasado 17 de Noviembre tuvo lugar el PyDay Tenerife, un evento que reune a muchos amantes de este lenguaje. Pero no sólo se habla del lenguaje. El evento deja bastante espacio para otras cosas relacionadas con el lenguaje, lo que hace que la diversidad de temas sea amplia y...

Avoid using subscriptions only as app-state getters

03/01/2019

Introduction. Subscriptions in re-frame or re-om are query functions that extract data from the app-state and provide it to view functions in the right format. When we use subscriptions well, they provide a lot of value[1], because they avoid having to keep derived state the app-state and they dumb down...

Eventos como la Software Crafters Barcelona 2018

05/11/2018

El sábado 15 de Septiembre por la noche aterrizaba en Madrid después de haber pasado más de un año viviendo fuera, muy lejos allá en tierras niponas. Y no era sino dos semanas más tarde que iba a asistir a la Software Crafters Barcelona, pues había conseguido pillarme de antemano...

Giving new life to existing Om legacy SPAs with re-om

02/10/2018

Introduction. We’re pleased to announce that our client GreenPowerMonitor has allowed us to open-source re-om, an event-driven functional framework which is giving new life to an existing legacy SPA that uses Om. Why re-om? 1. The problem with our SPA: imperative programming everywhere. We are working on a legacy ClojureScript...

Cursos en abierto en Canarias

04/09/2018

En la primera mitad de este año no habíamos podido hacer ningún curso de TDD en abierto. Nos absorbió el trabajo diario, la agenda de eventos en los que participamos, y todas las reuniones, decisiones y papeleos que tuvimos para lanzar nuestra cooperativa. Era una pena porque nos encanta hacer...

Gradiant, mi primer Curso de TDD

20/08/2018

A principios del pasado Junio volvimos a las oficinas de Gradiant en Vigo para impartir nuestro Curso de TDD. Gradiant es el acrónimo en inglés del Centro Tecnolóxico de Telecomunicacións de Galicia (Galician Research and Development Center in Advanced Telecommunications). Este centro aplica los conocimientos y experiencia de sus profesionales...

Data clumps, primitive obsession and hidden tuples

15/08/2018

During the writing of one of our posts about connascence some of us were discussing whether we could consider a data clump a form of Connascence of Meaning (CoM) or not. In the end, we agreed that data clumps are indeed a form of CoM and that introducing a class...

Improving legacy Om code (II): Using effects and coeffects to isolate effectful code from pure code

21/07/2018

Introduction. In a previous post, we applied the humble object pattern idea to avoid having to write end-to-end tests for the interesting logic of a hard to test legacy Om code, and managed to write cheaper unit tests instead. Then, we saw how those unit tests were far from ideal...

Somos cooperativa

17/07/2018

Estamos muy contentos de anunciar que, tras varios meses de papeleos, por fín, somos una cooperativa. Era un paso que decidimos tomar en nuestro último Flejesai* en Febrero, y que nos parecía muy natural dada la manera en que ya intentábamos funcionar. Desde el principio, en Codesai hemos intentado funcionar...

Improving legacy Om code (I): Adding a test harness

07/07/2018

Introduction. I’m working at GreenPowerMonitor as part of a team developing a challenging SPA to monitor and manage renewable energy portfolios using ClojureScript. It’s a two years old Om application which contains a lot of legacy code. When I say legacy, I’m using Michael Feathers’ definition of legacy code as...

Back at Merkle in 2018

26/06/2018

In the last quarter of 2017 we delivered several TDD trainings at Merkle’s offices in Barcelona and did several consulting session with their JavaScript and Java teams. Merkle is a company with high quality standards for the software they develop, so we were very happy when they contacted us to...

Socrates Canaries 2018

14/06/2018

This year, I had the pleasure to attend my second Socracan, an unconference organised in the Canary Islands that brings together people from the Craft Community. This conference had been organised in the past by the Software Crafters community in Canary Islands and most of the great groundwork done by...

Improve your reds

08/06/2018

Improving your reds is a simple tip that is described by Steve Freeman and Nat Pryce in their wonderful book Growing Object-Oriented Software, Guided by Tests. It consists in a small variation to the TDD cycle in which you watch the error message of your failing test and ask yourself...

A small spying and stubbing library for Clojure and ClojureScript: test-doubles

21/04/2018

As you may know from a previous post I’m working for GreenPowerMonitor as part of a team that is developing a challenging SPA to monitor and manage renewable energy portfolios using ClojureScript. We were dealing with some legacy code that was effectful and needed to be tested using test doubles,...

A small kata to explore and play with property-based testing

11/04/2018

1. Introduction. I’ve been reading Fred Hebert’s wonderful PropEr Testing online book about property-based testing. So to play with it a bit, I did a small exercise. This is its description: 1. 1. The kata. We’ll implement a function that can tell if two sequences are equal regardless of the...

Examples lists in TDD

20/03/2018

1. Introduction. During coding dojos and some mentoring sessions I’ve noticed that most people just start test-driving code without having thought a bit about the problem first. Unfortunately, writing a list of examples before starting to do TDD is a practice that is most of the times neglected. Writing a...

Muchas gracias Luis

12/03/2018

Luis lleva tiempo centrado en su nueva aventura, Codium, a la vez que colabora con nosotros puntualmente como anteriormente había hecho. Debido a la vorágine del presente, aún no habíamos podido sentarnos a contarlo. Con este post nos gustaría hacerle un pequeño homenaje a Luis y agradecerle todo lo que...

Kata: Generating bingo cards with clojure.spec, clojure/test.check, RDD and TDD

12/03/2018

Clojure Developers Barcelona has been running for several years now. Since we’re not many yet, we usually do mob programming sessions as part of what we call “sagas”. For each saga, we choose an exercise or kata and solve it during the first one or two sessions. After that, we...

Muchas gracias Carlos

01/03/2018

Queríamos anunciaros que Carlos deja Codesai para emprender un nuevo proyecto personal. Un gran compañero se va y queremos agradecerle toda lo que ha hecho por el equipo. Ha sido fundamental para que Codesai llegase a ser lo que es hoy. Han sido unos años muy intensos y fructíferos en...

Charla Valores y principios en el diseño del software en CAS17

29/12/2017

Tras la charla que dimos Alfredo y yo en el AOS en Santiago de compostela de 2016 y el trabajo que hemos hecho en Codesai (en [1], [2] y [3]), especialmente Manuel Rivero, sobre el concepto de Connascence, me apetecía explorar otra perspectiva sobre los elementos del diseño del software...

Estuvimos en Cetelem

26/12/2017

Hace unos meses Luis y yo hicimos un curso de TDD en Cetelem. Para mi fue una gran experiencia porque los asistentes estaban muy motivados. Este fue el primer curso que hacía con Luis, y me gustó muchísimo trabajar con él. Me encantó el ritmo que Luis le da al...

Charla Discusiones y decisiones: herramientas para la efectividad en CAS17

22/12/2017

Hace un mes más o menos tuve el placer de dar una charla titulada “Discusiones y decisiones: herramientas para la efectividad” en la CAS (Conferencia Agile Spain) de este año 2017 que tuvo lugar en Sevilla. La charla trataba de cómo conseguir que las múltiples reuniones que seguramente tienes al...

Tercer curso abierto de TDD del año en Barcelona

15/12/2017

En vista del éxito que habían tenido los dos cursos abiertos de TDD que habíamos hecho este año en Barcelona, nos decidimos a hacer un nuevo curso abierto en Noviembre. Los cursos en abierto me hacen especial ilusión porque fue en uno de estos cursos abiertos dado por Carlos Blé...

We were at Lambda World 2017

04/12/2017

This last 26th and 27th of October I was a proud assistant of the Lambda World. I gathered with some colleagues from Codesai (Manuel Rivero and Antonio de la Torre) and with some friends. It was also my first time on the event so I was kinda hyped. My main...

We were at Merkle

02/12/2017

Last October Luis Rovirosa, Jordi Anguela and I had the pleasure to give three TDD trainings at Merkle’s impressive offices in Barcelona. Merkle is a consulting company distributed worldwide which is very committed to deliver not only value but also high quality software to their clients. We worked with three...

Native/Browser SPA versions using ClojureScript and re-frame talk at SCBCN17

17/11/2017

Last month I had the pleasure of giving a talk at the Software Craftsmanship Barcelona 2017 conference about what my colleague Francesc and I have been learning lately while working on the mobile and browser versions of a SPA using ClojureScript and re-frame. I talked mainly about how re-frame’s effects...

Software Craftsmanship Barcelona 2017

08/11/2017

Four weekends ago, a few colleagues from Codesai and I attended the Software Craftsmanship Barcelona 2017 conference. While some of them had already come in previous years, I was a first timer and my expectations were very high. I have heard very positive comments from attendees to previous editions. For...

Flejesai 2017 Edición de Otoño

20/10/2017

Qué es, dónde y por qué Hace dos semanas organizamos el Flejesai, edición Otoño 2017. Desde que se fundó Codesai el año pasado nos reunimos cada seis meses para vernos, charlar de temas importantes que se hablan mejor en persona y sobre todo fortalecer los lazos que en una empresa...

In a small piece of code

22/08/2017

In a previous post we talked about positional parameters and how they can suffer from Connascence of Position, (CoP). Then we saw how, in some cases, we might introduce named parameters to remove the CoP and transform it into Connascence of Name, (CoN), but always being careful to not hiding...

Notes on SRP from Agile Principles, Practices and Patterns book

17/08/2017

I think that if you rely only on talks, community events, tweets and posts to learn about a concept, you can sometimes end up with diluted (or even completely wrong) versions of the concept due to broken telephone game effects. For this reason, I think it’s very useful to try...

Comentarios en el código

03/08/2017

¿Comentamos el código? ¿si o no? Esa pregunta totalmente desprovista de contexto no puede tener una respuesta con la que esté de acuerdo todo el mundo. Sin más contexto, la discusión es inútil. La pregunta realmente es, ¿cuándo documentar el código?. El objetivo de los comentarios NO es explicar lo...

Two examples of Connascence of Position

31/07/2017

A first example. As we saw in our previous post about connascence, Connascence of Position (CoP) happens when multiple components must be adjacent or appear in a particular order. CoP is the strongest form of static connascence, as shown in the following figure. Connascence forms sorted by descending strength (from...

Aterrizando en un proyecto con legado

24/07/2017

El equipo aterriza en nuevo proyecto para evolucionar un producto que lleva 5 años en producción, con un código legado que apenas tiene tests y donde no hay desarrolladores que lo conozcan a fondo. ¿Cómo nos organizamos para aportar el máximo valor? El contexto hace que unos principios tengan más...

Segundo curso abierto de TDD del año en Barcelona

26/06/2017

El mes pasado Luis y yo hicimos un curso abierto de TDD en Barcelona. Fue una edición muy interesante en la que probamos algunos cambios en el contenido del curso, y en la que participaron algunos conocidos de la comunidad de Barcelona. En las últimas ediciones del curso, nos habíamos...

Testing Om components with cljs-react-test

23/06/2017

I’m working for Green Power Monitor which is a company based in Barcelona specialized in monitoring renewable energy power plants and with clients all over the world. We’re developing a new application to monitor and manage renewable energy portfolios. I’m part of the front-end team. We’re working on a challenging...

¿Null, vacío o exception?

11/06/2017

Siempre que imparto una formación aprendo de los participantes. Cuando surgen dudas y debates en el grupo, se abre un espacio ideal para el aprendizaje. Los últimos dos días hemos tenido la suerte de estar con el equipo de Zooplus en Madrid practicando TDD y hablando mucho de diseño de...

Testing tricks for react-redux

08/06/2017

We are using enzyme and jsdom to write both, integration and unit tests for react-redux apps. Although enzyme’s shallow is very convenient totest components in isolation, the truth is that often those components have children that need to be rendered in order for the parent to do something meaningful so...

Eventazo Startupero en Zaragoza, ahí estuvimos.

25/05/2017

Con un poco de retraso llega este post-celebración del paso de Codesai por el SOSZ en Zaragoza. Yo, personalmente, nunca había tenido la oportunidad de acudir al SOSZ y este año lo tenía marcado con un corazón en el calendario. Me llamaba la atención por varias razones: no era en...

Dácil Casanova se une a Codesai

18/05/2017

A pesar de que se constituye en 2015, Codesai es para mí una vieja conocida. He atendido expectante a su gestación en estos trece años que hace que conozco a Carlos Blé. Existen muchas historias antes de su nacimiento, muchas pruebas, muchos sueños y muchas ganas de hacer las cosas...

Manuel J. Tordesillas joins Codesai

13/04/2017

It has already been two months since I had the opportunity to become a member of Codesai and I cannot express with words how happy and grateful I am after joining this incredible group. I have always considered myself as an optimist and nonconformist person, continuously looking ahead and being...

Estuvimos en Velneo (VisualMS)

12/04/2017

El pasado 7 y 8 de marzo de 2017 estuvimos Manuel Rivero y yo, impartiendo un curso de JavaScript para la empresa Velneo, en sus oficinas de Gijón. Estuvimos 10 personas tanto de Velneo, como de otras empresas del grupo. Este post no sería más que una nota de nuestro...

Estuvimos en Women Tech Makers Madrid

10/04/2017

El equipo de Codesai asistió el pasado 11 de Marzo al Women Tech Makers (WTM) Madrid 2017. Women Techmakers es una iniciativa liderada por Google, que se está expandiendo a un programa a nivel mundial. Con motivo del Día Internacional de la Mujer, se promueven diferentes eventos alrededor del mundo...

Types of actions in a Redux App

05/04/2017

In the previous post there was a bunch of tests but not the code that make them pass. In the way we’re building apps with Redux, there are different kinds of actions and creators injected in the components. We usually talk just about actions without distinction. These are the various...

Testing strategies in Redux

05/04/2017

In the previous post I explained how to test-drive a Redux app from the outside-in with an example of a coarse-grained test integrating most of the frontend layers. That was just one case but there are more cases, more kind of tests. These are the common things I like to...

Test-driving a Redux App

05/04/2017

I like starting every new feature with a failing coarse-grained test that exercises most of the layers I’ll have to cross in order to get the feature done. During that cycle I may write smaller tests to get faster feedback. Pretty much anytime I feel the need to debug my...

Dependency Injection in Redux

05/04/2017

Redux provides a function called connect that binds the component to the store. This is the place where state and actions are map to component properties and also where the component subscribes to changes in the store. Well, the subscription happens as long as React’s Provider is in place: We...

Getting started with React & Redux

03/04/2017

I started learning React and Redux about two months ago. Following the recommendation of my colleagues Dani, Miguel & Ronny, I went to Pluralsight to study from the great training courses carefully crafted by Cory House. We first watched the introduction to React and Flux. I did not practice with...

Estuvimos en Biosystems

26/03/2017

Hace algunas semanas estuve impartiendo el curso de TDD de Codesai en las oficinas de Biosystems en Barcelona. Se trata de una empresa que lleva más de 30 años investigando, desarrollando y fabricando sistemas analíticos de diagnóstico clínico y agroalimentario para laboratorios de todo el mundo. Les visité en época...

Estuvimos en DeveloperOS Madrid 2017

14/02/2017

Para comenzar 2017 con buen pie varios miembros de Codesai estuvimos en el DeveloperOS, un Open Space centrado en tecnologías .Net que organizó la comunidad .Net de Madrid el pasado 28 de Enero y del que fuimos uno de los patrocinadores. Aunque era la primera edición de este evento las...

Charla sobre sequence comprehensions en Clojure

10/02/2017

Ayer grabamos nuestro tercera charla remota sobre Clojure como parte de las actividades que hacemos en nuestro pequeño grupo de estudio de Clojure/ClojureScript. El tema de esta charla fue las sequence comprehensions usando for. Aquí les comparto la grabación de la charla: y aquí pueden encontrar los ejemplos que usamos....

Estuvimos en Test Academy

01/02/2017

El pasado 25 de Enero tuve la suerte de formar parte de Test Academy en Barcelona, dirigiendo y facilitando una conversación sobre Behavior-driven development (BDD). El objetivo de Test Academy es reunir a profesionales y expertos de la comunidad de testing y desarrollo de software durante un día para aprender,...

Impartimos un curso abierto de TDD en Barcelona

31/01/2017

La semana pasada Carlos y yo impartimos un curso de TDD en Barcelona en formato abierto. Los cursos en abierto son siempre muy gratificantes porque los asistentes vienen con muchísimas ganas de trabajar y de aprender. De hecho, varios de ellos pagaron el curso de su propio bolsillo e incluso...

About Connascence

20/01/2017

Lately at Codesai we’ve been studying and applying the concept of connascence in our code and even have done an introductory talk about it. We’d like this post to be the first of a series of posts about connascence. 1. Origin. The concept of connascence is not new at all....

Podemos ser tu equipo

18/01/2017

Todo el mundo está a la búsqueda de desarrolladores, todos al grito de “we’re hiring!”. Quizás estemos viviendo otra gran burbuja del sector TIC. A las empresas les está costando encontrar y retener talento. Sobre todo, les está costando ensamblar equipos. El desarrollo de software es un deporte de equipo....

Charla sobre distinguir entre problema y solución en la CAS2016

13/01/2017

En la pasada CAS 2016 di un charla sobre aprender a distinguir entre el problema y solución. Esta distinción es importante porque uno de los motivos por los que más se desperdicia código, tiempo y dinero, es que confundimos la solución con el problema. No entendemos bien el problema del...

Charla sobre el camino del aprendizaje en la CAS2016

05/01/2017

En una profesión como la nuestra en la que cada mes tenemos nuevas tecnologías, metodologías, prácticas… sería un grave error caer en el conformismo o pensar que hemos llegado a la cima de nuestro aprendizaje. Tal y como plantea el libro Apprenticeship Patterns, el camino del aprendizaje es infinito. Como...

Charla sobre funciones en Clojure

04/01/2017

Hace unas semanas hicimos nuestro segunda charla remota sobre Clojure como parte de las actividades que hacemos en nuestro pequeño grupo de estudio de Clojure/ClojureScript. Esta vez profundizamos en las diferentes maneras de definir funciones. Aquí les comparto la grabación de la charla: y aquí pueden encontrar los ejemplos que...

Charla sobre Comunidades de Necesidad vs Comunidades de Soluciones en la CAS2016

03/01/2017

El pasado 30 de noviembre cogí un avión a las 7 de la mañana para ir a Vitoria. Pocas veces me costó tan poco madrugar porque sabía que me esperaba un evento delicioso. Las expectativas eran altas sabiendo que detrás estaban los de Agile Norte. Y se cumplieron. Agradezco enormemente...

ES6 en React y resolviendo el binding del this

02/01/2017

Estás últimas semanas he estado aprendiendo React para un pet project que estoy haciendo con mis compañeros Ronny y Modesto. Tiramos lo que teníamos de nuestra interfaz hecha con Polymer (que no era mucho tampoco) puesto que nos veíamos incapaces de avanzar de una forma constante ya que nos encontrábamos...

An example of introducing symmetry to enable duplication removal

02/01/2017

Symmetry is a subtle concept that may seem only related to code aesthetics. However, as Kent Beck states in Implementation Patterns, "...finding and expressing symmetry is a preliminary step to removing duplication. If a similar thought exists in several places in the code, making them symmetrical to each other is...

Estuvimos en Gradiant

27/12/2016

La semana pasada Luis Rovirosa y yo impartimos una formación de TDD en las oficinas de Gradiant en Vigo. Gradiant es el acrónimo en inglés del Centro Tecnolóxico de Telecomunicacións de Galicia (Galician Research and Development Center in Advanced Telecomunications) y utilizan los conocimientos y experiencia de sus profesionales de...

Charla sobre connascence en SCBCN 2016

22/12/2016

El pasado Octubre Fran y yo preparamos una charla para la Software Craftsmanship Barcelona 2016 explicando el concepto de connascence. Podemos entender connascence como la relación entre N componentes de software que implica que cuando se cambia uno de esos N componentes los N-1 componentes restantes se tienen que cambiar...

Charla sobre destructuring en Clojure

15/12/2016

Recientemente me uní a Codesai , y como muchos saben por mi blog personal estoy encantado con Clojure. Como algunos miembros de Codesai querían aprender Clojure/ClojureScript, decidimos empezar un pequeño grupo de estudio en remoto (Codesai es un equipo distribuido) contando conmigo como mentor. Para ello creamos un slack, clojuresai,...

Estuvimos en Ve Interactive

09/12/2016

Hace unas semanas Luis Rovirosa y yo impartimos una formación de TDD en las oficinas de Ve Interactive en Bilbao. Luis lleva bastante tiempo impartiendo el curso de TDD de Codesai, tanto en solitario como junto con Carlos Blé, pero para mi era la privera vez. Me gustó mucho la...

Inolvidable CAS2016 Vitoria-Gasteiz

08/12/2016

Nada más terminar CAS2015 teníamos muy claro que queríamos estar en CAS2016, entre otras cosas por el cariño que tenemos a los organizadores, nuestros buenos amigos del norte, que yo considero referentes en muchos aspectos. Teníamos las expectativas muy altas con respecto a la organización y no solo las han...

Así viví Codemotion 2016

19/11/2016

Para mí el primer Codemotion y ha sido impactante, un eventazo de lo mejor. No me explico cómo es que no había estado antes. Me lo he pasado bomba, he aprendido mucho, me he encontrado con muchísimos amigos, desvirtualizado a mucha gente y me he sentido en un ambiente acogedor...

Using effects in re-frame

10/11/2016

In re-frame, we’d like to use pure event handlers because they provide some important advantages, (mentioned in a previous post about coeffects in re-frame): local reasoning, easier testing, and events replay-ability. However, as we said, to build a program that does anything useful, it’s inevitable to have some side-effects and/or...

Segundo Flejesai de 2016

04/11/2016

En Codesai somos un equipo distribuido. Actualmente trabajamos desde Gran Canaria, Tenerife, Barcelona, Madrid y Oviedo. Hacemos pair programming remoto, mob programming y videoconferencias semanales pero aún es muy importante reunirnos fisicamente un par de veces al año. La primera reunión fue en Las Palmas en Marzo de 2016. Nos...

Damos la bienvenida a Manuel Rivero

02/11/2016

Menudo notición! Manuel Rivero se une al equipo Codesai! Fue algo antes de Software Craftsmanship Barcelona 2016 cuando Manuel me escribió expresando su intención de venir. La verdad es que no estabamos buscando crecer en número, pero a todo el equipo le encantó la idea. La mayoría le conocíamos y...

Estuvimos en la Software Craftsmanship BCN 2016

02/11/2016

Descripción del evento Este año varios miembros de Codesai estuvimos en la Software Craftsmanship de Barcelona. Todo un logro viendo que las primeras entradas fueron arrasadas, algo que habla muy bien de un evento que plantea dudas sobre si debería crecer más. Por fortuna, aunque las entradas se hayan vendido...

Using coeffects in re-frame

24/10/2016

Event handlers, collectively, provide the control logic in a re-frame application. Since the mutation of the application state is taken care of by re-frame, these event handlers can be pure functions that given the current value of the application state as first argument and the event (with its payload) as...

Refactoring tests using builder functions in Clojure/ClojureScript

07/10/2016

Using literals in your tests can have some advantages, such as, readability and traceability. While this is true when the data are simple, it's less so when the data are nested, complex structures. In that case, using literals can hinder refactoring and thus become an obstacle to adapting to changes....

Muchas gracias Modesto

07/10/2016

Hace unas semanas recibimos una noticia con sabor agridulce. Nuestro gran compañero y mejor profesional, Modesto, se marcha de Codesai. No resulta fácil perder a un compañero del que todos aprendemos muchísimo y que siempre está apoyando al equipo ante cualquier dificultad. Pero la verdad es que nos alegramos de...

Estuvimos en Habitissimo

07/10/2016

Gracias a Pablo Bernardo y Jordi Llull de Habitissimo, pudimos disfrutar de tres días de trabajo y conferencias en Palma de Mallorca, en el ParcBit. Fuimos Luis Rovirosa y yo a impartir una formación de TDD y Clean Code para 15 developers entusiasmados con aprender. Nos sorprendió gratamente el ambientazo...

Lo que me aporta TDD

07/10/2016

Hace tiempo que vengo queriendo reescribir nuestro libro de TDD para mejorarlo con todo lo que hemos aprendido en estos 7 años y todo el feedback que hemos recibiendo por parte de los lectores, a los cuales estamos muy agradecidos. Pero no se cuándo me podré sentar durante un puñado...

Estuvimos en la Tarugoconf

23/09/2016

¿Qué es la Tarugoconf? El viernes pasado, 16 de septiembre de 2016, asistí como orgulloso representante de Codesai, al mejor evento posible que cupiese en la imaginación de David Bonilla: la Tarugoconf. Un evento que nunca hubiese existido si no le hubiesen dicho las tres palabras mágicas "No hay huevos"...

Recorriendo poco a poco el libro "Understanding the 4 rules of simple design"

14/09/2016

Kata del Juego de la Vida de Conway En mis primeras semanas en Codesai he hecho la kata del Juego de la Vida de Conway como parte de mi formación para empaparme de la cultura y valores de la empresa. La hice dos veces: la primera ha sido TDD inside-out...

Kata: object literal to query string

07/09/2016

No long ago, we had to write a function that takes an object and returns a string to be sent as part of the query string in the request. This was because the communication mechanism was JSONP that works via the GET method. The server was already expecting the specific...

Antonio de la Torre se une a Codesai

23/08/2016

Miguel, Antonio, Carlos, Jose - Tenerife, Julio 2016 Estamos de celebración, super Antonio de la Torre forma parte del equipo Codesai desde esta misma semana. Antonio ya había decidido que se volvía a su tierra (Oviedo) con la familia cuando nos encontramos en JSDayEs 2016 y estuvimos charlando. Me contó...

Claves primarias: inmutabilidad y generación

01/08/2016

Hace unos días Pablo Iglesias tuiteó una pregunta de Stack Exchange en la que hablaban sobre la inmutabilidad de las claves primarias. Se generó un debate bastante interesante en Twitter que se extendió más allá de la cuestión de la inmutabilidad. Este es un intento de recopilar y explicar algunos de los conceptos que...

Estuvimos en AOS2k16

08/07/2016

Los días 1 y 2 de Julio de 2016, la mitad del equipo Codesai estuvimos en el Open Space de la comunidad Agile Spain, el AOS. Un evento brillantemente organizado por el capítulo gallego de la comunidad y celebrado en Santiago de Compostela. Enhorabuena a todos los organizadores por una...

Nos asociamos con Kairós DS

22/06/2016

Notición! Nos asociamos con Kairós! Estamos de enhorabuena, el equipazo de Kairós DS se convierte en partner de Codesai adquiriendo una parte de la empresa. En los últimos meses nos habíamos cruzado por múltiples caminos. A nosotros nos hablaban muy bien de Kairós y teníamos buenos amigos allí como Helder...

Estuvimos en Pamplona Software Craftsmanship 2016

21/06/2016

Gorka, Pablo e Iker en la apertura El pasado fin de semana, 17 y 18 de Junio, buena parte del equipo Codesai estuvo en Pamplona Software Craftsmanship 2016. Eventazo de categoría. Este evento fue organizado por Iker, Gorka y Pablo, los artesanos de 540deg. Ellos se inspiraron en Socrates Canaries...

Estuvimos en Fon

31/05/2016

Hace unos meses tuvimos la suerte de ser contratados por Fon para impartir un curso de TDD a uno de sus equipos de desarrollo en Madrid. Una oficina chulísima y un equipo entregado que prestó atención máxima desdel el minuto 1. Fon es una empresa de la que he oído...

The Ohce kata, a short and simple exercise to practice outside-in TDD using test doubles

25/05/2016

I created this short and simple kata to practice outside-in TDD using test doubles for a mentoring Álvaro and I are doing in Magento Barcelona: ohce is a console application that echoes the reverse of what you input through the console. Even though it seems a silly application, ohce knows...

Lanzamos Codesai con mucha ilusión

20/05/2016

Después de dos años trabajando bajo la marca de CB&A (Carlos Blé y Asociados) ha llegado el momento de crear algo más grande, una marca que proporcione a nuestros clientes la confianza de que puede funcionar sin Carlos, cuando haga falta. Una marca donde el interés del grupo y de...

Event bubbling in C#

08/04/2016

How to propagate an event from a low level class to a top level one: Events can only be raised from within the declaring type. Unfortunately they can’t be be passed in as arguments to methods. Only += and -= operators are allowed out of the declaring type. One way...

Windows apps development best practices

24/02/2016

I don’t really know whether they are the best practices to be honest, and certainly there is a lot for me to learn but these are principles and practices that work well for us in the development of a complex native Windows App (Windows 8.1+) using C# and the MVVM...

A code review is not like watching a football match

24/02/2016

In my experience a code review must have a goal. Some common goals are: Telling others how you solved a common problem. Warning others about certain perils (i.e race conditions, coupling…) Asking concrete questions. Implementation or design questions. When you expose some code to your colleagues in a meeting room, you...

We visited Scytl

14/01/2016

In October 2015, just two months before the Spanish elections I was lucky to visit Scytl and work there as a consultant for a week. Thanks to my good friends Manu Martin and Alvaro Garcia who are currently working in there as agile coach and developer respectively. I met a...

Polymorphic test setup with template method

21/12/2015

We had a kind of duplication in our tests that we didn’t know how to deal with. The refactoring Introduce Polymorphic Creation with Factory Method explained by Joshua Kerievsky in his brilliant book “Refactoring to Patterns” gave us the solution to avoid duplicated tests. These tests are very similar, the...

Refactorizando Try - Catch usando Javaslang

15/12/2015

Hace unos días, empecé un proyecto personal para mejorar algunas tecnologías, como por ejemplo, conexión con bases de datos o trabajar con Spark para hacer un servicio Rest. Empecé con una idea muy sencilla, ya que lo que quería era empezar cuanto antes y, más adelante, ir incorporando nuevas features...

Pairing: don’t have to always agree on a plan

02/12/2015

So your pair is proposing a route or plan that you don’t agree on. Am talking about a refactoring, a redesign or just the way to test drive the next feature. You have told him your reasons no to agree with him and there is no way to get to...

Object references, state and side effects

16/10/2015

C#, Java and other languages have the same behaviour when it comes to reference types. The dot symbol after the variable name (instance1 or instance2) accesses the actual object referenced by that variable. So before the dot, we have a variable referencing an object, and after the dot we have...

Refactorizando con Streams

08/10/2015

Hoy traigo una serie de ejemplos de refactorización a modo de introducción a las nuevas características funcionales de Java 8. Así que, si tenías curiosidad y no te habías atrevido a experimentar con ellas, ¡te animo a que pruebes! Empezamos definiendo una clase Person básica con un nombre y una...

XP Team Building

24/09/2015

Let the team walk its path Every team walks at its own pace and I haven’t found a way to speed it up myself, I don’t think there is one regardless of whether you are an external coach or a regular member of the team. Trying to push the team...

ES6 + browserify + babel + gulp + jasmine

14/09/2015

During Socrates Conference 2015 we decided that it’s the right time to jump in ES6 to develop a green field project that our customer is starting. Given that ES6 is already the stable and latest version of JavaScript, it does not make any sense to start a new project with...

Las ventajas de usar parámetros y variables tipados en PowerShell

18/08/2015

Cuanto más uso PowerShell más convencido estoy de lo importante que es tipar las variables y los parámetros de las funciones. Debido a la forma en que trabaja PowerShell, especificar los tipos me ayuda a evitar comportamientos indeseados. Por ejemplo, dado este script: Set-StrictMode -Version 2 $items = Get-ChildItem if...

Switch parameters en PowerShell

17/08/2015

En PowerShell es muy común usar parámetros de tipo switch. La peculiaridad de estos parámetros es que al usarlos, se especifica el nombre del parámetro pero no se proporciona ningún valor, ya que se asume que al usarlo su valor será $true y $false si no se especifica. Ejemplos típicos...

Using C# Collections

12/08/2015

There are many ways to work with collections. We are following Microsoft Guidelines for Collections plus some ideas that Kent Beck explains in Implementation Patterns. I’ve created a repository with code examples so that anyone can play with them. All the unit tests in the project are green except for two, which...

Cuidado que ($a -eq $a) no siempre es $true

07/08/2015

Este es uno de esos ejemplos en los que es importante intentar documentarse todo lo posible al desarrollar en un lenguaje/plataforma que no conocemos. Es frecuente asumir conceptos basados en nuestros conocimientos previos de otros lenguajes, pero en ocasiones nos puede jugar malas pasadas. En este caso voy a mostrar...

La importancia del Set-StrictMode

03/08/2015

Cuando empecé a programar scripts en PowerShell, cometía muchísimos fallos fruto de mi intoxicación con otros lenguajes, especialmente C#, con el que trabajo habitualmente. Después de un tiempo, me di cuenta que PowerShell tiene muchas más similitudes con JavaScript que con C# ya que es un lenguaje interpretado y de...

Remove data structures noise from your tests with builders

23/07/2015

Among other qualities good tests should be easy to read, quick to understand. When the test requires complex data structures to be sent to the SUT or to be part of a stubbed answer, it takes longer to read. Moreover those structures use to evolve as the production code does...

Productive Pair Programming

30/06/2015

The title of this post is redundant, pair programming is already a productivity technique. That’s my understanding or pair programming not just two people sitting together. Two people may code together for learning or mentoring purposes, however we pair for productivity reasons - productivity in the long term. Like any...

Interrumpir la ejecución cuando Import-Module no encuentra el módulo

30/06/2015

Esto es un truco sencillo y muy básico de PowerShell, pero puede desconcertar bastante a quien está empezando o utiliza PowerShell de forma esporádica. En PowerShell existen los llamados “terminating errors” y los “non-terminating errors”. Como su nombre permite intuir, unos finalizan la ejecución del script en curso cuando se...

Polymorphic Equality

23/06/2015

The default generation of Equality members provided by Resharper let you choose three different implementations when overriding the “Equals” method in a class (Alt+Insert -> Equality Members): The default choice is “Exactly the same type as ‘this’” which IS NOT polymorphic. I mean, subtypes of that class will be considered...

¿Necesitas programar un servicio para Windows? Prueba Topshelf

15/06/2015

Programar un servicio para Windows suele ser una tarea engorrosa y Topshelf proporciona una alternativa bastante interesante y muchísimo menos engorrosa que la plantilla por defecto que incorpora Visual Studio. Aunque podría enumerar bastantes aspectos interesantes de Topshelf, me quedo con uno que para mi es fundamental, permite que una...

Utilizando Exceptionless para monitorizar logs y excepciones

05/06/2015

Cada vez que abordo un nuevo desarrollo, considero que la generación de trazas es una parte vital ya que es uno de los mecanismos que nos va a permitir diagnosticar e identificar cualquier tipo de problema cuando estemos en producción, en ocasiones incluso antes de que los propios usuarios lleguen...

C# Async/Await and Task Parallel Library

29/05/2015

In order for a native desktop application to be responsive, I mean, not to freeze while sending a request over the network or processing a heavy CPU operation, these operations have to run in a separate thread. .Net 4.0 introduced promises (a well-known concept for JavaScript developers), the Task object...

Cómo crear Appx para Sideloading desde Integración Continua

13/05/2015

Cuando trabajamos con aplicaciones para la tienda de Windows, hay escenarios en los que necesitamos hacer Sideloading. Básicamente el Sideloading nos permite instalar una aplicación de la tienda de Windows, sin utilizar la tienda de Windows. Las razones para querer hacer Sideloading pueden ser muchas: probar la aplicación en local...

Mocking (stubbing) async calls (async/await)

10/02/2015

.Net 4.5 came out with a really handy built-in asynchronous mechanism, async and await. However the method signature of a void method is a bit strange: It is possible to use async void but it’s not recommended unless we are talking about event handlers. It’s also a bit strange the fact...

Practising Mob Programming

02/12/2014

In the past edition of Socrates UK, I met Gianfranco Alongi who told us about his team’s experience with Mob Programming. It was the first time I heard about it. As the site says, Mob programming is people working at the same time, in the same space, at the same...