What could have more of an impact on visitors of a website than its design? It's the first thing that people notice when they visit the site, and it dictates what they see and how they interact with the site. A bad design can drive visitors away, whereas a good design can bring people back again and again.
It seems that a common misconception is that design is how to make a site "look good". While this is true, to an extent, the design also determines the flow of information from the screen to the user. In the words of Andy Rutledge, "It's not about the design, it's about communicating.". This only underlines the importance of good design.
37signals designs their interfaces first, citing two basic reasons. First, design is lightweight relative to programming. That is, it's much easier to change the position of a navigation bar than to change the data persistence layer of the backend. Second, is that the interface is your product--if the visitor sees and interacts and remembers the interface and its design only, then the design really is the site itself. I'm not sure how much I agree with the former, as I believe that design is becoming more and more heavyweight, but the latter definitely has some merit.
So it's a reasonably well-accepted fact that design is one of the most important aspects of a website, so why don't more people focus on it? I think that the problem is specialization: programmers--preferring to write code and think through the program logic--attempt to muddle their way through creating a user interface, while designers--preferring to perfect the margins, whitespace, and typography--attempt to muddle their way through defining logic of the backend.
Of course, I'm talking about smaller projects of only one or two members. Once they get larger than that, they need to bring a few of "the other" type of people into the mix. That being said, where are the people who are excellent dual designer-developers? Of course people like this exist, but these people are few and far between.
Part of the problem is that both disciplines are ones of constant improvement. As a developer, I know that I will never stop getting better and more experienced in my craft. I will always look at code that I wrote a year ago and cringe. This is part of what makes developing interesting to developers. As I understand it, the same is true with design. This property of both disciplines renders learning the other discipline futile, or at least makes it seem futile (which is a bit of a self-fulfilling prophecy).
Is it possible to become at least conversational in the language of design, when your experience and main interests is developer? That's what I'll be trying to discover in the next few weeks and months. I don't have more than a few hours a week to devote to it, but I've embarked on a bit of "independent study" about design, trying to learn from the best out there about grid-based layouts, color theory, etc.
The encouraging thing is that both designers and developers trend towards being bloggers as well, and that means that there's a wealth of great articles and information out there to learn from. Keep an eye out here for updates on my progress, my successes/frustrations, and other theoretical ramblings about design.
Yesterday I came across a quote from George Patton (via), which stuck me as really insightful, but later something burned the quote directly into my brain.
“A good plan, violently executed now, is better than a perfect plan next week.”
It's a quote which rings quite similar to the commonly-said open source phrase, coined by Eric S. Raymond in his article The Cathedral and the Bazaar.
"Release early. Release often."
The thing which burned these ideas into my brain is the discovery of djangoplugables.com. Simply put: this is an excellent site, which follows the ideas that I mentioned above completely. The premise behind it is essentially to list all of the available django reusable applications on google code, and to display a bit of information about each app.
A group of about 5 people, including myself, have been silently working on a very similar site for the past month or so (the bulk of our work took place during PyCon), but we utterly failed to follow the above sentiment. We debated for hours over how users would be able to submit applications, claim them, and how we could ensure that those claims were accurate. We had tagging, voting, comments, voting ON comments, graphs detailing how "hot" each application was (based on a frequency analysis of the votes over time), and OpenID integration.
But all of this functionality took time, and we implemented it behind closed doors, in a vacuum--without ever seriously focusing on the user interface. I don't know yet what will become of all of our work, but I have a feeling that it will be discontinued in favor of the much better-looking and simpler djangoplugables.com. Maybe we'll see parts of it resurface again, but that's not really the message behind this post. The real message to take away from this experience is that we should practice what we so often preach. In the case of web development, execute the good plan now and iterate, versus trying to perfect everything before release.
The upside of all of this is that our goal has been achieved. What we really wanted to accomplish is what now exists: an excellent resource for finding reusable django applications, and no matter who implements it, that's a win for everyone!
April Fool's Day rocks! Maybe I enjoy it because it happens to share the same day as my birthday, but I think it's more to do with the fact that everyone's having fun, being lighthearted, and simply not taking things too seriously. Last year the blog wasn't in any shape to do anything fun for the occasion, but this year it took me about 10 minutes to whip up some middleware fun. That's right, if you can read and understand this right now, the secret is out: a bit of Django middleware is all that's needed to turn your blog into l33t-sp34k central.
I'll even go one step further than telling you how I did it, I'll give you the code:
import re
import lxml.html
trans = {
'cks': r'xxors',
'lol': r'r0flc0pt3r',
'the': r'teh',
'a': r'4',
'e': r'3',
'f': r'ph',
'g': r'6',
'h': r'|-|',
'i': r'1',
'o': r'0',
's': r'5',
}
def is_code_block(node):
return node.attrib.get('class', None) == 'highlight'
def recursive_leetifier(node):
for child in node.iterchildren():
if child.text and not is_code_block(child):
for pattern in trans.iterkeys():
child.text = re.compile(pattern, re.I).sub(trans[pattern], child.text)
if not is_code_block(child):
recursive_leetifier(child)
class LeetSpeakMiddleware(object):
def process_response(self, request, response):
try:
html = lxml.html.fromstring(response.content)
recursive_leetifier(html)
response.content = lxml.html.tostring(html)
except:
pass
return response
The idea behind it is simple: Let the request go completely through Django's request/response cycle, and just before returning the correct response, parse the HTML and convert all of the actual content to l33t by doing some simple regular expression substitution. I'm using lxml.html simply because I attended Ian Bicking's talk at Pycon 2008 and was intrigued. I must say that the familiar ElementTree interface helped a lot in getting this code up and running in a short amount of time.
Hopefully you all find this holiday to be as fun as I do, and maybe I'll see some more l33t next year!
All Content

