Some of you may know me from the various meetups in the city, especially my attendance at a number of LJC and LSCC meetup events. Attending these events I learnt about various conferences like Devoxx, SoCraTes, JAX London, Java2Days, OpenFest, and I ended up attending and later presenting on various topic including Adopt OpenJDK.
During this time I met a lot of people with various levels of experience and my interest and urge to learn more about the Java/JVM platform, Code Quality, Software Design, XP Practices, Software Craftsmanship, etc..., were on the rise and saw no end. And whilst attending these events I came across Sandro and Mash, who were in those days hosting LSCC events. I went to many of LSCC events, especially liked the hands-on sessions (which are still my favourite).
I also noticed that many things I learnt at such events and conferences wouldn't always be immediately recognised or accepted at the workplace. And moving to another work environment didn't always solve this problem fully. I found that I wasn't learning what I wanted from my peers and the things I learnt from the community I couldn't apply at work. Besides very few were really in tuned with what the community was about. So one fine day I decided to take charge of my career and make a serious decision and take up the Apprenticeship program offered by Codurance and go through the process.
I was urged to go this way after being inspired by Sandro's book: The Software Craftsman, attending all the SoCraTes UK conferences, and meeting with developers who valued and took pride of their work namely their craft.
Where we are just now
It's now been nearly two months since I have been working for Codurance, a formidable force. And so it's also about time that I share my experiences with my fellow mates and the community around me.
During my first few weeks at Codurance, I have been busy learning various things that have been chalked out for becoming a craftsman.
When working on a kata or learning a concept, we paired or did what is known as 'mob programming' along with other apprentices and craftsmen. And most of the time used the pomodoro technique. Time boxing our work in intervals is something done both in groups and working individually. We would have a lot of discussions and retrospectives after working on a problem or writing some code from scratch.
Structure of my program
We used an internal tool based on the concept of Impact Mapping. I soon got interested in it when I saw my colleague Franzi (who is now a craftswoman) had used it to plan out her Apprenticeship route. Such a tool helps map out our goals and the tasks we need to perform to achieve it. And this can differ from person-to-person, depending on what they want to work on (driven by the Apprentice).
My mentor and other craftsmen reviewed them to get an idea of what I wanted to achieve for myself. And then its up to me to apply my own drive and perseverance to achieve the individual stories. My mentor and I meet and talk informally on a regular basis, many times pairing on a kata or a project or on the white board trying to get my head around a concept.
Days in the life of an Apprentice
I found the working hours quite flexible, remote working is also an option (when you are on the bench or if the client allows, if you are in a project). Our co-founders are understanding and compassionate about our individual situations.
Meetings are at their minimum, except for a weekly Apprentices meeting (run by an Apprentice and guided by at least one Craftsperson) and a bi-monthly company-wide catchup.
The Apprentices meetings are full of fun -- we are accompanied by at least one Craftsperson, who disperses their knowledge and experience from a wide variety of topics designed to help us in the journey and fill the gaps in our knowledge and experience.
A bi-monthly catchup involves sharing of knowledge via lightning talks, discussions and pairing sessions on pet projects over pizzas and beer (and of course veggies and non-alcoholic beverages for the teetotalers).
Katas, code reviews, mob programming and projects make up a learning week - all of these done individually or when pairing with another.
On a daily basis I have worked on different katas or try to solve the same kata in various different ways (using different testing and refactoring approaches). This in turn gave me better insights into designing and refactoring techniques. Trying to solve the same problem in different ways has a positive impact on our problem solving skills especially when writing code. In my case I also learnt how to use the different libraries and methods to write tests. I would like to cite Samir, thanks to you, for the suggesting this approach during the first week of my Apprenticeship.
Just last week we did a group code review and time-boxed ourselves, performed a retrospective at the end of each interval and ensured we delivered a good chunk of the feedback before close of play. Such regular code review exercises are helping all of us learn about how to code better as we are not only learning from feedback from the tools we used, but also through exchange of feedback from our peers who were involved in the group code review session.
Software Design, Specification Gathering & Communication
Recently we had an interesting mob-programming session where we were trying to model and write a game. At the end of the session, we had a retrospective, discussing the things we did well and didn't do well. Each of the apprentices and craftsmen were performing a specific role i.e. Developer, Domain Expert, etc... We learnt in retrospective, about areas where we could have done better and should focus on. That any test written gives immediate feedback about how well we have understood the domain and if we were taking the right approach. Why a certain approach when starting a project is more advantageous than another approach. What questions to ask and why it is important to ask the right questions to the domain expert or to give the right level of information to another developer and vice-versa. Sandro has described this process in detail in his blog post recently.
Fun, socialising and sharing
I found our office environment to be conducive to learning, sharing and collaboration. We even have a pairing rota that we use from time-to-time to record or suggest pairing sessions during the week.
We share links to events, conferences, tweets, interesting articles, videos, blog posts, etc... via slack, document discussions and brain dumps via Google doc, huddles during lunch- and tea- breaks to talk about anything we are working on. Thanks to the library of printed and digital books to our disposal, the huge collection of blog posts and videos on our site.
The apprentices and some craftsmen have collectively started a social event which of course happens every Friday, sometimes it's dinner at a nearby restaurant, while at other times an indoor movie over snacks and drinks at our office premises.
It is worthwhile and that's why we are here
It is a privilege to be able to work alongside very experienced craftsmen from our industry. We are very lucky and thankful to have the opportunity to be guided and mentored by talented and like minded developers.
This is my first job where the company has a completely flat hierarchy and where we share similar values.
Work is fun and learning is enjoyable when we love what we do and are amongst friends with similar goals and aspirations.
Thank you for taking the time to read this post and I hope it was interesting. Looking forward to write more and share such experiences in future posts.
Many thanks to Sandro, Tomaz, Alex, Franzi and David for all the feedback provided for this blog post.