I think calling the article "really stupid" is excessive although I agree it hardly brings anything new to the table. That is fine, but the title had me expecting a little more. As it is I find it a poor re-hash of Pierre Bourdieu's work on cultural capital ("The Inheritors"). I recommend it, it's marvelously well-written in French. Unfortunately, I do not have an English translation to recommend.
I've seen quite a few articles and studies that say that government projects aren't actually more expensive than private projects.
The impression is created because (a) the media will report on a government-run project over budget because they actually get that data (unlike private cost overruns), and the public cares more about these projects. And, (b), government projects are more likely to start with an initial estimate that is too low, because that's beneficial to getting a project approved.
Speaking to your argument about accountability: Do you think the CEO of GE is really more afraid of the shareholders than the mayor of some city in Kansas? Politicians are plenty accountable. And for something like the federal government, projects are managed by employees, who are managed by agency heads. The latter get a budget and have to work within it.
Say you're the head of the National Park Service: If your new visitor centre at Yellowstone gets swallowed in a geyser, will you not face exactly the same consequences as someone at Disneyland tasked with building a new ride?
There are two things that everyone concerned should be doing all the time right now, and they're by far the most important things.
You should NOT be bothering with online petitions or emailing.
1. The best thing you can do to be heard and get your congressperson to pay attention is to have face-to-face time - if they have town halls, go to them. Go to their local offices. If you're in DC, try to find a way to go to an event of theirs. Go to the "mobile offices" that their staff hold periodically (all these times are located on each congressperson's website). When you go, ask questions. A lot of them. And push for answers. The louder and more vocal and present you can be at those the better.
2. But, those in-person events don't happen every day. So, the absolute most important thing that people should be doing every day is calling. You should make 6 calls a day: 2 each (DC office and your local office) to your 2 Senators & your 1 Representative.
Any sort of online contact basically gets immediately ignored, and letters pretty much get thrown in the trash (unless you have a particularly strong emotional story - but even then it's not worth the time it took you to craft that letter).
Calls are what all the congresspeople pay attention to. Every single day, the Senior Staff and the Senator get a report of the 3 most-called-about topics for that day at each of their offices (in DC and local offices), and exactly how many people said what about each of those topics. They're also sorted by zip code and area code. Republican callers generally outnumber Democrat callers 4-1, and when it's a particular issue that single-issue-voters pay attention to (like gun control, or planned parenthood funding, etc...), it's often closer to 11-1, and that's recently pushed Democratic congressmen on the fence to vote with the Republicans. In the last 8 years, Republicans have called, and Democrats haven't.
So, when you call:
A) When calling the DC office, ask for the Staff member in charge of whatever you're calling about ("Hi, I'd like to speak with the staffer in charge of Healthcare, please") - local offices won't always have specific ones, but they might. If you get transferred to that person, awesome. If you don't, that's ok - ask for their name, and then just keep talking to whoever answered the phone. Don't leave a message (unless the office doesn't pick up at all - then you can...but it's better to talk to the staffer who first answered than leave a message for the specific staffer in charge of your topic).
B) Give them your zip code. They won't always ask for it, but make sure you give it to them, so they can mark it down. Extra points if you live in a zip code that traditionally votes for them, since they'll want to make sure they get/keep your vote.
C) If you can make it personal, make it personal. "I voted for you in the last election and I'm worried/happy/whatever" or "I'm a teacher, and I am appalled by Betsy DeVos," or "as a single mother" or "as a white, middle class woman," or whatever.
D) Pick 1-2 specific things per day to focus on. Don't go down a whole list - they're figuring out what 1-2 topics to mark you down for on their lists. So, focus on 1-2 per day. Ideally something that will be voted on/taken up in the next few days, but it doesn't really matter - even if there's not a vote coming up in the next week, call anyway. It's important that they just keep getting calls.
E) Be clear on what you want - "I'm disappointed that the Senator..." or "I want to thank the Senator for their vote on..." or "I want the Senator to know that voting in _____ way is the wrong decision for our state because..." Don't leave any ambiguity.
F) They may get to know your voice/get sick of you - it doesn't matter. The people answering the phones generally turn over every 6 weeks anyway, so even if they're really sick of you, they'll be gone in 6 weeks.
From experience since the election: If you hate being on the phone & feel awkward (which is a lot of people) don't worry about it - there are a bunch of scripts (Indivisible has some, there are lots of others floating around these day). After a few days of calling, it starts to feel a lot more natural. Put the 6 numbers in your phone (all under P – Politician. An example is McCaskill MO, Politician McCaskill DC, Politician Blunt MO, etc...) which makes it really easy to click down the list each day.
> But if you bring this up to most Windows people they tell you to use IO completion ports, which are totally different and require the core of the program to be redesigned
IO completion ports and epoll both require the programs flow logic to be designed for them. If a program has been designed for synchronous IO, a redesign is required to take advantage of any asynchronous IO pattern. There's no magic fairy dust that allows you to magically drop "asynchronous" to an otherwise synchronous program.
The reactor pattern (Windows overlapped IO) is - at least theoretically - more scalable than the proactor pattern (Linux epoll/aio).
Under the proactor pattern (Linux epoll/aio) the process must indicate it's desire to perform an IO operation. The OS will notify the process through a callback/event when the IO resource is available for the operation, and must then perform the actual operation. However at that point there is no guarantee that all of the IO will be completed - the OS will inform you how many bytes were actually read/written, and it is your responsibility to wait for the next "ready" event before trying again.
Under the reactor pattern (Windows overlapped IO) the process asks the OS to perform the IO operation directly. The operation is started by the OS while the call returns immediately. When the operation has been carried out, the OS notifies the process through a callback/event. There is no complexity in managing partially transfers - the transfer in the responsibility of the OS and you'll receive notice when it's completed. IO completion ports is actually a thread pool dedicated to IO ops, and queuing is built-in.
The proactor pattern (Linux/epoll) requires a context switch between the IO resource becoming ready for the operation and the actual operation (higher latency). If transfers are partially completed - e.g. large transfers - you'll have extra context switches for each remaining transfer operation (lower throughput).
The reactor pattern (Windows) allows the OS to directly complete the operation without a preceding context switch (lower latency), only notifying the process when done, thus avoiding unnecessary context switches even for large buffers (higher throughput).
Both approaches require the program to be deliberately designed to support asynchronous IO. However, the Windows API was always designed with overlapped (asynchronous) IO in mind, Windows IO completion ports was designed in NT from the start. The problem was always (for both platforms) how to coach the developers to actually leverage the asynchronous APIs as opposed to the simpler-to-understand synchronous APIs.
The new Windows Runtime API takes it a step further and requires virtually all IO to be asynchronous (there simply are no synchronous versions any more). That is coupled with programming language innovations like async/await (C#/VB.NET) which makes it very easy indeed to take advantage of this.