SSブログ

ブリッジメソッド(2) [Java]

櫻庭さんから、Eclipseでコンパイルされたものは、JDKと異なるというコメントをいただきましたので調べてみました。Eclipseでコンパイルされたものをjavapで調べて見ると次のようになりました。
C:\Users\Yoshiki Shibata\workspace\bridgemethod\bin>javap C
Compiled from "C.java"
class C extends java.lang.Object{
    C();
    C dup();
    public java.lang.String toString();
}

C:\Users\Yoshiki Shibata\workspace\bridgemethod\bin>javap D
Compiled from "D.java"
class D extends C{
    D();
    D dup();
    public java.lang.String toString();
    C dup();
}

C:\Users\Yoshiki Shibata\workspace\bridgemethod\bin>javap E
Compiled from "E.java"
class E extends D{
    E();
    E dup();
    public java.lang.String toString();
    D dup();
}
この場合、次のコードを実行しても正しくクラスEtoStringメソッドが呼び出されます。
class CovariantReturnType {
    public static void main(String[] args) {
        C c = new E();
        C dup = c.dup();
        System.out.println(dup);
    }
}
この場合、c.dup()では、クラスDC dup();が呼ばれて、それがD dup();を呼び出すのですが、そのメソッドはクラスEでオーバーライドされているため、クラスED dup();を呼び出します。クラスED dup();は、E dup();を呼び出すという次第のようです。

ブリッジメソッド [Java]

社内で開催している「プログラミング言語Java」研修の受講生の一人から、拙著『Java 2 Standard Edition 5.0 Tiger』のp.25のjavapの出力が実際には違うという指摘を2度も受けたので、確認してみました。内容は、次の通りです。

次のように3つのクラスCDEがあります。
class C {
    C dup() {
        return new C();
    }
    public String toString() {
        return "instance of class C";
    }
}

class D extends C {
    D dup() { // 共変戻り値型
        return new D();
    }
    public String toString() {
        return "instance of class D";
    }
}

class E extends D {
    E dup() {
        return new E();
    }
    public String toString() {
        return "instance of class E";
    }
}
それで、この3つのクラスをコンパイルします。
C:\Users\Yoshiki Shibata\Desktop\ftp\code\code\024>javac -version
javac 1.6.0_21

C:\Users\Yoshiki Shibata\Desktop\ftp\code\code\024>javac E.java

C:\Users\Yoshiki Shibata\Desktop\ftp\code\code\024>
javacのバージョンは、1.6.0_21と表示されています。次に、javapコマンドでクラスEを調べます。
C:\Users\Yoshiki Shibata\Desktop\ftp\code\code\024>javap E
Compiled from "E.java"
class E extends D{
    E();
    E dup();
    public java.lang.String toString();
    D dup();
    C dup();
}
本に書いてあるように、3つのdup()メソッドがあるのが分かります。受講生の主張は、2つしか表示されないというものでしたが、一体どんな環境で確認したのか疑問に残ります。

OracleからリリースされているJDKのjavac以外のコンパイラで、クラスEdup()が2つしか生成されないものがあるのでしょうか?

書籍『Android SDK 開発クックブック』予約受付開始 [プログラマー現役続行]

Android SDK 開発クックブック

Android SDK 開発クックブック

  • 作者: ジェームズ・スティール
  • 出版社/メーカー: ピアソン桐原
  • 発売日: 2011/07/26
  • メディア: 単行本(ソフトカバー)

私にとっては、10冊目の翻訳本になる『Android SDK 開発クックブック』がAmazon.co.jpで予約可能になりました。本の副題は、「一から身につくプログラミング技法のレシピ集」となっています。

目次だけを抜粋したPDFを、ホームページに掲載しましたので、参考にしてください。
http://www001.upp.so-net.ne.jp/yshibata/adc/ADC_Contents.pdf

原著は、こちらの本です。

The Android Developer's Cookbook: Building Applications with the Android SDK (Developer's Library)

The Android Developer's Cookbook: Building Applications with the Android SDK (Developer's Library)

  • 作者: James Steele
  • 出版社/メーカー: Addison-Wesley Professional
  • 発売日: 2010/10/27
  • メディア: ペーパーバック

(「技術書の翻訳」「技術書の翻訳(2)」)

「プログラミング作法」教育(2) [プログラマー現役続行]

昨日(7月11日)と今日(7月12日)の2回に分けて、情報系新卒新人向けに「プログラミング作法」教育を行いました。コース内容は、書籍『プログラミング作法』(The Practice of Programming)の第1章「スタイル」を要点を読みながら解説して、さらに実際の経験からのコード例なども話します。また、練習問題も二人か三人を一組として割り当てて解いてもらい、解答の確認を行う形式です。

プログラミング作法

プログラミング作法

  • 作者: ブライアン カーニハン
  • 出版社/メーカー: アスキー
  • 発売日: 2000/11
  • メディア: 単行本

現在の勤務先で、情報系新卒新人に集合教育として行ったのは今回が初めてでした。教育コースとして私自身が教育を始めたのがいつだったかは正確には覚えていないのですが、おそらく2000年だと思います。多い時で、年に4回行ったことがあるので、通算すると30回弱はすでに行ったことになるかもしれません。

今回、質問として「10年前の本ですが、内容は陳腐化していないのですか?」というのがありました。この本の内容はほとんど陳腐化していませんし、私が「勉強会ノート」の表紙に書いていることは今でも当てはまります。
1 章と2 章だけでなく、すべての章で有益なことが書かれていますので、是非全体を読んで ください。初心者には分かり難い部分も多いですが、その場合には、職場の経験ある先輩 に聞いてください。でも、正しく説明出来る人は多くないと思います。「The Practice of Programming」に書かれている内容がすべて説明できるようになれば、一人前のソフトウェ ア・エンジニアと言っても過言ではないでしょう。
2000 年5 月14 日 柴田 芳樹

「プログラミング作法」教育
※ このコースの中で話す私が見た悪いコードの例は、この2年で確実に増えています。

プログラマーとしての練習 [プログラマー現役続行]

The Clean Coder: A Code of Conduct for Professional Programmers (Robert C. Martin Series)

The Clean Coder: A Code of Conduct for Professional Programmers (Robert C. Martin Series)

  • 作者: Robert C. Martin
  • 出版社/メーカー: Prentice Hall
  • 発売日: 2011/05/23
  • メディア: ペーパーバック

この本の「Practice」という節には、プロフェッショナルなプログラマとしての練習(practice)について次のように述べられています。
Practice

Professionals practice. True professionals work hard to keep their skills sharp and ready. It is not enough to simply do your daily job and call that practice. Doing your daily job is performance, not practice. Practice is when you specifically exercise your skills outside of the performance of your job for the sole purpose of refining and enhancing those skills.

What could it possible mean for a software developer to practice? At first thought the concept seems absurd. But stop and think for a moment. Consider how musicians master their craft. It's not by performing. It's by practicing. And how do they practice? Among other things, they have special exercises that they perform. Scales and etudes and runs. They do these over and over to train their fingers and their mind, and to maintain mastery of their skill.

So what could software developers do to practice? There's a whole chapter in this book dedicated to different practice techniques, so I won't go into much detail here. One technique I use frequently is the repetition of simple exercises such as the Bowing Game or Prime Factors. I call these exercises kata. There are many such kata to choose from.

A kata usually comes in the form of a simple programming problem to solve, such as writing the function that calculates the prime factors of an integer. The point of doing the kata is not to figure out how to solve the problem; you know how to do that already. The point of the kata is to train your fingers and your brain.

I'll do a kata or two every day, often as part of settling in to work. I might do it in Java, or in Ruby, or in Clojure, or in some other language for which I want to maintain my skills. I'll use the kata to sharpen a particula skill, such as keep my fingers used to hitting shortcut keys, or using certain refactorings.

Think of the kata as a 10-minute warm-up exercise in the morning and a 10-minute cool-down in the evening.
解決方法が分かっている問題を、練習として行うことが述べられています。そして、仕事でプログラミングすることは、練習ではなく、パフォーマンスだとも述べられており、プロのプログラマであれば練習をすべきだということです。

これを読んでから、簡単な問題をテストファーストで解く練習をやり始めてみました。最初は、30分とかかかっていたものでも、毎日繰り返していると10分ぐらいで終わったりします。あるいは、本を見ながら何とか書いた短いスクリプトでも、何も見ずにスラスラと書けるように練習したりするようにしています。

短い練習ですが、練習することで、自分のスキルを維持して向上させるのに役立つかと思います。

ワイヤレスレーザマウス [その他]

この数週間、BluetoothマウスをVAIO Xが認識しなくなりました。マウスそのものはMacBookでも認識するため、どうもVAIO X側が問題だというのは分かったのですが、色々と調べたり試したりしても全くダメだったので、新たなマウスを購入することにしました。

青葉台の石丸電気で見て選んだのが次のマウスです。


マウスは頻繁に買い換えるものではないのと、最近のマウスはどういうものがあるのかも知らなかったため、普通のUSBケーブル接続のマウスを買うつもりで行ったのですが、Bluetooth以外のワイヤレスマウスがある(というよりもそればかり)というのを知りました。店頭に置いてある中でもっとも小さいものを選びました。

USBポートに挿入するレシーバーは、マウスにそのまま収納できるようになっています(たぶん、他のワイヤレスマウスもそうではないかと思いますが)。電池は、単4電池が一本です。

技術者のレベルとソフトウェア開発の難易度(9) [プログラマー現役続行]

これまでは、開発するソフトウェアの難易度と技術者のスキルレベルのミスマッチが発生すると開発が遅れたり技術的負債が残ったりしていくことを書いてきました。

実際の開発では、技術者のスキルレベルを直接測定する方法の決定版というものはありません。でも、きちんとした開発組織では、マネージャは技術者のレベルを把握していたりします。

なぜ、そうなるかというと、開発するソフトウェアの難易度を理解しているマネージャの場合には、技術者に開発業務を割り当てて開発してもらい、その進捗や成果物を自分の経験に照らし合わせて、技術者のスキルレベルを評価するからです。そして、どのような技術領域が不足しているか、そのためにどのような教育をしなければならないかも考えることになります。

これは実は非常に当たり前のことなのです。新人であれば、まずはその新人にとって妥当だろうと思われる開発業務を与えて、その成果次第でより難易度の高い開発業務を与えるか、逆に必要な知識が不足していることが分かり、業務の難易度を下げるとかする訳です。

ここで重要なことは、開発業務を割り当てるマネージャ自身が、与えた業務を自身で行うことができるスキルレベルであることです。そして、各開発者へ必要な技術指導や成果物のレビューもきちんとできることが必要です。スキルレベルが不十分だと、技術指導や成果物のレビューもできなかったり、しなかったりとなります。そして、その結果、開発業務の難易度と担当させる技術者のスキルレベルのミスマッチが発生することになります。

技術者のレベルとソフトウェア開発の難易度(8)
技術者のレベルとソフトウェア開発の難易度(7)
技術者のレベルとソフトウェア開発の難易度(6)
技術者のレベルとソフトウェア開発の難易度(5)
技術者のレベルとソフトウェア開発の難易度(4)
技術者のレベルとソフトウェア開発の難易度(3)
技術者のレベルとソフトウェア開発の難易度(2)
技術者のレベルとソフトウェア開発の難易度

組織のDNA(3) [プログラマー現役続行]

ソフトウェア開発組織においては、開発する技術の難易度や担当させる技術者のスキルレベルをリーダやマネージャが把握できないまま、開発計画を立てるようになると、きちんとスケジュールを見積もるという行為そのものを行わなくなってしまう可能性があります。

その結果、製品出荷予定日から逆に引いたスケジュールを立てることしかできなくなったりします。そして、詳細なスケジュールに関しては、全体スケジュールに合ったものしか受け付けないということが起きてしまいます。スケジュールが守られている時は良いのですが、遅れたときの対応が組織によっては大きく異なってきます。

通常、遅れた場合には、その原因に基づいて、対策を考えるのはリーダーやマネージャの役目です。無理なスケジュールを立てさせられた現場が行うことではありません。リーダーやマネージャの立場であれば、チーム全体での仕事の調整も含めて対策を検討することが可能です。

ところが、そもとも技術の難易度やエンジニアのスキルを把握できていないリーダーやマネージャの場合には、「挽回策を考えて報告しろ」と現場の担当者に言うことしかできなかったりします。問題なのはそのようなリーダーやマネージャだけではなく、そのようなリーダーやマネージャが多数を占めてしまうようになった開発組織です。この悪い意味でのDNAを持ってしまって大きくなった組織では、DNAを書き換えるのは非常に難しいかもしれません。

(「組織のDNA」「組織のDNA(2)

WiMAXに加入しました [WiFi]

翻訳作業や原稿書きなどを自宅ではなく外で行う場合には、スターバックスやマクドナルドなどでdocomoかmobilepointのWiFi環境を使用できる場所を利用することが多いです。しかし、そのような環境がない喫茶店とかでも作業したいので、(so-netの)WiMAXを申し込みました。

玉川学園前駅でよく利用する喫茶店として「パン・ド・ジロー 玉川学園」があります。このお店が良い点は、①禁煙であり、②比較的空いていて座る席も必ず見つかるということです。会社帰りに海老名駅や町田駅でスターバックスに寄ろうと思っても、とにかく混でいることが多いです。そのため、お店を覗いて、やはりやめたということでそのまま帰宅したりすることがほとんどです。その点で、「ジロー」ではそのようなことはないのですが、難点がインターネットへの接続環境がないことでした。

ドコモの携帯で、アクセスポイントモードになる携帯電話も持っているのですが、それを利用すると結構な金額になってしまいますので、携帯電話のアクセスポイントモードはほとんど使用していませんでした。ということで、明日からは電波状態が良ければ、色々な場所で作業ができそうです。9月末までサマータイムということで、16時30分には退社するので、「夕活」するために利用することになります。

今日、ATerm WM3500Rが届いたので早速セットアップしてみました。残念ながら、自宅のマンションでは電波状態は良くなく、2Mbps程度のスピードしかでませんでした。したがって、有線のインターネット接続の代替えには全くなりません。ただ、この機会に、so-netの基本の接続コースを最も安いコースに変更しました。

※ 実は、美味しいパンが食べられて、ビールかワインが飲めるというのも良い点です。

総閲覧数が総計で100万を超えました [総閲覧数]

6年半前に、このブログを作成し最初の記事を書いたのですが、その後しばらくはほとんど何も書いていませんでした。昨日、総閲覧数が総計で100万を超えました。