

You Don't Know JavaScript - mwbiz
http://www.w2lessons.com/2011/04/you-dont-know-javascript.html

======
raganwald
This 'irritating problem' of people claiming that they know _____ when they
actually don't, is best solved with... drum roll... Source code. Don't tell me
you know _____, show me what you did with _____.

Today that problem can be solved with Github, Sourceforge, Google Code or
whatever. A decade ago I remember asking for a job as a Java developer by
taking the source code for a Scheme interpreter written in Java into the
interview. A checklist of features is a nice starting point for things to look
for for when learning, but there is no substitute for solving problems with
the language. Thus, one day you will be able to say what you did with it,
rather than which features you understand.

So my feedback for the author is this: Write a followup suggesting some sample
projects to write, organized by level of difficulty, just as you've organized
language features by difficulty. The projects shouldn't be large, just things
that will tend to force the developer into an in-depth understanding of one or
more of the advanced features you have suggested. For example... You mentioned
timers. What could/should I build if I want some experience using timers?

~~~
nxn
"This 'irritating problem' of people claiming that they know _____ when they
actually don't, is best solved with... drum roll... Source code. Don't tell me
you know _____, show me what you did with _____. Today that problem can be
solved with Github, Sourceforge, Google Code or whatever."

That isn't really a complete solution to the problem, take my situation as an
example: I've been working as a C# dev for some years now, but since the
company I worked for ended up owning all the code, and since almost all the
applications I helped create for them are internal, I have nothing to really
show for it. Why don't I have any side projects I've done with C#? It's just
simply not my first choice of language for personal projects due to the fact I
have to use it so much on a daily basis; instead, I tend to go with lesser
known languages that I'm certainly not as familiar with just because it makes
writing some of the code a little more exciting. In essence, I'm claiming to
know the language, but the only proof I can give is saying "Well, I used it
daily for X amount of time".

~~~
raganwald
This came up a while back, and I feel your pain. That Java job I told you
about? All the Java and C++ code now belongs to Quest, who bought my employer.
And I did some good work on ING Direct (USA), but I can't show that to you,
either.

My wife once bought a bunch of postcards from a printer to promote her
business as a photographer. Right on their price list was a charge for a
credit waiver. basically, every postcard had to have a small "Printed by
FooCorp 1-800-888-8888" on it. If you didn't want that, you paid extra.

I have reached the point where I feel the same way about the code I write.
Naturally, nobody can see trade secrets. But if there's a portion of the code
that is not a trade secret, perhaps a Rails or jQuery plugin that gets
developed along the way, I want that open sourced. If the answer is "No, we
want to own everything 100%," I need to make extra money to make up for the
fact that I am going to go dark, just as that printer needs to charge extra
money to make up for the lost advertising opportunity.

~~~
bergie
Our employment contracts actually require us to open source everything our
hackers build (except some client-specific configurations or templates of
course)

------
nsfmc
So despite the mostly vapid nature of this article one thing called out to me:

 _"Given the lax nature of JavaScript, it's easy for your application to
spiral into a mess of unmaintainable spaghetti code."_

Let's not forget: it's entirely possible to create a mess of unmaintainable
code in _any_ language. Or, _"guns don't kill people, people kill people"_

The other half of this complaint i think is somewhat elitist (unwittingly so?)
and it seems to do with the notion that because there is a such a low barrier
to entry, that much js code is cargo-culted, but i've seen this from
developers in every language. What I find even worse than cargo-cult code is
Pattern Zealots going about specifically coding up Pattern X in javascript.
It's like they studied Design Patterns but the point of it just went over
their heads.

Knowing the principles of software development doesn't prevent you from making
ridiculous decisions[1]. It seems like everyone wants checklists of coding
standards or _something_ for measuring code quality / standards compliance
these days in js. But these are hollow measures if the code behind the
module/black box/library is just plain wrong.

Maybe i'm missing something here, but _why_ is this article getting voted up?

[1]: [http://stackoverflow.com/questions/1635800/javascript-
best-s...](http://stackoverflow.com/questions/1635800/javascript-best-
singleton-pattern) (found when googling 'javascript singleton')

~~~
quanticle
_Let's not forget: it's entirely possible to create a mess of unmaintainable
code in any language. Or, "guns don't kill people, people kill people"_

That's true. You can write FORTRAN in any language. However, some languages
make certain classes of mistakes easier. For example, C makes it very easy
leak memory. Java, with its automatic garbage collection, makes it
considerably harder.

Does this mean that memory leaks are impossible in Java? Of course not. But
I'd still rather have memory management than not.

~~~
nsfmc
an aside: i have been asked three times in separate technical interviews
(several years apart even) how to leak memory in java (once in python).

~~~
zlapper
I would like you to show us some examples!

~~~
quanticle
I can't remember any Java examples at the moment, but I do recall a memory
leak that I had created in C#.

Registering an event handler in .Net creates a reference to the handler. This
means that an event handler that doesn't un-register itself from it's event
will never be garbage collected. In the context of a GUI application, this
means that you have to be careful to ensure that child windows remove their
event handlers when they're closed. Otherwise, your application will leak
memory, as the closed windows will never be garbage collected.

------
ionfish
The author apparently has a rather low bar for attributing an advanced level
of understanding.

> Understanding a methods 'arguments' variable and how it can be used to
> overload functions through arguments.length and make recursive calls through
> arguments.callee

The arguments object is one of the first things anyone learning about
functions in JavaScript is introduced to. arguments.callee is a little more
obscure, but not a particularly difficult concept.

> Advanced closures such as self-memoizing functions, partial functions, and
> the lovely (function(){})() call

Using an immediately-executed anonymous function to enforce a scope change and
hide variables is a pretty common pattern. I suppose memoisation might belong
on an 'advanced' list. As indicated later, the author clearly doesn't know
what a partial function actually is.

> Function and html prototyping, the prototype chain, and how to use base
> JavaScript objects and functions (e.g. Array) to minimize coding

Surely this should be part of the basic level of understanding required of any
JS programmer. Understanding the basic semantics of a language's object model
is pretty essential to doing anything much with it.

> Object type and the use of instanceof

I once had to teach some novice programmers about JavaScript. We dealt with
objects and the 'instanceof' operator in, I think, around the third session.
Understanding the JS object model is basic knowledge.

> Regular expressions and expression compiling

This should be meat and drink for any professional programmer. There's nothing
particularly weird about regular expressions in JavaScript. Fine, you can
create regular expressions by writing new RegExp("my pattern as a string"),
but so what? A quick read of any JS reference will reveal this fact; it's not
exactly arcane knowledge.

> Knowing how to handle and use partial functions

Err, what? All functions in JavaScript are partial, insofar as there are
arguments at which the value of the function is not defined. Perhaps the
author meant _partially applied functions_ , which are a completely different
thing.

> With statements and why you shouldn't use them

The concept of 'with' statements is fairly straightforward. I admit that
understanding just why they're generally a bad idea (and the problems they
cause for people writing JS interpreters) requires an understanding of some
subtleties of the scope model.

> The most difficult part of all, knowing how to tie all these tools together
> into clean, robust, fast, maintainable, and cross browser compatible code.

Finally, something that uncontentiously belongs on an 'advanced' list! Note
that unlike the others, it doesn't turn on grasping how some particular
language (mis)feature works. In other words, there's more to knowing what
you're doing than knowing what the language does.

~~~
kragen
> there's more to knowing what you're doing than knowing what the language
> does.

Sure, but knowing JavaScript isn't just knowing how to program; it also
involves grasping how the various language (mis)features work.

~~~
ionfish
Obviously. All I'm claiming is that knowledge of the language attributes
listed isn't sufficient for being an advanced JavaScript programmer, not that
it's not necessary.

~~~
dts
Understood, but I think providing a list of attributes that you consider
sufficiently advanced would be far more constructive / interesting.

~~~
ionfish
I think raganwald has already put the case better than I could, further up the
thread: the mark of an advanced programmer is being able to use her knowledge
of the language to write programs that solve interesting or difficult
problems. Admittedly that's not JavaScript-specific, but one can easily
specialise this general criterion by reference to specific language attributes
and types of tasks which the language is commonly employed to solve (DOM
scripting etc.).

That's all a bit hand-wavy, so here are some more concrete suggestions. Even
in these days of Node.js et al, JS is mainly used for developing web
frontends, so this will be heavily slanted towards those sorts of issues. An
advanced JavaScript programmer should be able to:

* Develop her own DOM library along the lines of the functionality provided by jQuery or YUI: a CSS selector engine, DOM traversal, element manipulation, all wrapped in a clean and well thought-out API.

* Build an extensible UI toolkit suitable for writing the frontend of a CMS, capable of handling numerous different object types, and communicating with the backend via a specified serialisation protocol.

* Write a testing framework with an equal level of features and stability as common current ones, such as QUnit.

* Create a form validation DSL capable of handling not just simple binary cases and regex-based validation of input fields, but the specification of more complex dependency relationships and requirements. For bonus points, tie it into the backend so the same code generates the frontend DSL code and the backend validation rules, ensuring that they always harmonise.

* Develop complex (as in, complex to implement using the DOM) interface elements such as sliders, drag-and-drop controls etc.

Again, I'm not saying our hypothetical advanced JS hacker should have _done_
all this—just that she should be able to. Note that while some of these
require quite extensive knowledge of the DOM and cross-browser issues, one
could easily construct examples which pitched more towards different
specialities—those above are just problems I'm somewhat familiar with.

------
alexgartrell
Obviously the author is knowledgable about javascript, but this article would
have carried more weight with me if he'd taught me something more instead of
just alluding to all of these concepts that I haven't encountered yet. It kind
of makes the whole thing come off like he has an inferiority complex about
being "just a front-end developer"

~~~
mwbiz
Alex, I'm actually a back-end developer, there is no inferiority complex.

~~~
lawnchair_larry
I think altering the tone with which you use to deliver your message will have
a beneficial effect in reaching people.

For example, I am not going to read this because it sounds really pretentious,
and you are replying to everyone here to argue trivial things. If you don't
have a complex, you don't need to bother with this.

Also, because it ends with this:

>As for the resume decoration, I would say that if you've covered the beginner
level and are venturing into the intermediate stages it is justifiable to put
it on your resume. Once you find yourself developing your desired functions
rather than copying and pasting them, you can then claim to know JavaScript,
until then, please don't advertise it.

 _Really?_

~~~
kragen
Are you skeptical of the idea that there are really people so dishonest that
they would claim on their resume to know a language of which they have only
copied and pasted chunks? Don't be. I've interviewed some of these people. I
wish I could add them to some kind of global blacklist to stop others from
wasting their time on them.

------
StavrosK
Huh, apparently I know JavaScript. I didn't think I did.

------
andrewhoyer
The fact that developers add languages to their resumes that they have only
touched on is a result of job postings that list incredible numbers of skills
which are probably only touched on in the job itself. It took me 10 seconds to
find a job posting on Craigslist, titled "Web Applications Programmer". Here
are only a few lines from the "Position Requirements"

Fluent with PHP, Python, JavaScript, MySQL, HTML, XML, CSS, web services
(SOAP, XML – RPC…) Knowledge of java, ActionScript, Flex and C# is an asset
Experienced with AutoCAD, SolidWorks, Inventor, 3D Studio Max, Flash,
Photoshop, Dreamweaver, Adobe Illustrator

The list goes on to include a bunch of other stuff, plus an array of other
non-technical skills.

What do companies expect? Just to get an interview one might need to add
something they've only touched on.

------
d0m
"You Don't Know JavaScript". Then, it says "With statements and why you
shouldn't use them" is an advanced concept. I guess this post doesn't apply to
hacker news :)

------
bauchidgw
>Understanding a methods 'arguments' variable and how it can be used to
overload functions through arguments.length and make recursive calls through
arguments.callee

seems he doesn't know "use strict"

~~~
mwbiz
Yes I do, if you're using strict this won't work.

~~~
bauchidgw
just saying, mentioning a well known anti pattern as "advanced level of
understanding" is kinda odd.

other than that i believe most of us know that there are shitloads (and then
some) of bad javascript devs out there.

~~~
mwbiz
It is an anti-pattern but it's one that every framework takes advantage of.
jQuery and Dojo use it heavily and it can be dangerous if you plan on
incorporating it in strict mode. I will note strict mode in the article,
thanks for pointing it out.

------
walkon
You don't know what I know.

------
georgieporgie
_I've seen a repetitive pattern of programmers dressing their resumes with
technologies that they don't really know, but have merely touched on._

I always find attitudes toward resumes to be interesting. The entire reason we
mention technologies on resumes is because we used them, and (assuming we're
not completely desperate) we want to use them again. The mere fact that you
have done _anything_ in a language gives you a foot up on the person who truly
has zero exposure to it. Experience is compounding, and each small step can be
worth dramatically more than the last.

I've met too many people who believe that in order to list a technology on
your resume, you must be an 'expert' in it, where the meaning of 'expert'
varies wildly. These tend to be the same people who think that "evaluating a
prospective hire," means, "find any point of weakness and exploit it." It's a
weird, insecure defensiveness. A need to prove candidates wrong, rather than
gaining an understanding of their skill set and experience.

~~~
prodigal_erik
A former coworker once caught someone whose claimed PostScript experience
consisted of clicking "Print to File". I consider that nothing short of fraud.
If a skill is on my résumé, I am offering to rent it to you for substantial
money, which means at a minimum that I have already developed it to the point
of being commercially useful. If there is no honest way for me to claim I've
dabbled a little and I hope to be useless for less time than some others, it's
because nobody has much reason to believe my uninformed self-assessment or
care very much even when it's true.

That said, we once hired a guy who didn't know any Java (actually it was the
same guy as above), because the interview made it perfectly obvious that given
his intelligence and fluency in similar languages, picking up Java was not
going to be a problem for him. He did not try to find an excuse to smuggle
Java into his résumé, he was honest and let us make the call, and it worked
out fine for both of us. If he had cram-studied Java and tried to pass himself
off as experienced, we would have caught him being incompetent or dishonest or
both, and that would have ended the interview.

~~~
georgieporgie
_A former coworker once caught someone whose claimed PostScript experience
consisted of clicking "Print to File"_

Was that deceit, or tremendous ignorance?

It seems to me that there's a huge problem with resumes and interviewing
regarding unknown unknowns. 1-10 ratings, for example, vary wildly depending
on how much you don't know that you don't know. When I graduated college, I
was a 9/10 in C++. Now I'm about a 6, even though I'm ten times the C++
programmer that I was. :-) But I don't dare tell a recruiter that...

I do agree entirely with this statement of yours: _at a minimum that I have
already developed it to the point of being commercially useful_

Which is sort of my point. You can have employed a language or technology,
professionally, to solve a problem, gaining very meaningful experience,
without coming anywhere close to being an expert, or even meeting most
people's requirements for 'knowing' something. I'm certainly not saying that
people should list anything technology they can conceive, on the most tenuous
bases they can rationalize.

