That's a good FizzBuzz problem. Broadening the scope from Rwandan CS students, many well-compensated professional programmers in rich nations could not complete it successfully. I know, this is crazy, but we live in a crazy world.
And to those HNers who think that inability to FizzBuzz is a funny story made up by overly cynical neck beards: spend a year hiring.
Ya, it is a similar thing for sure. The problem is just accentuated here. Two of the four we interviewed had some clue as to get started. The others were pretty stuck right off the bat. And that's (approximately) the best out of 50.
That they don't code at all in school is just inexcusable.
I suspect that the sample size is too small to really draw any reliable conclusion.
Having said that, you are on the ground. You see and talk to them. You definitely have a good idea of what you are talking about. Me, i'm just a guy half way around the world feeling pretty bad about it - and hoping that this is not true.
You touched on so many points that i endorse and recommend heartily. Programming is coding. It's hands-on. People have to sit in front of a machine from day one, hour one of their learning. People learn from writing crappy code, and debugging crappy code till the code starts to work. People learn from making their own mistakes. People should learn that programming cannot be memorized and repeated ad nauseum on exams.
I remember the kind of folks i interviewed when i was starting a company in india in 1995. I was horrified at the nature of rote memorization in many schools and collages. I made a decision not to hire any one with a CS degree as i felt that i would have to spend too much time making them unlearn bad habits. I then decided to go out, hire students with no programming background, teach them coding from the ground up. Teach them to solve problems one step at a time. Teach them the joy of debugging. And they turned out to be great.
I suspect that every country, region, city, place might have to go through an evolution of programming culture, but the internet and it's legions of programmers gives a great way for beginners to short-circuit their learning process.
Thanks for the comment, it sounds like you've seen very much the same thing.
The encouraging thing of course is that there is huge talent here, it isn't the people, it is the institutions that are failing them. But we've hired two who are super bright and which we've helped along and are doing awesome. So ya, of course that is fun and is why we are here.
One thing that has come out of this discussion is one of the asides I put in about the MIT courses. And I think we might actually try to facilitate getting a group together to work through it, at a reasonable pace. (say one class a week) We'll see.
Would love to hear more about your experience in India if you ever have the time. My gmail is the same as my user account.
Hrm, maybe I was just lucky but when I was looking for a student intern earlier this year I got several dozen replies, and even tho many of these were pretty poor fits I still ended up having to choose between several good candidates.
The one who ended up doing the internship was top notch (better than I expected a 20 year old student to be) & I'm pretty sure at least 1 or 2 others I filtered out (only had 1 position to fill) would have done a good job as well.
While programming is certainly the most marketable skill of a computer scientist, computer science is not about programming. Computer science is the mathematical study of computation; it's the study of processes and of information. It is possible to be a great computer scientist without knowing how to program.
This doesn't excuse the university of Rwanda: programming is possibly the best tool we have to teach CS these days, and it is a skill that most computer scientists should grok. But I do think a CS degree's value is not only measured by how good a programmer it means you are: CS is a scientific field, not engineering.
Lacking tangible skills, it's hard to evaluate whether someone is a "great computer scientist".
Can you be a "great artist" if you can't even draw? How about a "great architect" if you don't know how to build a house?
Possessing the basic skills in your field of study, I think is a prerequisite for acquiring the advanced skills and the ability to contribute to the state if the art.
There are other tangible skills a computer scientist should have, other than programming. The ability to demostrate graph properties, solve computability and complexity problems, explain and develop algorithms are all things that don't require programming at all. Some of my best teachers at college are not great because of their programming skills, but because they are great at other areas of CS.
Though i am inclined to agree with you i do think this distinction might be appreciated in the context. What i mean is, when a person is starving he doesn't really care if his food is from a 2 hat or a 3 hat restaurant.
Having said that, i view programming as a tool which is to be used for solving problems. But i would expect a CS major who wants to work in the industry to be really proficient with his or her tools, and that includes programming.
A CS Researcher might be able to get away without any knowledge of programming in a university setting, but could be out of place in the real world unless he focuses on a speciality which is in high-demand.
I once had the experience of sub-contracting work to one of the best universities in my country and found that both the students and the professors involved with the project were not familiar with coding. Thankfully i could train them on coding with minimal effort since they had a background in rigorous mathematics.
You sure can't learn CS by only reading a book - the keyword here is only.
Following through good books is an excellent way to learn programming. I don't believe anyone who has followed through K&R would have any difficulty getting through these fizzbuzz questions.
The analogy with swimming is flawed. You don't need to read books to learn swimming(or maybe there is some theory involved - I don't know), but books are a vital part of a CS education. Good books teach you a lot more than what you learn by randomly typing.
Hrmm.. Maybe, maybe not. I'm certainly not making the argument that you shouldn't read, if anything, my argument there is don't attend university if your professors have no idea what they are teaching, which is the case here.
Obviously, those who write books usually have a pretty good idea of what they are talking about, so gaining knowledge from them is a great strategy.
And yes, there is a belief here in Rwanda that you can learn CS by ONLY reading books.
But to your point, I'm not sure why you rank books so highly, when in isolation they clearly aren't enough. The average student probably won't grock worse case runtimes by only reading about them. Having a lecturer explain it and give examples will help, but actually implementing some sorts and seeing how fast they run on different size data sets is really what is going to drive it home.
But for a great many programming jobs, I would actually make the argument that you COULD do them without reading a single book. Granted you probably won't be building the next map-reduce, but you can still be effective.
Learning how to find solutions online, read documentation (does that count as a book?), and debug, as well as fundamental algorithms are the big skills.
When one first starts out, it's ok to just sit in front of an interpreter or a compiler and start trying out small programs, make mistakes, learn from them and go on.
But one vital quality of good developers is being able to read code, understand good code, borrow good coding habits and using them in your work. Many excellent books are available where what shines through the pages is the author's experience in writing good code, explaining the logic of how he or she arrived at it, and then solving small problems which might come as exercies at the end.
University degrees, learning on the job, etc will only get you so far ahead, but to leap ahead in your productivity, it's best to learn from the real giants in the field.
Programming is a field that constantly changes. Reading, Applying, and learning new skills, and new techniques is part of the skill-set needed to survive. Great books are a complement to hands-on experimentation in this regard and cannot be over estimated as more and more learning is often self-learning since it's difficult to always find good mentors.
I don't think we disagree. I didn't say you were likely to become a GREAT programmer without reading, or even that it is far easier with formal training from competent teachers.
My point, rather, was to say that for a great many jobs, jobs that most of us here on HN might turn our nose up at, but programming jobs nonetheless, you can survive without that reading.
I would even go on to say that the vast majority of programmers out there doing the job day to day, perfectly adequately no less, have never read any of the tomes we hold so dear.
Could they be more effective if they had? Sure. Could their processes be improved? Absolutely. And I'd be the first to say they should. I do want to live in a utopian world where everybody reads HN, cares about worst case runtime and stresses over the density and color of their code.
But realistically, as in any other field, only a small fraction of people are interested in learning their field to that degree, and the rest are perfectly fine being (merely?) adequate. That's ok because there are a great many jobs perfectly suited for them.
But again, the point of the article is not how to create the next K&R. My goals are much simpler, much more modest. I just want functional programmers, at the basest level. And as you said, at the beginning, there is just not substitute for time in front of a keyboard.
I think its quite interesting that the example chosen to display how bad theory without practice can be is swimming (which is an excellent example). Im currently working in the Philippines with setting up an development team and here some of my local co-workers have had theoretic swimming in school. They got a grade, but cannot actually swim! Got a bit surprised when I heard it for the first time.
I think the major problem here is that CS and programming are too intermixed in education (and thus in the industry too). Uni degrees (imho) should educate scientists who study their field and do research.
If we continue on the swimming analogy: You don't actually need to know how to swim to research swimming. You just need to know how to gather data (by studying swimmers), and how to analyze that data to draw some conclusions.
I think the mixup is reflected in the comments here on HN too, people going to study CS in hopes to learn to program, with no intention in becoming a scientist. And then they are disappointed when the CS curriculum is trying to train them to be scientists.
imho the whole computer related education needs a complete re-engineering, from primary schools to universities. We need to assess what kind of people we need (scientists, engineers, mechanics, professionals, common people, etc?), and what skills they need to be efficient at their future jobs. I think it's quite clear that the concept of having CS and throwing everything computer-related there is not working very well atm.
> Honestly, this advice applies to anyone anywhere.
A good university teaches you things in a systematic manner, and teaches you things which you won't learn by yourself. It's not that you can't - most likely you won't. Universities like MIT and Stanford have been around for a long time, and a lot of thought has been given to designing courses.
When you are in a university, your whole schedule is dedicated to learning, which generally isn't the case while learning on your own.
There are many problems while learning CS which you will need help with. There are qualified peers and teachers available who you can go to.
Universities make you learn unpleasant things - things which you won't be learning on your own. Most of the subjects require a basic investment before you learn to truly appreciate it(it's true for non cs as well - music, sports, painting etc). When you are on your own, you might very well become discouraged and not pursue it.
Most of the self taught programmers don't understand lexing, parsing, advanced datastrucutres(think red-black tree, b-tree, tries, splay list), various locking protocols, memory management etc. The reason for it is it doesn't take much to cruise through your day job, and they don't see why they have to learn this stuff. But many jobs do demand your command over these topics, and top paid programmers are proficient in these, setting a precedent.
Give that the article recommends the constructive and practical step of downloading and working through an MIT course I think it is clear what was meant was that while Rwandan universities aren't very good at teaching CS there are plenty universities who do a splendid job.
Unless, of course, you are really claiming that all CS courses everywhere are pointless?
i earned a bs in computer science from a liberals arts college (Xavier) in 2007, and an MS in computer science from the University of North Carolina in 2009. I am thoroughly convinced i'd be much farther along in my career now if i'd never gone to college.
thinkign about this has brought back a lot of memories, so i apologize for the long post.. maybe i'll turn this into a blog post.
at the end of high school (i graduated in 2003), i spent a lot of time hanging out with defunkt (github co-founder and ceo). we dreamed of making our own games; "you be john carmack and i'll be john romero," he told me once. summer 2003, between halo (and later planetside) LAN parties with our circle of friends, i started learning directx. our plans were probably too ambitious (3d multiplayer action game) for a group of recent high school graduates with no work experience, limited knowledge of c++, and no art skills. i got to the point where i had a .x mesh of a tiger moving around a hightfield (with shading!), a simple network chat protocol and console, but when our artist left for college, i had no real hope of finishing the game.
towards the end of that summer, we started a 'consulting firm' which never really went anywhere. when school started i spent most of my time working on bullshit homework assignemnts and working as a bus boy for spending money. i was also majoring in physics and math, so i didn't have much free time. what little time i did have, though, i spent programming. defunkt showed me php and apache, and i learned far more trying in the 10 hours a week i spent programming a 'schedule the bus boys' web app than i did in the 30 hours a week i spent going to class and doing homework.
defunkt spent most of high school fucking around and having fun, whereas i spent it studying my ass off and taking AP classes to get more college credits - i started undergrad with something like 50 credit hours. defunkt didnt' get into the college he was hoping to (miami univeristy of ohio), so he started at a community college instead. he dropped out in spring 2004 when he realized how worthless it was for him. i knew he'd be wildly succesful and cursed myself for not having the courage to do what he did.
he then spent all his time trying to find programming work, while i spent all my time busing tables and doing all the stuff i had to do for the english and theology classes i was taking becuase i chose to go to liberal arts college in cincinnati, ohio instead of an engineering program at a top-rated school. i had a girlfriend at the time, whom i'd been dating since i was a freshman in high school, and i thought i was chosing love over money. :-/
defunkt found some work doing web development for a trucking company in new jersey (i'll always admire his hustle) and in spring 2005 he parlayed that experience into an offer to work for cnet in san francisco. he tried to convince me to move with him when he got the offer from cnet. at the time, i told him something like 'i know you're going to be incredibly succesfull but i dont have the guts to quiet college.' to be honest i really watned to go, but i was still in that (now very unhealthy) relationship at the time, and didn't have the courage or insight necessary to break it off.
fall 2005 was the worst period of my life. my friend was apparently doing quite well for himself in california, and i was bored and miserable in college, stuck in a relatinship i thought i had no way out of. i had had tried unsuccessfully to get programming internships, but hat no luck becuase xavier wasn't known for its cs program, and the best i could do was an IT job at a medical device manufacturer. i spent my days fixing corrupted outlook installations and installing replacement hard drives. all the while i was coding like mad on the weekends, on toy projects (a risk map generator was one of my favorites) and simple games. again, i learned more about good design and code layout working on those projects than i did in class, where i was now ostensibly learning about "software engineering".
the only thing i remember from the software engineering class i took was when we were pretending to come up with 'user stories' for an electronic voting machine. my friend jacob and i were supposed to be the customers, and sharon and kyle were supposed to be the developers. jacob and i said that the machine should be a regular dodecahedron that spins on its axis 'like those sunglass racks at the malls', and it should have eye recongition, a finger print scanner, and stool sample acceptor to identify voters. it's still funny in retrospect, and i guess it did teach us that customers are fucking morons, but i could have told you that without the class.
fall 2005, i was diagnosed with depression and then bipolar disorder, and put on a number of different medications. i tried to kill myself a few times and went to a mental hopistal. my life seemed to be going nowhere. i figured i'd be stuck in that relatniship the rest of my life, doomed to spend eterntiy fixing broken hard drives in cincinnati.
finally, in early 2006, i worked up the courage to break up with my girlfriend. live got a hell of a lot better.
damn this is long.. to the point!
i learned a lot of aweosme stuff in school, don't get me wrong. i can show you how to convert a deterministic finite state machine to a regular expression, and construct a NFA for ww' like nobody's buisness. i spent summer 2006 working for the NSF on approximation algorithms, so i learned a lot about that kind of thing. and there were some things i learned in school that have been really useful - we wrote an operating system my senior year, and it was a hell of a lot of work. i learned a ton about debugging and machine code.
at the end of the day though, i look at where defunkt is now, ceo of a wildly succsessful start that's basically a household name among hackers, and i'm still a nobody.
i woke up one morning when i was 14 and decided i'd better start kicking ass in school if i wanted to succesed in life. if i could go back to 14 year old me, i'd say forget abotu school. you can learn a hell of a lot faster than any teacher can teach you. learn to code by coding nonstop, and get experiecne working for other people as soon as you can. the stuff you learn in school is valuable, true, but it's not worth the opportunity cost. i had a full ride to undergrad and still feel like it was a net negative financial decision.
Dropping out of college to run a startup is a bit like dropping out of college to play in a band.
For a lucky few (and I do mean lucky), it works out magnificently - but for the majority who try it, you don't get anywhere meaningful.
During the boom time a few years back, it was a more viable option, but in todays economy it's a far more risky venture and you're highly likely to spend a few years going nowhere, rather than ending up with a degree and the reasonable shot at a steady job that that gives you.
I probably wouldn't recommend a CS degree at a liberal arts college not known for its CS program, but I would certainly recommend studying at a well-known institution over striking out on your own.
Dropping out of college to run a startup is a bit like dropping out of college to play in a band.
The chances of hitting the big time may be roughly similar but the median guy who's spent four years working on becoming a rockstar 30 hours a week, seriously, no bullshitting can play music well and has a very nice social circle, the median programmer-equivalent can get a well paying job even if he never makes it as a startup founder.
Your possibly correct, but its only because of the way the market turned out for programmers. At age 14 I don't know if you'd know how the market would turn out. Lets put it this way, a home schooled mathematician or physicist is likely unemployed, but one with a MS from UNC can pretty easily get a job in a variety of places.
I honestly can't say that if we were to have another bubble that acquisitions for startups wouldn't completely dry up. And, like music, services cluster around the big companies. It could well be the case that the next 20 years in SW doesn't look like the last 20 in that startup founders are simply a long shot, ala the rock star analogy someone made earlier.
You happen to live in the golden age for SW. A similar thing happened for electrical engineers in the 70s (although not as broad or as big). I suspect something similar might happen for biologists in the future (although a homeschooled biologist would be lucky to drive a taxi in today's market).
School does take time, but it also mittigates some of this risk. And more importantly, you can drop out of school if you see this happening. I knew a lot of people who dropped out of school. In fact I knew one guy who sold his company to GM for $5M and never missed a class (this was back in the early 90s when this sort of thing was a lot less common -- pre-web). I think blaming school is a bit of a stretch. Those that'll make it big, will do so.
I think I see what you're trying to say --- practical experience beats theoretical knowledge in most work you'll do in industry --- and I agree. But as someone who did an EECS program that didn't require a lot of coding, I've found that a lot of the practical specifics are easy to pick up when they readily fit within the theoretical frameworks that I've learned.
And to those HNers who think that inability to FizzBuzz is a funny story made up by overly cynical neck beards: spend a year hiring.