The native-vs.-webapp hubbub from a couple of weeks ago got me thinking about why "web developers" are looked down upon by "real programmers."
I'll admit that I've held that prejudice myself. I looked at client-side web development back in the mid 1990's and decided that it wasn't for me. The web browsers of the time were primitive, and every one acted differently. The situation was a big mess.
I learned to be a programmer back in the days when, if you read the programming language manual, the operating system manual, and the library manual, then you could actually write code and expect it to work the first time you ran it. The machine was your servant. If the code you wrote didn't work, it was probably because you had screwed up.
In contrast, programming for web browsers requires a lot of experimentation, guesswork, vendor-specific APIs, and hacky workarounds. The code one wrote usually didn't work the first time, no matter how smart and careful the author was. The browser held a lot of secrets, and thus was the master.
How could any real programmer get involved in technology that mostly didn't work, and had no formal specifications nor complete documentation? This led to my belief that all the people writing scripts for browsers and calling them "applications" were merely programmer-wanna-bes. They may have been able to hack things together, but they didn't have that real programmer mindset.
Obviously, things have changed a lot since then. Google Maps was the web application that made a lot of us wake up and notice that browsers weren't just HTML displayers any more. AJAX took hold as an "enterprise technology." Still, a lot of us old-timers continued to consider JavaScript to be a toy language, and the many incompatibilities between browsers meant it still could not be considered a stable platform for serious programming. And any user interface platform that doesn't have a standard graphics API is just pathetic.
Then again, to be completely honest, I was just too lazy to learn more about it, and I was making my living by writing native applications. It was all too easy to just dismiss it as something not worth wasting time on.
Now that I've spent a couple of weeks with JavaScript and related stuff, I've changed my mind. One can be a real programmer with JavaScript. It's actually a pretty cool little language, incorporating aspects of Scheme and Self. What makes JavaScript programming a mess is cross-browser incompatibility and the fact that most JavaScript is just cut-and-pasted by people who don't know what they are doing.
Browsers have come a long way too. It used to be that you could create a sophisticated UI only by implementing a Java applet (yuck) or using Flash (yuck). HTML5 is finally making it possible for web developers to draw things on the screen (!!!) without resorting to such madness. Web browsers now provide a platform similar to what personal computers provided twenty years ago. It's taken a while, but there are no more excuses for dismissing the web browser as a primitive toy.
It's now pretty easy for someone to create a slick website by installing Drupal, Joomla, Zope, or something similar, and then customizing it for a client's needs. However, the people who do that are not real programmers.
What distinguishes a real programmer from all the rest of the people who can create a web site?
- Can you write your own HTML and CSS, or do you just use prepackaged themes?
- Do you write your own JavaScript code, or do you just cut-and-paste snippets you find via Google?
- Can you read and write JavaScript, or do you have to rely on some higher-level abstraction (Google Web Toolkit, Cappucino, etc.)?
- When something doesn't work, can you debug and fix it, or do you just have to throw it away and try something else?
- Do you refer to the official specs for HTML, CSS, and JavaScript, or do you just make a lot of guesses?
- Do you try to write portable code and adhere to standards, or are you happy with whatever works for 80% of your users?
- Do you design, develop, and test your code in modular fashion, or just throw the whole mess together?
- Do you adhere to coding standards and try to write code that is readable and maintainable?
- Do you care about the code you write?
In short, can you create your own software components, or can you only glue together components created by others? If you're a creator, then you're a real programmer.