Pinboard Creator Maciej Ceglowski Talks About Why Boring Architecture is Good
readwriteweb.com
readwriteweb.com
I've found my defect rate to be pretty comparable to earlier projects that included extensive test suites and fixtures, but I am much more productive on Pinboard
Its great that this approach is working for him, but this may not work in a decent sized project with multiple people working on it. I prefer a safety net of test cases in such cases.
EDIT : Formatting
I've often found that dogma is useful for the beginner, because practice is needed. When you mindlessly apply something, you focus on the application, and not if it's appropriate.
Once you've got the application down fine, then you have some experience to base your decision on when is and is not a good time to actually apply things.
1. Write the unit tests while the code was fresh. Ideally, you wrote well designed unit tests so you didn't have to constantly deal with maintaining crappy test code. Unfortunately, most test code doesn't seem to be well-written, DRY code, so you spend a lot of time in the interum maintaining it.
2. Figure the code out again when you need to change it (likely somebody else is doing the figuring out by then) and write unit tests that show current behavior. The "figuring out" step is always nastier than you expect.
3. Start digging and hope you come out the other side with something reasonably similar to what you started with.
The trick is figuring out which one optimizes best for your business. Pinboard might be able to get away with #3. Air traffic control may have no choice but to be #2 (did people write unit tests way back then? I know I didn't write any unit tests on my Atari 600 in '83 :).
My unit tests are half for today—they actually let me code faster and better—and half for next month, when I discover a much better way to do things and reorganize my code savagely.
3 years from now? That's just a bonus which lets me feel smug. The real payoff was immediate, and did not involve any virtuous self-discipline.
Amen, brother. I feel exactly the same way. I find this approach works perfectly 99%+ of the time, and regardless, I end up spending way way less time writing and maintaining code because of it. Understand what you're doing, and why, and you reap benefits not just at the tactical momentary level, but long term and architecturally as well. Understand the codebase really well, and it's much easier to diagnose issues that happen in production or at a larger scale.
It suffers when you have multiple people working simultaneously, or if you have to take a break before returning to the project. In those case, a secondary automated statement of what the system should do is quite useful.
So, I am very happy about Pinboard.in being successful, but I think it's a bit of a shame that such frivolous endeavors take Maciej's time from writing his blog :P
(A bit more seriously, it's really nice to find a compatriot doing something cool in more than one domain.)
In his case, it sounds like a fairly small website developed by just himself. Sorry if I'm not going to take this advice too seriously until this is disproven.
> The [Pinboard] fee is based on the formula (number of users * $0.001), so the earlier you join, the less you pay.
The current price is $9.22, so following this formula he has ~9220 users, which has paid him roughly 42K. He also charges $25 (minus your sign up fee) for archiving, which would bump that number up a bit.
I want the freetext search, but don't need to be able to access the archived page (except for the equivalent of Google's text cache if the remote page is down).
So yes I want archiving, but I don't need asset archiving for things like the images, css, javascript on the pages. And yes I realise for a lot of hashbang sites this would break, but that's just dandy with me.
I could sign up to the archiving, but with over 1,700 bookmarks I hesitate... will it go and download all of them? I think that's creating a burden on your service so I am not upgrading. I'd even pay the same price, or damn near it, as the full archiving, but I really want to get the fulltext search in a guilt-free way.
It comes down to this - storage is cheap and development time is expensive. It would take considerable work to retrofit the crawler to only fetch dependencies for certain users, manage the case where they upgraded/downgraded between levels, and so on.
It saw a huge influx of users the day the delicious end-of-life-ing was announced, and held up admirably.
As someone who works (during the day) for a government agency with well over a million employees, this is something I understand well. Granted, we're not Twitter - but we do serve a silly amount of data using old-fashioned and "boring" technology, and we're glad that we use it because it's proven itself to be reliable.
This is rather insulting to two groups of people: people that are working on things this author would not think are interesting, and people who are overcoming technical challenges by deciding to use new, less mature tools since things like the LAMP stack have well known limitations. (the overlap of these people, as you can probably guess, is pretty high.)
Simple is good - it's mature, it's easy to understand, it's easy to optimize, and it works. And you don't need to spend a bunch of time and make a bunch of mistakes learning it.
Scale: 120+ million people a month.
Stack: IIS + SQL Server + MongoDB, glued together almost exclusively with C#. The only part of my stack that's remotely cool is MongoDB, and I only use it on a little bit of my platform and I outsource it to MongoHQ.
The hard part of any new technology is bouncing back when things go wrong, and I don't have to do that now that a 3rd party does it for me, which brings me back around to Simple again.
There's a whole bunch of stuff I would like to learn but the reality is I can't have my startup falling over every time I fumble through learning something new, especially when what I already know can still solve problems.
Isn't this contradictory to the idea of using boring well-tested infrastructure?
At the company I work for we have 2 internal APIs being worked on:
1) A freebase/metaweb style API backed onto a relational database
2) A traditional set of web services backed onto a document based database
The former gives us the ability to invent the questions we want to answer and validate whether those are valuable questions. But it carries the risk of complexity and the problems of scaling in return.
The latter gives incredible performance once you know what questions you want to answer. But it is much harder to prototype things on as that's a bullet-proof big industrial thing and things move slowly in there.
We basically recognise a difference in the balancing of pros and cons between the systems that help you prototype fast and the systems that help you scale dramatically and securely and that have to be maintained. And it sounds like this is the underlying point about using a framework for prototyping and then building your own simple, pared down specific thing.
http://blogs.law.harvard.edu/philg/2009/05/18/ruby-on-rails-...
Resist excessive abstraction
Set performance targets for yourself
Excellent points for making any software perform well. I am working on performance in a non-web app that suffers greatly from over-abstraction, and over-caching to hide the overhead. Since design is subjective, railing against this got me nowhere -- but setting performance targets truly shifted the focus of the team. Now instead of debating how many internal layers we need and how to name them, we focus more on our runtime budget, and how to make the hardware solve the problem in that time.