Small Teams
stevepulec.com
stevepulec.com
I also find it really sad that a lot of the small teams who are on the road to success get distracted by applying "best practices" that were built for big teams (e.g. Google uses kubernetes, we should too).
I think it’s interesting because while I personally don’t like the Craigslist UX, I have no objection to using it anyway (even if might I try other solutions first). They provide enough other value to me, and the UX is good enough, that I still have an overall positive impression of the service.
I also find it interesting because the debatability of their UX is really very surface level. There are all kinds of things I wish were different, but that’s mostly because it was perfectly fine in 200* and hasn’t much changed with the times beyond a few utilitarian niceties.
I’m sure this is way overly specific to CL as a reply, but your comment about UX focus resonates with me, and I’ve long found Craigslist’s lasting success fascinating in this light.
Modern UI/UX zeitgeist is driven in large part by the web and mobile, which are driven by the "attention economy". The defining aspect of attention economy is that it makes money on friction. The longer it takes you to accomplish your goals, the more opportunities there is to display you ads, or upsell you something, or tire you out and make you more susceptible to be funneled to where the vendor wants you to be. The major design guidelines and UI frameworks are written and provided by advertising companies, and are focused on controlling the interaction, not empowering users. In this environment, ergonomics and good experience - meaning a tool that helps users achieve what they want as fast as possible, and gets out of the way otherwise - is actively discouraged.
So aesthetics comes into building their own distinctive "brand" (as opposed to the brand of the client/company they are currently working for). That's not to say they won't justify their design in terms of what the client needs, it just pushes them away from using "boring" aesthetics - for example, pushing for a trendy-looking design for a backend admin dashboard that would have been just as usable (and cheaper) to build with a bog-standard Bootstrap theme.
This isn't to blame designers, that's just the economic reality of the business.
Totally. It takes some experience and maturity to be confident enough to resist the big business “best” practices. That, or a very intuitive entrepreneur
Frame this quote on the wall beside the monitor, things will magically (simply?) improve.
[1] <rant>poetry doesn’t understand that when I ` poetry add foo` I don’t want the latest version, I want the latest version that is compatible with the rest of my declared dependencies, especially my declared Python version</rant>
IIRC, the command was
$ poetry add foo most recent \
which fits this crowd most decentBasically, don't optimize for standards you'll never actually need. If you're writing say, a webapp that at most is expected to serve maybe 100 to 200 users from a single deployment, you don't need a full blown serverless stack with half a dozen microservices to handle all your requests, just get a decent VPS, configure both nginx and the server workers properly and consider caching the database heavy requests using say, memcached.
Throw in a round-robin of multiple deployments "as needed" and unless you're hitting "big social media company" levels of traffic and you can scale up to pretty insane degrees.
"Feature creep" in a small company is a sign of flailing around trying to capture a market. Sometimes a whole new feature is developed under pressure from Sales to land a big whale client, or a desperate CEO who thinks runaway success is just that one key feature away.
In a big company feature creep may be the result of a corporate culture that doles out promotions and bonuses for building shiny new things rather than the boring work of maintaining old things. Google is a good example of this, only with entire new services rather than features.
Either way feature creep is symptomatic of deeper problems with a company, regardless of size.
OKR
Obviously most small teams don't generate that much value. There are a lot of tiny podcasters out there. Nobody is going to mistakenly think that all small teams are Joe Rogan. But it is nevertheless possible for a small team to be absurdly productive given the right conditions - success isn't about team size, it is about the opportunity and available skillset.
FWIW, politics is very similar. One person can't achieve very much, but a small group can wield devastating levels of power.
If you fall off a ship in the middle of the ocean you might survive and those survivors may have had strategies but we just don’t know if the people that died did not have the same strategies. Same goes for this list I’d think.
So listing examples proves that it's possible for a small team to achieve a huge success. It doesn't prove that a small team is more likely to achieve success than a bigger one.
They quite likely do have strategies. People with successful strategies are vastly over-represented in pools of survivors. Hence the bias. The pool of survivors is skewed towards successful strategies, and does not represent the population of people who attempted the thing.
The bias would be noting that survivors used a range of clever strategies and then making tools available to support those strategies in an attempt to help people at sea. Survivorship bias is about noting that of course the survivors did things that worked, and to get better outcomes we need to focus on people using strategies that aren't represented when sampling from the pool of survivors.
This also holds for project management practices such as Scrum.
I'm sure - even though I'm not particularly smart - I could get a simple k8s solution up and running in a week with the help of a YouTube video.
What happens six months in when I hit some critical k8s related issue and I lack the basic understanding of where to even begin to debug and fix it? For example I may introduce a serious security issue in a CI pipeline or whatever just due to inexperience and unfamiliarity.
I'm not saying Kubernetes (or for that matter, microservices) is the wrong pick for a small 3-person team. You know your own business better than I or anyone else and I'm sure you made the right choice. But personally I would be cautious about adopting a core production technology where my experience consists of one week and a YouTube tutorial.
As long as your k8s is some self contained island of code needing no R/W access to resources on k8s, maybe I'll believe it's easy to setup AND to support. Additionally if you are in some type of small shop environment where you have basically unfettered permissions in AWS console to do what you need, doubly so.
Now try to get access to/from RDS, S3, EFS, Netapp NFS, some HTTP endpoint on-prem, some other HTTP endpoint on EC2, non-MSK Kafka, cross account, etc? Pain.
Oh you need to submit a ticket to your Linux sysadmins, Infra team, CloudOps, DevOps, Networking or Infosec for each of the above permissions? And sometimes need 2-3 of those teams to coordinate to make it happen? Death.
The system needs permission for AWS S3? Here is the component. Does it need to setup secrets? Here is the component. Does it needs to be in the same VPC as a Redshift cluster, or whatnot? There's a component for that. Do you need a SQS/RDS/Redis service? You get it.
K8s, terraform and Atlantis have been such huge enablers I cannot overstate. Everything is so nimble and cheaply setup that our current infra bill is about 500USD/month to generate over 100k MRR for the company.
And better yet, we rarely ever think of our infra unless we want to do something brand new (such as testing Sagemaker), or there's unexpected traffic above our current scaling limits (about once a year). Plus, if we need to fix anything infra related there's an internal cookbook for that.
I also feel I have acquired useful skills by learning all of this.
Instead zero happy paths get defined in a timely manner, everything you are trying to do is hamstrung and waiting in the CloudOps queue, and you can't self-serve around them because you cannot do it yourself due to permissions.
Imagine an org where "the happy path for RDS will be ready in 2-3 months, and only support one database type and 3 instance sizes" is somehow acceptable. Rinse & repeat for an alphabet soup of 25 other AWS services.
Unfortunately when these slow moving medium/big firms then move into the cloud, they re-invent all the opacity, inertia, and other issues that they had solved onprem already. Some think they can just replace 25 DC ops people with 2 cloudOps and somehow its going to all just work out.
> we rarely ever think of our infra unless we want to do something brand new
That just means your infra is stable. It would be exactly the same without terraform/k8s.
To be fair, it's over a year old, and probably the state of the art and best practices have advanced to the point where many of these are unlikely to happen. But in general, Kubernetes is widely considered a very big complex thing full of footguns for the unwary for a reason.
So while I agree with you that sure, you can get up and running by watching some videos and copy-pasting a few YAML files, the problem is when you are deep into critical production and you run into issues (the classic "I get woken up at 3am by an alert or my boss and we need to fix this in 10 minutes") and you lack the deeper understanding of the framework to even know where to start.
Or even worse, you insert an insidious security issue through a misconfiguration and you are not even aware you have been owned. Security is notoriously difficult to get right, even for people with experience in frameworks and systems, let alone a newbie. Kubernetes is not "secure by default" and again, there are footguns for the unwary:
https://snyk.io/learn/kubernetes-security/
None of these things make Kubernetes bad, per se, and I'm sure the benefits outweigh the costs. But personally I would be cautious about adopting it for serious production without having some solid real-world experience first.
There's a bigger question here as well, regarding small teams (as in startups, not just pizza teams in a tech giant). Where do you want your very limited time and focus to be? If I'm building some SAAS application I want to put my coding focus close to 100% towards the business model. If that model requires me learning new tech then fine, but otherwise it's a case of "use what you know", because new tech that isn't focused on that is going to waste my precious time and resources down the line.
That will scale a small number of containerized services just as readily as kubernetes and will have a lot less moving parts.
Where a more robust container orchestration system shines is when you have many disparate teams deploying disparate workloads and need to encode conventions around things like networking, service discovery and security policies.
As for health probes, I worked with load balancers in the late 90s that could use endpoint health checks so I’m not sure what you mean.
Regarding the endpoint health probes, I agree that’s possible if you have an app with a call that’s lightweight and representative enough to be used for that. But again, we are already deviating from the “pretty simple” solution here as well.
And we didn’t even start talking about how to make the Load Balancer highly available…
That said. I agree that the solution you’ve mentioned is a feasible one, I just don’t think that it’s way simpler than k8s if you truly have more demanding scalability and availability requirements.
Would it save more if you did not choose microservices, but wrote a monolith (for purposes of deployment) neatly divided into modules (for purposes of architecture and splitting the work)?
I'm not assuming positive answers. But I know that current hardware is absurdly performant, and you can serve a surprising number of real users from a $60/mo instance, plus some database.
(Managing monoliths via k8s is a thing though, and it works reasonably well.)
Principal-agent problem, i.e. conflicting goals. Sometimes it's the team vs. company, sometimes it's the team or a person against themselves. There are choices that are most beneficial for the current project, and there are choices that are most beneficial for one's career after the current project, and/or choices that are most interesting to the person.
So e.g. Kubernetes may be a total overkill for most things anyone does, but if I get around to doing some side project where Kubernetes would be a fit, even if rather poor, you can bet I'll at least try to use it, because it's highly likely I'll encounter it later at my current or future job. Now, this is just my side project, but then, many (most?) widely-used FLOSS software started as someone's side project.
And the same reasoning happens in companies big and small, as failing to keep your skills fresh is a recipe for trouble sooner or later, and the industry-standard approach to software developers' growth is "figure it out on your own, we're paying you for labor, not for your professional growth".
Would you recommend this strategy to a non-niche / broad category B2C product? It would feel instinctive to just get it out there and leverage every opportunity there is to market it, within the budget.
Don't forget to take care of your folks and yourself, friend.
all other companies are listed in 10s of Mil in Annual rev (sometimes one spike) or acquired for billions (which implies rev in 100s of mel).
craigslist is the gold standard of this category.
There may be many advantages to small teams and yes there are cases where they have wild financial success, but in general these may just be outliers. Are these outliers because they have the secret sauce worth emulating? Maybe, and maybe their stories will show why they succeeded where so many failed. Success is rarely all luck, but we’ll likely also invent myths around their exceptionalism as we tend to do. Not the type of exceptionalism which precludes the rest of us from having a similar shot of course, but one about cleverness and grit or other characteristics we can fairly easily attribute to ourselves.
Everyone likes a good narrative, I suppose. And narratives about scrappy small teams achieving success meritoriously are more attractive than ones about how the massive organizations usually tend to eat them for lunch (despite having their own types of problems) or ones about the frequencies with which the scrappy teams fail. Cherry-picking data points is the key to any good narrative.
Big stuff is slow by nature. Lots of moving parts.
Same thing happened with "small schools perform better" so they got funded. But turns out it's possible for them to perform terribly for the same reason it is for them to perform well.
And reason(s) would be?
AFAIK only variance changes with sample size.
Otherwise statistics would be quite useless in general as I understand it.
Say in the general population 10% are excellent. If I look at 10 randomly selected people I expect that one of them is excellent. If I look at 10 000 people should I really expect that more than 1 000 are excellent? That claim does not make sense to me.
The post only suggests this if you ignore the word "Joint" before the word "probability".
Otherwise, you seem to be arguing that the probability of getting "all heads" would be identical when flipping two coins as when flipping 100.
In fact in any sample the distribution of "excellent, average, and terrible" will be more or less the same. Namely more or less like the distribution in the general population. (Otherwise we can stop looking at statistics in general as they would be worthless).
The probability for the most unlikely event (namely a result that is maximally far away form the expected one) may be a little bit greater given smaller sample sizes (a result of broader variance), but this is irrelevant as the probability for such outcome is in almost any case infinitesimally small.
Looking at the verges of a distribution to draw conclusions is misleading, imho. You need to look at the middle of the curve as there are the most likely outcomes of some selection.
So, if I put some random people in a group the most likely outcome is that the ratio of excellent people to others is similar to the ratio of excellent people to other in the general population. This is the most likely outcome, independent of sample size.
The problem is when you get a few degrees of separation, at that point the original signal is mostly lost and you will get the same kind of people as everyone else who uses the same hiring bar as you.
If you pick only "the best" people by hand you could create a team with only excellent members of any size.
All the statistical arguments become mot in such a scenario!
You would get a team of only excellent people with a guarantied probability of 1, at any sample size.
On the other hand for a small team, lets say 10 people, you could go back and pick the 10 best people you have worked with in your life. That will be a good team if you actually tries to get good people instead of people you like. That doesn't scale, other people will take people they like and quality suffers, it always happens at scale, but an individual kan make better choices.
But it also doesn't work for smaller teams, because people are people.
Now we're back to my previous argument: The probability to get a team of only excellent (or terrible) people is near zero in reality independent of team size.
Everything put together finally invalidates the original:
> > Same thing happened with "small schools perform better" so they got funded. But turns out it's possible for them to perform terribly for the same reason it is for them to perform well.
> Joint probability all members are either all excellent or all terrible is higher when the number of people is smaller.
Trying to approach this conclusion by statistics just doesn't work as we see.
But the non stochastic arguments why small teams are always in advantage, which I presented in my other post, hold.
For small teams it's 0.1%. For large teams it's 0.001%.
Both are near zero. But one is 100 times more likely than the other.
And what explains the change in variance as sample size changes?
I guess it depends on what you call success. Most businesses are mom and pop businesses that generate enough revenue to pay their employees the market rate in the long run. And I’m including tech businesses.
Most flourishing economies in the world are composed essentially of small successful and sustainable businesses.
To me, that is success.
I know that a lot of people here live in the SV echo chamber (nothing pejorative, we all live in an echo chamber) but in fact being big is the exception, not the norm.
I’d even argue that most "rich/comfortable" people in the world are not tech founders but are just at the head of 0 to 10 employees businesses. I’d guess they call this success.
You can just go look at Steam indie games. Those are all small teams. They are mostly all failures.
The median small team on Steam generates $4,000 in lifetime revenue. 2/3rds never cross $10,000 in lifetime revenue. Only the top 10% even cross $200,000. Which is more like "barely paid salaries" rather than some kind of F-U money.
The number of small teams on indie games that come anywhere close to the success of big teams on AAA games is minuscule.
a book i always recommend is https://www.amazon.com/Million-Dollar-One-Person-Business-Gr...
It just seems too scary to me...
Too often the team size is a proxy for how successful an entrepreneur is. Although I’m not a fan of the solo entrepreneur/ build in public fad, there is a lot of merit to starting with one or two and only adding great people to the team when needed.
And I think entrepreneurs overweight their indicators for when more people are needed to continue scaling. A business can usually continue scaling by refining processes and building or buying better support and tooling software.
Small teams can do amazing things with the right force multipliers (eg software). But some epic-scale projects also require epic amounts of staff.
Really I think the success is down to how well managed a team is and how focussed they are on productivity.
It's much easier to manage a small team because there's just fewer lines of communication and places for problems to hide.
The larger the team the more you are going to have to organise work if only to distribute it to members. It's easy to fall into the trap of thinking that management activity itself is productivity but it's not.
It's necessary but it's just admin. A bit like single vs multi-threading.
You should do as much admin as needed but no more.
It's impossible to efficiently communicate in a big team.
Also it's impossible to efficiently lead a big team.
Big organizations are like slime molds. They by principle can't be as effective as small teams.
https://komoroske.com/slime-mold/
(This was submitted to HN at least 3 times but didn't get much love so I'm not linking the few comments).
Ironically, one of the primary goals for a US startup I worked for recently was to rapidly increase the team size to show how successful they were to investors and potential customers.
Main thing that comes out of it is "focus". Focus starts to dissipate the larger the team. I don't think focus will guarantee you success (you could be focused on the wrong thing) but I don't think you can be successful without it.
Small teams afford agility and avoid feature creep. Fewer overhead to alter or change the projection of a project away from its intended targets.
Large teams suffer from feature creep because you introduce non-development talent pursuing concepts under the umbrella term of product design. You only need two to three product design people no more. But the second you get convinced into more product design folk they'll be shelling out feature requests that then put teams in feature creep which really blocks engineering goals and architectural planning for major systems. Usually better if doubles as an engineer and product designer because from my experience product designers who don't understand how their systems work are air bags.
Warning: long.
Things get markedly worse when you jump from 3 levels of the hierarchy to 4 and get middle managers reporting to middle managers.
The whole thing is worth reading, though.