Ask HN: any advice for someone changing career to become a software engineer?

26 points by tbassetto ↗ HN
One of my friends in his late-twenty has a technical master degree (not related to computer science) but he would like to change his career to become a software developer. He is not satisfied with his current job / working field and he is already learning HTML/CSS on his free time. A bunch of his friends are software engineers (me included).

I think it is possible for him to work hard and gain enough knowledge to find a job as a junior web developer in a few months (a year?) from now. But should he focus on JavaScript and single page applications? On a specific framework? Should he still learn a server site technology and if yes, which one?

I am a JavaScript developer so maybe I am seeing this whole story with blinders. What if learning iOS or Android would be a better use of his time in 2014? I may be wrong, but it looks like the market is looking for "native" mobile developers more than web developers.

What would you recommend to him?

48 comments

[ 3.3 ms ] story [ 52.9 ms ] thread
If he is serious of continuing developing software for many years and not just jump ship because the pay is good now, learning the basics of CS is my recommendation. There are a few coursera courses on intro to CS (I think using Python) that will be very valuable. Learning about how a computer works, how algorithms work, etc are very valuable (I'm not saying to know the exact O notation of 50 sorting algorithms, but the general idea of how they work)

If he just wants to make more money but doesn't care much about programming/developing software, just tell him to go to one of those Rails/iOS/etc bootcamps for a month or two.

Thanks! That is definitely not for the pay. HTML/CSS is quick to learn and you see results right away (like wow, I built a website for my [INSERT HERE YOUR HOBBY]). Next step will likely be learning the CS basis via a MOOC.
The bootcamps might be a mistake. I learned basic CS first but I went with a sort-of bootcamp just to get some projects in and I just found it so boring.
I don't think they are that good as well, but as I mentioned, if the whole point was just to get an entry level dev job for the money, it maybe a good option.
Regardless of what language/platform he chooses your friend really needs to have a passion for this if he is to adequately self tech him self. By a show of hands, how many got into software development for the pay? I should see very few hands. Most of us are here because the idea of building something from scratch and seeing it to fruition was very appealing.

Whenever someone comes to me about getting into programming. I tell them they should think of an idea they think is awesome and start building it.

This is exactly how I got in to programming. It was desire to tinker and play with tech as well as the joy of creating something on my own that others valued. Only after working in the field and getting raises that brought my salary higher than I had ever expected did I start to think of software development as a field where money can be made. I had blinders on.
In a similar situation but I've used HTML/CSS extensively in the past with some PHP experience. My plan is to take some time off this summer and study Python full-time while working to build an idea. Hopefully that will get the ball rolling and I'll figure out what to do from there.
Agreed with the above comment about having a passion for it.

Build stuff, a lot of stuff. Most of it will be bad, but it will start to get better, AND you will start to develop speed in the form of mental patterns for getting things done. Some of those patterns will eventually change as your mentality shifts from "just getting things done" to "getting things done well" to other concerns. Software is largely a set of tradeoffs.

I think getting things done is understated because it also means learning to deal with ambiguity in features/ideas/specifications/product. This can cause paralysis for some.

My mantra is normally finding a personal problem, locating the libraries/software/hardware that's needed to fix it and then go about solving the problem using those things. Usually doesn't matter if you have no experience, one of the things you get good at is learning to pick up new technology.

Once you get good at programming it's fairly easy to drop into other languages if you need to.

Having an end goal is exceptionally powerful. Spec out your idea fully and then try to make it real.

To me, one of the most important things to learn in web development is to learn about the HTTP protocol.

This may sound boring and tedious, but if you don't know how GET, POST, PUT, DELETE etc. work then it won't do you any good trying to wrap your head around frameworks.

Learn some of the common responses and what they mean and are typically used for (200 is ok, 302 is a redirect, etc).

REST-style frameworks are just abstractions on this protocol, and a good understanding of it will help to make sense of why web dev frameworks are built the way they are.

There are millions of web bunglers in the indernet. Do you really want him to compete with them at entry job level?

You told he "has a technical master degree". and I would advise to focus coding goals towards solving problems within his domain. He might be a bad coder, but he can certainly compete to an average coder, who has no domain knowledge.

I'm in a similar boat as the OP's friend without the degree. I've been working in IT for 15 years but want to change careers to software development. Web development just doesn't excite me that much but that's where most of the jobs I could get are. I've learned what I need to already, I'd just need to hammer out a couple more projects and put 'em on Github.

I really need to know if I just need to suck it up and do that for a few years and then try to change it up or keep learning and try to follow my passions now.

I think the worst part for me is that I know how much I don't know, so I have no confidence in my ability. That said, I've always received compliments from other people about my code. It's a big barrier to overcome.

>"...advise to focus coding goals towards solving problems within his domain."

Exactly.

Every field is bound to have some common problem which is dying for an app to mobilize it, a site to collect and correlate it, some code to automate it or a framework to organize it.

Identify a problem in the native domain then figure out to leverage code to solve it.

This is exactly the sort of transition I'm eyeing, but I'm looking at it from the perspective of systems/operational tech rather than something entirely outside.

> Every field is bound to have some common problem which is dying for an app to mobilize it, a site to collect and correlate it, some code to automate it or a framework to organize it.

At first sight, we can not see one but he will keep trying to find one because it is definitely helping to work on a project that could help you in your current job.

That said, I tend to agree with gofer's comment about how it could not evolve into a position of developer in his current field. There are definitely "IT people (developers included)" and "domain experts". Maybe mentalities could be changes…

As a self-taught developer trying to break into the industry, I would happily compete with them for an entry level job (I'm 25).

Goddamn lack of a college degree holds me back over and over.

Last year this time I was a middle school science teacher with little to no technical background. Now I'm a JavaScript software engineer and I teach others how to become software engineers in my free time. Some common trends I notice among my clients who are successful:

1) Grit - the ability the struggle through problems and dig through many rabbit holes/frustrations

2) Passion - true passion for technology and trends to keep up with latest frameworks/languages/etc and patterns- generally (but not necessarily) is the first step for grit

3) Problem Solving Frameworks - the ability to create frameworks for yourself to solve programming issues including debugging, asking questions, talking to a duck, etc.

Feel free to e-mail (in profile) me and I can set up an intro advice call with your friend.

Thanks a lot, I will tell him to contact you.
drop everything, focus on only on iOS (or android).
That is the argument AGAINST being a software engineer. If you specialize in the wrong technology that goes out of favor, the market value of your experience goes to $0. It's very hard to guess what will be popular 5-10 years from now. If you pick wrong, you'll be stuck.
Isn't it the same with pretty much with almost every field? My mentality has always been that learning never stops. Even in my field, if I were to stop learning new things, I'd probably be out of the job in a few years. Always have to be up to date with new technologies and software.
Thats a bad argument. Pickup an imperative language (python), learn a function language (Clojure), and you pretty much have your basis covered with whatever the future throws at you.
I'd start on iOS just because I think it's more likely to inspire good programming habits, and the choice of tools/frameworks is relatively straightforward. Move on to the web once he's got a bit more of an idea of the basics and can navigate the landscape a bit better.
Where is he located? If it's the USA, especially Silicon Valley, then it's too late as he's too old. From what I read and comments from likes of Mark Zuckerberg the illegal practice of age discrimination is rampant. If he's willing to learn .NET and move to Ireland then all is well as once he gets good experience older developers with technical ability are in big demand. As a 43 yr old .NET programmer said to me the other day (as we watched Ireland beat France in the Rugby) "We are the most employable people in this pub and I've never been in more demand in my life".
How much demand is there for programmers with less experience from abroad? I could suck it up and learn .NET because moving to Ireland would be great.
My pal has great tech experience and domain knowledge (major global gambling firm based in Dublin) built up over the years. He's contracting and on 800 euro a day at least - naturally I didn't ask him exactly what he's earning.
Thanks for posting the link - I live in the US but have been sort of considering a move abroad. This makes it seem more favorable :)
I don't have the power to downvote, but I sure hope you're joking. To the OP, no, your friend is not too old. I would ask him to focus on learning the fundamentals (e.g. how to use a hash table, sorting, and so on.), and also write a couple of projects and put them on GitHub to gain hands-on experience.
don't shoot the messenger. The US media over the last few months has been full of this kind of stuff

http://www.businessinsider.com/software-developers-fear-age-...

Ageism in the Valley is real, but you're vastly overstating the case. A person in their late 20s is, by a very wide margin, not considered too old - in the Valley or beyond.
Given that several start-ups have come out of PhD projects, in the US at least that puts you into late twenties territory. In the UK most PhDs are ~25 if they started as early as possible.
I'm not buying it - I transitioned to full-time developer older than he is. Maybe he won't get a job at the hippest companies in Silicon Valley, but by my experience (currently doing .NET in Houston) there is a tremendous demand for programming skill in all of the un-sexy industries out there. I get like 3-4 Linkedin inquiries for positions here every time I update my profile, and I'm set as not looking. If you can get stuff done, and articulate your ability to get stuff done, then you'll be able to find jobs easily.
You say he has a technical masters, Why doesn't he pursue software development in that field? If he is an EE doing embedded hardware transitioning to embedded software could be an easier career move than generic junior web dev. There are computational specialties for every science i.e. computational biology, computational chemistry, etc. so he shouldn't have a problem no matter which field his background is in.
I completely agree, but from personal experience, it's _very_ hard to get a job that allows you to actually write code when you wind up in the sort of role you're describing.

At least for me, there has always been a strict firewall between "developers" and "domain experts". The roles are dictated by the degree you have.

Basically, as a "domain expert" you wind up doing tech support (i.e. help desk / call center / on-site training, etc) for whatever gets developed instead of actually gaining any software development experience.

Admittedly, my experience is entirely restricted to large corporate settings, so the situation is probably very different at smaller companies.

I beg to differ on this point. Embedded software development in general needs more of core CS/CE curriculum than any normal application development does (web, desktop, mobile). You might get away with learning to program for say android, or say Dekstop apps in .net without knowing OS, Automata, Compilers, C/Assembly language, TCP/IP. But you can't do without those in embedded. Besides, learning languages such as C or C++ would require more time and effort. So unless this guy has gone through much of those in EE already, this is a bad idea in my opinion. I would also argue that even if he had, still going through all those courses in theory is different from going through them with a programming mindset.
Going to be contingent on where he's located. A rough way to start: Take a look at job openings in his area, see what are the desired technologies, and have him learn them as quick as he can. He's going to be in a junior role, there's no way around it, but if he takes the hard angle of being unsatisfied with his current career, and can demonstrate he's serious with this pivot by showing off something quick he's built with his newfound powers, then getting a job should be no problem.
The dirty secret of software is scalability. Scalability to big O, big O to algorithms, algorithms to computer science. How do you like me now.

You don't want to use the right software language or framework with the wrong approach. You want to be able to reason clearly about the core problem and understand the tradeoffs of different classic solutions. Or invent a brand new approach. Or invent a framework or invent a language if necessary.

Consider this a plug for at least undergrad level education in CS. You can learn most of the rest of it on the job, but not computational thinking.

I disagree. If this person is a good abstract and technical thinker, he should be able to make the leap if he is sufficiently motivated.

You absolutely do NOT need multiple years of CS undergrad to have a sense for scalability. If you open your mind, you will see that world history is chock full of systems that have scaled -- they just don't happen to be written in binary or backed by CS degrees. And I would say that these historical systems share more similarities than you would think with scalable computer systems.

In order to be good at this kind of thing, one just needs some sense for abstract thinking -- which countless non-programmers have, we are actually not unique in that regard -- and if you are adequately dedicated, a few weeks (or a few months at most) of study time to understand fundamental algos and data structures. After one has an understanding of it, it will certainly take more time to become practically comfortable using said concepts, but that's what entry level jobs are for.

I said an undergraduate level education. By which I mean knowing the things a CS undergraduate knows, not that you go to a brick and mortar university.

They are not useless abstractions for people to write mathematical papers about. These ideas are what enable you to proceed deeper when your framework leaks and breaks.

Anyway we are probably in violent agreement.

a good CS education? from professors that have never written a line of code in their life? and have know idea how to build an application? hahaha...

The dirty secret is that most of the exciting dev work is done is small shops by guys that figure it out on SOF... and then fine tune it.

Sure, he can become a software developer if that's what he'd rather be doing. It's still (largely) a business where demonstrated skill outweighs paper testimonials of brilliance. If he actually likes programming then encourage him for sure. If he just wants to get into it because he doesn't like what he's doing now, then something else would be a better fit. Anything else, really.
I did this while I was a QA guy who was transitioning out of law in my late twenties. Progressively working through the web stack is good for learning, but I've found myself most employable as a new guy doing iOS. It took about a year.

Let people say what they want about Xcode and Objective-C, but I prefer it over working with Javascript and one of 50 frameworks.

Short version - build something that you want to build. Something that makes your live easier, or helps people you know. Platform and language aren't as important as taking a project to completion.

If you have any aptitude for this business at all, you ought to be able to pick up any language and API in a couple of weeks work, once you know your stuff. What's hard is having the discipline to get through the sloggy parts - fixing tricky bugs, adding features to your thing until it's actually useful. That's why it's best to start on building something that you can personally use. You'll have the motivation to finish that's hard to keep when you're learning something you have no use for.

If your current career involves doing anything on a computer that can be repetitive, start by automating that. Build a website or an app that does something you need. Keep working - keep adding features to whatever you build, as long as it makes sense.

If I'm doing the interview, I'd much rather hear about how you solved a real-world problem with your skills than how you spent X years learning Ruby or Java or Objective-C.

Learning language is not a big skill but having good logic is. So I will say concentrate on logic and language you can learn anytime.