Tax Structure vs. Minimum Wage

| categories: economics | View Comments

My Facebook has been flooded lately with pleas to raise the minimum wage, usually delivered in the typical content-free info-graphic format. This is a question I've settled already with more than one friend with actual credentials in economics, so it's kind of an exhausting argument to be having again.

The opinion seems to be:

  • Wages are too low
  • Employers have a responsibility to pay a living wage.
  • We should codify such in law.

Where the second item comes from I have no idea; as far as I knew employer responsibility ended at "honor the fucking employment contract," but this is what's presented.

My counterargument has been as follows:

  • Minimum wages act as a tariff on labor and reduce the performance of the labor market.
  • Society is the one complaining about a living wage, so they're the better candidate to pay for it anyway.
  • Therefore increasing the EITC, or instituting a negative income tax, and allowing the "under-payed" to take advantage of such a social safety net, correctly separates the problem and doesn't deprive us of as many of the market's production benefits.

The central complaint I've dealt with has been with the second point again. The best argument I've heard is that the market is distorted in favor of employers because the politics that define it are distorted by money in politics. This starts off okay, but then it continues into the assertion that "unchecked capitalism" (whatever that means) is necessarily going to produce such a situation, so my offered solution of "fix it" isn't a valid avenue.

Let's leave both of those aside, though, and come at this another way. The minimum wage and social benefits seem at first to be very different. I believe that any two arguments can be better compared if you can state them in the most similar possible terms. In this case we'd want to make the EITC or negative income tax look like a wage restriction, or we'd want to make the minimum wage look like a tax system or credit. I believe I can make the minimum wage look like a system of tax deductions and credits. I believe I can do so to the satisfaction of minimum wage proponents, such that they would feel comfortable framing the debate around this construction of the minimum wage, and I believe that comparing that tax system to a negative income tax and other tax policy makes the debate clearer and more concise.

Let's begin assuming the negative income tax, and look at one crucial moment in either of these systems: the arrival of the low-wage employee's paycheck. Customarily, employers withhold income tax from employees and relay it to the government directly, with corrections made at the year-end W2. It follows, then, that if income tax went negative, employers would cut a larger check and seek reimbursement.

So far, so good. This transaction looks identical to the minimum wage: employers cut larger checks and employees take home more money, so from an employee perspective the two are identical. Either way it's a bigger paycheck. Of course for this to be structurally identical to the minimum wage, said negative income tax would have to be structured to flatten wages below a certain line. You might not want to do that, for a few reasons, but I'll concede it for now.

But we've involved another transaction where the negative income tax is still different: the employer usually takes withheld income tax and relays it to the government. In the case of negative income tax it would seek reimbursement, or take a credit toward how much of those withholding it had to submit. The correction is obvious: we impose an additional tax on corporations, proportional to the number of low-wage employees it has, scaled by how low their wages are, such as to negate said reimbursement. Now we've imposed the minimum wage, with the same flow of cache and a surprisingly similar amount of bureaucratic overhead, by simple manipulation of tax law.

So now we can re-frame the minimum wage position more simply:

  • The negative income tax is only rendered fair by a complementary tax on employers in exact proportion to the amount of benefits their employees receive.

That's a much smaller set of points. This argument now feels clearer. I'm inferring that I haven't stepped on any minimum-wage-proponents' toes, but if everyone's on-board, this debate is simpler.

And the question that remains is how married are you to that only and exact? I never said we couldn't raise corporate taxes per se to fund the new negative end of the tax curve, so the question becomes why is this exact tax structure the only fair way to do it? A general corporate profit tax would give a break to small business owners who aren't necessarily making much more than their low wage employees and still hit the "big evil corporations" you're blaming for the whole mess. You could actually fund part of it with a high-bracket income tax hike and get a similar effect yet again. I'm sure you could hit them hard enough to be satisfied (and I won't even suggest a limit for corporate profit or high income tax here at all!) without connecting it to any sort of job-creating activity, which should keep the market healthy.


Read and Post Comments

Valgrind etc.

| categories: luftballons, tech, valgrind | View Comments

My last post attracted some... awkward press. I didn't intend to cause a panic, and I'm hoping nobody other than Phoronix took it that way.

I hemorrhaged disclaimers in the previous post, so let's skip the apologies and get right to the point: when I took the advice I got from the Mesa devs and rebuilt libdrm with Valgrind's development headers installed, the number of errors was reduced to 3 (filed). Turning up leak checking revealed some more intrigue, but still nothing to panic about.

The point I was making was about Valgrind itself and development practices, and that still stands. I wish we could build more of our packages against Valgrind, so packages with special needs like Mesa could offer a better developer experience out of the box, but it would make the dependency tree fairly ugly, which can be its own pain.

So let's all relax. I fixed the problem I originally had and have pushed a pile of Luftballons changes. It's closer than ever to having a complete (though admittedly slow) graphics stack. Good things are happening. Everything is going to be ok.

Read and Post Comments

Valgrind is Not Optional

| categories: tech | View Comments

Disclaimer: I really don't mean to be picking on the Mesa guys. Libre graphics folk are already terribly overworked, and it's neither my place nor my intention to tell them to try harder. Nonetheless, given what I'm working on, this is the example I have.

I'm working on a rather large and complicated change to Luftballons, and I've managed to get myself into trouble with what looks like a rather nasty use-after-free bug.

No problem, I'll just fire up valgrind.

==31830== For counts of detected and suppressed errors, rerun with: -v
==31830== Use --track-origins=yes to see where uninitialised values come from
==31830== ERROR SUMMARY: 507326 errors from 743 contexts (suppressed: 2 from 2)

That's a lot of errors. And this is after I used --gen-suppressions with a known-working version.

They can't all be me, can they?

==31830== Invalid read of size 4   
==31830==    at 0x64311D0: gen7\_update\_texture\_surface (gen7\_wm\_surface\_state.c:325)
==31830==    by 0x64238F3: brw\_update\_texture\_surfaces (brw\_wm\_surface\_state.c:1497)
==31830==    by 0x63FAD91: brw\_upload\_state (brw\_state\_upload.c:501)
==31830==    by 0x63B844A: brw\_draw\_prims (brw\_draw.c:501)
==31830==    by 0x67C02E9: vbo\_handle\_primitive\_restart (vbo\_exec\_array.c:549)
==31830==    by 0x67C143C: vbo\_validated\_drawrangeelements (vbo\_exec\_array.c:968)
==31830==    by 0x67C195A: vbo\_exec\_DrawElementsBaseVertex (vbo\_exec\_array.c:1141)
==31830==    by 0x4C1FC25: mesh\_draw (mesh.c:232)
==31830==    by 0x4C23E17: draw\_op\_exec (draw\_op.c:275)
==31830==    by 0x4C274EA: draw\_proc\_run (draw\_proc.c:182)
==31830==    by 0x4C27528: draw\_proc\_run (draw\_proc.c:184)
==31830==    by 0x4C27528: draw\_proc\_run (draw\_proc.c:184)
==31830==  Address 0x7f16da073d20 is not stack'd, malloc'd or (recently) free'd

Nope. Mostly they look to be in Mesa. Thousands of them.

I've previously lost almost an entire day trying to clean this mess up. I almost thought I had the suppressions manicured enough to be worth something, and then another pile broke through.

Some of this is valgrind's fault for not having the best suppression tools in the world, but there's also something a bit worrying about a library making this much noise during normal use. The Java fans have been screaming about the dangers of using "unsafe" languages like C since as long as their kind have existed. I've always disagreed, but that was partly on the grounds that tools like valgrind existed, and, more importantly, that they were being used.

Again I can't pick on the Mesa devs too much, but as a general rule, if you are writing a C project, valgrind is not optional, released code should generate no valgrind errors, and in the case of an exception or valgrind bug, you should ship a suppression file. With the great power of a low level language comes great responsibility, and this simple and easy acceptance test finds many dangerous errors.

Valgrind is about the fourth tool that has broken on me trying to find this bug (surge of GDB bug reports to come soon). Now I'm sitting here trying to determine if hunting a few of these errors constitutes good citizenship or a dangerous slide into yak shaving. I guess it's ironic that it's my own memory mismanagement defect that's causing all the effort. No rest for the wicked I suppose.

Read and Post Comments

I Don't Care... and That's What Sets Me Apart!

| categories: politics | View Comments

The title today is a line from Jim Carey, given during an interview. He was reacting to his stated lack of interest in politics, and the kind of political candidate it might make him.

Of course nowadays Jim does care, and about some regrettably stupid bullshit at that. But the funny part about his quip is that, if that quote was all I had to go on for a politician, I'd be intrigued at least. Maybe even excited.

It's a meme that's been in and out of my life forever. From pro-choice hawks yelling that one can't understand abortion until one has held the hand of a scared girl at planned parenthood, or had a uterus of ones own, to the more topical example of a girl telling me that because she was Arab and female and a past victim of discrimination, that she really understood the Trayvon Martin case, and thus her opinion on it was more valid. She cared about discrimination more than a privileged white male like myself could, and thus her thinking on the case was more correct. Another person chimed in and suggested that one might think of the case differently if Trayvon had been a personal friend.

I've never really understood how that worked.

When did caring become an intellectual asset? Caring means wanting your team to win, not the best team. It means being wrong becomes painful and difficult to face, rather than merely part of the intellectual process. Caring inflates the raw mathematical atoms of "correct" and "incorrect" into the ostentatious mythical concepts of "right" and "wrong." Caring forms principles that resist facts. Caring makes us love ideas enough to see past their faults. Caring is wholly dysfunctional.

Politics and the media are all about caring. As Joseph Stalin famously put it, "When one man dies it is a tragedy, when thousands die it's statistics." Trayvon and institutional racism are largely demonstrating Stalin's point; even if Zimmerman had come out screaming the N-word and waving a confederate flag, the trial would prove nothing about institutional racism. One guy, one jury, one trial, one time. One point is not a line. One hate crime going unpunished is not a system of racism. What Trayvon is, is a "poster child," an excuse to care, because we don't have faith enough in empiricism, and need to care in order to act. The statistics and sociological studies to measure insititutional racism in the court system should have been done ages ago, but that would only allow us to know of institutional racism. We need to care. Trayvon lets us care in a way that the millions of gun deaths that happen every year, and the many racially divided trials resulting, do not.

It seems like there was a time when this idea wasn't radical. "Dispassionate" has been a positive adjective in recent memory. "Objective" has too, but its use is often loaded so I tend to have a distaste for it. Juries still exclude family members and people who know the victim or defendant, which everyone seems more or less OK with. So what happend? Tell me, internet, why do you care?

Read and Post Comments


| categories: tech, free software, luftballons | View Comments

Remember in my last post when I talked about video games as an example of economic inefficency created by proprietary software, because they duplicate so much effort? I've actually been thinking about that idea a lot, for a long time. More specifically I've been thinking about it in terms of the technology; the graphics engines etc. Studios are constantly competing to best eachother in graphics, and they end up creating more or less the same product; most games are about on a level. The competition is clearly driving some innovation, but the fact that they can't build on eachother's work means a lot of wasted effort to maintain what tends to look like a stalemate from without. It's not a terribly gross example of IP going haywire; again, the innovation is getting driven, but open source has been very good at cutting out this kind of inefficiency, for better or worse.

I guess what I'm trying to say is I'm writing a video game engine.

Meet Luftballons.

There's more than a few open video game engines out there. It's probably fair to ask why write another one. To be fair, the eventual scope of Luftballons is to be much more than an engine; I'd like to build an entire suite of open source game development tools that will allow users to develop games from start to finish (there's some proprietary things like this already, but for paranoia's sake I'm not mentioning them). I could build that around another engine, and of the other options out there I'd say I probably looked closest at the nominally successful Ogre3d, but after reading that it did not intend to support deferred rendering pipelines, I decided to sniff around elsewhere. Eventually I conceptualized something unique enough that I felt it was worth striking out on my own.

Luftballons is basically an experiment in how much difficulty I can remove from the OpenGL API without removing any significant functionality. I chose to aggressively target modern OpenGL (somewhat tempered by Mesa only just barely implementing OpenGL 3 on most hardware), and build a framework that would cater to most of the use cases in question, but be dramatically less intricate than OpenGL. The trick is in considering what the OpenGL API can do, but abstracting away the how; removing all the tiny decisions around order of operations and allocation methods and whether to use instanced geometry, etc. The theory is that we can expose a simpler API that is feature-competitive with the raw drawing API if we don't worry about performance and just assume the most obvious way to draw is fine for everyone. The much more exciting theory is that we can then teach the implementation to be clever and do the optimization behind the scenes without hassling the user with more details. More importantly, a simple API is inherently more future-proof, as new OpenGL features just mean small API extensions or improvements to that under-the-hood optimization.

There's obviously a lot more to do, as well as some cleanup on what I already have (hand-rolling makefiles is great! I've only done it for one project and already my hatred of Automake is completely gone! (seriously, early adopters, I swear it will be in autotools within a week. Promise.)) but I have high hopes. Absorbing that inefficiency I mentioned means creating a ubiquitous open source game development platform. Whether it is this project or something else that does it, I'm hoping to one day reach a point where building a new game without using the most common open game engine is as absurd as building a new embedded platform without using the Linux kernel.

In the meantime, who wants to play with GLSL?

Read and Post Comments

« Previous Page -- Next Page »