Hacker Newsnew | past | comments | ask | show | jobs | submit | jweir's commentslogin

Look up Sean Bell - not a stop a frisk, just an open fire.

Once, my wife and I were stopped, but not frisked, and cited for riding bikes, on a sidewalk at 2AM on a stretch of Atlantic Ave that would kill you to ride on. It made no sense, until I found out that my neighbor and his friend had been murdered at a street party. There was a drag net out trying to find the killer and they stopped anyone for anything.

A tough city.


This is our experience. We have added Sorbet to a 16 year old Rails app. It is a big win in avoiding errors, typos, documentation, code completion, fewer tests are required, etc.

And the LLMs take advantage of the types through the LSP and type checking.


I’d love to hear from you or someone in your shoes: what are some patterns or examples of tests that are made redundant by types?

“It has a field of type X” has never been a useful test for me, my tests are always more like:

“if I send message X I get return value or action Y”

… with my admittedly limited experience of types I don’t see how they replicate this.

Therefore it looks like I’d only be “replacing” tests that I’d never write in the first place.

What am I missing?


One of the big advantages of types is documenting what is *not* allowed. This brings a clarity to the developers and additionally ensure what is not allowed does not happen.

Unit tests typically test for behaviours. This could be both positive and negative tests. But we often test only a subset of possibilities just because how people generally think (more positive cases than negative cases). Theoretically we can do all those tests with unit testing. But we need to ask ourselves honestly, do we have that kind of test coverage as SQLLite? If yes, do we have that for very large codebases?


Just to clarify, are you saying SQLLite is a good example that we should emulate?


SQLite is known for having a lot of testing. Per their docs around 600x as much test as application code.

https://sqlite.org/testing.html


We have some tests that ensure the interface is correct - that the correct type of args are passed say from a batch process to a mailer and a mail object is returned.

For these tests we don’t care about the content only that something didn’t get incorrectly set or the mailer interface changed.

Now if the developer changes the Mailer to require a user object the compiler tells us there is an error. Sorbet will error and say “hey you need to update your code here and here by adding a User object”

Before we would have had test coverage for that - or maybe not and missed the error.


First one that pops to mind is some old python code; the parameter that came in on some functions could be a single string or a list of them. Lots of bugs where arg[0] was a character rather than a string. So tests had to be written showing both being passed in.


We have been adding Sorbet typing to our Rails application and it is a positive enhancement.

It’s not like Ruby becomes Haskell. But it does provide a good deal of additional saftey, less testing, LSP integration is good, and it is gradual.

There is a performance hit but we found it to be quite small and not an issue.

But there are area of our application that use Grape and it is too meta for Sorbet so we don’t try and use it there.


Same here. T::Struct and T::Enums at API boundaries has been the sweet spot—typed request/response models, runtime validation at ingress/egress.

I’ve been using this pattern for API clients[0] and CLIs[1]: define the shape once with Sorbet, get automatic JSON Schema generation when you need it.

[0] https://github.com/vicentereig/exa-ruby [1] https://github.com/vicentereig/lf-cli


> It’s not like Ruby becomes Haskell.

Well, maybe next time.


And use a single px invisible gif to move things around.

But was Space Jam using multiple images or just one large image with and image map for links?


The author said he had the assets and gave them to Claude. It would be obvious if he had one large image for all the planets instead of individual ones.


And moms are the gate keeps of their kids friends.


Speaking of compiling Ruby. And Stripe coders who have used the Sorbet compiler?

https://sorbet.org/blog/2021/07/30/open-sourcing-sorbet-comp...


It seems to be gone from the repo, and doesn't seem to be worked on any more? A shame.

AOT compiling Ruby is hard. I'm trying [1] [2].

Sorbet would be in a good position because part of the challenge of making it fast is that Ruby has a lot of semantics that are rarely used but that makes making compiled Ruby fast really hard. E.g. the bignum promotion adds overhead to every single operation unless you can prove invariants about the range of the values; the meta-programming likewise adds overhead and makes even very basic operations really expensive unless you can prove classes (or individual objects) aren't being mucked with...

So starting with type checking is an interesting approach to potentially allow for compiling guarded type-specific fast paths. If my compiler ever gets close enough to feature complete (it's a hobby project, so depends entirely on how much time I get, though now I also justify more time for it by using it as a test-bed for LLM tooling), it's certainly a direction I'd love to eventually explore.

[1] https://hokstad.com/compiler (not updated for a decade)

[2] https://github.com/vidarh/writing-a-compiler-in-ruby/ (updated now primarily by Claude Code; it's currently focusing on actually passing RubySpec and making speedy progress, at the cost of allowing some fairly ugly code - I do cleanup passes occasionally, but most of the cleanup will be deferred until more passes)


And won’t the authService.register function also error if the user already exists? Or will it allow double registering the account?

There are deeper problems here that a Result type is not gonna fix.


The Authservice register function will error, it says so in the article


Something that the type system should do is "make impossible states impossible" as Evan Czaplicki said (maybe others too)

We have started to use typed HTML templates in Ruby using Sorbet. It definitely prevents some production bugs (our old HAML templates would have `nil` errors when first going into production).


Many years ago a 4.5 hit when I living in Berkeley, about 2 miles aways and I thought a truck ran into my house. No rolling - just one giant jolt.


Nothing worse than starting off a talk and bombing.


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: