
How to become a programmer, or the art of Googling well - okepi
http://okepi.wordpress.com/2014/08/21/how-to-become-a-programmer-or-the-art-of-googling-well/
======
sanxiyn
This is very true, but it's a bit more complicated than that.

"I'd come to understand that the answer was out there, somewhere." The answer
is out there, but so is the wrong answer. Recognizing the right answer is the
hard part.

I also must point out that the answer is out there _if you know English_.
Knowing English is a strong privilege. Success rate plummets if you Google
programming questions in a language other than English.

~~~
yen223
This is something I've always wondered - how do programmers who don't natively
speak, read, or write English cope with the sheer amount of literature they
have to parse to have a career programming?

~~~
sanxiyn
I don't natively speak, read, or write English. Speaking for myself, you cope
by studying English. Blood, toil, tears, and sweat are involved.

~~~
yen223
For what it's worth, your English is pretty good.

------
fhadley
I found that one particular phrase,"technically privileged", both hilarious
and utterly horrifying. Hilarious because I suppose I never paused to consider
that the folks in my major who were both curious and motivated enough to be
involved in the field outside of class to be particularly "privileged". I
suppose I should have given greater thought to how unfair it was that read API
documents and I didn't!

Like I said though, it wasn't just good times and passive aggressive
complaining about first world problems while I read this. I can't even begin
to fathom the miserable, pathetic, and generally small, unexamined existence
that would lead one to believe that h(s)e is somehow the victim of deep
injustice at the hands of those people with their prejudiced technical
abilities and natural curiosity! How dare they not level the playing field
just because she never bothered to explore the use of code outside the
classroom; clearly everyone missed that she's the subjugated one, with a
comfortable liberal arts education and regular internet access.

But still, we should all take a moment to recognize the plight of the
comfortable, generally satisfactory lives of those among us struggling
silently with the burden of "technical un-privilege."

~~~
chrisBob
Did we read the same thing? I got the impression that the author realized at
the end that "technically privileged" was just an illusion, and the whole
point is that they don't exist.

~~~
aragot
Yes, to me this piece flies way past the "technically privileged" assertion.
And in this way, it is one of the best counter-arguments to the "technically
privileged" accusation some people have against our field.

------
devnonymous
This, for me was a bit surreal and strange, because it took a long while for
me to arrive at the same conclusion but from the complete opposite end.

I came to computers from electronics and for me, Data Structures and
Algorithms was (to an extent, still is) black magic with Don Knuth the
presiding head wizard. For me, compilers, filesystems and OS internals were
all sort of deep dark places that I wasn't equipped to handle. On the other
hand, banging out a shell script, spewing perl, or reciting python was just a
matter of figuring out the right set of incantations ...not really hard. I
learned html, css, js, a lot of python and was (/am) happy to just 'get-
things-done' with these skills. I looked at people who could talk about BigO,
concurrency, monads and the rest as the 'privileged' \-- I could never be
/that/ good. And yes, I thought all of this was relevant to software
engineering (as opposed to science) and that I would never get there.
Fortunately, I no longer think this. Thanks to all the resources available
online these days, the limits, I know now, are not inherent nor are imposed by
ability to understand, they are imposed simply by time for learning and
practice. So, I am still learning and yes, in that sense, the art of googling
well can make you a better programmer -- irrespective of what you know today.

~~~
meowface
I'm in a similar boat. I majored in "Information Systems" which was
practically a glorified business degree with some IT, networking, and a tiny
bit of programming thrown in.

I was able to pick up comp sci fundamentals from various awesome online
tutorials and even just good old Wikipedia.

------
grecy
I currently work with a bunch of people who are "business majors" or whatever
and are similarly self-taught in the Tech/IT/Programming space.

It's interesting to watch how they work and the kinds of outputs they produce.
Quite a lot of the stuff works... mostly...

It's entirely untestable, not repeatable, undocumented and just stuck together
with flaky glue code.

Sure, if you aiming to "make it work" you can do that. If you're aiming to do
well... I suggest learning proper technique.

~~~
7Figures2Commas
> It's entirely untestable, not repeatable, undocumented and just stuck
> together with flaky glue code.

Code that's testable, repeatable, well-documented and elegant doesn't
guarantee that an application will actually meet anyone's needs in a
commercially sufficient manner.

The WordPress code base is frequently criticized, and the Facebook index.php
code from 2007[1] will probably make some people cringe, but these are just
two of many examples demonstrating that if you want to "do well", building
applications that work and meet the needs of their users is initially a lot
more important than "proper technique."

[1]
[https://gist.github.com/nikcub/3833406](https://gist.github.com/nikcub/3833406)

~~~
Wilya
If the Facebook code had stayed untestable and undocumented, it would never
have worked at their current scale.

Testing and documentation make a difference in the long term. Unless your
business model is "build a shiny tower and sell it before it crumbles", at
some point, you'll have to fix the mess you made in the early days of the
application.

------
mapcars
>Some Small Advice: if you’re just beginning to program, I’d suggest starting
with JavaScript/HTML/CSS because there is a plethora of help out there.

What a terrible advice.

~~~
oevi
Why? For beginners web technologies are perfect. you can have results like a
first static page within the first day and from that point go on to eventually
build complex web apps. and all that with the same tools and languages. you
will not be a programmer at first, but you might become one.

~~~
mawburn
I think it's a great entry point. HTML/CSS is a very low entry bar to be
introduced on how to talk to a computer. Of course it's not "programming" and
very little logic, but it can show people one very important thing:

"See look, it's not so hard to talk to a computer. Those words on TV aren't
all gibberish."

It's not like it teaches bad practices like a number of other "entry level"
languages do. I'm sure the majority of people in my generation (late 20's,
early 30's) started with HTML/CSS when they were kids.

------
rpdillon
Googling well is very helpful in filling in gaps in your knowledge that are
widely known by others. For most (?) software engineering jobs, that's
probably enough.

Writing some code that works, though, doesn't forward the state of the art. I
was lucky enough to take AP computer science in high school. I remember
arguing with the teacher when she criticized my code in front of the class. I
said something along the lines of "Well, it runs and produces the right
output!" She then lit into me, explaining that the structure of the code, its
readability and maintainability were at least as important as its output. I've
carried that lesson with me in the 19 years since, and had in reinforced
multiple times over.

The art of "Googling well" won't teach you good abstraction and
maintainability, and yet I would argue it is one difference between junior
engineers and (good) senior engineers. We talk about learning all these
frameworks, but that's not nearly as useful as developing the skills to create
the next powerful abstraction to make a class of hard or time-consuming
problems easier or faster to solve. You won't learn how to do that on Stack
Overflow.

~~~
fibbery
Do you have any thoughts on how a junior engineer can improve their ability to
write maintainable code? This is the main problem I struggle with as a self-
taught developer. I can write code that works for the most part thanks to
googling all the things, but my projects tend to turn to spaghetti the longer
I work on them, and are greek to me when I return to them in 6 months.

Part of the issue is that it's much more rewarding to add a new shiny feature
than it is to refactor the existing mess, but another part is I'm not really
sure what goes where. Most online courses targeted at inexperienced
programmers teach x feature of y programming language, instead of practical
software engineering... as a result I feel like I've learned how to build a
fancy stained glass door for a house that has an unstable foundation.

I've often thought I'd like to hire a senior dev to sit with me and help me
work through building an app the 'correct' way... but short of that I'd love
to know of any books or web resources that would help.

~~~
finder83
I was also self-taught and it took a good 2 years for me to get to the point
to be able to write maintainable code. Here are the lessons I learned, in no
particular order:

1.) Read your code after you write it. I do this via git diff --cached. It's
amazing how many bugs you catch this way. Be critical of variable names, code
layout or confusion, lack of documentation. It's basically doing your own code
review. Is it documented? Is it tested? Does it make sense logically? Is it
easy to read?

2.) Document stuff. Fluff documentation is even fine to start with, you'll
eventually learn to separate the important documentation from fluff.
Ultimately you need to get to the point of the "why" code does what it does,
not the "what" it does. "What" it does should be evident by the code itself
and the variable names/etc.

3.) Plan ahead. I don't mean pseudo-code per-se...more thinking or writing
down how code will fit together. Mind mapping is great for this, particularly
with a white board or tile. I have a Galaxy Note that I bought partially for
this purpose and use Papyrus for it now. Basically, how do the abstractions
and parts fit together? Is it logical? Not everything requires a whiteboard,
but a few minutes of thinking ahead can help spaghetti code a lot.

4.) Learn different programming paradigms. OO style can quickly become un-
maintainable even to pros. I suggest learning functional programming in a
language like Scheme/Clojure, Lisp, or Erlang. I now pick up a new language
every year in different paradigms...not so much to learn the language or to
brag, but to learn different way things can be architected, and the way other
languages do things.

5.) Do refactor. Outside of budget constraints, don't be afraid to rewrite
code that doesn't seem to flow properly.

You mentioned sitting with a senior dev...that was pretty huge for me too,
even in limited times. (I'm not sure I'd pay for it, but it did cut the
learning curve down quite a bit) Having someone do code reviews of your code
that knows what they're doing and invests time in it is helpful too. I've
found though that not every Senior dev is good at reviewing code or
teaching...

Sorry, I don't have any actual resources for this other than well structured
code like Django (mostly) or sqlite. I now have a B.S. in CS and I don't
really think they teach this well in schools either. Patterns will only get
you so far in OO too...generally, trying new languages, reading code, and
refactoring has made the largest impact on me.

------
unclesaamm
It seems like the skill in question isn't necessarily about becoming a
programmer as it is about becoming a _hacker_. It's a fine line, but I think
the skills you learn at Google will be much more programmer-esque, like code
review, unit testing, and doodling on whiteboards :). Whereas I see deploying
APIs in weekends to get things off Craigslist to be in the domain of hacker-
ish things, what someone else already called "hobbyist". I think that's an
important and subtle flag for career prospects, so the line isn't that clear,
though.

Another point I get from this is both a critique and praise for CS learned in
a liberal arts college. You felt unqualified for getting a software
engineering job, which is something that really needs to be addressed in small
LACs. On the other hand, academic rigor probably prepared you well for cutting
through bullshit that surrounds fashionable technologies. For example, you may
not have heard of Heroku, but you may have learned about networking protocols
and virtualization, which I think is the harder part to learn.

I think you struck a good community by choosing web development (a bit
biased), but I'd like to amend that with a word for the road not taken, which
is that back-end programming is becoming really, really accessible as well.
Tutorials for Flask, Node, and Rails are just as prevalent (and potentially
misleading) as HTML tutorials of yore. Now anyone with a mac (and even
windows! would you believe that!) can set up a server and push "hello world"
to heroku.

Anyway, I'm looking forward to seeing "How to become a Googler, or the art of
????? well". I don't know what ???? is but I imagine it involves a lot of
frustrated inability to Google things :)

------
bpizzi
My 2cents.

Don't be fooled by this false sense of know-how when you just start being able
to write some html/js stuff.

Googling a problem is a reflex when you start coding, and yes, good or bad
googling abilities could be the difference between you still being in the
industry in 5 years or not.

But, still, this is only a first step on your path, and stopping there will
also stop you from being a real hacker.

There are things that just can't be resolved with a single search: "How to
center a div in CSS" is not like "How to share load across different servers",
because a big question must be divided into a lot a smaller ones, and there
comes the difference between you and your "code-god compatriot".

So the real path looks more like this: 1- read good literature (CS,
functionnal programming, network, etc), 2- exercise, 3- read good code, 4-
exercise, 5- goto 1.

Anyhow, best of luck at Google ;)

~~~
collyw
I started learning in 2000, before Google was big and Stack Oveflow didn't
exist. I think every new programmer gets a false sense of how easy everything
is.

14 years of learning later, I now realize how little I know.

~~~
coldcode
I started coding in high school in 1973 and professionally in 1981 with no
benefit of any classes (other than the one in high school). Believe me I
prefer to live in the modern age where your knowledge is expanded by the
world's collective brains. In the "old days" you only had your own brain and
limited library books and periodicals and maybe a good buddy. It was much
harder than today to do anything you didn't already know but we didn't know
any other way. Today it's much easier to find information, get ideas and
opinions. I even use Google to find method names in iOS documentation (Xcode's
sucks). But you still need to be able to understand what you read, decide if
it is relevant, and how to apply it. Those things you can't just learn from
Google fu, it takes experience, trial and error, and a willingness to
recognize when you are wrong.

------
Tehnix
Except for maybe Haskell[0] and Lisp[0], I've begun to feel like there isn't
any language that I can't quickly learn with how I'm able to google at the
moment.

For example, I'm currently helping some fellow students with their F#
assignments, even though I don't do F# at all. I just know what to google,
because I know the concepts that I need translated to the specific syntax.

[0] Maybe Lisp, but Haskell is way too different from other languages in the
way to programme. I'm currently learning it, but it's by far the language that
has taken me the longest.

~~~
brudgers
Take a look at APL. There will be three.

~~~
aerique
I think there's only two and Lisp doesn't need to be on that list, but maybe I
say that because I've been using Common Lisp for so long.

Lisp ought to be easy since all you basically have to learn is: "(function
parameter1 ... parameterN)".

Coming from Lisp I've been trying to learn some Haskell and holy cow
syntax[1]! There's a lot to parse and know (compared to Lisp) before being
able to write a small program.

[1] I know it is not literally syntax but mostly function calls, it's still a
lot of extra special characters one needs to know about.

------
ayrx
I'll argue that good programmers _need_ to have a working understanding of
algorithms, databases, compilers and all that. Sure, it's not something you
will use day-to-day in a software engineering job but it's important to know
how all the low level pieces of your stack fit together in order to write good
code.

There's nothing worse than a programmer that fits together code snippets from
Stackoverflow and similar sites without understanding what it is actually
doing.

~~~
bdcravens
I think it's fair to say that you can be effective without necessarily being
good and vice versa.

I think the some of the best developers are those who are smart enough to have
gotten a CS degree but skipped a bit of the academics. (A bit self serving: I
graduated high school in 1996, had my first intro IT job by the fall of 1998,
and had my first real programming job in January 2000, while my contemporaries
were still in college)

~~~
jjoonathan
Everyone overvalues education similar to their own and undervalues education
dissimilar to their own.

~~~
outrightfree
Everyone generalises too much.

~~~
tux3
Best 4 words I've read today.

~~~
nevergotenglish
The general conclusion is that you haven't read much today.

------
WBrentWilliams
This was fun to read. What I saw was someone say that they were panicking
because they needed time to understand how all the things that go into
learning to be a researcher goes into learning how to be a professional
programmer. I'm quite sure his mind will be blown once he realizes that
creating things, while incredibly rewarding, is only half the work. The other
half is getting someone else to use your widget. Also (bad at math joke),
there's an extra 50% involved in getting attribution.

My take? I'm biased because I was educated as a researcher. I can name-drop
three famous professors at my alma mater (and yes, I did study under all
three), but what really pushed me was getting a job, on campus, writing
software to support PhD candidates in another discipline. I quickly made the
jump from researcher to practicum precisely because I was trained as a
researcher, then applied those skills to understanding what my customers
needed.

Seems to me this guy found his own "push". And yet, he's still a researcher.

~~~
enraged_camel
>>but what really pushed me was getting a job, on campus, writing software to
support PhD candidates in another discipline. I quickly made the jump from
researcher to practicum precisely because I was trained as a researcher, then
applied those skills to understanding what my customers needed.

I think what allowed you to make that jump was that you were inherently
familiar with the problem domain; even though your customers did research in
another discipline, at the end of the day they were still researchers.

I was the lead trainer at my company, and the training materials (hundreds of
pages of them) used to be on Word documents. I got fed up with it, taught
myself Rails, developed and deployed a learning management system, and
migrated the content there. It was very successful because as the lead
trainer, I knew exactly what features would be needed and how they should
work. It was kind of funny actually because when I gave a demo to the trainers
in other teams, they basically said, "wow, this is _exactly_ what we need --
when can we start using it?" Which is music to any programmer's ears.

------
sbierwagen

      The first time I met him, he was in the middle of writing a 
      script to scrape Craigslist of all its free furniture 
      listings (which is illegal, btw).
    

It's a violation of the Craigslist TOS, a contract between two citizens, so it
would be covered under civil law, not criminal. A creative prosecutors could
try to spin it as a crime under the CFAA,
([http://en.wikipedia.org/wiki/Computer_Fraud_and_Abuse_Act](http://en.wikipedia.org/wiki/Computer_Fraud_and_Abuse_Act))
and there in fact _have_ been CFAA prosecutions for scraping Craigslist
listings,
([http://en.wikipedia.org/wiki/Craigslist_v._3Taps](http://en.wikipedia.org/wiki/Craigslist_v._3Taps))
but I doubt there's much a case here.

~~~
jElais
This would fall under US v Drew ([http://www.dmlp.org/threats/united-states-v-
drew](http://www.dmlp.org/threats/united-states-v-drew)). A case where someone
violated the MySpace TOS and then was charged under the CFAA. The Judge ruled
this was not a violation citing the void-for-vaguness doctrine and not wanting
to give the power to right federal laws to websites.

------
JacksonGariety
Learning to “google well” has become the fundamental skill to replace
reading/writing well in life. Scary.

------
mattfrommars
Wow, the guy is exactly me when he graduated college and in winter he started
panicking. Pretty good in Googling too lol Graduated with a degree in
Mechanical Engineering this year summer and unemployed since. Winter now,
panicking. Learning web Development in hope of getting into something. Strange
how similar his and my path are up to winter. Time will tell where I end up.

------
gtirloni
* But a liberal arts CS major prepares you for a career in computer science research, which is completely different from, say, software engineering. It’s like comparing a physical therapist with an athlete

Kind of funny that software engineering is compared to an athlete. In the
current situation, I'd compare it with a headless chicken.

------
russgray
Over time I have come to the conclusion that one of the best ways to identify
a really interesting problem is when your attempts to google a solution come
up blank. Google doesn't have all the answers, and if it becomes literally
your only mechanism for moving forward you will hit a wall sooner or later.

------
atmosx
Hm this can go the other way around too: You don't realise how _hard_ is
something and how far and away some people are, until you start
programming[1]. Same goes for other sciences/sports/whatever.

[http://xkcd.com/1425/](http://xkcd.com/1425/)

------
CmonDev
Google is your remote long term memory. Why wouldn't you use your long term
memory? Sooner or later our brains will be modified to make the round-trip of
entering request and getting a result much shorter and the difference will
disappear.

------
dobbsbob
Or google 'what books should I read to become a programmer'
[http://matt.might.net/articles/what-cs-majors-should-
know/](http://matt.might.net/articles/what-cs-majors-should-know/)

------
elemenofi
I feel the opposite. I am a self-taught full stack programmer and yet I wish I
had some sort of degree to pursue research as a career.

------
touristtam
this just reminds me of the Expert Beginner: [http://www.daedtech.com/how-
developers-stop-learning-rise-of...](http://www.daedtech.com/how-developers-
stop-learning-rise-of-the-expert-beginner)

------
thisjepisje
In my mind I am pronouncing the italicized words with an Italian accent.

------
jchmura
I thought this was going to be something bashing programmers by the nature of
the title. Glad I was wrong. Great story and something that all aspiring
programmers should stick to.

------
plicense
So the OP used Google to get a job at well, Google.

------
Kenji
"But I’d never even heard of the words front-end developer or full-stack. What
was Heroku? Never heard of Xcode. Wasn’t git just the thing you used to make
sure your partner had access to the code you’d written? Frameworks? Didn’t you
just need HTML and Javascript? What the hell was an API?!"

If you literally never heard about any of those during your computer science
courses, you attended a sad, sad university.

~~~
Wilya
Apart from HTML/Javascript, which is usually taught in a web development
course, most of these aren't taught in usual computer science courses because
they have nothing to do with computer science. They are software engineering
concepts.

~~~
Kenji
I am well aware of that, being a CS student myself. However, those things are
expected to be learned alongside. There won't be lectures about it but hand-on
exercises will be impossible without them.

~~~
joslin01
Lol that's not true either. How would hands-on exercises be impossible without
Heroku? Haha. You know what I did in my CS classes? Wrote my own server in C.
That's real CS, which is very focused on deep understanding -- not domain
knowledge in software tools. You should ditch the attitude. Your first comment
wasn't even necessary. You were just looking to feel good about yourself.

~~~
Kenji
You wrote your own server without using any kind of API (e.g. TCP sockets)? I
don't believe you ;)

