Thanks for the feedback. Please do add these notes to the wikis as discussed at https://go.googlesource.com/proposal/+/master/design/go2draft.md . Thanks.
Ian On Wed, Oct 17, 2018 at 3:13 PM, Aditya Mukerjee <d...@chimeracoder.net> wrote: > Recently, several developers at Stripe who write Go regularly for their work > met to discuss the Go 2 design drafts for error handling, error values, and > generics. The goal of the meeting was not necessarily to provide a single > conclusion on each of the design drafts, but rather to collect perspectives > and opinions from various Go developers at Stripe to share more broadly. I > took notes notes on the discussion; the raw and unfiltered notes are below, > and I've put a short summary at the top. > > As a preface: > > * About ten people were present > * Not all Go developers at Stripe were present; this was a group of people > who are particularly passionate about Go (and happened to be available) > * I attempted to take direct quotations as much as possible (even if the > comments were blunt at times) > > > These notes do not reflect my personal opinions on the design drafts; they > are a compilation of different perspectives that other people shared during > the meeting, and which I am relaying. However, if you have questions about > any of the points that people raised, I'm happy to elaborate to the best of > my memory. > > > Overview > > People were happy to see that check/handle was not a Java-like exception > construct, which brings too much baggage from other languages. However, they > found the control flow to be confusion, and were skeptical of whether there > were enough workflows that benefited from the change to justify the added > complexity. There was one workflow which was a notable exception: the > check/handle construct would facilitate the pattern of “if there is any > error of a certain type, perform cleanup actions”. > > > Error values were generally received positively, with the main questions > being around how this would intersect with pkg/errors. There were a number > of fans of pkg/errors (one person said “pkg/errors solved contextual > information in error handling for me”). Since the error values draft is > philosophically similar to pkg/errors, this was generally a positive piece > of feedback, aside from questions about how a migration would work. > > > The design draft on generics generated the most confusion and the sharpest > feedback. People were overall happy with the goal of being able to use > complex data structures that others write, instead of reimplementing them > ourselves. However, they were not sold on the use of contracts to achieve > that goal. The syntax was controversial, and so were the semantics: people > pointed out that it was confusing to reason about the implications of even > seemingly-simple contracts (such as the Apply) example. > > > > Raw notes > > Error Handling: > > How does the control flow look? > > “Took me a while to get it, but it seems kind of reasonable. But it’s pretty > hard to explain up front” > > “I’m concerned that it’s hard to figure out - it’s no longer ‘going forward’ > through the function, but now jumping around in strange ways” > > “One tenet of Go has always been its readability, and you could always read > top to bottom within a package. The fact that you jump around between handle > blocks until one of them happens to return is strange” > > “The canonical example in the design draft - even that one you have to read > a few times to realize that it goes from a lower-defined handle block up to > a previously-defined one” > > “What happens if none of the handle blocks return? It’s not clear to me” > > “Inner to outer, then up, then back” > > “It’s about as difficult to explain as defer, but the intersection of both > is weird” > > “In small functions, it probably would scan better to have the if-check, > rather than the check-handle” > > “It is designed to remove boilerplate, but it introduces complexity. This > was not originally something I found painful to deal with in the language. > It feels like a solution without a problem” > > “Now my snippet for expanding if err != nil will have to expand to “handle > err { return err }”, but otherwise it won’t add anything for me” > > “Is `defer check f.Close()` valid? If so, this would make a huge help for us > in <name of service>” > > “If any error of a certain type, clean everything up” - this makes that > easier” (example code: > https://gist.github.com/ChimeraCoder/9fdef30e84ab374b612533ae4fd06873) > > For error handling: I really like the `check` nomenclature, rather than the > other suggestion of `try`. As a recovering Java programmer, I feel like > `try` brings in too much baggage from that language family, and leads folks > to start "thinking in exceptions" rather than adapting to Go's error > handling concepts. > > > > Error values: > > “This sounds like the `failure` library in Rust [which may be a good thing, > but is definitely an improvement over the status quo” > > Look at the new errors proposal for Rust, which is considering putting the > entire stacktrace on the error itself (controlled by an environment > variable) > > “pkg/errors solved contextual information in error handling for me” > > What happens if you wrap a lot of errors with `fmt.Errorf`? > > > > Generics: > > “I’m +1 on having complicated data structures implemented by others so I > don’t have to, but I’m not sure about the contract syntax” > > “If I created a contract that essentially is powerful enough to say ‘this > type must be higher-kinded’, how does the compiler know that that contract > is undecidable?” > > “This reeks of the situation with the alias proposals, where as soon as it > was released into the wild, people discovered ways to write nonsensical > aliases with it, and that’s why the final version took out the values > portion (leaving only type aliases)” > > “This feels half-baked” > > “I’m even a Lisper, but why do we want everything to be in more > parenthesized groups?” > > “I’m in favor of stronger type systems, and Go’s type system is not > particularly sound as it is. But I’m not sure contracts meaningfully moves > the needle in one direction or the other in terms of making things better or > worse vs. keeping things the same” > > “The Apply() example is awkward syntax, and also really non-obvious”: > https://go.googlesource.com/proposal/+/master/design/go2draft-contracts.md > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.