学歴と雇用

(この記事においては主にコンピューター技術の専門職に関して書いています。筆者がそれ以外の実情を知らないからです。)

AppleやGoogleで働くのに大学卒の学歴はいらないという記事が出ているのですが、これ、実は、米国では技術系業界を中心に新しい話ではなかったりします。最近の技術系求人でよく見られるのは「Bachelor’s degree or equivalent experience」(学士号、もしくはそれに相当する経験)といったような表現です。これが何を意味するかというと、大学を卒業し、学士号を保持しているか、もしくは、それに相応する社会経験(少なくとも一定年の実務経験)を保持しているか、という意味になります。つまり、大学を卒業していなくとも実務経験があれば採用します、といっているということになります。こういった求人においては例え大学を卒業していなくとも、必要とされる能力を持ち合わせていることを証明することができれば、雇用される、ということになります。

そもそも、少なくとも米国においては求人要件というのはある意味「欲しいものリスト」に近いものであり、実際、学歴に限らず、求人に応じる候補者というのは必ずしも完全に条件を満たしているわけではなく、むしろ満たしていないケースの方が普通です。なので、学歴に関しても例えそれが「〜equivelent experience」でなかったとしても応募する人は一定数出てきますし、採用される人も相当数いると思われます。(例えば、大学出てないけどGoogleに採用された〜、という話は昔から時々聞こえてくる話です。)

全般的に学歴が気にされないか、ということではなく、会社によってはこれを重視しているところもありますので、求人システムの受理段階で落としたりするところもありますし、また業界的に規制が強い分野(法務や医療、また政府系の入札が多い分野)やアカデミアに属する機関、つまり大学などがその例です。なので、医師、弁護士や教授になろうとするような人であれば、恐らく大学の卒業が求められてきます。尚、後者のアカデミアに関しては最近は必ずしも学歴に固執しているわけではないようで、MITメディアラボの所長である伊藤穰一氏などのように大学中退でも登用された、というケースもないわけではありません。ただ、特殊なケースであると言えます。(尚、大学を卒業してない方で教授やそれに相応する職に就かれている、もしいらっしゃいましたら是非お話をお聞きしたいです。)

尚、なぜ学歴が重視されない場合があるのかですが、これは米国の雇用システムに理由があります。まず、米国においては大卒を雇用し、育てる、という発想がありません。基本的には即戦力が求められます。なので、例え大学を出ていたとしても即戦力とみなされない場合は採用されない場合もあるわけです。なので、大学に在学している人でもインターンやアルバイトなどを行い、実務経験をつけます。これは技術系では顕著であり、大学内で学べる事項と現実的に求められる能力に大きな乖離がみられるため、大学で例えば計算機科学を専攻していたとしてもそれが即戦力とみなされるとは限らないわけです。これは逆もまた然りで、大学を卒業していなくとも、雇用側が即戦力とみなせば採用される確率が上がってきます。つまり、重要なのは「どこを出たか」ではなく、「何ができるか」という点になります。

そもそも、雇用における学歴は、大学卒業直後の人が雇用されるのを目指す場合、ある程度、底上げすることができますが、卒業後2年から3年ぐらいで劣化していき、10年も経つと、それよりもそれまでの職歴や能力が中心となり、ほとんど留意されないか、されてもかなり副次的な効果しか生まなくなってきます。なので、大学を中退した人、また、そもそも行っていない人にとっては最初の2年から3年、ないし5年をどう乗り切るか、ということが鍵になるかと思います。

詳しいことはキャリアーアドバイザーなどに相談して欲しいのですが、このような場合、いくつかの選択肢があると思います。

一番シンプルなパターンは大学に入学するか、中退の場合は、入り直して卒業するというパターンです。そもそもこれができる人はもともと大学に入っているでしょうし、中退もしていないと思うので、この記事ではこのパターンの説明は省きます。学費自体が高価になりすぎていることも有り、金銭的な面からもこのパターンを採ることができない人も多くいるのではないかと思います。この方法の利点は在学中にインターンなど、経験を積むチャンスも多いということになります。

次に考えうる手段は零細企業やスタートアップに入ることです。雇用安定性やリスクという観点ではあまり良好とは言えないのですが、これらのケースではいろいろなこなさないといけない分、ある意味、経験不相応な仕事にも関わるチャンスが出てきます。(例えばプログラマとして雇用されていなくとも、プログラマとしての適正を発揮する、といったことが大きな企業に比べると容易にできます。)尚、当然ながらこの方式はそういうチャンスがないと意味を持ちませんし、また、そういった企業やスタートアップが身近に存在しているとは限りませんので、かなりアンテナを広げる必要があるかもしれません。また、そういった能力を発揮するためには学習が必要になってきます。技術者は生涯に渡った勉強が必要になる職種ですので、これが苦痛な人は多分、向いていないのでしょうけど……。

もう一つ検討してほしいのはそれなりに組織構成がきちんとしていて、名の通っている非営利団体に無償ボランティアとして参加することです。特に目指している分野のイベントか、もしくは業務改善の一環としてその分野が活かせるようなボランティアを探してみて下さい。これは雇用状態に関わらずにお勧めしたいです。実務経験がつく上、特に広い背景の人がボランティアとして参加しているような団体である場合、人脈も広がります。また、通常の業務では得られないタイプの能力も得られることになります。

まとめたいのは、一般的に言って、大学の卒業証書はあって困るものではないけど、最近はそれを重視しないケースも増えてきている、ということです。技術系の業界においては技術の進歩も早く、勉学の場は必ずしも大学という組織の中ではなくなってきています。そういった中で今後生き残っていくためには、どこの大学を卒業したか、ということではなく、その進歩を学習し、仕事に適応できる覚悟があるか、ということであるのではないかと思います。

ISRCの自己発行をできるようにしてみた

以前ASCAPに登録しましたが、久しぶりに楽曲を登録しようとしてみると、ISRCなる、前にはなかった項目が。日本語では国際標準レコーディングコードというようです。必須項目ではないので空でもいいのですが、そういえば、Google Play Musicにもそういう項目があったな、と。音楽に埋め込まれて録音を識別するためのコードのようです。前に、ASCAPに楽曲を登録するとISWC(国際標準音楽作品コード)が割り当てられていましたが、こちらは楽曲自体を識別するのに対し、ISRCは録音物を識別するコードということ。つまりリミックスなどは新しいコードになるようです。ISWCはASCAPが代理申請(というか、ASCAPで割り当てて、ISWCの団体に送っているようですが)をしてくれますが、ISRCは自分で入手する必要があるとのこと。

これも登録してみたくなったので調べてみました。この番号自体は、実は配信業者が無料で付与してくれる場合もあるみたいですが、自分の場合は、Google Play Musicしかやってなく、かつ、Googleはこれを付与してくれないので、どうやったらこの番号を入手できるのだろう、と調べてみると、再販業者を通すか、もしくは自分が自己的に割り当てる申請をすることでできるようです。ネットで売っている会社は1コードあたり10セントから2ドル程度と結構開きがあるようです。

自己発行するのにはどのようなプロセスになるか、調べてみました。すると、国によって対応機関があって、そこからレジストラ登録を受けた上で、発行できるようになるようです。ちなみに上記の再販業者も元は特殊なレジストラ登録を受けた上で発行できるようにしているみたいです。(違いは他人が録音権を持つ作品に対してコードを発行できるか、という点のようです。)

この関係をまとめると以下のような感じ。

それで、自己発行するのにはレジストラ割り当てを受ければいいとのことなので、米国はRIAAが窓口のようなので、調べてみました。米国の場合はusisrc.orgで登録ができるということです。登録プロセスを進めていくと、ISRCを付与したいものに対する権利を保持しているか、一年間に10万件以上の登録をするか、などいろいろと聞かれます。それに答えると、登録料95ドルを求められます。毎年95ドルかかるのか、と思ってよく見ると登録審査料で、それ以外に特にコストはかからないようです。ちょっと高い感じもしますが、一時金ということで割り当ててもらうことにしました。登録を完了すると1営業日後に連絡する、というメッセージが。

土曜日に登録したので、月曜日までかかるようです。

……と月曜日。朝確認すると確認が届いてました。ログインの方法に関しての案内がありました。夜、その方法でログインをしてみると、確かにコードが表示されています。(国コードがQZ、レジストラコードがCFFの割り当てでした。)さて、コードはどこで発行するのかな、と思ってサイトを見回って見てもない、と、ふと見るとコードは各自ガイドラインに基づいて発行して、自分で管理してね、というようなことが書かれています。つまり、勝手に発行して自分で発行済みのものはデータベース化してください、ということのようです。

ISRCのフォーマットは国コード、レジストラコード、年コード(年の下二桁……2100年以降はどうするんだろう)、5桁の数字(つまり、上記の一年間10万件以上登録するか、という設問はこのためのようです)というようになってて、5桁の数字はどんなものでもいいけど、重複だけはしてはいけない、というルールで、順番に連番で振っていくのをすすめる、とのガイドライン表記がありました。

最初に割り当てたのはPeacefulという曲(もうすぐ公開します)で、コードはこの法則に基づいて、QZCFF1800001ということになります。

ということで、運用上はかなり緩い感じがするISRC割り当ての話でした。

ちなみに登録期間は居住地に基づいてそれぞれの機関に申し込む必要があるそうで、日本では日本レコード協会登録業務を行っているようです。ちなみに日本はルールが違っていて、自己発行には年50曲以上の登録が必要な他、毎年10800円から21600円の事務手数料がかかる(その代わり、直接の再販も行っているようです)ようですので、ご興味のある方はサイトを確認してみてください。

PowerShell Core 6.0

PowerShell Core 6.0がリリースされました。ダウンロードはGitHubより各プラットフォーム用に公開されています。尚、インストールは全く別の場所に行われますので、既存のWindows PowerShellを残したまま行えるどころか、ZIPファイルでも提供されていますので、インストーラーを実行する必要でさえありません。)

PowerShell CoreはWindows PowerShellのオープンソース、クロスプラットフォーム版で、今後はWindows PowerShellの開発は5.1を最後のバージョンとし、メンテナンス程度になり、こちらの方に注力していくようです。

Windows PowerShellは.NET Frameworkベースになっていますが、PowerShell Coreは、.NET Core、正確には.NET Standardベースのものになっています。そのため、.NET Standardに準拠したライブラリなどは読み込める場合もありますが、Active Directoryなど、一部の機能は使用できませんので、そういった場合はWindows PowerShellと平行して使用することになるかと思います。

PowerShell Coreの何がいいのか?

特にLinuxやWindowsなど複数のプラットフォームを使用している場合において、同様の使用感、及び、スクリプト構文でCUIを利用することができます。尚、execなどの呼び出しに失敗し、挙動がおかしくなる場合があるので、Linux上でpwshに対してchshを行うのはおすすめできません。(目立ったところではSSHのスクリプト実行に失敗したり、Dropboxがゾンビ状態になったりします。)

.NET CoreのモジュールをCUIより呼び出すことが可能なので、例えば以下の要な構文が使えます。

(New-Guid).ToString().ToUpper()

この構文では、New-GuidはPowerShellのCmdletを使用していますが、これは[Guid]::NewGuid()とすることもでき、同じ形式の出力になります。

[Guid]::NewGuid().GetType() -eq (New-Guid).GetType()
True

実際はCmdletの実体は.NETのライブラリなので、内部的には同じような構造になっています。

Cmdletは例えば以下のような構成になっています。

using System.Management.Automation;

namespace cmdlettest
{
    [Cmdlet(VerbsCommon.Get, "Hello")]    
    public class TestModule : PSCmdlet
    {
        [Parameter(Position = 1)]
        public string Message { get; set; } = string.Empty;

        protected override void EndProcessing()
        {
            var output = "Hello World";
            if (Message != string.Empty)
                output += ", " + Message;
            WriteObject(output);
            base.EndProcessing();
        }
    }
}

これをコンパイルし、モジュールとして読み込むことで、Get-Helloのコマンドが使えるようになり、コマンドラインのパーシングなども自動で制御してくれます。もちろん一度コンパイルすると依存として読み込んでいる他のライブラリにプラットフォームの要件がない限りはPowerShell Coreを使用することのできる全ての環境で使用できます。

PowerShell Coreをダウンロードしたらまず行うべきこと

WindowsPSModulePathの導入

Windowsで使用している場合、以下のコマンドでWindowsPSModulePathを導入しておくと便利かも知れません。Windows PowerShellにより提供される一部のライブラリを使用できるようになります。

Install-Module WindowsPSModulePath -Force

ユーザーレベルで入れたい場合は以下のようにもできます。

Install-Module WindowsPSModulePath -CurrentUser -Force

その後、これは以下のコマンドで有効にできます。

Add-WindowsPSModulePath

尚、スタートアップファイルは$PROFILEですので、こちらに格納することによりPowerShell起動時に自動的に読み込まれます。

ヘルプファイルの更新

PowerShell Coreでは詳細なヘルプ情報を参照することができます。(UNIX系シェルでいうmanページのようなものです。)

これらのドキュメントは更新する必要があります。それを行うにはUpdate-Helpコマンドを使用します。このコマンドはAdministrator権限(Windows)、root権限(Linux等)で行う必要があります。(尚、Update-Helpが失敗する場合-Forceオプションをつけてやるとうまく行くかも知れません。)

どうしても更新が失敗する場合(UI Culture系の例外が発生する場合)それを無視する設定が必要になります。(日本語のヘルプはないので、英語のロケールを優先指定します。)

 -Force -ErrorAction SilentlyContinue -UICulture en-US, ja-JP

更新を行うと、例えばGet-Help Get-Processなどで参照できる他、Get-Process -?で行うこともできます。

最後に

PowerShell Coreがリリースされたことにより、Windows以外のプラットフォームでもPowerShellの利便性が享受できるようになります。スクリプトはプラットフォームを超えて動作する他、.NET Coreを使用して独自のCmdletを記述することができます。

スクリプト開発環境も整備されており、Visual Studio及び、Visual Studio Codeでスクリプトのデバッグができるようになっています。(Cmdletに関しても上記のように実体は.NETライブラリなので、.NET Core開発環境で開発可能。)

これまで特にWindowsとLinux間など共通のシェルスクリプト的な使い方ができなかったので、この点が便利です。(Windows上でUNIX系シェルを使用するにしても、WSLはほとんど別環境ですし、bashやCygwinなどもOSとしての作法が違うため、不便さがありました。)

NuGet経由で拡張が可能など、.NET Coreの機能が利用できるなど、便利な使い方ができそうです。

気になる歌の歌詞「0hzの恋人」

MOSAIC.WAVの歌で結構好きなのが「ギリギリ科学少女ふぉるしぃ」なのだが、それにカップリングされているのがこの「0hzの恋人」

いい歌なのだが、いつもこの歌詞の一節が気になって素直に聴けないのです。

君のリアクションはまだ 0Hz未満?だけど 私の胸のチャンネルは いつもいつも君を見てる

多分、この歌詞はリアクションが全然ない〜、ということが言いたいのだろうけど、ヘルツというのは振動数を示すわけで、つまり、1Hzだと一秒間に一回の振動があることになる。0Hzだと全く振動していないということで、「0Hz」という表現はまだ良いとする。ただいただけないのが「0Hz未満」という表現。

0Hz未満というのはありえない、というのも例えば、0.5Hzであれば、1Hzと比べると1/2Hzということで、1Hz未満という表現が使える。これを当てはめてで0Hzと比べても1/0Hzには0除算になってできないので、0Hz未満という表現はこの世に存在しない。

0より小さいとなると負数になるが、振動に負数は適用されないので意味がない。敢えて適用するとすると位相が反対の振動になるんだろうけど、その場合、今度は小さくなればなるほど大きくなってくるので0Hz未満〜ということを憂いているこの歌詞は成立しなくなる。

「ギリギリ科学少女ふぉるしぃ」が疑似科学をテーマにしているのでこれもそうなんだろう、と解釈すればそれでいいんだろうけど。

ReSharperが指摘してくれるコードスタイルのあれこれ

ReSharper(と同様のエンジンを内蔵しているRider)が指摘してくれるものにはいろいろな種類のものがあるのですがそのいくつかに関する考察。

Collection Initializerへの置き換え

次のようなコードがあったとします。

var list = new List();
list.Add(new Something() {unit = "One", value = 5});
list.Add(new Something() {unit = "Two", value = 6});

ReShaperは次のような置き換えを提案してきます。

var list = new List
{
    new Something() {unit = "One", value = 5},
    new Something() {unit = "Two", value = 6}
};

これは確かに冗長になりがちなのでシンプルな書き換えにするのにはいい方法。

Foreach文のLINQ式への置き換え

時々出てくるパターンとしてリストの中を辿りつつ内容に対して処理を行うパターン。foreachで辿るようなパターン、例えば次のようなパターンがあったとします。

foreach (var item in list)
{
     if (item.unit == "Two")
        result += item.value;
}

これは以下のように置き換えることを提案してきます。

var result = list.Where(item => item.unit == "Two").Sum(item => item.value);

処理が複雑になると可読性が失われたり、デバッグが複雑になったりすることがあるのでその点は注意です。

メソッドのstatic化

次のようなクラスがあったとします。

internal class Hoge
{
    private int _value;

    public int Foo(int v)
    {
        _value += v;
        return _value;
    }

    public int Bar(int v)
    {
        v -= 1;
        return v;
    }
}

ReSharperはこのうち、public int Bar(int v)をstatic化するように提案してきます。

internal class Hoge
{
    private int _value;

    public int Foo(int v)
    {
        _value += v;
        return _value;
    }

    public static int Bar(int v)
    {
        v -= 1;
        return v;
    }
}

これはインスタンス化を行うとその分、要求されるメモリが増えるので、必要がないものにおいてはVM内で共有したほうがいい、ということですね。

ただ、staticメソッドのインスタンス化はそのメンバを呼び出したタイミングで行われたり、ガーベジコレクションの挙動が普通とは異なってくるはず(というか、スコープから外れない場合は残存し続けるので、長期的に残り続ける挙動を示すはずです)のでその部分では注意が必要です。

JetBrains All Products Pack

最近JetBrainsのAll Products Packを購入したのでいろいろと。

まずはそれぞれのツールに関していろいろと書いてみる。

Rider

まずいちばん使っているのがこのRider。C#のIDEです。現段階で使っているのは.NET Core 2.0の機能を使いたいので、EAP版です。

ちなみにRiderはUnityと組み合わせ使うことも可能です。Linux版のUnity Editorと組み合わせて使用する場合に便利です。

機能面ではVisual StudioResharperを組み合わせたものに近いです。(Windows Formなどのビジュアルエディターはありませんが……。)

尚、Reshaperに関しても上位版であるResharper Ultimateが、All Products Packに含まれています。

プライベートではマルチプラットフォーム開発なので、あまり使う機会はなかったりしますが。(ただし、使う場合Visual Studio Communityでもちゃんと動作します。)

DataGrip

次によく使うのがDataGripです。DataGripはデータベース用のIDEです。

いろいろなデータベースをサポートしていて、SQL文を発行したり、内容を調べたりすることができます。

Gogland

GoglandはGoogleにより開発されている、Go用のIDEです。現在EAPで無料で使用できます。正式版では名前が変わるかも知れないようです。

IntelliJ IDEA Ultimate

IntelliJ IDEA UltimateJavaのIDEです。(正確にはJVMな言語は多くが対応しています。KotlinもJetBrainsが開発していますし、もちろん対応しています。)

尚、IntelliJ IDEA Ultimateにはオープンソース版のIntelliJ IDEA Communityも存在します。これ一本でJavaのアプリ、Androidのアプリなどを開発したりできます。プラグインを通してGoやPythonなどの他の言語も開発することができるようですが、挙動など言語特化のIDEがより言語に特化した動作をするようになっているようです。

個人的にはJavaはあまり使わないので、XSLTの編集などに使ったりする場合が多いです。

PyCharm Professional

PyCharm ProfessionalPythonのIDEです。。こちらもPyCharm Communityというオープンソース版の他、PyCharm Eduという教育目的に特化した特別版も存在します。

PhpStorm

PhpStormPHPのIDEです。あまり新規にPHPは少なくとも自分で書くことは少ないのですが、レガシーなコードはあるのでその保守に使用しています。

CLion

CLionはC/C++のIDEです。Linux上で時々C/C++を扱ったりするので、その場合に活用しているツールです。

RubyMine

RubyMineRubyのIDE。Rubyのコードは現在PHPよりも少ないのであまり出番はないですが……。

MPS

イマイチ使い方がよくわかっていないのが、このMPS。IDEというよりはメタ言語みたいなのですが……。

JetBrainsのAll Products Packは開発機材として個人的に買う場合は、そこまでは高くはないのですが(ビジネスとして買う場合はそれなりに高くなりますが……)それなりの額にはなりますが、今のところはその値打ちはあるように感じています。特に複数の言語を使う必要がある場合同じ使用感で複数の言語を扱えますので。

学校の先生にされたもっとも酷いことは?

Quoraで出ていた設問であなた、または他の人に対して先生がした最も酷い行為は?というものがあり、こちらに答えて見ることにしました。すごく変な年でした。

私の小学校の一年目はおかしな先生によって非常に酷い形になりました。(これは日本での出来事です。)細かいことでネチネチと注意を受け、例えば、鉛筆を一本だけでも忘れたとします。そのことを連絡帳経由で親に連絡されました。給食を食べるのが遅かったとします。そのことに関して連絡帳に書かれ、学校が終わり放課後になるまで給食もそのままで授業を受けることを強要されました。(この話、小学校一年生、6歳の頃であることに留意してください。)少しでもその先生の基準を逸脱するとそのことに関し、連絡帳に書かれ、それは当時最大1日4時間、毎週6日間続きました。(当時は土曜日は休みではありませんでした。)当時、学級の他の生徒は同じような被害をあっていなかったということで、今考えるとその先生によりいじめられていたことになります。

ストレスは蓄積し、やがて一ヶ月ほど宿題をするのを拒否したこともあり、それが発覚して叱られることがなければさらに続いていたかもしれません……もっともどちらにしても連絡帳で他のことについて書かれていたわけなので、あまり差はなかったわけですが。(どうやって一ヶ月も宿題をしていないことを隠し通せたのかはよく覚えていません。)

この先生による異常さは2年目に他の先生になった時に全く問題がなかったことを考えると際立っていたように思います……また3年目に同じ先生に当たり、また一年間、今度は更に長い時間の地獄に戻されたわけですが。(1年生は正午で校時が終わっていましたが、3年生はそれに加え1~2時間長くなっていて、そのため、毎日この先生と6時間顔を合わせることを強要されていたことになります。)その後、3年間は良い先生に当たったので幸い問題はありませんでした。

恐らく近年においては先生によるこのような行為は先生の資質に関して大きな疑問を投げかけることになるのでしょうが、恐らく当時先生はこのような問題を訴えたところで無視される程度の信頼があったのではないかと思います。(また、自分の若さゆえの無知によるものもあると思います、本当に若かったですので。)このため、当時の学校の思い出が最悪だったとは言いませんが、1年目と3年目は非常に辛かったのを覚えています。

結論ですが、先生は お願いですから生徒をいじめるのをやめてください。最悪なので。

実行時間が短いWindowsサービスの問題について

One-shotなサービスで持続時間が短いとWindowsのサービスはエラーが起きたものとして処理する場合があるらしい。

エレガントではない方法としてはThread.Sleep()で少し遅延させてやるようなのがいいかも知れない。(C#の場合。)