About a month ago, I wrote about software development being an art, which got me thinking about the importance of practicing alongside experienced programmers as part of the education process. A Computer Science curriculum provides important background science and strips away the layers of perceived computer “magic,” while an apprenticeship hones the practice and application of the science.
But, what if you’re missing the first part of the equation? Biologists, physicists, small business owners, and people with interesting ideas everywhere are seeing ways that software could help them and are acting to build it themselves — and that’s great! I think we’ll eventually see software development taught in many non-technical programs, just as we do with reading and writing English.
In the meantime, if you find yourself in that boat, here are a few basic things every developer should know about the science of computers and software.
1. Data Structures
Using the right data structure for the job will save you a lot of headaches. Not only is an associative array more clear in intent than two arrays with related values, you’ll write less code and (chances are) it will perform better because you’re using the data structure for its intended purpose.
Work to gain an understanding of the strengths and weaknesses of even a few relatively basic data structures and you’ll be much more prepared to deal with the varied challenges that come your way. I recommend at least the following:
There’s an incredible depth to this topic, but that should be a great start for many practical programming needs.
2. Boolean Logic
Boolean logic is an essential topic, and one that’s easy to dismiss because it seems relatively simple. But its apparent simplicity can also be a stumbling block when you, inevitably, make a mistake. Who hasn’t messed up the negation of (a && b) at least once?
Having a solid grasp of at least basic boolean logic makes it easier to spot those embarrasing mistakes and confidently flip statements around so they’re easy to comprehend.
Don’t let the word algorithm put you off — it just means a series of steps you follow to accomplish a goal. By that definition, you’re creating an algorithm every time you write software, which is why this topic is so important. Learning how we’ve solved well-understood problems in software along with their respective performance characteristics will help you better understand the performance and complexity of your own software.
These are a few areas in the vast realm of algorithms I recommend starting with:
- Recursive vs. Iterative Algorithms
- Binary Search is a good case to study
- Big-O notation for classifying performance
- Basic Sort & Search Algorithms
4. At Least a Little Set Theory
Relational databases are extremely prevalent — you’re probably working with one now or will be someday soon. Do you know what a cartesian product is? Or that the results of that SELECT statement you’re writing are a set projection? You should.
Projection, union, intersection, complement, and cartesian product are all examples of set theory operations you’ll encounter writing SQL statements against a relational database. Sean Mehan has written a nice overview of Set Theory and SQL Concepts that would be a good place to start.
What else should be considered part of the bare necessities of a working knowledge of computer science for the purposes of software development?