What must every Java developer know in order to be good ?

Recently many people started recently asking me "What is required to start developing Java-based applications ?". Apart from the fact many of the skills are gained during the working hours (many hours of overtime actually - most IT companies don't actually care about development of human resources - this is a myth - but rather push it to the limit unwilling to invest in developer trainings) many of them can be gained prior to starting your first job (or jumping to the next one for a better salary, new challenges and more skills). In this article I decided to outline a sample set of skills that are vital to the development of Java-based application and basic engineering skills in general and may serve as a starting point for people willing to get into the world of Java application development. 

  • At first place - fluent English (if, of course, you are not a native speaker) ! 
  • IDE - you should be comfortable with using at least one of the well-established Java IDEs. Myths like 'super-developer should use Notepad[++] to write their source code' are such a bullshit - only idiots do. My personal favourite is the Eclipse IDE because it is an entire platform with great plug-in architecture that can host many state-of-the art free plug-ins out there and there are development tools for a variety of other programming languages (these are just two of the great things about Eclipse). As a starting point I would recommend the tutorials provided for free by Lars Vogel (top Eclipse contributor). A number of books is also present on the Eclipse site here (mostly related to plug-in development) but I would not recommend them for starters. Another IDEs I would recommend as secondary options are Netbeans and IntelliJ IDEA.

  • Unit testing - basic principles, basic JUnit understanding and knowing how to write a unit test, mocking frameworks - basic understanding and usage (e.g. JMock, Powermock, Mockito)

  • Integration and functional testing - basic principles and basic understanding in Selenium (at least how it works) and why is it so widely used to automate functional testing mostly for web-based applications

  • Basic understanding of CI (Continuous Integration) - its purpose and problems does in solve. It is nice to have basic understanding in at least one CI systems (such as Hudson, Jenkins or Cruise Control).
  • Basic data formats - you should have basic understanding on the structure of:
    - JSON
    - XML

  • Algorithms & Data Structures - despite the fact that many programmers (especially people that have not taken a course in Design and Analysis of Algorithms) think that when need an algorithm they will simply download an modify a sample source from the net and modify it - VERY WRONG ! First of all studying algorithms does not mean learning algorithms and data structures by heart (e.g. by memorizing a piece of source code - although some algorithm contestants do) but rather study the basic principles behind the core algorithms and data structure in order to apply them in practice - the truth is that knowing those principles and practicing them by solving algorithmic problems allows the developer to think more logically and write cleaner and more optimized source code. There is a variety of online grading systems (online judges) such codeforces.com, acm.timus.ru and topcoder.com that have many practice problems. Another training program I would strongly recommend is usaco.com (USA computing olympiads). As aditional study materials I would recommend the topcoder algorithm tutorials and the books Introduction to Algorithms (Cormen, Leiserson, Rivest), The Algorithm Design Manual (Sikena) and Algorithms, 4th edition (Sedgewick, Wayne). coursera.org has also some nice online Algorithm & Data Structures courses provided by top-university lecturers.
  • Version control systems - CVS (the predecessor ot SVN), SVN and distributed ones - Git and Mercurial. Recent trends show that distributed VCSs are gaining more wide-spread usage. You should know at least what is the difference between regular (client-server)-based VCS and distributed VCS is and how each of them operates in general and manages file versions and branching
  • Build tools - Ant and Maven - basic understanding of both is a must. Latest trends show that Maven with its great dependency mechanism and build lifecycles is more preferable than Ant.

  • Databases - basic understanding on SQL (the query language of relational database systems) and basic understanding in NoSQL implementations and their use cases - JSON stores (MongoDB), in-memory key-value stores (memcached), graph stores (Neo4j), big data. Recents trends show that NoSQL implementations (that are lacking the heavy theory and constraints of relational databases) tend to be more light-weight and performant in variety of situations (such as storing activities in social networks) - basic understanding in emerging NoSQL techs is a must.

  • Web technologies - basic understanding on HTML, CSS and Javascript is also a must (not to say that Javascript finds more applications that only in browsers in technologies such as Node.js and MongoDB)

  • Operating Systems - basic understanding of how operating systems works is a necessity - processes and process management, memory management,  types of instructions and instruction handling in the processor, basic kernel types and user modes, inter-process communication, basic scripting (batch for Windows and bash for Unix-based operating systems - basic knowledge is a must)

  • Network and distributed programming - basic understanding on sockets and client-server architectures using sockets, RPC (remove procedure calls) and messaging 

  • Design and architecture - basic understanding of UML is a must (especially for the class, sequence and deployment types of diagrams) - no need to read through the entire spec (but you can use it as a reference). I would recommend a concise introduction to UML provided in Martin Fowler's UML Distilled: A Brief Guide on the Standard Object Modelling Language. Also you must have a basic understanding on the possible ways to organize a software design/architecture document or even specification - there is a number of templates for such documents throughout the net

  • Presentation skills - try to gain an much presentation skills as possible - this is vital to your proffessional development

  • Collaboration skills - do not preserve knowledge only for yourself - collaborate aggresively - blogging, knowledge sharing, organize study seminars of emerging technologies and stuff that will drive people toward new skills and motivation

  • Other technologies - do not ignore other technologies - keep your knowledge up to date with the newest trends in technology all the time. Do not be radical towards technologies and companies that you do not like but rather try to get the most out of the value they provide.

Not all of the above skills can be gained in the university and not all of them can be gained from the daily job only - be self-motivated and use the learn-practice-teach lifecycle as a guidance when starting your career as a proffesional developer.