仙石浩明の日記

2007年8月9日

脳の中の「私」はなぜ見つからないのか? hatena_b

人の「意識」は心の中心ではなく、脳の様々な活動のロガーに過ぎなかった!」で、

脳はなぜ「心」を作ったのか
「私」の謎を解く受動意識仮説
前野 隆司 著

を紹介したら、前野先生の最新作である次の本を頂いた:

脳の中の「私」はなぜ見つからないのか?
ロボティクス研究者が見た脳と心の思想史 (ハードカバー)
前野 隆司 著

頂いたから言うのではないが (^^;)、この本は素晴らしい。

なにが素晴らしいかというと、

第5章 哲学者との対話
1 現象学
斎藤慶典 (慶応義塾大学文学部哲学科教授)
2 生態学的心理学
河野哲也 (玉川大学文学部人間学部准教授)
目次から引用

といった感じで、第一線で活躍中の哲学者との対談を行なっている点。

「心」とは何かを探求するのは哲学者、思想家、 そして宗教家の専売だったわけであるが、 科学技術、特にコンピュータの発展にともなって、 情報科学や認知心理学、脳科学の分野からのアプローチが可能になった。 従来のアプローチである哲学と、 新しいアプローチである情報科学とが、 どのような位置関係にあるのか、 対談という形で明らかにしようとする本書は、 とても分かりやすいし、納得感がある。

そもそも、 脳が純粋に物理的な存在 (つまり霊魂とかは含まれていない) であると信じる限り、 「心」もまた物理現象として説明できる日が来るだろうことは疑いようがない。 そして、 オッカムの剃刀を進化論に適用すれば、 「意識」が受動的なものであることは必然の帰結だろう。 つまり、ヒトのみが「自由意志」を (極めて集中的な) 突然変異によって獲得したという (不自然な) 仮説は切り捨てるべきで、 「エピソード記憶」の能力が進化して 「意識」がより強固な「自我意識」へと進化したと考えるべきだろう。

進化の連続性を考えれば、 「意識」は決してヒト特有の特別な能力ではなく、 充分に進化した脳を持っている動物 (例えば霊長類) ならば、 少なくともヒトの赤ん坊と同程度の意識はあるということになる。 もっとも、赤ん坊にどの程度の意識があるのか、よくわからない (^^;) し、 さらに言えば、 ヒト特有の確固たる自我の意識が生まれるのは、 もっと成長してからのような気がする。 反復説 (個体発生は系統発生を繰り返す) を発生後にまで適用可能ならば、 ヒトと類縁の動物は、ヒトの子供と同程度の「自意識」を持っているのかも知れない。

ちなみに、ヒトの脳には一千億個ほどの脳細胞 (ニューロン) がある。 一千億個というと途方もない数のように思ったこともあったが、 いま私が使っているノート PC のハードディスクの容量が、 ちょうど一千億バイト (100GB) である ;-)。 もちろんただ単にデータを記憶しているだけのハードディスクと、 相互に信号を送受信できるニューロンとを単純に比較することはできないが、 ニューロンだって結線を変えようとすれば結構な時間がかかり、 おそらく大多数のニューロンはただ単に過去の記憶を保持しているだけだろうから、 「意識」という機能の「実装」が想像もつかないほど複雑であると考えるのは 無理がある。

だから少なくとも私にとって「受動意識仮説」は、 「霊魂が存在しない仮説」と同じくらい「確からしい」仮説なのであり、 前野先生が高らかに「受動意識仮説」の妥当性を主張し、 伝統的な宗教家の多くが信じている心身二元論を批判するのを読むと、 やや食傷気味になる。

同じような感覚は、ドーキンスの著作を読んでいても感じる。 もう宗教批判は充分だから、もっと発展的なことを考えようよ、 と言いたくなるのは私だけだろうか?

利己的な遺伝子 <増補新装版> (単行本)
リチャード・ドーキンス (著),
日高 敏隆 (翻訳), 岸 由二 (翻訳), 羽田 節子 (翻訳), 垂水 雄二 (翻訳)

というわけで、ややうんざりしながら 前野先生のチャーマーズ批判を読み進めていたのだが、 「第5章 哲学者との対話」に至って、 この本に対する私の評価は 180度転換した。 第1章~第4章は、 工学者である前野先生の言葉で語った他の思想の説明であり批判であるのに対し、 第5章は哲学者の言葉で語った哲学者の思想の説明である。 しかも聞き手は前野先生という工学者である。

実は私は大学生のころ、哲学に興味を持って、 いろんな哲学書を読んでみたことがある。 しかしそのほとんどが、哲学者に対する説明か、 あるいは一般人に向けたものであった。 前者は難しすぎて理解できないし、 かといって後者は表層すぎて本質には程遠かった。 そんなわけで一度は哲学を理解するのを断念したのであるが、 本書における、 情報科学からの哲学へのアプローチと、 哲学者と工学者との対話によって、 私自身の哲学に対する理解が大いに進んだように思う。 難攻不落に思えた哲学が、 情報科学という「武器」を用いることによって、 攻略可能であるように思えてきたのである。

Filed under: 自己啓発 — hiroaki_sengoku @ 07:41
2007年8月7日

面接FAQ: Tech総研「転職体験談」の取材を受けました hatena_b

前回、 思い出したように「面接FAQ」を再開したのにはワケがあります。 Tech総研さんの「転職体験談」の取材を受けることになりまして、 それが、 あらためて私の面接のやりかたを振り返るきっかけになったのでした。 「転職体験談」というのは、 「転職を果たしたエンジニアと面接官が当時を再現」する連載企画で、 「応募者と面接官それぞれの言葉の真意や、 面接でチェックされるポイントをレポート」しようというものだそうです。

取材中は好き勝手なことを言いまくったので、 どのようなページにまとまるかと内心ドキドキしていたのですが (^^;)、 無難にまとまったようでホッとしています。 さすがはプロですね。

携帯電話関連を中心に独自技術で業界を走るKLabへ

携帯電話関連のさまざまな独自技術で知られるKLab(クラブ)は、 エンジニアに対する考え方が他社とは一味違う。 現時点での技術力や知識、担当した仕事の売り上げよりも、 「技術が好き」から発する、挑戦や技術上の本質に対する継続的改善を尊ぶ。 また、技術力のみで昇格できる社内制度も設けている。
(取材・文/須田忠博 総研スタッフ/高橋マサシ)作成日:07.07.30

応募したエンジニア: 富田陽介さん(当時25歳)
企業の面接担当者: 取締役CTO 仙石浩明氏
募集職種: 技術力次第でCTOを目指せる研究開発職

Part1 転職の動機
Part2 技術志向性の強さ
Part3 現時点での関心

このような連載企画は、 応募者にとっては、 面接を受ける前にどんなことに注意すればいいかが分かるわけで、 とても参考になるのだろうと思いますが、 実は求人側の企業にとっても 面接のやり方を第三者の目で見てもらえる機会であるわけで、 とても有意義であると感じました。

求職側は、いろいろな会社の面接を受ければ、 どんな面接があるのか実地に知ることができますが、 求人側は、他社がどんな面接をしているかあまり知る機会はないですし、 まして自分達の面接が第三者の目から見るとどう映るのか、 教えてもらう機会は皆無ですから...

もちろん取材なので、忌憚のない意見を言ってもらえるわけではないのですが、 取材していただいた Tech総研の高橋マサシ様曰く:

現在の業務内容も転職の動機も重視せず、 「いかに技術が好きか」で人を見る面接。 この連載をほぼ50回続けていますが、 初めてのケースでした。 このことを仙石氏に話すと、 「えっ、他社はどんな面接なんですか?」と逆に驚いた様子。 数々の応募者ではなく、あなたが、いちばん技術が好きなんですよね。

やたらに「こんな面接は初めて見た」と強調されるので、 逆にこちらが驚いてしまいました。 面接して採用した技術者が入社後どのくらい伸びるかは、 その人がどのくらい技術が好きかにかかっているわけで、 なら「どれだけ技術が好きか」をとことん聞くべきだと思うのですが、 他社の面接はそうじゃないのですかねぇ...?

なお、 「携帯電話関連を中心に独自技術で業界を走るKLabへ」ページ末尾にある:

このレポートに関連する求人情報です
チェックしてみよう!
KLab株式会社
現在の募集職種はこちら
詳細をみる

をクリックすると、 「この企業は現在リクナビNEXT上で募集を行っていません」などと 表示されます (^^;) が、 私のブログを読んで下さってるかたなら、 リクナビNEXT (あるいはその他の求人媒体) で募集を行なっていないからといって、 応募できないわけではない、ということは よくご理解いただけてますよね?

一応、念のために申し上げておきますと、 KLab (に限らず大多数のベンチャーも同様だと思いますが) では、 常に直接応募を受付けております。 媒体やエージェント経由でないと応募を受付けないなどということは 一切ありませんし、 どこ経由で応募したかということは選考には一切影響しません。 さらに言えば「私は KLab へ入ってこれがやりたいんだ!」と 言ってくださるかたならば、 現在の募集職種にかかわらず採用を検討します。 やりたいことが明確になっていることこそが、 技術者の成長にとって一番重要なことだと思うからです。

技術を学ぼうとするなら、その時点での実力はサテオキ、 「伝わる状態」にかけては自分が一番だと自信を持って言い張れる (つまり、その技術を学びたいという情熱にかけては誰にも負けないと言いきれる) 状態からスタートしなければならないのです
Filed under: 技術と経営,技術者の成長 — hiroaki_sengoku @ 07:04
2007年8月3日

ダイナミックDNSサービスを始めてみた hatena_b

GCDバックアップ回線は、 (費用節約のため ^^;) 固定IPアドレス契約をしていない。 また出先でノートPC を使うときなども IPアドレスは固定でないわけで、 そういったときにもホスト名を持たせられる ダイナミックDNSサービス が便利。

ダイナミックDNSサービスというと、 DynDNS.org, freedns.afraid.org, ZoneEdit.com, No-IP.com, ieServer.Net, ddo.jp などが有名であるが、 いろいろ実験したいときなど、 自前のダイナミックDNSサービスがあると何かと便利なので立ち上げてみた。

大抵のダイナミックDNSサービスは、濫用防止の仕掛けがあって、 アドレス更新頻度が高いとすぐサービス利用を拒否されてしまう。 実験の時など意図せず何度も更新へ行ってしまうこともあり得るわけで、 そのたびに利用を拒否されては実験が滞ってしまうし、 そもそも人様のサーバを実験につきあわせてしまっては申し訳ない。

http://ddns.gcd.jp/register に アクセスして、 ホスト名とパスワード (と captcha) を入力して、 「register」ボタンを押すと、 「ホスト名.gcd.jp」という FQDN を DNS に登録する。

そして、 http://ddns.gcd.jp/update

ユーザ名:登録したホスト名
パスワード:登録したパスワード

でアクセスすると、 アクセス元のグローバル IP アドレスが登録される。 アクセス元と異なる IP アドレスを登録したい時は、 http://ddns.gcd.jp/update?ip=127.0.0.1 などと「ip」をパラメータとして指定すればよい。 もちろんこのサービスは実験目的で立ち上げたものであり、 安定運用を保証するものではない。 予告無くサービスを停止あるいは制限を加えることを 了承いただけるかたにのみ利用を許諾する。

GnuDIP など、 ダイナミックDNS サービスを実現するソフトウェアはいくつかあるようであるが、 Web アプリケーションとして行なうべき事は極めて単純 (ホスト名登録と IPアドレス更新のページだけ) なので、 ざくっと php で書いてみた(わずか 250行)。

ネームサーバは MyDNS を使用している。 MyDNS というのは MySQL (あるいは PostgreSQL) のレコード (一例を以下に示す) を そのままゾーンレコードとして扱えるネームサーバ。 つまり php スクリプトから MySQL データベースを更新するだけで ダイナミックDNS サービスを実現できる。

mysql> select * from rr;
+-----+------+-------------+-------+----------------+-----+-------+
| id  | zone | name        | type  | data           | aux | ttl   |
+-----+------+-------------+-------+----------------+-----+-------+
|   1 |    1 |             | NS    | ns.gcd.jp.     |   0 | 14400 |
|   2 |    1 |             | A     | 60.32.85.216   |   0 | 14400 |
|   3 |    1 |             | MX    | mx.gcd.org.    |  10 | 14400 |
|   4 |    1 | *           | MX    | mx.gcd.org.    |  10 | 14400 |
|   5 |    1 | ns          | A     | 60.32.85.217   |   0 | 14400 |
|   6 |    1 | www         | CNAME | gcd.jp.        |   0 | 14400 |
|   7 |    1 | ddns        | CNAME | gcd.jp.        |   0 | 14400 |
    (中略)
| 106 |    1 | senri       | A     | 60.32.85.220   |   0 |    50 |
| 107 |    1 | asao        | A     | 60.32.85.221   |   0 |    50 |
    (中略)
+-----+------+-------------+-------+----------------+-----+-------+

MyDNS は listen するポートを、 「listen = 127.0.0.1:53」などといった形式で指定するが、 IP アドレスとして 0.0.0.0 を指定する (つまりインタフェースを指定せずに listen させる) ことができないので、 以下のようなパッチをあてて使っている (2行コメントアウトしただけ)。

--- src/mydns/listen.c.org        2006-01-19 05:46:47.000000000 +0900
+++ src/mydns/listen.c        2007-08-02 13:46:33.000000000 +0900
@@ -81,8 +81,8 @@
         if (family == AF_INET)
         {
                 memcpy(&addr4, address, sizeof(struct in_addr));
-                if (addr4.s_addr == INADDR_ANY)
-                        return;
+/*                if (addr4.s_addr == INADDR_ANY)
+                        return;                */
         }
 #if HAVE_IPV6
         else if (family == AF_INET6)

PPPoE などでインターネットへ接続するサーバ (つまりルータ兼用サーバ) で ネームサーバを走らせようとする場合、 インタフェースを指定せず (INADDR_ANY) bind する ほうが何かと都合がよい。 にもかかわらず、 ネームサーバがインタフェース毎に bind しようとするのは何故なのだろうか。 久しく使っていないが、 BIND も そういう仕様だったと記憶している。

Filed under: システム構築・運用 — hiroaki_sengoku @ 06:29
2007年7月10日

面接FAQ: 素人にも分かるように説明してください hatena_b

久しぶりに「面接 FAQ」シリーズの続きを書いてみます (前回書いたのは一年以上前なのでずいぶん間が空いてしまいました)。 私の面接というと最終面接であることが多いのですが、 履歴書の備考欄に「役員との面談希望!」と書いてある場合など、 一次面接から私が面接することもあります。 (最終の) 役員面接というと、 多くの人が通りいっぺんの面接だと思うらしく、 役員面接で技術的な突っ込みを受けて、 応募者が戸惑うケースが多々ありました。

私の面接で、 比較的頻度が高い私の質問パターンを紹介し、 応募者がどう答えることができていたら採用になっていたか、 振り返ってみようというのがこの「面接 FAQ」シリーズの主旨です。 FAQ すなわち、 面接で(私に)よく聞かれること、 面接官自身が語る面接攻略法。

「面接 FAQ」は続き物ですので、 以下のページも参照して頂けると幸いです。

(1) 高い技術力って例えばどんなことですか?
(2) 何か質問はありませんか?
(3) 前職でいくらもらっていましたか?
(4) 仮に、何をしてもいい、と言われたら、何をしますか?
(5) 「人の役に立つことをしたい」と言う技術者の卵たち

面接というと、 「採用してやる」といった態度をとる面接官がいます。 つまり、 会社が求める資質を応募者が持っているかどうかを判断するのが、 面接官の役目だと思っている人ですね。 様々なチェックポイントを次から次へと確認し、 一つでも条件を満たさなければそこで不採用と判断します。 チェックポイント以外でどんなに優れた点を持っていようとお構い無しです。

その面接官にとっては、 採用した人にやってもらう仕事が明確に決まっているから、 その仕事をする能力があるかどうかが一番の関心ごとなんでしょうけど、 もしかしたら面接官よりよっぽど優れた長所を持っているかも知れないのに、 それを見ようともせずに不採用を決めてしまうのは、 モッタイナイ話ですよね?

私は根が貧乏性なので、そんなモッタイナイことは決してできません。 応募者が優れた点を持っているのなら、 たとえそれが KLab の事業と関係なくても、 応募して頂いたのは何かの縁ですから、 是非一緒に働きたいと思ってしまうわけです。 特定の分野に優れた能力を発揮できる人に入社してもらえるなら、 その分野の事業を始めてしまってもいいとさえ思っています。

なので、どんな分野であれ、 応募者が一番得意なことについて、 根掘り葉掘り質問させてもらうことになります。 私が多少なりとも知っている分野なら、 (面接で聞くのは不適切と思われるような) 異常に細かい点、 例えば実装上の細かい工夫とかまで聞いてしまいます。

そんな細かいことまでいちいち聞いていたら、 面接時間が何時間あっても足らないんじゃないか、 と驚かれるかたもいらっしゃるのですが、 私の面接では応募者の職務経歴を一通り聞くなんてことはせず、 応募者が一番自慢したいことだけを徹底的に聞くのがメインなので、 時間が許す限り掘り下げてお聞きするわけです。

しかしながら、 もちろん私が知らない分野もたくさんありますし、 コンピュータの分野であっても私がニガテな分野もあります。 私が何も知らないような分野だと、どんどん掘り下げて質問する、 というのは無理がありますから、そんなときは開き直って、

素人にも分かるように説明してください

って聞いちゃいます。 こう聞かれたら、なんだこんなことも知らないのか、 などと呆れずに丁寧に説明して頂けると幸いです。

応募者が、ずぶの素人である面接官に丁寧に説明したところで、 所詮は素人なんだから、 応募者がその分野についてどのくらい優れているか面接官に伝わるはず無い、 って思う人はいないでしょうか?

確かに、その分野のことについては何も知らないのですから、 その分野における応募者のレベルがどのくらいなのか (例えば、国内で十指に入るのか、あるいは平均くらいなのか、とか) は分かりません。 しかし説明の仕方だけでも応募者の能力はかなりのことが分かると 私は考えています。

「素人にも分かるように説明してください」と求められたとき、 専門用語を、平易な言葉で置き換えようと四苦八苦する人がいます。 勢い余って、さほど「専門的」でない言葉すら無理矢理言い換えようとして、 却って分かりにくくなったりすることもあります。

確かに専門用語だらけの説明は素人にとって分かりにくいし、 専門家の話が分かりにくいのは専門用語の濫用にある、と 考える人が多いのも事実でしょう。 専門用語だらけのマニュアルが非難されることもありますしね。

しかし、専門用語だけの問題でしょうか? 専門用語の全てを解説した用語辞典を引きまくれば専門書が読めるかというと、 そんなことは決してありませんよね?

専門用語の意味さえ分かれれば、どんな専門分野でも理解できるでしょうか? こう聞けば誰でも、そんなはずはないといいますよね? つまり、 専門用語の置き換えるだけでは、 決して「素人にも分かるように」はならないのです。

どんな専門分野でもそうだと思いますが、 その分野特有の考え方、大げさに言えば思想のようなものがあります。 その分野の専門家なら皆が共有している「思想」なので、 あらためて考えてみたりはしませんが、 同じ「思想」を共有している専門家同士だから、 スムーズな意思疏通が可能になります。

逆に言えば、背景思想を共有していない門外漢には、 専門家同士の会話は「宇宙語」に聞こえてしまいます。 たとえ使っている単語自体は平易な言葉ばかりで、 専門用語が一切含まれていなかったとしても、 背景思想を共有していない素人には、 やはり「宇宙語」に聞こえてしまうのです。

「素人にも分かるように説明してください」と求められたとき、 話題にのぼった事項の説明は一時棚上げして、 まず背景思想から説明する人、 こういう人は間違いなく頭がいい人だと思います。 相手と自分が共有している「思想」は何か、 相手が共有していない「思想」は何か、 そして相手の「思想」に何を追加すれば理解してもらえるようになるのか、 そういったことを考えながら話せる人は、 きっと優秀な人なのだと思います。

いろんな人に、いろんな分野について説明してもらったことがありますが、 実に楽しそうに説明してくださるかたもいらっしゃいます。 私が分からない点を質問すると、 よくぞ聞いてくれたと嬉々として答えてくださるので、 とても話が盛り上がります。 そういう人は、 (面接中の感想としては気が早いんですが) KLab に入社して一緒に働けるようになるのが、 とても待ち遠しく感じられます。

Filed under: 技術者の成長 — hiroaki_sengoku @ 06:58
2007年7月4日

ssh-agent & ForwardAgent を、より安全にしてみる hatena_b

ssh の ssh-agent は便利であるが、 ForwardAgent 機能を使う場合は注意が必要である。

あるマシン (ここでは senri とする) で、ssh-agent を実行すると、 ssh-agent は ssh 認証のための UNIX ドメイン ソケットを作成し、 そのパス名を環境変数「SSH_AUTH_SOCK」に設定する (正確に言えば環境変数を設定するのはシェルの組み込みコマンドである eval)。

senri:/home/sengoku % eval `ssh-agent`
Agent pid 14610
senri:/home/sengoku % ssh-add
Enter passphrase for /home/sengoku/.ssh/id_rsa:
Identity added: /home/sengoku/.ssh/id_rsa (/home/sengoku/.ssh/id_rsa)

続いて、ssh-add を実行し、 このソケットを通して ssh 秘密鍵を ssh-agent に登録する。 すると ssh (あるいは scp など) を passphrase を入力することなく使用できる。

senri:/home/sengoku % ssh mail1.v6.klab.org
Last login: Tue Jul  3 18:22:13 2007 from ishibashi.klab.org
mail1:/home/sengoku %

もしマシン senri が、きちんと管理されていて、 かつ root 権限を持っている人が自分一人しかいないのであれば、 SSH_AUTH_SOCK ソケットを他者に使われる心配はないので、 ssh-agent を走らせっぱなしにしておくことができて、 ssh を常に passphrase 無しで使うことができて便利である。

さらに ssh の ForwardAgent 機能を使うと、 senri 以外のマシンでも senri 上の ssh-agent を利用できる。

senri:/home/sengoku % ssh -A mail1.v6.klab.org
Last login: Wed Jul  4 07:13:46 2007 from senri.v6.gcd.org
mail1:/home/sengoku % echo $SSH_AUTH_SOCK
/tmp/ssh-dHyPx12011/agent.12011
mail1:/home/sengoku % ls -la /tmp/ssh-dHyPx12011
total 0
drwx------    2 sengoku  sengoku        80 Jul  4 07:15 .
drwxrwxrwt    8 root     root          368 Jul  4 07:15 ..
srwxr-xr-x    1 sengoku  sengoku         0 Jul  4 07:15 agent.12011
mail1:/home/sengoku % ssh mail2 hostname
mail2.klab.org
mail1:/home/sengoku %

つまりマシン mail1 上の sshd (ssh サーバ) が、 UNIX ドメイン ソケット /tmp/ssh-dHyPx12011/agent.12011 を作成し、 そのパス名を環境変数「SSH_AUTH_SOCK」に設定した上でログイン シェルを実行する。 ここで ssh を実行すると、このソケットを経由して senri の SSH_AUTH_SOCK ソケットへつながる (「ポート」ではないがポートフォワードと同様) ので、 passphrase 入力を求められない。

さらに、mail1 から別のマシンへ ssh でログインするときも、 同様に ForwardAgent を使うことができるので、 ForwardAgent の連鎖が続く限り ログインした全てのマシンで ssh を passphrase 無しで使うことができる。

以上のように、ForwardAgent は大変便利な機能であるが、 ログインした先のマシンの root 権限を持っている人が自分以外にもいる場合は、 注意が必要である。 例えば上記の例で言うと、 mail1 の root 権限を持っている人は、 UNIX ドメイン ソケット /tmp/ssh-dHyPx12011/agent.12011 へアクセスできる。 つまり、その人は senri 上で動いている私の ssh-agent すなわち私の ssh 秘密鍵を (passphrase 無しで) 利用することができてしまう。

もちろん、そんな悪いことをするヤツを root にしてはいけないのであるが、 ForwardAgent の連鎖を続けすぎると、 ログインしたマシンの中には 100% 信用できるとは限らない人が root 権限を持っている場合もあるだろう。 仮に全てのマシンの root 全員が 100% 信用できたとしても、 常に最悪のケースを考えるのが「セキュリティ」の基本である。 passphrase 無しで ssh を使うという利便性を優先したいのであれば、 せめて悪用されたときに即座に気づく仕掛けを組み込んでおきたいものである。

といっても、不正な利用と正当な利用とを区別することは一般に困難である。 悪用しようとする人がそこそこ注意深ければ、 正当な利用と判別しにくくなるような工夫は可能であろう。 そこで、正当な利用であろうが悪用であろうが、 ssh-agent へのアクセスがあったときは常に知らせる方法について考えてみる。

ssh-agent が利用ログを出力するように変更

ssh-agent.c に次のような変更を加えて、 ssh-agent がアクセスされたときは syslog へ出力するようにしてみる。

--- ssh-agent.c.org        2007-02-28 19:19:58.000000000 +0900
+++ ssh-agent.c        2007-06-28 22:41:19.000000000 +0900
@@ -734,7 +734,7 @@
                 return;
         }
 
-        debug("type %d", type);
+        logit("type %d", type);
         switch (type) {
         case SSH_AGENTC_LOCK:
         case SSH_AGENTC_UNLOCK:

この変更で ssh-agent へのアクセスがあったときは syslog へ出力が行なわれる。 あとは syslog 側で、 このログ出力をユーザ (つまり私) へ知らせる方法を考えればよい。

私の場合、 認証関係のログは携帯電話へメールで届くように syslog-ng を設定してある。 ssh-agent を利用していないのにケータイ メールが届くようなことがあれば、 ssh-agent が悪用された可能性を考えて調査することになるだろう。

ssh が ForwardAgent 利用ログを出力するように変更

ssh-agent にログを出力させる方法だと、 ローカルホストから ssh-agent を利用する場合にもログ出力を行なってしまう。 もしローカルホストの root 権限を持っている人が自分一人しかいないのであれば、 ログ出力は ForwardAgent 経由の場合に限定してよい。 リスクが全く無いケースのログ出力はできるだけ抑制したほうが、 危険度が高いケースを際立たせることができるので、より望ましいだろう。

clientloop.c と ssh.c に次のような変更を加えて、 ssh がリモートから ForwardAgent 要求を受取ったときに ログ出力するようにしてみる。

--- clientloop.c.org        2007-02-25 18:36:49.000000000 +0900
+++ clientloop.c        2007-07-03 07:02:39.000000000 +0900
@@ -1763,6 +1763,8 @@
                 error("Warning: this is probably a break-in attempt by a malicious server.");
                 return NULL;
         }
+        logit("sshd %.100s@%.64s requested agent forwarding.",
+              options.user, host);
         sock = ssh_get_authentication_socket();
         if (sock < 0)
                 return NULL;
--- ssh.c.org        2007-01-05 14:30:17.000000000 +0900
+++ ssh.c        2007-07-03 07:15:38.000000000 +0900
@@ -630,7 +630,8 @@
         channel_set_af(options.address_family);
 
         /* reinit */
-        log_init(av[0], options.log_level, SYSLOG_FACILITY_USER, 1);
+        log_init(av[0], options.log_level, SYSLOG_FACILITY_AUTH,
+                 (options.log_level > SYSLOG_LEVEL_VERBOSE));
 
         seed_rng();
 

このような変更を加えると、 ssh でログインした先 (上記の例で言うと mail1) で ssh を使ったとき、 あるいはさらにそこから別のマシンへ ssh でログインした先で ssh を使うなどして、 大元のマシン (上記の例で言うと senri) 上の ssh-agent へアクセスしたときに、 syslog への出力が行なわれる。

ログ出力の際、 「sshd sengoku@mail1.v6.klab.org requested agent forwarding.」などと、 ForwardAgent 要求を行なったのがどのサーバか示せる点も、 ssh-agent に変更を加える方法と比べてこの方法が優れている点と言える (ForwardAgent 連鎖していても、残念ながら一番手前のサーバしか示せないが)。

Filed under: システム構築・運用 — hiroaki_sengoku @ 07:45
2007年6月25日

stone に Server Name Indication (TLS 拡張) 機能を実装 hatena_b

RFC 3546 で、 TLS (Transport Layer Security つまり SSL) の拡張が規定された。 その中の一つが、「Server Name Indication」と呼ばれる拡張であり、 クライアントがサーバに対して、 サーバのホスト名を伝えることができるようになった (規定されたのは 2003年6月なのであるが、まだあまり普及していない)。

なぜクライアントがサーバへ、 当のサーバの名前を伝えてやる必要があるかというと、 サーバが複数のホスト名を持つ場合があるからだ。 例えば WWW サーバは、 http リクエスト中の「Host:」フィールドを見てレスポンスを切り替える。 この機能はバーチャルドメインと呼ばれ、 一つの IP アドレスで複数のホスト名のサービスを提供する方法として、 広く使われている。

ところが (従来の) https の場合、この方法が使えない。 WWW サーバは SSL 通信を開始するにあたって、 *最初に*サーバ証明書を クライアントへ送る必要があるからだ。 http リクエスト中の「Host:」フィールドに、 別のホスト名が書いてあったとしても後の祭。 「リクエストしたホスト名と、 サーバから送られてきた証明書に記載されたホスト名が一致しない」という旨の 警告が WWWブラウザに表示されてしまう。

もう少し詳しく説明すると、 クライアント (WWWブラウザ) とサーバは、 SSL 通信を始めるにあたって、 次のようなハンドシェークを行なう。

クライアント サーバ
ClientHello 乱数, セッションID, 暗号/圧縮方式
ServerHello 乱数, セッションID, 暗号/圧縮方式決定
Certificate サーバ証明書
ServerKeyExchange 共通鍵の交換
(CertificateRequest クライアント認証を要求する時のみ)
ServerHelloDone ServerHello の終了を通知
(ClientCertificate クライアント認証を要求された時のみ)
ClientKeyExchange 共通鍵の交換
ChangeCipherSpec 次のデータから暗号化することを通知
Finished 以上のハンドシェークのハッシュ値(暗文)
ChangeCipherSpec 次のデータから暗号化することを通知
Finished 以上のハンドシェークのハッシュ値(暗文)

このハンドシェークの後、 クライアントが暗号化された http リクエストを送信し、 それを受けてサーバが暗号化されたレスポンスを返す。

https サーバがバーチャルドメイン機能を持つには、 https サーバがサーバ証明書を送信する (上のハンドシェーク図の 3行目) より前に、 クライアントがリクエストしたいホスト名を通知する必要がある。 上図から明らかなように、 ホスト名の通知は一番最初の「ClientHello」で行なわれなければならず、 そのための拡張が、 「Server Name Indication」というわけである。 もちろんこの時点では、まだ鍵の交換は行なわれていないので、 ホスト名は平文で送られる。

前置きが長くなってしまったが、 この Server Name Indication (SNI) を stone でサポートしてみた (stone.c Revision 2.3.1.11 以降)。 ただし stone が利用している OpenSSL で SNI がサポートされるのは 0.9.9 以降である (追記: 0.9.8f 以降でもサポートされた) ので、 OpenSSL 0.9.9 以降のライブラリを使って stone を make する必要がある 。

二台の http サーバ senri.gcd.org と asao.gcd.org があるとき、 次のように stone を実行する:

stone -z sni \
      -z servername=senri.gcd.org \
          -z cert=senri.gcd.org-cert.pem \
          -z key=senri.gcd.org-key.pem \
          senri.gcd.org:http 443/ssl -- \
      -z servername=asao.gcd.org \
          -z cert=asao.gcd.org-cert.pem \
          -z key=asao.gcd.org-key.pem \
          asao.gcd.org:http 443/ssl

転送元ポート指定「443/ssl」が二度現われていることに注意。

最初の「senri.gcd.org:http 443/ssl」は、 「-z servername=senri.gcd.org」と指定しているように、 クライアントが通知するサーバのホスト名が senri.gcd.org の場合の指定である。 サーバ (つまり stone) は、 「-z cert=ファイル名」と「-z key=ファイル名」で指定されるサーバ証明書を返し、 クライアントからの通信を、 SSL 復号を行なった上で senri.gcd.org:http へ中継する。

二番目の「asao.gcd.org:http 443/ssl」についても同様に、 クライアントが asao.gcd.org を通知すれば、 stone は asao.gcd.org のサーバ証明書を返すとともに、 クライアントからの通信を、 SSL 復号を行なった上で asao.gcd.org:http へ中継する。

この例では http サーバは二台のみであるが、 同様に何台でも指定できる。 また、もちろん物理的に異なるサーバを用意する必要があるわけではなく、 一台の http サーバで複数のポートを開き、 各ポートで別々のホスト名のサービスを提供してもよい。

OpenSSL 0.9.9 の s_client コマンド (SSL クライアント) でアクセスしてみると、 senri.gcd.org を通知すれば (-servername senri.gcd.org オプション)、

% openssl s_client -connect localhost:443 -servername senri.gcd.org -CApath /usr/local/ssl/certs
CONNECTED(00000003)
depth=2 /C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/CN=GCD Root CA/emailAddress=root@gcd.org
verify return:1
depth=1 /C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/OU=Hiroaki Sengoku/CN=GCD_Sengoku_CA/emailAddress=sengoku@gcd.org
verify return:1
depth=0 /C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/OU=Hiroaki Sengoku/CN=senri.gcd.org/emailAddress=sengoku@gcd.org
verify return:1
Server did acknowledge servername extension.

サーバ (stone) は「CN=senri.gcd.org」の証明書を返し、 同じ 443番ポートへのアクセスでも 通知するサーバ名を asao.gcd.org へ変えるだけで、

% openssl s_client -connect localhost:443 -servername asao.gcd.org -CApath /usr/local/ssl/certs
CONNECTED(00000003)
depth=2 /C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/CN=GCD Root CA/emailAddress=root@gcd.org
verify return:1
depth=1 /C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/OU=Hiroaki Sengoku/CN=GCD_Sengoku_CA/emailAddress=sengoku@gcd.org
verify return:1
depth=0 /C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/OU=Hiroaki Sengoku/CN=asao.gcd.org/emailAddress=sengoku@gcd.org
verify return:1
Server did acknowledge servername extension.

サーバが返す証明書が「CN=asao.gcd.org」に変わるし、 stone が中継する先も asao.gcd.org:http へ変わる。 したがって一つの IP アドレスに 複数のホスト名を持たせるバーチャルドメイン機能を、 任意の SSL 通信で実現できる。

なお、上記 stone 実行方法 (オプション指定) は、やや煩雑なので、

stone -z sni \
      -z certpat=%n-cert.pem \
      -z keypat=%n-key.pem \
      -z servername=senri.gcd.org \
          senri.gcd.org:http 443/ssl -- \
      -z servername=asao.gcd.org \
          asao.gcd.org:http 443/ssl

などと、証明書ファイルの指定をまとめることもできる。 「-z certpat=%n-cert.pem」オプションによって証明書のファイルのパターンを 指定する。 「%n」はサーバのホスト名で置き換えられる。 すなわち、 「-z servername=senri.gcd.org」を指定した場合は、 「-z cert=senri.gcd.org-cert.pem」を指定したのと同じ結果になる。 「-z keypat=%n-key.pem」についても同様。

現時点で SNI をサポートしている WWWブラウザは、 私の知っている範囲だと Firefox 2.0 等と IE7 だけであるが、 今後は開発される WWWブラウザの大半が SNI をサポートすることになるだろう。 そうなれば https サーバも、 バーチャルドメインで運用することが一般的となるはずである。

Name Based SSLについてもうちょっと腰を入れて調べる。
IE7ではRFC3546 のServer Name Indicationの対応がされている。
Apacheの方では、RFC3546は、mod_gnutlsを入れれば対応は可能なようです。
mod_gnutlsのサイトはこちら。
が、2005年から時が止まったまま・・・。むう。

OpenSSL 0.9.9 の安定版がリリースされれば (追記: SNI をサポートした 0.9.8f が 10/11 にリリースされた)、 apache などの WWW サーバにおいても SNI サポートが普通になると思われるが、 それまでは stone で SSL 暗号化を行なうようにすれば、 手軽に SNI を利用できる。 サーバに OpenSSL 0.9.9 をインストールしてしまうと、 OpenSSL を利用する全てのソフトウェアが影響を受けてしまうが、 例えば以下のように stone.c をコンパイル (Linux でのコンパイル例) して、 stone だけ 0.9.9 をリンクするようにすれば、 影響を stone だけに限定できる。

% cc -Wall -DCPP='"/usr/bin/cpp -traditional"' \
     -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_POP -DUSE_SSL \
     -I /usr/local/ssl-0.9.9/include -L /usr/local/ssl-0.9.9/lib \
     -o stone stone.c -lpthread -ldl -lssl -lcrypto

以上は stone が SSL サーバとして、 サーバホスト名通知を受付ける場合であるが、 もちろん stone を SSL クライアントとして実行し、 サーバホスト名を通知することもできる。

% stone -q sni -q verbose -q verify -q CApath=/usr/local/ssl/certs
        -q servername=asao.gcd.org localhost:443/ssl 10080
Jun 23 08:43:46.116894 3084876480 start (2.3c) [18500]
Jun 23 08:43:46.185448 3084876480 stone 3: 127.0.0.1:443/ssl <- 0.0.0.0:10080
Jun 23 08:43:48.610513 3084876480 3 TCP 6: [depth2=/C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/CN=GCD Root CA/emailAddress=root@gcd.org]
Jun 23 08:43:48.610707 3084876480 3 TCP 6: [depth1=/C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/OU=Hiroaki Sengoku/CN=GCD_Sengoku_CA/emailAddress=sengoku@gcd.org]
Jun 23 08:43:48.610928 3084876480 3 TCP 6: [depth0=/C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/OU=Hiroaki Sengoku/CN=asao.gcd.org/emailAddress=sengoku@gcd.org]
Jun 23 08:43:48.624724 3084876480 [SSL cipher=AES256-SHA]

「-q servername=asao.gcd.org」オプションで、 通知するサーバホスト名を指定している。 この実行例の場合「asao.gcd.org」を通知しているので、 サーバからは「CN=asao.gcd.org」の証明書が返されている。 この実行例では、中継先が「localhost:443」であるので 「-q servername=」オプションを指定する必要があるが、 もし中継先 (サーバ) ホスト名が通知すべきサーバホスト名に一致するのであれば、 「-q servername=」オプションは省略できる。

Filed under: stone 開発日記 — hiroaki_sengoku @ 07:20
2007年6月18日

シアトル モノレールの謎

先日、シアトルへ行ってきました。

シアトルと言えば、モノレール

Westlake Center Mall 駅 (次の写真) と Seattle Center 駅を結んでいます。 シアトル万博 (1962年) の時に開業したそうです。

Westlake Center

上の写真だと分かりにくいかも知れませんが、 モノレールの軌道が二本あります。 向かって左側の軌道に青色の車両が停車していますね。

同じ場所の軌道の部分を反対側から見ると、
↓ こんな感じ。

deadend

初めてこの Westlake Center Mall 駅を見たとき (2007年5月)、 とても強い違和感を感じてしまいました。 そもそも軌道が二本あるのに、 プラットホームが片側にしかないのがとても不自然でしたし、 ↑ の写真を見れば多くの方に同意して頂けるのではないかと思いますが、 二本の軌道が異常に接近しています。 こんなんで本当にすれ違えるのか?と、 誰もが疑問に思うのではないでしょうか。

Westlake Center Mall 駅と Seattle Center 駅とは 1.6km ほどしか離れておらず、 途中に駅がないのはもちろん、 二つの軌道を乗り換えるためのポイント (転轍機) もありません。 つまり、一方の軌道を走る車両は、決して、 もう片方の軌道を走ることはできません。

しかし、冒頭の Westlake Center Mall 駅の写真を見ると、 向かって左側の軌道は、 横のショッピング モールの建物と接していて乗降できそう (実際、モール 3階にモノレール乗り場があります) ですが、 向かって右側の軌道には、 乗降のためのプラットホームが見当たりません。 私はてっきり、右側の軌道は現在は使用されていないのだと思っていました。

ところが、別の日に反対側の Seattle Center 駅を訪れてみると、 Westlake Center Mall 駅で見た青色の車両の他に、 赤色の車両がありました。 下の写真だとちょっと分かりにくいかも知れませんが、 向かって右側の軌道に青色の車両が停っていて、 向かって左側の軌道に赤色の車両が走っています (ちょうどこの駅に入ってきたところです)。

Seattle Center

トポロジー的に考えて、 赤色の車両が走っている軌道は、 Westlake Center Mall 駅へ行くと、 ショッピング モールの建物に接していない側の軌道につながっているはずです。 両方の駅で見た軌道が互いにどのようにつながっているかは、 次図のように、 モノレールの路線に赤色の軌道と、青色の軌道を書き入れてみると一目瞭然ですね。

Monorail Route

赤色の車両が走っている軌道は、 ショッピング モールの建物に接していないのに、 どうやって乗降するのでしょうか? とても謎です。

More...
Filed under: その他 — hiroaki_sengoku @ 06:30
2007年6月15日

stone に UDP ⇔ TCP 相互変換機能を実装 hatena_b

stone で UDP と TCP の相互 変換を実装してみた (stone.c 2.3.1.10以降)。 つまり、UDP パケットが届いたら、 その頭にデータ長 (2バイト) を付けて 次図の形式のデータにして TCP セッションへ送信する。 あるいは逆に、 TCP セッションから次図の形式のデータを受信したら、 「データ長」の部分を取り除いて 「可変長データ」の部分を UDP パケットとして送信する。

┌──┬──┬──┬─≪─┬──┐
│データ長 │ 可変長データ  │
└──┴──┴──┴─≫─┴──┘

もちろん「データ長」はネットワーク バイトオーダ (ビッグエンディアン)。 この形式は、 DNS の問合わせ/応答を TCP を使って行なう方法 (RFC1035 4.2.2. TCP usage) と 同じであるので、

# stone -n 192.168.1.1:domain/udp localhost:domain
Jun 15 06:34:35.215996 16384 start (2.3c) [15707]
Jun 15 06:34:35.248158 16384 stone 3: 192.168.1.1:53/udp <- 127.0.0.1:53

などと stone を実行 (TCP 53 を UDP 53 へ変換) しておいて、

% host -T www.gcd.org localhost
Using domain server:
Name: localhost
Address: 127.0.0.1#53
Aliases:

www.gcd.org has address 60.32.85.220
www.gcd.org has address 60.32.85.221
www.gcd.org has address 60.32.85.216

などと TCP で localhost への問合わせ (-T オプション) を行なうことができる。 すなわち、stone が TCP での問合わせを UDP に変換して ネームサーバ (192.168.1.1:53/udp) へ中継している。

あるいは逆に、

# stone -n 192.168.1.1:domain localhost:domain/udp
Jun 15 06:38:36.660967 16384 start (2.3c) [18576]
Jun 15 06:38:36.662647 16384 stone 3: 192.168.1.1:53 <- 127.0.0.1:53/udp

などと stone を実行 (UDP 53 を TCP 53 へ変換) しておいて、

% host www.klab.org localhost
Using domain server:
Name: localhost
Address: 127.0.0.1#53
Aliases:

www.klab.org has address 211.13.209.203

などと UDP で localhost へ問合わせることができる。 すなわち、stone が UDP の問合わせを TCP に変換して ネームサーバ (192.168.1.1:53) へ中継している。

この UDP TCP 相互変換機能を、 ssh や VPN-Warp などを使った (TCP) ポートフォワードと組合わせることにより、 UDP のポートフォワードが可能になる。

Filed under: stone 開発日記 — hiroaki_sengoku @ 09:05
2007年5月25日

転職エージェントは、誰の「エージェント」なのか? hatena_b

転職エージェントとは、 求職側と求人側のマッチングを行なう人材紹介会社のこと:

正式には「有料職業紹介事業所」と呼ばれ、 厚生労働大臣の認可を受けた民間の職業紹介・あっせん会社のことです。 転職を希望する方と、正社員などを募集している企業とを 「人の手」でつなぐサービスを行っています。 転職エージェントが集めた求人情報は、 企業の人事担当者から直接仕入れた生の情報です。 そのため、企業の求める人物像を的確に把握した上で、 マッチングを行うことができます。

転職の際、お世話になった人も多いだろうし、 かくいう私自身、KLab(株) 創業メンバに加わるきっかけは、 転職エージェント (もちろん、上記引用先エージェント会社とは異なる会社である) に紹介されたからだった。

当時 (2000年3月)、連載記事を書いていた日経Linux の巻末「ライターから」に、

転職には全く無関心だった (転職雑誌は一度も読んだことがありませんでした) 私が なぜ転職することになったのか、話は半年以上前に遡ります。 昨年の夏、突然職場に外国人から電話がかかってきました。 慣れない英語で必死に聞いていると、 どうやら就職斡旋会社の人 (かっこよく言うとヘッドハンタですが ;-) のようです。 胡散臭いと思いつつも何度か英語のメールをやり取り (もちろん職場のアドレスを使うのは避けました) すると、 真っ当な斡旋会社であることが分かったので、一度会ってみることにしました。

と、書いたように、 ある日突然電話がかかってきて、誘われるままに企業を紹介されただけだったので、 転職エージェントがなぜ無料なのかも理解していなかった。 転職希望者から見ると無料だが、 実際は求人企業が「コンサルティングフィー」を負担しているから無料、 というだけのこと。

転職エージェントは、 転職希望者に相談料やサービス料を求めることは一切ありません。 それは、企業の採用を支援することにより、 求人企業からコンサルティングフィーを受け取っているからです。
転職エージェントとは から続けて引用

私を採用するときに支払ったこの「コンサルティングフィー」が いかに高額であったかを、 後になって愚痴っぽく聞かされたものだが、 あれから 7 年、KLab(株) は順調に発展しているわけであるし、 負担させてしまった「コンサルティングフィー」に見合う働きは できたのではないかと自負している。

求人企業が支払った「コンサルティングフィー」が、 「コンサルティング」を受けたことによって 求人企業と求職者とが得た「利益」に見合えば、 転職エージェント、求人企業、求職者の三者ともハッピーであるわけだし、 (私自身の事例も含めて) そういう転職事例も多いとは思う。

しかしながら、求人企業と求職者が得た利益の合計が 「フィー」を下回る場合はどうだろう? 三者のうち、 一者 (求職者) がこの「フィー」の額を知らされないという点に、 この転職斡旋の仕組みの問題があるように思う。 すなわち、求職者にとって転職エージェントは キャリアアドバイスを受けられたり、求人企業との交渉を代行してくれたりと、 とても「心強いパートナー」なのであるが、 このサービスが実際に支払われる「フィー」に見合うか否かの判断は、 「フィー」の額を知らなければ不可能だと思う。

さらに言えば、求職者が転職エージェントから受けるサービスは、 どんなに親身なキャリアアドバイスであったとしても、 どんなに高く見積ったとしても、 数十万円以上の価値を認める求職者は極めて稀なはず。 もし仮に求職者自身がサービスの対価を支払うのであれば、 もっと低い額になってしまうかも知れない。 つまり求職者側の感覚からすれば、 一般的なコンサルティングフィーは、文字通り桁違いに高額である。

だから、コンサルティングフィーは、 求職者に対するサービスというよりは、 求人企業に対するサービス (つまり求職者を探しだし、紹介すること) の 対価ということになる。 希少な人材であればあるほど (探し出すにはコストがかかるから) サービスを受けることによって求人企業が得られると感じる利益は大きくなるわけで、 得られる利益がフィーより大きいと考えれば、 紹介してもらった人を喜んで採用することになるし、 得られる利益がフィーより小さい、 すなわちあまり希少性が高くない人材と判断すれば、 たとえ採用基準を満たしたとしていても、 不採用になるだろう。

求職者にとっての転職エージェントを、 「プロスポーツ選手のエージェント」に喩えることがあるようだが、 この喩えは次の理由で不適切と言わざるを得ない。 すなわち、「プロスポーツ選手のエージェント」は、 選手の代理人として、 選手の利益を最大化することを目的として行動するのに対し、 転職エージェントのサービスは前述したように主に求人企業に向けられている。 プロスポーツの選手は当然、エージェントの成功報酬額を知っていて、 エージェントが報酬額に見合う働きをしていないと思えば、 その契約を解消して別のエージェントと契約するだろう。 一方、転職エージェントの場合は、 求職者が成功報酬額を知らないばかりか、 エージェントとの契約が簡易な「登録」で済まされてしまうことも多い。

つまり、「転職エージェントは、誰の『エージェント』なのか?」といえば、 求人企業に代わって求職者を探してくれる、 求人企業のエージェント (代理人) なのである。 このことは秘密でも何でもなく、多くの人が知っている事実だと思うのだが、 問題は当事者である求職者が、この事実を知らされていない、 あるいは「求職者のエージェント」であると誤解するのを放置している、 あるいは (派手な広告宣伝などによって) 誤解を助長していることにあるのだと思う。

求職者にもコンサルティングフィーの額を開示する、 あるいはキャリアアドバイス (and/or 求人企業との交渉の代行) と就職斡旋を分離する、 というのは非現実的かも知れないが、 転職エージェント業界がより健全に発展するために 必要な思考実験のようにも思われるのだが、 どうだろうか。

- o -

なぜこんな話をするかと言えば、 数年来の知人を転職エージェントに紹介されてしまう、 というハプニングに最近見舞われたからだ。 求人企業と転職希望者が勝手に直接意思疏通しては、 転職エージェントが「フィー」を請求できなくなってしまう。 そこで転職エージェントは求人企業と契約を結んで、 このような意思疏通を制限するのが一般的だが、 おかげで知人なのに話せない、というとても苦しい立場に追い込まれてしまった。

不条理を感じつつも、契約は契約なので仕方がない。 その知人がメールで、

転職エージェント A社さんの件で すが A社さんと連絡をとった所、説得されてしまいまして
(^.^;)このまま A社さん経由で手続きさせていただきたいん ですがよろしいでしょうか?
仙石さんからしてみたら回りくどいことをとお思いかもしれません が、どうか宜しくお願いします。
A社さん自体はいいエージェントさんだと(私は)判断してま すので、宜しくお願いします。

と連絡してきた時点で万事休すである。 私にできることといえば、 転職エージェント経由で送られて来た知人のレジメを読んで、 書類選考の結果を転職エージェント経由で返すことだけである。 知人にとっては、転職エージェントを利用するメリット/デメリットは、

メリット:
A社が応募書類の送付などの手続きを代行してくれるから楽。
他にも数社に応募していて、そこら辺のスケジューリングとか交渉が楽になる。
デメリット:
「回りくどい」と私に思われる

であって、 メリットの方が大きいと判断したのだろう。 よもや、 (転職が成立した暁には) 「手続きとかスケジューリングとか交渉が楽になる」なんてメリットが 消し飛ぶくらい高額のフィーが転職エージェントに支払われることになろうとは 夢にも思っていないはずである。

いくら高額でも自分で払うわけじゃないから気にならない、 と考える人がいるかも知れないが、 フィーの額が採否を左右するとしたらどうだろう? 求人企業側にとってはフィーを払う以上、 そのフィーに見合う人材かどうかが採否の判断基準になるのは当然のこと。 だとすれば不当に (?) 高い値段が自分につけられていないか、 気になるのではないだろうか?

この知人のケースでは、 能力的には KLab(株) の採用基準を満たしていそうな気もした (面接は行なっていないので定かではない) のだが、 フィーに見合うほど希少性が高いとは言いきれなかった。 そこで不採用の旨を転職エージェント A社に伝えた。

- o -

求人企業側として転職エージェントと取引することが多いのだが、 どういうわけか転職エージェントに求職者側として扱われることもある。 つまり転職エージェントから転職の誘いが来る。 ほとんどは下手な鉄砲数打ちゃ当る式に勧誘しているだけだろうから 無視しているのだが、 中には私のブログなどにも目を通して狙い撃ちしてくる転職エージェント (エグゼクティブ サーチと呼ばれる場合が多いかも) もある。 しかも特定の企業から依頼を受けて連絡したことを匂わせていたりする。

私の場合、コンサルティングフィーの世間相場もだいたい理解しているつもりだし、 (もちろん転職する意志はないが) 仮に誘いにのって転職するとすれば、 そのフィーの額を上回る価値を転職先企業に提供できる自信もある。 しかし私の名前を指定して転職エージェントに依頼するほど 私の能力を買ってくださる企業ならば、 なぜ転職エージェントなどを介さず直接連絡してこないのだろうか、とも思う。

More...
Filed under: 技術と経営 — hiroaki_sengoku @ 19:37
2007年5月16日

技術者の成長に役立つ会社とは?(2) hatena_b

技術者の成長に役立つ会社とは?(1) をとても多くの方々に読んで頂けました。 頂いたコメントや、 はてなブックマークに頂いたコメントを見ると、 賛同/批判 両方の立場から様々なご意見がありますね。 拙文が多くの方々の考えるきっかけになったのだとすれば、 書いた甲斐があるというものです。 特に学生さんにとっては、これから自身の人生を切り拓いていくのですから、 いま自分の将来について考えることは、 必ず後の人生にとってプラスになることでしょう。

以下に述べるのは、私が考える「技術者の成長に役立つ会社」の条件です。 他の人は異なった考えを持つかもしれませんし、 私自身も常に考え続けているので、 「役立つ会社」の条件が変ってくることがあるかも知れません。 しかし、 「技術者の成長にとって一番役に立つ会社を目指したい」というその思い自体は、 私が技術の責任者であり続ける限り、変らず持ち続けたいと思っています。

成長を邪魔しない会社

エラソーに「技術者の成長に役立つ会社」の条件と言っておきながら、 最初の条件が「邪魔しない」かよ、 えらく後ろ向きな条件だな、 という非難の声が聞こえてきそう (^^;) ですが、

上司は思いつきでものを言う(新書)
橋本 治 (著)

にも書かれているように、

会社は上司のピラミッドを骨格として、現場という大地の上に立っている。 「上から下へ」という命令系統で出来上がっていて、 「下から上へ」の声を反映しにくい。 部下からの建設的な提言は、 拒絶されるか、拒絶はされなくても、 上司の「思いつき回路」を作動させてしまう。

ということは、極めてありがちなのではないかと思います。 つまり、上司は体面を保つ必要がありますから、 部下に接するとき、 部下の良いところを誉めるだけではなく、 つい「粗探し」をして一言追加したくなるものだと思います。

だって、部下のことを 100% 肯定するだけでは、 上司の存在価値が危うくなりますからね~。 なにか部下の至らない点を無理矢理にでも見つけ出して、 教訓めいたことを言って上司の威厳を保ちたくなるものでしょう。

もちろん、部下の狭量な考えを正すために、 いろんな意見を言ってやることが必要なケースもあるでしょう。 「思いつきで」言うことが全て悪いと言うつもりもありません。 しかし、 部下の短所を矯正することばかりに熱中していては、 部下が技術者として成長することを妨げることになりかねません。 例えば、

キミは技術は優れているんだが、 もうちょっと仲間とうまく仕事をやっていくよう努力してもらえんかね? キミも社会人なんだから学生気分は早く捨てて、 チームワークを重視して仕事してもらわんと困るよ。

なんて言ってないでしょうか? 技術が (おそらく上司よりも) 優れている部下に対し、 その得意な技術をもっと伸ばすことよりも、 その部下がニガテとしていること、 例えばコミュニケーション能力を 「人並みに」身につけることを優先するよう要求してしまうわけです。

「感情的コミュニケーション」は、 若いうち (例えば 30歳前半まで) は手を出さないようにして欲しい コミュニケーション能力である。 特に研究者や技術者を目指そうとする若い人たちには、 周りの人がどう思うかなんかは気にせず、 (「空気嫁!」などの罵倒は無視して) 我が道を進んで欲しい。

コミュニケーション能力なんて、 歳をとって頭が固くなってからでも充分身につけることができます。 そもそも技術者にとって「人並み」のコミュニケーション能力なんて、 どれほどの価値があるというのでしょう? 技術者としての成長を考えるなら、 若いときにしか学べない「技術の本質」を身につけることこそ、 優先すべきではないでしょうか。

以上は、積極的に「成長を邪魔する」ケースですが、 以下のように、消極的に「成長を邪魔する」ケースも、 ありがちなのではないかと思います。

すなわち、 技術者の成長を第一に考えるのなら、 それぞれの技術者が自身の能力をフルに発揮して、 得意なことをとことん伸ばすことができるような 活躍の場を与えるべきだと思うのですが、 現実の会社だとそういう「適材適所」は、 なかなか難しいケースが多いかも知れません。 適切な活躍の場を与えないというのは、 成長を邪魔しようと意図しているわけではないにせよ、 結果として邪魔しています。

例えば、 新入社員がある特定の分野において素晴らしい能力を持っていたとしても、 その分野の業務に先任者がいたらどうでしょうか? その先任者を異動させてまで、 新人にその分野の業務を任せる、 という会社は多くはないでしょう。 むしろ、 新人が何が得意か検討して配属先を決めるというよりは、 人が足らない部署への配属を優先する会社の方が 多数派であるような気がします。

さらに言えば、 配属後も新人には雑用ばかりをやらせ、 能力を発揮できる仕事を任せない、 なんてこともあるのではないでしょうか。 上司と同様、 先輩にもメンツというのがありますから、 たとえ後輩の方が能力が高かったとしても、 それを素直に認めて立場を逆転させる (つまり先輩が新人の指示に従う) よりも、 新人の至らない点を無理矢理にでも見つけ出すことに熱中し、 雑用を押し付けることに終始してしまうものなのかも知れません。

会社ってのは、 部下や後輩の技術者の成長を邪魔してしまえ、とささやく誘惑に満ちています。 私自身、そういう誘惑に負けそうになることが全く無いと言えば嘘になります。 部下や後輩の技術者の成長を邪魔していないか、 常に自省し続けることこそ、 「技術者の成長に役立つ会社」の第一の条件と言えるのではないでしょうか。

技術者を「技術そのもの」で評価する会社

技術者が邪魔されずに成長できたとしても、 その成長を「技術そのもの」できちんと評価してあげられなければ、 片手落ちです。 技術的に成長したら成長したぶんだけ、 きちんと評価されて給料が上がる、 こうしてはじめて、 技術的に成長しようという意欲が継続するのだと思います。

こういう話をすると、 なぜ技術的に成長したからといって給料を上げる必要があるのか、 と思う人がいるかも知れません。 会社は技術者養成機関ではありませんから、 能力ではなく成果に対して報酬を支払いたい、 と思う人が出てくるのは当然でしょう。 では、「技術者の成果」とは何でしょうか?

「技術者の成果」とは何でしょう?
技術者が作ったものから得られる売上でしょうか? もちろん、それだけではないですよね? 「青色LED」のように最終的に莫大な利益を生み出したものは、 とても分かりやすい「成果」ですが、 サーバシステムの運用などのような縁の下の力持ちの仕事だって立派な成果ですし、 さらに、自分自身では何も生み出さなくても、 社内の技術者を育てることや、 社内の技術をブログなどで発表して会社の知名度を上げることなども、 立派な成果と言えるでしょう。

技術者という人材を「人財」すなわち会社の資産と考えるのであれば、 技術者の成長とは、「人財」の価値の増加、 すなわち会社の資産の増加を意味します。 売上は単にそのとき限りのフローに過ぎませんが、 技術者の成長はストックとなるわけです。 会計数字には現われにくいので見落とされがちなのですが、 技術者自身の成長こそ、 本来は最も評価されるべき「成果」と言えるのではないでしょうか。

しかしながら、 技術者の成長を「技術そのもの」で正当に評価することは、 容易ではありません。 「技術そのもの」で評価しようとすれば、 その技術分野の概要を理解している程度では全くダメで、 いざとなったら部下の仕事を代行できるくらいの技術力が、 評価する側に求められます。

もちろん、 いろんな得意分野を持つ部下たち全員において、 その仕事を完全に代行できることを上司に求めるのは無理な話でしょう。 部下全員の技術力のスーパーセットの技術力を上司の条件にしていては、 上司のなり手がいなくなってしまいます。

かといって、 半期ないし一年における部下の技術面での成長が、 どのくらい優れたものといえるのか評価できなければ、 つまり毎回「よくできました」「もっとがんばりましょう」などの 概要評価ばかりでは、 部下のモチベーションが下がってしまうことでしょう。 まして、技術面で部下の能力を評価するのを放棄して、 部下の関わったプロジェクトの売上高をそのまま部下の評価としていては、 技術的に成長しようというモチベーションを持続させることは不可能でしょう。

給料の一部が売上 (ないし利益等) に連動する、 ということはあってもいいとは思いますが、 技術力に連動する部分もあるべきで、 技術的に大きく成長したときはきちんと給料に反映させ、 あまり成長できなかったときは何が足らないのか、 きちんと指摘してあげるべきだと思うのです。

それには、 部下それぞれの得意分野について、 パフォーマンスの観点では部下に劣ることがあったとしても、 少なくとも技術内容の理解の観点では勝るとも劣らないことが 重要ではないでしょうか。

もちろん、これとて容易なことではありません。 部下が極めて優秀な場合、 その技術的背景をマトモに理解するには大変な労力が必要となるかも知れません。 つい、技術で評価するのを放棄して、 技術とは関係ない点を持ち出したくなるものだと思います。 しかし、 いくら大変でも、いくら時間がかかっても、 部下の技術を一生懸命理解しようとすることが重要だし、 理解しようと努力し続けてはじめて、 「技術力ではないところで部下を評価してしまえ」という誘惑に 打ち克つことができるのではないでしょうか。

得意分野を見つける余裕がある会社

現在の仕事が自身の得意分野に一致していて、 かつその仕事が好きであれば、 技術者にとってそれは理想的な仕事と言えるでしょう。

一生の時間のうちのかなりの時間を仕事に費やすのですから、 一生かけて取り組みたいと思うようなことをすべきだと思うのです。 好きなことをやっててお金がもらえれば苦労はしない、 と多くの人は言うでしょう。 でも、本当に一生かけてもやりたいほど好きなことってありますか?
面接 FAQ (4) から引用

しかし、 「やりたいこと」そのものズバリを、 最初に就職したときから仕事として やり続けてきた、 という人は少数派でしょう。 (私を含めて) 多くの人は、 いろんなことをやっているうちに、 「これだ」という仕事に出会い、 それにのめり込んでいくものなのではないかと思います。

あるいは、 今の仕事が一番自分に向いていると思っていたとしても、 なにかのきっかけで他の分野のことをやってみたら、 その分野のほうが魅力的であると感じ、 どんどん引き込まれてやっているうちに、 そっちのほうが自分に向いていることに気づく、 なんてこともあるかも知れません。

だから、 本業以外にも、 業務と関係ないことでも、いろいろ挑戦して欲しいと思っています。 ふとしたきっかけで始めたことが、 もしかすると自身の隠れた才能が開花することに 繋がるかも知れないのですから。

本業以外に熱中できる新分野を見つけた部下に対し、 「新分野を頑張るのはいいけど本業も忘れずにね」という忠告はするけど、 その新分野への取組みも大いに応援する、 KLab(株)はそんな会社でありたいと思っています。 勤務時間の 10% は本業以外のことを好き勝手にやっていい、 もし見込みが出てきて周囲から認められるレベルになったら、 それを本業にしてしまってもいい、 という「どぶろく制度」を作ったのも、 熱中できることを見つけるチャンスを逃して欲しくない、という思いからです。

本業の完璧な遂行もいいのですが、 自身の能力を最も発揮できる分野は一体何なのか考える余裕は持って欲しいですし、 技術者それぞれが最も自分に向いている仕事に出会えるように手助けすることこそが、 技術者のための技術会社の存在意義なのではないかと思います。

Filed under: 元CTO の日記,技術者の成長 — hiroaki_sengoku @ 07:34
2007年5月1日

システム管理者の ひろのぶさん、ご結婚おめでとうございます hatena_b

ひろのぶさん、けいこさん、ご結婚おめでとうございます。

ご両家、ご親族の皆様、本日はまことにおめでとうございます。

どうぞ、おかけになって下さい。

私はひろのぶさんの勤務先であるKLab株式会社で 技術の責任者を勤めている仙石と申します。

ひろのぶさんは、 KLab株式会社で技術者として働いているわけですが、 技術者と言っても当然いろいろな職種があるわけで、 ひろのぶさんはシステム管理者と呼ばれる役割を担っています。

普通の方々にとっては、 「システム管理者」というのは馴染みのない言葉かも知れません。 「管理者」というと管理職のことを思い浮かべるかたも多いかもしれませんが、 管理する対象は人間ではなくてコンピュータのシステムということになります。 平たく言えば、たくさんのコンピュータがきちんと動くよう見張る仕事です。

縁の下の力持ち的な仕事で、ある意味とても地味な仕事といってもよいでしょう。 コンピュータが正常に動いている限り、システム管理者とは空気のような存在で、 ともすると存在を忘れられがちになります。

そしてシステム管理者に注目が集まるのは、 コンピュータにトラブルが起きたときです。 何やってんだ、早よ直せ!そういう罵倒がシステム管理者に向けられます。 仕事がうまくいってコンピュータがきちんと動いているときは空気のように忘れられ、 失敗してコンピュータにトラブルが起きたときは非難の矢面にさらされる、 なんとも損な役回りであります。

だから、システム管理者を目指そうとする人は、 世間一般で言うと、そんなに多くはない。 さらに、技術を磨いてより高いレベルのシステム管理者を目指そうという人は、 よほどの変わり者といってもいいかもしれません。

でも、逆に言うと、レベルの高いシステム管理者というのはとても貴重な存在、 ということになります。 私の感覚で言うと、一人前のシステム管理者は、おそらく全国に 1000人もいない。 何十万人もいるコンピュータ技術者の中で、たった 1000人です。 割合で言うと 1% よりもずっと少ない。 そういう稀有な人材の一人が、ひろのぶさんというわけです。

そういう貴重な人材だからこそ、 もっとシステム管理者の地位を向上させたい、 トラブルが起きたときだけでなく、システム管理者がいい仕事をしたとき —つまりコンピュータがいつもどおり動いているということなので、 あまり華々しさはないのですが— そういうときにも、 システム管理者がきちんと評価されるような、 そういった会社でありたいと思っています。

コンピュータが順調に動いているとき、 システム管理者は 一見、なにもしていないようにも見えてしまうのですが、 実際には、トラブルを未然に回避すべく、 いろんな創意工夫をシステムに盛り込もうとしています。 あるいはシステムに普段と違う様子がないか コンピュータの動作を常に気にかけています。 少しでも違った気配があったりすると、 とても心配して、気が気でなかったりします。

これはもう「愛情」と言ってしまってもいいかもしれません。

コンピュータのような無機物を「愛する」なんて言うと、 変人扱いされてしまいかねない今日このごろなのですが、 モノに対する愛を変なものと考える昨今の風潮は、 いかがなものかと思います。

古来から日本人は万物に霊が宿っていると考え、 様々なものを愛でてきました。 命あるものだけでなく、 そのあたりの石ころや、あるいや刀や兜など、 そういったものにも魂が宿っていると考え、 愛してきたのです。

そういうモノに対する愛が、 工芸品などの高い技術をはぐくんできたのだと思います。 現在、コンピュータに関する技術で日本は米国など諸外国に 大きく遅れをとっているわけですが、 その原因の一つは、 そういったモノに対する愛を忘れてしまったからなのかもしれません。 コンピュータだってソフトウェアだってもっと愛すべきだと思いますし、 そういう心が高い技術を生み出すのだと私は思います。

まとめますと、システム管理者の仕事というのは、 日ごろからコンピュータの具合に気を配り、 愛情を持って接し、 平穏な日常を最大の目標としつつ、 創意工夫を盛り込むことを忘れない、 そういう仕事です。

こうしてみると、システム管理ってのは、 円満な家庭を築くのと驚くほど共通点が多いのではないかと思います。

そういえば、 弊社においてもシステム管理者ってのは愛妻家が多いような気がします。

あ、もちろん、他の職種の人の家庭が円満ではない、と 言っているわけではないです、念のため。

優秀なシステム管理者であるひろのぶさんなら、 きっと素晴らしく円満かつ幸せな家庭を築いていける、、 そんな気がします。

というわけで、 なんとか無事、 お話が結婚のお話に結びついたところで、 お祝いの言葉とさせていただきます。

本日は誠におめでとうございます。

Filed under: 技術者の成長 — hiroaki_sengoku @ 08:48
2007年4月24日

技術者の成長に役立つ会社とは?(1) hatena_b

ここ何ヵ月か、就職活動中の多くの学生さん達と話す機会を得ました。 いろんな方々と話しているうちに、 会社選びをしているはずの当の学生さん達の多くが、 いい会社の条件について確固たる基準を持っているわけではない、 という思いをますます強くしました。

「安定している会社」「福利厚生が充実している会社」「技術を教えてくれる会社」 などなど、 なんとなく「いい会社」のイメージを思い描いているだけで、 それが自身の人生にどう役に立つか、 筋道だった考えを持っているわけではないことに 改めて驚かされます。

安定している会社

「いい会社」のイメージとして、多くの学生さんがいだくものの筆頭は、 「安定している会社」「儲かってる会社」「勝ち組企業」でしょう。

先月 4/14 19:30 NHK で、 特報首都圏「就職戦線異状あり・格差社会の不安」と題する番組があった。 新卒の学生さん達が「勝ち組になる」ことを目指して 就職活動を行なっているのだという。
そりゃ、勝てるものなら勝ちたいと思うのは人の常なので、 これから社会に出ていこうとする学生さん達が、 将来勝ち組になれるような就職先を選ぼうとするのは至極当然のことだと思う。
ところが
学生さん達曰く、「勝ち組になるため、儲かっている会社に就職したい」。

ここんところ選挙などもあったからか、 「格差是正」を訴える声を聞くことが多かったのですが、 そもそも「格差」ってのは、 誰と誰との間の格差なんでしょうか? 「儲かっている会社に勤めている人」と、 そういう「いい会社」に雇ってもらえない人との間の格差なんでしょうか? 自身の実力は関係なくて、 「いい雇い主」に雇ってもらえるか否かが重要なんでしょうか? こういう発想には、まるで 「いい家柄」の出身かどうかを気にする階級主義者や 「血筋」を気にする人種差別主義者と似たニオイを感じてしまうのです。

「儲かってる会社」に勤めていて、高い給料をもらっていたとしても、 その能力は会社の中だけでしか通用しないものかも知れず、 逆に、儲かってない会社に勤めていたとしても、 自身の能力を磨くことを怠らなければ、 会社を飛び出して活躍できるようになるかも知れないってのは、 誰もが思っていることですよね? 昔は儲かっていたけど、 今では会社が傾いて、ついにはリストラされてしまった、 ってのもよく聞く話です。 「最後に頼れるのは己れの実力だけ」って 誰もがよく口にするわりには、 こと「格差」を考えるときに限っては、 「実力」より「どんな会社に勤めているか」のほうが先に出てくるのは なぜなんでしょうか?

「実力を磨きたいのは山々なれど、 実力を磨かせてくれるいい会社がない」とか、 「実力うんぬん以前に、 まず先立つモノ (給料) がないと」とか、 「実力はあるつもりだが、 それを正当に評価してくれる会社がない」とか、 そういった声が聞こえてきそうです。

確かに、ほとんどの会社は 実力を磨かせるより、コキ使うほうを優先するかも知れませんし、 実力をきちんと評価してくれない会社が圧倒的多数なのかも知れません。 しかしながら、世の中の 99.9% までそういう会社だったとしても、 実際に勤める会社は (当たり前ですが) たった一社でいいんです。 圧倒的多数の会社が社員の能力を伸ばすことに非協力的だったとしても、 そんなことはどーでもいいじゃないですか。 重要なのは自分が実際に就職する会社がどんな会社であるかであって、 世の中の会社の平均がどんな状況かではないのですから。

福利厚生が充実している会社

「安定している会社」を求める以上に不可解なのが、 「福利厚生の充実度」を気にする学生さん達です。 いったい会社に行って何をするつもりなんでしょうか?

自身の実力で会社に利益をもたらし、 その見返りに報酬を得る、というのなら筋が通っていますが、 それなら「福利厚生」みたいな中途半端なものを求めるまでもなく、 ストレートに自身の貢献に見合う「お金」を要求すればよい話です。 「お金」を求める自信も度胸もないからこそ、 「制度」としての「福利厚生」を求めるのでしょうが、 実力が足らないのを自覚しているのなら、 「福利厚生」を享受するなんて余裕をかましている場合じゃないでしょう?

これから社会に出ていく学生さん達が最優先で取組むべきことは、 会社と対等に渡り合える実力を身につけるために、 いま何をすべきか考えることでしょう。 そんな実力を身につけることは自分には永遠にムリと思う人がいるかもしれませんが、 ムリと思えば思うほど実現は遠退きます。 世の中にはいろんな会社があるのですから、 自身の能力を磨くのに適した会社は、 見つけようとしさえすれば、きっと見つかるはずです。

「20:80 の法則」 (パレートの法則) というものがある。 「売上の8割は、全従業員のうちの2割で生み出している」などの経験則が知られるが、 じゃ、その 2割の従業員だけでドリームチームを作れば、 すごい会社が作れるかというと残念ながらそうは問屋がおろさない。 「2割の従業員」がふたたび「20:80」に分かれてしまうのである。 精鋭チームを作ったつもりが、 そのチームの中の多数 (8割) は売上にあまり貢献しなくなってしまう。 逆に、ダメな従業員だけを集めたダメダメチームを作っても、 その中の 2割ほどは頭角を現し、チームを率いるようになる。
つまり能力を向上させる最良の方法は、自分が上位 20% に入ることを目指せるような集団に属することである。 まさに「寧ろ鶏口となるも牛後となるなかれ」。 上位20% に入ることがどうしても無理なら、 それはその集団が向いていないということである。 牛後に甘んじるよりは思い切って飛び出すべきだろう。

会社をイメージで選ぶのではなく、 どんな会社が自分にとって「いい会社」なのか、 考えることから始めるべきではないでしょうか。

技術を教えてくれる会社

「安定している会社」や「福利厚生」を求めるのに比べれば、 まだマシなのが「技術を教えてくれる会社」を求める学生さん達です。 少なくとも自分の能力を向上させようという意欲は持っているのですから。 しかしながら、 「受け身」の姿勢であるという点では、 大差ないのかも知れません。

「技術を教えてもらう」という態度では、 おそらく永久に上位 20% に入ることはできないでしょう。 「技術は伝えるものではなく伝わるもの」なのですから、 教える側に「充実した伝える方法」(例えば完備された指導マニュアル) を 求めている限り、 決して師匠に追い付くことはできません。 技術の習得に関して誰よりも貪欲であり続けなければ、 上位 20% を目指すどころか、 平均的な先輩たちを追い越すことすら覚束ないことでしょう。

つまり、技術を学ぼうとするなら、 その時点での実力はサテオキ、 「伝わる状態」にかけては自分が一番だと自信を持って言い張れる (つまり、その技術を学びたいという情熱にかけては誰にも負けないと言いきれる) 状態からスタートしなければならないのです。

「技術力のある会社に就職すれば、 そこそこの技術を身につけることができる」 そう考える人が多いのかも知れませんが、 これは二重の意味で間違っています。 すなわち、 「伝わる状態」ができていなければ学べないという意味で間違っているだけでなく、 仮に技術を身につけることができたとしても、 「そこそこの技術」では役に立たないという意味でも間違っています。

インターネットなどの普及によって技術に関する情報が巷に溢れる昨今、 「そこそこの技術」であれば、 会社に勤めなくてもいくらでも身につけることができます。 いやむしろ、 会社に勤めることよりも学ぶ意欲のほうがよほど重要でしょう。 技術力のある会社に就職したから技術が身につく、 なんて甘い考えでいる限り、 できることといえば「技術に慣れる」ことどまりでしょう。

長年やっていれば、誰でもそれなりの技術を習得できます。 極端なことを言うと、 どんなに能力がない人でもそのときの自分の状態にあった程度のことを 実践していけば、 その積み重ねの中でやがてはなんらかの技術を習得することができます。
しかし、このようなものは本来、技術の伝達とはいえません。 これを技術の習得というのも不適切で、 ただ単に技術に慣れただけというのが正確な言い方でしょう。
じつはこのように、 経験と慣れだけで技術を獲得してきた人は世の中にたくさんいます。 私はこういう人を「偽ベテラン」と呼んでいます
組織を強くする技術の伝え方 (畑村 洋太郎 著) から引用

「偽ベテラン」レベルの能力では、 「会社と対等に渡り合える」わけもなく、 そんな「使えない」能力を身につけるくらいなら、 別の分野を目指すべきだった、ということになってしまうかも知れません。

だから、高い技術力を持つから「いい会社」なのではなく、 その技術が自分自身が本当に身につけたいと心の底から思えるような 技術か否かのほうが重要だと思いますし、 技術の高さ低さよりは、 自身が技術を身につけていこうとする際に、 「役に立つ」会社か否かを見極めることのほうが重要だと思います。

では、どんな会社が技術者の成長に役立つ会社なのでしょうか?
続きは次回に...

Filed under: 元CTO の日記,技術者の成長 — hiroaki_sengoku @ 07:46
2007年4月16日

Windows「ファイルとフォルダの共有」をリモートな Windows VISTA マシンからアクセスする方法 (1) hatena_b

よく知られているように、 Windows の「ファイルとフォルダの共有」を、 リモート (例えば社外に持ち出したノートPC) からアクセスする には、 アクセス元マシンの TCP 139番ポートあるいは TCP 445番ポートを、 アクセス先サーバの同番ポートへポートフォワードすればよい。 ポートフォワードの方法としては、 ssh の -L オプション を使ってもよいし、 perl POEstone などを組合わせてフォワードする仕掛けを構築してもよいし、 VPN-Warpを使ってもよい。 要は「local:445」への接続が、 そのまま「remote:445」へ中継されるようにできればよい (以下、アクセス元マシンのホスト名を「local」、 アクセス先サーバのホスト名を「remote」とする)。

アクセス元マシン local の 139番ポートないし 445番ポートが 未使用なら話はここで終わりだが、 local が Windows マシンだったりすると話が少しややこしい。 local が Windows マシンだと普通は 139番ポートも 445番ポートも使用済である。 139番ポートも 445番ポートも、 フォルダを他のマシンのユーザへ共有公開するためのポートであるにもかかわらず、 共有公開しない場合でもこのポートを Windows が使用する (listen する) のは、 Windows の不可解な仕様の一つ。

139番ポートは、 以下に引用するように 「NetBIOS over TCP/IP を無効にする」設定で空けることが可能なので、 「Microsoft Loopback Adapter」などをインストールして 139番ポートが未使用なインタフェースアドレスを確保すればよい。

Windows XP 等で、「ネットワーク接続」の各アダプタのプロパティの中の、 「インターネット プロトコル (TCP/IP)」のプロパティにて、 「詳細設定」を選択すると、 WINS タブの中に、この「NetBIOS over TCP/IP を無効にする」という設定があります。
この設定 (以下、「NBT を無効にする」と略記) はどういう意味でしょうか? 実は、「このアダプタにおいて『NetBIOS 付 SMB』サービスを行なわない」 という意味です。 「NetBIOS over TCP/IP」という表現で 「SMBサービス」を指すのは分かりにくいと思うのですが、 それはサテオキこの設定を行なうと、 「NetBIOS 付 SMB」すなわち 137, 138番ポートと TCP 139番ポートを 使用しなくなります (つまり listen しなくなる)。

Windows XP ならば以上のような方法で、 リモートのファイル/フォルダを共有できた。

しかしながら、 Windows VISTA の場合、そうは問屋がおろさない。 local が Windows VISTA なマシンである場合、 まず 445番ポートへアクセスしに行ってしまう。 445番ポートは local マシンの「ファイルとフォルダの共有」のため、 (たとえ共有公開設定を行なわなかったとしても) Windows VISTA が使用済であり、 かつインタフェースアドレスを指定せずに listen しているので、 「Microsoft Loopback Adapter」などをインストールしたとしても、 445番ポートを空けることができない。

また、VISTA でなくても 139番ポートをポートフォワードして NetBIOS 付 SMB セッションを リモートサーバへ張る方法は、 実はあまり適切ではない。 Windows が「NetBIOS 付」つまり 137番ポートを使った NetBIOS 名の解決を 試みるからだ。 137番ポートはポートフォワードしていないため、 当然この NetBIOS 名の解決は失敗するのだが、 タイムアウトするまで待たされる。

では、どうすればいいか?

NetBIOS 名の解決を抑止するには、 Direct Hosting of SMB (TCP 445番ポート) を使うのが一番である。 通信相手を Windows 2000 以降に限定して構わなければ (そろそろ Windows 98 などは切り捨ててもいいのではないだろうか?)、 全てのネットワークアダプタにおいて、 「NetBIOS over TCP/IP を無効にする」を設定しておくことにより、 137 ~ 139番ポートを使った NetBIOS 通信に煩わされることがなくなる。

「NetBIOS over TCP/IP を無効にする」には、 各ネットワークアダプタのプロパティの中の、 「インターネット プロトコル (TCP/IP)」のプロパティにて、 「詳細設定」を選択すると、 WINS タブの中に、 この「NetBIOS over TCP/IP を無効にする」という設定があるので、 このラジオボタンを選択する。
やれやれ、これでアドホックな名前解決とは縁を切れる、と思ったら Windows VISTA では LLMNR (Link-local Multicast Name Resolution) なる 新しいプロトコルが導入されてしまった。 果たして LLMNR を無効にすることは可能なのだろうか? アドホックな名前解決の有用性は認めるにしても、 それを抑制する方法が存在しないのは問題なのではないだろうか。

そして 445番ポートをポートフォワードする。 前述したように、 local マシンの 445番ポートは Windows が使用済なので、 local マシンとは「別のマシン」を用意することが必要になる。 幸い、最近は仮想マシンが普及しつつあるので、 ノートPC などでも local マシンとは別のマシンを同居させることが 現実的になってきた。 もちろん、ポートフォワードのためだけに仮想マシンを走らすのは、 いかにも牛刀なので、 仮想マシンを走らせるニーズがなければあまり好ましい方法ではないだろう。 ポートフォワードだけを行なう仮想ネットワークドライバがあればいいのだが、 そういうものは果たしてあるのだろうか? ご存じの方は教えて頂けると幸いである。

幸い私の場合、以前から Windows 上で coLinux を走らせているので、 この仮想マシン上の Linux を使って 445番ポートをポートフォワードできる。 具体的な方法については長くなってしまうので、
続きは次回に...

Filed under: システム構築・運用 — hiroaki_sengoku @ 08:02
2007年3月19日

オープンソース版 VPN-Warp リレー サーバ (Perl POE を使って実装) hatena_b

Perl の非同期I/Oモジュール POE を使って VPN-Warp relayagent を書いてみました」に 続いて、 同じく POE を使って VPN-Warp リレー サーバも書いてみました。 これで、オープンソースだけを使って VPN-Warp を実現することができます。

今までも、 BIGLOBE の VPN ワープのページから証明書を取得すれば、 月額 525円で VPN-Warp を試してみることはできたわけですが、 ちょっと試してみたい場合など、 有料であることがネックである感は否めませんでした。 特に、 常日頃からオープンソースを使いこなしている方々だと、 ちょっと使ってみたいだけなのにお金を払うのはねぇ、 と思ってしまうのではないでしょうか。 かくいう私も、 無料「お試し版」のサービスやソフトウェアに慣れきってしまっているので、 試しに使ってみようとする場合に、 それが有料だったりすると、 いきなり億劫になってしまう今日このごろだったりします (^^;)。

というわけで、 オープンソース版 VPN-Warp です。 使い方はあまりフレンドリーではありませんが、 なんたって全て公開してしまっているので、 興味あるかたは、 とことんいじってみてはいかがでしょうか。

relayagent.pl と同様、 今回公開する relayserver.pl も SSL 暗号化/復号の機能を含んでいません。 したがってリレー サーバへの https アクセスを stone などを 通して SSL 復号する必要があります。 例えば stone を

stone -z cert=cert.pem -z key=priv.pem \
      localhost:12345 443/ssl &

などと実行しておき、 relayserver.pl を

relayserver.pl 12345

と実行します。これだけで 443番ポートはリレー サーバとして利用できます。 つまり、relayagent とブラウザからの https 接続を受付けると、 リレー サーバが両セッションを中継し 「ブラウザ → リレー サーバ → relayagent → Webサーバ」 という経路で通信できます。

                      リレー            イントラ         イントラ
ブラウザ ─────→ サーバ ←──── relayagent──→ Webサーバ
            https     443番ポート                        80番ポート

見かけは極めて tiny ですが、 通信プロトコルは本物(?)の VPN-Warp と互換性があるので、 「VPN-Warp relayagent フリー ダウンロード」から ダウンロードできる VPN-Warp relayagent を使うこともできます。

そもそも論で言えば、 リレー サーバの役目は単にデータを右から左へ渡すだけなので、 以下に示すようにその中核の部分は極めてシンプルです。 しかしながら、もちろんこれは KLab(株) で運用しているリレー サーバが単純であることを意味しません。 機能がシンプルでも、大量の同時接続 & 大量データを受付ける耐高負荷性能や、 機器の一部に故障が起きてもサービスが影響を受けない高可用性を実現するために、 様々な工夫を盛り込んでいます。

では、relayserver.pl の中身を順に見ていきましょう。

#!/usr/bin/perl
use POE qw(Component::Server::TCP Filter::Stream);
my $Port = shift;
my $PollID;
my $PollHeap;
my $PollBuf;
my $PollHeader;
my %SID;
my %Heap;
my %Buf;
my $NextSID = 0;

POE::Component::Server::TCP->new
    (
     Port => $Port,
     ClientInput => sub {
         my ($heap, $input, $id) = @_[HEAP, ARG0, ARG1];
         if (defined $PollID && $id == $PollID) {
             $PollHeap = $heap;
             $PollBuf .= $input;
             &doPoll;
         } elsif (defined $SID{$id}) {
             my $sid = $SID{$id};
             $Heap{$sid} = $heap;
             $Buf{$sid} .= $input;
             &doSession($sid);
         } elsif ($input =~ m@^GET /KLAB/poll @) {
             if (defined $PollID) {
                 $heap->{client}->
                     put("HTTP/1.1 503 Service Unavailable\r\n\r\n");
                 $heap->{client}->shutdown_output;
                 return;
             }
             $PollID = $id;
             $PollHeap = $heap;
             $PollBuf = $input;
             &doPoll;
         } else {
             $SID{$id} = $NextSID;
             $NextSID = ($NextSID + 1) & 0xFFFF;
             my $sid = $SID{$id};
             $Heap{$sid} = $heap;
             $Buf{$sid} = $input;
             &doSession($sid);
         }
     },
     ClientDisconnected => sub {
         my $heap = $_[HEAP];
         my $id = $heap->{client}->ID;
         if (defined $PollID && $id == $PollID) {
             undef $PollHeap;
             undef $PollBuf;
             undef $PollHeader;
             undef $PollID;
         } elsif (defined $SID{$id}) {
             my $sid = $SID{$id};
             undef $SID{$id};
             undef $Heap{$sid};
             undef $Buf{$sid};
         }
     },
     ClientFilter => POE::Filter::Stream->new(),
    );
POE::Kernel->run;

わずか 70行にも満たないコードですが、 リレー サーバの中核の部分は、ほとんどこれで全てです。 いかに POE (Perl Object Environment) の 記述性が高いか分かりますね。

私は常日頃から プログラマの生産性は、ピンとキリでは 3桁の違いがある と主張しています。 この主張をもう少し詳しく言うと、 その 3桁のうち、プログラマの腕に純粋に依存する部分は 2桁ほどの違いで、 残り 1桁ぶんは解決すべき問題に応じていかに最適な道具を使うかの違い、 ということになります。 最適な道具を使いこなせるもの腕のうち、 ということもできますね。

上記 70行にも満たないコードですが、 実は命令文としてみると、 わずかに 2 つの命令文であることが分かります。 すなわち、

POE::Component::Server::TCP->new(...中略...);
POE::Kernel->run;

ですね。実質「POE::Component::Server::TCP->new(...中略...);」 だけと言ってもいいでしょう。 この命令文は、

POE::Component::Server::TCP->new
    (
     Port => $Port,
     ClientInput => sub {
         ... クライアントから受信したデータの処理 ...
     },
     ClientDisconnected => sub {
         ... クライアントとの接続が切れたときの処理 ...
     },
     ClientFilter => POE::Filter::Stream->new(),
    );

という構造になっています。 つまり、クライアントからデータが送られて来たときに呼び出されるルーチンと、 クライアントとの接続が切れたときに呼び出されるルーチンを指定しておけば、 あとは POE がうまくやってくれる、というわけです。簡単でしょう?

リレー サーバにとって「クライアント」というと、 ブラウザか relayagent になります。 クライアントからの TCP/IPセッション一本一本に対して POE が ID を割り振っていて、 この ID を見ればどの TCP/IPセッションで送られて来たデータか分かります。

Perl の非同期I/Oモジュール POE を使って VPN-Warp relayagent を書いてみました」で 解説したように、 クライアントから送られて来た最初のデータが 「GET /KLAB/poll 」で始まっていれば、 そのクライアントは relayagent ですから、 以下のようにその ID ($id) を $PollID に代入しておきます。

         elsif ($input =~ m@^GET /KLAB/poll @) {
             if (defined $PollID) {
                 $heap->{client}->
                     put("HTTP/1.1 503 Service Unavailable\r\n\r\n");
                 $heap->{client}->shutdown_output;
                 return;
             }
             $PollID = $id;
             $PollHeap = $heap;
             $PollBuf = $input;
             &doPoll;
         }

同じ TCP/IPセッション (つまり $id == $PollID) で 続いて送られてきたデータは、 以下の部分で処理されます。

         if (defined $PollID && $id == $PollID) {
             $PollHeap = $heap;
             $PollBuf .= $input;
             &doPoll;
         }

いずれの場合も、受信したデータはいったん $PollBuf に蓄えた上で、 「doPoll」ルーチンを呼び出します。

一方、ブラウザから送られてきたデータの場合は、 以下のようにセッションID ($SID{$id}) を順に割当てていきます。 「セッション」という単語が何度も出てきてややこしいのですが、 $id が POE が各 TCP/IPセッションに割当てた ID で、 各 TCP/IPセッションそれぞれに、 リレー サーバが 16bit の番号を割当てたのが VPN-Warp で言うところのセッションID ($sid = $SID{$id}) です。

         else {
             $SID{$id} = $NextSID;
             $NextSID = ($NextSID + 1) & 0xFFFF;
             my $sid = $SID{$id};
             $Heap{$sid} = $heap;
             $Buf{$sid} = $input;
             &doSession($sid);
         }

同じ TCP/IPセッション (つまりセッションID $sid が $SID{$id}) を通して 続いて送られてきたデータは、 以下の部分で処理されます。

         elsif (defined $SID{$id}) {
             my $sid = $SID{$id};
             $Heap{$sid} = $heap;
             $Buf{$sid} .= $input;
             &doSession($sid);
         }

いずれの場合も、受信したデータはいったん $Buf{$sid} に蓄えた上で、 「doSession」ルーチンを呼び出します。

つまり、relayagent から受信したデータは doPoll ルーチンで、 ブラウザから受信したデータは doSession ルーチンで、 それぞれ処理する、というわけです。 以下の図に示すように、 リレー サーバの役割は、 relayagent から受信した (ブロック化された) データを、 (ブロックを開梱しつつ) ブラウザへ送信し、 またブラウザから受信したデータを、 ブロック化して relayagent へ送ることですから、 doPoll および doSession が何をするためのルーチンか予想できますよね?

VPN-Warp セッション

まず doPoll を見ていきましょう。

sub doPoll {
    do {
        if (! defined $PollHeader) {
            if ($PollBuf =~ /\r\n\r\n/) {
                $PollHeader = `;
                $PollBuf = ';
                $PollHeap->{client}->put("HTTP/1.1 200 OK\r\n\r\n");
            }
        }
        return unless defined $PollHeader;

リクエストヘッダを全て読み込んでいない場合 (つまり $PollBuff に空行 \r\n\r\n が含まれていない場合) は、ここで終わりです。
$PollBuf に受信データが追加されて、ふたたび doPoll が呼ばれるまで待ちます。

リクエストヘッダを全て読み込んだ場合は、 $PollBuf からリクエストヘッダ部分を削除した上で、 次に進みます。

        my ($sid, $len, $data) = unpack("nna*", $PollBuf);
        return unless defined $sid && defined $len && $len ne "";

ブロック全体を読み込めていない場合は、ここで終わりです。 $PollBuf に受信データが追加されて、ふたたび doPoll が呼ばれるまで待ちます。 「ブロック」というのは VPN-Warp 用語で、 relayagent とリレーサーバとの通信は、 基本的にこの「ブロック」を単位にして行ないます。 ブロックは次のような可変長のデータです。

    ┌───┬───┬───┬───┬───┬─≪─┬───┐
    │セッションID│ データ長  │  可変長データ   │
    └───┴───┴───┴───┴───┴─≫─┴───┘
          2バイト         2バイト      「データ長」バイト

「セッションID」および「データ長」は、ビッグエンディアンです。 つまり上位バイトが先に来ます。 したがって、上記コードによって $sid, $len, $data にそれぞれ 「セッションID」「データ長」「可変長データ」が代入されます。

なお、データ長が 0 ないし負数の場合は、 「可変長データ」の部分は 0 バイトになります。 このような「可変長データ」がないブロックは、 コントロール用のブロックで、 EOF や Error などのイベントを伝えます。

        if ($len > 32767) {
            $len -= 65536;
            $PollBuf = $data;
            if ($len == -1) {
                &doShutdown($sid);
            }
        }

$len == -1 のときは、Error を伝えるコントロール ブロックなので、 「doShutdown」ルーチンを呼び出しています。

        elsif ($len > 0) {
            return unless defined $data && length($data) >= $len;
            ($data, $PollBuf) = unpack "a${len}a*", $data;
            if (defined $Heap{$sid}) {
                $Heap{$sid}->{client}->put($data);
            }
        }

$len > 0 のときは、 $sid で示されるブラウザに対して $data を送信します。 $len == 0 のときは、 EOF を伝えるコントロール ブロックなので、 「doShutdown」ルーチンを呼び出しています。

        else {        # len == 0
            $PollBuf = $data;
            &doShutdown($sid);
        }
    } while ($PollBuf ne "");
}

以上を、$PollBuf が空になるまで続けます。

doShutdown はブラウザとの TCP/IPセッションを shutdown するためのルーチンです。

sub doShutdown {
    my ($sid) = @_;
    if (defined $Heap{$sid}) {
        $Heap{$sid}->{client}->shutdown_input;
    }
}

次に doSession です。

sub doSession {
    my ($sid) = @_;
    if (defined $PollHeap) {
        my $req = $Buf{$sid};
        $Buf{$sid} = "";
        for my $block (unpack "(a2048)*", $req) {
            $PollHeap->{client}->
                put(pack("nna*", $sid, length($block), $block));
        }
    }
}

ブラウザから送られてきたデータを、 2048 バイトずつ区切って「セッションID」「データ長」を 前につけることによってブロック化して、 relayagent に送信しています。

オリジナルの VPN-Warp を使ったことがある方は既にお気付きかも知れませんが、 上記 relayserver.pl は説明を簡単にするために機能をいくつか省いています。 例えば、オリジナルのリレー サーバは、 接続する際はクライアント認証が必須で、 同じクライアント証明書を提示した relayagent とブラウザを 結び付ける機能があるのですが、 上記 relayserver.pl はクライアント認証を行なわないので、 任意のブラウザから接続可能ですし、 同時接続が可能な relayagent は一つだけです。

腕に覚えのあるかたは、 オリジナルの VPN-Warp と同等の機能を実現するには どのような修正を加えればよいか、 考えてみてはいかがでしょうか? そして、 こういうことを考えることが好きなかた、 「いっしょにDSASつくりませんか?

Filed under: システム構築・運用,プログラミングと開発環境 — hiroaki_sengoku @ 06:36
2007年3月13日

「人を動かす」感情的コミュニケーション能力と 「モノを動かす」論理的コミュニケーション能力 hatena_b

先日書いた日記 「コミュニケーション能力の育成を第一とする教育が格差社会を救う」を とても多くの方に読んで頂けた。 はてなブックマークに頂いたコメントを読むと、 多くの方に賛同して頂けたようで、ありがたいことである。

この日記の冒頭で言及した 「某大学情報系学部が主催した、企業と学生のマッチングイベント」 では、 多くの学生さん、先生方にお会いして名刺を配りまくったので、 そのうちの何割かのかたには、 この日記を読んで頂けたはずであり、 なんらかの反応を期待していた。

私はこの某大学情報学部の学生なのですが、 コミュニケーション能力の育成が最優先だったのかと驚きました。 1年生から研究室配属の事をいってるのですかね。 私からすると、コミュニケーション能力育成が最優先に行われている気はしません。
YasuyukiMiuraの日記「コミュニケーション能力」から引用

率直な話、このようなトラックバックを頂けて、 「この某大学情報学部」の教育も捨てたものではない (失礼) と、 ほっとしている。

そもそもコミュニケーションは意味が広い
コミュニケーションは会話などを対象にしていることが多いけれど、 文章だってコミュニケーションの一つなんです、広義で見れば。
同ページから引用

その通りだと思う。 Wikipedia「コミュニケーション能力」に倣って、 「コミュニケーション」を、 「論理的コミュニケーション」と「感情的コミュニケーション」に分けてみよう。

前者の「論理的コミュニケーション」は、 学生さんのうちに是非身につけておいてもらいたいコミュニケーション能力である。 トラックバック元の YasuyukiMiura さんも、 「技術力があってもそれが伝わらなければ意味がない」と書いているが、 自身の技術を高めるには、 論理的コミュニケーション能力が必須である。 技術が好きなもの同士、とことん議論すべきだろう。

その一方で、「感情的コミュニケーション」は、 若いうち (例えば 30歳前半まで) は手を出さないようにして欲しい コミュニケーション能力である。 特に研究者や技術者を目指そうとする若い人たちには、 周りの人がどう思うかなんかは気にせず、 (「空気嫁!」などの罵倒は無視して) 我が道を進んで欲しい。

バイトやサークルの方がコミュニケーション能力が必要な機会が 多いのではないかと思います。 私はバイトもしていないしサークルにも入っていないのでなんともいえませんが。
その後、コミュニケーションはエネルギーを多く使用するので、 若いうちはそのエネルギーを技術を身につけるために使用したほうがよい。 といった感じの話が続くのですが、そうでもないと思います。
同ページから引用

おっしゃる通り、(非技術系の)バイトやサークルは、 感情的コミュニケーション能力を身につけるには最適な場だと思う。 感情的コミュニケーションの何が問題かと言えば、 「エネルギーを多く使用する」ことにあるのではなくて、 「フツーの人が手を出さないようなマニアックなことに興味を持つ」 機会が減ったり、 マニアックなことにどんどんのめり込むモチベーションが途切れがちになるからだ。 「他の人と同じように考え、同じようなことに興味を持ち、同じような娯楽を楽しむ」 ことで、 感情的コミュニケーションは円滑に進むようになる。

もちろん、感情的コミュニケーション能力は社会生活を営む上で、 必要不可欠なものである。 だからこそ、情報系の学生さんを採用しようとする企業の多くも、 感情的コミュニケーション能力を重視した面接を行なっているのだと思う。 しかし、「論理」と「感情」が時に対立するように、 「論理的コミュニケーション能力」と 「感情的コミュニケーション能力」も、 時として相反する能力である。 どちらかを伸ばそうとすれば、 もう片方は犠牲となる。

例えば、デール・カーネギーの不朽の名著:

人を動かす 新装版 (単行本)
デール カーネギー (著)

では、「人を説得する十二原則」のなかの最初の二原則として、

  • 議論に勝つ唯一の方法として議論を避ける。
  • 相手の意見に敬意を払い、誤りを指摘しない。

を挙げている。 どちらも、技術的なディスカッションを行なう上では、 致命的な障壁となる。 相手の感情を思いやったりせずに テッテー的に完膚なきまで論理的に相手を打ちのめすことは若者だけの特権であるし、 ぜひそういう「真剣勝負」を積み重ねる武者修行の旅に出て欲しいのだ。

研究者や技術者は、 「人を動かす」以前に「モノを動かす」必要があるのである。 どんなに人を説得する能力に長けていても、 コンピュータを思う通りに動かせないプログラマは失格であるし、 どんなに人に感銘を与える建物をデザインできても、 その建物が地震で崩れるのであれば建築士は失格である。

自分ではモノを動かすことができないのに口ばかり達者な評論家の言うことには、 どうか影響されないで欲しい。 研究者・技術者に必要なのは、 まず第一に他の人よりうまくモノを動かす能力である。 そしてぜひ信じて欲しいのだが、 人を動かす能力は歳をとってからでも身につけることができる。 デール・カーネギーの著書にも、そういう事例はたくさん出てくるし、 私自身、 デール・カーネギーの著書など、感情的コミュニケーションに関する本を読み耽るようになったのは、 KLab(株)の創業に関わるようになった 34歳になってからのことである。

Filed under: 技術者の成長 — hiroaki_sengoku @ 17:12
« Newer PostsOlder Posts »