Possibly the most fundamental notion in computer science is the definition, design, and implementation of how tasks are accomplished in a given functional area of a computer program. A straight forward term for this notion is Algorithm. If you take a look around as you move through an ordinary day you will see algorithms popping up all around you, even though, at first glance, they may not seem like algorithms.
For example, let's say you need to do a load of laundry. The sub tasks you perform to accomplish this task are collectively known as an algorithm. Another great example is a recipe for cooking your favorite meal. In both examples, you may not know how to do a load of laundry at first or cook a fancy meal from memory so you have to follow the instructions on the inside portion of the washing machine lid or a recipe from a cookbook.
Sooner or later, with practice, you will understand these algorithms well enough to not need the instructions. Furthermore, you may get to the point where you are embellishing the process by adding extra tasks to get to a better end result. Maybe adding fabric softener to a load of laundry or a new seasoning that wasn't in the original recipe but makes the meal taste better. You will also find, through experimentation, what works and what doesn't work. For instance, not separating colors from whites in the load of laundry may make the end result a little frustrating, even costly, or perhaps you put too much salt in your favorite recipe. Over time though, you learn how to use the sub tasks within the overall tasks efficiently to produce the expected results in predictable manner. This is the essence of an algorithm - sort of.
Though not always so, the subject of computer science is now wholly recognized as a discipline whose mastery is fundamental and critical to the success of many types of
software undertakings and which is amenable to scientific treatment and presentation. Through the years computer science, or programming to be more generic, has progressed from
a simple collection of data structures and algorithms to a craft that combines the rigid discipline of scientific scrutiny and the expressiveness of a legitimate art form.
From an academic discipline, to full fruition as, well, a way of thinking and sometimes as a way of life.
Yet, I am surprised to find that so few in our industry really understand the origins of our craft. Those that came before us and blazed the trails that make our professional lives
some much easier today; therein lies a paradox. We are not actually required to be familiar with raw computer science terms and concepts as they have been abstracted away from us. Rightfully so, in
modern software practice it makes no sense to re-invent the wheel. Nevertheless, becoming more familiar with these terms and concepts can aid us in applying these abstractions with greater skill. As our knowledge of the subject broadens our knowledge begets more knowledge, more quickly, building a foundation from which our next programming task can benefit.
I don't wish to sound like the old man wagging his finger as he proclaims how much tougher things were in his day. I just can't help being taken aback when I ask a computer science graduate if he knows
what a B-Tree is and the answer I get is "Well, I did that in school but its been a while and blah... blah... blah...". No excuse! Of course, I am not completely without sin in this area. I too have let my understanding of key computer science concepts fade into obscurity. I guess that's my main reason for putting this section on my site. I want to get back in touch with my inner-programmer. There is really no better way for me to do that than to revisit those old topics and provide them as a reference to both you and me.