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