I recently spent four months as trainer at ThoughtWorks University, which is the graduate training programme for ThoughtWorks. It is a six week programme and I was a trainer for two terms. One of the key learnings I had while there is the value of context and the danger of assumptions!
During the programme we spend four of the six weeks on a real project which at TW is described as an SIP (Social Impact Programme). On the project as well as being a trainer/coach I played an unofficial tech lead role, while the grads got up to speed. One of the things I noticed very early is the grads assumption of my vast knowledge of the application and code base we were working on and therefore when ever they asked me any questions they rarely gave me context. I spent a large amount of my time asking lots of questions about what the hell they were on about. Often people would walk right up to me and just start explaining some very specific piece of code wasn't working. I'd often be thinking "What the hell are you on about?", as I quickly tried to change context from what I was working on with my pair before I was disturbed.
I quickly gave feedback to the grads about the value of context and tried to determine what their assumptions were. What I discovered is that having just finished university they were quite used to being given a piece of work to do (an assignment) in which the lecturer probably had seen a hundred times and was well aware of the amount of ways it could be developed. However, when they were given a story, myself as the tech lead and NOT the lecturer wasn't a 100% sure exactly how the problem would be solved, that is often down to the pair working on the story. So whenever the grads came across any issue or weren't sure what to do next, they would ask me questions with the assumption that I already knew how to solve the problem and it was their job to figure out THE solution. When they got stuck they wanted to know the next step. So they would blurt out where they were stuck and I would spend most of my time trying to get context and some understanding of their proposed solution. Often what would happen is the rather enquiring 'cardboard programmer' (me) would keep digging until they actually came up with the solution themselves. So although it wasn't a completely invaluable exercise it was a little frustrating for me so I believe it is really important to always give context. Even if you assume that the other person does know what you are talking about if you assume they don't and always give context, they will tell you if they already know what you are talking about. Erring on the side of caution is always best to get the most value out of the question recipient. Often they will become a 'cardboard programmer' but regardless context is key and I found the grads became much better developers just by learning to give context. As this helped them understand their solution better and what they were trying to achieve. It isn't just important when asking questions but also when continuing a story with a new pair. But this isn't just a lesson for graduates, through this I have become better at giving context as now I appreciate the real value a lot more.
I'm sure there is even more value in giving context, which I would love to hear :)
Tuesday, 4 October 2011
Tuesday, 2 November 2010
Don't forget your relational database
Now the good old relational database has had a bit of a bad wrap lately. It's all about document databases and flat tables and CQRS and blah, blah, blah. Well let me just remind you that most of us are still 'dealing' with our friend mr relational database and I'd like us all to take a moment to treat him with the respect he deserves... or at least not forget that he still exists and requires a little bit of relationship management.
On my current project we're using an ORM to map our database objects to the nice (ahem) OO one's we've created. For our ORM we're using NHibernate and Active Record (to remove the xml configuration layer). However it has come to my attention recently that many developers were under the impression that adding attributes of HasMany and BelongsTo to the OO object properties you map to your database would carry that relational constraint down the the database. But I'm afraid not folks! That dependency still needs adding to your database the old fashioned way using your migrations. If you forget to push this constraint down you are in danger of some other code somewhere else in your system or worse outside of your system breaking the relational integrity of your database....boom!
I openly admit that this is a pain and probably another plus point for relational database naysayers but as I said earlier we still have to be nice to mr relational so don't forget him please :)
On my current project we're using an ORM to map our database objects to the nice (ahem) OO one's we've created. For our ORM we're using NHibernate and Active Record (to remove the xml configuration layer). However it has come to my attention recently that many developers were under the impression that adding attributes of HasMany and BelongsTo to the OO object properties you map to your database would carry that relational constraint down the the database. But I'm afraid not folks! That dependency still needs adding to your database the old fashioned way using your migrations. If you forget to push this constraint down you are in danger of some other code somewhere else in your system or worse outside of your system breaking the relational integrity of your database....boom!
I openly admit that this is a pain and probably another plus point for relational database naysayers but as I said earlier we still have to be nice to mr relational so don't forget him please :)
Sunday, 24 October 2010
LDNUG open mic night: Pair programming, the good, the bad and the ugly
On Wednesday evening the London .NET User Group (LDNUG) hosted an open mic night. This is an opportunity for first time speakers to present in a friendly environment and this time I was one of them. Sara Stephen's and I presented our first public presentation on Pair Programming: The good, the bad and the ugly.
Our talk was a mix of presenting and some short sketches on good, bad and ugly pair programming. We decided that showing what good, bad and ugly looked like would be more helpful than describing it and hopefully be more memorable!
Being my own biggest critic there are a couple of things I would change about the presentation, but the great thing about having this small friendly environment to practice in is if we get it a bit wrong in anyway we can work on that and improve for next time and there definetely will be a next time.
Most of the feedback we received was good and the audience members I spoke to found our presentation both entertaining and informative which is exactly what we were hoping for. Even better one audience member said we stole the show, but admittedly that is easier to do when you're sketching out pairing than talking about technology on your own.
After coming up with the idea for our presentation we came across this presentation at Oredev, which is like an extended version of our talk and covers even more areas to think about while pairing.
The other great speakers of the evening who also did really well were:
James Knowles - "Three years of running a Tiny software company.. All my mistakes.."
Matt Lacey - "Cross platform mobile app development"
Robin Minto - "HTML5 basics"
Garry Shutler - "Introduction to Sass"
I think the open mic nights are a great idea and opportunity for new speakers so I'd like to say a big thank you to Toby Henderson for organising it and EMC and Michelle Flynn for hosting us. I believe he plans to do more in the future.
The next LDNUG's will be on the 4th and 18th November, the latter of which I am organising. Currenty Ian Cooper, Zi Makki, Toby and I share the load. This talk will be by Sarah Taraporewalla, another ThoughtWorker, and will be on integration points. More details to follow...
Our talk was a mix of presenting and some short sketches on good, bad and ugly pair programming. We decided that showing what good, bad and ugly looked like would be more helpful than describing it and hopefully be more memorable!
Being my own biggest critic there are a couple of things I would change about the presentation, but the great thing about having this small friendly environment to practice in is if we get it a bit wrong in anyway we can work on that and improve for next time and there definetely will be a next time.
Most of the feedback we received was good and the audience members I spoke to found our presentation both entertaining and informative which is exactly what we were hoping for. Even better one audience member said we stole the show, but admittedly that is easier to do when you're sketching out pairing than talking about technology on your own.
After coming up with the idea for our presentation we came across this presentation at Oredev, which is like an extended version of our talk and covers even more areas to think about while pairing.
The other great speakers of the evening who also did really well were:
James Knowles - "Three years of running a Tiny software company.. All my mistakes.."
Matt Lacey - "Cross platform mobile app development"
Robin Minto - "HTML5 basics"
Garry Shutler - "Introduction to Sass"
I think the open mic nights are a great idea and opportunity for new speakers so I'd like to say a big thank you to Toby Henderson for organising it and EMC and Michelle Flynn for hosting us. I believe he plans to do more in the future.
The next LDNUG's will be on the 4th and 18th November, the latter of which I am organising. Currenty Ian Cooper, Zi Makki, Toby and I share the load. This talk will be by Sarah Taraporewalla, another ThoughtWorker, and will be on integration points. More details to follow...
Tuesday, 27 April 2010
//TODO 2010 Quarterly Retrospective
Having realised the value of a retrospective since working at 7digital I have decided to have a quarterly retrospective of the goals I set out for this year, just to see how I'm getting on. So here goes...
Learn another language
First up is my intention to broaden my horizons from a purely C# perspective and learn other types of languages, namely dynamic and functional. I'm happy to say I'm well on the way with this thanks to my job at 7digital, which really promotes learning. We've had a serious of Dojo's on F# in the last few months and I have a basic understanding of Ruby thanks to an introductory presentation from another member of the dev team.
Become more proficient at refactoring
This is definitely improving as I am now working with quite a lot of legacy code, which is without unit tests and breaks many of the SOLID principles. Let just say it's a real challenge and there is nothing like bad code to make you appreciate the value of good. I am also becoming a bit of a TDD/BDD fanatic!
Learn to apply design patterns
This was all about applying the theory and as mentioned in the last paragraph there is no shortage of that happening.
Learn more testing frameworks
Specifically I wanted to understand BDD and Cucumber. I put quite a bit of effort into this a few months ago, adapting the Cucumber Custom Formatter to help us communicate better with the business and subsequently carrying out a short presentation to the business on the benefits of agile acceptance testing. Most of what learned was from Gojko's book which I would highly recommend if you are struggling to articulate and convince your business the benefits of agile acceptance testing.
Read the following:
The book list has had the most changes as this is often so dependent upon the work you are doing at the time. As it happens I have started both Working Effectively with Legacy Code and Pragmatic Programmer but finished neither. It's a terrible habit of mine to have several books on the go at once and I'm not sure if it's to my benefit but I usually finish what I start so I'll get through them eventually. On the plus side I've read Bridging the Communication Gap and now have a copy of Jon Skeets C# book as after seeing him at both FOWA and DDD I figured if he can't help me understand the depths of my language of choice, no one can!
Blog more
This is definitely where I haven't kept up my resolution. I did blog on the 7digital developer's blog but I'm still averaging less than one a month, which wasn't the plan. Must do better next time!
Attend more varied events
I'd say this is a work in progress. I have branched out a little attending talks on F# and CQRS, which are both subjects I know very little about.
Give something back
My original goal was to somehow help get more women in technology, but I have to admit I haven't yet figured out how. This is a bigger issue than the scope of this blog post but it is something I do want to put some effort into. First step, attend the next girl geek dinners event. On a positive note I continue to organise events for LDNUG, the last one being an event on mixing functional and OO approaches in C# at skillsmatter.
Goal changes
I think overall I am actually doing quite well at working through this years goals. I'm still happy with the current plan, the only additions/changes I would make would be to learn more about the latest CQRS buzz, but I plan to attend a talk by greg young at skillsmatter this very evening to see his take on it. I've already seen Udi Dahan and although it seemed interesting and certainly applicable to much that we do at 7digital I wasn't 100% convinced it could be easily applied to our current architecture. Perhaps Greg will shed even more light and I'll share my findings right here, helping me further achieve this years goals.
Learn another language
First up is my intention to broaden my horizons from a purely C# perspective and learn other types of languages, namely dynamic and functional. I'm happy to say I'm well on the way with this thanks to my job at 7digital, which really promotes learning. We've had a serious of Dojo's on F# in the last few months and I have a basic understanding of Ruby thanks to an introductory presentation from another member of the dev team.
Become more proficient at refactoring
This is definitely improving as I am now working with quite a lot of legacy code, which is without unit tests and breaks many of the SOLID principles. Let just say it's a real challenge and there is nothing like bad code to make you appreciate the value of good. I am also becoming a bit of a TDD/BDD fanatic!
Learn to apply design patterns
This was all about applying the theory and as mentioned in the last paragraph there is no shortage of that happening.
Learn more testing frameworks
Specifically I wanted to understand BDD and Cucumber. I put quite a bit of effort into this a few months ago, adapting the Cucumber Custom Formatter to help us communicate better with the business and subsequently carrying out a short presentation to the business on the benefits of agile acceptance testing. Most of what learned was from Gojko's book which I would highly recommend if you are struggling to articulate and convince your business the benefits of agile acceptance testing.
Read the following:
The book list has had the most changes as this is often so dependent upon the work you are doing at the time. As it happens I have started both Working Effectively with Legacy Code and Pragmatic Programmer but finished neither. It's a terrible habit of mine to have several books on the go at once and I'm not sure if it's to my benefit but I usually finish what I start so I'll get through them eventually. On the plus side I've read Bridging the Communication Gap and now have a copy of Jon Skeets C# book as after seeing him at both FOWA and DDD I figured if he can't help me understand the depths of my language of choice, no one can!
Blog more
This is definitely where I haven't kept up my resolution. I did blog on the 7digital developer's blog but I'm still averaging less than one a month, which wasn't the plan. Must do better next time!
Attend more varied events
I'd say this is a work in progress. I have branched out a little attending talks on F# and CQRS, which are both subjects I know very little about.
Give something back
My original goal was to somehow help get more women in technology, but I have to admit I haven't yet figured out how. This is a bigger issue than the scope of this blog post but it is something I do want to put some effort into. First step, attend the next girl geek dinners event. On a positive note I continue to organise events for LDNUG, the last one being an event on mixing functional and OO approaches in C# at skillsmatter.
Goal changes
I think overall I am actually doing quite well at working through this years goals. I'm still happy with the current plan, the only additions/changes I would make would be to learn more about the latest CQRS buzz, but I plan to attend a talk by greg young at skillsmatter this very evening to see his take on it. I've already seen Udi Dahan and although it seemed interesting and certainly applicable to much that we do at 7digital I wasn't 100% convinced it could be easily applied to our current architecture. Perhaps Greg will shed even more light and I'll share my findings right here, helping me further achieve this years goals.
Sunday, 7 February 2010
DDD8 Review
Last weekend I went to my first DDD (Developer, Developer, Developer) day, which was a really fun and interesting day with some excellent speakers. It's probably one of the best conferences I've been to and I have been to a fair few. The reason it's so good is because of the calibre of speakers and content. I believe this has to do with several factors. Before the conference, the sessions are submitted and voted on which means we get more of what we want. Another factor is although there is obviously some input in the form of sponsorship from Microsoft, being that they host the event and that it is .NET focused, it isn't a Microsoft event where Microsoft products are being pushed. The sessions were more balanced and focused on not just .NET technologies but also technologies which you can use to improve your applications including Ruby for testing which Ben Hall covered in his session.
So here's my two peneth worth for the sessions I attended...
Mixing functional and object orientated approaches to programming in C# - Mark Needham
This was a great introductory session to using functional language capabilities which were introduced in .NET 3.0 with lambda expressions. The second part of the session was of the most interest for me as Mark introduced the idea of using lambda functions and actions to replace interfaces in design patterns such as the command and strategy pattern.
Multi-tenant ASP.NET MVC Projects (Or 30 very different customers and a single codebase) - Rob Ashton
Robs presentation was on how to overcome the problem of having a single code base which provides the flexibility for meeting the varying requirements of different customers. His solution uses controller factories to select and build controllers as you want, which is worth investigating. The slides are available here.
C# - Jon Skeet
This talk was hugely popular taking up two rooms. He spoke in his usual engaging style about the new features of C# which included Named Arguments, Default Parameters, General Variance(Covariance and Contra-variance), Dynamic Typing and better COM Interop, essentially bringing C# more inline with VB which wasn't of the most interest to me, being in the web development world. The best part of this talk for me was having General Variance explained in a manner I actually understood. I only wish Jon had been a lecturer in every subject I learned at university. I won't try and re-explain it here as I wouldn't do it justice!
C# on the iPhone with MonoTouch - Chris Hardy
If you have a great idea for an iPhone app but are put off by having to learn objective c then this is a great alternative, but the downside is the $399 cost for a MonoTouch licence and you need a mac and an iPhone so it's a pretty big investment up front. Really cool though and the IDE is nice as well.
Testing C# and ASP.NET applications using Ruby - Ben Hall
This talk was on how to test your web apps with tools and languages outside of the .NET framework. Choosing the right tool for the job and not restricting yourself to a language. Ben chooses Ruby as it's easier to read and show your intent which is the whole point of testing - showing what your app should do! Ruby is much more natural and I was really interested to see WebRat which I hadn't even heard of being used as a DSL to drive selenium which allows you to test in a headless browser. His slides are available here.
Lastly...
I would like to thanks all the organisers, sponsors, helpers and speakers for this fantastic event and I really look forward to the next one.
So here's my two peneth worth for the sessions I attended...
Mixing functional and object orientated approaches to programming in C# - Mark Needham
This was a great introductory session to using functional language capabilities which were introduced in .NET 3.0 with lambda expressions. The second part of the session was of the most interest for me as Mark introduced the idea of using lambda functions and actions to replace interfaces in design patterns such as the command and strategy pattern.
Multi-tenant ASP.NET MVC Projects (Or 30 very different customers and a single codebase) - Rob Ashton
Robs presentation was on how to overcome the problem of having a single code base which provides the flexibility for meeting the varying requirements of different customers. His solution uses controller factories to select and build controllers as you want, which is worth investigating. The slides are available here.
C# - Jon Skeet
This talk was hugely popular taking up two rooms. He spoke in his usual engaging style about the new features of C# which included Named Arguments, Default Parameters, General Variance(Covariance and Contra-variance), Dynamic Typing and better COM Interop, essentially bringing C# more inline with VB which wasn't of the most interest to me, being in the web development world. The best part of this talk for me was having General Variance explained in a manner I actually understood. I only wish Jon had been a lecturer in every subject I learned at university. I won't try and re-explain it here as I wouldn't do it justice!
C# on the iPhone with MonoTouch - Chris Hardy
If you have a great idea for an iPhone app but are put off by having to learn objective c then this is a great alternative, but the downside is the $399 cost for a MonoTouch licence and you need a mac and an iPhone so it's a pretty big investment up front. Really cool though and the IDE is nice as well.
Testing C# and ASP.NET applications using Ruby - Ben Hall
This talk was on how to test your web apps with tools and languages outside of the .NET framework. Choosing the right tool for the job and not restricting yourself to a language. Ben chooses Ruby as it's easier to read and show your intent which is the whole point of testing - showing what your app should do! Ruby is much more natural and I was really interested to see WebRat which I hadn't even heard of being used as a DSL to drive selenium which allows you to test in a headless browser. His slides are available here.
Lastly...
I would like to thanks all the organisers, sponsors, helpers and speakers for this fantastic event and I really look forward to the next one.
Monday, 25 January 2010
//TODO 2010
I had planned to write this blog at the very start of the year, but having only just started a new job at the end of last year, which would finally give me the opportunity to work in an agile environment where I can practice TDD and BDD, apply design patterns and SOLID principles and refactor code, I wasn't certain what I wanted or needed to focus on for the year ahead.
However, nearly a month into the year, I fell down the stairs and find myself instructed not to move with my leg elevated, finally giving me the time to clarify my plans and goals. The first of which is to be more careful around stairs!
My goals for last year were to understand design patterns, refactoring and clean code practices. I also learned MVC and a few other technologies along the way, but not having much opportunity to put these in practice became increasingly frustrating so I focused on practicing what I had learned and seeking a company where I could apply my new knowledge and learn more, which I believe I have found that at 7Digital :)
So my todo list for 2010 is...
Learn another language
I don't believe that I have completely mastered C#, on the contrary, the language is still evolving with a new version scheduled for release in April with VS2010, but I believe delving into different types of languages, which I haven't really spent much time on since university, is beneficial in understanding what language is suitable for which problem domain. Therefore this year I want to have an understanding of at least one dynamic language such as Ruby and a functional language like F#. I'd also quite like to get an understanding of DSL's and where they are used.
Become more proficient at refactoring
I am finally in a position/company where refactoring is actively encouraged and the 'boy (girl) scout rule' is expected. This will give me the opportunity to understand and improve my refactoring skills everyday and put into practice the knowledge I have learned.
Learn to apply design patterns
I spent a lot of my spare time last year learning Design Patterns and SOLID principles and I want to discern how to effectively use these in my code - apply the theory! The people I am now working with posses extensive experience in this area which I intend to learn from.
Learn more testing frameworks
The benefits of TDD and unit testing are well known. I am now using NUnit at work but there is still so much more I want to get my teeth into, like BDD and specifically Cucumber and WatiN.
Read the following:
This list of technical/best practices books has been collated after various recommendations from people in the development community. Obviously this isn't an exhaustive list and I'd be happy to hear any other recommendations:
- Working Effectively with Legacy Code - After sinking my teeth into Head First Design Patterns and Clean Code I've been advised that this will build on my learning so far.
- Pragmatic Programmer - always quoted and highly recommended so it's about time I read it.
- Domain Driven Design - This seemed to come up in conversation regularly last year and I'm really keen to know what all the fuss is about.
- Agile Principles, Patterns and Practices in C# - I believe this is very similar to the Clean Code book but with examples in C# so I'm keen to read this too.
Blog more
I meet lots of interesting people, regularly attend varied technical events and read/code all the time so I'm determined to blog about anything I find interesting.
Attend more varied events
I already attend many events but would like to increase the scope of these and move from just .net specific to otherlanguages, frameworks, patterns and practices.
Give something back
I've gained so much from the development community in the last few years and would like to give something back this year. I don't think I'm expert enough to become a speaker on development specifically but I could use the knowledge I have gained to add something to the community which it is serverly lacking...more women! I plan to be more actively involved in getting women into technology and find it a breath of fresh air to be in a development department with not one, but two other females :)
Tuesday, 6 October 2009
Another year another inspiring FOWA
This is by far my favourite conference (despite the lack of actual code) as both the speakers and attendees are really interesting, motivated and passionate people and I walk away brimming with ideas :)
I started this blog after being inspired from last years FOWA but didn't keep it up (shame on me). However after attending again this year I am determined not to be so slack.
Last year had two streams, one technology and one business, there was just one this year which meant less tech in the sense of seeing lots of code but still lots of technologies discussed and showcased.
So the big takeaways from this years conference for me were accessibility, believe in your brand and kill your features...
accessibility...
(How to Increase the Accessibility of Your Web App - Robin Christopherson)
Firstly I was amazed at the stats for users with diasbilites (over 20% of the market share) and then even more amazed at the % of sites which don't meet even the basic requirements. Robin Christopherson put Facebook through one of the standard screen readers and it was awful, even reading out some code! However those in glass houses shouldn't throw stones and I'm embarrassed to say I doubt very much any of the sites I've ever written would fare any better, but having seen this presentation I will now be taking the time to test in this environment.
believe in your brand...
(Marketing your Web App - Alex Hunter)
What I took away from this was that to market your brand you have to believe in it and that means putting your reputation on the line for it. This stood out to me as I work in an agency environment where branding is everything and it's interesting to see that take on it. Marketing is no longer mono-directional it's now bi-directional, users can and will tell you what they think. This is a good thing and should be embraced, great eaxmples of those doing this already and doing it well are Kevin Rose (Digg) and Ryan Carson (Carsonified). By connecting with your users you can find out in real time what's good and what isn't. This leads nicely onto my last big takeway...
kill features...
This was covered by quite a few speakers (Kevin Rose, Gary Vaynerchuk, Alex Hunter to name but a few), who all pushed that in order to know what features on your site are good you have to kill them. Having loads of features but not knowing which ones your users are actually using, enjoying or even love is bad. There are two sides to this point. Firstly you need to kill some features and see if your users complain. If they don't, they don't care. If they do, if they scream and shout then that is the feature they love so kill the rest and focus on making that one better. Secondly you need good analytics that actually mean something to you in order to determine how your site is being used. Don't just install google analytics and not even analyse the excessive analytics it produces but actually decide what you need to analyse and do it well.
other cool techie stuff...
HTML5
Loads of cool stuff and it notably promises a lot with regards to accessibility. The nice flashiness is all well and good as what I imagine will be a good replacement of Flash (for smaller stuff initially) but lots of it only works in certain browsers and if, like me, you still have to support IE6 (oh when will the pain end?!?) I soon began to think by using the new features I would have the pain of making them backward compatible. I also immediately questioned how to access the text in the new validation controls as localisation is a really big thing in my company.
I've actual seen this before at a geek dinner and thought it was pretty cool then. I'm all for learning as many keyboard shortcuts as I can so intend to have a play. The only problem is I'm now a Chrome convert and I'm not sure I can cope with returning to the sluggish FireFox environment.
As a side note I noticed a lot more women at this years conference which can only be a good thing and found myself a partner in crime, the lovely Sara Stephens. We came up with quite a few ideas between us so should any of them come to any kind of fruition I'll be sure to post them on here. Not least we encouraged each other to sign up for Launch48. This weekend 'hack-day' is a platform for participants to select, build and launch a web app in a weekend. The promoters did point out that they didn't get many .NET developers last year so I'm going to abuse my twitter contacts to see if we can't recitify that this year!
All in all another brilliant FOWA from carsonified. I'm looking forward to next year already :)
Subscribe to:
Posts (Atom)