While I have my own ideas, I would like to know what the smart and pragmatic people on HN have to say.
To start the discussion: * Which programming languages: Java, C#, Ruby, Scala, C++ ... * Which application domain: Web, Desktop, Mobile etc * What are the skills that are in the demand most as per your experience? What kind of skill set you are looking for in the entry level programmers when you hire? * What are the skills that will be valuable in the long run?
If I were to do a crash course, I'd say:
Java/C#
Code Complete/related software engineering books
Eclipse/Visual Studio
svn/cvs
You'll notice that there's nothing overly exciting there. I think it's most important for them to get the standard set of skills that'll give them the best chance of working in software development. That means the boring stuff that most people here would be "too good for." Everyone's a code monkey for some portion of their lives, the lucky ones just get it out of the way early.And they might also consider the QA -> Engineering route. QA sucks (I can attest), but it's a good way to start working with software. If you're lucky, you can even move into regression tests, regression frameworks, etc.
As to my story, I was placed into QA in the "choice" program because they misrepresented the role (it was an internship). The skills required listed C programmer, but on the first day, I was told there would be no programming.
The first few weeks I configured test beds. This was a lot of installation of server stuff (mostly following check lists) and configuration of networks. This was very IT'ish, and though important (and it sparked my interest in how exactly networks work, which I followed up on my own time), it wasn't what I was hoping for.
I got into automated testing shortly thereafter because they needed someone to do it and I had a lot of programming experience. I coded in Java using an IBM testing thing and a company framework provided by another QA person. This framework was buggy and _completely_ undocumented. In one place, there were 14 nested If/For's. There were obvious design flaws. Not only that, the person who wrote it was wholly unavailable (constantly busy). She did find time to do reviews when I only had an hour left in the internship to respond to them. Ironically, one complaint was that I recreated her functionality in some parts (if only I'd KNOWN about it!)
So, in short, my experience dictates that QA in large organizations means people that don't give a crap and do the bare minimum. I don't know if this is a QA problem or a large corporation problem, but no thanks to either.
Here's the deal. The web is the future. So for application domain -- the web is where it is at. And the web includes mobile. Mobile devices are web devices. The whole point of the web was to enable mobility in a standard protocol -- mobility of information, digestion of information and communication of information between any device, whether that device is a computer with a browser, or a cell phone, or a car, or a refrigerator.
So, that is the main issue. If you except that premise, the premise that the web is the future, then I can't help but recommend you learn technologies that are fundamental to the future of the web: the technologies that are part of almost any web application. Those technologies are: HTML, CSS, JavaScript, and SQL. XML is good too.
The problem here is that it is difficult to start in the web domain, because in order to really create anything of value, you have to learn more than one technology. HTML by itself is just a flat web page. To be awesome you have to create that HTML dynamically and in order to do that you have to learn a lower level language like .NET, PHP, Java, or an opinionated platform like Ruby on Rails, or mine: Qrimp.
Then, to use whatever programming language, or platform you choose, you also need to power it with a database, so you have to learn SQL. Then you need to make that web page do cool things in the browser, so you have to learn JavaScript.
So I would recommend, if you are going to start somewhere to program choose either SQL or JavaScript. You are going to need those, regardless of whether you ultimately go with Ruby on Rails, Qrimp, PHP, .NET or J2EE.
So, to narrow it down even more, go with JavaScript. It's a lot like Java, which is a lot like C# (.NET). Reasoning: Keep your doors open. Start with the broadest technology that can be applicable in the most places, then narrow yourself down toward rock-stardom in your niche.
That being said, SQL is part of almost any information system, even outside the web domain. It's also one of the most difficult to wrap your mind around, so go there. You can actually create HTML with SQL if you want to. Most veterans don't recommend it because you are mixing the presentation layer and the data layer, but the point remains...
If you look at this breakdown: http://demo.qrimp.com/TechJobsCharts You'll see that the most requested skill set among technology jobs are HTML and SQL -- for good reason -- the reasons I listed above.
I am looking for skills at a somewhat higher level than regular expressions though. For instance, like some of those mentioned in the question above.
You can solve a lot of problems with pattern matching, and the ones you can't solve will then lead you to other interesting places.
The economics guy could probably do well with R and some stats stuff... there's apparently beginning to be a big market for that kind of thing.
I think web stuff has a lot of jobs, and there's lots of room to get in at an entry level and work your way up. Something like mobile probably requires more skills at the get-go.
When the typical interaction with a personal computer was picking menu items from a screenful of text, you learned BASIC and that, while limited, gave you some idea of what programming was about.
Now the typical interaction is with a web page so arguably learning to program is learning to write web apps. The BASIC equivalent there is perhaps a page-embedded language like PHP. It's simple, direct, is an actual marketable skill and would introduce a beginner to a lot of the necessary details without much digression into more convoluted concepts (OO or functional programming, 'frameworks', etc, etc). Armed with the foundations, one can then branch out to things sexier/higher paying/useless - say, Ruby/Java/Arc.
From there, I find that short exercises are helpful. If they enjoy math based problems, I cannot recommend project euler enough. Otherwise, if they can relate their programming work back to their specific fields(ie, writing up an analysis of unemployment data or digging into gene sequencing), they will see it in a different, more applicable light.
I am biased being in the industry, but anyone with a good working knowing of a LAMP stack (know how to set up all components with default settings, understands the basic of SQL queries, can write a cgi script to fetch data from the database) can get into an entry level job with enough intelligence.
Hope the pattern is clear here. Tackle each bit as simply as possible to quickly build a wide range of skills and also find out where their interests lie. If something is especially interesting, go deeper.
Regular expressions. Very useful no matter which area (desktop, web, mobile) you specialize in.
HCI, usability, interaction design. They should atleast know enough about usability and design to appreciate its importance and avoid The Usual Mistakes (TM).
Using and administering web server software. Learn about Apache and the most common modules (e.g. mod_rewrite) because the odds are pretty high that you'll have to set up a web server in the future.
It is amazing what you can accomplish by just learning those first.
You will have tasks (mostly sysadmin) straight away and build your programming from there.
(SPSS is a statistical package used highly in economics and biological sciences)
In addition, it a good idea to havea clear understanding of different software methodologies (waterfall vs agile)
The programming laguage is important but at the end of the day its just a tool. Good design in software is what serparates great developers from the rest of the pack, meaning they have less stress, go home on time and generally always have good paying work :)
For instance, has the biology guy a suitable background for bioinformatics?