printf("Hello Back, World!\n");

I've been a C/C++ developer[1] for a couple of years. I have learned to code since I was 13, although only basic stuff. At some point in my life I started working professionally, with driver/services development, besides a never finished Linux distribution for a specific application.

Then the years passed by and I wasn't very satisfied with my working conditions: very low salary, adaptation issues (PS: I'm autistic/ADHD/OCD), etc. Plus, there weren't other options for developing this kind of thing in my area (also, very likely, not in my state or even in my country) at that time. So I started my own business, and management stuff needed me, then I went back for college, started and finished a Master's degree. And here I am 12 years later!

But then the pandemics started, remote work had an enormous growth, and I started thinking: what if I do it again? My former company was left to my former partners (and failed), I had to code some stuff for my master's research, and it made me switch perspectives on the matter. So, I noticed I wanted way too much to go back. And now I'm learning to code again - "I believe I waited long enough / Where do I begin"[2]?

Learning to Code Again

I have started reviewing some stuff and writing some small code while I was finishing my dissertation. This, obviously, after writing an experiment in JavaScript, which doesn't actually count (for my goals). Even basic C and C++ syntax was hard to write at first, as if I had never programmed. Yes, obviously I still knew how to make a conditional or a loop, but creating & manipulating a struct? Not easy at all!

However, the syntax started "coming again", very naturally, I started recalling random code I have written before (I mean, not the random code, but the functions I would call, even their syntax, stuff like that). But semantics, on the other hand, doesn't come so easily. The data structures I should use, the library-related concepts, etc, come very hard if they ever come - sometimes I have to study all over again. Obviously, when I'm patient enough, it's certainly faster that when learning for the first time.

Types in C are a weird thing, I instinctively feel an urge to use a certain type in a certain situation, but if I ask myself why I just don't know. Therefore I'm not even sure those impulses are right.

It's a quote interesting phenomenon to observe, specially after a couple of years in cognitive science.

What do I wanna do?

As one might have easily noticed, I've talked a lot about C, and there's no coincidence about that. Yes, I code in other languages and I wanna learn those languages again and some new languages too (except for those who used anything different than `=` for attribution, that's just unacceptable and I'm too autistic for that).

After careful consideration, therapy sessions, etc, and considering it was kinda an old dream since I was a teenager, I decided that I wanna work with Linux kernel. And yeah, the kernel is included into that semantic part I forgot all about, so it's pretty harsh. Besides, as I mentioned, kernel 2.6 was a thing when I used or developed for the kernel for the last time.

So, as you might see, it's gonna take a while and a whole journey until I'm "in shape"again - be it for coding or for coding for the kernel again. This blog will be about that!

The Journey

To achieve my goals, some stuff must be kept in mind. First that I need a job soon, so yeah, financial pressures here. Or, in the best case scenario, a mentorship on programs like the Outreachy or the Linux Kernel Mentorship Program [3][4][5].

Also, I need to practice C (and learn much again). For that, I reached the old team for an open source project, they've been looking for a new maintainer for more than 2 years. I offered myself to help, at first, and they agreed, so now I am working from time to time into that project, mostly on the currently pending patches submitted to it. To keep the privacy of my identity I won't name this project, but will likely talk about it in general terms

I also need to reshape my skills with development tools. I haven't used much git in the old times, and while I got the general idea really fast, I'm struggling with things like fetching and integrating the submitted patches, from time to time. Other tools like nm and gdb I forgot mostly, but they're slowly coming back as needed (well, actually slower than needed, but okay).

Moreover, I need to learn the environment again. Linux changed A LOT on those years I haven't used - not only the kernel but everything else. People apparently don't use console anymore, or at least distros appear to be removing most resources available on it (and Linus thrown scrollback into the trash bin [6] 😭 I can't live without it).

Furthermore, to work with kernel I have a lot to adapt too. There is an enormous change between the 2.6.x tree I've been used to and the current 5.16/5.17. Also, all I have written of kernel-related software were modules, which is often relatively easier than working with kernel internals, so I also have a lot of new stuff to learn too. These days it seems like nearly impossible to learn much about the whole kernel, it has grown much larger than in the old times, but I will try to master the new general structure, see what's changed and what's not, and also focus on my subsystems of interest - the ones I might see myself working with. At this moment they're not clearly defined, except for netdev which I'm quite sure I like a lot.

Finally, to focus on netdev I also have a lot to learn about netstacks, and for that reason I have found as an interesting strategy: develop a netstack for a "netless" operating system - specially if it's for a kernel (microkernel systems wouldn't implement networking in kernel-space very often). I will talk about the alternatives I am considering in another post, but days ago I posted a thread that got relatively popular on r/osdev, it's worth taking a look for now! I'd like to do that as a contribution for some operating system that would actually incorporate it, but I'm not sure that will be the case yet.

So, my journey is kinda divided in some general areas:

  1. The C practice project
  2. Reshaping toolset skills
  3. Studying the linux kernel
  4. Practicing on a hobby OS netstack

Join me on this Journey!

Now that you know the journey I have ahead, join me - be you an experienced developer who has something to share with me, or a beginner who wants to learn with me, or, more specifically, someone like me who used to develop, quit for some years, and now feels lost and don't know where to start!

I will share two kinds of contents here:

  1. My progress on this journey, what I am doing now, what's next, etc.
  2. Related informative content, like howtos, ideas, things I learned (again or not), etc - be about code, tools, linux or whatever might fit people's interests!

Welcome aboard and I hope you enjoy!!

NOTES

[1] I have notic`ed many people who don't like the "C/C++" notation, others claim this is accurate, and I don't know which side I picked yet because I'm quite outdated. But 10-12 years ago it was quite common to combine both languages in projects and we would usually say like that.

[2] That Foo Fighters lyrics.

[3] But I've lost the deadline for the first term this year, so I'll have to wait for the next term.

[4] The Linux Kernel Mentorship Program (LKMP) is a program to mentor future kernel developers.

[5] Outreachy is a program to mentor people in underrepresented groups in the tech industry to work on participant projects.

[6] The fbcon scrollback support was removed from Linux in commit 50145474f6ef4a9c19205b173da6264a644c7489 by Linus.