[Skip to content](/content/learning/solid-foundation/#content/index.html)

I’ve written [before](/content/learning/education-vs-experience/index.html) about the importance of having a solid foundation. But what does it mean to have a solid foundation? There’s more to it than _I can do the job_. Can you do the job _well_? Do you know the things you should know?

### Know the theory

I’m not suggesting that you need to be able to define **big-O notation** at the drop of a hat (you should), but it is important to have learned the theory at some point. You should know the difference between a **class** and a **struct**. You should know when and why to use each. You should have a good idea how **memory** is allocated and how **objects** are managed. You should know basic operators and how you might optimize in most situations.

### Know your language

I’m a **C#** programmer by trade. The core **C#** offering has it’s own set of features. There are things such as **preprocessor directives** and **generics** that a developer should be aware of. **Unary**, **binary**, and **compound operators** are language features that should be second nature to the developer.

In addition to the core language, I’m also a web developer. What that means these days in the .NET stack is that I must have a solid understanding of **MVC** and **Web API**. With the most recent release of **MVC 6** and **Web API** have become one singular framework. Of course there are things like **OData** and **OAuth** to be familiar with as well.

### Make that “languages”

A more well-rounded developer may find that they need to know several different languages inside and out. You may find that this makes you more marketable as well as more valuable to your team.

As a full-stack web developer, you should also have a good working knowledge of **HTML** and **CSS**. With **HTML5** on the rise of adoption, there’s a fair amount that’s new or different. As adoption continues, your **HTML** may look vastly different than in years past.

With regard to **CSS**, you should know how selectors work, and be familiar with media queries. Learning to utilize the cascading nature of **CSS** effectively will go a long way.

### The wonderful world of Javascript

Javascript is another must-know these days. There’s little in Douglas Crockford’s [Javascript the Good Parts](http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742) that I don’t find useful. At the very least you should be aware of the lifecycle of the **_this_** keyword and how it is scoped.

There are a number of frameworks such as **React** and full-blown run-time environmets such as **Node.js**. More and more seem to be introduced each day.

I’m utilizing **Knockout.js** and **Angular.js**, which have their own ideologies and idiosyncrasies. I find the documentation and examples for **Knockout** to be far superior than what’s available on the **Angular** site. Luckily there are people like [John Papa](http://www.johnpapa.net/) who have published their own articles, such as the [Angular Style Guide](http://www.johnpapa.net/angular-style-guide/).

### The world runs on data

Of course few applications can survive without data. You should probably have at least a cursory knowledge of some sort of database.

My database experience mostly revolves around **SQL Server**. Having started with **SQL Server 7** up through the most recent release, I’ve seen more and more features added, but the core has stayed relatively consistent. As new features are added however, I find it important to become familiar with them, and add those to my repertoire.

### Know your craft

There are a variety of non-language specific concepts that you should have knowledge of as well. **Object-Oriented Programming** (OOP) concepts such as **Encapsulation** and **Polymorphism** should be second hand to any developer these days. The [SOLID principles](https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)) I’ll be covering in a future post.

I find requirements gathering and project management skills are increasingly more important as a more senior developer. It’s important to know how to gather requirements so that you may find out what needs to be done on an individual project.

### Narrow your focus

Once you gain a broad understanding of the languages with which you develop, you may find it beneficial to narrow your focus to become specialized. Become the expert with a given technology or with a more focused stack. There’s a lot to learn, and more coming out each day. With a solid foundation however you should find it relatively easy to pick up a new item when warranted.

### Conclusion

Without a solid foundation you may find it difficult to learn new concepts, as newer technologies are often built on common concepts. But, I want to know what you think. What makes for a solid foundation for a software developer? What are the important concepts to know?

[John Callaway](/content/author/ovation22/index.html)

An International Speaker, Author, and Microsoft MVP, John has been a professional developer since 1999. He has focused primarily on web technologies and currently focuses on C# and .NET Core in Azure. Clean code and professionalism are particularly important to him, as well as mentoring and teaching others what he has learned along the way.

[www.1north.com](http://www.1north.com/)

[Github](https://github.com/ovation22/ "Github")[Flickr](https://www.flickr.com/photos/136403643@N07/ "Flickr")[Linkedin](https://www.linkedin.com/in/johncallaway/ "Linkedin")[Stackoverflow](https://stackoverflow.com/users/8530080/ovation22 "Stackoverflow")[Twitter](http://twitter.com/matsubonsai "Twitter")

#### Please Consider Sharing This Post:
