On basic income

Alternate title: Where I Come Out As An Eeeeeeeevil Anticapitalist. Put on your best red scarf, raise your fist and start chanting, here we go. Sarcasm aside, this makes no pretense to be a well-built essay, it's more a collection of loose thoughts.

Let's agree on words

First off, the best way to have an argument that goes nowhere is to forget to agree on words.

By capitalism, I mean the dominant conception of economics, known as market economics. I mean a system based on accumulation of capital, and the possibility to generate profit solely from the possession of said capital. Capital is, basically, money. It ties into concepts of ownership, private property, etc.

By job market, I mean the dominant conception of work and labor exchange. I mean the concept of looking for a job, begging sometimes, and the exchange of labor against money mostly under the structure of private salaried employment.

By basic income, I mean an unconditional distribution of money to all, no questions asked. The implementation can take several forms: negative taxes, etc.

Sources?

I am not talking entirely out of my ass on this. I have yet to read Marx, it's on my massive to-do list. But I did have basic economics classes in my higher studies, and I immensely respect our teacher for the perspective he provided. We mostly studied market economics, but he made it clear where they came from, and that they were only one way to look at things.

There is also a French youtuber known as Usul, whose ongoing series "Mes chers contemporains" is an in-depth look at various social, economical and political topics, built around specific characters in the French public scene. The latest entry, "A salary for life", is an analysis of the job market crisis and how it ties into the failings of capitalism, along with one proposal for another system, designed by Bernard Friot. Unfortunately the video is in French and has no subtitles!

Here comes the rant

Basic income is a good thing if your goal is to give everyone a very, very basic income indeed. The proposal in Finland will not allow people to live decently in Helsinki. It will be tight even in the countryside, as far as I can tell. As some will say, it's better than nothing. It might prevent homelessness and starvation, and that is good of course. But it's not enough, at all.

As explained in Usul's videos, capital holders are capturing more and more capital as time passes. The percentage of GDP that goes to those few people keeps going up: the amount of cash that is effectively removed from the system every year is growing at an alarming rate. To be clear, I am not an expert: but to me this means that basic income would not be sustainable, since the same minority would capture more and more of the money needed to pay it out. We could also use a moral argument, and ask why the majority should live on crumbs while a minority accumulates capital.

Basic income also considers us as creatures of need that need handouts. It does not recognize labor that we all provide, unrecognized by capitalism. Laundry? Labor. Dishes? Labor. Cooking? Labor. Childcare? Labor. Drawing? Labor. Sewing? Labor. Notice how so many of these are, currently, either handled by women or poorly-paid workers? Yep, this is where feminism comes in. All this traditionally feminine labor is undervalued by capitalism since it used to be provided for "free", and results in poorly paid jobs. A "universal salary" would have to recognize all labor, not just the one valued by the current system. It wouldn't be a handout but a recognition of the fact that we all work most of the time after all!

Many say basic income would increase consumption, and encourage entrepreneurship. It probably would! I however hope it would also increase community work, social discourse, and maybe contribute to toppling the system once and for all. Unless it creates apathy, and causes everyone to preserve a less-bad status quo instead. My parents often say that the French Revolution only happened because people were starving. And the common folk was urged onwards by bourgeois, such as merchants, lawyers, and more, who wanted the power of the nobles as recognition of their wealth. The majority didn't get all that much out of it.

Basic income is, in the form it is often proposed, a crutch for a failing capitalism. Increase consumption, keep the machine ticking. But this isn't how we save the planet, this isn't how we get healthier, this isn't how we progress.

Our good friends in Silicon Valley are convinced that technology will save the world. They consider governments useless, confusing a poor implementation with a bad idea. They think themselves brilliant at everything just because they're good coders, and good business people in a rotten system.

The Zeitgeist movement is convinced that technology will save the world. They have a conspirationist undertone that I dislike: I deeply believe that most of the world's problems are caused by incompetence and not malice, by deep convictions towards the wrong goals and not by evil. They lack a transition plan, but they have interesting ideas. It's worth a (very critical) look.

I've seen some people say that basic income allows you to opt out of capitalism. Wrong: it might allow you to opt out of the job market. But unless you start making everything yourself, renounce money and stop keeping cash in the bank, you can't opt out of capitalism. It's everywhere. I've seen blogs by people living a "zero trace" lifestyle: their supplies still generally come from somewhere. If what you mean by "opting out" is "left in peace to work on my stuff", you're not leaving capitalism. And that's okay. But use the right words, please!

Conclusion and obligatory link to current shitstorm

As mentioned, I don't pretend to be an expert, or that this is worthy of the "essay" name. It's just a long-form response to a curious twitter-buddy. I do not have a solution: because the devil is in the details, implementation is complicated, requires a transition plan, etc. For that, go read people like Bernard Friot!

Brianna Wu tweeted pro-capitalism stuff the day before yesterday (the tweets have since been deleted due to harassment, and she expanded on the topic and shared this piece on basic income). She got bashed in response, and our favorite gators of course pounced as always. I hate that this is what we have come to, that it becomes impossible to criticize problematic stances without giving ammo to hate mobs, that a takedown of her problematic lines gets called extremist, or - and that I cannot accept - that criticizing a pro-capitalist feminist is called sexist. Being anti-capitalist isn't being extremist. We have just so broadly accepted market economics as the norm that we forgot anything else can even exist.

You can participate in the system, leverage it and enjoy yourself without praising the status quo. And that's what I plan on doing. Does it make me a hypocrite? Maybe. I think it makes me human!

2015 in review

It's been a hell of a year. It feels like a big blur, lots of time passing by without growth, without progress, without learning, without achievements. Burnout does that to memory. Luckily, I've kept notes. And I can now look back, and realize how far I've come anyway.

What went wrong

1: Work

I'm still torn on how much to say about Frostbite. About what happened, what didn't, how I felt, why I really really wanted to punch some people. I'm not afraid of career bridge-burning: I'm scared it would get attention from gamers. What I can say is that I left the team in January and it was both the hardest and best decision I ever took. I'm still struggling with an immense amount of anger and guilt. I miss some people. I'm left with a master key of a resume and mental health issues. If you envy me anyhow, please do consider how fucked up that is.

I'm tired of engine coding and pondering what to do next. C++ bullshit kills me, week-long hunts for one-character fixes kill me. I'm not having fun working on engines professionally. It might or might not be due to Frostbite and anxiety triggers. I don't know. But it means rewriting the story I've been telling myself for three years, and that is difficult.

2: Health

Burnout, anxiety, panic attacks, insomnia. My old friend trichotillomania had never really left but I had some really bad episodes this year. My guts are broken. I spent the year hunting tests down, which yielded only all-clear. So I keep on inflating and being in pain and having emergency bathroom trips. It can add up to days wasted in pain, or two hours stuck on the throne over a day's work. Yeah, it's gross. Imagine how fun it is living with it. I don't know what's wrong. Probiotics seem to help, a bit. Lactose-free seems to help, a bit. Taking a break helps a bit. But it's still bad and I don't know why. And it scares me shitless to be broken at 23.

3: Being French

Hollande, the French president, started January hoping for a quiet year. He... did not get his wish. January exploded with Charlie Hebdo's office. Cabu's death hit me hard. His art was special to me. I watched gears turn into gears, as old agendas came to life in an overreaching surveillance law. I watched gears turn into gears, as France's old racism and islamophobia came crashing down once again. And then round 2 happened in November. I'm heartbroken for my country, for my nation. I weep for everyone who doesn't look, sound or behave French enough, whatever the hell that would mean. We're treading to road to Vichy once again. And I can't do anything. It hurts like hell.

4: Socializing

I have always been very, very bad at keeping in touch (Sorry, friends). I don't ask for news, I rarely give any. Like many, I feel that everyone secretly finds me awful, and that asking them to hang out would just waste their time. I also look horribly busy all the time due to my ridiculous hobby count, so people never ask! As a result I have been extremely isolated my whole life, and it was worse this year due to the loss of my immediate DICE social circle. I would vow to do better next year, but odds are I won't.

5: Gaming

I didn't take enough time to play games. I love the medium, what it is, what it can be, but I didn't take much time to enjoy it. When I did, I kept going back to the same games. From Bloodborne and my complex love-hate relationship with it, to the consistent masochistic comfort of Risk of Rain, I didn't discover all that much this year. The new The Room and the new Monster Hunter don't really count as new faces. Splatoon, Dungeon of the Endless and Ziggurat were the only really new things I touched this year.

What went right

1: Work

Leaving Frostbite was good. Working with Uprise was good. Working with Bitsquid was great. Leaving Bitsquid was hard, but what I needed to start healing. Getting praise from Niklas Frykholm meant a huge lot to me, and I am extremely glad and thankful I got to work with him.

2: The boyfriend

We found an apartment! We moved in together! We got a cat! We went to IKEA plenty of times, assembled furniture and did not kill each other in the process! Hard to say much about it but it's a huge deal. He's great, we're happy and he's been a tremendous help over the rough year.

3: On the road to recovery

It took me a while, too long really, to admit I was in very bad shape. It took three job switches, more than six months of half-time, and a whole lot of therapy before I just gave up and stopped. And now I'm getting better: not just not getting worse, but actually healing. It feels wonderful. My memory's starting to work again, I feel productive, I feel... well, happy's never really been my thing, but not-awful. Proud of my achievements. Almost at peace.

4: Arts and crafts

I learned so much. I tried to hold an art streak and failed: but I drew a lot anyway, and completed Inktober! My sketching has gotten a lot better, I've kinda maybe somewhat figured out ink, and I made some very decent watercolours early this year. I figured out Modo. I did some real-life sculpting. I want to do more, but argl time, as always. I finished UFOs (UnFinished Objects): an old biscornu and a scarf. I also made some progress on The Fortunate Traveler. I did dyeing experiments. I tried out woodcarving and glassblowing during Medieval Week in Visby. I finally figured out knitting, and got pretty darn good at it. I learned spinning, from my dreadful blobby first try in January to very nice chunky yarn and a lovely thread-like merino single now. I started weaving, from a tablet weaving kit, to inkle weaving, to a tapestry class.

5: Code

I kicked ass at GGJ15, helping my teammates create a portfolio piece they were super proud of. It wasn't much for me, but it felt good to deliver. I made several prototypes this year, from Processing quick hacks to a feature-complete game prototype. Hell, I even finished something for Ludum Dare 34. I almost made a thing for Revision but ran out of time, and noticed that Web and PC were the same compo after all. Not a chance. I do still love programming, and I'm bloody good at it. It just can't be the same thing I used to do, and think I wanted to do professionally.

I remade my bloody website and moved away from Wordpress. It had been bugging me for a solid year, but I finally took the jump and did it. Enjoy the static, PHP-free awesomeness.

Bonus: Misc awesomeness

  • I did half of the french subtitles for Game Loading: Rise of the Indies. The movie's good, go buy and watch it!
  • I tried out Crescent Bay and I'm now sold on VR. I am, however, not sold on it finding a market.
  • I finally spent some time reading again. Lots of great comics: The Wicked + The Divine now has a very special place in my heart.
  • I forgot my shoulder bag in the metro, with an iPad and a 3DS in it. I got it back and it still feels amazing thinking of that glorious moment at the lost and founds.
  • I have a note from Medieval Week that says "too much ice cream" so clearly that was a good time.
  • I graduated SFI, which means I now have a piece of paper saying I can speak Swedish!
  • I bumped into a fellow textile nerd on the metro - she asked about my tapestry frame - and ended up invited to a crafty hangout.
  • I got a gradient club spot at Hilltop Cloud and that is WAY more amazing than it sounds.

The way forward

The plan is to setup shop as a sole trader in January. I'll freelance code to pay the bills, and setup a mini-textile studio on the side. I want to try out the indie dyer gig, and probably sell some handspun and handwoven stuff when I get good enough.

My plan is still to get into HV Skolan, a local textile handicrafts school. I ended up first on the waiting list this year due to a late application. I need some time in art school to learn the process and find what I want to focus on. And I want said school to teach me either sculpture or textile. HV Skolan's one-year base education seems like a good start!

2015 has been complicated. It brought bad, ugly, horrible things. But on a personal level it feels like I touched rock bottom and started going back up. I'm hopeful. I'm glad to have a safety net, a wonderful-if-tremendously-annoying family, and a great boyfriend somehow putting up with weirdo me. Who knows, the cat might even become pettable next year.

Nadine the cat

Classy, fluffy, cute and grumpy.

Whatever happens, 2016 will be exciting. I'm giving up stability for freedom and experimentation, and I am of course scared out of my skull. But I'm also really, really excited! I hope it works out. I have no idea if it will. But you know what? I'm young. I'm a solid programmer. I'm a better engineer than most. I learn fast. I'll be just fine. And hopefully, I'll be able to support others who don't quite have it that good.

Ludum Dare 34 Post-Mortem

(Cross-posted from the Ludum Dare blog)

Hi! @LiaSae here. For background’s sake, I’m a AAA game coder currently taking a break to fix her brain. LD34 was the perfect chance to make something, feel good about it and fall in love with game-making again.

My game’s called Thunder On, and was made in 48h (~16h of work) even though it’s a Jam entry. I initially wanted to call it Thunder Down, but… Well, you google that and tell me what you find. Possibly not at work.

Thunder On: gameplay view

Gameplay view. It’s THAT kind of game.

The idea had been bouncing through my head for a good while now: “being” a lightning bolt, going down, losing energy as you go and having to create new branches, to see the final result once you touch ground. The LD themes gave me the constraints I needed to make a workable implementation.

WARNING: Coder lingo ahead. Artists beware, though I’ll try to have some snippets for you as well.

What went wrong

1: “WTF is going on?”

This was the general reaction from the bulk of the players (thanks all for your feedback, it’s very valuable!). I purposefully left the initial instructions vague, because I was going for whimsy / eerie. But combined with the lack of altitude indication of any sort, this means that what is obvious to me – “well of course the camera’s looking down and you’re going down, it’s like that in the Scene view!” – is cryptic to players.

2: Check the compo rules beforehand next time

I was aiming for a compo entry, but had forgotten even sounds had to be made from scratch. As I checked when getting ready to upload my entry, I facepalmed hard and ticked the Jam box instead. On the bright side, that means it sounds decent instead of terrible.

3: Unity 5.3

I don’t know what on earth was going on with viewport rendering, but a quarter of it routinely turned black for no apparent reason. Getting my alpha blended shader for the cloud layer to work was a matter of one hour of copy-pasting and tweaking the built-in shader to get a version that didn’t break. I can’t say I’m not used to randomly breaking tools, but generally that has been because I’m on a dev branch! I should have stayed on 5.2 for the jam and upgraded afterwards.

4: Responsiveness

I went with a coroutine-based easing animation for the movement, but that also meant blocking inputs until the easing is done. Unfortunately the end of it is virtually infinite, so I added a cutoff. But it was not tweaked well enough, and the game feels frustrating as a result, because you expect to be able to provide new input earlier that you’re allowed to.

5: Too easy

No time means little tweaking, randomness means impredictability, and as a result it’s way too easy to reach the ground. It would not be hard to add a system that analyses possible paths to decide how far up you should go for the best difficulty, but it would take time!

What went right

1: Hell yeah, I made a thing

It’s finished. It works. It feels and sounds and looks better (suppress banding rant) than anything I’ve ever made by myself. It’s complete, people like it overall, they get the point, and that makes it an excellent proof of concept for that idea. I’m happy and proud, and this does wonders for Broken Brain.

2: No crunch!

I live in Sweden, and that meant waiting until 3AM for the themes to be announced. Then to bed, let my brain work it, takes notes, sleep. The next day we had to go borrow the car, buy moving boxes for my partner’s family, drive to IKEA, survive IKEA, come back (this is all very Swedish). Then I had to go buy yarn Because Reasons, head off to an exhibit, go back home, head off again to dump some stuff, then drop off the car. THEN I was able to start on the game, at 5PM past. Between breaks and meals, I put in about 8h that day. The next day I had to go have lunch with a friend leaving the country, run an errand halfway across town, come back, which once again meant starting work at 5PM. Again I put in about 8h total, completing the last tweak to the feel of it all at 2:58AM and doing the submission afterwards. All of this to say: the week-end was packed, which forced me to put in normal work hours instead of Jam Crunch Hours, and I still made it. If life gets in the way, just slash scope massively.

3: Procedural techniques

The bolt is a binary tree (made simple by the two button controls). From there, I generate a mesh that represents the final bolt. The clouds are based on Simplex Value noise from an excellent tutorial at CatLikeCoding. This all adds up to something that feels more complicated and rich than it really is, and was fun to code.

4: Infrastructure

I typically use Assembla for projects like this. The repos have a size limit IIRC, but otherwise they’re free and you can create tons of them. So I created a SVN repo and off I went. Then I made sure to commit quite often, keep things running at all times, and added debug draw as early as I could. It helped immensely, because I didn’t have to guess whether things worked: I could just test, at all times.

Thunder On: scene view

The scene view with the debug tree.

5: Coroutines

I had never used coroutines. On related news, I positively hated gameplay and procedural animation programming for its heavy reliance on a crapton of flags. I don’t know how well coroutines-based systems will scale to bigger projects, but for this it was an absolute delight to chain per-frame callbacks instead of keeping track of all that state. It taught me a new way to think and that makes me immensely happy.

Conclusion

I’m happy with it, as I’ve mentioned. It’s far from perfect, but it was never going to be, and I had to finish, package and ship it off. It looks good because I went with something simple and cheap with glow. I learned stuff. I’m getting excellent feedback, and pondering whether to bring this further eventually. I’m taking the time to play and rate some games this time around too, and discovering a lot of fun things. So long live the Ludum Dare, and congratulations to everyone who made a thing, or tried to make a thing. It’s worth it.

Thunder On: final view

Making lightning bolts is fun!

Upgrading the DirectX SDK

When I joined Bitsquid a month ago, someone mentioned they wanted to upgrade the DirectX SDK to get some improvements, but that there was a dependency in the way. I was foolish, and volunteered to investigate. Over the past ten days or so I have untangled the whole mess, leading to a successful upgrade. I now want to share my findings so the next unfortunate soul can save some time.

Step 1: Explore

First stop: MSDN's article. I had heard that the DirectX SDK was now included in the Windows SDK, but I wasn't sure what that covered. This article sums it up. With a teammate, we went through the whole list, figuring out what we were and were not using. In the end, the only problematic components were XInput, XAudio2, and D3DX9Mesh. The bulk of the codebase had already been converted away from using D3DX, which was great!

However another thing needed clearing up. Our minspec is still Windows 7. How was that going to work? Luckily, MSDN had the answer again. This article reveals that the Windows 8.X SDK is available on Windows 7. This is covered in more details on this page and that page.

Step 2: Well let's just try then

I changed the paths in our project generation files to the Windows SDK. I also added the June 2010 SDK, but only for XAudio2 and D3DX9Mesh (more on XInput further down). After fixing only a few compile errors, things seemed mostly fine... until I got a runtime crash about ID3D11ShaderReflection. Huh?

Step 3: GUIDs and the magic #define

I had wrongly assumed that the link errors I had been seeing when changing the paths were caused by DX9, because I read too fast. Linking with the old dxguid.lib made the errors go away, so I didn't think about it more. However, a large part of DirectX relies on GUIDs, unique hardcoded identifiers. When debugging, I noticed that IID_ID3D11ShaderReflection had the wrong value compared to the Windows SDK header, which was causing the crash. I went on a goose hunt for what was somehow changing this value, and wasted a day to looking for a wrongly included file.

But by default, those GUIDs are extern variables, and will get their values from lib files. And I was linking with an old one. Mystery solved! I removed dxguid.lib from the linker, but that of course caused the GUIDs to be undefined. The solution for that is to #define INITGUID before including windows.h. Thanks to the Ogre3D forums for pointing me towards the relevant support page, since they encountered the same issue before. At this point everything was fine, except that it was failing on the build machines.

Step 4: d3dcompiler

The first error had been around for a long time. We had so far, unknowingly, relied on the d3dcompiler DLL being present in System32! Since System32 is part of the default DLL search path, this is easy to overlook, especially when the DirectX SDK is a required install anyway. We were now relying on a more recent version, supposed to be included in the Windows SDK. Yet still it was failing... because we did not have a proper installation step. I tweaked the project files again, adding a copy step for that DLL. CI, however, was still failing.

Step 5: XInput

XInput comes in several versions in the Windows SDK. 1.4 is the most recent one as I'm writing this, and is Windows 8-only. To use XInput on Windows 7, you need to use version 9.1.0. For that, ensure that the magic _WIN32_WINNT #define is set to the proper value (see further up on the page). You also need to explicitly link with XInput9_1_0.lib and not XInput.lib, or Windows 7 will get a runtime crash trying to fetch XInput1_4.dll, which doesn't exist on Windows 7. In my case this was breaking the automated tests on a Windows 7 machine, but was completely fine on my Windows 8 workstation.

Step 6: Profit?

As far as I can tell this should be the end of it, but the rendering team has yet to stress-test it. We'll see what breaks as they poke around :)

Hopefully this can save you some time if you're doing a similar upgrade, or convince you to give it a try if you've been holding back.

On workaholism

As we all know, Twitter is a terrible place to argue intelligently. So I thought writing something a tad longer here would be the smart thing to do.

History: I bumped into a coworker when in the city center on a Saturday. Nothing unusual, except that his answer to "What are you up to?" was "Going back to work". As is oft my way I went on to rant on Twitter, which triggered counter-ranting.

My original point is that self-inflicted crunching, week-end work, long hours, and general workaholism are toxic. My arguments would be similar to John Walker's regarding working for free:

  • You are devaluating your work, by not being paid for it.
  • You create expectations, both by your employer and newcomers in the industry. Your employer will expect more of you than your contract states, and newcomers will think they have to put in more than is reasonnable to fit in.

It was rightfully pointed out that this only applies if overtime is unpaid. This is, sadly, a very widespread rule in the game industry. If you put in work that is unpaid, you're harming yourself and those that will come after you. Read John Walker's post, he put it much better than I ever could. If you do get paid for your overtime, I'd be very surprised if your company lets you put in as many hours as you want :)

Now, shouldn't you just let people do whatever they want? Sure, but not in the context of their job. Your contract is an exchange of services for money or other perks. It is not a pass to do whatever you feel like with your company's tools and office space: anything on work hours should be work-related, breaks aside, and anything work-related should be on work hours. If you enjoy your job, that's awesome. Hell, I mostly enjoy mine. That does not mean I don't look forward to going home and doing something else. If you have nothing else but your job... no offense, but it might be time to reconsider a thing or two.

Another point brought up was the fine line between learning for yourself and learning on company time. I do not have a good answer. But I think you should not be using your company's tools, codebase or anything else outside working hours. Fiddle all you want, but make sure it's yours. I know US law can make this messy.

The impact of unpaid, self-inflicted overtime on company culture can be pretty bad. There are the aforementioned issues of devaluating your work and creating expectations. But there are also problems akin to what mandatory crunch can create. Very tight bonds can be created outside the normal hours, and then you don't belong unless you join in. The game industry can already suffer from boys' club or clique effects, and this compounds it, even more so when self-inflicted. Most workaholics also happen to be men...

Quick side-note on belonging: if you feel like you belong, hey, great for you! But don't dismiss someone's concerns around that as being grumpy, complaining, being emotional, overreacting, needing to cheer up. If all that sounds like gaslighting and textbook sexism, well, maybe it's for a reason...? Look inwards first before answering that no, really, Everything is Awesome.

Anyhow, that's about what I have to say on the topic. I do think people who have nothing in their life except their job should seek help of some form (entrepreneurs being a possible exception). I am a firm believer that all overtime should be paid, and that as a consequence studios would kick their employees out once the hours have been put in. Any unpaid overtime, especially voluntary, is Wrong in the grand scheme of things, and harmful to those who come next.

Did I mention we need unions? :)

Addendum: Someone else on Twitter rightfully pointed out something else. If you are prevented by your contract to use your skills for personal projects, then your only outlet for what you likely love doing is, indeed, your work. This is a very good, and sad point: in my opinion such clauses should not exist, but we're not in a perfect world. This does not change anything about getting paid for the work you do, though.