+1, very polite way of saying it. of course there's a difference between the two posts. open source is interesting but not enough with a financial app, since it's all about trust + usefulness.
landing page needs to look good and communicate the value prop super effectively. If it doesn't look good you'll lose people's interest in about 2 seconds.
my only minor critique is using lorem ipsum examples. It tends to make me want to gloss over instead of reading; I prefer seeing realistic data. other than that, it's a really cool post
It also creates the tables, including invoice and lineitem tables. It's still a bit of a dull accounting example, rather than something like food, superheroes, social networks, zoo animals, sports, or dating, but I think the randomness does add a little bit of humor.
Although now we have LLMs, and maybe they'd do a better job.
Was going to post the same thing. Lorem Ipsum makes the data too hard to distinguish. I get that due to the dynamic nature of the examples the text needed to be generated, but Latin isn't the best choice IMO.
right, it is just syntactic sugar, but if that wasn't helpful then why have it in dev either? I find it more confusing to have asserts be stripped, which creates an implicit dev/prod discrepancy
I didn't think much of it until I canceled Cursor to try out copilot, which is slower and yet also worse quality. I reluctantly resubscribed to Cursor.
duplicate code is not that bad. reduce duplication over time as you find the common patterns/abstractions, instead of trying to build abstractions too early
Duplicate or near-redundant functions are either no problem or even useful. But duplicate or near-redundant data structures are a plague on any codebase.
The prophet Perlis declared: "It is better to have 100 functions operate on one data structure than 10 functions on 10 data structures."
Maybe obvious but also, don't deduplicate if it means adding options or making things too abstract. I don't know if I can think of a good example. Maybe you make a function that compares arrays of strings. Then you decide to add an option to make it case insensitive. Then someone comes along and decides they want to compare arrays of structs. So they had a comparison function option. Most times I've seen this pattern the code gets way harder to understand and more brittle. All the options etc cascade into spaghetti and changes start breaking things because so many paths expect some original behavior. Better to have just kept them separate, most of the time.
Most of the shitty code I've seen has been from poor attempts at reducing code duplication, usually resulting in some overfitted generalized solution or abstraction.
Efforts to reduce duplication should be focused on chunking out reusable pure functions. Trying to dedupe the flow of logic is almost always a fool's errand.
I mean, why do systems go down at all? a lot of big outages are simple misconfiguration or cascading failure from what seemed like small changes. It's rarely due to the physical constraints of the world