Ask HN: What is the ideal developer experience in 2020?

108 points by asim ↗ HN
Today software development looks pretty fragmented and complex depending on what angle you're coming at it from. I've spent the past decade building web apps, distributed systems, infrastructure and all sorts. My feeling is that as a developer there is still so much that stands in my way getting from some local piece of software to something that runs and scales in "production". I'm starting to rethink this from first principles and curious to know what others deem as the ideal developer experience for 2020.

Share your thoughts!

91 comments

[ 4.5 ms ] story [ 157 ms ] thread
Project requirements that have a clear definition of done and do not change every other day.
Or... Projects requirements that have a clear definition of outcome and change ever other day based on data.
Or... any project requirements that are clear.
Or ... project requirements.

Yes, it still happens.

Management: we need a program to do X.

Me: OK, gimme specifics.

Management: To the bike shed!

While it is "fragmented" nowadays, many one of these branches are larger than the mainstream 10-15 years back, especially when it comes to learning resources and tooling. There has never been a better moment to learn or do programming than now IMHO.

In the same way, something hacked together by your average developer now is a lot more stable than some "production" run 10-15 years ago, even if it's just because of the quality of the infrastructure that exists.

I was aspiring to skill up my JavaScript this year and after a few hundred hours have ended up pretty demoralised, realising that the amount of learning required to be a good JS dev in 2020 (at least where I am working atm) seems enormous, and to be frank I'm too old to be wanting to put in evenings and weekends merely to remain competitive. As a consequence I suspect I may well seek to switch back into support, presales or consultancy, all of which I've done in previous roles, and which seem to be somewhat less competitive than straight dev but still rewarding and reasonably remunerated. Overall my feeling is that unless you're pretty rockstar-ish the cost/benefit of being a dev just simply doesn't pay off in 2020, at least here in the UK.
I contribute to an open source project written in C# that was previously windows-only. When dotnet core came out, I led the effort to port the project to Linux, using Emacs and omnisharp-roslyn which offers intellisense-style code completion via company-mode.

Emacs+C#+omnisharp is pretty darn close to my ideal development experience. My Emacs config is not particularly long nor particularly involved, and in fact one could replicate my C# setup with less than 10 lines of config code.

Highly recommend.

What's the project?
would you share a gist to you emacs config ? maybe even a medium article about your setup ?.....
Careful what you wish for development in the 70's, 80's and the beginning of the 90's was fragmented and we had a wealth of systems and languages to dive into and explore. Then Windows dominated the desktop, Linux ate the server world and Java went on to dominate most non-system level software development. It went from a great time to be a developer to an extremely mundane task. Today we have captured some of that back, but it is not like it was. Fragmentation also means choices and choices to explore.
Look at Symbolics Genera and be sad nothing similar exists today, 30 years later.
Agreed the typical environment is horrible. Seems to be the best way is to try to work on something really high level or low level. IE use some framework like RoR to solve business problems, or a low level library to do something interesting. It feels like everyone should be doing front end, back end, k8s, ML at the same time but its just asking to fail.
There's a time and place for a full-stack developer like you mention, but I feel like there's an expectation that they should also be a hyperproductive 10X developer then.

I've seen and worked with people that have that ability, but in practice you see that they're going too fast and miss things like documentation, testing, or even basic architecture.

I mean yeah great that you could knock out some microservices, but they're undocumented nodejs services with a postgres database that communicate with each other using REST / JSON and there's nothing in the way of tracing or logging or status monitoring yet. Why not start with a monolith first in a sane language?

But by the time that question had come up, the guy already moved on to something better paying, lol.

For me, PHP is still ideal developer experience, even after a decade of working with it.

The language has evolved tastefully without breaking away from the past in drastic(pythonic) ways. Frameworks like Laravel still continue to evolve in a rapid pace than its contemporaries in other languages, bringing in support for every new advancement like webpack, OAuth, etc.

Text editor support is also rapidly accelerating with LSP as a part of the core runtime. PHPStorm is still a beast of an IDE. Composer is in many ways an ideal package manager, a cross between the ease of bundler and local package scoping of npm.

The runtime evolves at a rapid pace, with performance improvements in every release and the upcoming JIT.

Most importantly, the development and deployment story of PHP is still easy as ever. Unlike other modern stacks that require arcane version manager, virtual environments, docker layers, etc, the LAMP stack is still the one script environment creator that requires nothing more than a working Linux distro. The WAMP one click installer still works on Windows without any Subsystems.

* Editor support for every language you use:

Syntax highlighting. Look up documentation at callsite. Jump to definition. Run a test from the editor. Debug executables from within the editor. Fuzzy find file by name (for instance, typing "pluginfancymixi" should turn up something at "project/Plugins/third_party/username/project_name/fancy_mixin.language"). Third-party plugin support. Ability to have per-repo configurations

* Searching code:

Should be faster than grepping a bunch of directories. Supports wildcard searching. Bonus: tooling support for finding identifiers, callsites, usages, etc

* Development environment:

Any executable or test can run in one step (zero if possible). If possible, should be able to run multiple instances of your app at once. For example, I should be able to leave a webserver running so that my code reviewer can test it without pulling the branch

* Team environment:

Small PRs. Quick reviews. Tuned balance between senior and junior engineers. Should have enough senior engineers that they don't feel overwhelmed by the mentorship+training part of their job.

Edited: formatting

I don’t know about you guys, but .NET Core (c#) and Visual Studio along with Blazor on the front end and deploying on Linux is pretty darn cool and highly productive. I haven’t had much success getting as productive on Python, Golang, or Node. Blazor eats TypeScript for lunch. Sometimes people confuse complexity for productivity. You can’t tell me installing 60,000 NPM packages just to have one dependency break is your idea of fun.
Are people really using Blazor in production? What does your build pipeline look like? What dependencies/frameworks are you using?
Yup. For a large desktop LOB app. Had to reinvent a few wheels because Blazor is so young (have high hopes to open source some of that). Build automation is a lot simpler for desktop-world. We do wish the framework and community were more mature, but are nevertheless very pleased with our decision.
I'm also highly interested in any other information about your setup!
How does blazor deal with the situation if one client accidentally or maliciously triggers code that eats up CPU?
.NET + visual studio + r# is the godlike stack. Haven't tried blazor yet but even asp.net is years ahead of the node ecosystem.
I'd say .NET Core with Jetbrains Rider is even better. :)
JS dev here, I'd just like to say that the final sentence is just plain wrong at this point. Package locks are a thing and I don't actually remember the last time my project broke without myself having been behind the change that did it. My setup is actually pretty stable so new packages are pretty much never added either.
I've got used to the fact that outsiders aren't ever up to date with whatever is happening on the front-end.
Nobody ever seems to remark on how most UIs these days manage to be incredibly complex compared to how often they crash. Whereas if you look at older software or OS GUIs, the simplicity is astounding while still having more crashes. The point being that despite the bad rap that frontend dev gets, it’s actually made progress on the UI development front that is pretty much unrecognized.
I tried out Blazor when it first came out. I really liked it! But at the time it wasn't quite production ready. Has that changed?
So I guess I should stop doing everything else and adopt a brand new M$ tech that totally blows out of the water what M$ offered a few years ago, which M$ said totally blows out of the water what M$ offered before that.

Got it.

It isn’t 1999 on Slashdot anymore. Using a dollar sign on a site dedicated to an ecosystem surrounding venture capital and all its friends just makes you look hilariously out of touch.

Yeah, poo on Microsoft for being a successful capitalist entity, said the community of people who work for, want to work for, or find a living supporting FAANG or the advertising and VC ecosystem propping it up.

I am super excited to try out Blazor as well. I believe its the basis of the Azure web platform frontend so anyone can try it out just by signing up to the free tier. For me, I'm looking at rapid web ui prototyping. The ability to deliver a native-feeling web experience to a client in mere hours ;)
I totally agree with you, but production deployments are terrible. The confusing way to handle secrets and environment variables, the lack of a standard database migration tool that is not tied to EF, the lack of a good standard integration layer with nginx... it's just a pain if you don't have a dedicated devops team.
Yeah that’s always been the big weakness in my experience. MS does offer a great developer experience but the deployment experience is still a long way behind Java and Go. Slowly moving in the right direction but windows containers are still a 2nd class citizen for example.
Oh and don’t forget Microsoft will probably sunset your chosen framework (such as WPF) and the 3rd party OSS ecosystem is much smaller. Oh and round here dotnet roles pay less, the final nail in the coffin for my MS dev experience!
I strongly believe that .NET Core/C# + VS2019 is easily the best option for productively shipping business features right now.

We also just started working with Blazor in production. There are still some rough edges in my opinion, but the conceptual model is very powerful. We currently use it in a limited internal system w/ server-side hosting model.

I do not think Blazor is an ideal technology for hosting netflix-scale applications, but for those highly-interactive/evented interfaces that you use for various business administration duties and expose to 10-10000 users, it's absolutely perfect. Being able to directly call C# business logic and subscribe to CLR events from your view logic is much more empowering than being forced to suck JSON through a straw, hoping client/server contracts are still lined up, and praying that all your complex XHR/websocket logic is pristine regarding error conditions and retries. Also, absolutely no NPM bullshit is required. I don't even have NodeJS installed on my machine anymore. All the javascript you will ever need can probably fit in a single static file. Our JS blazor interop shim is ~120 lines and it handles some incredibly complex client-side duties (get client rect for positioning elements server-side, subscribing and unsubscribing to events, etc).

I really like my current technology stack which combines stable technology (Java, Spring, Postgres) with some modern cloud-native touches like Spring Boot, Docker and Kubernetes.

Basically any new project (unless requirements show that it needs something else but 90% is OK) starts out as a Java or Kotlin Spring Boot project with a Postgres database. This is super easy to setup locally, provides most things out of the box and the Java/Maven ecosystem has stable libraries for everything else.

When it's time to deploy this I package the project as a Docker container, write a Kubernetes yml config and I'm good to go on most cloud providers.

I focus mostly on making sure there is as little difference as possible between me clicking "Run" in the IDE, and the packaged project running in Docker. Usually the only differences are ENV variables for configuring database and other dependant services.

I found it useful to match dev OS with prod OS... for example, if prod is running Debian-based distro, write code in Debian-based distro. Also encountered a lot of horror stories upgrading macOS to Catalina... that is lost productivity.
Ideal experience:

1. I write code in an editor, it auto lints and formats to standards of project.

2. On save, whatever is needed to build and test is automatically run.

3. After repeat 1-2 and ready, commit code and create pull request.

4. On commit, integration tests run and one-off environment to smoke test is created.

5. On accepted review and merged, auto deploy to production or next release.

For me what I've been moving closer towards and is almost my reality for projects I have full control over:

* Node.js on backend, using a thin db layer (not an orm) like sequelize. My newer projects also use TypeScript on back end and share models with front end with a lerna setup

* React.js with TypeScript (default create-react-app setup) on frontend; multiple smaller apps for each business unit/functional area; some limited sharing of UI components between these apps (turns out not that much needs to be shared really)

* Everything in a mono repo and edited in VS.Code

* Deploy by building apps, gzipping backend and frontend into one tarball, then either:

- Ask my "release person" to copy it into the Windows server drive for test or production

- Run my own "release script" that scp's it to my Digital Ocean droplet and tells pm2 to restart the production application

My projects email me when something crashes in the back end and I run sentry.io to see what's gone wrong in the front end.

Why I find this to be a great developer experience:

* Simplicity. One language, easy to share things like e.g. validation between FE and BE, minimal cognitive burden when context switching; small apps = simple code; simple release system means I can get new features or bug fixes to users extremely fast with minimal fuss

* No CI pipelines or DevOps time sinks: this is effective because I'm a single developer; I also work on projects where a solid CI pipeline and infra as code adds value, but these things can also slow you down too

=====

In other words, what I feel makes me effective is using a modern language and ecosystem, but deploy it with methods from 10-15 years ago. :)

This was engaging to read. Thanks for sharing. I'm curious how you handle down time when you are restarting your servers?

What happens if a client is interacting with the app at that very moment?

I often consult other teams in my company on technical issues and architecture. Coming from this background I always wish the following would be covered:

- The project should start up with one click or one command. It's fine if I need to configure credentials or something similar, but beyond that, your project should be so easy to start that your mom could do it. If the project requires me to locally install a database, configure ports, or anything of the like, that's a shining red flag that things are very wrong.

- The underlying architecture and rationale should be documented and this document should be reasonably up to date. Whoever is the lead developer on the project should be responsible for this. Not all details need to be covered, but the main principles and the driving business requirements behind it need to be clearly stated and up to date. If there's no broad documentation, I consider the project to already be off the rails, not just heading that way.

- There should be a concept of testing. You don't need to have tests yet, especially if you're still prototyping, but you need to have a very clear idea of what you will test, how, and how you'll get there.

- Formatting isn't a discussion point. Whatever stylistic preferences there are are covered by linting and automatic formatting. If I clone the project, it should be reasonably hard for me to do things the wrong way and fairly easy to do them the right way.

- Branch management, code review, etc. All of this falls in the same pot for me, no one should have the ability to push directly to master, all changes need to go through review, pass lint, tests, etc before they can be merged. Doesn't matter if you're the lead dev or a summer intern.

You'll notice that all of the above are procedural issues, not code specific issues. I firmly believe that by nailing the underlying process first, you make it easy to build good software and hard to build bad software.

For the first point how would you handle software that needs a database of some sort? Or are you saying the project ought to include an install script that handles dependencies?
Not OP, but I've used containers to run temporary local databases for development.

If you're also packaging your application as a container you can use container orchestration tools like `docker-compose` to compile your app and up a local dev environment with all your external dependencies with a single command (eg `docker-compose up`).

Ive typically done this with Vagrant (virtual machines) + ansible but docker seems to be the new hotness. However a vm is what i run in prod so keeping docker out is one less tool
> If the project requires me to locally install a database, configure ports, or anything of the like, that's a shining red flag that things are very wrong

I disagree here slightly. I think it's reasonable that a database setup may be necessary, especially if abstraction layers (ie. ORMs) aren't being used for SQL, and SQLite is not your database of choice. Sure, you could set up docker, but not every project adopts or even likes docker.

Perhaps the point here is that it shouldn't be necessary to separately configure a database from the command used to fire up the project. For example using Docker w/ docker-compose, a single command should be able to get most projects up and running with all of the required system dependencies included (database, etc).
I also have a small caveat. If you have a docker setup or a similar style of setup, if it is not obvious how to do this by hand, then you should write documentation on how to do it. Honestly, my standard is that you should have the same level of setup instructions as you would expect from a good open source project of the same complexity.
One project I've recently come across that illustrate a lot of what you're talking about is the Reaction e-Commerce framework: https://reactioncommerce.com/

The thing is so over-engineered that they had to do a makefile that clones the project for you. And I don't know what they're doing, but the thing is unusable on a Mac (it's supposedly related to filesystem operations in Docker -- why are you doing so many?).

I could go on and on. I spent 2 days trying to make this work properly, but in the end I decided that if I need to do a Web store, I'll go with something else.

Also evaluated Reaction ~9 months ago and came to the same conclusion. A React/Node eCommerce framework sounds like an interesting possibility but this project looks like a hot mess.

  If the project requires me to locally install a database, configure ports, or anything of the like, that's a shining red flag that things are very wrong
Backend project? you need to provide a docker-compose setup. Not just for the database, also for any other service like Redis, ElasticSearch, etc. If you're expecting PRs, you'll also need a good database unit test suit, preferably running something like Sqlite.

Frontend? ideally you'll provide the API setup like before, but I'll settle for a dev env online.

This depends on the goal of the creator, whether it be a developer or a company. If they are selling a hosted version of the product, their incentive is to make the self hosting experience as bad as possible to incentivize potential customers to buy their product.
The one click start up point makes a lot of sense for Frontend developers! Auto installing a DB in the same command you use to run the app is pretty dumb though. What if I just want to point my instance at staging for testing? Now I have to have docker installed
Not ideal. But I am using more "cloud native" tooling. Cloud Shell, Cloud Build, Cloud Run on GCP. Spinnaker mapped to the production managed kubernetes cluster. Automation. Speed. Ease. Instant revision control. I think you give up a modicum of control for the convenience. But the cognitive load is gone. You are free to concentrate on app design. Cloud native is becoming standard. And for that reason its worth exploring. There is a nice developer-conscious feature in GCP where you can configure a cluster manually using the platform's web interface. But it also emits the CLI and REST API code snippet for your own reference ;)
For me personally, the most important aspect of the developer experience is that infrastructure is taken care of. If I need to solve infra problems, I'm not developing and not happy.

I currently work on a project where infra is a complete mess, but another developer on my team takes care of everything, including setting up our own clandestine k8 cluster to work around the unreasonable limitations of the system we're supposed to be working on. I love him. The downside is that we're not compliant with all the rules we're supposed to comply with, but there's no way for us to comply and still do anything, so I'm happy we're doing stuff.

In an ideal situation, an infra team would take care of all of this for us and ensure it's easy for us to be compliant while still getting stuff done.

Beyond that, the ideal would be a unix-based shell, my preferred IDE (IntelliJ), the ability to install the dev tools I need, proper version control, clear, concise descriptions of what to implement, my own input on what and how to implement, and access to stakeholders/end-users.

Because it is hard and always will be. The same with drawing an owl, draw big circle, draw small circle on top of that ... then draw the rest of fucking owl.

There is so much more detail on each layer of a system that there is no way you can just write piece of code and put it to production.

Ideal situation would be if developer can just write code hand it over to test people to check then to ops people who can scale it and secure it. But we all know how it ends up. So even more ideal would be when you write code upload it to the cloud and it just works. But we know it going to cost loads of money.

If there is no silver bullet, try to carve out a little niche for yourself where you mastered own tools and stick to i.

It has been a long time since I've done any web development, but I've done almost everything else, and I've converged on preferring C# in Visual Studio. Why?

- typechecked, but the types get out of the way; "var" and intellisense fill them in for you. It also shows you what types the function arguments should be and autosuggests objects of those types

- functional when you want, but not when you don't: LINQ et al, interlinkage with F# if you want to get really functional, now immutable record types. Lambdas.

- wordy enough that you can see context, but Intellisense means not having to type it out

- smart refactoring (paid-for Resharper)

- debugger when you need it: run test case. Wait to hit exception or breakpoint on failed assertion. Inspect values. It's often immediately obvious where the problem was.

- CPU and memory profilers readily available and well integrated.

- standardised on Nunit with Nsubstitute for testing: bit wordy, but with a bit of thought we're now hitting 100% line coverage on wholly new code.

- portable ish binaries with Mono

- package management system is mature. (Wart: packages are at the "project" rather than "solution" level in VS, so you need to do extra work to ensure they're all the same version)

The only real downside is the build system (MSBuild) is pretty poor, badly documented, and not easy to use for other things than C#.

For the future? "Software components" have never quite delivered. Package management is clearly the frontier here.

Language interoperability is another: it's still astonishingly hard to combine languages within a single software artefact unless they're C and C++ or similar things that produce platform-native binaries. Proliferation of language runtimes makes this worse, not better. On the other hand, the two frontrunner runtimes of C# and Java both have problematic owners.

(comment deleted)
> Language interoperability is another: it's still astonishingly hard to combine languages within a single software artefact unless they're C and C++ or similar things that produce platform-native binaries.

Earlier, you mentioned F#. How easy is it to combine C# and F#?

Both languages run on the CLR, compiling to the same set of bytecode. The enables cross-language interop - one of the original promises of .NET. By targeting the Common Language Specification (CLS) they can communicate. The best way to get them to communicate is to use the CLSCompliant attribute, set to true, which generates warnings on non-compliant code so it can be fixed. Here's more detail:

https://docs.microsoft.com/en-us/dotnet/standard/language-in...

That details the C# point of view (a little VB too) and here's an SO post on how to add the CLSCompliant attribute to F#:

https://stackoverflow.com/questions/21028833/writing-cls-com...

I remember these concepts being very important in the early days of .NET because companies had heavy investments in legacy code, including COM, C, C++, other .NET languages (various forms of interop) and needed integration and/or upgrade migration paths. Language interop came into play because some companies thought (not taking an opinion here) it might be a good idea for developers to use the language of their choice.

They change a lot in the build system in recent years and completely confuse people
The things that make up my ideal developer experience are actually non-technical and can by summed up as "a sense of urgency but without cutting corners".
there is still so much that stands in my way

My experience is that technology has never stood in my way. It may be inconvenient, but I always find a way to work with it.

The thing that has always been in my way is other people. Always.

For me:

1. A boss who has a clue. Who has actually built software deployed to production at least once. Who understands the customer's business. Who manages things and leads people, not the other way around. Who gives me my assignments, the resources I'll need, and leaves me alone.

2. Project managers who know how to run projects.

3. Business analysts who know how to conduct analysis.

4. The decision to either go agile or not. No more sprints, stand-ups, scrum masters, product owners, retrospectives, etc, etc, etc, unless we do it completely and do it right.

5. Anyone, anywhere who writes something, anything down. No more, "Don't you remember when Sue asked Michael and he got Fred to tell us in that skype?" (My answer is always, "No.")

6. Any environment where I spend 90% of my time programming and 10% on overhead, not the other way around.

7. Authority to go along with my responsibility. I'm tired hitting every deadline and forced to wait weeks (or months!) for Peer Review, Code Review, Design Review, Standards Review, User Acceptance Testing, Integration Testing, Quality Review (against what standard?), Steering Committee approval, Leadership approval, approval from God herself...

8. A minimal acceptable competence level for my teammates, achieved by proper vetting (including tech interviews and tests). Software development is achieved as fast as the weakest link, not the strongest one.

9. No meetings!!! If it isn't written down, it isn't. If it is written down, you probably don't need to meet.

I could go one all day, but I'm late for a meeting. :-(

You have to be able prototype fast and that’s nodejs + react . For better performance and still fast dev cycle it could be golang. Golang also for anything related to kubernetes

rust, c++ For some high performance Python might be good to know just because so many DS things are written in those languages. Scala/java/c# for something robust but verbose e.g. fintech It’s really depends on industry.

I like React, but this is the first time I've heard it described as a fast-prototyping framework.

I believe the Rails guys would be optimizing the SEO and conducting A/B tests by the time I finished deciding whether or not to use a state library.

"Rethinking from first principles" and "reinventing the wheel" are pretty easy to conflate. Proceed with caution.

My recommendation is to choose boring technologies that are widely deployed so that people will have to support them for decades to come. If there isn't a mature, well-supported option in a space, it's better to roll your own than to spend a bunch of time learning a technology and writing code, and then have to relearn and rewrite in 2 years when that technology is no longer supported. The bigger and more complex something is, the more you should let it get boring before you commit to it.

Here's what I'm using:

* Django

* Django REST Framework

* Celery

* React/React DOM

* ImmerJS

* Postgres

* Redis

* Nginx

For the most part, if it's not on this list, I try not to use it. There are other libraries I'm using, but nothing I would recommend.

There are a lot of things I hate about Django. But it's a boring technology and that outweighs the other concerns. It works and I have no doubts that it will continue to work well.

The one thing on this list that's not a "boring" technology is ImmerJS. This is not a complex technology, so I'm a bit less worried about adding it to my stack. And it allows me to avoid the global state that Redux or similar tools force you into[1]. If a better solution emerges, I don't think switching from Immer will be very difficult, and if Immer loses support, I don't think there will be much difficulty in continuing to use it.

[1] Yes, I understand how reducers work. If you don't understand that reducers are a way of pulling out one part of global state, you do not understand how reducers work. Sure, reducers make using global state less painful, but introducing complex tools to deal with problems created by your other complex tools is not a good strategy.

Most people who rethink for first principles actually reinvent the wheel. Once in a while, someone doesn't, and they change the world. It's worth the exercise, even if the odds of success are rather low.
In the context of the question being asked, I don't think this makes sense. You're not going to change the world by switching to some new framework.
Looking at this list from the perspective of a career programmer who spends most of their time writing small utilities in Python - this is horrifying. 8 moving parts spread across different organizations is an "ideal user experience"? I'm once again glad I don't work in web dev.
I am a very occasional programmer. I maintain several different projects for my business; sometimes not working on them for six months or a year.

I've learned to actively loathe getting started on a new feature for one of my sites. The typical process starts by trying to make a simple change to the codebase, only to learn that some tool needs updating (who knows why), but only after digging around for half an hour trying to figure out why something simple doesn't work. I then try to update the tool, but the update doesn't work, because something else has changed on my dev machine, making the update incompatible. After trying to update everything for a couple of hours, I sometimes manage to get the development environment working again, at which time I actually start coding. Sometimes I just give up and try again in a couple of months.

In the good old days, I would just open a code editor and edit a PHP file, then upload via FTP.

If only it were that simple now. My ideal developer experience would be to simply be able to open my computer and start coding – even if I hadn't worked on a project in a few years.

Something like Github Codespaces[1] but self-hosted would be interesting. I'm sure you can cobble something together now but it would be nice not to have to deal with the infrastructure (i.e. containers, remote hosts, VPCs, whatever).

[1] https://github.com/features/codespaces

This is a really great question, thanks for starting this discussion!

Based on my experiences, here are some ideas regarding a hypothetical ideal developer environment - some technical, some cultural:

- A supportive and responsive team who help each other to get valuable features developed, deployed and maintained

- Thoughtfully-written test coverage that allows for code evolution, while providing reassurance that changes are correct

- Local, test and production environments where deployed code behaves identically or near-identically

- Languages and API documentation that are accessible, expressive and composable while remaining straightforward to reason about

- Development, deployment and operational tools that lend themselves well to automation so that frustrating and error-prone manual tasks can be reduced

- Rapid notifications regarding problems encountered by users -- ideally only occuring infrequently, thanks to high code quality, and implemented in a user-privacy-preserving way (to avoid developer anxiety regarding imagined or real lack of organizational respect for users)

- Code review (for various social and educational reasons, as well as improvement of code quality)

- Human product feedback, in terms of quality assurance and also genuine user feedback

- A high-motivation and low-pressurization work setting -- with a sense that the delivered software is genuinely providing a net benefit and is able to anticipate and respond to harms and ideally prevent them in future

- The time and team approval to investigate bugs and contribute the discovered fixes upstream outside the organization

It also strikes me while writing this that software may be considered easier and/or more comfortable than other careers.

While it's good to strive to find further improvements, it's worth pushing for other employers (and perhaps industries?) to do the same.

My latest side project I've been doing on glitch.com using node.js, React Hooks, and theme-ui.

I miss my Vim bindings, and I wasted a little bit of time trying to get HMR to work with parcel, but other than that it really feels like the tools mostly just get out of the way and let me build my idea, and when I'm done coding I think I'll be happy to just leave it on glitch. (I paid for "boosted apps").