Wednesday, December 5, 2018

Switching to Software Engineering as a Career

Recently my wife's friend reached out to me about her husband's desire to switch careers. Primarily he wanted to know how I went from being a Quality Assurance Engineer to a Software Engineer and had a variety of questions. Below is the email he sent me (names and a few other details changed), followed by my response. His situation that is not mentioned is that he also has a family with children.

Email

Hey Marc, 

This is Octavian, and your wife gave your email to my wife so that I could ask you a few questions about ways to transition into the software industry. I have a bachelors from <University> in Mechanical Engineering and am having a hard time finding a job in a place that we want to live. We are currently living in <the world somewhere> and it is just too expensive to live in this state, so we are really hoping to move back to Utah if possible. I know that there are a lot of opportunities in Utah for software development, and would be interested in learning more about possibly switching careers. 

Your wife said that you think the best way would be to teach myself how to code. What do you think are the most important coding languages to learn? What is being used the most, what are companies wanting their employees to know the most these days? Also, what type of things do you need to know for the coding challenges that you mentioned before? Do you have any suggestions for ways  to teach myself? Apps, videos, websites? Also, Andy said you are not a fan of coding bootcamps, but I was wondering more about your thoughts on that. And do you think that if I can effectively teach myself to code, is it really likely that I could get a job at a good company? Would they overlook not having formal education in programming? Thank you for being willing to help, I know it is a lot of questions, but I appreciate it. 

Thanks,
Octavian

Response

Hey Octavian,

I am happy to share what knowledge I have, but be aware that I am not an expert in the area of tech recruitment or what companies will be looking for. Also, my opinions and knowledge have come from my own experience and from what I have picked up speaking with others. For that reason, I would recommend taking everything I say as a good starting point, but definitely vet the ideas before making a decision. For example, I am not a fan of bootcamps (which i will get to shortly), but that doesn't mean you shouldn't do them. Indeed, it may actually be beneficial to do so (as we will discuss).

Bootcamps

There are several good bootcamps out there that will teach you the basics of programming and make you fairly competent in a small area of expertise (most of them teach website creation). Bootcamps are a great primer and launching point for many people who have never previously done anything technical or struggle with the basics of logic needed for software development. However, there are several cons to be aware of:
  • They are expensive. Expect to pay $10k+ for any bootcamp worth attending.
  • Many Bootcamps will help get you a job, but is it a job worth having?
    • Anecdotal evidence - we had three contractors come from a job placement program at Dev Mountain. Their job was manual quality assurance testing.
      • Manual QA Testing is losing favor in many companies and may not be something people hire for much in the future
      • Quality Assurance requires a specific mindset and personality to handle the mundane repetition inherent in the job
      • My time as a QA engineer was often filled with nothing to do, which I was required to find something meaningful to fill it with (which I spent learning to program)
      • Most QA jobs don't utilize at all the skills you learned in bootcamp, so you pretty much just paid a finders fee to the bootcamp (who is also paid a fee by the company you are placed with most of the time)
    • If the job is not in QA, is it going to be a job that pays well? I don't have any data on the types of jobs or placement rates or placement locations, so do some research to see what life after the camp offers
  • Most grads of the camp are not actually well prepared for the type of work they go into (again, anecdotal as most people I have talked to go into QA jobs, which skillset is very different)
  • Bootcamps tend to focus on the "hottest" tech versus the sound principles needed to succeed as an engineer
After considering those points above, I would mention that I don't think money spent on most education from a reputable source is ever wasted. In this case, the idea of "reputable" comes into question for me and I am not convinced that it has worked out as many hoped. More research on this would probably be good.

Alternatives to Bootcamps

The alternative approach to bootcamps are also largely based on my own experience and are anecdotal in nature. That being said, it doesn't mean that there isn't merit in my advice. Some of the best engineers here at my job are self-taught, and some have never even graduated from college. They also have been doing it for years and years, so that experience has propelled them to where they are today, but that doesn't mean you can't spend the time to get their yourself.

University - Still an option?

I know that for the most part people in your situation will not want to consider going back to a university. It is true that it is probably going to be more expensive and will be fraught with other issues. I wouldn't rule out the idea though of getting a BS in computer science or software engineering. It will mean a four year degree, but your odds of landing in a field that you actually want to be in is increased. 

Another option that I have seen which I am a fan of is going back to school for a Masters degree in something like Information Systems, Data Science, or Computer Science. These degrees may require some undergrad work before you can apply, but they will certainly make you far more employable (and at a higher salary I might add) then a bootcamp would offer. I have seen it done and it is not a bad idea. In my opinion (for what it's worth), the accreditation a University brings to your degree is worth far more than the certificate you will get from the bootcamp, not to mention a much deeper understanding of basic programming and software development principles. Also, you can get internships as a student at bigger companies that will pad your resume faster than a bootcamp will (and the likely jobs you would get from a bootcamp won't look as good). So I wouldn't count this option out without further investigation into costs and capacity to attend.
Learning to Code on Your Own

Learning to code by yourself is probably my favorite option for those who are truly driven to make a switch to software development but still want to maintain a quality of life for their family. My personal journey from being a Quality Assurance Engineer to a Software Engineer required that I spent a lot of time learning the fundamentals of programming that I didn't receive in school. It may be worth noting that my formal education in software development was minimal, really only consisting of three official classes and a few projects that I more or less struggled through on my own because of teacher incompetence.

Why do I think this is my favorite option? For the following reasons:
  • As mentioned above, I found teacher incompetence in school to be some of the biggest hangups I had later in getting a job. My teachers were not CS professors, so my experience is skewed, but it does highlight an issue you may run into going to University or Bootcamp.
  • So much of what you learn in these schools will be done by yourself anyways, meaning that you will pretty much end up being self taught regardless of the option you choose.
    • Worth mentioning that there is great value in having someone to look over what you have done and critique it. You can probably hire someone for a fee to critique your code and save lots of money in the process.
  • The projects you work on can be much more personally relevant and, therefore, more fulfilling and fun. Academia is so caught up in projects that are easy to grade that they don't make it fun or personally relevant.
  • Free online courses will be able to cut out most of the cruft that you don't actually need that a university degree will give you, and will be more in depth and useful than a bootcamp.
  • You can start now and don't have to worry about schedules. Online learning is great at fitting into anyone's schedule.
  • The experience is tailor made to your interests/career aspirations. Want to go into machine learning? Then skip all the stuff on website development and go straight to the goods.
  • Both paid and free options are available for you to learn, so you can use your budget more wisely to focus on learning needs.
Cons of this approach are plenitude, so here are a few that I think worth mentioning:
  • You are only as good as your ability to prove yourself. In other words, if you aren't given a chance to show what you can do, you won't ever get a job. This is where an accredited degree or bootcamp would come in most useful.
  • Your first job may be a much riskier job than you would otherwise receive. In other words, you may get a job at a small company doing very basic website design and getting paid little to do it. But, remember that experience is worth its weight in gold.
  • The industry is still relatively young and so it is uncertain what will happen in the future in regards to those who are self-taught with no experience. It may be that suddenly the industry will require certificates or degrees, so there is always that risk.
  • Without guidance from someone who is "in the know" of the industry it will be harder to know what you will need to focus on. Getting that sort of help for free or even cheap can be difficult.
  • Finding a mentor to do it for free is going to be hard. Paying someone to do it may also be difficult. Mentorship of some sort is very valuable so it may be good to think about the benefits a University or Bootcamp could provide if you can't find a mentor (unless you are confident you can do it alone).

Languages

Perhaps the thing I am most often asked is "what language should I learn?" when someone is interested in transitioning into this field, and so it is no surprise that you ask it to. The answer is, as always, "it depends." What are you looking to do? Likely you have no idea what field of software engineering you want to go into (they are quite different actually). Also, the idea that a particular language is going to get you a job is more or less irrelevant - a good programmer can pick up the majority of the syntax and useful features of a language within a month, and can be a useful contributor to a project of a new language even sooner than that. 

But, you have to start somewhere, and getting familiar with a language does have some bonuses when it comes time to get a job. Therefore, here are my loose recommendations:
  • Web Development: Javascript
  • Data Mining/Machine Learning: Python
  • Application Development: Java
  • Server Administration: Python
  • Embedded Devices: C or Java (not really sure, i don't know what language is used on these things)
  • Scripting Jobs (such as data mining jobs): Python
You may think from the list above that a good general purpose language to start with may be Python, and in some ways that is true. I warn you now though that Python does some wonky things that don't translate very well into other languages. I would recommend that you start with Javascript if you don't know what you want to go into as it has several advantages over the others (such as the size of the potential job market, and the fact that it bridges several different types of paradigms when it comes to programming in general). But do not let a particular field's chosen language stop you from learning the other languages - they each have some benefits and ideas over the others that will be useful in learning the skills you will need.

How to Learn and Why Coding Challenges are a Good Starting Point

I mentioned that coding challenges are a good place to learn basic programming principles because they do two things:
  1. It will test you on your ability to extend your knowledge you will learn from the courses you will take
  2. The majority of the interviews you will have (for better or worse) will test you on your skill in coding challenges and not on your ability to actually be a software engineer
Point 2 is a surprise for most people, but it is an unfortunate reality in our industry that doesn't seem to be going away anytime soon. These challenges are good at being able to assess your ability to think outside the box; but, like most jobs, the majority of your work is not going to require you to think outside of the box too much. Therefore, be cautious in how much time you spend in these challenges because they don't translate well into the actual work you will be expected to do.

That being said, coding challenges do a good job at also teaching you skills by simply trying to solve a hard problem and failing at it over and over and over. The best teacher in software development is failure and seeing how you failed so you can avoid it again.

Other ways to learn are obviously to take online courses, watch videos, read tutorials, and work on a personally relevant project. I have been working on several little side projects for years now and none of them have really ever taken off, but I can trace most of my skill and new experience from these projects. These projects have forced me to learn things that my everyday job just doesn't give me opportunities to explore.

Listed below are a few things I have found useful in my self-learning journey:
  • coursera.com
    • Has lots of great courses that play out like a traditional University course
    • You can earn certs from this site if you would like (of questionable value when it comes time for a job)
    • Several of the classes have interactive homework assignments that will provide feedback (all automated, so of varying usefulness)
    • Can be enrolled in as many as you like and can finish at your own pace
    • Many of the courses have others taking it at the same time that you can ask questions
    • https://www.coursera.org/learn/algorithms-part1 has been one of the most influential classes on my ability to program i have ever taken (by Stanford)
  • codecademy.com
    • Bite sized coding tutorials offered in several languages
    • much quicker to get through than the online lectures of coursera.com
    • more immediate feedback when trying to learn the code
    • pretty simple stuff, doesn't really handle more advanced concepts
  • youtube.com
    • great walk-throughs and discussions by experts
    • hard to determine who the expert is
  • egghead.io
    • paid courses
    • seems to focus on web development
  • udacity or udemy
    • same sort of thing, paid courses on a variety of topics
  • wikipedia
    • a great resource to introduce several topics of interest
  • hackerrank.com
    • a coding challenge website
    • good at giving you interesting problems scaled to your level
    • it is, of course, coding challenges and so see above
  • coderbyte.com
  • online textbooks
I would start off with the very simple things like codecademy.com or something similar and then move on to looking for more advanced topics to master. Perhaps the most important thing you can do is just use google to ask about the following topics (and to look for courses/lectures on these):
  • Data Structures and Algorithms
  • Object Oriented Design
  • Data Primitives
  • Functional Programming
  • Service Oriented Architecture
  • Distributed System Design
  • Application Programming Interface
  • Programming/Coding/Software Best Practices
I would also be sure to get a github account and start looking for projects that you may want to contribute to (such as Instructure's Canvas). Open Source software is a great way to learn, both by writing it yourself and by seeing how other people have tackled problems.

A Few Other Things

There are a few other things that most people don't really know about that would be invaluable in your ability to procure employment. These are just a few things and don't necessarily give you a great edge, but they are common tools and skills that you will use in the industry.
  • Version control tools
    • most common one is git (used on github). Tutorials are plentiful on using this tool. It is awkward at first to learn, but it is certainly a great tool and skill to have.
  • Project management boards
    • Trello or Jira are good examples (use Trello though, can use it now in your everyday life and is free and gives you a good grasp of how work is organized in the industry)
  • Learn SQL
    • Technically it is a language, but more importantly it will force you to understand database technologies.
    • Not listed under language because really this is a whole area of study that would give you a real edge if you were at least proficient
    • Most developers are only ok with it, but being good or even great will help in lots of ways
  • Data modeling
    • goes in hand with database tech and sql
    • a way to learn how to store data into efficient, queryable datastores
    • be sure it is a relational data model course you are taking
      • There are such things as no sql databases, but those should be avoided until you know what they are good for
      • Perhaps a primer on no sql would be good, but don't spend too much time learning about them
  • Cloud computing
    • Amazon Web Services is a good source to start as you can set up an entire stack for free
      • If you don't know what i mean by stack, that should be something to research and learn (the system stack, or computing stack). It deals with architecture, which is useful
    • Google, Azure (Microsoft), and IBM all are competitors and offer some sort of free tier stuff
    • Note that this may not be applicable in some job descriptions, but the majority of things will run in the cloud that you would be interested in doing, so learn it
  • Developer Meetups
    • a good place to network and learn from a host of experienced people (and possibly meet mentors) is to find local programming meetups
    • these tend to be language/framework specific, so may be a little too advanced initially
    • great way to develop your skills
  • Learn Linux
    • Much of computing is done with Linux, so it would be good to be familiar with it
    • Linux is similar to MacOS, so it shouldn't be too difficult to jump to
    • Windows Subsystem for Linux is a thing now if you are a Windows fan
    • Really there is no reason to not learn it and it would be good to know in any job you do
    • By learn I mean be familiar with the bash shell, the computing model it uses (such as permissions, file structures, what an inode is, etc).
    • Lots of classes and tutorials online that would be useful
Final Thoughts

I know that this seems like a lot, and in reality it is. It is a difficult proposition to get into computer programming, but right now is the best time to do it. The perks of the industry are great, the jobs are exciting and fun, and it is a comfortable way to live with several jobs offering flexible hours and remote work opportunities. Utah is chalk full of small, risky jobs, to large, enterprise level jobs. The interviews range from being ridiculously hard to being baffling in incompetency (but still will never return your call). Even if you manage to learn these skills, it is likely that it will take months before anyone hires, especially if you try to learn it by yourself. Using a university or a bootcamp has the benefit of connections, which can very much be worth the thousands of dollars you can spend. 

I hope this helped. If you have any other questions, feel free to ask. I like helping when I can :)

Thanks,
Marc