
Learning to Swim By Reading a Book - Teaching CS in Rwanda - nicpottier
http://blog.nyaruka.com/learning-to-swim-by-reading-a-book
======
patio11
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.

~~~
nicpottier
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.

~~~
enry_straker
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.

Let us know of ways we can help, as well.

~~~
nicpottier
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.

------
Fargren
Going on a tangent here.

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.

~~~
mckoss
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.

~~~
Fargren
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.

------
irahul
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.

An hour in the library saves a week in the lab.

~~~
nicpottier
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.

~~~
enry_straker
I beg to differ.

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.

~~~
nicpottier
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.

------
viblo
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.

~~~
toumhi
I was there a few months ago. While tourists were swimming, Filipinos were all
floating with life jackets.

It surprised me that, in a country that is basically a cluster of small
islands and where you can only get around by boat, nobody can swim.

------
zokier
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.

------
saturn
Well, I can never resist implementing these interview questions! Here's my
answer:

    
    
      def strip_dupes string
        res = ''
        string.each_char do |char|
          next if char == res[-1]
          res << char
        end
        res
      end
    

Any improvements?

update: and can never resist reducing them to one-liners either.

    
    
      def strip_dupes str
        str.each_char.inject('') {|r,c| r << c unless c == r[-1]; r}
      end

~~~
nicpottier
You're hired. Though we are mostly a Python shop, I'm sure you'll adapt.
Sorry, no relocation package though. :)

------
MarkPNeyer
"My advice to anybody in Rwanda who wants to learn Computer Science is this:
Don't attend University"

Honestly, this advice applies to anyone anywhere.

~~~
tomjen3
Have you attended a university? Did you study computer science there?

If not, how can you make a comment like that.

~~~
MarkPNeyer
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.

~~~
jbri
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.

~~~
barry-cotter
_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.

