Over the last 15 years I’ve been privileged to work with some of the greatest engineers in our industry to build software and teams. These teams have always been greater than the sum of their parts, and I owe everyone that I’ve ever worked with a debt of gratitude for that. However, in all of that time, and in most of the teams that I’ve been exposed to, we haven’t done a very good job of…
When you’re first starting a company, communication is the least of your worries. If you have less than 10 or so people, everyone knows what everyone else is doing (and if they don’t then they can just walk over and ask them). Things start to get a little more complicated after that. At most startups I’ve seen, once you get to 15 or so people you enter a period of time where everyone still wants…
A few random observations from spending the last few years building a data science team at a startup, from the perspective of an engineering manager: You have no idea what your data science team is going to do. You’re just going to know that you have some data and some problems, and that you don’t really know how to solve them. Of course, that leads into: The way that you’re thinking about the…
I was playing around with Cascalog today, working on rewriting some of our mapreduce jobs, when I came across this post on knowledge debt by Nathan Marz. Knowledge debt is something that I think about a lot (although I never had a good name for it until today). When you’re working in a startup like the one that I’m currently involved in, there are often times when you need to get a release out of…
I’m always meaning to do more blogging, but I always seem to have a million reasons that I never do. One of the things that I’ve always disliked was dealing with all of the overhead. I don’t want to log in and type things in a Javascript window, etc. I just want to blog. For that reason I’ve moved my blog to Jekyll . Jekyll is a highly customizable static site generator that’s used to generate…
At Intent Media we’ve been using Cucumber for 2.5 years to drive a large portion of our testing (on top of RSpec and JUnit). We’re finally getting around to upgrading to the newest version (from version 0.4.4, which is, to put it lightly, a bit rusty), so I’m going to throw out some anecdotes about our experiences using it, which will hopefully help others avoid some of the problems we’ve had.…
I’ve been working at Intent Media for a while now and I’m just getting some time to come up for air to talk about what we’ve been doing while building our software platform. This will be the first in a series of articles about what I’ve learned over the last year. For a little background, our engineering team is currently 9 people strong (in a 20 person company). When I joined the company to help…
Quick update on the last 6 months: Moved back across the country to NYC Took a job as Head of Engineering at Intent Media ( We're Hiring! We're funded! ) Been working in Java and Rails I've got plenty of things to write about, so I'll try to get back on the horse soon.
The hardest thing to see is what is in front of your eyes. -Goethe It's been about 6 or 7 months since I've done any Rails work. I'm in a post-Rails world. After working in Rails for 3 years, I was burnt out. I took some time off to try to learn the finer points of marketing and running a business, and then attempted to start a new business just before the market cratered. Not a great idea. Now…
If you haven't already heard, Rails is now Merb , and Merb is now Rails . I'm a bit torn about how to feel about this, having dedicated a lot of time lately telling people to use Merb and why I think that it's superior to Rails. On the one hand, it'll be good for Merb usage, as people using Rails 3 in big projects will now essentially be using what Merb 2 would have been. On the other hand, I'm…
Just a quick note to let people know that the Merb community is finally starting to address the lack of good documentation on Merb. I'm personally helping out with the open source Merb Book. A preview version can be found here: Open Source Merb Book The source can be found here: GitHub We've got 20 plus people working on it, and considering that it's only been up on GitHub for 12 days it's pretty…
A long time ago, I did a more than a little bit of open source work . Unfortunately, I always found the process of being a part of an open source project to be a pain. The process usually went something like this: Fix a bug in the code. Post patches to the dev list. Bug people to get your patches accepted and committed. By the time they are accepted, someone else has committed something that…
As some of you know, we're building our new startup on top of Merb. One of my favorite things about Merb is how much easier it is to understand than Rails is when you need to hack on something that's outside the realm of what the framework expects you to use it for. I think that Ezra Zygmuntowicz put it best in his recent tech talk on Merb : A lot of people tend to end up treating Rails as a…
I was having a conversation with a friend the other day who said something along the lines of “lately at work, we’ve pretty much just been rewriting Active Record to make it not suck as much”. I was thinking about it, and I’ve never really heard anyone say anything good about Active Record. It’s slow, it uses a ton of memory, it’s not thread-safe, etc. Luckily, the community is starting to tackle…
The easiest way to run Merb from edge: $ sudo gem install sake $ sake -i http://github.com/wycats/merb-more/tree/master%2Ftools%2Fmerb-dev.rake?raw=true $ sake merb:clone $ sake merb:install:all This will install the edge versions of all of the merb gems. To keep things up to date, navigate to the directory that you ran the commands in and do: $ sake merb:update $ sake merb:install:all
Then no software would get written, but at least we wouldn't have any crap software... My friend Jay posted two blog entries yesterday on the subject of raising the standard for programmers in our industry. I left a comment about it on his blog and talked with him about it on IM, but I figured I'd expand a bit on my thoughts on it here. First things first, I completely disagree with him. I don't…
Things sure have been quiet around here... As some of you may already know, I've left the relative safety of my job at Collaborative Drug Discovery to have another go at starting a company. I'm currently working with a friend to once again create something out of nothing and bring yet another crazy idea into the world. Therefore, if you see me and I look like I just got finished working for 18…
For the last year or so, this blog has been running slow, slow , slow . From time to time, I tried to figure out what was going on, but I figured that Typo upgrades were just causing things to slow down and use more and more memory. Until tonight. Tonight I did a database dump and it came to 44 MB. There is no way I have 44 MB of content in this blog. So I had a look at the dump and realized that…
I use Omnifocus everyday to track what I'm doing, and I love it, but there are tons of UI problems with it that drive me absolutely crazy. There's a good article about some of the failings of the interface design here (with a video showing some of them), but there's one interface decision that's been absolutely driving me nuts lately. Look at this picture: See anything wrong with it? If you said,…
I was reading on a plane recently, and was about halfway through the Django book , when I realized that I hadn't seen anything about how to test my application yet. I tend to be a test first developer and use lots of mocks to play with things, especially at the beginning of a project, so I flipped to the index, turned to the test page, and saw the following: Testing was still under development…
You can't just ask customers what they want and then try to give that to them. By the time you get it built, they'll want something new. - Steve Jobs I was at a networking event out here in the Valley a few weeks ago where a bunch of companies went up on stage and presented their companies to the audience. I'm fairly certain that at least one of them might have been interesting, but to tell you…
I'm somewhat taken aback by all of the negative reaction to Gemstone being a closed source product in the wake of the Maglev announcement. Look at this: Do you really think that the people that own this ship care about paying for software? I doubt it, but they probably care about things like development speed. And software reliability. And the ability to get someone on the phone immediately if…
I'm not at Railsconf this year, but before he left I asked my coworker Krishna to beg for, borrow, or steal a copy of the Maglev alpha code and bring it back to the office. Unfortunately, it looks like that's not going to happen (in an email he says "They don't have anything to share at the moment"), damn it. Still, as Obie says, this is a huge deal . Even without the stated performance…
It seems like every time I post something bad about a programming language, or compare one language (A) to another (B), at least one commenter lets me know that they like language B better, and furthermore, some aspect of my post has convinced them that language A is so bad that they won't even try it anymore. The thing is, I don't care. I'm not a consultant anymore. I'm not trying to sell you…
I've been dead in the water all day here because Apple changed something in the underlying Socket/Networking implementation in Mac OS X 10.5.3 and now Ruby doesn't correctly handle sockets. I've been looking at it, but haven't figured it out so far. My thread on ruby-talk is here http://www.ruby-forum.com/topic/154556 if anyone wants to weigh in on it. I'm assuming something has to be patched into…
While reading yet another article on why PHP Sucks (today's witty twist, "but It Doesn't Matter") I realized yet another reason that I'm glad to be programming in Ruby. Ruby, to me, is like a big open playground, while languages like PHP remind me of big industrial factories. I don't think that any of us would argue that industrial factories are more efficient for most things, but they also suck…
Yesterday, I finally got around to upgrading HAML in our Rails app to the newest stable version and the first thing that happened was that 20 completely unrelated specs broke. Why, you may ask? A monkey got into our code, that's why. You see, Ruby allows you to redefine any method of any class on the fly (monkey patching) and it turns out that the old version of HAML had the following code in it:…
If you weren't at Startup School this weekend or haven't watched DHH's speech yet, you should go check it out . It was entertaining and a good counter-point to much of the ridiculous talk that you hear out here in the Valley. As I was watching it though, I had the same thought that I always seem to have when I hear someone from 37 Signals talk, and it came to me right when I saw the slide that…
With the news today that Rails is moving from Subversion to Git , here are some helpful links for those of you that have never used Git before: Git homepage An introduction to git-svn for Subversion/SVK users and deserters Git for Computer Scientists Braid (A Piston clone for Git) Git Sake Tasks (Rake tasks for performing git operations) The Power of Git: git stash The Power of Git, Part 2 Feel…
The hard drive on Macbook Pro died again the yesterday, so I had it in to my friendly neighborhood Apple Store to replace it once again. Luckily, I was fully backed up through Time Machine this time, and when I got my machine back last night (note to self: always go to the flagship Apple store for repairs, they get your machine back to you much faster than other Apple stores) and started it up,…
Whenever I start a new Rails project, one of the first things I do is install Rspec and delete the Rails default test directory. Even with that directory missing, however, Rails continues to waste my time by trying to run its various testing tasks. To make it stop, just add the following: Rake::Task[:default].prerequisites.clear task :default => :spec to the bottom of the Rakefile in the root…
At CDD we use Selenium RC and spec_selenium to run our acceptance tests. Selenium is a slow way to test in general, but lately for us it's become excruciatingly painful. For some some unknown reason under Leopard, our tests would seem to randomly slow to a crawl. Tests that usually take 4 seconds to run would suddenly be taking 170+ seconds. Even worse, this would persist across reboots, and then…
I'm announcing today that I've decided to run for US Congress! No, not really, but someone else named Kurt Schrader is . This, however, is a blog about Ruby and internet startups . Welcome. Please read this book before continuing. And if you live in Oregon, vote for that guy. He's got a name you can trust.
My friend Jay wrote a blog post today that says that you can use 'svn patch' as poor man's replacement for git-stash. Fair enough, I've heard of places that use patch as full-on replacement for source control and integration as well. :-) First of all, I want to point out that we still use Subversion as our main code ghetto at work. Git fully supports updating from svn and pushing changes back, so…
I converted my Subversion repository at work to a git repository recently, and today I had my first real "aha" moment. I was working on a feature this morning when I realized that some code I checked in about an hour before had broken the build. In the old Subversion world, I would have needed to keep track of what I was changing to fix the bug, and then make sure to just check that in to ensure…
Whenever I get I get tired of dealing with all of the disconnected layers of Rails, I think about how I should really write a decent component architecture that works well on top of it. Luckily, someone has already done it for me. From the Cells homepage : Cells brings the benefits of component-oriented development to the Ruby on Rails web application platform, without the performance problems…
Both of my last two companies have been involved in the aggregation of large data sets. At the company I co-founded, Ten Ton Labs , we collected and normalized music reviews from across the web to support our music search engine, Squishr. Our original plan, however, was to collect all reviews, of anything and everything, and then build an application that analyzed and tracked various metrics from…
Today's 10.5.2 update to Mac OS X seems to have solved my issue of losing wireless connectivity every half-hour and having to reboot to get it back. I was about ready to throw my laptop out of the window with this one. How was I supposed to get work done when the internet was constantly going away? I wasn't sure how much more I could have taken before I just installed Linux on this box to get back…
My friend Jay wrote a few days ago: I bet of you looked at the majority of Rails applications you would find empty test folders (or only the generated tests, which are never run). I'm quite sure that's true because I expect the conferences to attract the best of the Ruby developers, and several of the people I talk to at those conferences "simply don't have time" to write tests. These people are…
(Or, How I Spent My Martin Luther King Day Weekend) Here are the web app frameworks I've been reading about and playing with for the last few days. As usual, they've got a bunch of cool ideas that we'll be seeing in mainstream frameworks in 4 or 5 years. Weblocks : Weblocks is a continuations-based web framework written in Common Lisp. Think Seaside, in Lisp. Ramaze : An MVC framework written in…
My new law of Ruby complexity: For a Ruby application increasing in size at rate of X, with an amount of cleverness to cover up the complexity increasing at rate Y, the quantity Y is always greater than X, and Y eventually approaches positive infinity. Working on Ruby projects has given me enough examples of "Where did that method come from?" to last a lifetime.
Last Thursday I published a couple of blog entries and the next thing I knew my FeedBurner stats looked like this: So I figured I'd ask the lazyweb. Anyone ever seen anything like this before? Is FeedBlitz just spamming my RSS feed?
For the last twelve years I've been building web applications. During that entire time I haven't ever worked at a software company that hasn't, at one time or another, been concerned with prematurely optimizing the application we've been working on. I think that we can all learn an important lesson from this study of gym users that was recently written up in the Financial Times (via Paul Kedrosky…
Today marks the official beta launch of Triggit , the tech side of which is run by my friend Ryan Tecco (who co-founded Ten Ton Labs with me a few years ago). So what's a Triggit? It's an easy way to insert images, videos, or text links into your blog, without downloading or installing any software. All you have to do is add one line of code to your blogging software template. You can then use a…
My coworker Krishna, inspired by Giles Bowkett's post Rails Debugger: Use RCov With Selenium, Watir, Or Just In Real Life , whipped up a little rake task that automates the process of checking code coverage using your Selenium tests: desc "Measure coverage of selenium specs" task :coverage do FileUtils.rm_rf "selenium_coverage" mongrel_pid = fork { exec("rcov script/server -o selenium_coverage…
Wow: MacBook Air is 0.16" to 0.76" There must have been some amazing engineering that went into that thing. I'm already drooling over it. I'm assuming that we'll see more info at http://www.apple.com/macbookair/ soon.
A quick reminder to all of my friends out there as yet another Macbook Pro hard drive bites the dust at our office. I can only imagine that Apple put Time Machine into Leopard specifically because so many of these things crap out. (Image From Makezine )
I was playing with Ruby 1.9 a bit over the holiday weekend and I found the eigenclass Changes in Ruby 1.9 page to be an invaluable reference to the changes we'll all be dealing with soon. Some highlights: Ruby 1.9 is significantly faster than Ruby 1.8.6, at least for the toy programs that I wrote with it. send() no longer works to send to private methods. You need to use send!() instead. Symbol…
Dear Salesforce, I've been doing some work with you lately, and I was hoping to hook into you using your APIs to automatically insert some of our leads. Unfortunately, I can't. Despite the fact that you have a full API, it seems that you've chosen to restrict API access to "Enterprise Edition" and higher level accounts, and at my office we only have a "Group Edition" account. I've been trying to…