TE
TechEcho
Home24h TopNewestBestAskShowJobs
GitHubTwitter
Home

TechEcho

A tech news platform built with Next.js, providing global tech news and discussions.

GitHubTwitter

Home

HomeNewestBestAskShowJobs

Resources

HackerNews APIOriginal HackerNewsNext.js

© 2025 TechEcho. All rights reserved.

I bet you over-engineered your startup

152 pointsby hamaxalmost 13 years ago

24 comments

debaclealmost 13 years ago
Of the three startups I've worked with, two of the three were ridiculously over-engineered monstrosities that were way over time budget. It was clear that the CIO/CTO wanted to do cool fun stuff and not build a marketable product.<p>The other was cobbled together with completely shit code, was constantly breaking on releases, and was glued together with perl scripts. They're now publicly traded.
评论 #4224304 未加载
评论 #4223746 未加载
评论 #4228395 未加载
xdalmost 13 years ago
From my own experience, developers, particularly inexperienced developers, when learning something new have an insatiable need to implement their new found knowledge .. no matter if it's a good fit or not for the problem at hand (myself included .. I remember abusing the hell out of recursion for example).<p>One of the worst examples I've seen is the functional programming paradigm being crowbarred out of PHP .. why.
评论 #4223103 未加载
评论 #4223710 未加载
评论 #4227016 未加载
programminggeekalmost 13 years ago
Many devs tend to over-engineer things whether they are at a startup or not simply because they like building things, that's why they are software developers. I don't think this phenomenon is much more complicated than that.
评论 #4225023 未加载
tedsuoalmost 13 years ago
Sorry, but I think this is really bad advice, it goes about it from the wrong direction. Saying "monolithic" or "services" like one is good and one is bad, or one is complicated and one is simple, is kind of silly.<p>For example... which is simpler, writing your own search indexing tool in ruby on rails, or installing solr as a service? MySQL is also service, for some reason people tend to forget that. Conversely, if your processes aren't yet resource hogs, why not just let them remain general purpose workers? If you are constantly fiddling with multiple services to make any changes to your app, then yes, you have probably made a bad choice somewhere. But a HAproxy/nginx/rails/memcache/mysql/solr stack is already six services, and not really so complicated to work with. When you write your own services, you should aspire to that level of simplicity.<p>At the end of the day, the shortest path will be wherever it will be. It's your job as a developer to weigh the pro's and cons on a case by case basis. The hard part is to test drive everything so that you can change it later, and constantly evaluate what choices each decision you make is removing from the table (painting yourself into a corner if you are not careful).<p>Another way of putting it: if you are picking your architecture before you begin, based on some kind of generalized principle, you are already over-engineering.
nemesisjalmost 13 years ago
This is a really weird article.<p>The solution is not to say "Services Suck" or "Monolithic yay!", it's to realise that you should start with a monolithic app built in a good framework, then see how your app's internals are used/accessed as you grow THEN split out to logical well designed services.<p>Or in other words: Premature optimisation is the root of all evil.
评论 #4223248 未加载
codebeakeralmost 13 years ago
After reading the "What Happens" section of the OP's article I can see that he's made the classical mistake of making many things do one small thing, but they're not independent.<p>The message queue to notify component X of changes to data in Y is endemic of badly designed systems; if system X cares about changes to data in Y it should be designed that (at scale) it caches the data for a suitably short time, otherwise reads-through to the canonical source.<p>This is a common anti-pattern, and I've seen it built by smart teams at epic scale (millions of uniques per day) and it is still un-manageable.<p>Feature toggles, hard and soft-failing, together with a baked-in assumption that APIs are asynchronous (that is, unreliable) at as many levels as is feasible is a good architectural move. (And does not necessitate an abundance of architecture over feature code)<p>Loosely coupled components that expect their counterparts to respond slowly, or not at all are easy to implement and even easier to test. (HTTP, if one wants to use HTTP as the transport medium, learned this, and offers 201 and 202 for CREATED and ACCEPTED).<p>In my own projects (and I work mostly on near-realtime billing APIs) we bake this assumption (and others) into every transaction, as try to be restful, and transmit the state, and a URL which can be used to get the canonical representation of any resource, at any given moment, and objects in all parts of the system are stateful, relying on the handshakes (accepted/created) (404, 406, 409) to avoid race conditions and to make sure our systems can handle downtime of any component (internal or external)<p>As a result, we have lightning quick tests, we are very confident in the system's ability to perform, and we have read-through caches which respect the transport medium's headers.<p>I suspect the OP is right, many do over-engineer the startup, but remember many startups appear to have an abundance of developer potential, until they don't. (Usually through bad design, not over engineering, the two ought not to be confused)<p>Perhaps I am biased by having seen it happening in a large company, completely unscalable architecture, and at a point as many "architects" as they had developers, desperately trying to keep the wheels turning.
评论 #4225479 未加载
efsavagealmost 13 years ago
Scalability is about more than operations/second or any single metric, it's about making a service/system that can survive at scale, both technically and logistically. A server that goes 10x faster than it's competitor but cannot work with other servers to go to 100x is not a scalable solution, whether that reason is because of some low level networking limitation or a high level programming or administration limitation.<p>More semantics, but over-engineering is about more than making things complicated. If a tool doesn't do what it was intended to do, or if you've ignored the proper level of complexity, it's because it was <i>badly</i> engineered, not over-engineered. <i>Good</i> engineering will "over-engineer" things as much as possible within the constraints of the solution.<p>And if you keep that in mind, then you really can't over-engineer things or make them too scalable.
评论 #4223171 未加载
markokrajncalmost 13 years ago
You can do it Microsoft way: build Windows as a GUI for DOS, capture many users, earn a lot of money, then pay best developers to develop Windows NT and merge it into a new OS. (user experience first, architecture later).<p>But you can do it the Apple way: make it good from inside out - including architecture, wait loooooooong looooooooong until users recognize all this, then get maaaany users and earn lot of money. (Hopefully you have survived until then.)<p>If you have luck, you can have both: good architecture inside and very good user experience...<p>But anyway I agree with the author, that many many solutions are over-engineered instead of just simple...
评论 #4223166 未加载
btillyalmost 13 years ago
Here is my simpler version: function calls are the fastest RPCs. They are faster to run, faster to write, and faster to debug if something goes wrong.<p>By all means conceive of your application as a bunch of well-engineered little pieces. But for now, write them all as modules that you're making method calls to. Should you some day want to, you're free to replace one by a facade around a remote service. But for now it works and you can move on.
评论 #4225032 未加载
shreyas056almost 13 years ago
And all that matters is the end user experience. Users don't care how it works as long as it works(according to their expectations).
评论 #4222984 未加载
andrazalmost 13 years ago
My biggest grief is that most of the engineering meetings consist of discussions of how to get a piece of data from one system to another.<p>Instead of working on things that matter to the user.
评论 #4222983 未加载
SeoxySalmost 13 years ago
This isn't so much the symptom of a distributed architecture as it is one of a badly designed distributed architecture.<p>Distributed architectures are the only way to go once you reach a certain size both in terms of scale and in terms of team size. You can certainly make do without it (Wikipedia) but you'll have a much more robust product with it (Netflix).<p>The trick is always using the design appropriate for the current needs. It's good to think ahead, but it mustn't come at the expense of the present.<p>At the beginning—which is the case for most startups, since few make it to the later stages—it's often a good idea to go with a monolithic codebase based on a lean framework. As you grow, you're going to want to start adding components like a message queue for async work, rethinking your data store for scale, etc. As you grow even further, you're going to want to transition to a distributed architecture. I don't know what comes next… I haven't gotten there yet. But I'm sure as you grow even further, your needs are going to change yet again.
calinet6almost 13 years ago
Joke's on you, I don't even <i>have</i> a startup.
hessenwolfalmost 13 years ago
Yes. We spent ages before product launch devicing a really solid service that nobody wants, and now make a stream of money from a side-shoot of our main product. Oh well.
gizzlonalmost 13 years ago
I'm all for simplifying, but what exactly does he mean by "monolithic architecture" ? Not even sure I get his overall point, the rant seems to go in many different directions.<p>That phrase "monolithic architecture" makes me think of <i>one-huge-Java-project</i> and that's not exactly "simple" in my mind. Probably not what he meant though..<p>Generally, I guess separating things is more work and can actually lead to less flexibility when situations arise that you didn't plan for (<i>"maybe bloggers should be able to advertise too"</i>). OTOH, <i>not</i> separating can lead to entanglement, where you can't really change anything because other things depend on this or obvious and subtle ways.<p>(edit: removed dumb example ;)
评论 #4223086 未加载
评论 #4222988 未加载
sandfoxalmost 13 years ago
This seems a bit straw man. "Distributed systems suck because Developer B has to wait for Developer A to add stuff to System A so System B can have a new feature". What you have there is a totally different problem that is unrelated to being distributed or not. Replace the word System with Module and imagine they are in the same codebase, still have the same problem. This post smacks, distributed system are hard and gave us a new set of problems that seem hard, runaway!
rexreedalmost 13 years ago
Side note: I <i>love</i> the fact that there is a COBOL manual in the top graphic in this article talking about over-engineering a software business.
评论 #4223709 未加载
评论 #4223565 未加载
creamyhorroralmost 13 years ago
Some counterpoints and cases, anyone? I'm sure many of us would like to hear them. (I'm not at all qualified, just starting out myself.)
评论 #4223281 未加载
评论 #4223218 未加载
评论 #4223064 未加载
评论 #4222936 未加载
sneakalmost 13 years ago
Agree, but trotting out Google and Twitter's most painful and unattended-to shortcomings, while touchstones, does not support your original thesis.<p>Furthermore, Google and Twitter aren't startups.
评论 #4222941 未加载
jrs235almost 13 years ago
Isn't a philosophy like 37signals the answer to this? Simplify the software, reduce the number of "features", resist adding and adding and adding to the application?<p>Simplifying the software will allow you to simplify the architecture, no?<p>The stand still and dilemma for Developer A and B stems from a failure to plan and having a road map. I, of course, am assuming both devs work internally at the company.
hippichalmost 13 years ago
This is bad advice for people who care. Granted, for businessmen it is most import to cash check, but even quick and dirty project slapped together will require rewrite eventually if it take off. And it most likely will be painful and have all kind of subtle bugs.
评论 #4224602 未加载
eragnewalmost 13 years ago
Exactly what I needed to read this morning. Thank you.
PaulHoulealmost 13 years ago
cogs bad...
mjwalshealmost 13 years ago
Thats not over engineering just crap design and using the latest toys for the sake of it.<p>Overengineering is the Victorian egineers way of desiging as they did not have the indepth knowledge we have and so have massive margins of safety.<p>Of course that means that some of the pre WW2 London Underground tains lasted longer than the ones bought in the 70's.