Well there is a lot more features in the FPC today than there was some time ago, BUT... the old way of doing things is still around and many people actually prefer it.
For example, many people used Pascal 10 or 20 years ago or even longer, and if they want to get back into it, you still can program like its 1998. Simultaneously there are a lot of old Pascal codebases, written in TP or older Delphi versions, which can be ported to FPC easily. And either they have to run in old modes to be backwards compatible, so new Features are not possible, but also it is generally not a good idea to mix coding styles within a codebase.
So all of that old information is often far from outdated, it still has a lot of value. That said, whats missing is some resources about new programming styles and paradigms. Generics, advanced records with operator overloading, management operators, etc. allow for a lot of very interesting stuff.
I myself spend vast amounts of my free time just trial and erroring around what new things are possible by now and there are now completely new ways to write your code
But I often feel like that it's hard to communicate these concepts because they are just not that well understood, because a lot of people still program, out of necessaty or habit, still like its the early 2000s and Delphi 7 just came out.
But I think it's not just resources, it's also often times that the RTL, FCL and LCL are still quite tailored to the "old" style of doing things. There is some change in that, I have contributed some of the things I built over the years myself, but when you look into many of the FCL or RTL packages the function headers often say dates starting with 200X.
I just looked at fpjson, because for some reason that was the first unit that came to my mind when thinking about fcl, and it was written in 2007. Sure the unit works and is certainly usable but if I'd redesign the unit with modern Pascal from the ground up, I would do a lot of things certainly different. E.g. you could use reference counted COM interfaces with operator overloading to have transparent conversion between base types and json data. Use TNullable with it's upack, getordefault and co method instead of the dozens of overloads with default and find methods, etc.
Code could be as simple as:
json := [
Pair('Key1', 'Value1'),
Pair('Key2', 3.14),
Pair('Key3', [
42,
'Hello World',
[
Pair('Subkey1', True)
]
])
]
Instead of
json := TJsonObject.Create;
json.Add('Key1', 'Value1');
json.Add('Key2', 3.14);
jsonArray := TJsonArray.Create;
jsonArray.Add(42);
jsonArray.Add('Hello World');
subObject := TJsonObject.Create;
subObject.Add('Subkey1', True);
jsonArray.Add(subObject);
json.add('Key3', jsonArray);