This morning, when I took a look at twitter, I noticed a direct message from Michael Bolton on my latest blog entry on learning:
In your blog post on learning, you’ve left out community, and bafflingly to me, practice.
Wholeheartedly I thanked him for the idea for today’s blog entry.
Seems I assumed too much in my last blog entry. I thought I made it obvious, but it seems that I missed to put practice into the blog entry on learning. Looking back, what I did in order to learn, was to dig deeply into theory, and directly apply it the next day. Here is an example.
At a certain point, I read about Computer Organization and Design. The authors Hennessy and Petterson explain many of the underlying concepts for today’s computer systems. They explain how a CPU works, how USB works, the mechanics of pipelining, memory allocation, and much more.
Being a math guy back in school, I paid particular attention to the chapters on converting numbers – and how mistakes could happen at different levels. Just about that time I was dealing with our system. There were two major components, one written in Java running on a JBoss application server, and the other written in C/C++. There was an XML interface between the two. The C/C++ component was the master of all currency related data, while the JBoss application stored all the business relevant data like customer data, and addresses and so on.
There were some pass through services in the JBoss application server that infected the balances in the system. This system was all about tariffs, prepaid, postpaid, and convergent billing. There were certain postpaid tariffs where a certain amount of money needed to be deducted based upon a monthly fee that needed to be paid. Unfortunately that amount could be pro-rated based upon the amount of days the account was active in the current month. Of course, the pro-rating changed based upon the amount of days per month as well. The interface between the Java component and the C/C++ component dealt with a percentage value in floating point notation.
I found a bug in that interface that was based upon usage of double precision floating point numbers rather than 128-bit floating point numbers as used by Double-typed variables in Java. That bug could lead to a miscalculation for large amounts monthly fees in certain months, because the conversion from binary to decimal digits in that case couldn’t carry along the right amount of fractional digits in the C/C++ component. The balances where calculated with six digits of precision.
I was only able to find that (maybe rare) bug, because I had understood the inner workings of binary and decimal maths. I was only able to find that bug because I dared to try out. I dared to practice this skill.
Practice is a key ingredient to incorporate lessons learned. I practiced when I read about LDAP, and I had to immediately try out stuff the next day at work. At times, I even couldn’t wait that long, and needed to give it a try right away. Thereby I was able to learn not only the theory of how it should work, and take that for granted. Instead I could play around with my inner concepts of how it should work, and how it really worked. There were many more things that I directly had to try out, and I consider practice a prevalent thing that professionals learn from. I even dare to state that you cannot learn without putting your knowledge to practice. That was my assumption yesterday. That’s why I left out the obvious.
When it comes to community, I dare to state that communities weren’t my first learning source. If I recall correctly, it took up to reading Lessons Learned in Software Testing back in 2007, before I joined any mailing list. From then on, I dived deeper into mailing lists. Right now, I joined countless of them – and I muted lots of them. There are a couple mailing lists that I deliberately want to have a peek here and there – just to stay up-to-date.
But there’s more.
There are more and more online communities. Some of them meet up on Skype sessions, some on twitter, others in direct forums, like the Software Testing Club, or the AST forums. You can find lots of helpful folks there, and it only takes a few days to receive a helpful response in case you have a question (and present that you did the most basic research on your own rather than engaging in Let-Others-Work mentality).
Communities are a great resource for your learning. However, I found out later than my first course about this. It helped me shape in the long-run, and I didn’t need communities to get started. This might be about the time I was learning, and communities only grew later, but it might also be about me being unaware of those sources.
I think there is more where you can go and learn from. But remember this: if you can directly apply stuff the next day back at work, your learning will stick deeper. Of course, you probably need to have the right amount of slack that play around with new ideas. You need personal freedom to master that new skill. If you don’t have it, then you probably need to invest some of your personal time.
Some folks claim that you need at least 10,000 hours of deliberate practice before reaching mastery for any skill. That might be true, and some folks claim that I invested a lot of my time in the early days. Might be that this time paid off in the long run. I joined this field in 2006. That is eight years ago. I am not so sure about where I currently ended up, whether it’s the right path, and whether my early pays off, or burns me out. Only time can tell that to me. Time will also tell you. Keep patient.