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

Reply via email to