My Personal Web Programming History in a Nutshell
by Mike Levin SEO & Datamaster, 03/21/2009
OK, now for your programming-writing. I’ll actually compose this believing that I will publish it for the public at large. Like I heard Seth Godin say on his launch of The Dip in Philly, you can write out your plans and mail it to your competition, and it won’t make a difference. Success is not in the written plan, it’s in the action of follow-through and implementation. So I will believe that even by the time “competitors” put it all together what I’m talking about in this dense-type blog, they’re not going to be able to act on it. Or conversely, if you CAN act on it based on my writing, I will hopefully capture some celebrity for me and my employer, and put this under the category of “doing something”. My model here would be David Heinemeier Hansson who created Ruby on Rails. He was able to extract and release the complete agile framework that he created for the Basecamp and Backpack products, but still have a viable business and increase his credibility to boot. Hopefully, I won’t be as impassioned and controversial as him… but based on my writing thus-far, you guess.
Anyway, getting started on a project like this colors its existence forever forward. I’m always about self-describing agile frameworks. What I mean by that, is that the product itself is used to describe parts of itself. SQL is self-describing, with the parameters controlling the behavior of SQL being held in SQL tables themselves (system tables). And Ruby on Rails is agile, being that the framework itself makes your applications magically spring into existence with minimal configuration work, leaving you to override and customize its default behavior this-way and that to suit your own purposes. This is the “rails” part of Ruby on Rails. It’s rigged to satisfy 80% of the CRUD work out there (create, read, update, delete) with 20% of the work. Or in ROR’s case, with 5% of the work. But this is the source of great controversy, because it inhibits free-form programming with overwhelmingly strong recommendations in the form of its default behavior. But because every little piece of ROR is over-ridable. You can override default behavior with object oriented inheritance OR ask for the auto-code to be “generated” and go in and modify it directly without impacting the original codebase, or you can remove the default code entirely and program C or R or U or D from scratch.
All-in-all, Ruby on Rails is brilliant, right down to the selection of Ruby as the programming language to base it on. It’s what I wish I had built if I was a professional full-time programmer tackling similar problems. But alas, I’m not. I’m a part-time programmer with ambitions to out-do the professionals, and indeed, professional programmers can hardly even believe what I did with HitTail with so little computing resources. I took something that would normally require data-centers and distilled it down to a single computer. Scaling comes with cloning instances. It’s perfectly set up to scale with cloud computing tomorrow, but eeks remarkable performance out of the server hardware of today. I was outright told it couldn’t be done. It can. Many programming concepts that have become common wisdom actually prevent you from becoming competitive with the existing players. Sometimes you have to change the rules to create opportunities for yourself, as went on with Ajax a few years ago, and is going on with real-time today.
So it’s already 4:00 PM today on a Saturday, and I have plans all day tomorrow, and I have a site audit still to finish using an as-yet un-programmed agile framework. I plan on creating the rudimentary building-blocks of the framework today along with using it to do the work. I also have a document to write for a meeting I have on Monday on an unrelated topic. I am racked with guilt, thinking of myself as a procrastinator for not having gotten this done at the office, or at my work-from-home day on Friday. But I have to get past this guilt. When surrounded by office-scuttle or animals or wife with an interruption coming in every half-hour or so, it’s just beyond my capability to do the kind of work required of me. I literally have a job that I can’t do at the office. And I’m resorting to desperation now to get everything done. I could very well be going to 2 or 3 AM tonight, and have many subsequent nights like that to polish this work. I’ll get past the guilt, because I simply could not have done it before without admitting this thing to myself, that I cannot focus on this type of work with anything but complete silence and no interruptions. Now, I realize it. It is perfectly fair to take one weekend day a week (on top of my work-from-home Friday) to become professionally excellent. And my wife has this alone time like every day, so I should hardly feel guilty about having some for myself, even though I have to cut the time I spent with her down by nearly 50%. There are broader issues at play here that are pushing me in the entrepreneurial route, which will never really get to play out until I get through several rounds of this sort of work. Remember, the system is agile and self-describing? That applies even in life.
So anyway, the first steps. The first steps are always baby-steps–simple, easy-to-understand assumptions, principles, and building-blocks on which everything moving forward forever with this system are based on. I have to get them right. And I’m going to take a quick look at where my success from the past came from to plan this success. My first Web-programming experience beyond HTML, which even non-programmers know, came at the Commodore spin-off company, with the Microsoft Internet database connector and hypertext template language called IDC/HTX. It was paired-files, with the SQL query living in a .idc file, and filling it into HTML with looping constructs living in the HTX files. It was a case of give-me-an-inch, and I take a mile. I made my first generalized framework for CRUD operations. It’s easy enough for a programmer to imagine how I did it. Just make an IDC/HTX file for each operation: a C, a R, an E, and a D. Four files was enough to manipulate a table, and copying and pasting those files could let you make a new instance to be wired to any table. Doing relational database work was a challenge, but I made a simple order-entry and shipping log application with this that was used for years.
My second iteration of a generalized system was using VBScript at my next job, which was ironically enough, an order management software company who had no idea that I had written order management software. It’s part of what made me such a good match for their company. I created their Intranet and Public Website on that system, with some rudimentary lead management system that integrated with SalesLogix. My favorite part was actually the employee directory system where thumbnail photo’s of each employee was used, and it was nicknamed “the dating game.” This is where I first realized the personal relationship power of the Web. On a programming-level, it’s the first time I created a common include file that held all the business logic, with the main application files becoming “config” files. This was 1998, well before the popularity of XML, so I did the config work with tons of arrays, with all of them needing to be set to get any “default behavior”. This was very effective, but tedious. And meanwhile, I discovered and got good at “search engine optimization,” the process by which you find and keep customers by them finding you. I detected my true professional calling, and started looking for my entrepreneurial opportunities.
The Commodore spin-off company came calling again, asking me back, and giving me .05% of all company gross revenues and 1.5% of all directly-generated. This was an entrepreneurial opportunity if I ever heard one, and I canned any thoughts of moving out to Silicon Valley, and instead reverse-commuted from Philly to the sub-suburban boondocks. No regrets. No regrets. Anyway, when I was asked to “turn the Intranet back on” for order management, and it didn’t really have the basic features necessary anymore, I had to put new work into it. Then, the expected standard peppering of feature enhancement requests started coming in, and IDC/HTX was woefully inadequate, and the generalized system from my in-between employer didn’t come with me, and I wouldn’t have wanted it even if it did, because of the tedious config files. So, I embarked on iteration 4 of my generalized system, in which I turned it into an agile framework by making default CRUD behavior, and allowing the config files to simply name the table it was to be wired to. The config files were virtually one-line. But with more lines, you could control every aspect of its behavior, and spin some very complex apps in very little time. I enhanced it to support related tables (item details). It was used for order management, tech support, lead management, reseller communications, public forums, and a host of other little uses. A very ROR-like app existed in 2002 based on VBScript. Aside from scaling issues, I could have easily built Facebook on it in about a week.
Despite my accomplishments at this company, and dragging them into the black by forcing them to not ignore their sales-leads through a mixture of SEO, private message boards and color-coded reports, I couldn’t get my work off of a vintage 1994 Pentium 90 (it was 2002). The frustration of being at a company held hostage by a clueless sysadmin was too much, and I ended up taking an opportunity to go be a vice president at a public relations company in New York City. There, I became the programming vice president, nearly creating iteration 4 of my generalized system in HitTail–much like iteration 3, but using Ajax to make everything real-time and massively scalable. But it never really got there. The irony was that now that I “did something”, I was a pseudo-celebrity AND working at a marketing agency, so my opportunity to program almost entirely dissolved.
So here I am now two jobs past that. The intervening job was promising, but short lived. As a print-based publisher adapting to the online world, they needed what I had almost more than anyone, but with a sweeping regime change, so too went me. And that brings us to now, and the chore before me tonight, which I’m leading up to with this writing. I’m at a marketing agency again. This one is already quite a leader, doing so many things correctly. It’s my mission to protect, build and grow their SEO practices–but not from the programming site. We’ve got people for that. Rather, from the strategy side. But I’m not the genuine article if I’m not programming. And I have a site audit to do, rather unclear how the company does site audits currently. And I’m chomping at the bit to do something big again. Let’s call it iteration 5 of my generalized framework. But I have no intention of doing what Ruby on Rails is already doing better than I ever could. Nor do I have the intention of building one damned thing that I don’t have to. Nor am I going to adopt a technology that could be here today and gone tomorrow.
Instead, I’m jumping into the mash-up fray, using things that I would have killed to have back in 2002. The world is a very different place, and not everything has settled down yet (as if it ever will). Whose cloud computing platform is going to win? What and how much are we going to have to pay for? What can you invest in today and not get screwed? How much longer is the Web-browser as we know it today going to be around? Are dweeb C++ programmers going to reassert themselves over HTML cowboys? What about Flash? Does any proprietary software have life in it if the free and open source solutions are nearly as good? How many of our fundamental assumptions that we’re making today are going to get pulled out from under us tomorrow? How can I take on the difficult tasks without having to be a full-time programmer myself?