オブジェクト指向おじさん?

 私の盟友(?)ことみながわさんの日記が更新されたので覗いてみた。2016年1月29日の記事によると、とあるWEBの記事「staticおじさん」はなぜ自信満々なのかというのが目につく。
この手の記事に対しての警鐘は以前にも行ったのだが、未だにこういう煽り記事が出てくるということは出版業界はよっぽど不景気なのか?と邪推したくなる。
アメリカに留学して習った単語にobjectiveというのがあり日本語訳は客観的で、反対語はsubjective(主観的)になります。論文を書くときは客観的であれといわれます。といっても何が主観で何が客観か分からないでしょう。本当かウソか分かりませんがアメリカではこのobjectiveということを子供の頃から教わるらしいです。もっとも子供の頃にそんなことを習ったことのない日本人は文章を読むときに、何が主観的か客観的かが判断がつかないこともあるでしょう。ちなみに何の説明もなしに『普通はこうだ』とか、他にも記事を読んで『俺の意見を代弁していてくれる』と思ったら、その記事は主観的である可能性があります(主観的の定義に従えば自明ですよね)。

さて、元の記事にあるこの部分
 Javaでメソッドを呼び出すときにはクラスからインスタンスを生成してインスタンスのメソッドを呼び出すのが普通です。一方、staticメソッドはインスタンスを生成しなくてもクラスから直接呼び出せます。このため、オブジェクト指向プログラミングを理解していない古いタイプのプログラマは、Javaでもstaticメソッドを多用します。これを揶揄して「staticおじさん」と呼ぶのです。
これは、

インスタンスメソッドを使う→普通
staticメソッドを多用する→プログラマがオブジェクト指向を理解していない可能性あり

と読み取れます。思わず普通ってなんやねん?と突っ込みたくなるのですが、
そろそろこのインスタンスメソッドを使うのが普通という誤謬を解きたいのですが、staticメソッドは場合によっては推奨されています。
期待するコードを期待するように書こうという本から引用させていただくと
クラスのメンバへのアクセスを制限するもう一つの方法は、メソッドを出来るだけstatic にすることだ
このReadable codeという本は私は英語版を購入したのですがそこでも同様のことが書かれています。


また、英語が読める人は、static methodで検索をかければいろいろ議論を見ることができます。たとえば以下のQAたち
https://www.quora.com/Why-is-using-statics-Static-method-block-variable-in-Java-programming-bad-programming http://programmers.stackexchange.com/questions/98083/cant-i-just-use-all-static-methods
ここでは、インスタンスメソッドを使うのが普通とか訳のわからん理由ではなくきちんと事実に則って議論がされています。
事実(fact)に則って議論するということは客観的(objective)な議論ができているということになるでしょう。

ざっくりとまとめますと、staticメソッドを使うと

欠点:継承ができなくなる。ポリモーフィズムも使えなくなる。
利点:メンバー変数へのアクセスを制限できる。パフォーマンスが上がる。

ということです。他のものは自明として、利点のところで『パフォーマンスが上がる』かは検証の必要があるのですが、ポリモーフィズムはオーバヘッドを発生させるのでそれを使わなければパフォーマンスがあがる可能性はあります。
また欠点の中で、『ややこしくなる』という意見もあったのですが、これは主観的な意見でしょう。たとえばstaticメソッドを使いなれた人はむしろすっきりとすると考るかもしれません。

さて、継承もポリモーフィズムも使わないということであれば、staticメソッドを使ってもよいということになるのですが、この反論として、『オブジェクト指向でなくなる』というのがあります。もはや手段と目的が混同されているとしか言いようがない意見でいやはや疲れます。
まぁ一介の無名なエンジニアが何をいっても仕方がないのでもっと説得力のある例を出しましょう。
επιστημη さんという著名なライターさんがいらっしゃいますが、彼は思い切りstatic メソッドを使っておられます。
http://blogs.wankuma.com/episteme/archive/2012/12/28/310396.aspx のコードのrefereeクラスがそれに当たります。refereeクラスには3つのメソッドがありますが、すべてstaticメソッドになっています。
つまり、事実としてstaticメソッドは使うときは使うのです。ちなみにもちろんですが、επιστημη さんがオブジェクト指向を理解していないということはないでしょう。

という訳で、
 ただ、現実に年齢を重ねると、どうしても守りに入りがちなのは事実です。「自分はstaticおじさんなのではないか」という問いは、常に忘れてはならないのでしょう。
というヒマがあったら自身が思わぬ誤謬をしていないか記事の検証を行うことを勧めます。

2/4追記
 コメント欄で文意を汲み取っていないという指摘を受けましたが、まぁ充分文意を汲み取って反論をしているのですがどうも分かりづらいかもしれないので、補足します。

 ただ、現実に年齢を重ねると、どうしても守りに入りがちなのは事実です。「自分はstaticおじさんなのではないか」という問いは、常に忘れてはならないのでしょう。

こういう教示的な文章は一見ごもっとなことのように受け取れますが、冷静に読めば分かりますとおり、ど素人でも同様のアドバイスができるでしょう(例を出すとサッカーや野球観戦をしているおっさんが野次っているさまと同じと言えば納得できるでしょうか?)。
社会人としては自分を律したり反省することは歳をとろうが若かろうが、技術者であろうがなかろうが、常に必要でいちいちアマチュアに指摘されることではないです。

そうはいっても100歩譲って、プログラミングに携わるプロが
『(引用先の記事に書かれてるニュアンスでの)自分はstaticおじさんではないか?』
と自問するということはどういうことでしょうか?
つまり、『staticは使えるのか?使えないのか?』という正に私がここで行っている議論をすることです。
そしてまさに

インスタンスメソッドを使う→普通
staticメソッドを多用する→プログラマがオブジェクト指向を理解していない可能性あり

こういう意見が20年前はともかく今となっては偏見に基づく誤謬でしかないということを認識することが重要だと言いたいわけです。プロなら気づきましょうということと、素人なら知ったかぶりをするのはやめましょう、という話です。
2016-01-31 | コメント:61件
nagiより
2016-02-03 22:37:36
初めてのコメントですが失礼します。

技術的には否定することはほとんどありません。

ですが、対象記事の文意を汲みとった上で発言されたほうがよろしいと思われます。
少なくとも不特定多数が見れる"インターネット上"に公開されているのです。

文意が汲み取れていないので最後の4行(引用2行含む)は意味がありません。
ohfujiより
2016-02-04 12:03:50
コメントありがとうございます。

私は、記事で主観的と客観的という言葉を使い議論は客観的であるべきと言いましたが、どうも伝わっていないようです。
まず、私が『文意が汲み取れていないので』とおっしゃるのならきちんと根拠を示してください。あなたが何を思うと勝手ですがコメントをするからには根拠が必要でしょう。これを客観性を持たせるといいます。
また、
『文意が汲み取れていないので』ということと『最後の4行は意味がない』
というのもなぜ因果関係がでてくるのかきちんと説明してください。

繰り返しますが、議論は客観的に行いましょう。と言ってもどういうことか分からようなのと、記事も読み返せば不親切(私には当たり前すぎたのですが)だったかもしれませんので後程補足します。

nagiより
2016-02-04 21:48:49
コメントより追記されたのですね。
お疲れ様です。

ですが、申し訳ありませんが意味は無いと思います。
まず、批判対象記事(でよろしいでしょうか)【「staticおじさん」はなぜ自信満々なのか】について。

こちらお読みになればほとんどの方は【技術的】な話をしていないと感じられるでしょう。

ですが、ohfujiさんは技術的見地で反論をお書きになられています。
議論のベースとなるスタート地点に立ってないにもかかわらず、
横から議論とは程遠い反論をされているので
私は「文意を汲みとった上で発言されてたほうがよい」と記載させていただきました。

記事から引用させていただきますが、
<ここから>
なお、Javaのstaticメソッドを多用する人に限らず、古い感覚にとらわれて周囲に迷惑をまき散らすプログラマをstaticおじさんと象徴的に呼ぶこともあります。
この記事では、staticおじさんという言葉をこの意味で使うことにします。
<ここまで>
つまり、技術的見地ではなく精神面にフォーカスを当ててこのstaticおじさんという言葉を使用すると前置きし
本題に入られています。
あくまで、その前段階はプログラム用語がわからない方を対象にstaticおじさんという言葉は
どのような経緯で誕生したかを説明しているにすぎません。

よって、導入部分を読み違えているに関わらず、記事筆者の結論を技術的見地で反論されている
ohfujiさんへの私の感想は【技術的に否定はしないけれども記事の文意を汲みとったほうが良い】になるわけです。
よって、議論のスタート地点にも立たれていないので、議論における主観・客観は既に意味をなしておりません。

以上です。
もしご反論されるのであれば、技術的見地ではなく、
【古い感覚にとらわれて周囲に迷惑をまき散らす人】について考えた上で
記事へのご感想をされるとよろしいかと思います。
ohfujiより
2016-02-04 22:40:50
コメントありがとうございます。

長々と書かれていますが一つ一つの議論に、根拠を示していないのを、お気づきにならないでしょうか?
2つポイントを示します。

1.ある記事を読んで人がどう感じ・反応するかは人それぞれです。自分とは違う意見だからお前は読み間違えているというのは今回は根拠としては当てはまらないでしょう。さらに『ほとんどの方は【技術的】な話をしていないと感じられるでしょう。』というのはきちんと根拠を示さないと、『あなたの感じ方』を誇張しているにすぎません。

2.【古い感覚にとらわれて周囲に迷惑をまき散らす人】について考えた上で記事へのご感想をされるとよろしいかと思います。
技術的に誤謬がある記事は、まさに【古い感覚にとらわれて周囲に迷惑をまき散らす人】と私は主張しています。ご理解できないでしょうか?

再度繰り返しますが、議論は客観的に行ってください。何か意見を述べる場合はきちんと根拠を示してください。

nagiより
2016-02-04 23:42:17
1について
その後の引用よりの部分で、【前置きとして定義しているため技術的見地による話はしません】記者が明言しています。
その後、どちらが望ましいかの技術的見地は示していないのがその証拠です。
勿論どう感じ・反応するかは人それぞれです。
ですが、前提部分を覆して【前置き】を無視する手法は議論になりません。

2について
1と同様に前置きを無視しているので議論のスタートに全く立てていません。

再度繰り返しますがもう少し文意を汲み取る努力をされたほうがよろしいかと思います。
何か意見を述べる場合はきちんと引用対象の前提に沿った内容を書かれたほうがよろしいかと思います。

またこれは議論ではなく感想ですので、客観的ではなく私個人の主観的に述べさせて頂いております。

もし、技術的見地よりstaticとインスタンスによる違いをお書きになれたければ
まず双方のメリット・デメリット/望ましいシチュエーションを双方客観的に具体例とともに書き、
それを総合的に判断して主観的に訴えればよろしいと思います。
プレゼンテーションにおけるもっとも基礎部分だと思いますが、ご存知ですよね。
まぁ、結論はケースバイケースで技術的見地では
staticで行うかインスタンスで行うかはその処理と望まれている仕様と縛りによるものでしょう。
なので技術的には反論はございません。と3度書いております。
よろしいでしょうか?
ohfujiより
2016-02-05 00:25:00
素早いレスありがとうございます。
しかしながらもう少し考えてご返信いただければ幸いです。

『技術的な話をしない』ことは『技術的な反論を受け付けない』ということではないでしょう。何か誤解されていませんか?

また、
>またこれは議論ではなく感想ですので、客観的ではなく私個人の主観的に述べさせて頂いております。

あなたが以下のように私に何かアドバイスされる場合、

>再度繰り返しますがもう少し文意を汲み取る努力をされたほうがよろしいかと思います。

感想だろうとなんだろうと、きちんとした根拠が必要でしょう。

次はコメントの掲載は明日以降に行います。従いまして少し練ってからご返信いただければ幸いです(穴だらけです)。
ohfujiより
2016-02-05 14:07:54
さて、コメントを練っておられるようですが、追加で質問を1つ追加します。

<ここから>
なお、Javaのstaticメソッドを多用する人に限らず、古い感覚にとらわれて周囲に迷惑をまき散らすプログラマをstaticおじさんと象徴的に呼ぶこともあります。
この記事では、staticおじさんという言葉をこの意味で使うことにします。
<ここまで>
>その後の引用よりの部分で、【前置きとして定義しているため技術的見地による話はしません】記者が明言しています。
>その後、どちらが望ましいかの技術的見地は示していないのがその証拠です。

『技術的見地による話はしません】記者が明言しています。』とありますが、明言している箇所を明示してください。

『この記事では、staticおじさんという言葉をこの意味で使うことにします。』ということは、技術的見地による話はしませんと明言することにはならないでしょう。
単にstaticおじさんという言葉の定義を示しただけです。

さて、私はあなたのコメントの間違いを指摘したのですが、以下の引用にありますとおり、

<ここから>
staticおじさんは、あまり外に出ようとしません。例えば、自分よりも優秀なプログラマやプログラミングの専門家に会おうとはしませんし、優秀なプログラマが集っているコミュニティにも参加しようとしません。こうした人々との間に厚い壁を作って拒絶しています。自分が書いたブログや書籍などの技術的な誤りを専門家に指摘されても、絶対に認めません。誤りを指摘してくれた人が専門家であることすら知らないのかもしれません。
<ここまで>

(記事の定義による)staticおじさんは間違いを認めようとしないらしいですね。さてあなたはどうでしょうか?
nagiより
2016-02-05 22:22:19
まず、誤解を招いた箇所を謝罪させていただきます。
確かに
>『技術的見地による話はしません】記者が明言しています。』とありますが、明言している箇所を明示してください。
明言(明記)している箇所はございませんでした。

では、先に議論における前提条件について、お話させていただきます。
議論をするにあたり、対象(今回)は【「staticおじさん」はなぜ自信満々なのか】という記事ですね。
こちらの前提条件とはなんでしょうか。
少なくとも、私が記載したとおり、引用部を略して申し上げると
【古い感覚にとらわれて周囲に迷惑をまき散らすプログラマをstaticおじさん】について論じられている記事になります。

こちらは私とohfujiさんに認識の違いはないでしょうか?

これを前提として以下を書かせていただきます。
まず議論するにあたり前提条件があやふやになっているものはそもそも議論になりえません。
前提条件の見直し、その前提条件を明記した上で論を(この場合技術的見地を)記載されると良いと思われます。
ohfujiさんはこの【古い感覚にとらわれて周囲に迷惑をまき散らすプログラマをstaticおじさん】を前提として
ブログを書かれているでしょうか?

違いますよね?
よって、反【論】にはなっていないし、結【論】は別物になるので
最後は蛇足だと私はコメントを書かせていただいているつもりです。

ですが、ohfujiさんの場合、【論】になっていると主張されているのです。

記事に対して反論をされたいのであれば筆者が定義している前提条件に乗って論ずるべきです。
ですが、導入部分の「staticおじさんという言葉の誕生の経緯」にのみフォーカスを当てているので文意を汲みとってはいかがですか?と書かせていただいています。

あと、これは本当に関係ない蛇足ですが、煽り酷すぎませんか?
まず、
>さて、コメントを練っておられるようですが、
いや、その時間仕事してますし。ohfujiさんが休みなら私も休みという認識ですか?
>次はコメントの掲載は明日以降に行います。従いまして少し練ってからご返信いただければ幸いです(穴だらけです)。
そのカッコの中身必要ですか?私昨晩投稿した後仕事あるので寝てますし、コメント催促したつもりもありませんし。
>(記事の定義による)staticおじさんは間違いを認めようとしないらしいですね。さてあなたはどうでしょうか?
確かに私の間違いですが、煽れば精神的に優位になったつもりで満足いただけるのでしょうか。
少なくとも、ディスプレイの向こうには人がいて、相手がどう思うか考えて書かれていますでしょうか?
出来るだけ失礼のないように接しているつもりですが、私はohfujiさんではありませんし逆も然りです。
ご自身の書かれた内容が100%伝わることはないとして、そう理解されてから書かれてはいかがでしょうか。
ohfujiより
2016-02-06 00:52:25
>>『技術的見地による話はしません】記者が明言しています。』とありますが、明言している箇所を明示してください。
> 明言(明記)している箇所はございませんでした。

間違いということで了解しました。

さて、『前提』という言葉について説明します。Wikipediaによると
<引用>
前提(ぜんてい)とは、ある物事が成り立つためにあらかじめ満たされていなければならない条件のことをいう。
</引用>
とのことです。つまり議論においては前提も含めて反論しても全く問題がないのです。
があなたの前のコメント(2016-02-05 22:22:19)では全く違った解釈をされていますね。言葉の使い方がおかしくないですか?

こういうと煽っていると受け取られるようなので補足します。
私は既にあなたのコメントの間違いを幾つか指摘しています。本来これはあなたがコメントをポストする前に正すべきことです。間違った情報を流されるとそれを指摘しなければなりません。そうすると本来やろうとしていた議論ができなくなります。

貴方は、
>ご自身の書かれた内容が100%伝わることはないとして、そう理解されてから書かれてはいかがでしょうか。

とアドバイスしていますが、仮に『私が自分の書いた内容が100%伝わる』と考えていたら、そもそも追記(補足)なんかは書かないですよね?、これも間違ったアドバイスであると指摘します。

先の明言(明記)の件や『前提』の件もそうですが、これらはちょっと元記事を読み返したり辞書を引いて確認したりすれば直ぐに分かることです。
こういう意味で、私は、
『次はコメントの掲載は明日以降に行います。従いまして少し練ってからご返信いただければ幸いです(穴だらけです)。』
とコメントしたわけです。


さて、あまりにも間違いが多いので、今のところあなたが言いたいことは私には伝わっていません。が、一方で、あなたは

>出来るだけ失礼のないように接しているつもりですが

と言っていますが、誤った解釈の上で

>ご自身の書かれた内容が100%伝わることはないとして、そう理解されてから書かれてはいかがでしょうか。

と言ったり

> 文意が汲み取れていないので最後の4行(引用2行含む)は意味がありません。

と断言されたりされたら『こいつは失礼な奴やな?』と思われても仕方がないかと思いますが如何でしょうか?

ohfujiより
2016-02-06 02:27:27
そういえば、もう一つありました。
あなたが元の記事から何を前提と受け取ったのかは知りませんが、元の記事で『これを前提とする』という箇所があるのなら明示してください。
nagiより
2016-02-06 23:03:05
素直に呆然としました。

私は会話しているつもりでしたが、ohfujiさんにとっては言葉遊びみたいなものだったんですね。
いや、対面で話をしている最中にまさか
「その前提という言葉の使い方は間違えている。辞書やウィキペディアでは~」
とか仰る人を見たことがありません。
あぁ、ネット上で文字だけの情報になるのだから言葉は正しく使いましょう、という意味合いでの確認だとしても
【文章の流れと前後からある程度補完し、自信がなければ確認する】
そして、相手が主張したいことを汲み取るのが文意を読み取ることと思っています。

>元の記事で『これを前提とする』という箇所があるのなら明示してください。
私が最初にしたコメントでそもそも文意を汲み取る事ができているのであれば、今更こんなこと書けませんものね。

元記事自体、導入・前提(前置き)・筆者の論・筆者の結論の4段階で分かりやすく書かれているのに
それを汲み取れないとは思わなかったので、端的に書かせていただいたつもりですが、分からなかったんですね。

もう少し単語ではなく文章を読むようにされたほうがよいですよ。
だから単語上の突っ込み部分という意味合いで
>穴だらけです
とか言えちゃうんですね。

また、これとか
>今のところあなたが言いたいことは私には伝わっていません。
いえ、それはohfujiさんが私が言いたいことを考えて
分からないならすりあわせるために「~という認識であってますか?」とか確認するところですから。
それが会話のキャッチボールっていうことですよ?

あぁ、言葉遊びを続けるつもりはないです。
ohfujiさん自身、「あなたの言いたいことがわからない」とか「文章をよく読まれたほうがいいですよ」とか
過去にも言われたことがあると思います。(管理者注:このような事実はありません。)
ので、どういう意味か振り返ることをおすすめしておきます。
といっても、間違いだらけの根拠も示さない奴に言われても~とか言い出すのでしょうけども。

私はohfujiさんが先の記事の文意が理解できなかったんだな(管理者注:このような事実はありません。)と
私の文意も理解出来なかった(しようとしなかった)いうことが分かりましたので
もし、理解出来たのであれば、それに則って【反論】を書かれると良いかと思います。
ohfujiより
2016-02-07 01:41:20
間違いだらけ文章を書かれて『俺は会話しているだけだ。文意を汲み取れ』と言われても対応に困るだけです。ご自身で何を言っているのか理解していますか?
とにかくまずはきちんとした文章を書いてください。それが出発点です。

こういうとまた話が脱線しそうなので、少しやり方を変えましょう。不完全ならがあなたの言いたいことをまとめます。違っていたら指摘してください。

『世の中には、老害に迷惑を受けている人がいる。』・・・・・A

まずこれは事実でしょう。そして記事では、

『老害というのは○○です。実例を挙げると・・・・。』・・・B

と言っていてます、私は、『その例は間違っている』と指摘しています。
あなたはAが正しいのだからBの正しさを問うのは筋違いだと指摘しています。理由としては、文章の出現順がBが先に出てきて次にAが出てきているからということです。が、そんな道理は何処にもないでしょう。というのが私の意見です。
ここまでで何か違うことはありますか?
ohfujiより
2016-02-07 02:14:23
そういえば、もう一つありますね。

私の中の常識ですが『根拠を示せ!』と言われれば、暗に、『お前が間違っている可能性があるからそれを含めて確認しろ』ということになります。今回私もそういう意味も含めて言っていましたがそれが伝わっていないようですのでお伝えします。

もともと一連のコメントですが、先のコメントで示したとおりシンプルな話なのになぜだらだらと続くのか? あなたが自分は正しいと信じてそれをサポートする為に間違った根拠を出してきてそれを私が違うよねと訂正しているからですが、一つ『俺の主張は間違っているのか?』という観点でも検証してみてください。そうすると見えるものがあるかもしれません。
もちろん私が何か勘違いしている可能性もあります。だから話を続けているでしょ?
ohfujiより
2016-02-07 03:32:36
さらにもう一つ、
事実誤認があまりにも酷いので2016-02-06 23:03:05のコメントは管理者注を入れました(2つほど)。
また、これ以上酷いコメントを入れるとコメント自体を掲載しませんので、よく考えてコメントしてください。
nagiより
2016-02-07 23:41:02
【間違いだらけの文章】と言っているのはohfujiさんが私の文意を理解できないので
単語ベースで細分化し分からないので間違っていると断じているだけでしょう。

あと私の主張をお書きになっておりますがまったくもって違います。
あくまで私は元記事の筆者の文意を理解してから、元記事に対する反【論】をお書きになっては?と言っているだけです。
理解できてないんですよね?

ですので
>暗に、『お前が間違っている可能性があるからそれを含めて確認しろ』ということになります。
そのままそっくりお返しいたします。

前コメントでも書きましたけど、先に元記事の筆者の文意をきちんと理解されてから私のコメントを確認されてはいかがでしょう。

>元記事自体、導入・前提(前置き)・筆者の論・筆者の結論の4段階で分かりやすく書かれている
分割できますよね?起承転結でも構いませんよ。
それが出来てから、私の文意でも汲みとってはいかがですか?

あ、
>また、これ以上酷いコメントを入れるとコメント自体を掲載しませんので、よく考えてコメントしてください。
コレはちょっと恥ずかしいです。
まぁ、掲載されなかったら、
中学国語の「筆者の気持ちを表している文章を~」とかいう問いに答えられなかったんですねと思うだけです。
ohfujiより
2016-02-08 00:36:39
まず、事実としてあなたの文章に事実誤認があるのは確かでしょう。
中学国語云々を持ち出してきていますが、元の記事にありもしないことを『記者が明言しています。』といったり、”前提”の意味を間違えて使ってたりして、そういう人から『お前は文章を読めない』と言われても全く説得力がないでしょう。

>理解できてないんですよね?

できてますよ。あなたが勝手にそう思っているだけです。
ちゃんと2/4の追記に、『まぁ充分文意を汲み取って反論をしているのですが』と書いていますよね。
さて、で改めて聞きますが、私が元記事を理解できていないという根拠はなんでしょうか?

>元記事自体、導入・前提(前置き)・筆者の論・筆者の結論の4段階で分かりやすく書かれている
分割できますよね?起承転結でも構いませんよ。
>それが出来てから、私の文意でも汲みとってはいかがですか?

はい、段落に分割できていますね。それは指摘されるまでもなくわかっていますよ。
それで、分かりやすいにも拘わらずあなたはありもしないことを著者が明言していると言っていたのです。
で、段落に分割されていることと『私が文意を理解できていないという』ことに何の関係があるのか、きちんと説明されてはいかがでしょうか?

余計なお世話かもしれませんが、元記事を読み直した方がいいですよ。まさに今のあなたにぴったりです。
<ここから>
staticおじさんは、あまり外に出ようとしません。例えば、自分よりも優秀なプログラマやプログラミングの専門家に会おうとはしませんし、優秀なプログラマが集っているコミュニティにも参加しようとしません。こうした人々との間に厚い壁を作って拒絶しています。自分が書いたブログや書籍などの技術的な誤りを専門家に指摘されても、絶対に認めません。誤りを指摘してくれた人が専門家であることすら知らないのかもしれません。
<ここまで>

貴方が、『私が元記事を理解できていない』と思うのは自由ですが、それが正しいというのならきちんと説明しましょう。説明ができないのならあなたが誤っているということです。それを『お前が理解できないだけ』という屁理屈を持ち出すのは正に『老害』としか言いようがありません。
nagiより
2016-02-08 22:24:00
>できてますよ。あなたが勝手にそう思っているだけです。
>ちゃんと2/4の追記に、『まぁ充分文意を汲み取って反論をしているのですが』と書いていますよね。
>さて、で改めて聞きますが、私が元記事を理解できていないという根拠はなんでしょうか?

>>元記事自体、導入・前提(前置き)・筆者の論・筆者の結論の4段階で分かりやすく書かれている
>分割できますよね?起承転結でも構いませんよ。
>>それが出来てから、私の文意でも汲みとってはいかがですか?

出来ているのであれば分割できますよね?
どこからは導入なのか、どこから前提なのか、4分割を示してみてはいかがです?
私は出来ないと思っておりますので、出来なければ私の根拠足りえますね。
そもそも、ここまで出来る出来る仰っているので、書かれるかと思ったのですが、勇気ありませんでした?

はい、私はohfujiさんが元記事を理解できていないと思っております。
だから、示されてはと提案しているのですが、やりたくないのでしょうか。
行間読めないのだからしょうがないですかね。
最初から、示せばいいのに。
ohfujiより
2016-02-08 23:49:58
何を息巻いているのか知りませんが、見たまま分割すればいいでしょう。
ちなみに、この文章は3つに分かれています。

序論:Page1 『自分だけの甘美な世界を必死で守る』の前まで
本論:Page2 『自分自身がstaticおじさんではないか』の前まで
結論:Page3 最後まで

前提というのは文章においては明示するかあきらかなものです。『○○』を前提とすると書きます。きちんとした意味の前提は特にないと言っておきましょう(プログラミングの一般知識は前提になり得たりますが)。
序論の最後の文、
『なお、Javaのstaticメソッドを多用する人に限らず、古い感覚にとらわれて周囲に迷惑をまき散らすプログラマをstaticおじさんと象徴的に呼ぶこともあります。この記事では、staticおじさんという言葉をこの意味で使うことにします。』
この文章はstaticおじさんの(この記事における)定義になります。

はい、それで?
あと、あなたの4分割案も示してください。
ohfujiより
2016-02-09 00:06:11
あと、『前提』の意味は辞書に従って使ってください。
nagiより
2016-02-09 00:11:32
4分割を示してくださいと記載しましたが、
3分割ですね。やり直してください。
この時点で私の文意を読み取れてないの上に、ご自身も
>段落に分割できていますね。それは指摘されるまでもなくわかっていますよ。
と仰っていますよね。
4分割に出来ると私が提示して、反証もないようなのできちんと4分割してください。
また、アバウトな言い方ではなく、1pageの○行目とか誤解が入らないようされてみてはいかがですか?
そうすれば、お互い齟齬なくなりますよね?
すり合わせって大事ですよ?それすらもご存知ないですか?
ohfujiより
2016-02-09 00:18:34
私は一言も4分割できるといっていませんよ。この場合、3分割が正解でしょう。4分割が正解という根拠は?
3分割が正解という根拠は、元の文章が物理的に3分割されているからです。著者がこのように分割したのだから著者に従って読めばいいのですよ。つまり、4分割であるはずというのが元記事を読めていない証拠ということになります。
つまり、あなたが読めていないのですよ。

>また、アバウトな言い方ではなく、1pageの○行目とか誤解が入らないようされてみてはいかがですか?
>そうすれば、お互い齟齬なくなりますよね?
>すり合わせって大事ですよ?それすらもご存知ないですか?

文章のサブタイトルを示しています。みたらわかるでしょう?苦しくなったので些末な点を責めますか?
nagiより
2016-02-09 00:30:49
ん?

>>元記事自体、導入・前提(前置き)・筆者の論・筆者の結論の4段階で分かりやすく書かれている
>分割できますよね?起承転結でも構いませんよ。
>>それが出来てから、私の文意でも汲みとってはいかがですか?

>はい、段落に分割できていますね。それは指摘されるまでもなくわかっていますよ。
>それで、分かりやすいにも拘わらずあなたはありもしないことを著者が明言していると言っていたのです。
>で、段落に分割されていることと『私が文意を理解できていないという』ことに何の関係があるのか、きちんと説明>されてはいかがでしょうか?

では、私のほうで4段階で分割できますよね?という話に対して
なぜ反証されなかったのかまず根拠を示して頂けますか?
しかも分割できていますね。の中に、「3分割」という言葉を盛り込まなかった意味も合わせてお願いします。
私はここで4段階での分割で双方の合意が取れているという認識ですので、違うのであればきちんと根拠を示してください。
出来ないわけ無いでしょう?
お言葉を返すようですが、3分割でないとohfujiさんは理解できないために
苦しくなったので些末な点を責めますか?
ohfujiより
2016-02-09 00:37:08
>>>元記事自体、導入・前提(前置き)・筆者の論・筆者の結論の4段階で分かりやすく書かれている
>>分割できますよね?起承転結でも構いませんよ。
>>>それが出来てから、私の文意でも汲みとってはいかがですか?

>>はい、段落に分割できていますね。それは指摘されるまでもなくわかっていますよ。
>>それで、分かりやすいにも拘わらずあなたはありもしないことを著者が明言していると言っていたのです。
>>で、段落に分割されていることと『私が文意を理解できていないという』ことに何の関係があるのか、きちんと説明
>>されてはいかがでしょうか?

>では、私のほうで4段階で分割できますよね?という話に対して
> なぜ反証されなかったのかまず根拠を示して頂けますか?

他に言いたいことがあったからです。分割の話をするときに具体的に話せば済むでしょう。何時、反証するかは私の勝手でしょ?
前から言っていますが、あなたの文章は『間違いだらけ』なんです。全てを列挙すると手間がかかるのです。
ですから、ちゃんとした文章を書いてくださいと言っている訳です。

さて、4分割が正解という根拠はなんでしょうか?

>4分割を示してくださいと記載しましたが、
>3分割ですね。やり直してください。

とまで言ったのだから

いずれにしても元記事が物理的に3分割されているのに、4分割というのは、元記事が読めていないのは貴方であることになるのですがね。
ohfujiより
2016-02-11 11:28:10
2日程待ちましたが、返信がないですね。

とにかく、自説が間違いであることを認識したのなら認める発言をされたらどうですか?
このまま、だんまりを決め込んだら、それこそ元記事の趣旨を理解できていないことになりますよ?(どういうことか分かりますよね?)
<元記事引用開始>
自分の未熟さや誤りを認めたり、知らない技術をイチから学んだりするのには痛みが伴います。そうした痛みよりも、「人の役に立つソフトウエアやサービスを作りたい」という向上心や「新しい技術を習得したい」という好奇心が上回っているのが優れたプログラマです。
<元記事引用終了>
まぁ、『俺はプログラマでないし』という言い訳もありかもしれませんが、さんざん人に対して失礼なことを言ったのだから大人としてきちんとした対応をとった方がよろしいかと思います。
あいだより
2016-02-22 13:10:37
あなたのブログの読者です。
基本的にあたなの考えに同意しています。

「変なのにかかわらなきいいのに」ってことを除いて。
でも、変なのに適格な指摘を続けるところがあなたの魅力なのですが。
あいだより
2016-02-22 13:15:46
すみません。
まず、
いつも楽しく読ませていただいている感謝の言葉を述べるべきでした。
いつもありがとうございます。
それと「同意」というと上から(少なくとも同位)目線な感じになりますが、
そうじゃなくて。
こんな感じです。
・私も同じように思う。
・説明が理にかなってる。
・勉強になる。

今後も楽しみに読ませていただきます。
ohfujiより
2016-02-22 13:32:12
あいださん

コメントありがとうございます。うれしい限りです。

>「変なのにかかわらなきいいのに」ってことを除いて。

コメントの返信のバランスについては難しいですね。当初切り捨てておこうかとも思ったのですが、現在留学中でしてちょっと日本語での議論が恋しくなった面もあります。

>でも、変なのに適格な指摘を続けるところがあなたの魅力なのですが。

コメントも読んでいただいていやはやうれしい限りです。

ありがとうございます。
あいだより
2016-02-24 15:32:41
お礼の返信恐縮です。
もう少し感想を思い出したので書かせていただきます。
(炎上の要因と判断されたのなら、公開いただかなくて結構です。)

特に私が相反する二つの感情
 ・変なのにかかわらなきゃいいのに
 ・しかしそれが魅力
を抱いたのは、SQLの件と今回の件でした。

いずれも両者の言い分も食い違ってる部分も理解できたと思っています。
(主観だけの抽象的な物言いになりますが)私の目にはこう見えました。
 ・故意か無意識なのか不明だが、相手が斜めに走った。
 ・ohfujiさんはひたすらまっすぐ真摯。
 (しかしほとんどの真摯さは無視の仕打ちに・・・)

オブジェクト指向うんぬんの件。私見では。
参加者に大きく三つのパターンがあると思っていて。
 ①構造化だの人解(50代以上)
 ②構造化とオブジェクト両方やった人(40代)
 ③オブジェクトやった人(20代~30代)

②がさらに二つにわかれて。
 ②-1両方やってオブジェクトがイイ
 ②-2両方やってオブジェクトに懐疑的

私の立場は②-2で特に(私や多くのプログラマが属する?)
SIの現場では長所より短所を感じているのですが。

そんな私もオブジェクト指向をかじりはじめた頃は、以下のように考えていて。
 ・オブジェクト指向は新しい素晴らしいもの
 ・構造化は古いもので新しいものは古いもににすべてまさる
つまり②-1でした。
ソレにかぶれたました。
(しかし今は・・・。)

また、
③や②-1の人たちは、オブジェクトを推奨することにインセンティブがあることも気になり。

そして私はこう考えました。
 ・何を言っても無駄。(ソレを信じてるし、やりたいんだだけなんだ!)
 ・誤解されるだけ。(捨てられた犬を見るような目で見られるだけ。)
 ・つまり議論は無理。

け・れ・ど!
あなたは黙っちゃいない!
真摯に議論をしようとする。!

私は、
まず、あなたの姿勢に頭が下がり、
発言内容に感心したのでした。
(残念ながら・・・相手は聞いちゃいないけど・・・)

とりとめもなく書きましたけど、
つまり応援しています。
これからも勉強させてください。
留学生活楽しんできてくださいね。
ohfujiより
2016-02-25 10:23:12
あいださん

感想ありがとうございます。もちろんですが純粋な感想・応援でしたら主観でも問題ないかと思います。
この歳になっていうのも恥ずかしいのですが、今週と来週ですが勉強が忙しくちょっと返事が遅れるかもしれませんのでとりあえずお礼をいたします。

ちなみに、以下の私の記事はお読みになられたでしょうか?

http://www.ohfuji.name/?p=1902

コメント欄がものすごいことになっていますが、後半は面白い議論になっているかと思います。

>私の立場は②-2で特に(私や多くのプログラマが属する?)
>SIの現場では長所より短所を感じているのですが。

②-2の方がおそらくマジョリティを占めているかと思いますが『声が小さい』のでいまいちネットの世界では浸透していないようですね(なのでこのようなコメントは励みになります)。
もっとも声が小さい理由は『オブジェクト指向を完全に否定できない』ということがあり、『オブジェクト指向の何処に欠点があるのか見極めが難しい』というのもあるかと思います。これは私自身、日々追い求めているテーマでもあります。

ここ数年すっかり英語学習ブログになってしまいましたが、読者の方がいると知ったのでちょいちょい書くようにします。
実は、オブジェクト指向で書きたいテーマがいくつかあるのですが、構想段階で終わってしまってます・・・。

取り急ぎ返信まで、
あいだより
2016-02-26 15:54:35
以前の記事。
もちろん読ませていただいてました。
少々過剰な中傷を受けていたみながわさんの救出劇!ですよね。
改めて読ませていただきましたけど圧巻です。

私にとってのハイライトは
 ・「ビジネスロジックレイヤーではOOは使い物にならないと思っている。」
 ・「gethtml」の例
でした。

ここに、私がオブジェクト指向を懐疑的に思う根拠(答え)のほとんどがつまってると思いました。
それ以外の観点では、こんなふうにも思います。
 ・上手いヤツは上手いなりに下手なヤツは下手なりに実戦的でないものをつくる。
 ・オブジェクト指向の学習/設計/実装コストは高いが効果は低い。
  (ほとんどの技術者にはもっと低コスト高リターンな技術習得の余地がある。)
いずれも、
必要性が希薄の仕様(ビジネスアプリケーション)にオブジェクト指向を使ってるのが原因
な可能性もあって、やはりofujiさんの例が答え(すべて)かもしれませんが。


パロディというか悪口がみながわさんに向けられている/いないの論争は、私にはくだらない。
(相手を言い負かすことに注力するより、相手を低俗と思い込んで考えたくない。)
でも、胸の中に違和感というか棘のようなものが残っていたようで、
ofujiさんの生き様は好ましく見えました。

私もofujiさんがおっしゃるように謙虚である必要性を考えます。
自分の考えが絶対だなんて思ってないし、
謙虚であれば思いもよらなかったような考えを自分のものにできるかもしれない。
でも、人間社会ってこんなのばかり。
 相手は絶対的な自信をもって自説を語ってくれる。
 根拠を聞くと妙な話になる。
 (ないならないでも良いし、大した根拠じゃなくても良いのだけど、ホント妙な話に。斜めとか逆切れとか。)
なかなかあなたのようにはなれそうもありませんね。


>②-2の方がおそらくマジョリティを占めているかと思いますが
なるほど!私は知らないうちにサイレントマジョリティーだったんですね。
ネットではギークの声が大きいだけで、彼らこそマイノリティーだったんですね。
だと良いのですが。ただ・・・
現場(SI)では③が急拡大しているように感じていて不気味です。
 ・良いも悪いもなくソレしか知らない。
 ・過去のgoto文と同じようにstaticは使ってはならないと教え込まれてる。
  (もちろん私は使うべき時がきたらgoto文だって使いますよ。break句の無い言語だってあるし。)
 ・newすると(あるいはフレームワークからインジェクションされたオブジェクトを使うと)仕事をしたような気になる・・・

>『オブジェクト指向を完全に否定できない』
まったくそのとうりですね。
昔大好きだった、今でも嫌いじゃない彼女ですもんね。

今でも良い女だと思いたいし、
良い噂を聞かせて欲しい、
そしてできるならやり直したいんですけど・・・。
新しい彼は妙なことばかり言うんですよね。
ホント嫉妬じゃなくて。
ohfujiより
2016-02-27 09:14:09
ご返信ありがとうございます。

思わず返信がしたくなりましたので簡単ですが返信いたします。
まぁ、じっくりとした話もしたいのですが、インスピレーションを感じましたので。

以前の記事はお読みになられてましたか、まぁ、例の小説のコメント欄にも書き込みましたが、まぁ確かに変な人が多い印象はあります。

>パロディというか悪口がみながわさんに向けられている/いないの論争は、私にはくだらない。
> (相手を言い負かすことに注力するより、相手を低俗と思い込んで考えたくない。)
>でも、胸の中に違和感というか棘のようなものが残っていたようで、
>ofujiさんの生き様は好ましく見えました。

そう、まったく同様の理由で書き込んだというのもあるのですが、恥ずかしながら、私自身がちょっと喧嘩してでも自己主張をしたくなったというのもあります・・・。

ここのコメント欄の変な人もそうですし、あの小説の熱心な読者も他人に対しては『謙虚であれ』と言っているにも関わらず自分自身ではまったく謙虚になれないというパラドックスを抱えていますね。ほんと興味深いです。
ちなみに、以前の記事を出して、軽く炎上して以降、多くのサイレントマジョリティの方は、考えるとことがあったようです。たとえば以下のブログ
http://d.hatena.ne.jp/busaikuro/
ここも、もともと程度の低い批判のみを行う掲示板と成り下がっていましたが、以前の記事以降は程度の低い発言は次第に減りましたね。もちろん私の影響という訳でもないでしょうが、ネット上の程度の低い書き込みについては、一部を除いてみなさん考えることがあったのでしょう。

>現場(SI)では③が急拡大しているように感じていて不気味です。

そうでしたか、考えてみればjavaが出てから20年以上経ちますので③が急拡大しているとういのは理にかなっていますね。私の半径3メートルでは特殊なアプリをメンテしている関係でオブジェクト指向症候群に掛かった人が少ないものでそういう意味では平和なSI生活を送っているかもしれません。

ただ、③が急拡大しているのなら一層のこと啓蒙記事を書かねばと思っております。
ちなみにstaticをつけないだけで事実上staticになっているメソッドとうのも必ずあるかと思います。そういう場合に『ここはstaticをつけてもいいのでは?』というと③の方がどういうリアクションをするのか興味深いですね(ちなみにこういう好奇心が私が記事を書くモチベーションになっています)。

軽い返信ですみませんが取り急ぎお礼方々返信まで
ひstaticより
2017-01-27 20:48:17
あなたの盟友みながわさんは、相変わらず何の進化もできていませんね。
http://ameblo.jp/kenchaz/entry-12241913951.html

理解できないものは”使えない技術だ”というスタンスらしいですよ。
利点も欠点も知ったうえで”使えない”というならわかります。
みながわさんは、理解できない=使えない、と短絡しています。
相変わらず高慢と偏見が直っていないようですよ。
histaticより
2017-02-01 21:41:35
都合の悪いコメントは消すんですね
ohfujiより
2017-02-13 13:00:27
histaticさん

URLが入っているので承認待ちになっていました。がワードプレスの不具合か私のところにお知らせが来ていませんでした。
ただ、わざわざ教えて頂いてすみませが、

>理解できないものは”使えない技術だ”というスタンスらしいですよ。
> 利点も欠点も知ったうえで”使えない”というならわかります。
>みながわさんは、理解できない=使えない、と短絡しています。
> 相変わらず高慢と偏見が直っていないようですよ。

この指摘は具体的にはみながわさんの記事の何を指して言っているのでしょうか?
元の記事を読みましたが、どこが『高慢』なのか私には理解できません。
突っ込みたい気持ちは伝わってくるのですが、まぁ論理が飛躍しすぎて返答に困ります。
なのでそのままなかったことにしてもよいのですが、まぁ出しておきます。

余計なことかもしれませんが一つ指摘します。
人に対して「あいつは『高慢』だ」と評価するのは個人の思いとしては勝手にやってもらえればいいのですが客観的に事実として言いたいのならきちんと証拠を上げて相手に伝わるようにした方がよいですよ。また、そもそも論としてあなたが他人の人格に対して何か評価する資格があるのかどうかも私にはわかりません。
ohfujiより
2017-02-15 17:59:02
histaticさん

みながわさんのブログとあと以下のにも書かれていたのですね。
http://el.jibun.atmarkit.co.jp/pressenter/2017/01/_11.html

それでもあなたの書き込みに対して誰も賛同していない理由を考えるとあなた自身が進歩できるかもしれませんね。
色々、書き込まれて散らかるのもなんなのでコメントがあれば、先ずはみながわさんのところへお願いします。

私の返信が遅れたことはすみませんでした。
cshaprdotnetより
2017-04-15 22:55:42
ohfujiさん

本日、発端となった記事やohfujiさんの書いた記事
http://www.ohfuji.name/?p=1902

を読み、最終的にこのページに至りました。
ohjujiさんの考え方は大変参考になりました。

発端記事のコメント欄には否定的なコメントが多かったですし、私も否定的な意見をもっていました。
しかし、ohfujiさんの記事は全てに否定的ではなく、一定の理解をした上で話をしています。
通常、一度否定的になると、粗探ばかりしてしまうので、話はなかなか進みません。

また、オブジェクト指向について理解が無かった新人のころを思い出しました。
C#で開発する機会があったのに手続き型言語の方がわかりやすいと思い込んで、コードはC風に書いていました。そこには記事で話題となるようなstaticなグローバル変数がたくさん存在しています。
このコードの保守性は絶望的で、先輩もお手上げだったようです。
その後、先輩からのアドバイスもあって、オブジェクト指向について勉強しました。
その結果、考え方が大幅に変わりました。

私はコードレビューをしたり共通的な処理を作成することが多いですが、他プログラマの酷いコードに、苛立ちを覚えたりしています。
しかし、上記の記事を通して自分の新人の頃を思い出し、初心にかえれた気がします。
ありがとうございます。
ohfujiより
2017-04-23 13:37:19
cshaprdotnetさん

コメントありがとうございます。またもやスパムフィルターに引っかかって表示・返信が遅れてしまいました。すみません。
ともあれ、ご参考になったということで何よりです。
レビューや共通的な処理の作成ということで立場的にソフトウェアの品質には敏感なのだと受け取れます。

実際の現場を見たわけではないので的外れな返事になるかもしれませんが私自身レビューに参加したりという経験が多いのでコメントします。

私は他の人が書いたコードを読むとき『現実と理想』のギャップを意識しています。書籍等ではきれいなコードの例が載っていたり、『コードはこうあるべきだ』という理想像を知ることができますが、私の経験上、残念ながら実戦では、そのようなコードを書くことが厳しいことの方が多いです。
これは私自身にも当てはまりまして、私も見た目が酷いコードを書いたこともありました。ある清算に関わる処理を書いた時にエラー処理が多くなり見た目がひどくなりました。で、他の人が『リファクタリング』と称して書き直したのですが、それをテストするとどうもエラー処理が抜けているらしく「ネットワークエラーの処理はどうしましたか?」と聞いたところ『それはまだ実装していない』という返答でした。
残念ながらどれだけ見た目がきれいなコードでも要求仕様を満たしていないコードは落第だと言わざるをえないでしょう。ただこのような『リファクタリング』と称したバグの埋め込みの例(デグレード)はこの例だけでなく私自身が逆の立場になったこともあり、あーだからこんなにややこしい処理が入っているのか。とあとで納得したこともあります。

つまり、酷いコードを見た時には、コードに対する読解力が自分にあるか?という問いかけも必要かと思います。『酷いコード』という意見はよく聞きますが、先に示したとおり実際にはややこしい処理が入っているだけで、読み手がそのことを理解していないということが往々にしてあります。そうすると『ドキュメントやコメントを充実させろ。もっと直感的なコードを書け』といろいろご高説が出てくるのですが、逆にいうと、それらは読み手としての能力が無いと言っているようにしか思えないことがあります。

という訳で最近では、他人のコードに対して「酷い」という感想を持った時に「何がひどいのだろうか?」と自問自答するようにしています。もちろんですが直感が当たることもあれば外れることもあります。

グローバル変数が出てきたので関連してコメントしますと、グローバル変数が問題をはらんでいることはそのとおりですがでは「なぜグローバル変数がダメなのだろうか?」という問いかけもやはり必要かと思います。どこかで読んだネットの記事になりますが、『DBに格納されている値は結局グローバルだよね』という意見を読んだときに私は妙に納得したのですが、この意見にはグローバル変数のある種の存在理由のヒントが隠されているように思われます。
もちろんですがグローバル変数がダメという例もあります。昔、20年近く前にVBのプログラムのレビューでダイアログボックスのYes, Noの結果をグローバル変数でやり取りしていたコードがあり、さすがにこれについては「やめてくれ」と意見しました。もっともそのプログラマーは頑なに変更を拒否したので、それ以上は言わなかったです。

後、手続き型についても意見があるのですが、それは以下の記事に書かれています。
http://www.ohfuji.name/page.awp?page_id=2912

長々となりましたが思い出すことがありましたので返信しました。
コメントありがとうございました。
cshaprdotnetより
2017-04-29 12:28:38
ohfujiさん

いろいろコメントありがとうございます。
ほぼ同じような考えをもっていることが分かりました。
プロジェクトでの立場も違いものを感じました。

私のプロジェクトの要員は我流のコードしか書いたことがおらず、
品質問題にいつも苦しんでいます。
入れ替わりも多いので良い人を育てるという選択肢もありません。


私のプロジェクトに関わらず、少しでも、我流のコードから抜ける人を増やすために、
以下のような記事をQiitaで書いています。

http://qiita.com/csharpisthebest/items/57f27a33085f01211166

しかし、Qiitaでコメントくれる方は対象読者ではない人が多いため、なかなか話が合わないことが多いです。
ただ、より高度な立場でのコメントをくれるので参考にはなります。

とりあえず、プロジェクトメンバーに読んでもらうにはちょうど良い内容だと思っています。

グローバル変数の話がでたので、コメントします。

>「なぜグローバル変数がダメなのだろうか?」
>『DBに格納されている値は結局グローバルだよね』

結局、グローバル変数の使い方次第ですよね。
例えば、DTOがクラスのプロパティはpublicにするのが普通です。
これ自体に問題が発生するわけではないということだと思います。

しかし、User情報のDTO(UserDto)を静的領域にもって、どこでも参照と変更ができるようにすると
途端によくないグローバル変数になります。
まず、静的情報する必要性を検討するべきですね。

>ダイアログボックスのYes, Noの結果をグローバル変数でやり取りしていたコード
>もっともそのプログラマーは頑なに変更を拒否したので

便利だからという理由で使う人が多いので、厄介です。
この手のプログラマは今後直る見込みがないで、私のプロジェクトでも扱いに困っております。


オブジェクト指向があたりまえみたいな風潮がありますが、
もっと基本的なところ(Qiitaの記事のレベル)を何とかしてほしいと思う日々です。


まとまりがなくなりましたが、思うことがかけて満足です。
ohfujiさんとは別で、これまでの経験について話をしてみたくなりました。
考え方が近いので、何か得られる気がします。
ohfujiより
2017-05-01 15:53:26
さらにご返信ありがとうござます。

考えさせられるコメントなので、2回に分けて否定的な意見と肯定的な意見を書きます。

先ずはグローバル変数の話ですが、

>しかし、User情報のDTO(UserDto)を静的領域にもって、どこでも参照と変更ができるようにすると
>途端によくないグローバル変数になります。

これが場合によりけり(全体的な設計を絡めての判断)になります。元々グローバル変数というのはプログラム実行時の寿命を持った変数で、一方のDBにあるUser情報というのは寿命がそれよりも長くなります。そういう意味ではDBの情報を不用意にグローバル変数に持ってくるのは不適切ということになります。つまり寿命が違う訳です。
が、一方でDBとの同期を上手く行えばそれはそれで使えるようになります。具体的にはキャッシュとして持つということになります。パフォーマンスタイトなプログラムで頻繁にDBにアクセスできない場合、頻繁にアクセスする情報についてはグローバル変数で持つということもできるでしょう(アーキテクチャ的にはCPUキャッシュを参考にすればよいかと思います)。

もともとDB上のデータは『どこでも参照と変更ができる』ようになっていますがなぜ問題にならないでしょうか?ということを考えるともう少し深いものが見えてくるかもしれません。

続いて、Qiitaの記事の全体的な感想になりますが、確かに私の立場では重箱の隅感が否めません(もっとも記事の意義も解りますのでそれについては次にコメントします)。
サンプルコードの短さが示しているとおり対象としている問題が小さいです。私自身リファクタリングをする時はもっと規模が大きい変更を行います。
逆に言いますとメソッド内のコードの良し悪しはあまり見ていません。もちろん場合によりけりですが何時でも書き換えられるのならもっと別の大きな問題を考えたいです。
要するに木を見て森を見ずになる恐れを避けるということで、例えば

http://qiita.com/csharpisthebest/items/99af9136883f139ad70f

ですが、私もfelisさんのコメントの通り管理テーブルの作成(別の言い方をすると状態遷移を考えた設計)にすべきでありif文の書き方については(今は)些末な話になります。
要するに何が重要か?ということで、設計の良し悪しを考える方がコードの記述の良し悪しを考えるより優先順位が高くなるでしょう。その点をごっちゃにすると意図しないツッコミが出てきたり共感が得られなくなるかと思います。

もっとも製品等、頻繁に保守を行うプログラムということであれば、ある程度統一感をもった記述というのは必要で、人の出入りが激しい場合なおさらで自由すぎるのもどうかと思います。人の読解力には限界があるので縛りは必要かと思います。これもまた昔を思い出すのですが、コーディング規約を作るしかないかと思います。
その場合はきちんとドキュメント化し全員に周知した方がよいかと思います。もっともコーディング規約を元にコードを書いたのもバブルの頃でそれ以降は予算の関係でなおざりになっている現場が多いですね。

続いて、肯定的な意見を書きます。
ohfujiより
2017-05-01 16:47:04
続いて共感できる話ですが、以下の『ややこしい条件分岐』ですが、

http://qiita.com/csharpisthebest/items/99af9136883f139ad70f

前のコメントではそもそも設計が・・・とコメントしましたが、その点を除くと、
確かにif文一つとっても色々書き方がある訳でしてどうあるべきかというのはプログラマ人生で一度は考えたいところではあります。

if文について気にすることですが、『全ての条件を網羅できているか?、できれば直感的に理解可能か?』になるかと思います。そういう意味ではリファクタリング後のコードの方が読みやすいです。ボタンの活性化の条件では3つの要素(loginUserID,firstApproved,secondApproved)がありますが、この3つの要素について機械的に組み合わせを考えると、loginUserIDは4パターン,firstApprovedは2パターン,secondApprovedは2パターンで全体で16パターンになります。元のelse if を連ねたコードの場合、本来なら16パターン分考慮しなければなりませんが、リファクタリング後の場合は、loginUserIDと(firstApproved,secondApproved)に分けてある(つまり4パターン+4パターン)に分けてあるのでややこしさが低減されてます。

ちなみに7tsunoさんのコメントのボタン目線のコードも悪くないのです、が、場合によりけりな部分があります。例えば、ボタンの活性化だけでなく現在の掲示板の状態を表示する要望が追加された場合、if文を残しておいた方が後からのメンテナンスが楽になるかと思います。if文の場合はコメント状態がコードブロックに収まっていますが、ボタン目線の場合はボタン間の関連が特にないのでそれぞれの条件がきちんと設定されているか気にしてしまいますね(要は16パターンについて、すべてのボタンで検証する必要があるのでさらに複雑さが増える)。
ボタンの活性化の条件が増えた場合、承認者が3人になったりとか、修正が面倒になると思いますが如何でしょうか?

もっとも、条件式を制するのは良いコードを書くための第一歩で、こういう風に様々なコードを検討することにより、力がついてくるかと思います。肯定・否定・別案含めて色々考えたり試したりすることには、新人に限らずベテランにも意義がありますし、そういうコメントもついていますので、勉強になる記事だと思います。
cshaprdotnetより
2017-05-02 10:18:56
ohfujiさん

肯定・否定の意見を両方いただき、ありがとうございます。
Qiitaの記事上では、コメントでしか感想を判断できないので、大変参考になりました。

グローバル変数の話についてですが、
>これが場合によりけり(全体的な設計を絡めての判断)になります。

ここはその通りだと思います。そこまで考えてくれる人が増えてほしいものです。

>もともとDB上のデータは『どこでも参照と変更ができる』ようになっていますがなぜ問題にならないでしょうか?

この辺の話は、社内の勉強会でやってみようかなと思いました。


>続いて、Qiitaの記事の全体的な感想になりますが、確かに私の立場では重箱の隅感が否めません(もっとも記事の意義も解りますのでそれについては次にコメントします)。
>サンプルコードの短さが示しているとおり対象としている問題が小さいです。私自身リファクタリングをする時はもっと規模が大きい変更を行います。

リファクタリングする人の立場では物足りないですよね。
このコードの記事の元ネタは、プロジェクトの要員が毎日のように書いてきたコードがほとんどです。
コードレビューで毎回指摘しても、次に活かされず、再発していました。

規約を書いても守られなかったので、プログラマの質は良くなかったです。
そういう意味では、重箱の隅という指摘は、その通りだと思います。


>その場合はきちんとドキュメント化し全員に周知した方がよいかと思います。もっともコーディング規約を元にコードを書いたのもバブルの頃でそれ以降は予算の関係でなおざりになっている現場が多いですね。

記事に書いた内容のいくつかは、コーディング規約にしていました。規約自体にそうする理由も書いていました。口頭で説明したので私もみんな守ると思っていたのですが、意外と難しいようです。半分以上のプログラマが規約をほとんど守れず、コードレビューを完了したくないがスケジュールに遅れがでるので完了にせざるを得ない状況となりました。

おそらく、規約が覚えられないというプログラマが多いのでしょう。
自分は覚えているかというと、身についているという感覚なので規約のある別プロジェクトに移っても苦労したことはありませんでした。そのため、規約を守ることの難しさについては甘く見ていました。

規約を守らせる一つの案については、Qiitaの最初の記事でコメントされました。
http://qiita.com/csharpisthebest/items/90f040ad52c213bd0d64

コードレビュー結果を可視化して守らせるようにするという提案でした。
普通のプログラマであれば守るし、それでも守らないのであれば、その人に仕事は任せられないと。

ここまでやると、ついていけない人は自分からプロジェクトを去りそうです。
一方、私は協力会社(プロパーではない)の人間なので、別の協力会社から苦情がくるかもと思いました。

結局、コードの質を上げるにはプログラマ自身が自発的になんとかするしか無いという点が難しいところです。


>は16パターンについて、すべてのボタンで検証する必要があるのでさらに複雑さが増える
>ボタンの活性化の条件が増えた場合、承認者が3人になったりとか、修正が面倒になると思いますが如何でしょうか

通常elseで表現できる場合でも、あえてフラグを書かなければいけないので、保守性は落ちますね。
if文を読みやすいbool型に書き換えるという点では意義があるので採用しました。保守性の部分について追記するべきかもしれません。


>肯定・否定・別案含めて色々考えたり試したりすることには、新人に限らずベテランにも意義がありますし、そういうコメントもついていますので、勉強になる記事だと思います。

最近、Qiitaの記事は意味はあるのか懐疑的になっていましたが、とりあえずこのまま頑張ってみます。
ohfujiより
2017-05-02 14:36:38
なるほど、工程内にコードレビューがある状況ということですね。私も乗りかかった以上、最後までコメントしたいとこです。が、やはり実際の現場を見ていないので的外れなところがあるかもしれません。その場合は指摘していただければと思います。

またいくつかに分けてコメントします。が、先ずはQiitaの記事を元に私がレビューする場合についていくつか概観します。

先ずは、『ややこしい条件分岐』について、
http://qiita.com/csharpisthebest/items/99af9136883f139ad70f

私はリファクタリング後が読みやすい(良い)コードだと言いましたが、実際に私がレビューすると、元のコード、リファクタリング後のコード、7tsunoさんのコードすべて合格(acceptable)です。
実は7tsunoさんのコードはデグレードしているので本来なら不合格ですが、そこは解消されているとします。デグレードをどこまで深刻に受け取るかですが、前にも指摘しましたがこういうことがあるので不用意なリファクタリングはNGとしたいところで、悩ましいところではあります。
何れにしても、良いコード・悪いコードと分けるのではなく、良いコード、悪いコード、普通のコードと分けて悪いコードのみ、ふるいにかけることを考えます。
また、私の前のコメントのように何か意見があればレビュー時の確認事項として担当者に確認します。つまり「こういう問題がありそうですがどう思いますか?」という感じで聞きます。それで終わりです。
実はこのようなコードを書く場合、私は元のコードのように書く場合があります。理由は、「全部の条件がif文内の一つの行に収まっている」ということで一つの状態に対応してそれを満たす条件を切り出すことが可能になり、そこから状態遷移表を作ることができます。
一方で、リファクタリング後のコードも7tsunoさんのコードも書き手の意図が理解できるのオーケーです。つまりこの辺りの判断はプログラマの裁量に任せたいところです。


一方で、以下の記事、『Getter、Setterを逆にするのは何故か』
http://qiita.com/csharpisthebest/items/9e6d6ff9156cfd70b993

は、記事にあるとおりGet/Setの意味どおり書いてもらわないと保守担当者(他の人)が困ることになります。変数やメソッドの命名規則は順守するのも簡単なはずなので守ってもらいたいところです。


一方で、悩ましいのが以下の記事『流れるようなインターフェースの使い方はこれで正しいのか?』です。

http://qiita.com/csharpisthebest/items/403d40374acc70ef24e3

私もリファクタリングすべきだと思いますが、『なぜそうか?』というのは少し思いつきません。強いて言うと慣例的ということになりますが、こういうコードもレビューでよく遭遇します。ちなみに、記事にある理由、
1. UpdateParameterがDaoを参照している。
2. テーブルが増えたら直す箇所が複数ある。
3. SetHeader1~SetHeader3を必ず呼び出さなければならない。
については、2.および3.についてはリファクタリング後のコードも同様だと思いますし、1.については何故Daoを参照するのが悪いか私には疑問です。
こういうコードに遭遇したときは、前に指摘しましたとおり「私の読解力は大丈夫か?」と自問することにしていますが、一方でプログラミングの奥深さを感じます。つまり人間の創造力の豊かさを感じます。ただ、最近では、こういう自由度の高さから「オブジェクト指向はビジネスロジックに向かない」という意見も持ち始めました。
まぁ、担当者には「リファクタリング後のコードの方が慣例的なのですが?」と疑問点を述べてできれば修正してもらうようにしたいところではあります。


その他に目につくものは、『関数の引数が多すぎる問題』ですが、

http://qiita.com/csharpisthebest/items/35ed38c0d3a26dbe8c70

これは、正にガイドラインというのはどうあるべきか?を考える例になります。
現実的なコーディング規約では、
『関数の引数は7個までで、それを超える場合は処理を分割できないか検討してください。レビュー時には検討結果についてお伺いいたします。』ということになるでしょうか?
記事にもありますが、

>処理の分割をちゃんと考えていれば引数が多くなることは、ほとんどないという点である。

このとおり逆説的ですが、恐らくほとんどのプログラマは数については意識していないでしょう。まともなプログラマが書いたコードなら引数が8個になるということはそれなりに理由があるというこで、まともじゃないプログラマが書いたコードなら他に指摘できる点があるということになります。

つまり、関数の引数の数に制限を付けるのは出来ればという程度(努力目標)ということになり、要は必ず守らせるものではないということになります。


以上、4つほど取り上げましたが、もしQiitaの記事がコーディング規約としたら、中にはOKのものもありますが幾つかの規約はその合理性が疑わしいということになります。
つまり、『高品質のコードを書くためのガイドラインの品質はどうあるべきか?』という話になります。合理性が疑わしいガイドラインを好んで守ろうというエンジニアは居ないわけですが、かと言って、新人や経験不足のプログラマには理屈抜きである程度従ってもらわな困る面もあり悩ましいところです。


続いてレビューの必要性と意義等もう少し掘り下げた話と、

>コードレビューで毎回指摘しても、次に活かされず、再発していました。

についてのコメントもあるのですが、まぁゴールデンウィークも長いのでゆっくり返信したいと思います。

かなり古い本になりますが、もしかしたら以下の本が参考になるかもしれません。

『デバッギング ザ デベロップメント プロセス―理想的な開発工程を目指して (マイクロソフトプレスシリーズ』

20年以上前になりますが、この本を読んで感銘を受けた覚えがあります。
cshaprdotnetより
2017-05-02 22:51:57
ohfujiさん

ご意見いただき、ありがとうございます。

>元のコード、リファクタリング後のコード、7tsunoさんのコードすべて合格(acceptable)です。
>「全部の条件がif文内の一つの行に収まっている」ということで一つの状態に対応してそれを満たす条件を切り出すことが可能になり、そこから状態遷移表を作ることができます。

「全部の条件がif文内の一つの行に収まっている」というのは、別プログラマから言われたことがあります。
設計書の通りで対応関係も分かりやすいという意見でした。
それほど悪いコードでもなさそうですが、if文内の冗長な条件はbool型の変数にしてほしいという思いはあります。
(firstApproverId != null => firstApproved など。)

実は、元ネタはif文の中に同じ判定を何回も書いており、テスト不可能なほど複雑でした。
そのときもbool型の変数で表現されていれば、OKしたかもしれません。

>一方で、悩ましいのが以下の記事『流れるようなインターフェースの使い方はこれで正しいのか?』です。
>1.については何故Daoを参照するのが悪いか私には疑問です。

サンプルコードを簡略化しすぎて、私が問題だと思った部分が伝わりにくくなってました。
元ネタはDaoを画面でも使用しており、更新時のUpdateParameterを生成時に使用しています。
これまで画面で使用していたDaoを、このときだけUpdateParameterで使用するのは違和感がありました。
また、UpdateParameterはDTOですので、依存無しの単純なデータ構造にしたいという意図もあります。

例えば、UpdateParameterBuilderクラスでDaoを内部でnewしているならばOKだったと思います。

>こういう自由度の高さから「オブジェクト指向はビジネスロジックに向かない」という意見も持ち始めました。

同意です。変なクラスが多くて困っている現状があります。


>以上、4つほど取り上げましたが、もしQiitaの記事がコーディング規約としたら、中にはOKのものもありますが幾つかの規約はその合理性が疑わしいということになります。
>合理性が疑わしいガイドラインを好んで守ろうというエンジニアは居ないわけですが、かと言って、新人や経験不足のプログラマには理屈抜きである程度従ってもらわな困る面もあり悩ましいところです。

合理性まで踏み込めるプログラマであれば、問題となるようなコードは書かない、あるいは一見問題があるようなコードでも納得いく説明ができると考えております。
一番悩ましいのは今までやってきたやり方と違いすぎて、合理性まで踏み込めないプログラマです。新人や経験不足のプログラマがこの傾向にあり、規約をとりあえず守ってもらうしかないですが理解できていないので守れずという悪循環です。

>『デバッギング ザ デベロップメント プロセス―理想的な開発工程を目指して (マイクロソフトプレスシリーズ』

今でも中古で手に入るようです。購入を検討しています。


コードレビューに関しても返信お待ちしております。
ohfujiより
2017-05-03 16:20:49
さて、続いてコードレビューと規約の必要性についてプロジェクトマネジメントの観点からコメントします。
技術的な話は次に、教育的な観点ではその次にコメントしようかと考えています。

先ず、コードレビューを行ったりコーディング規約を作成するのは何の為に行うのでしょうか?
ここでは技術な観点は除いて、プロジェクトマネジメント上のメリットを考えると『それを実施することにより最終的な工数が減る』とか『人員に対する要求レベルを下げることができる』というのが挙げられるでしょう(もちろん他にもあるかと思いますが)。
例えばコードレビューを行い潜在的なバグを取り除けば後のテスト工程で楽ができますし、良いコーディング規約(ガイドライン)があれば(本来なら)経験が足りないプログラマでもプロジェクトに参加することができます。イメージでいうとファストフードチェーンのようにアルバイトでも一定の品質をもった製品を作ることができるということになります。
もちろん、プログラム開発とハンバーガーを作ることを同じテーブルに載せるのは飛躍している面がありますが、ここではコーディング規約やガイドラインを含めたプロジェクトの理想的な(あるべき)体制を考えるとという話になります。

そういう観点でみると、『良いコード書くきっかけを与えたい。』

http://qiita.com/csharpisthebest/items/90f040ad52c213bd0d64

にあります、

>少なくとも、常駐先で色んなプログラマのコードを見てきたけど、10人中、まともなのは1~2人程度で、その他は論外という印象だった。

という環境は、本来の意味においてコーディング規約が発揮される環境であるとも思えます。

『良いコード書くきっかけを与えたい。』のコメント欄にある結論

>私の信条として、人は人から言われたことで変わることはまずないと考えています。

は、その通りですが、この結論はある意味でコーディング規約やレビューの存在を否定することになります。繰り返しますが良いガイドラインとは誰がやっても従えるものを指します。もちろんそんなものを作るのは絵空事ということもありますが、実際に私が関わったプロジェクトで、コーディング規約ではないですが『平凡なプログラマー』でも上手く行くプロジェクト運営というのは過去にやったことがありますので全くダメということでもないです。

言葉を変えると良いガイドラインとはプログラマを良い方向へ導くものであり、まさに『良いコード書くきっかけ』になるものでしょう。

さて話を戻して、なぜ、

>コードレビューで毎回指摘しても、次に活かされず、再発していました。

ということが起こるのでしょうか?理由は様々だと思います。

>おそらく、規約が覚えられないというプログラマが多いのでしょう。

という人もいるでしょうし。また、残念ながらそのプログラマがプロジェクトの参加基準に達していないということもあるでしょう。

技術力関係なしにそのエンジニアの性格という面もあります。コーディング規約に対する持っているイメージがエンジニアによって異なります。cshaprdotnetさんはコーディング規約を良いものと考えておられますが、全員がそう考えているわけではなくて単なる足かせとかある種の『創造性』を否定するものととらえている方もおられます。前の例でいうと一流のレストランのシェフがはたしてファストフードのマニュアルに従うでしょうか?という話にも通じます。

このような人間の性に起因するある種のジレンマは、コーディングレビューにも通じます。コーディングレビューを行って問題点を出しそれを指摘した場合、残念ながら一部のエンジニアは単純に反発しかしません。この記事のコメント欄のnagiさんがそうでしょう散々私に間違いを指摘されながら自説を曲げずにコメントされていましたが、言い逃れできない間違いを指摘されると何処かへ消えました。そういう人もいますし、別の例を出せば、例えば私が一流どころのプログラマーにコードの間違いを指摘したところで従ってもらえるか分かりません。『お前が無知なだけだ』と返される可能性もあります。

このようにコーディングレビューや規約の持つ欠点を考える必要もあるかと思います。人に対して間違いを指摘するということはある種の軋轢を生みだします。タイミングや言い方に気を遣う必要があります。やり方次第でコーディングレビューをある種の発表会のような晴れやかな場にするか、裁判のように罪人を追求する場にするか、違いが出てきますが、下手をするとプログラマーのモチベーションに影響を与え結果としてプロジェクトの進行を遅らせることになります。

以上、まとめますと、
1.規約の妥当性
2.メンバーの性格
3.メンバーの技術レベル
4.メンバーの経験値
5.レビューア―の性格
6. レビューアーの技術レベル
7. レビューアーの経験値
8. おかれた環境(レビュー、規約の必要性、レビューアーとメンバーの関係性)

ということを考慮し、対策を練ることになります。なので実際には相手によって対応を変える必要もありますし、時には規約を変更することもあるでしょうし、と、できることは色々あるかと思います。もっとも言うのは簡単でもやるのは面倒で、レビューではないですが、この手のことでは私もちょいちょい悩むことがあります。ので周りの人に相談したり、他の人はどういう対応をしているのかを見たりしています。
cshaprdotnetより
2017-05-03 21:06:36
ohfujiさん

昨日投稿した内容が反映されていないのですが、またスパムですかね?
それはさておき、コードレビューと規約の必要性についてコメントをいただき、ありがとうございます。

>実際には相手によって対応を変える必要もありますし、時には規約を変更することもあるでしょうし、と、できることは色々あるかと思います。

1点どうしているのか、お聞きしたいことがあります。
スキルミスマッチの人がプロジェクトに配属された場合にどうするかということです。
経験年数によらず一定数存在しており、レビューしても品質の問題を全て解決することができません。
この場合のスキルミスマッチは、レガシーコードしかかけないプログラマです。いただいたコメントでは
>残念ながらそのプログラマがプロジェクトの参加基準を満たしていない
プログラマということになります。私のプロジェクトでは、大半の人が該当していました。

この種のプログラマは、Qiitaの記事に書いたような書き方ができることを知らず、規約どころではありません。
Qiitaの記事を見て、自身のコードを見直してくれれば見込みはあるものの、プロジェクトとしては手遅れです。
一番品質問題が発生する部分でもあるのですが、どうすればよいか見えていません。


>良いガイドラインとは誰がやっても従えるものを指します

ためしに規約に載せるか、コードを書く上での検討事項となるか分類してみました。

ややこしい条件分岐 => 検討事項
ちょっと気になるコード集 => 規約
流れるようなインターフェース? => 検討事項
冗長な代入文 => 検討事項
コレクションに対する無駄な処理 => 規約
安易なNullチェック => 検討事項
Bool型の扱い => 規約
関数の引数が多すぎる => 規約(納得いく理由があれば多くても良い)
関数呼び出しと条件分岐を分離できないか => 検討事項
Getter、Setter逆問題 => 規約
なんでもかんでも配列 => 規約
条件分岐後の処理が冗長な場合 => 検討事項

Qiitaの記事は規約にできるものを考えるという面もありますが、プログラマの引き出しを増やすための記事のため、明確な答えが出ないもの(状況によっては正しい)が多いです。それだと話にはならないので、どこが悪いのか指摘した上でリファクタリングしています。

実際のプロジェクトでは、「規約」と書いた部分が守られていないため、コードレビューの負担は大きくなっています。この「規約」と書いた部分を守らせるにはどうするかを考えるべきかもしれません。

コードレビューをしているとある程度パターンがありました。
1. ほとんど指摘なし。多少の規約違反も納得できる内容だったりする。
2. ある程度の規約は守れる。ロジックもそれほどおかしくないし、踏み込んだレビューができる。
3. 基本的な「規約」が守れない。規約違反を指摘してレビューが終わってしまう。そして次に活かされない。

何とか3=>2に引き上げたいのですが、
>私の信条として、人は人から言われたことで変わることはまずないと考えています。
これに該当する人が多いのが実情です。

一日のうちに何度も同じ指摘を受ける人に話を聞いたのですが、「スケジュール遅延でてんぱってました」ということでした。炎上プロジェクトだったので、プログラマには余裕がないのも原因の一つみたいです。


とりあえず、以下の2点を考えていくことになりそうです。
1. 基本的な「規約」を守ってもらうにはどうするか?
2. 「検討事項」を活かしてもらうにはどうするか?



その他のコメントについていくつか返信します。

>このような人間の性に起因するある種のジレンマは、コーディングレビューにも通じます。コーディングレビューを行って問題点を出しそれを指摘した場合、残念ながら一部のエンジニアは単純に反発しかしません。

実際のプロジェクトでもありました。レビューイが激怒したことがあります。翌朝お互いに謝ってことなきを得ましたが、なかなか難しいものです。また、オブジェクト指向設計に知見があるプログラマとも険悪な雰囲気になりかけました。「ビジネスロジックに影響を与えない進捗表示」の元コードを書いた方ですが、2回目のレビゅーということもあり、リファクタリング後のコードにするのはあきらめました。

>下手をするとプログラマーのモチベーションに影響を与え結果としてプロジェクトの進行を遅らせることになります。

パターン3のプログラマは、これに該当していたと思います。途中であきらめました。

いろいろと考えが整理できました。
返信いただきたい内容が先頭にあるので、もう少しお付き合いいただければと思います。
cshaprdotnetより
2017-05-04 11:42:22
>もう少しお付き合いいただければと思います。
よくよく考えたら、この文言はおかしいですね。
コメントを書いた後、なんとなく終わった気になっていました。

>技術的な話は次に、教育的な観点ではその次にコメント

こちらについてもコメントをお待ちしております。
ohfujiより
2017-05-04 11:53:44
ご返信ありがとうございます。
先ず、一昨日のコメントはスパムに入っていましたので復活させました。失礼いたしました。

また、cshaprdotnetさんの返信を読んで少し状況が飲み込めてきました。私の今後のコメントのいくつかは前のコメントと矛盾するかもしれません。
ご質問に答える前に一つWEBページを紹介します。

「Why I Have Given Up on Coding Standards」
http://www.richardrodger.com/2012/11/03/why-i-have-given-up-on-coding-standards/#.WQp73_6wd9M

もし英語が読めるのなら今のcshaprdotnetさんにお勧めのページです。誤解してほしくないのはコーディング規約をあきらめろと言いたい訳ではなくコーディング規約信奉者になる危険性を説明しているという風に読んでければと思います。特に途中で、

『幾度となく醜いコードにうんざりさせらる中で、あなたは、自分が只の半人前であると気づく。そして、コードコンプリート、プラグマティックプログラマー、ジョエルのコースに出会い、それに没頭し真のエンジニアへの道に進む。

そして何が起こるか? (中略) 貴方の生産性は2倍になりあなたはこの金言を広げる必要性を感じる。そして、あなたは伝道師となり上司にベストプラクティスと規約の必要性を説いたり、それに従わないコードをブログに書いたりする。

(中略) あなたはコーディング規約という名の法律を作る。

それで終わりである。いつものようにつらい仕事は続き、デスマーチは続き、バグの発生は同じで、同じ悲劇が起こる。それは銀の弾ではない。』

訳が怪しいところがありますが、意味はおさえているつもりです、突き刺さるものがあるかと思います。またこの記事のコメント欄に

『All programmers hate other programmers’ code. (全てのプログラマーは他人が書いたコードを嫌う。)』

というのがありますね。考えさせられないでしょうか?


さて、『スキルミスマッチの人がプロジェクトに配属された場合にどうするかということです。』の件ですが、過去の私の経験に基づいて話しますとスキルミスマッチの人は変えてもらうようにその人の上司や私の上司に要望を出します。時には「変えないと会社を辞めるぞ」と言って変えさせたこともありましたし、状況的に変えられない時はその担当者にプレッシャーを与えます(ミス等をしたときに怒ったりして、厳しく対応します)。怒ったりするのはあまり程度が良くないですが現実問題として効き目は効果的で『怒られるからちゃんとする』ようになります。ただしそのエンジニアとの関係は壊れます。

ただ、私の25年の経験において『プロジェクトメンバーの半数がスキルミスマッチ』ということはありませんでした。もちろんですが私の運がよかったということもあります。ただ、私は

コーディング規約に従わない → スキルミスマッチ

と判断しません。概ね

1.プログラムが書けない
2.その状況を変えようと努力しない
3.上司や同僚が、私の1.2.の判断を支持する。

という状況下で、私はそのメンバーを追い出すことを検討します。

他にも返信したいことがありますが、取り急ぎ質問にお答えします。残りはこの連休にまたということで。

>>もう少しお付き合いいただければと思います。
>よくよく考えたら、この文言はおかしいですね。
>コメントを書いた後、なんとなく終わった気になっていました。

細かな言い方はあまり気にならないタイプなので大丈夫です。

>>技術的な話は次に、教育的な観点ではその次にコメント

> こちらについてもコメントをお待ちしております。

了解です。
ohfujiより
2017-05-05 11:04:05
連休を満喫してますのであまり多くは書けませんし、こういう指摘をするのも大変気が重いのですが、1点重要な指摘をしなければなりません。

>「全部の条件がif文内の一つの行に収まっている」というのは、別プログラマから言われたことがあります。
> 設計書の通りで対応関係も分かりやすいという意見でした。
>それほど悪いコードでもなさそうですが、if文内の冗長な条件はbool型の変数にしてほしいという思いはあります。
> (firstApproverId != null => firstApproved など。)

firstApproverId != null

firstApproved

はコードが述べている内容が同じなので同じコードという認識が必要かと思います。つまり書き換える必要はありません。もしコードコンプリートを勉強されてブール型変数の効用ということでこの例を出されるのなら、残念ですが充分に理解されていないと指摘せざるを得ません。コードコンプリート(第2版)をお持ちでしたら12.5『Boolean Variables』、19.1『Boolean Expressions』および19.6『Control Structures and Complexity』をよく読んで下さい(私が持っているのは英語版なのでタイトルは英語になります)。著者が伝えたいことはこういうことではないことが解るはずです。ちなみに複雑なif文に対する規約としては19.6を参考に書かれることをお勧めします。

コードコンプリートを調べた結果をお聞かせいただければと思います。

が、そもそもこのような規約を作ること自体の意義について検討してみてください。そのプロジェクトでブール型変数が使えるプログラマが少数ということでしたら規約を変更することをお勧めします。cshaprdotnetさんが100%理解していないブール変数の効用を他人に紹介してもうまく使いこなしてくれるとは限らないでしょうし、誤解に基づいてレビューをして果たしてメンバーは学んでくれるでしょうか?

少ないですが今日のことろはここまでです。
ohfujiより
2017-05-05 11:25:07
久しぶりにコードコンプリートを読んでたのですが、もう一つ参考になる部分がありました。
19.4 『Taming Dangerously Deep Nesting』の『Convert a nested if to a set of if-then-elses』では元のコードの方が良いと解釈できることが書かれていますね。「全部の条件がif文内の一つの行に収まっている」ので他のelse if文から独立している。ので順番の入れ替えが可能とのことです。こちらも合わせて調べてみてご見解も聞かせて下さい。
cshaprdotnetより
2017-05-05 13:05:50
ohfujiさん

>if文内の冗長な条件はbool型の変数にしてほしい

コードコンプリートを読み返して、これは本来私が伝えたかったことでは
ないことに気づきました。

firstApproverId != null => firstApproved
は、bool型変数によって読みやすくするという話ですね。

ではなぜコードの冗長性の話をしたかというと、元ネタの話にひきづられていました。
例えば、
if ((A and B and C and D) || (A and B and C and E) || (A and B and C and F))
A and B and C = T(変数、あるいはメソッド)

にしてほしいということが言いたかったことです。
(T and D ) || (T and E) || ( T and F) => T and (D || E || F)
ということにも気づきやすいので、さらに簡潔にできます。

サンプルコードには、ここまでの条件文を載せていいないので、
目に付いた「firstApproverId != null => firstApproved」
を出していましたが、可読性を挙げる話だったので的外れでした。


ただし、上記の可読性を挙げるという話であっても、このままで十分だから
書き変える必要はないという指摘をohfujiさんから受けたと思います。


>19.4 『Taming Dangerously Deep Nesting』の『Convert a nested if to a set of if-then-elses』では元のコードの方が良いと解釈できることが書かれていますね。
19-32が分かりやすいです。
このコードだと、冗長であることは気になりません。

例えば、
1000 over1000
100 over100
というように変数にすると、if, else if間で依存性が発生してしまい
他のif文の影響を受けるので複雑さが増えるだけです。
また、変数にすると分かりにくい例ともいえるので、19-32のままで良いことが分かります。
この部分は、今まで間違って解釈していました。

コードコンプリートの理解が足りていなかったことは認めます。
19-32を意図して書いたプログラマに対して、bool型変数にするという指摘をして納得されないのは
理解できました。


以上を踏まえると
>そもそもこのような規約を作ること自体の意義について検討してみてください

bool型変数に対して理解不足であるなら、良さを伝えられない可能性を理解できました。
ただ、読みにくい条件分をbool型変数やメソッドにすることで可読性が上がること自体は知ってほしいですが
Mustにするべきではありませんね。

>ちなみに複雑なif文に対する規約としては19.6

この話はすっかり忘れていましたが、客観性があって、よいガイドラインです。
勉強になりました。
ohfujiより
2017-05-05 13:31:32
自己レスです。ばらばらとすみません。

>そもそもこのような規約を作ること自体の意義について検討してみてください。

おっと、『ややこしい条件分岐』は規約ではなくて検討事項でしたね。
『Bool型の扱い』と『ややこしい条件分岐』にあるbool型変数の根っこにある論旨が同じように受け取れたので私の2個前のコメントになります。


『Bool型の扱い』
http://qiita.com/csharpisthebest/items/b0c44764948e1334e94a

せっかくですので『Bool型の扱い』についてコメントしますが、恐らくこの規約はプロジェクトメンバに対しての足かせ以上の効果は期待できないでしょう。
『Bool型の変数名はis+形容詞(あるいは形容詞のみ)や過去分詞』とありますが、コードコンプリートの19.1 内の「Making Complicated Expressions Simple」の例に、

Dim legalLineCount as Boolean

という例があります。これは名詞(句)ですよね?その他コードコンプリートを探せば(規約違反)のコードを見つけることができるでしょう。これは規約が間違っていると判断された方がよろしいかと思います。
ohfujiより
2017-05-05 14:37:05
ご返信ありがとうございます。

>2017-05-05 13:05:50

ご返信のとおりです。続いてもう少し突っ込んで話します。

ご返信のとおり、ブール型の変数の効用は、

1.複数の判定をまとめて中間値として保持する
2.判定のラベル付け(意味付け)を行う

と説明されています。また複雑な条件の料理法についてコードコンプリートは一見すると矛盾したアドバイスもしているという話になります。


>if ((A and B and C and D) || (A and B and C and E) || (A and B and C and F))
> A and B and C = T(変数、あるいはメソッド)

>にしてほしいということが言いたかったことです。


このような変換がビジネスプログラムで有効かどうか怪しいというのが私の意見になります。コードコンプリートでは、

T = (A and B and C and D)

とした場合にそのT自体に意味がある例をあげています。なのでもしA and Bに意味があるのなら
T = A and B
if ( (T and C and D) || (T and C and E) || (T and C and F) )
という分割もありだと思います。形式的にみると変ですが、

if ( ( done && legal && is_post ) || ( done && legal && is_approvement ) || ( done && legal && is_reject ) )

というのがコードコンプリートの例でしょう。

このようなbool値による(条件式の抽象化)はシステムプログラムでは有効だと思います。判定式を読んでもその意味するところが解らないことが良くあるので、変数に保持しながらコメントを入れることは上手い手だと思いますし私もそうしたこともありました。
しかしながら、ビジネスロジックに限定して話をしますと、私はこのように上手く行く例は少ないと思っています。あるif文で判定を繰り返しているから一つにまとめるというのが、コードコンプリートでは悪い例としている場合もあり、有効かどうかの判断がつかないです。これ以上は具体的なコードを元に話さないと厳しいので何とも言えない面があります。よろしければプロジェクトメンバの方と話してみてください。でさらに、よろしければ結果を教えて頂ければ面白かったりします。

P.S.
ちなみに19-32とういのは私が持っている本では無かったです。日本語版と英語版の違いですかね。
cshaprdotnetより
2017-05-05 14:43:59
>これは名詞(句)ですよね?

名詞句が抜けていたので修正しました。isをつけるかどうかは慣例的なものなので、意味が通れば問題ないです。
legalLineCount
でも問題ないですね。bool型なのかどう一見分からないですが、if文とあわせてみると違和感はないです。

>この規約はプロジェクトメンバに対しての足かせ以上の効果は期待できないでしょう
これも検討事項にします。
cshaprdotnetより
2017-05-05 15:03:42
ohfujiさん

書き込むタイミングが同じだったようで、続きを書きます。

>ビジネスロジックに限定して話をしますと、私はこのように上手く行く例は少ない

同意です。Tに置き換えれば上手くいくという例は、これまで一機能だけでした。
T自体にも意味がある稀な例でした。

>よろしければプロジェクトメンバの方と話してみてください
機能自体は結局無しになったという点とプロジェクトを移動してしまったので、難しいかもしれません。


>19-32
日本語版だとサンプルコードにリスト19-?という連番がついていました。
英語版だとサンプルコードの連番は違ったりしますか?(章と勘違いされいたら申し訳ない)
ohfujiより
2017-05-06 17:09:16
返信が遅くなりましてすんません。
状況が飲み込めてきましたのですが、どのように返信をしようか迷っておりました。

先ずは、
>2017-05-05 15:03:42
の件は了解しました。ちなみに英語版ではサンプルコードのリスト番号がないですね。

さて、cshaprdotnetさんは複雑な条件の料理法としてbool式(およびbool型の変数)を駆使することにより、if文を読みやすくするということをされていると理解しました。もちろんこれはこれで良いのですが、実際の業務アプリの開発ではそれでも条件が複雑で厄介だと思います。コードがぐちゃぐちゃになりメンテナンス性や可読性を保つのに苦労されており、コーディング規約を作り、コードレビューを行うことでそれに対応されているということだと思います。ついでに言いますとそれはあまり効果的でないような気がするというのが私のコメントになりますが、『じゃどうするんだ?』というのがあるかと思います。

これが、felisさんのコメントになるのですが、コードコンプリートにもヒントがあり、18 Table-Driven Methods(日本語だとテーブル駆動なんたらだったと思います)。になります。で、能書きを垂れても仕方ないので、サンプルを示します。

http://www.ohfuji.name/download/20170506/sample_code.html

になります。で動くコードじゃないと意味がないかと思いますのでC#のプロジェクトファイルを以下に保存します。

http://www.ohfuji.name/download/20170506/sample.zip


先ずは実行したり、コードをみたりして頂ければと思います。もっとも私はC#はネイティブでないですし、せっかくということで勉強の為にWPFプロジェクトを試してみてます。VS2012で作成しております。
ohfujiより
2017-05-06 17:55:01
自己レスです。

少し粗削りすぎるので一部コードを修正しました。
ちなみに書いてませんでしたが、以下のコードは、

http://www.ohfuji.name/download/20170506/sample_code.html

この『ややこしい条件分岐』を私がリファクタリングしたものになります(他の方への補足です)。
http://qiita.com/csharpisthebest/items/99af9136883f139ad70f
cshaprdotnetより
2017-05-06 18:33:26
ohfujiさん

サンプルコードの件、ありがとうございます。

>さて、cshaprdotnetさんは複雑な条件の料理法としてbool式(およびbool型の変数)を駆使することにより、if文を読みやすくするということをされていると理解しました。もちろんこれはこれで良いのですが、実際の業務アプリの開発ではそれでも条件が複雑で厄介だと思います。コードがぐちゃぐちゃになりメンテナンス性や可読性を保つのに苦労されており、コーディング規約を作り、コードレビューを行うことでそれに対応されているということだと思います。

まさにこれです。

>ついでに言いますとそれはあまり効果的でないような気がする
>18 Table-Driven Methods(日本語だとテーブル駆動なんたらだったと思います)

実は、Table-Drivenは良く使用するのでサンプルコードは違和感がありません。
そういう意味では、自分のtable-Drivenの使い方は間違っていないということも再確認できました。

一方、ここでのやりとりで気づいたことがあります。
Qiitaの記事は個人の経験にもとづいていることもあり、妥当であるかどうかは判断できません。
そして、100%正しいといえないものをルール化するべきではないことが、良く分かりました。
また、規約を守らせるにはどうするかというより、足かせになるくらいなら無くすという選択肢もあるのだと気づきました。

さらに、スキルミスマッチに関するohfujiさんの回答をみて、分かったことがあります。
私のスキルミスマッチのプログラマはohfujiさんからみると「平凡なプログラマ」です。
しいていうなら、プログラムはかけるが、効率の悪いコードばかりでスケジュールも守れないプログラマをどうするかということですが、私の記事に書いたことを気にしなくても、上手く運用はできるのだろうと推測しました。

たとえば、テーブル駆動にするというのは、規約にしなくても対応できる一つの対応案です。

では、どうするのかということですが、以下の通りです。
1. Qiitaの記事のうち「検討事項」にあたるものは、コードレビュー時の参考にはしても強制はしない。
2. Qiitaの記事のうち「規約」にあたるものは、守ってはほしいが、足かせになるのであればはずす。
3. 「検討事項」は教育目的では使用できるので、活用法は別途考える。
4. コードレビューで指摘するのは、クリティカルになるものだけで、グレーのものは内容次第では指摘しない。
5. 詳細設計の時点で複雑なコードが予想される部分は、複雑さ軽減のため、何かしら対応をする。

英語のリンクもそうですが、自分が良いと思った方法を他人に課すというのは意味がないという結論にいたりました。
しかし、教育目的で話してみるのは価値があり、そこで成長するかどうかはプログラマに任せることにします。


結局のところ、最初にいただいたコメント通りだと思いました。
>逆に言いますとメソッド内のコードの良し悪しはあまり見ていません。もちろん場合によりけりですが何時でも書き換えられるのならもっと別の大きな問題を考えたいです。

私としては、結論が出てしまったので、ここで終わりにするのもありかと思いますが、いかがでしょうか?

>技術的な話は次に、教育的な観点ではその次にコメント

これは読んでみたいですが、無しでもかまいません。


>ちなみに英語版ではサンプルコードのリスト番号がないですね。

これは日本語版の配慮でしたか。了解しました。
ohfujiより
2017-05-06 20:52:27
cshaprdotnetさん

結論が出たということで私的にも同意できますし、ちょうど連休も終わりになりましたのでこの辺りでお開きが良いかと思います。

恐らくですが技術面な話は私からはもう不要だと思います。教育的な面で少しだけ補足しますと実はプロジェクトメンバに対して上手く教育ができるタイミングがあります。
一つはコードを書く前にプログラマがどうコーディングしようか悩んでいる時に、的を得たアドバイスをすると効果的です。
他には、あまりにもバグが出てそのエンジニアが自信喪失したとき。その他には、担当者間でクロスレビューをさせた時に彼らの間で揉めて判断がつかない時とかです。何れにしても彼らが迷ってアドバイスを欲する時があります。
そういう時の為に彼らに対して有効なコンテンツを作ることには意義があるかと思います。

では、長々とありがとうございました。
cshaprdotnetより
2017-05-06 21:44:42
教育面の補足に関しても同意できる内容です。

これまで話した内容は、自分の考え方を180度変える話でもありました。
自分の意見が否定され、それが正しいと思えたときは不快にもなりましたが、
途中に逃げ出さず、答えを出せてよかったです。

一方、連休中にここまで付き合っていただいた点に関しましては、ありがたいと同時に申し訳なかったです。

ここまで長くお付き合いいただき、ありがとうございました。
ohfujiより
2017-05-07 10:27:43
書き方には気を付けたつもりですが不快に思われた点は申し訳ないです。が有意義に話が出来てよかったです。

私はもともと変数名の付け方はいい加減で昔に本を読んで勉強はしてましたが、今回改めて整理ができました。ので私も勉強になりました。

では、お互いにプロジェクト頑張りましょう。
ohfujiより
2017-07-22 14:42:15
7/11~12までのコメントを非表示対応としました。一連のコメントは以下のページにまとめています。
http://www.ohfuji.name/page.awp?page_id=3071

コメントをどうぞ


『不適切なコメントへの対応』を一読下さい。
現在コメントは承認制となっております。

Previous Page | Next Page