Preferences

bobwaycott
Joined 3,447 karma
Principal Elixirist.

Software perfectionist.

Open to collaborating and technical co-founding if the idea is right.

Personal web: https://bobwaycott.com

Email: hn@ my personal web domain.


  1. I assume the Android logo?
  2. It’s never too late to start. ;)
  3. Had the same thought. I don’t show up on this leaderboard, but I’m #42 on the “more complete” leaderboard. I’m #8 when sorting by max in a single comment—which makes even me think I may have overdone it. Finally—HN top 50 and top 10 in something I love!
  4. The expansion slot icon looks like a hamburger menu—so I’d expect it to let me customize macOS menus. Pretty bad.
  5. Yeah. I was there and this demo was a jolt. More so was the phrasing we were witnessing the end of our punchcard era. I don’t know if it’s the history nerd in me or what, but that thought has been living in my head ever since. Looking forward to playing with Phoenix.new—and keeping an eye out for looms to smash. Kudos, Chris.
  6. Heh. This would have been just a bit more fun if you’d used it correctly—without the surrounding spaces.
  7. My bad. The article makes that clear behind a paywall. I could only read the first two paragraphs before I asked the question. Luckily the archive link shared had the full text and I was able to read the full incident description. Thank you!
  8. My apologies for asking the question when I could only read the first two paragraphs due to paywall. The archive link shared cleared up my concern, and makes it clear that it was human error during a weather-related re-approach. Thanks, though!
  9. Is this another in the string of 737 MAX issues? Or would other aircraft have experienced the same event under the same conditions?

    Edit: Aplogies for asking about content that was obvious, but behind a paywall. Thanks to the archive link shared, it sounds like it was (inexperienced) human error.

  10. From the original paper[0]:

    > We present a gradual type system for Elixir, based on the framework of semantic subtyping ... [which] provides a type system centered on the use of set-theoretic types (unions, intersections, negations) that satisfy the commutativity and distributivity properties of the corresponding set-theoretic operations. The system is a polymorphic type system with local type inference, that is, functions are explicitly annotated with types that may contain type variables, but their applications do not require explicit instantiations: the system deduces the right instantiations of every type variable. It also features precise typing of pattern matching combined with type narrowing: the types of the capture variables of the pattern and of some variables of the matched expression are refined in the branches to take into account the results of pattern matching.

    [0]: https://www.irif.fr/_media/users/gduboc/elixir-types.pdf

  11. Wow, this is really cool and clever. Well done!
  12. I haven’t seen that talk yet. I’ll check it out for sure. Thanks!
  13. > I sadly have not gotten much traction when I try and advocate for this mindset in our industry.

    Yeah, I know what you mean. It's become a bit of a primary signal for how I evaluate a company's engineering culture. I've been lucky to work with some fantastic people who really get it, and I've also struggled and suffered through working with those who do not.

    > Even the best, most sophisticated tools will not produce a working solution if you don’t understand the problem.

    I'm sure we've all seen some awful monstrosities—or created them ourselves—that we could call a technically working solution to a given problem ... but it doesn't mean anyone wants to work on it. Keeping complexity at bay requires finding the simplest solutions that isolate essential and accidental complexity. Simplicity is hard, and it requires doing this well, constantly. It is [ahem] essential to spend the time required to isolate the problem and articulate it clearly. If you can't isolate and articulate the problem without referencing your tech stack and tooling, or your explanation gets all muddy and convoluted, you haven't actually identified the essential complexity of a problem. You're still stuck in accidental complexity territory. And that's a horrible place to be designing and architecting your software from.

    It's also critical to note that over the lifetime of any piece of software, as new things come up—new bugs, new features, etc—you have to keep re-engaging the same process, and evaluating/reflecting on how new things fit (or don't!) within your existing architecture/design. Failing to do so is what drives toward infinite complexity and endless "tech debt" in poorly designed software. Well-designed software isolates and encapsulates all the accidental complexity into its own space(s), leaving open avenues to adjust and expand the software. Well-designed interfaces allow you to refactor, reshape, and grow the internals of a problem domain in isolation from its callers. This requires discipline from a software team—and its leadership—to take the time necessary to adjust and refactor as priors change. Such work should always be moving the needle toward greater team velocity and individual productivity.

    > Did you take AP tests in high school?

    Yep, sure did! I definitely remember what you're describing here.

  14. I always find myself sitting down to read Out of the Tar Pit[0] at least a couple times per year. It has been—and continues to be—one of the most seminal texts in my career. I still remember the first time I read the following passage on complexity, and how it just turned on all the mental light bulbs:

    >> Essential Complexity is inherent in, and the essence of, the problem (as seen by the users).

    >> Accidental Complexity is all the rest — complexity with which the development team would not have to deal in the ideal world (e.g. complexity arising from performance issues and from suboptimal language and infrastructure).

    >> Note that the definition of essential is deliberately more strict than common usage. Specifically when we use the term essential we will mean strictly essential to the users’ problem (as opposed to — perhaps — essential to some specific, implemented, system, or even — essential to software in general).

    The best skill I've learned, and continued to practice and improve, is the ability to strip how we talk about problems we want to solve with software down to what's truly essential to the problem. Making a habit of doing so helps clarify the contours of the problem itself, and improves discussions around solving because the boundaries of what's truly essential become clear—and then everyone involved knows that every choice we make from that point is additional, accidental complexity we are adding to the problem ourselves.

    Far too often I have seen even greenfield software quickly ratchet up the overall complexity because the people making choices don't take the time to really isolate the problem from the software—but instead frame the problem within the context of languages, frameworks, architecture, infrastructure, and so on, and then just start slinging code at the problem.

    If you haven't yet read Into the Tar Pit, it truly changed the way I look at and think about software and problem complexity. You may find value in it, as well.

    [0]: https://curtclifton.net/papers/MoseleyMarks06a.pdf

  15. And in the Uber Eats app, it’s Account > Communication to disable all the annoying notifications.
  16. Uber Eats is the worst. In the app, Account > Communication is where they have you auto opted-in to endless promotional garbage.
  17. Founder said they’d be releasing a bootloader, fwiw: https://www.hackerneue.com/item?id=40458954
  18. Even in English, the use case you’re referring to would not have an apostrophe—apostrophes are used for contractions and possession, not plurality.

This user hasn’t submitted anything.