Felipe O. Carvalho

Felipe O. Carvalho

@felipe.rs

SWE @ dbt Labs. Past: SDF, VoDa, Spotify. Apache Arrow/Databases/Compilers/DistSys. Rust/C++/OCaml/TLA+. 🇧🇷 → 🇸🇪 → 🌎 http://bento.me/felipe / https://felipe.rs

1.4K followers506 following1.1K posts

You wouldn’t see me picking an algorithm that uses a non-power-of-2 key size. 384 bits in a key? Clownish. Get a grip on reality! Use AES-256-GCM or Chacha20-P

Felipe O. Carvalho reposted

After the firefighting is done (and a nap) we'll need to have a long, serious conversation about the state of non-browser non-platform X.509 verifiers. The Linux status quo is "a pile of PEM files behind a dumpster" and that's not an acceptable excuse for a root store in 2026.

I lost a debate against security theater last year.

apenwarr@apenwarr.ca

Note to self: you will always lose an argument against security theatre because the whole point of security theatre is how secure it sounds

Felipe O. Carvalho reposted

it's not "code bloat", it's "operating at a higher level of abstraction"

The concept of consciousness will be packaged in a philosophy of power much like “essence” (from the greeks) has been incorporated into Catholic philosophy to justify devaluation of earthly life and the body in favor of an allegedly higher spiritual order.

In the case of “AI has consciousness”, the devaluation of human life makes no distinction between earthly and spiritual. It’s morally tone-deaf given all the human suffering on earth. The Church provided the thesis of an ideal afterlife FWIW.

Eng. 1: points social-technical causes of a catastrophic engineering failure. Eng. 2: no time for talking about that, let’s fix this immediate problem.

The organizations where engineers were already seen as code typers supposed to make no decisions will see a huge boost in velocity. Centralized decision making won’t keep up with this velocity, so problems will appear very quickly too.

“My main point, however, is that I don't believe that the equality P=NP will turn out to be helpful even if it is proved, because such a proof will almost surely be nonconstructive.” — Donald Knuth

I went through a rough phase in CS school. Fell in with the wrong crowd. Math and EE folks who kept telling me neural networks were a dead end.

Somewhere, Dijkstra is looking down at us renaming everything computer with anthropomorphized names. Assembly — Prompts Sub-routines — Sub-agents and tool calls Recursion/Loops — Loops Control-flow — Graphs Variables — Memory Libraries — Skills

“What fish are able to see bears a close analogy to that degree of awareness which all people have in relation to any new environment created by a new technology—just about zero.” — Marshall McLuhan

An AI agent can’t solve every git conflict adequately. For the hard ones, you would have to prompt it or give it some context about what your team is doing and what goes into the decision. It’s easier to be presented with the git conflict markers and decide by editing the code.

“The reader will not fail to observe that the second problem is more general than the first, and, nevertheless, much easier than the first. In fact, our main achievement in solving the first problem was to invent the second problem.” — George Pólya

Monday the 16ths, on the other hand, make you lose sleep on Sunday evenings. 😰

maura quint@mauraquint.bsky.social

Can’t believe they convinced us that Friday the 13ths are scary. They’re Fridays. The least scary day of the whole week. They are trying to make us turn on everything we love.

I opened YouTube this week and it recommended the web scale MongoDB video. Metadata says “15 years ago” and that made me feel very old.

In Arrow C++, we have “length” of arrays for the “count” and buffers have “size” in bytes. But things get confusing when STL code is mixed because vector::size() is the length/count and not the “size” in bytes. t.co/ZGkA8xvy8R

Using Cap’n Proto in Rust to get zero-copy deserialization, but Codex insists on writing de/serialization functions that build a struct full of heap-allocated strings. Because that’s what dominates the training set of model and programmers everywhere.

The year of Linux on the desktop because Windows and macOS window managers are terrible if you're supposed to loop through all the AI agents you're managing at work.

Google Meet: "no one is here" before you join the meeting but only because it hasn't really loaded the response that lists who is in the meeting.

Twitter servers are borked and profile pages say "user x hasn't posted yet" instead of an error message. This is a common pattern everywhere. "You have no flights" before your flight loads in the airline app is very stressful.

Good time to be CLI maxxing: - @neovim.io - tmux - smug (to start tmux sessions from YAML files) - git worktrees (multiple repo checkouts for parallel agents) - dotfiles in a git repo synced across macOS and Linux machines

In this new world, by the time a PR is opened, the author should have already reviewed the coding agent’s work. Code review, as we know it, is not going to scale. You can’t get paid to ask an agent for code, open a PR and let the review and refinements be someone’s problem.

In open-source, the idea that you're judged by your code is also not going to scale. Some kind of reputation system will be necessary for contributors to earn the right of having their code reviewed.

Open-source can't dispense with code review, but I predict some companies will stop code review altogether and more aggressively cut people who submit slop to production.

In Rust, a &T is not an immutable reference in the common Functional Programming sense. func(&self) is free to mutate atomics or values wrapped in Mutex through self because any other call through an alias to self is going to synchronize the mutations. &T means "you can have other aliases".

&mut T means "you cannot have other aliases". This contrasts with C++ const where aliases are all over the place and const only exists to help you be suspicious about side-effects.

A method that takes a lock and performs some mutation would be non-const in C++. But if you were to declare it as `&mut self` in Rust, you would not be able to have concurrent callers. The whole point of having a Mutex in the first place!

I had a professor in CS school that told us "if you worry about hackers, you won't get anything done" when the subject of SQL injection came up. The 2026 version of that is: if you don't give your 1Password to Claude you won't get anything done.

Twitter servers are borked and profile pages say "user x hasn't posted yet" instead of an error message. This is a common pattern everywhere. "You have no flights" before your flight loads in the airline app is very stressful.

Most non-C++ integrations of the RocksDB API rely on the C bindings which will populate a fresh std::string, malloc() and memcpy() on every Get(). You either write custom bindings, or use C++ to get the good perf that RocksDB can give.

Even if PLT folks had the time and energy to productionize their ideas they would burn out growing a community around the language. Nothing seems more offensive to programmers than someone trying to create a programming language with novel ideas.

Putting a PR in the merge queue is so underwhelming. All the work, review, flaky CI restarts ending with a weak promise: it's in the queue and it might get merged. Not a triumphant, immediate, and unequivocal write to main's history.

Writing code is the hard part of software engineering in the sense that once written, the code encodes all the bad and good decisions. The bad decisions increase future risk and requires expensive and careful migrations.

When writing code, you should try to keep it free of bad decisions that are hard to change later. Free is impossible, so you should try to minimize them. If you get an oracle that can produce code for you, the bottleneck is now only your judgement.

AI companies: 6 months from now, AI is replacing all software engineers. Also AI companies: we can’t afford to do a re-architecting of the app to solve crippling performance issues present in the current version. 🤔

Github didn't really have to implement "AI features" to capitalize on the AI wave. All it had and has to do is to improve its existing features in a world where every team is using AI tools. There will be more code, more PRs, more reviews, more builds… and they can charge for it

Editing Rust use declarations feels like programming in Java. This granular import syntax is what made Java programming suck without an IDE. rust-analyzer helps but it would be better if the problem didn't exist at all. Go did it right.