My development stack
Too much code to write and too little time to spare? I was facing the same problem in my work and hobby projects. Here I list tools and some practices I use to minimize development costs and maximize value of my work.
Linux
Linux is fully scriptable, which is an invaluable feature for developers. Microsoft's stack is predatory towards users and it kills startups, which I believe extends to other businesses and opensource projects.
- Gnome Boxes can sandbox heavy IDEs. It is a joy to use compared to VirtualBox.
- Flatpak is a more efficient sandbox for IDEs with Wayland support, particularly Eclipse.
- Docker is my current sandbox for command-line tools. Eyeing Podman.
- Python Fire is excellent for building personal script libraries.
Java
There's no perfect programming language. There are several competing priorities: expressiveness, safety, performance, library ecosystem, IDEs, and tools. Contemporary contenders are mainly Java, Rust, C#, Python, JavaScript, and Go. Of these, Java provides the best tradeoff for the kind of projects I work on.
Newer versions of Java are better in expressiveness while older ones have better IDE and tool support. I am using Java 17+ for apps and Java 11 for libraries.
- Eclipse is quite unstable and buggy, but it's still the most convenient IDE, mostly thanks to lightweight sandboxing in Flatpak. IntelliJ IDEA looks nice, but it does not support Wayland yet.
- Maven is the easiest way to publish opensource libraries to Maven Central.
- Of all the utility libraries, I mostly use Apache Commons, Guava, StreamEx, fastutil, and Kryo.
- JUnit tests are way cleaner with Hamcrest, Mockito, and Awaitility.
- SLF4j is the current standard for logging. It pairs naturally with Logback, but in server apps, I prefer to bridge it to log4j, which has better journald appender.
- My NoException removes a lot of checked exception boilerplate.
Web
While java alone can support complex application logic, there is no use for it without user interface. Desktop apps are dead and smartphone apps will die too. Web is the future. I couldn't find Java web frameworks that would be sufficiently productive, so I decided to roll my own:
- PushMode is pure server-side RIA framework that streams HTML to the client. UI events are streamed back to the server. I find this approach way cleaner than React + REST.
- Hookless is a reactive framework, mainly used in PushMode. Reactive programming is a cleaner alternative to event-driven programming.
I am also using a number of standard tools.
- HTML, CSS, and SVG, of course. Eyeing Less and Sass.
- Jetty is a fairly lightweight web server
that can be embedded, so that the app has standard
main()
method. - Jakarta EE is a monster, but its servlets and REST annotations are a neat way to build REST APIs when needed. I prefer OpenAPI for REST API documentation.
- Unofficial Google Analytics API for Java allows me to use GA server-side in PushMode and to anonymize all data before it is sent to GA.
- There are lots of other useful web libraries and tools: jsitemapgenerator, schemaorg-java, RealFaviconGenerator, Highlight.java, ...
I have two additional libraries, PMSite and PMData, which define standard website structure. Both are somewhat messy and ripe for cleanup.
Servers
Web is the future of application distribution and web apps need servers to run on. While servers were traditionally off-limits for developers, small-time DevOps skills are now valued and empowering.
- Python can be used to develop quite complex server setup scripts. Some of them run on admin's computer and some directly on the server. Notable packages include fire, requests, sh, and pykeepass.
- Vultr is cheap and it has an API. Eyeing Scaleway. I don't use containers inside VMs, but I do create user accounts for application services.
- Many server requirements can be satisfied with proper use of standard tools: systemd, ufw, ntpd.
- Nginx is a bit aged but still good reverse proxy. HAProxy can be used to redirect traffic to another server. Certbot rotates TLS certificates from Let's Encrypt. Eyeing Caddy to replace all of these.
- Route 53 has neat API for manipulating DNS records.
- I am not so good at storage. I am currently using S3 for files (encrypted with gpg if necessary) and Redis (via Lettuce and stunnel) as reactive database.
- Servers require a lot of monitoring. I am using UptimeRobot, Papertrail (via journald and syslog-ng, eyeing Fluentd), Prometheus (via Micrometer, with alerts), Grafana, and LinkChecker.