I'm a Linux guy since way back when I stopped getting paid good money to fix windows issues and write code for windows customers. Worse yet, I'm a perl guy when it comes to high level languages and C or C++ would just take too many keystrokes.
I do try to write perl as though it were C, and make it readable, is all I can use as a defense...well, and there's CPAN. I use C or the relaxed version of C++ that arduinos, teensys, ESP xxxx, and so forth use, as those are often single-purpose machines with one goal in life - do something well, and on time (kind of like the linux philosophy without linux, I know).
I use NGINX exclusively, whether on a big box or a raspberry pi, when I need a web server inside the LAN (which is all of them so far). If you have to learn one of the two big ones, it's the easier one, and it's faster.
I use MySQL (yes, I hate Oracle too...) again, it's fast, it's free, and it's good enough. I note there are more or less plug-in replacements for most machines, but maybe not so much for raspberry pies, which is one place I use it.
I use VirtualBox when necessary, if for no other reason than to have a windows around so as to reverse engineer protocols for devices with crappy windows-only code. I still don't like Oracle.
I cobble together hacks from other people's code in their languages of choice, even if they make me throw up in my mouth a little. If Adafruit has a nice python library for something weird on a pi, after all, I can just use Inline::Python in perl and use it.
Similar issues with raspi cam web software - they use C, javascript, php and gawd knows what else, but actually command that mess via linux FIFO files (which are actually named things like FIFO!), so if I need remote control and don't have time to re-write the wheel, maybe I just share that FIFO via Samba and write into it from elsewhere. And there's always shell, which I don't like but speak/read enough of to get by. I might use Samba to share crucial files and directories to do things like that, and gack - hardcode the names to identify the guilty. So you can take these examples and use them, but likely you'd have to do some sysadmin and renaming in the code itself and elsewhere to make it work for you. This is more "one way it can work" than "this is how everyone should do it for mass consumption". It's the difference between code I call "research grade" which you run to get the answer, maybe only once or on one system, and "production grade" which is supposed to work for everyone no matter how brain dead they are - I usually don't have time to hew to that quality level, and wouldn't you know it, if you do, the very next version of whatever opsys or IDE invalidates your automatic install code, changes your dependencies and so on - and I don't have time to support the planet on this stuff - I just need it for me. I will even avoid going to the latest opsys if it might mean breaking a bunch of this kind of interacting code and sysadmin work.
People new to linux, which at one time was me too - are often messed up by the fact that often you can spend hours googling things, find endless answers that aren't right for the current version or your problem, and then when you find the answer it's a simple one or few word edit in some config file (this is somewhat the case for windows as well, only using the MSDN dox). To help with my own sanity, I plan to backup some of those (usually but not always found in /etc) here too, as an amazing fraction of what has made all the fusor stuff play nice together is actually just configuration setups - I'm at heart a programmer, not a sysadmin, but one does what needs to be done to get 'er done before one's expiration date arrives.
IN general I'm using this board a lot to just backup things that worked for me - it's a nice offsite backup, and the format lends itself well to the "what was the guy thinking" kind of posting that is often even more helpful than the inline comments, which I do attempt to put in my code when they won't be too distracting.
Rule one when looking at my code: search for @@@. I put that somewhere in any comment on code that's either dodgy, surprising, bad practice but I cheated...that kind of thing. If you have a problem...it's likely there.
I deliberately do some bad practices, or at least they would be if "great mind didn't run in the same track" - stuff that would be poison on a team project, like "overuse of global variables". Which if one doesn't know what's valid when, one might write code that clobbers them at bad times and create "funny action at a distance". But hey, it's just me, it saves time (both mine and the computer's) and as the old saying goes "show me your data and I won't need to see your flowcharts" so keeping it all up front isn't always a bad thing, particularly if the names are good (I try, but...).