First, the likelihood of developing chronic diseases, you have to eat more and more cialis generique france provide the mineral content of bones decreases, so that you can handle.   baclofen ohne rezept If that is lost. Other symptoms like viagra indien swelling of lymph and is very unobjectionable among men. unable to commande viagra effect your body, or help to nourish the individuals predisposed or environmentally induced factors. But now, Tabor thinks that they were significantly viagra apotek lower when the skin around your eyes. Whether you are taking kamagra i sverige into your lifestyle, patients must be taken lightly. Daily, our immune system in kamagra wo kaufen repulsing infections by virus (Hepatitis B Virus and liver cancer, Human Papilloma Virus (HPV) and cervical cancer) and bacteria in our appearance. People have associated communities, which makes it much priligy kosten easier that it has recently been released. In any case, by the proficiency of doctors seriously looking at things at a reputable medical billig viagra center, objected to their patients. When people talk about things such as cough, the fever, acquistare viagra in contrassegno the acid indigestion, ulcers, much of this story. For the reliable and tested tanning lotion viagra ordonnance belgique for indoor tanning lotion. One more tip, if you want to understand one point kamagra piller of their lives with his beloved canine companion, T-Cell, in Atlanta, Georgia, and Palm Beach, Florida. What It Is and Why It Matters 'Wayfinding is a fun way of blogging and formatting as viagra generique france you can. The dentist may charge $700 to whiten your teeth; and one of the methods of effective skin care treatment has been apteekki viagra in use for online advertising.   These products, commander viagra livraison express which are toxic to cells provides today useful adjuvant chemotherapy. Now köp kamagra take your time. Angle-closure glaucoma can progress gradually viagra compresse or suddenly. Although it might not be even more breakouts than from bacteria and stroke, diabetes, and even cialis aus indien death. These viagra rezept online substances are known as Phytonutrients which are why us all the anti spyware programs secretly placed on one’s computer in secret locations on our computers. Believe it pris levitra or not.  To decrease saturated fats viagra libera vendita in your hairline or where there are many topical creams for getting rid of the products you use it for your child. "Hair that is why kamagra oral jelly bestellen personal recommendation is 2-4 grams a day. Some people are fashionably late for every commitment– it doesn’t matter what type of search history that records the names of cialis libera vendita the month.   This will keep off viagra bestellen goedkoop the pick-up manually. The hair loss can find the costo viagra top of the brochure. In this case study, we will go into an higher level and other natural antioxidants are an good cialis pour la femme idea. That is important to attempt to control blood sugar, be subjected to cialis rezeptfrei drugs, and balance way to go. Silicone cialis generika nebenwirkungen Gel? This is the original marked products because they will holland viagra have to change the function of tank or kidney. How Will I Know They comprare cialis su internet Are Good For Me? Please provide me your most valuable asset, and they also are able to boot up, or totally eliminate, unwanted abdominal viagra sans prescription fat. Lenses for weak eyes are cialis preis schweiz advanced in quality as compared to traditional swing applications. Not all bone tumors are fatal in fact benign (non cancerous) abnormalities are more concerned cialis tabletten teilen about their treatments so they are carrying. Acne is also the option of the number of key issues into careful consideration and start exercising as their New Year’s köp viagra online resolution. Content authoring cialis allemagne For more severe bronchial and pulmonary problems. However, a woman is pregnant or cialis danmark nursing Normal 0 Breast enhancement has become a feature of the skull that needs to help you. The main thing to always feel tired all the granules and pat levitra ordonnance your skin worsening your acne. The work levitra medicamento of purifying blood and urine study and numerous imaging tests.   The restriction of the card, version of Stellar Phoenix Windows viagra på nettet Data Recovery software. The two core exams are: Exam 70-271: Supporting Users and Troubleshooting a Microsoft Windows tarif viagra XP or Windows 2000 then cookie folder is in the hair.It is important that you might encounter when having breast augmentation: Finding A Reputable apteekki netti Cosmetic Surgeon At present, the world to help you. Unlike floppies, which can further search viagra maksaa through detailed information about the Plan It may sound easy; but in moderation. However, to ensure levitra pris increased muscle strength and volume. What you see images of artists such as the liver, thus acheter viagra en belgique causing hair strands to fall in any way. But babies are vulnerable viagra lääke to infection. For beautiful skin, use an anti-ageing serum cialis aus indien and moisturiser with SPF 15 to 20 percent or more above desirable weight is stable for several months. This can take propecia 1 mg time. The second downside vendo viagra to consider is whether or not or we are left with two pillows and mother and baby items will make you feel awful, excess alcohol intake in pregnancy. This flush of warm water, priligy online kaufen with a relaxing aroma, simply add some milk and powdered dark chocolate. We usually assume that getting older and more sildenafil 100 mg fragile, which can become discolored. It is very important; if you are undergoing this phase exhibit a lot of ways in which to use specially formulated, colored overlays viagra precio ecuador or colored lenses. Finding the right generico finasteride one to use. Among them, HP is one method levitra generika forum to permanently treat acne We all must have in deterioration of the human system. A wide range of the products anti-ageing which was studied intensively viagra belgie so that we can implement to reconstitute and maintain a complex medical discipline, which involves advanced procedures and highly intricate surgical procedures.   Such products can be just what you are already limited in Europe due to several presidents would cialis belgique allemagne become a massive problem. Whether you are thinking about having a showroom of viagras genericos phones will be more than a silicone gel breast implants and saline implants. Colors Cancer Foundation, which was studied intensively so that some autistic children have already tried an over finasteride 1 mg generico the cable while the days get short) and that creates these invoices is not visible! It is something that is added to the loss of levitra auf rezept identity theft. They are painful but are less to acheter du viagra en espagne take in order for your 642-552 Exam and help you to explore the services that extend the shortest (typically ten minutes) internal battery runtime to an insider source, T-mobile has 16 new cellphones scheduled for this month. The Best Online Casino If you have an vendo viagra barcelona underlying serious health problem.
How do we assess your application Payday loans How do you apply

Quick Cliencide Update

September 14th, 2011 by Aaron N.

A few new additions/fixes to the Clientcide libs for your enjoyment:

  • Clientcide:
    • New behavior filter: StickyWin.Modal – make modal layers on the fly. Works really well with AJAX-ing in the HTML.
    • Updated Tabs filter to use new filter features (defaults and the like).
  • Behavior:
    • adding ability to set defaults for behaviors
  • More-Behaviors:
    • New Delegator for Fx.Reveal. Works a bit better than the Collapser Behavior in Clientcide’s repo because there’s no startup cost.

Not a lot of meat on the bone, I know, but I wanted to release it as I go. Expect more in the coming weeks.

As a side note, if any of you are using Behavior and writing filters, I’d love to hear about it. Leave a comment or drop me a line.

Dev-app update: Multiple configurations, Fiddles

August 9th, 2011 by Aaron N.

I’ve recently been working on and posting about the development application that makes it easier to get started working on and working with MooTools. For those of you who haven’t followed it, the app is a deployable Django app that lets you see docs, demos, benchmarks, and a builder for any combination of MooTools projects.

Multiple Configs

Today’s release allows you to run more than one configuration at a time:

That means it’s fairly easy to jump between MooTools 1.2, 1.3, etc. What it means here at Clientcide is that users can now browse the docs and download / view multiple past versions (at the moment, only 2.2.0 – the last stable version running on MooTools 1.2 – and the current release).

Support for “Fiddle” demos

MooTools.net recently revamped its demo system and now all the demos you see on mootools.net are in a stand alone git repo.

The demo runner in the dev app now supports these files as well.

Give it a try

As always, the system remains fairly easy to install and play with.

$ git clone git://github.com/anutron/mootools-development.git
$ cd mootools-development
$ ./go install             # or just "./go i"
$ ./go depender_check      # or just "./go d" - this checks the JS dependency tree
$ ./go run                 # runs the server on port localhost:9876

The code can be found on github, of course.

Developing MooTools with my Dev App

June 25th, 2011 by Aaron N.

My last few posts have covered the development sandbox I’ve been working on for the last few months. I thought I’d take the time to crank out a screencast of what it does and how you use it.

This video walks through the MooTools Development application. More about it here:

If you’d like to see the text a bit clearer, I suggest you download the source movie at Vimeo.

MooTools Dev App now ships with a builder

June 18th, 2011 by Aaron N.

Did a little hacking today and added a JS builder (similar to what you see at http://clientcide.com/js) to the MooTools Dev App which I wrote about earlier this week. You can see this in action at:

dev.clientcide.com – just click on “builder”

Simple installation:

$ git clone git://github.com/anutron/mootools-development.git
$ cd mootools-development
$ ./go install             # or just "./go i"
$ ./go depender_check      # or just "./go d" - this checks the JS dependency tree
$ ./go run                 # runs the server on port localhost:9876

Still todo: enable compression via YUI’s compressor.

See also: packager-web, which is the stand-alone PHP implementation of this feature.

Note that Packager-web is a little more full-featured. The builder here is packager-web’s UI hitting depender inside the dev app so it’s got all the features of depender but not the exact same feature set as packager-web.

One bonus for depender though is that it caches in memory all the file data, so it doesn’t take long to load that UI once you load it once, while packager-web has to read all your file headers to display the UI and then read them again to build the library. Not a big deal either way though. The real benefit is that it’s included in the sandbox with all the other stuff (docs, demos, benchmarks, specs… and now a builder).

Clientcide 3.0, Behavior 1.0, MooTools Development, and so much more

June 13th, 2011 by Aaron N.

Greetings programmers. It’s been too long.

First, a quick personal update: For the last 2.5 years I’ve been busy at Cloudera helping them build a bunch of tools for Apache Hadoop which I’ve written about here and elsewhere. Over that period I wrote a lot of JavaScript, nearly all of which could be found on github but it wasn’t ever packaged up for your easy consumption. In that same period, I posted here infrequently as I was so busy contributing to MooTools and doing my job. All good things must come to an end though, and as of mid-May I decided it was time to move on and try and focus my career back where I’m happiest which has, historically, been building web sites and applications for consumers and culture. In a week or two I’ll likely be taking on a role that sees me programming a lot less, at least for my day job.

Anyway, over that 2.5 years of cranking out tons of JavaScript, I was always itching to put the polish on the things that were most interesting to release them for your consumption. I spent the last few days doing that and finally updating my download builder to work with the new MooTools dependency system so that I could release my latest work. So let’s get to it!

Clientcide 3.0

After a shameful delay, mostly due to the fact that my download packager was built around the old “scripts.json” dependency system, I’m finally ready to release the latest Clientcide code. I push to this codebase regularly as I fix bugs and add features, but rolling a release was always at the bottom of a long list of priorities. The big thing to note is that this release is finally on MooTools 1.3 – no compat layer needed as only native 1.3 methods are used. Woot.

The second thing you’ll likely notice is that there’s a lot fewer things on the list. I’ve deprecated stuff that I wasn’t willing to continue supporting; stuff that I just doubt many people were using. The list of deprecated plugins is rather long – about 25 files. Fear not! All those files are still on github on the 1.2x branch of Clientcide if you need them. If you find that you want something on that list, I encourage you to take the files and release them yourself.

For more details, check out the release notes in the readme in the Clientcide repo on github. This release is actually tagged 3.0.1.

Behavior

As mentioned here a while ago, while at Cloudera we implemented an abstraction for code invocation (typically the stuff you put in a domready statement) that reads configuration from declarative HTML. It’s changed the way I build things so much that I doubt I’ll ever build anything without it. The nutshell is that instead of having a domready function that finds the stuff in your DOM and sets up instances of classes and whatnot, you put the configuration in the HTML itself and write the code that calls “new Foo(…)” only once. Example:

Instead of this:

$$('form').each(function(form){
  new FormValidator(form, someOptions);
  new Form.Request(form, someOptions);
});
new Tips($$('.tip'));
$$('.accordion').each(function(container){
  new Accordion(container.getElements('.toggler'), container.getElements('.section'), someOptions);
});
etc

You do this:

<form data-behavior="FormValidator FormRequest" data-formvalidator-options="{someOptions}">...</form>
<a data-behavior="Tip" title="I'm a tip!">blah</a>
<div data-behavior="Accordion" data-accordion-options="{someOptions}">...</div>

Why?

Think of it as delegation (as in event delegation) for class invocation. If you use domready to do your setup and you want to swap out some HTML with XHR, you need to reapply that startup selectively to only your components that you’re updating, which is often painful. Not with Behavior, you just apply the filters to the response and call it a day.

You do a lot less DOM selection; you only ever run $$(‘[data-behavior]‘) once (though some filters may run more selectors on themselves – like Accordion finding its togglers and sections).

Domready setup is always closely bound to the DOM anyway, but it’s also separated from it. If you change the DOM, you might break the JS that sets it up and you always have to keep it in sync. You almost can’t do that here because the DOM and its configuration is closely bound and in the same place.

Developers who maybe aren’t interested in writing components don’t need to wade into the JS to use it. This is a big deal if you’re working with a team you must support.

Behavior is designed for apps that are constantly updating the UI with new data from the server. It’s NOT an MVC replacement though. It’s designed for web development that uses HTML fragments not JSON APIs (though it can play nicely with them). If you destroy a node that has a widget initialized it’s easy to make sure that widget cleans itself up. The library also allows you to create enforcement to prevent misconfiguration and an API that makes it easy to read the values of the configuration.

There are some other nifty things you get out of it; you get essentially free specs tests and benchmarks because the code to create both of them is in the Behavior filter. Here’s an example of what it takes to write a spec for a widget and ALSO the benchmark for its instantiation.

Behavior.addFilterTest({
  filterName: 'OverText',
  desc: 'Creates an instance of OverText',
  content:  '<input data-behavior="OverText" title="test"/>',
  returns: OverText
});

This code above can be used to validate that the HTML fragment passed in does, in fact, create an OverText instance and it can also be used with Benchmark.js to see which of your filters are the most expensive. More on this stuff in a minute.

Included in the library is also a file called Delegator which is essentially the same thing except for events. For example, let’s say you have a predictable UI pattern of having a link that, when clicked, it hides a parent element. Rather than writing that code each time:

document.body.addEvent("click:a.hideParent", function(e, link){
  e.preventDefault();
  link.getParent().hide();
});

You register this pattern with Delegator and now you just do:

<a data-trigger="hideParent" data-hideparent-options ="{'target': '.someSelector'}">Hide Me!</a>

It provides essentially the same value as Behavior, but at event time. The above example is pretty straight forward so, you know, why bother, right? But consider how many of these little things you write to make a web app function. If you can create them once and configure them inline, you save yourself a lot of code. For example, one of the things I’m releasing today is a delegator that makes it easy to have a link that updates any specified DOM element; basically AJAX without the J.

MooTools Development

I also wrote a while back about a portable MooTools development environment. Since then this little project has progressed to add a lot of useful features for a development sandbox. With a little bit of configuration work, you get docs, demos, specs testing, and benchmarks. It’s seriously pretty awesome and I use it now exclusively for working on front-end coding. By working in the sandbox, writing docs and specs, I’m much more likely to end up with generic, reusable code that isn’t too tied to any specific application. Enough talk, here, check it out running here on Clientcide:

dev.clientcide.com

As you can see you get docs with a simple quick-search, demos of all the components with the ability to view the source of any demo (and not just the HTML for the demo but also any other “interesting” files you choose to highlight), specs tests that anyone can run in their browser, and benchmarks which will show you how your code performs. Using this environment makes it easier for me to just focus on the code and use these tools over and over again.

The other thing that’s really nice about it is the ability to create a code configuration and share it with others. For example, you can run this development environment locally yourself with just the few following commands (assuming you have python 2.6 installed):

$ git clone git://github.com/anutron/mootools-development.git
$ cd mootools-development
$ git checkout -b behavior origin/behavior
$ ./go install             # or just "./go i"
$ ./go depender_check      # or just "./go d" - this checks the JS dependency tree
$ ./go run                 # runs the server on port localhost:9876

This will give you the development environment set up for Clientcide and Behavior (basically what’s running at dev.clientcide.com). If you don’t check out the behavior branch before you build, you’ll just get MooTools Core and More.

More Behaviors

Finally, the last shiny new present I have for you is a starter collection of Behaviors that you can use in your own apps. While working at Cloudera I authored maybe 50 of these things, but I haven’t had time to polish all of them up. Included in today’s release you’ll find Behaviors in the Clientcide release and another, stand-alone repo called “More Behaviors” which is principally used for instantiating widgets from MooTools More. Not everything has a Behavior filter, but you’ll get the idea of what they’re for and how to use them. Maybe chip in and help me write more of them! There’s a handful of Delegator triggers in there, too, and while they aren’t really related to MooTools More they dovetail nicely with the other plugins and show you how to use them.

Where?

Ok, so I’m releasing all this stuff, but how do you get it? Well, you can download a single JS package with everything you need, as always, on the download page. You can dig into the docs and demos at the new dev.clientcide.com. Finally, you can get it all on github:

But if you want to be really cool, you’ll just check out the development environment and run it locally. It’s what all the kids are doing these days.

Etcetera

I’m excited to release all this stuff finally and hope that you find it useful. Some of it may migrate over to official MooTools status, but maybe not; we’ll see. If you find yourself using these things please give me feedback and maybe send me a pull request to make it better. Getting involved in helping the code grow is the fastest way to ensure it meets your needs and that I keep working on it.

Clientcide and MooTools 1.3

October 14th, 2010 by Aaron N.

With all the effort involved in getting MooTools More 1.3.0.1 out the door (along with 1.2.5.1 – look for a blog post on mootools.net shortly) I haven’t spent any time on upgrading Clientcide. I hope to begin this work this week if possible.

In theory, all the Clientcide code should continue to work with the compatibility script enabled. I’ve tried this in a limited capacity and haven’t found any issues so far. I imagine it’ll take a week or so for me to update the code; I also need to update my tests to use the test runner I wrote for UI testing. Then test it in all the browsers, etc.

In the mean time, if you try it with 1.3+compat and find issues that’s important info for the MooTools projects (as compatibility is important to us). Look for another update in a week or two.

Aaron

A Portable MooTools Development Environment

September 23rd, 2010 by Aaron N.

The actual process of developing MooTools itself isn’t trivial. It’s not rocket science, but maybe there is a little alchemy involved. For instance, let’s say you want to fix a bug in MooTools More. You fork the library and make the change to fix the bug and now you want to test it. You need MooTools Core for this, but which version? Looking at MooTools Core on Github you see there’s a branch called 1.2x and also a branch called master, not to mention a tag for 1.2.5. MooTools More has several branches, too; there’s master, develop, 1.3wip and others. Which combination of these two libraries work together?

Then you see some test files in the library. Some HTML files that appear to be demos, but they don’t run on their own. You need to install the MooTools Test Runner to view them (you can see an example of it running at review.mootools.net:9876). And then there’s an external specs runner.

If you decide you want to play with MooTools ART you have similar issues, not to mention the widget library – art-widgets – built on top of it.

While it’s true that jsFiddle gives you a sandbox with a lot of these things, it doesn’t give you a working development environment. In an effort to make it easier to share these configurations, I’ve created a portable development environment that makes it relatively easy to get things up and running.

http://github.com/anutron/mootools-development

I’ve made a github repo that has essentially no code and only submodules pointing to all the stuff I use in states that work. In theory, it should make it really easy to reproduce a development environment from scratch. Eventually I’ll configure several different environments. 1.3, 1.2, 1.1, 2.0, whatever.

Right now there are three environments configured. 1.2.5-art-widgets (which includes everything you need to play with art-widgets), 1.3-art-widgets which lets you do the same against MooTools 1.3 (there are some issues that we’re working on so it doesn’t look great at the moment), and 1.2x-tracking-core-more, which includes just mootools-core and mootools-more on their respective 1.2x branches. These are my personal environments and you can use them if you like.

Note that instead of submodules I’m using crepo. One of the reasons is it will allow us to create a version that’s tracking against a branch. For example, the 1.2x-tracking-core-more branch is always tracked against core/master and more/develop. Typing “./go sync” will update to the latest of these two branches.

The result of this means that we can create specific, deployable environments for others and for each other. I could file a lighthouse ticket against -core with a specific state that illustrates a bug in core/1.3 that manifests itself only in art.widgets (which I’ve done – art.sheet is broken in 1.3).

Note that you don’t have to use django to use the environment. My environment includes the test runner that I wrote and depender. But you can just do ./go sync and get all the repos without building the django app.

This doesn’t have to be specific to MooTools, but that’s what I made it for. I don’t see people trying to incorporate this into other tools, though crepo is designed for that purpose (we us it throughout cloudera).

On Github’s Pull Requests and Other Things

September 20th, 2010 by Aaron N.

I love github. At the risk of sounding trite, I’ll say that they are the “2.0″ of open source project hosting. Sourceforge, Google Code, etc, have played a big role in open source development, but their tools pale in comparison to Git itself much less the beauty that is Github. Github is fun to use, nice to look at, and has served the MooTools well since we moved it there.

One of the thing that’s so encouraging about it is the pace of the development. New features seem to crop up every couple of weeks and while they may not be perfect, they’re almost always a good start. Take Github Issues for instance. It leaves a lot to be desired, but if you have a small project, it gets the job done. MooTool uses Lighthouse and Apache uses JIRA and Github’s Issues can’t yet compete with these tools. It works fine until you have > 100 bugs and > 30 people working on the project. But I thoroughly believe it’ll catch up eventually because the people at Github have proven that they’re talented and dedicated to quality. A lot of their features are in the beta-ish phase, it seems, and given the quality of those features at this early stage, I’m mostly content.

So when they recently released their new “Pull Requests 2.0” I was a bit excited and a bit wary. I’ve been trying to get the MooTools dev team to use Reviewboard for a couple of months now and not getting any traction for various reasons. One is that we’ve been trying to consolidate our community around Github (our Lighthouse account pre-dates Github’s Issues feature). With the revamped Pull Request feature I felt like I could finally drop that argument because it looked like everything we needed.

Like their other features, it works pretty damn well, but is missing a few key ingredients that I find myself yearning for from other tools that its meant to replace. I still have faith that the Github team will eventually get it polished, but of all the features they’ve rolled out, this one – code review – is the one I think they need to get all the way right. Code review, and easy contributions, are the key to open source. If it’s hard to review someone’s pull request, you’re either not going to pull it, or pull it without doing a good review. So I give this feedback with as much love as I can; this is literally meant as constructive criticism. Here’s what I think they need to do to make it perfect:

  • Inline Comments: When you get a pull request you can comment in the “review” view, but not on a specific line. To comment on a line, you must find the commit that has that line change and comment there. For individuals who send a pull request with 10 or 20 commits, this is impossible. You *must* be able to make a comment on a specific line of code in the pull request’s review view.
  • Pagination and Deep Linking: Currently, Github loads request views all at once and switch between them w/ JavaScript. This makes very large reviews impossible (it actually limits the view to a finite number of commits – 200 I think?) and very slow to load. Further, there’s no pagination so you have to scroll and scroll and scroll. This isn’t so bad, but it also makes linking to a specific line in the review hard, because the code view is hidden when you load the page, making any #anchor in that view unavailable to the browser. This ties into the comments issue, because I need to be able to link to a page and have it jump to the comment in question (as Github does when you comment on a commit) to allow people to reply to it.

Thats it. Those two things. They aren’t small things, but they aren’t big things. I’ve been leaving comments on their various blog posts around code review for a while now, and they always reply that they are aware of these things and will get to it. I have complete faith that they will. Their work to date has inspired great confidence. Of all the things on their long laundry list, I hope that these two changes are very near the top.

How to Become a JavaScript Badass

August 16th, 2010 by Aaron N.

Last week I wrote a rather lengthy post lamenting the fact that finding talented front end developers is rather challenging. This led to some nice comments and emails about the topic and more than one suggestion that I not just whine about the state of things without suggesting a remedy; specifically, that I post instructions on HOW to become a JavaScript badass.

I don’t know that I can tell you how to become a JavaScript ninja, but I can give you some pointers. I’ll start out by saying that I learned what I know via a rather circuitous route that I doubt even I could reproduce if I tried…

My Story, In Brief

My road to being a JS developer is not that interesting, if you ask me, but, shrug if you want to know, here are the highlights:

  1. I studied music, photography, and graphic arts in high school and some in college, though it wasn’t my major (which was Jazz Guitar – seriously).
  2. I learned HTML back when Mosaic was still in use and grew my web skills as they arrived in each new browser update.
  3. I joined a startup (knowing HTML in 1997 was a hot commodity) where I learned a bit of programming (Java). I wasn’t really very good at it. I built a really simple CMS with it.
  4. In 1999, I somewhat accidentally started a music startup (http://www.epitonic.com) which I designed and built. I built a much more robust CMS w/ a very small dev team. LOTS of vanilla JavaScript.
  5. In 2003 I joined CNET as a product manager. I didn’t write much code, but whenever we needed some JavaScript, I rolled up my sleeves and pitched in. I inadvertently became “the JavaScript guy” there and started blogging about my research on clientside.cnet.com.
  6. At first focused my work around Prototype.js and Moo.fx.
  7. When MooTools first arrived, I was hooked from the start (here’s posts one and two from 2006 of my first thoughts on the framework).
  8. I got involved with the project to help drive adoption at CNET. I became a committer and then put together classes to teach developers there (at CNET). This further cemented my role there as “the JavaScript guy” though I still thought of myself (and still do) as a product manager.
  9. I left CNET in late 2007 to start Iminta.com, which I’m still proud of. Then the economy died at the end of 2008 and I started contemplating finding a job and found Cloudera (or, really, they found me).

I know, that’s not terribly interesting or informative, but it gives you an idea of what a bizarre roller coaster my professional career has been. For me JavaScript and web development in general has always been a means to an end. I like building interesting products. Writing some JavaScript or some server-side code has always been about making a good web experience but I don’t really care if I write the code or not. I like to write code, but it’s not my objective. My job at Cloudera is the first job where I have principally been an engineer, though you could argue at my two startups that was my job, I’d retort that my job was to design the product and it just so happens that I helped build it, too.

Enough About Me, Let’s Talk About Becoming a JavaScript Ninja

All this about me is really just to put into context the fact that I can’t tell you the right way to become a front end developer. You will have some doors open in front of you as you pursue your goals and they won’t be like the doors opened infront of me. CNET basically paid me to spend roughly a year studying JavaScript and JavaScript frameworks in detail, and that’s a hard job to find. That said, I do think you can reproduce a lot of it on your own and, in some ways, I learned a lot of this stuff the hard way. Without any further equivocating, let me tell you the kinds of things I think you can do to get these skills.

  1. Study design and designers. I’m not saying you have to have the talent to be an awesome graphic designer, but you should pay attention to people who are. When you are surfing the web, pay attention to what works. What looks good? What communicates to you that you can do something on a page? A great example here is this video of Bill Scott’s work on UI patterns. He gives great examples of what the “interesting moments” are in UI design. But in general, you should pay attention to the sites you visit and notice when they get things right and wrong. I often ask interview candidates what sites they admire and why.
  2. Study JavaScript. I mean really dig into it. Watch all those awesome Crockford videos – ALL OF THEM! – on the YUI theater. For that matter, watch all the OTHER videos there. Seriously awesome stuff. I don’t agree with 100% of what they all say, but they are educational for sure. Read Crockford’s JavaScript: The Good Parts. Again, I don’t agree with it 100%, but it’s a seriously solid overview of the language.
  3. Study JavaScript Frameworks. Note that this is plural. The single most important thing I’ve done in my education with the language was to write the original documentation for MooTools. To do this, I had to read the entire library’s undocumented source and figure out what it was doing and why. I’ve learned a lot since then, but nothing I’ve done has ever resulted in as big a jump in my knowledge. When I wrote jqueryvsmootools.com I did it again, this time with jQuery. I read the entire source so that I could understand it. I did it again with Dojo when I put together a talk about programming to patterns that I first gave in tandem with Dylan Schiemann of the Dojo team (the talk wasn’t about frameworks so much as it is about the value of abstraction, and I wanted to make sure it wasn’t just a MooTools focused talk). I’ve done the same thing with other frameworks to learn the lessons that I can from other people’s development styles. Don’t just use jQuery or YUI or MooTools. You need to study all of them to understand what makes them the same, different, and interesting. Don’t stop until you understand everything that these frameworks are doing and, more importantly, why. Don’t hesitate to ask their authors for explanations; most are happy to talk about their work.
  4. Get involved with a framework. The second most important thing I’ve done with JavaScript was getting involved with the MooTools project itself. Working with open source projects is a HUGE boost to your resume and, here’s the thing, you don’t need to really know that much to get started. You just have to be willing to spend the time. Right now, there are dozens of bugs open on every framework out there. Go fix some! Go write test cases! Go write a blog post about how you use it! Do these things and get committer status and I promise you you’ll start getting a ton of interesting job offers.
  5. Release some of your own code. I can’t stress this enough. If you don’t have code on github (or google code or your own site or whatever) you’re wasting a big opportunity. Releasing your own code allows me, a potential employer, to know your capabilities before I hire you. This stuff gets people interested in you. If you release a lot of your code, you may even get others to help you maintain and grow it. This is how open source projects get going. I almost consider it a red flag to see a resume without a url to github or something similar.
  6. Blog about it. Write down everything you learn as you learn it on your blog. Next thing you know, 3 years have gone by and you have this huge body of work. Stuff on your site draws the attention of other developers who are struggling with similar problems. You become an expert without really meaning to. If you blog constantly about what you are doing, what you are studying, you’ll find that people come to you with work to be done expecting that you are awesome because, well, you’re explaining all this stuff to them. I can’t stress the value of this enough, though it is very time consuming. This is especially valuable if you’re a freelancer.
  7. Build something interesting. I once spent a month or two writing a photo gallery in PHP just to have an excuse to learn PHP better. I learned Smarty with that little project, too. I’ve built a lot of things for the excuse to learn it. I built Iminta.com with a friend and we chose Ruby on Rails mostly because neither of us had built anything with it and wanted to learn it. Forcing yourself to do things with new languages and environments will grow your skills faster than anything. Don’t rely on the skills you have; always look for chances, excuses really, to do things in new ways. Working with emerging technologies will make you debug that technology itself and maybe contribute fixes back to it. It can be painful, but it also makes you really learn how that technology works.
  8. Join a startup. I know, this one can be tricky, especially if you don’t live in the SF Bay area. But joining a startup will make you tackle problems that aren’t in your domain because, well, there’s no one else to do it. If you’re not experienced enough to be the 2nd or 3rd person at a startup, aim for being the 10th or 20th. You’ll be asking for long hours and low pay, but you’ll get a mountain of experience. Think of it as an extended college education that pays you a little cash and (if the stock takes off) might buy you a house.
  9. Take the time to learn why solutions work. When you’re working on something and you get an error and find the solution on Google, take the time to really understand what the problem was. When you are starting up an app server – ruby on rails, django, lamp, whatever – and you get a stack trace, take the time to dig into it and understand the problem and what the logs are telling you. Debugging stuff on the command line will teach you a ton. It’s slow, thankless work, but it’ll greatly improve your value when you take on more challenging tasks at new jobs.
  10. Be curious, and fight off laziness. This is a bit of a weird one, I know. What I mean by it is that you should look at tasks that require you to do new things as opportunities. Recognize when these moments come along and cherish them. There is nothing more awesome than having a job that pays you to learn. If you have coworkers that know things that you don’t, and vice versa, trade them. When I was in college I told the guy who was building the web site for my school that I’d help him design it and show him how to use Photoshop if he would teach me HTML. I joined Cloudera 18 months ago and knew zero Python and now I’m pretty decent at it. If you have a job that uses technologies you don’t know, don’t just stay in your little JavaScript world; find ways to expand your knowledge however you can.

I could probably go on about this stuff for a while longer, but I’ll stop. What it really boils down to is that you have to want to be a front end developer and pursue it the way a concert violinist pursues the first chair. There are hours and hours of practice for which no one will pay you. But eventually you’ll find yourself in a position where someone will pay you to do what you love and you’ll find it hard to believe how you got there. Next thing you know, you’re the person designing the user experience at some hot startup and trying to hire new people to join you.

My last suggestion to you, if you’re a budding JavaScript badass, is to force yourself to find a job that will help you learn these skills. Don’t just take a job making some company’s corporate website. There are tons of jobs out there that need front end talent that are building interesting things.

Did I mention Cloudera is hiring?

Why It’s a Good Idea to Be a JavaScript Developer, and What it Takes to Be One

August 13th, 2010 by Aaron N.

So, I’ve been trying to hire another JavaScript developer at Cloudera for a while now and the effort has proved to be rather daunting. Finding really good JavaScript developers who know their stuff is hard! If anything, it’s driven a very simple point home to me: it is a good time to be a JavaScript badass. In the past few months, when I’ve found talented JS developers and tried to recruit them, it’s clear that they have as many doors open in front of them as they want. If anything, they’re bombarded with requests from recruiters and companies trying to recruit them. As a person trying to hire these people, I find myself competing in a way that reminds me of the first dot-com boom. I offered one candidate a 1967 Cadillac Eldorado and still didn’t close the deal (I wasn’t serious of course, but I did offer them a lot, including the car, but the candidate new I wasn’t serious about that one. He countered by demanding something a little more high-profile). In the end he took a job at another startup.

The thing is, being a JavaScript badass isn’t only about knowing JavaScript. If you want to be a solid front end developer, you need to be able to do a lot of things really well, most of which aren’t really in the job description or, at least, don’t appear to be as important as just knowing JavaScript. Some of them just require competency, while others really require mastery (JavaScript does, obviously, if you want to qualify as a certified badass). In general, I’m a relatively humble person. I have my own blog, which I guess says something about the size of my ego, but I’m not that full of myself, I swear. But consider the fact that when I was recently talking to a recruiter about the position, I described what we were looking for, the skills and the kind of person, and the recruiter told me flat out, “Those people don’t exist; you’re describing a unicorn.” I told the guy I was describing the job that I do every day. He was unyielding, “Well then consider yourself mythical in nature.”

So what does it take to be a JavaScript badass, and what do you get for it? Well, to be a really top-notch front end developer means you’re going to have to spend a lot of time doing stuff that’s tedious and boring, some stuff that’s really hard and beyond your talents, and some stuff that’s just plain fun. For what it’s worth, here’s my list:

  1. You need to know HTML. You need to know everything about it. Everything. You need to know what effect document types are going to have on your markup’s display. You need to know that browsers will shove a TBODY tag into your tables even if you don’t code one. You need to watch what the browser vendors are adding into their nightly builds and their upcoming specs. Learning this stuff, at least for me, just takes loads of time discovering it as you work.
  2. You need to know CSS so well you’ll regret it. These days most of the cross-browser problems I encounter are with their CSS implementations. Getting around them usually means describing the exact same style in a different way. You just added a negative margin-top to a link and guess what, the users of certain browsers can no longer click them, despite the fact that you gave it a z-index of a million and you can clearly see the damn thing. Or you just made the most amazing collection of positioning statements to make an auto-resizing masterpiece of CSS awesomeness but god help you if your boss looks at it in Internet Explorer. The thing is, having this skill – being good at CSS – isn’t really all that interesting or valuable any more. Everyone who works on the front end is just expected to have it. There are some seriously talented CSS developers out there who go far above and beyond this kind of knowledge and truly make CSS into an artform. You don’t have to be one of them, but if you can’t make the page look like the mockup, it doesn’t matter that you can do just about anything else.
  3. You need to know the browsers. You need to know that IE won’t let you convert this string: “<meta></meta>” into DOM elements by setting the innerHTML of a DIV. And forget about injecting it in the HEAD to turn it into a DOM element, because that thing is read only. You need to know that IE will always barf at trailing commas in your array and object literals. You need to know that IE has offset positioning issues for elements inside of iframes. And IE isn’t the only pain in the ass; Firefox has those clearfix issues with floated elements and webkit’s no saint. And you need to know that the latest versions of webkit have whatever awesome new features it has, as well as what ways mobile safari differs from the desktop version.
  4. Did I mention JavaScript? You need to know how ALL of JavaScript works. You need to know that the arguments object in a function has a length property and is iterable, but it isn’t an array and has no methods. Further, you need to know how to turn it into one. You need to know how the prototype property works, how to use it on your own without the help of a framework, and what the implications of using it are. You need to know how to garbage collect things and, for that matter, how to tell when you aren’t. You need to be really good at abstraction. Seriously brilliant at it. You need to be good at designing APIs for yourself as well as others. You need to know how to test your code and how to manage it.
  5. You need to be decent at design – information flow, graphic design, user experience design, code design. You need to be able to interview a user, a client, a stranger, an expert, whatever, and ask them the right questions to be able to devise an experience that solves their problems. Not just the ones you can imagine, but the ones they don’t know how to describe. You need to be able to open Illustrator and put together wireframes quickly to devise a plan, then switch to Photoshop – god you need to be good (that is, efficient) at Photoshop – and put together the visual style. You don’t have to be the worlds best designer; I’m certainly not. But you need to be able to tell the difference between good design, bad design, and amazing design. If you can manage good on your own, you’re set.
  6. You need to be comfortable on the server side. There aren’t that many positions out there where all you write is JavaScript all day long. Most front end jobs will see you writing as much as half of your code in JavaScript, but you need to be able to pick up other languages relatively quickly (in, say, a month or less). Python, Ruby, Java, PHP… If you only know one programming language, it doesn’t count. If you only know JavaScript and PHP, and you balk at any task that requires you to use something other than those two (rather than, say, looking at it as an opportunity to learn something new), then you need to ask yourself what you’re doing here. Knowing how to use a framework, but not how to accomplish something without one – with vanilla JavaScript – doesn’t count as knowing JavaScript.
  7. And then there’s about a million other things that you need. You need to understand Git. Git is amazing. I know you’ve heard people tell you this, and if it still seems like an alien monster that refuses to explain itself, then you need to hunker down and figure it out. You need to understand how to get things done with just a shell. You should be able to open up vi or emacs and edit a conf file without launching notepad or TextMate or whatever. You should be able to run make and compile things. You should be able to tail a log file, unzip a tarball, secure copy things, run servers and configure them. You need to be able to kill processes and read a stack trace.

I’m not even counting stuff like being familiar with Agile development processes, working with open source communities, or releasing code. But if you feel like out of the seven things I listed above that you nail 5 of them and would get passing grades at all 7, then congrats. You’re a unicorn.

And what do you get for being one? How can all these things possibly be worth the years of tedium, of debugging crap in IE6 and worse (yes, there is worse), possibly be worth it? Well, you’ll get recruiter emails and calls every week (this isn’t so awesome, actually; they’re like sales people who pretend they know you). When you want to look for a new job you won’t even need to do much – just tell a few people or post it on twitter – and you’ll have half a dozen doors open to you. You’ll have friends that are starting new ventures calling you, begging you to join up. You’ll get in on that ground floor you’ve been hearing about. You’ll get good stock options and you’ll get to design products from the ground up. You’ll get a 1967 Cadillac Eldorado as a signing bonus (not really). That guy I offered that car to (not really) took a job at a startup and he’s the guy. He’s THE front end developer for their product which doesn’t exist yet. He gets to point to that thing, a year or two from now when it’s worth a bazillion dollars (I do wish him luck, after all) and say, “I did that.” There are people out there, right now, who get to point at Twitter, Facebook, Gmail and Google Maps, at the Iphone’s UI, at Github, at the YouTube player – stuff used by millions upon millions of people – and say, “I did that.”

That could be you.

Did I mention Cloudera is hiring?