This is going to be a long post, all about me! feel free to skip it! :)
This post is slightly too much for a tweet.
I really liked when i got to the Peter Van Rooijen interpretation of Demeter’s Law. I have never seen it explained quite so effectively!
- You can play with yourself.
- You can play with your own toys (but you can’t take them apart).
- You can play with toys that were given to you.
- And you can play with toys you’ve made yourself.
Okay, back to work. I just wanted to record that because it was so brilliant. I will read the article in greater detail later.
I have been encouraging my apprentice Rohit to blog about ignorance. It’s great to talk about what you know, and what you can do well, but for people to really trust you it’s important also to be honest about what you don’t know yet, and what you’re looking to learn.
As software crafters learning is part of what we do. There is always more to learn; it never stops. Personally i really enjoy learning. I love the feeling of new information going in and being absorbed.
Since i asked Ro to blog about exposing ignorance, i thought i should do the same. It’s good to start with a review of where you are now.
Where i am now
It’s fair to say my strongest language is Ruby. I’ve been programming in Ruby for about 5 years, i’ve seen my style grow and change a lot. I feel very confident in domain modelling and object orientation using Ruby.
I’m pretty confident with behaviour driven development for Ruby, using Cucumber and Rspec. I know a lot about Rails and a fair amount about Sinatra. I am comfortable using MySQL, PostgreSQL and MongoDB.
Exposing my ignorance
My biggest weakness at the moment is in having only one strong language. And here is where i expose my ignorance. I know a bit about a few other languages, but i’m not where i want to be. I feel embarrassed when people talk about Java, Haskell, Scala, Io, and i am unable to contribute due to my lack of knowledge.
Confronting my ignorance
Since thinking about this blog post, i have already begun confronting my ignorance: my first step was to contact Joel Gascoigne who develops Buffer – a simple tool for scheduling tweets. I wanted an easier way to use Buffer on my phone, so i offered to make an Android app. I saw this as a pet project to get me learning a bit more about Android development in Java.
We have a few ideas for moving the app forward, but for now i’m happy that we’ve got something out there that works, and it has given me the confidence to develop more Android apps.
My next tactic will be to study the book Seven Languages in Seven Weeks: A pragmatic guide to learning programming languages, by Bruce A. Tate. This is an intensive study of Ruby, Io, Prolog, Scala, Erlang, Clojure and Haskell. By learning how to solve a non-trivial problem in each of these languages, we learn the unique strengths and weaknesses of each language.
I’m looking for other people to study along with me, so if you’re interested, let me know!
Once i’ve studied those seven languages, i want to learn some Python. I’ve been hearing a lot about Python lately, and it seems like a language i really want to know. I already have the book Learning Python by Mark Lutz and i look forward to getting to that.
So that’s me: i have listed my strengths, exposed my ignorance and outlined how i am confronting it to improve myself and learn more. What about you?
Among other things, we discussed the meaning of mentoring and apprenticing. We agreed that they take a range of different forms, with varying degrees of formality.
An informal mentor may be someone you call when you have a problem and want another opinion on how to solve it. Maybe close friend, someone whose advice you value, not necessarily a formal mentorship agreement.
At the other extreme might be an intense apprenticeship where the apprentice lives and works with the mentor. The apprentice’s every need is met by the mentor. Every waking moment together is an opportunity for the mentor to instill values and practices into the apprentice, and for the apprentice to observe and learn from the mentor.
There is plenty of room for varying models between these extremes. Sandro and i got talking about different models, both within a company as a formal apprenticeship program (like we used to have in eden) and externally to a company.
I could talk at length about my opinions of what an apprenticeship program looks like – and i will in a separate post – but i want to start off a discussion among other people who are engaged in apprenticeship programs. What are you trying? What works well? What are the difficulties? How do you work in a way that is mutually fair and beneficial to both the apprentice and the mentor? What payment or expenses does the apprentice receive? How does this differ according to the country’s employment law? What challenges and milestones is the apprentice expected to achieve? How do you determine when the apprenticeship is completed?
This goes beyond Apprenticeship Patterns and gets into implementation details. We need examples of individuals and companies conducting successful apprenticeship programs to see how they are working.
Sandro and i also discussed how we can get the word out to more people. How should we let people know that apprenticeship is a useful way to learn? How could we find people who want an apprentice, and people who want a mentor, and bring them together?
At the moment this seems to happen quite naturally (and i think we would be mistaken to impose much structure on the process) but, as anyone who knows me well is aware, i strive for equality in all situations. It troubles me to think that most people are unaware that apprenticeships exist. We must be missing a vast number of people who would be ideal apprentices but just don’t know that the option is available to them.
To start with, we could all talk a lot more about what is happening. Thank you to Sandro for the discussion that prompted this post. I hope to hear from others and see many more blog posts talking about apprenticeship models and how we can find a way to share these ideas with the software community as a whole.
Today, Saturday 7th May 2011, there were six code retreats around the world! They were in Belgium, Spain, UK, USA, and two in Romania! We all did the same challenge: implementing Conway’s Game of Life in pairs, using test-driven development, in iterations of 45 minutes, discarding code at the end of every iteration and pairing with somebody different for the next iteration. We introduced a few extra challenges in every session! ;)
I co-facilitated the code retreat at Sheffield University. We had 18 participants: a good mix of computer science students, professional programmers, people who code for fun, and someone who seemed to have been dragged along but got thoroughly stuck into solving the problem along with everyone else! :)
In iteration 1 we gave everyone chance to explore the problem without heckling to see how they would do. The only special challenge was to pair with someone they didn’t know. In the retrospective we talked about the languages and classes used.
For iteration 2 we talked about TDD as in, letting the tests really drive the code in the direction they want to go. We challenged people to do the very simplest thing they could possibly do at each stage. Many people found themselves writing unnecessary code, so we kept bringing them back to the rules of the game. The retrospective brought up questions of where to start, and whether a cell should be responsible for its own state, or whether a separate entity should know where all the cells are.
In iteration 3 we encouraged people to try a different starting point, to see how that worked. We stipulated that the code could not contain any booleans, like true or false or strings or numbers representing boolean states. The third iteration was sneakily only 30 minutes long, which we didn’t tell anyone until after the retrospective! There was a good discussion about using a grid to hold the cells, versus having an array of cells who know their coordinate position.
Throughout the day, at various points, we were able to have Skype video calls with other code retreats. We found this very enjoyable: we discussed the different implementation options with other people who were also tackling the same problems. During the day, Sheffield managed to communicate with all the other code retreats: Valladolid in Spain, Cronos in Belgium, Bucharest and Timisoara in Romania, and finally, towards the end of our day, Pittsburgh in Pennsylvania, USA, just as they were at the end of their second iteration.
We also had two projectors constantly showing the twitter #coderetreat hashtag on tweetviz.com and a slideshow of pictures on hashalbum.com. These things really helped us to feel connected to a bigger community of people sharing a similar experience at the same time.
After lunch we introduced Keith Braithwaite’s TDD as if you meant it and for iteration 4 we challenged people to obey the strict structure given. The purpose of this was to really break everyone’s normal processes to avoid mental shortcuts. It really ensures that the solution is exactly what the tests require, and nothing more. It was a tough challenge but it was taken well. A lot of people found they came to a better solution when these restrictions were applied.
In iteration 5 nobody was allowed to use if statements. (Or case statements, ternary operators, etc.) We also focussed on ping pong pair programming. This is where one person writes the test, the other person writes just enough code to make it pass, then writes the next test and hands back. During the day i had seen a lot of rather uneven pairing, where one person was doing most of the work, and the other was mostly just watching and commenting. Ping pong helps to address that by bouncing back equally between the two. Comments in the retrospective were that you had to concentrate harder, and felt more engaged because of it. I was surprised that many people had not paired that way before.
Iteration 6 was the last one for us. (Unlike Valladolid who went on to 8 iterations!) We gave people a bit longer and told them to just enjoy this one. The restrictions were that no method could be more than 3 lines long, and the code you wrote had to be the best you could possibly do. You had to write something you could be totally proud of. For most people, they said their code wasn’t the best they could possibly do, but they were definitely proud of it! :)
At the end of the day we did a raffle. Entry to the raffle was by way of a donation to Bletchley Park, for which we raised £200. Names were shuffled in a Ruby array and winners received either a copy of Apprenticeship Patterns or a software craftsmanship motivational calendar.
With that done, all that was left was a trip to the pub to relax after a good day’s work! :D
Thanks and kisses
I thank Tom for being a fantastic co-facilitator, and Chris for doing an excellent job of organising everything: food, refreshments, sponsorship, venue, my hotel last night, and probably a whole lot more that went so smoothly it was unnoticed.
Thank you very much indeed to the sponsors and supporters: epiGenesys, University of Sheffield Enterprise, O’Reilly UK and The GIST Foundation. It would have not been nearly as awesome without your help.
Thanks to all the people around the world who talked to us over Skype – it was great to feel part of something so much bigger than just us.
Thank you so very much to everybody who participated today. You really made it a great day for everyone.
Hello to everybody who knows me from my two previous blogs: edendevelopment.co.uk/blogs/aimee and aimee.mychores.co.uk. I have decided to merge the two into one, which for convenience i’ve decided to have hosted on wordpress.com now.
In case anyone is not aware, let me share the news that eden development, my place of employment for nearly 3 years, closed its doors in March. For me this is sad news: eden was a truly remarkable place to work.
Through eden i met many amazing people, and learnt to hone the craft of developing excellent quality software. I have learnt how to listen to clients and understand their needs. I have been privileged to take on despo and Alberto as apprentices, imparting my knowledge and care and seeing them develop. Most importantly, i have grown in self confidence, to the point where i am now able to journey out on my own, taking on contracts and freelance work.
It turns out that the job is suiting me very well. I get on well with the people i work with, and i found i was able to start providing value for the company from my first day. I’m working hard and i believe i am exceeding their expectations of me. At the same time i’m learning how to use Demandware, a powerful ecommerce platform, and i may well find that the skills i learn here could come in useful for me again at some point in the future.
My contract takes me until the middle of May, at which point i’d like to spend one week working on a freelance project. After that i’d like to take on another contract, and this time i’m particularly looking for something that uses my Ruby skills, as well as my knowledge of behaviour driven development. There are two possibilities i’m looking at, and i’m fairly confident that one of them will work out.
I am always interested in meeting new people to talk about work that i may be able to help with. I am really enjoying the freedom of contracting, so i’m not looking for permanent employment at the moment, unless it’s a very good offer. I’ve realised that job security is a myth, and painful though it was to leave eden, i think i needed that push to venture out on my own.
At this very moment i am at Scottish Ruby Conference in Edinburgh. I really enjoyed it last year, and this year seems even better. I am meeting new people and rekindling previous friendships. Today i have been inspired to work on a charitable project, i enjoyed an entertaining discussion on programming etiquette by Jim Weirich and Chris Nelson, and i was excited to see how MacRuby works.
It’s lovely that my mentor Enrique is here at SRC, sharing an apartment with me, and my apprentices are both here too. Edenites Chris and tooky are also around, and it’s great to spend time together again. Our shared experience of being part of eden is something that will remain with us, and we will always be good friends.
Notice that i say “edenites”, not “ex-edenites”. For me, eden was all about the culture and the people. My pride for quality of work, my valuing of client relationships, my commitment to learning, my honesty, my humility, these are eden’s values that have become deeply ingrained in me, that i intend should never leave me.
If you read this far, thank you. You can see why this post has been a long time coming. It’s only now that i’m at Scottish Ruby Conference that i can really take the time to relax and reflect. The last few weeks have been like a whirlwind for me. Thank you to all who have supported me and encouraged me. It has been scary and exciting, and i’m relishing these new opportunities!
Here’s to my ongoing journey! :)
On Friday 7th October, at Software Craftsmanship 2010, eden announced Minisculus – a series of encoding, decoding and code breaking challenges, loosely based on the historic challenges faced during the second world war.
Minisculus was set by Steve and Todd. I took the challenge in the week before SC2010 and really enjoyed it. There is enormous satisfaction in figuring out the answer, posting it to the server, and if you got it right, receiving the secret URL to the next question. The progression of the challenge provides new insights and plenty of opportunities for refactoring to keep your code clean and simple.
We ran Minisculus as a competition for a £100 Amazon voucher. We had 12 entries; most written in Ruby, but also including solutions in Java, Clojure, PHP and Python. It is fascinating to see the different ways that people implemented their solutions.
Our winner is Luke Redpath, who is a freelance Ruby and iPhone developer in London. Luke wrote the solution in Ruby, nicely specified using RSpec. The code is particularly clean, easy to read, well refactored to be very simple. Luke has good use of object orientation, using a
ShiftCypher that can accept any number of wheels, which have their own configurations for encoding and decoding, a great example of the Strategy Pattern. Luke also included a code breaker using keyword matching, and automated the communication with the Minisculus server to send answers and receive the next question.
Luke’s was also one of the first entries we received, and a nice little touch helped seal it for Luke: the inclusion of a
MarkIII machine that raises an exception when called: “Not Implemented due to budget overruns!” – a joke that shows the attention paid to the story told by the challenge. Have a look at Luke’s code at github.com/lukeredpath/minisculus.
You can see a Hall of Fame on the Minisculus website, showing everybody who completed the challenge, including source code for many of the entries.
Although the competition is now over, the challenge remains for anyone who wants to try it! Thanks to everyone for participating so far!
Today i had a great day at the Software Craftsmanship 2010 conference at Bletchley Park. Despite getting up ridiculously early, and feeling somewhat ill during the day, i managed to have an excellent time, learn a few things, and chat to some wonderful, interesting people.
I enjoyed Jason Gorman’s enlightening tutorial on refuctoring – the art of incrementally changing code a little at a time, so that the tests still pass but it becomes less readable and less maintainable, to the point where only you have a clue what the code does. Sometimes known as Mortgage Driven Development, because it claims to ensure you keep your job. Jason encouraged to look for Code Smiles (well-written, elegant code) and refuctor them away effectively. I enjoyed pairing with Gavin on making the ugliest “Hello, World!” we possibly could!
As an antidote to the refuctoring, several people went to the workshop on beautiful, maintainable, Designer Code by Chris, however i chose to attend Michael Hunger’s Game of Life session. After the recent code retreat at eden, i was eager to learn more about the Game of Life and Michael showed us a video of John Conway talking about the Game of Life, and an implementation of the Game of Life in APL which is mind-blowingly awesome! I worked with Chris and Iain to do a version of the Game of Life in Java. I think we had an hour to do it, and we very nearly got something that worked, except we weren’t calculating the neighbours correctly so every cell died, prompting us to rebrand it as The Game of Death!
A special highlight of the day was the guided tour of Bletchley Park where we saw the places where secret codes were intercepted and decoded in World War II, and saw the impressive machines that were built to apply brute force to crack the encoding strategies. What impressed me most was how innovation was driven forward by necessity, and it made me smile to learn that the codebreaking was usually made possible thanks to stupid mistakes that were made by those transmitting the codes.
With a nod to the Lorenz encoder and the Colossus code breaker, eden launched the Minisculus Challenge today. I hope a few people have already tried the challenge and are enjoying it as much as i did! It was hard keeping it a secret last week, when i really wanted to tweet about it!
I had a very good day, and i thank Jason, all the workshop facilitators, and everyone who helped to make the day such a success!
All day today there was a Code Retreat at Eden Development. About 20 people came, from all over the country, and we spent an excellent Saturday pair programming together, sharing ideas, having stimulating conversations and getting to know each other much better.
At a code retreat everybody works on a single problem: Conway’s Game of Life. You pair with different people in each 45 minute session. You have to TDD the development, but you can use whichever programming language you choose as a pair. At the end of each session all the code must be deleted. You do a retrospective as a group, have a little break, then go and pair with somebody else.
We got through 6 sessions, which means i pair programmed with 6 people i didn’t know very well before today. It was great! The first two sessions i paired with Paul and then Quentin. To start with, we were pretty much feeling our way through the problem, implementing the rules of the game, and then getting stuck with determining the position of each cell.
In the third session i paired with Ben and we decided to try a completely different approach: dealing purely with coordinates to represent the positions of live cells. It actually worked quite nicely, although implementing the rule logic became quite difficult.
After lunch we were invited to try “TDD as if you mean it” which has very strict rules about where and when you should create your code, and when you can move it. It’s quite restricting the rules seemed to hold us back from getting very far. I was with Louis that time, who was very good at helping me to program in Java, which i’m not so familiar with.
At the 5th session we were allowed to just do whatever we want, so long as it was still test driven. I paired with Paweł and we just went a bit wild with linking cells to each other and getting them to link back respectively. We were going with North, South, East, West, but we eventually realised that you could really link any cell to any other, and the direction doesn’t matter. At that point it becomes more of a network problem. You could say that as a software coder i live or die depending on the community and people i know. That was an interesting insight.
In the final session I was with Clive and it turned out to be our best session of all. We were extremely controlled in our TDD, making sure we understood the code at each stage, and only taking small steps, and predicting at each test run whether it would pass or fail and what the failure message would be. We had cells that knew their positions, and could receive other cells and decide whether or not to attach to them as neighbours. Meaning we could pass every cell to every other cell and get them to connect based on their positions, then we could count how many neighbours they each have.
I mostly programmed in Ruby today, but there were people coding in Java, C++, C#, Python, and i think Scala, Clojure and PHP. We learnt a lot about how to program the game of life, and more importantly, how not to! A code retreat is a great opportunity to have fun, get to know other people, and code in an environment where it’s safe to try things out and make mistakes.
To find a code retreat near you, look on coderetreat.com or consider running your own!
I have recently had the privilege of being accepted as an apprentice to software craftsman and philosopher Enrique Comba Riepenhausen. This is part of Eden Development adopting a craftsmanship approach to software creation.
I am very excited at this new development in my career. It’s going to be hard work because i have a lot to learn, but i am pleased to have made the commitment and to know that i have someone who is playing a very active part in my personal and professional development. Funnily enough, the more i learn, the more i realise how little i really know. The first task that i have been set as part of my apprenticeship is really showing me that.
Eden Development has given me a blog to talk about my progress during my apprenticeship. So i have decided that my apprenticeship blog will become the place that i talk about my technical and coding interests, leaving this blog to be more personal. So if you are interested in me from a technical point of view, please follow edendevelopment.co.uk/blogs/aimee.
There are actually now five apprentices at Eden Development. If you are interested in software craftsmanship it is well worth looking at the Eden staff blogs aggregation to read all our thoughts and experiences on our own journeys.