<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>画竜点睛</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/garyotensei/" />
    <link rel="self" type="application/atom+xml" href="https://el.jibun.atmarkit.co.jp/garyotensei/atom.xml" />
    <id>tag:el.jibun.atmarkit.co.jp,2019-03-18:/garyotensei//73</id>
    <updated>2016-04-28T00:43:34Z</updated>
    <subtitle>コードのこと、チームのこと、エンジニアキャリアのこと等を思いつくままに。</subtitle>

<entry>
    <title>うさぎの伝言（その1）</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/garyotensei/2012/12/rabbitmq.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2012:/garyotensei//73.4035</id>

    <published>2012-12-12T02:33:06Z</published>
    <updated>2016-04-28T00:43:34Z</updated>

    <summary> 　前回の宣言どおり、こまめに更新していきます。 　今回から数回に分けて、先日の...</summary>
    <author>
        <name>Sansan株式会社　アーキテクト　藤倉 成太</name>
        
    </author>
    
        <category term="技術動向" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/garyotensei/">
        <![CDATA[<p><img src="http://www.rabbitmq.com/img/rabbitmq_logo_strap.png" /></p>

<p>　<a href="http://el.jibun.atmarkit.co.jp/garyotensei/2012/11/post-3fad.html">前回</a>の宣言どおり、こまめに更新していきます。</p>

<p>　今回から数回に分けて、先日のIIJさんとの合同勉強会で聞いた<a href="http://www.rabbitmq.com/">RabbitMQ</a>について調べたことを書いてみたいと思います。めずらしく技術ネタが続く予定です。</p>

<p><strong>◆ 久しぶりのメッセージングミドルウェア</strong></p>
<p>　<a href="http://el.jibun.atmarkit.co.jp/garyotensei/2012/06/post-d155.html">以前のコラム</a>にも少し書いたとおり、私はかつてCORBA (Common Object Request Broker Architecture)に始まり、メッセージングミドルウェアに割と長いこと携わっていました。CORBAに直接的に関わらなくなった後も、SOA (Service Oriented Architecture)に関連する技術を扱っていた関係で、ESB (Enterprise Service Bus)やSCA (Service Component Architecture)の実装をひたすら追っており、それらが連携をサポートしている各種ミドルウェアをいじっていたのです。

</p>

<p>　また、SOA関係の仕事をしていたころは、システム全体のアーキテクチャを設計することも多くありました。システム全体とは、何らかの形で連携し合うシステムすべてが対象で、多いときには数十のシステムが対象になるようなものです。そんなプロジェクトでは、どのようなアーキテクチャをどんなテクノロジで実現するべきかということに腐心していたので、メッセージングミドルウェアの話題を耳にすると自然とテンションが上がります。</p>

<p>　そんな私が勉強会で耳にしたのがMQ (Message Queue)の実装の一つであるRabbitMQです。これはいじってみないわけにはいきません。</p>

<p><strong>◆ MQとは？</strong></p>

<p>　MQという言葉になじみのない方のために、簡単にご紹介しておきます。なお、詳しく知りたい方はWebで調べていただければ数多くの情報が入手できると思います。</p>

<p>　MQというのは先述したとおりMessage Queueの略語です。これは、システムとシステムをキュー（先入れ先出し）を仲介として連携させるためのものです。MQでは一般的に「パブリッシャ」や「プロバイダ」と呼ばれるメッセージの提供システムと、「レシーバ」や「コンシューマ」と呼ばれるメッセージの受信システムが登場します。これらの間を取り持つのがMQサーバです。</p>

<p>　MQはその概念上、単一障害点になりやすいので、MQ製品に求められる可用性も自然と高くなります。MQサーバは未処理メッセージの永続化はもちろん、組み込みのフェイルオーバー機能やレプリケーション機能などが豊富に実装されているのが特徴です。また、メッセージの出し入れの性能がシステム全体の性能に大きく影響するため、単位時間当たりにサーバが処理できるメッセージ数が大きな製品の差別化要因になります。</p>

<p><strong>◆ Advanced Message Queuing Protocol</strong></p>

<p>　私がミドルウェアを調べるときには、その製品の生い立ちや実装された背景、製品として目指している方向を真っ先に理解するように努めます。これを知っておくと、情報の行間を読むのに役立つからです。

</p>

<p>　RabbitMQは<a href="http://www.amqp.org/">AMQP</a> (Advanced Message Queuing Protocol)準拠のMQ実装のようです。このAMQPというのは、2003年頃にJPMorgan Chase &amp; Co.のJohn O'Hara氏によって立ち上げられたもので、MQの通信プロトコルレベルでの互換性を確立するためのオープンな仕様です。つまり、AMQPに準拠している製品同士であれば、MQのパブリッシャ（メッセージキューにメッセージを送信するプログラム）とコンシューマ（メッセージキューからメッセージを受信するプログラム）が異なるMQ製品で実装されていても通信ができるということです。かつてJMS (Java Messaging Service)ではAPIレベルの互換性を保つための仕様が策定されていましたが、そこからさらに一歩進んだ取り組みといえます。</p>

<p>　AMQPの取り組みは、今ではOASISに取り込まれているそうです。このAMQPの取り組みですが、主には金融系システムにおけるメッセージング基盤として期待されているようです。</p>

<p><strong>◆ RabbitMQの歴史</strong></p>



<p>　さて、話をRabbitMQそのものに戻します。</p>

<p>　RabbitMQは2007年の2月にバージョン1.1.0がアルファ版として公開されています。その後数カ月の頻度でバージョンアップを繰り返し、2009年9月には最後の（？）ベータ版としてバージョン1.7.0をリリースしています（リリースノートには当初から「このリリースはアルファ版である」とか「ベータ版である」という記載がされているのですが、1.7.0を最後にこのような記載がなくなっています）。このリリースの履歴を見るだけでも、製品開発は活発で、成熟度も高く、信頼できそうな印象があります。</p>

<p>　RabbitMQは、当初LShift社とCohesiveFT社のジョイントベンチャーであるRabbit Technologies社によって開発が開始されています。しかし、その後製品が発展するとともに、Rabbit Technologiesは、2010年にVMWare社の部門であるSpringSourceによって買収されることになりました。現在ではRabbitMQの商用サポートはVMWare社によって提供されているようです。</p>

<p>　ちなみにこの当時は、さまざまなオープンソースコミュニティから商用サポート等を提供する企業が立ち上がっていたころです。EJBコンテナとして開発が始まったJBossのJBoss, Inc.やSpringのSpringSource, Inc.がそうでした。そこから、大手企業によるオープンソースのフルスタック戦略が始まったのもこのころです。いくつかの企業は、連携可能なサーバやミドルウェア、ビジネスプロセスエンジン等を次々と買収し、製品スイートとしてサポートをし始めたのです。</p>

<p>　ここまで見てみると、RabbitMQは製品としての歴史もあり、開発当初こそAMQP互換を目指したわけではなさそうですが、すぐに互換製品としての方向性を明らかにしていることが分かります。オープンな仕様に基づく運用互換製品というのは、一般的に差別化が難しいと同時に参入障壁も高く、市場として発展しなかった例が多くあります。そんな中、ここまで製品としての発展を続けているAMQPとRabbitMQはかなり気になる存在です。ミドルウェア製品としての筋の良さを感じます。</p>

<p><strong>◆ Erlangの実装</strong></p>

<p>　RabbitMQのサーバはErlangで記述されているそうです。これは、個人のレベルで見るとややリスクを感じる部分です。私がErlangを書けないことが理由なのですが、私がアーキテクトとして製品の採用可否を判断する上で、問題が発生したときに最終的に自分が直せるかどうかを考えます。直せないにしても、読み書きのできる言語で記述されているものであれば、なぜその問題が発生するかを想像して回避策を導き出せます。しかし、少なくとも今の段階で私はErlangが書けないので、RabbitMQに何らか不具合があった場合はその理由すらイメージできないと思います。</p>

<p>　サーバ製品を導入する場合に、一般的には有償でのサポートの有無などを先に確認する方も多いでしょう。私も当然実際に採用する場合は有償サポートを提供している企業があるかどうかは確認します。それでも、やはり自分で直せるかどうかということを重視しています。おそらく私は自分が責任を持つシステムにおけるブラックボックスをできるだけ減らしたいという性格なのでしょう。</p>

<p>　ちなみに、簡単に調べた限りではRabbitMQのサポートを日本で提供している企業はなさそうです。そうなると、一人の技術者としても、企業に属する人間としても、RabbitMQの採用には大きな判断が必要そうです。</p>

<p><strong>◆ 次回予告</strong></p>

<p>　実装言語や有償サポートの有無など、サービスの基盤として利用するには躊躇（ちゅうちょ）する要因も多いですが、個人の楽しみで触る分には遜色はありません。次回以降はRabbitMQを用いて、実際に何かを実装する手順などをお伝えしたいと思います。</p>

<p></p>

<p></p>]]>
        
    </content>
</entry>

<entry>
    <title>再開</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/garyotensei/2012/11/post-3fad.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2012:/garyotensei//73.4034</id>

    <published>2012-11-27T13:41:36Z</published>
    <updated>2016-04-28T00:43:33Z</updated>

    <summary>　随分長いことコラムを書いていませんでした。忘れていたわけではないのですが、諸事...</summary>
    <author>
        <name>Sansan株式会社　アーキテクト　藤倉 成太</name>
        
    </author>
    
        <category term="コミュニティ活動" />
    
        <category term="職場" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/garyotensei/">
        <![CDATA[<p>　随分長いことコラムを書いていませんでした。忘れていたわけではないのですが、諸事情があり筆（指）が止まっていたのです。書けない理由も整理されてきたので、そろそろ再開です。</p>

<p>　久々のコラムなので、指慣らしを兼ねて、コラムを更新できていなかったこの3カ月間で身の周りで起こっていたことを書いてみたいと思います。特に、エンジニアの輪を広げるきっかけになったイベントを中心にまとめてみます。</p>

<p><strong>◆ 合同勉強会 その二</strong></p>

<p>　以前、フェンリルさんとの合同勉強会について<a href="http://el.jibun.atmarkit.co.jp/garyotensei/2012/07/post-395c.html">コラムに書きました</a>が、第2回となる合同勉強会をIIJさんと行いました。例によって相互にスピーカーを出し合うLT大会です。さらに今回は趣向を少し変えて、LTの時間からアルコールを入れた非常にノリのよい勉強会となりました。</p>

<p>　（これまでやったことのない形だったので、ちょっとビビってしまい、アルコールは会場である弊社の業務時間終了のタイミングで開放しました）</p>

<p>　この勉強会は、第1回の勉強会の後、弊社開発メンバーが参加した社外イベントの懇親会会場での会話がきっかけです。以前のフェンリルさんとの合同勉強会は楽しかったし、こういった形でも他社の開発者と交流を持てるのだという気持ちから、意気投合したIIJの方と合同勉強会の話をまとめていきました。</p>

<p>　さらに、普段このようなイベントでは必ずといっていいほどスピーカーを担当する私が、今回はなし。完全に一参加者として楽しませてもらいました。先述のとおり途中からアルコールが入っていたこともあり、LTはかなりの盛り上がりを見せました。また、そのような雰囲気のLTの後だからこそ、懇親会ではいつも以上にIIJのエンジニアの方々との交流も深いものになったように思います。</p>

<p>　ひょんなことから始めた合同勉強会が、このようにして進化しながら伝播していくのはとてもうれしいです。ご興味のある方は、イベントなどで私を見かけたら声をかけてください。ぜひ一緒にやりましょう。そして、お互いのエンジニアの輪を広げていきたいです。</p>

<p>　三三 ニュース＆トピックス<br />
　<a href="http://www.33i.co.jp/news/2012/120924_928.html">クラウド名刺管理の三三、IIJと合同でエンジニア勉強会を開催</a></p>

<p><strong>◆ 合同勉強会 その三</strong></p>

<p>　立て続けに合同勉強会です。第3回は、弊社社員の以前からの知人が勤務されているVOYAGE GROUPさんと共同で行いました。この勉強会は、三三合同勉強会初のアウェイです。VOYAGE GROUPさんの誇る社内バー「AJITO」で軽食やアルコールを取りつつのLT大会となりました。</p>

<p>　しかし、この勉強会については多くを語れません。なぜなら、大変楽しみにしていた当日に体調を崩して参加できなかったからです。本当に楽しみにしていたので残念です。悔しくて仕方ないです。ですが、こうして、もはや私が参加もしない（できなかっただけですが）ところで、合同勉強会がどんどん広がっています。</p>

<p>　勉強会に参加できずに失った、エンジニアの輪を広げる機会を挽回するべく、VOYAGE GROUPボルダリング部と三三ボルダリング部による合同でのボルダリングを計画しています。合同ボルダリングについても、いずれ当コラムでお伝えできるかもしれません。</p>

<p>　エンジニアの方で（当然エンジニアでなくてもよいのですが）、ボルダリングをやるという方がいればぜひお声がけください。都内23区内であれば、一緒に登れるかもしれません。</p>

<p>　三三 ニュース＆トピックス<br />　<a href="http://www.33i.co.jp/news/2012/121109_1199.html">三三、VOYAGE GROUPと合同でエンジニア勉強会を開催</a> </p>

<p></p>

<p><strong>◆ 高専企業訪問ツアー受け入れ</strong></p>

<p></p>

<p>　以前から私の所属する三三では、高等専門学校（高専）といろいろな形で関わってきています。高専の学生さんは意識や専門スキルも高いため、将来は優秀なエンジニアとして世界で活躍してほしいという親心的な感覚で学生さんとお話をさせていただく機会も多いのです。</p>

<p>　日ごろのそのような活動からのつながりもあって、「高専ベンチャープロジェクト」の主催する「企業訪問ツアー in TOKYO」の訪問企業の一つとして、三三に15名の学生さんが訪れました。ここでは、弊社の誇るホープである高専卒の中森と私がそれぞれ、これから社会に出ていく皆さんにお伝えしたいことを話させてもらいました。</p>

<p>　さすが、意識の高い学生さんたちです。話の後にオフィス内の見学をしてもらったのですが、その合間にも中森や私と名刺交換をしたり、Facebookの連絡先を交換したりと、その後の交流につながっています。高専の学生さんと私は年齢的にはかなり離れていますが、やはりエンジニアマインドに年齢や性別の差はありません。このような会社のイベントを通じても、私のエンジニアの輪は広がっていきます。</p>

<p>　三三 ニュース＆トピックス<br />　<a href="http://www.33i.co.jp/news/2012/120906_898.html">高専ベンチャープロジェクトによる高専生の企業訪問を受け入れました</a> </p>

<p><strong>◆ 専門学校特別講義</strong></p>

<p>　学生さん関連が続きます。東京デザインテクノロジーセンター専門学校（TECH.C.）でIT-Web系コースを専攻している学生の皆さん向けに特別講義を行ってきました。講義の内容は「ITベンチャーで働くということ」です。私からは、学生さんがこれから社会に出るに当たって知っておいてほしいことを中心にお話をさせていただきました。</p>

<p>　突然ですが、私はソフトウェアの開発者という職業が好きです。天職であるとすら思っていますし、大いに誇りも持っています。これから開発者になる方には夢と希望、野望を持って業界に入ってきてほしいです。一口に開発者といっても、自分の専門領域をどこに持つべきか。誰にも負けない専門領域を持ちつつも、フロントエンドからバックエンドまでカバーできるジェネラリストであることも、これからのエンジニアには必須条件になってきます。</p>

<p>　さらには、開発者として価値あるものを提供し続けるには、スキルはもとより、心構えなども非常に重要です。われわれの仕事は単に動くプログラムを書くことではありません。開発するソフトウェアを通じて、価値を創造することが仕事です。自分の職業の意義を知り、価値創造のためのスキルを研鑽し続けるのには、それなりに覚悟がいります。そのためにも、今から高いプロ意識を持ってエンジニアの道を歩んでほしいと思います。</p>

<p>　学生の皆さんには、上記のような内容をお伝えしてきました。</p>

<p>　ここでも、このような特別講義に出る学生の方々は意識が高いなと感じました。講義の後には、講義中には聞けなかった質問を聞きに来られる方や、やはりここでも名刺交換やFacebookの連絡先を交換する方が多く、新たなエンジニアとのつながりを作れました。</p>

<p>　三三 ニュース＆トピックス<br />　<a href="http://www.33i.co.jp/news/2012/121018_1049.html">専門学校(TECH.C.)で特別講義を行いました</a></p>

<p><strong>◆ 3カ月を振り返る</strong></p>

<p>　コラムの更新が滞っていた期間のまとめ記事のようになってしまいました。</p>

<p>　でも、こうしてみると、この3カ月の間にも私のエンジニアの輪はどんどん広がっていることを、あらためて認識します。エンジニアにはエンジニア同士で分かり合えることがたくさんあります。お互いに切磋琢磨もできます。社内や閉じた世界でくすぶるのではなく、どんどんと外に出ていくことをお勧めします。そして、エンジニア同士の輪を広げていきましょう。</p>]]>
        
    </content>
</entry>

<entry>
    <title>自社開催の勉強会に登壇するということ</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/garyotensei/2012/08/post-5fd3.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2012:/garyotensei//73.4033</id>

    <published>2012-08-29T03:16:47Z</published>
    <updated>2016-04-28T00:43:33Z</updated>

    <summary>　冒頭から余談です。 　弊社の社員が夏休みを利用してシリコンバレーへ旅行に行った...</summary>
    <author>
        <name>Sansan株式会社　アーキテクト　藤倉 成太</name>
        
    </author>
    
        <category term="コミュニティ活動" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/garyotensei/">
        <![CDATA[<p>　冒頭から余談です。</p>

<p>　弊社の社員が夏休みを利用してシリコンバレーへ旅行に行ったようです。彼女は幸いにして、シリコンバレーに本社を置くベンチャー企業の社員と友人になり、図々しくも友人の会社を見学させてもらったそうです。大変うらやましいですね。現地で会社見学とまでは行かなくても、皆さんも休暇を利用してシリコンバレー旅行に行ってみてはいかがでしょうか。「なんだかすごそう」と思っているシリコンバレーでも、実際に行ってみると雰囲気を実感できて、精神的な距離感が縮まるかもしれません。</p>

<p>　特に最近は、<a href="http://www.33i.co.jp/blog/dorayaki/2012/120826.html">ブログ</a>にも書かれているように、サンフランシスコ市内にオフィスを構えるベンチャー企業が増えています。特別な移動手段がなくても、徒歩やケーブルカーで行けるので、例えば、最近何かで見聞きした会社のオフィスがどのような建物に入っているのかを見るだけでも、かなりイメージが変わると思います。</p>

<p>　他の大都市に比べると観光スポットで若干の遜色はあるものの（と個人的には思っています）、魚介類の料理も楽しめます。特に冬になればダンジネスクラブのシーズンですから、旅行先の1つとして検討してみてください。</p>

<p><strong>◆ 勉強会を自社開催</strong></p>

<p>　さて、ここからが本題です。</p>

<p>　先日、当社主催の勉強会「Ruby×AWS = Webサービス」を開催しました。以前に合同勉強会と称して内輪の勉強会で自信をつけた我々は、次のステップとして一般に参加者を募って勉強会を実施したのです。</p>

<p><strong>◆ Ruby×AWS</strong></p>

<p>　勉強会の主なテーマは、当社が運営している<a href="https://8card.net/">Eight</a>というサービスが、Ruby on Rails と AWS（Amazon Web Services) を使ってどのように構築されているかというものです。</p>

<p><a href="http://el.jibun.atmarkit.co.jp/photos/uncategorized/2012/08/28/20120823_shishikura.jpg"><img width="300" height="175" border="0" src="http://el.jibun.atmarkit.co.jp/garyotensei/images/2012/08/28/20120823_shishikura.jpg" title="20120823_shishikura" alt="20120823_shishikura" /></a>


</p>

<p>　EC2(Elastic Compute Cloud)やRDS(Relational Database Service)以外にもAWSでは非常に有用なサービスがたくさんあります。それらをサービスの中でどのように使っているのか、また、それぞれサービスの特性がどのようになっているのかという話を、Eightの実際のネットワーク構成も一部お見せしながらの発表でした。データベースの分散方法や、開発で困ったことなどの具体的な話も好評だったようです。</p>

<p>　また、ChefとCapistranoを使ったサーバ構成管理やアプリケーション配備についても触れ、なぜそれぞれを選択したのかといった背景についても言及されました。選択の理由は、それぞれが非常にスジのよい製品でると考えたこと、組み合わせた場合の親和性が高かったことが挙げられていました。</p>

<p><strong>◆ 神山ラボについて話す<br /></strong></p>

<p>　私はRubyistではないので、この勉強会の主たるテーマについてお話することはできません。しかし、Rubyの話だけでは間がもたないので、私から三三が誇る神山ラボ（※）のお話をさせていただきました。</p>

<p>※ 神山ラボとは、徳島県神山町にある古民家を利用した<a href="http://www.33i.co.jp/kamiyama/">三三のサテライトオフィス</a>です。</p>

<p>　開催に当たって登壇を安請け合いをしましたが、よく考えるとテーマとはまったく関係のないこと。事前にタイムテーブルも告知され、それを了承いただいた上で参加してもらっているのですが、それでも「関係ない話はつまらないな」と思われやしないかとビクビクしてました。</p>

<p>　そんな気持ちもあって、少しでも意味のあることをお伝えしたい（少しでも意味があればつまらないと思われなくて済む）と考え、テーマを「エンジニアの生産性」としました。私や当社が今のところ考えているエンジニアの生産性についてのお話をしたのです。</p>

<p>　これまでも、いろいろやセミナーや勉強会などでお話をすることもあったのですが、テーマと関係がない話をするのは初めてでした。</p>

<p><a href="http://el.jibun.atmarkit.co.jp/photos/uncategorized/2012/08/27/p1070937.jpg"><img width="300" height="168" border="0" alt="P1070937" title="P1070937" src="http://el.jibun.atmarkit.co.jp/garyotensei/images/2012/08/27/p1070937.jpg" /></a></p>

<p><strong>◆ 温かさを知る</strong></p>

<p>　そんな心境で臨んだ発表でしたが、結果は上々。参加者の皆さんの暖かさに支えられ、無事に終えることができました。</p>

<p>　その後の懇親会でも多くの参加者の方々とお話をさせていただきましたが、内容がつまらなかったなどと心ない指摘をされることはありませんでした。当然と言えば当然ですが。皆さん好意的な感想や、発表内容への質問をたくさんいただき、志を同じくするエンジニアの皆さんは本当に温かい方々が多いと実感しました。参加者アンケートはこれから集計されるということなのでまだまだ予断は許しませんが、きっと大丈夫です。</p>

<p><a href="http://el.jibun.atmarkit.co.jp/photos/uncategorized/2012/08/27/20120823_all.jpg"><img width="300" height="111" border="0" alt="20120823_all" title="20120823_all" src="http://el.jibun.atmarkit.co.jp/garyotensei/images/2012/08/27/20120823_all.jpg" /></a>


</p>

<p>　皆さんも積極的に勉強会で登壇しましょう。たとえ最初はうまくできなくても、そこから得られるフィードバックによって成長して、その次はもっとうまくできるようになるはずです。何にもまして、聞きに行く勉強会と話しに行く勉強会では、他のエンジニアとの関係性が随分と変わります。発表者になることで、懇親会でも濃い話ができて、つながりが強くなるような気がします。</p>

<p>　今回の私は、会社で主催する勉強会で発表する機会を得られたので幸運でしたが、最近では勉強会の開催もハードルが低くなっています。いきなり主催するのは難しくても、多くの勉強会では発表者を広く募集しています。勉強会で発表するといっても、誰も知らないことを正しく解説することだけが発表ではありません。</p>

<p>　悩んでいることを自分なりの解釈を加えて話すことで、聞いている人に新たな気付きを与えたり、同じように悩んでいるエンジニアがいるということを知らせることもできます。発表することは難しいことではありません。</p>

<p>　なお、これに味をしめた我々は、さらに次回以降も勉強会を企画していくつもりになっています。もし内容にご興味があれば、ATNDなどで告知していくことになると思いますので、ぜひご参加ください。
</p>]]>
        
    </content>
</entry>

<entry>
    <title>チャンスと捉えよ――ベンチャー企業への転職</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/garyotensei/2012/08/post-5748.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2012:/garyotensei//73.4032</id>

    <published>2012-08-17T01:58:59Z</published>
    <updated>2016-04-28T00:43:33Z</updated>

    <summary>　最近、採用活動を手伝うことがあり、求職中のエンジニアの方々とお話ししていて思う...</summary>
    <author>
        <name>Sansan株式会社　アーキテクト　藤倉 成太</name>
        
    </author>
    
        <category term="キャリア" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/garyotensei/">
        <![CDATA[<p>　最近、採用活動を手伝うことがあり、求職中のエンジニアの方々とお話ししていて思うことがありました。それは、あまりにも多くの方がベンチャーへの転職をリスクをとる「チャレンジ」だと考えすぎているのではないか、ということです。</p>

<p>　これは、とてももったいないことです。</p>

<p><strong>◆ 採用面接はお見合いのようなもの</strong></p>

<p>　転職活動で面接を受けるとき、どのような気持ちで臨みますか？</p>

<p>　「どうやって自分をアピールしようか」とか「採用してもらえるだろうか」というような気持ちのみで臨んではいないでしょうか。</p>

<p>　もちろん魅力ある人気企業の面接を受けるときにはこのような気持ちにもなるものですが、面接とはいわばお見合いと同じです。相手（企業）も同じ事を思っているはずです。特にベンチャー企業の場合は。企業の側だって「どうやって自社をアピールしようか」とか「次の面接に進んでもらえるだろうか」と思っているものです。</p>

<p>　面接の場では、積極的に企業を選びましょう。一方的に質問を受けてそれに答えるのではなく、自分から企業の面接担当者に質問をするのです。</p>

<p>　特に、職場環境などは非常に重要ですね。「エンジニアは毎朝何時に出社していますか？」とか「開発現場においてお互いが助け合うような雰囲気はありますか？」など、具体的にどんどん聞いてください。また、「現在の開発における課題は何ですか？」というような、かなり懐をえぐるような質問をしても大丈夫です。</p>

<p>　逆に、「こんなことを聞いては失礼かな？」などと決して思わないこと。これから自分の大切な時間を共にする場所です。求職者個人にとっては非常に重大な人生の選択なわけですから、聞いて失礼なことなど、1つもありません。</p>

<p>　自分と相手（企業）の質問の量が1対1になろうが、自分からの質問の方が多かろうが、構うことはありません。企業からの質問が多くなければならないなどという決まりはないのです。</p>

<p>　逆に、企業に対してきちんと質問ができている人は、転職について具体的に準備ができている人、ものごとの奥の奥まできちんと考えられている人という良いイメージの方が強くなります。</p>

<p>　こうすることで、転職した後のことを詳細にイメージして、実際に入った時に「イメージと違った」となってしまうリスクを排除しましょう。これで1つリスクがなくなるか、少なくとも限りなく小さくできるはずです。</p>

<p><strong>◆ 給与は自ら上げる</strong></p>

<p>　次に多い心配ごとはやはり給与面です。特に大手企業からベンチャー企業へ転職する際には気になるものです。</p>

<p>　これはセンシティブな情報なので、1次面接の場でいきなり切り出すのは憚られるものですね。実際、聞いても具体的には答えてもらえないことも多いと思います。実際には、1次面接で聞かれても本当に答えられない（それを検討するのはこれから）という場合もあります。</p>

<p>　しかし、よく考えてください。これから転職しようとしている会社には、すでに何人もの社員がいるはずです（社員第1号として転職するような場合は、この記事は当てはまりません）。そして、その先輩社員の方々も生活をしています。ですから、よほどのことがない限り、転職翌月から生活に困るということはないはずです。</p>

<p>　ただし、人にはそれぞれ人生のステージがあります。先輩社員が皆若くて単身者が多いにもかかわらず、あなたに家族があって住宅ローンを抱えているというような場合は当てはまりません。この程度のことであれば、面接で質問しても答えてくれるはずです。そして、転職先に自分と似たようなステージにいる人がいれば、生活していけることは保証されます。</p>

<p>　このように考えることで、さらにベンチャー企業への転職リスクが減らせるのではないでしょうか。</p>



<p>　また、ベンチャー企業で働く場合は、給与は与えられるというものではなく、自ら上げていくものというくらいの気概を持つべきです。「会社が成長したら給与が上がるかもしれない」と考えるのではなく、「自らの働きで会社を成長させる」結果として自分の給与を上げるのです。</p>

<p>　ここには大企業にはない可能性とチャンスがあります。非常に多くの社員がいる環境や、少数でも長く続いている会社には、前例によるしがらみや今後の心配があります。たとえあなたが卓越した成果を上げたとしても、1人だけ給与を上げることは難しいのです。しかしベンチャー企業は違います。給与水準を決める前例はないので、自分たちが水準を作っていくのです。また、中途採用の多いベンチャー企業では、年齢や社会人歴で判断されません。誰が何をしたのか、だけで決まるのです。</p>

<p><strong>◆ チャンスです

</strong></p>

<p>　世の中にはたくさんの企業がありますが、実際に「自分が入りたいと思える企業」となるとかなり数が限られてきます。転職活動中に「この企業いいかも」と思った企業があって、面接が進んでいったとすると、それはかなりの幸運です。なぜなら、相手もあなたのことをよい人材と思ってくれたからです。このような出会いはそうそうあるものではありません。</p>

<p>　ベンチャー企業は企業としての成長スピードが早いのですが、それは人材の成長も加速させます。ベンチャー企業で働くということは、自分の社会人としての成長、エンジニアとしての成長を加速させる千載一遇のチャンスだと考えてください。</p>

<p>　面接が進んで転職が具体的になった時に転職後の生活を想像してあわてないでください。上記に挙げたようなことをあらかじめ検討して、面接に受かった企業に飛び込んでみましょう。</p>]]>
        
    </content>
</entry>

<entry>
    <title>合同勉強会のススメ</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/garyotensei/2012/07/post-395c.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2012:/garyotensei//73.4031</id>

    <published>2012-07-27T04:24:38Z</published>
    <updated>2016-04-28T00:43:33Z</updated>

    <summary> 　ひょんなことから、あのSleipnirやデザインで有名なフェンリルの人々と知...</summary>
    <author>
        <name>Sansan株式会社　アーキテクト　藤倉 成太</name>
        
    </author>
    
        <category term="コミュニティ活動" />
    
        <category term="職場" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/garyotensei/">
        <![CDATA[<p></p>

<p>　ひょんなことから、あのSleipnirやデザインで有名な<a href="http://www.fenrir-inc.com/jp/">フェンリル</a>の人々と知り合うことができました。そして、お互いの技術者同士で何か面白いことをやってみようという話になったのです。</p>

<p>◆ 合同LT大会</p>

<p>　有志による合同勉強会のようなものをやってみようと企画を練ってみました。われわれ三三のメンバーからすれば、フェンリルさんがどうやってSleipnirを開発しているのか、専門のデザイナーさんによるUXの話、さらには東京・大阪・国外などに分散した開発拠点間による連携の話など、聞いてみたいことはたくさんあります。逆に、フェンリルさんからも、自社サービスの運営や、大量データを正確に入力する仕組み、当社の<a href="http://www.33i.co.jp/kamiyama/">神山ラボ</a>の取り組みなどについて聞いてみたいと言っていただきました。</p>

<p>　お互いに聞きたいテーマがたくさんあるし、やるならば少しでも多くのメンバーに話をしてもらいたい。そうなればLT大会が適しているだろうと。幸いにして当社にはかなり大きな銅鑼があります。これはもうLTしかありません。</p>

<p>（この銅鑼は、営業が注文をいただいた時や開発で大きなリリースを終えた時など、社内で盛り上がりたいときに、業務中であろうがなかろうが景気よく鳴らすためにあります）</p>

<p>　このような経緯で開催に至ったフェンリル・三三合同LT大会の様子を紹介します。</p>

<p><a href="http://el.jibun.atmarkit.co.jp/photos/uncategorized/2012/07/26/p1070829.jpg"><img width="300" height="225" title="P1070829" alt="P1070829" src="http://el.jibun.atmarkit.co.jp/garyotensei/images/2012/07/26/p1070829.jpg" border="0" /></a>


</p>

<p>　これは神山ラボについて話す当社エンジニア。</p>

<p><a onclick="window.open(this.href, '_blank', 'width=800,height=600,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false" href="http://el.jibun.atmarkit.co.jp/photos/uncategorized/2012/07/26/p1070823.jpg"><img width="300" height="225" title="P1070823" alt="P1070823" src="http://el.jibun.atmarkit.co.jp/garyotensei/images/2012/07/26/p1070823.jpg" border="0" /></a>


</p>

<p>　会場は予備の椅子を並べても座りきれないほどの満員御礼状態となりました。</p>

<p><a href="http://el.jibun.atmarkit.co.jp/photos/uncategorized/2012/07/26/p1070821.jpg"><img width="300" height="225" title="P1070821" alt="P1070821" src="http://el.jibun.atmarkit.co.jp/garyotensei/images/2012/07/26/p1070821.jpg" border="0" /></a>


</p>

<p>　勉強会の後の懇親会です。こちらは当社のスマッシュルーム（普段は卓球台が鎮座していて、皆で卓球を楽しむ部屋です）を使い、軽食とアルコールで大いに盛り上がりました。</p>

<p><a onclick="window.open(this.href, '_blank', 'width=800,height=600,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false" href="http://el.jibun.atmarkit.co.jp/photos/uncategorized/2012/07/26/p1070846.jpg"><img width="300" height="225" title="P1070846" alt="P1070846" src="http://el.jibun.atmarkit.co.jp/garyotensei/images/2012/07/26/p1070846.jpg" border="0" /></a>


</p>



<p>◆ 合同勉強会はお勧め</p>

<p>　例えば当社の場合、開発メンバーは平日の夜や休日の勉強会に各々が参加していますが、勉強会で一緒になることは多くありません。その上、メンバーがLTしている姿を目にしたことは、私はありませんでした。今回の勉強会では多くのメンバーが話したので、普段の業務では見ることのできない皆のLTテクニックやユーモアを垣間見られました。また、新しい勉強会を開拓することも最近はしていなかったので、普段とは随分違う雰囲気で楽しいものでした。</p>

<p>　事前打ち合わせ2回と、あとは当日の会場（当社会議室）の予約、直前に銅鑼を会議室に運ぶという程度で、今回の合同勉強会は割りと気軽に実施できました。また、気さくに話ができるエンジニア仲間は一気に増え、次の週末には私の趣味であるボルダリングに一緒に行くという交流もできました。</p>

<p>　開発をさらに盛り上げていきたい場合には、とてもお勧めです。</p>]]>
        
    </content>
</entry>

<entry>
    <title>MySQLのサブクエリは危険？――深まる謎</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/garyotensei/2012/07/mysql-465d.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2012:/garyotensei//73.4030</id>

    <published>2012-07-13T03:48:07Z</published>
    <updated>2016-04-28T00:43:33Z</updated>

    <summary>　最近、MySQLに振り回されていました。 　私もエンジニアですから、普段はこう...</summary>
    <author>
        <name>Sansan株式会社　アーキテクト　藤倉 成太</name>
        
    </author>
    
        <category term="スキル" />
    
        <category term="技術動向" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/garyotensei/">
        <![CDATA[<p>　最近、MySQLに振り回されていました。</p>

<p>　私もエンジニアですから、普段はこういうこともしているんですよということで、今回はMySQLの技術的な話題を書いてみたいと思います。</p>

<p>　初めに、強調しておきます。</p>

<blockquote>
<p><span style="font-size: 1.2em;">MySQLでネストするクエリ（サブクエリ）は<strong>絶対に</strong>使ってはいけません。
</span></p></blockquote>

<p>　このことを甘くみると、私のように振り回されてしまいます。世の中のエンジニアの方々には、声を大にしてお伝えしたい。レアケースの話ではなく、MySQLを使う場合の大前提として捉えてもよいほどです。</p>

<p>　ちなみに、なぜこのような動作になるのかはまだ全然分かっていません。追って調べていこうと思っているので、分かり次第コラムの中でも書けるかもしれませんが、何かご存じの方はぜひコメントをください。</p>

<p>◆ 急に遅くなるクエリ</p>

<p>　アプリケーションの開発や運用をしていて、RDBMSへのクエリが急に遅くなった、という問題を経験をしたことがない人はいないのではないでしょうか。私もこれまでに何度も経験をしてきていますが、最近またもやこの問題に遭遇してしまいました。</p>

<p>　ただし、今回がこれまでと違って難航を極めたのは、実行計画そのものは大きくは変わっていないということです。ORACLEやPostgreSQLであれば、時間の経過と共にデータの分散具合が変わったりして統計情報に変化が生じ、同じクエリでも実行計画が影響を受けて速度が遅くなったりすることがあります。この場合にはExplain Analyze（Postgres）やEXPLAIN PLAN FOR（ORACLE）を使って実行計画を確認して、クエリのどの部分の実行に時間がかかっているのかという謎を解き明かしていきます。</p>

<p>　私がORACLEやPostgreSQLに比べて、MySQLに慣れていないということが多分に影響しているのですが、今回も同じような方法で取り掛かろうにもなかなか解決策（回避策？）にたどりつけなかったのです。</p>

<p>◆ MySQLのサブクエリ</p>

<p>　MySQLがサブクエリの実行に弱い（期待に反して実行に時間がかかることがある）というのは、よく知られた話です。これについて若干おさらいをしておきましょう。MySQLがクエリをどのように判定したかを確認するためには、EXPLAINやEXPLAIN EXTENDEDを使って確認します。</p>

<pre>&gt;mysql&gt; EXPLAIN EXTENDED<br />&nbsp; &nbsp; -&gt; SELECT * FROM (<br />&nbsp; &nbsp; -&gt;&nbsp; &nbsp;SELECT lock_time FROM mysql.slow_log<br />&nbsp; &nbsp; -&gt; ) t\G<br />*************************** 1. row ***************************<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; id: 1<br />&nbsp; select_type: PRIMARY<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; table: &lt;derived2&gt;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;type: ALL<br />possible_keys: NULL<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; key: NULL<br />&nbsp; &nbsp;&nbsp; &nbsp;key_len: NULL<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ref: NULL<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;rows: 43665<br />&nbsp; &nbsp;&nbsp; filtered: 100.00<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; Extra:<br />*************************** 2. row ***************************<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; id: 2<br />&nbsp; select_type: DERIVED<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; table: slow_log<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;type: ALL<br />possible_keys: NULL<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; key: NULL<br />&nbsp; &nbsp;&nbsp; &nbsp;key_len: NULL<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ref: NULL<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;rows: 43665<br />&nbsp; &nbsp;&nbsp; filtered: 0.00<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; Extra:<br />2 rows in set, 1 warning (1.05 sec)&gt;</pre>

<p>　上の例では、MySQLサーバに対して発行されるクエリのうち、実行に指定時間以上必要となったクエリを記録するログテーブルに対して検索を実行しています。このテーブルにログを出力させるためには、以下のように設定します。この例では実行に3秒以上かかったクエリをmysql.slow_logというテーブルに出力するように設定しています。</p>

<p>
slow_query_log=1<br />
log_query_time=3<br />
log_output=TABLE
</p>

<p>
　これは極めてシンプルな例ですが、クエリが複雑になればなるほど、この結果からいろいろなことを読み取ってクエリが遅くなる原因を探っていかなければなりません。
</p>

<p>　EXPLAINの結果でselect_typeで表示されるのが、MySQLがそのテーブルの捜査をどのように行うと判断したか（SELECTの種類）ということです。この例では PRIMARY と DERIVED となっていますが、これがDEPENDENT SUBQUERYであると、外側のクエリに依存するので、外側のSELECTの結果行数だけサブクエリを実行することになります。</p>

<p>　オプティマイザによって書き換えられる（最適化された）クエリが、元のクエリの意に反して必要のない結合をしてしまっていたり（SUBQUERYやDERIVEDになるべきサブクエリがDEPENDENT SUBQUERYとして解釈されてしまう）することもあるようです。本来必要のない回数だけテーブルやインデックスを捜査することになるわけすから、こうなってしまうと速度に影響を与えることになり、MySQLがサブクエリに弱いといわれたりします。</p>

<p>　しかし、今回の問題はこれに起因するようなものではありませんでした。</p>

<p>◆ サブクエリにするだけで遅いのはなぜ？</p>

<p>　先の例ではmysql.slow_logテーブルから全件のlock_timeの値を取ってくるという単純なクエリを意味もなくサブクエリにして実行しています。この実行には1.05秒かかったようです。さて、このクエリからまったく無意味な外側のクエリを削除します。</p>

<pre><p>mysql&gt; EXPLAIN EXTENDED<br />&nbsp; &nbsp; -&gt; SELECT lock_time FROM mysql.slow_log\G<br />*************************** 1. row ***************************<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; id: 1<br />&nbsp; select_type: SIMPLE<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; table: slow_log<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;type: ALL<br />possible_keys: NULL<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; key: NULL<br />&nbsp; &nbsp;&nbsp; &nbsp;key_len: NULL<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ref: NULL<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;rows: 1<br />&nbsp; &nbsp;&nbsp; filtered: 100.00<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; Extra:<br />1 row in set, 1 warning (0.01 sec)
</p></pre>

<p>　あら不思議。0.01秒で完了しました。</p>

<p>　これはどういう仕組みで起こるのでしょう。この例ではEXPLAINの結果を出していますが、これは普通のクエリにするとフェッチにものすごく時間がかかるのが嫌だからです。EXPLAINではないSELECTにしても結果に大きな差はありません。</p>

<p>　私が解決しなければならなかったクエリも、プログラムの作り上無駄だと知りつつ、仕方ないと思っていたサブクリの部分をなくすようにしただけで、実行時間が100分の1程度になりました。</p>

<p>　今回この問題を調べていて、サブクエリをなくすだけで実行時間が短くなるということに気付いたのは、正直なところ偶然でした。高速化したいクエリの一部分をEXPLAINで確認しては早くなりそうなところにあたりをつけて修正する、という作業を繰り返しました。修正しては全体で実行してみて変化があるかどうかを確認して、効果がなければまた元のクエリに戻って別の部分をEXPLAINで確認します。それを行ったり来たりしていたのですが、あるときふと、どうも意味が分からない変化があることに気付きました。</p>

<p>　そこで思いつきでサブクエリだけを削除して、外側に付けていた条件句を内側のクエリに足して実行してみるとなんと激速。サブクエリの構造があまりにも単純だったので、そこを変更すると何かが変わるという発想がありませんでした。</p>

<p>◆ サブクエリは使わない</p>

<p>　実際の開発においては、サブクエリを本当に一回も使わずに作るというのは難しいかもしれません。しかし、サブクエリを実行するというのは、このような影響があるのだと意識した上で判断をしていきたいものです。</p>

<p>　皆さんもお気を付けください。</p>]]>
        
    </content>
</entry>

<entry>
    <title>回顧 － エージェント指向</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/garyotensei/2012/06/post-d155.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2012:/garyotensei//73.4029</id>

    <published>2012-06-29T05:28:37Z</published>
    <updated>2016-04-28T00:43:33Z</updated>

    <summary>一足お先に。「プログラミング言語Factor」  33 engineers&apos; b...</summary>
    <author>
        <name>Sansan株式会社　アーキテクト　藤倉 成太</name>
        
    </author>
    
        <category term="技術動向" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/garyotensei/">
        <![CDATA[<p><a href="http://www.33i.co.jp/blog/nakamori/2012/120620.html">一足お先に。</a><a href="http://www.33i.co.jp/blog/nakamori/2012/120620.html">「プログラミング言語Factor」</a> </p>

<p><a href="http://www.33i.co.jp/blog/geeks/2012/120621.html">33 engineers' blog 「Factor を試してみた」</a></p>

<p>　当社のエンジニアが綴るブログです。</p>

<p>　最近の記事を読んで、自分が昔どんなことに興味を持っていたかなと考えました。今回はその時に思い出した「エージェント指向」についてです。</p>

<p>◆ エージェント指向

</p>

<p>　皆さんは「エージェント指向」という言葉を聞いたことはありますか？</p>

<p>　今から10年以上前の1998年くらいの一時期に少し流行ったキーワードだったと思います。要約すると、オブジェクト指向におけるオブジェクトがすべて受動的に刺激を受けて動作する（メソッドが呼ばれたら処理を開始する）のに対して、能動的に動作を起こすのがエージェントです。エージェント指向とは、そのエージェントを中心にして問題を解決するためのプログラミングパラダイムです。</p>

<p>　なぜ1998年頃という具体的な数字を挙げたかというと、私が社会人になる一年前、大学4年生の頃に出会ったということを覚えているからです。当時この考え方に出会った私は「オブジェクト指向の次には必ずエージェント指向が注目されるはずだ」と興奮しました。</p>

<p>◆ エージェント指向言語 バージョン 0.1</p>

<p>　おそらく当時には（今でも？）研究機関や大学などから発信されたエージェント指向を実現するための言語系はあったのではないかと思うのですが、よく知りません。そして私は当時少しだけ勉強していた Java でエージェント指向を実現するための言語拡張を考えたのです。</p>

<p>　この拡張では、幾つかの考え方を追加するためのキーワードと記法を定義しました。拡張記法で書かれたコードを Java のコードに書き換えるコンパイラ（プリプロセッサ）と、いくつかのライブラリで構成されています。</p>

<p>　自宅に過去のコードがあるかを確認しましたが、残念ながら残っていませんでした。当時は CVSDude もなければGitHubもない時代です。ソースコードはローカルでしか管理しておらず、あれから数台のマシンを乗り換えているので、もう跡形もありません。ですからここに書くのはすべて記憶を頼りにしています。</p>



<p><strong>agent キーワードの追加</strong></p>

<p>　Javaにおける class キーワードに加えて agent キーワードを追加しました。agent は以下に説明する auto メソッドや auto 属性、特殊なメソッドである die を持つことができます。また、agent は agent を継承することもできます。</p>

<p>　agent はプリプロセッサによって runnable インターフェイスを実装したクラスになり、自動生成されたコードの中で Thread に渡されるだけです。</p>

<p><strong>auto メソッド</strong></p>

<p><strong>&nbsp;</strong>agent は能動的に動作しなければなりません。その動作を記述するために、メソッドの修飾子として auto というキーワードを追加しました。auto としてマークされたメソッドは他のオブジェクトから呼び出されるのではなく、自分自身で動作を開始します。</p>

<p>　auto メソッドは実行時には設定した間隔で繰り返し Thread 内で実行されるだけです。自分自身が動作するべきタイミングかどうかは auto メソッド内で判定しなければならないという、非常に単純なものでした。</p>

<p><strong>auto 属性</strong></p>

<p><strong>&nbsp;</strong>agent が単純に Thread によって処理されるだけではつまらないので、属性も能動的に変更されるようにしました。これがないと agent の属性は全て agent 自身が管理しなければならないので。auto 属性は、後続のブラケット内で更新ロジックを記述できます。</p>

<p><strong>die メソッド</strong></p>

<p><strong>&nbsp;</strong>要するに agent の finalizer です。agent の生存期間がどのように終了するのかを記述します。</p>

<p>◆ エージェント指向言語 バージョン 0.2</p>

<p>　会社に入社した私は、当時商用のCORBA（Common Object Request Broker Architecture）を扱う部署に配属されました。入社前にはまったくCORBAのことを知らなかったのですが、これを知った時の感動は今でも忘れません。</p>

<p>　CORBAとは、定義したオブジェクトをローカル呼び出しと同じ記述でリモートでも記述できるといったもので、そのオブジェクトがローカル（同一アドレス空間）にあればローカル呼び出しで、リモート（同一ホストでも別プロセスならリモートホストと同じ）に存在していればミドルウェアが勝手にリモート呼び出しを行なってくれるというものです。OMG (Object Management Group) が標準仕様を策定していて、世の中には商用・オープンソース含めていくつかの実装がありました。</p>

<p>　仕事で覚えたCORBAの技術を使ってみたくて、自分のエージェント指向言語拡張に取り入れました。agent は要するにリモート呼び出しも可能になるというものです。</p>

<p>◆ エージェント指向は今</p>

<p>　あれから十数年が経ちましたが、私の想像や期待とは異なり、一般の開発においてエージェント指向が新たなパラダイムとして浸透することは今のところないようです。考えるに、エージェント指向がよりうまく解決する問題というものは存在しにくいというのが理由でしょうか。</p>

<p>　自律的に強調して問題を解決する。これだけ聞くと非常に面白そうですが、システムはかなり複雑になりますし、不具合でもあろうものなら、タイミングによって発生するような種類のものでは原因の究明は非常に困難です。</p>

<p>　やはり技術には、それが解決する問題というのが先になければならないということなのかもしれません。</p>

<p>　独自エージェント指向言語は日の目を見ることもなく、成果を残すことなくなくなってしまいましたが、仕様を考えたり実装しているときにはそれなりに勉強にもなりました。こういった行動が今のエンジニアとしての私の礎になっているのかもしれません。</p>

<p>◆ 回顧録ですから</p>

<p>　今回のコラムは、どうやって締めてよいのかまったく分かりません。ふと思い出した若かりし頃の興味対象がとても懐かしくなったので、書いてみただけなのです。</p>]]>
        
    </content>
</entry>

<entry>
    <title>軸</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/garyotensei/2012/06/post-f1a8.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2012:/garyotensei//73.4028</id>

    <published>2012-06-22T04:39:03Z</published>
    <updated>2016-04-28T00:43:33Z</updated>

    <summary>　前回の記事を書いた後に、「具体的にどういうことで頭を殴られたの？」と何人かの方...</summary>
    <author>
        <name>Sansan株式会社　アーキテクト　藤倉 成太</name>
        
    </author>
    
        <category term="キャリア" />
    
        <category term="ワークスタイル" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/garyotensei/">
        <![CDATA[<p>　<a href="http://el.jibun.atmarkit.co.jp/garyotensei/2012/06/post-7ec2.html">前回の記事</a>を書いた後に、「具体的にどういうことで頭を殴られたの？」と何人かの方に聞かれたので、今回はそのあたりのことについて、自分が日々考えていることを書いてみたいと思います。</p>

<p>◆ エンジニアとしての矜持</p>

<p>　受託開発が中心の会社にある技術開発の部署で、いろいろな技術を先行的に調査するような仕事をしていると、難易度の高い技術の要諦をいかに早くつかむかが重要だと思えてきます。これはこれで、きっと正しかったのだろうと思います。しかし、その仕事を続けた結果として、いつしかその技術が何のためにあるのかと考えること忘れてしまっていたような気がします。</p>

<p>　平易な技術について考えることは誰でもできる。だったら他の誰もが考えられないような難易度の高い技術について考えよう。それが自分がここで仕事をしている意義だと。そうやって、技術というものに対する比重がどんどん大きくなっていった気がします。</p>

<p>◆ 価値

</p>

<p>　転職して自社のサービスを開発する立場になると、期待されることは一変して、どんな実装をしても、どんな技術を使っていたとしても、ユーザーの価値さえ向上するなら何でもよい環境になりました。極端な話として、どうしようもない実装をしても評価され、イケてる実装をしても評価されないということが起こりうるわけです。そこまでの例はさすがにありませんが、似たようなことは実際にあって、エンジニアとしては簡単に納得できる話ではありませんでした。そりゃそうです。何のために日々膨大な時間とお金を使って学んでいるのかという話です。イケてる実装をするためではないのかと。</p>

<p>　一方で、ユーザー価値の向上こそが唯一にして最大の評価点だというのも、冷静に考えればそのとおりです。我々エンジニアはそのために存在しているわけですから。このこと自体は、受託開発だろうと自社サービスの開発だろうと変わらないはずです。ここがまさに殴られポイントです。頭では分かっているつもりでも、どうしても条件反射というか、これまで培ってきて自分の根底に流れている価値観からそう思えない。なぜだろう、何が間違っているのだろうと考える日々が始まります。</p>

<p>　実際に自分がこれまでに経験した事例をご紹介するのはややはばられるので、あくまでも架空の事例としますが、より具体的な作り話をしてみたいと思います。</p>

<p>◆ 知恵で解決するか、お金で解決するか</p>

<p>　例えば、あるところにデータ量の増加に伴って性能が出せないクエリがあるとします。このクエリは複雑で、DBMS の設定などを含めてチューニングするのには多くの時間が必要だけれども、早くできるのは、エンジニアの勘から分かるという経験はあるでしょう。</p>

<p>　受託開発であれば、プロジェクトには期日や予算などの制約があるので、お客様との調整によってある種の解決を図る場合もあるかと思います。しかし、我々のように自社でサービスを運営していると、プロジェクトの期間や予算というのはあまり強い制約としては働きません。</p>

<p>　このとき、クエリのチューニングにかかる時間がハードウェアの調達時間よりも長いなら、まずは追加のハードウェアで問題を解決することを優先的に考えなければなりません。その方が早くお客様に価値を提供できる（毀損されていた価値を回復できる）からです。</p>

<p>　追加ハードウェアの費用と人件費という観点もありますが、我々ベンチャー企業にとって人というリソースは実際の人件費以上に重要な価値を持っていますから、多少高くてもハードウェアで解決できるなら、その分の作業時間を他にもっと重要な機能を開発する方に向けたいのです。</p>

<p>　このようなケースがあったとしたら、私は（貧乏性だからなのか）どうしても自分の知恵でもって問題を解決したいと思います。それは、ソフトウェアのエンジニアとして自分たちが作ったものに責任を持ちたいという感情もありますし、ハードウェアで解決したとしてもその問題は潜在的にも残り続けるので、それが将来どんな重荷となって自分たちに降り注ぐかも分からないとも思うからです。</p>

<p>　しかし、このケースでいえば、まず真っ先にハードウェアで解決する方法を検討するべきでしょう。もし本当にその問題が将来何らかの大きな課題に発展する可能性があるならば、それは別の問題として捉えて、ハードウェアによってサービス価値を向上させた後に考えるべきなのです。</p>

<p>◆ 新しいテクノロジの導入</p>

<p>　フレームワークのバージョンアップ等でも同様のことが起こりえます。新しいフレームワークには魅力的な新機能が実装されていて、開発がさらに面白くなりそうだと。当然多くの不具合も改修されているわけで、開発としてはバージョンを上げない理由はないわけです。</p>

<p>　ただし、その行為がお客様価値の向上にどれだけつながるのかということも真正面から考えなければなりません。新しいテクノロジやバージョンには学習コストがかかり、見えないリスクがあります。さらに移行するためには多かれ少なかれ作業が必要です。</p>

<p>　それらのコストを払ってでも上げる必要があるのかと。それでも機能面で何も変えられなければ、それはユーザーにとっては本当にどうでもいいことなのです。新しいバージョンで解決される不具合に悩まされているということがなければという前提ですが。</p>

<p>◆ 軸の話</p>

<p>　ここまで書くと、エンジニアとして面白くもなんともない実装でサービスを作っていればいいのかと思われるかもしれません。それが大人の考え方だと。一見すると、ここで挙げた事例からはそう見えます。</p>

<p>　しかし、私がお伝えしたいのは、そういうことではありません。やはり、遅いクエリをよいハードウェアで早く実行できても、それはごまかしでしかありませんし、新しいバージョンには世界中のエンジニア達の知恵と経験が、新機能という形で搭載されているのです。先述のケースで違和感を感じることは誤りではありません。何が言いたいかというと、自分の矜持とか、面白そうだとか、そういうことではなく、きちんと顧客価値という視点から技術をとらえましょうということです。</p>

<p>　エンジニアが求めるものの多くは間違っていないと思います。が、それらは「世の中に提供する価値という軸で説明されなければならない」と思うのです。常にそれを頭の中心に据えておくと、技術の動向のみならず、組織における技術選択の背景も理解することができるようになってきます。</p>

<p>　先の例で言えば、「この問題を最も効果的に解決するには、ハードウェアを購入するべきか、クエリのチューニングを行うべきか」と考えます。そして、ハードウェアを購入することを選択したならば、今度は問題となったクエリを将来の課題にしないためには今何をするべきかを検討します。フレームワークのバージョンアップがあったならば、その新しいバージョンを使ってどうやって顧客価値を向上させようかと考えます。この機能を使えば、今よりもこれだけ早く開発できる（漠然とではなく具体的に）とか、これだけ品質を上げられるかなどを発想するのです。</p>

<p>◆ 技術ってすばらしい</p>

<p>　我々エンジニアは、世界を変える力を持っています。そのことを強く意識して、「自分は今どれだけ世界に貢献しているのだろうか」と考えるようにしてみることをお勧めします。世界に貢献するという意志を持って技術に接すると、それが純粋に面白いかとかイケてるかどうかではなく、その技術が持つ本当の価値が見えてきます。そうすると、その技術を採用するかどうかを進言するようなシーンでも、なぜ採用するべきなのかということを明確に説明できるようになります。その結果、どんどん自分の周りに面白い技術が集まってくるはずです。要するに、面白い技術が面白いのではなく、価値のある技術が面白いのです。</p>

<p>　もしこのコラムを読んでいただいている方の中に、ベンチャーでやってみたいと思っている人がいれば、ぜひ飛び込んでみてください。私のようにハンマーで頭を何度も何度も殴られるかもしれませんが、その苦痛を補って余りある成長があります。そして、世の中に貢献するための技術を身に付けて、1人でも多くの方に真に楽しいエンジニアライフを送っていただきたいと思います。</p>

<p></p>

<p>&nbsp;</p>]]>
        
    </content>
</entry>

<entry>
    <title>“ハンマーで頭を3回殴られる”ような衝撃――ベンチャーへの転職</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/garyotensei/2012/06/post-7ec2.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2012:/garyotensei//73.4027</id>

    <published>2012-06-15T03:05:26Z</published>
    <updated>2016-04-28T00:43:33Z</updated>

    <summary>　数年前にベンチャー企業の三三に転職しました。よく、いろいろなところで、「SI ...</summary>
    <author>
        <name>Sansan株式会社　アーキテクト　藤倉 成太</name>
        
    </author>
    
        <category term="キャリア" />
    
        <category term="転職活動" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/garyotensei/">
        <![CDATA[<p>　数年前にベンチャー企業の三三に転職しました。よく、いろいろなところで、「SI から Web 系ベンチャーに転職したいんだけど……」という話を聞くので、その辺りで私が感じたことや考えたところを紹介してみたいと思います。転職を考える方々の参考になれば。</p>

<p><strong>◆転職は前向きに</strong></p>

<p>　前職に不満があったわけではなく、むしろ大好きな会社でした。何もできない新人から育ててくれて、とても面白い仕事をさせてもらい、アメリカでの経験も積ませてくれた。10年努めてこれから恩返しをしていかなければならないということも重々分かっていました。が、それでもエンジニアとして違う世界を見てみたい、もっと自分を追い込みたい、という思いから転職を決めました。</p>

<p>　転職の意志を告げるときにはかなり心が痛みました。それでも、転職を応援してくれた方々に本当に感謝です。</p>

<p>　やっぱり転職は後ろ向きな動機でするものではないです。どんな世界にも完全にハッピーな会社などあるわけないので。仕事としてやる以上は大変なこともあるし、納得できないこともある。そんなことを理由にしていたら永久に職を転々とすることになるでしょう。転職とは今の環境から脱出するためのものではなく、新天地に挑むためのものです。</p>

<p>　後ろ向きな人はきっと、どこにも採用されません。</p>

<p dir="ltr" style="margin-right: 0px;"><strong>◆<span style="color: #000000;">ハンマーで頭を3回殴られる</span></strong></p>

<p>　この言葉、すごく気に入っているんです。</p>

<p>　転職した先は三三という変わった名前で、Link Knowledge や Eight という名刺を起点としたサービスを提供しているベンチャー企業です。当時は社員数も随分少なく、事業の将来性がどの程度あるかなど見えない（と当時の私には個人的に思えたんです）小さな会社でした。しかし、名刺だけに全戦力を集中して、日本から世界に出ていくんだと熱く語ってくる人たちに惹かれて入社を決めました。</p>

<p>　本当にハンマーで殴られるわけではないのですが、そのくらいの衝撃をもらったのは事実です。この表現は入社当時に言われた言葉で、「これまでSI企業などで頑張ってきた人がWebサービスの世界に入ってくるなら、価値観やルールの違いを修正するために、少なくてもハンマーで3回は頭を殴られるくらいの衝撃を受けないと適合できないよ」と。まさにそのとおりでした。今までに何度も殴られてます。</p>

<p>　それがいいんです。それを求めて転職したんですから。これまで培ってきたものが適用できないなんて生やさしいものではありません。完全否定です。でもそれを乗り越えたところに違う景色が広がっているんだろうなと。今日もハンマーで殴られます。というか、たぶん自分で殴ってます。自己否定。そして殴られたと思う度に、少しは成長できるんではないだろうかと、明日の自分に期待してほくそ笑みます。</p>

<p>　これは少々大げさかもしれません。「自分はそんなことなかったよー」という方もいるでしょう。私が不器用なだけかもしれないですし。でもやっぱりベンチャーで働くというのは必死です。必死に仕事を楽しむんです。そんな風に仕事を楽しめる人とはやっぱり一緒に働きたいと思いますね。</p>

<p><strong>◆スキルではなく成果を</strong></p>

<p>　この世界にいると、日々新しい技術が生まれてきて、読まなきゃいけない本が常に何冊も積まれて、とにかく技術を習得しなければ自分に価値がないと思いますね。それはそうなんだけれども、でもきっとそうではないです。エンジニアなら、とにかく成果を出す。そのために、技術が必要なら学ぶ。こういう順番で考えるべきです。少しでも早くコードを完成させる。品質を上げる。メンテナンス性の高いコードを書く。これらを実現するために使える技術やテクニックはたくさんあります。ですけど、それらを学んだからといってすぐにできるわけでもないでしょう。だったら学ぶ前にまずはやれと。そして、さらに向上させるために学んでいくわけです。</p>

<p>　よく「どのくらいのスキルが必要ですか？」とか「こういうプロジェクトをやってきていますが大丈夫ですか？」と聞かれます。スキルとか経験とかは当然あったらあっただけいいです。大歓迎。でも、もっと大切なのは、成果を出す気持ちが強いこと。</p>

<p><strong>◆仲間が熱い</strong></p>

<p>　特に三三は。でもきっとベンチャーは大抵そうなんだろうと思います。</p>

<p>　だって、みんな人生賭けてるんですもの。自分の家族や将来を賭けてこの会社でやってやろうと思ってるんです。そりゃ熱くないわけがない。だから手が抜けない。そこがいいじゃないですか。</p>

<p>　ここまで言ってしまうと、かなり大変そうな感じがしますけど、実際そうでもないです。別に死ぬほど長時間働くわけではないですし、それはそれで自己管理します。長い時間働くわけではないですけど、毎日の一挙手一投足に集中します。</p>

<p><strong>◆最終的には技術好き</strong></p>

<p>　最後は、ここに行き着きますね。やはり。技術が好きで好きでたまらない、コードを書くのが大好きだって人とは一緒に働きたい。</p>

<p>　コミュニケーションが得意だったり管理が得意だったりするのもとてもいいです。組織内のコミュニケーションや管理に大きな課題があるならば、そういうことがものすごくうまい人に来て欲しくなることもあるかもしれません。でも、大抵そんなことないです。「技術はあまり得意でないですけど……」という人には開発チームの一員としてコミットしてもらうことは難しいと思ってしまいます。純粋にモノづくりが好きだということをまっすぐにアピールした方がいいです。</p>]]>
        
    </content>
</entry>

</feed>
