GAミント至上主義

Web Monomaniacal Developer.

大規模開発って何が大規模なのか

私はいわゆるSIerで働いた経験が無いけど、開発の話で大規模開発とか、求人で大規模経験など、「大規模」という言葉をよく耳にする。

何が大規模なのか少し考えてみた。

○ 機能の数

bizoceanではフレームワークにSymfony2を使っているけど、これも他のPHPフレームと比較するとYahooとか大規模向けだと言われる。

たしかフォルダもファイル数も設定やたら数が多くて、その分ルールも多い。(残念ながら私はほとんど理解していない)。

それは、大量の機能(という括りが正しいのかは分からない)、ページがあるアプリケーション向けに必要なのだろう。細かく別れていたほうが再利用出来る可能性が上がったり、他の機能との衝突を防ぐことが出来るからだろう

フレームワークとして大規模はしっくりくる。

けど最近流行りのマイクロサービス的に、それぞれの機能を細かく作る案件となると、それは大規模なのだろうか。全体としては大規模だけど、大規模開発か?と言われるとしっくりこない。

マイクロサービスだと依存関係が少ないから、大規模って感じがしないのか?

◎ 関わる人数の数

よく銀行系で何万人月とか想像できない表現を聞くけど、これは大規模って言われてしっくりくる。

大手銀行であれば、開発者だけでなく利用するユーザーも相当な数になるし、上で書いたような依存関係も多くなる。

変な人が紛れ込んでも大丈夫なようにJavaのような言語を使うイメージがある。


☓ ユーザーの数

これだけでは大規模とはいえない気がする。

例えばSnapchatは1億人以上のユーザーがいるけど、もしこの開発案件があったとして、大規模案件だと表現するだろうか。私のイメージではしっくりこない。

Job Application for Software Engineer at Snap Inc.

求人をGoogle翻訳にかけてみたけど大規模っぽい表現はなかった。

コンピュータサイエンスまたは同等の経験などの技術分野のBS / BA
本当に良いソフトウェアエンジニア
厳しい技術的課題に興奮している人
学ぶのを愛し、他者を助けることに情熱を持っている人
バイルアプリやデータベースの経験
ミズ。コンピュータサイエンスまたは関連分野の学位が望ましい
他の人と協力し合うことができる人
3年以上のソフトウェアエンジニアリング経験が望ましい
分散システムでの作業経験が望ましい
Snap Inc.製品のための情熱!

Docker+Kubernetesの使用メモリ確認方法

メモリ使用量は起動できるコンテナ数、費用にも関わってくるので大事。確認方法をまとめます。

Docker

docker statsコマンドで確認できる

$ sudo docker stats {CONTAINER ID}

こんな感じで表示される

CONTAINER           CPU %               MEM USAGE / LIMIT     MEM %               NET I/O               BLOCK I/O           PIDS
dcbab3454104        0.00%               17.77 MB / 33.64 GB   0.05%               37.83 MB / 6.387 MB   0 B / 0 B           1

CONTAINER IDは

$ sudo docker ps

で確認できる。

% docker ps
CONTAINER ID        IMAGE                                            COMMAND                  CREATED             STATUS              PORTS                                      NAMES
dcbab3454104        asia.gcr.io/oceanus-dev/table-manager:latest     "python3.5 table-mana"   38 minutes ago      Up 38 minutes                                                  jovial_cray


何度も止めたり起動したりをしてるときは、いちいちIDを確認するのは手間なので下記のようにdocker psをイメージ名などでフィルターした結果を使うと便利。
-qをつけることで、IDのみ返してくれる。

docs.docker.com


シェルスクリプト化で更に便利。

$ sudo docker stats `sudo docker ps -f ancestor={イメージ名} -q`

Kubernetes

Google Container Engineで使ってます。

$ kubectl top pod

こんな感じででる

NAME                             CPU(cores)   MEMORY(bytes)
arms-2374624802-s8tx6            21m          44Mi
table-manager-1546569972-4lv46   59m          16Mi
arms-2374624802-5vd0l            21m          45Mi
arms-2374624802-8j8wx            20m          45Mi
r2bq-1043652369-7smpb            39m          36Mi
redis-pd-1996650620-p1o6f        4m           53Mi
revelation-2254162989-l893m      4m           37Mi

ローカルのDocker EngineとKubernetesは、うちの場合、メモリ使用量はほぼ一緒なので、チューニングのときはローカルでのテストでも十分そう。


Google翻訳はチョムスキーの生成文法を作り出したのか

jp.techcrunch.com

コンピューターは、言語間の翻訳に自分が用いる概念(共有される意味概念)を表現する独自の内部的言語を開発したのではないのか? 

この記事を読んで、生成文法を思い浮かべた。

詳しくは下記参照だけど、私が大学で一番印象に残ってる理論。

生成文法 - Wikipedia

kotobank.jp

個人的な解釈として、人間の脳には「言語を作成、理解する基本的なルール」が存在する、という理論だと思っている。

なぜそのような考えにたどり着くかというと下記のような論拠。

・言語は完全に後天的な学習によるものではない
(並び順は言語によってことなるけど、主語、述語などの基本的なルールは全く交流がない地域でも共通性がある。それは脳にあるのではないか。)

・人間は未知の文章を作成したり、理解することができる
当たり前だけど、新しい小説、ニュースを読む際は、これまで見たことのない文章に出くわしてるけど、みんな問題なく理解できる。また、今私は文章を書いてるけど、これも今まで書いたことのない文章だ。これは記憶や学習によるものだけでなく、何か基本的なルールがあり、それに沿って理解や創作していると考えた方が自然である)


この生成文法は存在するとは言われていたけど今までだれも明文化したり、機械で再現することはできてなかったと思う。

しかし、上記記事の言語にとらわれない真ん中にある何かは、私の浅い知識では、生成文法そのものに見えた。

f:id:uyamazak:20161124105252p:plain

この研究開発が進めば、機械が人間と同じように文章を理解し、また書くこともできるようになりそうだ。

生成文法の企て (岩波現代文庫)

生成文法の企て (岩波現代文庫)

新・自然科学としての言語学―生成文法とは何か (ちくま学芸文庫)

新・自然科学としての言語学―生成文法とは何か (ちくま学芸文庫)