Friday, April 03, 2020

Friday Links

Goto: A Dozen New Masterclasses Are Now LIVE!

Changing the Approach to Debugging in Ruby with TracePoint

AppSignal Now Supports Node.js: Roadmap for the Coming Weeks

Code Search for Google open source projects

Why You Should Ignore All That Coronavirus-Inspired Productivity Pressure

See Everyone with the Google Meet Grid View Extension

Optimizing Ruby Lazy Initialization in TruffleRuby with Deoptimization

Eclipse Theia Offers a ‘True Open Source Alternative to Visual Studio Code’

Pay Analysis Update: Examining Equal Pay at Buffer in 2020


RailsConf 2020.2 Couch Edition

xkcd: Pathogen Resistance

Tech Debt and the Pragmatic Middle Ground

Fedora's Git forge decision


Deploys at Slack

CentOS: Git Forge decision


Sorbet: Typed Ruby with Dmitry Petrashko

What Does COVID-19 Mean for Cities (and Marriages)?

Remote Team Management with Ryan Chartrand

Special: First, be human – Thoughts on the crisis from Reid Hoffman

Universal Basic Income: Alaska Style

Cloud Kitchen Platform with Ashley Colpaart

Friday, March 27, 2020

Letting your CEO deploy to production

"One click" deploy (*)
Recently our CEO Raj Kumar spent a week in our Barcelona office where the majority of our engineering department is located.

I was working on some ideas for him to meet the team and get some insights into our daily work. While most of the company is aware of UI/UX and front-end changes we are doing to our site, some of the back-end and infrastructure work can seem like black magic. I think it is important to take every opportunity to bring this output closer to the rest of the company and especially the leadership.

By chance I watched the very good presentation “Getting Real about Managing up” by Kellan Elliott-McCrea, which contains as one example the idea of letting your CEO deploy to production.

One of the goals of our engineering team is continuous deployment. I set this out when I joined Devex to give us a far goal to aim for. I was inspired by Etsy’s Code as Craft blog and the book “Web Operations”. For me the important part was not continuous deployment itself, but all the changes in engineering culture required to achieve it. You need a good technical base from unit to integration tests, infrastructure as a code, continuous integration and a infrastructure team that is working side by side with the developers.

At the beginning this seemed to be an impossible task, QA and deployment were completely manual, there was no unit testing, no code reviews, a clear separation between developers and operations. The code itself was a mess too, with lots of moving parts, outdated libraries and no easy way to introduce testing.

But we slowly made progress, simplified the system and slowly worked our way up from deploying once in a blue moon, to once, then twice a week.

Currently we are at one deploy a day, with some manual involvement of QA. The deployment gets kicked off by a chatbot and is well documented in our engineering handbook.

The short version looks like this:
  1. Check QA status
  2. Tell the chatbot to deploy 
  3. Check the metrics
Everybody in the engineering team is already in the rotation of deploys and it is easy enough for everyone in the company to do it.

Our CEO Raj Kumar was happy to do it and sat together with our two infrastructure engineers to help him along. Because there are some permission requirements it was also easier to do it from the workstation of our lead engineer.

After some hiccups in QA the progress went smoothly and we had a new release in production.

I guess in the end he was surprised how boring it turned out to be. Which a deploy should be.

btw: we are hiring: Check out our current open positions

*) the hat is part of the deploy protocol and not a fashion statement

Friday Links

My Pandemic Zoom Setup

Two Years With Rust

Helping FOSS conferences in the face of a pandemic

O'Reilly shutting down its conference group

How to Run a Successful Online Conference

Video conferencing with Jitsi

Remote Working: The home office desks of Basecamp

The Housekeeping of the Intangible

Podcasts / YouTube

Setting Objectives and Key Results in your team | Whitney O'Banner | #LeadDevLondon

Goal-Setting Workshops for Managers - Melinda Seckington | #LeadDevLondon 2018

Beauty In Code

How to Implement Good Software Development Processes with Eric Elliott

The Side Effects of Social Distancing

Emergency episode: Rob & Howie on the menace of COVID-19, and what both governments & individuals might do to help

Social distancing: learning to cope with a new normal

Engineer to manager and back again

Friday, March 20, 2020

Friday Links

How to survive isolation with your roommates, your partner, your kids – and yourself

The Simplicity of Benjamin Franklin’s Daily Schedule

A Few Small Things You Can Do as a Leader

Asynchronous Communication and Why It Matters For Remote Work

Hotspotting developer productivity.

List of Free Software and Services During Coronavirus Outbreak

What the heck is Backstage anyway?

Facade Pattern in Rails for Performance and Maintainability

Atlassian finally unleashes free Jira tier – nearly six months late yet just in time for coronavirus crunch

Tech Ecosystem Barcelona & Madrid

Google Just Confirmed A Powerful Chrome COVID-19 Security Move That Will Impact All Users

The reckless, infinite scope of web browsers

How to do effective video calls

CERT partners with GitHub Security Lab for automated remediation

Rails and have been released!


How coronavirus closed down Italy

Friday, March 13, 2020

Friday Links


retronym - Word of the Day : March 12, 2020

TBM 11/53: The Know-It-All CEO

Why cycling in Palestine is an intensely political act

How to Break Apart a Rails Monolith

One-track minds: Using AI for music source separation

Atlassian brings rules-based automation to Jira Cloud

Powerful, no-code automation now available to all Jira Cloud customers

DBT: Your entire analytics engineering workflow

Amazon teases Bottlerocket, its take on Linux specifically for running containers

Ready for changes with Hexagonal Architecture

It’s now on us to respond': A new Atlassian study finds many employees would quit if their employer didn't align with their values

CIA Dirty Laundry Aired

How does Monzo keep 1,600 microservices spinning? Go, clean code, and a strong team

How Dailymotion hacked its feature team project model to shorten time to market

Grab a towel and pour yourself a Pan Galactic Gargle Blaster because The Hitchhiker's Guide to the Galaxy is 42

10 Google Ranking Factors You Shouldn’t Ignore

The Elephant in the Architecture

this artwork does not exist

Building a Rails App With Multiple Subdomains

Graylog at Scale


How to respond to COVID-19

Lead Your Business Through the Coronavirus Crisis

Coronavirus: The Black Swan of 2020

Working From Home

Work in the Time of Corona

20 Ways COVID Made Me a Better Boss

5 tips for ramping up on remote work in a hurry

Slack on Slack: Adapting the way we work when offices need to close

Virtual Conferences

Amid Coronavirus Fears, Startups Rethink the Virtual Conference

Run The World



#158 The Case of the Missing Hit

Work, Rest, and What You Will

DBT: Data Build Tool with Tristan Handy

Enter the Matrix

Friday, March 06, 2020

Friday Links

The Ultimate 1-on-1 Meeting Questions Template
One-on-one questions
How a 2 person startup already uses 28 other tools
Project LightSpeed: Rewriting the Messenger codebase for a faster, smaller, and simpler messaging app
Wi-Fi Chip Vulnerability
From one to two: how to start a successful distributed engineering office.
World Bank staff call for canceling Spring Meetings — permanently
How did software get so reliable without proof?
The WHO sent 25 international experts to China and here are their main findings after 9 days
Production Oriented Development


Delete Your Account
Why Work Doesn't Have to Be Crazy

Friday, February 28, 2020

Friday Links

Cloud Computing Is Not the Energy Hog That Had Been Feared

Preparing for Coronavirus to Strike the U.S.

Google programming language scorecard: How C, C++, Dart, Rust, Go rate for Fuchsia

Introducing Hanami::API

Love it or hate it, Marmite is having a massive foodie moment

What is a Tech Lead? The 4 worst things about this promotion

Some MVP and Experiment Tips

Second Sock Syndrome – What It Is and How to Fight It

Slack etiquette at Zapier

Google releases Lighthouse web dev extension for Firefox

Who cares about Emacs?

The Causal Analysis of Cannibalization in Online Products

Coronavirus COVID-19 Global Cases by Johns Hopkins CSSE


A Mathematician's Guide to Beauty

The One About Time Management

Friday, February 21, 2020

Friday Links

Debian discusses how to handle 2038

The Pyramid of Unit Testing Benefits

Internet of Things Candle

A Blueprint for Internal Open Source

Open sourcing DataHub: LinkedIn’s metadata search and discovery platform

Titan Security Keys - now available in Austria, Canada, France, Germany, Italy, Japan, Spain, Switzerland, and the UK

When To Be Concerned About Concerns

About Rails concerns

Tech Debt Developer Survey Results 2020 - Impact on Retention

Survey results: What makes a company People-first?

8 Best Professional Development Goals for Managers


The One About Meetings (Pt. 1)

The One About 1:1s

The Pragmatic Programmers

Back to Agile's basics (Uncle Bob)

Intro to Rust programming

Good tech debt

The Data Exchange with Ben Lorica

Productionising real-world ML data pipelines

Monday, February 17, 2020

Using multiple git configurations

It is fairly common that you might be contributing to multiple git repositories which make different git configuration necessary.

Mine and probably the most common case is that I am using different contributor email addresses for my private and work git repositories. You might also want want to have separate global git ignores or other options that differ in multiple repositories.

The way I do it is having one ~/.gitconfig which looks like this:

  name = Christof Damian 
  email = 

  excludesfile = ~/.gitignore_global 

[includeIf "gitdir:~/devex/"] 
  path = ~/.gitconfig_devex 

This defines the defaults for my name, email and a global gitignore. It also tell git to look at another git config for all repositories that are below the ~/devex/ folder. This file is very short for me, as it just changes the email address (~/.gitconfig_devex):

  email = 

The ~/.gitignore_global is just a normal gitignore file, which excludes all the files the editors or tools I use create. It could for example look like this:

# whatever files your local editor/tools config generates

You could use for example to generate this

Friday, February 14, 2020

Friday Links

Supercharge your command line experience: GitHub CLI is now in beta
3 (+1) Questions for impactful Sprint Goals!
Getting Started With System Tests in Rails With Minitest
I love Free Software Day 2020
Unlearning toxic behaviors in a code review culture
Agile as Trauma
Rotary Cellphone
Interview with Yukihiro Matsumoto: Ruby is Designed for Humans, not Machines
How to Use the Distance Matrix API
Mythical man month : 10 lines per developer day
How Big Technical Changes Happen at Slack

Podcasts / Videos

Getting Real about Managing up
Presto with Justin Borgman

Friday, February 07, 2020

Friday Links

3 research-backed principles that help you scale your engineering org

Paris mayor unveils '15-minute city' plan in re-election campaign

UN poverty expert's visit shines light on struggles of Spain’s poor

Street View’s 15 favorite Street Views

A new hash algorithm for Git

Istio as an Example of When Not to Do Microservices

Monoliths are the future

Browsers, web sites, and user tracking

Austerity, gentrification and big tunes: why illegal raves are flourishing

What we do and don’t know about the 2019-nCoV coronavirus

NYC Parks Are Using a Designer’s ‘Tree Font’ to Plant Secret Messages with Real Trees

AppSignal Ruby Gem 2.10: Better Diagnose (And More)

This Week in Programming: Forget Microservices, Monoliths Are the Way Forward

Retrium: Public Team Rooms


The journey to fast production asset builds with Webpack

Facebook’s Platform Opportunity

Letters To A New Developer: Develop empathy

Things I Believe About Software Engineering

Google Maps Hacks

NSA Security Awareness Posters

Integrated systems for integrated programmers

The dark side of expertise

Podcasts / YouTube

Leadership is Language

John Deere: Farm Software with Ryan Bergman

Ryan Bergman - Walking Into Mordor: The History and Future of DevOps

Friday, January 31, 2020

Friday Links

Zappos has quietly backed away from holacracy


Use Emacs to get social and track your todo list

How we retired Python 2 and improved developer happiness 

Why the Guardian will no longer accept fossil fuel advertising

Ring Doorbell App Packed with Third-Party Trackers

Terraform at Flexport

New Enterprise IT Controls for Data Studio

Google Receives Geofence Warrants

How to Perform Concurrent HTTP Requests in Ruby and Rails

Introducing Buffer’s Family Support Fund

Confessions of a Recovering Proprietary Programmer, Part XVII

Do more with Data Studio Community Visualizations

Preserving open source software for future generations


#74 Jeff Hunter: Embracing Confusion

S2 Ep.2: How do you balance investment in tech debt vs customer value?

Bicycle - Pessimists Archive Podcast

The Walkman - Pessimists Archive Podcast

#68 - Will MacAskill on the paralysis argument, whether we're at the hinge of history, & his new priorities

Tuesday, January 28, 2020

Saying goodbye to some legacy code

When I joined Devex a bit more than six years ago most of the code base was in one large monolith. This monolith was based on Ruby On Rails and was responsible for delivering

This part was called "neo". I guess because it was a rewrite of a previous Java
version. I am not sure if it was a reference to Matrix or the Greek meaning. 

There were already some initiatives in place rewriting parts of it in different services, but the monolith was always looming in the background.
Any changes to it required increasing amount of work. It was like someone tried to put the definition of technical code into code.

I generally against rewrites, they tend to last for years and you loose a lot of knowledge that is baked into the original. I also have nothing against Monoliths. So I tried refreshing the code base by upgrading the dependencies, getting the few tests to run and making local development easier with Vagrant. I realized fairly early that this was not going to work.

So we went with a gradual rewrite. Whenever we worked on part of the site we migrated it to our new architecture (Also a Monolith or at least a Duolith).

Now six years later we finally switched off the remainders of "neo" and I thought we should celebrate in style.

Legacy code is after all something that successfully supported you for a long time and enabled you to start with something fresh. Devex wouldn't be were we are without "neo".
Cremation - ignore the dog

So we staged a proper funeral, where everybody who wanted said some words. We also collected printouts of the most annoying bits of code, some very dated looking screenshots and some email and chat conversations from the very beginning.

This was my eulogy:
Today we say goodbye to maybe the best known system at Devex.+
Neo - from Greek meaning young or new, which he was neither.
Or from the Matrix character, handsome, powerful and agile, which he was also not.

We all have memories of him that will stay with us for a long time.
We laughed about his quirks.
He had amazing depths, which brought us sometimes close to tears trying to understand him.

His heritage will live forever in our data structures.
Finally we burned the printouts, collected them in an urn (aka hummus glass) and cheered with Cava while chatting about the "good" old days.

I hope you can give your legacy code also the sendoff they deserve.

The End

Update (March 2020)

We got a present from our CEO while he was visiting the Barcelona Devex office this week....

RIP Neo Mug

Friday, January 24, 2020

Friday Links

How we built the good first issues feature

Which of these 2020 Democrats agrees with you most?

KubeInvaders - Gamified Chaos Engineering Tool for Kubernetes

Linkedin: Global Talent Trends

Uber Has Been Quietly Assembling One of the Most Impressive Open Source Deep Learning Stacks in the Market

Critical Windows Vulnerability Discovered by NSA

How to build your company's engineering brand. 

Vancouver, Tall Buildings and Brent Toderian - The Life-Sized City Urbanism Podcast

The People's Pyramid

Webflow Engineering with Bryant Chou