86 Posts Tagged 'Rant'
2011 was an interesting year. A year of firsts!
- I worked on my first book, Clojure Programming (soon to be released, in fine bookstores near you).
- I bought my first house.
- The first of my maternal grandparents died.
Hmm, kind of took a turn for the worst there. Then, one fine sunny day in 2011, sitting at my favorite pub, enjoying my favorite beer, I started coughing up blood. Another first!
Now that Windows 7 is out, it's only a matter of time before I'm forced to buy it. I don't want it. I won't use it. But as a programmer, it's nearly impossible to survive without owning a copy of the
latest and greatest latest version of Windows.
Why? Because if you want a job, unless you're one of the fortunate few who get to pick your development platform AND dictate the platform for all of your users, you need to know Windows. You need to know how to navigate around it when you're forced to use it on your work computer. You need to know how to troubleshoot (to some degree) your users' Windowsy problems as they try to install and use your program. If you want to communicate with people in the world, inevitably they're going to send you a bunch of MS Word documents and nothing is ever going to read them properly 100% of the time except MS Word itself.
I have a copy of Vista Business on my laptop which I am deeply ashamed for having bought, but at the same time it helped me land a very nice work contract. Without being able to VPN into the company's network (via some MS proprietary VPN software that I tried VERY hard and failed to get to work in Linux) I wouldn't have been able to complete the job on time, and I might be living in a cardboard box under a bridge right now.
For this contract I actually developed the app at home entirely in Linux. I used only Linux-centric tools (Vim, Gimp, Firefox, Ruby etc.). Thank God most of those tools have Windows versions, because deploying it to Windows land at work and working on it there when necessary was (mostly) trivial. But I still needed Windows to finish the job. And all the users of this app were Windows users. The specs for the app were sent to me in Word and Excel documents. The website frontend is being viewed in IE much of the time in spite of my pleadings to the contrary, so I have to support it.
Such is the life of a programmer. I'll probably buy Windows 7 eventually but it'll sting. It'll rankle.
I spend a lot of time talking about what I don't like about various languages, but I never talk about what I do like. And I do like a lot, or I wouldn't spend so much time programming and talking about programming.
So here goes. I like the syntax of Lisp. I like the prefix notation and the parentheses.
A common criticism of Lisp from non-Lispers is that the syntax is ugly and weird. The parentheses are impossible to keep balanced. It ends up looking like "oatmeal with fingernail clippings mixed in".
Also, prefix notation is horrible.
1 + 2 is far superior to
(+ 1 2). Infix notation is how everyone learns things and how all the other languages do it. There are countless numbers of people (example) who have proposed to "fix" this, to give Lisp some kind of infix notation. The topic inevitably comes up on Lisp mailing lists and forums.
Partly this is subjective opinion and can't be argued with. I can't say that Lispy parens shouldn't be ugly for people, any more than I can say that someone is wrong to think that peanut butter is gross even though I like the taste of it. But in another sense, does it matter that it's painful? Does it need to be changed? Should the weird syntax stop you from learning Lisp?
Prefix Notation: Not Intuitive?
There is no "intuitive" when it comes to programming. There's only what we're used to and what we aren't.
= mean in a programming language? Most people from a C-ish background will immediately say assignment.
x = 1 means "give the variable/memory location called
X the value
= is actually an equality test or a statement of truth.
2 + 2 = 4; this is either a true or false statement. There is no "assignment". The notion of assignment statements is an odd bit of programming-specific jargon. In most programming languages we've learned instead that
== is an equality test. Of course some have
:= for assignment and
= for equality tests. But
== seems to be more common. Some languages even have
x.equals(y). Even less like what we're used to. (Don't get started on such magic as
Most of us have no problem with these, after a while. But few of us were programmers before we learned basic math. How many of us remember the point in time when we had to re-adjust our thinking that
= means something other than what we've always learned it to mean? I actually do remember learning this, over a decade ago. This kind of un-learning is painful and confusing, there's no question.
But it's also necessary, because these kinds of conventions are arbitrary and vary between fields of study (and between programming languages). And there are only so many symbols and words available to use, so we re-use them. None of the meanings for
= is "right" or more "intuitive" than the other.
= has no inherent meaning. It means whatever we want it to mean. Programming is chock-full of things like this that makes no sense until you memorize the meaning of them.
Consider a recent article that got a lot of discussion, about why all programmers should program in English. How much less intuitive can you get, for a native speaker of another language to program using words in English? Yet they manage. (Have you ever learned to read sheet music? Most of the terms are in Italian. I don't speak a word of Italian, yet I managed.)
The point is that it's very painful to un-learn things that seem intuitive, and to re-adjust your thinking, but it's also very possible. We've all done it before to get to where we are. We can all do it again if we need to.
Prefix notation is unfamiliar and painful for many people. When I first started learning Lisp, the prefix notation was awfully hard to read without effort, even harder to write. I would constantly trip up. This is a real distraction when you're trying to write code and need to concentrate. But it only took me maybe a week of constant use to ingrain prefix notation to the point where it didn't look completely alien any longer.
At this point prefix notation reads to me as easily as infix notation. I breeze right through Lisp code without a pause. In Clojure, you can write calls to Java methods in Java order like
(. object method arg arg arg) or you can use a Lispy order like
(.method object arg arg arg); I find myself invariably using the Lispy way, as does most of the community, even though the more traditional notation is available.
You can get used to it if you put in a minimal amount of effort. It's not that hard.
Benefits of Prefix Notation
Why bother using prefix notation if infix and prefix are equally good (or bad)? For one thing, prefix notation lets you have variable-length parameter lists for things that are binary operations in other languages. In an infix language you must say
1 + 2 + 3 + 4 + 5. In a prefix language you can get away with
(+ 1 2 3 4 5). This is a good thing; it's more concise and it makes sense.
Most languages stop at offering binary operators because that's as good as you get when you have infix operators. There's a ternary operator
x?y:z but it's an exception. In Lisp it's rare to find a function artificially limited to two arguments. Functions tend to take as many arguments as you want to throw at them (if it makes sense for that function).
Prefix notation is consistent. It's always
(function arg arg arg). The function comes first, everything else is an argument. Other languages are not consistent. Which is it,
foo(bar, baz), or
bar.foo(baz)? There are even oddities in some languages where to overload a
+ operator, you write the function definition prefix,
operator+(obj1, obj2), but to call that same function you do it infix,
obj1 + obj2.
The consistency of Lisp's prefix notation opens up new possibilities for Lispy languages (at least, Lisp-1 languages). If the language knows the first thing in a list is a function, you can put any odd thing you want in there and the compiler will know to call it as a function. A lambda expression (anonymous function)? Sure. A variable whose value is a function? Why not? And if you put a variable whose value is a function in some place other than at the start of a list, the language knows you mean to pass that function as an argument, not call it. Other languages are far more rigid, and must resort to special cases (like Ruby's rather ugly block-passing syntax, or explicit
Consistency is good. It's one less thing you have to think about, it's one less thing the compiler has to deal with. Consistent things can be understood and abstracted away more easily than special cases. The syntax of most languages largely consists of special cases.
Parens: Use Your Editor
The second major supposed problem with Lisp syntax is the parens. How do you keep those things balanced? How do you read that mess?
Programming languages are partly for human beings and partly for computers. Programming in binary machine code would be impossible to read for a human. Programming in English prose would be impossible to parse and turn into a program for a computer. So we meet the computer halfway. The only question is where to draw the line.
The line is usually closer to the computer than to the human, for any sufficiently powerful language. There are very few programing languages where we don't have to manually line things up or match delimiters or carefully keep track of punctuation (or syntactic whitespace, or equivalent).
For example, any language with strings already makes you pay careful attention to quotation marks. And if you embed a quotation mark in a quote-delimited string, you have to worry about escaping. And yet we manage. In fact I think that shell-escaping strings is a much hairier problem than balancing a lot of parens, but we still manage.
This is sadly a problem we must deal with as programmers trying to talk to computers. And we deal with it partly by having tools to help us. Modern text editors do parenthesis matching for you. If you put the cursor on a paren, it highlights the match. In Vim you can bounce on the
% key to jump the cursor between matching parens. Many editors go one step further and insert the closing paren whenever you insert an opening one. Emacs of course goes one step further still and gives you ParEdit. Some editors will even color your parens like a rainbow, if that floats your boat. Keeping parens matched isn't so hard when you have a good editor.
And Lisp isn't all about the parens. There are also generally-accepted rules about indentation. No one writes this:
(defn foo [x y] (if (= (+ x 5) y) (f1 (+ 3 x)) (f2 y)))
That is hard to read, sure. Instead we write this:
(defn foo [x y] (if (= (+ x 5) y) (f1 (+ 3 x)) (f2 y)))
This is no more difficult to scan visually than any other language, once you're used to seeing it. And all good text editors will indent your code strangely if you forget to close a paren. It will be immediately obvious.
A common sentiment in various Lisp communities is that Lispers don't even see the parens; they only see the indentation. I wouldn't go that far, but I would say that the indentation makes Lisp code easily bearable. As bearable as a bunch of gibberish words and punctuation characters can ever be for a human mind.
When I was first learning Lisp I did have some pain with the parens. For about a week. After learning the features of Vim and Emacs that help with paren-matching, that pain went away. Today I find it easier to work with and manipulate paren-laden code than I do to work with other languages.
Benefits of the Parens
Why bother with all the parens if there's no benefit? One benefit is lack of precedence rules. Lisp syntax has no "order of operations". Quick, what does
1 + 2 * 3 / 4 - 5 mean? Not so hard, but it takes you a second or two of thinking. In Lisp there is no question:
(- (+ 1 (/ (* 2 3) 4)) 5). It's always explicit. (It'd look better properly indented.)
This is one less little thing you need to keep in short-term memory. One less source of subtle errors. One less thing to memorize and pay attention to. In languages with precedence rules, you usually end up liberally splattering parens all over your code anyways, to disambiguate it. Lisp just makes you do it consistently.
As I hinted, code with lots of parens is easy for an editor to understand. This make it easier to manipulate, which makes it faster to write and edit. Editors can take advantage, and give you powerful commands to play with your paren-delimited code.
In Vim you can do a
ya( to copy an s-exp. Vim will properly match the parens of course, skipping nested ones. Similarly in Emacs you can do
C-M-k to kill an s-exp. How do you copy one "expression" in Ruby? An expression may be one line, or five lines, or fifty lines, or half a line if you separate two statements with a semi-colon. How do you select a code block? It might be delimited by
do/end, or curly braces, or
def/end, or who knows. There are plugins like matchit and huge syntax-parsing scripts to help editors understand Ruby code and do these things, but it's not as clean as Lisp code. Not as easy to implement and not as fool-proof that it'll work in all corner cases.
ParEdit in Emacs gives you other commands, to split s-exps, to join them together, to move the cursor between them easily, to wrap and unwrap expressions in new parens. This is all you need to manipulate any part of Lisp code. It opens up possibilities that are difficult or impossible to do correctly in a language with less regular syntax.
Of course this consistency is also partly why Lisps can have such nice macro systems to make programmatic code-generation so easy. It's far easier to construct Lisp code as a bunch of nested lists, than to concatenate together strings in a proper way for your non-Lisp language of choice to parse.
Yeah Lisp syntax isn't intuitive. But nothing really is. You can get used to it. It's that not hard. It has benefits.
Sometimes it's worth learning things that aren't intuitive. You limit yourself and miss out on some good things if you stick with what you already know, or what feels safe and sound.
I can pinpoint the exact page in Real World Haskell where I became lost. I was reading along surprisingly well until page 156, upon introduction of
At that my point my smug grin became a panicked grimace. The next dozen pages were an insane downward spiral into the dark labyrinth of Haskell's type system. I had just barely kept
class and friends straight in my mind.
type I managed to ignore completely.
newtype was the straw that broke the camel's back.
As a general rule, Haskell syntax is incredibly impenetrable.
<-? I have yet to reach the chapter dealing with
>>=. The index tells me I can look forward to such wonders as
<|>. Who in their right mind thought up the operator named
.&.? The language looks like Japanese emoticons run amuck. If and when I reach the
\(^.^)/ operator I'm calling it a day.
Maybe Lisp has spoiled me, but the prospect of memorizing a list of punctuation is wearisome. And the way you can switch between prefix and infix notation using parens and backticks makes my eyes cross. Add in syntactic whitespace and I don't know what to tell you.
I could still grow to like Haskell, but learning a new language for me always goes through a few distinct stages:
Curiosity -> Excitement -> Reality Sets In -> Frustration -> Rage ...
At Rage I reach a fork in the road: I either proceed through Acceptance into Fumbling and finally to Productivity, or I go straight from Rage to Undying Hatred. Haskell could still go either way.
I installed Internet Explorer 8 today. I need it to test the websites at work. I couldn't care less if my personal sites render properly in IE at this point, but I must accommodate people at work.
I should mention right off the bat that given the way Microsoft takes a dump all over web standards and the hours and hours of grief as a web developer trying to get sites to look proper in IE6, unless IE8 crapped gold nuggets every time I clicked a link I don't think I'd like it.
I wasn't disappointed. IE8 is hate-worthy. A steaming pile of offal. First there was the joy of trying to install it.
Why does installing a web browser require checking my computer for "malicious software"? Why can't I opt out of this? In any case I didn't have to worry about it, because the first time I tried the install, it bombed before it got that far, and demanded that I go to the Windows Update site and install some patch for IE7 before I could continue. Note: I don't have IE7 on my computer. This is a work machine that I kept IE6 on for testing our company websites. This blew my mind.
So I tried to download this patch for IE7, but I couldn't, because I had to get Windows Genuine disAdvantage first. Rage filled me at this point to the point of overflowing. If it was my home computer I'd have stopped right there. But I need this garbage for work, so I held my nose and did it.
Of course the patch required a reboot. Reboot #1.
Now I was able to continue with the install. A slow, plodding download; I think it took 5-10 minutes to do its thing, but it's hard to tell. There was no progress bar to show me how far along it was, nothing to tell me the elapsed time, no indication how large the files were that were being fetched. There is something resembling a progress bar, but it doesn't actually show you much in the way of "progress". Instead a little green thing bounces around like the car from Knight Rider. How much cocaine do you need to imbibe to invent a GUI like this?
Of course IE8 itself required a reboot. Reboot #2.
Why? Installing Firefox and Opera don't require reboots. They download as self-contained
.exe installer files. I run them and software appears. This is 2009, for the love of God. Maybe in 20 more years Microsoft will finally manage to re-invent
The IE8 install, including patching and reboots, took me 45 minutes. If I had to do this on more than one machine, I'd probably jump out the window. How much time have you sucked out of my life, Microsoft? To compare, I decided to install Opera. Opera took less than one minute to download AND install and didn't require a reboot.
When you first open it up, it sends you through a wizard and asks you if you want to enable a bunch of crap. I said no to everything. What the hell is an "Accelerator"? I assumed it was something that tried to make web pages load faster, like the download accelerator scams you used to get popups for all the time in 2001. So I said no.
Turns out "Accelerators" are plugins. Why didn't they call them Plugins? Did some marketroid decide "plugin" wasn't EXTREME enough, so decided to make up their own word? Why do I have to relearn the English language every time someone releases new software? Not Invented Here syndrome?
Windows tried to default me to Live Search, but I give it credit for being upfront in allowing me to turn that crap off and use Google. (No doubt thanks to US anti-trust court proceedings.) 473 wizard dialogs later I had a browser.
The next thing I noticed is more lame attempts to push more Microsoft services at me. In the URL bar every time you type anything, you see this:
Awesome. Is there any way to remove this spamvertisement other than installing Windows Search? If I planned to use IE8, which I don't, I imagine I'd inevitably click that by accident, which is probably the whole idea.
IE8 also added a bunch of useless garbage to my bookmarks toolbar which I insta-deleted. Or tried to. My favorite feature of IE8 by far is this one:
Apparently deleting things from the bookmarks toolbar is just too much for a modern 4-core CPU to handle. Congrats Microsoft. Hang, crash, boom.
There is no menu in IE8 by default. No wait, there is a menu. It's just in the wrong place (lower right side of the top browser area), and instead of readable text it's mostly unlabeled buttons with tiny arrows next to it.
It's like a traditional menu and a fun mystery novel combined! What is in the dropdown next to the house? I'm sure it's a fun surprise.
And actually you can get the old menu to appear too, if you press
Alt. Insanity. But it doesn't appear at the top, it appears under the URL bar. One of the few arguably good things about Windows is that programs have consistent GUI parts and work the same way: they have a menu at the top, it's always in the same one place, there's a
File and an
Edit, and it's predictable. Thanks Microsoft for getting even that wrong.
When I highlight text on a web page, a little blue thing appears that I think I'm supposed to click on. The icon is a bunch of lines and squiggles and an arrow or something. There's no indication what that thing actually does. I clicked it out of curiosity and get a menu full of a bunch of random options like "Search for this". I think this is where ACCELERATORS are supposed to pop up, or something, who cares?
Fonts in IE8 look fuzzy. As a bonus, after installing IE8, fonts in a bunch of other programs (Outlook) are fuzzy now too. Hurrah! IE8, like its predecessors, apparently extends its tendrils into every nook and cranny of your system, corrupting and perverting as it goes. Maybe that's why it needed to reboot my computer twice to install it.
IE8 comes with a Firebug ripoff, which is better than View Source invoking Notepad, but took a full 2 minutes to load when I tried to open it the first time.
IE8 does render my blog properly, which is good. IE7 does too, I think, I only tested it once. I'm not losing sleep over it. Thank you Firefox and Opera: if you didn't exist and put the pressure on, we'd all still be using IE6 and I'd still be writing all my web pages twice to make sure they work in Internet Excrementplorer. As much as I detest IE, if people migrate to IE8 from the shard of utmost evil that is IE6, I'll be happy.
I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone.
I have to agree. My phone at work is indecipherable. What do these buttons do?
- Call Park
- VM Transfer
- Some kind of little squiggle
To the best of my knowledge, there are only so many things you can DO with a phone. It rings, and then you pick it up and talk. Or it rings, you don't pick it up and it goes to voicemail. There are also HOLD and CONF (conference call?) buttons which I never use, but I'll allow that they can be useful. But the rest of those? In my wildest imaginings I can't fathom what they might do.
The phone also has a bunch of lights all over it. Sometimes they light up one color, sometimes another. Sometimes they blink and sometimes they light up steadily. There must be some kind of pattern to them but I don't know it. When lights start lighting up I start pressing buttons and talking to the empty room like a madman, and when someone talks back to me or the lights go out (whichever comes first) I consider that a victory.
What pioneer came up with hidden voicemail options? I call my voicemail, it tells me "To listen to messages, press 1, to do blah blabbity blah, press 2", etc. But there's a HIDDEN OPTION 0 to configure the voicemail, which the disembodied phone demon never tells me about. Why is this knowledge hidden? Is it too powerful for the average phone-user? Do you have to prove yourself worthy of the knowledge first?
I'd like to read a manual for the phone, but I don't think a manual exists. No one knows how the phones work at my job. What knowledge actually exists is sort of spread around via word-of-mouth, like the tribal history of some primitive civilization passed down from generation to generation by village elders telling stories around a campfire.
Is this what people who aren't good at computers feel like when they sit down at a keyboard? Do they look at a screen and see a bunch of meaningless squares and colors and words, where I see buttons and menus and useful GUI widgets?
The stylus that comes with a Nintendo DS is a very mild form of hand torture. Not sure whose hands those were designed for, but not mine. In googling for a good replacement, I chanced upon a blog post which suggests finding a nice big ballpoint pen and jamming a DS stylus inside so just the tip sticks out. This works amazingly well. It's not as portable, but I will make that sacrifice to prevent being crippled.
I am in fact always a bit worried about preserving the health of my hands. I have no hard data to support this, but I suspect my generation may have major hand-related problems in the coming decades. What with computer keyboards and tiny cell-phone and PDA keys and lots of other techy things. Many of us use our hands to communicate almost as much as our voices. Until we have Star Trek voice-recognition software, this will be a problem.
I started experiencing a lot of aches and pains in my hands and wrists a decade or so ago, and I attributed it to computer use. Since I started paying more attention, things are better. I maintain a very comfortable typing position for my hands. I have a nice big comfortable mouse. And so on. My hands don't hurt any longer nowadays, which is nice. If I become unable to type someday, I'm completely screwed. How can I work as a programmer if I can't input text into a computer? And I won't be able to draw or do origami or play video games or do many other things I enjoy.
For my programming entertainment needs, I frequent Slashdot and Reddit, but lately also Stack Overflow. Stack Overflow is turning out to be a good source of information. I've posted some very obscure Emacs questions and gotten great answers in a few hours. Any question you post, no matter how obscure, is likely to be pounced upon by rabid reputation-seeking answerers.
What is it about a slowly-increasing numeric representation of your value as a human being that is so appealing? This is one thing Perl Monks got right early on. People there always say XP points don't matter, but I think it does on some level. It's just a silly number, but even knowing it's silly, on some deep dark level, you look at someone with 10,000 XP differently from someone with 400.
I think one of the best things you can experience as a programmer is for other programmers to think (and say) that you're smart. Maybe that's true of all professions and hobbies, but I know it's true of most programmers. Anything which takes good advantage of that fact of programmer psychology is on track to become successful.
Only bad thing about Stack Overflow is how saturated it is with .NET and Java. If you can wade through that crap, you can find some cool stuff.
Amarok 2 was released on December 10th. I have KDE 4 on my experimentation laptop, so I tried it. I don't like it. Aside from technical glitches and missing features which will hopefully be added again someday, the whole idea of it is wrong.
Amarok 1.4 is good because it gives you extremely dense, detailed information about your songs. I've got 13 columns of information in the playlist pane and I look at them all. Score, Rating, Play Count, Year, Disc number, Track number... I like to see these things. I like to sort by these things. I like being able to see the bitrate of my MP3s at a glance. I'm a nerd, that's why I'm using Linux in the first place.
Amarok 2 on the other hand has a tiny little column down the right hand side to display song information. It groups things together so you don't need as many columns, but it's nowhere near what Amarok 1.4 gives you. Bad bad bad.
On the very rare occasion I want to see lyrics or something, in Amarok 1.4 they're hidden away in tabs I can ignore most of the time. This is good. The majority of my window should be devoted to DISPLAY SONGS.
Instead, in Amarok 2, half of the GUI is devoted to this center pane to display "context" information. This is bad. I don't care about browsing web sites to buy music, or browsing Wikipedia from inside my music player, or "discovering" new music. And if I did care, I would use a WEB BROWSER. A music player is not a web browser. If I want to discover music, I'll go use last.fm or some website that's devoted to it, using Firefox. If I want to see a Wikipedia article, I'll look at Wikipedia in Firefox.
Music players should play music, and web browsers should browse websites. When you have one enormous program that tries to do both, it just ends up doing both poorly. This is nearly universally true and it's certainly true in what I've seen so far in Amarok 2.
KDE 4 isn't even usable (as of KDE 4.2 beta1) and Amarok 2 fits right in, unfortunately. I hope they give us back some of the things that made Amarok 1.4 great. Or else that Amarok 1.4 keeps working for a long time.
In the news there is a recent study of math and science education internationally. A lot of the stories set a "US improves in math!" tone. The most negative tone I've seen is "US science performance plateaus".
How hard is it to say that math and science education in the US sucks? Because it does. See the image at the end of this post for one reason why.
In the meantime here's an anecdote. I went to school in semi-rural western Pennsylvania. My math education was pretty sound. Our high school had agreements with a local college so that I even got to take college-level calc while in high school. I held up well and I was competitive when I ended up in calc 2 in college.
Science was another matter. I consider myself to be not entirely an idiot, but I was given nothing to work with in high school when it came to science. My physics and chemistry classes were disgusting. My best physics class was taught by an evangelical Christian who sneaked God into class sometimes (without my realizing at the time how wrong that was). My other physics class was taught by someone who didn't even know the subject. I took a standardized college-entrance exam in physics and I think I scored in the 20-something'th percentile even among Americans.
Meanwhile in my computer programming class I was working on ancient iMac G3's (the crayon-colored space ship cube kind) which barely ran a C compiler. I think we used either Borland or Code Warrior; I don't remember, and it doesn't matter because it didn't work. We had to resort to using QBasic in a Windows 95 virtual machine on the Mac's.
Our library had Macintosh Classics (the box-shaped ones from the early 1500's, with tiny little built-in monochrome screens). There was one computer in the library with internet access, which ran only DOS and could only access the national weather service and some library catalogs. I used to go edit AUTOEXEC.BAT to do horrible things.
The priority at the school was clearly not science education. It was sports. We dumped huge amounts of money into a new sports stadium. Cheerleading and swimming were the most important things happening. No one gave the slightest crap whether anyone learned science at that school. And I suffered for it.
If I hadn't been motivated to teach myself how to program in my spare time, where would I have ended up? Even more behind in college than I was? Not in college at all?
Is it any wonder that at college, most of my classes were taught by non-Americans, and a very sizable portion of students were non-American? This in a city NOT known for its diverse international population. People flew in from elsewhere, went to school for 4-8 years and left. Down the street at CMU the American-to-non-American ratio was even more extreme.
The anti-intellectual, anti-science attitude of many Americans is what I detest most about this country. Science is the most important thing that human beings do. Science is what enables modern life. People owe science and scientists more than they could ever imagine. And instead people take it entirely for granted, and spit in the face of science at every turn.
Now, here's something to make you puke up your breakfast. Public acceptance of evolution, by country. I won't post much about this subject because it would be mostly profanities.