I’ve seen quite a lot after being in the game for over ten years. Enterprise environments, startups that need to learn what they’re doing, consultancy firms that don’t care about clients’ problems but instead worry about doing things as complex as possible so they’re needed for maintenance, startups that know what they’re doing and move very fast, blockchain startups.
Now, I can look back on those ten years of history and say there were many challenging moments, hard work, meetings, overtime, etc. It sounds doom and gloom, but someone can make it easier; stick until the end.
But the way I see things now is straightforward. I have experience with various technologies/programming languages, and I can suggest what to work with because it will be easy to use.
I know for a fact, for instance, that if I pick Ruby to develop something, my life will be hard. No matter how much experience I have. I’m not good at correctly typing or remembering things, conventions, or rules.
If Ruby is chosen, then there are instantly 100 footguns loaded and ready in every file. It is a dynamically typed language; you can only know it will usually work when you write tons of tests (nobody ever does, anyway). I worked in a large-scale Ruby shop, and I can state with a clear conscience that most people who know Ruby don’t know many other languages. The production application was full of errors related to dynamic typing, even though the culture was to write many tests.
Someone in the forum said we should add static typing with Ruby. And clueless people responded to that suggestion with, “What problems would static typing solve?”. So clearly, the community has a lot to learn.
If I use Rust, I will not have such problems. I will have higher compilation times, which is fine, but I know what I coded will usually work the first time. Nowadays, I can write a few hundred lines of Rust code, which usually works the first time. When I write tests, I don’t need to test trivial things, like whether this endpoint returns X; I only focus on testing complex logic. With Ruby, I would have to do both.
TypeScript is a little better than Ruby, but you must use
any type sometimes, where your program is dynamically typed. I have no choice in Rust; types must be correct from the get-go. And I could roast the other languages and technologies that made my life hard.
How can I make my life easy, then? You avoid all the things that make your life hard.
For instance, working with infrastructure, I now prefer NixOS to have a reproducible way to provision machines. There are hardcore fans of Debian, which, in my humble opinion, are stuck in the past and can’t offer real solutions to the problem of “how to make package manager not corrupt my operating system?”. It is the same with CentOS, which has now switched to Alma or Rocky Linux, which, as far as I’m concerned, are the exact inferior solutions that would make my life hard. So I avoid that.
Or databases, for example. I worked on a project where CTO decided it would be a good idea to use etcd to store the customer data… A service that should be used for storing infrastructure configurations. If I use Postgres, I’ll have a predictable and easy life. I also had experience with MongoDB, and it can’t even use multiple indexes for a query like Postgres could. We were stuck on a project because, on the one hand, we wanted to avoid adding complex composite indexes; on the other hand, MongoDB can use only one index per query.
Take filesystems. I learned about ZFS only a few years ago and thought, “What was I doing in my life?”. This filesystem is much better than XFS/EXT4/NTFS and allows me not to worry about data corruption, compression, backups, and storage expansion; performance is also excellent.
So, long story short, if you get many battle scars along the way of your software engineering journey, you have various experiences, and then you finally arrive at conclusions on what will bring you the least pain.
Our industry now suffers from a huge problem – a lack of judgment for poor technology. Why are there so few posts that judge technology to be inferior? Everyone tries to be politically correct, meaning anyone can create vaporware software, advertise it, get users, and have no backlash because a typical software engineer will just say, “But this software is appropriate in this, and it is a good technology for this specific use case.” Trust me, I’ve seen databases that are worse in every regard than the Postgres option, from benchmarks to tooling to ease of operation. Yet their forums are full of users asking how to use it. I would call that database a misunderstanding of the engineering world.
I know people who spend 20 years in a bank doing Java with the most overengineered patterns imaginable. I couldn’t take Java for a year when I was starting; I had to look for something better. You can’t have a good perspective if all you’ve done is Java for 20 years, considering what is available and how things should be done.
So there are two choices for new developers fresh out of university.
My advice to you if you don’t mind software engineering being complex and you like to learn on your own (like I did):
- Do not stay at one company for a long time; once you feel comfy with a technology stack, leave to find something else
- Always be applying and looking at your career options
But, if you’re starting and want to make your life easier and benefit from the years of experience of a seasoned dev:
- Find a mentor or few who you could ask questions, follow and listen to them. Just one or two seasoned developers you trust and who went through it the hard way
And that is the only way a new developer can make their lives easier. Any other way will be a complicated way of avoiding mines all over the software engineering industry.