Code Retreat 2012 - Ho Chi Minh City
On Saturday December 8th, Ho Chi Minh City along with 200 other cities around the world celebrated a global Code Retreat.
What is a code retreat?
Like a meditation retreat, a code retreat is a time set aside to step out of the daily life and routine in order to get deep into practice. It's a full work day, and everyone attending is giving up their Saturday to do what they are probably paid to do from Monday to Friday. That's dedication to the craft. Not so many people came, partly due to poor advertising.
The code retreat was open to anyone but all attendees were fellow programmers, those with some experience already but who want to improve themselves. Besides myself, there was a motley crew of foreigners - an organizer from Japan, a local software tycoon originally from Spain, a Czech developer. Otherwise, all Vietnamese, including startup developers, university faculty, students, and corporate workers.
The venue was ERC Vietnam, the Singaporean MBA school who, along with two other Singaporean schools in Vietnam, is rumored to have lost its operating license from the Ministry of Education which would force it to close. However, the school was still open as usual. A Toastmasters club was also meeting in the room across the hall. There were scheduled outings for students posted in the elevators to be held at local bars and restaurants.
The coding
There were six sessions lasting about an hour each throughout the day and each session was the same both in format and content. The format was:
15 minutes - pair up with another programmer and discuss the strategy for writing the program - choose a language, maybe a framework, discuss data structures and algorithms
15 minutes - one person "drives" the keyboard, the other "navigates" - pair programming (an extreme programming methodology) where two developers use a single laptop to collaboratively develop software
15 minutes - switch up driver and navigator, although often times only a single person was familiar with the text editor or developing environment or even language and API (some languages heavily depend on libraries and APIs to do simple tasks which are difficult to do in the core language alone)
15 minutes - retrospective and break - we wrote down our learnings on sticky notes and collected them for each other to read and at the end of the day we had a whole day retrospective
What were we writing?
We were implementing Conway's Game of Life. Each pair (each session we picked new partners) wrote the game six times throughout the day, erasing the code they had written at the end of each session. The goal was not to write the game of life, but to get better at writing code by writing the same code over and over, by developing the same software over and over.
Halfway through the day some rules started to be added. First, we had to use TDD (test driven development) methodology (which some people didn't realize was feasible in JavaScript), then OOP (what if someone had chosen Scheme or some other functional language?). This was to encourage us to try new techniques and learn them from each other.
I was an outlier in that I wanted to use languages like Python, JavaScript, or even PHP instead of .Net framework languages. Instead of a massive IDE I was using Vim. In the end, in each session where it was up to me I chose Javascript. There was no need to build a new project from a template and then compile executables before running them. Just open a text file, save as html, and use Chrome as a development environment.
Later, more rules were imposed:
No if statements.
No loops (for, while, etc.).
No functions longer than a few lines (maybe 3 or 5 statements max).
We were encouraged to pick one rule and try to work within its constraints. I decided to apply all the rules!
These rules would be easy to abide by using a functional programming language but they're not impossible to follow in Python or Javascript either. But to replace loops using recursion, one thing I found was that nobody remembered how to write recursive functions and most people didn't even want to try as it was hurting their heads.
After the day was over, I took a look at underscore.js, a utility library for JavaScript which makes functional-like programming in JavaScript much easier.
Here's what I came up with.
<script src="underscore.js"></script> <script> // row and col are indices into 2d array 'grid', either 'today' or 'tomorrow' function value(grid, row, col) { return (_.isUndefined(grid[row]) || _.isUndefined(grid[row][col])) ? 0 : grid[row][col]; } function count_neighbors(grid, row, col) { return value(grid, row-1, col-1) + value(grid, row-1, col) + value(grid, row-1, col+1) + value(grid, row , col-1) + value(grid, row , col+1) + value(grid, row+1, col-1) + value(grid, row+1, col) + value(grid, row+1, col+1); } function next_state_if(neighbors, state) { return (neighbors == 3) ? 1 : ((neighbors == 2) ? state : 0); } function next_state(grid, row, col) { return next_state_if(count_neighbors(grid, row, col), grid[row][col]); } function calculate_tomorrow(today, tomorrow) { _.each(today, function (foo, row) { _.each(this.today[row], function (foo, col) { this.tomorrow[row][col] = next_state(this.today, row, col); }, this); }, {today: today, tomorrow: tomorrow}); } // helpers function copy2d(ary2d) { return _.map(ary2d, function (list) { return list.slice(); }); } function print_r(ary2d) { console.log(_.map(ary2d, function (list) { return list.join(''); }).join('\n')); } function random_init() { return _.map(_.range(30), function (list) { return _.map(_.range(30), function (list) { return _.random(1); }); }); } // demo main loop var today = random_init(); var tomorrow = random_init(); print_r(today); setInterval(function(){ calculate_tomorrow(today, tomorrow); print_r(tomorrow); today = copy2d(tomorrow); }, 400); </script>
- tomo's blog
- Login to post comments
Recent comments
1 year 11 weeks ago
2 years 3 days ago
2 years 1 week ago
2 years 3 weeks ago
2 years 19 weeks ago
2 years 19 weeks ago
2 years 19 weeks ago
2 years 19 weeks ago
2 years 19 weeks ago
2 years 19 weeks ago