Feeling stuck after 3 years in backend. what are the core fundamentals I should know by now?(Seniors, help needed)
Posted by JajEnkan3pe@reddit | ExperiencedDevs | View on Reddit | 47 comments
I’ve been working as a backend dev for about 3 years now, and lately it’s hitting me that I don’t really know the real backend fundamentals.
Most of my work so far has been pretty basic, integrating third party services, wiring up APIs, that kind of stuff. Recently I was talking to a friend who mentioned he was working on things like marshalling/unmarshalling, dealing with buffers, streams, etc., and I realized I have no clue about most of that.
It honestly made me a bit uncomfortable because I don’t want to just stay stuck doing what I do now forever. I want to actually understand how things work under the hood.
For those of you who’ve been doing backend for a while:
- What are the key topics or fundamentals every backend dev should really understand?
- What kind of issues do you deal at work?
- And what would you do next if you were me?
Would really appreciate any advice or a rough roadmap. I’d like to start working on this instead of just feeling bad about where I’m at.
Thanks in advance.
Nutasaurus-Rex@reddit
The stuff you’re referring to is backend development, but I wouldn’t say that’s senior stuff lol. It’s stuff an experienced backend developer could pick up and implement in a day of research. Understanding how to create flexible, normalized data structures, and scalable systems is what separates the good from the average
borktron@reddit
vs
Professional opportunities to dig into the guts of things aren't super-common, since most of the time there's some high-level library that will take care of the details. But it pays off to at least have a rough idea what's going on underneath. So, your instinct is healthy here.
My advice: study some protocols that are older than you are. Start with HTTP. Then look at SMTP and how multipart MIME messages work. Then maybe think about IRC. Write little toy clients/servers. This stuff has the advantage of being ancient, well-documented, and has tons of examples to study. They're also relatively simple, sometimes surprisingly so.
For example: write a really simple toy cURL that just does GET requests to plain HTTP, but implement the HTTP stuff yourself, use sockets.
This pattern - take a library you understand, and figure out how it works - is useful any time you want to "go deeper".
JajEnkan3pe@reddit (OP)
This kind of resource was what I was looking for. WIll use AI to understand the context and try implementing. Thank you.
borktron@reddit
One other suggestion, and kind of a tangent: learn just enough C to be barely dangerous.
This is a big generational thing I see between (roughly) Gen X and Millennials in our field. My sense is that Gen X got a lot more exposure to C in university than later generations did. C sits at this relatively approachable level of abstraction where the hardware is still "tangible", but there's enough abstraction that you can get your head around it in a reasonably short amount of time. Having to deal with allocating and freeing memory, understanding pointers, little optimizations with bit-shifting, etc.
You don't need to master this stuff (unless you want to get into embedded, or kernel dev, or whatever). But, even a vague sense of things can improve your intuition about the platforms you're building on.
If I had to pick a benchmark, it might be Smashing the stack for fun and profit (PDF warning). Learn enough C (and enough about the fundamentals of how CPUs/Memory/Software works) that you can follow what's going on in that paper, and you've probably learned some things that will pay dividends throughout your career.
It can pay off for decades after you've forgotten most of the details. I haven't written C in anger in about 20 years, but I still feel that being exposed to that low-level stuff in my late teens/early twenties continues to give me an edge over a lot of my peers.
improbablywronghere@reddit
You can also approach them within the context you understand by looking into the docs or the tools you are currently using. Shove your config for whatever tools do the underlying fancy stuff you want to learn about into chat gpt and ask it to explain it line by line. Then talk to it about how you guys use it and see if you can’t find some small like 1 line config change PR that improves your workflow. Then you can say you did that but really you’re gaining a ton of experience in this process!
borktron@reddit
That's a thing I didn't even think of, but it's a good point: these things are so old and covered in literature that LLMs can probably be a great learning tool. Just resist the urge to let it code for you!
JajEnkan3pe@reddit (OP)
Will do. Thank you so much for the advice and I learnt my lesson to not use ai to code for me.
Lost a job interview as one round was just raw coding. Was the best I got yet and it still hurts but I learnt my lesson lol.
UntestedMethod@reddit
Yes, and beyond AI, I would recommend reading some of the actual RFCs to get a feel for the way things are formally defined, understand the lingo, discover surprising little details about various protocols, things like that.
If you really want to go beyond the surface level, RFCs and other standards documents really are where it's at.
LuckyHedgehog@reddit
To build on that advice, when prompting an LLM to explain some code, don't copy/paste the code in. Try to translate in your own words or as a boiled down example with what you're struggling to understand
This is a form of Rubber Duck debugging (or learning) because it makes you think and conceptualize the problem in a different way that often times leads you to answer your own questions. You'll understand the concepts better than just getting an answer spit out at you
syed_9808@reddit
That is so awesome advice. I'm using Claude for stuff and everytime I ask it not to implement the feature, it still does so. So when you said, Don't let it code for you, is the key while letting it help you understand
mazdanewb123@reddit
Senior Software Engineer here. Agree with this guy. I think this stuff is lost for many younger devs. I spent a lot of time doing exactly this before i started studying at uni.
maxip89@reddit
Core Competences as a senior:
- Able to control your emotions
- Able to learn new stuff
- Able to indepedent from marketing see value or not
- Able to teach stuff other developers
- Able to speak to non-technical people and explain their the problem
- Able to explain the WHY in everything you do.
- See people as time saver instead of competing career colleagues. In other words, you see them as your n-th hand to programme.
When you getting high and higher, technical stuff is no more that important. You just need to learn to adapt, and to yourself led by some emotions.
sweaterpawsss@reddit
You'll never know everything, and I think it's ok to have a high-level understanding of these things until you actually need more detail to solve a real problem (it's hard to learn the real nitty-gritty stuff without a concrete problem to apply it to anyway).
To take the topics you mentioned as examples, probably this is about as much as you need to know off the top of your head until proven otherwise:
Marshalling/Unmarshalling--this is just about how you encode data structures as binary data to send over a network connection, and reconstruct them on the other end (IE, the data is converted to a "serialized" byte representation as opposed to a potentially non-contiguous representation in some data structure in the program memory). Think of it like, how do you convert a linked list or a hash map to some blob of bytes that you can send over a TCP connection, and how can the other end get back the original data structure from the blob. More important I think is the concept of IPC (inter-process communication), aka message passing, in general...marshaling data is usually an implementation detail some framework you're using has already solved for you.
Buffers - Some memory where you stick stuff temporarily before you actually copy/read it somewhere else. Buffers have uses in many contexts. One is to enable asynchronous behavior, where a queues is written to by 'producers' and read by 'consumers'; the queue lets you decouple reads and writes, so the writer doesn't have to 'block' waiting for the reader, and vice-versa. You can just write to the buffer and continue on, and the reader can read from the buffer at their leisure (within reason...the buffer can fill up).
Streams - This is an overloaded term that means a lot of things in a lot of different contexts so I think you'd need to be more specific.
So, see, that's not really a ton of high-level context. You can probably internalize that level of detail in 10 minutes. There's a lot of directions you could go in to follow these topics deeper of course, these explanations aren't ultimately satisfying...feel free to google around to satisfy your curiosity, but don't get existential about it. Again, you'll *always* have some layer that you haven't understood yet. If you just keep endlessly peeling back layers with no motivating context, you'll probably become overwhelmed and confused and ask yourself "when would I use this?", "why am I too dumb to see how this fits together?", etc...not productive and liable to make you feel bad. Probably better, when given a problem at work, to ask yourself "has this problem been solved before? If so, what are the best practices?". As you work on more interesting problems, you will naturally come into contact with these things if you can accurately define what challenges you're facing and seek out resources that address those challenges.
bekah_exists@reddit
I just want to say a huge THANK YOU for your response, especially your last paragraph. I've been a very effective engineer throughout my career so far, but recently I've been feeling like I have huge gaps in my knowledge and have been getting overwhelmed by it, getting down on myself, etc.
Taking a screenshot and saving it for next time the tech overwhelm takes me. Thanks again!
k958320617@reddit
What a great answer.
JajEnkan3pe@reddit (OP)
Thank you so much for taking your time for this. I have got pretty much the same response and I now have figured what to do next, create something I like(I do have something in mind) and ask ai for suggestions to architect it better, learn and implement.
ryuzaki49@reddit
A big change to me was being in a team that handles services with high TPS. One of our services has 180k TPS.
It was an eye opener to me being in a different league.
Monitoring, observability, knowing how to look for clues in logs, connection issues between pods, fixing an issue at 3:00 am.
However not sure how to get into these teams if you dont already have the experience.
Film_Guilty@reddit
If you want to learn more beyond your current work, then study System Design and implement some of those systems. Don't wait until you have to interview to study System Design.
PothosEchoNiner@reddit
Your friend is probably working in a lower level language like Go, where you have to explicitly handle things like marshaling and buffers.
No-Firefighter-6753@reddit
read books about things
like for example as backend you will need to know some linux stuff , so grab a book of linux and read and apply
like a rule for me is that everything you work with or use , start reading a book about it and trust you will learn a lot from that.
Key-Half1655@reddit
Don't worry about it, after 3 years you should be getting comfortable in the space and starting to ask broader and more fundamental questions. Im in backend for 15 years and still learning. We got a new technical lead recently and I learn something new every time this guy speaks!
JajEnkan3pe@reddit (OP)
Thank you for this. I will just keep learning and wait for luck to hit. It is pretty easy to doubt oneself these days.
comp_freak@reddit
If you are at the same place for past 3 years and not learning anything new; it might be also a good time to apply for new jobs.
Key-Half1655@reddit
That'd be imposter syndrome and its pretty common in our industry! I still get the feeling ill be found out one of these days 😅
tjsr@reddit
I had been working in all kinds of back end stuff for about the same period then had to get my head around Hexagonal arch. Ugh.
Street_Smart_Phone@reddit
Just work on a personal project and run with it. He'll probably have different experiences than you because you both are working on different things, Don't compare yourself to others or you're going to have a rough life trying to keep up.
JajEnkan3pe@reddit (OP)
Not comparing but getting to know what you all do on a daily so I can go through those and implement on a project I create. I think that is the only way forward.
ericmutta@reddit
I personally have been writing code for 20+ years...and everything "deep" I know (including the stuff you mentioned like marshalling, etc) I learned outside work while doing side projects.
The vast majority of day jobs involve doing boring stuff that pays (e.g. yet another invoicing system). If you want to know more and get better, just try building toy versions of what you already use at work. For example, you already work with APIs which means you probably work with HTTP, so try building a little web server from scratch...or an editor similar to the one you use...or a compiler/interpreter for the language you code in...or an operating system, if you are REALLY feeling adventurous :)
PS: whatever you pick, make sure it is something you are genuinely curious about because you will end up spending many sleepless nights mastering it (and AI can help a lot here by helping you get fast answers to the endless questions you will have at the beginning).
Technical_Note_6078@reddit
The fastest way to level up is a small, scoped side project that forces you into the guts: sockets/HTTP, streaming I/O, serialization, failures, and observability.
Start with a tiny web server that handles chunked requests and streams file uploads; implement JSON and one binary format (protobuf or msgpack), and write a minimal marshaler so you feel the tradeoffs. Add a DB with proper indexes and connection pooling, plus a cache; wire in transactions with the isolation level visible in logs. Layer a job queue with a worker pool, backpressure, retries with jitter, idempotency, timeouts, and circuit breakers. Expose metrics, traces, and structured logs; run k6 or Locust, set a p95 budget, then profile and fix hot spots. Practice graceful shutdown, rolling deploys, and schema migrations with rollback.
For real-world flavor, I use Kong as the gateway and Postman for contract tests, and when I need a quick API over a database to plug in, DreamFactory can auto-generate one so I can focus on the internals.
Keep shipping small end-to-end systems; that’s how fundamentals stick.
Street_Smart_Phone@reddit
Just build something that excites you. Doesn't matter if someone's already made it or there's no money in it. It seems like your curious, and the best way to learn is to do your own pet projects and just keep building. You'll run into problems along the way and fixing those problems is where you learn the fun stuff.
JDSherbert@reddit
In a nutshell:
Buffer: A block of memory where you can stick stuff, normally to split apart the read/write process. In audio specifically, we would stick our sounds in there that the user wants to play, so it can be read asynchronously by the audio thread. This is sometimes why YouTube says "Buffering" to give some context.
Streaming: This is normally a long data file but we send it chunk by chunk. Again in audio as context, to improve bandwidth, instead of ramming the whole song to the user, we send chunks at a time. If a song is 3 minutes long, we might send the first 10 seconds, then the next ten seconds, etc
Marshalling: This is more context dependent, but usually involves converting one data type to another, usually serializing it, and then blasting it somewhere else to be "unmarshalled". This happens a lot in online games, where we convert, say an "Item" into a load of Network friendly numbers, and then convert those numbers back into an "Item".
Hope this brief summary helps - I would recommend picking up some free resources like CS50 and CompTIA, and learning about the foundational stuff from those modules.
mrstacktrace@reddit
Start with the Hello Interview systems design course. You'll have a solid foundation into subjects that will actually be asked in an interview.
From there, you can go deeper with the book "Designing Data Intensive Applications" which is considered a system design classic for BE engineers.
P.S. i can give a referral for a discount to Hello Interview premium, but even their free content and Youtube videos are very thorough and excellent.
windfallthrowaway90@reddit
Read DDIA cover to cover once, then skim it again every year as you encounter more new problems. Eventually you can treat it as a reference. That will lay a lot of foundation for you.
You also won’t encounter many of these problems until you reach new levels of scale. Data size and RPS scale have unique solutions so you might not even hit everything at “high scale” if it’s only on one axis.
ummDerp504@reddit
Commenting so I can read through this thread after work. I’m at 4 years of experience and want to move into a senior position, so I want to see what other seniors recommend
lakesObacon@reddit
After being in database and API land for a long long time I have realized that every three years or so I need a networking fundamentals course. Stuff I don't touch every day, network configs, identity policies, and even stupid simple stuff like the difference between the public and private networks and how to properly use IP address ranges. I feel removed from all that in my everyday dev life, yet I literally write APIs and manage databases... So I just go back and study it every now and then.
LegatusDivinae@reddit
If you want to have some fun, learn Kafka. I reckon you could do fundamentals in a week's time, 2h/day. It will give you a lot of knowledge about event/message-driven architecture, serializing and deserializing ( un-marshalling is usually same thing, but for RPCs), buffers and streams are more low level though.
Just write some toy producer, set up couple of topics and consume them.
08148694@reddit
You can go lower level or higher level
Lower level is the buffers and marshalling and threading and whatnot. 99% of the time there will be a library to do this for you. In my experience the people who want to do this (for back end web dev at least) are reinventing wheels and building a less good version of a library just because they find it interesting
Higher level is system design. Which type of database to use, orchestrating events, making sure systems are reliable and scalable and so on. This is in my opinion a far more valuable path to go down than the lower level stuff (again for back end web dev)
devoutsalsa@reddit
Can you explain what at most once, at least once, and exactly once messaging semantics are?
If not, here's a prompt for you...
Provide a clear explanation of the three messaging semantics (at most once, at least once, exactly once). For each, explain what delivery guarantee it provides, how it handles failures, and when you'd use it. Include real-world examples and discuss the tradeoffs between reliability, performance, and implementation complexity.
Vasyl_Magometa@reddit
You’re already asking the right questions — that’s a good start.
If I was your mentor, the first things I'll focus on:
Pick one real project and rebuild part of it from scratch using lower-level tools. It’s the fastest way to learn what’s happening behind the frameworks.
You don’t have to know everything at once. Just keep breaking abstractions layer by layer — that’s where real backend skill starts.
Good Luck!
BanaTibor@reddit
There is no roadmap. The only thing that can influence your career path is your choices. If you want to work with buffers and on serialization libs choose a project which does that. You will have experience and knowledge in areas where you do work. By today the software development landscape grow so big that nobody can know all, not even all the fundamentals.
Personal experience: on an another forum somebody presented a boot loader what he made because grub is not good enough. A FUCKING BOOTLOADER! I looked at the code, and was able to understand that it was written in C, but not much else. Do I feel bad about it? Not really, yeah it would be nice to know about all that stuff too, but you have to accept that you can not learn everything. We have different experience. He is an embedded developer, I write enterprise and cloud native apps. It is like comparing a rapper to a classical music composer, both are musicians but hardly would find them in the same room let alone doing the other's job.
xikxp1@reddit
What are your services performance profile? How much RPS? How much data stored in db?
I think I was in a similar situation early in my career. Even though I learned about some things in theory, I just could apply them at my job and learn further from it. What I did was switching jobs. I found myself one where I could take part in scaling large backends where you really have to optimize for latency and resource usage. All the fun part in backend development starts at 10k RPS minimum.
JajEnkan3pe@reddit (OP)
Issue is the job market these days and with me still stuck at the knowledge I have, I do not think a switch is even possible.
Our services have around 400-700 RPS and few GB of data.
yxhuvud@reddit
So do you have a fair idea of what the performance profile is on those 400-700RPS? Where are the time spent in your app? Can you make the slow paths faster?
yxhuvud@reddit
With buffers and marshalling etc it seems the service your friend is working on may be a bit more low-level than the one you work on. I don't see how that is a problem for you - it is just a different specialization. You will have other things you are better on.
That said, the only way to get better at things you want to get better at is to do. If you can't do at work, figure out a way to do off work.
Capable_Constant1085@reddit
https://www.youtube.com/watch?v=FknTw9bJsXM
hawkman_z@reddit
This doesn’t answer the question, but a great video nonetheless.
den_eimai_apo_edo@reddit
Can you deliver a design, co-ordinate and deliver a feature? I feel like that's a pretty big one