Thanks for driving this thread Andrey. Conclusion looks good to me. Best, tison.
Andrey Zagrebin <and...@ververica.com> 于2019年8月21日周三 下午7:25写道: > FYI the PR: https://github.com/apache/flink-web/pull/251 > A review from the discussion participants would be appreciated. > > On Wed, Aug 21, 2019 at 1:23 PM Timo Walther <twal...@apache.org> wrote: > > > Thanks for summarizing the discussion Andrey, +1 to this style. > > > > Regards, > > Timo > > > > > > Am 21.08.19 um 11:57 schrieb Andrey Zagrebin: > > > Hi All, > > > > > > It looks like we have reached a consensus regarding the last left > > question. > > > > > > I suggest the following final summary: > > > > > > - Use @Nullable annotation where you do not use Optional for the > > > nullable values > > > - If you can prove that Optional usage would lead to a performance > > > degradation in critical code then fallback to @Nullable > > > - Always use Optional to return nullable values in the API/public > > > methods except the case of a proven performance concern > > > - Do not use Optional as a function argument, instead either > overload > > > the method or use the Builder pattern for the set of function > > arguments > > > - Note: an Optional argument can be allowed in a *private* > helper > > > method if you believe that it simplifies the code, example is in > > [1] > > > - Do not use Optional for class fields > > > > > > If there are no more comments/concerns/objections I will open a PR to > > > reflect this in the code style guide. > > > > > > Bets, > > > Andrey > > > > > > [1] > > > > > > https://github.com/apache/flink/blob/master/flink-formats/flink-avro/src/main/java/org/apache/flink/formats/avro/typeutils/AvroFactory.java#L95 > > > > > > On Tue, Aug 20, 2019 at 10:35 AM Yu Li <car...@gmail.com> wrote: > > > > > >> Thanks for the summarize Andrey! > > >> > > >> I'd also like to adjust my -1 to +0 on using Optional as parameter for > > >> private methods due to the existence of the very first rule - "Avoid > > using > > >> Optional in any performance critical code". I'd regard the "possible > GC > > >> burden while using Optional as parameter" also one performance related > > >> factor. > > >> > > >> And besides the code convention itself, I believe it's even more > > important > > >> to make us contributors know the reason behind. > > >> > > >> Thanks. > > >> > > >> Best Regards, > > >> Yu > > >> > > >> > > >> On Tue, 20 Aug 2019 at 10:14, Stephan Ewen <se...@apache.org> wrote: > > >> > > >>> I think Dawid raised a very good point here. > > >>> One of the outcomes should be that we are consistent in our > > >> recommendations > > >>> and requests during PR reviews. Otherwise we'll just confuse > > >> contributors. > > >>> So I would be > > >>> +1 for someone to use Optional in a private method if they believe > > it > > >> is > > >>> helpful > > >>> -1 to push contributors during reviews to do that > > >>> > > >>> > > >>> On Tue, Aug 20, 2019 at 9:42 AM Dawid Wysakowicz < > > dwysakow...@apache.org > > >>> > > >>> wrote: > > >>> > > >>>> Hi Andrey, > > >>>> > > >>>> Just wanted to quickly elaborate on my opinion. I wouldn't say I am > > -1, > > >>>> just -0 for the Optionals in private methods. I am ok with not > > >>>> forbidding them there. I just think in all cases there is a better > > >>>> solution than passing the Optionals around, even in private > methods. I > > >>>> just hope the outcome of the discussion won't be that it is no > longer > > >>>> allowed to suggest those during review. > > >>>> > > >>>> Best, > > >>>> > > >>>> Dawid > > >>>> > > >>>> On 19/08/2019 17:53, Andrey Zagrebin wrote: > > >>>>> Hi all, > > >>>>> > > >>>>> Sorry for not getting back to this discussion for some time. > > >>>>> It looks like in general we agree on the initially suggested > points: > > >>>>> > > >>>>> - Always use Optional only to return nullable values in the > > >>> API/public > > >>>>> methods > > >>>>> - Only if you can prove that Optional usage would lead to a > > >>>>> performance degradation in critical code then return > nullable > > >>> value > > >>>>> directly and annotate it with @Nullable > > >>>>> - Passing an Optional argument to a method can be allowed if it > > is > > >>>>> within a private helper method and simplifies the code > > >>>>> - Optional should not be used for class fields > > >>>>> > > >>>>> The first point can be also elaborated by explicitly forbiding > > >>>>> Optional/Nullable parameters in public methods. > > >>>>> In general we can always avoid Optional parameters by either > > >>> overloading > > >>>>> the method or using a pojo with a builder to pass a set of > > >> parameters. > > >>>>> The third point does not prevent from using @Nullable/@Nonnull for > > >>> class > > >>>>> fields. > > >>>>> If we agree to not use Optional for fields then not sure I see any > > >> use > > >>>> case > > >>>>> for SerializableOptional (please comment on that if you have more > > >>>> details). > > >>>>> @Jingsong Lee > > >>>>> Using Optional in Maps. > > >>>>> I can see this as a possible use case. > > >>>>> I would leave this decision to the developer/reviewer to reason > about > > >>> it > > >>>>> and keep the scope of this discussion to the variables/parameters > as > > >> it > > >>>>> seems to be the biggest point of friction atm. > > >>>>> > > >>>>> Finally, I see a split regarding the second point: <Passing an > > >> Optional > > >>>>> argument to a method can be allowed if it is within a private > helper > > >>>> method > > >>>>> and simplifies the code>. > > >>>>> There are people who have a strong opinion against allowing it. > > >>>>> Let's vote then for whether to allow it or not. > > >>>>> So far as I see we have the following votes (correct me if wrong > and > > >>> add > > >>>>> more if you want): > > >>>>> Piotr +1 > > >>>>> Biao +1 > > >>>>> Timo -1 > > >>>>> Yu -1 > > >>>>> Aljoscha -1 > > >>>>> Till +1 > > >>>>> Igal +1 > > >>>>> Dawid -1 > > >>>>> Me +1 > > >>>>> > > >>>>> So far: +5 / -4 (Optional arguments in private methods) > > >>>>> > > >>>>> Best, > > >>>>> Andrey > > >>>>> > > >>>>> > > >>>>> On Tue, Aug 6, 2019 at 8:53 AM Piotr Nowojski <pi...@ververica.com > > > > >>>> wrote: > > >>>>>> Hi Qi, > > >>>>>> > > >>>>>>> For example, SingleInputGate is already creating Optional for > every > > >>>>>> BufferOrEvent in getNextBufferOrEvent(). How much performance gain > > >>>> would we > > >>>>>> get if it’s replaced by null check? > > >>>>>> > > >>>>>> When I was introducing it there, I have micro-benchmarked this > > >> change, > > >>>> and > > >>>>>> there was no visible throughput change in a pure network only > micro > > >>>>>> benchmark (with whole Flink running around it any changes would be > > >>> even > > >>>>>> less visible). > > >>>>>> > > >>>>>> Piotrek > > >>>>>> > > >>>>>>> On 5 Aug 2019, at 15:20, Till Rohrmann <trohrm...@apache.org> > > >> wrote: > > >>>>>>> I'd be in favour of > > >>>>>>> > > >>>>>>> - Optional for method return values if not performance critical > > >>>>>>> - Optional can be used for internal methods if it makes sense > > >>>>>>> - No optional fields > > >>>>>>> > > >>>>>>> Cheers, > > >>>>>>> Till > > >>>>>>> > > >>>>>>> On Mon, Aug 5, 2019 at 12:07 PM Aljoscha Krettek < > > >>> aljos...@apache.org> > > >>>>>>> wrote: > > >>>>>>> > > >>>>>>>> Hi, > > >>>>>>>> > > >>>>>>>> I’m also in favour of using Optional only for method return > > >> values. > > >>> I > > >>>>>>>> could be persuaded to allow them for parameters of internal > > >> methods > > >>>> but > > >>>>>> I’m > > >>>>>>>> sceptical about that. > > >>>>>>>> > > >>>>>>>> Aljoscha > > >>>>>>>> > > >>>>>>>>> On 2. Aug 2019, at 15:35, Yu Li <car...@gmail.com> wrote: > > >>>>>>>>> > > >>>>>>>>> TL; DR: I second Timo that we should use Optional only as > method > > >>>> return > > >>>>>>>>> type for non-performance critical code. > > >>>>>>>>> > > >>>>>>>>> From the example given on our AvroFactory [1] I also noticed > > that > > >>>>>>>> Jetbrains > > >>>>>>>>> marks the OptionalUsedAsFieldOrParameterType inspection as a > > >>> warning. > > >>>>>>>> It's > > >>>>>>>>> relatively easy to understand why it's not suggested to use > > >>>> (java.util) > > >>>>>>>>> Optional as a field since it's not serializable. What made me > > >> feel > > >>>>>>>> curious > > >>>>>>>>> is that why we shouldn't use it as a parameter type, so I did > > >> some > > >>>>>>>>> investigation and here is what I found: > > >>>>>>>>> > > >>>>>>>>> There's a JB blog talking about java8 top tips [2] where we > could > > >>>> find > > >>>>>>>> the > > >>>>>>>>> advice around Optional, there I found another blog telling > about > > >>> the > > >>>>>>>>> pragmatic approach of using Optional [3]. Reading further we > > >> could > > >>>> see > > >>>>>>>> the > > >>>>>>>>> reason why we shouldn't use Optional as parameter type, please > > >>> allow > > >>>> me > > >>>>>>>> to > > >>>>>>>>> quote here: > > >>>>>>>>> > > >>>>>>>>> It is often the case that domain objects hang about in memory > > >> for a > > >>>>>> fair > > >>>>>>>>> while, as processing in the application occurs, making each > > >>> optional > > >>>>>>>>> instance rather long-lived (tied to the lifetime of the domain > > >>>> object). > > >>>>>>>> By > > >>>>>>>>> contrast, the Optionalinstance returned from the getter is > likely > > >>> to > > >>>> be > > >>>>>>>>> very short-lived. The caller will call the getter, interpret > the > > >>>>>> result, > > >>>>>>>>> and then move on. If you know anything about garbage collection > > >>>> you'll > > >>>>>>>> know > > >>>>>>>>> that the JVM handles these short-lived objects well. In > addition, > > >>>> there > > >>>>>>>> is > > >>>>>>>>> more potential for hotspot to remove the costs of the Optional > > >>>> instance > > >>>>>>>>> when it is short lived. While it is easy to claim this is > > >>> "premature > > >>>>>>>>> optimization", as engineers it is our responsibility to know > the > > >>>> limits > > >>>>>>>> and > > >>>>>>>>> capabilities of the system we work with and to choose carefully > > >> the > > >>>>>> point > > >>>>>>>>> where it should be stressed. > > >>>>>>>>> > > >>>>>>>>> And there's another JB blog about code smell on Null [4], which > > >> I'd > > >>>>>> also > > >>>>>>>>> suggest to read(smile). > > >>>>>>>>> > > >>>>>>>>> [1] > > >>>>>>>>> > > >> > > > https://github.com/apache/flink/blob/master/flink-formats/flink-avro/src/main/java/org/apache/flink/formats/avro/typeutils/AvroFactory.java#L95 > > >>>>>>>>> [2] https://blog.jetbrains.com/idea/2016/07/java-8-top-tips/ > > >>>>>>>>> [3] > > >> > > https://blog.joda.org/2015/08/java-se-8-optional-pragmatic-approach.html > > >>>>>>>>> [4] https://blog.jetbrains.com/idea/2017/08/code-smells-null/ > > >>>>>>>>> > > >>>>>>>>> Best Regards, > > >>>>>>>>> Yu > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> On Fri, 2 Aug 2019 at 14:54, JingsongLee < > > >> lzljs3620...@aliyun.com > > >>>>>>>> .invalid> > > >>>>>>>>> wrote: > > >>>>>>>>> > > >>>>>>>>>> Hi, > > >>>>>>>>>> First, Optional is just a wrapper, just like boxed value. So > as > > >>> long > > >>>>>> as > > >>>>>>>>>> it's > > >>>>>>>>>> not a field level operation, I think it is OK to performance. > > >>>>>>>>>> I think guava optional has a good summary to the uses. [1] > > >>>>>>>>>>> As a method return type, as an alternative to returning null > to > > >>>>>>>> indicate > > >>>>>>>>>> that no value was available > > >>>>>>>>>>> To distinguish between "unknown" (for example, not present > in a > > >>>> map) > > >>>>>>>>>> and "known to have no value" > > >>>>>>>>>>> To wrap nullable references for storage in a collection that > > >> does > > >>>> not > > >>>>>>>>>> support > > >>>>>>>>>> The latter two points seem reasonable, but they have few > scenes. > > >>>>>>>>>> > > >>>>>>>>>> [1] > > >>>>>>>>>> > > >> > > > https://github.com/google/guava/blob/master/guava/src/com/google/common/base/Optional.java > > >>>>>>>>>> Best, > > >>>>>>>>>> Jingsong Lee > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> > > >> ------------------------------------------------------------------ > > >>>>>>>>>> From:Timo Walther <twal...@apache.org> > > >>>>>>>>>> Send Time:2019年8月2日(星期五) 14:12 > > >>>>>>>>>> To:dev <dev@flink.apache.org> > > >>>>>>>>>> Subject:Re: [DISCUSS][CODE STYLE] Usage of Java Optional > > >>>>>>>>>> > > >>>>>>>>>> Hi everyone, > > >>>>>>>>>> > > >>>>>>>>>> I would vote for using Optional only as method return type for > > >>>>>>>>>> non-performance critical code. Nothing more. No fields, no > > >> method > > >>>>>>>>>> parameters. Method parameters can be overloaded and > internally a > > >>>> class > > >>>>>>>>>> can work with nulls and @Nullable. Optional is meant for API > > >>> method > > >>>>>>>>>> return types and I think we should not abuse it and spam the > > >> code > > >>>> with > > >>>>>>>>>> `@SuppressWarnings("OptionalUsedAsFieldOrParameterType")`. > > >>>>>>>>>> > > >>>>>>>>>> Regards, > > >>>>>>>>>> > > >>>>>>>>>> Timo > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> Am 02.08.19 um 11:08 schrieb Biao Liu: > > >>>>>>>>>>> Hi Jark & Zili, > > >>>>>>>>>>> > > >>>>>>>>>>> I thought it means "Optional should not be used for class > > >>> fields". > > >>>>>>>>>> However > > >>>>>>>>>>> now I get a bit confused about the edited version. > > >>>>>>>>>>> > > >>>>>>>>>>> Anyway +1 to "Optional should not be used for class fields" > > >>>>>>>>>>> > > >>>>>>>>>>> Thanks, > > >>>>>>>>>>> Biao /'bɪ.aʊ/ > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> On Fri, Aug 2, 2019 at 5:00 PM Zili Chen < > wander4...@gmail.com > > >>>>>> wrote: > > >>>>>>>>>>>> Hi Jark, > > >>>>>>>>>>>> > > >>>>>>>>>>>> Follow your opinion, for class field, we can make > > >>>>>>>>>>>> use of @Nullable/@Nonnull annotation or Flink's > > >>>>>>>>>>>> SerializableOptional. It would be sufficient. > > >>>>>>>>>>>> > > >>>>>>>>>>>> Best, > > >>>>>>>>>>>> tison. > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> Jark Wu <imj...@gmail.com> 于2019年8月2日周五 下午4:57写道: > > >>>>>>>>>>>> > > >>>>>>>>>>>>> Hi Andrey, > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> I have some concern on point (3) "even class fields as e.g. > > >>>>>> optional > > >>>>>>>>>>>> config > > >>>>>>>>>>>>> options with implicit default values". > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> Regarding to the Oracle's guide (4) "Optional should not be > > >>> used > > >>>>>> for > > >>>>>>>>>>>> class > > >>>>>>>>>>>>> fields". > > >>>>>>>>>>>>> And IntelliJ IDEA also report warnings if a class field is > > >>>>>> Optional, > > >>>>>>>>>>>>> because Optional is not serializable. > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> Do we allow Optional as class field only if the class is > not > > >>>>>>>>>> serializable > > >>>>>>>>>>>>> or forbid this totally? > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> Thanks, > > >>>>>>>>>>>>> Jark > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> On Fri, 2 Aug 2019 at 16:30, Biao Liu <mmyy1...@gmail.com> > > >>>> wrote: > > >>>>>>>>>>>>>> Hi Andrey, > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Thanks for working on this. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> +1 it's clear and acceptable for me. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> To Qi, > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> IMO the most performance critical codes are "per record" > > >> code > > >>>>>> path. > > >>>>>>>> We > > >>>>>>>>>>>>>> should definitely avoid Optional there. For your concern, > > >> it's > > >>>>>> "per > > >>>>>>>>>>>>> buffer" > > >>>>>>>>>>>>>> code path which seems to be acceptable with Optional. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Just one more question, is there any other code paths > which > > >>> are > > >>>>>> also > > >>>>>>>>>>>>>> critical? I think we'd better note that clearly. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Thanks, > > >>>>>>>>>>>>>> Biao /'bɪ.aʊ/ > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> On Fri, Aug 2, 2019 at 11:08 AM qi luo < > luoqi...@gmail.com> > > >>>>>> wrote: > > >>>>>>>>>>>>>>> Agree that using Optional will improve code robustness. > > >>> However > > >>>>>>>> we’re > > >>>>>>>>>>>>>>> hesitating to use Optional in data intensive operations. > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> For example, SingleInputGate is already creating Optional > > >> for > > >>>>>> every > > >>>>>>>>>>>>>>> BufferOrEvent in getNextBufferOrEvent(). How much > > >> performance > > >>>>>> gain > > >>>>>>>>>>>>> would > > >>>>>>>>>>>>>> we > > >>>>>>>>>>>>>>> get if it’s replaced by null check? > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> Regards, > > >>>>>>>>>>>>>>> Qi > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> On Aug 1, 2019, at 11:00 PM, Andrey Zagrebin < > > >>>>>>>> and...@ververica.com > > >>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>> Hi all, > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> This is the next follow up discussion about suggestions > > >> for > > >>>> the > > >>>>>>>>>>>>> recent > > >>>>>>>>>>>>>>>> thread about code style guide in Flink [1]. > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> In general, one could argue that any variable, which is > > >>>>>> nullable, > > >>>>>>>>>>>> can > > >>>>>>>>>>>>>> be > > >>>>>>>>>>>>>>>> replaced by wrapping it with Optional to explicitly show > > >>> that > > >>>> it > > >>>>>>>>>>>> can > > >>>>>>>>>>>>> be > > >>>>>>>>>>>>>>>> null. Examples are: > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> - returned values to force user to check not null > > >>>>>>>>>>>>>>>> - optional function arguments, e.g. with implicit > > default > > >>>>>> values > > >>>>>>>>>>>>>>>> - even class fields as e.g. optional config options > with > > >>>>>>>> implicit > > >>>>>>>>>>>>>>>> default values > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> At the same time, we also have @Nullable annotation to > > >>> express > > >>>>>>>> this > > >>>>>>>>>>>>>>>> intention. > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> Also, when the class Optional was introduced, Oracle > > >> posted > > >>> a > > >>>>>>>>>>>>> guideline > > >>>>>>>>>>>>>>>> about its usage [2]. Basically, it suggests to use it > > >> mostly > > >>>> in > > >>>>>>>>>>>> APIs > > >>>>>>>>>>>>>> for > > >>>>>>>>>>>>>>>> returned values to inform and force users to check the > > >>>> returned > > >>>>>>>>>>>> value > > >>>>>>>>>>>>>>>> instead of returning null and avoid > NullPointerException. > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> Wrapping with Optional also comes with the performance > > >>>> overhead. > > >>>>>>>>>>>>>>>> Following the Oracle's guide in general, the suggestion > > >> is: > > >>>>>>>>>>>>>>>> - Avoid using Optional in any performance critical > code > > >>>>>>>>>>>>>>>> - Use Optional only to return nullable values in the > > >>>> API/public > > >>>>>>>>>>>>>> methods > > >>>>>>>>>>>>>>>> unless it is performance critical then rather use > > >> @Nullable > > >>>>>>>>>>>>>>>> - Passing an Optional argument to a method can be > > allowed > > >>> if > > >>>> it > > >>>>>>>>>>>> is > > >>>>>>>>>>>>>>>> within a private helper method and simplifies the > code, > > >>>> example > > >>>>>>>>>>>> is > > >>>>>>>>>>>>> in > > >>>>>>>>>>>>>>> [3] > > >>>>>>>>>>>>>>>> - Optional should not be used for class fields > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> Please, feel free to share you thoughts. > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> Best, > > >>>>>>>>>>>>>>>> Andrey > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> [1] > > >>>>>>>>>>>>>>>> > > >> > > > http://mail-archives.apache.org/mod_mbox/flink-dev/201906.mbox/%3ced91df4b-7cab-4547-a430-85bc710fd...@apache.org%3E > > >>>>>>>>>>>>>>>> [2] > > >>>>>>>>>>>>>>>> > > >> > > > https://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html > > >>>>>>>>>>>>>>>> [3] > > >>>>>>>>>>>>>>>> > > >> > > > https://github.com/apache/flink/blob/master/flink-formats/flink-avro/src/main/java/org/apache/flink/formats/avro/typeutils/AvroFactory.java#L95 > > >>>>>>>>>> > > >>>> > > > > >