Today I saw a post by another member of this community also asking for help on spec for development system(an Apple device)[2]. The poster will be using the system for web, mobile and ML development. Looking at the spec that is listed in that post, I thought to myself, "Am I the outlier who always looks for low-spec systems both for development and test systems?"
How do you all decide on what spec your development and test platforms should have? Do you always go for high spec devices and platforms?
[0] https://news.ycombinator.com/item?id=28916747
[1] https://news.ycombinator.com/item?id=28903262
[2] https://news.ycombinator.com/item?id=28921836
Is it for the masses or a deeply engaged targeted niche?
If you build for say VR then you are probably going high end for now till it or if it becomes a commodity.
Many developeres have succeeded going mass market like Whatsapp (even building Java ME and Symbian apps in addition to Android and iPhone) to others just targeting high end iPhones.
Your target market determines your specs.
For development, you are usually running a lot of stuff in addition to your system. You might want the ability to host multiple copies of your system for integration / regression testing. You might use a heavy IDE. You might be someone who switches between multiple projects. You could be a person who keeps hundreds of tabs open (although it sounds like you are not!).
The best choice is whatever you feel is most productive, for you. Conventional reasoning is that the choice which maximises the value of your time is the most powerful system you can afford that meets your portability requirements. If you need to experience the system as if it were on a less powerful machine you can use CPU and memory throttled docker containers or virtual machines.
If constraints boost creativity for you, then go for it. Personally I would not mandate weak hardware for everyone on a team, you want to let people keep their own workflows.
IMHO a better approach than weak development systems is performance testing in CI on resource constrained targets. This is going to be more consistent over time (as you upgrade your systems) and scales better for teams.
You do usually want some test systems which are representative of the minimum hardware spec you expect your users to have.
However, on the note of dev laptop power, I believe that when you're starting out, going for cost effectiveness is key. You learn useful skills because your laptop is underpowered. I can confidently say my skills around process management and profiling are above average because of how I used an eMachines Atom processor netbook for nearly 7 years before moving onto a mid-range laptop (Dell Vostro i3).
I use a Dell G5 SE and a ThinkPad P15s (setting this up tomorrow) now, and I'm fairly happy with their power. I still have an Intel i5 5th Gen desktop, which runs quite well even today. I want to upgrade it, and when I do, it'll be for a threadripper or at least a Ryzen 9.
That is not to say that I don't try to write performant code. At work, we test our apps on a Google Compute VM that offers just 2 GB RAM, and I need to ensure that my applications scale horizontally and not vertically. At the same time, at home, I'm using a Raspberry Pi 4 bramble running k3s to run my code. I have to ensure that whatever I write works on it. Getting things to run on ARM has been a journey without ever having an M1 Mac.
I believe that once you're fairly confident in your skills, you should get a performant machine if you can afford it. Boot speeds and the processor save you a lot of time. However, if you are the sort to let your development machine change the way you code, then you have other problems. Irrespective of what machine you use, you should be writing efficient code. I tell a lot of new software developers to still learn C because of how it teaches you memory management. Even if you never write c ever again. Thinking about memory, and how your code is using - or misusing - memory, is a first principle. You should be thinking in first principles anyway.
I would venture a guess that nearly any actual laptop out there (not tablets/chromebook/netbook) by any manufacturer can be used to do web app development or mobile development. There may be specific OS/toolkits required to do some of that, like for iOS or whatever. Those toolkits may require higher specs in some cases.
Developers that feel they need to run clusters of VM's, etc. locally probably should be doing those types of tasks in the cloud that they are going to be using. Laptop horsepower also has limits and if you work on a minimal budget then maybe a PC tower is more cost effective to run clusters of things than the cloud. The WorksOnMyMachine™ approach only goes so far.
On the other hand, I want a solid chassis, preferably metal, a screen with adequate color resolution and excellent viewing angle, and a keyboard I like.
I feel lucky that when I recently bought this laptop, I was able to get exactly what I want; a product line that Dell was moving away from (an "old" XPS as they were pushing a "new" XPS), not overendowed with RAM or a huge SSD (I replaced it from the previous system anyhow) or more CPU than I need, but it had the top-of-the-line screen (more than I wanted), and it all came in for a reasonable price point. Even the week after I ordered this, it was gone off the website. It wouldn't bother most people but it would have been a minimum of $400 more for me to find another "XPS" that fit my needs because I'd have had to spend more on the CPU/RAM.
If you want to develop with a "low spec" machine, may I suggest that if you are using Linux, you can make yourself a low-spec machine? You can go (at least on the machines I've been on) go into the cpufreq portion of /sys and configure your machine to lock itself to its slowest speeds. You can use cgroups to run a certain program in an environment where it is restricted with what access to RAM it can have. There are ways of slowing the network down and even injecting faults (if you're feeling very spicy), which you can probably attached to the cgroup and/or program itself. Probably with a bit of work you could find some way to slow the disk down if you wanted too.
A bit of scripting and you can turn it on and off at will. You can develop with a nice machine and get the productivity benefits while testing in a low spec environment at will.
This may be possible in Windows but may require a crap ton more poking into the bowels of the system.
It's certainly better than the alternative of me just cursing out my computer all day long for being slow.