# Self-Taught Developers: Are You Missing Your Foundation?

### Article summary

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.

## 3. Algorithms

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
• 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’s Missing?

What else should be considered part of the bare necessities of a working knowledge of computer science for the purposes of software development?

### Related Posts

• Growing as Makers

## Maximize Your Experience at Developer Conferences

• Growing as Makers

## Atomic Con: The Value of Hosting an Internal Conference

• Growing as Makers

## Stay Motivated When Working on a Difficult Story

Conversation
• John Croisant says:

Speaking from my own experience as a self-taught developer, studying algorithms will definitely help a lot with writing good, clean, and efficient code. During my recent interview process at AO, I realized that algorithms and other computer science theory were my weakest area as a developer, because I had never formally studied them.

So, to beef up my skills, I enrolled in the free online course, “Algorithms: Design and Analysis, Part 1”, taught by Tim Roughgarden, an Associate Professor at Stanford. I’ve been too busy lately to finish all the homework, but I learned a lot from the videos. There are videos covering all of the algorithms mentioned above, as well as most of the data structures. I personally found some of the theory and analysis parts challenging, but the overviews, pseudocode, and other “practical” parts were extremely helpful in improving my understanding.

Part 1 of the course is nearly over now, but even if you’re not enrolled, you can watch any and all of the videos on the Preview page. For even more advanced algorithmic goodness, Part 2 of the same course is open for enrollment now, and will start in October.

• Al Tobey says:

I’m self-taught and am approaching 15 years in the field. I dropped out of music school to become a sysadmin and am a full-time software engineer today. I’ll add my advice.

Search for this: “Learn Code The Hard Way”. It’s an excellent series from Zed Shaw that aims to teach anybody to program by having them write real code. My sister is almost done with Learn Python The Hard Way and raves about it.

Data structures are by far the most useful place to spend time. Modern languages offer incredible power in simple interfaces if you take the time to learn them.

This is controversial, but IMO the vast majority of programming only requires passing familiarity with the commonly-listed algorithms (quicksort/multisort/etc.). Read the Wikipedia articles and move on. Know what bubble sort is and try not to use it. All of the mainstream languages have “good enough” sorting and hashing algorithms; there is rarely need to write from scratch except in highly specialized cases. The only time I’ve had to write any of the basic algorithms is in an interview with an arrogant company/interviewer and I refused their offer.

Try functional programming. Ruby, Perl, and Python all provide just enough functional capability to learn it without getting bogged down in theory. If you can identify a closure and a pure function, you’re doing great. Clojure is a Lisp dialect that’s gaining momentum and worth checking out. Scheme is a popular language for teaching, but doesn’t see much use outside of academia.

Security is almost never taught in schools, but is a paramount skill in today’s world. Read up on SQL injection and try both writing exploitable code and the exploits. Most of what you’ll learn there will help you along when considering security later on.

• […] Self-Taught Developers: Are You Missing Your Foundation? from our JCG partner Lisa Tjapkes at the Atomic Spin […]