A little bit of my background:
I am a Computer Science & Engineering Student. I’ve had courses on C, Java, and CPP in uni. So, I’m familiar with the basics. I am currently learning Zig and Nix. I am a linux user, previously I have used arch linux but now I am using NixOS, hence I am learning the Nix language. I have noticed that I like making stuff, but I don’t particularly know what kind of stuff i like making the most.
As programming is a multi-faceted field, naturally I can’t put my legs on multiple boats at the same time. But I don’t exactly know what kind of programming I should get into. I guess I’m asking for advice from the experienced programmers who have taken on this journey. Thank you. I appreciate all your responses. Have a good day, everyone.
Make some friends and build something fun together.
Pick anything and explore it, even if you don’t think it’s the “right” choice. You’ll never know if you don’t try.
I can recommend emulator programming as a nice side-quest.
Or in general anything where you currently have no idea how it works but would like to know.
Before I started with emulator coding, emulators were mostly a complete mystery to me, but it turns out it’s all just 1s and 0s (quite literally)
It didn’t just bring the joy of coding back for me, but I think it also made me a better programmer, because you get a better understanding how hardware has evolved over time and what’s going on under the hood (if you squint heavily, modern hardware isn’t all that different from the 1970s or 80s, everything just got a lot wider (bus widths), deeper (pipelines) and more asynchronous).
Knowing I was in the same boat, I can talk a bit about the two things I currently enjoy.
If you like having visual feedback, maybe consider some low-level graphics programming, either with a GPU, or directly manipulating pixels in a pixel buffer.
If you like something you can touch, maybe check out embedded programming.
Both of those topics can go incredibly deep but are really really rewarding when you see the fruits of your labor.
Maybe for some inspiration check out sphaerophoria, jdh or tsoding. All cover a variety of different topics, loving the act of exploring itself. You can look a bit through their library, see how the process looks and maybe something jumps out to you.
But in the end, everybody enjoys different things and enjoys a different feedback-loop. All I can say in the end is, don’t be afraid to try a lot of different things and projects and don’t be afraid to abandon some project, if it isn’t too fun anymore.
I dispute this statement, but first a brief aside- love that you used Arch and switched to NixOS- always love to see more Nix users in the house! I also think that everyone who cares about linux server/system administration should use Arch Linux at some point as it’s a great way to learn about the OS.
While you certainly shouldn’t attempt to become a master of all things programming at the same time, you absolutely can focus on a number of different subjects, it just depends on what kind of job you’re looking for- larger companies tend to like having employees with narrow and deep expertise, whereas smaller companies are going to need you to be able to know how to do a lot of things “good enough” because they don’t have the people power to have experts in every field.
Ultimately, it should be about fun. I actually wanted to be a game designer until after my first commercial game when I realized I’m not actually a “creative”, and I’m generally much happier solving programming puzzles.
My advice would be simple: solve problems, and learn languages. The second part should be done slowly- I am a firm believer that any programming language worth it’s salt has something valuable to teach you, be it Zig, nushell, golang, Haskell, Elm, Lisp Rust or Elixir. But of course you want to make sure you have a decent handle on one before jumping to the next.
Welcome to Ziggit!
As andrew already said, building something with friends is great way to decide.
If you want to try something solo, i would recommend some GUI app you need / are frustrated with. It does not have to be optimal or complex at first, just to tackle the language and get you going.
I for example, have been working on music player in my spare time, because i got frustrated with youtube add policy and the player is buggy as well. It started as just let me play / pause a playlist of .mp3 files, but i really found my way around it, and now it is also able to play a playlist directly from just urls of youtube videos and even download them to locale and play from disk. Now i am working on upgrading renderer to be more optimal and playlist management.
What i am trying to say, just chose something you might have use for, it does not have to be complex at start, and it really helps to have “immediate effect on change”, thus why i am recommend some GUI app. You can try some small game or calendar.
Either way, if you chose Zig to do your thing, i can recommend RayLib for GUI just to get you started, you can always change the graphical engine later.
I think you can and ultimately, even if you just stick to one thing, you will deal with many facets anyways.
For example I currently work one a game in my free time, and just for this one project I’ve made
3D graphics, procedural generation, my own GUI system, a reliable network protocol for UDP, a texture hot reloading system, some simple parsers (json, zon, obj), many optimizations, and I even applied a bit of solid state physics ;D
That’s why I would encourage you to branch out. There is good chance that you will need the knowledge you gain again in the future, and branching out is also the best way to discover what you actually enjoy and what you don’t like, allowing you to eventually settle on one domain.
First, do something you fell like doing.
A good starting point is to port something you have already done in C, CPP or Java.
If you want something new, a suggestion of mine is a wrap or a port of the GeographicLib. If interested, check Library — GeographicLib 2.3 documentation for a list of done ports (there is C, CPP and Java).
Happy coding.
Welcome to Ziggit @chrollorifat!
Here’s a fairly specific idea for you: do some RP2040 programming using Arduino IDE. You can look through Instructables and find an endless assortment of ideas for DIY gizmos. As a platform I can recommend the Adafruit Feather, that’s a link to the base RP2040 model but there are many, many like it.
If you’re at an engineering school, you probably have access to an electronics lab which will have all sorts of things you’d otherwise have to buy, and should generally be a great resource.
I suggest the RP2040 in particular because it’s the best-supported chip for MicroZig. They specifically suggest the Raspberry Pi Pico, which uses the RP2040, and that’s definitely another option other than the Feather. But it should be practical to configure the pinouts and so on used by the Feather, using the Pico code as a base. If someone hasn’t already done so, which is possible.
I do suggest starting with the Arduino ecosystem, or perhaps CircuitPython, and then seeing if you can get MicroZig working.
This will help you with your goal of figuring out what kind of programming you want to do. The embedded space is quite large and has a bright future (IMHO), and Zig is poised to be a choice language for embedded work. It isn’t quite there yet but… maybe you can help!
And hey, if it turns out to be not your kind of thing, you’ll have a gizmo that you made yourself to show for it.