しまてく

学んだ技術を書きためるブログ

若手IT勉強会を振り返ってみた

先日12/11に若手IT勉強会を行いました。
内容はJohn Resigが執筆中のSecrets of the JavaScript Ninjaの
8章:With Statementsです。

Secrets of the JavaScript Ninjaとは

Secrets of the JavaScript Ninja

Secrets of the JavaScript Ninja

jQueryの作者であるJohn Resigが絶賛執筆中のJavaScript本です。
現在はまだ未完の為、電子書籍という形で購入して読み進めています。

8章:With Statements

JavaScriptにおけるwithステートメントというのは大分嫌われ者だったりします。
その理由として遅いというのが強くあり、なおかつその使い方が難しい為
正しく使えていないというのが現実問題としてあるようです。

しかしResig曰く、正しく使えばこんなにパワフルなものはないという事です。

それではなにがすごいのでしょうか?

プロトタイプコールを減らせる

例えば以下の例のように、prototypeを辿るコストを節約できます。

Object.extend(String.prototype.escapeHTML, {
    div: document.createElement('div'),
    text: document.createTextNode('')
});
with (String.prototype.escapeHTML) div.appendChild(text);
タイプ量が減る(コードの可読性向上)

下の例ではwithを使わないとたくさん「this.」をつける必要があります。

var Rect = Base.extend({
    constructor: function(left, top, width, height) {
        this.left = left;
        this.top = top;
        this.width = width;
        this.height = height;
        this.right = left + width;
        this.bottom = top + height;
    },
    contains: function(x, y) {
        with (this)
          return x >= left && x <= right && y >= top && y <= bottom;
    },
    toString: function() {
        with (this) return [left, top, width, height].join(",");
    }
});
オブジェクト指向で書ける。

下の例ではcloakedという外からは絶対に触られることのないプライベート変数を作ることができます。

function Ninja(){with(this){
    // プライベート変数
    var cloaked = false;

    // パブリック変数
    this.swings = 0;

    // プライベートメソッド
    function addSwing(){
        return ++swings;
    }

    // パブリックメソッド
    this.swingSword = function(){
        cloak( false );
        return addSwing();
    };
    this.cloak = function(value){
        return value != null ?
            cloaked = value : cloaked;
    };
}}

いいところばかりじゃない

下のコード実行にかかる時間を測定したところやっぱりwith使うと遅い。

var obj = { foo: "bar" }, value;
// "No With"
for ( var i = 0; i < 1000; i++ ) {
    value = obj.foo;
}
// "Using With"
with(obj){
    for ( var i = 0; i < 1000; i++ ){
        value = foo;
    }
}
// "Using With, No Access"
with(obj){
    for ( var i = 0; i < 1000; i++ ){
        value = "no test";
    }
}


結果

平均 最小 最大 偏差
with 不使用 0.14 0 1 0.35
with 使用 1.58 1 2 0.50
with 使用 / アクセスしない 1.38 1 2 0.49

これだけだとよくわからないので自分でも測定。
http://www.cimadai.cz.cc/apps/with#summary
個々のマシンや実行環境による誤差はありますが、大体の傾向はこれで読めます。


上のグラフから見ると、withを使うとwithに渡したオブジェクトのプロパティを
触ろうが触るまいが劇的にパフォーマンスが落ちるというのが分かります。

まとめ

ある程度のパフォーマンス低下があるということを踏まえた上で、withを使うことがメリットと
判断できる場合に限りwithを導入してみるといいのかもしれませんね。

振り返り

若手IT勉強会も22回継続してやってきました。


勉強会の初めのきっかけは、懇親会などでは何度も言っているのですがid:amachangの影響が
非常にあります。
id:amachangの発表を見たり、勉強会やろうぜ!という話を聞いて「あぁ、俺もやろうかな」
という感じで勉強会を始めました。


最初のうちは自分の勉強の為にやっていたのですがそのうち人も増えていき、自分を含めた
若手エンジニアでどんどん勉強したい!という思いに変わり、読書会/コードリーディング/
ust中継/LT/発表などいろいろやってきました。


若手IT勉強会は毎回来てくれるなじみのメンバーと新しく参加してくれる人が半々くらい
なのですが、回を重ねるごとに自分を含めて毎回来ている人はどんどん詳しくなっていって
基本的なところは流しがちになっているなぁ、というのを感じていました。


元々は若手IT勉強会という名が表している通り若手に対して門戸を広げたいという思いもあり
基礎をおざなりにするのはちょっと違うのかな、と思い始めていました。


そこで若手IT勉強会を振り返ってみて、勉強会の方針としてどの層をターゲットにしようか、
という事を考えました。
その結果いま新卒〜3年目あたりの人*1を対象に、プログラム楽しいよ、JavaScript楽しいよ
的な事を勉強会を通じて教えられたら素晴らしいかなぁなどという考えに至りました。


まだまだ僕も勉強中だし大それたことは言えないですが、1年そこそこで腐ってプログラムを
辞めてしまうのはこの業界にとって良いことではないのではないでしょうか。


というようなことを22回目の懇親会の場で打ち明けたところ、みなさん快くやりたいように
やればいいと言ってくれたので今後の基本方針として下の2点を念頭に置いて勉強会運営を
していきたいと思います。

  1. 勉強会の技術レベルを若手(初級者)に合わせる。
  2. 新しい人にどんどん参加してもらう。


ただこれだけだと今まで継続してやってきている人は物足りないと思いますし、自分もいろいろ
チャレンジしたい気持ちもあるのでなにか別の勉強会を作るか、、他の勉強会に参加するか、、、


いずれにせよ若手IT勉強会の立ち位置としては若手中の若手の為の勉強会というスタンスで
今後進めようと思いますので、今後ともよろしくお願いします。

次回宣伝

次回は2011/01/29 14:00- 第9章 Code Evaluationやります。
Objective-Jとかおもしろい言語がでてきたりします。
http://atnd.org/events/10996

よろしくお願いしますー

*1:自分よりも全然すごいエンジニアも多かったりするのですが。。。