HNHacker News
TopNewBestAskShowJobs

brandonbloom

1,965 karma · joined May 16, 2013

brandon@deref.io

http://www.brandonbloom.name

https://github.com/brandonbloom

https://twitter.com/BrandonBloom

http://www.linkedin.com/in/brandondbloom/

Old account: https://news.ycombinator.com/threads?id=snprbob86

submissionscomments
brandonbloom··on Show HN: AWS Enhancement Suite
Anything that we could do to assuage your concerns?

For what it's worth, we're trying to be extremely thoughtful about security. If it helps (or hurts?), we're a venture backed company, have a published privacy policy, etc. We don't include any anonymous identity tracking, nor do we do any resource crawling, or anything like that. For the CloudTrail feature, we do hit a read-only API endpoint using your browser session, but we don't send any of that data to our servers. We'd never hit any read/write endpoints without you properly granting us an IAM role.

brandonbloom··on Show HN: AWS Enhancement Suite
Even for read-only use cases?

I've talked to _lots_ of folks who have nearly 100% IaC coverage, including folks who only expose read-only console access to the majority of their devs. But I haven't met anyone who has successfully managed to avoid logging in to the console during production incidents to debug things.

One feature we're looking at potentially adding is "Go To Definition", that lets you go from the AWS Console and jump directly to the Terraform code that produced that resource. Would that be useful to you?

brandonbloom··on Show HN: AWS Enhancement Suite
Thanks for the feedback. We'll improve the description.

As for the auth0.com access, that's a bug! It's fixed in the next release. Sorry about that.

EDIT: The extension is also open source, if that's helpful at all - https://github.com/deref/deref-browser-extensions

brandonbloom··on Show HN: AWS Enhancement Suite
Hey, CEO of Deref here.

In our customer discovery calls, we've heard so much about how folks dislike the AWS Console. We figured we should do something about that!

This extension is super early days, but we'd love for it to grow. Feedback welcome!

email: hello@deref.io

twitter: @deref_inc

brandonbloom··on Ask HN: Who is hiring? (October 2020)
Deref.io | Product Engineer | Remote (US, UK, and beyond)

Deref is a next generation cloud management platform for DevOps. Every cloud-native business depends on dozens of cloud and saas services. Understanding how the pieces fit together can be challenging. Deref works like an IDE for the cloud. Deref helps engineers find what they're looking for with global search; keep track of changes and ownership with an audit log for resources; and rein in complexity and cost with advanced analysis and refactoring tools.

We're (pre-)seed funded and now assembling the founding team. Currently, the team consists of a technical CEO and three full-stack engineers with a range of startup experience; fully distributed. Seeking a product-minded engineer with frontend engineering skillset to own and drive the user experience. Have you ever wished you could fix the AWS console UI? This might be the job for you.

Compensation: Reasonable salary and generous equity. UI Tech: React / Next.js / TypeScript

Sound like this might be you?

Contact: jobs@deref.io

brandonbloom··on Ask HN: Who is hiring? (September 2020)
Deref.io | Sr. Frontend Engineer | Remote

Deref is a next generation cloud management platform for DevOps. Every cloud-native business depends on dozens of cloud and saas services. Understanding how the pieces fit together can be challenging. Deref works like an IDE for the cloud. Deref helps engineers find what they're looking for with global search; keep track of changes and ownership with an audit log for resources; and rein in complexity and cost with advanced analysis and refactoring tools.

We're (pre-)seed funded and just now assembling the founding team. Currently, the team consists of a technical CEO and three full-stack engineers with a range of startup experience; fully distributed. Seeking a frontend-leaning, design-minded engineer to own and drive the user experience. Have you ever wished you could fix the AWS console UI? This might be the job for you.

Compensation: Reasonable salary and generous equity.

UI Tech: React / Next.js / TypeScript

Sound like this might be you?

Contact: jobs@deref.io

Or visit: angel.co/l/2t9J1e

brandonbloom··on Ask HN: Who is hiring? (August 2020)
Deref.io | Senior Software Engineer | Remote | Full-time

Deref is a next generation cloud management platform for DevOps. Every cloud-native business depends on dozens of cloud and saas services. Understanding how the pieces fit together can be challenging. Deref works like an IDE for the cloud. Deref helps engineers find what they're looking for with global search; keep track of changes and ownership with an audit log for resources; and rein in complexity and cost with advanced analysis and refactoring tools.

Seed funded startup hiring founding engineers. Seeking full-stack folks with DevOps experience / knowledge of that pain. Both frontend- and backend-leaning roles available.

Tech stack: Go, TypeScript & React, and lots of really interesting, challenging problems.

Building a fully distributed team. Not yet sure how to support non-US talent, but will figure it out for the right fit.

Contact jobs@deref.io for more information.

brandonbloom··on Robpike/Lisp: Toy Lisp 1.5 interpreter in Go
It depends on whether or not you view "oops, that shouldn't be nil right now" as a categorically different problem than "oops, this integer shouldn't be greater than 10 right now" problems. Or "oops, this array shouldn't have an odd number of elements right now" problems.

Yes, it's nice to have the type system catch problems. And yes, in the context of memory-unsafe languages null or wild pointers are a big problem. But I've found that you'd need a combinatoric explosion of data constructors and abstract interfaces to enforce the interesting invariants of my programs. A nil pointer (which panics at runtime with a good stack trace!) tends to be among the easiest problems I have to solve when my programs violate invariants.

I'm not arguing that sum-types are a bad idea. Only that dependent products (with or without enforcement, static or dynamic) are an under appreciated technique. Sum-types are really just one special case of dependent products.

brandonbloom··on Robpike/Lisp: Toy Lisp 1.5 interpreter in Go
In the context of that statement, nothing.

I called out Clojure specifically because of the culture around this specific issue and because of the dispatch design of the multimethods that are present in the standard library and widely favored. Nothing stops you from making dispatch tables or simply switching on a key in JavaScript.

brandonbloom··on Robpike/Lisp: Toy Lisp 1.5 interpreter in Go
I find this a fascinating topic, so forgive me for this reply which has turned in to a mini blog post of sorts...

Go embraces the common insight that you can encode a sum as a dependent product. That is, here, you have a discriminated union of atoms and cons cells, but the discriminant is not a specific tag value, as it would be in Haskell or ML or similar, but rather the nil/non-nil state of these fields. Of course, there is no static enforcement of this property, as there would be in contemporary languages with sum types, including Rust's enums.

The quintessential example of this in Go is result/error multi-value returns. The result is valid if the error is nil. If your goal is to save bits (which is rarely the case for Go programs), as you note, avoiding an explicit discriminant (such as an interface pointer) means that you're encoding the discriminant's information in to less space, utilizing the specific domain knowledge of mutual exclusion.

Stepping further from Go, this same principle is at play in Clojure, which favors open maps for information. In Clojure, multimethods can dispatch on arbitrary functions of values. This means that any field can easily be used as a discriminant. Now, saving bytes is certainly not the purpose of this in Clojure, but it's interesting to think about. Forcing dispatch in to a privileged discriminant tag means that data needs to be transformed/parsed in order to re-arrange information in to the tag for dispatch.

Alexis King wrote an excellent article about this sort of transformation: https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-va...

As excellent as that article is, I think the truth lies in some balance. Both parsing and validation are useful techniques. Contemporary typed languages tend to push you down a path towards parsing instead of validation, which is probably the way the pendulum should swing for many use cases. However, there is one language that stands in stark contrast: TypeScript. Because it needs to support existing JavaScript idioms, it has grown a type system powerful enough to enable reasonable type safety with a validation based approach. Tools like control-flow sensitive type checking, literal types, and type-guards make that possible. You can use an arbitrary key in some JS object with a literal type value as a discriminant and the type system will do the right thing with union types.

There is one other area where Go is interesting here: zero values. Go zero-initializes all freshly allocated memory and encourages a style that embraces that. These freshly allocated objects are called "zero values" and often they are useful right out of the gate. You're encouraged to make code no-op safely with zero values, or apply some sane defaults. This makes an important distinction between `EnableFoo bool` and `DisableFoo bool`. Looping zero times is a perfectly valid thing to do. Silently skipping nil values is a perfectly valid thing to do in some cases. Etc. Clojure is similar with nil punning. While not without it's downsides, this is an interesting point in the design space that seems totally ignored by theoreticians and totally under-appreciated by working programmers, even those who work with Go and Clojure regularly. I'd really like to see that change, as I've found my programs have generally improved as I make judicious use of these techniques.

brandonbloom··on Mathematica v12.1
I've found the "Evaluation of Expressions" doc page to be super useful: https://reference.wolfram.com/language/tutorial/EvaluationOf...

Read through it once to get the gist, then go back and read it again. The second time through, _play_ with each example. Try them out, see how they behave, attempt to apply other things you've learned to each. In no time at all, you'll have the basics down and then will be able to make heads or tails of the other doc pages much more quickly.

brandonbloom··on Multi-Value All the Wasm
I think Factor is an existence proof that you're mistaken about this.

Check out the section of the docs labeled "The stack": https://docs.factorcode.org/content/article-handbook-languag...

Note that, in particular, there is full support for stack-effect declarations and that there is a static static-effect checker.

brandonbloom··on Async-await on stable Rust
> so Rust cannot just take the same approach as Go

I did not suggest that it do so. In fact, I suggested an approach that wouldn't fit for Go!

In Go, you've got pretty strict modular compilation. Because of this, specialization -- which is pervasive in Rust -- is virtually absent in Go. Rust's rich generics system demands robust specialization machinery. This machinery, which handles instantiation of explicit generics, can be repurposed to handle automatic instantiation of implicit generics. In this case, I'm suggesting that a function could be compiled as either synchronous or asynchronous as determined by the use-site.

> In Rust, every bit of async implementation (futures, schedulers, etc) is a library

Nothing about my suggestion precludes this.

brandonbloom··on Async-await on stable Rust
It's not. I didn't realize Rust had that, but the rest of my comment still applies: it would be nice if asynchrony was transparent to intermediate functions and compiled via specialization.
brandonbloom··on Async-await on stable Rust
Yup. See https://journal.stuffwithstuff.com/2015/02/01/what-color-is-... for a pretty good explanation of the async/await problem.

I know Rust is all about zero-cost abstractions, "but at what cost" beyond just runtime cost? I appreciate their principled approach to mechanical sympathy and interop with the C abstract machine, but I'm just not enthused about this particular tradeoff.

An alternative design would have kept await, but supported async not as a function-modifier, but as an expression modifier. Unfortunately, as the async compiler transform is a static property of a function, this would break separate compilation. That said, I have to wonder if the continuously maturing specialization machinery in Rustc could have been used to address this. IIUC, they already have generic code that is compiled as an AST and specialized to machine code upon use, then memoized for future use. They could specialize functions by their async usage and whether or not any higher-order arguments are themselves async. It might balloon worst-case compilation time by ~2X for async/non-async uses (more for HOF), but that's probably better than ballooning user-written code by 2X.

brandonbloom··on Async-await on stable Rust
Go creates the illusion of preemptive multithreading by having implicit safe-points for cooperative multithreading. Each IO operation is such a safe-point. If you write an infinite loop like `for {}` where there are no IO operations in loop body, it will block indefinitely. This will prevent the underlying OS thread from being available to other goroutines. The same thing can happen even if you do have IO operations in there, but the work being performed is dominated by CPU time instead of IO.
brandonbloom··on Principled GraphQL
Since GraphQL lets you select a subset of attributes, there is no reason you can't expose C on A directly, as well as exposing the indirection through B. Redundant attributes are A-OK.

You'd have something like this::

a { b { c { x } }

as well as

a { c { x } }

or even:

a { cX }

brandonbloom··on Steve Jobs hired a career juggler to teach programming to developers
I guess the standard response here would be that means you’re not pushing yourself hard enough to try bigger and riskier things.
brandonbloom··on Ask HN: Who is hiring? (August 2018)
Legalpad | Seattle, WA | Ruby on Rails Engineer | ONSITE, REMOTE, VISA

Legalpad helps businesses hire across international boundaries. Our product helps businesses and their employees secure work visas faster and with less stress. We're seed funded and have paying customers.

More details & apply via Angel List: https://angel.co/legalpad/jobs

Or contact my first name @legalpad.io

brandonbloom··on California law requires businesses to let you cancel your subscription online
I've done this several times with Comcast, but it failed with Time Warner when I moved out of NYC. They demand to know why you are canceling and have some sort of way to extract money out of you for every scenario, including moving out of their service area. In that case, they transfer you to another phone system that helps you find a provider at your new address and, presumably, nets them a referral fee of some kind. Meanwhile, if you try any excuse to quit that they haven't accounted for, they tell you "yes sir" and redirect your call to that service as a fallback catch-all. Truly despicable.
brandonbloom··on Ask HN: Who is hiring? (July 2018)
Legalpad | Seattle, WA | Ruby on Rails Engineer, Senior Frontend Engineer | ONSITE, REMOTE, VISA

Legalpad helps businesses hire across international boundaries. Our product helps businesses and their employees secure work visas faster and with less stress. We're seed funded and have paying customers.

More details & apply via Angel List: https://angel.co/legalpad/jobs

Or contact my first name @legalpad.io

brandonbloom··on Handles are the better pointers
It worked out fine for 16 bit systems and the like, just as it did on the Mac. As machines became more powerful, the need for this technique disappeared.
brandonbloom··on Seattle passes smaller ‘head tax’ on big companies after impassioned debate
$275/year comes out to a little more than a dollar per business day. With minimum wage being $15/hr in Seattle, this amounts to less than a 1% salary tax even in the maximal case. Making it vary with salary probably wouldn't have much if any impact.
brandonbloom··on From Rails to Clojure, Then to Java, Then Back to Rails
Years of Clojure has made me a dramatically better Rails programmer. The biggest change for me is that I now treat ActiveRecord models as gloried hashes with easy-access to a namespace of related functions (ie. methods) that operate on all manner of underspecified partial data, rather than traditional OOP-style objects with sophisticated invariants. I'm also very careful to strictly separate reads from writes, and to discard/reload all mutated objects immediately after transacting with them.

My new business is built on Rails for a very long list of reasons, not the least of which is that both Ruby is quite a nice language, and Rails is actually quite good for back-office/lo-fi/quick-and-dirty, server-side-rendered UX with relatively low web traffic.

brandonbloom··on Ask HN: Who is hiring? (March 2018)
Legalpad (TechStars Seattle 2018) | Seattle, WA | Full-time Onsite

Our product enables companies to streamline their business' immigration process, making life easier for immigrant candidates, and freeing attorneys from burdensome paperwork.

Our technology is an internal-use IDE for developing legal workflows with simple-to-use data collection and sophisticated document templating. We offer automation at every step of the process, and aim to automate an increasing range of legal work over time.

Apply: https://angel.co/legalpad/jobs

brandonbloom··on Principles of Chaos Engineering
That the industry is finally maturing in to a field that capitalizes on the unique properties of its medium?
brandonbloom··on The Death of Microservice Madness in 2018
I agree that it's _easier_ for teams to have their own little fiefdoms, but not necessarily _better_. Shipping the org-chart is often a symptom of a leadership problem. When natural service boundaries exist, good leadership may choose to ship the org-chart, but too often extrinsic factors such as the arrangement of dev's desks dictates the architecture.
brandonbloom··on Go’s hidden pragmas
You've missed the chance to include namespaces on the standard set, but is it too late to reserve un-namespaced annotations for official use?
brandonbloom··on A Clarification
sigh I couldn't disagree any more strongly.

1) This isn't about "feelings", it's about the fact that speech _has consequences_. People get hurt both emotionally and physically because of things other people say, especially in aggregate.

2) Etymologically speaking, violence comes from "violent", which meant "having a marked or powerful effect".

3) Legally speaking, violence includes intimidation.

4) Practically speaking, arguing definitions is a total waste of time.

brandonbloom··on A Clarification
The war advocacy example is a straw man. I don’t even know where to start with the rest of your comment built around that premise.
← PreviousPage 2 of 16Next →