There are plenty of examples of basic Dockerfile based builds out there, but a production application requires a bunch of different things, such as reproducibility, hardening, health checks, static analysis - and ideally still be quick to build.
Using Git on macOS is largely a positive experience, other than (in my opinion) the out of the box experience with merge tools. With my recent merge to Homebrew Cask you can use p4merge with no extra work.
Modern containerised 12 factor applications are expected to derive their configuration from environment variables. While Spring Boot does import its common properties from environment variables, sometimes you need to interpolate several variables together, e.g. to form a URL.
Spring MVC abstracts the Java servlet container implementation away from you almost completely, this allows you to migrate from Tomcat quite easily.
It’s pretty common when doing Java development to need mutiple versions installed alongside each other. With Brew and Jenv, switching Java versions between projects becomes easy.
I was recently given the task of modernising a simple internal site’s front-end. It was built using plain hand-written HTML, CSS and JavaScript, with all layouts being done using HTML tables.
One part of doing C++ the right way is using automatic variables for everything you possibly can. However at some point in your C++ endeavours, you’re likely to be using a C API of some sort, with explicit method calls to manage lifecycles, which can make this more difficult. My work at Canonical has involved talking to lots of these sorts of APIs, many of them based on GNOME’s Glib. To make life easier, I have created a set of easy to use wrappers to manage the lifecycle Glib and GObject objects.