normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

渡米3年たったので英語絡みの雑感アレコレ

明けましておめでとうございます。渡米してそろそろ3年ほど経った&英語がらみのことを質問されることが非常に増えたので、所感を交えつつで自分の経験でも共有したら役に立つ人でもいるのかなと思ったのでちょっとまとめてみました。ご参考になれば幸いです。

あんた誰?

この節が必要な人は多分見に来ない気がしますが、シアトル本社のソフトウェア会社に勤めてます。渡米して3年半弱が過ぎ、1年半程がロサンゼルス、2年程がシアトルで働いてます。近隣のチームには原則日本人は全くおらず、一緒に働いている別会社側にも話す相手に日本人は原則いないので、普段の仕事はほぼ 100% 英語です。Role Title はソリューションアーキテクトなので、ソフトウェアディベロッパーよりも技術的に求められるレベルは低いと思いますが、求められる英語力はかなり高めになると思います(最終的には個々人に依ると思いますが。
追記そこそこ読んで頂いているっぽいので渡米前の英語力を言うと、新入社員時は TOEIC 400 点台を取ったことがあり、渡米直前ですら700点台でした。留学・海外在住経験は皆無です。

英語圏での仕事はどう?

かなり大変どころか、事前にこんなに大変だとちゃんと分かってたら渡米しなかったかも知れないレベルです。日本に居る場合は「英語ができる」が大きな武器になる事が多いですが、米国に居る場合は当然何のプラスにもならない挙句、英語ができない分だけただ不利になるので、常に巨大なハンデを背負って仕事をしている感覚が付きまといます。米国やヨーロッパ圏の人間と話をしている限り「英語でコミュニケーションすらおぼつかない民族がいる」という認識を持っている人間は原則居ない印象を受けています(APAC 圏の英語が不得意な国とコミュニケーションとったことのある奴らは別)。いまでこそ、そこそこの英会話はできるようになりましたが、渡米直後の2年程は常時巨大なプレッシャーを感じてました(米国側で働いてるとレイオフとか常時あるんで。
今の役職自体は色んな国の人間とやり取りすることが非常に多いので、幅広な知見や各国(米国はもちろんヨーロッパ圏、APAC 圏等々)の実案件に係るのは見分が広まって面白いです。

英語は慣れた?

これが一番よく聞かれる質問です。3年ほど経ちましたが全然慣れてません、未だに苦渋ばっか舐めてます。英語には慣れてませんが「英語が起因のつらい状況でどうやって仕事を遂行するか?」には慣れましたし、そういう能力は相当磨かれた気がします。自分の英語がイマイチな状況で「英語でうまく話そうと頑張る」とか実質的に無意味・無価値なので「想定される問答に対して如何に回答文章を考えておくか」や「説明が複雑になりそうな箇所を図等で説明しやすくしておく」等々の方が大事だと思いますし、そうした「英語以外の箇所で補完する」能力は大幅に向上しましたと思います。
私が今の時点で困ってる英語は「他社の CTO と戦略的エンゲージメントをどう握るか?」とか「グローバルで重要度の高い実案件に対して限られたリソースの中でどう対応していくか?」みたいな話なので、意思の疎通レベルについては特に困らない状況にはなったので、そこそこ成長はしていると思います。
英語のコミュニケーション力がぐっと向上するタイミングは「英語でよく話す相手が見つかる」だなと思うことが多く、ロサンゼルス時代は私の技術力に信を置いてくれて頻繁に話すようになったお客さん(Korean のナイスガイ)、シアトル時代は近くの席に座ってブラックジョークを言い合うインド人同僚とかは大変世話になりました。英語のコミュニケーションは慣れの要素が非常に大きいので、こういう相手の数をどう増やすかはかなり大事だと思ってますが、この新型コロナの影響でくだらない雑談の数が減ったのが非常に厳しいところです。

英語ってどうやって勉強したの?

これも非常に良く聞かれるんですが、①語彙の増強、②会話自体への慣れ、③発音矯正以外はないと思います。
①語彙の増強については単に勉強に対するやる気の問題なので割愛しますが、②を実践しない人が非常に多い印象です。英語で意思疎通すら成り立たないレベルな語学力だった当時、手始めとして自由に時間が取れるRarejob なりのオンライン英会話が結構良かったです。今は知りませんが、当時の Rarejob は相手がフィリピン人の方で English native ではありませんでしたが、少なくとも会話が成り立たない当時はここから初めるのは悪くなかったです。ただし、フィリピン人の方も上記の通り原則は English native ではないので、渡米時点で Rarejob でスムーズにコミュニケーション取れるレベルでもロサンゼルスでビジネス英会話は全然聞き取れないし、自分の発音は伝わらなくて本気で死にかけたので、過度な自信を持つのは危険です。1年半ほど居たロサンゼルスでは特定の相手と何度もコミュニケーションを取ったので、相手が私のダメ英語に慣れてきたのもあり後半はそこそこ英語で意思の疎通はできましたが、純技術的な話題だけでビジネス的な色が出た時点ではまだまだな感じでした。
③の発音矯正はシアトル移住後、普段からお世話になってる日本人の方に紹介してもらった方にトレーニングしてもらいましたが、大幅に発音の質が改善したと思います。オンラインだろうが聞き返されることは無くなった&新しくチームに入ったノルウェーのインド人からも「お前の英語は word by word で聞き取れるよ」と言われたりしたので、かなり発音が良くなったと思います。発音が改善されるとヒアリング力も向上するので、打合せに参加している際にも内職しつつでヒアリングはそこそこできるようになったのですが、たまに話題を振られて焦ったりするのは今もやってます(汗

日本人的にどの国の人の英語が聞き取りにくいとかある?

良く「インド人英語は聞きにくい」という話を聞きますが、周りにインド人の同僚が多すぎるせいかインド人英語は一言一句で聞き取れるレベルにはなりました(今となってはもはや聞きやすいレベル)。それ以外にもイギリス以外のヨーロッパ圏の相手なら原則一言一句レベルではヒアリングできていると思います。
一番厄介なのがイギリス人や生まれも育ちも米国な English native 勢です。上記のインド人、イギリス以外のヨーロッパ勢は英語が native 言語ではないので凝った言い回し等は原則しないですが、English native 勢で特に若めなタイプは会話のスピードが速かったり表現が native 特有とかの自覚がないので、まくしたてられると結構きついことが多いです。10人の打合せで3人が English native、4人がインド人、3人がアジア系とかだったりする場合、English native 勢ばっかしゃべってる打合せとかはちょいちょい見ます。
あと地味に厄介なのがオーストラリア・ニュージーランド以外の APAC 圏との会話です。日本人と同じく彼らも英語が得意ではない人が多いので、初めて打合せする様な場合だと発音的な意味で聞き取れないことが結構あります(何度か打合せするとお互い慣れるので大丈夫)。

英語のプレゼンとか大変でしょ?

渡米2年間くらいは涙が出るほど大変で、日本語で準備する労力が100としたら、英語で準備する労力が500位な感じでした。やり始めた当初はしゃべる内容の一言一句を文字起こしして事前に何度も練習してました。シアトルに移住後(渡米1年半後)は約二週に一度でプレゼンをしてますが、最初の半年くらいは文字起こしの上に何度もプレゼンの練習をしていましたので、かなりきつかったです(汗
今は文字起こしは全くやらずに事前に2~3回くらい試しで話す位ですし、英語で準備する労力は 150 位の労力な感じだと思います。

渡米して米国企業に勤めるのってどう?

ソフトウェアエンジニアとしてなら余裕でありだと思います。特に独身で若いなら、数年の渡米・米国本社企業勤務経験は肩書的にも有効なのでアリだと思います(数年後のことは渡米後に考えても年齢的にも全然遅くないし)。一概にお勧めできなくなるのが「①家族が居る場合」と「②ソフトウェアエンジニア以外で渡米する場合」です。
①は純粋に家族が米国になじめるかが巨大な壁になるからです。本人は覚悟をもって渡米しているから友人や仕事での人間関係がゼロリセットになっても耐えられると思いますが、家族はその限りではありません。また「子供は英語にすぐ慣れる」とよく言いますし当然嘘ではないですが、やはりどこの話を聞いても渡米直後は子供も英語で苦労しているので、この観点は非常に注意した方が良いです。
このブログ読む人間に②に該当するタイプはあまりいないと思いますが、この辺りになると英語でのコミュニケーション能力はかなり比重が高まってきます。営業側やマーケティング側に近くなればなるほど求められるコミュニケーション能力が激増していきますが、ここに non native な人間が真っ向から張り合うのはあまりお勧めできないです。

大分海外勢とコミュニケーションはできるようになったけど渡米できるかな?

上記でも書きましたが、ソフトウェアエンジニアとして渡米するならおそらく問題ないと思います(自分がソフトウェアエンジニアとして勤務してないので想像ですが)。ただ、そもそもで「日本国内にわざわざコンタクトをしてくる海外勢」は日本人が英語が非常に苦手なのを理解しているタイプが多いです。日本人に限らずアジア圏の人間の英語発音は総じてヨーロッパ圏・米国側の人間には非常に聞き取りずらいらしく、日本人のダメ発音になれてくれている海外勢とコミュニケーションが取れるからと気軽に渡米すると米国の English native に瞬殺される恐れがあるので要注意です(私は渡米直後に English native 勢に全然聞き取ってもらえなくて死にました。
特に米国に居ようがインド人の場合、彼・彼女ら自身が English non native かつアジア圏側の人間なので、インド発音の癖さえ慣れればかなり日本人的にコミュニケーションが取りやすい部類になると思います(渡米しているインド人も当然移民なので、体感の話ですが状況が似てるので相談しやすい良い人が多いです)。
もし米国やイギリスに出張する機会があれば、グローバル側の人間でなくローカル(米国内、イギリス内の意味)の人間とコミュニケーションを取ってみるのをお勧めします。求められる英語の水準が段違いになるのでかなり衝撃を受けると思います。

How to enable Azure Arc command line

Microsoft has offered Azure Arc to manage your Windows and Linux machines hosted outside of Azure, on your corporate network, or other cloud provider consistent with how you manage native Azure virtual machines. Its command lines have been released recently. Please note it's still under preview at 12/6/2020.
Command lines for Azure Arc has not been included into Azure Cli yet, so you need to execute commands below.

az extension add --name connectedmachine

It takes about 30sec, like below, and you can try the commands right after that.
f:id:waritohutsu:20201207000110p:plain

Completely turn off your AKS clusters to reduce your cost!

As you might know, it was not possible to stop your AKS clusters completely because system pools are always required to be running. I have posted about this like below in past.
normalian.hatenablog.com

Here is quite useful feature to reduce AKS cost much effectively than before.
docs.microsoft.com

It should be really easy to follow the article. I have open Azure Portal and try to stop my AKS cluster like below, and it seems to be fine even if you have never registered "extension aks-preview" like below.
f:id:waritohutsu:20201007120040p:plain

You can find your node pools will be 0 nodes on Azure Portal or command lines after you have completed the commands.
f:id:waritohutsu:20201007120440p:plain

Let's utlize Azure Front Door to route requests globally

Azure Front Door is useful feature to manage and monitor your web traffics with global routing. Azure Front Door enables you to manage and optimize your global(multi-regions) customers easily. I believe readers of my blog want to acquire practical knowledge, so let's start to try!

At first, you need to note that Azure Front Door is global resource as you can confirm on Azure Portal below. This means you're no longer to be bothered by regional perspective at least for Azure Front Door.
f:id:waritohutsu:20200705041348p:plain

What's resources we can setup on Azure Front Door?

Azure Front Door can choose various types of resources like below. You are also possible to route requests out of Azure Platform with "Custom Host" and setup FQDNs. In this post, you can acquire knowledge how to use "Storage", "Public IP Address" and "Custom Host"
f:id:waritohutsu:20200705045658p:plain

Setup a sample scenarios

Here is an example architecture which I have setup as a sample for Azure Front Door.
f:id:waritohutsu:20200705050415p:plain

After creating your Azure Front Door instance, choose "Front Door designer" and add your owned domain on Azure Portal like below.
f:id:waritohutsu:20200705050628p:plain

Next, you can add your backend resources on "Backend pools" menu like below.
f:id:waritohutsu:20200705050804p:plain

You can add "Microsoft Cloud Workshop" site like below by setting up as "Custom host".
f:id:waritohutsu:20200705050950p:plain

Finally, you can setup rules how to forward or redirect HTTP/HTTPS requests into backend pools. In this example, all requests match with "/storage01/*" will be forwarded to my Azure Storage account into "/" path. Don't forget to specify as "/storage01/*" not ""/storage01/"
f:id:waritohutsu:20200705051353p:plain

Access a sample with Azure Front Door

You can confirm each request routings like below.
f:id:waritohutsu:20200705052118p:plain

Azure NAT Gateway enables Azure VMs to access internet without assigning Public IP

I guess some folks are not familiar with Azure NAT Gateway because this feature is quite useful but it's a little bit hard to recognize use cases. Here are my idea for Azure NAT Gateway use cases.

  1. Azure VMs, attached with Standard Internal Load Balancer, are required to assign PIP(Public IP) to access internet. Now, your Azure VMs are possible to access internet with Azure NAT Gateway without PIPs
  2. Azure VMs access Global IPs are identified as PIPs but this forces lots of effort to allow accesses from Azure to environments. Now, you can simplify Azure VMs access Global IPs by using Azure NAT Gateway

Of course, there should be much more use cases for Azure NAT Gateway. Please let me such use cases with comments of this blog. Here are architecture diagram for #1 and #2 scenarios.
f:id:waritohutsu:20200702094921p:plain

You can find each Azure VMs will access to internet via Azure NAT Gateway and their global IPs will be identified as PIP assigned to Azure NAT Gateway.

Create and attach Azure NAT Gateway to subnets

Go to Azure Portal and start to create like below. You need to put your Azure NAT Gateway name and choose region here.
f:id:waritohutsu:20200702095935p:plain

Next, choose your PIP to assign Azure NAT Gateway.
f:id:waritohutsu:20200702100019p:plain

Finally, you need to associate this Azure NAT Gateway to your subnets like below.
f:id:waritohutsu:20200702100104p:plain

PIP access via Azure NAT Gateway

Login to WildFlyVM0 having no PIP but 10.3.0.6 as private IP. Next, run "curl 'https://api.ipify.org?format=json'" to confirm global ip like below.
f:id:waritohutsu:20200702100316p:plain

Access Azure VMs individually through Private Link connections

I have posted about Azure Private Link both for "private endpoint" and "private link service". You can acquire knowledge how to exclusively expose your endpoints to your other VNETs and how to utilize such endpoints from your VMs on other VNETs.
normalian.hatenablog.com
This previous post has introduced for load balancing rules but I believe you will need to access specific VMs to take logs, confirm settings or others. Let's talk with an example in this case.

Expose WildFly endpoints with Private Link

I believe as you know, WildFly is one of the most popular Java application servers. WildFly exposes webapps endpoint as 8080 and management endpoints as 9990, so you have to meet requirements like below.

  • Need to setup load balancing rule for webapps endpoint - 8080
  • Need to access VMs individually for management endpoint - 9990

At first you need to enable both "private endpoint" and "private link service" to communicate the VNETs each others. And you can satisfy these requirements with "Load Balancing Rules" and "Inbound NAT Rules" on your Standard Load Balancer like below.
f:id:waritohutsu:20200626104601p:plain
You can put "Load Balancing Rules" for webapps endpoints and put "Inbound NAT Rules" to access each VMs by assigning ports per VM. Don't miss to pass parameters for WildFly, so here is an example to launch WildFly.

/opt/wildfly/bin/standalone.sh -b 0.0.0.0 -bmanagement 0.0.0.0 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

Load Balancing Rules

Create a rule for port 8080 of WildFly like below.
f:id:waritohutsu:20200626105626p:plain

Just specify a port mapping and a backend pool.
f:id:waritohutsu:20200626105653p:plain

You can access WildFly VMs with VNIC IP like below.
f:id:waritohutsu:20200626105932p:plain

Inbound NAT Rules

You need to create rules per VMs
f:id:waritohutsu:20200626105741p:plain

Here is setting for VM1. Please note to setup "Port" as "9991" because you need to mimic this setting for other VMs ex. VM2 is 9992.
f:id:waritohutsu:20200626105955p:plain

You can access each VMs with changing ports like below.
f:id:waritohutsu:20200626110158p:plain

How to expose your endpoints exclusively by using "private endpoint" and "private link service" of Azure Private Link

I believe Azure Private LInk is really essential feature especially for enterprise customers because this feature enables to exclusively expose your Azure PaaS resources and Azure VM resources. At first, we should confirm again that Azure Private Link has two types of features.

  • private link service: Expose endpoints by using Standard Load Balancer. These endpoints will be used by "private endpoint"
  • private endpoint: You can access Azure PaaS Services (for example, Azure Storage and SQL Database) and your endpoints exposed by "private link service" over a private endpoint in your virtual network.

This is a simple architecture with Private Link. Private Link( Private Endpoint and Private Link Service) will create VNICs automatically into VNETs enabled Private Link like below.
f:id:waritohutsu:20200620084516p:plain
Azure resources communicate each others exclusively with the created NICs. In this image, CentOSVM01 on myVNet exposes its endpoints with SLB(Standard Load Balancer) and SLB privately exposes endpoints with Private Link Service, so WinVM01 can access CentOSVM01 by using Private Endpoint.
You can find IP address spaces are overlapped in both VNETs but it works well by using Private Link.

What's benefits?

I believe one of the biggest benefits is you will no longer need to worry about IP addresses overlapping. VNET Peering is also quite useful feature but you have to always note addresses overlapping. You will get error messages below if you will try to connect overlapped VNETs.
f:id:waritohutsu:20200620065347p:plain

Try "private link service"

You can create your "private link service" just following an article below. Please note to use "Standard Load Balancer". In addition that, you have to choose "Internal" Load Balancer to expose your endpoints exclusively.
Quickstart - Create a Private Link service by using the Azure portal | Microsoft Docs

Go to Private Link Center page on Azure Portal and Click "Create private link service" below.
f:id:waritohutsu:20200620070858p:plain

You can find only Standard Load from this menu and setup each items properly by following wizards.
f:id:waritohutsu:20200620071413p:plain

Finally, you can confirm the result like here.
f:id:waritohutsu:20200620071557p:plain

Try "private endpoint"

It's easy to enable "private endpoint" for Azure PaaS features but we have to utilize command lines for your "private link service" endpoints. Here is sample and also refer to az network private-endpoint | Microsoft Docs.

az login
az account set -s "your subscription ID"
az network private-endpoint create \
 --resource-group "resource group name having a vnet to connet your endpoints" \
 --name "name of private endpoint" \
 --vnet-name "vnet name to connet your endpoints" \
 --subnet "subnet name of the vnet" \
 --private-connection-resource-id "/subscriptions/your subscription name/resourceGroups/your resource group name/providers/Microsoft.Network/privateLinkServices/your endpointname" 
 --connection-name "Name of the private link service connection"\
 --location "region ex. westus"

You can confirm your private endpoint like below if the command works well.
f:id:waritohutsu:20200620081627p:plain
f:id:waritohutsu:20200620081636p:plain

Access via Private Endpoint

Access to Windows VM by using Remote Desktop at first. And access CentOSVM01 with private IP like below.
f:id:waritohutsu:20200620085034p:plain

It's also possible to utilize Azure Private DNS, so you can access as internal FQDN.
f:id:waritohutsu:20200620085211p:plain