So I am really liking Java!
I enjoy the way it handles interfaces and inheritance -- for all the stubborn rigidity of OOP there is a huge amount of flexibility and design facility and extensibility and formality of interface and such to be had by buying into the model and making my programs object-oriented, and I now understand, intuitively and and by my own experience, why an instructor should want to teach object-orientated programming with Java rather than with C++.
I of course still love C++ for what it is: it has seemed so natural to me, at least of habit, to sit down at my computer and ponder for 10 minutes about the structure of a program, and not write anything down, and then throw 500 lines of code into Vim and watch my organization evaporate as the procedural-OOP-hybrid web I have woven that is holding me up above a horrendous pit of GOTOs and pointer arithmetic and manual memory management gives way ... I eventually redesign my way out of this foetid hole, but some nasty things have crawled all over my skin, and I cannot help but to wipe them off on the fabric of the program -- and so I have weird things appearing all over the place, like gotos at the bottom of while loops, classes that are logically related but are not implemented so due to strange inheritance issues cropping up that render life incompatible with code, and countless other instances of silliness that are permitted by the language's unabashed promiscuity, by its eager willingness to do whatever you want it to do, whether in good taste or not, if only you speak the words just so, get the syntax spot-on, and so on and so forth -- but the fact that these ill-begotten schemes appear at all is, of course, the coder's own doing. Java on the other hand has a greater sense of tact, it generally seems to enforce responsibility and good character (ASCII, UTF-8, UTF-16 and ISO-8859-1). I have never seen something particularly unsavory in Java happen merely ex virtue of its own excessive permissiveness, though any good thing can, of course, be corrupted! Bad design is bad design, yes, and in Java it seems it can only go so far. But C++ invites, beckons, almost insists that you get down and dirty, exposing the underlying architecture, permitting unchecked pointer-play, contorting itself on a per-compiler basis. With C++ I have even been able to gain uncontested read-write access to explicitly private members of certain kinds of classes, while Java could not tolerate such violation.
Learning C, C++ and assembly first and knowing a thing or two or twelve about how computers work and being a (self-proclaimed) good programmer has improved my Java programs with a few tricks that really work in most of these kinds of languages. For example, I recently implemented ROT-n in Java, and I'll be damned if I was going to consider lower- and upper-case characters separately! So I saved the capsbit, ANDed it out, made the rotation, ORed the bit back in. But how much fun is bitwise manipulation without being able to peek and poke? There's a point at which it becomes academic.
It is becoming clear to me why many people say that the CS track makes you hate programming -- indeed, before I started doing these Java projects, I enjoyed programming in the way described above. Now, to "program" in Java, not only do I have to write a program but first I have to break my thoughts down and organize them in terms not only of what the language will allow, but also of what such-and-such programming paradigm will support. If the end-user requires to catalog a pile of Birthday cards, baseball cards, business cards and post-it notes that came out of a drawer he was cleaning, then it might behoove me to define a virtual parent class PaperJunk and ordain its abstract members with the Breath of Life in the derivative classes GreetingCard, SportsCard, Note and BusinessCard ... but not if my client has requested GW-BASIC for whatever perverse purpose about which he pretends. So now I know that when I will be programming in the future, I will be doing something special that isn't writing code but rather investigating and illustrating the techniques and methods and theories of the field of computer science, and I cannot, neither legally nor logically, do this "the old way." And I bear this in mind when I say that I have been torturing myself for the past two weeks and I cannot wait to get out of the shithole that is Java and into functional programming :)
p.s. there is nothing about bathyscaphes in this post, i just wanted it as a tag for no reason