| Sergey Mikhanov | |
Self-learning is overrated (in programming) (October 10, 2010)Few weeks ago I had series of interviews in two top-tier investment banks. I was applying for development position in similar departments, but the technology stacks those two banks were using varied wildly: from hardcore low-level multithreaded Java in one to Haskell/F# in another. The outcome of those interviews provoked some thoughts abouth whether self-education means that much when a well-paid position in a respectable company is at stake. First of all, banks are always a good indicator of the position’s value in business terms. Startups may hire people to explore the previously unknown areas, to experiment with products that might have very little or no monetary value at the moment. To the contrary, banks are dealing with the established business models and are rarely tolerating even short-term decreases in the added value that every person brings to the company. They hire people to earn money for the bank, not to experiment, and they pay those people accordingly. This usually sets the interview direction from the very beginning. I have around 10 years of industrial experience with Java, interruped by few years of enterprise C# development. So despite being exhaustive (two people on the other end of the phone line asking one question after another in the course of hours), interviews for the Java position went pretty smooth. How to implement a fair lock? What’s a GC generation and what are they used for? What would you do if you need soft-realtime Java system? How to avoid resource contention? Deadlock? Livelock? Can you implement locking without using synchronized keyword? Synchronized container that will use locking less often than a standard one? And so on and so forth. Fortunately, most of those question constitute part of my day job, so it was nice to have this brain excercise. Not so with Haskell/F# interviews. I didn’t had a chance to gain any industrial experience with functional programming — I bet lots of people practically interested in FP didn’t. I was asked about type inference results for some specific function combinations, possibility of Haskell program to be as fast as C program, type covariance and contravariance in .NET, the way to control state and side effects with monads, existential types, a bit about the way Haskell supports multithreading, short “what is STM?”, and so on. Shortly after the interview I found a polite “no” in my mailbox. I myself wasn’t satisfied with my performance, so this wasn’t a surprise. At this point I was happy that my experience with resolving all sorts of problems in the real industrial environment gave me a chance to learn what I know about Java. I felt what it is like to be in shoes of self-learner. One bright guy who fleed from the enterprise development to the AI-related work wrote this:
Real industry does not work like that too. I can’t imagine a self-learner to know the nuts and bolts of Java GC, just as I didn’t felt too confident about existential types. I simply never had an external pressure that would throw me into the necessity to know ins and outs of Haskell by heart, and pragmatic books (Haskell, as all you know, have one) no matter how good, do not help with that. Self-learner is like a fresh college graduate: he simply has to start his way from the lowest positions again. No amount of self-learning can come near years of work in a mission-critical environment when company’s revenue is at stake. What others are saying?Leave a Reply |
|
| Entries (RSS) | © 2007–2012 Sergey Mikhanov | |
Why are you assuming self-learners do not have the capacity to push a system to its boundaries? That’s basically were you learn about all the topics you mentioned and you don’t need to go to school to think up of edge cases that throw anomalous results that force the experimenter to learn about existential types, STM, and a whole bunch of other things that are “taught” in a classroom or that you learn in a mission critical settings.
Wow, amazed you even tried to make a convincing case of this. I couldn’t possibly disagree more. Just to get it out there, I have a BS in IT and a Masters of Computer Science. I no longer use any language I learned while getting those degrees. Did it teach me things? Of course, but it didn’t teach me the hardcore knowledge I learned on my own and through peers while on the job. If you aren’t self-taught somewhere along the way you won’t find yourself on my team. Anyone can get that degree, I want those who are passionate enough to become experts on their own. And for the record, understanding Java GC requires no degree at all. Just the will to dig in deep, something I am proud to say every engineer at my company is willing to do. Self taught == self driven, might want to rethink your stance.
No amount of university learning can come near years of work in a mission-critical environment when a company’s revenue is at stake.
The fact is that learning is not a substitute for doing. I had about 10 years programming experience before I went to uni. I wound up leaving uni before I graduated because I was offered a 6 figure salary at a bank. Having said that some of my classmates went on to graduate and still couldn’t program properly.
Conversely doing is not very good substitute for learning (it can be done but it will take many many years).
What really matters is both; a) learning the right stuff, and b) spending enough time doing it. Reading, and more importantly analysing, the code of seasoned gurus is probably one of the best ways to learn. Then spending at least 5,000 hours coding is about the minimum to becoming a journeyman programmer. Thankfully open source provides an easy way to do both. It also allows you to show off your skills as well.
I’m not sure I see the correlation you see between self-learning and J2EE sites, and being educated and knowing low level multi threading, functional programming, GC algorithms, etc and working for a professional organization.
Perhaps you could make a case for amateur software developers vs. professional software engineers/computer scientists, but again, either one could be ’self taught’.
I think I’d be quite comfortable answer questions on locking, GC, and funtional languages and I’m self taught. One of my learning exercises was designing and implementing a new GC algorithm in C. I’ve had to understand locking both in my hobby projects and professionally. I’ve utilized my knowledge of garbage collection, multi threading, lock free algorithms and scalable software design in multi million dollar systems at my job.
Interesting post, I’ve only a couple of comments. My housemate works for one of the largest investment banking firms and is a really an excellent coder, that being said he’s not exactly representative of his colleagues. From what I’ve seen, most investment banks have a laundry list of required technical experience on job postings that can only be obtained by working at an investment bank. Unless you’re (un)fortunate enough (like my housemate) to find a company with a manager that is either desperate for fill or role or is ready to take a chance on someone who clearly has the aptitude to learn quickly then the available talent pool is restricted to people already working at investment banks. And that talent pool doesn’t appear to be of any significantly higher quality than any other technical sector I’ve worked in.
“No amount of self-learning can come near years of work in a mission-critical environment when company’s revenue is at stake.” I think this is the crux of the issue, you’re 100% right here. No amount of time spent studying comp.sci at a University can come near years of work in a mission-critical environment when company’s revenue is at stake.
Again this is constrained by my own experience, but in ~17 years the developers I’ve been most impressed with would probably be considered “self learners” (studied physics, history, politics, etc. at university and not comp sci). I’ve always attributed it to the fact that these days the only difference is location and delivery of content, as everything is accessible without a uni. Those motivated enough to learn it themselves are genuinely passionate about the topic and motivated by that passion, rather than enrolling in a bachelors course because in the late 90’s it seemed to be the best career choice.
So, did you get an offer from the Java bank? I can’t tell by reading.
Correlation does not imply causation. Just because you didn’t get the F# job doesn’t mean it was because of self-learning. You’d have to spend 10 years self-teaching F# every night to make the comparison remotely interesting.
> First of all, banks are always a good indicator of the position’s value in business terms.
I don’t buy it.
Let’s say Java++ comes out today and makes programmers 100 times more productive. No bank will hire Java++ programmers until “it proves itself” in the banking field, which might take years (if ever). Even if you ignore the “lag time” for banks to discover new languages, how do you explain the fact that banks tend to avoid PHP or Python coders? Clearly these coders have “business value” (to Facebook and Google).
Clearly, you’re talking about “perceived business value by banks”, which measures banks more than it measures languages/programmers.
You’re confusing self-learning with Subject 101. Many people learn very sophisticated skill sets after spending years (or decades) on their own. A lot of times people in industry -are learning on their own- and their learning process is indistinguishable from that of someone ‘at home’.
The point is that you cannot take a cursory reading of a subject and be an expert, no matter where you work.
This sounds more like a lack of interest than anything. It IS possible to learn all the ins and outs of Haskell or the nuts and bolts of Java GC purely through self-teaching. All you need is a passionate interest in the subject. If you have that learning about it doesn’t seem like work or something you HAVE to do. it’s actually enjoyable. Also on that last paragraph it should be “(Haskell, as you all know, has one)”.
Seems that you have only managed to prove that self-learning is not effective for you. I tried skiing once and fell on my ass, therefore skiing can’t be done.
I’m a self-learner and I know nuts and bolts of generational GCs, even though I don’t use language with one. It’s because I love learning and absorb such stuff as much as I can.
I’d say it’s the opposite. Someone who just did minimum required to get a degree and works 9-to-5 won’t know much beyond basics.
And training for a sport in a closed environment practicing drills won’t make you ready for a real match of that sport.
This is stating the obvious. Both have a place in the learning sphere, and one without the other won’t work. I don’t think this was ever a debate?
“It IS possible to learn all the ins and outs of Haskell or the nuts and bolts of Java GC purely through self-teaching.”
It is, its just unlikely.
I think there are two things to note here. One, self-directed learning often (though of course not always) lacks discipline. It usually focuses on things that are “sexy”, such as UIs or web frameworks, rather than the more hardcore things like concurrency or garbage collection. Yes, there are some people who find garbage collection policies more interesting than web programming, but they are in the minority. It also is usually very shallow as most people (again, not all people) will stop learning when they get past the easy stuff.
Second, learning without experience doesn’t mean a whole lot. Without the feedback you get when working with a real project, you are limited on much you can really learn. You see that even outside of self-directed learning, just look at any new college hire, though then there is at least some feedback you get from your professors.
“I can’t imagine a self-learner to know the nuts and bolts of Java GC”? But… Java didn’t exist when I went to school, so how did I learn any of it? Moreover, the only languages I use now that existed then are Smalltalk, Lisp, and Forth (and C, I suppose), and I never had a class in *any* of those.
Becoming an expert requires time, patience, practice, and dedication–no matter *how* the knowledge is gotten.
Holy ramshackles, settle down. Maybe the author is just introverting on the difficulties faced by experienced programmers. We pretend that programming jobs for really good programmers are an endless bounty waiting to be plucked, regardless of location, and nearly insinuate that learning a new language is a zero time prospect so long as the effort as there. Could it be that “No amount of self-learning can come near years of work in a mission-critical environment when company’s revenue is at stake.” while also being true that not all language/field combinations can be explored regardless of the will to self-learn. If you will allow me those two arguments then could it not also be true that a person, despite their history of devotion to strong self-learning, could feel a moment of inefficacy towards that self-learning process, if it doesn’t lead to the successful obtainment of what might have been a very much needed job? If working in a specific industry is the only likely way to happen upon choosing to self-learn the languages and specific problem sets of that industry, then how can even an experienced and motivated self-learning programmer hope to compete against someone with industry experience and likely the industries language of choice?
I agree. It is difficult for an amateur (or recent graduate) to get far without real experience on challenging problems and good feedback. Silly question: How could someone like me gain such experience and feedback? Would it be similar for professionals looking into new areas?
Agree. Self-learning is far less effective than learning in a good working environment.
Through self-learning you pay a lot to find out the result(or less) you pay just a little through working in that environment.
It’s good to have that environment in hand. But if you do not have it, self-learning is the only way.