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 > > > >>>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>> > > > >>>>>>> > > > >>>>>> > > > >>>>> > > > >>>> > > > >>> > > > >> > > > > > > > > >