Technical knowledge accumulation in software development
Usually when I come across something technical I need to lookup or do some background research at work, I start digging in the web and other resources… too deep in fact. For instance, if I wanted to study a particular technical concept related to my work, I would start reading it up on the web and almost always I would run into a prerequisite piece of information that I need know in order to understand what I’m currently reading. So I branch out from there and start searching and reading up on the prior knowledge I need, which in turn might spawn new concepts and more prerequisites that I may need to have knowledge of, in order to come up the chain of facts and understand them.
My problem is that the brain does not allow information to be read and stored in a half understood manner. If I read something on a specific topic and conclude that I truly did not understand the whole of it, I start a recursive pattern of reading and researching related concepts, facts, history and lots of other information. This can be a good thing, and at times a bad thing.
A real life scenario might paint a more intuitive picture: A few days back, I came across the STAThread and MTAThread attributes used in .Net for communication with COM constructs. I wanted to know why and how they are used in .Net, what thread apartments are, what roles the COM objects play, etc. The objective of this exercise was to be better armed with knowledge on .Net and COM communication when I go about my development work. Initially I had opened a few MSDN pages explaining the attributes in .Net, which prompted me to look up and search on COM and COM implementation, which led me to STA (Single Threaded Apartment) and MTA (Multi Threaded Apartment), which led me to…. well, you get the idea. About thirty to forty browser tabs later, I was getting ready to implement some C++ code, trying to build the COM server described in the current web page I was reading. If I had run into any errors in the C++ code, I would have started off a new search on that issue…. and so on.
The above scenario maybe familiar to some, and others maybe shaking their heads already… But looking again, isn’t this how we software developers are encouraged and motivated to work? To dig deep into facts, to read source code examples, write them and test them, and gain all the knowledge needed to master what we do not know? It is how most of us work, or at least how most of us are driven to work when we encounter something we need to learn or research at work. Thinking back for a moment on the scenario I described, my main objective was to gain enhanced understanding on the STAThread and MTAThread attributes so that I could approach my development task with knowledge, in case for example, I needed to consume COM services from the .Net application. Starting to read up on it and ending up learning COM interfaces, coding COM servers, and trying to figure out the C++ errors in the COM implementation was just me wandering away from the main issue at hand. My task was not to write COM implementations, but to implement features in a .Net application which might communicate with COM. In projects, almost half of the time you are supposed to spend on providing beneficial value to the customer is spent on recursive research in order to satisfy our curiosity to understand how something works. This results in unproductive stances and deviations from project and customer focused goals. Sating our curiosity and working hard to find out how something works is a good thing, but not when it is conducted within time slots that are meant for work. It would be more appropriate and professional when we concentrate on our knowledge enhancements outside of our work hours.
Does this mean we should go about our daily operations blindly? Not search or read up facts that will help in our daily work? Ignore what we don’t understand or haven’t studied before? That is not the case, as fact finding and doing technical research is a mandatory part of a developers daily work agenda. It is the approach and mindset of how you are doing it that matters. What I would be concentrating in my future work would be the following aspects:
- If I come across an unknown fact, forgotten concept, or anything technically interesting, I would first check whether it is directly relevant or critical to the task at hand. If not, I know i can continue my work in the project and finish some features or functionality, and after work or at home, I can continue researching and reading on what interested me earlier.
- I may come across lots of interesting information and facts, but filtering out obsolete/legacy explanations, articles with bad reputation points, and non-relevant information should be practiced. This would be a smarter and more focussed manner to gain valid and working knowledge, whether at home or work.
- Learn to read through or skim through an article and gather the relevant facts, not read the article like a story or novel.
- Have the big picture in mind. I should be able to connect and structure the disparate information I read about, in my brain. After all, abstractions, the ability to organize and model, and the ability to compartmentalize facts in our heads is what makes us who we are.
- I do not need to know everything under the sun about a topic. I can gain knowledge on that topic incrementally. Accumulating knowledge in a need to know basis and applying it in the same manner can be refreshing and produce faster results.
I cannot be certain that what I have listed above is the best approach, but for me it would be a step in the right direction in being productive at work, enhancing and adding value to the customer, as well as increasing and gaining knowledge and expertise in the workplace. Of course, I will be hacking away at code and reading facts, articles, ebooks etc in my free time, but in a more analytical minded approach rather than in haphazard fashion. Though the title of this blog mentions technical knowledge, it can be anything we want to study or have more knowledge on. The end result is to have an analytical and filtered manner of accumulating knowledge where you learn more things in less time, and increase your efficiency and productivity at work or home.