WHAT WENT DOWN
The kata for the evening was based upon Fibonacci numbers... but with a twist! The problem was centred around Fibonaccimal Numbers (link) which use the Fibonacci numbers as a base for representing numbers. So taking 1, 2,3,5 and 8 as a base, we can represent 9 as 10001 or 01101.
As you can see, some numbers can have multiple representations and this added to the complexity of the problem. For the majority of the evening I paired with Rob and I found it really valuable getting his insight into the problem! The code we produced for the night can be found here: https://github.com/arkangelofkaos/CodeDojo30_Fibonacci
MY IMPRESSIONS
Nothing beats a good plan
More so then anything else, I came to appreciate the value of having a solid plan. Having a high level design which everyone agrees will solve the problem is incredibly important. Test driving code doesn't magically produce well designed algorithms.
LESSONS LEARNT
Decompose complexity into simple functions
Functional concepts supplement object oriented coding in a fantastically seamless way. When dealing with collections or calculations it is surprising how higher order functions like map and reduce translate to how you naturally think about the problems.
For instance, to produce all the Fibonaccimal representations of a number, you can use a two step process:
- Find all unique ways to express that number as a sum of different Fibonacci numbers
- For example: 3 is [3] and [2+1]
- Translate each way into the corresponding Fibonaccimal
- [3] is 100 and [2+1] is 011
These steps are both mapping a number to a list of lists, then each list to a String. This is reflected in the code below:
return sumsCalculator.fibonacciSumsFor(number) // Step 1
.parallelStream()
.map(toStringCalculator::fibonacciSumToString); // Step 2
Suddenly I've decomposed an abstract problem into two concrete functions which I understand and can test drive!
Perhaps this is the crux behind solving all problems. Reduce the complexity until the solution is series of simple steps. Needless to say, making things simple is not simple... But there in lies the rub :)
- For example: 3 is [3] and [2+1]
- [3] is 100 and [2+1] is 011
return sumsCalculator.fibonacciSumsFor(number) // Step 1
.parallelStream()
.map(toStringCalculator::fibonacciSumToString); // Step 2
No comments:
Post a Comment