I could very well be looking in all the wrong places (openings within my commute), but if I can't find an opportunity I can properly invest my talents with while working along side other developers/designers than going to sink my time learning a language I'll probably end up hating.
Hating the sort of work a language is usually used for is something different, however.
Perl is the one exception, of course. All right-thinking humans hate perl.
Right on the mark. My day job involves working on a very interesting Java project (which actually doesn't hurt much by being in Java; C++ is the typically used languages for these sorts of projects). All else being equal, however, I'd stay away from job listings that only require Java (or that mention J2EE), as they typically imply "write web applications". Now a job listing that asks for domain specific knowledge (e.g., search algorithms) and asks for "Java, C# or C++ knowledge" (i.e., whoever wrote it is clued enough to know to that learn one of these, you know the other two) is different matter. That being said, I'd rather these listings say "Knowledge of C and any OO language" instead: Java and C# programmers who don't know C#, don't know those languages are doing behind the scenes (and would be out of clues as to why their application leaks memory despite running in a VM with a GC, or why the GC is causing their app to stop for whole seconds).
> Perl is the one exception, of course. All right-thinking humans hate perl.
For an alternative opinion on Perl, I'd suggest looking at "Non-Lisp languages to learn" Chapter in Doug Hoyte's "Let Over Lambda". He makes a very compelling point of Perl being a "beautiful blub": UNIX ideology taken to the logical extreme, but giving a developer lot of freedom as a result (see Class::Mop or Moose for example).
That being said, I completely understand you. There's some languages I can't stand. In my case that would be ASP, PHP and Visual Basic. These languages (and the code bases written in them) tend to reduce one's power to that of a fourteen year old with no computer science background. They took 90s/early 2000s Java/.NET anti-pattern of "re-usable commodity developer component" model () to the logical extreme: these languages don't offer any* tools that enable one skilled developer to compete with many (cheaper) unskilled coders. Whereas Java suffers from typically being used for very uninteresting tasks, these languages can only be used for very uninteresting tasks.
(*) Of course, since it's Java it would be "IReusableCommodityDeveloperComponent developer = ReusableCommodityDeveloperComponentFactory.getReusableCommodityDeveloperComponentInstance()", with bunch of XML files binding that factory to a university or even a trade school.
I thought "UNIX ideology" was "streams in motion; streams at rest." (Everything reads streams and produces streams; you create complex programs by piping a stream through smaller programs.) Shell scripting is really the pinnacle of UNIXism.
As for PHP: structured, clean PHP (written by people with an education and development experience in other languages) looks like Java. So why not just use Java: you get better performance (without having to compile it to C++) and access to great libraries. Of course, now that you're on the JVM you might as well start using better languages (Scala, Clojure, JRuby), which to operations look like just another jar/war file.
Don't forget VS2010 out in 12 days, woohoo! And i'm not sure what it means to combine Hotspot, OpenJDK and JRockit but it'll be excitin'
Don't ask what languages are being widely used. Ask first what jobs/companies you're interested in; then find out what languages they require.
I'm not looking for a full-time job right now (I'm working on Tarsnap) but I do occasional consulting in the areas which interest me.
submit a cover letter that states how quick you are at learning new things and how you're willing to put time into learning their chosen language before you arrive.
for most companies, entry level hires are about picking up the talent, not the experience. demonstrate your talent and drive and you'll have a decent chance.
thats how i got my job, at least.
That's not to say they don't care about any talent: it's just software development is neither their core competency nor a competitive advantage. They may have great pay and hours (and may be doing something great for the world), but if you're a programmer because you love programming, you should go (at least for your first job) to an employer that will invest in you.
If you don't have any experience you should accept that your first job is going to suck in some ways. I would suggest not worrying about the quality of the company or environment so much as the presence of opportunities to do different things, grow, and move on. Which you will do at some point.
And in this market, being picky is particularly unadviseable. :-(
However, I'd suggest being picky not about the language used, but about the difficulty/challenge/"hard-core" feeling of the position. Pick the company that had the toughest interview questions (don't even consider one that doesn't ask you to write code on the whiteboard!), uses technology that is the most challenging (rather than simply complex), solves the most difficult problems and is willing to let you work on a team solving those problems (rather than assigning you to e.g., QA).
It's always harder to go "easy->tough" than "tough->easy". I'd hire a systems programmer to write web applications (if that's indeed what he wanted to do), but I'd be hard pressed to hire a web developer to do systems programming (unless he had open source work to show for it).
Additionally, right or wrong certain large companies prefer work this way: they hire new grads from the outside for junior positions and then hire internally (i.e., promote) for core senior positions. They will, occasionally hire someone with experience from a comparable large company for a senior position (after a difficult interview), but they won't hire someone coming from a start-up for a senior and core (i.e., software engineer vs. QA) position. The argument is that large companies have certain processes and challenges which are unique to them and don't occur in start-ups.
They also won't hire an experienced person for a junior position, knowing they (statistically speaking) won't be motivated enough while earning lower pay to advance through the ranks to fill a senior role.
So if you'd like to work in certain places (e.g., you want to be at IBM Research) it's much easier to get your foot in the door as a new graduate.
I would say, there's may be a period of 2-4 years from "get your last degree" to "seen as damaged goods by big corp". In practice this means, you can try a particularly interesting start-up right out of college or (if you feel your career is going nowhere), go back for a Masters and make yourself a "college hire" again.
It's not fair and there are exceptions (I'd imagine Google generally ignores various big-company anti-patterns in hiring, although they're still seen as "favouring new grads" by ignoring experience), but it's a possible consequence of choices one makes.
With one exception. My first job involved consulting at Bristol-Myers Squibb. The result of that was that for some time I was unable to enjoy Dilbert cartoons because the wounds were too raw. They were true.
Based on that experience I wouldn't want to work for that kind of large corporation. Luckily tech tends to be filled with young companies that grew up with very different cultures, so I've never again had to suffer through that kind of dysfunctional culture.
You think we're built to drink beer?
Honestly, Bay Area (and especially San Francisco proper, rather than Silicon Valley) do suffer from too many "widget" start-ups, which should be viewed as media companies, solving social problems -- not technology companies. New York and LA start-ups tend to be even worse in that respect.
When I visited Boston, I noticed the start-up scene had a more of a "hard-core tech" feel to it. I saw purely technology start-ups. The people calling themselves entrepreneurs were _engineers_, not marketers and project/product managers (as is often the case in Bay Area; note: that's not to say PMs and markets aren't important!). There was more "ZFS vs. btrfs" talk and less "agile lean customer development start-up" talk.
I remember implementing a genetic algorithm in C++.. I used a functional way of doing it and it turned out to be a real pleasure. I even made it multi-threaded using a STL-like threading library which encouraged a functionnal style.
And also, don't forget, by learning new language, it will make you a better programmer, period. There are also way more than "programming" in a software job.
Communication between developpers, Communication with the client, designing a robust system, etc. Implementing in your not-so-favorite language might only be a small pourcent of the real job.
That was my 5 cents on the subject :p
I tend to find that C++ jobs and the C++ developer community is usually (key word being usually, not always or even "almost always") more pleasant than the Java and even dynamic language jobs and communities.
I'd guess first reason is that C++ isn't very useful when you're doing simple work (such as data base driven websites, although it's certainly possible e.g., okcupid). The sort of projects where only C or C++ make sense tend to just be more interesting (embedded, systems programming, high performance/low latency computing).
As it isn't an easy language, it takes more motivation than just money to learn it when there are other choices on the market. It's difficult for all the wrong reasons: not because it introduces powerful concepts like Lisp and ML-family languages do (which take time and effort to learn and understand), but because of complexities of manual memory management (especially if your dev organization doesn't like boost::shared_ptr and boost::scoped_ptr), inadequate standard libraries (stl and boost are nice -- again, if your dev organization allows you to use them -- but you almost always have to go beyond them and build your own data structures), etc... However as a result of the difficulty barrier, people who program in it tend to be smart and passionate and are more likely to write tools in Python and Perl and learn Haskell in their free time.
Additionally, when the PHB mandates C++, he can appeal to the developers' favourite (and most dangerous) indulgence: premature optimization instead of telling the truth ("I don't want to get fired if I screw up, so I am going with Industry Best Practices"). I've seen organizations go Perl to C++ and OCaml+Scheme to C++. There would be discontent, but there usually wouldn't be an exodus. I've never seen companies go Perl to Java or C++ to Java without an exodus of developers (either before the switch, allowing the switch to happen, or after, caused by the switch).
At the end of the job search I had to choose among two companies. One was developing in python, the other in php. At first I felt inclined towards the python-based one, mainly because of my taste in programming languages. I had sweared to myself I wouldn't do java, asp or php, and like you I was disappointed at the fact that the vast majority of job offers required those languages.
After getting to know both, however, I ended up going to the php-based company.
I realised that what I actually dislike of java & co., more than the languages themselves, is the mindset that the people pushing them _often_ have. Mind you, often, not always. And that was the key.
The people at my company started this project about 10 years ago, and at the time php was the natural choice. They're not the old-aged, process oriented, boring, enterprise-y. They're agile, quick, creative, curious. We use git, introduced and extremely cool release management strategy, started a new project in python, moved a lot of the functionality on the client (on the browser), and so far even the work on the php backend has been a lot of fun (~1 year into this job).
I'd say the key factor is: do they have a hacking mindset or a process-enterprise mindset? With the right people php can be fun too :-)
And don't get me started about averages...
Glad to have you with us :-)
<? if ('1foobar' == 1) echo "sigh"; ?>
There's also a risk that if you don't know a popular, but bad languages (or at least take time to understand why people call it bad, rather than just read what other people have said), you won't know to avoid other languages built along the same lines.
Also, while a language overall might be unpleasant, it can still teach you new concepts. I had to be dragged screaming and kicking away from Perl and C++ into Java. However, Java has got me thinking "if only there was a garbage collected statically typed language with a good concurrency/threading story that wasn't as verbose, had first class functions and (optionally) did some form of MI/mixins". That thought lead me onto Scala, OCaml and (once I have some free cycles) Haskell.
Keep working on side projects that do interest you, and make them public, so that it's always easy to show prospective employers what you can really do. Spend your time boosting your skills and having fun, even if your first actual income comes from something completely different, like mowing lawns.
One thing about programming is that it can be done from anywhere; try applying for a job that's outside your local area, and see if there are any that allow remote work. Some companies won't offer this unless you have years of experience, but some might do it anyway; it all depends on how good they think you are.
If you hate your job it will seep into other aspects of your life. Life is too short for that.
Go out and find your adventure.
I stuck around though, did PB for a while, and 2 months later a Java position opened up, which turned out to be great.
So - I wouldn't get too caught up in that, but YMMV
I'd suggest looking into a different geographic area, joining a technology company (which produces a software product; serious Internet companies fall under that umbrella).
I'd recommend high-traction, well funded start-ups that have been around the block (with serious technical identities); big tech companies like Amazon, Google, Microsoft or Yahoo are a good bet too: they solve very interesting problems and are willing to mentor you. Yes, they typically use various forms of blub for production code. However, no one will object to you writing a prototype in Python (or an IDL->code translator in OCaml), and you'll be able to pick up skills that are rare and meet serious hackers.
The reason I don't recommend smaller start-ups is that their goals aren't always aligned with yours: your goal is to build up the skills needed to solve big, interesting problems; depending on the founders, investors and the market the goal of a start-up might be to make any product, even if there isn't much technical skill (for you) to be gained by building that product.
Knowing something others don't know (it could be machine learning, search, compiler construction, systems programming, numerical analysis, etc...) means you're not a commodity. If you're not a commodity, you're much more likely to be allowed to use non-commodity tools (e.g., start a pilot project in Python, Erlang or Haskell instead of Java or C++, or start adding Scala modules to an existing Java application). It also means better pay in the long term, but you should not use pay as a yard-stick when deciding on your first job: an MBA-type "founder" might be really desperate for you to a web app for him, but a software company is making an investment in you.
Edit: see the comment from cperciva -- if you have skills (in his case security and mathematics, from his FreeBSD and academic work) that others don't, you can find ways to use tools that you enjoy using: either by finding a workplace which uses these tools or having enough "clout" to introduce those tools to other companies.
Don't make too many compromises though. Learning a language that you don't like is going a bit too far to get a job I think.
Try looking at meetups (which allow job posts), job postings advertisements on programming sites, etc instead.
That said, take the advice of people here and don't constrain yourself locally. You're at a perfect time in your life to be free and go wherever to find the work you really want. Take advantage of that freedom!
To a lesser extent, C# I ended up learning only because a side project was in desperate need of more coders. I didn't like it much but nowhere near as bad as CF.
And lesser still, Java proper the language rather than the environment. I don't much like it but I totally forgive it because of the JVM and all the excellent other languages that run on top of it.
I learned PHP and MySQL to get a promotion when my boss was considering hiring from outside the company. I generally don't hate PHP -- in fact, these days, I rather like it -- but I did have to do something I was averse to in order to land a job.
In my day we programmed in Java and liked it. ASP was the GOOD web programming language. We had to code up hill in both directions...
But seriously, there are good and bad points to every language. Sometimes I think the willingness to just love the good and work around the bad is half of being a really good developer.
Learned being the operative word.
At this point in your career you'd be well served to learn idiomatic blub a few times over, in the same way you'll be well served to work with a variety of personality types.
When the time comes for your next venture, be it in 6 months, or 6 years, you'll make a better decision i.e. grounded in understanding, about each.
Rinse; repeat.
Edit:
I'm not suggesting you take just any old job, however. Be discerning.
I still enjoy working on side projects too, with the tools I like (web dev, PHP MVC...).
I moved(without having and commercial experience behind me) to a more technical city just as I was finishing Uni and managed to find a much better job with much better coworkers than I could have had in my starting city quite quickly.