Record of experiments, readings, links, videos and other things that I find on the long road.
Registro de experimentos, lecturas, links, vídeos y otras cosas que voy encontrando en el largo camino.
Thursday, November 27, 2014
Tuesday, November 25, 2014
Sunday, November 23, 2014
Kata: FizzBuzz with no conditionals in Clojure
I've just done the FizzBuzz kata with the restriction of not using any kind of conditional.
This is the result after playing a bit in the REPL:
This is the result after playing a bit in the REPL:
Interesting Talk: "Silex, desarrollo web ágil y profesional con PHP"
I've just watched this great talk by Javier Eguiluz:
Saturday, November 22, 2014
Interesting Talk: "Silex: An implementation detail"
I've just watched this great talk by Dave Marshall:
It's about DDD, BDD, Ports and Adapters and the Entity-Control-Boundary Pattern (EBC).
You can find the source code of the examples in this GitHub repository.
You can find the source code of the examples in this GitHub repository.
Reading GOOS (VIII)
These are the links mentioned in this week's conversation about the 10th and 11th chapters:
- Code samples
- Posts and Papers
- ArrayBlockingQueue Java Documentation
- Mock Roles, not Objects by Steve Freeman, Nat Pryce, Tim Mackinnon and Joe Walnes
- Clean architecture / never test the GUI? from Clean Code Discussion Google Group
- Robert Martin compares GOOS outside in approach with his inside out approach from Growing Object-Oriented Software Google Group
- State vs Interaction Based Testing by Nat Pryce
- Mocks Suck from Growing Object-Oriented Software Google Group
- Outside-In vs Inside Out – Comparing TDD Approaches by Matt Wynne
- Reflective Design by James Shore
- Some mocks by Steve Freeman
- Perfecting OO's Small Classes and Short Methods
- Presenter First: Organizing Complex GUI Applications for Test-Driven Development
- Mocks and Tell Don’t Ask by Ian Cooper
- Talks
Thursday, November 20, 2014
Refactoring Conway's Game of Life in Clojure
In the previous post I presented a solution of Conway's Game of Life in Clojure.
I've refactored that code in order to eliminate some duplication from the game rules.
First of all, I coded using TDD a new function will-have-a-cell? that later substituted both will-go-on-being-a-cell? and will-be-a-cell?.
These are the tests for the game rules after deleting the obsolete functions (will-go-on-being-a-cell? and will-be-a-cell?):
and this is the new function's code:
Once I had the new function I used it inside both keep-being-cells and new-cells functions to highlight the duplication between them:
Then I eliminated that duplication by using will-have-a-cell? directly in next-cells function, which made both keep-being-cells and new-cells obsolete:
Notice how will-have-a-cell? is used to filter all the possible locations (the current cells and their neighbors) which are given by the new all-neighbors-locations function.
Then I eliminated all the obsolete functions and their tests and did some renaming of the remaining functions, local bindings and parameters.
These are the resulting tests:
and this is the resulting code:
which is slightly shorter than the one in the previous version.
As usual I commited the code after every passing test and every refactor.
You will notice a problem I had with Midje :autotest not reacting properly after some of the renamings I did. I had to restart it so that it could take into account the changes.
If you want to follow the whole process, you can find the commits step by step here.
You can also find the resulting code in GitHub.
I've refactored that code in order to eliminate some duplication from the game rules.
First of all, I coded using TDD a new function will-have-a-cell? that later substituted both will-go-on-being-a-cell? and will-be-a-cell?.
These are the tests for the game rules after deleting the obsolete functions (will-go-on-being-a-cell? and will-be-a-cell?):
and this is the new function's code:
Once I had the new function I used it inside both keep-being-cells and new-cells functions to highlight the duplication between them:
Then I eliminated that duplication by using will-have-a-cell? directly in next-cells function, which made both keep-being-cells and new-cells obsolete:
Notice how will-have-a-cell? is used to filter all the possible locations (the current cells and their neighbors) which are given by the new all-neighbors-locations function.
Then I eliminated all the obsolete functions and their tests and did some renaming of the remaining functions, local bindings and parameters.
These are the resulting tests:
and this is the resulting code:
which is slightly shorter than the one in the previous version.
As usual I commited the code after every passing test and every refactor.
You will notice a problem I had with Midje :autotest not reacting properly after some of the renamings I did. I had to restart it so that it could take into account the changes.
If you want to follow the whole process, you can find the commits step by step here.
You can also find the resulting code in GitHub.
Wednesday, November 19, 2014
Kata: Conway's Game of Life in Clojure
Last Saturday I attended the Global Day of Code Retreat in Zaragoza where I had a great time practicing with other kindred spirits.
Today I did a version of Conway's Game of Life in Clojure having in mind some of the ideas I took home from the code retreat.
These are the resulting tests using Midje:
and this is the code:
When I have some more time and learn more Clojure, I'd like to make it configurable to change the geometry of the game and its rules using different versions of the neighbors, will-go-on-being-a-cell? and will-be-a-cell? functions.
I did another version of Conway's Game of Life in Java some time ago which could be configured in that manner.
I used a mix of TDD and REPL-driven development to solve it.
I commited the code after every passing test and every refactor. I also commited the tiny tests and spikes I did on the REPL.
If you want to follow the process, you can find the commits step by step here.
You can also find the resulting code in GitHub.
Thanks to all the colleagues from Zaragoza!
Today I did a version of Conway's Game of Life in Clojure having in mind some of the ideas I took home from the code retreat.
These are the resulting tests using Midje:
and this is the code:
When I have some more time and learn more Clojure, I'd like to make it configurable to change the geometry of the game and its rules using different versions of the neighbors, will-go-on-being-a-cell? and will-be-a-cell? functions.
I did another version of Conway's Game of Life in Java some time ago which could be configured in that manner.
I used a mix of TDD and REPL-driven development to solve it.
I commited the code after every passing test and every refactor. I also commited the tiny tests and spikes I did on the REPL.
If you want to follow the process, you can find the commits step by step here.
You can also find the resulting code in GitHub.
Thanks to all the colleagues from Zaragoza!
Friday, November 14, 2014
MOOCs: Web Application Architectures in Coursera
I recently finished this Coursera course by Dr. Greg Heileman from the University of New Mexico:
The theory in this course was a great introduction to know general concepts and patterns that are used in web development and see how they are applied in Ruby on Rails.
However, the homework assignments were not challenging at all.
In any case, I'd like to thank Coursera and Professor Heileman for offering this course.
However, the homework assignments were not challenging at all.
In any case, I'd like to thank Coursera and Professor Heileman for offering this course.
Reading GOOS (VII)
These are the links mentioned in this week's conversation about the 8th and 9th chapters:
Thursday, November 13, 2014
Practicing with sets in Advanced Student Language
This is the version I did some time ago using the Advanced Student Language of the sets exercise from the Coursera Scala course:
It helped me to practice with lambdas and to blur the border between data and functions.
It helped me to practice with lambdas and to blur the border between data and functions.
Detecting balanced Parentheses in Advanced Student Language
Today I revisited this exercise from the Coursera Scala course that I did some time ago using the Advanced Student Language:
I refactored it to define the helper function f inside balanced-parentheses?.
Since it is not allowed to have nested function definitions in Advanced Student Language (it's in Racket), I defined the function using letrec and a lambda.
I had forgotten how many parentheses a cond needs in Advanced Student Language. In that sense Clojure is far more convenient.
I refactored it to define the helper function f inside balanced-parentheses?.
Since it is not allowed to have nested function definitions in Advanced Student Language (it's in Racket), I defined the function using letrec and a lambda.
I had forgotten how many parentheses a cond needs in Advanced Student Language. In that sense Clojure is far more convenient.
Revisited Kata: Berlin Clock in Clojure
I've revisited the code of the Berlin Clock kata that I did sometime ago in Clojure to apply on it some of the things that I've learned lately.
This is my original solution:
and this is the new one:
This is my original solution:
and this is the new one:
Wednesday, November 12, 2014
Euler Project: Problem 2 in Haskell
This is my solution in Haskell to the second problem:
I still get a bit dizzy when I think about the second solution...
You will find a great explanation of the second solution in this post:
Fibonacci numbers: the slow way or the fast and lazy way
You'll find the solutions in Haskell to Project Euler problems that I've done so far in this GitHub repository.
I still get a bit dizzy when I think about the second solution...
You will find a great explanation of the second solution in this post:
Fibonacci numbers: the slow way or the fast and lazy way
You'll find the solutions in Haskell to Project Euler problems that I've done so far in this GitHub repository.
Kata: FizzBuzz in SML
This is the code of the FizzBuzz kata in SML that I did some time ago using pattern matching and refactored this morning to use List's map and tabulate functions:
You can check the code in this Bitbucket repository.
You can check the code in this Bitbucket repository.
Reading GOOS (VI)
These are the links mentioned in this week's conversation about the 7th chapter:
- Posts and papers
- Talks
- Books
Monday, November 10, 2014
Kata: Refactoring Tennis in Ruby
We practiced with the Refactoring Tennis kata in the last Barcelona Ruby meetup.
There were three different versions of the original code. I refactored the first one.
This is the original code:
First, I tried to refactor the code to the State Pattern as I did once before in C++. Then I realized checking the tests that the code was not meant to model a real tennis game. It's just focused in displaying the current score.
So I decided to try to separate the code that was keeping the tennis game score from the code that was displaying its score. I also wanted to be able to display the score in different languages.
This is the resulting code after the refactoring:
The TennisGame has two collaborators: the GameScore and the ScoreDisplayer.
The GameScore keeps track of the two Players in order to answer questions about the game score, whereas the ScoreDisplayer is in charge of displaying the score.
By default the ScoreDisplayer uses an English GameVocabulary, but the GameVocabulary can be injected through its accessor in order to display the score a different language (check the tests to see how the score is displayed in Spanish).
You can check the code and its tests in this GitHub repository.
I also committed after every tiny refactoring step so you can follow the process (especially the changes of mind I had and the dead-ends I found).
This kata was a great puzzle to practise and think.
I'd like to thank David Vrensk for his great work facilitating the kata and the interesting talk about Deliberate Practice that he gave before.
There were three different versions of the original code. I refactored the first one.
This is the original code:
First, I tried to refactor the code to the State Pattern as I did once before in C++. Then I realized checking the tests that the code was not meant to model a real tennis game. It's just focused in displaying the current score.
So I decided to try to separate the code that was keeping the tennis game score from the code that was displaying its score. I also wanted to be able to display the score in different languages.
This is the resulting code after the refactoring:
The TennisGame has two collaborators: the GameScore and the ScoreDisplayer.
The GameScore keeps track of the two Players in order to answer questions about the game score, whereas the ScoreDisplayer is in charge of displaying the score.
By default the ScoreDisplayer uses an English GameVocabulary, but the GameVocabulary can be injected through its accessor in order to display the score a different language (check the tests to see how the score is displayed in Spanish).
You can check the code and its tests in this GitHub repository.
I also committed after every tiny refactoring step so you can follow the process (especially the changes of mind I had and the dead-ends I found).
This kata was a great puzzle to practise and think.
I'd like to thank David Vrensk for his great work facilitating the kata and the interesting talk about Deliberate Practice that he gave before.
Sunday, November 9, 2014
Kata: Bowling Game in Clojure
I've just done the Bowling Game Kata in Clojure.
These are the tests using Midje:
and this is the code:
I used a mix of TDD and REPL-driven development to solve it.
I commited the code after every passing test, every refactor and every major REPL spike.
If you want to follow the process, you can find the commits step by step here.
You can find the resulting code in GitHub.
These are the tests using Midje:
and this is the code:
I used a mix of TDD and REPL-driven development to solve it.
I commited the code after every passing test, every refactor and every major REPL spike.
If you want to follow the process, you can find the commits step by step here.
You can find the resulting code in GitHub.
Friday, November 7, 2014
Kata: Unconditional rock, paper, scissors in Ruby
Yesterday Álvaro García (@alvarobiz) and I paired working on a possible solution to the Unconditional rock, paper, scissors kata that I facilitated in the recent SCBCN14 event.
This is the last version of the tests so far:
And this is the last version of the code:
We managed to write the code without having to use conditionals in any moment.
You can follow the process if you like since we did commits after every passing test and every refactoring.
You can check the code in this GitHub repository.
As usual it was a pleasure to do pair programming with Álvaro.
This is the last version of the tests so far:
And this is the last version of the code:
We managed to write the code without having to use conditionals in any moment.
You can follow the process if you like since we did commits after every passing test and every refactoring.
You can check the code in this GitHub repository.
As usual it was a pleasure to do pair programming with Álvaro.
Thursday, November 6, 2014
Euler Project: Problem 1 in Haskell
This is my solution in Haskell to the first problem:
I used a list comprehension.
Another way using also a lambda to create a helper:
Bonus: Two ways to do the same in Clojure:
I used a list comprehension.
Another way using also a lambda to create a helper:
Bonus: Two ways to do the same in Clojure:
Subscribe to:
Posts (Atom)