When learning a new technology or refreshing an old one, attempting to find the most effective learning resources is always a good idea. On this page I will be keeping track of resources that I find useful.
- HTML & CSS
- Java Servlets and JSP
- Hibernate & HQL
- JPA & JPQL
- Java EE
- Build Tools – Ant, Maven & Gradle
- Version Control – Git, SVN
- Design Patterns
- Regular Expressions
- Unit Testing
- Problem Solving
Java is a concurrent, object-oriented, strongly typed programming language. It is platform independent which means you can write your code once and then run it anywhere.
‘Head First Java’ offers a nice and quick introduction to Java programming. I was able to whip through the book quite quickly, but I didn’t feel like it offered a very deep or fundamental understanding of the language.
‘Introduction to Java Programming’ was a joy to work through. There are fantastic exercises at the end of each chapter and review questions to see if you understand the information. It covers a multitude of different topics related to Java programming.
‘Java SE 8 for the Really Impatient’ is the best material I have found in order to get up to speed with the changes that came with Java SE 8.
‘Effective Java’ is a much more advanced book than the others listed above. It is mentioned in online forums, like Stack Overflow, almost continuously as THE source of Java truth.
An algorithm is a step-by-step computational procedure that receives an input and returns an output. Learning about algorithms is important so that you can understand how your code will perform in a real-world application. For example, knowing that you should almost never use recursion in a real-world application might save you some headaches.
HTML & CSS
HTML is the language for describing documents on the web. CSS is the language responsible for the document presentation. So HTML defines the content of your web page and CSS defines the presentation of that content.
‘Head First HTML and CSS’ did a fantastic job of helping me to refresh my knowledge of these two wonderful technologies as well as teach me a number of new tricks. I would recommend it highly to someone interested in learning either of these technologies.
Java Servlets and JSP
Servlets are Java classes that accept HTTP requests and dynamically generate responses. You can print an HTML message back to the browser straight from a servlet, but it is very difficult code to read and maintain. JSPs were invented to deal with this issue. A Java Server Page (JSP) is a page where you can place regular HTML as well as Java code (in special areas or using a special syntax). A simple use of servlets and JSPs would be accepting HTTP requests with your servlet, doing some type of processing, and then forwarding the request/response to a JSP which can then present the information.
‘Murach’s Java Servlets and JSP’ offers a clear and straightforward look at servlets and JSPs. The book has many useful practice examples to work through in NetBeans IDE. Although NetBeans is a solid IDE, I prefer to use Eclipse as it is more widely utilized throughout the industry.
The JDBC API is an interface for database access, independent of any particular database engine. JDBC stands for Java Database Connectivity.
I found an incredible summary of JDBC in ‘Murach’s Java Servlets and JSP’.
I also found Oracle’s online tutorial to have quite a bit of useful information with regards to JDBC and I highly recommend it.
Spring is an application framework that can be used to build Java applications. In addition to a multitude of features, Spring offers dependency injection which enables you to effortlessly build loosely coupled applications. When an application is loosely coupled it makes testing that application much less complicated. There are a number of subprojects for Spring that you can add to your project which offer additional functionality such as Spring Data, Spring Boot, Spring Security, Spring Batch, Spring Web Flow, and quite a few more.
‘Pro Spring 3’ covers a multitude of topics and provides detailed practice exercises for each concept that it teaches. Even though ‘Pro Spring 4’ has been released, I find ‘Pro Spring 3’ to be a more effective learning tool.
The ‘Official Spring website’ has solid documentation as well as ‘quick starts’ that can help you get up to speed quickly with new concepts.
‘Mkyong.com’ and ‘Petri Kainulainen’ have many useful tutorials on different aspects of the Spring Framework.
Hibernate & HQL
Databases hold relational information in multiple tables connected by foreign keys. Java works with objects. How do you get the information from the tables in the database and turn it into objects? This is an age-old problem that is still being solved. One of the best solutions to date is using an Object-Relational Mapping (ORM) framework. Hibernate is an example of one of these frameworks whose purpose is to create a near seamless mapping between objects in your application and tables in your database.
‘Pro Spring 3’ includes a solid discussion of Hibernate and the importance of ORM frameworks in today’s software applications. HQL is covered in basic detail as well, which is Hibernate’s language for communicating with the database.
JPA & JPQL
Although Hibernate is a solid ORM framework, it is also vendor-specific. This means that if you use Hibernate’s annotations to create your persistence layer then your application is less portable. The solution to this is the Java Persistence API (JPA). It is vendor neutral so you can use JPA’s annotations with your choice of persistence providers. This means that you can change persistence providers without any impact on your application which gives you added flexibility.
‘Pro Spring 3’ includes a strong basic introduction to JPA. I didn’t find that it went into enough detail about JPQL though so I went searching for another resource and discovered ‘Pro JPA 2’. I found a fantastic discussion of JPQL in Chapter 8 but I haven’t required the other chapters of the book just yet.
JPQL is the language that JPA uses to communicate with the database. It is a subset of HQL, so if you know HQL then you are way ahead of the curve.
As Oracle puts it – “Java Enterprise Edition (Java EE) is the standard in community-driven enterprise software”. This is Oracle’s solution to building web applications with Java. It is a compliment to Spring’s success that Oracle has imitated so many of its features. This makes the learning curve between Spring and Java EE much smaller than it once was when EJBs made things a lot more complicated.
‘Beginning Java EE 7’ stands out from the rest of the pack. The author explains the topics with clarity and gives historical reference when appropriate so you can understand the large changes to Java EE over the past few years. The acronym ‘EJB’ made me quite nervous before reading this book since I had seen horror stories from developers in the past, but after reading this book the acronym no longer holds the same sense of dread and fear.
Build Tools – Ant, Maven & Gradle
Build tools automate the building of a software project so that a developer doesn’t have to think about manually compiling, packaging, testing and deploying the project every time they make an update to their code base. Instead, with tools like Ant, Maven and Gradle you can set things up so that you only have to press one button in order to move your code from development to production.
‘Better Builds with Maven’ is a free book offered by the Apache Maven Project. The documentation on the website is also quite good.
Ant build files are written in XML and are highly customizable in comparison to Maven. Gradle build files are written in Groovy and are also highly customizable. The power of customization of course comes at a cost, as you are more likely to create side effects in your build.
Version Control – Git, SVN
Version control software saves all of the changes to your code base in different revisions so that you can go back to any point in time whenever you wish. This is an incredibly useful mechanism. There are two main methodologies being used today – centralized version control and distributed version control.
Centralized version control is where you keep all of the revisions to your code base on one main system and users download updates from and send changes to the one main repository. Distributed version control is where every user stores the complete repository on their system.
Git is a distributed version control system that is growing in popularity every day. ‘Pro Git’ is a free book that is offered from the official Git website and I highly recommend it. Git is the brain-child of Linus Torvalds (the creator of Linux) and so it is not completely surprising to find a highly intuitive and easy to use command line interface. In addition to the CLI (command line interface), I find the EGit plugin for Eclipse to be quite useful while working with GitHub repositories.
SVN, also known as Subversion, is a centralized version control system that is utilized in the software industry. ‘Version Control with Subversion’ is a free book that offered a fantastic learning experience. If you are working in Windows then you can utilize TortoiseSVN which is a Windows shell extension for Subversion. It makes working with Subversion a more pleasant experience.
Structured Query Language (SQL) is a language designed specifically for communicating with databases.
I believe it took a bit longer than 10 minutes to refresh my SQL with this book. The title notwithstanding, this book has great reviews on Amazon and I’m not surprised. I have previous SQL experience but I think that this book would still work well for someone just learning the language.
Unified Modeling Language (UML) gives you a way to show your application in drawings and diagrams that everyone will understand. Sometimes a picture really is worth a thousand words. There are numerous types of diagrams available which aid in the design and description of software systems.
Martin Fowler wrote a book in 2003 that covers the most important parts of UML while leaving out anything from the specification that you will almost never use.
Design patterns are general reusable solutions to commonly occurring problems in software development. It is a template for how to solve a problem that can be used in many different situations. Once you know the language of design patterns then you can communicate a complicated high-level design concept with another developer in one word which gives everyone a useful shared vocabulary.
‘Design Patterns’ is a famous book written in 1994 by a group of authors known as “The Gang of Four” abbreviated to GoF in modern day texts.
I used a combination of the three resources listed above to learn design patterns. If I read a description in ‘Design Patterns’ and I found it to be lacking then I would look at ‘Head First Design Patterns’ to see if they had a clear explanation of the pattern I was learning. If that was not the case, then I would utilize Wikipedia which sometimes had the clearest explanations.
I started working through ‘Pro jQuery 2.0’ but I found that it gave too many details without offering enough practice examples to solidify the concepts. I turned to ‘Head First jQuery’ and was very pleased with how quickly I was able to ramp up my jQuery skill set.
Software developers once used a technique from the manufacturing industry called the ‘Waterfall Model’. This model works well in manufacturing where you can fully complete your design before you start to implement it in production. However, this model doesn’t hold up well when building software. Agile software development emphasizes adaptability and helps businesses cope with unpredictability.
The books that I found on Agile often went into way too much detail which didn’t feel ‘agile’ at all. The Wikipedia articles for Agile, Scrum as well as different development methodologies such as Waterfall are all excellent in my opinion.
Regular expressions are a language for pattern-matching strings. When you first see the syntax for a regular expression it looks like an alien language, but like any other programming language the mysteries disappear after some well-chosen reading. Regular expressions are also known as ‘regex’. (Note that the ‘reg’ in regex is pronounced like the start of the word ‘regular’.)
I read the first chapter of ‘Mastering Regular Expressions’ and I quite enjoyed it, however after that I found it went into an incredible amount of detail that I will learn if and when I ever need it. Oracle’s online tutorial on regular expressions provides a clear explanation of regular expressions and it gives you a ‘test harness’ that you can use to practice regex in Java.
Unit testing is a method used to test small pieces of code in your application to make sure they are working properly. Having a high degree of test coverage can drastically help you to catch any bugs that crop up due to changes made to your application.
There are a multitude of tools that can aid in unit testing your applications. JUnit is a Java library that enables you to perform unit testing for your Java application. TestNG is much like JUnit but offers additional functionality. AssertJ makes your assertions easier to read. Mockito is a mocking framework that helps you to create ‘mock’ objects that stand in for your real objects. MockMVC simplifies Spring MVC unit testing.
- JUnit’s Official Website
- JUnit Cookbook
- Lars Vogel’s JUnit Tutorial
- Petri Kainulainen’s Spring MVC Test Tutorial
It is important to be able to work through a problem and come up with a clear, effective and lasting solution. There are many useful techniques that can be utilized in order to become more effective at problem solving.
‘Programming Interviews Exposed’ offers practical techniques for how to approach problems in computer science. It describes a list of steps that can be followed in order to work through even the most complicated problems and come up with effective solutions.
‘Cracking the Coding Interview’ offers some decent problem solving practice.
‘Project Euler’ is a website that offers a series of challenging programming problems.
NoSQL refers to non-relational, distributed databases, as opposed to traditional relational databases.
There are two main advantages when working with NoSQL databases. The first advantage is clustering. Organizations are capturing more data than ever and are required to process that data incredibly quickly. Relational databases are designed to run on a single machine, but it is usually less expensive to utilize a cluster of smaller and cheaper machines to crunch all of that data. The second advantage is that NoSQL databases store objects just like the ones utilized in object-oriented programming. Therefore there isn’t an impedance mismatch between the information in the database and the objects in the application which increases developer productivity and reduces developer headaches.
Without a doubt, the very best resource I have come across when learning about NoSQL databases is ‘NoSQL Distilled’ by Pramod Sadalage and Martin Fowler. I would highly recommend reading this book before any other books on NoSQL. It gives an overview of NoSQL databases from a high-level perspective which allows you to delve into the details of any type of NoSQL database with confidence and understanding.
Angular is a framework that enables you to build CRUD based web applications that are incredibly responsive. This responsiveness is due to the fact that Angular excels at building Single Page Applications (SPAs). With SPAs, once the initial HTML is loaded by the client, any future page navigations are retrieved using AJAX and injected into the already loaded view. Angular’s growing popularity is due to its modular design, powerful features, and impressive performance.
After researching a number of different books, I ended up turning to ‘AngularJS by Example’ as my main resource for the material. There is also excellent documentation available on the Angular website for any concepts that are unclear. In my opinion, the book does go into a bit too much detail at times, and therefore you should feel free to ‘skim’ at your own discretion.