Top 10 German tech events in Q1 2019 :)

Have you ever heard the statement that Berlin is considered to be a new European Silicon Valley? German market with its capital at the forefront is developing very dynamically. It is an attractive place to operate companies and corporations as well as to invest into.

In Germany you can find a lot of interesting tech events that will let you stay up to date with all the latest news in the industry. A few of them promise to be really interesting. Below is a list of the most important events in 2019 (only Q1).

#1 WeAreDevelopers World Congress 2019 – Berlin, January 6-7

IT leaders and specialists from around the world take part in it. The topics discussed include languages and frameworks, distributed systems, fronted and UX engineering, blockchain and issues related to IT project management.

#2 Sillicon Allee Events – Berlin, January 8, February 5, March 5

In the first quarter there are three meetups, organized periodically each month. The community connected with the tech startups in Berlin is taking part, which means that experience exchange, sharing knowledge and gaining valuable contacts are guaranteed.

#3 Handelsblatt Annual Conference Strategic IT Management – Munich, January 21-23

Digital transformation is the main topic of the conference. It’s a good place to acquire new knowledge in IT Management. The event is organized by EUROFORUM.

#4 LZ Open – Berlin, January 23-24

Like the conference in Munich, LZ Open in Berlin is all about digital transformation. In addition, you can gain useful knowledge of current technological trends and learn about effective business models that have revolutionized the market.

#5 Lean Startup Summit – Berlin, February 11-12

This event gathers experts, founders and intrapreneurs and C-level leaders in one place to exchange the latest innovation and transformation methods, share best practices and learn from each other in interactive formats like keynotes, workshops, roundtable discussions and mentoring sessions.

#6 International Conference on Science, Engineering&Technology – Munich, February 3-4

The purpose of this conference is to help exchange information and knowledge between various social groups, such as entrepreneurs, engineers, university lecturers and students. The most current technological trends are the high priority of the conference.

#7 Disruptive Technologies & Innovation Minds – Berlin, February 24-26

Here you will meet over 200 managers responsible in their companies for Research and Development (R&D). You will have an opportunity to take part in a discussion about technological innovations and challenges related to the IT industry.

#8 JavaScript Days – Munich, March 18-21

The event is conducted by experts in the field of JavaScript and HTML5. They will provide their views on how to plan JavaScript and HTML5 applications in the most optimal way and present the strengths and weaknesses of both technologies.

#9 IT&Information Management – Berlin, March 25-26

Strategies and processes, business realities in digital ecosystems, business models of the future, digital realignment and roadmaps – these are just a few examples of the topics that will be discussed during the conference in Berlin. You will have a unique opportunity to meet experienced managers related to the IT market.

#10 Mobile tech Conference – Munich,  March 26-27

This event is addressed to the leaders in mobile technology industry from German-speaking countries. It focuses on topics related to the development of iOS and Android, mobile web and UX experience.

It was a real hit! Best Codest’s articles in 2018 :)

The year 2018 is coming to an end, which is why it seems to be a good time for summaries. In recent months, a lot has happened on our blog. We shared the content prepared by the Codest specialists with you. We checked which articles were the most popular in 2018. Here is our list. If you missed something, we really recommend to catch up.

Where should you open your next startup and why?

The startup market is a very interesting topic, right? We have analyzed the best current markets for business development. Silicon Valley holds the leading positions, but on our list you will find many other interesting locations.

Best Agile tools for IT projects

What is the Agile methodology and what are some useful tools that improve work? On the basis of our client’s completed projects, we are answering how you can effectively increase your efficiency.

5 projects where JavaScript works well

JavaScript, as one of the most popular programming languages. We are presenting in which projects JS works really well.

UX/UI design. Why is it important in an IT project? (interview)

We are interviewing Katarzyna Górniak – Product Designer from Codest about current trends in UI / UX design. We also looking forward to what 2019 can bring us.

What should you know about Ruby on Rails?

We are impressed by Ruby technology and the Ruby on Rails framework. We are talking about their most important features. Here you will find a small compendium of knowledge.

How did Codest push Yieldbird to Deloitte list?

One of our clients has achieved great success in 2018, and we are really happy with it and pleased that our work could have contributed to the development of Yieldbird. See what effects our cooperation has brought.

That’s the strategy! Strategy Design Pattern

Something for the geeks. A design pattern is a conceptual model that helps you solve design problems in various contexts. Do you want to know more? You have to check this article!

First aid for broken JavaScript dependencies :)

I would like to write about JavaScript dependencies. But let’s start from the beginning. If you are a software developer, then you probably already know, that one of your many roles is definitely not to be yet another wheel inventor. At least, not in most of the cases. World has proceeded far enough to say that today there exist packages for almost everything, making our development easier and more efficient.

This of course is not an encouragement for losing interest in other issues – every package has quite a large space to improve and evolve. However, your business goal is to bring a complete product on a plate just on time or even before it is up. Packages will help you fulfill those plans, bringing npm or yarn on the top of your best friends’ list, but be aware: any solution, as well as this one, may also bring risk. And we will try to describe it and show you a better way of getting away with it in the article below.

Let’s start with a story…

Imagine a large JavaScript project. Business requirement obligates developers to use a specific package, allowing a proper integration with another system of a client. And that is completely fine. MVP has been brought on time, next contract has been signed and development is carried on. Client asks to integrate the next part of a system, which requires your package update.

This part goes well, until tests are fired. It seems that the package contains a simple, but inconvenient bug, that has not yet been fixed in any product release and it is known that this won’t happen soon enough. You cannot just fix your node_modules directory – it should be removed out from your repository from tracking, therefore your collaborators will never know anything about your changes! Well, while you were reading this, probably you have already understood what to do – fork. But do you really need such a hammer?

Understand your problem

You must be aware, if the problem you are facing with is going to involve just you or a larger community. Sometimes, people interpret lack of certain functionality as a bug, which is not always correct. Therefore, your solution may not be accepted by a community and not included into an official repository. However, you still need it here and now. Well, let’s patch it!

According to the release notes of github repository, patch-package was released officially in May 2017. It is a powerful tool, that allows modifications inside dependency project to be installed in your node_modules directory. Some may say that this is quite a madness – firing install command your dependence manager will overwrite the changes.

Well, this is correct. However, a patch-package coexists with npm and yarn perfectly (I must admit it works slightly better with npm so far, you can read more in “Why you should use postinstall-prepare with Yarn?” section of README file) and takes full advantage of a script preparation (“script”: { “prepare”:“”}) of your package.json file. Patch-package literally creates a diff directory between your changes and the original package, stored in the patch folder of your actual project.

After running install command and downloading all dependencies, it applies that difference to the project directory, making a perfect reconstruction of your changes for all collaborators. It makes your life simpler, doesn’t it? The solution has some disadvantages as well. The patch-package cannot fix dependencies of your package or make any changes in package.json.

In this case you may use the fork solution. Also, you must consider the number of changes you are about to apply into your dependency package and whether they will grow in time. In case the will – you should think carefully when using fork, as this is a project of your own.

Don’t be selfish!

Patching is a great way to fix your dependencies without creating endless forks and generating multiple project sources. But you should always remember, that taking advantage of community should not be a one-directional. If you find a bug or feel like you can improve the package you’re using, you should always consider helping others by registering an issue or even by contributing to the project!

Top Principles For Building Great Software Product :)

No company is able to succeed, if its product is not of a right value for the potential consumers. Creating an effective product based on proper software, consistent with customer preferences, is the key to your business development.

However, this is not as easy as it may sound. Many startups in the past either collapsed or had big problems getting their target group’s interest. All this happened due to the imperfections of the product. We decided to prepare a list of the most important rules to keep in mind when you are going to create a great software product.

Use the data of your target group

Even if you are convinced that you have created a great product that will not have any problems with the sale, you should check it out. On the basis of our ten – year experience at Codest, we have noticed that customers sometimes take hasty hypotheses, which later result in failures and the need to introduce a lot of modifications. That is why a proper analysis is so important. Use the available data – for example about the behavior and preferences of the target group, and then analyze them for your users.

At first – MVP

The creation of Minimum Value Products (MVP) is a very popular solution. It is not advisable to commission developers at the very beginning of the works aimed at creating very extensive functionalities. First of all, due to the fact that not all ideas can be verified by customers positively. That’s why the idea of MVP works really well. In addition, you should add that, thanks to MVP, you will gain time efficiency and will be able to check what your clients like and what not. If you are thinking about creating a web application, read the Ruby on Rails framework analysis and check which brands have decided to use it.

Choose an effective team of developers

You should entrust the creation of an effective product to professionals. You need to know that, depending on the character of work, it can be a very time-consuming process, which is why your decision should be carefully thought through. Why is it so important? First of all because you will minimize the risk of delays and possible errors. In addition, the competent experienced team of developers will also help you in choosing the right technology.

Remember, that not only the inside of the product counts, but also its overall appearance. In this case, the role of UX designer will be helpful, as this is a person who is perfectly familiar with current market trends and knows how to create user-friendly interfaces.

Testing

Do not give up, if the initial product functionality is not as effective as you expected. In the first phase of its development, you should run as many tests as possible to help you determine weaknesses and strengths. Thanks to A/B tests, you can gain knowledge of the solutions you should abandon in the future. If it maintains constant cooperation with a team  of developers, you will be able to implement subsequent changes very quickly. This will help you match the product to the market needs as fast as possible.

Why Poland is full of qualified Ruby on Rails developers? :)

We have no doubt that Poland is currently one of the most attractive markets in the world, where you can find qualified Ruby on Rails developers. Cooperating with clients every day, we are looking at this trend with quite an interest.  Polish developers are praised not only for their knowledge of this framework, but also for high standards of cooperation.

More and more geeks of RoR

The IT market is struggling around the world with the problem of demand exceeding supply with qualified specialists. Experienced and effective developers are constantly sought after. However in Poland there are quite a lot of them. We have noticed that more and more people are deciding to learn Ruby and its popular Ruby on Rails framework as they see it as a great prospect of development. The exchange of knowledge also comes in handy. The Ruby on Rails geeks community is extensive and appears to be a huge asset of this framework. This comes as quite helpful for developers, primarily when they need to solve a problem.

In addition, the high competences of Polish Ruby programmers should be appreciated. They receive job offers from foreign companies a lot, but a really good situation on the Polish market makes them reluctant to go. In Poland, Ruby developers are truly appreciated. Companies guarantee high earnings and very good working conditions.

Quality

The quality of products created with Ruby on Rails by Polish developers is appreciated all over the world. It is said that RoR programmers in Poland are one of the most developed groups with very high competence and the reasons seem quite obvious. They can combine the capabilities of the Ruby language and the Ruby on Rails framework, creating products based on such features as efficiency, functionality, time efficiency, application width and security. We must also add that Ruby on Rails is probably the best language that allows you to create a product based on MVP (Minimum Value Product) in a very short time. This is a very common solution used by many companies that regularly check and verify the value of their product on the market.

Poland is a great place for outsourcing

Not only the high skills and a wide range of Ruby on Rails developers decide that Poland is perceived as a very good place to outsource. There are also many other benefits, such as cost savings, the ability to cooperate with a customer or ever-growing market. In particular, the first two factors are really crucial from the partner’s perspective. Not only that by creating a product in Ruby on Rails you can be sure of quality and speed, but also software houses in Poland offer very good prices – much lower than in other countries of Western Europe.

Finally, we would like to draw attention to yet another important element – communication. An effective team of developers must be able to communicate effectively with the client to understand their needs and, as a result, create a product that coincides with the expectations. In fact, this is not a simple process at all. That is why it is so important for a software house to have effective cooperation rules, which are best, if confirmed by the recommendations of previous clients.

The best sites for UX design’s inspiration :)

Interesting and inspiring websites are one of the most important sources of knowledge for all the people involved in UX design. Keeping up to date with current novelties and trends is the responsibility of a good UX designer. Currently, the network can offer a lot of interesting sites devoted to this subject. We have decided to choose a few of them and present their specificity closer.

UX Magazine

It is the best place for all the people, who are real geek of user experience. This page is created by a free community, which resource explores all the facets of an experience design. Shared graphics are a great way to get inspiration and develop your own projects. It is worth noting that, apart from various types of graphics, there is a section with industry-specific articles that allows UX users to keep up with all the latest news.

Design Shack

Every day, a lot of people use this blog – agency employees or specialists involved in the professional design of web sites are among them. Design Shack offers an access to a vide source of knowledge, which consists of such sections as inspirations, layouts, mobile and others.

Smashing Magazine’s UX Design Category

Here you will find content in the form of articles that present current industry news related to web, mobile or software. This is a good source of knowledge, as the articles are rich with valuable information provided by experts with experiences in UX design.

UX movement

It is a blog with articles presenting the most important trends and news related to UX design. There in no time you can verify your own idea for the project or supplement it with inspirational ideas proposed by the authors of the texts.

UX Myths

Quite a specific, but really interesting and useful website. Its premise is to refute all myths and errors associated with UX design. There are dozens of common beliefs that experts consider to be incorrect.

DesignModo UX

A place devoted to UX elements that allow you to keep such projects as aesthetic, business or retaining elements related to the psychology of a recipient. This is certainly a good source of knowledge for both beginners and more experienced ones. Like with on the other websites mentioned above, on DesignModo UX, expert articles make the most important part of the content.

That’s the Strategy! Strategy Design Pattern :)

While working on a project, it is crucial to remember that you do not want to reinvent the wheel. If a solution for a problem is proved to be effective, reusing it will save you tons of time and a few headaches. In case of system architecture dilemmas, we have developed some patterns to ease a design process.

What is a design pattern?

A design pattern is a conceptual model that helps you solve design problems in various contexts. It is like a reusable template you can apply to a structuring code. The thing is, design patterns are well-documented, well-proven and commonly known. In other words, use a proper design pattern and be sure that other design pattern insiders (aka your coworkers) will get the hang of your ideas smoothly.

Eager to learn? Here comes the Strategy Design Pattern.

The strategy design pattern:

– defines a family of algorithms,

– implements each of the algorithms as a separate entity,

– allows each of the algorithms to be used interchangeably in a given context.

Real life example? Authentication

In one of our apps we have implemented a few strategies for authenticating requests. We allow authentication with cookies, JWT tokens and API keys. Sounds like a family of algorithms to me.

Let’s have a look at a sample implementation.

We have our family of authentication algorithms divided into three separate classes. Each class defines the concrete behavior; it is where all the implementation details go:

module AuthenticationStrategies
  class CookiesAuthentication
    def self.authenticate_request(request)
      puts "I implement a cookie authentication algorithm"
    end
  end
class JWTAuthentication
    def self.authenticate_request(request)
      puts "I implement a jwt authentication algorithm"
    end
  end
class ApiKeyAuthentication
    def self.authenticate_request(request)
      puts "I implement an api key authentication algorithm"
    end
  end
end

Then, we have a context/client class:

class Authentication
  def self.authenticate(authentication_strategy, request)
    authentication_strategy.authenticate_request(request)
  end
end
request = "I pretend to be a request"
Authentication.authenticate(AuthenticationStrategies::CookiesAuthentication, request)
Authentication.authenticate(AuthenticationStrategies::JWTAuthentication, request)
Authentication.authenticate(AuthenticationStrategies::ApiKeyAuthentication, request)

The above script outputs:

I implement a cookie authentication algorithm
I implement a jwt authentication algorithm
I implement an api key authentication algorithm

Summing it up

– design patterns are useful tools for solving architectural problems,

– knowledge of design patterns improves communication on system architecture with other developers,

– the Strategy Design Pattern suits your needs if you have a bunch of algorithms that can be used interchangeably in a given context.

Quality in Codest. Why do we deny to some projects? :)

In the previous articles you could find out, why a great communication in IT project is so important. This time, we would like to talk more about our work at Codest and present our personalized approach to a quality work, which is very crucial for us. To put it in a nutshell – it’s not quantity, but high quality that counts.

Why does the quality work matter?

Our customer’s satisfaction has always been the priority. Codest has been operating for over 10 years on the IT market and at the very beginning it was decided that our work was to stand out from other companies in terms of quality and high efficiency. Nothing has changed since then and it is only due to this approach we can prove our being the best software house that is constantly developing.

The year is coming to an end and that is why we can summarize the completed projects. Once again we have managed to provide a high level of service, reflected by the opinions of our clients and great relationships maintained. They have repeatedly appreciated our approach, emphasizing, that in the case of needs related to the development of software, we will always be their first choice.

Why do we refuse from some projects?

Every month we receive several inquiries from companies that want to cooperate with us. I would like to emphasize that we do not always agree to implement a specific project. It is related to the fact that at first we analyze the availability of our developers and only then we can confirm the readiness to cooperate with a client. We are convinced that this approach puts us in a very good light in our partners’ eyes.

We will never accept a project if our developers do not have sufficient time resources. It is because we pay much attention to their work comfort. We know perfectly well that it is a good idea to organize their working time to be as efficient and effective as possible. This approach influences directly the effects of our projects. Only then we can be sure that our work will be positively evaluated.

Grow fast with high quality

That’s the motto that guides us in Codest. From the very beginning of our activity on the IT market, we have been developing dynamically, cooperating in the meantime with companies from various industries. From startups to large corporations, we want to constantly develop and be proud of successive projects that are a success. And at this point I would like to emphasize once again that the development would not be possible, if it were not for the high quality of work that is always a priority.

Codest is characterized by an individualized approach to each client who can be sure that when we carry out a project we do this with an utmost care. You can stay assured that this approach in Codest will never change.

Ruby Domain Specific Language :)

By reading this article you will learn what the DSL is and what it has in common with Ruby.

DSL, say welcome!

Referring to definition, DSL (Domain Specific Language) is a computer language specialized to a particular application domain. This means it is developed to satisfy specific needs. There are two types of DSL:

– An external DSL which requires its own syntax parser. A good known example may be the SQL language – it allows to interact with database in a language in which the database was not created.

– An internal DSL which itself does not have its own syntax but instead uses a syntax of a given programming language.

As you can probably guess we are going to stay focused on the second DSL type.

What does it do?

Basically, by making use of a Ruby metaprogramming, it allows to create your own mini-language. Metaprogramming is a programming technique that allows to write a code dynamically at runtime (on the fly). You may be unaware of this, but you probably use many different DSLs every day. To understand what a DSL can do, let’s take a look at a few examples below – all of these have one common element, but can you point it?

Rails routing

Rails.application.routes.draw do
  root to: 'home#index'

  resources :users do
    get :search, on: :collection
  end
end

Every person who have ever used Rails know a config/routes.rb file where we define application routes (mapping between HTTP verbs and URLs to controller actions). But have you ever wondered how does it work? In fact, it is just Ruby code.

Factory Bot

FactoryBot.define do
  factory :user do
    company
    sequence(:email) { |i| "user_#{i}@test.com" }
    sequence(:first_name) { |i| "User #{i}" }
    last_name 'Test'
    role 'manager'
  end
end

Writing tests often requires fabricating objects. Hence to avoid a waste of time, it would be a really good idea to simplify the process as much as possible. That is what the FactoryBot does – easy to remember keywords and a way of describing an object.

Sinatra

require 'sinatra/base'
 
class WebApplication < Sinatra::Base
  get '/' do
    'Hello world'
  end
end

Sinatra is a framework which allows you to create web applications from scratch. Could it be easier to define request method, path and response?

Other DSL examples might be Rake, RSpec or Active Record. The key element of each DSL is the use of blocks.

Building time

Time to understand what is hiding under the hood and how the implementation can look like.

Let’s assume we have an application which stores data about different products. We want to extend it by giving possibility to import data from a user defined file. Also, the file should allow to calculate values dynamically if needed. To achieve that, we decide to create DSL.

A simple product representation may have following attributes (product.rb):

class Product
  attr_accessor :name, :description, :price
end

Instead of using a real database we will just simulate its work (fake_products_database.rb):

class FakeProductsDatabase
  def self.store(product)
    puts [product.name, product.description, product.price].join(' - ')
  end
end

Now, we will create a class that will be responsible for reading and handling file containing products data (dsl/data_importer.rb):

module Dsl
  class DataImporter
    module Syntax
      def add_product(&block)
        FakeProductsDatabase.store product(&block)
      end

      private

      def product(&block)
        ProductBuilder.new.tap { |b| b.instance_eval(&block) }.product
      end
    end

    include Syntax

    def self.import_data(file_path)
      new.instance_eval File.read(file_path)
    end
  end
end

The class has a method named import_data which expects a file path as an argument. The file is being read and the result is passed to the instance_eval method which is called on the class instance. What does it do? It evaluates the string as a Ruby code within the instance context. This means self will be the instance of DataImporter class. Thanks to the fact we are able to define desired syntax/keywords (for a better readability the syntax is defined as a module). When the add_product method is called the block given for the method is evaluated by ProductBuilder instance which builds Product instance. ProductBuilder class is described below (dsl/product_builder.rb):

module Dsl
  class ProductBuilder
    ATTRIBUTES = %i[name description price].freeze

    attr_reader :product

    def initialize
      @product = Product.new
    end

    ATTRIBUTES.each do |attribute|
      define_method(attribute) do |arg = nil, &block|
        value = block.is_a?(Proc) ? block.call : arg
        product.public_send("#{attribute}=", value)
      end
    end
  end
end

The class defines syntax allowed within add_product block. With a bit of metaprogramming it adds methods which assign values to product attributes. These methods also support passing a block instead of a direct value, so a value can be calculated at runtime. Using attribute reader, we are able to obtain a built product at the end.

Now, let’s add the import script (import_job.rb):

require_relative 'dsl/data_importer'
require_relative 'dsl/product_builder'
require_relative 'fake_products_database'
require_relative 'product'

Dsl::DataImporter.import_data(ARGV[0])

And finally – using our DSL – a file with products data (dataset.rb):

add_product do
  name 'Charger'
  description 'Life saving'
  price 19.99
end

add_product do
  name 'Car wreck'
  description { "Wrecked at #{Time.now.strftime('%F %T')}" }
  price 0.01
end

add_product do
  name 'Lockpick'
  description 'Doors shall not close'
  price 7.50
end

To import the data we just need to execute one command:

ruby import_job.rb dataset.rb

And the result is..

Charger - Life saving - 19.99
Car wreck - Wrecked at 2018-12-09 09:47:42 - 0.01
Lockpick - Doors shall not close - 7.5

..success!

Conclusion

By looking at the all examples above, it is not hard to notice the possibilities offered by DSL. DSL allows to simplify some routine operations by hiding all required logic behind and exposing to user only the most important keywords. It allows you to get a higher level of abstraction and offers flexible use possibilities (what is especially valuable in terms of reusability). On the other hand, adding DSL to your project should be always well considered – an implementation using metaprogramming is definitely much harder to understand and maintain. Moreover, it requires solid tests suite due to its dynamism. Documenting DSL furthers its easier understanding, so it is definitely worth doing. Although implementing your own DSL can be rewarding, it is good to remember that it must pay off.

Did you get interested in the topic? If so let us know – we will tell you about DSL which we have recently created to meet the requirements in one of our projects.

How did Codest push Yieldbird to Deloitte List? (interview) :)

Once upon a time, there was a market without any AdX Optimization. Then a Yieldbird appeared and changed the reality of many publishers. How did it happen? We talked with Grzegorz Kubrakiewicz, Head of Technology at Yieldbird, who explains, how the cooperation with Codest has made it possible to be listed 16th in Deloitte ‘Technology Fast 50 Central Europe‘.

How was this whole idea born?

– Grzegorz Kubrakiewicz: It all began with Adtaily, which allowed small advertisers like hairdressers or hotels to place their ads on larger portals on regional Gazeta.pl sites. The Adtaily ad network was working with them. In the meantime, Marcin Ekiert and Piotrek Niedziela, inspired by Fredrik, started playing from the publisher’s side with AdX settings and noticed that in this way they were able to make more money with them. It was also related to the fact that all the money on the market in programmatic come from advertisers.

The whole programmatic focused then on the source of money from the buyers’ side, the market was tight, the competition was large. Based on gained knowledge, we created Yield Optimization and for several years we were becoming more and more experienced on many markets.

The next step was an attempt to write a software which will automate and improve all these concepts in two ways: either by automation and increasing the scale, or by using more complex algorithms that will be better than a human.

How did the implementation process work?

It took a bit of time to find a way on how to automate it, get to know the process, the way it works, invent some ways for it and how to tell developers from Codest about it, so that they could produce a tool that creates added value. And then it went like a snowball effect, it spread, we had more and more ideas what to optimize.

Later on we made a whole class of products, i.e. a wrapper which really automated processes such as creating setups for publishers. Setups are constructions that help these publishers increase profits by increasing demand, it required the publisher to install javascript codes, integrate with the site. It was quite complicated, mainly due to the Javascript code which has to be integrated with a website, and not every publisher has their own development resources. A swell as both the language and cultural barrier with the publishers could be quite an obstacle. Therefore, it was clear that we needed Codest to create an easy and user friendly product.

How did the market welcome Yieldbird?

– The publishers’ market, the supplier of advertising space, was quite empty, there were no products dedicated to these publishers. So the idea of optimizing the advertising space worked. The next stage was the idea for a service that will help publishers earn more from the advertising space and exert more pressure on advertisers.

Some welcomed us really warmly, as they really wanted to make more money, but some were very suspicious, or we could not explain them what it all was about. The barrier of understanding is quite large, because it is not an easy or cheap product. Each publisher is in a different situation and a different setup, that’s why our products are cut to measure and grow together with our publishers.