Monday, January 5, 2015

Breaking Into The Software Industry Without A CS Degree

I want to start out by saying that having a CS degree will be very very very helpful in a career as a software engineer. I don't want anyone reading this post to confuse what I am about to say as me believing that a CS degree is not helpful, it is. A CS degree will introduce you to Boolean logic, data structures, code optimization, (hopefully) the ability to debug code, and at least one language. It will also make sure you understand more than just the basics of mathematics. But having a CS degree is not the only path to a successful career in software engineering.

Over the years I've worked on everything from criminal investigation software, enterprise content management systems that serve millions of pages to millions of users a day, and mobile applications for iOS, Android, and Windows Phone. I entered the industry without a CS degree; I have a B.A. in Philosophy with minors in Communications and Religion.

I also want to clarify that this post is geared towards those wanting to become professional software engineers. If you're looking to becoming a hobbyist developer, while useful and applicable, most of this will be overkill for you.

If you don't have a CS degree and you want to be a professional software engineer you're going to have more work to do than your counterparts with a CS degree. You're going to need to start by learning the basic's of software engineering. While not an exhaustive list, a good place to start would be learning the following.

Math, specifically algebra, calculus, and geometry.

Boolean logic.

Data structures (learning what they are and learning to identify when to use them).

How memory works and is managed as well as the difference between a stack and the heap is.

Debugging and profiling code.

I've often been asked how to go about starting to learn the above list of concepts. With the exception of the math you can actually start learning those concepts by diving right into a software development language. I would suggest learning 4 types of languages. Each language will give you a different perspective on the above list.

Start with assembly, move on to C++, from there learn Java or C# .NET, and finally learn HTML and JavaScript. Learn them in that order. Optionally you'd be well off learning a scripting language like perl or python. While scripting languages can be used for more heavy lifting they're very useful as languages for building tools and utilities to automate redundant and often error prone tasks.

Assembly will give you a deep understanding of the connection between a processor and code. It will help you to be aware of how much work computers need to do to use things that are very simple in code (but expensive) like loops and case statements.

C++ will teach you about memory management better than any other language while encouraging you to use object oriented concepts. C++ has a much steeper learning curve but it will teach you more about what's going on with the computer than a high level language will.

Java and C# .NET are both managed code, meaning they run in a virtual machine. The virtual machine will take care of *most* of the memory management for you. These languages will allow you to focus on learning the life-cycle of your software and software design. Higher level languages also make it easier to identify and use data structures correctly. When learning data structures you'll want to pay attention to learning not just how they work but also learning to identify when they should be used. This is going to be a requirement if you want to work for any of the big players in the industry.

I've lumped HTML and JavaScript together as one thing even though technically they're not a single language. I'm comfortable lumping them together as one because they've become so interdependent on each other for web development that you're not going to be able to be truly competent as a web developer without understanding both. Learning HTML and JavaScript will help you learn *the web* as well as help you learn the concepts of User Interface (UI) design and workflow.

This list won't teach you everything you need to know about computers or even software. But it does give you a place to start. As you get into the industry you'll find certain niche's that interest you more than others and you'll naturally dive deeper into that technology stack.

About Me

I’ve been in the technology industry for 14+ years mostly as a Software Developer. I've worked on projects ranging from a Ruby on Rails Portal, a high performance/low latency .NET search stack, R&D for building infrastructure in the cloud including automated server builds using Chef, to architecting and building iOS and Android Mobile platforms and frameworks.I've also spent some time building Android, iOS, Windows Phone, and Bada mobile applications that focused on the presentation of long form audio/video.The middle of my career was spent at MSNBC working on their content management publishing platform, their video syndication system, as well as being a co-creator of their iOS iPad framework from which the Rachel Maddow, Today Show, and Nightly News iPad apps were built.Finally, the beginning of my career was spent writing software on government contracts with a few years spent writing criminal investigation software.