What do you need to make a successful web app?
mir.aculo.us
mir.aculo.us
This is the biggest one. I have seen many, many projects held back by the idea that they need eight nines of reliability and a geodiverse HA cluster before they can even start, where a single server with a half-decent backup plan would be more than enough.
Good security from the start
You don't need that either. You absolutely should think about security but it's by no means necessary to succeed. And really, backups and letting someone else handle payments will usually make it impossible to fail catastrophically†.
† Some exceptions apply.
Cryptocurrency disasters are largely a result of the same poor practices we see everywhere, and there are more non-cryptocurrency projects than cryptocurrency ones.
>This is the biggest one. I have seen many, many projects held back by the idea that they need eight nines of reliability and a geodiverse HA cluster before they can even start, where a single server with a half-decent backup plan would be more than enough.
This seems weird to me because I'd gotten the impression, from reading around, that it was more often a problem that someone's servers weren't ready to handle the throughput due to not enough servers, not being written scalably from the start, etc. And I've seen this happen a ton of times with people's new web apps that they post to HN or reddit. It even has a name over there, the "reddit hug of death" when it's overloaded by the new demand.
If you set reasonable limits for the number of processes/threads/connections to keep them within the available RAM, then most sites will have no issue with thousands of visitors per hour. Here's a screenshot of the real-time analytics for my blog on a day it was front page of HN. That was a WordPress site, with no caching, on Linode's 512MB VPS (the cheapest plan). The server barely registered any load at all.
http://www.dangrossman.info/wp-content/themes/2012/hnpulse.p...
I also launched my web analytics startup on a VPS. It was handling millions of visits per day before I rented the first real server. You can absolutely have thousands of users, thousands of dollars in revenue, and a $20 hosting bill. Sometimes that's all that's required. Plan for what you're going to do when you outgrow the hosting, but there's no need to buy hardware you don't need up front.
If your site is behind a login screen, you can manually login from the browser then copy+paste your session cookie into the ab commandline.
And the OP's point is that even if this happens, the cost of trying to overcomplicate things by adding HA, multi-tenancy, etc outweighs the cost of just getting the app into people's hands. We have this innate fear that overloaded our servers is the "worst thing ever". It isn't. If your server gets overloaded, that's a good problem to have.
You won't believe just how many organisations will have an automated script for a daily/weekly/monthly rolling backup of their database, but won't have any procedure to restore the previous days database to check the backup procedure went ok!
At the most basic, it's just another automated script on a spare box to ensure the restore returns ok. But people don't even bother with that...
If you're a developer with little linux experience, don't try to play the sunday morning sysadmin with fancy bash scripts on your startup. It takes a lot more time and resources to keep a system in good state than you can foresee.
Backing up configuration files and what-not is also pretty silly and indicative of bad devop practices.
The database should be versioned and maintained with a migration tool. So the only feature of the database that needs backing up should be the data it holds - live replication servers that can act as background backup slaves are perfect for this.
The only stuff you should be backing up on your servers are the latest log file rotations, user-generated data in the database, and any critical files that were also generated / uploaded by your users (but technically, you should be storing those in S3 with duplicates in another availability zone).
One other thought: people usually don't think to encrypt their backups. Duplicity + GPG + S3 is what I use right now and is super easy to setup with some fiddling. Once Tarsnap becomes a bit more professional I'll be moving all of my server backups to Tarsnap.
Replication won't help if a "drop table users;" happens. You need point in time recovery.
You may want to backup log files and uploaded images/files.
The backups should be stored at your main service provider and also at a different unrelated place, so if AWS or whoever deletes your account, your backups aren't toast.
You also want an automated system for monitoring that your backups are happening and that you can restore from them.
If encrypting backups, don't forget to backup your encryption keys.
Good point re: multiple providers.
Much later down the line when you start finding harder bugs you wish your basics were tested and verified. It's _priceless_ to run your test suite and make sure everything is kosher after a change. This is something that took me years to put into motion with my projects despite reading about it online.
Set up a build server on your own VPS or something like https://www.codeship.io/ and have it hook into every commit and run your test suite, if all green, deploy to production. Saves time, thus saves money.
I'd say add them in after you have enough to pay one person full-time.
We wrote tests for PlaytestCloud only after we acquired the first paying customers.
The tests only ensured that customer-facing routes would not crash. It was a good balance to ensure that we could move quickly while ensuring that we didn't introduce catastrophic bugs.
A lot of thought leaders have been promoting testing like crazy the last couple of years, with the result that some people treat it like it's essential, when it rarely is.
If the person in charge is the stereotypical "business type", then it can be difficult/impossible to convince him/her to allow engineers to spend time doing a refactor and/or writing tests for code which was written months ago and is "working fine" because you now are showing some traction. This can easily lead to never actually getting around to writing that robust and practical test suite that is really necessary in the long term. Note that I also say the test suite should be practical (for some definition of practical which may vary from engineer to engineer). For example, 100% test coverage may not be useful, determine which parts of the code MUST be tested and which parts are just diminishing returns, etc, etc.
What I've done on a couple of occasions was to tell the nontechnical stakeholders that automated tests must be added before the web app framework (or whatever significant dependency) could be upgraded. In the context of such an upgrade, they could understand the benefit of a test suite, and they signed off on it.
- mission critical code
- before refactoring
- people working on a codebase they don't understand completely (changing X might break Y)
- implementing complicated algorithms
In other situations, it's a almost a matter of taste: There are people who claim that writing tests will actually make you develop faster because you'll spend less time debugging. Also writing unit tests sometimes can make you think more systematic about all the edge cases an api needs to support.Now, I'm quite the opposite - whenever I add new functionality, I write as much tests as possible - it makes life so much easier in the future. Yes, sometimes it can be irritating when you change one line in your code and you have to fix 10 tests, but the peace of mind when all tests run successfully after each change in code is priceless.
I never write tests until something is launched and it looks like anyone will be using it. There's no need to have test coverage for software that's going to be completely torn to shreds every couple of weeks until that first spark lights in the eyes of a user who finds the value proposition you've been searching for.
Unless you have the luxury of working with a full team and have plenty of time to kill (read: money to burn) you're going to want to cut as many corners as possible. If it is a fast moving new market it could save valuable weeks to skip out on a number of 'best practices'. You would be astonished at the number of products launched without a stitch of what would pass muster on a more mature code base.
The goal is to find something that people want, not to make robust software. That comes later. Pretending like there aren't up front costs to writing and maintaining tests is absurd.
You'll also find that if you're sticking to functional and stateless design patterns that your code is incredibly easy to reason about. Ditch the OO patterns like observers... Anything where new instances of objects are created, anything where you can't literally serialize the state of your running application, restart it, and get back the entire state you were just in...
People tell me that tests force people to reason about their code in such a manner. I think that reasoning about your code in such a manner is the really important part. You end up with code that you never need to step through or pry apart in a REPL. It just works (TM). I dunno, I've been writing application code for almost 20 years now. I've learned from a lot of architectural and implementation mistakes I've made over the years. State and side effects are the fucking enemy. All of the testing in the world isn't going to fix your ill conceived understanding of whatever new problem space you're dealing with.
I also find tests make the most sense when there are multiple developers working on a code base. A single dev isn't going to benefit as much from the cost.
And yes, again, tests do have a cost. It is absolutely ridiculous to argue that they don't.
And ditch the objects. They make no sense outside of a Smalltalk or Self environment.
After you launch and people are using it, after you've got a few developers working in the code base, after the product has actually stabilized to a set of more or less concrete specifications, THEN write your tests.
If it really is the frontier then cowboy coding is just fine. :)
The west wasn't won with prudence, it was won by taking risks and moving quickly. You're not the only guy with dreams of building that railroad. Someone else is already driving stakes in to the ground. You can go back and build a better bridge, a more efficient path through that valley, or a safer incline AFTER the line links up. The intercontinental railroad was a mess for decades after it was built but that didn't matter because the utility provided was immeasurable.
If you're just building another commuter rail in a busy town, well then I can't relate at all. Use your TDD mumbo jumbo. I'm a start up guy, I'm a cowboy, ON A STEEL HORSE I RIDE. AND I'M WANTED, DEAD OR ALIVE.
BTW, I have plenty of start up friends who successfully start new projects with tests. I mainly wrote this because I wanted to quote Jon Bob Jovi at the end there. :P
> reset.css
Wait, what? I was with him until that. Using a CSS reset is part of CSS 101, I would never dream of starting a project without one. It isn't a "complex dependency", it simplifies cross-browser issues greatly. Putting this on the list is simply... bizarre.
So if you are going to use a reset.css file, you should do some research. Check on google what other people are writing about reset.css files, read comparisons of different reset.css files, test different reset.css files on different browsers, etc. But then you've wasted an afternoon NOT BUILDING YOUR PRODUCT.
If you just accept that your website is going to look slightly different in different browsers, you will realise that you don't need a reset.css file, and you will save a lot of time.
The CSS reset is a convenient tool for the visual layout only. It helps with browser consistency and prevents margin/padding/font-size issues mostly, but it won't turn your idea into a successful product. I think that's the only message the article meant to convey.
check this page for more info and an example of a css reset: http://meyerweb.com/eric/tools/css/reset/
I do no understand the big about reset.css either but I guess I"m willing to listen? Reset.css has also been a lifesaver.
For a blog making a really important point (don't just use Angular because you've heard of it, use what gets shit done), suggesting that boilerplate creates dependancies that you will regret having seems out of place.
That’s a bit of a stretch.
The current version of HTML5 Boilerplate includes several things in the header that probably aren’t exactly what you want, particularly if you’re supporting mobile devices.
It loads 4 distinct JS files. One of those is Modernizr, which is loaded at the top of the page and will therefore block, and there’s a custom class on the HTML element to go with it.
It loads 2 distinct CSS files.
It inherently has potential security and privacy issues that come from using any third party servers, in this case Google Analytics and attempting to load jQuery from their CDN.
Likewise, it has dependencies on some third party scripts, both Modernizr and the ones for Google.
And it contains an unprofessional nag message for users of IE8.
This is not a criticism of HTML5 Boilerplate. All of the defaults mentioned above might be a good fit for some projects, even many projects. However, none of them will be suitable for all projects, so the moment you start from HTML5 Boilerplate you almost certainly have some technical debt to pay off, just like any other template or framework or scaffolding system.
In any case, some of the defaults in HTML5 Boilerplate can have real negative consequences if you just use it without fixing them. If your market will be using mobile devices a lot, or tends to have limited connection speed for any other reason, then making half a dozen extra requests before you even start doing anything interesting can have a significant impact on performance. Playing around with viewport settings can have significant adverse effects for usability if you don’t know what you’re doing. That little message about IE8 that isn’t going to show up on the recent browsers your developers usually use is going to get you in trouble with a client one day if you develop a lot of intranet sites and forget to remove it.
I guess some people just like to write their frontend code from scratch...? It's funny because the author wrote Zepto, of all people he should know about abstracting away cross-browser concerns.
There's an alarming stench of NIH in some of the authors points, co-mingled with some more salient points about not over-engineering up front.
> An understanding of tax laws in your country
How does one learn this? Is there a book you guys would recommend?
I think in addition to tax code, learning a bit of legal stuff is probably necessary too. And for that, grellas's guide is probably handy: http://www.grellas.com/faq_business_startup.html. Learning about accounting would be a good idea too, I'm also clueless there though - any recommendations for learning that?
I suggest an obvious but effective policy: when you need professional advice, speak to a professional.
The first time you need a certain kind of legal document — terms, privacy policy, employment contract, whatever it might be — speak with a lawyer.
When you set up your company, find a decent accountant who can get the proper structure in place. They can tell you the basics about what records you need to keep and when you’ll need to do things.
After you’ve done something the first once or twice, you usually have a reasonable understanding of what the essentials are, and you can probably do more of the work yourself to save time/money. The professionals can then become more advisors and reviewers than the people doing routine paperwork.
I also strongly agree with 'jakobe about finding professionals who are used to working with small companies, preferably by personal recommendation. It’s much more than just pricing: the whole way they work is often very different to how bigger accountancy and legal firms who are used to working with bigger companies work.
As a final tip, in most places there are organisations that support small businesses that you/your company can join. These usually have a modest cost, but IME membership can easily pay for itself many times over. Some useful services they might offer that save you time and/or money include providing templates for common types of legal document (which you can use as a starting point if you’re drafting yourself), providing legal and/or tax helplines (which you can phone when you just need five minutes speaking with someone who knows what they’re talking about), and producing general guidance on things like contracts, tax, and insurance, with a focus on issues affecting small businesses. You might also find you can get more attractive pricing on things like business supplies and insurance through such organisations, as they have much more bargaining power collectively than any single small business has on its own.
* When you are just starting out, it makes a difference if you pay someone 300€ a year to do your taxes, or if you have to pay 1000€. Stay away from the big companies. They will charge you for every phone call. Ask other small business owners for references.
Technically, yes, one could navigate all of the forms on their own and get even more tax savings, but that is only the case if you don't value your time. Since I charge my clients by the hour, and filing taxes often takes several hours for us in the United States, having an accountant also meant I could work without worry and make money instead of having to take a day off from working or stress myself out on my regular days off.
Hire an accountant. Do it right away, you give them a retainer and they'll have a price sheet of services they offer. They'll ask you what your goals are, just tell them you are interested in making sure you are in full compliance with the law, but don't know what you're doing. They deal with customers like us all the time. They have it streamlined and know exactly what to do.
Even if you arent building your own startup, knowing how to tradeoff big win features over engineering resources, understanding the risks of X new tool over delivering a product, being able to communicate effectively and work within a team are very typically far more important than raw programming talent, brilliant engineers will always be needed especially on big projects, but you can get a long way with a little programming talent and a lot of a common sense approach to delivering a product.
1) A problem your app solves
2) Users of your app
Seriously, the other items on the list aren't necessary until these two criteria are met. Then, and only then, will the elements of that list be necessary.
I don't want to be successful it sounds stressful. I want to enjoy hacking maths and code.
One thing I disagree with is "don’t anticipate 'potential' problems". Preparing early for problems which may occur later is very important for obvious reasons.
Understand human psychology: https://www.youtube.com/watch?v=_X8OEt6QTAg
Know how to design, both in terms of UX flow and visual design:
https://www.youtube.com/watch?v=2tPXgFBzLRs
https://www.youtube.com/watch?v=IDYjSdqtNZU
https://www.youtube.com/watch?v=7OSkB4BCx00
*And ofcourse the best text editor ever created: www.vim.org/
Please, let's refrain from blanket, subjective statements for once.
We have run into issues on layouts where the project leader wanted one thing, then changed his mind two or three times (and this was after being implemented) so that view is a little tough to work with now, but generally speaking if you have a clear picture of what's important to your user it's trivial to present one experience to mobile users and a very different experience to desktop users based off the same markup.
The key is is tilling your markup down to the minimum to suit both layouts. When you have too much markup it gets tougher to make it responsive.
How on earth can you give a list of goals to achieve and then banish technological measures that have the primary aim of achieving some of those goals?
So the subset for a 'successful web app' is a useful distinction to get started, but the condescension implicit int he second list just comes off as ignorance.
And he forgot a really important one.
1) A genuine interest and passion for the service you are building and will be spending thousands of hours working on.
"Passion" is a cheap word. It can mean anything. But it's taken to mean "something that overpowers your sense of judgment and reason" in the startup world. Doesn't have to be so.
No, not every web app needs that. It depends on the business model.
Even if their comments are well-meaning and made with no intent to mislead or deceive, what people say they would do in a hypothetical situation and what they actually do in a real situation can be very different, particularly where spending money is concerned.
Every post I write says that conventional wisdom -- e.g. creating a product people want & need, and charging for it -- is right. And most of my blog posts are full of value, and actionable things a reader could do right there, for free:
http://unicornfree.com/2013/how-i-increased-conversion-2-4x-...
People who want more, have more money than time, who value an expert demonstration, and live exercises graded by a teacher… take my class. But I've known many people who had more time than money who implemented the principles in all my free content and turned that into valuable businesses.
Good for them. That's why I put it out there.
No money? No valid idea. Doesn't mean it's a bad idea...it just means it's not valid from a business perspective.
But getting feedback from people who aren't paying you anything is hardly "validation."