There have been a huge number of IDEs developed since then, but I find I am still more productive using a simple text editor (although I have been meaning to give eclipse a whirl). A number of languages also made their debut: Java was C++ rebranded and with the ability to sacrifice readability for speed removed, C# is simply Java rebranded after a court ruled Microsoft was not allowed to modify Java. In some ways Java really is easier to use than C, but the amount of code that is necessary in order simply to implement say a simple sorting program tells me it is the wrong approach. If a problem can be explained in just a few words then the solution should only take a few lines of code.
Perhaps the largest advances have been in the field of scripting languages. Perl may be a very poor choice of tool for large complex programs, but it is a wonderful tool for solving a simple problem in just a few minutes. Python is similar to Perl, with worse text manipulation but better support for large programs. Now, I like both Perl and Python and use them a lot (mainly Perl, since I'm mainly doing text manipulation). However, every time I use them I see things they do and thing "Gee, that's really stupid". It reminds me of when I used to program in Prolog and if put your clauses in the wrong order, the system will go into an infinite loop! How about a slightly smarter scripting language?
When I first learned the Clean language I thought I had found the perfect programming language. It is fast, concise, easy to understand, and easy to verify that a program is bug-free. Sadly, it doesn't hold up so well when you start programming in it. When you are first trying to solve a problem, you rarely know exactly how it should be solved. And yet, Clean essentially requires you to get the design correct right from the start. I found that when I knew exactly how the program would look, I could build a beautiful Clean program to solve it. But it is an awful language for iterative development.
Speaking of iterative development, there are a couple aspects of the current programming fad, extreme programming, that I think are really important. The first is testing: I have found writing mechanical tests is an extremely simple way of preventing 'bitrot', and for keeping bugs contained in a large and complex program. Another area where I think extreme programming has it right and, say, Java has it wrong is in avoiding infrastructure. I appreciate a good class hierarchy as much as the next programmer, but the more programs I right, the more I think it is more important to write the shortest program that reasonably solves the task at had rather than a huge and complex structure that can be tuned for many different tasks, including the current one.
Another aspect of programming that frustrates me is how hard it is for novices. I remember in the very early nineties that Apple developed a programming language (called Hypertalk) which was easy enough to program in that any reasonably intelligent person could hack something together. A typical command might be "Tell the next card to set the text of the titlebar to 'Well Done'". Now, this isn't perfect, and soon falls apart when you want to do something complex, but you would have thought things would have improved in the last decade!
Anyway, that's enough ranting. Much of the programming I do now is in simple scripting languages such as Perl, Python, R, and Bash. For the few graphical interfaces I write, I prefer to use the beautiful QT toolkit. Whenever I need efficiency I write in a mix of C++ and C. I like languages such as Lisp and Clean in theory, but rarely use them in practice.