Hi Kanak,
Thanks for giving us more detail. This is a fascinating
and incredibly useful problem space (networking and storage).
It is well worth diving into; sub-spaces in it become
people's whole careers.
As you've observed, a finished product like MinIO will use alot of technology.
The thing to do is to take a divide and conquer approach, and to just
focus on one part at a time. Recursively split that part into its
components until you have something you can tackle in a reasonable
time span -- whatever that is for your available time.
And don't feel rushed. Computers run so fast that they hide a
very large amount of complexity--and can deceive us into thinking
that these things "must be simple". These are complex topics that will
take quite some time to comprehend--especially if you have to come
up to speed with the math behind them--and even quite a bit of time
if you ignore the math, which is sometimes viable. Understanding the
TLS handshake, for example, from scratch, probably took me a good 3-6 months.
One trick is to choose a problem to focus on. By taking
a problem focus, you can turn learning into a fun game. Pick a
problem that you don't understand the answer to (yet), but that
you know *has* an answer, because others have solved it.
By dividing and conquering, and focusing on specific problems,
you avoid being overwhelmed by too much at once.
Then the thing that I find most help in learning a technology is to take
a hands on approach, and to try and "solve the problem myself" first, or at least
some small version of the problem in the space that I want to understand.
That is, actually write code to solve, or try to solve, the problem.
By trying to tackle a small, focused problem yourself, without "looking at the answers" first,
you come to an intuitive understanding of the problem, and thus
the design space solutions must take.
You'll either find an easy solution nobody else thought of, or you'll
run into a dead end and then truly appreciate the cleverness
of the solution when you do "turn to the back of the book" to
check your answer. Because that's the next step--once you
have come to grips with the problem space, then you can look at the
answers that other people have done. But still keep "hands-on"
as you do so. Take the clever ideas that you encounter in
looking at "the answers", and incorporate them into your
own solution code.
To give a specific example for networking, the area
you are trying to tackle, I found it most helpful to come to grips
with TCP by implementing the sliding window protocol
that TCP uses for reliable stream transmission.
The problem is stated thusly: how can I turn an unreliable, packet based
communication system into a reliable, infinite stream of bytes
between two hosts? I would minimize this at first to focus
on the essentials: how can you reliably get a 1000 byte blob from one
goroutine to another goroutine, when you must send it in
parts through a go channel of type "chan [10]byte", *and* you are
forced to discard 20% of your receives at random on the receiving
end to simulate a lossy wifi network.
Good luck! Enjoy the learning process.
Best wishes,
Jason