New location - updated RSS, etc

January 5th, 2009

Just a quick note that I’ve moved all new stuff over to a new blogging system using Jekyll and Git.  I’ve updated the old RSS feeds, but anything new will be posted at http://www.infiniteabyss.org/ without the blog/ at the end.

See you in a month!

October 31st, 2008

It’s half an hour until midnight, November 1st. The excuses have been put aside. My study is complete; I have a comfy chair, a beautiful large desk, and a delightful stereo with iPod dock. I have a notebook with half-formed plot vehicles, character studies, names, themes, and other random thoughts. It’s time to try to make sense of them and produce some output.

NaNoWriMo is here!

This is a first step for me. Well, second step really. This blog was the first. I’ve always felt inclined to write. I’m drawn to the idea of being able to make coherent in the world ideas that were once only in one’s head. Being so free form, a blog is a great way to start out. You get to make the schedule, you get to choose what to write, and you get to decide when it’s done. This next step is the exact opposite. The only thing I can still decide is the story. But now I’ve got only a month and I’ve got to get out 50,000 words. Holy shit that’s a lot. It’s exciting, and pretty scary.

So until this next month is over, there will be no more blogging for me. I enjoy blogging, and I have 30 or 40 half-formed blog posts sitting here in my folder. Hopefully in December I’ll still want to write and actually get some of those down too. But in the meantime, I’ll be novelling! I may occasionally spit out a word count, but that’s it.

Say some prayers, I’ll need them! And despite the silence in this little corner of the internet, you can bet that I’m still hunched over a keyboard, furiously demanding that my fingers follow the sinews of my thoughts. Hey, that almost sounded writerly.

Six Rules for the Most Important Part of Your Software: Installation and Upgrade

October 22nd, 2008

It doesn’t take the extreme examples to realize that the general state of user interfaces in software suck. The available levels of interface design are passable, bad, and OMG WTF?! If you want to sell a product, it makes sense that you want to quell your user’s use of expletives. In fact, you don’t just want to pacify them with something that’s “good enough”, you want to make them love you. You want them exalting you with such loyalty that they’d rather cut off pieces of anatomy than let someone they care about use a competitor’s deficient product. That’s how you increase your sales, your branding, and your karma in the world.

Once a customer buys in to your product, what’s the first thing they do? They install it on their computer. (If it’s a webapp, they register, create an account, etc.. the same rules apply.) This is your big chance! You can either Wow your new customer with something amazing, or you can bore them with the same cheesy install wizard and pray that they’ve become so immune to the stupidity of UI design that they won’t recognize the inanity of it.

First impressions last forever. That’s why the install and upgrade processes are so remarkably important. Over the last few months, my team has revamped our entire installation process for our product. Along the way, I’ve gotten to thinking more about installations and have paid more attention to the hoops many people jump through with common pieces of software.

Here are some rules for making a great first impression.

One Click Is All It Takes

No piece of end-user software, aside from maybe an operating system, is so important that it needs to take more than one click to install. You don’t coddle a user by flashing a Welcome Screen that introduces them to your install wizard. You coddle them by making them say, “Gosh, that’s it? That was easy.” On our product, we went from a series of 4 or 5 dialogs asking various questions or supplying intermediate steps. The user input between steps was generally just to click “Next”. They really don’t need to do that. Now, our install process can be completed in one click. They hit the install button and off it runs. After completion, it brings up the app for you.

As Simple As Possible, But Not Simpler

Most apps have some configuration options that can be set during installation. Our install screen provides a couple of options for configuration, but it doesn’t force the user to act on any of them. They can still just click “Install”. We’ve taken pains to provide smart defaults so that 90% of our users don’t have to do a thing. And that’s perfect. Most users don’t care. You might be aghast that your log files don’t end up in a certain directory, but normal people aren’t.

Gall’s Law applies here. To be fair, it applies most places.

A complex system that works is invariably found to have evolved from a simple system that worked. The inverse proposition also appears to be true: A complex system designed from scratch never works and cannot be made to work. You have to start over, beginning with a working simple system.

Starting with a big dialog with lots of different options and settings is a bad idea. Putting one setting on each page of your “wizard” and making a user hit “Next” in between doesn’t help. Instead of starting with all of your configuration, start with nothing and see if you can add nothing to it. I’ll bet you can. Only in rare cases, like operating systems, is there any configuration that is really and truly necessary. Get to the point when there isn’t anything left to remove from your install options.

You know you’ve achieved perfection in design, not when you have nothing more to add, but when you have nothing more to take away.” - Antoine de Saint Exupery

Stay Responsible Over Your Domain

There are libraries and installers available to take the coding work for install off your hands. This seems intriguing at first. It should let you focus on your very important, application specific, domain specific code. I recommend resisting this temptation and writing your installers yourself.

Our original installer for our Java product was IzPack. That made it needlessly long, and it did not fail gracefully when it failed. I looked at replacing it with another IzPack installer as well as JSmooth, Launch4J, and Antigen. In my botched attempts, I still had no warm and fuzzy feeling that I was doing anything better than the previous installer. There were still multiple dialogs and they were still overwhelmingly filled with that ridiculously melancholy Windows gray color (where did they get that?).

In the end, we ended up writing the whole installer ourselves. I feel rather pleased with it. It’s simple and effective. More importantly, it doesn’t piss off our users. If you believe, like me, that first impressions are important, then installation ranks just as highly as all of your really exciting business logic. Your user just gave you money, or is deciding to give you money. Your job is to convince them they’re making the right choice. It shouldn’t be ambiguous.

Be Elegant

The default Windows blue and grey is, to me, as depressing as deteriorating cubicle walls affixed with Dilbert cartoons. You can do better, especially if you’re keeping control of the design and coding of installation. Pick a color theme that resonates with your product. Make your widgets look like they do in your app. Keep the fonts appropriate. If you have a designer available, make sure to get input. First impressions, and all that.

Leave The User In Charge

Finally, the one truly unforgivable wrong is taking control away from the user. When the iPhone 2.0 software first came out, the biggest complaint was the lack of control. If I hit the lock button there was a several second pause before I heard the little clicky sound. The same several second pause occurred when opening Mail or SMS messages. It made most people on edge and frustrated. Joel talks a lot about that clicky sound.

During installation, a user should have knowledge of what’s going on at all times. If you’re busy doing something in the background, give them a progress bar that updates appropriately. A step shouldn’t be surprising in duration in any way. If it takes 4 seconds or 40 seconds, it’s your job to make sure the expectation is set.

Imitate What You Like

I love the Mac install process. You just drag and drop your application into the Applications folder. That’s it, nothing else. A lot of apps go one step further, like Firefox. The window lets you do only one thing - drag the Firefox app icon into the Apps folder. Simple, elegant with a nice little semi-transparent Firefox logo, and effective. I immediately think that this browser must be a slim, elegant little piece of software that stays out of the way when I’m using it for it’s primary purpose: browsing web pages. It just does its job.

Posterous is an excellent webapp example. They’ve removed the install process completely - if you want to start a Posterous account, you just email your first post and they do the account setup for you. What a great system!

Keep an eye out on what other apps do (./configure,make don’t count). Keep your interface elegant. Keep it simple. And keep control of the code.

Absentmindedness and Smart People

October 18th, 2008

I had an interesting experience a little while back visiting a user of the product I help develop at work. This particular user was clearly bright. He had a firm grasp of the tool and its capabilities. But I was struck watching him manipulate a computer. This guy was leaning forward in his seat, angled towards the screen that sat on the narrowest part of his desk. The keyboard and mouse on his desk seemed an afterthought. His feet were planted firmly on the ground out in the open of the cubicle rather than under the desk. He stared at the screen waiting expectantly, as if you had to get a response from the computer before doing anything else. His input was synchronous - give an input, take an output, evaluate, and give another input. As he manipulated the mouse, he actively searched for the commands he wanted, rather than knowing exactly where to guide the mouse next.

Later that day, I went back to my office and paid more attention to another developer and the way he used his computer. I found the classic image of an involved developer. The headphones were on and he was completely oblivious to the outside world. He was slouched down, with most of his body under his desk; his posture was comfortable. The connection between him and the computer seemed more organic. His computer took up the prime piece of his desk real estate. His fingers flew across the keys, often not waiting for responses before the next queued command was sent off to be executed.

There’s a link between how a person operates a computer and how they view and manipulate the data they work with. I think it has to do with the mental models we create in our heads. Some people operate much better creating elaborate constructions completely inside their head, in effect detached from all reality. Other people only seem to create those models while they remain attached to reality, talking or looking around at the objects they’re referencing.

Before computers were so popular, the dominating image of this stereotype was the absentminded professor. He would bustle down crowded hallways of university buildings, his glasses askew and his tweed jacket not quite hiding that his undershirt wasn’t completely tucked in. The folders he carried were never organized well and there seemed to be a roostertail of detritus behind him even when he wasn’t dropping papers. It was almost as if you could see the ideas being cast off and discarded in his wake. If he bumped into you, he wouldn’t even notice.

The professor wasn’t really there in that hallway. His entire attention is devoted to whatever thought occupied his brain, with only sufficient brainpower diverted to ensure that one foot goes in front of the other.

Being able to devote brainpower over entirely to a mental construct has benefits. Between school and work, I’ve had the opportunity to know some brilliant people. Every single one of them is absentminded. They discard the real world for their mental model.

There’s a connection here with introversion. I won’t be so bold as to say that a very introverted person is more likely to be highly intelligent, but it could be a strong positive indicator. Certainly introversion is a tactical advantage for certain types of work. Computer science, mathematics, and writing all require complex mental models, and people that interact more with the outside world necessarily don’t have as much room in their heads.

The absentminded among us are often considered rude or flighty. So give them a break, they need all the time they can get inside their heads. That’s how they solve problems. We’ll wait patiently too while you talk out the solution to your problem.

A Contrarian View: Why Should I Vote?

October 16th, 2008

Anticipation (typical unrelated opening paragraph)

Anticipation is a bitch. I’m two weeks away from starting one helluva task. My days are filled with a haze of energy at work. My evenings are filled with social commitments and slowly increasing free time to sit in my newly finished study - my haven - surrounded by mellow music and belt out the occasional rational thought. Both are currently frequented by stomach churning of increasing amplitude as I try to keep my nerves in check. I don’t know what I’m made of yet, I’ve made it a point to avoid the limits, to always retain an excuse in case of failure. This time the excuses are getting checked. The limits don’t exist. In two weeks, it’s make or break time. I’ll either reach 50,000 words or I won’t. I’m not expecting a masterpiece. I want to follow the NaNoWriMo philosophy - I want to stop reaching for the thesaurus every 5 seconds, the excuse machine (Internet) every 2 seconds, and prove that I’ve got enough mettle to suffer through the highs and lows and actually produce something that could, after countless hours of frustration spent fixing it, become a lucid and interesting story. God it scares me. This whole little rant being only 2400 words and 2.5 hours of work, it scares me even more (The NaNoWriMo 50K count breaks down to 1667 a day). Still, in the middle of cold sweats, nervous tics, excitement, character traits, and scene outlines, I’ve had some thoughts moldering that I wanted to get out before they’re too stale to resurrect.

I’m not voting

There. I said it. I’m not voting. Before you get all up in arms about how my vote counts and how it’s my chance to be a cog in the great wheel of democracy [1], allow me a few words to explain, because this is at least a conscious, reasonably well informed decision.

First, let’s do this by the numbers. The electoral votes for Maryland, where I live, have a 100% chance of going for Obama. 100%! At least Pennsylvania has 1% for McCain. So even if I were to want to vote for McCain, my vote has literally no visibility in the election whatsoever. You’re welcome to suggest that the Bradley Effect is possible in certain situations, and I can’t dispute the possibility. It’s easy to look at state voting populations and assume that polling simply reads general trends. But the math behind using small sample set polling, done properly, is overwhelming. Confidence ratings on sampling are high.

So I have no real say in the electoral selections for my state. One could argue on numbers alone that a vote is far more important in a swing state like Virginia or Florida. There are places where the electoral votes have a real possibility of going to either major candidate.

I still wouldn’t vote. On purpose. I believe there’s a drastic difference between an uninformed vote and an informed vote. I think a majority of the votes in this election will be uninformed. My no-vote is a vote of no-confidence, not in the candidates necessarily, but in the political system as it stands presently.

There are two types of uninformed votes: the “party line” votes and the undecided coin-flip votes.

I’ve tried over the last few weeks to have a few discussions on politics. I’ve witnessed a few as well. It is absolutely baffling to me how a process so supposedly central to our country’s workings can have such a polarizing effect on almost everyone. But the worst part seems to be that the more polarized you appear, the more uninformed you actually are. It seems as if everyone’s opinion is simply regurgitated and flavored by whatever particular media brands that person relies on. And the media being such an unbiased and civil institution, passes on only the unblemished truth of every situation.

I don’t think a vote can possibly be informed if a person honestly believes they can be pigeonholed into one of two political parties. The parties no longer appear to represent issues. Rather they represent stakes of power in governing bodies. These can be bought and sold by lobbies, unions, or other groups. When I listen to party officials on either side debate, there seems to be no rational thought beyond a plea to sway the balance of power. As soon as I hear accusations and blame (or hosannahs) being cast on the shoulders of either party so generously as exist in the media today, I immediately resign myself to missing any rational discussion on an issue. (The best places I’ve found for some accountability of this sort of powermongering are CSPAN - see the debates on the floor, or the votes cast - or sites like FactCheck.) The party line vote is simply fishing for power in people-turned-lemmings.

Undecided votes can also be uninformed. Certainly, everyone has a right to take their time forming an opinion and selecting the best candidate. But let’s say you get into the voting booth and you still just don’t know who would be better. So you flip a coin and vote. What has your vote just done? Has it really counted? Does it really mean anything? I don’t think this could qualify as “Rocking the Vote”, despite what MTV might advertise.

I would argue that a citizen with a relatively equal comparison of the candidates would do no harm in not voting, and would possibly do some good. This is the situation I’m in. I certainly see some differences between Obama and McCain. There are positives (Obama - deep thinker, smart; McCain - experience and national defense understanding) and negatives (Obama - abortion; McCain - same lack of perspective or adaptability in thinking as W.). When I look at the actual effects each candidate would have on my life and the direction of the country the way I prioritize it, I see only very small differences.

Taxes can serve as an example issue. The subject is generally polarizing. Those party-line folks on both sides will proselytize through the media that only they have the golden ticket. They’ll swear up and down in 15 second sound bytes that one or the other candidate will do good on some blanket statement. On both sides, they’re idiots. If I look at the actual tax difference I would see, the change is within one percent. Taxes, from a short term policy perspective, suddenly becomes much less of an issue as a voter.

Two levels of abstraction

I do think my no-vote, meagerly informed as it is, says something. The polarization of high profile presidential elections by the media and political parties has, in my mind, eradicated a rational debate on the governing of the country. The grab for power devalues the foresight of politicians by ensuring that whatever happens within the next five minutes will settle the correctness of a position. I would love to see stances on energy, foreign relations, technology, science, education, and taxes that look at the next century instead of the next ten years. Sometimes it takes a long time. I want to see debates that consider entirely new means of satisfying problems, rather than simply playing with the same sliders on the same graphs. Sometimes it takes paradigm shifts.

I’ll use my position on two topics to illustrate my point:

Taxes in this country are completely ridiculous. They’re overcomplicated, often preposterous, poorly weighted, poorly regulated by the IRS, and poorly serviced. In the meantime, we have a ratio of GDP to national debt that is skyrocketing. Considering the size of our government, our ridiculous budget deficits, and our many-zeroed debt, it seems prudent to ensure government income based on taxes. It’s entirely possible that the right answer in the short term is to raise taxes (where the short term is on the order of a decade).

But in the long run, I’m a huge proponent of a drastic overhaul of the entire system. Galbraith said, “It is a well known and very important fact that America’s founding fathers did not like taxation without representation. It is a lesser known and equally important fact that they did not much like taxation with representation.” As a nation, we’ve lost sight of the intentions of our founders. We’ve forgotten that the income tax was only instated in 1913. In the long run, the current tax system ought to be an outlying data point, not an acceptable trendline.

Education in this country suffers from difficult problems as well. High costs and poor performances, especially in cities, keep everyone on edge and expecting far better results. Some general changes to the current system are most certainly required. Teachers need better pay, scholarships for gifted students must be available, and an acceptable standard for all students must be reached. But these answers won’t fix our long term problems.

Education needs a much longer, generational perspective too. It’s hugely important to remember that the education system we’ve inherited was created for the needs of mildly educated skilled blue and white collar labor to fuel the Industrial Revolution of the 19th century. As our entire global economy shifts more and more to a knowledge based economy, the same system will crumble. As more kids go to college, the meaning of a degree becomes worthless. As more kids try to adapt to some average standard, the creativity and inventiveness that actually drives human achievement is literally learned out of kids. [2]

Our nation’s political commentary desperately needs to overcome its shortsightedness.

Honest Abe

Of course, the shortsightedness itself is a long term problem too. We won’t get there too quickly, but the Internet and other new forms of communication that remove the traditional media from power are taking the biggest steps right now. TV changed the way we deal with elections, and it’s only just now starting to change again.

This November marks the 45th anniversary of the assassination of President John F. Kennedy in Texas. He will still have a profound effect on the outcome of this election. JFK and his memory as a young, elegant president who had his position snatched away has been memorialized in Americana. The idea of the face of America, as that’s what the President has been since World War II, being eradicated affects us all, and rightly so. America has had a fixation with the image of that type of President since the assassination. Obama seems to fit the same mold in many ways, and he’s the first real chance America has for the same type of presidential image.

The democratic presidential nomination is a position Obama should have no business holding [3]. He never should have beaten Hillary. The legacy she holds with the American populace after her husband’s popularity and scandal combined with the media darling image she’s cultivated since leaving the White House should have made her a shoe-in for the grab. But she didn’t get it. Why not?

One of the most frequent thoughts that passes through my head while watching major sporting events is why enormous companies like FedEx, Nike, and Visa advertise so much. I understand this seems tangential; bear with me, I’m getting there. We assume that since big companies are clearly profitable we would use them no matter what. But if Nike didn’t advertise, and Puma suddenly came out with a glorious, fabulous campaign slogan - a catchy song and something like “My better is better than your better” for example - well, a lot of high school kids would be wearing Puma instead of Nike.

Obama has an amazing campaign engine generating that sort of symbol. Hillary never did and neither does McCain. In fact, no political campaign has ever done what Obama is doing so successfully now. He’s driving a new type of political branding the same way that Jordan drove branding for athletes in the 80s. He’s leveraged his charisma through his TV appearances, and he’s even using the new communications by mass texting potential voters during primaries. It would be foolish to suggest those strategies are anything but brilliant.

The Kennedy Fixation is at its height right now. The whole country, from both political parties, demands change. Change is far easier to see in a young idealist thinker like Obama than in an old, stodgy, experienced veteran like McCain, no matter how smart he may be. And like Paul Graham can tell you far more eloquently than I can: it’s charisma stupid.

Charisma has changed the game. The Presidential seat is different since World War II. Certainly Kennedy contributed to that change, but so did Nixon, Reagan, and Clinton in various ways. I wonder just how often we get the “best” candidate when so much of the race is guided by charisma and projection.

It’s interesting to consider how some past presidents might have fared today. Would Thomas Jefferson, a rather intellectual and introspective fellow, ever have achieved that office? Almost certainly he was the smartest president we’ve ever had, and he’s left the most indelible mark in our country through his gifts of eloquence.

He never would be elected today.

What about George Washington, our first hallowed president? President Washington took office only reluctantly, and held a second term even more reluctantly. He led the country in its delicate infancy, and blazed the way for later successes. In his farewell address, he warned of the power of political parties and how it might ruin the democratic process. His advice seems apropos today.

He never would be elected today.

What about Abe Lincoln? A remarkably somber character with occasional bouts of depression, sometimes bordering on suicidal. President Lincoln was a solid lawyer with then polarizing views on the issue of slavery.

He never would be elected today.

It’s interesting that all of the attention and media hype lends itself towards reflection of the presidential candidates as people, as the “face of America” rather than the issues they champion. It gets downright scary when you consider that the paragons of the office we aspire to duplicate would never themselves be elected.

The culture of the TV sound byte has changed the entire physiognomy of our political process (tell me, do you really want a president that’s just an “ordinary American” like you? I want somebody quite extraordinary). Since my vote counts so desperately, and I see two major candidates that herald no particular movements away from the political status quo, I will consider my no-vote a vote of no confidence. I love my country. It has the best backbone of governing philosophy ever wrought by mankind. I want the political system to get out of the way of our country’s greatness, so that it can go about the business of being great. I hope more people start demanding a change, not just in office, but to the entire two party political system that seems, in retrospect, so far in civility, justice, honor, and freedom from what our forefathers hoped to achieve.

[1] “Democracy is the worst form of government, except all the others that have been tried.” - Churchill

[2] “Humanity has advanced, when it has advanced, not because it has been sober, responsible and cautious, but because it has been playful, rebellious, and immature.” - Tom Robbins

[3] Please note too that any discussions of the candidates are for purposes of explaining my point of view, not for endorsement or condemnation.

An Automated Method For Making Your Writing Suck Less

August 22nd, 2008

Inspiration

Last night I was on a roll. I had all these thoughts going through my head. I had the main bits down for how to improve my method of writing and I was going through it point by point. I had viable arguments and even specific sentence structures all setup and ready to go. The thoughts were flowing like drainage off my overwatered garden.

I was in bed the whole time. I didn’t get up. I didn’t write anything. That was a huge mistake.

The whole time I was laying there, a secondary process was firing events constantly saying “you should get up, go downstairs, and start typing”. A monumental amount of pure, distilled laziness kept throwing all these events on the ground. Now, that laziness has sublimated directly into frustration.

Anytime you’re struck by some inspiration, no matter how miniscule or irrelevant it may seem, don’t ignore it! If you’re free (and laying in bed counts as free time), then get your lazy ass up and start putting the proverbial pen into the digital inkpot. I wonder how many opportunities for interesting thoughts are lost simply because those secondary events that tell you to actually write and not just think get dropped. Too often for me. This is one of the hardest parts of writing: actually doing it.

From now on, I will be working in a much more focused manner on letting those inspirational moments turn into effort. It’s a matter of getting out of one’s own way and turning thoughts into words on a page. Don’t expect your words to be a final, immaculate thought. Just get out a working first version.

Way Hard

Writing is hard. Really hard. Harder than programming. Harder than most of the math I’ve done. It’s harder than building an architecture, or understanding algorithmic complexity, or remembering grammars for regular expressions.

You followin’ me? This stuff is way hard. That’s why I keep trying to toss out reasonable sized blog posts that are actually coherent. I go over these things way more than their subject matter might suggest. To you, these are just some guy’s opinions about random subjects. To me, they’re a vehicle for better understanding how to put thoughts - perhaps the most powerful substance known to man - out into the world. Anybody that cares at all about thinking well, by necessity must also care about writing.

I had all these wonderful, perhaps even eloquent things to say about this last night. That’s why I’m so pissed right now. I didn’t write any of them down, even as a checkpoint to remember where my thought process stalled. If it’s so hard, I should be giving myself every opportunity to make it easier.

Hopefully I can recap a few of the things I was thinking about.

The thing that makes writing so hard is that the set of rules for “good” writing is completely fluid. They’re not concrete, and the best, most transcendental writing usually breaks them anyway. One of the most joyful things about programming is that there’s always some axiom, rule, or concept to fall back on. It’s still creative, and the possibility for elegant solutions exists, but the elegance of a solution is often defined by how fundamental or generic it can be. Elegance always passes through axiomatic simplicity at some point.

Writing has no such strictures. It can be simple and profound, or complex, ornate, and ostentatious and still achieve the effect that the writer is hoping for. Take a look at some of the works of Theodore Roethke, Kurt Vonnegut, William Carlos Williams, or Langson Hughes. These guys used language to induce profound reactions in their readers. They can toy with you, knowing just how well they’re setting you up for some grand anticlimax. They can make you laugh, cry, or breath a deep sigh of relief. They can make you yearn wistfully for a better life unfound even where you think it hides, or they can make you revolt against false powers bent on your slavery. I’m moved nearly every time I read anything they have written.

The alphabet, syntaxes, and grammars that parse writing are infinitely more complex than those that parse a program. Without guidelines, it’s difficult to come up with statistical analyses of a piece of text that could offer an area of improvement to the writer. Perhaps there are still some rudimentary tests though.

Wordles and Arcs

I was looking at an article on document and text visualization the other day and a couple of the visualizations struck me as interesting. Being the introspective person that I am (or narcissistic prig if you prefer), I tried applying two types of analysis to my own blog.

Here are the results:

Wordle: Wordcloud

Phrase Arcs: Phrase Arc

Let’s start with the Wordle, which is comprised of only my last five posts. Wordle filters out very common English words like “the” and “of” and then produces a cloud of the most common words (250 of them in this case) with size representing relative number of occurences.

Did you notice anything looking at it? Most of the bigger words make sense: “language” - yeah I had a whole post talking about that, “Apple” - yeah that too, “Ruby” - that makes sense. What about “just”, “like”, and “really”? Those seem reall–(crap).. those seem suspicious.

I went through my previous posts to see how I used those three words. The short, shy answer is: I overused them or used them poorly.

Let’s assume for a moment that you are an astute reader interested in what I, the author, have to say - a pleasant fiction for me. If you are interested in what I’m saying, then the best thing I can do is say it as simply and elegantly as possible. My primary aim is to take my thoughts and translate them to your brain coherently. If I’m watering down my thoughts with middling language, I’m downshifting them into a less forceful thought, and that’s just really not exactly like the original thought. See?

I’ll say it another way. Relativism being one of the primary misguided modes of thought in our time, I want to counteract it as much as I can. That means saying exactly what I think in a manner with which you will understand it, if not agree with it. That’s why I think my thoughts could be relevant to someone reading what I write. I believe that there are certain universal truths that exist, and I want to be able to give voice to the ways in which I try to understand more about them.

Taking a statistical look at the words I’ve been using makes me realize that I’m still watering things down. I’m taking the easy way out and suggesting that one thing is like another. I’m just making a statement a little bit gentler. I’m really trying to overstate my case. I’m not getting the point across as well as I am able.

I realize that now.

One huge dose of humility down, one to go. The Phrase Arcs applet is near and dear to my heart, as it uses the Processing API - yet another DSL high on my list that I’ve only toyed with at a rudimentary level.

This particular set of arcs is from a post I wrote describing a day in London. Note the highlighted arc. “Lesser monarch” seemed like an interesting combination of words at first, especially in conjunction with graves and memorials. Search through the post and you’ll find these three two word phrases: * lesser functionaries * lesser colleagues * lesser monarchs

Hmm.. a bit ostentatious, don’t you think? It seems to me like I’m trying to use an ornamental piece of language to cover a lack of new content. I’ve latched onto a particular phrase in my head rather than using those fluid rules of grammar and content to create thoughts the reader can actually ingest. Indirect repetition is not the same thing.

Humility

I’ve found a couple of concerning problems in my writing using some nifty automated text visualizations. That’s quite humbling. You have no idea how many “sort of”’s, “really”’s, and “like”’s I had to consciously prevent myself from writing in this entry.

Since you’ve managed to make it this far, I’ll let you in on a little secret. I’m gearing up to participate in NaNoWriMo this November. I don’t know yet if I have the chops to write anything of substance, but I’m going to give it a shot.

In the meantime, I’ll keep plodding along. Words being the simplest, most axiomatic form for any human thought, it’s important that I get better at it. You should get better at it too, even if you’re already really good.

It’s easy to feel too stupid, too lazy, or too complacent to work hard at a problem like this. Whenever that happens, I default back to a quote of Paul Graham’s about Isaac Newton and his work ethic: “You only get one life. Why not do something huge? The phrase “paradigm shift” is overused now, but Kuhn was onto something. And you know more are out there, separated from us by what will later seem a surprisingly thin wall of laziness and stupidity. If we work like Newton.”

Apple’s Recent Missteps

July 27th, 2008

Apple is known for its exceedingly well planned and executed products. They charge a premium for them and they’ve built a fiercely loyal customer base because of the quality level. Mac computers are simply the best computers available, iPods are the best music players, and the iPhone is the best phone - all by a wide margin. But they’ve started blundering ever so slightly. Not enough to destroy any of the religiosity surrounding them just yet, but they need to pick their pace back up to its normal level.

Here’s a brief enumeration of what’s gone wrong:

3G and AT&T

The iPhone 3G requires activation in the Apple Store unless you ordered it. Picking up an activated phone isn’t so bad, but store activation is a hideous idea. The activation process for my 4 GB iPhone was completely painless. It gave me a great first impression of the iPhone and it actually endeared me to AT&T as well - and I never thought I’d have any respect for a cell carrier. The original iPhone was purchased in an Apple store. Then you brought it home, hooked it up to a computer with iTunes, and took care of all the AT&T plan setup online. There were no long lines and you didn’t have to deal with any commission-based sales idiot convincing you to get the more expensive plan. It was simple, elegant, and endearing in a world full of technology with horrible customer interfaces.

The 3G activation process is a pre-planned bottleneck through which all new and returning customers must pass. Doing it in the store adds interaction with people, possibilities for delays based on connectivity, people, and hardware, and longer lines based on the number of employees handling 3G sales.

Who ever thought this was a good idea?

AT&T of course. See, lots of people purchased the original iPhone as a delightful little piece of commodity hardware, brought them home (or sold them), and never activated them with AT&T. They used them on other networks or sold them overseas. So AT&T is losing sales and probably blaming Apple’s process for the loss (not to mention Apple customers). So they plotted this delightful little program where all new phones are activated in the stores, thus bolstering their profits and theoretically making happy shareholders.

Here’s why this scheme is a bad idea for both Apple and AT&T. Apple has never, ever (at least since Steve Jobs has been back) compromised on the quality or elegance of anything about their products. Now they have. An exclusive corporate partnership with a cell carrier sort of requires the occasional compromise, and this is probably only the first example.

You know all those stupid little stickers you get on PC hardware that say “Vista Compatible” or “Windows Certified”? Yeah, they’re stupid, so people put them on toilets and other fun things. Microsoft has huge resources at work ensuring that hardware vendors produce hardware that will be beefy enough to work with their products. It’s sort of a natural continuation of the market forces that drove Microsoft to be such a behemoth in the first place. And being the major software player in the PC industry, Microsoft wants to make sure that their software doesn’t run slow. Most users aren’t going to know that a piece of hardware is causing their problems, they’ll just blame it on the software. The process breaks down quickly; hardware vendors take the minimum requirements, build with the cheapest components possible, and push commodity pieces out the door. It makes me wonder how many Microsoft products really aren’t that bad if they only had a decent machine to run on. It doesn’t take much to see that a lot of their usability sucks, but there are still some bright people that work there and they crank out some interesting stuff.

Anyway, Apple has always taken the opposite approach in the market. They rigorously maintain both software and hardware for all their systems. You can’t get OS X for anything but a Mac computer. They use all the best hardware. Their screens are famous for color representation. The laptop keyboards have a light sensor and illuminated keys so you can see at night. The cases are made out of aluminum for crying out loud. Macs are just beautiful, elegant machines and Apple ensures that they all have the chops to run any of their software products. It makes for a seamless environment with very few holes. They push elegance through the whole company. The buying experience, whether online or at a store, is better than competitors. Even the packaging that the products come in is better thought out than some products. Their packaging department must have one hell of an origami collection in their workspace.

Apple has never had to compromise on the package they provide to their customers. And their customers are fiercely loyal because of it. Demented, even. The company’s success is derived straight from that loyalty. Apple customers buy more Apple products. They don’t buy other stuff. They talk about the products. They create buzz. They tell their friends. Apple has taken computing and made it elegant and cool. The quintessential image of a hacker, artist, photographer, and college student all now involve a Mac laptop.

Now they need to fulfill agreements with a corporate entity larger than themselves and on whom they depend for making their products viable (since a phone without phone service sort of defeats the purpose). AT&T isn’t as hip and cool as Apple. Their network infrastructure is seen as second rate and their customer service is nearly as maddening as other unnamed larger carriers. AT&T sticks with the consistent corporate view that sales are what matters, not customer satisfaction.

So Apple and AT&T have compromised and ensured that every 3G iPhone purchased comes with an AT&T plan by activating it in the store. This is not a dealbreaker. But making the experience ornery in any way for customers is a misstep for Apple. They live on buzz, and if their customer loyalty starts to disintegrate they will lose the tremendous edge they have in the marketplace.

It’s a misstep for AT&T too. By teaming with Apple they’ve gotten a chance to capitalize on some of that buzz and bring it into the cellular service arena. Imagine a cell carrier with fierce customer loyalty. I know, it’s hard. But imagine a humane and comfortable customer service system, a network with great coverage, 3G service with consistent fast speeds, and reasonably priced (dare I say included) SMS plans. Gosh, if something like that existed, I’d be hyping it everywhere. You would too. We’d tell all of our friends and they’d all be switching. The business would be growing by spades (rather than growing solely on an exclusive hardware agreement), infrastructure would be growing, and there would be some great long term projections.

Instead, in an effort to bolster short term sales numbering strictly in the hundreds of thousands (if that), we get a poor introduction to the service created by a bottleneck in activations. It reeks of desperation for every last penny they can squeeze out of us. It kills the buzz - in my mind the only reason I’m going to use AT&T is because I’m forced to.

AT&T is missing a big opportunity and Apple is diminishing its customer zealotry.

iPhone 2.0

To be fair to Apple, that first one isn’t really their fault. But I can’t see how this one is anything but.

Apple customers are pampered. We’re used to our cozy little spaces where nothing goes wrong, every software update is flawless, and every product feature works exactly as advertised, if not better. When the iPhone came out, everybody rushed out to see if it worked in person as well as it seemed to in Steve Job’s introductory keynote. Amazingly, it did. It had tactile feedback and responded instantly to what you wanted. If you hit the lock button, the screen turned off immediately and you heard a little “click”.

Joel talks a lot about that sort of feedback in Hitting the High Notes. He goes on and on (as he should) about how the little design decisions made for the iPod resulted in a great product that customers really enjoyed using.

It seems as if the new 2.0 software has lost that. Here’s a list from DHH, as an example:

“Here are just a few of the griefs I’ve felt:

  • Annoying delays all over the place.
  • Changing to the SMS view can take more than 10 seconds at times.
  • Transitions between apps are being dropped entirely or cut short (the latter looks like a UI stutter).
  • It some times requires 3 clicks on the fast-forward button in iTunes to get a response.
  • The screen will freeze for 4-5 seconds not accepting any input, then replay ALL your feverous tapping when it finally returns.
  • Some times the keyboard will not keep up with your input (and I’m not that fast of a typer).
  • I’ve had applications crash numerous times.
  • The entire phone has crashed twice.
  • Restarting the phone kinda helps some of these problems, but not for long and it feels so dirty and Windows-like to do.”

If 1.0 was so great, why is 2.0 such a big step backwards? Just like everyone else, I went and got a bunch of apps as soon as I downloaded the 2.0 software. The problems started immediately, followed quickly by cursing and gnashing of teeth. The worst, in my mind, is that when I lock the phone, it sometimes takes several seconds for the screen to shut off and hear the click. I don’t feel in control anymore. That makes me feel uncomfortable, and literally overnight my iPhone has gone from devoted daily use to halting use only when I need it. Without the great user experience, the same emotional appeal isn’t there. (A side benefit may be that my friends don’t all have to listen to my unending rants about Apple’s greatness.)

Now I’ve taken all the apps back off the phone, except for Twitterific, in the hopes of staving off the slowness. It’s still there. Scrolling is choppy and ugly. Typing is slow. The whole UI is just a shade away from perfection, but without that quick interaction, it’s just another phone.

It’s ironic that the keynote introducing the new phone and software spent so much time describing Apple’s new Push service. They went on and on about how other phone OS’s use hidden processes and process managers and other crap to maintain connections for apps. I really have no idea if the 2.0 changes are caused by opening the OS up to allow all these other apps to run. If that’s the reason, the apps just aren’t that important. Or at least I’ll wait to use them for the hopefully stable 2.1 release. But I shouldn’t have to do that, which leads me to my final gripe.

Release Dates

The whole computer industry, by and large, is still pushed by dates. We all get to read about the hip, cool ways some companies work, but in the day to day software world, the deadline still reigns supreme. I think Apple is past the more foolish, historical reasons for dates. Most people in the software world understand now that dates ought to be soft if you’re going to get the best product. Adobe seems to do this. I’m waiting desperately right now for LightRoom 2.0 to be released. I’m running the beta version and I love it. Adobe refuses to release a date for a software release. One day, it will just be released. I’m content to wait, knowing that when I purchase LightRoom it will be “complete”, and I won’t have to deal with any nagging bugs the team didn’t have time to track down before their deadline.

But Apple’s buzz has started causing such a stir that they’re almost shackling themselves back to a date system. It would almost seem a travesty now if some big, cool new product wasn’t released at WWDC or MacWorld. Steve’s keynotes have become legendary, and we’ve seen hit after hit introduced in the same way. I worry now that catering to the buzz has produced a new artificial deadline to push products to ensure the buzz continues.

This year, the iPhone 3G and 2.0 software were announced at WWDC. Half of me wonders if the software was even done. Obviously the 3G may need some lead time for production, but why not release the software immediately? If it isn’t done, wait until it is. Or make sure your date is realistic. The buzz only works if the product is worth the wait. A big new version shouldn’t be a buggy, interim release. It should be a solid, mature system already, especially when they started with such a seemingly stable 1.0 version.

Another example: in the last two weeks, my MacBook Pro has frozen 3 times. It’s never frozen before. None of my Macs ever have. I didn’t even know the option-apple-esc sequence to kill a process, I just always used the command line. Having to reboot suddenly sucks, and it has made me weary of OS X updates in the same way as I’ve become weary of iPhone software updates. I’ll wait now until some friends try them, and then see if there are any problems.

It’s not lost on me that there are rumors circulating that Steve Jobs may have some health problems. If he does, I wish him all the best. He’s done a lot for the industry. There are also longstanding rumors of an amazingly tight grip on quality and vision from the top down at Apple. If both of those rumors are true, it makes me wonder just how much influence the top brass had on their most recent product releases. I can’t imagine a company of Apple’s stature still being so tied to one man’s control that it would falter even a little without his watchful eye, but it is an interesting situation to consider. If Steve Job’s were to retire, for instance, how would the direction of Apple’s offerings change?

Apple makes the best computing products available today. I still spout off regularly to all my friends about how they need to have Mac computers to be productive. But the religious gleam in my eye has dwindled. The zealotry of many of the Apple customers I know is fading ever so slightly. All of their major products are still the best things going today. But keeping that edge is going to be more and more vital as they continue to gain market share. If they expect to maintain their momentum, they’ve got to make sure they keep treating their customers like humans they care about, rather than like a chance to extract dollars.

I hope they keep doing it right.

Everything’s A Library

July 9th, 2008

I seem to alternate between one technical and one (somewhat) non-technical post - excepting travel logs.  That’s fine by me.  It provides some harmony and balance to at least one thing I do.  That’s important on any task, though usually I fail abysmally.  If I’m working out consistently, I’m giving something else up.  If I’m doing a lot of coding, I’m not seeing much sunlight.  The world runs on trends, so I suppose it makes sense that individuals do the same thing.  Another trend I follow is an introductory paragraph that has nothing to do with anything.  Like this one.

As another small side note, this is my first post using TextMate’s Blogging bundle.  So far, so good.  I started using TextMate about four months ago for all personal development, and I’ve been really impressed so far.  Great syntax highlighting, great shortcuts, a fabulous bundle system, and absolutely fantastic autocompletion and shortcuts.  If you’ve got a Mac, you’ve got to use it.  It’s worth the price.

I’m going to be rambling for awhile at a ten thousand foot level on computing and computing machines.  It’s necessary so I can figure out what it is I’m trying to say, and I’m sure I’ll trip up here and there.  So be prepared for gross generalizations being tossed all over the place.

Main()

Recently I’ve been doing some reading on various programming languages and their various flavors.  This is part of my catch up from an epic failure of education.  I’ve been doing it wrong.  (Alright, enough needless links.  I admit it - it was just to play with the Blogging bundle’s markdown features - which apparently also screw up code written in block quotes earlier - doh!).

There seems to be a general consensus that it’s important to use a popular language for a big project (1); more important, in fact, than the language’s intrinsic feature set.  That’s kind of interesting by itself, since the general consensus is also that choosing a language for a project based on a priori knowledge of the language is shortsighted.  I’m not sure yet how these jive together, but I do agree that the number of developers working with a given language - and thus the libraries, tools and general knowledge available - is important to the quality of a project.

But what makes a language popular?  Or rather, how does a language jump the gap, and move from relative obscurity to fame and fortune on the Internets?  It sometimes seems to happen overnight, but it’s always preceded by the release of some interesting project.  So here’s a hypothesis: for a language to become popular, hip, and cool, something important has to be written in that language.  Let’s look at a couple of examples, shall we?

C

Go back into negative time (January 1, 1970) and all operating systems were written in assembly.  Great, big, bad Multics was written in assembly.  Early iterations of Unics were written in assembly.  If you’ve ever done assembly programming, you’ll know that it’s a pain in the ass.  Everything sucks.  Imagine trying to think out a sentence, but having to write each letter as a series of dots in the correct pattern, and only being allowed to write one dot per second.  By the time you finished the first letter, you’ll have forgotten the purpose of the sentence.  That’s assembly.

So in an effort to make better, easier to read, and more portable code, some of the original Unix guys came up with C as a more expressive alternative to assembly.  It still provided all the low level accesses to a von Neumann architecture that you needed, but without some of the pain.  C pushed Unix.  Unix pushed C.  Their popularity is fundamentally tied together.  Unix was, and still is, C’s killer app.

Perl

What about a very high level language like Perl?  Unix does a lot of plaintext stuff, and awk/sed only get you so far.  So Larry Wall designed Perl to do a lot of simple text processing tasks for Unix.  Plus C has absolutely no real support for Strings (no - chars, pointers, and libraries don’t count).  So, without trying too hard, Perl basically took over everything that awk/sed was used for previously, and some other things too.  That was it’s first killer app.  When the web began, a lot of people started using Perl for quick processing of CGI stuff.  That was it’s second killer app.

Java

Ok, this one is a bit different.  Java was meant as a handy alternative to C++ without dealing with all the intricacies of compiling on 8,874 varieties of hardware (and other things).  Java as a language seems to still be growing, at a glacial pace, but it’s killer app is actually written in C.  The JVM is what really carries along the Java programming language.  As far as I know, the JVM is the first very widespread use of a virtual machine to resolve multiple portability and security issues.  It’s a big deal.  And as more and more languages can be run on the JVM (and Microsoft’s CLR for that matter), it will be an even bigger deal.  The JVM is Java’s killer app.

Ruby

Ruby is perhaps the most obvious example of one app making a language popular.  Ruby began its life way back in 1993, and it has been a cute little language for a long time.  But nobody ever bothered to pay attention until DHH decided to write a very nice MVC web framework in it.  He called it Ruby on Rails and a star was born.. actually two.  Rails instantly became a success, and people were suddenly scrambling to know Ruby.  Now there’s libraries for everything from XMPP to pinning captions on your cat.  Rails is Ruby’s killer app.

Python

Python is still a bit of an enigma to me.  The most I’ve done with it, aside from some one liners, is ported a bunch of crap over to Java.  And frankly, I can’t think of an answer for Python.  It’s got loads of support.  It’s got tons of libraries.  People love it.  I have no idea how that happened.  The language must just suck less than others - which means I ought to learn more of it.

Lisp

I don’t know Lisp yet.  I’m just now trying to learn Scheme.  Lisp was originally a new syntax for computation.  It wasn’t even supposed to be a programming language.  Then a grad student wrote an interpreter and wham-o!  Lisp was a language.  For computation.  That makes it entirely different than the other languages I’ve mentioned thus far.  Their purpose is to execute instructions on a machine.  Lisp’s purpose is to compute things.  Because of that, it’s probably the most fundamental, universal language we have.  The lambda calculus is Lisp’s killer app. (Can’t you just feel the metaphor stretching?)

Ad Nauseum

This could go on..  It’s important to use a popular language when working on a project.  Obscure languages must be used (or be acknowledged as useful) to write something important for them to become popular (2).  So why would anyone bother then?  Pretty much everything, including the kitchen sink, is Turing-equivalent, so why not just use a common, well-known language?

Syntactic Sugar

Let’s consider one of the useful goodies of Perl (inherited from sed, I think).  Regular expressions are remarkably convenient little structures that let us say all sorts of things.  Finding a given pattern inside a string isn’t a difficult problem, and it could be done in any language.  But let’s say I’m doing it a lot, and the patterns change.  Instead of writing various chunks of code for each situation, it would be a much more elegant solution to come up with a single construct, and plug in the individual expressions there.  I’d want to write a library for it.  That’s essentially what regular expressions are.  They’re native to Perl, and more or less in other languages, so now they’re considered a pretty standard language feature.  But back in the day it was quite a novelty - it was the coding equivalent of one of those giant 3 foot long Pixie sticks you used to down as a ten year old.  Time has changed it from syntactic sugar to a standard language feature.

We can make the same case for even more basic language constructs, like loops.  Ruby lets me write (1..100).each {|i| ..}.  C let’s me write for (int i = 0; i <= 100; i++) {…}.  Lisps use tail recursion.  But what does any of that matter when I can simply store a number in a register, perform some set of operations, and then iterate the register manually, and check the register manually?  God help me, but if I had to do that, I’d want to write a library for it.

Power

All languages provide varying degrees of syntactic sugar for a von Neumann architecture, which is to say, for a simple, cheap hardware implementation of a Turing Machine.  A lot of sugar is very useful.  Some can be worthless.

The syntax, the sugar, for writing on this architecture is the only thing that really varies.  We call into various syntaxes to accomplish the tasks we require, and they get executed on a Turing-equivalent machine.  A Turing machine wants lots of 1s and 0s in a certain order to denote instructions and data.  Anything on top of that is just a useful library for writing in the Turing machine’s language.

That sounds goofy.  If you’re sane you probably think I’m nuts.  So let’s look at an example of power and see if we can’t see some differences between language abstractions and syntaxes, libraries, and the sugar.

Here’s problem 20 from Project Euler:

n! means n * (n - 1) * … * 3 * 2 * 1

Find the sum of the digits in the number 100!

Relatively simple, but requires a little bit of work.  Certainly not something you’d want to compute by hand, or by calculator.  100! is 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000.  I don’t think it fits in 32 bits (or 64 smartass..)!  So what do we do?

Here’s some solutions in a couple of languages.

Java: [sourcecode language='java']

import java.math.*; import java.lang.*;

public final class Euler20 {

public static void main(String[] args) {

int total = 0; BigInteger b = factorial(100);

System.out.println(”b = ” + b.toString()); String[] digs = b.toString().split(”");

for( int i = 0; i < digs.length; i++ ) { if ( ! digs[i].equals(”") ) { int x = (new Integer( digs[i] )).intValue(); total += x; } } System.out.println(”total is ” + total); }

public static BigInteger factorial( int n ) { if ( n <= 1 ) return BigInteger.valueOf(1); else return BigInteger.valueOf(n).multiply( factorial( n - 1 ) ); }

} [/sourcecode] That’s a little bit long (30 lines), and I had to use the BigInteger class for arbitrarily long integers.  Note I didn’t use any particularly exciting Java language features either.  I could’ve made the loops shorter and other neat things.  Whatever, it’s a quick and dirty.  Deal with it.

Here’s the same thing in Ruby:

puts (1..100).inject(1) {|mult, num| mult * num }.tos.split(”").inject(0) {|sum, dig| sum + dig.toi }

Wow!  1 Line!  But what’s all this inject and |foo| nonsense?  How are we dealing with any variables in here?

Here’s one more solution I pulled from the Project Euler forums, courtesy of nsg.  This is about as terse as I think you can get.  The J Language is known for that sort of thing:

+/”.”0″:!100x

Yes, that really is the whole thing.  13 characters.

Java code first, since there’s clearly more of it.  Those imports, they’re arguably language features, but they really just call into Java’s vast libraries.  Class and method declarations are certainly part of the language.  Semicolons are part of the language.  Since there’s no overloading, we should call the primitive operators a part of the language syntax.  Even the actual multiplication is being handed off to the BigInteger class.  The syntax itself is pretty barren.  There’s not much beyond object oriented structures, conditionals, loops, and operators.

I won’t comment on J except to say “Damn”.  Ruby is pretty sparse too.  The loop is passed off to a Range object, which calls the inject method.  Both inject methods take a block and execute it - library calls, with subtleties handling the blocks.  The operators are really methods.  1+2 is equivalent to 1.+2.  The rest is more obviously just method calls on objects.

Or is it?  Ruby is built completely from the ground up on the object oriented paradigm, so how do we separate the two?  Everything is an object.  Everything is part of the API.  Are we just playing at semantics, or is there really a difference between the language abstractions and syntax and a set of libraries?  Is there ever really a difference?

One of the glorious things about Ruby for me (coming from Java and, earlier, C) is that the syntax of the language sort of melts away.  I don’t have to worry about semicolons, but I can use them if it makes me comfortable.  I don’t have to worry about 32 bits for ints.  The Integer class has two subclasses, Fixnum and Bignum, which handle numbers smaller and larger than 31 bits respectively.  Ruby casts between the two types for you, so you don’t have to worry about it.  Now that is a language feature.

It also naturally abstracts away some of the variables for me.  I don’t need to worry too much about totaling my factorial function because I can toss blocks around that will accomplish the same thing for me.  That’s really nice.  It’s the sort of thing I’d expect a library to do - streamline a set of operations to make it near trivial to accomplish.

Taking the limit: having no syntax is the best syntax.  The Lisps seem to want to get as close to that as possible.  They have certain language abstractions (car and cdr, operators), but I’ve only ever seen two characters of syntax in Lisp: ( and ).  Maybe I have seen the occasional ` or , in there as well.  That’s still very terse.

I think this is what most people really mean when they talk about the power of a language.  It’s terse.  Some of the demigods on stilts whose blogs we read may be considering some of the outstanding metaprogramming and macro abstractions of a language when talking about power, but we mere mortals generally mean it on a simpler level.  Power equates to a language being terse.  If I can write 10 lines in language A to do the work of 50 lines in language B, I’ll generally consider language A more powerful.

This breaks down for practical reasons.  Humans want to have things like maintainability and readability.  They don’t want to spend 10 minutes to understand 13 characters of J.  It may be elegant to write, but it’s not elegant to grok.  Humans seem to like the decimal number system too.  It’s comfortable and it maps well to our anatomy.  Machines like binary as a reasonable and efficient number system for recording information.  We could use unary though.  It would suck.  33 in binary is 100001.  33 in unary is 111111111111111111111111111111111 (or pick your arbitrary character of choice).  You can see where this is going.

There’s lots of esoteric programming languages that push it too far as well.  Brainfuck is a good example.  What a name for a programming language huh?  Brainfuck.  I’d like to propose we use Brainfuck for this implementation of your problem.  Hey, have you done any brainfuck lately?  Let’s work on this brainfuck code here.  Great name.

Anyway, brainfuck was an attempt to have as few operations as possible.  It has a compiler that fits into 200 bytes.  It has only eight operators and none of them take any arguments.  And it’s Turing Complete.  LOLCode has been proven Turing Complete too.

von Neumann

“We have reached the limits of what is possible with computers.” John Von Neumann, 1949

I’ve heard that quote a few times before, mostly amidst a bunch of other technology quotes that make us laugh at those old feebleminded geniuses and their sightlessness.  I’m sure you’ve heard the one from the president of IBM, talking about the world market for computers being limited to a total of four?

Yeah, these two quotes have nothing to do with each other.  One is shortsighted, one is not.

The really interesting bit about that von Neumann quote is that he was right.  By the 1940s, the limits of what is and is not computable had been hypothesized under at least 3 different types of abstraction: Turing machines (the most famous, perhaps), the Lambda Calculus, and recursion.  All three are equivalent.  ENIAC was Turing-equivalent in 1946.

ENIAC couldn’t do anything that we do regularly today.  Heck, my computer in college couldn’t handle the photo processing I do regularly now.

So let’s back up a second.  Turing Machines, lambda functions or any other mode of computation make no accommodation for time/space complexity.  Turing’s original notion of a Turing Machine included an infinite tape for input.  There’s never a concession for when a program will halt, only that it may halt.  Turing machines are also difficult to use to model certain common computer tasks that require lots of input, like word processing.  Lastly, modern computers are Turing-equivalent, but they’re hampered by all of the state limitations of the implementation.  In other words, if I have a von Neumann architecture (like we all do), I’m limited by each of it’s parts: CPU, memory, disk, bus, etc.  So I’ll always be able to “do more” as time presses on and the limitations on the finite space of a machine become less severe (3).  But give me enough vacuum tubes and a couple million years and I’ll get ENIAC to compute a Mersenne prime for you.

The Abstraction Tree

The foundations of computability are very well known (4).  A bunch of reasonable and cheap hardware architectures have been built to model this computation.  On top of those architectures have been built a set of very simple languages (syntaxes) to manipulate the state of the hardware.  Those languages are still too difficult for humans to manipulate with any advanced meaning, so another set of abstracted language constructs got built on top of those.  This gets us to assembly and C, which is the underlying basis for a lot of other abstractions, including things like the JVM, the CLR and a lot of the Ruby “language” (library).  On top of assembly and C, both of which are great for manipulating a Turing-equivalent von Neumann architecture, we can make all sorts of abstractions and families of syntaxes for easily describing any number of problems.  We can build parsers, compilers, or interpreters for everything from markup to duck typing to brainfuck.  The limitations at this level of abstraction are the ones known to us: hardware speed and capacity, syntax obfuscation, and our own stupidity.

The further up the abstraction tree we move, assuming we pick the proper tool, which is no mean feat, the simpler it should be to fit our problem to the abstraction.  It makes me wonder what set of abstractions, if any, are in our future.  Are there any layers that we haven’t reached yet, or are we simply building the different types of tools that each different job requires?  DSLs are gaining popularity for certain types of tasks, and it even seems like the newer, hip languages are just new combinations and subsets of older languages.  Are we really gaining anything new?  Or are we simply building tools and libraries to fill in the holes?

So pick your poison.  I mean syntax.  No, I mean poison.  Everything’s a library.  The language is computation!

(1)  The value of big can vary, let’s set the bar low and say anything over 10,000 lines.

(2)  This won’t necessarily make it popular though.  Apple writes all their tasty bits in Objective-C, and that isn’t exactly booming in popularity.

(3) Cloud computing will make this extremely interesting.  It’s bursting the seams of what computations are possible.  Some things are still difficult.  But some computations are embarassingly parallel, and many others at least manageable.  Flinging nearly endless machines at the problem allows computations over vast datasets.

(4) Although not completely well known.  There are still open questions like P = NP and quantum cmputing which could totally change the types of computations possible.

Coda

June 27th, 2008

I have just one last vacation post before I get back to somewhat regularly scheduled programming. Since my trip I’ve had a bunch of other topics that have accumulated in sort of half finished form. Presently they’re all about as ambiguous as that last sentence, but hopefully I’ll get them finished sooner then later.

And for no particular reason, this blog post is dedicated to Zoe.

For most of my travel recollections, I’ve tried to focus a lot more on my activities and impressions at specific moments. The real purpose was to log what I did so I could remember it. I’ve mostly avoided any general themes from the entire trip, aside from asides, thinking it would be more valuable to contain them all in one place. This is that place.

Food

When Katie and I grabbed a bagel in the airport in Dublin on our first morning, I think that shop might have been a chain. Other than that one occasion, I can’t remember eating at another chain restaurant. Anywhere. The entire time.

That means alot. Going out and grabbing a quick meal in Europe means a quaint, unique little pub or shop. In the States, a nice meal out with friends usually means a national chain restaurant of some sort (unless it’s a really nice meal out) like a TGI Fridays, Subway, or Ruby Tuesday (or Bennigans or Applebee’s or… ). I’ve been thinking about this quite a bit since I’ve been back, because I eat out so much. We have certain expectations of the prices in a reasonable, everyday restaurant. A burger should be about $8. Pasta dishes are $9-13. Salads are $5-8. That’s quite cheap. In Europe, the going prices are anywhere from 10-40% higher than that for the same meals.

The problem arises when we try to make an apples to apples comparison - these aren’t the same meals. That lovely pasta with red sauce dish you get in London is made with these things called tomatoes, a remarkable plant that translates quite wonderfully to red sauces. American chains don’t use tomatoes. They manage to keep their prices even with American expectations by scaling their supply. So they have suppliers that supply them with mass quantities of crap iceberg lettuce and tomato paste that their chain locations can ingest with a reasonable rate of return. Meanwhile, the consumer gets their expected $6 caesar salad. The lack in quality doesn’t seem to bother most people, but they’re still surprised when they hear that our obesity rates are so much higher than the rest of the Western World.

We have lots of preservatives and other artificial ingredients. We make our sauces out of pastes or prepackaged nonsense instead of vegetables and other centuries old, basic food products. We do all of this to keep prices down, but does it affect taste? If our expectation for super cheap meals anywhere at anytime doesn’t correspond to higher quality, do they at least taste the same or better?

Nope.

American food tastes like donkey shit. Nearly all of it. It might give you that warm fuzzy feeling on the first bite (you know the one I’m talking about - it’s the way that first bite of a big nasty Papa John’s pizza tastes), but it doesn’t satisfy any desire beyond that, and it certainly doesn’t make you feel any better after you finish your meal.

Europeans sacrifice price for quality and taste. Americans do the opposite. And it sucks. And I’m tired of it. One of my goals over the summer is to actually do something about this in my life. A new Harris Teeter opened up in my neighborhood in May, and I hope to take advantage of it’s selection of fresh ingredients and try to give my eating habits a European twist. Since I’m just going on high cholesterol medicine right now, this is long overdue.

One other interesting thing about food in Europe: there’s more selection. Nearly anywhere you go with a population center - a village, town, or city - has an easy selection of pubs and restaurants you can walk into for a meal. I’m pretty sure the village of Kilronan on the Aran Islands, with a population of about 500, had more restaurants than the village of Kings Contrivance here in Columbia with it’s thousands of residents.

Tea

Nearly everyone drinks tea. It’s a part of the culture. I knew this struck me for awhile, but I couldn’t quite figure out why. When I do dinners with my friends, the evening usually ends with coffee, grappa or some other after dinner drink. But the average lunch or dinner has no inclusion for digestives in America. This whispers something about the cultural difference in the same way as France’s 35 hour work weeks. The average American consumes their meals on the run, with not a moment to spare. We’re always in a hurry, and we’re almost certainly in too much of a rush to sit down for a few minutes, prepare tea, and drink it slowly and properly. Not being capable of sitting down, even occasionally, to provide time for a proper meal is extremely unsettling. I can’t imagine why our kids are all diagnosed with ADHD.

The Geography of Nowhere

While I was gone I read Kunstler’s Geography of Nowhere, a poignant description of American civic history. Kunstler takes the reader through the various stages and historical movements that have brought us to suburbia - a state of being he calls “the greatest misallocation of resources in the history of the world”. I was quite pleased to be reading this while in Europe. It kept all of his insights in the forefront of my mind as I admired the architecture, civic art, and city planning that exists outside the States.

Cities, towns, and villages elsewhere are all organic places grown over time. They have morphed, changed, and been added to as needed. They were not built by development corporations or golf courses. They seem to have only a minimum for standards, zoning, and planning committees. That minimum allows even the simplest civic requirement for culture, like shopping and restaurants at street level mixed in with housing. In the United States, zoning laws generally prevent such things, demanding that residential areas be only houses. But this also very naturally levies the car on everyone as a requirement to get anywhere.

Kunstler has some very scary things to say about the ramifications of the automobile on culture. Things that make me hope gas prices keep rising. We are in dire need of motivation to understand and build or rebuild a relevant American civic center which will allow culture to once again become a part of the country. WWE, Bob Evans, Target and Walmart just don’t cut it.

Some interesting history that struck me:

  • Back in the 20s and 30s, GM went around buying out streetcar companies just to dismantle them to ensure the continuing success of the automobile.
  • Robert Moses set quite an example in ensuring that the automobile was the only viable transportation system for New York City and surrounding areas.
  • Frederick Law Olmstead, more commonly known for Central Park and Biltmore, also designed Riverside, Illinois, one of the first planned communities in the United States. Funny how such simple, well-intentioned initial conditions can balloon into a major problem like sprawl.
In his essay Made in USA, Paul Graham talks about the ability of Americans to produce something quickly and messy and their ineptitude to produce something of high quality, good design, or general remarkability. This seems to be a basic tenet of our entire history. Even though our country is over 200 years old, the average town or city has very few, if any, structures older than 150 years. Meanwhile, the tiniest village in Europe generally has ancient roots.

In a recent interview, Freeman Dyson shares an old quip: “The famous story goes, ‘How do you make these beautiful British lawns?’ and the answer is, ‘Oh, you just roll them for 200 years.’ [The British] never thought of things in terms of quick returns.

Americans don’t think like this. We never have, and until we slow down and start actually considering, on a very small scale, the world our great grandchildren will inherit, we never will. We’ve become brilliant at producing and flipping simple commodities in any market, and that’s gained us an interesting place at or near the top of the world economy. But I’m not sure if this constant commodity producing and shifting activity can produce any sort of persistence.

There’s also a video version of some of Kunstler’s thoughts available.

Driving

I have a whole other post (maybe two) almost ready to go on driving, so I’ll only touch on it briefly here. Nearly everyone knows how to drive well in Europe. It’s not as if it is terribly hard, but it does take common sense. And in the tradition of Descartes, Americans have that in spades.

Driving was actually pleasant in Ireland. The speed limits were equitable, the drivers courteous, and the signage visible. In fact, it was actually easier to navigate than here because the signs were so good.

The roads were consistent too. Every single freeway or exit was on the left; not one required the fast lane to suddenly become the exit lane. Nobody passed on the left. People stopped when the light turned. It was an entirely different experience to American traffic.

Travel

Travel packs so many experiences into a small period of time that it becomes nearly impossible to keep up. Even though I tried to get a bunch of thoughts down for everything we did on the trip, I still barely remarked on it all. This could just be because writing is so damn hard. It really is. I enjoy it a lot, but it’s a great way to stay humble. But I didn’t want to talk about writing, I wanted to talk about travel. (See there’s one of those difficulties - it’s so hard to not go off on every tangent.)

I never really had a huge desire to travel growing up. I remember going to San Francisco and Yosemite National Park when I was not quite a teenager, and I remember loving those places. But the embers were never lit until I went to Italy for a wedding of two great friends of mine. The experiences flooded me there, and I began thinking seriously about the rest of the world and what it might be like to live in other places. Menaggio on the shores of Lake Como became my new home for retirement dreams.

One of the things I was hoping to learn on this trip is whether or not my quick attachment to Lago di Como was a true attachment, or if it was simply the infatuation of a virgin traveller. I learned quickly that, while I loved the places I visited in the British Isles, they didn’t capture my soul the same way that Italia did. I remember having very nearly the same impressions as Oscar Wilde had on arriving. There’s something very different about the land and culture there.

Travel forces you to try new things. One of my biggest fears as I get older is that I’ll stop learning. The placidity of old age grows rapidly, and otherwise intelligent and curious people drift downward into believing that their experience requires them to always have the right answer. The opposite is often true: the more questions a person asks, the wiser they tend to be. Travel helps maintain that inquisitiveness. It’s impossible to travel well and not be brought in front of new experiences in almost blinding sequence. That’s what keeps you coming back.

So that’s it. Back to my irregularly scheduled wanderings. I need to travel more. You probably do too.

The Weekend

June 11th, 2008

Friday was my recovery day. The last week and a half had been a whirlwind, so it was time to relax. I slept in Friday, and participated in a meeting at PTG Gateway’s corporate restaurant (a small deli in the park). A bunch of photo processing, writing, and reading filled my afternoon, followed by my first serious game of badminton ever, which I really enjoyed. Nigel (Neil’s friend and business partner) took it easy on me, but Neil felt inclined to kill a rookie. That’s fine - he needs something to let him keep the illusion of not being old (gee, are you reading this?). I can’t wait to play racquetball next time he comes here. After another barbeque and some time in front of the fire pit, it was time for bed.

Saturday was another slow day. Liane joined me for one last brief trip into London. Mostly we traced my previous steps, and picked up a few souvenirs. We did take a nice trip down the Thames by ferry, to the colorful commentary of a crewman turned tour guide. That evening I went over to see Liane’s flat near the train station. I was introduced to Derren Brown, who I hope eventually makes his way to America. He’s got a riveting sense of spectacle (and I watched way too much YouTube that night).

Yet another surprise

Sunday was the last surprise of the week. Neil and Sue are both motorcycle aficionados, as are some of their friends, and I’ve long been a motorsports fan of any type, so Brands Hatch and British Superbike were a great finale for the trip.

Clearly, you don’t go to a bike race in a car (unless necessary). Sue drove the support vehicle (she can’t ride anymore because of her wrist) and the rest of us went by bike. Craig, a friend of Neil’s, was nice enough to lend me equipment and helmet and give up a spot so I could get my first real bike experience. I got there on the back of Nigel’s Yamaha DragStar, which he kept under 110 mph the whole way. About 10 minutes in, after the initial new-ness of the experience, I started really getting hooked. This was an exciting, really fun bit of transportation. And it’s cheap.

The whole motorbike kick has been building for awhile. Lee taught me hand controls awhile ago on his resident quad, and I’ve even ventured onto his dirt bikes once or twice. I never really got it though, until now. But I’m hooked, finally. Sometime this summer I hope to get my license and then pick up a bike late summer or fall. My friend Mike let me ride his Suzuki Bandit 600 around a park a week ago, and even that brief ride was enough to keep me going. A Suzuki SV650 seems like a great starter bike: cheap, easy to ride, and comfortable. That will be what I’m looking for.

I hope my Mom decides to talk to Neil again at some point.

We got there and joined the thousands of other bikers in the grass. Having a car parked nearby proved incredibly useful for stowing all the gear.

Brands Hatch is a beautiful raceway. I pulled out my borrowed telephoto almost as soon as I got there, and took advantage of the elevation changes. Shooting top-notch motorsports is hard. The bikes were doing upwards of 180 mph down the main straight, so it was seriously hit or miss on focus. I managed to get a few decent shots coming out of Turn 1, and got extremely lucky with one spectacular crash on the first lap of a 1000cc race.

The whole day was an absolute blast. When it came time to head home, I hopped on the back of Neil’s Turbo Kawasaki 750 for a slightly different experience. We stopped at an Indian restaurant for dinner, and I had a quick introduction to curry that turned out much better than I expected. I suppose I could be convinced to break out of my pizza shell every once in awhile.

Fin.

Neil and Sue graciously took me back to Stansted early Monday morning. Due to some ticket purchasing conveniences, I would be retracing my steps back through Dublin on the way home. I was sorely tempted to stay in London, and then again tempted to stay in Dublin. But I made it back to the rural beauty of Dulles in northern Virginia (cough), where Pat picked me up after work.