Earlier quoted context omitted.
I'm curious, what's the right alternative to having an email and password columns in a "customers" table?
In addition to the sibling answer of "use a framework"; if you simply stick passwords in a database, and the database gets stolen, you've now leaked your users' passwords. So you should hash the passwords, and they should be salted, so now you need a `salt` column. Most people use too cheap a hash function, so this is an additional argument for using a library / framework.
If it's a nice problem to have, don't solve it now
31–40 of 71 posts
Re: If it's a nice problem to have, don't solve it now
#32Earlier quoted context omitted.
>Ninja edit: this is in contrast to things that aren't a problem yet. E.g., in the article, the author discusses not having password reset functionality. That is not yet a problem in the absence of users. It's not a nice problem to have. It is not a problem. That's the crux of it. The headline is catchy, but the author isn't talking about nice-to-have problems. He's talking about recognizing if something is a problem…
Short, information dense, titles are hard :-) The full question I ask is "From my perspective right now, is this a nice problem to have?" - emphasis on the first part. I certainly didn't mean for this to be click bait, just wanted to share something that's been valuable for me with others in the hope it might be useful. I might work on the title.
Re: If it's a nice problem to have, don't solve it now
#33Re: If it's a nice problem to have, don't solve it now
#34I take a different attitude to "nice to have" problems. I work on a professional services team that is massively undersized relative to demand. Our role is less than a year old within the organization. We have far more clients in need of support from my team than we can give. This is a great problem to have - lots of pent up demand. Nevertheless, it is a problem, and we must actively strive to solve it. It's nice to…
> It's not a nice problem to have. It is not a problem. I think you misunderstand his word usage, though you're seemingly following the same process. A "nice problem to have" is one that results from having success. Yes, he doesn't have the problem now, because he's got no users, so indeed, having to reset the passwords of existing users would be a "nice to have" problem. You're already in the "nice to have" zone (cl…
I am focusing (perhaps too much) on the tense issues. Without tense, "no password reset mechanism", to continue using the same example, represents a problem state.
If something is a problem, it exists in the present.
If something will be a problem, with any contingency or timeline, then by definition it is not yet a problem.
Even in your own phrasing, the tense issue becomes clear:
> Yes, he doesn't have the problem now, because he's got no users, so indeed, having to reset the passwords of existing users would be a "nice to have" problem.
Specifically "... would be a "nice to have" problem." This indicates that it is not a problem, rather that it can become a problem.
Re: If it's a nice problem to have, don't solve it now
#35Obviously it's just an example, but should most new companies just avoid building login entirely and use something like Auth0, AWS Cognito, Firebase Auth, etc?
Re: If it's a nice problem to have, don't solve it now
#36As a person who has worked at many startup, I get it, "shipping" features is important. As an engineer working at many startups, this is a sad and painful reality of working under product driven ideas and "first to market" type things- basically anything that doesn't (usually) involve life or death, or federal regulation is rushed out the door when it can be. As a user, I absolutely 100% hate this mentality. You skip…
But once stabilized, and there's no immediate danger of running out of runway, things shift, and the medium and long terms become much more significant. But many startups fail to realize this; they've become too accustomed to the fast-paced, ship-asap mentality. Breaking from it seems to them a decline in productivity, where it's actually just a shift in priorities. There are a lot of contributing factors to this oversights, and they can vary from company to company, but it's continuing to prioritize the short-term is a dangerous act that usually serves neither the end user nor the business.
Re: If it's a nice problem to have, don't solve it now
#37This can also be summarized as "Early on, don't be afraid of doing things that don't scale". In this particular example, my "reset password" functionality could be sending me an email, and I have to reset the password manually and email you a temporary one that you can use. Bad solution? Yes. Doesn't scale? Of course. But if you have 5 customers it's not a big deal and you can use your time on something else. The key…
People spend so much time trying to preemptively solve scaling problems and proactively design around scale. I am being 100% serious when I say that this is an absolute total mistake. Scaling problems are just the absolute best to have, you shouldn't run away screaming from them before they happen. Twitter had the fail whale for years, you know what it didn't do? Tank the business. In scaling problems:
• You have money flowing in, and confidence that the thing is working.
• The load on the system has been dynamically adjusted down for you as your users have a suboptimal experience, giving you smaller messes to clean up.
• Often there is an expensive short-term solution to remove the egg on your face if so desired. You have one Really Important client who is pissed, you give them their own private app with twice the hardware until you can get this resolved, and now they love you for life because they see that you did backflips for them.
• You can profile the system. Complex systems, under instrumentation, literally tell you where to look for what is wrong. “Why is that taking 400ms?!”
• You can run side-by-side tests, clone the input from the stressed system to the new system and verify that the load has decreased while the underlying model is the same.
• Very often you will find logical bugs that you needed to fix anyway, they just become much more apparent when the system has high contention. Two things were implicitly ordered by time and thus did not break unless requests were concurrent, so they were doomed to break eventually, but now they break almost immediately.
• Your corporate overlords immediately understand the business value in getting the situation resolved “correctly” whereas convincing them of refactors usually takes time. “We got the system limping along for now but if we don’t fix the underlying issue soon then this will happen again.” “Well we are really happy with how explosively this product is going, I guess we can delay those other two apps while you fix up this one.”
• At the same time that license is not a license to dither, as usually happens with such speech. You feel committed to investigating and refactoring and fixing, with that time, because the uncertainty of the system is a sort of abstract menace exerting deadline pressure. It is legitimately exhilarating to figure out and fix the actual problems, and gives you a good feeling about your contribution.
This is why I would generally tell people to not start out a project with Kubernetes, for example. You are trying to up-front the cost of a scaling problem but that scaling problem is gonna be really nice to have. Do it later! Get some egg on your face.
There is an abstract reason too, which I should mention. Lots of systems die because they do not have a “revenue problem”—long term they will make enough money to cover their costs—but a “cashflow problem”—short-term they overcommit and run out of money. You fail to pay your employees on-time one month, and by the next month you find yourself potentially needing to spend time and money hiring new employees to replace the ones you just terrified. So you fail to deliver a functionality on-time and a new client chooses a competitor. Stuff like that. Can happen just because if you have N payments coming in the uncertainty of those payments can grow like √N while you keep only a constant buffer of cash-on-hand, but can happen in more elaborate ways. Almost always you can ease the pressure by deferring payments until the latest possible.
When I was planning my wedding, my wife wanted to pay everything as soon as possible to save on our mental load; I resisted. And that was clutch because there were times during this when we were saying “ok we got $100 left to cover food and gas this week before I get paid on Friday, what can we do with that?” where if we had up-fronted those costs, presumably we would have unnecessarily eaten ramen or less for the three weeks before. Like it is easy to say “here is what we can save per month, so this is a reasonable budget for the wedding that won’t kill us”—solving the revenue problem. But cashflow problems still exist even when you know that you will be able to cover the cost eventually. Solving a scaling problem is up-fronting a cost that can easily be delayed and if you don’t delay it then there is a very real chance that your project can be canned way before you run into that scaling problem.
Especially let me link @jackdied’s talk “Stop Writing Classes” where this is a theme,
Something something like “They subclassed a dict. Because they might need to add some functionality to it later. You know what? You can just do that later!” Same with scaling problems. This won’t scale, but we’ll worry about that later. And then when we worry about that, we will know by measurement whether our shiny new cloud machines need to be RAM-optimized or CPU-optimized or whether they need to be cheap-as-possible-but-ten-times-as-many-of-them. Whereas if you up-front this cost you literally are making all of your scaling decisions based on zero data and hunches.
Re: If it's a nice problem to have, don't solve it now
#38I deleted my older comment. For many "nice problems to have" I really disagree. A nice problem to have can be a real problem. It's nice you are in that situation but it's still a problem. Your site offline because of demand is a nice problem to have. It's absolutely one to solve right now.
They are discussing nice problems to have relative to the status quo , so problems that are really only potential problems right now, but could become actual problems if good things happened. So I think even with the rewrite, your comment misses the mark. OTOH, I think that it's still a bit wrong to say don't solve them now: if you have a problem that is potentially a business-ending disaster that you won't have time…
> nice problems to have relative to the status quo, so problems that are really only potential problems right now, but could become actual problems if good things happened
But that's not what this very common phrase means.
What they want to say is "nice to haves".
Re: If it's a nice problem to have, don't solve it now
#39Earlier quoted context omitted.
They are discussing nice problems to have relative to the status quo , so problems that are really only potential problems right now, but could become actual problems if good things happened. So I think even with the rewrite, your comment misses the mark. OTOH, I think that it's still a bit wrong to say don't solve them now: if you have a problem that is potentially a business-ending disaster that you won't have time…
Yeah, your first paragraph is spot on. It's pretty much exactly what I was going to reply to IanCal. Instead I'll just +1 it. On your second paragraph, 100% agreed. This is really just a useful prioritization heuristic, not a rule, and in some cases other considerations should and will override it. It's mainly useful just to deliberately and routinely check that instinct to go deep on whatever you're working on when…
"Is this feature important, or a nice to have" is the question they want, not "is this problem nice to have?".
Re: If it's a nice problem to have, don't solve it now
#40It's a TERRIBLE problem to have not addressed in advance because now you're loosing money and people may wander off.
almost everything folks call "a nice problem to have" is not really "nice". It's frequently business hurting and sometimes business killing.