Articles tagged with
java
05 Aug 2024
Are you, as a test automation engineer, tired of Selenium’s flakiness? Are you seeking a better tool to automate your end-to-end tests? Have you heard of
Playwright? Perhaps you’ve encountered opinions that it is only worth using within a Node.js environment. I have. And as a tester, I decided to verify if
this is true. If you’re interested in the results, I encourage you to read the following article.
31 May 2023
As a part of a broader initiative of refreshing Allegro platform, we are upgrading our internal libraries to Spring Boot 3.0 and Java 17.
The task is daunting and filled with challenges,
however overall progress is steady and thanks to the modular nature of our code it should end in finite time.
Everyone who has performed such an upgrade knows that you need to expect the unexpected and at the end of the day prepare for lots of debugging.
No amount of migration guide would prepare you for what’s coming in the field.
In the words of Donald Rumsfeld there are unknown unknowns and we need to be equipped with the tools to uncover these unknowns and patch them up.
In this blog post I’d like to walk you through a process that should show where the application hangs,
although there seems to be nothing wrong with it. I will also show that you don’t always know what code you have – problem known as dependecy hell,
place we got quite cosy in during this upgrade.
10 Mar 2023
Hardware is always hard. The amount of operations, maintenance and planning that goes into supporting a data center
is a daunting challenge for any enterprise. Though often unseen, without hardware there is no software.
20 Jun 2022
At Allegro we decided to introduce GraphQL as our API Gateway for building several internal client systems.
By building such a solution we’ve learnt a lot about this technology
and we would like to share it with you in this article.
22 Feb 2022
Have you ever worked on a project where after downloading the code from the repository you start to wonder what business
requirements are hidden under the layer of unreadable tests?
Or maybe you are currently wondering how to test a new feature that you have been entrusted to implement?
01 Oct 2020
Most applications need to be able to persist and retrieve their state to be fully functional.
In my previous post I compared methods for persisting application state.
In this post I will compare the methods for retrieving this state.
16 Jul 2020
We run over 800 microservices in our on-premise and public clouds. They are developed by hundreds of engineers
in various technologies: from the most popular Java and Kotlin, through Scala, Clojure, Python, NodeJS, Golang, to
less mainstream like Elixir or Swift. All these applications need to handle common
technical concerns: logging, monitoring, service discovery, tracing, internationalization, security and more.
How to provide common solutions to these requirements in such a heterogeneous setup?
In this post I’m going to explain how we originally solved this problem with common libraries
and how we are currently changing our runtime environment to make things even easier.
22 Jun 2020
An application can be defined as a set of use cases.
It often happens that use case A requires a previously executed use case B for its execution.
In such situation, it should be ensured that use case B has been executed while executing use case A.
To achieve this, application state that is common to both use cases, is introduced.
The state must be persisted to be visible to more than one use case.
Most often, various types of databases are used for this purpose.
While working with source code, I have encountered various methods of persisting the application state.
I also came up with my own variations.
In this post I will make a subjective comparison of these methods based on specific criteria.
21 May 2020
When you go through articles related to Hexagonal Architecture (HA) you usually search for practical examples.
HA isn’t simple, that’s why most trivial examples make readers even more confused, though it is not as complex as many
theoretical elucidations present it. In most posts you have to scroll through exact citations or rephrased definitions of concepts such as
Ports and Adapters or their conceptual diagrams. They have already been well defined and described by popular authors i.e.
Alistair Cockburn or Martin Fowler.
I assume you already have a general understanding of Domain Driven Design and that you understand terms such as Ports and Adapters.
I’m not a HA expert, yet I use it everyday and I find it useful. The only reason I write this post is to show you that Hexagonal Architecture makes sense, at least if your service is a little more than a JsonToDatabaseMapper.
16 Apr 2020
As a developer interested in both web technologies and game development I always found myself
disagreeing with a large part of articles about using a particular technology to solve some problems.
While such articles are often true, they often skip some important details that make given
solution unacceptable in some other cases. And in this article I will try to look at
immutability in a negative way from game development perspective and how it can affect web services too.
It is always more fun to look in a negative way at something everyone loves ;)
27 Jan 2020
Configuration management is one of the key challenges you have to face when you decide to build an application as a distributed system based on microservices
deployed to the Cloud. There are multiple ways of addressing different aspects of this problem, using several tools such as Spring Cloud Config Server
or Hashicorp Consul. However, this article will focus on the tools that Google Cloud Platform offers
out of the box. The approaches mentioned should be seen as complementary rather than mutually exclusive.
12 Dec 2019
One of the first challenges a programmer has to face is organizing classes within a project.
This problem may look trivial but it’s not.
Still, it’s worth spending enough time to do it right.
I’ll show you why this aspect of software development is crucial by designing a sample project’s architecture.
01 Apr 2019
This post was published on April 1st, 2019, and should not be taken too seriously.
18 Dec 2018
Since the beginning of my career as a Java developer, keeping up to date with Java was fairly straightforward.
Big releases came every few years, causing a bit of mayhem in tooling, IDEs and job interview questions.
However with each release there was a lot of time to adjust and migrate to newer versions.
With Java 9 things have changed. The so called new release cadence
was announced by Oracle.
Instead of releasing a new major version each few years, we will get one every half year.
This poses a lot of challenges to companies using Java in production, developers and the community as a whole.
26 Jun 2018
Throughout my studies at university and work in the industry I switched my primary programming language from Java to
C# and back again to Java. This article gathers some of my thoughts on using both languages. It’s not intended to be
a comprehensive comparison of Java and C#. There are a lot of other resources on the Internet that cover this topic.
Instead, I want to focus on what I personally liked about both languages and how it felt to transition between them.
23 May 2018
Due to the high interest and controversy concerning this blog post, we believe that it is worth adding some context
on how we work and make decisions at Allegro. Each of more than 50 development teams at Allegro has the freedom to choose
technologies from those supported by our PaaS. We mainly code in Java, Kotlin, Python and Golang.
The point of view presented in the article results from the author’s experience.
07 May 2018
We all make errors, but some errors seem so ridiculous we wonder how anyone, let alone we ourselves, could have done such a thing.
This is, of course, easy to notice only after the fact. Below, I describe a series of such errors which we recently made
in one of our applications. What makes it interesting is that initial symptoms indicated a completely different kind
of problem than the one actually present.
24 Apr 2018
Spring is one of the most popular JVM-targeted frameworks. One of the reasons why it has become so popular is writing tests.
Even before Spring Boot era, it was easy to run an embedded Spring application in tests. With Spring Boot, it became trivial.
JUnit and Spock are two most popular frameworks for writing tests. They both provide great support and integration with Spring,
but until recently it was not possible to leverage Spring’s @WebMvcTest in Spock. Why does it matter?
@WebMvcTest is a type of an integration test that only starts a specified slice of Spring Application and thus its
execution time is significantly lower compared to full end-to-end tests.
Things have changed with Spock 1.2. Let me show you, how to leverage this new feature.
21 Sep 2016
This article is a part of CQK Top 10 series.
20 Jun 2016
Kotlin may seem like a new kid on the block — itʼs been officially released only in February.
Its history however dates a few years back
and itʼs mature and stable enough to be used for developing solid reliable applications.
Therefore at Allegro we decided to give it a chance — we built our new
shiny server-side system using Kotlin as its primary language and we do not regret it.
28 Apr 2016
In this post I will introduce to you a recently released version of a well known library for consuming RESTful services — Retrofit2.
Even though it is mainly targeted at Android platform it works very well on the “server” Java. Its lightness and low garbage generation
overhead make it an interesting option if one does not like existing solutions (like Jersey Client,
or Spring’s RestTemplate). I will also
show how to configure it properly and fully utilize its great RxJava compatibility.
25 Nov 2015
In the team that develops Allegro Recommendation Platform we weren’t happy with our integration tests. Long setup and
assertions blocks resulted in a low signal—to—noise ratio and poor readability. These tests were also full of ad hoc
variables like 1, ABC, OK or NOK, which caused that it was hard to find a connection between input and output
data. Moreover, any change in an API caused changes in many tests.
10 Nov 2015
At Allegro, you can sell items at a fixed price (buy now) or at auction.
Auctions are still a popular sales format, especially in categories such as antiques and art or clothing.
So far, buyers fighting for an item had to refresh the web page in the last seconds of the auction to verify that the offer had not been overbid.
This made bidding difficult and less fun. Last year real time bidding process for all mobile users was introduced.
In this article I want to show how to create a simple application that provides real-time bidding, based on Allegro auctions.
We will use WebSockets, SockJS
and the latest, third version of Vert.x.
We will create a frontend for fast bidding that communicates with a microservice written in Java 8 and based on Vert.x.
05 Oct 2015
In this article I will show you that if you want to implement good logging into your application then you should have
a strong knowledge of logging API, spend some time considering what and when to log and last but not least: remember that
logging is a cost paid in your application’s responsiveness.
24 Sep 2015
Today, in an age of great popularity of test automation, we can observe a growing number of different frameworks which
allow us to write scripts and programs that simulate human actions performed on the website under test. The most popular
solution is Selenium WebDriver framework, which is compatible with the majority of common languages.
Broad compatibility is a big advantage of Selenium especially in cases when we have to write some tests integrated to
our application project, because no matter in which language we write the application, Selenium probably has an API for
that language too. But there are also situations, like writing a standalone test suite, when we can decide which
technology we’d most like to use. Taking into consideration this case, let me introduce to you a short
comparison of three JDK-based technologies:
29 May 2015
Groovy is a dynamic, object-oriented programming language for the Java platform. Its name comes
from slang, where “groovy” means “cool”, “amazing” or “fashionable”. This programming
language was designed to be so, but is it still groovy nowadays? Creator of Groovy,
James Strachan, admitted that he wouldn’t have created Groovy if he had known anything about Scala. But his project started living its own
life. Let’s take a look at what it has to offer us now.
26 May 2015
The first question is — what is overmocking? There are a couple of answers. When you mock something that you can leave or
even should use as it is — this is overmocking. An example of this is a POJO object. Other way to overmock your test is
to mock all the dependencies and rely only on verifying interactions with mock objects. You will see that in my
examples. Overmocking can also happen when you mock something that you don’t own like an external library.
20 May 2015
According to Moore’s law the number of transistors
in an integrated circuit doubles approximately every two years. However, the exponential
processor transistor growth does not always translate into exponentially greater practical CPU
performance. Processor manufacturers for years delivered processors with higher clock rates and
instruction parallelism. As a result, single-threaded code executed faster on newer generations of
processors. Of course, it is impossible to speed up clock rates infinitely and processors like
AMD FX-9590 with turbo clock speed at 5 GHz are rather unique.
Today, processor manufacturers favour multi-core processors.
It is common to have a quad-core CPU in smartphones, not to mention laptops or even desktop PCs.
Consequently, software has to be written in a multi-threaded manner to take full advantage of the
hardware. Thread pools can help programmers
harness multi-core CPUs.
10 Apr 2015
Nowadays, Spring Boot gets more and more popular as it simplifies creating standalone, production-grade Spring based
applications. It offers e.g. auto-configuration support for most of the available Java-based template engines
such as Velocity, Thymeleaf, etc. Today, we would like to publish the new Spring Boot starter that supports
auto-configuration of other popular template engine we have recently got used to —
Handlebars. Hopefully you might find this little piece of code useful.
03 Apr 2015
At Allegro we use many open-source tools that support our work. Sometimes we are not able to find what we want and this is a perfect moment to fill the gap and
to share with the community. We are proud to announce an initial release of Tradukisto — a small Java library created to
convert numbers to their word representations.
12 Mar 2015
The story begins two years ago during an excellent TDD training given by
Szczepan Faber
and Tomek Kaczanowski
for a bunch of Allegro developers. Surprisingly, it was a trigger to revolutionize our builds at Allegro.
02 Mar 2015
Typically, applications we develop gain more and more features in each sprint. After a certain time it’s hard to say how
a particular functionality should work. No one remembers all the corner cases without looking into the source code. So
we write high level acceptance tests that describe expected behavior. Using some example scenarios that the end user
could trigger, tests check that the outcome is correct. After the user story is implemented, the test joins a
regression suite that will protect the application from bugs
introduced in future stories.
18 Feb 2015
There’s no denying that the most important way
to reach an offer on Allegro is a search bar. How it works from the user’s point of view everybody knows. You input a
search phrase, select some filters when needed, click “search” and you get some results, usually quite fast. What looks
like a simple and straightforward process on the surface, inside actually engages really
complicated algorithms. In this first post of the series we will try to make you a little bit familiar with the tools we
use here at Allegro to make search happen. In an upcoming post, we will describe how to use them, focusing mainly on the
analysis process.
03 Feb 2015
In this post I would like to show you how to add a resource programatically in Jersey
container. We start from a business use case that needs to be implemented. What we are
trying to achieve is to allow external clients to use some resources of internal
microservices. I am aware of the fact that the solution we are going to discuss is not
the best way to solve the problem. Choosing the best solution lies outside the scope
of this post. What is covered in this post are the steps and solutions we tried to use
in order to solve the problem.
29 Jan 2015
When you publish your service API it is crucial to make it easy to upgrade. If you forget about it, you might end up in dependency hell.
Each attempt to change your API will force you to contact all your clients and tell them to upgrade their software.
As a result, both you and your clients will be very unhappy.
You can mitigate it by providing multiple versions of your resources. But there is no single way how to manage them.
Different companies solve it in different ways. Below you find three most popular approaches.
24 Dec 2014
This post is an introduction to the mysterious and alien world of aspect-oriented programming, or aspects for short.
At first sight it is difficult to understand why to use aspects and how a project can benefit from this technology.
The simplest use case where we can use an aspect is logging. I believe that everyone saw, or even wrote on their own,
a piece of code where the business logic was interweaving with infrastructure code:
09 Dec 2014
This post is about migrating a real-world, non-trivial, business-critical application from Java 7 to Java 8.
When searching for a JDK 8 migration guide, you can often find blog posts that claim to be helpful but in reality only repeat the list
of features found in release notes and offer no insight into issues you may encounter in practice. Having no migration guide during our own
migration, we decided to create one. This is a report right from the trenches, no details spared, casualties included.
26 Nov 2014
REST (Representational State Transfer) has become very popular
over the course of the past few years. It has happened so not only because of growing popularity of lightweight Web frameworks
(like Angular.js) but also due to the new Microservice Architecture
hype (thank you Netlifx). Frameworks like Spring add new REST-related functionalities with
each new release and more and more companies decide to give them a try… But how do you test them - REST services and their clients?
19 Nov 2014
We live in a mobile-oriented world so it’s crucial to provide the best usability experience possible.
In this post we show how you can preserve user’s context when installing a mobile application from a website.
12 Nov 2014
There are two parts of this article. In first we define
what is Capacity (maximum load) and Resilience (fault tolerance) of a typical e-commerce site.
29 Oct 2014
One of new features introduced by JAX-RS 2.0 is asynchronous processing in Server and Client APIs.
We use these APIs together with CompletableFuture
and Java 8 lambda expressions to show how to create scalable
and well performing REST services in a more functional way.
08 Oct 2014
CPU time and memory are the two primary resources every performance-sensitive application needs to use wisely. Java is now the language
of choice for many such systems. While most developers have at least basic understanding of computational complexity, I believe that few,
especially among those who primarily use Virtual-Machine based languages such as Java, understand well how their applications manage memory.
This is not only a very interesting topic in itself, but can also help in improving performance of Java applications or in understanding
better the behavior of common Java-based databases such as Apache Cassandra.
01 Oct 2014
Introduction
This article is addressed mainly to people who are not very experienced in the area of unit / integration testing although basic knowledge
of JUnit is required. I am going to provide you with a quick recap of the most commonly used Java testing tools, starting with JUnit
(together with three nice complementary libraries: JUnitParams, catch-exception) and Mockito. Then I will show you how to perform
assertions in a much nicer and cleaner way using AssertJ so that you never have to use Hamcrest again.
10 Sep 2014
This is a third j.Piknik, perfect occassion to meet Allegro Engineers in relaxed enviroment.
Event will be held at La Playa Music Bar on Saturday 20th September, Warsaw.