Resources:


Java (my favorite programming language :)):

Yes, Java is by far my favorite programming language. This is not to say that I like Java so much because I do not know any other programming languages. I can program equally well in C/C++. And if your application needs to be blazingly fast, C is a better choice than Java, of course.  If you need to write a program quickly without having to worry about maintenance too much (e.g. a homework assignment), Python is probably a better choice than Java. Or, if you like scripting-style languages, Java is a bit on the "heavy-weight" side.

Java is a pure object-oriented language which performs garbage collection for you. I "grew-up" in the object-oriented paradigm and objects are my preferred way of thinking. In this sense, Java provides the "water" for my "objects-fish" to swim in. I am an avid proponent of good design as well. My experience as a programmer suggests that a good design offers a lot of flexibility and expandability for a system.  These features are a blessing during the maintenance phase when you have to add features to an already existing application.
 
I appreciate the automatic garbage collection in Java since I do not have to delete the allocated memory myself. However, it is still possible (although not as easy as in C/C++) to create memory leaks. The drawback of automatic garbage collection is that you do not have much control over the garbage collecting process.

I prefer to keep up with the Java technology using plentiful online resources. In general, online articles and tutorials follow the developing technology while books get out of date quickly. For this reason, I suggest The Java Tutorial as the best resource on learning the current version of Java and I do not have many books on Java listed in the following list. However, if you need an in-depth knowledge of a particular system, for example Lucene, there is no better reading than a current book on the subject.

Here we go:

1. Java on Sun's website. Of course, this is the homeland of Java! :) A very comprehensive resource where you can find Java news, downloads, articles, tutorials and much more! Although, I do find that a lot of the articles and tutorials are biased towards Sun-related technologies (which can be a plus too :)).
2. The Java Tutorial If you are new to Java - this is the best  tutorial (well, in my opinion) to get started and use as a reference later on. It starts from the very basics, such as introduction to object-oriented programming and the Java language. And gradually progresses into more advanced topics of the language, such as I/O operations, multi-threading and Swing programming.
3. The Java section of IBM's developerWorks A good place to go to stay current on Java technology. They publish a variety of well-written articles. Here the tutorials cover a wide range of open source projects (Apache Foundation projects, for example) as well as IBM-specific products.
4. Java World A fairly comprehensive collection of articles on Java-related technologies.
5. The Apache Software Foundation Your boss demands a half a year project to be done in half that time? Good news is that someone may have already done a part for it! The Apache Software Foundation hosts a variety of amazingly good and useful projects, such as Ant, Tomcat, Struts, Cocoon, Tapestry, Lucene and Axis, to name a few! They may have something for you!
  

 Java Library 

1. The essential Java language library A list of useful books on Java technologies and object-oriented design from IBM's developerWorks. The list was compiled in 2005, but some books on that list (e.g. Design Patterns by the Gang of Four) are unlikely to get out-of-date any time soon.  On the Java side, I would still recommend The Java Tutorial
2. Java Cookbook Provides clever recipes for specific problems. For example, how would you capture the output of an external program in Java or how would you protect data from being accessed by multiple threads? Every problem is illustrated with a simple, but non-trivial example. This book is for a professional looking for clever solutions, it would be a bit  difficult for a beginner to "bake the cookies".
3. Java Puzzlers This is the book to make you laugh and cry if you consider yourself a Java guru. I thought I was a Java expert when I came across this book. This book proved me wrong...  The book contains a collection of small Java programs illustrating the not-so-often encountered parts of Java specification. A lot of the examples are admirably counter-intuitive -- you are almost certain about what the code would do, but it does the last thing you expect.

 Java Articles 

1. Checked vs Unchecked Exceptions An interesting discussion of viewpoints on exceptions in Java, including checked vs. unchecked exceptions debate. Brian Goetz is also an author of a good article on "exceptional practices" in Java.
2. Automation for People: Continuous Testing Describes a good approach to automating software testing and the tools that do the job.
3. Exception Handling in JUnit tests An article on how to handle and not handle exceptions. It also suggests an approach for dealing with exceptions in JUnit tests.





Programmer's Bookshelf:


Nobody was born a programmer or a software developer, if you prefer a fancier term. The question is how do you become a good programmer?
When I first came to work in a computer center, our lead developer handed me the book titled "Object-Oriented Analysis and Design with Applications" by Grady Booch and said: "Do not even think about writing object-oriented programs before you read this book." And sure enough it turned out to be an excellent piece of advice.

Here is a list of books I would recommend to anybody who wants to be a good software developer.

1. "The Practice of Programming" by Brian Kernighan and Rob Pike This book describes the common practices of developing a software project. It goes over of "what to do" and "what not to do" while you are writing code, debugging or testing your application. Definitely a must-read if you write software.
2. "The Pragmatic Programmer: From Journeyman to Masterby Andrew Hunt and David Thomas This books covers a wide range of activities that are involved into creating good software. From communicating with your teammates to keeping your programming skills up-to-date. Written in a lively languages, the authors discuss the practices and pitfalls for every stage of a software project.

This book has a follow-up "Starter Kit" series that introduces the tools that help with developing software:
"Pragmatic Version Control" (using CVS or Subversion)
"Pragmatic Unit Testing" (for Java with JUnit or for C# with NUnit)
"Pragmatic Automation"
3. "Object-Oriented Analysis and Design with Applications" by Grady Booch  In this book, Grady Booch explains the foundations of object-oriented design. One by one he introduces the components of the object-oriented model, such as classes and relationships among them. The examples are well blended into the presentation to clarify the concepts. This book really clarifies object-oriented concepts so that you can write better object-oriented programs.
4. "Refactoring: Improving the Design of Existing Code" by Martin Fowler, Kent Beck, John Brant, William Opdyke and Don Roberts The authors have assembled a catalog of refactorings which improve the internal structure of a program but do not alter its external behavior. They clearly describe the context in which to use a particular refactoring and the process of how to perform a refactoring.





Object Constraint Language:


I am working with Object Constraint Language (OCL) for my research.  OCL is used to specify precise constraints on a software system during design where UML alone fails. It allows to state constraints such as "customers of the bank must be older than 18 years of age". OCL can also be used to specify the formulas for compulation to be implemented later in the development process.

1. OCL description (book) J. Warmer and A. Kleppe. The Object Constraint Language: Precise Modeling with UML. Addison-Wesley, 1998.
2. The OCL Center From the creators of OCL - the site of Jos Warmer and Anneke Kleppe.
3. Kent's OCL Library This OCL toolkit allows the functionality of OCL to magically :) appear in your application. Has good documentation in the form of papers.
4. Dresden OCL Toolkit In essence provides the same functionality as Kent's OCL library.
5. USE A UML-based Specification Environment.
6. OSLO Open Source Library for OCL. It is based on Kent's OCL Library. It also provides the graphical interface which allows to load a UML model and evaluate OCL constraints against the model.
7. The Object Constraint Language: Getting Your Models Ready for MDA I've yet to read this book myself.





More to come!