Is abstraction is what which makes code look smaller, simple and easy to understand? I was looking for the dictionary meaning of the word abstract and found that abstraction is some thing like “You flip the switch and light comes on”; as an end user I do not worry about the internals as long as I flip the switch the light comes on. While this is very applicable for the end user what about the electrician?; does he need to deal with this level of abstraction? The electrician needs to have an understanding of the internal wirings and the load the switch is capable of handling, in order to maintain or make repairs.
In software world I have observed something similar, whenever my peers refer to bring an abstraction, mostly they meant to find a word to compress the steps of doneness. Abstraction means you as a developer becoming an end user of a part of the solution, where you do not need to worry about the internal workings. Compression is finding a term to represent the entire process underneath which will be commonly understood by all the developers. An analogy of this to a restaurant kitchen is the word ‘marinate’ is not an abstract term, every one in the kitchen understands this and the chef merely has to say “marinate the meat for 20 mintues, use the secret sauce”. The situation would be different if the process of marination is automated and you have a machine to do that, in that case the staff is end user of that process and not part of it and hence s/he is abstracted from what marination is.
What holds good in a regular development life cycle, abstraction or compression?
Richard Feynman illustrated a point about involvement and productivity in the book “Surely you are joking My Feynman”. There was a big team of physicists working with every possible resource available to create the atomic bomb. As part of the project they were supposed to do tons of calculations and hence hired the best mathematicians in the country and placed them along with expensive computers to churn the necessary calculations out. Since the project was top secret, the mathematicians just received the problems; in spite of their level of expertise, the performance was found to be too mediocre.
Feynman took the tough decision of disclosing the project secret to enhance their productivity and convinced his superiors to help him to do so. He got a buy in and went ahead in explaining about the nature of the project and why it is necessary for them to come up with the bomb before any other country comes up with their own. As expected by him he found the productivity to increase many folds when they knew the end goal and its importance. His idea of treating them not just as a facility for mathematics but involve them to be as part of the project has paid rich dividends. He has observed that the mathematicians became very inventive to make use of the limited availability of the computers and took extreme care to iron out inefficiencies.
This is a real life incident and I have also heard many times about “difference between laying the bricks and building the cathedral”. In the software building world, the bigger picture never gets painted to the entire team and often the talent is overrated than how the job can be taken to the finish line. Unless every one in the team has a strong sense of ownership towards the goal, the peak performance never occurs. Getting the whole picture can also give an illusion of a time consuming activity, but benefits out weigh the time spent on that activity.
What would happen if the captain of the football team need to yell to every one the field on what to do next, wont it be a terrible team to play with?
Is it not cool to look like James Bond and attack every problem coming to us at runtime ? My answer is, it does not take us too far if we are not using the manuals for the tools we use unless it is extremely simple like a hammer and has only two steps to use it.
I some times wonder that if search engines had made people lazy to learn something from the grass roots up. This is not just an one off observation, I have known developers who thrive on search engines for everything from silly to complex ones. Of course, the search engines made a huge repository easily accessible to us; but not everything can be solved using them. If any one argues that they can get lots done just by intuition, analysis and net search then; why not we have technological marvels built by almost everyone.
We should not shy away from understanding the details or referring the manuals (It is not cool to act like James Bond). Only with a strong understanding of foundations we could go very far or tackle difficult situations with ease.