Jason Fried - 10 Things We've Learned at 37Signals
krisjordan.com
krisjordan.com
Really? Then how come all the bitcheness around HuddleChat How disingenuous. (the lesson is correct, too bad they don't live by it)
I quote "We're flattered Google thinks Campfire is a great product, we're just disappointed that they stooped so low to basically copy it feature for feature, layout for layout," said 37Signals founder Jason Fried.
I know HN is suppose to be a cuddlefest where only the "right kind" of people are but I really think you guys need a devil's advocate post once in awhile to shine some reality on your rampant fanboyism.
Personally, I am kind of skeptical of 37S in that they talk a good talk, but... I have a sneaking suspicion that their true scarcity power comes from things like Rails and their blog. Or maybe not; it's hard to tell without doing some very in depth research.
Google lost so much credibility taking huddlechat down IMHO.
The most important one for me is probably #3 "Get Rid of Abstractions". I learned this one the hard way. Now I just work on the problem at hand and worry about how to extend it later. It's a lot easier to generalize a specific case than to write something generalized in the first place. Could have saved me years.
I just finished an app with 51 separate modules, every one hard coded in infinite detail, and much of the code duplicated, 4000 LOC in all. Crazy, right? I used to think so, too. I could have written one very flexible parameter driven module in a few hundred LOC.
But guess what? Even though I bitched and moaned the whole time I wrote the monster, I was able to refactor and "genericize" it in one day. Start to finish time was much shorter than if I had written the flexible module first (that is, if I had ever finished).
This was a non-intuitive lesson for me. Write the specific case and extend later. I always used to try to write the most comprehensive "able to do anything" code until I realized that sometimes, the long way around is actually quicker.
Thanks again Jason, for #3.
When immediate refactoring is unlikely (either due to laziness, lack of focus, or feature deadlines), some kind of balance has to be reached on what should be more general and reusable and what should be hard-coded and specific. And then we're right back where we started.
But reading and thinking about your posts has been very insightful. On my next project, I will try your approach. I agree that in the long run, it is likely to be a more efficient use of time. I imagine, though, that someone coding in this style will either have to have a great memory or take good notes in order to know where similar code is located. Especially consider the case of generalizing the code from one project to another project.
Here's the good news: I couldn't wait to refactor. I was "in the zone" the whole day. And it felt great. I finally got to clean up the mess that I made, and best of all, I didn't have to struggle trying to figure out how to handle that strange outlying case: it was all already there!
I don't know if I'd try this in someone else's shop. You're right; they'd probably pull me off before I got to refactor, leaving a mess for someone else with nothing learned.
Most presenters are going to focus on all of the amazing features their products offer...however, 37 signals is still more successful than 95% of those other companies.
There are some things I don't like about them - namely, the splash page you get for their products - but there's no denying that they've made a set of utterly amazing products and that their blog is possibly the most interesting one I'm subscribed to right now.
#3 - i take a little issue with this one, but not much. if it's straightforward to make something a little more flexible, the payoff is generally good. this depends on a few things: how sure are you that you'll be moving in that direction, how much work is it to add in the extra flex, how difficult will it be to connect up later?
it's worth thinking about, if only for a few minutes. the payoff could be huge, and even it's not, it's rarely wasted time.
Hard problems are a lot more fun to solve. How do you attract top talent if you are only solving easy things?
Look at the sites that have succeeded the most and you'll see that they all solve basic problems, and that's resulted in most of them making tons of money. More specialized sites are more fascinating, but they attract fewer people and tend to be much less successful in absolute terms.
Is search not a hard problem?
YouTube solved the video codec Gordian knot, Google did the same with relevant search. Not easy problems, but they have huge benefits.
And, while the details are usually tricky, I find that Google's solutions to problems tend to always be brilliantly simple. Like their translate features: they figure out a basic problem and they solve it simply and often unexpectedly. Calling it a Gordion knot is actually the perfect description, yeah.
A hard problem is just a bunch of easy problems tangled up together.
Like Jason, I've noticed that quality of work seemingly diminishes toward the end of a long project when people are motivated mostly to simply complete the project.