HN user

whichdan

1,259 karma

(They/Them) Director of Engineering in Boston

Posts11
Comments717
View on HN
Road to Elm 1.0 16 days ago

I agree that the stability is quite nice. But there are plenty of areas where the language could use some improvement - for instance, the ergonomics around writing nested Single Page Apps is pretty cumbersome.

Road to Elm 1.0 17 days ago

There's a lot to love about Elm, and I've written quite a bit of production code with it starting around 0.18.0. But in 2026 I'm not sure why a company would newly choose a language that hasn't otherwise been updated in nearly 7 years.

Yeah I agree. I grew up in a very blue-collar town, and anything I wanted to learn (outside of public schooling) either came from emaciated websites or whatever books I could find at the library. Having YouTube and Khan Academy and everything else would have made such a huge difference for me.

The nice thing with the Elixir example is that you can easily `tap()` to inspect how the data looks at any point in the pipeline. You can also easily insert steps into the pipeline, or reuse pipeline steps. And due to the way modules are usually organized, it would more realistically read like this, if we were in a BulkEmails module:

  Users.all()
  |> Enum.filter(&Users.is_expired?(&1, Date.utc_today()))
  |> Enum.map(&generate_expiry_email/1)
  |> tap(&IO.inspect(label: "Expiry Email"))
  |> Enum.reject(&is_nil/1)
  |> bulk_send()
The nice thing here is that we can easily log to the console, and also filter out nil expiry emails. In production code, `generate_expiry_email/1` would likely return a Result (a tuple of `{:ok, email}` or `{:error, reason}`), so we could complicate this a bit further and collect the errors to send to a logger, or to update some flag in the db.

It just becomes so easy to incrementally add functionality here.

---

Quick syntax reference for anyone reading:

- Pipelines apply the previous result as the first argument of the next function

- The `/1` after a function name indicates the arity, since Elixir supports multiple dispatch

- `&fun/1` expands to `fn arg -> fun(arg) end`

- `&fun(&1, "something")` expands to `fn arg -> fun(arg, "something") end`

iPhone Air 11 months ago

I wonder if the thinner profile will make it more comfortable in smaller hands (both in terms of reach and center-of-gravity), but I'm skeptical.

I'm really bummed there isn't a Mini - I'd be happy with getting one every third generation, even. For the size of my hands, the center-of-gravity is too high in the 6.1" phones, so I can't comfortably hold it with one hand.

Rails Cheat Sheet 3 years ago

Without compile-time type checking, every single line of code needs to be evaluated with a unit test to ensure there won't be any runtime syntax errors.

Rails Cheat Sheet 3 years ago

I think Rails is a victim of its own success: many of the hot new Rails codebases from that time are now 10 year old monoliths. And those monoliths need incredible amounts of tests to compensate for the lack of compile-time type checking, Rails version upgrades are multi-month nightmares, and the object-oriented statefulness of the language means that complex load-bearing code can be extremely tricky to untangle.

There are certainly new compelling projects like Sorbet to add type checking, and the ecosystem itself is very mature, it's just that the average codebase is not going to live up the experience you might have with a brand new one.

Basically we'd need laws enforcing a minimum wage for waitstaff, otherwise restaurants that allow tipping will always have an advantage over more expensive ones that don't. And no, you're not required to tip, but that only ends up hurting the waitstaff, not the restaurant.

Okay, so people who had historically high-paying jobs, who were at a high-paying company with above-average severance, didn't have anxiety around layoffs. You can't say anxiety around layoffs is purely about mental health without looking at the financial aspect of it.

Tiny suggestion - instead of

  .map(g => { return { key: g.key, rows: g.rows.map(r => r[1]) }})
you can write
  .map(g => ({ key: g.key, rows: g.rows.map(r => r[1]) }))

I know they don't have plans to work with AMD but I'd consider switching to AMD for my next card if EVGA was manufacturing it. They fixed an old card of mine way out of warranty so I have some brand loyalty here.

If you're just building an MVP I think doing "magic link" auth is underrated. It's super easy to set up, relatively secure, doesn't need any of the complexity of passwords/sso, and is easy to migrate to a different system in the future.

Auth0 is complete overkill if you don't need their advanced features IMO.

Employers cover a majority of the cost of insurance. In Boston, I pay maybe $70 every 2 weeks for health insurance, but on the private market I'd be paying 5-10x as much for worse coverage.

EasyRPG 4 years ago

So many fond memories of playing weird DBZ games on BYOND!

Corvus Insurance | Senior Software Engineer | Boston, MA | US Remote

https://www.corvusinsurance.com/careers?gh_jid=4455611003

We're a rapidly growing InsurTech startup (Series C, 50+ in Engineering) looking for Senior Software Engineers who want to write Elixir/Elm/GraphQL with us (even if you're new to FP!). We've used functional languages since Day 1, deliver software in 5-week cycles, and have an excellent culture with a very diverse and queer team.