Exposing my ignorance

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.

The app is open source; you can check it out on github.com/bufferapp/Android. A simple working version is now available in the Android Market: Buffer for Android.

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?

Let’s talk about mentoring and apprenticeships

Yesterday i had a very pleasant afternoon with Sandro Mancuso from the London Software Craftsmanship Community. The timing was perfect: i had a free afternoon and Sandro had just left Valtech.

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.

Welcome to Rohit, my new apprentice!

I have spent the last 8 weeks working at a consulting, design and development company in London. I’ve had a fantastic time, felt very welcome and i know that together we did some amazing work.

While i was there i had the pleasure of getting to know Rohit Gogna, who is employed there as a Quality Assurance Tester. Straight away i knew that there was something different about Rohit. In fact i commented early on that i’d never known such an enthusiastic tester. The following quote shows how Ro thinks of testing:

Software Testing is not a job … it’s a passion that turns into a career.

Rohit is keen to create a community of testers in London. LondonTester.com is Ro’s initiative to help testers find jobs and share knowledge. Ro is very keen to improve, learn new techniques and share with other people. In short, perfect apprenticeship material.

I encouraged Ro a lot over the 8 weeks. We spoke about my other apprentices, and what apprenticing and mentoring mean. I encouraged Ro to seek mentors who can guide and channel this enthusiasm, because i can see so much potential, provided Ro receives the right support.

I did not offer myself as a mentor; i waited for Ro to ask me, something like the moment in Avatar when Jake has become one of the Na’vi people and may choose a partner. Jake wants Neytiri but says “she must also choose me”. Neytiri says, “She already has”. If you are an apprentice and want a mentor, you should be the one to ask. Chances are that person might already want to mentor you but is waiting to see if you ask for it!

I take mentoring very seriously, so i made sure Ro knew exactly what would be involved, and knew that it would be hard work and painful at times. Ro understood and was still keen, so we shook hands to begin the formal arrangement, and went to skype call my mentor Enrique to share the great news!

Initially, i want to get Ro learning and blogging about automated test tools, starting with Selenium. I also want Ro to have a second mentor: someone who is more knowledgeable about testing and mentor Ro on these things that i don’t know so well. We’ll get networking and meeting people to see if we can find someone just right.

So please, follow Ro on twitter: Testerpedia, and watch with me, with pride, as we see Ro’s full potential begin to emerge!

Welcome to Despo and Alberto!

I would like to make a big public welcome to our new apprentices Despo and Alberto who are starting at eden very soon!

Despo is well known to us through the Software Craftsmanship User Group, code retreats and other software crafting events. We are looking forward to having Despo join us tomorrow, and we’ve already got plenty of work lined up for Despo to jump straight into (pairing with other edenites, of course!)

Alberto has recently spent a 4 weeks here as an intern, and we are delighted to welcome Alberto back for an apprenticeship with us, starting next week. We have already seen Alberto learn a lot during those 4 weeks, so it will be great to follow Alberto’s further progress.

Both Despo and Alberto have solved the eden minisculus challenge!

I am personally very excited as i shall be acting as a mentor to both of them. This is a new challenge for me, and i’m looking forward to it. I very much enjoyed working with Tom over the summer, and i found that Tom seemed to learn a lot from me by coincidence without me actively trying to teach anything. I think that my skills of empathy and personal development help to make me suitable for the mentorship role.

Welcome, new apprentices, we are all very happy to have you join us! :)

Welcome to Alberto Peña!

Last week eden were delighted to receive Alberto Peña as our newest intern. Alberto is a Java programmer from Spain, who has taken a leap of faith by coming to intern at eden, setting aside the comforts of a job, girlfriend, culture and language in order to experience something new. For this, i admire and respect Alberto very much.

 @plagelao server github repository is http://github.com/plag... on Twitpic In the first week we set a deliberately impossible challenge for Alberto: to implement rfc2616 – the HTTP server/client protocol. We stipulated that it must be developed with BDD using Cucumber and Rspec. On Friday Alberto gave a presentation of the first week’s work: a demonstration of the successful GET request. Alberto walked us through the code explaining how it works, and talked about the challenges and decisions faced during the week.

Alberto has been blogging every day, and it’s really interesting to read about life at eden seen through somebody else’s eyes. I encourage you to follow Alberto’s blog: El Programador Feliz. It’s mostly in Spanish, but if you’re not completely comfortable reading Spanish, Google Chrome should automatically offer to translate it for you.

Alberto is not being paid during this internship at eden, but there is a pledgie page in case you wish to make a donation (which goes directly to Alberto) – Help an aspiring craftsman on his journey.

Welcome, Alberto! It is a real pleasure to have you with us!

Code Retreat in Winchester

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!

Licky wiki news

Just a quick update on licky, my little wiki apprenticeship task i’m doing. I realise that time has gone on and i haven’t talked about it as much as i might, plus i actually have some quite encouraging news to report now!

Last time i wrote, i was just starting to work on Pages and a PageFactory to find them or create them as necessary. Since then i’ve added a persistence strategy which saves wiki pages to the filesystem. I pass the desired directory to the strategy so that test pages can be kept separate from real pages. This was necessary as i wanted to clear out the test directory every time after use and i didn’t want to accidentally delete real pages.

After that little burst of progress i stalled for a long time as i knew i needed to start writing the web interface and i didn’t know where to begin. James gave me a good idea which was to set up a simple Webserver class that would wrap around the web server of my choice. I have chosen WEBrick for the time being, but it shouldn’t be too difficult to swap in another one later, probably with another strategy pattern. James suggested i start by visiting a page and looking for the text ‘Hello world’. I thought this was a good idea and so i started finding out about WEBrick servlets.

With that start i was suddenly able to leap ahead, testing and implementing everything i need so that my wiki is now able to create, show and edit pages through the web interface. I feel as if i am very close now. Possibly the only thing left to do is add a way to link between pages and then i can truly call it a wiki.

Test driving the development of this whole project has been extremely educational. I know i started off getting too involved in writing a test framework, so Enrique pulled me back and made me think of the simplest thing that could possibly work. I began with one method: assert_equal. That was enough in the beginning. As time went on i added two more methods: assert_true and assert_contains. When necessary i added useful debugging information to report failures. At the appropriate time i refactored the testing framework into a module that could be included into multiple test classes.

I know i also started thinking about the web server too early. I started off trying to work with ERB and templates, as i am familiar with Rails, and in the end all i needed was a few servlets. As Enrique made me realise, the most important part of a wiki is not that it runs on a web server. The most important thing is content. Pages, with content, saved to a file system. Having focussed on that and got a real solid, well tested mechanism for saving and retrieving pages, i knew that the WEBrick servlets could rely on the underlying framework, and when the time came, it did not let me down.

My software apprenticeship

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.