Electronic voting vastly reduces the complexity on the collection side, but then the tamperability problem looms supreme, but this could almost be solved with enough crypto cleverness, except that the public trust story then requires a tiny bit of numeracy beyond grade six math.
Perhaps an ecosystem of vote verification tools built upon a well-understood verification algorithm with an open-source reference implementation would alleviate the crypto-innumeracy problem. The voter wouldn't have to understand the math; only how to enter a magic number, press a button, and check for the expected result. Multiple implementations help ensure that no one can game the verification process (or just implement the algorithm incorrectly) without being caught out in short order. The verification would have to be implemented in such a way that the voter could tell that their vote was recorded correctly, but could not demonstrate to another that they had voted a particular way. Obviously, the average voter can't tell whether the verification algorithm is implemented correctly, but it's not the voters who would be checking that. Any interested party could do so, and the voting population at large would be using tools that were subject to scrutiny, either by direct examination of the code or by comparison of output with the reference implementation.
Also, the raw vote data of all elections (which of course would contain no data allowing voters to be personally identified) should be public, so that watchdog organizations can check that the outcome is in accordance with the votes cast. Such a data store should allow vote counts to be verified, and allow any randomly chosen voter to check that their vote is recorded correctly. I'm reasonably certain this would be straightforward to accomplish with a cryptographic voting system, but it would be basically impossible with physical ballots.
Paper tape -- or perhaps piano rolls -- as the first reel software storage method.
I see what you did there.
That book does two things that I found revelatory:
1) Exposes you to functional programming and important features thereof (such as referential transparency) from the very beginning.
2) Starts with a very high-level, functional model of computation (the Scheme language, which is essentially lambda calculus), and proceeds toward increasingly low-level models of computation, culminating in a Scheme evaluator based on a traditional stack machine. Many programming books tell that story in reverse, starting with memory and registers and instruction sets, and then explaining how high-level language constructs map onto those low-level concepts. By starting at the functional level and elaborating increasingly detailed models of physical computation, Abelson and Sussman drive home the point that computation is an abstraction that can be implemented, and thought about, in lots of different ways.
It really is a mind-blowing experience. I read it after 15 years as a professional programmer in languages from assembly through C to Lisp and Prolog, and I learned A LOT from it.
I use Sprint, and I've never had any problems with service or coverage, except that where I live the only available data service is EVDO. But I can live with that, since I use my DSL most of the time anyway. I do a significant amount of travel to various US cities, and my phone always works.
A few weeks ago I went into a local Sprint store to get a phone for my mom. I explained that I already had six lines on my "Family Everything" plan, which technically isn't allowed (s'posed to be 5 max), but I was grandfathered in from an older plan and had been a Sprint customer for like nine years. I explained that even though I was already over the line limit, I wanted to add mom's new phone as a NEW LINE to my EXISTING 3000-MINUTE PLAN. "No problem", said the sales droid. "Cool!" thinks I.
One month later I get my Sprint bill, and it's $250 higher than the previous month. WTF????? Turns out, they added a totally new account for the new phone and gave it a shitty 200-minute pool. And mom -- whose idea of high-tech is a toaster oven with a timer and was practically peeing her pants in fear when I presented her with the phone -- had apparently overcome her reservations and burned up the freakin' airwaves to the tune of 800 minutes.
So I called Sprint "Customer Care" and explained the situation. AMAZINGLY, the service person promptly moved mom's phone into my Everything plan, and told me she'd submit a refund request for $220. "Great!" I said. The other $30 was what I'd been expecting to pay for the new line anyway.
Next day, I get a call from a different layer of the Sprint customer service hierarchy. "Sorry," she says, "We can't process your refund because your plan is invalid -- you have seven lines on a 5-line plan, and the computer just won't let us issue refunds for invalid plans." I was welcome to keep my seven lines, she said, but, oh dear poor us, our computers just won't (sniffle) allow us (sob) to audit your account for a refund.
"That is the stupidest goddamn thing I've ever heard," says I. "The provisioning system will allow low-level service-trons to configure plans that the accounting system can't audit? C'mon, pull the other one." But she was immovable on this point. And I immediately made plans to switch providers as soon as I'd got my soul out of hock from the three recent phone upgrades I'd done.
One month later, I get my Sprint bill, and lo and behold, there's a mysterious $219 credit.
So now I am happy... but I'm not sure why.
I'd add a declarative language to that list, such as Prolog, Mercury, Haskell, or (the pure subset of) Scheme. A year of working with Prolog taught me more about programming (and computer science in general) than any other experience of my 20-year career.
Anyway, after awhile they all start to look like Lisp.
A computer without COBOL and Fortran is like a piece of chocolate cake without ketchup and mustard.