Whilst I ostensibly agree with the sentiment of the linked page, my personal experience is very different - my suspicion is due to the different technologies at play
I enjoy building little SaaS side hustles that one day (I can dream) might make me a couple of grand, but I don’t enjoy writing 20+ CRUD controllers, with matching validation, and HTML forms. I’m probably a bit neurospicy, and I have a young family, but before LLMs came along I might “finish” one SaaS every couple of years. I’ve been able to complete 3 so far this year. It’s a wild uptick in productivity.
I’m well aware of the dangers that come with it too, but having been in the mines churning out this code for the last couple of decades I feel well versed in what to prompt for, just as I would with a keen yet naive junior engineer. I’d also argue that LLMs are much better at enforcing a particular style on the code base.
I feel strongly that with an opinionated framework, in a relatively simple language, solving repetitive simple problems - you’ll have a great time with LLMs and you’ll be more productive than ever.
The problems arise when we delegate jobs like writing READMEs or tests (the boring stuff, right?) without really getting into the weeds.
I think it's fair to say that CRUD apps are in a different category to low level systems programming. The former are never particularly difficult to reason about unless they are written poorly, the latter are rarely easy to understand off the bat unless they are extremely written well.
Whilst I dont want to defend the relatively low compensation for public-sector jobs in the UK, it is more nuanced than just salary.
In this case, it was actually a salary of £50,550 - £57,500, so total compensation of around £75k (circa $95k), as the pension scheme is in the order of 30% of your salary. Then there's the usual US vs UK medical cover and vacation allowances.
It's still a way off, but the gap is smaller than you think when you crunch all of the other benefits into a single number.
From the CTO of the Data Communications Company (the organisation behind smart meter infrastructure in the UK):
> Our second-generation meter solution is primarily based on the 3G network which has commitments through to 2033 based on our current contract, so this service remains mainly unaffected for the next 11 years.
I read somewhere that electricity meters are switching to a scheme where they do low speed data transmission over the power cables and the data is collected at each substation. Gas uses plastic pipes now so I guess they are stuck with the phone network.
I'm currently using Laravel at work. It's very opinionated, and some folks say it uses anti-patterns with regards to its use of facades. That being said my last job was C#/.Net and I am so much more productive with Laravel. It really allows you to develop quickly and I haven't yet bitten by any of the "anti-patterns". If you give it a shot I'd recommend just using Laravel Sail as, if you already have docker installed, you can have a full dev environment setup in less than 10 minutes.
It is and it isn't. It does opinionated ways of doing things. But IMO what makes it so great is just how easy it is to opt out of the opinions you don't like. Facades are an excellent example of this: don't want to use them? Well, you don't have to (and IMO a really big app that may be a good choice - in a small app it likely won't matter and you might as well use them).
Although at a high level many of things things are subjective, this take is almost entirely wrong in every dimension.
Anti-patterns are things like using a wrong data structure, using the wrong levels of abstractions, tightly coupling components so they are not composable, leaky interfaces, god objects doing too much
The strict definitions of many of these can be subjective at the edges, but they all objectively exist and cause fragility, instability, inflexibility and maintenance problems in the systems built from them.
Clean code is code that’s easy to read, has the right level of abstractions, uses the right data structures and has the minimal possible anti-patterns in them (ideally zero!) above.
Calling these things bogus is unfair, I grant they can be subjective in some places but they are prevalent in poorly designed systems especially by junior engineers.
Anti patterns are real. Clean code is real. If you cannot see that, I would suggest reading a lot more codebases from open source projects (pick medium and large codebases, not trivial programs) and after 10 or so you will see obvious structural and quality differences, as well as hundreds of anti patterns and examples of clean code.
I'll agree with everything here except the clean code. Clean code is about optimizing human perception and there can't be a standard for that because humans think in a wide variety of ways and it's further impacted by the level of understanding the human already has on the subject matter the code is dealing with. One person's "clean code" can be another person's nightmare.
I'll back this up with the example of Magento 1. It's a PHP e-commerce platform that has (at first glance) some of the cleanest code you'll ever see in PHP. It looked like the entire development team had come from a Java background. Every component was neatly divided into a PHP object with documented private and public methods. There was a clean MVC separation, with lots of shared behavior abstracted into "Helpers", and a Theme system handling the rendering of the front-end. I have no doubt that the authors of Magento prided themselves on how clean their code was. For them, having spent full-time careers structuring all the many features of their platform into these files, it probably did feel like a clean organization. And when I initially reviewed the code to evaluate using Magento, I also thought it was clean and was part of my choice to use it.
The problem was that when you take something as complex as a full-featured e-commerce system and modularize it so thoroughly, you end up with a literal 7000 classes, and it becomes impossible to figure out the sequence of execution of a single page request through that massive tangle. Is it "clean code" if I have to add debugging print statements to 57 source files to figure out the path of execution that renders a single page?
If I had to choose a circle of hell where I would edit Cyrus IMAP (the worst C code ever) for the rest of eternity, or edit Magento for the rest of eternity, I think I would actually choose Cyrus.
> Anti-patterns are things like using a wrong data structure
What is a "wrong data structure"? Is it wrong to do linear scans when hash access would be sufficient?
> ... using the wrong levels of abstractions
When is the abstraction level wrong? I can name you at least 10 projects that avoid so called anti-patterns by introducing unecessary abstractions. Is something really an anti-pattern if it's "solution" massively reduces your development velocity but now everything is nicely composable?
In my opinion, anti-patterns are either obvious (constantly using different names for the same thing) or totally subjective to the context (when to repeat yourself).
But maybe I'm not able to put myself into the shoes of novices and a lot of things seem obvious to me. Granted.
I've seen people use multiple named arrays, search for something in the first array, then use its index to find matching data in the other arrays, instead of a dictionary of string:tuple.
Another example is languages with arrays and vectors, usually one or the other is preferred. In Go you can use arrays but you're supposed to use slices whenever possible, while the opposite would be appropriate in, say, C.
Not the OP, but clean code misses the point. Its is very subjective and depends on one person's previous experience and patterns they've been exposed to.
"Reasonably readable" is what I strive for nowadays, and a key aspect is that I no longer think there is an objective measure for it. It depends on the team/company you're in, and its important to keep in mind that the goal is to effectively communicate the program to them.
You don't want an alert to check the cert is still valid, that's how you get outages. It's an alert to check cert has at least 2 weeks or more life left in it! (So it either fires ideally before you leave for that long vacation, or so that you can still take care of it when you get back.)
Imagine if http APIs has similar output to lsof or df -h - nobody would write a script to use them! JSON makes a lot of sense, but a human-parseable format is also needed.
In case one, human readable formats are obviously preferable. But the moment you need to script a command, you want it in a machine readable format.
A perfect example of the differences between the two are how badly spaces in file names are handled. Granted POSIX deserve a lot of the blame here too.
I enjoy building little SaaS side hustles that one day (I can dream) might make me a couple of grand, but I don’t enjoy writing 20+ CRUD controllers, with matching validation, and HTML forms. I’m probably a bit neurospicy, and I have a young family, but before LLMs came along I might “finish” one SaaS every couple of years. I’ve been able to complete 3 so far this year. It’s a wild uptick in productivity.
I’m well aware of the dangers that come with it too, but having been in the mines churning out this code for the last couple of decades I feel well versed in what to prompt for, just as I would with a keen yet naive junior engineer. I’d also argue that LLMs are much better at enforcing a particular style on the code base. I feel strongly that with an opinionated framework, in a relatively simple language, solving repetitive simple problems - you’ll have a great time with LLMs and you’ll be more productive than ever.
The problems arise when we delegate jobs like writing READMEs or tests (the boring stuff, right?) without really getting into the weeds.