I've noticed that there are two kinds of "makers" who get stuff done.<p>The first kind learns and learns deep. They are spooky good at it. They'll latch on to something and then follow it all the way down to its roots, learning it in tremendous depth to the point that their skill in it seems almost supernatural. After all of this, they say to themselves "now what can I build with this?" (Or find a place where an employer tells them this).<p>The second kind decides what they want to build <i>up front</i> and then pursues wide and varied avenues of technology on the path to this destination. They often have fascinating slivers of depth in certain areas but lack that magical seeming deep domain knowledge. These are the people more likely to identify as "self taught" with all of the downsides that come with that. They make up for this with ridiculous determination and a kind of sixth sense for what is possible if you try hard enough. Everything they know, they learn on the path to the destination.<p>Both can accomplish amazing things. You'll never hire one of the second kind. The second just isn't going to be able to show you pointer arithmetic on your whiteboard in your pet language.
I can't speak about programming specifically, but for more general system engineering/administration I think I fall in this category and it has yet to hurt me.<p>I've had an interview or two over the years in which I surely lost out due to my inability to rattle off some bit of trivia about one thing or another, but it's probably for the best.<p>1) If the job was really so narrow that such a specific, rote depth of knowledge mattered I'd probably find it terribly boring.<p>2) If the interviewer is willing to write me off based on canned questions without actually conversing with me - the place where I feel I shine. I probably don't want to work for/with him/her.<p>Yes, there are surely exceptions to this, it's not a hard and fast rule, but as I said above it has worked out fine for well over a decade now.
It depends on the nature of the problem, but you are actually very solid with language skills (you know at least 4 or 5 different languages with sufficient skill that you can develop subtantial apps with them and not trip over yourself in language minutiae) it might not be a bad idea to gently twist the truth, assuming you can pass the technical tests.<p>Lest anyone think this is unethical, do remember that the large majority of job postings are made by people who ask the impossible (a level of experience in new languages that basically make it accesible only the language developers) or the irrelevant. Use your own criteria to determine when this makes sense.
I am facing a similar problem as the author.<p>I work at a newspaper and since I've been here (8 years now, I'm 28) I have learned some skills:<p>* Advertising Design(Print and Online Ads)
* Layout Design
* HTML
* CSS
* Some JS
* PHP
* mysql
* Currently teaching myself Python
* Online Advertising (Booking Campaigns)<p>I know how to do a lot, I just don't feel like I'm good at any of it. This is where I feel Jack of all trades (master of none) is an insult rather than a compliment.<p>Like the author I feel that if I apply somewhere else my skill level might not be up to par. It really is frustrating.
2nd year college student here--it feels that the structure and organization of coursework at many schools (including mine) seem to encourage this kind of learning. Projects that may seem technically involved but end up being a race to Google are common. Our school year, like those of many other schools is built around the quarter system. Quarters are ten weeks. It's not uncommon to be doing completely different and unrelated from week-to-week, and my first CS undergrad lab course was a good example of this kind of structure. One week you're doing bash scripting, the next week python, then you learn some basic git, rudimentary multithreading in C, and so on for 10 weeks. You'd hammer out an assignment only to forget the details of what happened days, maybe hours later. By the time the final rolls around you wonder how anyone would survive this course without the Internet or if we weren't allowed to bring copies of our notes and past code for the exam. Each assignment is a mad dash to learn just what you need to finish.<p>Of course, even with such brief bursts of effort, you can "relearn" quickly by consulting various references and refreshing your memory, but it becomes difficult and scary to imagine what life would be like if we couldn't look up whatever we needed.
The choice isn't necessarily between:<p>1. dabble in everything and master nothing<p>OR<p>2. Specialize in one thing and never touch anything else again.<p>There's a bit of a middle ground. Have one (or two, or three) things you specialize in and develop great depth, coupled with a tremendous breadth of general knowledge of related things.<p>You could strive to be a "generalizing specialist" as they say[1] or a person with "t-shaped skills"[2].<p>"T people" are very highly valued, in at least some contexts[3].<p>[1]: <a href="http://www.agilemodeling.com/essays/generalizingSpecialists.htm" rel="nofollow">http://www.agilemodeling.com/essays/generalizingSpecialists....</a><p>[2]: <a href="http://en.wikipedia.org/wiki/T-shaped_skills" rel="nofollow">http://en.wikipedia.org/wiki/T-shaped_skills</a><p>[3]: <a href="http://chiefexecutive.net/ideo-ceo-tim-brown-t-shaped-stars-the-backbone-of-ideoae%E2%84%A2s-collaborative-culture" rel="nofollow">http://chiefexecutive.net/ideo-ceo-tim-brown-t-shaped-stars-...</a>
This is a failing in job interviews in my view - selecting for skills that might not matter in practice. If you can build decent working code by Googling stuff as you go along (I know that approach works for me at least, besides the poster), there must be some real value to that which interviewers are missing.
In my experience, technical questions aren't usually language-specific per se. Instead, they focus on algorithms & data structures. Are you getting a degree in Computer Science? If so, you should be pretty well-prepared for technical interview questions already.<p>AI and Machine Learning are very interesting fields, but you need a deeper understanding of CS than you do for mobile/web development. Just out of curiosity, are you familiar with what a state-space search is, and the difference between breadth-first and depth-first?<p>edit: FYI, I'm also C.S. major graduating this semester. I consider my interests to lie in AI and ML as well. I've not had any trouble with technical interview questions.
My experience with technical questions during interviews is that they did not need a deep understanding of any particular technology. Instead, they mostly rely on some knowledge of algorithms and data structures. Almost all of my coding questions came from the following classes I took at MIT:
Intro to Algorithms (6.006)
Design and Analysis of Algorithms (6.046)
Mathematics for Computer Science (6.042)<p>Take some version of those classes (maybe OCW, edX, or Coursera) and you will be good to go — at least for technical interviews. If you like reading then Introduction to Algorithms by Cormen, Leiserson, Rivest, and Stein is the book that these courses cover.
The good news, and perhaps also the bad news, but in your chosen context the good news, is that Javascript, Python, Ruby, and to a lesser extent, Objective-C, are all essentially the same language. You're probably not as split as you think, and if you are going to stick within that paradigm you at least have perspective relative to someone who only knows one of them. You are right that you should really learn one of them deeply, but it hardly matters which, and a great deal of the deep knowledge will transfer fairly well. (Again, Objective-C being the odd man out a bit, but still in the same broad family.)
To the contrary, I think this sort of broad experience is excellent to have at the beginning of your career.<p>I'll admit I'm a little confused, as my entry-level interviews never involved any questions about language or API trivia. If I had to write code, I could do it in any language I wanted and was comfortable with. And sometimes I wouldn't even have to write code, just discuss a problem and potential approaches. The solutions would never depend on library-specific knowledge.
I started with Assembly Language moving on to C/C++ for hardware programming. Then came Actionscript and PHP followed by Java. Got a job, they told me to be a Javascript, HTML/CSS guy. The next one asked me to do Python, C/C++, Java all at once. Left job, released a game written in Lua. Went back to work for a startup in Java(Android) and Python. I did that for 6 years(college included).
When I started working on my own startup(bootstrapping alone), and was in the exact state of mind as the author. "Well, fuck. I am average at almost everything I know." 8 months later my language skills have still not changed much, but I have found out that I can architecture projects better than my peers. Almost magically I somehow pick the perfect module for my project. I suspect that ability has developed by tinkering with different frameworks and languages over time. I still wish I had the freedom to be an expert at one. But in life you don't always get what you want. At-least now I have the ability to handle the technology stack of my startup alone i.e Golang, AngularJS, Android and iOS. It's not ideal but works out.
Work through the latest edition (4) of Sedgewick's Algorithms book and do the algorithmic challenges on Interview Street.<p>This will fix the problem of having a wide range of hacker skills and a portfolio of projects but not being able to make it through a Google inspired interview.<p>There's probably a Coursera or OCW course that might help but the key is you have to actually do the exercises.
College is not the time to worry about spreading yourself too thin. It may seem like you're all over the place, but this is all just a drop in the bucket compared to the professional work you will do in the future. Most jobs will give you an opportunity to hammer away at the same code base for an extended period of time, and this experience will be far more valuable than doing a bunch of one-off projects in the same language simply for the sake of mastering said language.<p>In short, I think you're doing it right and will end up better off than someone who focused on one language because that's what companies appeared to want.
Great work!<p>I have two suggestions:<p>Build an application in Clojure and in C/C++. IMO you should try a functional language (doesn't have to be clojure) and a lower level language. It could be a clojure webapp and a C++ opengl game... doesn't matter.<p>Here's something to get you started: <a href="http://nehe.gamedev.net/tutorial/lessons_01__05/22004/" rel="nofollow">http://nehe.gamedev.net/tutorial/lessons_01__05/22004/</a><p>I wouldn't worry about specializing just yet, just keep doing what you're doing, just up your difficulty level. Already you've done more than 50% of the programmers in the market (most know one language, like Java or C#).
In my experience, I have found that I needed to take a step back and focus on a solid foundation of technical knowledge that is totally language independent. After that, you can go back in and layer in how different languages might help/hinder you in particular situations.<p>Much of my education was from a "get cool shit done" perspective, and I did. I had solid projects in an array (no pun intended) of languages but lacked some of the true, lower-level knowledge as a foundation.<p>Your mileage may vary, of course, but if I could start my CS education over again, that would be my advice to... myself..
Using the analogy of spoken languages ( a stretch I know ), I'd say there is a big difference in knowing enough to get by when traveling vs being fluent.<p>When a company is hiring, would they rather hire someone who can get by or a fluent speaker?<p>I think there is certainly a breath and depth balance to be had and I think you are correct in seeking more depth. A deep understanding of one language will allow you to more quickly gain depth in other languages.<p>And have fun!
I have been thinking this myself recently, and contrasting how difficult it is being a founder (which pretty much requires a jack of all trades skillset), versus being employable until you can support yourself long enough to risk not having a job for a while (god damn student loans).<p>It is really tough to strike a balance.
Alex Krupp has laid out an elegant solution to this problem:<p><a href="http://alexkrupp.typepad.com/sensemaking/2012/09/program-above-and-beyond-your-actual-ability-by-using-freemind.html" rel="nofollow">http://alexkrupp.typepad.com/sensemaking/2012/09/program-abo...</a>
You are a perfect fit for advertising agencies with digital departments. They usually need a jack of all trades. One who can build simple html/css sites, write Javascript, iOS app development and even backend development for larger campaigns.
Given that the poster says "my ultimate goal is to build a general artificial intelligence" I'm not sure that facility in any given programming language (or the lack thereof) is the poster's biggest problem.
Here's the answer to all your worries: The Sex Pistols.<p>Yes, the punk band. Those misbehaving misfits that couldn't play their musical instruments and yet went on to change music forever.<p>The Sex Pistols succeeded with barely a shred of skill or talent because they were on a mission and executed it with ferocity.<p>No talent is required to make a difference. Just piss and vinegar and a grand vision. The Sex Pistols prove it.