10 Comments
Jul 19, 2023·edited Jul 20, 2023Liked by Ryan Fleury

First of all, I just want to say I love your writing. It's always so thought-provoking, and it just flat out amazes me how well-spoken you are at your age. I wasn't writing anything near that level back then.

I agree with your points in broad strokes. I have also noticed more of a willingness for the Handmade community to avoid taking a strong stance in an effort to appeal to a wider audience of programmers.

It's funny you mention collecting a paycheck as a programmer. I did that for years before I discovered Handmade Hero, and so far as I can recall, watching Handmade Hero made me feel a very strong disaffection with the jobs I previously held (not that I wasn't already feeling disaffected, but Casey's rants gave words to a frustration I felt but didn't understand).

Once I built my own game engine and started making software the handmade way, I wasn't able to last as an iOS developer. All of it was wrong. Everyone I interacted with on a daily basis had no idea what they were talking about, and everything I did at my job became some form of politics to appease the object oriented people in charge of the project.

I kept taking sabbaticals for a year, going back to it, quitting again. Finally, my spouse had enough of it, and we discussed permanently ending my affiliation with my mobile app contracting gigs. That happened last November.

I can't tell you how much more psychologically whole I feel now that I am no longer collecting a paycheck to make bad software. I am still a part of the problem (I hold stocks that make money from companies that make bad software), but at least I can spend my days working on projects I care about, and make no compromises there.

I think knowing is half the battle here. Once you know there is a better way, and you care, you experience cognitive dissonance and become psychologically unsettled until you right the wrong. At least that was my experience. It's very difficult to live a lie.

Expand full comment

Good reminder that I shouldn’t try to be inclusive when talking about opinionated programming/design topics. Just own it! (without being rude of course)

I love the pragmatism and fire of these posts. To get better and ethical software out there, the fastest way is indeed to promote the handmade philosophy to those who might not know about it but might be interested, rather than to have mindless debates with someone who has different goals, or to be afraid of not being inclusive enough. Keep up the fire 🔥

Expand full comment
Jul 19, 2023Liked by Ryan Fleury

Beautifully written. This captured in clear language what made Handmade Hero remarkable and so transformative of my approach to the craft of creating software, and left me with much on which to reflect.

Expand full comment

Let me preface this by saying I love Handmade Hero and I have been watching Handmade Hero for about 7 years (I just looked up my receipt and i bought it on 21 March 2016 and yes there is 'but' coming).

But I always disliked the Handmade Community.

I have 3 main points that I just can not understand and I'm really interested in your opinion about them.

1) Firstly where does the whole premise that software somehow is worse now than it used to be come from?

Is software perfect today? Surely not I get grumpy about any one of the programs i use almost daily. But as someone who has used software since about 1987 I do not remember a time when it was better.

I waited 5 mins to for 'Defenders of the earth' to load from tape on my commodore c64. C&C: Red Alert frequently crashed on my machine and I had to install every other game from my drive just to play c&c: tiberian sun and it ran sooo bad.

Just starting Windows 95 took minutes and it frequently crashed. And over the years it never got much better or worse. I hated 'The witcher' because it had such long loading times.

But it wasn't only games, using any 3D authoring tools on consumer hardware was a pain.

And things objectively got better. I tried to find reliable times for windows 95 boot times and I could only find a few videos like https://www.youtube.com/watch?v=dFpv7ok1Mk8 which seem to confirm that it took about a minute to boot windows 95.

I could find a lot of articles (tomshardware) for example that current windows boots in about 5 seconds. So that's about 12 times as fast.

Just watch this actual windows 95 advertisement (https://www.youtube.com/watch?v=vLlWrt-zmTo). They probably wanted it to look really good and it really didn't. Everything was horrible and sluggish.

So i disagree that things have been universally better. That just seems like some nostalgia for a world that never existed. But we agree that things could be much better. Which leads me to point number

2) The need to blame someone. I fully understand that to make things better the handmade community tried to figure out how software got to where it is today. But why is there so much need to blame programmers that do not have the same ideals as you?

I partly understand this point much better now, thanks to your article.

I personally think that it is a naive view of our world to assume that if only all programmers would love their craft we would be in a better place.

Many communities have adopted this approach like some vegetarian/vegan groups, some environmental organization. It's always the same pattern, the system is not to blame but all people just need to not eat meat / recycle / write handmade software and all people who do not abide by the rules are automatically bad people or in the handmade case: bad programmers.

To me your approach seems like fighting capitalism itself, because the best products/programs don't always win or survive. There is a lot of factors that are in play to make a product viable and being 'good' is only one of them. And I think time has shown that it sadly is not even the most important one. You can read into any of the format wars (https://en.wikipedia.org/wiki/Format_war) to see that the best technology doesn't always come out on top.

I think if you really want to change the world going all in on your ideals or refusing to work is not a good approach, but i might be wrong and you might be right.

Having ideals is great, advertising your ideals is great and teaching them to others is great.

But thinking that you need to go to war over your ideals or that people that do not share them are your opponents(your words not mine) is in my opinion a dangerous and fruitless path to go down. You can build great things with people that share some of your ideals or none of them, if you don't isolate yourself from them.

And one way to isolate yourself is, which brings me to my last point,

3) Insulting everyone on the way. I have nothing against harsh critique. Be as harsh as you like about a product or a person. But critiques should be about facts not emotions. Use all your emotions to hold up your ideals, but make it about *your* ideals not other peoples ideals being wrong.

Just some examples from this article.

a) `The community failed to gatekeep against those who disagreed with its premises, and as such was subject to a deluge of average Internet programmers.` I'm pretty sure average Internet programmer is meant as an insult here or at least something people should strive to not be. Which in itself seems like a strange insult but apart from that your saying (if I'm not misunderstanding) everyone that disagrees with the handmade ideals must be an 'average Internet programmer'.

b) `the culturally dominant trend in the programming world, however, was to collect a paycheck and abdicate responsibility for low-quality software`. Where is this even coming from? I have worked in software a long time and I have a lot of friends who do. I know almost nobody who was in it just for the paycheck. Most people i meet have a love for the product they are making. But you just insulted all of them. Where is that coming from?

c) `several large software projects to which individuals have dedicated careers are valueless wastes of time and energy`. Firstly name one. Secondly how would the premise to make good software for the user make any software a valueless waste of time? It might not be a good piece of software yet or even going the wrong direction for you. But it probably has some value for someone or it wouldn't exist. And that is exactly my point you can defend your values and critique software without calling them valueless wastes.

I know very long comment. Sorry but i always wanted to know how certain rhetoric that made me dislike the handmade community started or if I'm maybe not getting some point. I also understand that in a fiery article like this some insults may fly to convey your love of programming and your dislike of people who do it 'just' for money. But do you inflammatory rhetoric like 'battlefield', 'Opponent', 'decay', and so on is really necessary or helpful?

And i get that one of the points of your article was that you should have gatekept more and defended the use of strong rhetoric. I just think that you maybe made less of a mistake then you think and that the line between vigorously defending your ideals and baseless insults can be very thin.

And I also don't think you should limit what you say just because someone might feel offended.

So I'm guessing whole point here is the same as yours. Venting our frustration that software is not what we want it to be and the handmade community is also not what we wanted it to be. Although we both probably disagree on how the community should be different.

At least we can probably both agree to the following.

Let's make great software. For everyone. For the love of computing. I wish you all the best. Keep up the good work.

Expand full comment

The down side to writing everything yourself is that your responsibility goes W-A-Y up. For example, I was writing an HTTP|HTTPS client for every non-toy OS and I didn't want to work at the socket level and write my own crypto implementations. Did I lose out on some fine-grained control, like keeping all allocations within my memory allocation implementation or arena? - Sure.

But the advantage of using systems that are well tested, constantly improved (esp. on the security side), and dynamically linkable—so I can automatically get their latest without a rebuild of my software [assuming interface compat.]—far outweighs the benefits IMHO. There was a good article a while back comparing 'forests of dependencies' with write your own everything (and they used VLC as an example). Writing my own XML parser or de/compression implementation in the middle of a nongeneric project seems like a bad idea.

Now you do make a number of good points… I especially like your characterisation of eggheads in academia and slaves in corporations. OSs in particular seem incredibly slow, and getting slower with each new version. Unnecessary abstraction is causing dramatic slow downs. Projects which should be done with 3 people are being done with dozens. Quality incentives are wrong.

PS: On the subject of measuring software quality; what's your perspective? - It can't be all aesthetic. - High cohesion and low coupling? - Connascence? - Test and doc coverage? - Interoperability? - Final package size? - Ability to work offline and networked?

Expand full comment
author

> The down side to writing everything yourself is that your responsibility goes W-A-Y up.

The perspective I wrote about in the article is that handcrafted software is the *ideal*. It is a *good* thing to have more responsibility over one's work; it means you can live up to that responsibility, and provide something better. It isn't necessarily the practical reality in all circumstances. When interoping with other machines through established (and extremely complex protocols), this ideal will simply not be met (which is one notably *problem* with these technologies - that they require a small number of extremely complex implementations to work *at all*).

Ideals are not defined by practical downsides; they are a statement about what is *better* - for the software, for the programmer, and for the user. Handcrafted software is better in the same way that handcrafted furniture is better.

> But the advantage of using systems that are well tested, constantly improved (esp. on the security side), and dynamically linkable—so I can automatically get their latest without a rebuild of my software [assuming interface compat.]—far outweighs the benefits IMHO

This is back to technical specifics, but I just completely disagree here. Shared dynamic libraries being updated, then loaded by software which was written for *older versions* of those libraries, is such a fantastically awful mistake. It has led to a massively less secure, massively less reliable, and hilariously-high-failure-rate ecosystem, especially in the Linux world. It is *simply not good* to assume dynamically-linked software interfaces are good enough to communicate constraints, and the implementations can change, without users of the interfaces knowing. That is not true in theory, and it's not empirically true in practice. It's as insane as assuming, e.g., an Unreal 3 DLL for some module could be replaced by an Unreal 4 DLL for the same module, without any API changes, and it'd simply work as expected. It is so unfathomably ridiculous; I have no idea how it is taught as a good idea to this day.

It hasn't even made security any better - it makes a found exploit *ecosystem wide*, by producing *monocultures* of dependencies. It is dramatically better in basically every way to use statically-linked dependencies, or to build-from-source, such that even if an exploit is found in one particular version of one particular dependency, its reach is not widespread, and it cannot reach all ends of the ecosystem, which have been pressured into a monoculture.

> On the subject of measuring software quality

I've written a lot about it on this Substack. But there are numerous axes upon which quality may be measured - they include: performance in all cases, reliability in all cases, interface simplicity & design, ability to run offline, ability to control one's data, quality of visual design, the composability of various parts of the interface (N composable tools to form a F(N) space of outputs, rather than just F(N) specialized tools), and so on.

Expand full comment
Jul 19, 2023·edited Jul 19, 2023

You captured the reason why I am so facinated of this side if programming I discovered way to late, I could never explain what drove me into watching a man code with the win32 api for 5 hours. Thank you for writing this, it is an amazing article and I love it.

The only thing is eventhough I love what this community made, I am still new to everything and definitly have to watch more handmade hero before I can call myself a Handmade programmer.

Expand full comment

I found Handmade Hero very late, last year. After years of tryhard learning how to improove at programming because my BA degree did not help me to get there. Just watching this guy explaining how all this seemingly random stuff in the Windows API hit me like a train.

Initially I learned C++ with MSVC6 by clicking MFC dialogs together in school. My attempts with the WinAPI weren't fruitful. So for me MFC with C++ was "How people create software".

I started to learn programming because I had a vision. That computer could actually make our lifes easier rather then more complex. Now, 15 years later and programming in business C++, I feel like a liar. I feel like I lost something valuable on the way here.

Thanks for the article. Though I probably would not have a place in the Handmade Community it warms my heart to see that people strive for something greater then themselves. Something I consider valuable.

Expand full comment

Great article, I didn't know about any of this e-drama.

"They did not seek social acceptance, nor approval, if their product sucked and they knew it."

This healthy mindset is actively discouraged by modern education and culture.

We are taught in school that being wrong (or having low grades on some exam) is shameful. We are also taught in school that participation deserves an award regardless of effort or outcome - though I think most kids see through the participation medals - it made me feel shame to get one of those.

We are taught via social media that other people's approval (in the form of upcummies or followers) is the ultimate form of validation.

It's important for personal development to be able to judge your own work honestly. If you did a bad job then you should be, if not disappointed, then at least resolved to do better next time.

Expand full comment

Rationality and morality are not either-or. You can't properly reject the pragmatists while simultaneously accepting their basic premise that morality is detached from practicality. Pragmatism is impractical because of its immorality, not in spite of it.

An objective code of ethics tells you how to achieve the greatest competency possible. The pragmatists do not possess such a moral code, which is why they don't see anything wrong with creating terrible software. They aren't interested in properly understanding the problems they need to solve, or they don't think a solution is even achievable. If the pragmatists had the correct moral beliefs then it would compel them to write better code. Accepting the premise that morality is subjective is an admission that this view is just as valid as yours.

Expand full comment