About

Seasoned back-end engineer and architect, working with Ruby on Rails since 2007. Specialized in building robust, enterprise, monolithic applications.

But I’ve also tasted frontend development and and found a real passion for React.

You’ll always find me writing tests to ensure rock-solid code.

Senior software engineer devising GQL testing strategy

Resilient Graphql Testing Best Practices

Testing GraphQL APIs can be challenging due to their flexible nature. While clients can request data in countless ways, we need a testing strategy that remains robust regardless of how the API is consumed. And one that can scale with the growth of your app. The main pillar are proper, exhaustive type specs so I want to focus on that together with a couple best-practices that you can establish. First, we want our tests to be integration tests that go through all the involved layers (GQL types, database, authorization policies, etc, as much as possible). ...

November 3, 2024 · Robert Pankowecki
Door key in comic book style

Technical Key Pattern

Today I wanted to share with you a trivial pattern, that I call “technical key”. In rails apps, we typically use surrogate keys (autoincremented ids without any business meaning) as a primary key for database tables. However there are cases where our code depends on database data. In my previous article, I shared the case where the code assumed certain team exists and finds it in the database. There are many cases like that in Rails apps, where we give users the power to configure certain aspects of the app via UI and the configuration is stored in the database. ...

October 14, 2024 · Robert Pankowecki
Rails Software engineer thinking about where to put constants

Stop adding constants in the wrong place

Over the years of working with large, mature, monolithical Rails applications, I realized a subtle problem. Many, even experienced teams put their constants in suboptimal namespaces. On one hand such placement is logical, but on the other it leads cluttered code that mixes low-level and high-level concepts. It does not help with keeping our monolith modularized either. Consider a common scenario in a Rails application: the Team class. As your application evolves, you might find yourself adding constants like this: ...

September 28, 2024 · Robert Pankowecki

3 ways to make your ruby object thread-safe

September 18, 2018 · Robert Pankowecki

Doing more on reads vs writes

July 13, 2018 · Robert Pankowecki

Correlation id and causation id in evented systems

May 14, 2018 · Robert Pankowecki

Using singleton objects as default arguments in Ruby

April 23, 2018 · Robert Pankowecki

Ruby Event Store - use without Rails

March 27, 2018 · Robert Pankowecki

Rails Event Store - better APIs coming

March 3, 2018 · Robert Pankowecki

How to use Algolia without coupling to ActiveRecord::Base

February 28, 2018 · Robert Pankowecki

Your search index is a read model (and API) in the Searching bounded context

February 23, 2018 · Robert Pankowecki

How Algolia built their frontend search widgets with React.js by following redux principles

February 21, 2018 · Robert Pankowecki

The anatomy of search pages

February 19, 2018 · Robert Pankowecki

Building custom search is hard and boring

February 14, 2018 · Robert Pankowecki

Testing React.js components with Jest in Rails+Webpacker+Webpack environment

February 11, 2018 · Robert Pankowecki

Using ruby parser and AST tree to find deprecated syntax

December 22, 2017 · Robert Pankowecki

On ActiveRecord callbacks, setters and derived data

December 13, 2017 · Robert Pankowecki

Why Event Sourcing basically requires CQRS and Read Models

November 28, 2017 · Robert Pankowecki

Quarantine your non-deterministic tests with a time limit

November 22, 2017 · Robert Pankowecki

Safely migrating hasandbelongstomany associations to Rails 4

November 17, 2017 · Robert Pankowecki

Interview with Scott Bellware (Eventide co-creator) about micro-services in Ruby, event sourcing, autonomous services, SOA, dumb pipes, EventStore and mis-representation of terms in IT

November 15, 2017 · Robert Pankowecki

Application Services — 10 common doubts answered

October 23, 2017 · Robert Pankowecki

Relative Testing vs Absolute Testing

October 19, 2017 · Robert Pankowecki

Two ways for testing preloading/eager-loading of ActiveRecord associations in Rails

October 16, 2017 · Robert Pankowecki

Using state_machine with event sourced entities

October 15, 2017 · Robert Pankowecki

Could we drop Symbols from Ruby?

October 2, 2017 · Robert Pankowecki

Which ruby version am I using — how to check?

September 29, 2017 · Robert Pankowecki

How to overwrite tojson (asjson) in Active Record models in Rails

September 26, 2017 · Robert Pankowecki

All the ways to generate routing paths in Rails

September 18, 2017 · Robert Pankowecki

Custom application configuration variables in Rails 4 and 5

September 16, 2017 · Robert Pankowecki

How mutation testing causes deeper thinking about your code + constructor for an included module in Ruby

September 13, 2017 · Robert Pankowecki

How to find records where column is not null or empty in Rails 4 or 5

September 4, 2017 · Robert Pankowecki

DATABASE_URL examples for Rails DB connection strings

August 31, 2017 · Robert Pankowecki

Interview with Sergii Makagon about hanami-events, domain-driven design, remote work, blogging and more

August 29, 2017 · Robert Pankowecki

inject vs eachwithobject

August 29, 2017 · Robert Pankowecki

The === (case equality) operator in Ruby

August 23, 2017 · Robert Pankowecki

How to connect to and use ActiveRecord outside of Rails?

August 19, 2017 · Robert Pankowecki

What I learned from reading spreadsheet_architect code

August 18, 2017 · Robert Pankowecki

That one time I used recursion to solve a problem

August 11, 2017 · Robert Pankowecki

My fruitless, previous attempts at not losing history of changes in Rails apps

August 7, 2017 · Robert Pankowecki

My first 10 minutes with Eventide

August 3, 2017 · Robert Pankowecki

How to add a default value to an existing column in a Rails migration

August 3, 2017 · Robert Pankowecki

When DDD clicked for me

August 3, 2017 · Robert Pankowecki

How to quickly add graphs and charts to Rails app

July 20, 2017 · Robert Pankowecki

nil?, empty?, blank? in Ruby on Rails - what's the difference actually?

July 20, 2017 · Robert Pankowecki

Monitoring Sidekiq queues with middlewares

July 19, 2017 · Robert Pankowecki

How to keep yourself motivated for blogging?

July 17, 2017 · Robert Pankowecki

Handle sidekiq processing when one job saturates your workers and the rest queue up

July 14, 2017 · Robert Pankowecki

How to safely store API keys in Rails apps

July 14, 2017 · Robert Pankowecki

The easiest posts to write for a programming blog

July 14, 2017 · Robert Pankowecki

Using influxdb with ruby

July 10, 2017 · Robert Pankowecki

Tracking dead code in Rails apps with metrics

June 23, 2017 · Robert Pankowecki

What I learnt today from reading gems' code

June 23, 2017 · Robert Pankowecki

Acceptance testing using actors/personas

June 7, 2017 · Robert Pankowecki

Handling SVG images with Refile and Imgix

June 1, 2017 · Robert Pankowecki

Conditionality is filtering. Don't filter control flow, filter data.

April 21, 2017 · Robert Pankowecki

Reliable notifications between two apps or microservices

April 9, 2017 · Robert Pankowecki

Why classes eventually reach 50 columns and hundreds of methods

March 31, 2017 · Robert Pankowecki

Prototypes in Ruby and the strange story of dup

March 7, 2017 · Robert Pankowecki

Ruby code I no longer write

February 17, 2017 · Robert Pankowecki

yield default object

February 2, 2017 · Robert Pankowecki

Fluent Interfaces in Ruby ecosystem

January 26, 2017 · Robert Pankowecki

On upcoming immutable string literals in Ruby

January 2, 2017 · Robert Pankowecki

Why would you even want to listen about DDD?

December 26, 2016 · Robert Pankowecki

Safer Rails database migrations with Soundcloud's Large Hadron Migrator

December 23, 2016 · Robert Pankowecki

Patterns for dealing with uncertainty

December 4, 2016 · Robert Pankowecki

One request can be multiple commands

November 16, 2016 · Robert Pankowecki

Hourly Billing is Nuts

October 20, 2016 · Robert Pankowecki

The freelancer in you that wants to be FREE

October 18, 2016 · Robert Pankowecki

To blog or to write code?

October 17, 2016 · Robert Pankowecki

Minimal decoupled subsystems in your rails app

September 30, 2016 · Robert Pankowecki

respond_to |format| is useful even without multiple formats

July 21, 2016 · Robert Pankowecki

Implementing & Testing SOAP API clients in Ruby

July 18, 2016 · Robert Pankowecki

Always present association

July 12, 2016 · Robert Pankowecki

Domain Events Schema Definitions

July 10, 2016 · Robert Pankowecki

Cover all test cases with #permutation

June 25, 2016 · Robert Pankowecki

Domain Events over Active Record Callbacks

May 13, 2016 · Robert Pankowecki

How I hunted the most odd ruby bug

April 18, 2016 · Robert Pankowecki

Custom type-casting with ActiveRecord, Virtus and dry-types

March 20, 2016 · Robert Pankowecki

Using anonymous modules and prepend to work with generated code

February 29, 2016 · Robert Pankowecki

Private classes in Ruby

February 22, 2016 · Robert Pankowecki

Drop this before validation and just use a setter method

January 29, 2016 · Robert Pankowecki

In-Memory Fake Adapters

December 4, 2015 · Robert Pankowecki

Monitoring services and adapters in your Rails app with Honeybadger, NewRelic and #prepend

November 28, 2015 · Robert Pankowecki

Rolling back complex apps

October 24, 2015 · Robert Pankowecki

Run it in a background job, after a commit, from a service object

October 24, 2015 · Robert Pankowecki

Advantages of working on a legacy application

October 20, 2015 · Robert Pankowecki

Sanitizing html input: youtube iframes, css inline styles and customization

September 20, 2015 · Robert Pankowecki

Testing race conditions in your Rails app

September 4, 2015 · Robert Pankowecki

Null Object pattern in practice

August 16, 2015 · Robert Pankowecki

On my radar: RethinkDB + React.js + Rails

April 30, 2015 · Robert Pankowecki

How to get anything done? - 4 tips

March 1, 2015 · Robert Pankowecki

My favorite ActiveSupport features

February 25, 2015 · Robert Pankowecki

Adding videos embedded in a page to a sitemap

February 21, 2015 · Robert Pankowecki

Upgrade capybara-webkit to 1.4 and save your time

February 18, 2015 · Robert Pankowecki

Ruby Exceptions Equality

January 11, 2015 · Robert Pankowecki

It's easy to miss a higher level concept in an app

January 4, 2015 · Robert Pankowecki

The categories of validations

January 3, 2015 · Robert Pankowecki

rails-refactoring.com podcast #1

November 15, 2014 · Robert Pankowecki

Don't forget about eager_load when extending autoload paths

November 9, 2014 · Robert Pankowecki

You can move React.js root component around

October 23, 2014 · Robert Pankowecki

Instantiating Service Objects

October 12, 2014 · Robert Pankowecki

React.js and Dynamic Children - Why the Keys are Important

October 3, 2014 · Robert Pankowecki

Behind the scenes

October 3, 2014 · Robert Pankowecki

React.js and Google Charts

September 29, 2014 · Robert Pankowecki

Adapters 101

August 24, 2014 · Robert Pankowecki

Burnout - do you need to change your job?

August 17, 2014 · Robert Pankowecki

Truncating UTF8 Input For Apple Push Notifications (APNS) in Ruby

August 13, 2014 · Robert Pankowecki

Using ruby Range with custom classes

August 3, 2014 · Robert Pankowecki

4 ways to early return from a rails controller

July 15, 2014 · Robert Pankowecki

RubyMine basic navigation features (that make you move around code fast)

July 9, 2014 · Robert Pankowecki

Service objects as a way of testing Rails apps (without factory_girl)

July 1, 2014 · Robert Pankowecki

Effective async communication

June 13, 2014 · Robert Pankowecki

Would you love to work remotely (and asynchronously)?

June 9, 2014 · Robert Pankowecki

Mastering Rails Validations: Objectify

May 8, 2014 · Robert Pankowecki

Mastering Rails Validations: Contexts

April 30, 2014 · Robert Pankowecki

The biggest obstacle to start with Continuous Deployment - database migrations

April 13, 2014 · Robert Pankowecki

Zero uptime deploy

April 1, 2014 · Robert Pankowecki

Don't call controller from background job, please. Do it differently!

March 20, 2014 · Robert Pankowecki

2 ways to deal with big and complicated features

February 28, 2014 · Robert Pankowecki

Pretty, short urls for every route in your Rails app

January 18, 2014 · Robert Pankowecki

Stop including Enumerable, return Enumerator instead

January 8, 2014 · Robert Pankowecki

3 ways to do eager loading (preloading) in Rails 3, 4, 5 and 6

December 8, 2013 · Robert Pankowecki

Chronos vs Kairos: Find out how you think about time when working on a project

November 21, 2013 · Robert Pankowecki

Developers oriented project management: What our new book is all about?

October 14, 2013 · Robert Pankowecki

Developers oriented project management: Take the first task

October 9, 2013 · Robert Pankowecki

Developers oriented project management: Leave tasks unassigned

October 4, 2013 · Robert Pankowecki

Developers oriented project management: Story of size 1

September 23, 2013 · Robert Pankowecki

Developers oriented project management

September 16, 2013 · Robert Pankowecki

Single Table Inheritance - Problems and solutions

July 27, 2013 · Robert Pankowecki

Are we abusing at_exit?

June 22, 2013 · Robert Pankowecki

Is it cute or ugly?

May 9, 2013 · Robert Pankowecki

Web is no longer request-reply

February 15, 2013 · Robert Pankowecki

Rails API - my simple approach

January 10, 2013 · Robert Pankowecki

Blogging for developers

January 2, 2013 · Robert Pankowecki

Not Rails

November 29, 2012 · Robert Pankowecki

One app, one user, one ruby

November 21, 2012 · Robert Pankowecki

Sending async data from Rails into the world (II)

November 11, 2012 · Robert Pankowecki

Sending async data from Rails into the world

October 17, 2012 · Robert Pankowecki

Filepicker and Aviary - Image uploading on steroids

September 21, 2012 · Robert Pankowecki