diff --git a/public/index.html b/public/index.html index 7021775..3b400b9 100644 --- a/public/index.html +++ b/public/index.html @@ -1,215 +1,139 @@ - + - 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 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.

- -
-
- +
+

+ 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.

+ +
+
+ \ No newline at end of file diff --git a/public/keybase.txt b/public/keybase.txt deleted file mode 100644 index 43ffead..0000000 --- a/public/keybase.txt +++ /dev/null @@ -1,56 +0,0 @@ -================================================================== -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 f3422a0..27038a6 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 deleted file mode 100644 index 955951a..0000000 Binary files a/public/static/computers.png and /dev/null differ diff --git a/public/static/data-alley-oop.jpeg b/public/static/data-alley-oop.jpeg deleted file mode 100644 index 3eb5709..0000000 Binary files a/public/static/data-alley-oop.jpeg and /dev/null differ diff --git a/public/static/homophobic-socialist-drug-dealer.png b/public/static/homophobic-socialist-drug-dealer.png deleted file mode 100644 index f013ebc..0000000 Binary files a/public/static/homophobic-socialist-drug-dealer.png and /dev/null differ diff --git a/public/static/hospitals-inside.png b/public/static/hospitals-inside.png deleted file mode 100644 index 515541e..0000000 Binary files a/public/static/hospitals-inside.png and /dev/null differ diff --git a/public/static/hospitals-outside.png b/public/static/hospitals-outside.png deleted file mode 100644 index 33c1cd0..0000000 Binary files a/public/static/hospitals-outside.png and /dev/null differ diff --git a/public/static/plumbings.png b/public/static/plumbings.png deleted file mode 100644 index 68d61d0..0000000 Binary files a/public/static/plumbings.png and /dev/null differ diff --git a/public/static/stations.png b/public/static/stations.png deleted file mode 100644 index 54ad4ef..0000000 Binary files a/public/static/stations.png and /dev/null differ diff --git a/public/static/streetlamps.png b/public/static/streetlamps.png deleted file mode 100644 index 84a42d0..0000000 Binary files a/public/static/streetlamps.png and /dev/null differ diff --git a/public/styles.css b/public/styles.css index 690b8b1..1b99426 100644 --- a/public/styles.css +++ b/public/styles.css @@ -21,8 +21,7 @@ img { display: block; } -figcaption { +figcaption a { 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 deleted file mode 100644 index abefd1d..0000000 --- a/public/writings/a-note-for-the-future-the-tax-bleeding-in-2025.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - 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 deleted file mode 100644 index fea806a..0000000 --- a/public/writings/dont-hide-it-make-it-beautiful.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - 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 deleted file mode 100644 index 71ec88f..0000000 --- a/public/writings/gresham-law-has-nothing-to-do-with-bitcoin.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - 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 deleted file mode 100644 index 7c0473f..0000000 --- a/public/writings/if-i-started-a-data-team-again.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - 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 deleted file mode 100644 index e3063c8..0000000 --- a/public/writings/is-your-drug-dealer-a-homophobic-socialist.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - 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 deleted file mode 100644 index b99ddaf..0000000 --- a/public/writings/my-tips-and-tricks-when-using-postgres-as-a-dwh.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - 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 deleted file mode 100644 index a38a812..0000000 --- a/public/writings/notes-and-lessons-from-my-departure-from-superhog.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - 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 deleted file mode 100644 index 88f1301..0000000 --- a/public/writings/the-roi-of-toilets.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - 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/valuing-data-teams-output.html b/public/writings/valuing-data-teams-output.html new file mode 100644 index 0000000..0cdcdd9 --- /dev/null +++ b/public/writings/valuing-data-teams-output.html @@ -0,0 +1,132 @@ + + + + + Pablo here + + + + + + + +
+

+ Hi, Pablo here +

+

back to home

+
+
+

Valuating data teams output

+

+ - Freedom and fucking up + - How work looks like + - This is an economics problem + - Fairy tail organizational designs +

+

+ In 2023, I had the chance to do something not a lot of people get to do: I started a Data team in a + startup (Truvi, formerly Superhog) from scratch. +

+

+ Being in a greenfield situation, both in organization and technical terms, was equally challenging and + rewarding. It gave me the right space and craving to spend time thinking on stuff I hadn't before. This + included very foundational questions such as... what should the Data team do? The kind of stuff you + don't think about much when you land in a cruise ship that's already been rolling for a while, and you + get told your job is to pull that lever up and down when the light tells you to. Ever since, I've had + the + chance to learn and think a lot about embedding a Data team in a small SaaS company. +

+

+ One of the hard and interesting topics is how do you measure the success of the team. How do you look at + what the team has done and answer the following questions: +

+ +

+ These are not trivial questions. Because it's easy to fuck up. Being a nimble team in a small company, + the amount of flexibility you enjoy is ecstatic. You can (and usually need to) pivot a lot, very fast. + But with freedom comes responsibility, and the pleasure of having many choices comes with the pain of + wondering if you're screwing up in what you choose. +

+

+ How work looks like +

+

+ I find experience and real situations make abstract rants like this one much more interesting, so let me + explain a bit what the Data team at Truvi faces on a daily basis to give some context. +

+

+ Truvi is a SaaS company that services short-term rentals (STR) hosts and guests. Our goal is to help + both parties reduce and manage risk in their bookings. Risk here means, for the other part, the other + party doing something nasty to you (e.g. your guest burns down your BnBs kitchen, or your host let's you + know the property you booked is flooded right when you show up at the door on a Monday night at + 11:30PM). We offer multiple services, like screening and protection, to help both parties manage this, + and we charge fees for it. +

+

+ We deliver our services through a couple of in-house developed applications and some API integrations + with PMSs, OTAs and other funky acronym-named + types of companies involved in the STR industry. +

+

+ The Data team's main responsibility, as defined by me, is to ensure people in the company know what they + need to know. We deliver this in multiple ways: +

+ +

+ Even if this categorization looks neat, the reality is more of a barrage of a million different things, + coming through the door all at once without any order. +

+

+ Given our humble capacity for delivering and our colleagues heavy appetite for asking, only a sliver + of what gets requested will be done soon. One of my jobs is to decide, together with the company + leadership, what makes it in. It's a tough job at Truvi, and it's been a tough job at previous companies + I've been at. I think that is the case because of poor organizational design. And I think we have a lot + to learn from economics. +

+

Economic calculation

+

+ The situation we have in my team is an economical one. We have lots of needs and we can't satisfy all + of them. +

+

+ This is the same situation society faces at scale: there's plenty of capital and man hours we can put up + to good use, but we have infinite options. What do we do more, hospitals, more schools or more beers? +

+

+ In society, despite what statists and bureacrats would like, these decisions are not made by a bunch of + all knowing intellectuals in their parties office. They are made on the streets, by individuals that + decide how to spend their own money and time. +

+

+ People spend their own very wisely. Even if it might look like they do stupid stuff, they don't. They do + what's good for them, with their resources and preferences. Even if we don't share their choices. Even + if we think we know better than 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 deleted file mode 100644 index 7df2403..0000000 --- a/public/writings/your-customers-dont-care-that-your-bathroom-is-dirty.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - 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