Archive for June 2010
Recently I had an interesting conversation with a couple guys at my client site. One of mentioned he heard about my presentation at a recent user group and also saw my invite I sent out for an internal Domain Driven Design study group and asked “How come you like work so much?” The other guy then said “I think it’s something that is just different about Americans versus people from other countries… they’re workaholics man! I mean, I heard that Ryan always works weekends.”
I simply corrected them… yes, Ryan is a workaholic and in my opinion he is overexerting himself. But I don’t consider my programming, reading, and speaking that I do on the side as work; I just love software development and it’s something that has interested me, both from a technical and social standpoint. It just so happens that my job has me doing something that I love (although dealing with a mess of legacy code isn’t always enjoyable). There’s a huge difference between working all the time and doing what you like to do in your free time; and you won’t catch me “working” at work more than forty hours a week.
I think it’s important that people do what they love to do because at that point their job isn’t just something they do through the week while waiting for the weekend to arrive. One of the best stakeholders I ever worked with on a project was a guy from marketing and guess what he does in his free time? We were out at dinner once when he and the rest of the product owner team was in town he confessed what he does when he gets home from the gym after work: he plops down in front of the TV and watches recordings of commercials that were recorded throughout the day. He doesn’t watch any shows or movies… just the commercials. Another friend of ours is a math professor and she enjoys solving math problems in her spare time. I know I would go nuts if I spent my leisure time solving math problems! But it is what she likes to do and her job just happens to be related to what she likes to do.
Now, I don’t think that in order to be a productive developer (or even just a really good developer) you have to code in your free time all the time and this guy really misses the point. I definitely don’t think that companies should make it a requirement that they hire only people who code in their free time because otherwise they might miss some really good developers who just do what they like to do in their free time. But I think that someone who really enjoys software development and spends their free time improving their skills at their craft and doing it just for fun often happen to be much more remarkable.
Enjoying software development in your free time doesn’t always mean you’re going to really love your job. As Chad Folwer once pointed out, What Would You Rather Be Doing? However I think that when you do something you love you will find it fulfilling and sooner or later you really will either land the job you love or you will motivate radical changes at your current workplace to make enjoyable not just for yourself, but for the people you work with as well.
Are you doing what you enjoy doing?
Last week’s scala kata was a bit challenging as it required a bit more advanced scala knowledge than the katas I’ve done so far. Breaking from last week I’ve decided to head back to the basics and dream up a kata to help focus on some of scala’s language features versus a full blown program.
For this week’s scala kata I decide it would be interesting to model the Weekday Heptagram. Conceptually the kata should be to take one of the seven Stellar Objects ( Saturn, Jupiter, Mars, Sun, Venus, Mercury, and Moon) and the hour of the day using the 24 hour scale and deduce what day of the week it is. For example, if it’s the 1st hour of the day and the stellar object is Saturn then it is obviously Saturday. If it is the second hour of the day and the stellar object is Saturn then it is Monday. See the table near the top of this page for additional examples to use for your specifications.
Other operations that could be useful include:
- identify the dominant stellar object for a given date/time
- given a day and hour what is the stellar object n hours from now
- given a specific day and hour, what are the stellar objects for that hour for the remainder of the week?
Hopefully this should be a fun little coding exercise.
Lately I came across this posting on an agile related mailing list. I know that job postings on these lists are often a low hanging fruit for criticism, but I really just could not help myself.
THIS IS NOT A PM, but a SCRUM MASTER POSITION. The right candidate needs to have background as a technical lead in J2EE AND a recent background in management and/or Project Management
The Scrum Master will be responsible for managing the Scrum activities of 4-6 Java Developers. He/She will need to deliver quality software releases on time and within budget. This person will work closely with development staff to develop delivery plans, monitor and control development milestones, complete software designs and documentation, serve as the point of escalation to resolve technical issues, and will mentor and coach junior developers. They will be accountable for enforcing development standards and best practices, and ensuring the team is delivering on its commitments.
* Proficiency with Microsoft Project
* Posses a good understanding of Project Management practices, plus good planning and organizing skills
* Be the right mix of management and technical skills, background and expertise
* Have 3+ years experience as a senior software engineer, technical lead, technical project manager, or software development manager
* Have proficiency with the JAVA language and in Web technologies
* Have experience with Test Driven Development practices and their implementation
* Possess strong written and verbal communication skills
You might take this post as saying I dislike Scrum and it’s not. My annoyance is all these high profile companies jumping on the bandwagon and renaming their project manager position as Scrum Master, hiring them by the buttload and teaching them the wonders of gnatt charts, microsoft project, and “managing the development staff” (aka watching over the serfs) and then dumping them onto the open market with freshly minted resumes listing Scrum Master as a position previously held.
Now when a company really does get serious and wants to adopt Scrum, they’ll search for a Scrum Master to help their teams out and hire one of these guys, further spreading the poison. Then said company will have disastrous results and either “learn that agile just does not work” and switch back to whatever process they had before or keep the course with a pseudo agile setup that will cause people to only complain about how much they hate agile.
What’s the solution to this mess? In my opinion “Fake Agile” is the biggest threat to our industry as only widens a certain problem and puts a nice doormat over it.
About a month ago I purchased Innovation Games off of amazon… partly because I have a strong interest in facilitating interactive activities to learn and solve problems (which is what we do with retrospectives) and partly because I heard some subtle buzz about it. When I saw that another person on the retrospective mailing lists tried a variation of one of the games as a retrospective activity, I decided to try the same on my team as well.
In a couple previous retrospectives one of the things that people noted they’d like to do differently is have a retrospective that focused on technical issues as most of the subjects we discussed were collaboration, team dynamics, etc (which is a good thing!), so this retrospective had a very technical focus.
Here’s the agenda I cooked together:
- Set the Stage / Agree to Kerth’s Prime Directive
- Remember the Future
- Wrap Up with Three H’s
I started by welcoming everyone to the retrospective, gave an overview of the agenda and stated Kerth’s Prime Directive asking each person to agree to it.
I then moved onto the speedboat activity, drawing a speedboat on poster paper with waves, stating “we always want to move faster and let’s say that moving quickly is represented by a speedboat. Given our current system and tools, what are some of the anchors? That is, what are the things that slow us down?” I then drew some anchors from the boat, then some rocks along the bottom and continued “and further, what are some of the things in our codebase that don’t slow us down, but they’re a risk?” The team then spent the next 15 minutes jotting down issues related to design, code quality, etc. and posting them as anchors and risks and then we spent a quick 10 minutes discussing them in slight detail.
Moving on, I put a new poster paper up and told the team “Imagine that it’s June 2011. You just came into work, updated your working copy from revision control and get to work. What has changed that makes your life easier? What has changed to cut these anchors?” People placed several post-its up with changes that we often call “pie in the sky refactorings” that represented wide sweeping changes.
Once the posting died down I moved the post-its to the top of the page and drew a line across it and wrote June 2011 above it and December 2010 below it. “Now let’s think back six more months. What were some of the changes that took place that helped support these aspects of the system in June 2011?” Again another flurry of ideas that were closer to reality popped up. Now I drew another line and under it I wrote “June 2010″ and, with a few laughs from the group, stated “Now think even further back… what happened in June 2010 that allowed these changes as of December 2010 to come to fruition?”
More ideas, some even doable popped up. We had some small discussion and then finally, on a new poster paper I wrote “Right Now” at the top and asked “So, coming out of this retrospective, what can we do that will help us support these changes next month?” The ideas were small and simple to implement, along the lines of “replace Integers representing years with a Year object” and “remove dependency on BarFactory from FooRepository “.
We then wrapped up Three H’s… a quick survey of what Helped the retrospective, what Hindered it, and what people Hypothesized could improve it in the future. Overall we were quite pleased with the outcome and I’m interested in mixing in ideas from Innovation Games in future retrospectives.
Tonight I gave a presentation at the St.Louis Java SIG on Google Collections. Here is the presentation that I made with Prezi, but like always the presentation is much more effective in person as it mostly served as a visual aid to talking and live examples.
If I really had to sum up my points from the talk, I’d say it was this:
- Immutability for the win!
- Explore the API
- MapMaker is SWEET
I think there should be enough source material on those two links to get started. The true acid test is being able to shuffle a deck of cards, encrypt a message, and then decrypt it using the deck. Bonus points if you can send people encrypted messages that they can decrypt on their machine using your program.
Last night I completed this weeks Scala Kata to generate Pascal’s Triangle using a List of Lists. Although it works, I’d like to see if there is a better “scala way” to get it done. I’ve also discovered that List in scala is immutable so all those times I’m adding elements to the List I’m not really adding to it… I’m creating a new list and re-assigning it to the variable. I also see it’s going to take awhile to break free of the conditioning that java has put me through.
Don’t look if you still want to do the kata, otherwise take a gander and let me know how I can improve the internal design.
In my earlier post I showcased doing a simple factorial code kata using scala and today as I was driving home from work I was thinking… isn’t there some way to dynamically add methods to an object so that I can just write
10! and have it compute the factorial?
The answer is yes, kind of. You don’t really define a new method that gets tacked onto an existing type, but rather define an implicit method that gets called to “implicitly” convert one type to another.
Here’s some examples to illustrate:
Given n = 1, then the result should be List(List(1))
Given n = 2, then the result should be List(List(1), List(1,1))
Given n = 4, then the result should be List(List(1),List(1,1), List(1,2,1), List(1,3,3,1))
And so on. Can you generate a triangle to the 14th row as in the above graphic? How about the 30th row?