Evolving Architecture, Gliwice, 20.02.2017

It’s really nice to inform all of you that I will conduct one of my newest presentations: Evolving Architecture. It will be held in Gliwice, 20.02.2017 18:00 at Silesian University of Technology (room 903), AEiI Department (Akademicka 16). Short description below 🙂

Have you ever considered how your current project architecture will evolve in the future? Have you ever thought how your team will develop certain features for a client? How about possible over-engineering?

In general,  we always try to predict all possibilities and changes that the client may require. In the other hand under time pressure developers are being pushed to do different kind of “short-cuts”, which can increase cost of developing new features. How to avoid over-design, but without closing your architecture for all sort of changes that your customer will need in future? When certain technical decisions should be made? When technical debt should be accepted, and when is a need to avoid it?

It will be a story about bad decisions and failures, but also about those decisions that can save the day.

Presentation will be held in Polish.  You can also find Facebook event here.

Small update:

Evolving Architecture, Gliwice, 20.02.2017

Euvic Poker basics (part 1/2)


If you work in distributed team and do planning sessions try tool that was written a year ago by my trainees in EUVIC. We’ve got 3rd version published at the moment. I hope you can find it useful 🙂

This article shows only basic info about EPoker features.


I’m aware that out there are some tools very similar to epoker. Why we did our own? We had a couple of requirements which were not covered by any of existed solutions together:

  • I don’t want to create any login by default to play – because often, I have to use it with external customers (POs), sometimes I need to convince them to use planning sessions, and every additional step is a bottleneck.
  • I can’t put any business data into external system – and a lot of these tools require to put title or description of every user story. Usually I do planning sessions using online tool + voice call. We discuss using voice call and online tool should be only replacement for “table and cards”.

Basically epoker:

  • Do not require any sign-up or other registration process. It’s just ready to use.
  • Don’t need to store any business data. And you don’t need to believe me. You just don’t put any business data. Moreover even information about poker sessions are stored only while particular room exists. Room and all info are just deleted after 15 minutes of last connection to it.
  • Don’t use any kind of user-tracking system. The only stats which i have is number of rooms created per hour/day and average number of participants.

How to start?

It’s really simple! Go to http://epoker.euvic.pl website and click “Create Room” button. Now copy current page address and send it over to you colleagues you want to play with. That’s it.

Basic features

  • Room creator starts as administrator, but can give this permission to anyone in room by clicking right mouse button on any other player and use option “Give master“. In case you have master permission already you can take it from someone using “Revoke master” option

  • Anyone could be a Voter (by default), but at any time you can start play as a watcher. It’s very usable for POs and ScrumMaster which don’t vote on any card, just watch the game. If you want to stop be able to vote just click on “Voter” button
  • New deal – if you are still playing in the same game but without success on shared estimation you should start new deal. If team agreed on any value then press “New Story button instead


  • You can use “Revoke” button to show all cards at any time if you have master permission

  • You can change card deck between games, there are 3 options at the moment:
    1. Default planning poker deck – 0, 0.5, 1, 2, 3, 5, 8, 13, 20, 40, 100, ?, break
    2. Powers of two – 0, 1, 2, 4, 8, 16, 32, 64, 128, ?, break
    3. T-Shirts – XS, S, M, L, XL, XXL, ?, break
  • Everyone can change the theme from light to dark one at any time


  • You can change your display name at any time. Epoker will save your choice in cookie so it will be automatically used for you next time

Advanced features

There are a few more advanced and features. However, they are valuable only within specific business context, that’s why I would like to describe them in 2nd part providing additional information when to use them 🙂 Stay tuned!

Euvic Poker basics (part 1/2)

SpreadIT 2016 – behind the scenes

SpreadIT 2016 is over! I would like to use this occasion to share my thoughts and show how much effort is needed to create free of charge, technical conference with more than 500 attendees. As some people can find parts of this article offending, please note that this is only my point of view.


A little bit of current situation

First of all, we are not connected to any company and never were. SpreadIT is totally community-based event. For sure, we are very grateful to our sponsors, because without them we would not be able to do this. What we do every year is to create an offer and send it to companies. Every year we have a bit more confidence that we will have enough money. If we’ve possibility to save some extra money – we use it for next year edition (In fact, we need to leave some money as we must print some posters etc. before we receive first money for the next edition).

At the moment conference “management” is just group of 7 people. And these people meet each other regularly on some online meetings. Besides, we have direct communication with each other on slack channel. Everyone of us is 100% responsible for some part of conference which means that it lies on your shoulders to deliver that part of event in time. Everyone can create own “team” to gain some help of course. But… there is not too many people out there who wants to use their free time to write emails, Facebook posts, tweets, do some coding, graphics etc. We are extremely happy when someone new join us (THANK YOU GUYS!).


365 days of preparations

I wrote above that everyone is responsible for some particular tasks. Let’s look at them more deeply:

  • Program – preparation include asking some well-known trainers with a lot of conference experience. We do this because we want new faces every edition. Then there is C4P – we need to look at them, often there is need to discuss particular topics if they (and creators) meet our requirements. Also we give possibility to do C4P by gold and platinum sponsors. But they also have to meet all requirements, and sometimes it could be somehow challenging- in one hand they are our sponsors, they give us money, in other hand – our priority is to establish best possible conference schedule. You can’t invite too much people, you can’t have less than some reasonable number,
  • Sponsors/Finances – we need money. Also we want to do some networking between our attendees and companies. Every company have some specific “culture”, sometimes there are specific requirements, sometimes there is a lot of questions. Imagine that you have to write a lot of emails to some official company mailing addresses (with a lot of redirections) to get sponsors. This part also include “keeping hand on money”, because at the same time rest of SpreadIT team ask you for money for their targets. That’s on daily basis for head of finance 🙂
  • Promotion – Facebook, Twitter, Media patrons, writing news, checking grammar, trying to post something concrete and interesting from time to time… Then preparing posters, advertisements, graphics, ids, folders, stickers etc.
  • IT – We have our webpage (which is all the time “under development” :)) – sometimes there are problems, we also have new ideas, requirements, needs…
  •  Logistic – Someone have to find place for conference, prepare coffee breaks, check audio, mics, adapters for macs or specific ports, order pizzas (find pizzeria which will do 100 pizzas in reasonable time :)), find places for sponsors on conference day, do “shopping”,
  • Strategic contacts – (new role which was introduced first time this year). Mostly discussions with particular contacts, but we found out that this role takes some responsibility which I described under logistics. Also help with charity action which we do this year
  • General coordinator – during preparation phase coordinator is responsible for conflict solving and scheduling meetings, but most important coordinator remove all roadblocks, so everyone can do “their job”. It seems like the most easy role, but in fact this is very serious, because responsibility that coordinator takes is quite big.



“Far side” of the conference

There are some behaviors that makes me sad:

In first 3 editions there were some people who just register to receive “free t-shirt”. They come in on registration, get their starter pack and then go back to home. Fortunately this year because of charity action we didn’t have this problem anymore. However, there were two or three comments like “we don’t like SpreadIT anymore because we didn’t receive free t-shirt”. I don’t want that kind of people on SpreadIT. Seriously.

A lot of criticism. I understand comments about cold pizza, about technical problems, about topic which didn’t meet participant requirements. I just don’t understand pure hate because we can’t afford something or we didn’t do something in particular way. Unfortunately we have small budget and this is always choice how to spent money. Don’t understand me wrong- We want all kinds of suggestions- we need to make a lot of hard decisions and its often about spending money this way or another. I just don’t get why some people have such hate for everything which is not “their way”. Live and let live. Really.

Registered people who don’t show up. It’s quite interesting, about 30% of registered people just didn’t show up on conference day. It’s fine if someone have to change their plans, many things can happen, but 150 people? Please understand that we have to prepare every single starter-pack, registration points, order pizza and many more. I know that you don’t pay for it so “just in case I will register”. Please have some empathy. 150 people is about 2hrs of additional work the day before conference for 10 people.

Bright side of the conference

There are still many reasons why we organize SpreadIT. For me it’s about some networking, about challenges, about growing up and, to be honest, about making my dreams come true. It’s a hard work, but on that day when I can stand in front of these 500+ people and say “we did it!”-it’s priceless. Especially if we did it good.

Call4Proposals and Call4Orgs 🙂


If you would like to speak at SpreadIT 2017 you can either wait for our regular Call4Proposals or contact me at daniel.pokusa(at)spreadit.pl 🙂

If you want to join us, meet cool people and make something great, do not hesitate and contact me or any other of SpreadIT committee member (mails here)!

 See you next year!


SpreadIT 2016 – behind the scenes

Asynchronous call using CompletableFuture


Imagine that you have to use external systems to retrieve data or you deal with communication in distributed architecture (communication between modules within application). In this article I would like to tackle one possible problem, but please note that this approach can be used in a many different scenarios.

Please note that I don’t want to provide another “CompletableFuture guide”. If you are interested in specific options and possibilities of CompletableFuture  I recommend you great article by Tomasz Nurkiewicz.


We would like to write simple application that will provide us best possible exchange rate from public exchange rate systems (let’s assume that bigger exchange rate value is better as we want to sell). What we want is to convert from our “local” currency (in my example it will be PLN) to selected one (using simple rest call). Response should inform us only about highest rate.

So if I run my application on localhost:8080  and I would like to check lowest exchange rate for GBP then it can looks like:

(In example above I used httpie. I also recommend postman if you prefer more GUI-oriented tools :))

Another example (USD):

In our example we will check 3 external services for exchange rates:


First of all as you can imagine we will make a few external calls to described above systems (every call will take some time). Best option is to call asynchronously to every exchange rate API and after receiving all rates just check which one is the highest and finally make a response.

Asynchronous call to external exchange rate services

We don’t want to make every request synchronously, because we will increase response time from our application.


Basic solution

Let’s start with some general interface for every API call:

Then let’s provide some implementation for one of calls:

As you can see there, it’s very simple standard code. I use Spring’s RestTemplate  to prepare and make external call. What’s important here – so far we don’t use any CompletableFuture  so we can test this kind of classes as usual.

What I want to show is that you can provide functionality without thinking about async invocations. You can add this after finishing basic implementation.

Lets go async

Let’s look what we can achieve by using CompletableFuture . This class provides you possibility of creating object that will do some operations “in background” (We will talk about executors which do this operations later in this article). This gives you possibility to create non blocking operations (such as external calls) for future usage. Once you want to use information from CompletableFuture  it start blocking until Future  is completed. However, if operation is already completed then it will not block thread at all.

This can help you in a couple of scenarios:

  • You want to do some expensive operation and use it later. Then you can create CompletableFuture  at first, make other required operations and then use completed Future . In case it’s not completed your app will just wait for it
  • You want to do some expensive operations concurrently and then combine them in some way (this is what we want, and this is most popular scenario)

How do you create CompletableFuture ? The easiest way is to use static factory methods provided by this class. For example:  CompletableFuture.supplyAsync(Supplier<u> supplier)</u> . Supplier  class is a @FunctionalInterface  so you can use lambdas 🙂

Lets try then to provide some Factory for creating our asynchronous calls. This is not the best option, however in this case it can be a good starting point:

I also added exceptionally  here for each created CompletableFuture  – this means that in case that some exception will stop completion of particular Future then provided method will return value as a result. Receiving Throwable t  gives you possibility to adjust result to situation. In this simple example it will return 0.

Finally. we are ready to use it!

Completable Futures are being created in lines 12-14, then (lines 16-19) we take nbpRate  as our basic value, combine result with fixerRate  and select better option (higher), then again we combine this result with yahooRate . This will create another CompletableFuture  – let’s call it  best

Finally, as we don’t have anything more to do we use get() method on our Future . This method as I wrote before is blocking- so we will wait until our Futures  will complete and we will have our solution. Then we will just return it as a result.

Now you can see why I said that previous fabric its not our best option. If you have to add new service (and its very likely in our problem) then you will have to add here new lines and implementation which breaks Open/Close principle. I use this approach for sake of simplicity of explanation.


You can run CompletableFuture  by using default Executor  (as in all examples in this article) what can be fine for simple solutions. But for real world complex requirements this probably will be not effective and can lead to serious problems. If you want to learn more about default executors, Oleg Schelajev did great article about choosing right executor for your tasks.

However, if you are using spring you probably should provide TaskExecutor which has similar interface as java.util.concurrent.Executor , but Spring provides a few nice and configurable implementations of it.

Take an example:

This configuration provides ThreadPoolTaskExecutor  which uses  CustomizableThreadFactory . One can set max pool size (max number of threads that will be created), core pool size (base number of thread that should be in use) and of course more options.

Don’t use default executor. If you use spring, just go with your own configured TaskExecutor . If you use JEE or other frameworks pick up one of available executors in java.util.concurrent  package. Concurrent programming is very challenging so if you can keep something under control then definitely you should do it 🙂

To use particular executor just use second implementation of supplyAsync  method:


There are more problems around this topic, for example,  you need to figure out how to deal with situation when external service is down. We also need to consider how to test our solution and how to simplify future maintenance. There is always a need of providing a good balance- we should always provide sufficient, smallest and simplest possible solution- it’s not easy task to do though 🙂

Most important criteria that should be considered before providing final solution:

  1. Reliability
  2. Resilience
  3. Maintainability
  4. Testability
  5. Performance


Asynchronous call using CompletableFuture

SpreadIT 2016 – What’s new at the 4th edition?

Unfortunately I don’t have too much time recently to write new posts. One of the reasons:  SpreadIT 2016.


As I’m part of this great community event I want to share some more info about this year edition:

  1. We decided to give up workshops
  2. Finally we change “Soft talks” path name to “Business and Personal Development”
  3. We want SpreadIT 2016 to follow simple rule: bigger, better, louder 🙂
  4. Our Team changed – we’ve got new people on board
  5. We will have more than 20 presentations (5 rooms parallel – look here)
  6. There will be more than 20 great professional speakers (Look here)
  7. We decided that we will no longer include t-shirts within starterpack. We can’t afford t-shirt for every attendee, and don’t want to (as in previous editions) give them only for “first X registered attendees”. So this year if one want to get SpreadIT custom and limited t-shirt then will need to help sick kids. We choose “Mam Marzenie” charity foundation as beneficent of special charity auction (done by “Allegro Charytatywni”). Every penny spend on our auctions goes directly to foundation and will help to make a sick kid dream come true! You can find these auctions here. Its just 15 PLN for each t-shirt (Of course you can be more generous!)
  8. We want to start one new “culture thing” related to SpreadIT. But for now it is a secret 🙂


Last year there was 500+ attendees, we served more than 70 pizzas (something about 560 large slices :)) and what is important – we are just a bunch of passionate people who want to do something good for local community. SpreadIT is not directly created by any company (of course we are very grateful to our sponsors!).

SpreadIT will be held on Silesian University of Technology in Gliwice on 19.11.2016. For more info visit our site: https://spreadit.pl/en. Remember that our event is totally free. Just go to our site and register for the event (And remember about our cool t-shirts!)

See you there!

SpreadIT 2016 – What’s new at the 4th edition?

Aware Recruitment. Part 2: Expectations

This article is a second part about recruitment in Java world. If you haven’t read first part you can find it here.

As I promised we will cover just one topic- comparing clients and developers expectations, then I will try to show you how to look at 2 real job offers.

Deep into client expectations

If you work for IT industry for more than two years as a recruiter, you can ask yourself a question- does “regular job offer” for particular position today is different than job offer for same position a few years ago? What about expectations of known technologies, about additional tools or infrastructure?

Of course answer for this question is yes. Technologies, methodologies and tools are different now than some time ago. You can expect, that in next two years they will change again. Probably some frameworks will be still in use (in new versions), some will disappear and there will be a lot of new ones. That’s normal situation- you need to get use to it.

How to manage it? First of all try to look at Technology Radar (by Thoughtworks) every month. It’s a place where you can find usage of frameworks, technologies, platforms, tools and techniques categorized as following:

  1. Adopt -Things that showed up recently and companies should think about using them
  2. Trial – Still quite new on the market
  3. Asses – Worth exploring, quite stable position on the market
  4. Hold – Usually if company use this technology it’s the moment when they should start thinking about migration to something newer

TIP: You can click on every item in radar and check why it is in specific category.

Note that technology radar is published every month so if you can’t find specific technology it does not mean anything- it could be hold and disappear totally, it could never been there, its still to new- even for adopt category. Look at A-Z Radar – maybe you will find history of particular item there.

Every time when you see new item in your client’s expectations it’s good to check it on radar or just search for it in web. You can find out that it  can be something interesting and could be attractive for some developers.

Remember that your client have some needs and requests which cannot be easily changed. Your task is to find items that can be potentially attractive to someone among this expectations and try to emphasise them.

What drives developers?

This part is far too complicated so it has to be simplified for this article purposes. If you need to explore this topic more deeply I can suggest Jurgen Appelo’s CHAMPFROGS presentations and articles (Example herehere and here :)). In my opinion the best information about motivation can be found  there. Also I encourage you to read chapter about recruitment in Sandro Mancuso’s Software Craftsmanship book (or even whole book).

However, I can briefly describe a few major factors which developers take care about:


There are three kind of developers out there. Those who like short-term projects with fairly new technologies, those who like stable long-term projects with technologies that are known to them and those who just don’t care.

First group can be called ‘explorer type’. They want to touch as many new things as they are able to. So if you have candidate that ask you a few times about some new technologies (Adopt or Trial from Technology Radar), then probably you are dealing with the explorer. So don’t waste your time on them if you have to find someone for long term financial project in old technologies. Explorer will never take such an offer.

Second group is a ‘stable type’. They need stabilization and probably don’t have time or just don’t want to learn new things and technologies. Developers from this category want long term projects so all financial projects or public project can be attractive to them. If you looking for somebody to be a part of short-term project- they will refuse an offer.

Third group just don’t care about project they are working in. This could be result of many reasons- they just want to earn money and don’t care about they every-day job, they’re looking for something else in their next job (for example they want to try new position or they are interested in specific organization culture).

Remember that every developer can switch to another group. Someone can be an explorer type but because of any reason he or she can become stable type or vice versa. Never put any kind of label to anyone for a long term.


Depending on needs this point is what keeps developers on their current position (mostly). One can look for people from whom he or she can learn and almost anyone don’t hesitate to work with friends and people with similar interests 🙂


Simple one 🙂 For sure it’s hard to recruit someone offering salary below current one. But if someone decided to change job and have a few options with salary that satisfies his or her expectations then its not that important to offer more than your “opponents”. Of course it also depends. If someone don’t care about projects, and don’t worry about learning and finding new friends then the only answer is cash. But also you can be sure that this kind of people will change project as soon as someone will offer them higher salary.

Also its great if you can say about minimum and maximum salary offered by client or your company for position that you are recruiting for. A lot of developers don’t even want to loose their time if they don’t know if you meet their expectations. Especially experienced developers.

Other expectations

There are a lot of expectations that can be discussed:

  1. Position – there a lot of people that can change work only because of position in the company structure. Some experienced testers wants to start as developers, some developers wants to try their chances as project leader or manager.
  2. Multicultural environment – Some developers wants to work in multi cultural organizations. Possibility of journeys is sometimes an advantage.
  3. Working hours – some developers see flexible working hours as convenient. Additionally, possibility of remote working can be a big plus.
  4. Location – Sometimes your office location is also important ;P
  5. Organization -Some devs don’t prefer to work in Agile culture, some just hate Waterfall. Some hates large companies, some don’t want to trust small ones.
  6. Benefits – In fact I don’t understand this one- but developers often asks about additional benefits in their job. So private health care, sport benefits, etc. can affect their choice.


In my opinion before you start calling any developers try to analyse factors described above. I’m pretty sure candidates will ask questions regarding these topics. Do not colourise, just give them honest answers but emphasise the advantages keeping in mind which candidate type you are dealing with.

Imagine that you receive description for senior java position. What will you do? First of all ask client about all of described expectations. Be prepared with answers. Then try to find out if client looks for developer to particular project or just for “one of company projects”. It could be hard to find senior developer for “any project”. Especially if he or she cares about projects. If you have possibility try to prepare job offer giving as much information as possible… in points. Try to simplify it as much as possible. Be concrete. You can try with some funny or unusual job offer – this may work, but remember that in the end if you look for professionals, giving all information will be the best option and will save your time in the future. You will receive CVs of candidates that are really interested in this particular position. Otherwise you will recruit 1 person per 50 meetings. Believe me you don’t need a thousand of CVs where half of them will not meet client expectations. Once again: rule is simple- be concrete and honest.

Expectations in real world job offers

Job offer 1, Java Programmer

(Some info about company)

Send your CV to us if:

  • You want to work on innovative projects
  • You want to use new technologies every day
  • You really care about continuous improvement of your skills


  • You know J2EE and J2SE
  • You have strong knowledge about Oracle Weblogic, RedHat JBoss
  • You have knowledge of Spring, Hibernate
  • You know about SVN, Eclipse IDE, Ant and Maven tools,
  • You have sense of humor

You will:

  • Programming according to prepared design assumptions
  • Create, modify and comment source code
  • Solve problems in product environment
  • (Few more)

What we offer:

  • Attractive salary
  • Ability to deploy innovative solutions
  • Development of your competences

What I see here as developer at first place is some kind of lie. I see innovative projects and new technologies and then J2EE (version 1.4: November 11, 2003, after this version they change name for JEE. Now we have JEE7!). I see Ant (this one is never used in any project started in recent two years. I hope :)), I see Spring and Hibernate (Nothing fancy, just standard). Where are these new technologies?

I see that if I will go there I will have to write code according to prepared design assumptions. Let me think- we are talking about some project assumptions or they have some kind of Analyst? And I will create code– Great! (Is anywhere Java developer without possibility of writing source code?). Also there is information about Weblogic and JBoss. They are both huge application servers (JBoss is replaced now as Wildfly for community version and JBoss EAP for commercial version- probably we have to deal with old version here).

Unfortunately there is no info about particular project so this company probably is trying to hire  people for a few projects at the same time.

What in my opinion should be done here:

  1. If any of these technologies are newer- write it there please!
  2. If company use some other technologies- add it.
  3. What about databases (Hibernate suggest that there are used some sql relational db, but which one?)
  4. Don’t lie. This company is probably looking for developers in some long-term projects. Put information about stable environment!
  5. Solve problems in product environments – it means supporting existing systems. A lot of developers don’t like this kind of job. Check with client if this will be support, ask how much of support task will be assigned to new developer and if possible put this information in job offer.

Job offer 2, Junior Java Programmer

I will put only requirements here:


  • Commercial experience in Java/ Java SE/ Java EE software development,
  • UML knowledge,
  • Ability to design and create web applications,
  • Good knowledge of the OOP will be an advantage,
  • Practical experience with relational databases,
  • Knowledge of Application Servers WebLogic/JBoss,
  • Knowledge of Spring Web Flow, PrimeFaces, Drools, WebServices, jQuery will be an advantage

What I see here as developer:

  • Ability to design and create web applications. Seriously? That kind of points i read like “Ability to write on keyboard – one or two hands is a must”.
  • Good knowledge of the OOP will be an advantage – it means they want to hire junior. This also can suggest that company cares about design, but – not for sure.
  • UML – Too much discussion. For someone it will mean that this company stays in middle ages, for some people it will mean that this company cares about design.
  • Commercial experience in Java/ Java SE/ Java EE software development and Practical experience with relational databases – You need to have experience in Java and relational databases. Ok- simple one.

Finally in last point I can see some kind of technology stack:

  1. Spring Web Flow
  2. PrimeFaces
  3. Drools
  4. WebServices
  5. jQuery

Spring Web Flow is part of Spring MVC. PrimeFaces suggest they are using JSF (All ***Faces suggest it). There are a lot of people that hate JSF (Look here) but out there are also fans of this technology. Drools, WebServices, jQuery- this may attract someone.

As you can read client don’t expect knowledge about all technologies (we want to hire junior so that’s totally fine). Still in my opinion writing down technology stack for project could be nice addition. Let developers out there know what technologies they will be dealing with. Unfortunately sometimes expectations and “nice to have” in job offers don’t even stay close to real project requirements.

That’s it!

Please let me know if you like these series. I hope that after this chapter you will be more aware about how complicated situation is on IT market. Note that at the time your client or boss tries to get as best people as possible, developers try to find as good company and project as possible as well. Your role is to meet all those expectations.

Aware Recruitment. Part 2: Expectations

Aware recruitment. Part 1: Introduction

This article is for you if you work as a recruiter, have to find some Java developers, but have totally no idea what these buzzy words means: JDK, JPA, JSF, EJB, etc.

First of all – the topic is huge. So please note that this article doesn’t cover all answers for all questions and all technology relations. Still – it should cover basics and I hope that you feel much better while talking to developers 🙂 Please remember that I have to simplify a lot of things!

Why is this important?

When anybody starts asking you about technologies or anything tech-related it’s probably easier just answer that it’s not within your competences. But… using this approach you can lose some good candidates. Out there are a lot of similar technologies. Your client can ask to find someone with experience in Hibernate. Hibernate is just an implementation of JPA  so you can check every candidate that have JPA in CV (there are other implementations of JPA). Knowledge about these relations can boost your productivity. Lets be more aware of Java world!

Typical (simple) web application

First thing that you have to be familiar with is basic concept about what kind of developer you are looking for. Look at these terms:

  • Frontend – everything that application users can see,
  • Backend – everything what is “behind” frontend,
  • Fullstack – frontend + backend.


Generally, creating web application, you can see 3 different blocks: frontend (basically this is a web page that user sees with buttons, links and text), backend (this part generates all data for front end and can make some other things – like sending scheduled newsletter, choose some random promotion for every day, check our daily balance and a lot more) and DB (Database – this is a place where we store all persisted data like our clients, products, invoices).

Is that all?

It looks like there is not too much to talk about. BUT in fact there is much more. Developers have their own environment with special tools to build their applications, there are a lot of infrastructure around application and around development environment as well. So if we want to hire developer we will have to check not only technologies that are connected to application. All tools that are used on daily basis by client’s team are also very important. Imagine that you want to hire an accountant and you have a perfect candidate. He have very good knowledge about current law and have experience in similar company to yours. Seems like ideal. Now imagine that this particular person has never seen a computer and any accounting software. In his previous job they do everything in old-school way on paper and he personally has never used computer so far. It could change your mind I think. And that kind of problems occur very often in software industries. Companies use very different set of tools and these tools are not always up to date.

Before we try to go deeper let’s try to describe all kind of “groups” that we will have to cover:

  1. Frontend technologies
  2. Backend technologies
  3. Databases
  4. Operating systems
  5. Infrastructure elements
  6. Building Tools and dependency management
  7. Testing libraries and frameworks
  8. Virtualization solutions
  9. Management methodologies
  10. Management systems
  11. Code Version Control Systems
  12. Continuous Integration and Continuous Delivery Solutions
  13. Other

That’s a lot. And thats why I must split this story to few articles.

 Backend overview

Basically, when we are talking about Java applications we can separate concepts by its “size” or by its purpose (please note that this is how I try to categorize them for You). When we try to categorize concepts by size we will got these 3 elements:

  • Standards – some abstract concepts or standards that developers need to obey while doing particular things. Standards are very important – if particular developer know some library that follow some standards then he or she can quite easily start working with another library that follow same standard. Some examples: JPA, JAXB, JAX-RS, JAX-WS, JMS. Need more? Look here.
  • Frameworks – big things. Imagine that frameworks are some big blocks that cover a lot of problems (In the same time they create a lot of new problems :)). Choosing one particular framework pushes developers to make specific choices within their architecture. Frameworks sometimes covers only one part of application needs, sometimes a lot of them. Examples: Spring, Play, Jersey, CXF, JUnit
  • Libraries – smallest part. You need to know what the most popular libraries are used out there, but remember that a good developer can learn using a new library within a few days. For example: Guava, Lombok, JodaTime.

If we try to categorize them by purpose, we will have something like this (don’t worry if you are not familiar by these names):

  • Endpoint services – these are elements that have to serve “answers”. Endpoint as the name suggests, is a place in the code that will give calculated answers. Imagine that you are just about to buy some books online. This application frontend will have to connect backend and get your current list of books in your basket from particular endpoint. Developer will have to create some “point” that will have to calculate this result. For example: Jersey, Struts.
  • Database services – these elements just simplify developers to work with persisted data (like orders or availability of books in our imaginary store). So every application that use a database also have to use some database services. Examples: Hibernate, MyBatis, Spring-Data
  • Middle services – these elements connects endpoints with database services. Examples: Spring-Security, EJB

Frontend overview

We have few kinds of applications today:

  1. Desktop applications – These are programs that works on your computer directly. For example Word® or Outlook®. Also Browsers are desktop applications 🙂
  2. Web Applications – Works in your browser. For example Amazon®, Gmail® or Facebook®.
  3. Mobile Applications – Apps that works on your mobile phone. There is a lot of web applications that have their own mobile apps and a lot of “only mobile” apps as well.
  4. Console Applications – Apps with very simplified user interface.
  5. No-frontend Applications – Applications that don’t have any frontend.

Desktop applications

There are a lot of technologies that are able to provide particular kind of application. For example Java desktop applications are created mostly in javaFX technology today. A few years ago Swing was the most popular library. There is also AWT– its ancestor. So if you see that someone knows Swing and your client want a developer with JavaFX knowledge you can try to ask if this particular developer have some knowledge about JavaFX or ask your client if Swing knowledge is sufficient. Unfortunately these two don’t have a lot in common. But if you see in clients requirements that he wants Swing and JavaFX you can for sure ask why- because it doesn’t make any sense to write any application in these two at the same time. They are mutually exclusive.

Web applications

Every web page is just:

But, this is a bit more complicated because everything can be generated or delivered in a lot of different ways.

Mobile applications

There are a lot of mobile devices that give possibility to use Java. Almost every device has its own library and approach so it’s quite hard to cover them all. I will try to give a little overview about Android world as it’s most popular platform today.

DB overview

Database is just a container for data. If you don’t want to lose some particular file you store it on your hard drive. In application world database works similar but its far more complicated. There are a lot of different databases:

  • RDBMS – Relational Database Management System. Most popular conception where data can have relations. For example Your basket has one-to-many relation to products. So You have one basket while shopping and you can put as many products as you like in it.
  • NoSQL – Databases that have different conception than tabular idea used in relational ones. If we want to use NoSQL database, we need to choose one as there are a lot of them:


The purpose of this intro is to show spectrum of issues that every recruiter should be familiar with in my opinion. I have choosen three most important topics for this article – I hope now its a bit more obvious how this “java world” works. From now on- when you get your client’s expectations try to classify them as suggested above and then try to find similar technologies that can possibly cover same principles or standards. This will help you looking at particular technologies in candidates resumes.

Next chapter will be a bit different we will cover one topic and then I will give you some example requirements from real-world job offer and show how to look at this offer and how used technologies are connected to each other.

Aware recruitment. Part 1: Introduction

CentOS + Graphite + Grafana + NGINX Monitoring

This article will show you how to create basic environment for monitoring your distributed application in one place using Graphite and Grafana. Recently I did somehow similar configuration on CentOS Linux so I will show you how to make first step into world of monitoring in this particular OS (version 7.2 actually ;))

What we want to achieve?

Basically we want to create environment where any number of applications (hosted via NGINX in this example, but it could be anything) are reporting to single Graphite. Then we want Grafana for creating some nice dashboards that will give us just in time information what’s happening within our applications.

Graphite + Grafana basic environment


Of course this could be much more complicated – Nginx can be used only as LoadBalancers for multiple instances for some application modules. Then we want to both – load balancers and apps to tell our graphite about their real load. We will try to cover more complicated solutions in future.

Why Graphite and Grafana?

Basically because it’s somehow standard these days in IT. Grafana is just a platform that will give you nice dashboards.

Of course you can use tool such as Zabbix but this is a bit more different approach. First of all you have to provide more configuration info in zabbix to give you desired charts. Think about this solution that we want to create as a push notification system to Graphite. And everything – no matter how many instances of specific applications you have will show immediately when application start. I’m not familiar if zabbix can show you that many options on one dashboard and adopt to various numbers of data providers. Imagine auto-scalable system where number of instances of particular module can vary.

For Graphite instead of default database (Whisper).

Can I use other linux distro?

Yes you can.

Graphite – installation

Please use all commands with administrative privileges.

Before you start please update your distribution and install EPEL repository:

Now we can install httpd server (Yes Apache – I don’t mind which server will serve grafana and graphite and this is most common solution so you will get more results while searching for any troubleshooting). Also in this step we will install graphite and MariaDB – our MySQL server.

If you don’t want to use MariaDB but different database or just default one you don’t have to install all mysql/mariadb related packages.

Within next steps we will start and enable http server as well as myslq server:

Now we should create database for graphite (please change passwords!):

Graphite – configuration

Lets start to configure our graphite installation 🙂 We will use mostly default configuration so let’s copy default example configuration files:

Now we should configure graphite to use our database. Please edit /etc/graphite-web/local_settings.py  and add our database configuration:

Now we can generate database schema:

Last step is to set some file permissions:

Now we can reconfigure Apache to serve our graphite! Please note that I serve graphite on port 8080.

Last step is to add port 8080 to httpd configuration so Apache will listen on that port. Please add port 8080 so you will have in /etc/httpd/conf/httpd.conf two ports configured:

At the end restart apache and you should have Graphite installed and configured.

Grafana – installation

This one is easy 🙂

And if we want to serve this also via httpd:


You should now see at http port 80 grafana. Please add graphite as default source. After installation there is only one user: admin with password admin


Also – In my configuration graphite is accessible only from localhost so I don’t add additional security to this part of monitoring environment. All modules have to send data via tcp port 2003 which is accessible internal only. Only one access point for whole monitoring solution is Grafana – it have simple user management so you can use it out of the box. If you need to send data to graphite via internet please read this article before you start.

NGINX Monitoring

Next step is to provide simple but efficient nginx monitoring. First you need to install nginx, collectd and collectd plugin for nginx:

We will use Stub Status Module to give status information from NGINX then we will use collectd to send data over network to installed in earlier steps graphite. On some environments Stub Status Module is already compiled into nginx. If its not please use same steps as in Requirement section on this page.

Now we need to add information about endpoint that will serve our status information. Please add to /etc/nginx/nginx.conf  this code (in server section):

Please note that this endpoint will be accessible only from local machine. If you want to check if its ok. Use wget -q -O - "$@" http://localhost/nginx_status to get information about current nginx status.

Now we have to configure collectd. Everything is in /etc/collectd.conf  file. We want to enable nginx plugin and write_graphite plugin:

Restart nginx:

At this point  you will be able to create and add graphs. In next article in this series I will show you how to configure Grafana to adapt to multiple instances of nginx and show reasonable information just in time.

CentOS + Graphite + Grafana + NGINX Monitoring