I'm hugely in favor of bringing the gogoproto enhancements into 
golang/protobuf, as a spectator to this discussion. I'm not sure what 
requirements would put generated binary size over marshalling speed, but 
maybe I haven't worked on large enough projects yet. We have used gogoproto 
for about 2 years at work without dependency hell, but again I recognize 
that I have little experience with large open source projects and 
dependency chains.

It might be interesting to note that the new kid on the gRPC block, Twitch 
Twirp, mentioned a large runtime library 
<https://blog.twitch.tv/twirp-a-sweet-new-rpc-framework-for-go-5f2febbf35f> 
as one of the reasons they implemented their RPC-over-protobuf 
implementation.

Would love to hear more thoughts about this from the go protobuf team.

On Thursday, 1 February 2018 08:02:01 UTC, Walter Schulze wrote:
>
> I cannot recall that I have experienced these problems. The generated code 
> has also been far easier to maintain than the runtime reflected code that 
> is repeatedly patched by golang/protobuf. Except for import paths, this is 
> probably one of the easiest projects a developer will get to work on. It is 
> deterministic and you have awesome debugging output. The only thing that 
> tires me is big patches like this one to the runtime reflected code and 
> libraries that don't recognize gogoprotobuf and only import the 
> golang/protobuf library.
>
> I have seriously been pondering a protobuf generator that does not have a 
> library as a dependency. It would be incredibly easy to maintain, since I 
> don't have to merge golang/protobuf patches and get around the fact that 
> grpc libraries only want a single protobuf library. I have one missing 
> puzzle piece and then I just need time. 
>
> I don't get the argument for small binaries at all, but not importing a 
> library will also decrease the binary size and given enough flexibility, 
> which I intend to have, will also result in not generating the code you 
> don't need. 
>
> A contract which expect your generated struct to have a marshal and 
> unmarshal method is very simple to maintain. 
>
> I'll be at fosdem this weekend if anyone wants to chat in person and is 
> there anyway. 
>
> On Thu, 1 Feb 2018, 08:40 Henrik Johansson, <dahan...@gmail.com 
> <javascript:>> wrote:
>
>> Surely these issues already exist in gogo-protobuf? How are they handled 
>> there?
>>
>> On Thu, Feb 1, 2018, 08:28 'Jisi Liu' via golang-nuts <
>> golan...@googlegroups.com <javascript:>> wrote:
>>
>>> This is not Java specific. I just used Java as an example. For most 
>>> protobuf implementations, there is a contract between the runtime and 
>>> generated code which is not meant to be public. e.g. In go-protobuf, 
>>> runtime expects the generated classes define some internal fields, like 
>>> XXX_unrecognized, and  XXX_sizecache.
>>>
>>> If we are moving from table-driven to codegen, then I guess there will 
>>> be more contracts between the runtime and generated code, and potentially 
>>> introduce contracts also between the containing message and embedded 
>>> message fields - you probably want to extract duplicate methods into 
>>> runtime to save code size, and the generate code needs to deal with 
>>> submessages itself.  This is my primary concern.
>>>
>>> In a single repo development model, someone can change such contract as 
>>> long as they change the protoc-gen and the runtime library at the same 
>>> time. However, in open source, such change can cause dependency-hell  
>>> <https://en.wikipedia.org/wiki/Dependency_hell>issues as the different 
>>> versions of generated protobufs are no-longer compatible with each other 
>>> and/or with the runtime. With a more tightly coupled model, we are more 
>>> prone to such issue.
>>>
>>> One way to solve this is to make the runtime support all the previous 
>>> versions of the contract indefinitely and be always backward compatible. 
>>> Then users can switch to the newest runtime to support all the old 
>>> libraries. We are following this approach in protobuf-java 3.x, which 
>>> causes lots of dev overhead. I'm a bit worried that we would need to do the 
>>> same for Go, if we go with the code-gen approach.
>>>
>>>
>>> On Wed, Jan 31, 2018 at 10:25 PM Walter Schulze <awalter...@gmail.com 
>>> <javascript:>> wrote:
>>>
>>>> Could we perhaps get a code snippet example that non java programmers 
>>>> can follow.
>>>>
>>>> PS 
>>>>
>>>> When I previously referred to java programmers as real software 
>>>> developers, I didn't add some much needed context.
>>>>
>>>> Sometimes in this java dominated world I personally don't feel like a 
>>>> real software developer. 
>>>>
>>>> On Wed, 31 Jan 2018, 21:44 liujisi via golang-nuts, <
>>>> golan...@googlegroups.com <javascript:>> wrote:
>>>>
>>>>>
>>>>>
>>>>> On Wednesday, January 31, 2018 at 11:20:31 AM UTC-8, Walter Schulze 
>>>>> wrote:
>>>>>
>>>>>> Hi JT please see my inline replies.
>>>>>>
>>>>>> On Wed, 31 Jan 2018 at 19:05 <thebroke...@gmail.com> wrote:
>>>>>>
>>>>>>> Thank you, Walter, for your support.
>>>>>>>
>>>>>>> > gogo/protobuf is disappointed that golang/protobuf still thinks 
>>>>>>> that runtime reflection is an efficient way of serializing structures.
>>>>>>>
>>>>>>> The table-driven implementation avoids reflect in the fast and 
>>>>>>> common path. Instead, are you referring to the fact that we don't 
>>>>>>> perform 
>>>>>>> full-code generation of Marshal/Unmarshal like what gogo/protobuf does? 
>>>>>>> We 
>>>>>>> are aware that full-code generation will often out-perform the 
>>>>>>> table-driven 
>>>>>>> approach we took. However, full code-generation drastically bloats the 
>>>>>>> binary size when you have many proto messages linked in. Keeping the 
>>>>>>> binary 
>>>>>>> size smaller was an important design decision for us and seemed to be a 
>>>>>>> better default.
>>>>>>>
>>>>>>
>>>>>> Yes, I was referring to the speed of code generation over runtime 
>>>>>> reflection.
>>>>>> What I struggle to understand is why the optimize_for file option 
>>>>>> that is part of proto 2 and 3 is not considered by golang/protobuf as a 
>>>>>> way 
>>>>>> to specify when code generation should be used over runtime reflection.
>>>>>> This seems to work for most other languages, including Java, which I 
>>>>>> heard is quite popular among real software developers.
>>>>>>
>>>>>
>>>>> Note that the code-generation approach used by other languages (mostly 
>>>>> C++/Java) has its own problem. Mostly because of the tight coupling among 
>>>>> generated code, runtime and embedded sub messages (generated by a 
>>>>> different 
>>>>> party using a different version of protoc). These problem don't exist 
>>>>> inside of google as we use a single repo build system, but it cause 
>>>>> significant issues in opensource. For instance, Hadoop is still shipping 
>>>>> protobuf v2.5 generated code which is incompatible with later version of 
>>>>> protobufs. All the projects using Hadoop are then version locked to v2.5, 
>>>>> as an upgrade in any project (including Hadoop itself) will break the 
>>>>> build. Version upgrade can only happen when all the transitive dependency 
>>>>> closure upgrade together atomically.
>>>>>
>>>>> We solve this problem in protobuf-java v3.0+ by introducing ABI 
>>>>> backward/forward compatibility guarantees on generated code and runtime. 
>>>>> However, this introduced lots of overhead on code maintenance, reduced 
>>>>> development velocity and limited the change we could do.  We are now 
>>>>> solving the issue by introduce table driven to Java. The recent benchmark 
>>>>> result showed performance on par for android platforms, and hopefully we 
>>>>> can release the new implementation in a few months.
>>>>>
>>>>> For Go, if we are going to introduce full generated code, I'd strongly 
>>>>> recommend considering those complications. Major version bump is also 
>>>>> expensive for protobufs as all the dependency libraries would have to 
>>>>> bump 
>>>>> their major version too.
>>>>>  
>>>>>
>>>>>>  
>>>>>>
>>>>>>>
>>>>>>> We are open to considering an option that allows user to specify 
>>>>>>> full-code generation for select messages.
>>>>>>>
>>>>>>
>>>>>> This is exactly what gogo/protobuf allows users to do.
>>>>>> Using protobuf extensions gogo/protobuf allows the user to specify 
>>>>>> per message or file whether they want to generate marshalers, 
>>>>>> unmarshalers, 
>>>>>> etc.
>>>>>> A user can also create a vanity binary to generate these methods if 
>>>>>> you do not wish to use extensions and want to enforce a specific style 
>>>>>> across and organization.
>>>>>>  
>>>>>>
>>>>>>>
>>>>>>> > gogo/protobuf is still open to being merged back into 
>>>>>>> golang/protobuf and has been since its inception 5 years ago.
>>>>>>>
>>>>>>> That is good to hear. I have not yet gone through all of 
>>>>>>> gogo/protobuf to determine what it would to merge, or what should be 
>>>>>>> merged. This will be future work.
>>>>>>>
>>>>>>
>>>>>> gogo/protobuf is also be open to only being partly merged.
>>>>>>
>>>>>> One other major advantage of gogo/protobuf is generating the 
>>>>>> structures you want to use, by allowing you to modify the generated 
>>>>>> structure using protobuf extensions like customtype.
>>>>>> This way you can avoid copying between the protobuf generated 
>>>>>> structure and a user defined go structure that you actually want to use.
>>>>>> This is a huge speed and safety gain and probably the most important 
>>>>>> feature of gogo/protobuf.
>>>>>> proto3 has addressed the biggest concern by allowing the generation 
>>>>>> of fields without pointers, but there are other cases as well, including 
>>>>>> casttype, customname for generating more lintable code and even not 
>>>>>> generating the structure at all, for ultimate customization.
>>>>>> I would hope that merging some of these ideas will also be on the 
>>>>>> table.
>>>>>>
>>>>>> Looking forward to working together for a change
>>>>>> Please let me know how I can help
>>>>>>
>>>>>> Skeptically hopeful about a new era for protobufs in Go
>>>>>> Walter Schulze
>>>>>>  
>>>>>>
>>>>>
>>>>>>> JT
>>>>>>>
>>>>>>> On Wednesday, January 31, 2018 at 7:13:38 AM UTC-8, Walter Schulze 
>>>>>>> wrote:
>>>>>>>>
>>>>>>>> gogo/protobuf is happy to be acknowledged by Google as an entity in 
>>>>>>>> the golang protobuf space.
>>>>>>>> gogo/protobuf welcomes golang/protobuf to the community and is 
>>>>>>>> extremely happy to see this kind of transparency.
>>>>>>>>
>>>>>>>> gogo/protobuf will also merge these changes and as usual try to 
>>>>>>>> stay as close as possible to golang/protobuf, 
>>>>>>>> including also following the same version tagging.
>>>>>>>>
>>>>>>>> gogo/protobuf is disappointed that golang/protobuf still thinks 
>>>>>>>> that runtime reflection is an efficient way of serializing structures.
>>>>>>>>
>>>>>>>> go Green go GoGoProtobuf
>>>>>>>>
>>>>>>>> PS
>>>>>>>>
>>>>>>>> gogo/protobuf is still open to being merged back into 
>>>>>>>> golang/protobuf and has been since its inception 5 years ago.
>>>>>>>> gogo/protobuf feels for its users, especially those that are not 
>>>>>>>> acknowledged by grpc-gateway and grpc-go,
>>>>>>>> and forced to employ work arounds, to preserve their missions of 
>>>>>>>> safety and efficiency.
>>>>>>>> It knows that its existence is not something that anyone prefers, 
>>>>>>>> and it welcomes death, 
>>>>>>>> but only if it can preserve its legacy of fast serailization and 
>>>>>>>> generating the structures you want to use.
>>>>>>>>
>>>>>>>>
>>>>>>>> On Tuesday, 30 January 2018 23:44:37 UTC+1, joe...@google.com 
>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>> Done. I tagged v1.0.0. When we perform the merge in the future, it 
>>>>>>>>> will be tagged as v1.1.0.
>>>>>>>>>
>>>>>>>>> On Tuesday, January 30, 2018 at 9:37:23 AM UTC-8, Alexey 
>>>>>>>>> Palazhchenko wrote:
>>>>>>>>>>
>>>>>>>>>> Hi,
>>>>>>>>>>
>>>>>>>>>> Can you please add tags to the repository before that? SemVer or 
>>>>>>>>>> even tags with _any_ semantic would greatly help to rollback to the 
>>>>>>>>>> latest 
>>>>>>>>>> working version when things break.
>>>>>>>>>>
>>>>>>>>>> –-–
>>>>>>>>>> Alexey «AlekSi» Palazhchenko
>>>>>>>>>>
>>>>>>>>>> -- 
>>>>>>> You received this message because you are subscribed to a topic in 
>>>>>>> the Google Groups "golang-nuts" group.
>>>>>>> To unsubscribe from this topic, visit 
>>>>>>> https://groups.google.com/d/topic/golang-nuts/F5xFHTfwRnY/unsubscribe
>>>>>>> .
>>>>>>>
>>>>>> To unsubscribe from this group and all its topics, send an email to 
>>>>>>> golang-nuts...@googlegroups.com.
>>>>>>
>>>>>>
>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>
>>>>>> -- 
>>>>> You received this message because you are subscribed to a topic in the 
>>>>> Google Groups "golang-nuts" group.
>>>>> To unsubscribe from this topic, visit 
>>>>> https://groups.google.com/d/topic/golang-nuts/F5xFHTfwRnY/unsubscribe.
>>>>>
>>>> To unsubscribe from this group and all its topics, send an email to 
>>>>> golang-nuts...@googlegroups.com <javascript:>.
>>>>
>>>>
>>>>> 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...@googlegroups.com <javascript:>.
>>
>>
>>> 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.

Reply via email to