Philipp Hauer's Blog

Engineering Management, Java Ecosystem, Kotlin, Sociology of Software Development

Blogs

Coaching Skills for Managers II: The Thought Model

Posted on Sep 27, 2023

Coaching Skills for Managers II: The Thought Model

The “Thought Model” is a coaching model to steer a coaching conversation. It helps when the coachee wants to explore new ways of thinking about a problem, which in turn can lead to a changed behavior and the desired results. This post contains the digest of this model and a cheat sheet to ease the application in a conversation.

Coaching Skills for Managers I: The Coaching Steering Wheel

Posted on Aug 1, 2023

Coaching Skills for Managers I: The Coaching Steering Wheel

Coaching is a powerful approach to helping people solve their challenges and supporting their growth. To implement a coaching practice, it’s important to learn how to steer a coaching conversation and what concrete questions and tools can be used in each conversation phase. This post provides a concise and hands-on model and toolbox of the coaching questions and tools I gathered over the years. I compiled everything into a cheat sheet called the “Coaching Steering Wheel”.

Template for Efficient One-On-One Meetings

Posted on Feb 7, 2023

Template for Efficient One-On-One Meetings

One-on-Ones are one of the most important and powerful tools for leaders. If done well, they can help you to spot issues before they escalate, unblock, establish trust, foster a culture of mutual feedback, and ensure the growth of all participants. This post provides a template incorporating the principles for great one-on-ones to achieve this more easily.

Manager's Summary of the Book 'Never Split The Difference'

Posted on Jan 2, 2023

Manager's Summary of the Book 'Never Split The Difference'

I enjoyed reading the classic “Never Split The Difference” by Chris Voss. It contains many tools for negotiations but also for building relationships, trust and dealing with conflicts and emotions. That’s why it is very valuable for engineering managers. In this post, I summarize my key takeaways and lessons learned.

Leveling Up in Job Interviews for Software Engineers

Posted on Oct 24, 2022

Leveling Up in Job Interviews for Software Engineers

Have you ever applied for an engineering job but got a rejection? Most of the time, the job interview decides about the hire. This post takes you to the other side of the table and prepares you for challenging interviews. We point out which technical skills, traits, values, and cultural aspects are relevant and which questions are asked to assess them. This post is for engineers who want to stand out in their next interview.

Better Performance Reviews for Developers with a Skill Matrix

Posted on Feb 16, 2022

Better Performance Reviews for Developers with a Skill Matrix

Good performance reviews should be as fair and objective as possible, communicate expectations clearly, and point out concrete areas of improvement. For this, we use a skill matrix as a systematic assessment tool containing skills tailored to the role of a software developer. This post is a hands-on guide to applying a skill matrix in practice.

Leveling Up in the Management Skill Tree

Posted on Jun 14, 2021

Leveling Up in the Management Skill Tree

Management is not something you “just do intuitively” and it will work out by itself. Instead, management is a craft that you can - and should - learn. It’s about knowing the right tools and approaches and learning skills that help you to lead a productive, happy and motivated team. In this post, we visualize these skills as a “Skill Tree” like in a video game. Have a look. It will be fun and insightful!

Establishing Development Standards with Tech Talks and a Team Guide

Posted on Jan 11, 2021

Establishing Development Standards with Tech Talks and a Team Guide

Especially in bigger teams, establishing and maintaining a common standard for software development is important and challenging. At the same time, it’s crucial to involve the whole team in the creation of the standard to ensure its acceptance and high quality. In this post, I present our approach for this: The regular meeting “Tech Talk” and the team guide.

Team Manager's Toolkit for One-on-Ones

Posted on Dec 7, 2020

Team Manager's Toolkit for One-on-Ones

1-1s are the most important tool for every team manager. If done right, 1-1s can support the report to grow, to become and stay happy, motivated, and productive. However, you need a certain toolkit for 1-1s. This toolkit contains different 1-1 types, records, questions, personal notes, journey maps, and software that can be applied in practice.

More Uninterrupted Time At Work for You and Your Organization

Posted on Jul 30, 2020

More Uninterrupted Time At Work for You and Your Organization

During Corona time and short-time work, I appreciated the uninterrupted time to focus on my work at the home office. I felt productive and got things done. For the post-corona time, we can learn from this and establish practices that allow all coworkers to have longer stretches of uninterrupted time. This post is a collection of individual, organizational and cultural approaches to achieve this.

Package by Feature

Posted on Apr 21, 2020

Package by Feature

A popular approach is packaging by technical concerns. But this approach has some drawbacks. Instead, we can package by feature and create self-contained and independent packages. The result is a codebase that is easier to understand and less error-prone.

The Wall of Coding Wisdoms in Our Office

Posted on Feb 20, 2020

The Wall of Coding Wisdoms in Our Office

There are some principles in software development that I always try to keep in mind. They guide me when I’m in danger of heading in the wrong direction. That’s why I printed those principles and hung them on a wall in our office. In this post, I share this subjective set of quotes with you. There is also a PDF for download available.

Improving Feedback Flows in Organizations with 'Complete Peer Feedback'

Posted on Feb 5, 2020

Improving Feedback Flows in Organizations with 'Complete Peer Feedback'

Traditional hierarchy-based feedback flows are limited as they don’t consider the useful feedback of peers. To improve this, I suggest a “Complete Peer Feedback” session: All team members come together and share their appreciation and growth potential for their peers. In this post, I present our experiences with this approach, why we are enthusiastic about it and how you can adopt it.

Effective Staff Appraisals with Employee Journey Maps

Posted on Nov 19, 2019

Effective Staff Appraisals with Employee Journey Maps

Employee journey maps are a tool for preparing and structuring staff appraisals. They trigger reflection processes and reveal the employee’s motivation. Moreover, they can lead to interesting insights as they compare the different perceptions of the participants. And the best is: You only need two sheets of paper and a pencil.

Don't Put Fat Jars in Docker Images

Posted on Oct 14, 2019

Don't Put Fat Jars in Docker Images

Putting a fat jar into a Docker container is a waste of storage, bandwidth and time. Fortunately, we can leverage Docker’s image layering and registry caching to create incremental builds and very small artifacts. For instance, we could reduce the effective size of new artifacts from 75 MB to only one MB! And the best is that there is a plugin for Maven and Gradle handling everything for us.

Modern Best Practices for Testing in Java

Posted on Sep 9, 2019

Modern Best Practices for Testing in Java

Maintainable and readable test code is crucial to establish a good test coverage which in turn enables implementing new features and performing refactorings without the fear of breaking something. This post contains many best practices that I collected over the years of writing unit tests and integration tests in Java. It involves modern technologies like JUnit5, AssertJ, Testcontainers, and Kotlin. Some recommendations might be obvious to you, but some might conflict with what you’ve read in books about software development and testing.

MongoDB: Useful Development Tools and Snippets

Posted on May 8, 2019

MongoDB: Useful Development Tools and Snippets

I’m using MongoDB in production for many years. In this time, I tried different tools and development approaches; some turned out to be useful for us, others don’t. In this post, I like to share handy CLI tools for working with MongoDB, a Docker-based local development approach and helpful Mongo shell snippets.

Vaadin 10+: SASS Integration and CSS Refresh during Development

Posted on Apr 15, 2019

Vaadin 10+: SASS Integration and CSS Refresh during Development

Since Vaadin 10, SASS is no longer supported out of the box. Fortunately, it’s really easy to integrate SASS in a Vaadin 10+ app and its Maven build. But how can we ensure a fast feedback cycle during the SASS development? Restarting the app is cumbersome. Even a page reload would reset the UI state, which leads to annoying clicking through the app. Luckily, there is an approach that automatically exchanges the changed CSS without any browser refresh or app restart.

Focus on Integration Tests Instead of Mock-Based Tests

Posted on Apr 1, 2019

Focus on Integration Tests Instead of Mock-Based Tests

Testing classes in isolation and with mocks is popular. But those tests have drawbacks like painful refactorings and the untested integration of the real objects. Fortunately, it’s easy to write integration tests that hit all layers. This way, we are finally testing the behavior instead of the implementation. This post covers concrete code snippets, performance tips and technologies like Spring, JUnit5, Testcontainers, MockWebServer, and AssertJ for easily writing integration tests. Let’s discover integration tests as the sweet spot of testing.

Sealed Classes Instead of Exceptions in Kotlin

Posted on Feb 5, 2019

Sealed Classes Instead of Exceptions in Kotlin

Exceptions are a common mean to handle errors. However, they have some drawbacks when it comes to compiler support, safety and traceability. Fortunately, we can leverage Kotlin’s sealed classes to create result objects that solve the mentioned problems. This way, we get great compiler support and the code becomes clean, less error-prone, easy to grasp and predictable.

How to Motivate a Team of Software Developers

Posted on Jan 7, 2019

How to Motivate a Team of Software Developers

Motivation leads to higher performance and satisfaction in the job. But how can we motivate a team of software developers? Sadly, there are common misconceptions about motivation that do more harm than good. Fortunately, science has already discovered the motivators that work: autonomy, mastery, and purpose. This post presents these three pillars of motivation and concrete actions to implement them in software development environments.

Talk 'Best Practices for Unit Testing' at the KotlinConf 2018 in Amsterdam

Posted on Oct 15, 2018

Talk 'Best Practices for Unit Testing' at the KotlinConf 2018 in Amsterdam

On Oct 05, 2018, I held a talk about Best Practices for Unit Testing in Kotlin at the awesome KotlinConf in Amsterdam. I’m still overwhelmed by the packed room taking about 650 people. Thank so much for your interest! I’m also thrilled by the positive feedback on twitter. In this post, you can find the recording and the slides of my talk. The KotlinConf was an awesome conference. It was so great to meet the kind and open Kotlin community in person. Let’s carry on!

Kotlin and MongoDB, a Perfect Match

Posted on Sep 25, 2018

Kotlin and MongoDB, a Perfect Match

MongoDB’s dynamic schema is powerful and challenging at the same time. In Java, a common approach is to use an object-document mapper to make the schema explicit in the application layer. Kotlin takes this approach even further by providing additional safety and conciseness. This post shows how the development with MongoDB can benefit from Kotlin and which patterns turned out to be useful in practice. We’ll also cover best practices for coding and schema design.

Code Review Guidelines for Humans

Posted on Jul 31, 2018

Code Review Guidelines for Humans

Code reviews are powerful means to improve the code quality, establish best practices and to spread knowledge. However, code reviews can come to nothing or harm interpersonal relations when they are done wrong. Hence, it’s important to pay attention to the human aspects of code reviews. Code reviews require a certain mindset and phrasing techniques to be successful. This post provides both the author and the reviewer with a compass for navigating through a constructive, effective and respectful code review.

Install Cairo and CairoSVG on an Alpine Docker Image

Posted on Jun 25, 2018

Install Cairo and CairoSVG on an Alpine Docker Image

I just wanted to convert SVG to PNG files with Python and the library CairoSVG. That was no problem on my Ubuntu system. But running the SVG converter script within a lightweight Alpine Docker container turned out to be problematic. Figuring out which libraries have to be installed up front took me some time. That’s why I like to share my findings here. Hopefully, it’ll save your time.

Convincing Your Management to Introduce Kotlin

Posted on May 29, 2018

Convincing Your Management to Introduce Kotlin

“Kotlin is great and I really want to use it. But how can I convince my management?” This is the most frequent question I get asked after a talk. In this post, I explain how we introduced Kotlin and show arguments, strategies and tricks that can increase your chances of success. I keep the fingers crossed for you!

Self-Contained Systems in Practice with Vaadin and Feeds

Posted on May 16, 2018

Self-Contained Systems in Practice with Vaadin and Feeds

The term Microservices is quite vague as it leaves many questions unanswered. Contrarily, a Self-Contained Systems subsumes concrete recommendations and best practices that can guide you to create an application which is resilient and independent. But how can we implement such a system? At Spreadshirt, we build an application following the recommendations of a Self-Contained System. In this post, I’ll show you which technologies we used and which challenges we faced.

Smooth Local Development with Docker-Compose, Seeding, Stubs, and Faker

Posted on May 1, 2018

Smooth Local Development with Docker-Compose, Seeding, Stubs, and Faker

Imagine you clone a git repo and try to start its application in your IDE. It fails. Why? The database is missing. After installing and starting a database manually you look at an empty application. There is no data in the database. Moreover, the application still doesn’t work as it requires an external service… The process of setting up a local development environment is often a journey of pain with many manual actions and implicit knowledge. How cool would it be, if we just have to call docker-compose up and the whole environment is automatically created locally containing nice dummy data?

Talk 'Kotlin in Practice' at the JAX 2018

Posted on Apr 26, 2018

Talk 'Kotlin in Practice' at the JAX 2018

On April 25, 2018, I held a talk about my favorite topic “Kotlin in Practice” at the JAX Conference in Mainz. I’m still impressed by the huge amount of people that have been interested in my talk (~ 350 folks). There weren’t even enough chairs for everyone. I’m still thrilled! Thank you so much! Also for the great questions during and after the talk.

Why I Moved Back from Gradle to Maven

Posted on Apr 2, 2018

Why I Moved Back from Gradle to Maven

“Maven is old school” they said. “Use Gradle instead. It’s the future of building Java applications” they said. Sounds like something you don’t want to miss. So I tried Gradle in two real-world projects. In this post, I like to tell you about my experiences with Gradle and why I finally migrated back to Maven. It’s a story about enthusiasm and disillusionment.

Talk 'Kotlin in Practice' at the JavaLand 2018

Posted on Mar 15, 2018

Talk 'Kotlin in Practice' at the JavaLand 2018

On March 13, 2018, I held a talk about “Kotlin in Practice” at the JavaLand Conference. The conference was awesome and 1900 people attended. I guess about 300 folks came to my talk although it was so early in the morning. That was awesome! Thank you so much! Special thanks go out to the guys that approached me after the talk and the kind tweets. I’m still euphoric. :-)

Best Practices for Unit Testing in Kotlin

Posted on Feb 12, 2018

Best Practices for Unit Testing in Kotlin

Unit Testing in Kotlin is fun and tricky at the same time. We can benefit a lot from Kotlin’s powerful language features to write readable and concise unit tests. But in order to write idiomatic Kotlin test code in the first place, there is a certain test setup required. This post contains best practices and guidelines to write unit test code in Kotlin that is idiomatic, readable, concise and produces reasonable failure messages.

Web API Pagination with the 'Timestamp_ID' Continuation Token

Posted on Jan 31, 2018

Web API Pagination with the 'Timestamp_ID' Continuation Token

In the last post, I presented the Timestamp_Offset_Checkum continuation token for implementing web API pagination. After using them in practice for a while we discovered some drawbacks and finally came up with a new approach: Timestamp_ID. This approach is fast, scalable, efficient, stateless and easy to implement. Our pursuit of the best pagination strategy has finally come to an end.

Web API Pagination with the 'Timestamp_Offset_Checksum' Continuation Token

Posted on Dec 13, 2017

Web API Pagination with the 'Timestamp_Offset_Checksum' Continuation Token

Implementing proper pagination for Web APIs is not trivial. Offering limit and offset query parameters doesn’t cut it because this approach is slow and error-prone. But also keyset paginations with parameters like modified_since have drawbacks. Fortunately, there is a better approach: Continuation Tokens (aka Cursors). They provide fast, reliable and stateless pagination and make the client implementation very straight-forward. In this post, I propose the Timestamp_Offset_Checksum continuation token, the algorithm and point to a library simplifying its implementation.

How to Increase Your JVM Development Productivity

Posted on Oct 22, 2017

How to Increase Your JVM Development Productivity

During development, it’s important to have fast feedback loops after code changes. Waiting for a cold restart of the application is not satisfying at all and slows down the development process. In this post, I show how we can reduce the turnaround time by using certain JVM arguments and class reloading. Besides those framework-independent means, I’ll give some tips for Vaadin and Spring Boot applications.

Do-It-Yourself ORM as an Alternative to Hibernate

Posted on Oct 5, 2017

Do-It-Yourself ORM as an Alternative to Hibernate

Hibernate is my daily business. And it bugs me. Hibernate adds non-trivial complexity to your application and restricts the flexibility in terms of the query capabilities and the class design. Fortunately, there are many alternatives available. In this post, I like to recap some drawbacks of Hibernate and present an alternative: Do-it-yourself ORM with plain SQL, Spring’s JdbcTemplate and compact mapping code powered by Kotlin.

Talk 'Kotlin in Practice' at the JUG Saxony Day 2017 in Dresden

Posted on Aug 31, 2017

Talk 'Kotlin in Practice' at the JUG Saxony Day 2017 in Dresden

On September 29, 2017, I will give a talk about ‘Kotlin in Practice’ at the JUG Saxony Day in Dresden. In my talk, I will give a short introduction to Kotlin and talk about the experiences we made at Spreadshirt with Kotlin. I’ll show how we can benefit from Kotlin when it comes to popular Java frameworks and if there are pitfalls we have to pay attention to. I’m really looking forward to this conference and I’m happy to be part of it.

Don't use In-Memory Databases (H2, Fongo) for Tests

Posted on Aug 21, 2017

Don't use In-Memory Databases (H2, Fongo) for Tests

At a first glance, in-memory databases (like H2 or Fongo) look like a good idea. You can test your code without having to worry about installing and managing a dedicated database server up front. Just start your tests and the H2 database will be up and running. However, this comfort comes with severe drawbacks. In this post, I explain my reservations and point out Docker as an alternative which can be easily used with TestContainers or within the Gradle/Maven build.

Debugging within a PHP Docker Container using IDEA/PhpStorm and Xdebug

Posted on Aug 15, 2017

Debugging within a PHP Docker Container using IDEA/PhpStorm and Xdebug

Running PHP and an Apache in a Docker container is very handy for local development. But how can we debug the PHP code running in the container? In this post, I show you how to configure Xdebug in a PHP container and configure IntelliJ IDEA Ultimate or PhpStorm for remote debugging.

A Test Mail Server for a PHP Docker Container

Posted on Jul 24, 2017

A Test Mail Server for a PHP Docker Container

For a small PHP project, I created a Docker container with an Apache and PHP in order to ease local development and setup. But that was not enough because my PHP application also sends mails and I wanted to test this feature locally as well. That’s why I needed a local SMTP server for testing and integrate it into my current Docker composition. In this brief post, I show you how I achieved this.

Clean Code with Kotlin

Posted on Jun 25, 2017

Clean Code with Kotlin

With Kotlin we can write code that is easy to understand, short, expressive and safe. Sounds like clean code, doesn’t it? In this post, I go through some recommendations and principles of clean code and consider if Kotlin can help to fulfill this rules or not. Moreover, I show restrictions and points, where we should be careful. At the end, I discuss if Kotlin leads to “a dark or a bright path”.

Talk 'Cleaner Code With Kotlin' at the Clean Code Days 2017 in Munich

Posted on May 3, 2017

Talk 'Cleaner Code With Kotlin' at the Clean Code Days 2017 in Munich

On June 21, 2017, I will give a talk about ‘Cleaner Code with Kotlin’ at the Clean Code Days in Munich. In my talk, I will discuss where Kotlin can help us to write Clean Code and where not. Besides, I will point out how we can get rid of Java’s bloated boilerplate and why we should be careful with some of Kotlin’s features. I’m really looking forward to this conference and I’m happy to be part of it.

Idiomatic Kotlin. Best Practices.

Posted on Mar 28, 2017

Idiomatic Kotlin. Best Practices.

In order to take full advantage of Kotlin, we have to revisit some best practices we got used to in Java. Many of them can be replaced with better alternatives that are provided by Kotlin. Let’s see how we can write idiomatic Kotlin code and do things the Kotlin way.

RESTful API Documentation with Swagger and AsciiDoc

Posted on Feb 19, 2017

RESTful API Documentation with Swagger and AsciiDoc

Writing documentation manually for a RESTful API can be laborious. On the other hand, relying exclusively on the generation of the documentation (e.g. with swagger-ui) is often not sufficient. There are always aspects (like common use cases and workflows) that need to be described manually. Let’s see how we can combine these two approaches with the help of AsciiDoc!

Moving from Wordpress to Hugo

Posted on Jan 29, 2017

Moving from Wordpress to Hugo

Wordpress bugs me. It slows down the authoring process and comes with security issues and maintenance efforts. That’s why I moved to Hugo. Hugo is a static website generator and allows me to write effectively and offline. In this post, I show my reasons for moving from Wordpress to Hugo and point out tips and tricks for the migration.

Kotlin in Practice with Spring Boot and Vaadin

Posted on Dec 21, 2016

Kotlin in Practice with Spring Boot and Vaadin

Coding with Kotlin is great fun. But things are getting really interesting when we try to use Kotlin in conjunction with popular frameworks like Spring Boot and Vaadin. The development with those frameworks can benefit a lot from Kotlin. However, we have to pay attention to some pitfalls.

Kotlin. The Java Ecosystem deserves this Language.

Posted on Nov 20, 2016

Kotlin. The Java Ecosystem deserves this Language.

We at Spreadshirt have started to use the JVM language Kotlin in a couple of services. This ended up in great enthusiasm. Kotlin allows us to significantly reduce the boilerplate and to write more robust and readable code. In fact, I don’t want to write Java anymore. In this post I like to show you why.

Improving your Continuous Integration Setup with Docker and GitLab-CI

Posted on Oct 11, 2016

Improving your Continuous Integration Setup with Docker and GitLab-CI

A typical Jenkins 1.0 setup for Continuous Integration (CI) comes with some drawbacks. The job configuration is stored somewhere else but not in the version control system. This makes it hard to set up a new job correctly or to track configuration changes. Another pain point are the various tools (JDK, Maven, node, gulp etc.) that have to be installed and maintained on all Jenkins nodes. This increases the maintenance effort and can slow down the development. Let’s consider some solutions for these issues.

I like Python! Confessions of a Java Developer

Posted on Oct 2, 2016

I like Python! Confessions of a Java Developer

Developing with Python was a refreshing and pleasant experience. After working with Java for a while, you may forget how verbose and clumsy this language is sometimes. But Python shows how simple and powerful a programming language can be. Let me show you some examples.

How To Use UUIDs With Hibernate And MySQL

Posted on Aug 15, 2016

How To Use UUIDs With Hibernate And MySQL

Auto increment IDs are not working well when it comes to distributed databases. Instead, we should use UUIDs. Let’s consider the pros and cons of UUIDs and how we can use them with Hibernate and MySQL.

Version Numbers for Continuous Delivery with Maven and Docker

Posted on Jul 11, 2016

Version Numbers for Continuous Delivery with Maven and Docker

Dealing with version numbers is an important challenge on the way to Continuous Delivery. The classical versioning approach (“8.2.0”) and release workflow is inappropriate, because it can’t be automated properly. This post shows how we can leverage the Git commit hash to get rid of manual workflows and automate the Continuous Delivery pipeline. At the end, every build will produce an artifact which is potentially shippable. We’ll implement this solution with Maven and Docker.

Don't Share Libraries among Microservices

Posted on Apr 17, 2016

Don't Share Libraries among Microservices

Extracting common code to a library seems to be developer’s best practice. Reuse boosts the development, doesn’t it? However, in a microservice architecture shared libraries tightly couples microservices together. You lose a huge benefit of microservices: independence. In this post I like to point out why shared libraries are not a good idea and present alternatives.

Testing RESTful Services in Java: Best Practices

Posted on Mar 29, 2016

Testing RESTful Services in Java: Best Practices

Testing RESTful Web Services can be cumbersome because you have to deal with low-level concerns which can make your tests verbose, hard to read and to maintain. Fortunately, there are libraries and best practices helping you to keep your integration tests concise, clean, decoupled and maintainable. This post covers those best practices.

'MongoDB for Java Developers' (M101J) I: Experiences and Assessment

Posted on Feb 21, 2016

'MongoDB for Java Developers' (M101J) I: Experiences and Assessment

I attended the course “MongoDB for Java  Developer” (M101J). It was fun and I learned a lot about MongoDB. I like to share my gained knowledge and experience in a two-part series. In this first part I assess the course and state, whether or not the course is worth the time.

Don’t generate (everything). Or: Framework beats Generator

Posted on Jan 7, 2016

Don’t generate (everything). Or: Framework beats Generator

When we apply Model-Driven Software Development (MDSD) we write a generator which produces code out of a model. The promise is that among others, we can reduce the boilerplate code and accelerate the development. However, MDSD is not a cure-all and should be applied with sound judgment. In this post I cover some drawbacks of the generator approach, anti-patterns and present an alternative to generators: frameworks.

Analyzing the Memory Usage of a Vaadin Application

Posted on Dec 17, 2015

Analyzing the Memory Usage of a Vaadin Application

Does your Vaadin application scale well? As Vaadin holds the UI state of every user on the server-side, the used server memory increases with every active user. So can our Vaadin application deal with an increased amount of users in terms of the used memory? We will find out! In this post I present tools and approaches to investigate the memory footprint of our Vaadin application.

Databases as a Challenge for Continuous Delivery

Posted on Nov 28, 2015

Databases as a Challenge for Continuous Delivery

Applying Continuous Delivery means to automate the delivery pipeline and to release frequently.  However, databases are a big challenge, because with every deployment we may need to update and migrate our database before we can deploy our application. This post points out solutions for dealing with databases in a Continuous Delivery scenario.

Tutorial: Continuous Delivery with Docker and Jenkins

Posted on Nov 7, 2015

Tutorial: Continuous Delivery with Docker and Jenkins

Introducing Continuous Delivery means to automate the delivery process and to release our application frequently. This way, we improve the reliability of the release process, reduce the risk and get feedback faster. However, setting up a Continuous Delivery pipeline can be difficult in the beginning. In this step by step tutorial I will show you how to configure a simple Continuous Delivery pipeline using Git, Docker, Maven and Jenkins.

Discussing Docker. Pros and Cons.

Posted on Oct 25, 2015

Discussing Docker. Pros and Cons.

Docker allows us to easily create reproducible environments for our application. We automate the setup of the environment and eliminate manual error-prone tasks. This way we reduce the risks and the reliability of the deployment process. But there are also challenges and domains, where the usage of Docker can be difficult. This post discusses several advantages of Docker and points out some drawbacks.

Building a Dropwizard Microservice with Docker and Maven

Posted on Sep 20, 2015

Building a Dropwizard Microservice with Docker and Maven

Dropwizard produces a fat jar containing every dependency your microservice needs to run. This includes a web server. This way, no web server needs to be installed and configured on the target machine. However, there is some infrastructure left (like the JRE) which still has to be installed before the deployment. That’s where Docker enters the stage. With Docker we can produce an artifact containing really everything we need to run our microservice. In this post, we take a look at how we can integrate Docker into our Maven build, run our tests against the container and push the image to a repository.

Enriching RESTful Services with Swagger

Posted on Jul 28, 2015

Enriching RESTful Services with Swagger

Consuming RESTful services can be a laborious task, because there is much low-level-work to do. Jealously we looked at the WS*/SOAP guys: They can easily generate a nice client API based on the formal interface specification WSDL. This significantly simplifies the service consumption. For a long time the REST world lacks a widespread formal specification and generation tools. But Swagger sets out to change this.

Why Relational Databases are not the Cure-All. Strength and Weaknesses.

Posted on May 14, 2015

Why Relational Databases are not the Cure-All. Strength and Weaknesses.

Relational Databases seem to be the universal hammer in the toolbox of every developer. There is the notion that you can solve every problem with it – you just have to smash hard enough. However, if you use relational databases out of habit, you can easily run into troubles when it comes to schema evolution, scalability, performance or certain domains. This post discusses the strength and weaknesses of relational databases and points out alternatives.

Microservices in a Nutshell. Pros and Cons.

Posted on Apr 11, 2015

Microservices in a Nutshell. Pros and Cons.

Microservices are an interesting approach for achieving modularization of an application. An application is built as a set of services. These services can be independently developed, tested, built, deployed and scaled. However, microservices are not suitable for every use case. This post discusses the benefits and drawbacks of microservices.

Checked Exceptions are Evil

Posted on Mar 28, 2015

Checked Exceptions are Evil

Java has checked exceptions and is out on a limb. Is there a reason, why other languages like C++, Objective-C, C#, Kotlin, Scala don’t support this concept? What is the problem about checked exceptions and what can we do instead? And most important: What do water wings and checked exceptions have in common? This article gives the answer to all of these questions and shows why unchecked exceptions are the better choice.

RESTful API Design. Best Practices in a Nutshell.

Posted on Mar 4, 2015

RESTful API Design. Best Practices in a Nutshell.

Designing HTTP and RESTful APIs can be tricky as there is no official and enforced standard. Basically, there are many ways of implementing an API but some of them have proven in practice and are widley adopted. This post covers best practices for building HTTP and RESTful APIs. We’ll talk about URL structure, HTTP methods, creating and updating resources, designing relationships, payload formats, pagination, versioning and many more.

Evaluating Vaadin: Strengths and Weaknesses

Posted on Feb 16, 2015

Evaluating Vaadin: Strengths and Weaknesses

Vaadin is a mature web framework for developing rich internet applications. Building web-based GUIs with Vaadin feels like developing a desktop application, which is great, comfortable and fast. However, there are situations where Vaadin is not suitable. In this article, we take a look at the architecture of Vaadin and point out its strengths and weaknesses. Let’s start.

How You Should Consider Code Reviews

Posted on Feb 8, 2015

How You Should Consider Code Reviews

From time to time I review code of my colleagues. Especially for a younger developer giving feedback to an older and experienced developer is hard. The colleague has to be open-minded for feedback and criticism. For this, it’s helpful to communicate how code reviews should be considered. I’m convinced that doing so will increase the acceptance of your feedback. But let’s get more concrete.