diff --git a/public/index.html b/public/index.html index 3b400b9..7021775 100644 --- a/public/index.html +++ b/public/index.html @@ -1,139 +1,215 @@ - + - Pablo here - - - + Pablo here + + + -
-

- Hi, Pablo here -

-

- Welcome to my website. Here I discuss thoughts and ideas. This is mostly professional. -

-
-

What you'll find here:

- -
-
-

About me

-

A few facts you might care about:

- -
-
-
-

Contact

-

You can contact me on:

- -

If you are looking for my CV, no need to reach out, you can fetch it - yourself here.

-

Good reason to reach out include:

- -

Bad reasons to reach out include:

- -
-
-
-

My projects

-

Some of the projects I've shared publicly:

- -

There are also some other projects that I generally keep private but might disclose under the right - circumstances. Some notable hints:

- -
-
-
-

Writings

-

Sometimes I like to jot down ideas and drop them here.

- -
-
- +
+

Hi, Pablo here

+

+ Welcome to my website. Here I discuss thoughts and ideas. This is mostly + professional. +

+
+

What you'll find here:

+ +
+
+

About me

+

A few facts you might care about:

+ +
+
+
+

Contact

+

You can contact me on:

+ +

+ If you are looking for my CV, no need to reach out, + you can fetch it yourself here. +

+

Good reasons to reach out include:

+ +

Bad reasons to reach out include:

+ +
+
+
+

My projects

+

Some of the projects I've shared publicly:

+ +

+ There are also some other projects that I generally keep private but + might disclose under the right circumstances. Some notable hints: +

+ +
+
+
+

Writings

+

Sometimes I like to jot down ideas and drop them here.

+ +
+
+ \ No newline at end of file diff --git a/public/keybase.txt b/public/keybase.txt new file mode 100644 index 0000000..43ffead --- /dev/null +++ b/public/keybase.txt @@ -0,0 +1,56 @@ +================================================================== +https://keybase.io/pablomartincalvo +-------------------------------------------------------------------- + +I hereby claim: + + * I am an admin of https://pablohere.contrapeso.xyz + * I am pablomartincalvo (https://keybase.io/pablomartincalvo) on keybase. + * I have a public key ASDgHxztDlU_R4hjxbkO21-rS4Iv1gABa3BPb_Aff7aNAgo + +To do so, I am signing this object: + +{ + "body": { + "key": { + "eldest_kid": "0120d9bde13d9012e681cef2edd668d70426f1f6ef69ce7dfae20b404096eca5b06f0a", + "host": "keybase.io", + "kid": "0120e01f1ced0e553f478863c5b90edb5fab4b822fd600016b704f6ff01f7fb68d020a", + "uid": "8e71277fbc0fb1fea28d60308f495d19", + "username": "pablomartincalvo" + }, + "merkle_root": { + "ctime": 1755635067, + "hash": "4f91af0b9c674e0f1d74a7cfad7abd15a7065cded92b96ac8a6abeb5c8553318599aa1bf7b065a3312e303506256b729b8b60b3a5dd06b68694423f4341a6a14", + "hash_meta": "6472dbf2ed33341fb30b6a0c5c5c7fb39c219dd0ffd03c6e08b68c788e0de60a", + "seqno": 27031070 + }, + "service": { + "entropy": "LEFJJ4FMmlJQWPPFEO4xHE5y", + "hostname": "pablohere.contrapeso.xyz", + "protocol": "https:" + }, + "type": "web_service_binding", + "version": 2 + }, + "client": { + "name": "keybase.io go client", + "version": "6.5.1" + }, + "ctime": 1755635082, + "expire_in": 504576000, + "prev": "37f12270050ab037897ccf6ef9451b1911cb505eca7c3842993b0b8925bc79b8", + "seqno": 31, + "tag": "signature" +} + +which yields the signature: + +hKRib2R5hqhkZXRhY2hlZMOpaGFzaF90eXBlCqNrZXnEIwEg4B8c7Q5VP0eIY8W5Dttfq0uCL9YAAWtwT2/wH3+2jQIKp3BheWxvYWTESpcCH8QgN/EicAUKsDeJfM9u+UUbGRHLUF7KfDhCmTsLiSW8ebjEIAnIWTmufZ017e9WLdI1LhKBPaZ3HzmTrgyASDvY3PwoAgHCo3NpZ8RA9a3xgkSTU6Ht7M7DCsy4ClMmoWFtDEqzX9/dqskeoH2DrJUZYVymBQE1nyB0p1GuXiZA1cP5WY5SDURWZ5bBC6hzaWdfdHlwZSCkaGFzaIKkdHlwZQildmFsdWXEIEJZ4g4HC5qXcqbFf6sJ8XuZyMtoppazFqr1zPu0LH5co3RhZ80CAqd2ZXJzaW9uAQ== + +And finally, I am proving ownership of this host by posting or +appending to this document. + +View my publicly-auditable identity here: https://keybase.io/pablomartincalvo + +================================================================== \ No newline at end of file diff --git a/public/my_cv.pdf b/public/my_cv.pdf index 27038a6..f3422a0 100644 Binary files a/public/my_cv.pdf and b/public/my_cv.pdf differ diff --git a/public/static/computers.png b/public/static/computers.png new file mode 100644 index 0000000..955951a Binary files /dev/null and b/public/static/computers.png differ diff --git a/public/static/data-alley-oop.jpeg b/public/static/data-alley-oop.jpeg new file mode 100644 index 0000000..3eb5709 Binary files /dev/null and b/public/static/data-alley-oop.jpeg differ diff --git a/public/static/homophobic-socialist-drug-dealer.png b/public/static/homophobic-socialist-drug-dealer.png new file mode 100644 index 0000000..f013ebc Binary files /dev/null and b/public/static/homophobic-socialist-drug-dealer.png differ diff --git a/public/static/hospitals-inside.png b/public/static/hospitals-inside.png new file mode 100644 index 0000000..515541e Binary files /dev/null and b/public/static/hospitals-inside.png differ diff --git a/public/static/hospitals-outside.png b/public/static/hospitals-outside.png new file mode 100644 index 0000000..33c1cd0 Binary files /dev/null and b/public/static/hospitals-outside.png differ diff --git a/public/static/plumbings.png b/public/static/plumbings.png new file mode 100644 index 0000000..68d61d0 Binary files /dev/null and b/public/static/plumbings.png differ diff --git a/public/static/stations.png b/public/static/stations.png new file mode 100644 index 0000000..54ad4ef Binary files /dev/null and b/public/static/stations.png differ diff --git a/public/static/streetlamps.png b/public/static/streetlamps.png new file mode 100644 index 0000000..84a42d0 Binary files /dev/null and b/public/static/streetlamps.png differ diff --git a/public/styles.css b/public/styles.css index 1b99426..690b8b1 100644 --- a/public/styles.css +++ b/public/styles.css @@ -21,7 +21,8 @@ img { display: block; } -figcaption a { +figcaption { font-style: italic; font-size: small; + text-align: center; } \ No newline at end of file diff --git a/public/writings/a-note-for-the-future-the-tax-bleeding-in-2025.html b/public/writings/a-note-for-the-future-the-tax-bleeding-in-2025.html new file mode 100644 index 0000000..abefd1d --- /dev/null +++ b/public/writings/a-note-for-the-future-the-tax-bleeding-in-2025.html @@ -0,0 +1,188 @@ + + + + Pablo here + + + + + + +
+

Hi, Pablo here

+

back to home

+
+
+

A note for the future: the tax bleeding in 2025

+

+ I hate taxes deeply. I fell through the rabbit hole of libertarian and + anarcocapitalist ideas some years ago, and taxes have been repulsive + to me ever since. I go to great lengths to not pay them, and feel + deeply hurt everytime they sting my wallet against my will. +

+

+ I know life goes by fast, and what today is vivid in your memory fades + away bit by bit until it's gone. I'm truly hoping that, some day in + the future, the world will have changed to the better and people won't + be paying as much tax as we're doing today in the West. Since in that + bright, utopical future I'm dreaming of I might have forgotten about + how bad things were on this matter in 2025, I've decided to make a + little entry here making an estimate on how many taxes I'm + theoretically bleeding on a yearly basis right now. So that we can + someday look back in time and wonder: "how the fuck did we tolerate + that pillaging". +

+

Inventory

+

+ Before going hard into the number crunching let's list all the tax + items I'm aware of being subject to: +

+ +

+ There may be some other small, less frequent taxes that I'm not + considering. These are the ones that will hit most people in my + country. +

+

The numbers

+

+ Okay, let's go compute the hideous bill. I'll make a hypothetical + profile that's roughly close to mine, with a few assumptions along the + way. +

+ +

With those clear, let's see the actual figures:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tax€/year
Income Tax (IRPF)22,401 €
Social Security (worker + employer) + 25,375 € + (worker 4,445 € + employer 20,930 €) +
VAT (blended basket)5,250 €
Real Estate Tax (IBI)1,000 €
Vehicle Tax (1.5 vehicles)225 €
Wealth Transfer (10% home, spread 50y)1,000 €
Inheritance (7% of 250k, spread 50y)350 €
Total55,602 €
+

+ So there you go. A peaceful existence as a tech professional living a + normal life leads to bleeding at least 55K€ per year, all while + getting an 85K€ salary. The tax rate sits at a wonderful 64%. How far + away is this from hardcore USSR-grade communism? +

+

+ And this is generous, since I didn't model (1) what gets stolen + through inflation diluting savings and (2) any capital gains that this + profile might end up paying for whatever investments he is doing with + his savings. +

+

+ Then you'll see mainstream media puppets discussing why young people + don't have children. As if it was some kind of mistery. They're being + robbed their children's bread left and right, while getting hypnotized + into believing that protecting themselves against this outrageous + robbery is somehow morally despicable. +

+

Motherfuckers.

+
+

back to home

+
+
+ + diff --git a/public/writings/dont-hide-it-make-it-beautiful.html b/public/writings/dont-hide-it-make-it-beautiful.html new file mode 100644 index 0000000..fea806a --- /dev/null +++ b/public/writings/dont-hide-it-make-it-beautiful.html @@ -0,0 +1,125 @@ + + + + + Pablo here + + + + + + + +
+

+ Hi, Pablo here +

+

back to home

+
+
+

Don't hide it, make it beautiful

+

I'm currently living in a flat, and my internet connection physically comes in through my living room. That's where + my home router is placed. However, my main workspace is not in my living room but in my working room, + which is a few meters away. I would love to have a wired internet connection for my laptop, but unfortunately, with + the router being so far away, setting it up would require running a lot of cable through the walls and + ceilings. I could either leave the cable visible or go through some serious construction work to poke holes through walls and fake ceilings and + tunnel the cable through there. The latter is out of the table, since I don't even know where would I start.

+ +

The first option being the only available one, there is one fundamental and unavoidable reason I don't do this: aesthetics. My partner is very conscious about + keeping our home visually pleasing. I care too, though she probably values aesthetics even more than I + do. She likely doesn't find a wired internet connection to be as essential as I do. So, for now, I have to rely on + wifi to connect from my workspace to the home router.

+ +

When I was on holiday in Thailand a few years ago, I noticed that Thai homes are far more practical than + European ones in such matters. In Thailand, plumbing, electrical systems, and other maintenance-requiring + installations are typically very visible, just out there on the wall. They don't hide these things behind + fake walls or ceilings. I believe they do this because they highly value the ability to access and work + on their home's systems themselves. Many Thai people build and maintain their own homes, so they leave + everything exposed for easy access.

+ +

I sometimes envy this approach. Which is funny because I don't think they do it for pleasure but out of necessity. + Still, when I saw a Thai homeowner fixing their plumbing outside their house, I thought to myself: "Damn, you're so + in control of your home". If something bad happens—like a fallen tree damaging the plumbing—they can fix + it themselves. Meanwhile, if that happened to me, I wouldn't even know where to start. I don't even know + where my plumbing is because it's all hidden behind walls.

+ +

That makes me wonder: Is there a way to make these essential systems both accessible and aesthetically + pleasing? Could we have the convenience of exposed infrastructure without it looking ugly? I believe we + can.

+ +

I find the problem is that we have decided certain things—plumbing, electrical wiring, visible + infrastructure—are inherently ugly. But they don't have to be. Some household items, like lamps, must be + visible by their very nature. Since they can't be hidden, we put effort into making them look good. We choose stylish designs + that complement our home's aesthetics. Why can't we do the same for cables and pipes?

+ +

Imagine if all the wiring in your home was encased in beautifully braided, colorful ropes, arranged in + elegant geometric patterns. The connections, junction boxes, and fittings could be crafted from + high-quality materials like metal and wood with artistic designs. Wouldn't that be nice?

+ +

Now, you might think I'm crazy—that these things are just ugly by nature. But they're not. In fact, many + aspects of modern design have become uglier over time, and we've just accepted it.

+ +

Consider street lamps. In most cities today, they are dull, industrial-looking poles—rusty, ugly, + and purely functional. Yet, in older parts of my city, we still have beautiful, ornate lamp posts from + over a hundred years ago. They were designed with care, meant to serve a purpose, to be visually + appealing, and to last ages. Take a look:

+ +
+ +
On the left, your ugly, could-be-anywhere post 1971 streetlamp. On the right, a 19th century bad body from Gaudí.
+
+ +

The same goes for train stations. Modern stations are bleak, sterile spaces—metal, plastic, and harsh + lighting. They resemble hospital emergency rooms. But look at the older ones, like this one. + Those stations are masterpieces, designed like grand halls with chandeliers and intricate details.

+ +
+ +
On the left, Sants Station, built in 1975. On the right, France Station, built in 1848.
+
+ +

And talking about hospitals, they are also a good example. Most modern hospitals have the same white, cold, spaceship-like + aesthetic. While cleanliness is important, there's no reason they have to be so uninviting. In my city, + there's a hospital built over a hundred years ago that's so beautiful people visit it as a tourist + attraction. On the other hand, the hospitals I visit personally are plain depressing, soviet style + atrocities.

+ +
+ +
A random modern clinic in Barcelona vs A small section of the outside of Hospital de Sant Pau. I can skip the left and right thing now, right?
+
+
+ +
Some random room in that same modern clinic vs Your regular corridor in Sant Pau.
+
+ + + +

I think we can bring things back, if we care enough.

+ +

Look at computers. Most office desktop cases are dull, gray boxes—uninspired and purely functional. + Naturally, many of them end up buried inside desks, or if they are small enough, simply hidden behind + the screen on a VESA mount. But gamers, who deeply care about their PCs, go the extra mile to make their + setups look amazing. They invest in custom cases, LED lighting, and stylish cooling systems. They turn + their computers into art. They are testament to the fact that we can make practical things also be + beautiful if we choose to.

+ +
+ +
The all-present ugly office optiplex vs A beautiful case from a passionate man.
+
+ +

If we put the same effort into our homes, we wouldn't need to hide cables and pipes. We could proudly + display them as part of our interior design. Infrastructure could be both functional and beautiful, + giving us accessibility without sacrificing aesthetics.

+ +

I guess the point I want to make is... Don't hide it. Instead, make it beautiful.

+ +
+

back to home

+
+
+ + + + \ No newline at end of file diff --git a/public/writings/gresham-law-has-nothing-to-do-with-bitcoin.html b/public/writings/gresham-law-has-nothing-to-do-with-bitcoin.html new file mode 100644 index 0000000..71ec88f --- /dev/null +++ b/public/writings/gresham-law-has-nothing-to-do-with-bitcoin.html @@ -0,0 +1,138 @@ + + + + + Pablo here + + + + + + +
+

Hi, Pablo here

+

back to home

+
+
+

Gresham's Law has nothing to do with Bitcoin

+

+ This is going to be a thorough explanation for a simple thing, but we + will take it slow since this topic somehow causes loads of confusion. +

+

+ Okay, so there are a lot of people in Bitcoin circles who talk about + Gresham's + Law. They often say, “Gresham's Law states that bad money drives out + good money”, then relate it to Bitcoin and the USD, and finally + proceed to reason all sort of of things on top of that. But here's + some very much needed clarification: Gresham's law has nothing to do + with Bitcoin's relationship to the USD. In fact, it actually has + nothing to do Bitcoin, or with the current USD for that matter. +

+ +

+ Gresham's Law is relevant to a very specific type of monetary system: + when we used coins that contained precious metals (spoiler: we don't + live in that period of history anymore). The law states that bad money + drives out good money, but what a lot of Bitcoiners seem to miss is + the actual meaning of “good” and “bad” in this context. People tend to + interpret “good” and “bad” as meaning “hard” and "easy" money, so they + reason something like: “Because Bitcoin is harder than the USD, + Gresham's law applies here.” But that is not what Gresham's law is + about at all. +

+ +

+ In the context of Gresham's law, “good” and “bad” refer to face value + versus commodity value. That doesn't ring a bell? Let me explain: +

+ +

+ Imagine a magic land where there is only one type of coin. There's no + other money — just this one coin. These coin states on themselves that + they contain one gram of gold, and right now, they really do contain + one gram of gold. Everyone uses it, and everyone is happy. There's no + “bad” money, no “good” money — it's all nice and simple. +

+ +

Now, let's spice it up a bit.

+ +

+ After some time, a cheeky bastard (typically, a king) comes along and + starts making coins that look exactly like the original coins. I'll + call these the bad coins. The original coins will be the good coins. + Both types of coins say on them “one gram of gold,” but the bad coins + only have half a gram of gold actually in them (hence why they are + bad). +

+ +

+ So, to recap:
+ - Good coins: one gram of gold on the coin, and actually one gram of + gold inside.
+ - Bad coins: one gram of gold on the coin, but only 0.5 grams of gold + inside. +

+ +

This is where Gresham's Law applies.

+ +

+ People in this coiny fantasy land are not stupid — they know that the + gold content is what matters. At some point, someone will realize the + bad coins don't have as much gold as they claim and will develop a + preference for the good ones. So, if I'm John the Blacksmith and I + want to buy some iron, and I have a stash of coins — some good, some + bad — I would rather keep the good coins and spend the bad coins. Why? + Because I want to keep as much gold as possible, of course. +

+ +

+ What happens eventually is that people grow into the habit of trying to get + rid of the bad coins and hold on to the good coins. They exploit the + confusion created by the fact that all coins have the same face value + (it says “one gram” on all coins, so everyone assumes they're worth + the same), even though the actual commodity value (the gold inside) + differs.[1] +

+ +

That is the quick explanation of Gresham's law.

+ +

+ Now, back to the original point: what are the face value and commodity + value of Bitcoin? +

+ +

+ That makes no sense! Bitcoin is not a physical coin with metal in + it. It has no concept of face and commodity value. And neither does the + USD nowadays. Therefore, Gresham's law has absolutely nothing to do + with Bitcoin, the USD and any preferences the world might develop + between the two. +

+ +

+ Hopefully, this explanation helps make things clear. From now on, if + you want to keep your public image intact, please refrain from + invoking Gresham's law when discussing Bitcoin and USD — because doing it + shows you don't know what Gresham's Law is actually about. Don't feel + too bad if it happened to you though: it can happen even to + massive + exchanges with a great reputation. +

+ +

+ [1] Not relevant to the point of this post, but it's worth noting + that Gresham's Law situation is not always sure to happen in the + described scenario. If the difference between the good and bad coins + is massive, and no force opposes it, the market might jump into + Thier's Law + instead. +

+
+

back to home

+
+
+ + + \ No newline at end of file diff --git a/public/writings/if-i-started-a-data-team-again.html b/public/writings/if-i-started-a-data-team-again.html new file mode 100644 index 0000000..7c0473f --- /dev/null +++ b/public/writings/if-i-started-a-data-team-again.html @@ -0,0 +1,150 @@ + + + + + Pablo here + + + + + + + +
+

+ Hi, Pablo here +

+

back to home

+
+
+

If I started a Data team again

+

+ In November 2023, I joined Truvi (back then called Superhog) as the first + member of its new Data team, effectively making my hiring and the team's birth the same thing. The CEO + and COO brought me in to help a young, upcoming and quite chaotic UK SaaS company make it out of the + void of Data darkness, where no one knew shit, figures came in with three months of delay and VLOOKUP + was the closest thing there was to integrating data from two systems. +

+

+ The team is nowadays very much established and critical for the business. We've built our spot within + the org, and many colleagues wonder how life could ever exist before. We can tell many tales on + delivering value to Truvi, and we have ambitious plans to keep doing more and better. And I'm having a + blast leading it. +

+

+ For me, it was quite a journey: it was the first time I started a Data team from a greenfield situation. + Some day I'll make a longish writing on the whole experience, but today, I wanted to focus on a few + regrets I have. I personally think I've done a good work, I'm proud of where the team is at today, and + the words (and actions) of the company board show that they are aligned with this. But still, there's + always room to fuck up, and I do have a few parts of the story where, looking back in retrospective, I + think I took the wrong turn. +

+

+ The first thing I regret is not hiring faster which, taking personal responsibility, means I didn't + focus enough on it and I wasn't as effective as I should have been. When I started the team, I quickly + secured consensus from the founders to go hire two more members for it, and we all agreed it made sense + to spend those bullets to find two Data Analysts. We found Uri and Joaquín, which are still with us today doing a + terrific job. +

+

+ The bad news is they joined in May 2024, which means it took a whopping ~6 months from decision to + result. It didn't feel terrible at that moment. I was very much busy with the onslaught of work that + comes with kickstarting the team (meeting everyone, aligning with other teams, designing and starting + out infra, doing basic, urgent starting deliveries, etc.). But now I realise some of those things would + have been easier to do with the guys already around. So there goes regret number one. Lesson: if you + have agreement to get more hands on the team, make it priority #1. +

+

+ The second thing I'm not happy about is not completely dropping and rebuilding a few legacy bits I + inherited when joining. Truvi had an insane amount of unmet needs in data and reporting right before I + joined, so a bit of capacity from the development teams was derailed at some point to create a couple of + basic reporting and data exporting tools to support other teams. Those were small and done in a rather + crude way, as a result of (1) being done by backend guys with no previous experience in the Data domain, + and (2) in parallel to other very important product development work. I don't blame them, I assume they did the best they could given the circumstances. +

+

+ My mistake was to decide early to inherit and continue those, instead of bulldozering them and building + things from scratch with better tools and practices. It would have been quite easy to do at the time + given that those data products were rather small (and coming back to my first regret, it would probably + have been even easier to bulldozer them if the new hires would have been around already). At the time, I + traded off leaving those be and have a continuist approach to building incrementally in order to get + going with some other fresh new scopes faster. I'm not fully sure that the call was wrong (perhaps in a + parallel universe, I would think we shouldn't have rebuild those from scratch because it delayed + delivering other important things). But I do feel it was wrong right now. As a consequence, today we + have several data products and architectural constraints which are a royal pain in the ass to maintain + and grow with the company. For example, we're currently stuck with a lot of reporting in Power BI, which + I hate for multiple reasons, one of them being how badly I want to have code defined dashboards. + Bulldozering and replacing now will be much more painful than it would have been back then, so the + velocity of the team is now paying for this mistake. +

+

+ There goes another lesson: if you're inheriting a few, small legacy products that don't fit in your view + and you can afford to remove or re-build them to allow your plans to be pristine, do it now. Don't wait. +

+

+ A third thing I would have done differently is to start working on Data literacy across the company + earlier and more intensely. In part of the work we do in the Data team, we come in with a very polished, + mature result: this is exactly what you need to know, or the exact pristine, read-only grade data you + had to check, or the informed decision you are after. But in many other cases, our delivery ends at the + start of what I like to call the analytical last-mile: we produce some curated piece of insight and/or + data that a colleague will grab and work a bit more before getting to the final business outcome. For + example, I might export a set of KPIs around certain client accounts, and an account manager will pivot + and fuck around with them to decide certain things around how he will handle some comms with his + accounts. +

+
+ +
+

+ This kind of two-step deliveries sometimes are insanely valuable: there are some analysis where + the final user of the data is the most capable of juicing the right way, such as when someone takes + the data to use it in real time in a negotiation meeting. +

+

+ The bad news is that, if John from Marketing fucking sucks at Power BI, Excel, or whatever tooling you + rely on to interact with your colleagues, the whole plot falls down. I'm not expecting John to crank out + a monster workbook with thirty layers of business logic and seven modules of VBA, but pivoting a bit, + filtering, multiply this col by that row, etc. You get the gist. If you're thinking to yourself: "anyone + can do such basic things!", I would kindly invite you to sit down 15 min with some rando in your company + and see them use Excel live, potentially having chunked some tranquilizer down. +

+

+ Training more colleagues outside the Data team to be more proficient working with data (let it be + working on Excel, writing SQL or just reasoning) is something we're actively working on now, but I think + we should have started out earlier. I think this because of two reasons: the first, the ROI, measured in + time, is tremendous. 5 hours of working with Jane from Finance to skill her up from 0 to Excel basics + are probably much more impactful than that extra dashboard you are building, which you already sense + won't be that used or valuable. The second is, this is one of the things that has a capped max pace to + it, and won't happen faster than that no matter how hard you would like it to, or how many resources and + money you want to throw at it. People learn at a certain pace, so it's better to start early and slow, + than to trick yourself into believing you'll be able to turn Jimmy into a Power BI God in 2 days if you + try hard enough when the time comes. +

+

+ So, final lesson: I would start running Data literacy initiatives early. It doesn't need to take a big + chunk of your capacity: sprinkling a few open sessions here and there, and running some 1:1 or small + group ones with bright people, should be more than enough. It will compound over time, leading to the + company better leveraging your data and tools, and the central Data team having more capacity to keep + building since more end-users will be more independent. +

+

+ There goes my non-exhaustive list of things I would do differently when starting a Data team from + scratch. I hope it serves you if you are in a similar spot. I'm personally delighted with the idea of + not screwing up in these ways if I ever find myself starting another team from scratch. I would very + much rather screw up in new ways. +

+
+

back to home

+
+
+ + + + \ No newline at end of file diff --git a/public/writings/is-your-drug-dealer-a-homophobic-socialist.html b/public/writings/is-your-drug-dealer-a-homophobic-socialist.html new file mode 100644 index 0000000..e3063c8 --- /dev/null +++ b/public/writings/is-your-drug-dealer-a-homophobic-socialist.html @@ -0,0 +1,94 @@ + + + + + Pablo here + + + + + + +
+

Hi, Pablo here

+

back to home

+
+
+

Is your drug dealer a homophobic socialist?

+

+ Lately, I've noticed a branch of + cancel + culture + I've come to find quite disturbing. I think it has mainly extended in + the US, though I think it's starting to happen in Europe too. It's + this tendency for people at companies to politically and morally judge + business counterparties and come to the conclusion that business + shouldn't be done with them because of it. +

+ +

+ I experienced this first hand during some afterwork beers, and for + some reason the scene got burned into my retina. A colleague of mine, + beer in hand, said something like, “We're working with this customer, + and they're unbearable because they complain a lot and challenge us + all the time when we run the monthly reconciliation. Plus, they're + from Israel.” I was mindblown at how casually that was dropped, with + not even a footnote-like explanation deemed necessary. I played my 5 + year old child attitude card and asked, "What's the problem with them + being in Israel?" She said, "Well, you know, they're in Israel and the + whole thing is happening. It's terrible. We shouldn't deal with them." +

+ +

+ I couldn't hold it in: I asked her if her hairdresser was from Israel. + She looked at me completely puzzled: “I don't know. Why does that + matter?” I told her, “I don't know. Apparently, you're upset about + dealing people from Israel, so I'm assuming you need to check if + everyone you do business with is from there to not do it if that's the + case.” Silent stood and the air got thick. Someone jumped in with a + nervous joke to break up the tension that my child like questions had + somehow brought to the room, and the conversation moved on. +

+ +

+ Ever since that day, I've come across this kind of + social-justice-business-censor thinking pop up a lot. Since that fun + first encounter, whenever someone points out at how business should + not be done with <whatever ideology/country/demographic they don't + like>, I started jokingly triggering them by asking, “Actually, are + you making sure your drug dealer a homophobic socialist?” They + generally laugh, not grasping how their stances on politically + deciding to do or not do business with someone sound as ridicolous to + me. +

+ + + +

+ Here's what disturbs me: trade is a very civilized act. When we + trade—whether it's goods, services, or anything else—we're putting + aside our differences and doing something mutually beneficial. We both + walk away better off. We hurt no one. We make things a tiny bit better + overall. Deciding not to trade with someone because of some political + detail which is completely irrelevant to the trade itself is + backwards. Even if I didn't like communists, I wouldn't care if a + communist is selling me bananas. It just doesn't matter. +

+ +

+ Seeing people blow up trade over politics makes me sad. I think it's + ignorant and hateful. And I don't think they realize where that kind + of thinking can lead. +

+ +

+ In the end, I just hope people can leave politics out of business. + Let's do business and all be better off thanks to it. +

+
+

back to home

+
+
+ + + \ No newline at end of file diff --git a/public/writings/my-tips-and-tricks-when-using-postgres-as-a-dwh.html b/public/writings/my-tips-and-tricks-when-using-postgres-as-a-dwh.html new file mode 100644 index 0000000..b99ddaf --- /dev/null +++ b/public/writings/my-tips-and-tricks-when-using-postgres-as-a-dwh.html @@ -0,0 +1,173 @@ + + + + + Pablo here + + + + + + + +
+

+ Hi, Pablo here +

+

back to home

+
+
+

My tips and tricks when using Postgres as a DWH

+

In November 2023, I joined Superhog (now called Truvi) to start out the Data team. As part of that, I + also drafted and deployed the first version of its data platform. +

+

The context led me to choose Postgres for our DWH. In a time of Snowflakes, Bigqueries and Redshifts, + this might surprise some. But I can confidently say Postgres has done a great job for us, and I can even + dare to say it has provided a better experience than other, more trendy alternatives could have. I'll + jot down my rationale for picking Postgres one of these days.

+

+ Back to the topic: Postgres is not intended to act as a DWH, so using it as such might feel a bit hacky + at times. There are multiple ways to make your life better with it, as well as related tools and + practices that you might enjoy, which I'll try to list here. +

+

Use unlogged tables

+

The Write Ahead Log comes active by default for the tables you create, and + for good reasons. But in the context of an ELT DWH, it is probably a good idea to deactivate it by + making your tables unlogged. Unlogged + tables will provide you with much faster writes (roughly, twice as fast) which will make data + loading and transformation jobs inside your DWH much faster. +

+

You pay a price for this with a few trade offs, the most notable being that if your Postgres server + crashes, the contents of the unlogged tables will be lost. But, + again, if you have an ELT DWH, you can survive by running a backfill. In Truvi, we made the decision to + have the landing area for our DWH be logged, and everything else unlogged. This means if we experienced + a crash (which still hasn't happened, btw), we would recover by running a full-refresh dbt run.

+

If you are using dbt, you can easily apply this by adding this bit in your dbt_project.yml + :

+

+models:
+    +unlogged: true
+            
+ +

Tuning your server's parameters

+

Postgres has many parameters you can fiddle with, with plenty of + chances to either improve or destroy your server's performance.

+

Postgres ships with some default values for it, which are almost surely not the optimal ones for + your needs, specially if you are going to use it as a DWH. Simple changes like adjusting the + work_mem will do wonders to speed up some of your heavier queries. +

+

There are many parameters to get familiar with and proper adjustment must be done taking your specific + context and needs into account. If you have no clue at all, this little web app can give you some suggestions you + canstart from. +

+

Running VACUUM ANALYZE right after building your tables

+

Out of the box, Postgres will automatically run + VACUUM + and + ANALYZE + jobs automatically. The triggers that determine when each of those gets + triggered can be adjusted with a few server parameters. If you follow an ELT pattern, most surely + re-building your non-staging tables will cause Postgres to run them. +

+

But there's a detail that is easy to overlook. Postgres automatic triggers will start those quite fast, + but not right after you build each table. This poses a performance issue: if your intermediate sections + of the DWH have tables that build upon tables, rebuilding a table and then trying to rebuild a dependant + without having an ANALYZE on the first one before might hurt you.

+

Let me describe this with an example, because this one is a bit of a tongue twister: let's assume we have + tables int_orders and int_order_kpis. int_orders holds all of our + orders, and int_order_kpis derives some kpis from them. Naturally, first you will + materialize int_orders from some upstream staging tables, and once that is complete, you + will use its contents to build int_order_kpis. +

+

+ Having int_orders ANALYZE-d before you start building + int_order_kpis is highly benefitial for your performance in building + int_order_kpis. Why? Because having perfectly updated statistics and metadata on + int_orders will help Postgres' query optimizer better plan the necessary query to + materialize int_order_kpis. This can improve performance by orders of magnitude in some + queries by allowing Postgres to pick the right kind of join strategy for the specific data you have, for + example. +

+

Now, will Postgres auto VACUUM ANALYZE the freshly built int_orders before you + start building int_order_kpis? Hard to tell. It depends on how you build your DWH, and how + you've tuned your server's parameters. And the most dangerous bit is you're not in full control: it can + be that sometimes it happens, and other times it doesn't. Flaky and annoying. Some day I'll + write a post on how this behaviour drove me mad for two months because it made a model sometimes built + in a few seconds, and other times in >20min. +

+

+ My advice is to make sure you always VACUUM ANALYZE right after building your tables. If + you're using dbt, you can easily achieve this by adding this to your project's + dbt_project.yml: +


+models:
+    +post-hook:
+        sql: "VACUUM ANALYZE {{ this }}"
+        transaction: false
+        # ^ This makes dbt run a VACUUM ANALYZE on the models after building each.
+        # It's pointless for views, but it doesn't matter because Postgres fails
+        # silently withour raising an unhandled exception.
+            
+

+

Monitor queries with pg_stats_statements

+

pg_stats_statements is an extension that nowadays ships with Postgres + by default. If activated, it will log info on the queries executed in the server which you can check + afterward. This includes many details, with how frequently does the query get called and what's the min, + max and mean execution time being the ones you probably care about the most. Looking at those allows you + to find queries that take long each time they run, and queries that get run a lot. +

+

Another important piece of info that gets recorded is who ran the query. This is helpful + because, if you use users in a smart way, it can help you isolate expensive queries on different uses + cases or areas. For example, if you use different users to build the DWH and to give your BI tool read + access (you do that... right?), you can easily tell apart dashboard related queries from internal, DWH + transformation ones. Another example could be internal reporting vs embedded analytics in your product: + you might have stricter performance SLAs for product-embedded, customer-facing queries than for internal + dashboards. Using different users and pg_stats_statements makes it possible for you to + dissect performance issues on those separate areas independently.

+

Dalibo's wonderful execution plan visualizer

+

Sometimes you'll have some nasty query you just need to sit down with and optimize. In my experience, in + a DWH this ends up happening with queries that involve many large tables in sequential joining and + aggregation steps (as in, you join a few tables, group to some granularity, join some more, group again, + etc). +

+

You can get the query's real execution details with EXPLAIN ANALYZE, but the output's + readability is on par with morse-encoded regex patterns. I always had headaches dealing with them until + I came across Dalibo's execution plan + visualizer. You can paste the output of EXPLAIN ANALYZE there and see the query + execution presented as a diagram. No amount of words will portray accurately how awesome the UX is, so + I encourage you to try the tool with some nasty query and see for yourself.

+

Local dev env + Foreign Data Wrapper

+

One of the awesome things of using Postgres is how trivial it is to spin up an instance. This makes + goofing around much more simpler than whenever setting up a new instance means paperwork, $$$, etc.

+

Data team members at Truvi have a dockerized Postgres running in their laptops that they can use when + they are developing on our DWH dbt project. In the early days, you could grab some production dump with + some subset of tables from our staging layer and run significant chunks of our dbt DAG in your laptop if + you were patient.

+

A few hundreds of models later, this evolved to increasingly difficult and finally became impossible. +

+

Luckily, we came across Postgres' Foreign Data Wrapper. There's + quite a bit to it, but to keep it short here, just be aware that FDW allows you to make a Postgres + server give access to some table in a different Postgres server while pretending they are local. So, you + query table X in Postgres server A, even though table X is actually stored in Postgres server B. But + your query works just the same as if it was a local genuine table.

+

Setting these up is fairly trivial, and has allowed our dbt project contributors to be able to execute + hybrid dbt runs where some data and tables is local to their laptop, whereas some upstream data is being + read from production server's. The approach has been great so far, enabling them to actually test models + before commiting them to master in a convenient way.

+
+

back to home

+
+
+ + + + \ No newline at end of file diff --git a/public/writings/notes-and-lessons-from-my-departure-from-superhog.html b/public/writings/notes-and-lessons-from-my-departure-from-superhog.html new file mode 100644 index 0000000..a38a812 --- /dev/null +++ b/public/writings/notes-and-lessons-from-my-departure-from-superhog.html @@ -0,0 +1,203 @@ + + + + + Pablo here + + + + + + + +
+

+ Hi, Pablo here +

+

back to home

+
+
+

Notes for myself during my departure from Superhog

+

I'm writing this a few days before my last day at Superhog (now called Truvi). Having a few company + departures under my belt already, I know a bit on what will come next. I know one part of the drill is + that 99% of the details of what happened during my tenure at the company will completely disappear from + my memory for the most part, only triggered by eerily coincidental cues here and there every few years. + I will remember clearly a few crucial, exciting days and situations. I will also hold well the names and + faces of those with who I worked closely, as well as my personal impression and judgement of them. I + will remember the office, and some details of how my daily life was when I went there.

+

But most other things will be gone from my brain, surprisingly fast.

+

Knowing that experience is a great teacher, and regretting not doing this in the past, I've decided to + collect a few notes from my time at Superhog, hoping they will serve me in making the lessons I've + learnt here stick properly.

+ +
+

back to home

+
+
+ + + + \ No newline at end of file diff --git a/public/writings/the-roi-of-toilets.html b/public/writings/the-roi-of-toilets.html new file mode 100644 index 0000000..88f1301 --- /dev/null +++ b/public/writings/the-roi-of-toilets.html @@ -0,0 +1,78 @@ + + + + + Pablo here + + + + + + + +
+

+ Hi, Pablo here +

+

back to home

+
+
+

The ROI of toilets

+

Years ago I worked under the organizational umbrella of this COO. He was my boss' boss. Sometimes we + bumped into each other for big meetings and presentations.

+

The COO had a background in finance and audit, which gave him certain management quirks that coupled in + rather funny ways with the nature of our data and analytics departments. There was this specific one + that was always itchy to me. At the time I was still a very junior and inexperienced professional, and + my default stance on things was to humble out, shut the fuck up and listen. But I always had my opinions + locked in my brain, and in cases like this one, I couldn't hold them back.

+

+ The quirk this gentleman had was to try to measure the ROI of every little thing. He would ask for the + ROI of projects, the ROI of developments, the ROI of acquiring licenses, the ROI of going out for a + smoke. It was an understandable quirk for a financier who had never actually built or serviced anything, + but rather always looked, judged and measured from the outside. He wasn't that interested in the things + themselves, but rather in measuring them in units that would fit in his Excel sheets. +

+

+ I generally thought (and still think) that assessing ROI is a good thing to aim for. But intuitively, I + found his obsession with it misplaced and counterproductive. I now have much better words to critique + and argue against his stance, but at the time I lacked those and only had a gut feeling of "this is + stupid". +

+

+ One day we were in one of those meetings where he would start asking about the ROI of something while I + thought to myself: "We just need this thing and it's obviously more valuable that the money it will + cost, why are we having this conversation uuuugh". As I spiritually (not physically) rolled my eyes, I + couldn't hold it in anymore and just shot: "What's the ROI of the office toilets?" +

+

+ The COO and my boss suddenly stared at me, mouths open, eyebrows pressed down as they squinted their + eyes: "What?" +

+

+ "We have toilets. We have to pay for them. We could use them for desk space, but instead we put toilets. + Then we have to do plumbing and stuff. We need to pay people to clean them. it's a nuisance. How can we + know that they are the best use of shareholder funds? Who has measured the ROI of those toilets?". It + all came out naturally out of the blue. I had a great relationship with these people, but I still was + clenching my but, wondering if I had gone a bit too hard. Oh how nice it is to be young. +

+

+ They chuckled and got my point. The COO stopped insisting on specific figures for the cost + element we had at hand, although he didn't surrender a good old "write a business case for this so we + can refer to it later", which probably was a wise thing to do. +

+

+ I've faced similar situations a few times since then, and I've found myself in many others where it was + up to me if and how precisely should the ROI of something be measured. I now have a much clear mental + model and opinion of when it should and shouldn't be done. But that's for another day. +

+

+ Nobody ever told me what was the ROI of the toilets, though. Perhaps we should remove them? +

+
+

back to home

+
+
+ + + + \ No newline at end of file diff --git a/public/writings/your-customers-dont-care-that-your-bathroom-is-dirty.html b/public/writings/your-customers-dont-care-that-your-bathroom-is-dirty.html new file mode 100644 index 0000000..7df2403 --- /dev/null +++ b/public/writings/your-customers-dont-care-that-your-bathroom-is-dirty.html @@ -0,0 +1,93 @@ + + + + + Pablo here + + + + + + + +
+

+ Hi, Pablo here +

+

back to home

+
+
+

Your customers don't care that your bathroom is dirty

+

The other night I went out with the missus and we went to a fancy pants restaurants, which is unusual for + us. We prefer neighbourhood, simple places.

+

+ During the dinner, she went to the bathroom and came back horrified: "God, their bathroom is fucking + disgusting". "Much worse than the usual one?", I asked. And she said: "No, but I would expect an upscale + place like this to have it squeaky clean". +

+

+ I then laid down my thesis on why all restaurant bathrooms, even in really posh places, are always + terrible: "They don't care because you don't really care". "I do care!", she hit me back. "No, you + don't. You think you do: you obviously don't like it, and you would love to see it clean instead of all + filthy. But the truth is, when next month you're thinking about where to go out for dinner, you'll judge + this place and remember the meal, the waiters, how you felt. But not the bathroom. What was the last + time you discarded a restaurant because the bathroom was gross". At this point she agreed, and quickly + drew her attention to the desserts menu. Sometimes I invest too much energy and talk in things people + find boring. +

+

The bathrooms of products

+

+ There are a couple of things we can learn here. +

+

+ Your product surely has bathrooms. Those little corners that are not the main course, and + your customers don't care about much. You need them. Not having them would be problematic. I don't fuss + over a dirty bathroom in a restaurant, but I'm pretty confident I would remember a restaurant not having + a bathroom at all if it was responsible for some desperate run-for-it trip in search of a place to drop + my bombs. +

+

+ Your product's bathrooms are those secondary features your customers kind of need, but don't care much + about. It's that export to CSV button. Your customer John needs it to push the data into his accounting + books. The formats of the date columns are weird, and the columns names are confusing, and the fact that + you send a link to his email to download it instead of just triggering a download in his browser the + moment he hits the button, make it all quite cumbersome. But, all in all, it's minor pain. The moment he + uploads it into the accounting software, he forgets about it. +

+

+ I think it's important to be aware of what those are in your product, so you can prioritise accordingly + and avoid some feature-prioritisation bike shedding. Theoretically, it should be obvious, because you + know what's important (right? Right?!?), and whatever is not important, is probably not important. But + then somehow I still see mistakes made around this type of feature. +

+

+ I recently had a conversation with my company's CTO about a situation like this. I had some frustration + to vent. We had invested so much time and effort in improving the UI of one of our applications. And it + was so pointless. "There's a good chunk of our customer base that pretty much never go into this UI", I + told him. "They only contact us through a form when they need the service they hired. I don't think they + care about this, and I don't think the nicer UI is going to bring any value to them, nor any money to + us". +

+

+ That UI has to be there. It's where they check some settings. Reset their password. The boring stuff. + But having achieved being functional, there isn't much more value to provide in improving it. +

+

+ I think it's important to identify which are your bathrooms and make sure you act accordingly. I find + it's not enough to only care about making the important stuff top priority: it helps to also make it + clear what's not important, and be explicit about it being low priority. Just like when I define the + scope for something, I like to both think in terms of what are we including, and also making a explicit + list of what we are NOT including for the sake of clarity. Theoretically, just listing the positive list + should be enough. In reality, my experience tells me making the negative helps a lot. +

+

+ So, what are your bathrooms? Are you cleaning them with a toothbrush? Or you have them nice and dirty? +

+
+

back to home

+
+
+ + + + \ No newline at end of file