Google Nest Hubが日本語の指示をほとんど理解できなくなった(解決済み)

TL;DR

Google Nest Hubが日本語の指示をほとんど理解できなくなったら、言語設定をとりあえず日本語だけにすると解決する模様

設定変更はNest Hubで直接するのではなく(多分そんなことはできない)Googleアシスタントの設定から行う

support.google.com

経緯

妻と子から「最近Google Nest Hubに話しかけても『よく分かりません』『うまく聞き取れませんでした』しか言われない🥺」と相談を受けた。特にアラームの設定などが壊滅的で、天気とアラームでしかNest Hubを使っていない家族からは「使い物にならない。Alexaを復活して欲しい…」と酷評を受けていた。

ちょっと僕が話しかけてみても同様の症状を確認した。不可解なのはディスプレイに「朝7時にアラームを設定」と表示されているので、話しかけたことはカンペキに聞き取っていることは状況から明らかなのだ。にも関わらず『よく分かりません』『うまく聞き取れませんでした』なのである。

結論としては、冒頭に書いた通り言語設定をとりあえず日本語だけにすると解決した。僕の場合もとの設定は英語(米国)、日本語の順番だったのでプライマリ言語を日本語にしても解決するかもしれないが家族は英語を話さないのでこのままにしてある。

f:id:fushiroyama:20210824032655j:plain
日本語のみを残すとうまく認識した

結構しょうもないが、スマートスピーカーがここまでスマートではないことに家族が非常にストレスを受けていたし、ディスプレイに自分が言ったことが表示されているのに『うまく聞き取れませんでした』はかなり体験が悪いので解決方法として載せておく。

Google Nest Hubがネットワーク障害で繋がらなくなった(解決済み)

ものすごく久しぶりのエントリだけど、妻のGoogle Nest Hubが一切動かなくなって困っていたので他にも同様の症状の人がいるかもと思い記録を残しておく。

TL;DR

もしGoogle Nest Hubが突然「ネットワーク障害 (Network Problem)」と表示されて一切何もできなくなっていた場合、家庭内ネットワークのDNS設定を確認して、プロバイダのDNSを利用する設定になっている場合には「8.8.8.8 / 8.8.4.4 / 1.1.1.1」などのパブリックDNSを利用する設定にすると使えるようになるかも知れない。これは奇妙に聞こえるかも知れないが、詳しくは本エントリを読んで欲しい。

経緯

我が家はAmazon Echo Show 5 / 8を使っていたのだが、僕が米国に持って行ってしまったので代わりに誰かにもらったGoogle Nest Hubを東京の部屋に置いてきた。しかし妻に「ある朝気付いたら『Updating 0%』と表示されたまま固まっていた」と相談を受けた。見たところ自動更新に失敗したような挙動だったが、Factory Resetをしても解決しない。以後、「ネットワーク障害 (Network Problem)」と表示されるのみである。正直東京滞在期間が限られている中サポートと修理のやり取りをするのも面倒なので、メルカリで同一機種の新品未使用を買って置き換えることにしたが、なんと代替品もまったく同様の症状に陥った。事ここに至って、これは何か普通でないことが起きていると理解した。

調査開始

Google Nest Hub Network Problem 等でググるが、どうにも結果がパッとしない。世界的に起こっているようには見えない。しかしいくつか同様の症状を発見することができた。

www.5cho-me.com

特に2人目の方は僕同様RTX1200を使っている様子だったので無関係とは思えなかった。

ツイートのやり取りをみて、DNSをパブリックDNSに変更したら解決したとのことでこちらでも試してみた。当初、ルータのDNS設定のことかと思ったのだがどうもそうではなく、DHCPでリースする際に返却するDNSサーバがプロバイダのもの(IPとしてはルータのプライベートIPになる)ではなくて、これを明示的にパブリックDNSにすることで解決するようだった。これを読み取るのに時間がかかった。果たしてこちらでも問題は解消した。

f:id:fushiroyama:20210824030540p:plain
パブリックDNSDHCPサーバから指定されていればOK

RTXではdhcpの設定を次のようにするだけ

dhcp scope option 1 dns=8.8.8.8,8.8.4.4

所感

正直なんでこんな状況に陥るのかちゃんとは分かっていない。ネットワーク内のすべての端末は、このような設定をしなくてもきちんと名前解決できていた。 念のため次のサイト等を参考にIPv6 / IPv4ともに正しく名前解決ができるか確認したが問題がない。

www.yokoweb.net

正直、何かバグが混入しており余程変な方法で名前解決をNest Hubにさせてるんじゃないかと思っているが定かではない。とにかく、この問題はインターネット上にまったく情報がないし、調べようにもNest Hubで何が起こっているかログの見ようもないので非常に弱ってしまった。同じような状況の人の助けになることを願うばかりである。

アメリカでソフトウェアエンジニアになりたい皆さんへ

この文書の目的

昨年の秋ぐらいから1on1という形で社内外の人とたくさんお話させていただく機会を得ました。その折に「米国でソフトウェアエンジニアになるにはどうすれば良いですか?」という質問をたくさんいただきました。それに関する自分の見解をまとめておこうと思ったのがきっかけです。昼休みに30分で書き終えることを目標にしているので出来るだけ簡潔になることを目指します。

免責

これはどうしても書いて置かなければならないですが、「米国でソフトウェアエンジニアになる唯一の方法」などというものはありません。ガイドラインくらいは作れるでしょうが、それにしたって時代や政権とともに刻々と変わります。正確なところは必ず移民弁護士に確認してください。この文章を最後まで読んでオファーを取られた方はそうする権利を有しているはずです。

筆者

米国でソフトウェアエンジニアをしています。正式なタイトルはSoftware Development Engineerで、ソフトウェア開発を職務の第一義としています。米国は2回目で、1回目は日本企業の米国支社に駐在員として、今回は米国企業の社員として来ています。IT産業に来て15年ほどですが、最初の5年ほどはインフラエンジニアとして、この10年はソフトウェアエンジニア、特にモバイルアプリ開発が専門です。

TL; DR

最後まで読みたくない人、この資料に書いてあることが言いたいことのほとんど全てです。5分で見られるのでパラパラめくってみてください。 これは駐在員時代に書いたものですが、現地採用になったいまでもほとんど同じ考えです。

speakerdeck.com

根源的な問い

本当にアメリカでソフトウェアエンジニアになりたいですか?外国で、あるいは英語圏でソフトウェアエンジニアになりたい、ではなくアメリカで、ですか? この問いに自信を持ってyesと答えられない場合は米国はやめておいた方がいいかもしれません。なぜならむちゃくちゃ大変だからです。それでもyesの方は続きをお読みください。

…yesなんですね?やれやれ(RPGの武器屋の親父風に)

米国でソフトウェアエンジニアになるのは大変です。もっと正確に言うと、滞在資格のない外国人がそうするのは、です。何が大変か?ビザです。

米国就労ビザフローチャート

米国で働くためのフローチャートです。yesの場合は2つ先の「就職活動」のセクションに進んでください。

1. 米国国籍(米市民権)を持っていますか?

さいつよです。おめでとうございます。

2. 米永住権を持っていますか?

ということはすでに米国にいますね?おめでとうございます。次に進んでください。

3. 米大学(院)生で学生ビザで滞在していますか?

あなたの専攻がSTEM(いわゆる理系)の場合、OPTという仕組みを使って最大3年間インターンおよび就労が可能です。おめでとうございます、就職活動がんばってください。

4. 米国以外の国で博士号を持っていますか?

たとえば日本の大学で博士号を持っていたり、トップレベルの論文を通したりしていれば、O-1という卓越した技能を持つものに与えられるビザが取れる可能性があります。他の人より有利です。

5. 米系企業に就職しており、転籍がサポートしてもらえますか?

たとえばMicrosoft, Google, Amazonなどの米系多国籍企業で働いており、その会社が転籍のサポートをしてくれる場合、L-1B/Aといった転籍のビザで入国できる可能性があります。他の人より有利です。

6. 米国に支社があって、転籍がサポートしてもらえますか?

たとえば日本に本社があり、米国に支社があって定期的に駐在員を送り込んでいる会社の場合、Lビザの他にE-2というビザで入国できる可能性があります。他の人より有利ですが、日本の会社は転籍したあと永住権まではサポートしてくれないケースが多いようです。

7. 配偶者が米国滞在資格を持っていますか?

配偶者ビザも種類によって(そして追加で取得する許可次第で)は就労が可能です。おめでとうございます。

8. それ以外の人

大変です。引き返したほうが良いかもしれません。

ビザ!ビザ!ビザ!騎士として恥ずかしくないのか!

前のセクションで「8. それ以外の人」に向けて書いています。

それ以外の人は、米国で働くために取れる選択肢は非常に限られます。一番の正攻法はH-1Bと呼ばれる、いわば専門職ビザの花形を取得することです。 しかしながらこれを書いている今日現在、H-1Bは申し込みが完全にオーバーフローしており、非常に狭き門となっています。端的に言って外国人がいきなりこれを取るのはほとんど無理です。なぜか?

H-1Bはその年の4月に抽選があります。最近ではおよそ3割程度しかこの抽選に受かりません。そしてラッキーにも抽選に通った3割は、その年の10月からようやく就労が開始できます。4月の抽選のために、各企業は前年の10月ぐらいからポジションを開けて一生懸命採用活動をします。ご存知の通り、米国のソフトウェアエンジニアはコーディング面接が合計で5-6回あったりします。ものっすごい手間なのです。 その手間を掛けてようやく「こいつにはオファーを出せる」と思った候補者が、その後3割完全なる運でしか来てくれない。ただでさえオファーを断られる可能性を考えるともっと低い。しかもオファーを出して働き始めるのは丸一年後と来たもんだ。こんな採用するわけないんです。 企業にとってもこんな採用方針はリスクなんです。

現実問題として、世界でもっともリッチななんたらファみたいな会社ですら、外国人にいきなりH-1Bをサポートしていません。H-1Bをサポートするのは、前セクションで「3. 米大学(院)生で学生ビザで滞在していますか?」に該当する人がOPTで働きながら、そのバックアップとして申し込みというのが現状です。

実力があったらビザはついてくる?とんでもない。いまはそんなことは無理です。実力云々の話ではなく、まず土俵に立てないんです。この辺りで問題の大変さが伝わったかと思います。

もちろんね、例外を挙げればキリがないですよ。就労ビザは企業がサポートするので、たとえばオープンソース活動などで米国のスタートアップの経営陣にむちゃくちゃ気に入られて「お前はデキるやつだから、H-1Bに応募してやる。落ちたらリモートで働いてくれたらいい。どうやっても連れてくるから」なんて言われたら技術者冥利に尽きますよね。このような例は僕も目にしています。しかし明らかに例外ケースです。

ではどうするか?個人的には上で挙げたフローチャートの1〜7で自分に一番近そうなものを選ぶことをおすすめします。H-1B一点突破はかなりキツイです。H-1Bは頻繁に条件見直しの話があって、確実なことを申し上げるのが困難ですが、最近聞く話ではH-1Bに要求される給与水準を高める(≒大企業にしか払えない)という話があるので、ますますスタートアップがこれを出すのは困難になるという見方が多数です。

個人的なおすすめはNo. 5の多国籍企業に入社してL-1ビザで入国です。このビザは1年その拠点で過ごさない限り使えない(例: Microsoft Japanに1年勤めて、米Microsoftに異動)ので注意が必要ですが、大きい会社はL-1 Blanketという枠を持っていて最もビザが下りやすいうちのひとつだと思います。

就職活動

さて、あとは就職活動です。これももちろん大変ですが、ビザの苦労に比べたら鼻くそみたいなものです。あとは自分が頑張るだけです。コーディング対策の本やウェブサイトは数え切れないほどあります。次のウェブサイトは個人的に大変おすすめしております。

tnanjo.net

1kohei1.com

まとめ

本当に米国でなければダメなのか?はぜひもう一度自分に問いかけていただきたいです。英語圏ならばUK、カナダ、オーストラリア、シンガポールと魅力的な場所がたくさんあります。

え、給料?たしかに大手は良いかもしれません。

www.levels.fyi

しかし、例えば僕がTwitterを見ていて思うのですけど、みんな「米国のソフトウェア企業」って言った時にG○○gleただ1社のことを思い浮かべながら書いてないでしょうか?あのような企業は米国でも稀なのではないかと個人的には思います…

米国にいる誰もが億万長者ではないですし、物価も高いです。僕はいまStudio(いわゆるワンルームの部屋)を探していますが家賃は日本円で月25万円ぐらいします。家族連れはもちろんもっともっと高いです。 もちろん、しばしば言われることですが、日本に比べて給料が2倍・物価が2倍ならば可処分所得も2倍ということです。これは結構意味があります。米国は順調に経済成長しているので、米国にいて投資をすることは大きいリターンになる可能性はもちろんあります。しかしまあ、それを話し始めるとこのエントリがブレてしまうしぴったり30分なのでこれにて。

最後に!僕はそれでも米国に来たかったし、来てよかったです。それはソフトウェアエンジニアとしてこの世界に与えられるインパクトの大きさです。何事にも代えがたい喜びがあります。

僕と同じく「それでもアメリカでソフトウェアエンジニアになりたい皆さん」へ、応援しています!!!

VPNのためにPPPoEを追加契約した

次のエントリに書いた通り、自宅のネットが遅くて仕事にならなかったのでIPv4 PPPoEからIPv6 IPoE + DS-Liteに乗り換えて問題は解消した。PPPoEが詰まって速度が出ない人は試す価値がある。

fushiroyama.hatenablog.com

ところで上記エントリの最後でちょっと触れたが、この方法ではこれまで利用できていたネットボランチDNSが使えなくなる1。ネットボランチDNS唐突にYAMAHAルータ愛を吐露するにも書いたが、無料かつメンテナンスフリーなDDNSのようなものだ。自宅サーバを公開したり拠点間VPNを固定IPなしに実現するのに非常に便利だ。 近々引っ越しの予定があり、拠点間VPNを構築する必要があるため、悩んだのだが安直にPPPoEを追加で再契約してIPoEと両立させることにした。

ということでいきなりRTX1200での設定例を載せる。IPoE + DS-Liteを使いつつ特定の用途のためにPPPoEを追加するという人は余り多いとはとても思えないが、インターネットに情報を載せておくことで誰かが助かるかもしれないのでとりあえず掲載する。

(2021-01-18追記:フィルタの設定が間違っていてRTX1200からネットボランチDNSまでパケットが届かない設定でした。既に設定を修正済みです。)

administrator password *
login user papa *
security class 2 off off off
console character ascii
console prompt "[RTX1200] "
login timer 3600
ip route default gateway tunnel 1 filter 1 3 gateway pp 1 filter 2
ipv6 prefix 1 ra-prefix@lan2::/64
ip lan1 address 192.168.11.1/24
ipv6 lan1 address ra-prefix@lan2::1/64
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
ipv6 lan2 secure filter in 1010 1011 1012 2000
ipv6 lan2 secure filter out 3000 dynamic 100 101 102 103 104 105 106
ipv6 lan2 dhcp service client ir=on
ip lan3 address 192.168.22.1/24
pp select 1
 pp name PPPoE
 pp always-on on
 pppoe use lan2
 pppoe auto connect on
 pppoe auto disconnect off
 pp auth accept pap chap
 pp auth myname * *
 ppp lcp mru on 1454
 ppp ipcp ipaddress on
 ppp ipcp msext on
 ppp ccp type none
 ip pp mtu 1454
 ip pp nat descriptor 1
 netvolante-dns hostname host pp server=1 *
 pp enable 1
tunnel select 1
 tunnel name DS-Lite
 tunnel encapsulation ipip
 tunnel endpoint address 2404:8e00::feed:100
 tunnel enable 1
ip filter 1 pass 192.168.11.0/24 *
ip filter 2 pass 192.168.22.0/24 *
ip filter 3 pass 0.0.0.0 * * * *
nat descriptor type 1 masquerade
nat descriptor address outer 1 ipcp
nat descriptor address inner 1 192.168.22.1-192.168.22.254
nat descriptor masquerade incoming 1 discard
nat descriptor masquerade static 1 1 192.168.22.1 udp 500
nat descriptor masquerade static 1 2 192.168.22.1 esp
nat descriptor masquerade static 1 3 192.168.22.200 tcp 22
nat descriptor masquerade static 1 4 192.168.22.200 tcp www
nat descriptor masquerade static 1 5 192.168.22.200 tcp https
nat descriptor masquerade static 1 6 192.168.22.200 tcp 8080
ipv6 filter 1010 pass * * icmp6 * *
ipv6 filter 1011 pass * * tcp * ident
ipv6 filter 1012 pass * * udp * 546
ipv6 filter 2000 reject * * * * *
ipv6 filter 3000 pass * * * * *
ipv6 filter dynamic 100 * * ftp
ipv6 filter dynamic 101 * * domain
ipv6 filter dynamic 102 * * www
ipv6 filter dynamic 103 * * smtp
ipv6 filter dynamic 104 * * pop3
ipv6 filter dynamic 105 * * tcp
ipv6 filter dynamic 106 * * udp
telnetd service off
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.11.100-192.168.11.199/24 expire 12:00 maxexpire 12:00
dhcp scope 2 192.168.22.100-192.168.22.199/24 expire 12:00 maxexpire 12:00
dns server dhcp lan2
sshd service on
sshd host lan1
sshd host key generate *

簡単に解説する。 lan2はインターネットに出ていく経路でIPoEとPPPoEで共有する。 lan1は192.168.11.0/24のLANでここにぶら下がったクライアントはtunnel (IPoE + DS-Lite)でインターネットに出ていく。 lan3は192.168.22.0/24のLANでここにぶら下がったクライアントはpp1 (PPPoE)でインターネットに出ていく。pp1はネットボランチDNSでホスト名をもらっている。VPNの対向ではこれを目掛けて接続する。 また、lan3はstatic natでホームゲートウェイを公開している。これはちょっとしたプログラムを動かしたり自宅ネットワークへの踏み台として利用しており、我が家では伝統的にRaspberry Piが担当している。

設定の肝は

ip route default gateway tunnel 1 filter 1 3 gateway pp 1 filter 2
...
ip filter 1 pass 192.168.11.0/24 *
ip filter 2 pass 192.168.22.0/24 *
ip filter 3 pass 0.0.0.0 * * * *

の部分だけで、ここでIPに応じてgatewayを切り替えている。filter 3はルータ自身がWANで出るときのIPで、これを設定しないとインターネットへの経路がないことからネットボランチDNS等に到達できない。

余談だがフィルタの部分はたとえば次のようにkeepaliveを設定することで片方の経路からインターネットに出られなくなったらもう片方の経路から出ると言った設定も容易く行える。ISPを複数契約してマルチホーミングしたり、光ファイバの系統すら冗長化することも可能だろう。

ip route default gateway pp 1 keepalive 1 gateway pp 2 weight 0
ip keepalive 1 icmp-echo 5 3 8.8.8.8

個人的にこのフィルターの柔軟さなどがYAMAHAルータの魅力である。YAMAHAルータの魅力はいくらでもしゃべれるがこんなことをしている場合ではないのでこのへんで。

ちなみに今回はVPNのためだけに安直にPPPoEを追加契約したので、もっとよいアイディアがあったら是非コメントください。


  1. これは僕が利用しているルータがRTX1200であるため。RTX1210ではIPv6対応のネットボランチDNSが使えるらしい。欲しい…

働きながら修士課程1年目を終えて

本エントリは社会人学生 Advent Calendar 2020の19日目です。ただ今月の後半は個人的事情で非常に忙しいことが予想されるので、本日書いてしまってまだ筆の熱が残っている内に公開してしまおうと思います。

改めて自己紹介をさせてください。37歳の職業ソフトウェア技術者です。現在フルタイムで働きながら、北陸先端科学技術大学院大学(通称JAIST)の博士前期課程で情報科学を専攻しています。実は本アドベントカレンダーは去年も参加しました。そちらには進学の動機や入学したばかりの初々しい気持ちが表明されているような気がします。

fushiroyama.hatenablog.com

さて、本エントリで何を書こうか少し悩みました。考えた結果、前半で「1年目を終えた率直な感想」を、後半で「JAISTで社会人大学院生をやること」について書こうと思います。特に後半には、この1年でのべ100人ぐらいに聞かれたFAQについてまとめておこうと思うので、興味がある方はそちらだけお読みいただいてもよいと思います。ぶっちゃけJAISTどうなん?という部分も個人的感想を述べておきます。

修士課程1年目を終えて

いや〜〜〜〜、大変でした。想像以上でした。

現在のステータスは、あと修士論文を提出すれば修士号が取れるところまで来ています。JAISTはざっくり言うと

  • 授業で必要な単位を取る(20-26単位)
  • 副テーマ研究を終える
  • 主テーマ研究(修士論文 or 課題研究)を終える

と博士前期課程を修了(修士号)することができます。

このうち単位を取り終えて副テーマ研究も完了してすでに成績が付きました。やはり一番大変なのが単位を集めることでした。

JAIST東京サテライトの情報科学の授業は原則として土日にしか開講しません。修了単位を20-26単位集めるには4半期ごとに3-4教科ずつ履修する必要があります(JAISTは4学期制)。 石川本校の学生が平日をフルに使って受けるのと同じ授業を土日だけで賄うので、1日で1コマ100分を2コマ連続で合計7-8週(全15回)受けることになります。これに中間・期末試験です。100分2コマは端的に言うと、土日どちらかを半日差し出すことを意味するので、もしこれを1学期に3教科履修すると、土日の3/4が授業だけで取られることがご理解いただけると思います。

しかも理系科目が1日に一気に2コマ進むので、予習復習が想像を絶するほど大変でした。それに加えて課題も重い。毎週5-6時間は常に何かの宿題を夜中にゲボ吐きながらやっていた気がします。それでいて、基本的に成績は中間・期末試験の一発勝負で決まる。情報科学では出席点やレポートなどの救済措置がある科目のほうが例外的でした。3ヶ月これだけ苦しい思いをして授業を受けたのに、この試験で失敗したら水の泡かと思うと、テストの前は手が震えるような思いをしたのを覚えています。実際、2教科も力及ばず落としました。いや〜厳しかった。

同級生には理系の学部・院を卒業した人もたくさんいるので彼らに聞いた感じだと、JAISTの授業の難易度そのものは押しなべて一般的な国立大学理系院とそれほど差がないようです。なのでこれを読まれた方が必要以上に恐れる必要は無いと思いますが、甘いものではまったくないのは伝わるのではないかと思います。

まあこの地獄の日々もなんとか終わり、修了単位はすべて揃えることができました。内容はかなり満足しています(この辺は後半にちょっと書こうと思います)。

やはり家族には随分迷惑をかけました。履修は細心の注意を払って「基本的に土日のどちらかは丸一日空くようにする」ことを心がけました。これは子供との時間を作ることが最大の目的です。 しかしながらこれも正直に言ってそんなに甘いものではありませんでした。授業は、カリキュラムや先生の都合など複数の要因によって毎週一定の時間には行われるとは限りません。同じ授業でもある週は土曜日の午前だったり、また別の週は日曜の午後だったりします。これは避けようのないことではあるのですが、家族には予定の読めなさで随分ストレスをかけました(時間割はもちろん事前に分かっているのですが、家族はそんなの知ったことではないですよね)。JAISTで社会人大学院に進学しようと考えておられる方で家庭を持っておられる方はこの点をゆめゆめご認識いただければと思います。

授業を取る合間に、副テーマ研究も終えました。JAISTは研究に幅広い視野を与える目的で、すべての学生に主テーマ研究の他に副テーマ研究を課しています。主テーマ研究とは必ずしも関連している必要はなく、学生がそれぞれ自由に先生にアポを取って承諾をもらい、1-3ヶ月程度で完了できる研究をやります。僕は自然言語処理の先生に師事して、日本語コーパスの極性判定における言語ドメインの違いが及ぼす影響について研究しました。自分の能力の幅が広がって非常によい経験でした。

残すは修士論文だけです。正直、残りたった1年で修士研究を出来るのか?という不安はかなり大きいです。しかしJAIST大学院大学で学部を持たないため、幅広いバックグラウンドの学生を均一に鍛え上げるためにM1は比較的がっつりコースワークを頑張って2年目に研究を、というスタンスのようです。僕の主テーマ研究は、アドホックネットワークにおけるゴシップアルゴリズムを使った効率的情報伝達と、それを応用した行動支援というものになる予定です。年明けぐらいまでは周辺分野の論文を読みまくって研究の新規性や筋を見極め、春から夏にかけて実験、夏に2-3ヶ月かけて論文を仕上げて2021年秋の修了を目指します。

また来年の社会人学生 Advent Calendarでお会いできるのを楽しみにしています!

JAISTで社会人大学院生をやること

いや〜〜〜お疲れさまでした!ここからが本番ですね!

ちょっと話は変わるんですが僕はそくめん君というプラットフォームを使って僕と話してみたいと言ってくださる方々と時々1:1をしています。

sokumenkun.com

で、ここで一番聞かれるのがやはり社会人大学院のことなんですけど、共通して聞かれる項目があるので、せっかくなのでここでFAQ形式でまとめようと思います。JAISTの受験を考えておられる方には参考になるかもしれません。

Q. コンピュータ・サイエンスを体系的に学びたいと考えているがJAISTに進学することはどうか?

A. 正直悪くない選択です!ただ、大学は職業訓練校ではないです!

これ、大変もっともな質問だと思いますし気持ちとても分かります。前半でもちょっと書いたのですが、JAIST大学院大学で学部を持っていません。日本のその他の大学院はJAISTに比べてもっと研究色が強いと聞いております。これは、学部でがっつり勉強していることは担保できるので大学院では研究を…ということと理解しております。JAISTは学部がないので非常に多種多様な学生が集まります。なので、みんな一様に修士一年目はしっかり勉強せえよとばかりに勉強することになります。必要な単位は必修の他に自由選択で、修論を書く学生は20単位、課題研究の学生は26単位取る必要があります。これって大学院としては結構多いですよね。

しかし、とはいえたかが26単位です!2単位教科で13科目です。たった13科目。これでコンピュータ・サイエンスのすべてが味わえるはずもない。ごく限られた分野のほんの一端を垣間見るのが関の山でしょう。もし"コンピュータ・サイエンスを体系的に学びたい"のならば、それこそ学部をやり直すのにまさる勉強はないのではないでしょうか?僕は電気通信大学の情報理工学部の夜間などはかなり注目しています。

なお、JAISTの授業は本当に素晴らしいです。僕は履修したすべての授業が(結局落としたものも含め)本当にタメになりました。大学の勉強は、例えばRuby on Railsの使い方を覚えてウェブアプリを作りましょう!というものではまったくありません。大学は職業訓練校ではないのです。学んだことが即何かに使えるかというと、必ずしもそういうものではないと思います。ただし、まったく使わないかというとそれは全然そんなことはありません。大学で体系的に学んだ知識は必ず自分の血肉となって、まだ見ぬ課題に立ち向かう際に「もしかしてアレとアレを組み合わせると対処できるのではないか?」というような場面で力を発揮すると思います。なので、JAISTで学ばれることを全く否定するものではありません。

Q. 文系出身なのだがJAISTの授業についていけるか?

A. 授業と人によります!しかしそれなりの覚悟が必要です!

これも非常によく受ける質問です。これは本当にその人次第だし授業にもよるので一言で回答するのが難しいです。ただ、情報科学の分野で数学をまったく使わないものはほとんど皆無と言ってもよいと思います。自分が受けた中では次の例みたいな感覚だったので参考にしてみてください。

  • 情報理論や信号処理、解析系の授業…学部程度の数学力(高校数学では到底足りない)がないと授業で何が起こっているのかも理解できないし単位を取るのも無理です。
  • 形式手法、ソフトウェア設計、関数プログラミングなど…離散数学の基礎の上に成り立っている分野が多いが、職業ソフトウェアエンジニアは頑張ればついていける可能性がある。ただし、業務で行うプログラミングと情報科学の授業のプログラミングで扱われれる内容はかなり毛色が違うので手も足も出ない人もいるかもしれません。
  • ネットワーク、オペレーティングシステムなど…四則演算以上の数学を使うことはあまり多くないが、当然この分野特有の難しさがある。頑張れば何とかなるかもしれない。

自分が受けた情報科学の教科の中で「あ、これは楽勝」みたいな科目はただの一つもありませんでした。文系・理系に関わらず、覚悟を持って臨む必要があります。覚悟さえあれば…夜中に歯を食いしばって講義動画を見直して毎週毎週苦しい課題を出し続ける覚悟があれば、きっと大丈夫ですよ!

Q. JAISTの入試の小論文どんな感じで用意した?何をすれば受かる?

A. 考えているテーマで3本ほど論文を読み、その上で指導教員(予定)にアポを取ってアドバイスもらってはどうでしょう。

JAISTに入学したいけどどうやったら受かりますか?というのもよく受ける質問です。これも僕が入試を担当しているわけではないのでまったくわかりませんが、少なくともどういったフォーマットで行われているかは認識しています。JAISTの入試では小論文を提出して、面接ではそれに対するプレゼンを行う必要があります。これは、言うなれば修士研究をきちんとできる素地があるかどうか見られているのだと僕は理解しています。入試の時点で修士論文のように新規性や厳密なファクトチェックは求められません。その代わり、論理的思考やプレゼンの内容の事実確認のアプローチは見られていると思います。

自分が何かやりたいテーマがあったとして、Google Scholarなどで調べると論文は山程出てくるでしょう。図書館などではこれをダウンロードできると思うので、とりあえずそれを読んでみてください。すると参考文献に更に大事な関連情報が見つかるので、それを読んでいく。最低でも3つぐらい読めば、先生に「…それ事前に調べました?」とか呆れられることはかなり少なくなると思います。あとは自分のやりたい内容に関して

  • 現状の問題は何なのか
  • 自分の提示する手法は何を解決するのか
  • どのように仮説を立て、それを検証するのか
  • 結果はどのようになり、それは何を意味するのか
  • この研究でカバーできないこと、この先の展望

など書いていくともう論文の体裁になると思います。あとは人事を尽くして天命を待ちましょう!

で、JAISTは定期的に大学説明会をやっているので、そこで席主のおじさん(エライ先生だよ)に「こういうことやりたいんですけど」と伝えると、必ず「○○先生にコンタクト取ってみたらどうですか?」と教えてくれます。その先生とオンライン面談でもして読んだ論文の内容を伝えると次のステップを教えてくれると思います。Good luck!

ぶっちゃけJAISTどうですか

さて、本エントリ最後の内容です。ここではJAISTに関して思っていることを率直に書こうと思います。

まず、JAIST社会人の良いところ。これは沢山ありますけど、一番素晴らしいと思うのがやはり優れた同級生です。一緒に勉強している仲間には日本を代表する会社の研究職の方や、上場企業のCTO、医師や弁護士などの専門職者、他大学の教授までいます。こんな優れた人たちと、高いモチベーションで勉強できる場所はちょっと他にあまり思いつかないです。みんな仕事や家庭のある中なんとか時間を作って勉強や研究をしています。これまでさんざん書いてきたように、働きながら勉強するのは本当にキツイです。でもJAIST社会人のSlackでみんなで苦しみを吐き出しながら、提出した課題を褒め合いながら、なんとか励まし合ってみんな前に進んでいます。素晴らしい場所です。

次に、長期履修制度は非常によいです。JAISTは長期履修制度というのがあって、修士課程の学生は2年分の学費で3年間、博士課程は3年分の学費で4年間勉強できます。実質1年無料で延長できるんですね。国立大学なので1年の学費は53万円。これが長期履修制度を組み合わせると30万円台まで下がります。年間ですよ年間!JAISTのようなレベルの高い研究大学でこの学費で学べるというのは驚異的なことです。実質無料ですね。

今度は微妙な点。JAIST社会人は、COVIDの今でこそ完全オンラインですけど、本来は品川キャンパスに先生方が直接きて授業をしてくださいます。JAISTはあくまで石川が本校なので、品川で履修できる科目は決して多くはありません。情報科学の場合、4半期ごとに履修できる科目はわずかに4教科程です。年間で16-20教科ほど。これはお世辞にも多いとは言えませんよね。もちろん、その内容はかなり厳選されたもので、どれを選んでも損をさせない素晴らしい授業ばかりですが、それでも本校と同等の教育を受けるのは中々難しいです。COVIDが大きな転機となって、本校の授業をもっと気軽にオンラインで取れるようになったら、あるいはもっともっと素晴らしい大学院になるかもしれません。

最後に、JAIST社会人のちょっと面白い所を紹介して終わりにしたいと思います。現在のJAISTでは「情報科学」というのは学部ではありません。専攻は「先端科学技術研究科 先端科学技術専攻」の1本があるのみです。その下に知識科学系、情報科学系などの「学系」が並んでいます。これが何を意味するか?学生はある程度自由に学系を行き来して授業を取ることができます。 もちろん、違う学系の授業を取れると言ってもまったく自分の専攻と関係ないものは単位認定されません。シラバスを眺めながら、自分が修了したい学位と教科の表を見て単位として認められるものを選んでいくのが基本的な履修方法になります。面白いのが、情報科学で学位を取る場合でも単位認定される他学系の授業はちょこちょこあるという点です。

極論してしまえば、自分の学系と違う授業ばかりかき集めても「情報科学」として学位を取ることは可能なのです。自分が他学系の授業を受けた感じ、率直に言って情報系の授業で単位を取るより50倍は楽だなと感じたものすらあります。しかしそれは全て本人の選択なのです。自分が大学院で何を得たいのか?勉強して学力を身に着けたいのか。それとも研究がしたいからさっさと単位を取ってしまうのか。すべて自由です。大学は常にそこにあり、同じ内容を提供している。それを得て自分が何に活かすのか?それはすべて学生の自主性に委ねられています。この自由がJAIST社会人の非常によい点だと思いました。

いま、日本でもリカレント教育という言葉が聞かれるようになってきました。若い学生の減少とは裏腹に、社会人大学院はこれからどんどん盛り上がっていくのではないかと個人的に考えています。JAISTはその旗手としてこれからも勉強したい社会人に門戸を開き続けていくことを強く期待しています。これを読んでJAISTに興味を持ってくださった方、一緒に勉強しましょう!それでは。

学び直しと就職に関して

非常に狭い範囲での観測で恐縮なのですが、いま僕の周りでは一度ドロップアウトや就職してからの大学復学、大学院進学などの「学び直し」が空前のブームとなっております。これに関しては非常に喜ばしく感じている一方、我々どうしても食っていかねばなりませんから、

  1. 働きながら夜間・休日に修学できる環境で学ぶ
  2. 腹をくくってフルタイム就学し、その後再就職する

という人が大部分かと存じます。これに関して個人的に思うところがあり、ちょっと筆を執りました。本エントリでは次の話題をカバーしたいです。

  1. 実際に「学び直し」てみてどうか
  2. ソフトウェア技術者として再就職するにはどうすればよいか

1に関しては個人的に率直に感じていることを取り留めもなく書きたいと思いますので興味のある方はお読みいただいても構いませんし、就職の部分だけを読みたい方は全部飛ばしてそちらから読んでいただくとよいと思います。
2を書きたい理由が「やりたい夢が見つかったので大学に進学したものの、卒業する頃には30近くなってしまっている。自分の興味のある分野で新たに職を探すことは無理なのか…?」という悩みを複数拝見したからです。これは、もし興味のある分野がソフトウェア産業であれば、端的に言って何とかなると個人的に考えています。僕の就業経験はいずれもソフトウェア開発関連なので、もとよりそれ以外のことはお話しできませんが、該当する方には何らかの示唆になるかも知れません。

実際に「学び直し」てみてどうか

最初に自己紹介をさせてください。現在37歳のソフトウェア技術者です。米国に本社のある会社の日本法人でソフトウェアを開発しています。学部では情報科学とは似ても似つかない英文学を専攻していましたが中退し、5年ほど大学の先輩の会社でインフラエンジニア/ソフトウェアエンジニア見習いとして働いていました。その後、思うところあって26歳ごろ復学し、1年半かけて卒業し、また同じソフトウェア産業で10年近く仕事していました。ただ、ソフトウェアエンジニアとしてもう一段回成長したいと考えるにつれ、アカデミックな知識がすっぽり抜けていることを足かせに感じ、昨年36歳のときに情報科学系の大学院に進学しました。今日現在で単位はほぼ取り終えて、あとは修士研究をやりきれば修士号に手が届くところまで来ています。修了後も変わらずソフトウェア産業で働きますが、大学院で学んだ専門をより活かせる形を模索するかも知れません。

大学院は実際にどうだったかというと、これはもう素晴らしい経験でした(まだ在学中ですけど)。今は不況で状況が変わってきているかも知れませんが、僕が現役の学部生だった頃はまさに「大学全入時代」で、確たる夢や目標を持って大学に進学する人の方がもしかしたら少数派だったかもしれません。少なくとも僕はそうで、目が覚めたらまずビールのフタを開けてから、いま窓の外に差し込んでいるのが朝日なのか夕日なのか確認するような自堕落な生活を送っていました。これに対して、学び直しはモチベーションからしてそもそも違いますよね。身銭を切って、なんとか時間を捻出してから勉強するわけなので、取り組み方がまったく異なると思います。不思議なもので、大学は常にそこにあり、同じものを提供しているのです。学ぶ人の姿勢一つで大学は有益にも無益にもなるわけです。大学無用論は、おそらく大学から大したものを持ち帰れなかったのでしょう。とにかく、触れるものすべてが新鮮で、新しく知ることすべてが瑞々しく、自分の脳のホコリを被っていた部分に新たな水が注がれているのを感じることができます。

それから、大学は職業訓練校ではないという点も紹介しておきたいです。僕の現在の専攻は情報科学ですが、ここで学べる内容はたとえばプログラミングスクールとは大きく異なっています。たとえばI217 関数プログラミングという授業1では、関数型言語を使って何か作ってこれをメシのタネにするということは主眼ではありません。型システムを使った数学的抽象データ構造の表現であったり、評価順と無限数列の考察、計算可能性などアカデミックな内容を扱います。これがすぐに日々の仕事に活かせるかと言うと、そうでもないのですが、さりとて「大学の内容は仕事には使えない」かというと、これはまったく正しくありません。僕は同じく大学で学んだCPUのパイプライン処理などはすぐに業務で活かすことができました。知識というのは道具箱のようなもので、すぐに使う10mm, 12mmレンチだけ持っていればよいというものではなく、使用頻度が少ないものも含めて道具箱すべてを使って最終的に何を成せるかということが大事だと考えています。大学はそういう知識が身につく場所だと思います。

ソフトウェア技術者として再就職するにはどうすればよいか

いよいよ本題に入りたいと思います。読んでくださる方の時間の無駄にならないように再掲させていただきますが、ここではソフトウェア産業に限って話させていただきます。残念ながら僕はソフトウェア産業でしか就労経験がなく、たとえば考古学の学位を取った後にどのような就職をすればよいかというような知識を持ち合わせていません。

大学に行きたいという動機は人それぞれで、それが情報科学でも考古学でも純数学でもどれも等しく素晴らしいです。中々歯がゆいのが、学問の純粋な喜びとは裏腹に、我々の多くは卒業・修了後は口に糊するために働かねばなりません。「学び直し」の後に働くパターンは大きく分けて次の2つがあると考えています。

  1. すでにある分野や産業で職歴があり、知識を「強化して」元の産業に戻る
  2. ある分野や産業に興味を抱いて就学し、卒業・修了後に初めてその産業で就業する

このうち、1が問題になることはほぼないでしょう。すでに産業経験があり、人によっては就労を継続しながら勉強できます。しかも現在の知識を強化して同じ業界に戻ってくるわけですから、これはイージーモードです。これに関しては一切触れないことにします。

さて、大変なのは2です。誰しも、本来大部分の人が学部・院を卒業する年齢から10年20年経ってからほぼ未経験で新たに職探しをするのは不安でしょう。しかし、敢えて安心させるために言い切ってしまいますが、ことソフトウェア産業において、大学のドロップアウトや専攻変えからほぼ未経験でソフトウェアエンジニアとして就職することは、端的に言って可能だと考えています。むしろ、それができる数少ない業種だと認識しています。
僕はドロップアウトしてから学部を卒業(この時点では英文学士)した時点で27歳でした。たしかに先輩の会社で5年ほど見習いとして働かせてもらっていましたが、このときの僕はまともにプログラミングなどできていなかったと思います。実際に、「ああだいぶコードレビューで指摘されることが少なくなってきたな…」という程度にコードが書けるようになったのはほんの5年前ぐらいだと思います。これは卵が先か鶏が先かという話になるのですが、やはりソフトウェア技術者として力をつけるにはどうしたってある程度それを仕事として毎日書く必要があると思います。ただそのためにはソフトウェア産業で就職する必要がある。ソフトウェア産業で就職するためにはソフトウェアが書けることを示す必要がある。なんとかして最初の就労先を捻出する必要がある。それをどうするか。

今から書くことは、僕が実際にやったことです。人によってはこれを読んで、なんて無神経で傲岸不遜な人間だと不愉快に感じるかも知れない。また、たかがN=1であり、再現性などないと思われるかも知れない。しかしながら、僕はこれは今でも有効な方法だと思っています。10年前の僕が2020年に放り込まれても同じことをやれる自信があります。

さて、最初の就職をどうするか。これはどんな方法を使ってもよいので、次の条件を満たす会社に200個ぐらい応募してみる。

  1. 経験や職歴に関わらずすぐに手を動かしてソフトウェア開発ができる
  2. それなりに有名(できたらマザーズ上場)

これが満たされるならばSIerでもいわゆるウェブ系企業でも大丈夫です。理由を述べます。
まず、すぐに手を動かせることは必須条件です。ソフトウェア技術者の存在理由はソフトウェアの開発であり、スタート時点でビハインドがある以上、この能力を一刻も早く身につけなくては生存に関わります。先に述べた通り、どれだけ大学で勉強しても、自宅で手を動かしても、ソフトウェア開発の現場でしか身につかない力というのは間違いなくあります。もし最初の職場でエクセル仕様書を書く職務に就いてしまうと致命的な遅れになりえます。

次に、それなりに有名な会社に入ることは非常に多くのメリットがあります。こういった会社には仙人のようなソフトウェア技術者が必ず洞窟の奥に控えており、彼らはその深い知識と洞察で必ずあなたをソフトウェアエンジニアとしてひとつ上の段階に引き上げてくれます。彼らと一緒にするプロダクト開発が、彼らのコードレビューのひとつひとつがあなたに新しい力を授けてくれます。これを読んで、「未経験でいきなりマザーズ上場企業に就職できる前提かよ?解散!」と思われた方はちょっと待ってください。マザーズ上場企業って、思ったよりずっとたくさんあるんですよ。売上高を見ると、荒稼ぎしている個人商店と大差ないような少し寂しい売上の会社なんかも含まれています。不思議なことに、仙人のような素晴らしいソフトウェア技術者のいくらかの割合は、会社がかつての輝きを失ってもずっとその会社に鎮座している例をいくつも目撃しています。このような会社は狙い目です。露骨な言い方をすると、落ち目の上場企業に必要最低限の報酬で入社でよいなら、本当に50も100も応募できる根性があれば絶対にどこかには引っかかります。まったく同じ会社でも、経験10年で700万のソフトウェアエンジニアは雇えないが、経験0〜2年で400万なら雇えるという例は数え切れないほどあります。ここに何とか潜り込んで、数年間給料をもらいながら修行をするといいと思います。あとはもう、何とでもなります。大学の学位、数年間の産業経験、企業での職歴、これらすべてで次にどんな会社にステップアップしようとも何も阻むものはありません。

これらの条件を満たすには、必然的に東京に来るのがよい選択になると思います。「どうせ東京の話でしょ?地方の俺には関係ない話だな、解散!」と思われた方、ちょっと待ってください。東京に来るのってそんなに大層なブロッカーですかね。昔パチスロ雑誌で「いつもいつも東京の話題ばかりで参考にならない。地方では東京のような好条件の店がない」という読者の苦情に対してプロの人が「なんで好条件と分かってる土地に来る程度の努力ができないんでしょう?来れば解決すると分かってるなら、それは僕には問題ですらないんですよね😅」と回答していて、これはまあパチスロの話ではあるけど僕の行動哲学に大きな影響を与えたのですよね。僕は京都の大学だったのですが、学部卒業後はすぐに東京に出ていきました。

それから、コミュニティの力を借りると良いと思います。ある言語、フレームワーク、ツールキット、何でもいいのですがそのコミュニティの熱心な参加者になる。そしてあるニッチで他の駆け出しよりも深い知識を身につける。プレゼンスも出す。そういうコミュニティを経由して会社に入り込む例も数え切れないほど目撃しています。僕はスクールで通り一遍の勉強をした後は著名なフレームワークの写経でポートフォリオを作るみたいなのよりは、ある特定分野を掘り下げた強みを作るほうが履歴書や面接で目を引く可能性が高いと考えています。

それから、面接はあくまで面接というテストなのでそれ用の対策をすれば本当に何十回でもめげずに挑戦できる人はすぐにコツを掴むと思います。外国の企業だとそれはコーディングクイズだったりするでしょうし、日本の企業だと「ブラウザにURLを打ち込んで結果が表示されるまでに何が起こっているかを詳細に述べてください」かもしれません。とにかく敵を知り己を知るだけのことです。必ずうまくいきます。

ここまでがスタート地点です。ここからはすべてあなた次第です。僕はどうしても、駆け出しエンジニアを扇動する人たちに比べて夢がないなあと自分でも思うのですが、結局ソフトウェアエンジニアに王道なしというのを信じているからだと思います。優れたソフトウェアエンジニアになるには近道というのはなくて、まあ多少効率の良いやり方ぐらいはあるかもしれませんが、とにかくソフトウェアがどうやって作られててどうやって動いているのか自分で調べて、書いて、勉強し続けるより他にないのだと思っています。ただ、それを身につける上で環境の力というのはとても大事で、だからこそいま学び直しをしようと思っているような気骨のある人にはできるだけ最短で環境の良い会社で働いてもらいたいなと思ってこのような駄文を書きました。自分の経験上、面白い仕事とよい給料はトレードオフの関係ではまったくなくて、むしろよい会社ほど充実した仕事内容と高い報酬の総取りで、そうでない会社はどちらもダメみたいなことの方が多いです。人より少しだけ遅れて再スタートを切った人が、なんとかうまいこと幸せなソフトウェア開発人生を送って欲しくてまったく恥ずかしながら自分の前半生を元に書かせていただきました。何かの参考になれば嬉しいです。

おまけ:海外企業で働くには

ここまで書いた内容は主に日本の東京でのことです。海外でソフトウェアエンジニアをやるにはかなり状況が違うと考えています。僕は米国本社の会社で働いているので、少し認知に歪みがあるかもわかりませんが、端的に言って米国のエンジニア就労は日本よりずっと厳しいです。学位と就職が密接に関わっているので、新卒やインターンの人はカーネギーメロン大学修士だとかMITの博士だとか、もう目が回るような高学歴の人たちばかりです。ここに裸で挑戦するのは中々難しいものがあります。

ひとつだけ良いニュースとして、日本はソフトウェアエンジニアに(少なくとも現状は)気軽になれるので、経験を積みやすいということが挙げられます。前述の通り、米国の大手テック企業ではソフトウェアエンジニアになることそのものが高い壁となっているので、経験を積むことすら高い壁を超える必要があるように見受けられます。繰り返しになりますが、現場でしか身につかない能力というのは非常に多くあるので、これを幸いと捉えて日本で就職し、5年10年の経験を積んでから海外へ挑戦するというのは大いにありだと思います。

海外企業のインタビューを突破するにはCracking the Coding Interviewという書籍が非常に有名です。世界で闘うプログラミング力を鍛える本という名前で和訳もされているので、興味のある方は一度ご覧になるとよいと思います。

また、次のサイトなどは問題や面接の内容を把握するのに役立つと思います。

tnanjo.net

1kohei1.com

長々と失礼しました。勉強も就職もうまくいって欲しいです…!


  1. 余談ですが、この授業はすべての講義資料が世界に公開されているので、興味のある方はぜひLecture Noteを読んでみてください

凡人は論理的思考すべし

登 大遊 (Daiyuu Nobori)さんの論理的思考の放棄というエントリが時を超えて話題になった。

softether.hatenadiary.org

これは氏の類まれな才能あってなされることで、僕を含む凡百のプログラマはこれを読んで(あるいはタイトルだけ見て内容すら読まずに)論理的思考を放棄してプログラムを書くのは危険である。

当該エントリおよび氏の過去のエントリを拝読する限りにおいて、氏が才気あふれるソフトウェア技術者であることは自明であるように思われる。氏が筑波大学に入学しソフトイーサ社を立ち上げる過程を軽妙に綴った次のエントリなどは、ユーモアに溢れ、優れた技術者は文章もうまいのかと嘆息してしまった。

futureship.sec.tsukuba.ac.jp

また僕が普段から敬愛する素晴らしいエンジニアによる証言も氏の大きな才能を裏付けている。

本題に入る。多くのプログラマにとって論理的思考は必要である。というか、当該エントリを拝読する限り、表現方法が異なるだけで論理的思考を放棄していないようにすら思われる。冒頭で触れたように、タイトルだけ見て中身を読んでいない人は一度最後まで当該エントリを読んで欲しい。

まず、だいたいこういうソフトウェアがあればいいなあとか、このような機能を付ける必要があるなとかいった、とても抽象的なことを思い浮かべる。この際、「絶対に論理的に考えないこと」が必要である。論理的に少しでも考えてしまうと、途中までうまくいっても、それが壊れてしまい、最初からやり直しになるので注意する。感覚的な思考でもってこれを行うのである。

次に、だいたいイメージができたところで、心の中に、ソフトウェアの設計図やデータ構造といったものを思い起こす。ここで注意するのは、「絶対に論理的に考えて設計をしないこと」である。徹底して、感覚的な思考でもって設計する。

彼がここで言っているのは抽象化である。コンピュータの論理にとらわれず、まず実社会で実現したい形を思い浮かべ、実装の細部に気をそらされることなく設計せよと主張しているように思われる。氏のエントリを拝読するに、低レイヤの理解と実装力にめっぽう強みがありそうであるから、氏が指す論理的思考とはCPU命令と一対一で紐づくアセンブリレベルの命令列、あるいは仮にもう少し高次元の想定だとしても、libcのシステムコールレベルでの論理をもって「論理的思考」とおっしゃっているのではないかと拝察する。

そも、ソフトウェアコンポーネントを高度に抽象的な概念として捉えて設計することは、僕の語彙では「論理的思考」である。表現方法が違うだけなのだ。氏は当該エントリで

ここで「論理的な思考」の定義を細かくすることはしない。そもそも、細かく定義しようとすること自体がすなわち「論理的な思考」である (論理的に、厳密に定義しないので、あなたの頭の中で、「論理的な思考」というイメージを自在に思い浮かべれば良い)。

と明言しているので、彼の考える論理的な思考と世間一般でそれと考えられている論理的な思考に乖離があったとして、何ら不思議でない。

折しも、次のようなエントリが先ごろ話題となった

nazology.net

曰く、プログラミング時には脳内で数学や論理を思考するときに活性化する部分ではなく、むしろ会話時と同じような部分に活性化がみられたという記事である。

これは個人的な経験にも近い。僕はプログラミングのロジックを読む・組む際に、そこに流れを意識している。このような名前のコンポーネントがあり、このようなAPIが外部に公開されているのだから、このように使われることを想定されているのだろう。このChange Setsで、これまで別のExecutorでパラレルに実行されていた処理が単一のExecutorに積まれるように変更されたということは、これは順序に意味があるということなのだろう。挙げるときりがないが、多くのプログラマはこのように処理の流れにストーリーを感じているはずだ。なので、熟練のプログラマの差分は名前、処理、コミットの単位にすら強いメッセージを感じるし、自分が何を書いているのかも理解していないプログラマの差分はレビュワーにもひどく読みづらい。もうお分かりかと思うが、この一連の流れは論理的思考そのものである。

論理は、自分たちが思いも寄らない状況に置かれた際の道しるべとなる。巨大なプロジェクトに突然放り込まれたとき、難解なバグに対峙したとき、我々はまずどこかに取っかかりをみつけ、それから論理の流れを追って二分探索してゆく。凡人は論理的思考を絶対に放棄してはならない。

最後に、僕も彼の境地にいつか達してみたいという思いはある。なかなか、頭の中で大きな設計ができた後も、

コンピュータの前に座って、キーボードの上に両手を置けば、後はあまり考える必要はない。自動的に手がキーボードを打ち、プログラムを入力して完成させてくれる。

とはいかない。どのくらい書けばここに至るのか。精進をつづけたい。