Finding the best out of the sad state of things?

Hello,

I have been watching the streams and following along. I also like to watch Jon blow streams too. I mostly agree with everything that is said, which is what is leading me to create this post because.... it seems impossible to start somewhere.

My problem is that Casey and Jon seem to say everything is bad... their reasoning is good but let me just list it out (?? means I am not sure if it is considered bad or not by their standards but most likely is bad):

JavaScript based anything
OpenGL (see this used, but often it is criticized...)
Vulkan
SFML ??
SDL 1/2 ??
Metal ??
Unity
Unreal Engine

My question is if all software is going down the garbage shoot, how do I learn from a bad starting off point. Which Graphic API do I look into? Which programming language do I dig into.....

Anyone have any advice on this or feel the same way? I want to embrace the "handmade way" but it feels like such a strong catch-22 and doesn't make sense to me. I mean picking an API is counter-intuitive... so how do I build one? Is there some resource out there that talks about that...how the heck do I find this information to learn it?

Basically, what am I getting at is, where does someone that wants learn start for: Gui's, Graphics?

If I wanted to learn some of the bad stuff, javaScript is by far the easiest (and definitely the worst) i.e. get up and running but then the software sucks. OpenGL is hugely outdated and getting it running is the biggest pain, and the best thing I can find is LazyFoo...which is out of date.... This is mostly the same story for everything closer to the metal except for Vulkan. I listed this because I have more recently heard how atrocious it is and how it "should not exist" on Jon Blows stream.

So... Advice? This feels overwhelmingly depressive. I quit my job and I am no longer a javascript programmer but rather a janitor that wants to make cool things in her free time. I would like to change my way of life and just get a foothold into the future. I want to live in a world where software is good and I think that starts with me learning the basics and strongly learning from people I feel are good programmers. I don't want to quit programming, but it feels like no matter what I am doing something wrong.

Hope to hear from the community soon. I know the answer is out there and look forward to your responses.

*Edit*

I thought should also mention I know I am saying the opinion of Casey and Jon should reign supreme in my post, but that is on purpose because I feel like they are good programmers and wonder how a good programmer would approach reality right now?

Edited by FictionalWizard on Reason: clarification
I know how you feel, very strong current pulling you in the opposite direction. Not sure what the answer is but thought I'd give some thoughts.

Following handmade hero gets you off to a good start & gives you the foundations for things like GUI, threads, window setup, audio etc. Up to 200 covers alot of this.

Learning the fundamentals that underlie most technologies, like matrix transforms, sound mixing, basics of 3d graphics, Casey's imgui, Casey's thread queue stuff, file io, file format types.

But again it's a bit hard to find tutorials, Casey's have been the most in-depth & informative.

I think it can be useful learning other ways of doing things, like JavaScript & unity. It gives you diversity & can help the way you think about things. I learned alot about handling ui in different aspect ratios from using unity. Also good things in other programming languages that C doesn't have, that can help inform how you think about things.

Re. The graphics API, I find this the hardest thing to handle. How much time is spent on learning different graphics APIs. Not sure what the best answer, I know alot of people in the community stick with OpenGL until it's needed to switch (like for shipping). Learning one of the APIs can teach alot about how they all work (vertex & indices buffers), & how vertex & pixel shaders work (which is a good thing). But I find the whole graphics API stuff a bit depressing lol. Also could stick with a library like Sokol or Bgfx (which I think Jon has talked about, having a cross platform graphics library becoming more common).

Also learning about other libraries that fit this way of programming like: dear imgui, stb libraries, cute headers, etc.

I find the hardest thing being on the outskirts of programming & game development in general the hardest. Leaning on community that are doing similar things like this site & the discord can help this, but haven't worked this one out.

I guess to sum up, study the fundamentals, experiment with other way of doing things, lean on the community & (most importantly?) concentrate on making things.

Would love to hear what other people think about this
Sorry, this isn't a full answer, more of a partial reaction.

Frustration and complaints are very common in the programming community, most of the time justifiably and objectively so. It seems that everything has at least a major downside. That's why people talk about constant tradeoffs.

In the case of Jonathan Blow and Casey, I completely understand their point of view: you have 2 very competent independent/tiny team programmers who have to deal with endless issues created by huge organizations with infinitely more resources. They know how things are built and they could fix them for their purpose. But for practical reasons they can't or don't want to, and the organizations aren't responsive to their suggestions.

I think in general one has to develop a sense of Zen to retain their sanity in this career: learn to accept what you can't or don't want to control , and make progress regardless.

You can still learn or achieve a ton even on top of JavaScript and OpenGL. But if you are interested in Handmade Philosophy, maybe pick something closer to the metal and study the fundamentals.
Welcome to Handmade!

To add to people's great thoughts so far, there's a trend of us moving away from thinking super negatively about these problems. I don't mean to say the frustrations aren't valid, and please feel free to express them. I just mean if your negative thoughts are influenced by certain veterans like Casey and Jon, I'd encourage you to look beyond Handmade Hero and Jai to notice different people doing lots of good. Just a few examples:

-- Andrew Kelley, author of Zig, recently announced the Zig Foundation. He has a real board of directors -- he's even hiring employees!

-- Ginger Bill's Odin is a similar project to remain aware of.

-- Allen and Ryan are performing fascinating research related to improving how we program day-to-day. They have a track record of getting things done.

-- AndrewJDR created Nira. The project is a web platform, but notice how he's translating low-level thinking into high-level wins (to quote Andreas Fredriksson.)

-- Bitwise had a huge impact on people. Their GitHub recently stated they may resume the series.

-- This very website. Read what a recent member had to say (the YouTube devlog Rudy references is amazing too.) Community members like mmozeiko and simon are breathtaking problem-solvers who donate so much of their time to help people. There's a lot of goodwill here.

- I am running conferences. I work to expand the reach of Handmade, but good branding takes time. I recently partnered with the creators of Matrix. This matters because the French government and Mozilla use Matrix and this partnership has translated to lots of new eyeballs and registrations. If you scroll down their website you'll see them promoting Handmade Seattle.

- John Carmack supports Handmade even though he doesn't have much time to engage with us. He's a good example of veterans with a positive problem-solving approach (giving his actual complaints a lot more weight.)

I reject the sucky and depressing demeanor some admirable programmers often engage in. The very people and institutions they criticize are infinitely better at branding and inspiration which is why they get more traction. It's actually not THAT hard to get the ball rolling for improvements, which makes the "everything is trash" tactic suspect.

There's much to be hopeful for already.

Edited by Abner Coimbre on Reason: Today it's typos galore!
I have certainly struggled with your very issue. I'm sort of a newbie programmer when compared to Casey and Jon (I've only been programming in c++ for 5-6 years) and seeing some of the things they go through is certainly disheartening. However, there are some small lights at the end of the tunnel, Jon's language (jai) for one (which will hopefully help get us out of the c++ world) and also handmade hero. You won't find many more in depth videos than Caseys when it comes to low level programming. Though I know it can be hard to follow at times.

I'll try and give you a good overview of what I would be focusing on/figuring out if I were at the very beginning of my programming journey.

1.) Learn the fundamentals in C: C, although outdated, is a wonderful, simple language and learning it generally forces you to think closer to the metal. I would first start out with Casey's "intro to C" videos and then also some of Casey's explanations of CPU architecture (which you can search for on handmade hero as well). Try and learn the things he shows you inside and out by experimenting with your own code as you learn. It is important to really grasp some of this stuff as everything you do beyond this only builds upon this knowledge. I'm sure there are other videos you can scrounge around on youtube with the language.

2.) Stop and reassess: Was learning those fundamentals engaging and interesting to you? Did you persist despite hitting road blocks? If so then you should be in good shape to continue. I've found that you definitely need to have a certain affinity or passion for this kind of stuff or else you definitely will get burned out and quit, so make sure your still find yourself getting excited by this stuff after having explored it a bit.

3.) Learn the basics of a graphics api (openGL/directX): I would just try and learn enough to be able to draw some 2d images on the screen. You want to know enough so that you can proceed to the next step. A decent tutorial on openGL is on youtube if you search for "jamie King openGL". He has an entire series that starts from the basics. Also, at somepoint in handmade hero Casey begins to go into openGL programming as well.

4.) Once you feel you have some sort of grasp on the fundamentals try building something. This can be anything you would find interesting. When it comes to programming (and many other things) experience is key. You will learn much faster by trying to apply your knowledge and then asking questions. While building your project I would focus on 2 things - 1.) again the fundamentals & 2.) how you slowly build up and architect your program. Casey's philosophy of 'write the usage code first' has changed the way I think about architecting my code and made programming much more enjoyable so I would suggest you wrestle with programming this way as well and again ask questions if you are unsure about how to exactly apply this philosophy. If you find that you actually don't like that way of programming then just find a style that works for you. I can't stress this enough. I think people sometimes focus too much on things like algorithms and optimizations in the beginning of their learning. When you're starting out, just focus on your style and try and get to the point where you would feel comfortable programming almost anything (and yes this is possible, I know because thinking of programming in the way Casey has taught has made me almost fearless when it comes to new programming problems).

Hello FictionalWizard, it's great to have you as part of the community! Welcome. :)

When I was first diving into Handmade Hero and the Handmade community, I found myself having negative attitudes similar to those mentioned in this thread. It is very hard to not feel very frustrated at times—especially when beginning to understand software more deeply—because it often feels like software was built with business in mind rather than the user. This is a very disappointing reality of the software industry at large.

That being said, more recently I've been trying to refocus my perspective. Modern software is frustrating and is often poorly made—this is no secret—but what can we do to change it?

Handmade Network, in my view, has always been about asking (and answering) this question.

As Abner had mentioned, I've been working with Allen (creator of 4coder) recently, and he shared with me a very interesting model that we can use to frame things.

It might seem a little vague, but imagine that for every decision made in computing, we have a point. From this point, we can make a number of other decisions to continue progressing (or regressing!) computing. All of these paths are possible, and one of them may be chosen.



So, with this model, the entire history of decisions that led to this point in computing looks something like this (except the actual graph would be way more complicated).



So, okay. I've drawn a bunch of dots with lines between them. So what?

Well, within this model, I'd now like to express to you what I think Handmade is all about.



Now I'd like to bring this all back to reality instead of super abstract drawings. Step 1 in the above figure is what these frustrations are getting at. We need to deeply understand what got us to the current computing world, what is wrong about it, and why all of these things happened.

But that's only half the story. Once we've done that, and reversed the decisions made by others in the past, we can't just stop there. We need to move forward and make a new set of decisions that result in a better computing world.

So, what does that mean for you and me? What do we need to do? Well, we are only able to work within the existing computing world effectively. We need to use the tools we have, and this is why you'll see Jon using OpenGL, D3D, or C++ for example. And importantly, we need to gain a deeper understanding of what we're doing, what these tools are doing, and why they are perhaps mistaken.

And then, moving forward, when we are in a position to make new decisions, we can have a better idea of what decisions to make, because we've informed ourselves of where the previous decisions went wrong.

Hopefully that wasn't just a bunch of rambling and provided some insight!
My question is if all software is going down the garbage shoot, how do I learn from a bad starting off point.


This is the wrong attitude, in my opinion. It's true that nearly every tool we have as programmers has deep flaws that need to be addressed sooner rather than later, including even C and x86. But a tool being deeply flawed doesn't mean it will be bad or harmful for you to learn. So there's no sense in rejecting everything and giving up for the sake of purity. Rather, we need to use what exists now to build better alternatives, and being familiar with the flaws in what currently exists can help guide that practice.

For learning OpenGL specifically, I found learnopengl.com helpful. But there are probably other good resources too.
Thank you everyone for replying. Having some really well thought out responses was really nice to hear. I really appreciate that you guys took the time to thoughtfully respond.

@Abnercoimbre, thank you for all of the resources and what you pointed out makes a lot of sense. John Carmack is definitely one my programming heroes, so thank you for sharing that in particular!

@Delix, I have actually been checking out your stuff more recently and find it very inspirational, especially the game jam game, the 2D game made into 3D and that you just did everything by hand versus people using engines. I often re-watch that video for motivation! Thanks for all your hard-work and sharing your stuff. I am more of the lurker type, but since I am here I just want you to know you are one of the reasons I really became interested in Handmade and wanted to make the first step. Jon and Casey do a lot of great stuff, but they started early on and have been doing this for ages. Seeing someone closer to my shoes inspires me to walk the path so to speak. What you said about using the tools we have also makes a lot of sense. Good to hear from someone who had the same problems and overcame them!

I know I didn't address everybody, but anyone I didn't mention I also want you to know I read your posts in depth and really appreciate everything everyone has shared and said. The community here is very welcoming in a way I totally did not expect and I appreciate that. Thank you all, I feel much more inspired.
> My problem is that Casey and Jon seem to say everything is bad...

their negativity and frustration shouldn't be taken to serious extremes as to cause anxiety on where to start.
some of what they say is very indisputable, like not adopting modern C++ features, dont get caught up in OOP hierarchy etc. some other things can be challenged, like RAII, const, (x) NEVER working, etc.

John Carmack and Fabian Giesen are good programmers that counter balance jon and caseys frustration.

> Basically, what am I getting at is, where does someone that wants learn start for: Gui's, Graphics?

for graphics, you could start with webgl or learnopengl.com . the concept of the graphics pipeline, shaders, etc are universal. For gui, web is just the best thing for cross platform.

> If I wanted to learn some of the bad stuff, javaScript is by far the easiest (and definitely the worst) i.e. get up and running but then the software sucks.

http://cross-code.com/en/home is a successful game written in html5/js with majority positive reviews. everyones using discord and vscode despite it sucking. There are some indisputable facts being: if they were to be written in C, it would take significantly less resources and run smoother. The trade off they're making is taking the hit for smooth crossplatform on ios/android/windows/mac/linux

The term "handmade" for me is to acknowledge tradeoffs and be open to learn about what abstractions you're standing on. As someone who started from JS and garbage collected languages, I learned to center myself from the two extremes of:
"computers are so fast, let the gc do everything, memory management is too hard and who cares about the lower level"
and
"everything not written from scratch on bare metal C, breaks 99.99% of the time, and takes 1 million seconds to load, and whenever something breaks, its complete utter shit that i could have written so much better on my own from scratch".

my attitude now is: "some set of tradeoffs are being made, and i need to acknowledge the strengths and weaknesses of them" (fabian and carmack attitude)

i recommend Code by Petzold and Nand2tetris to dive into the lower level of computers.

Edited by jestarray on
Suggestion
Software rendering in C++14 using multi-threading and SIMD is nice if you just want to code huge projects in your own pace without the looming deadline of API deprecation. It's not as slow and difficult as it sounds, you can often outperform the GPU using a simple memcpy command to draw the background without any calculations. For GUI, you can just take mouse and keyboard input and make your own abstractions for painting components.

Future optimism
With more CPU cores and more games doing non-traditional rendering techniques, the GPU can eventually be replaced by a low-frequency CPU cluster and get rid of the legacy graphics APIs of constantly growing complexity. Just need better scheduling than ARM's big.LITTLE architecture, which overheats easily from always hyper-threading on high loads, even when the operations are data bound from doing graphics. After the Ryzen Thread-ripper and Qualcomm Hexagon patents expire, the GPU might end up being replaced by a VLIW extension with fully defined texture sampling, branch-free conditional operations and wide memory lanes to create the ultimate multi-purpose processor with a single instruction set for everything.

Everything sucks, but everything can be replaced. It's called progress.
I wanted to make some small games as a relaxing hobby, but felt that all graphics engines were bad (slow, ugly, unstable), so I made my own Direct3D graphics engine with all the cutting edge features I wanted. I used millions of test cases, checklists, tripple code inspection and formal verification to achieve a higher level of correctness than medical and military applications. I spent two years in code freeze doing nothing else than looking for the next bug. But the total stability was highly limited by the poor quality of Direct3D and Microsoft Windows. There was nothing I could do against random device lost exceptions that could throw away all GPU memory at any time.

When the engine was finally done, the operating system became full of spyware (from Microsoft), forced updates (you're the beta tester now) and frequent crashes (because Windows 10 is always an alpha version). Turned out that Linux then had better USB support for my accessories and installing Nvidia GPU drivers was easy with "sudo mhwd -a pci nonfree 0300" on Manjaro (actually easier than on Windows 7). Once I disabled AUR (Arch User Repository) updates and made Manjaro stable, all my reasons for enduring the Windows madness were gone.

After the classic Visual Basic became deprecated, I felt that all remaining programming languages were bad (slow, ugly, unstable), so I made my own programming language with a flashy IDE and virtual machine for debugging. Didn't go very far in actually being used for development, because the existing media layers sucked when it came to static linking options and C99 transpiler compatibility. Didn't want to force a heavy dynamic dependency with linker problems on every user of the language.

I felt that all graphics APIs (for graphics engines) and media layers (for programming languages) were bad, so I made my own software renderer and actually got better performance than OpenGL for 2D and isometric graphics.

Edited by Dawoodoz on