July 2005 Archives

Hey Foxy!


For developers contemplating switching to Firefox, be aware that there's much more recommend the browser than awesome standards compliance. With the addition of a couple of extensions, you can turn it into the developer's wet dream (or equivalent—if there is one*—for the ladies). Here's my quick list:
  • Web Developer: there's so much to see and do that it's hard to know where to begin. This toolbar allows you to disable all sorts of web functionality to see how your app looks in barebones format. It's got a form population feature that's tremendously helpful when testing interfaces. There's some great features that help you visually see different elements of the page that you'd normally have to go down to source to view. The clincher, for me, are the CSS features. The option entitled "View Style Information" shows the complete cascade when you hover over an element and the exact set of styles being applied when you click on the element. The "Edit CSS" option is an absolulte godsend when doing any sort of complex CSS, which is what I'm great at. It opens up a sidebar with the external stylesheet. You can then edit the styles and it dynamically displays the results in the page. No reloading, no save-and-refreshing. You can then save the stylesheet or revert back to the unaltered one. If this feature sounds impressive, it's even better when you see it in action.
  • Venkman: this is an extension that adds a full-featured Javascript debugger to Firefox. Yeah, I know you can use Microsoft's debugger for Javascript but I've never gotten it to work to my satisfaction. From what I have seen of it, Microsoft's version lacks a lot of neat stuff in Venkman. I love how you can debug all Javascript, even the stuff that the browser is using internally. There's even syntax coloring and profiling, though I'm not sure how useful that really is. If you've ever used VisualStudio's debugger, then you'll be right at home in Venkman and you'll understand its utility.
  • DOM Inspector: Venkman has a DOM inspector side to it, but it's overkill for most DOM inspection needs. You can do searches for a particular ID and then see the node from all sorts of different angles. I use it a lot when I didn't have the foresight to start up Venkman but I need to see the state of a Javascript object or all the CSS being applied to a particular element.
There are tons of other great extensions out there, but this triumvirate is downright indispensable to the web applications developer.

* The female orgasm is always trumpeted as the best and most powerful but I don't think any lady has ever had one in her sleep.

[UPDATE (8/2/2005): Did I really discuss "nocturnal emissions" in the context of recommending Firefox? Weird.]


On the Phone


Today I spent an hour listening in on phone calls in our call center. Every developer is supposed to spend one hour a week doing that or answering customer emails that come in. Since I'm pretty unfamiliar with every product we offer except for the ones I've worked on, I'm not really comfortable answering the emails right now. I think this is a great idea since it keeps us developers in regular contact with the front lines. At my previous job, I saw many of my co-workers develop cynical attitudes towards the people who paid their salaries. I worked for many years on the front lines, and I think that that experience is invaluable when designing applications for the layman.

The experience was very illuminating. I got to hear a few common problems and I got a sense of how diverse our product line really is. I left very impressed with the difficulty of the job—I always knew that it wasn't for me but now I can articulate exactly why. Further, I was floored by the respect and kindness shown to me because I worked in development. At my previous job, the Web team was not generally respected—we largely brought that on ourselves—and I developed low departmental esteem because of that. I've always thought that software development was terribly important and fascinating so it was nice to see others sharing that view.

What's extra impressive about this whole exercise is that there's an internal survey to be completed afterward that I'm told is read by executive management. It sums up your experience and solicits any feedback or suggestions you might have. That survey forces you to think about what you've experienced. I don't know if my comments will have any effect, but I like the fact that they're collected and that the front-line duty isn't just some corporate lip service to quality.

[UPDATE (8/2/2005): One of my recommendations on the survey was applauded by the VP of Development and will be included in the features of a future release of a product. Neato!]

[NOTE: The views expressed on this website/weblog are mine alone and do not necessarily reflect the views of Go Daddy Software, Inc.]


Unleash the Fun


At my last job, we used VisualStudio.NET deployment projects to reasonable effect. There were problems with installing and uninstalling web applications via MSIs, but it worked fairly well. I was never really satisfied with it, but I couldn't find any alternative that seemed better.

Yesterday, my co-workers showed me the copy project feature of VS.NET and I thought to myself, "Wha? That's all it takes?!!" You just specify the destination and it copies all the relevant project files to there.

Today, a co-worker showed me a VisualStudio.NET add-in called Unleash It that makes VS.NET copy project feature look positively ancient. It adds a lot of the niceties that the VS.NET feature lacks: profiles, FTP, command-line, ZIP file creation, among others. It's free. Deployment now takes seconds, limited largely by your network (I've already mentioned how great ours is).

[NOTE: The views expressed on this website/weblog are mine alone and do not necessarily reflect the views of Go Daddy Software, Inc.]


Don't Blink


Wow, someone made an ASP.NET control to reproduce the <blink> tag. I want to hate it, but I just can't. {via}


Review of Freakonomics


There's several books that have made their way through the blogging world with surprising alacrity. The Tipping Point, Blink, Collapse, and Everything Bad is Good for You have all had their 15 minutes of memedom as they wend from blog to blog. Freakonomics, by Steven Levitt and Stephen Dubner, has endured longer than the others. I resisted reading Freakonomics just as I resisted reading the other books because the myriad reviews disclosed most of their contents through patchwork. Just as I could tell you that a liger is bred for its skills in magic even though I've never seen Napoleon Dynamite, I could give a rough accounting of Freakonomics et al. even though I'd never read them. Reading Freakonomics was like déjà vu in that sense. It also confirmed my suspicions that all of these books are probably not worth reading given the effusive praise and uncritical plaudits heaped on them by the average blogger.

It was an extremely easy read. I covered 190 of the pages in about four hours this Friday night. I don't know if it was the lack of footnotes (I usually read each one as I come across them), the newspaper style, or the simple subject matter but I hardly ever can get through a book that quickly. The remaining 17 pages took another two hours since my wife saw some of its provocative conclusions and kept asking about them. The only other times I've zoomed through books as quickly have been children's books—the first (and only) Harry Potter book took me a day or two—and popcorn fiction. In the end, I think its breezy style was mostly to account for the speed—this would be the perfect book to listen to.

If you haven't picked up on it yet, I was not impressed by this book. I will admit that I was predisposed to not like this book. First, the hype surrounding it is a big turn-off for me. Hype is one of those things that typically ends in a let down. Most of the population does not share my set of values and my philosophic perspective. When something gets universally lauded, that usually means that it appeals to Christians, conservatives, altruists, and laymen—everything I'm not. Further, I didn't particularly care for the content that I had already encountered by reading blogs. The analysis seemed glib and facile. Now that doesn't necessarily mean anything since the average blogger is very glib and facile, so I tried to discard that particular prejudice before I started reading. It turns out that the analysis is glib and facile, but I wanted to read and be surprised.

The book starts out with its strongest cases. The first chapter about teachers cheating and sumo wrestlers throwing matches is an excellent use of data to tease out conclusions. The patterns they found are indicative of cheating since their statistical probability is considerably less than reasonable. They take the reader step by step through the thinking behind the analysis and it is a lesson in how to look for anomalies in data. If the book had continued along these lines, it would have been an amazing resource and would have heralded the beneficial power of statistics. I was really inspired and wished that I had a data set to so analyze; I wouldn't know what to do but it just made me want to dive into SPSS.

After this great start, the book starts to unravel quickly. I blame the economist's reliance on incentive as the cause of this slide. Incentives are powerful, to be sure, but they're not sufficient to explain such complex phenomena as the real estate market and drug dealing. The authors found that real estate agents keep their homes on the market about 10 days longer than their clients. They suggest that this is because the agents want a quick sale to get their commissions but they want the best deal when they're selling their own homes. While some agents may have exactly that motivation, I find it hard to believe that all do. While focusing on the agent is easy, I think that the real driver of the real estate transaction is the client. Most clients, I suspect, aren't patient when it comes to selling their houses. They've got another house to close on and they can't afford to carry two mortgages while they eke out another couple thousand dollars on the sales price. They may reject the first offer to cross their bow, but the next one that comes closest to their desired sales price is going to mighty tempting. If there's any sort of lag between offers, the temptation grows greater with each bid. Agents, on the other hand, are much more experienced with waiting and bidding trends. When selling their own homes, it makes sense that they'd take advantage of their experience and it makes sense that that patience would pay off. I think that's a more plausible explanation of the pattern than the sinister motivations that the authors posit.

They then survey the terms used in the listings in order to show which words are correlated with the final sales price. They found that certain words were correlated positively and others negatively. Leaving aside their methods (and I have to leave them aside since there's nothing describing them in the text or the endnotes), they suggest that those words negatively correlated represent words that the agent employs to "subtly encourag[e] a buyer to bid low." What? Was that in the data? I can just picture the reader of this book firing his real estate agent because she used the term "great neighborhood" in his house's listing. Levitt and Dubner argue that specificity in description is what positively correlates but how do you specifically describe a great neighborhood, a fact which might be a very real selling point? The authors forget (or don't consider) that listings are necessarily terse and usually incorporate fuzzier selling points in addition to the specifics.

Further, no one buys a house straight from its listing. If the terms in the listing don't jibe with what the potential buyer is seeing, then the buyer will pass (and thus never be counted in their data set). But that's not all: the listing may be perfect and the buyer may still pass (and thus be omitted from the data). In fact, the fuzzy listing may be in an older neighborhood and therefore command a less elastic sales price. Notice that all the specific words they mention as positive correlations are terms that you'd associate with a newer house (or one recently remodeled)—you don't find "Corian" in a home from the 1950s unless it's been added in the last ten years. Newer homes don't exist in older neighborhoods. I don't if any of the preceding possibilities are at work here. But all of these things represent potential explanations for the data that do not require one to think of real estate agents as bloodsuckers.

Where the pair really go astray is in their chapters on parenting. Their main conclusion is that parents have a negligible effect on children. They admit that bad parenting has a huge effect on children, practically guaranteeing them a ride on the prison express (if they don't beat the odds). Their point is that, beyond a certain point, all the things parents do to enrich their children's lives don't matter. Visiting a museum? No effect. Reading to them each night? Zilch. Stay-at-home mother until of school age? Why bother. These are contrarian, to say the least. But they wouldn't be making such statements unless they were solidly backed up by data, right? I mean they teased all sorts of interesting conclus ions out earlier by looking at the data in unique ways, so they would do that here as well, right?

Sorry to burst your bubble, Chester. They rely on test scores. No let's-look-at-what-real-estate-agents-do-when-selling-their-own-homes or how-do-sumo-wrestlers-compete-when-they're-at-the-crucial-7-wins-and-7-losses-stage on this one. They used test scores and academic progress combined with an invasive questionnaire to draw their conclusions. Not very rogue, if you ask me. It's also completely irresponsible. How you can make sweeping generalizations about the power of parenting from academic performance of any sort is beyond me. If you'll bear with me, I'm going to really delve into this issue because this is where the book totally fails.

I say that his statements are irresponsible because far too many parents don't put enough thought or effort into parenting as it is. Telling them that parenting doesn't matter is like giving them a carte blanche to slack even further. Even if so-called "obsessive parenting" didn't result in higher test scores, that doesn't mean that it's not worthwhile to take your children to cultural events, read to them, or otherwise participate in their rearing. Sure, there's no general agreement as to the effects of various parenting styles and you could find hundreds of books claiming to be the One True Way to effective parenting but that doesn't mean that the pursuit of perfect parenting isn't worth it. Some might have bristled at my use of "perfect parenting" but the reality is that you should also strive for perfection in parenting—as in the rest of your life. You'll make mistakes and missteps, but that doesn't mean you should adopt the posture of "well, perfection is impossible" while you beat your kids. I am not a perfect parent, but I believe that I should try to be one. That means that I should take mistakes seriously and work to stop them from recurring.

The actions that he lists as not having an impact on test scores reads like a laundry list of the characteristics of a working parent (or single parent). It strikes me as an apology for not staying home with the kids. While it may be possible that the effects are negligible—I sincerely doubt it—it seems like those parenting magazine articles of the same form that make working parents feel better about their decision to not commit fully to raising a child. I don't know enough about the lifestyles of the authors so I can't really say that this was some sort of rationalization on their parts, but it wouldn't surprise me a bit if it were.

The fact of the matter is that performance on a standardized test may not be capable of measuring or indicating the benefits of staying home with your children. Off the top of my head, staying at home could produce better adjusted children that feel more love and trust for their parents. That could make a criminal future more unlikely. Staying at home could also shelter children from the social shock attendant with day care facilities until they are better prepared emotionally to deal with the cliques, taunts, and ostracism that often comes in social situations. That could avert many of the aberrant behaviors that accompany them. Or it may not. What is certainly true is that the authors haven't proven anything one way or the other. I'm not sure if we even have means to measure and analyze these circumstances adequately.

Reliance on declarations by study participants is another fatal flaw. People lie on questionnaires, even more so when they're delivered by an actual person from the government. They say what they think they ought to say, they misremember things, and I would suspect that some people actually lie outright. Sure, people who admit to spanking their children probably aren't lying but how does that establish the study's accuracy? It doesn't, but it provides a nice distraction from the issue as the authors move on to the next shocking revelation.

In the end, the authors want to have their cake and eat it too. They repeatedly assert that people who value education have children with higher test scores. (168, 172, 174, 175) However, they also assert that "by the time most people pick up a parenting book, it is far too late." (175) As mentioned earlier, they sincerely believe that, beyond a certain point, parenting doesn't matter. But if parents value education, how does that carry over to the child? Is there an education gene? They argue no such thing. The actual causal chain that they never explicitly reveal is that parents who care about their child's education will impart that sentiment by example. The academic performance of Asian children in America is well-documented and the reason typically given is that their parents want their children to do well in school. That desire is translated into a myriad of behaviors: rules about studying before watching television, allocation of resources to educational support, saving scrupulously for college, and vigilant monitoring of performance—to name a few. But if parents don't matter, then how can their attitudes affect test scores? And if parents do matter, perhaps they matter all the way down? The authors, unfortunately, don't bother to delve into these other possibilities.

There's a number of other bones I could pick with the book, especially about the inane chapter on baby naming that reads like an afterthought. I'll merely state that the chain they craft to link educated, upper-class naming to uneducated, lower-class naming is completely bogus. People may not get names from celebrities, but they do get them from the people they encounter in real life, the people they read about or see in the media, and the children their children encounter—all of whom have names themselves, fodder from which to draw. The educated upper class don't associate with the uneducated lower class by and large. They travel in different circles and usually encounter each other indirectly (e.g., the dock worker might know the company president by name but he certainly doesn't know the president's kids' names). How the name choices are transmitted from one to the other doesn't stand up to scrutiny.

The book has some interesting examples, but it's wrongheaded by and large. Worst of all, it's insanely popular right now and the ease of reading it would suggest that it won't just sit, binding uncracked, on the coffee tables of America. Its insights into the "hidden side of everything" will fit the conspiracy theorist's mentality very well and may turn otherwise optimistic Americans instead skeptics and cynics. Who knows, the 20th anniversary edition of the book may have a chapter on the book's unintended consequences. That may be ascribing it too much cultural power, but small things can have big effects.

[UPDATE (8/4/2005): Here is a similar, though much condensed, opinion.]


Speedy


Wow, I thought I'd take this speed test at work since the connection always seems zippier than any other I've ever experienced. The results: 11,832 kbps down and 1743 kbps up. Crikey!

[UPDATE: My co-worker pointed out that running a test at 6:40 am isn't really representative of the company since it's just me, the security guard, and third-shift call center workers. So I just ran it again: 10,585 kbps down and 1728 kbps up. Still pretty damn impressive!]

[NOTE: The views expressed on this website/weblog are mine alone and do not necessarily reflect the views of Go Daddy Software, Inc.]


Review of The Automatic Millionaire


My friend Larry has often said that he doesn't know how anyone in this day and age can't be worth a million dollars at retirement. He's right because it doesn't take a substantial monthly savings to amass a fortune if you've got enough time. There's really nothing magical or mysterious about it: save a little bit each month and invest it in something—even something relatively conservative—and it'll turn into something substantial in 30 or 40 years. Of course, that hasn't stopped many investment book authors from cashing in on common sense. David Bach's The Automatic Millionaire is a great example of that

(Side note: I've become convinced that investment, business, and management books should not be listened to. Most of these type of books rely on a hook or a gimmick that can easily be glossed over when reading, but becomes positively grating after listening to six CDs filled with it. I can't think of the last book in the genre that I didn't entertain thoughts of ditching halfway through. "Good to great", "make it automatic", "millionaire next door" all call forth repulsion at their thought.)

Bach's basic message is as helpful as it is obvious: the more effort required to keep up your personal financial plan, the less likely you are to see it through. Bach's unique insight is, umm, well, I don't think there is anything particularly unique in the entire book. His advice on investing, saving, paying off debt, and tithing (tithing? You don't see that phrase used in many books) amounts to "make it automatic." He spends countless pages describing how to take advantage of direct deposit and automated debits. Apparently, this isn't common knowledge among people; nor is the fact that you can set up automatic payment plans to mutual funds with little or no initial investment. I wouldn't have believed that, except that this is a very popular book.

I've got a few beefs with this book. First, I am sick of every author and financial planner on Earth recommending asset allocation plans as a panacea. Diversification is good if you're buying individual stocks and you want to spread your risk across many companies. It's less tenable when you're buying mutual funds, which are diversifications in themselves. No mutual fund puts all its assets into just stocks or just one category of stocks. They spread the money across many companies in many sectors and they have sizable holdings of bonds and cash equivalents.

In my opinion, spreading your investment money across a bunch of different mutual funds dilutes your holdings. If you only had $100 to invest a month, why would you put it in four different funds: one bond, one aggressive growth, one money market, and one blue chip. That's exactly the calculus many asset allocation drones preach, but you're unnecessarily limiting your upside potential. I think it's better to pick at most two funds and throw everything at them. Personally, I like to put my money in a fund that's earning a lot and put some more in an S&P 500 index fund. That way, I've always got a portion of my money in a fund that's representative of the market as a whole and consistently providing a decent return over time. Simultaneously, I've got the rest of my money working really hard.

Second, he calls the phenomenon of long-term investing "compound interest." Perhaps this is a niggling point, but compound interest is a term specific to banking. It is the effect of earning interest on interest or, in lending, paying interest on interest. It has nothing whatsoever to do with the stock market or any other form of investment. If I were generous (I'm not), I'd say that Bach was trying to explain the issue in terms that the average person would understand. Instead, I think he may not really understand the difference. In the stock market, you never realize any gains until you sell the security. They are called "paper profits" for a reason. If I buy $10 worth of stock at age 25 and it's worth $1,000 at age 65, it's not because of any sort of compounding—it's because the value of the amount of stock I bought at age 25 has risen over 40 years. This could be because the price has risen, the stock has split, the company has bought back its own stock, or another reason entirely. It's exactly not like savings.

Finally, I hate how talks about the automatic mortgage payment. He recommends splitting your monthly mortgage payment into biweekly installments. The purpose is to make an extra payment a year, which will save you a bundle over the course of your mortgage repayment. He drones on about this at length, but he can't easily gloss over the fact that you're paying an extra payment every year. My mortgage is over $1,200 a month. I can't imagine paying an additional $600 two months out of the year. I'm not sure most people could swing that either. It strikes me as disingenuous to prattle on about how becoming a millionaire is as simple as foregoing your morning latte (amounting to $50-100 a month since everyone who gets a latte before work works a seven-day week) but not including the extra $100 per month it would cost to make an additional mortgage payment.

Bach's book does discuss an interesting approach to paying your debts. Basically, you make minimum payments on all your debts and then put half the money you save every month towards one of them. Once you've finished that one off, put the half plus the minimum payment of the paid-off debt towards the next debt. And so on and so on. It would be an interesting approach if every other book on the market didn't already mention it.

Stylistically, the book is boring as hell. It repeats the material endlessly, uses obviously concocted anecdotes to illustrate points (boy do his friends say awfully convenient stuff in oddly similar style to his own), and relies on crutches excessively. The benefit of reading the book instead of listening to it is that you can glaze over the boring parts; there's really no audio equivalent to skipping a few pages since it's virtually impossible to know when sections and chapters begin and end.

If you're looking to get rich or get out of debt, take the money you would have spent for this book and use it towards those ends. Instead, read this excellent—and free—essay on the subject called "Get Rich Slowly". You'll be better off because he's a better writer and the advice is more pertinent.


On the Way to the Forums


Vanilla: Vanilla is a brand new open-source forum software that's stated goal is to "the mold created and followed by just about every other forum on the web." This jibes with my experience in bulletin boards—I've found them pretty much all the same, even down to their interfaces. The only other different forum software I've run across is PunBB and that's not that different.

Sometimes it's good to follow the pack: conventions make user interfaces easier for users to understand. Most of the time, to my mind at least, it's great to re-examine the premises of commodity software and see if there's still some innovation to be had. I'm definitely going to try out Vanilla at my community's fledgling virtual community.


DictionaryBase and Repeaters


I've been struggling to databind a custom collection built off DictionaryBase to a Repeater. In my other custom collections that used CollectionBase, I could just cast the Container.DataItem to the underlying type and access the class's properties. When I tried to do the same thing for my DictionaryBase collection, it kept giving me casting errors.

I tried casting the DataItem to the collection itself and using keys and values. The Web wasn't particularly helpful. In explaining it to a coworker, who helpfully rubber ducked for me, I realized that I needed to cast the DataItem to a DictionaryEntry and then cast the value of that DictionaryEntry to my underlying type. Duh!

Here's the syntax, with any confidential bits removed:




Democrats and Businessmen


Project FAZR: I remember reading about something like this in Atlas Shrugged. How did that turn out in the book? Oh, who is John Galt?


A Different Vista


No more Longhorn. The new release of Windows, due in third quarter 2015, will be called Windows Vista. So the product name will be Microsoft Windows Vista. Hate it.

[UPDATE (7/25/2005): Uh oh, looks like someone didn't do their homework. I don't know how such a glaring oversight could occur. You'd only have to look at PhoenixFirebirdFirefox's cautionary tale. I mean, we're talking about Vista.com for crying out loud and they're based in Redmond, Washington.]

[UPDATE (7/28/2005): Paul Thurrott reviews the Vista Beta 1. Looking at the screenshots he provides, I'm surprised at how different Vista looks from XP. He points out its flaws and does a very thorough job of examining it. Luckily, it seems as boneheaded as XP so 10.5 should blow it out of the water in the months prior to Vista's release.]


Meeting the President, Sort Of


Today when I was leaving work, I went out the back way since it was closer to where I parked my car. The door is a little sticky so I gave it a good heave. Unfortunately, there was someone just walking up to the other side of the door. More unfortunately, it was Bob Parsons, Go Daddy's owner. Luckily, I only gave it a slight heave as opposed to my usual slam. I can't imagine what would have happened if I really opened it hard—I do know, though, that it wouldn't be a good first impression.

[NOTE: The views expressed on this website/weblog are mine alone and do not necessarily reflect the views of Go Daddy Software, Inc.]


Looking Sharper


Oh yeah, ReSharper just hit beta for version 2.0.

This feature—"Support of ASP.NET (almost all features implemented for C# and VB.NET for code inside ASP pages)"—will make this an automatic upgrade. They rejected my suggestion for a code style rule, but I'm not bitter. ReSharper is easily the best reason to use VisualStudio.NET—besides the fact that doing ASP.NET without it is a mind-numbing chore.

Other awesome features listed are background loading (waiting for a huge solution to load can take awhile), on-the-fly naming convention violations (no more post-compilation FxCop execution, at least for naming), Live Template sharing (you currently have to provide step-by-step instructions for each template if someone else wants it), Code Style sharing (ooo, enforce formatting standards across the project), Implement Members (no more going back to create the private fields for all your properties), and customizable method stubs (awesome, I'm sick of having it default to throwing unimplemented exceptions).

I couldn't find any information about upgrade pricing, but it's worth it no matter what.

[UPDATE (12/2/2005): Looks like they're almost done. And word on the blog street is that the upgrade will be free for 1.x users. Rock on!]


The Worst Gets Worse


At my last job, we used a crappy help desk ticketing application called Magic—that was anything but. I've complained about it here before, but today's Daily WTF indicates that I was only talking about its superficial suckiness. SQL in the query string!?!? How would that even occur to a developer?

The SQL injection possibilities are endless.


Learning Python


I'm 80 pages into Learning Python in my quest to Python proficiency so I can try on some Django for size. So far, the book seems great: comprehensive, thoughtful, and well-written. The language—I'm only up to strings—reminds me a bit too much of VBScript in its simplicity. I'm sure that my view will change when I start getting into the object-oriented sections, but right now it seems pretty BASIC. *pun intended*


Commenting


It appears that no comments can be posted here without my approval. I have no idea why this is so since I've completely turned off any such requirements. I'm running MovableType 3.17 for this blog and I had no such problems with 2.661.

If you want to leave a comment, it won't appear immediately. I really want it to appear immediately, but MT won't let me fulfill my wishes. Until I can move to TextPattern, I'm going to have to live with this. (Luckily, this shouldn't be a problem since I've had 140 comments total in the four years I've been offering up my blog.)


Python on Rails


I've been intrigued by all the hoopla surrounding Ruby on Rails. It's a web application framework that is described by its practitioners in exactly the same manner as Cocoa is lauded. They say that the framework takes care of nearly everything, so you just need to write the glue and functionality. I don't know how accurate that is since I've never used either. I haven't bothered trying Ruby on Rails because the installation process sounds like a tedious pain. Sure, my host now supports Ruby on Rails but I don't want to have to do all my development on a remote server.

Now there's a similar framework available for Python called Django. Python is a language that is nearly ubiquitous in the Unix world and has some language features that I really like. I think that learning Python would have much greater utility than learning Ruby, even though Ruby on Rails is hot, hot, hot right now.

[NOTE: There's also another Python framework that more explicitly tries to emulate Ruby on Rails: Subway. {via}]

[UPDATE (7/17/2005): I thought of another reason to learn Python over Ruby: PyObjC. It's a Python bridge to the Cocoa libraries. That would provide a nice transition to using Objective C, which is a direction I'd like to eventually head.]

[UPDATE (7/18/2005): Simon Willison, one of the creators, shares the backstory.]


Hanging Out (and Up)


I noticed yesterday that someone had installed a hook or hanger on the urinal wall in our bathroom at work. Now I can understand such a device in a stall on the back of the door since you might conceivably need to stow something off the floor, but I've never seen such a thing in a urinal before.

Am I crazy since I generally visit bathrooms unencumbered?

[NOTE: The views expressed on this website/weblog are mine alone and do not necessarily reflect the views of Go Daddy Software, Inc.]


Learn by Disexample


"Exception Disfunction" is a hilarious entry over at The Daily WTF. If you're a programmer, you'll get as big of a chuckle at this daily visit as you might at Dilbert. The site has some truly godawful "worst practices."


High Praise


One of my new co-workers had a chance to look over the source code and the code layout yesterday. This morning she came in and told me that she was impressed. I take a lot of care in making my code look clean and organized. If you have to work with code day in and day out for weeks, months, and years, why not make it appealing? It's why we don't work in bathrooms.

I have seen far too much source code that looks like ASP, ColdFusion, or C# vomit. Indentation and white space are usually the first casualties. Five blank lines between these methods, no white space between the comment and the comment operator, a private method then an event handler then a property. Pretty soon, you're relegated to the object browser just to find things.

I can definitely understand why people rely so heavily on IntelliSense. I don't because I name my methods and properties descriptively. Further, my code is organized by section and then alphabetically within the section—except properties, which I organize according to their layout on the ASPX page. If you follow that convention (or any convention, really), then you'll be able to find your place in seconds on any code file you find yourself in.

Regrettably, the compliment was the first time anyone's noticed (or taken a second to point it out). I am beaming presently because of it. She really made my day.

[NOTE: The views expressed on this website/weblog are mine alone and do not necessarily reflect the views of Go Daddy Software, Inc.]


Database Projects


Database Projects in VisualStudio.NET: I had no idea that there was such a thing. After reading the article, I'm sold. Working with, editing, and adding stored procedures from within VisualStudio.NET is a godsend after having spent the last month editing and creating stored procedures from within Enterprise Manager's dialog box.

Who the hell thinks that a dialog box is an appropriate source code editor?! I know you get used to it—I did—but a good code editor adds a huge range of benefits with which any programmer is familiar.


Best Practices Aren't

I read James Bach's essay entitled No Best Practices today and I loved it. I have always abhorred the "best practices" meme, which I regard as a substitute for thinking. At my last job, "best practices" were the Holy Grail or Fountain of Youth that we were forever seeking. At nearly every design or development meeting, someone would bring up that we needed to "find the best practices and stick to that" for some project. As if programming were a matter of upfront research and rote coding!

The concept of "best practices" might sound good on the surface. Who wouldn't want their development efforts informed by the best advice? These aren't the "adequate practices" after all. These are the best of the best of the best. Sir. Ostensibly, they represent the received wisdom of the software engineering profession.

Except, of course, that they don't. Bach makes the point that there's no such widespread accord. Further, such consensus wouldn't be particularly useful even if it existed. While every general problem in software engineering has been developed, every program has specific applications of that problem that are unique. Design patterns are great, but they're understandably vague and require a programmer to implement. Code reuse within a program is admirable, as are frameworks and libraries. There isn't a framework or library out there, however, that doesn't require a programmer to take the functionality in the library and craft a program that uses it.

"Best practices" persist because the worst kind of managers don't trust their programmers. They want the reassurance that their employees are following someone else's advice or toeing some preset line. For some reason, they have a sort of departmental low self-esteem that makes those on the outside seem like geniuses and those on the inside incompetent. Perhaps that's too strong of a word. It's more of a lack of confidence than an explicit assessment of ability. Managers of this sort typically fall back on big-name, expensive consultants to allay their irrational fears. Never mind that the consultants aren't able to comprehend the minute ins and outs of the business in the short amount of time that they interact with it. Never mind that the quality of consultants is completely uneven. So long as they're willing to sling their particular brand of hash as "best practices", they'll find willing managers to support them.

The thing that pisses me off most about the "best practices" drivel is that they steamroll right over the true "best practice" in programming: use the right tool for the job. If your project requires substantial abstraction and multiple layers, go for it. If it doesn't, do the simplest thing that works. Overdesign is a code smell that begs for refactoring, though it is usually the hardest thing to refactor. It's so much easier to repeat the hell out of yourself and then refactor the repetition out. Easy and simple aren't sexy, though, so you constantly encounter programmers who want to make things complicated.

And that's the really unfortunate part: the complicated, overdesigned solution is often more attractive to the "best practices" crowd because they're awed by things that they don't understand. If they can understand it, they reason, then it must be simpleminded. Why roll your own basic CMS when you can use a million dollar system like Vignette that does everything for everybody? Vignette is a beast whereas straightforward server-side creation of HTML is simple. Clearly, Vignette is more powerful—never mind that there's no demonstrable need for its power.

Context is key: do the simplest thing that works using the right tool for the job. There is no be-all, end-all solution. It's a chimera. "Best practices" at their least offensive are nothing more than design patterns and helpful advice. Call them that. At their worst, though, they're a snake oil that has a stultifying effect on programmer initiative. In the wrong hands, they can be a club to be wielded whenever a programmer wants to think different or just get things done.

If you're a member of the "best practices" crowd, do some introspection and take a really good, hard look at your expectations surrounding their use and whether they've actually produced anything of significance when forced onto programmers. I think that you'll find that they're not all they're cracked up to be. And if you encounter a sales demo or a consultant who piles on with the jargon and the "best practices" talk, know that he's inadvertently alerted you to his true nature. Usually, you don't get that lucky until after the sale.

[UPDATE (4/8/2006): Jeff Atwood shares my disdain.]

Second Month at Go Daddy


Phew, work has been crazy! The powers-that-be (I have no idea who that might be) decided that they wanted the new product sooner than later so they're pursuing a more aggressive schedule and adding two more developers to the project, which has heretofore been just me. I had to complete two full use cases (four pages plus stored procedures) in just over a day in order to get caught up to the new project plan. I did it but it was a lot more rushed than I prefer. Still, it felt good to have accomplished it.

I was initially nervous about getting some actual co-workers but one of them I had already developed a relationship with since we both had children that were 20 months old. Her son was born on October 31st and my girls were born on October 17th and 29th. We swapped war stories and pictures, so that was nice. Today I met the other guy on the team. He seems like a great guy and I found him quite amiable. Reading over his blog, I think we're going to have a lot of fun developing this brand new, details-not-available product.

I was reviewing my code statistics today and I realized in the short month that I've been actively developing this new product, I've written 10,000 lines of code. It sure feels like it. I've also written increasingly complex stored procedures and very complex table joins. I know that I can do anything that I need to do, but it's nice to look back at what you've achieved in such a short amount of time.

At any rate, this aggressive schedule means that I'll be able to do my own personal announcement sooner and I am just dying to let you people know exactly what I've been up to. It's easily the most exciting project I've ever been a part of and that includes a complete rewrite and rearchitecting of an online banking system (which was pretty damn exciting, let me tell you).

[NOTE: The views expressed on this website/weblog are mine alone and do not necessarily reflect the views of Go Daddy Software, Inc.]


Scribe and OmniWeb


Scribe: a Firefox extension that allows you to save form fields, such as a blog entry post, as a local file. As someone who has lost at least a dozen blog entries due to application crashes, careless browsing, or accidental closing, this is a valuable extension.

Well, except that OmniWeb (my primary home browsing environment) has had this since version 5 came out. Actually, it's much more robust than this since it saves everything when it crashes: from your form field text to your open tabs to each tab's history and contemporaneous content (a lifesaver in the case of Bloglines when you're in the middle of reading new entries in a folder full of feeds).

[UPDATE: As if tempting the Fates, my battery went dead today in my iBook. OmniWeb did a valiant job at restoring what it could of a brilliant entry but it had only stored the first few sentences of the several paragraphs I had written. Moral of the story: nothing can protect against sudden power loss (except maybe a APS.]


Associated


If you use the incredible Firefox browser, you may want to make sure that you don't have the "Print This!" extension installed. This marginally-helpful extension, which puts print and print preview items in the context menu, has an undisclosed feature the developer put in that replaces any Amazon link you click with one that uses his Amazon Associate ID, meatme-20.

If you see "meatme-20" anywhere in an Amazon URL, you've been 0wnd and you should probably look for a MeatMe extension. So far, he's only 'fessed up to doing this slimy practice in the PrintIt! extension but why would he stop there? If he's willing to do it once, he's likely to do it again.

His reasoning is that no one donated to his PayPal fund. Uh huh, so why'd you have to sneak it in without disclosing it anywhere?

[UPDATE (7/27/2005): He's removed the associate ID—ostensibly because two people donated. Uh huh, the bad PR didn't have anything to do with it.]


Dreamy Host


Wow, I got this month's Dreamhost newsletter today and I excitedly opened it. The newsletter isn't your standard fare: it's chock full of cool new features and promotions in a tone that's often witty and always delightful (it runs a close second to the utterly hilarious OmniNews in the excellence in corporate communications awards).

This month was no exception. Not only did I find out that they've now got Ruby on Rails and Zend Optimizer installed, they also took a cue from Gmail's ever-increasing storage limit. Every week, my bandwidth goes up by 2 GB (starting from an already-generous 192 GB per month) and my storage increases by 60 MB (again from a generous 7.6 GB). And they made it retroactive to when I first signed up back in November 2004.

This is on top of a huge number of excellent features, great support, and excellent uptime. I'm slowly moving everything over to Dreamhost from UplinkEarth. It's that good. If you sign up, please tell them I referred you by clicking on this link or using "wcbrown" as your referral code. I'll get $97 towards my hosting and it'll cost you nothing extra. I've already referred several hundred dollars worth since I started and I haven't heard any major complaints.


The Pleasure of Finding Things Out


I just finished listening to an audio version of Richard Feynman's The Pleasure of Finding Things Out. Overall it was pretty mixed in its content, but what was good was really, really good.

One story he repeatedly shared—the book is a collection of individual essays and documents from Feynman's life so it's replete with repetition—is about the walks through the woods that he used to take as a child with his father, a uniform salesman. Other boys in his peer group would ask him if he knew what some bird or tree was called and mock him when he didn't know because their fathers taught them such things. The difference was that his father taught him that knowing what something is named tells you absolutely nothing about the thing itself, only what words humans use to refer to it.

His father would ask him how a squirrel moves and Feynman (the child) would reply that it was by using his muscles. His father would say, "Nope, it's because the sun shines." Feynman would look at him quizzically and his father would then ask a series of questions that delved deeper into each succeeding premise until the ultimate cause was clearly that the sun was shining. His father had no scientific training, but he wanted his son to become a scientist. (I must confess now that I may have gotten the specifics of this story—and any others I relate—incorrect since I can't readily go back and verify my memory. I do, however, know the gist of them.)

On another walk, they were really studying trees and Feynman's father told him that on all these walks they had really only gotten to know half of the forest's workings. Feynman was again curious and his father pointed out that they had been focusing solely on living things. Death was an important process in the forest and so he proceeded to search for evidence of chains starting with things dying. They found rotting trees, animal carcasses, and so on.

The last story about the interaction between the Feynmans that struck me was how Feynman's father used to tell him bedtime stories from different perspectives and Feynman the child had to guess who his father was using. Sometimes it might be a Martian, other times it was a bug in the carpet. Feynman related that these stories exerted a powerful influence on him at the time because they seemed so vivid as his father described the world as viewed from an ant's perspective.

These stories (and there were many more that I enjoyed) illustrated the power of showing rather than telling. Feynman's father could have delivered extensive tales of biological processes or everyday bedtime stories. Instead, he took the opportunity to present lessons—in stepping out of your own way of looking at things, in looking beyond the obvious workings of our world, in getting to the root causes of the way things are. He did it through means a child could understand, which made it accessible.

The main thing that Feynman says his father instilled in him was that the world was full of wonder. This curiosity manifested itself in his interest in physics, but it could also show up in his forays into psychology and his generally skeptical manner. He emphasized that curiosity was its own reward.

These are the things I want for my children, things that I have enjoyed throughout my life. I hope that I can do it in a similarly inspiring fashion, rather than a clumsy, lecturing style that turns them off. Feynman's The Pleasure of Finding Things Out is an excellent source for the former and well worth it for any parent who desires the same.


Happy Fourth of July


Happy Independence Day! I could write a paean to America and the American way of life, but I won't. If you're interested in some vaguely Independence-Day–themed content, may I suggest my essay "Thomas Jefferson, Abolitionist"?


About this Archive

This page is an archive of entries from July 2005 listed from newest to oldest.

June 2005 is the previous archive.

August 2005 is the next archive.

Find recent content on the main index or look in the archives to find all content.

Feedback to