You’re reading Signal v. Noise, a publication about the web by Basecamp since 1999. Happy !

Coding tip: Clean interface for an ugly implementation

Ryan
Ryan wrote this on 15 comments

Sometimes you need to take shortcuts to quickly prove a concept. I’m experimenting with a new view on Basecamp and I need some data to generate that view. I want all the messages on a project, grouped by day, and also the latest comment per message per day. I don’t know the “right” and performant way to put that query together. But I don’t need to worry about that. I’m just testing a concept here.

So I wrote a totally ugly, awkward implementation that gives me @posts_and_comments. And that’s ok. If this design is successful, the fact that I want @posts_and_comments isn’t going to change. What will change is the implementation that pulls that data out of the database and populates the instance variable. In order to make that future step as easy as possible, I’m hiding my ugly implementation behind a clearly named private method on the controller. The controller action calls `find_posts_and_comments_for_log` and as far as the view is concerned, nothing untoward is happening.

If the concept doesn’t work out, no problem. I didn’t spend too much time on the implementation. If the concept does work, the ugly implementation will be easy to replace later because it’s tucked behind a clearly defined method.

When your implementation is a total hack, put it behind a good interface. Then you can swap the implementation later without rethinking the design.

Behind the scenes: 37signals.com Redesign

Jamie
Jamie wrote this on 43 comments

A few months ago we redesigned 37signals.com — our main site. I want to share with you a few iterations and permutations I created along the way. I’ll also give a little insight into the discussions we had about each design: what we saved for the next version and what we axed because it wasn’t working.

First, a frame of reference
This was what the 37signals site looked like when I started this project. Each time Jason Fried and I talk about changing ANYTHING on this site he always says something like this:

Jamie, 37signals.com is VERY IMPORTANT. A ton of traffic to our app sites comes from here. We need to make sure that we aren’t abandoning clarity for cleverness. CLARITY is of utmost importance on this page.

Actually, now that I think about it he says that about everything I touch. Kidding aside, 37signals.com is a very important site. Careful consideration should be taken when undertaking a redesign.

The never-launched enhancement
A year ago I worked on a short project to enhance parts of 37signals.com. Out of this exercise came the design below.

I liked how this design made our products look like, well, products. Basecamp, Highrise, Backpack, and Campfire are presented like shrink-wrapped packaged software. I also liked how easy it was to understand what 37signals does. We make incredibly useful software for your business. Here are our offerings.

I can’t remember why this design never launched. It could be that at the time we had bigger fish to fry. The forms that came out of it, though, would play a part in the bigger redesign project in later months.

Continued…

George Nakashima: "It requires a genuine fight to produce one well designed object of relatively permanent value"

Matt Linderman
Matt Linderman wrote this on 10 comments

Less is more. Form follows function. Two phrases we hear all the time. Yet furniture designer George Nakashima considered them nothing but shallow slogans. In 1962, he published a manifesto that explains why while also lamenting the disappearance of design excellence.

In a world where manual skills are shunned we believe in them, not only in the act of producing a better product, but in the sheer joy of doing or becoming. We feel that pride in craftsmanship, of doing as perfect a job as possible, of producing something of beauty even out of nature’s discards, are all homely attributes that can be reconsidered.

It might even be a question of regaining one’s own soul when desire and megalomania are rampant – the beauty of simple things…

To look for clues, we can go into the past: the moss garden and tea house at Sai Ho Ji, the wonders of stone and glass at Chartres, the dipylon vase. These are all examples of excellence that can go unchallenged but also unnoticed. They are all formed inwardly with a nearly impersonal experience. Compared to our day, with its arrogance of “form-giving,” the shallowness of slogan design such as “less is more,” “machine for living,” or even “form follows function.”

In proportion to the flood of consumer goods, we are probably at one of the lowest ebbs of design excellence that the world has seen. It requires a genuine fight to produce one well designed object of relatively permanent value. One of the difficulties is the lack of integration between the designer and the producer – the evolvement of material and method into a well conceived idea. Big city architecture has reached such a profound state of boredom that man might unwittingly destroy it in one last tragic gesture – without humor. Sentimentally again, we can look back to the thirteenth century, when almost every hinge was a museum piece. Where there was a touch of greatness in the majority of acts and conceptions.

Some Nakashima designs:

Continued…

Product Blog: The 4-Hour Body, 8 Faces magazine, RightSignature and SnapEngage integrate with Highrise, and more

Basecamp
Basecamp wrote this on Discuss

Some of the recent activity at the 37signals Product Blog:

timCase studies
Tim Ferriss explains how his new book “The 4-Hour Body” came to life with Basecamp and Highrise (“Right away, it made things 10 times easier.”). He details how he uses tags in Highrise:

  • “.tim” – I use this to indicate people or companies I have strong connections with. They’re usually close friends of mine.
  • “@California”, “@NewYork”, etc. – Used to show where a person or company is located.
  • “company-in-book” – There are a ton of companies in “The 4-Hour Body.” We wanted to be sure we had them all listed out somewhere so we could easily reach out and open the door to help with the launch / give them free copies of the book.
  • “facebook”, “twitter”, and “youtube” – Some of our Highrise contacts have enormous followings online and have offered to help through their strongest channels.
  • “newsletter” – These are friends of mine with big email newsletters who had indicated interest in mailing to their lists.
  • “promotion” – Sometimes people and companies email me, saying they want to help promote the book. This tag helps us keep track of everyone who has committed to doing a promotion around the launch date.

Elliot Jay Stocks is a designer, illustrator, author, and the creator of 8 Faces magazine. He says, “Without Basecamp, the whole project would have descended into chaos.”

37s_ejsThe creative process of the magazine is basically about having to do a bit of everything at once, so that means having individual to-do lists for areas like ‘production’ (liaising with the printers and distributors), ‘editorial’ (organising transcriptions, commissioning articles, editing copy), ‘partnerships’ (obtaining ad creatives, chasing invoices), ‘website’ (commissioning the design, logging bugs, requesting new features from the developers), and ‘art & design’.

Highrise seals deals for WebGreek — a tool that aims to help Greek organizations manage their chapters online — by “building a rolodex of friendships, not just clients.” CEO Patrick Allen explains how the company builds detailed personas for every one of its potential partners.

Dynamic Language is a Seattle-based localization, translation, and interpretation services provider that works in more than 150 languages and uses Basecamp and Highrise. Among other uses, the company links the Basecamp API to its internal database.

We have a custom internal database application that handles Accounts Receivable, Accounts Payable, Payroll and more, and we’ve been able to use the Basecamp API to link our internal database bi-directionally with Basecamp. Whether a task is marked as complete on the Basecamp side, or internally, it’s immediately reflected on both systems. Our developer has been extremely impressed with how reliable and useful this interface has been, and we keep finding new ways to use the API.

lanceTicket River will print and process over 40 million tickets this year. Lance Trebesch (left) explains how the company organizes 25 employees, stretched across 3 continents and 6 locations, with Basecamp.

Extras
RightSignature is a tool that enables you to obtain legally-binding, handdrawn electronic signatures from your customers in minutes. And it now integrates with Highrise so you can access your Highrise contact list from inside RightSignature.

screen

Headquarters is a third-party iPhone app for Basecamp. It combines the ability to manage projects in Basecamp with the feel of a Get Things Done app. According to the developers at Select Start, it’s designed “from the ground up around productivity, relevance, and ease of use.”

screen

Sparks and Torch are a couple of third-party Campfire apps for iPad.

SnapEngage is a proactive live chat tool that integrates with Highrise and Basecamp. For example, it les you store all your live chat and offline conversations directly in Highrise.

Highrise_screenshot1

Subscribe to the Product Blog RSS feed.

Simply put, the design education system today is failing many aspiring young students. Some of the design schools they’ve attended have no real design process education, while others have only process education.


Gadi Amit, fastcodesign.com blog

The best visual description of a company I've ever seen

Jason Fried
Jason Fried wrote this on 15 comments

Andrew Mason’s talk at Startup School 2010 included a slide that really blew my mind. The slide wasn’t about Groupon (Andrew’s company), it was about Meetup.com.

Andrew heard Scott Heiferman (CEO of Meetup.com) describe the initial version of Meetup.com as a matrix of cities and interests. He put it in spreadsheet format and here’s how it came out:

It doesn’t matter how many rows or columns – it works at all scales. It’s such a simple representation of what is ultimately a simple idea (meeting up with people in your city who share a similar interest), but it could just as easily been diagrammed in a complex way.

I’ve come back to this slide over and over for inspiration when thinking about new concepts or product ideas. It’s a great exercise in clarity. Can I boil down the idea into something as simple as a column and a row?

[Podcast] Episode #24: The new 37signals office

Matt Linderman
Matt Linderman wrote this on 5 comments

Time: 11:20 | 12/13/2010 | Download MP3



Summary
A talk about the new office space: How’s it working out so far? What was it like being on the opposite end of the client/designer (or, in this case, architect) relationship? What’s the “right” amount of space for now and years from now?

Transcript
The transcript is also available now. Here is an excerpt from Jason:

We wanted to be surrounded by high quality stuff, because I believe that the things that you work around, the environment that you’re in, have a lot to do with the work that you do. And if you can be influenced by things that you know somebody spent a lot of time on, and is something that was carefully considered, and it’s just the right material for the job, hopefully that will rub off on you when you build something and you design something. So, the office, in many ways, is supposed to be an inspiration for us to build better stuff.

More episodes
Subscribe to the podcast via iTunes or RSS. Related links and previous episodes available at 37signals.com/podcast.

Making sense with Ruby's "unless"

Jamis
Jamis wrote this on 30 comments

Among the things that people new (and old!) to Ruby find delightful are the little things it does to make the language feel intuitive. Case in point: unless.

The unless keyword is just if in reverse. It’s a conditional statement that executes only if the condition is false, instead of true. This lets you write little gems like this:

  i += 1 unless i > 10

  unless person.present?
    puts "There's no such person"
  end

However, as with anything that gives you a little power, it can be abused. The following abomination is but a sample:

  unless !person.present? && !company.present?
    puts "do you even know what you're doing?"
  else
    puts "and now we're really confused"
  end

I do not doubt that there are people out there who can decipher the logic above without breaking a sweat. But for most folks, combining negations, multiple conditions, and (gasp!) else clauses with an “unless” statement makes for challenging reading. It also makes it far too easy to introduce bugs into the logic.

Some rules of thumb when using unless:

  1. Avoid using more than a single logical condition. unless foo? is fine. unless foo? && bar? is harder to parse.
  2. Avoid negation. “Unless” is already negative. Piling more on only makes it worse.
  3. Never, ever, ever use an else clause with an unless statement.

Not only will others thank you when they have to read your code, you’ll thank yourself when you have to return to that code a month or two down the road.

We have this self-imposed limitation of one-deal-a-day that we think is important. The reason we’ve stuck with this one-deal-a-day model is just the focus. It puts the merchant in the spotlight and makes it feel really special. It makes a really simple yes/no decision for consumers. I think it’s one of the things that differentiates us from all the coupon and deal sites that came before where it was just this list of deals and it’s overwhelming and everything feels cheap.


Andrew Mason, CEO of Groupon, on Charlie Rose. Btw, it’s also fun watching Mason avoid Rose’s persistent questioning about Google at the end: “I know what you’re asking, but you know I’m not going to answer. I can’t talk about this, Charlie. You can’t talk about all kinds of things for the same reason that every person you go on a date with, you don’t bring them home to your parents right away.” Charlie called that “the perfect answer.”
Matt Linderman on Dec 10 2010 6 comments