Thanks Yuriy!

What about `VoidSerde` ? It's not listed.

It might also be nice to add a short sentence and state that in addition
to fixing the name collisions, the KIP will also close the gap of
out-of-the-box serdes and add missing Serdes that are offered in Java to
Scala.


-Matthias

On 7/10/20 7:51 AM, Yuriy Badalyantc wrote:
> Oh, ok. I have done that. Just didn't know that it was necessary.
> 
> -Yuriy
> 
> On Fri, Jul 10, 2020 at 9:30 PM John Roesler <vvcep...@apache.org> wrote:
> 
>> Ah, thanks Yuriy,
>>
>> Sorry if this wasn't clear, but _all_ public API changes have to
>> be explicitly included in the KIP. Can you just enumerate all
>> the contents of the new API?
>>
>> Thanks,
>> John
>>
>> On Fri, Jul 10, 2020, at 04:54, Yuriy Badalyantc wrote:
>>> Hi, Matthias,
>>>
>>> It's not directly mentioned in the KIP, but I added all missing Java
>>> serdes. I mentioned it in the pull request description:
>>> https://github.com/apache/kafka/pull/8955
>>>
>>> And also, this KIP originally was based on a pull request where I added
>>> missing java serdes :) https://github.com/apache/kafka/pull/8049
>>>
>>> -Yuriy
>>>
>>> On Fri, Jul 10, 2020 at 3:36 AM Matthias J. Sax <mj...@apache.org>
>> wrote:
>>>
>>>> Yuriy,
>>>>
>>>> thanks for the KIP update. I have one follow up thought: I checked what
>>>> default Serdes we offer in the Java class
>>>>
>>>>  `org.apache.kafka.common.serialization.Serdes`
>>>>
>>>> and I think it would be good if we could close the gap between the Java
>>>> and Scala code and add the missing Java Serdes in Scala, too.
>>>>
>>>> It seems we are missing `Short` (Java and Scala), `Void`, `UUID`, and
>>>> `ByterBuffer`.
>>>>
>>>> Can we add those in addition?
>>>>
>>>>
>>>> -Matthias
>>>>
>>>> On 7/8/20 6:45 AM, John Roesler wrote:
>>>>> Hi Yuriy,
>>>>>
>>>>> Once it seems like there’s general agreement in the discussion, you
>> can
>>>> start a voting thread. You can find examples on the mailing list of
>> what to
>>>> say in the first message. It’s basically just a message with the
>> subject
>>>> line changed from “[DISCUSS]...” to “[VOTE]...”, and then stating that
>>>> you’d like to start the vote. It’s nice to link to the kip document
>> again.
>>>>>
>>>>> The rules for the vote are at the top of the “Kafka Improvement
>> Process”
>>>> page, but you basically need 3 binding +1 votes and no binding -1
>> votes.
>>>> You also need to wait at least three days from when you start the vote
>>>> before you can declare it accepted. There’s no upper time limit.
>>>>>
>>>>> If you’re unsure of who has a binding vote, it’s just the people
>> listed
>>>> on the Apache Kafka Committers page.
>>>>>
>>>>> If people are slow to vote, feel free to keep bumping the thread,
>> just
>>>> like with the discussion.
>>>>>
>>>>> Thanks again for getting involved!
>>>>> -John
>>>>>
>>>>> On Tue, Jul 7, 2020, at 01:51, Yuriy Badalyantc wrote:
>>>>>> So, what's next? It's my first KIP and I'm not familiar with all
>>>> processes.
>>>>>>
>>>>>> -Yuriy
>>>>>>
>>>>>> On Mon, Jul 6, 2020 at 1:32 AM John Roesler <vvcep...@apache.org>
>>>> wrote:
>>>>>>
>>>>>>> Hi Yuriy,
>>>>>>>
>>>>>>> Thanks for the update! It looks good to me.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> John
>>>>>>>
>>>>>>> On Sun, Jul 5, 2020, at 03:27, Yuriy Badalyantc wrote:
>>>>>>>> Hi John.
>>>>>>>>
>>>>>>>> I updated the KIP. An old proposed implementation is now in the
>>>> rejected
>>>>>>>> alternatives.
>>>>>>>>
>>>>>>>> - Yuriy
>>>>>>>>
>>>>>>>> On Sun, Jul 5, 2020 at 12:03 AM John Roesler <vvcep...@apache.org
>>>
>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Hi Yuriy,
>>>>>>>>>
>>>>>>>>> I agree, we can keep them separate. I just wanted to make you
>> aware
>>>> of
>>>>>>> it.
>>>>>>>>>
>>>>>>>>> Thanks for the PR, it looks the way I expected.
>>>>>>>>>
>>>>>>>>> I just read over the KIP document again. I think it needs to be
>>>>>>> updated to
>>>>>>>>> the current proposal, and then we’ll be able to start the vote.
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> John
>>>>>>>>>
>>>>>>>>> On Tue, Jun 30, 2020, at 04:58, Yuriy Badalyantc wrote:
>>>>>>>>>> Hi everybody!
>>>>>>>>>>
>>>>>>>>>> Looks like a discussion about KIP-513 could take a while. I
>> think we
>>>>>>>>> should
>>>>>>>>>> move forward with KIP-616 without waiting for KIP-513.
>>>>>>>>>>
>>>>>>>>>> I created a new pull request for KIP-616:
>>>>>>>>>> https://github.com/apache/kafka/pull/8955. It contains a new
>>>>>>>>>> `org.apache.kafka.streams.scala.serialization.Serdes` object
>> without
>>>>>>> name
>>>>>>>>>> clash. An old one was marked as deprecated. This change is
>> backward
>>>>>>>>>> compatible and it could be merged in any further release.
>>>>>>>>>>
>>>>>>>>>> On Wed, Jun 3, 2020 at 12:41 PM Yuriy Badalyantc <
>> lmne...@gmail.com
>>>>>
>>>>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>>>> Hi, John
>>>>>>>>>>>
>>>>>>>>>>> Thanks for pointing that out. I expressed my thoughts about
>>>>>>> KIP-513 and
>>>>>>>>>>> its connection to KIP-616 in the KIP-513 mail list.
>>>>>>>>>>>
>>>>>>>>>>> - Yuriy
>>>>>>>>>>>
>>>>>>>>>>> On Sun, May 31, 2020 at 1:26 AM John Roesler <
>> vvcep...@apache.org>
>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Hi Yuriy,
>>>>>>>>>>>>
>>>>>>>>>>>> I was just looking back at KIP-513, and I’m wondering if
>> there’s
>>>>>>> any
>>>>>>>>>>>> overlap we should consider here, or if they are just
>> orthogonal.
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks,
>>>>>>>>>>>> -John
>>>>>>>>>>>>
>>>>>>>>>>>> On Thu, May 28, 2020, at 21:36, Yuriy Badalyantc wrote:
>>>>>>>>>>>>> At the current moment, I think John's plan is better than the
>>>>>>>>> original
>>>>>>>>>>>> plan
>>>>>>>>>>>>> described in the KIP. I think we should create a new
>> `Serdes` in
>>>>>>>>> another
>>>>>>>>>>>>> package. The old one will be deprecated.
>>>>>>>>>>>>>
>>>>>>>>>>>>> - Yuriy
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Fri, May 29, 2020 at 8:58 AM John Roesler <
>>>>>>> vvcep...@apache.org>
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thanks, Matthias,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> If we go with the approach Yuriy and I agreed on, to
>>>>>>> deprecate and
>>>>>>>>>>>> replace
>>>>>>>>>>>>>> the whole class and not just a few of the methods, then the
>>>>>>>>> timeline
>>>>>>>>>>>> is
>>>>>>>>>>>>>> less of a concern. Under that plan, Yuriy can just write the
>>>>>>> new
>>>>>>>>> class
>>>>>>>>>>>>>> exactly the way he wants and people can cleanly swap over to
>>>>>>> the
>>>>>>>>> new
>>>>>>>>>>>>>> pattern when they are ready.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> The timeline was more significant if we were just going to
>>>>>>>>> deprecate
>>>>>>>>>>>> some
>>>>>>>>>>>>>> methods and add new methods to the existing class. That plan
>>>>>>>>> requires
>>>>>>>>>>>> two
>>>>>>>>>>>>>> implementation phases, where we first deprecate the existing
>>>>>>>>> methods
>>>>>>>>>>>> and
>>>>>>>>>>>>>> later swap the implicits at the same time we remove the
>>>>>>> deprecated
>>>>>>>>>>>> members.
>>>>>>>>>>>>>> Aside from the complexity of that approach, it’s not a
>>>>>>> breakage
>>>>>>>>> free
>>>>>>>>>>>> path,
>>>>>>>>>>>>>> as some users would be forced to continue using the
>> deprecated
>>>>>>>>> members
>>>>>>>>>>>>>> until a future release drops them, breaking their source
>>>>>>> code, and
>>>>>>>>>>>> only
>>>>>>>>>>>>>> then can they update their code.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> That wouldn’t be the end of the world, and we’ve had to do
>> the
>>>>>>>>> same
>>>>>>>>>>>> thing
>>>>>>>>>>>>>> in the past with the implicit conversations, but this is a
>>>>>>> much
>>>>>>>>> wider
>>>>>>>>>>>>>> scope, since it’s all the serdes. I’m happy with the new
>> plan,
>>>>>>>>> since
>>>>>>>>>>>> it’s
>>>>>>>>>>>>>> not only one step, but also it provides everyone a
>>>>>>> breakage-free
>>>>>>>>> path.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> We can still consider dropping the deprecated class in 3.0;
>> I
>>>>>>> just
>>>>>>>>>>>> wanted
>>>>>>>>>>>>>> to clarify how the timeline issue has changed.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>> John
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Thu, May 28, 2020, at 20:34, Matthias J. Sax wrote:
>>>>>>>>>>>>>>> I am not a Scale person, so I cannot really contribute
>> much.
>>>>>>>>>>>> However for
>>>>>>>>>>>>>>> the deprecation period, if we get the change into 2.7, it
>>>>>>> might
>>>>>>>>> be
>>>>>>>>>>>> ok to
>>>>>>>>>>>>>>> remove the deprecated classed in 3.0.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> It would only be one minor release in between what is a
>>>>>>> little
>>>>>>>>> bit
>>>>>>>>>>>> short
>>>>>>>>>>>>>>> (we usually prefer at least two minor released, better
>>>>>>> three),
>>>>>>>>> but
>>>>>>>>>>>> if we
>>>>>>>>>>>>>>> have a good reason for it, it might be ok.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> If we cannot remove it in 3.0, it seems there would be a
>>>>>>> 4.0 in
>>>>>>>>>>>> about a
>>>>>>>>>>>>>>> year(?) when ZK removal is finished and we can remove the
>>>>>>>>> deprecated
>>>>>>>>>>>>>>> code than.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> -Matthias
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On 5/28/20 7:39 AM, John Roesler wrote:
>>>>>>>>>>>>>>>> Hi Yuriy,
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Sounds good to me! I had a feeling we were bringing
>>>>>>> different
>>>>>>>>>>>> context
>>>>>>>>>>>>>>>> to the discussion; thanks for sticking with the
>>>>>>> conversation
>>>>>>>>>>>> until we
>>>>>>>>>>>>>> got
>>>>>>>>>>>>>>>> it hashed out.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> I'm glad you prefer Serde*s*, since having multiple
>>>>>>> different
>>>>>>>>>>>> classes
>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>> the same name leads to all kinds of trouble. "Serdes"
>>>>>>> seems
>>>>>>>>>>>> relatively
>>>>>>>>>>>>>>>> safe because people in the Scala lib won't be using the
>>>>>>> Java
>>>>>>>>>>>> Serdes
>>>>>>>>>>>>>> class,
>>>>>>>>>>>>>>>> and they won't be using the deprecated and non-deprecated
>>>>>>> one
>>>>>>>>> at
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>> same time.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Thank again,
>>>>>>>>>>>>>>>> -John
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On Thu, May 28, 2020, at 02:21, Yuriy Badalyantc wrote:
>>>>>>>>>>>>>>>>> Ok, I understood you, John. I wasn't sure about kafka
>>>>>>>>> deprecation
>>>>>>>>>>>>>> policy
>>>>>>>>>>>>>>>>> and thought that the full cycle could be done with 2.7
>>>>>>>>> version.
>>>>>>>>>>>>>> Waiting for
>>>>>>>>>>>>>>>>> 3.0 is too much, I agree with it.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> So, I think creating one more `Serdes` in another
>>>>>>> package is
>>>>>>>>> our
>>>>>>>>>>>> way.
>>>>>>>>>>>>>> I
>>>>>>>>>>>>>>>>> suggest one of the following:
>>>>>>>>>>>>>>>>> 1. `org.apache.kafka.streams.scala.serde.Serdes`
>>>>>>>>>>>>>>>>> 2. `org.apache.kafka.streams.scala.serialization.Serdes`
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> About `Serde` vs `Serdes`. I'm strongly against `Serde`
>>>>>>>>> because
>>>>>>>>>>>> it
>>>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>> lead to a new name clash with the
>>>>>>>>>>>>>>>>> `org.apache.kafka.common.serialization.Serde`.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> - Yuriy
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On Thu, May 28, 2020 at 11:12 AM John Roesler <
>>>>>>>>>>>> vvcep...@apache.org>
>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Hi Yuriy,
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Thanks for the clarification.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> I guess my concern is twofold:
>>>>>>>>>>>>>>>>>> 1. We typically leave deprecated methods in place for at
>>>>>>>>> least a
>>>>>>>>>>>>>> major
>>>>>>>>>>>>>>>>>> release cycle before removing them, so it would seem
>>>>>>> abrupt
>>>>>>>>> to
>>>>>>>>>>>> have a
>>>>>>>>>>>>>>>>>> deprecation period of only one minor release. If we
>>>>>>> follow
>>>>>>>>> the
>>>>>>>>>>>> same
>>>>>>>>>>>>>> pattern
>>>>>>>>>>>>>>>>>> here, it would take over a year to finish this KIP.
>>>>>>>>>>>>>>>>>> 2. It doesn’t seem like there is a nonbreaking
>>>>>>> deprecation
>>>>>>>>> path
>>>>>>>>>>>> at
>>>>>>>>>>>>>> all if
>>>>>>>>>>>>>>>>>> people enumerate their imports (if they don’t use a
>>>>>>>>> wildcard).
>>>>>>>>>>>> In
>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>> case, they would have no path to implicitly use the
>>>>>>> newly
>>>>>>>>> named
>>>>>>>>>>>>>> serdes, and
>>>>>>>>>>>>>>>>>> therefore they would have no way to avoid continuing to
>>>>>>> use
>>>>>>>>> the
>>>>>>>>>>>>>> deprecated
>>>>>>>>>>>>>>>>>> ones.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Since you mentioned that your reason is mainly the
>>>>>>>>> preference
>>>>>>>>>>>> for
>>>>>>>>>>>>>> the name
>>>>>>>>>>>>>>>>>> “Serde” or “Serdes”, can we explore just using one of
>>>>>>> those?
>>>>>>>>>>>> Would
>>>>>>>>>>>>>> it cause
>>>>>>>>>>>>>>>>>> some kind of conflict to use
>>>>>>>>>>>> org.apache.kafka.streams.scala.Serde or
>>>>>>>>>>>>>> to use
>>>>>>>>>>>>>>>>>> Serdes in a different package, like
>>>>>>>>>>>>>>>>>> org.apache.kafka.streams.scala.implicit.Serdes?
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> I empathize with this desire. I faced the same dilemma
>>>>>>> when
>>>>>>>>> I
>>>>>>>>>>>> wanted
>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>> replace Processor but keep the class name in KIP-478. I
>>>>>>>>> wound up
>>>>>>>>>>>>>> creating a
>>>>>>>>>>>>>>>>>> new package for the new Processor.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>> John
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> On Wed, May 27, 2020, at 22:20, Yuriy Badalyantc wrote:
>>>>>>>>>>>>>>>>>>> Hi John,
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> I'm stick with the
>>>>>>> `org.apache.kafka.streams.scala.Serdes`
>>>>>>>>>>>> because
>>>>>>>>>>>>>> it's
>>>>>>>>>>>>>>>>>>> sort of conventional in the scala community. If you
>>>>>>> have a
>>>>>>>>>>>> typeclass
>>>>>>>>>>>>>>>>>> `Foo`,
>>>>>>>>>>>>>>>>>>> you probably will search `Foo` related stuff in the
>>>>>>> `Foo`
>>>>>>>>> or
>>>>>>>>>>>> maybe
>>>>>>>>>>>>>> `Foos`
>>>>>>>>>>>>>>>>>>> (plural). All other places are far less discoverable
>>>>>>> for
>>>>>>>>> the
>>>>>>>>>>>>>> developers.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> I agree that the migration path is a bit complex for
>>>>>>> such
>>>>>>>>>>>> change.
>>>>>>>>>>>>>> But I
>>>>>>>>>>>>>>>>>>> think it's more important to provide good developer
>>>>>>>>> experience
>>>>>>>>>>>> than
>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>> simplify migration. Also, I think it's debatable which
>>>>>>>>>>>> migration
>>>>>>>>>>>>>> path is
>>>>>>>>>>>>>>>>>>> better for library users. If we would create, for
>>>>>>> example,
>>>>>>>>>>>>>> `Serdes2`,
>>>>>>>>>>>>>>>>>>> library users will have to modify their code if they
>>>>>>> used
>>>>>>>>> any
>>>>>>>>>>>> part
>>>>>>>>>>>>>> of the
>>>>>>>>>>>>>>>>>>> old `Serde`. With my approach, most of the old code
>>>>>>> will
>>>>>>>>> still
>>>>>>>>>>>> work
>>>>>>>>>>>>>>>>>> without
>>>>>>>>>>>>>>>>>>> changes. Only explicit usage of implicits will need to
>>>>>>> be
>>>>>>>>> fixed
>>>>>>>>>>>>>> (because
>>>>>>>>>>>>>>>>>>> names will be changed, and old names will be
>>>>>>> deprecated).
>>>>>>>>>>>> Wildcard
>>>>>>>>>>>>>>>>>> imports
>>>>>>>>>>>>>>>>>>> will work without changes and will not lead to a name
>>>>>>>>> clash.
>>>>>>>>>>>>>> Moreover,
>>>>>>>>>>>>>>>>>> many
>>>>>>>>>>>>>>>>>>> users may not notice name clash problems. And with my
>>>>>>>>> migration
>>>>>>>>>>>>>> path,
>>>>>>>>>>>>>>>>>> they
>>>>>>>>>>>>>>>>>>> will not notice any changes at all.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> - Yuriy
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> On Thu, May 28, 2020 at 7:48 AM John Roesler <
>>>>>>>>>>>> vvcep...@apache.org>
>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Hi Yuriy,
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Thanks for the reply. I guess I've been out of the
>>>>>>> Scala
>>>>>>>>> game
>>>>>>>>>>>> for a
>>>>>>>>>>>>>>>>>>>> while; all this summoner business is totally new to
>>>>>>> me.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> I think I followed the rationale you provided, but I
>>>>>>> still
>>>>>>>>>>>> don't
>>>>>>>>>>>>>> see
>>>>>>>>>>>>>>>>>>>> why you can't implement your whole plan in a new
>>>>>>> class.
>>>>>>>>> What
>>>>>>>>>>>>>>>>>>>> is special about the existing Serdes class?
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>> -John
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> On Tue, May 19, 2020, at 01:18, Yuriy Badalyantc
>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>> Hi John,
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Your suggestion looks interesting. I think it's
>>>>>>>>> technically
>>>>>>>>>>>>>> doable.
>>>>>>>>>>>>>>>>>> But
>>>>>>>>>>>>>>>>>>>> I'm
>>>>>>>>>>>>>>>>>>>>> not sure that this is the better solution. I will
>>>>>>> try to
>>>>>>>>>>>> explain.
>>>>>>>>>>>>>>>>>> From
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>> scala developers' perspective, `Serde` looks really
>>>>>>> like
>>>>>>>>> a
>>>>>>>>>>>>>> typeclass.
>>>>>>>>>>>>>>>>>>>>> Typical typeclass in pure scala will look like this:
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>>>> trait Serde[A] {
>>>>>>>>>>>>>>>>>>>>>   def serialize(data: A): Array[Byte]
>>>>>>>>>>>>>>>>>>>>>   def deserialize(data: Array[Byte]): A
>>>>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>>>>> object Serde extends DefaultSerdes {
>>>>>>>>>>>>>>>>>>>>>   // "summoner" function. With this I can write
>>>>>>>>> `Serde[A]`
>>>>>>>>>>>> and
>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>> serde
>>>>>>>>>>>>>>>>>>>>> will be implicitly summonned.
>>>>>>>>>>>>>>>>>>>>>   def apply[A](implicit ev: Serde[A]): Serde[A] = ev
>>>>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> trait DefaultSerdes {
>>>>>>>>>>>>>>>>>>>>>   // default instances here
>>>>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Usage example (note, that there are no wildcards
>>>>>>> imports
>>>>>>>>>>>> here):
>>>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>>>> object Main extends App {
>>>>>>>>>>>>>>>>>>>>>   import Serde // not wildcard import
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>   // explicit summonning:
>>>>>>>>>>>>>>>>>>>>>   val stringSerde = Serde[String] // using summoner
>>>>>>>>>>>>>>>>>>>>>   stringSerde.serialize(???)
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>   // implicit summonning
>>>>>>>>>>>>>>>>>>>>>   def serialize[A: Serde](a: A) = {
>>>>>>>>>>>>>>>>>>>>>     Serde[A].serialize(a) // summoner again
>>>>>>>>>>>>>>>>>>>>>   }
>>>>>>>>>>>>>>>>>>>>>   serialize("foo")
>>>>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Examples are pretty silly, but I just want to show
>>>>>>> common
>>>>>>>>>>>>>> patterns of
>>>>>>>>>>>>>>>>>>>>> working with typeclasses in scala. All default
>>>>>>> instances
>>>>>>>>> in
>>>>>>>>>>>> the
>>>>>>>>>>>>>> usage
>>>>>>>>>>>>>>>>>>>>> examples are found using implicits searching
>>>>>>> mechanism.
>>>>>>>>> Scala
>>>>>>>>>>>>>>>>>> compiler
>>>>>>>>>>>>>>>>>>>>> searches implicits in a lot of places. Including
>>>>>>>>> companion
>>>>>>>>>>>>>> objects.
>>>>>>>>>>>>>>>>>> In my
>>>>>>>>>>>>>>>>>>>>> examples compiler will found `Serde[String]`
>>>>>>> instance in
>>>>>>>>> the
>>>>>>>>>>>>>>>>>> companion
>>>>>>>>>>>>>>>>>>>>> object of `Serde` typeclass.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Also, I want to pay attention to the summoner
>>>>>>> function.
>>>>>>>>> It
>>>>>>>>>>>> makes
>>>>>>>>>>>>>>>>>> usage of
>>>>>>>>>>>>>>>>>>>>> typeclasses very neat and clear.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> The example above was the example of the perfect
>>>>>>> solution
>>>>>>>>>>>> for the
>>>>>>>>>>>>>>>>>> scala
>>>>>>>>>>>>>>>>>>>>> developers. But this solution requires to create
>>>>>>> separate
>>>>>>>>>>>> `Serde`
>>>>>>>>>>>>>>>>>>>>> typeclass, to make all this implicit searching stuff
>>>>>>>>> works. I
>>>>>>>>>>>>>> don't
>>>>>>>>>>>>>>>>>> think
>>>>>>>>>>>>>>>>>>>>> that it worth it, because a lot of code should be
>>>>>>>>>>>> reimplemented
>>>>>>>>>>>>>> using
>>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>> new typeclass. But the main point of my example is to
>>>>>>>>> show
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>> perfect
>>>>>>>>>>>>>>>>>>>>> solution. And I think we should strive to provide
>>>>>>>>> developer
>>>>>>>>>>>>>>>>>> experience
>>>>>>>>>>>>>>>>>>>>> close to this.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> It's a bit out of the scope of my KIP, but I have a
>>>>>>> plan
>>>>>>>>> to
>>>>>>>>>>>> make
>>>>>>>>>>>>>>>>>>>>> `org.apache.kafka.streams.scala.Serdes` more closer
>>>>>>> to
>>>>>>>>> the
>>>>>>>>>>>>>> solution
>>>>>>>>>>>>>>>>>>>> above.
>>>>>>>>>>>>>>>>>>>>> It could be done in 2 steps:
>>>>>>>>>>>>>>>>>>>>> 1. Fix implicit names.
>>>>>>>>>>>>>>>>>>>>> 2. Add summoner function.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> And with this scala developers will be able to write
>>>>>>>>> almost
>>>>>>>>>>>> the
>>>>>>>>>>>>>> same
>>>>>>>>>>>>>>>>>> code
>>>>>>>>>>>>>>>>>>>>> as in the example above:
>>>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>>>> object Main extends App {
>>>>>>>>>>>>>>>>>>>>>   import org.apache.kafka.streams.scala.Serdes // not
>>>>>>>>>>>> wildcard
>>>>>>>>>>>>>> import
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>   val stringSerde = Serdes[String]
>>>>>>>>>>>>>>>>>>>>>   stringSerde.serialize(???)
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>   def serialize[A: Serde](a: A) = {
>>>>>>>>>>>>>>>>>>>>>     Serdes[A].serialize(a)
>>>>>>>>>>>>>>>>>>>>>   }
>>>>>>>>>>>>>>>>>>>>>   serialize("foo")
>>>>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>>>> Of course, wildcard import will still work.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Other names will make this new entity (containing
>>>>>>> default
>>>>>>>>>>>>>> implicits)
>>>>>>>>>>>>>>>>>> less
>>>>>>>>>>>>>>>>>>>>> discoverable. And summoner usage, in this case, will
>>>>>>> look
>>>>>>>>>>>> weird:
>>>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>>>> object Main extends App {
>>>>>>>>>>>>>>>>>>>>>   import
>>>>>>> org.apache.kafka.streams.scala.DefaultSerdes //
>>>>>>>>> not
>>>>>>>>>>>>>> wildcard
>>>>>>>>>>>>>>>>>>>> import
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>   val stringSerde = DefaultSerdes[String]
>>>>>>>>>>>>>>>>>>>>>   stringSerde.serialize(???)
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>   def serialize[A: Serde](a: A) = {
>>>>>>>>>>>>>>>>>>>>>     DefaultSerdes[A].serialize(a)
>>>>>>>>>>>>>>>>>>>>>   }
>>>>>>>>>>>>>>>>>>>>>   serialize("foo")
>>>>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> So, I think it's more important to provide a solid
>>>>>>> and
>>>>>>>>>>>> familiar
>>>>>>>>>>>>>>>>>> developer
>>>>>>>>>>>>>>>>>>>>> experience for the scala developer. And renaming (or
>>>>>>>>>>>> creating a
>>>>>>>>>>>>>> new
>>>>>>>>>>>>>>>>>>>>> version) of `Serdes` will not help here.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> -Yuriy
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> On Tue, May 19, 2020 at 11:56 AM John Roesler <
>>>>>>>>>>>>>> vvcep...@apache.org>
>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Hi Yuriy,
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Thanks so much for the KIP! I didn’t anticipate the
>>>>>>>>> problem
>>>>>>>>>>>> you
>>>>>>>>>>>>>>>>>> laid
>>>>>>>>>>>>>>>>>>>> out
>>>>>>>>>>>>>>>>>>>>>> in the KIP, but I find it very plausible.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Thanks for pushing back on the “convention” and
>>>>>>> raising
>>>>>>>>> the
>>>>>>>>>>>>>> issue,
>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>> also volunteering a solution!
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> I’m wondering if we can “fix” it in one shot by just
>>>>>>>>>>>> deprecating
>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> whole
>>>>>>>>>>>>>>>>>>>>>> Serdes class and replacing it with a new one
>>>>>>> containing
>>>>>>>>> the
>>>>>>>>>>>> defs
>>>>>>>>>>>>>>>>>> you
>>>>>>>>>>>>>>>>>>>>>> proposed. Then, people could just switch their
>>>>>>> import to
>>>>>>>>>>>> the new
>>>>>>>>>>>>>>>>>> one.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Of course the new class needs to have a different
>>>>>>> name,
>>>>>>>>>>>> which is
>>>>>>>>>>>>>>>>>>>> always a
>>>>>>>>>>>>>>>>>>>>>> challenge in situations like this, so I might just
>>>>>>>>> throw out
>>>>>>>>>>>>>>>>>>>> ImplicitSerdes
>>>>>>>>>>>>>>>>>>>>>> as an option.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Do you think this would work?
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Thanks again,
>>>>>>>>>>>>>>>>>>>>>> John
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> On Mon, May 18, 2020, at 23:35, Yuriy Badalyantc
>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> I would like to propose KIP-616 to fix naming
>>>>>>> clash in
>>>>>>>>> the
>>>>>>>>>>>> kafka
>>>>>>>>>>>>>>>>>>>>>>> streams scala API:
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>
>>>>>>>
>>>>
>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-616%3A+Rename+implicit+Serdes+instances+in+kafka-streams-scala
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Looking forward to your feedback.
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> -Yuriy
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Attachments:
>>>>>>>>>>>>>>> * signature.asc
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>
>>>>
>>>
>>
> 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to