はてなキーワード: 機械語とは
https://b.hatena.ne.jp/entry/s/jp.quora.com/hotondo-no-puroguramingu-gengo-de-kansuu-no-return-ga-1-tsu-shika-deki-nai-no-ha-naze-desu-ka を呼んだんだけど、回答・ブコメともにとんでもないことを書いている人がたくさんいてびっくりした。本質的に多値返しは直積型の返しと同じで、これはタプル・構造体と本質的に同じ、というのは多くの人が指摘している通りではあるのだが…。
動的型付け言語に慣れてらっしゃる方が多いのかもしれないけれど、配列というのは「同じ型をまとめた型」であるべき。動的型でいろいろ突っ込める配列は本質的には「直和型の配列」と思った方がいいよね。多値返しという意味では(記憶領域の面で)余分なコストがかかりうる直和型を選択する意味はないですよね?回答でもなんか配列返しに言及している某有名人がいたが、あれれ?という感じ。
もっとも、immutableな配列をtupleと呼ぶPythonという言語があるせいで引っ張られている感は否めないけども、配列とは本質的に異なる型が存在しているのは明らかですよね?配列と構造体って違うよね…?(言葉の定義の問題と言われそうだけれど、型システムの分野での言葉の定義は存在しているわけで、反論になっているとは思えない。『俺は明日からこのわんわんなく動物をネコと呼ぶから』と言っているようなもんでは。)
確かにナイーブにはレジスタに入れて返すのが素直だというのは同意するけど、でもそれ構造体と一緒だよね?昔のCではこれはできなかったというのは知らなかったので勉強にはなりました(未検証だけど)。
あと構造体返しの関数がどう機械語で実装されているのか知らなさそうな人がいるのにはちょっとびっくり。それでなんでレジスタがどうとか言えちゃうのかしら。構造体の値を返す関数ならばポインタは返さないですよ。そのポインタはどこを指してるんですか。実装しづらいとか何とか言ってる人たち、ちゃんとアセンブラ読んだことあるんですか…?本質的に何の困難もないです(ちなみに少なくともlinux amd64ではスタックに領域を確保してそのポインタを関数の引数の一部として渡します。まあヒープに置く場合でも余計なmoveが出ないようにしたいとかあるかもだけど、そんなでかいデータは普通無名構造体では扱わないでしょう)。
確かに、返り値の型が(A, A)のような場合はドキュメント読まないとわからなくなってしまうので可読性が下がるし構造体を使うべしというのは(ほぼすべての場合において)同意(多値は使いづらいというのは構造体は使いづらいという意味ではないですよね?)。でもさ、某有名人もgoで挙げているけれど多値って普通(A, B)みたいに違う型の値を返したくなることの方が多くないですか。この場合どっちがどっちかは自明だよね?ただの無名構造体だよ。多値返しは設計が甘いとかわけわからんことを言っている人もいたけれど、なんかこちらが不安になってきた。
…本当に意味不明で驚いた。id:megumin1氏が言っているように、tupleのパック・アンパックに余分なコストをかける必要はない(まあアドレス渡しになるから複数本のレジスタで返すのと比べたら余分なmovが入りうるという話はあるけど、この人が多値返しというので何を想定しているかわからないので何とも。)。何遍呼んでも多値返しとtuple返しの違いが判らなかった。おそらく前述のようにimmutableなlistのことをtupleと思っているのかな?と予想はするが…。
はてな界隈ってエンジニア的な印象があったんだけど、ここら辺の話ってそんななじみないのかな…?てか某有名人氏も型システムとかあんまりご存じないのかな…?むしろこれは増田が無知なんだろうか…?
そうだそうだー8801mkIIに機械語で~ってそんなわけあるか~バシィ
僕はアメリカの大学でComputer Scienceをundergraduateで専攻しています。
大学自体のレベルはTOEFLスコアが80あれば入れるぐらいです。
今は2年次ですが各学期に専攻のクラスを一つ以上取っている状況です。
基礎教養に当たるクラスが60単位ほどあるのでそれと並行して進めています。
中学高校とまともに学校へ通わずに、だけど高校は通信制だったので欠席分の課題を何とか終わらせ無事に卒業しました。
大学は担任に勧められるまFランに入ったのですが友達も作れず一年も続かずに退学しました。
それからフリーターしながらダラダラと生活していて、二十歳を迎えます。
高校の友達や担任とその辺りのタイミングで再開した時に自分の人生の方向性を深く考えられました。
唯一英語だけは人生のいろんな場面で触れる機会があり、それを活かしたいとも考え留学に決めました。
両親に掛ける負担は一般的な学生に比べて半端ないと思いますし、それは一生を通しても清算できません。
なのでせめて、失敗だけは絶対にしないという心構えで取り組んでいます。
話を戻します。
入学当時プログラミングに関して、僕はスッキリわかるjava入門を通読した程度で、他の知識は皆無でした。
今まで取ったコンピューターの基礎クラス2つはjavaが主で、試験は選択+プログラミング問題(これは10行に満たない簡単なもの)でした。
もう一つのソフトウェア開発はc++を用いて、後はlinuxの基本的なsyntaxを覚えました。
基本的にどの講義で習うこともネットで調べれば(geeksforgeeksなど)独学は可能で、
特に日本人なら良い日本語の書籍に恵まれているので学費のコストを考えたらUdemyでかなり節約できるだろうなと思いました。
それ以外の雑多なクラス(日本の基礎教養のカリキュラムはあまり分からないのですが、歴史や生物学、英語と理系文系関係なく取らされます。)
も新しい知識を得られる意味では楽しいと思えるのですが、それが大学を出た後にどう自分を助けてくれるのかは想像できません。
Computer Science自体のカリキュラムをざっと眺めると高水準言語からアセンブリなどの機械語に近いものを必須クラスで学び、
後はOSや機械学習、プログラミン言語のprinciples、など選択で取る流れになっています。
これはどの講義でも言える事だと思うのですが、1セメスターで一つの内容に対する深い理解を得るのって時間的に厳しい所があります。
上辺の理解でも試験対策さえすればAを取るのはそう難しくなく、そのまま次の学期に移行してしまいます。
僕が懸念しているのは、このまま卒業すると間違いなくただのジェネラリストになってしまうんじゃないかって事です。
自由時間を使って書籍なりUdemyなりで技術を身に付けるのが最善策ですが、要領よく課題と並行してやるのは難しいです。
まだコンピューターに対する理解が浅く、注力したい分野を定められていないのも不安を抱く要素なのだと理解しています。
https://teratail.com/questions/163664
レベル1:組み込み関数のソースがOSのAPIをどうやって呼び出しているかの仕組み
レベル2:OSは実際のPCにどのようにそれを処理させているかの仕組み
レベル4:AND回路などをどう組み合わせて計算ができるCPUになるのかの仕組み
レベル5:AND回路などはどういう電子部品の組み合わせで出来ているの仕組み
レベル6:電子部品はどういう物質でその電子特性を得ているのかの仕組み
レベル7:なぜその物質が電子回路を作れるような特性を持っているのかの仕組み
レベル8:この宇宙の物理定数はなぜ今のようになっているの仕組み
レベル9:なぜ何もないのではなく何かがあるのかの仕組み
意味不明なものが多いし何かとケチつけないと気がすまない性格だから面倒なことを一々と
直接のユーザからの意見なら多少は変でもそのユーザが必要としてるなら納得できるし、イライラすることもない
社内でそんなことこだわったところで実際には気にされないことが多いのにだ
まだデザイナーがデザインについてこうした方がUXがいいねみたいなことをいうならわかる
専門の人の意見だし
そうでもないのに何かと文句をつけてくる
CSS すらまともに使いこなせずマージンもパディングもないような酷い作りのものしか作らないのにソッチのほうが良いという
色は red, green, yellow と標準のペイントのデフォルトカラーかよというような色を指定してくる
#fcfcfc や #0a0a0a なんて使おうものなら白と黒にしろと
max-width を指定せずに画面の端から端まであるようなものがいいという
今の時代のアプリやサービスを全く見てないのか?としか言えないようなセンスだ
自社サービスなんて手を出したらこれは酷いと話題になりそうなものだ
見た目にあまりこだわれない社内用サービスしか作ってないからと言って、その他サービスをみてる人からすれば明らかに
しかもデザインに限ったことではないがまだ序盤の時点で言っておけばいいものの完成後にいまから変えるなんて難しいのが
わかりきってるようなときになってからああしろこうしろ言い出す
先に書いたようにユーザの要望ならまだ仕方ないと言えるがなぜこんな無意味なことに付き合わなければならないのか
わりと自分が完璧主義なところもあるので作るならちゃんと作ろうとしてるんだが
こういうのを相手にしないといけないせいで結局グチャグチャになってくる
色のバランスやレイアウトを考えたところで一瞬でそのバランスが無意味になるようなことになる
プログラム側だって全然関係ないものを無理やり入れ込まないといけないようなことになることも多い
疎結合だとかグローバルをつかわないとかそういう作りやすくするためのことをしていても
それが維持できないような無茶で無意味な指示が出る
根本的に変えたり対処するためのものを作るとかすればなんとかできなくはない
過去のプロジェクトでもそういうのが多いから自分で作るのくらいは扱いやすくしたいと考えていたのだが
過去に言われたものだと速度を優先だとか言って自分で作ったものよりは遅くするなと言う
しかしながら関数は使わずコピペだわforeachなどは使わずループ変数を使って地道にやるなどメンテナンスが
できる気がしないが速度においては早いと言えるものだ
当たり前のようにグローバル変数がいっぱいあるしライブラリの使用箇所はカスタマイズするための仕組みがあるのに
便利で読みやすいような書き方だと速度的にはそれに劣る
だがわざわざそんな扱いづらいし見づらいコードは書きたくない
そんなに速度にこだわるなら勝手に一人で機械語でも書いてろよって思う
どちらか取捨選択すべきものなのに両方みたせとか無理なことを言う
ちなみに便利なライブラリは基本無駄が多い遅いものだからライブラリ頼みのベンダはクソだとか
能力がないだとか言っていた
そういえば昔先輩社員と仕事したときには変に凝ったものとか必要以上に作り込んだりはしないほうがいいとか
言っていてそれなりに手抜きでさらっと一応は動くようなものを作っていた
私はそういうやり方が嫌いだったのだが今ではこういう環境に長くいた結果仕事のものにこだわって作り込んでも無駄
ということがわかってそうなったのかなと感じた
自分でもサビ残や休日に無償出勤してまでいいものにしようと努力はしていたが謎の指摘に合わせていると
愛着もなくなってきたし後は適当に済ませてしまおうかなという気持ちだ
ちゃんとした自分なりの完璧なものを作ろうとするなら仕事ではなく趣味で作ってるツールやライブラリで
やればいいかと思う
作ったもの次第でユーザが集まる自社のウェブサービスやパッケージの商品やゲームなどは作り込む方が
良いと思うが先に値段が決まって受注して作るようなものだと最低限の要望さえ満たしていればあとは
どうでもいい
むしろ不便な方が改修依頼が来て稼げる
さらには綺麗で完璧な作りで大抵の想定できる改修は1日とかからないようなものに仕上げるよりも
どこ変えればいいかや影響範囲すらわからないくらいモノのほうが実作業時間が多いのでそれだけ請求できる
先に作り込むメリットがない
ストレスが溜まってきたので発散がてら書いてみたけど疲れてるのかわりと分かりづらい文章になった
けどまぁいいか
そろそろ転職でもしたいなーと考え始めた
本格的にプログラミングを始めとしてコンピュータ科学を学び始めたのは大学に入学してからです.
今では幸運なことにインターンで都内のベンチャー企業でgolangやpython, scalaを用いた大規模なシステム構築に携わっています.
お給料も日本の大学生にしては破格といえるのではないでしょうか. それも大学で真面目に勉強したお陰であると胸を張って言えます.
大学の方の卒業研究では組み込み系のセキュリティに関して研究しています. 正直テーマ選びに失敗したなと思っているので大学院にいったらシステムプログラミング系の方にシフトしようと思っています.
私が大学の授業で初めて習ったプログラミング言語はC言語でした. 理由を教授に聞くと, 並行して座学で教えるコンピュータ科学系の専門授業全般と結びつけやすいからだそうです.
最近のTwitterやQiita, StackOverflowなどでは「初学者が最初に学ぶべきプログラミング言語はなに?」という質問に対して, JavaScriptやPythonから入るのがベストだと言う人を沢山見かけます.
JavaScriptはブラウザというものが有る限り20年は消えなさそうですし, Pythonは機械学習を始め, Webシステムでも使え, 非常にクレバーな言語です.
javaもオススメだと思います. 30億?ものデバイスで動く言語ですしドキュメントも豊富です. 色々な分野にも応用が効くでしょう.
さて, そんな中でC言語という悪い評判しか聞かない, でもやたら色々なところで使われているらしい言語を最初に学ぶメリットとは一体なんなのでしょう.
一つ, 私が思いついたのはコンピュータと仲良くなれる.
というのもC言語はアセンブリや機械語に比べれば, 人間にわかりやすく, かつコンピュータ側にも近いという顔をもちます.
真面目にプログラミングしようとするとどうしてもそのコンピュータの仕組み(主にメモリ) について学ぶ必要が出てきます. これらの知識が現代の開発に置いて役立つ分野比較的限られると思います.
しかし, それらは思わぬバグの特定や意図していない動作の改善に役立つことがあるかもしれません(実際に私もいくつか出会いました)
二つ目は他の言語を学ぶ時のハードルが非常に低くなる. これはどの言語を学んでも同じだとは思います.
そして, 他の言語の高級な機能に思わず涙ぐみながら感謝すること間違いなしでしょう(javaのsplitとか他の言語にもあるHashとか)
ただ, 私はC言語の構造体やポインタのお陰でオブジェクト指向プログラム言語を低レイヤな実装的な面と概念的な面ですんなりと理解することができました.
そしてよく挫折ポイントとなるポインタ(ダジャレじゃないですよ?). これもメモリの住所だと考えればそれほど難しくはないのです.
メモリの管理を適切に設計した時あなたのプログラムはボルト並みに早く走ってくれるかもしれません.
他の言語では味わえないやりがいがあるのもこの言語の魅力でしょう.
書いているとこれぐらいしか思いつきませんでした.
それでもコンソールに初めて Hello World! が出力された時の感動はやはり忘れられません.
昨今, 高機能な言語が沢山ありますが, あなたのプログラミング生活にささやかなアクセントとしてC言語を学び直してみてはいかがでしょうか?
きっと今使っている言語に普段言わない感謝の言葉を述べること間違いなしです.
生まれたから指が少なかったわけだが、小学生の頃までは気にならなかった。
確かに周りのみんなと違って、指が少なくて気になってはいたが、いじめとかは特になかった。
算数の時間は、なんか苦手だとは思っていた。他のみんなは、なぜあんなに早く数を数えられるのだろうと。
だけど歴史の授業が始まり、5F0年ほど前に人類が5本指から8本指に進化したことで情報技術の革新が起きたことを知った時から、生き辛い人生が始まった。
健常者は両手合わせて指が10本あるから、自然にプログラミング言語や機械言語を理解できるらしいけど、
俺は両手合わせてA本しかないから、数字のセンスというか、感覚が、健常者に比べて劣っている。
日常生活で数字に触れるのは問題ないんだけど、主流の機械語のコードリーディングに対しては、致命的だ。
プログラミング教育が高度に発達したおかげで、誰もがプログラミングができて、できないと社会に出られない世の中だけど、
機械語の直感的な理解ができないので、できる仕事がほとんどない。
昔はA進数だったし、プログラミングができなくても生きていける時代だったらしいが、その時代に生まれたかった。
突然変異で生まれた8本指の人間が情報技術の革新を起こし続け、結果的に5本指の人類は自然淘汰されてしまったが。
一応、発達障害として認定されているので、月にB3万ほど国から支給されているのでなんとか生きていける。
コンピュータ言語って世の中に山ほどあるけれど、それぞれの言語ごとに特徴がある(特徴のない言語は廃れていく)。
あまり言語に詳しくない人相手に、俺の考えるそれぞれの言語の特徴を書いてみようと思う。
なお、取り上げるのはある程度広く使われている言語に限りたいと思う。
言語名 | 概要 |
---|---|
C言語 | 高速動作するバイナリ生成を目的としたコンパイル言語。だいたいどんな環境でも使えるがバグ出やすい |
C++ | マニアック言語、高速、習得大変 |
Java | サーバで高速かつ安定に動作するコンパイル言語、大規模でよく使われる |
C# | 主にWindowsクライアント用のバイナリ生成に使われるコンパイル言語 |
Perl | 広く使われていたが今は若干時代遅れのスプリクト言語。汚い |
Python | Perlにかわって主流になりつつあるスクリプト言語。綺麗 |
PHP | Web開発にフォーカスされたスクリプト言語。一世を風靡した。 |
Ruby | とても綺麗なスクリプト言語 |
JavaScript | ブラウザで実行出来る唯一の言語。言語自体はいまいちだが、ブラウザの事情で需要あり |
Go | サーバサイドで安全かつ高速動作するバイナリ生成を目的としたコンパイル言語 |
メモリに直接アクセスして書き換えるといったコンピュータの機械語に近い言語構文を持つため、高速な処理が可能な言語。
コンパイラの歴史も古く環境も整っており、組み込み系などを含むほぼ全ての環境で利用可能な万能言語。
一方で、メモリの確保や解放といった基本的なことも自前で処理する必要があるため、コーディングの効率が良くなく、多種多様のバグを生みやすい側面も持つ。
ある程度以上のエンジニアであれば常識として知っておきたい言語だが、初めて覚える言語としてはあまり適当ではない。
C言語にオブジェクト指向を導入した言語。C++言語とはあまり呼ばれず、しーぷらすぷらす、もしくは略してしーぷらぷら、しーたすたす、などと呼ばれる。
C言語の速度を維持したままオブジェクト指向やテンプレートなどの効率的な記述を可能にしようとした意気は真っ当だったのだが、
当時最先端だった色々な技術や思想を叩き込んだおかげで、あり得ないほど複雑化した言語としても有名。
「C++を理解しています」という人はほぼ初級者で、本当に理解していくほど「C++には自信がありません」となっていく。
速度を追求する分野では良く使われている。完全に理解するのは難しいとしても、テンプレートくらいまでは理解しておくと仕事上なんとかなる…かもしれない。
サーバサイドで安全にコードを実行する目的でよく使われる言語。長い歴史を持っており、比較的高速に動作する。
当時は画期的だった「バーチャルマシン」や「ガベージコレクション」という機構を備え、CやC++でよく問題になるメモリの解放忘れというバグを生まず、
サーバサイドなどで何千時間と動作するソフトウェアに適した言語として受け入れられた。
必然的にエンタープライズ用途で利用されることが多く、各種ツールなども豊富。人海戦術がしやすい言語という側面も出てきた。
一方でブラウザにHello Worldを出すだけでも大変な労力を必要とするので、スタートアップなどではあまり使われない。
ガラケーのアプリや(ちょっと違うが)Androidなど、クライアントサイドでも使われることがある。
プログラミング言語で最初にJavaを覚えるという人は結構多いが、仕事としてJavaを使うのは大抵SI系の業務になり、なかなか辛い労働を強いられる可能性が高い。
クライアントサイドで安全にコードを実行する目的でよく使われる言語。こちらも比較的高速に動作する。
元々はWindowsのクライアント用の言語であり、Javaとは違ってクライアント向きのAPIが多数ある。
マイクロソフトが開発した言語ということもあり、マイクロソフトの優れた開発環境が利用出来るので開発効率は非常に高い。
Unityなどでも利用可能であるが、基本的にはクライアントの実行形式ファイルを生成する目的が大きく、サーバサイドではあまり使われない。
自作のゲーム開発をしたいのであればうってつけの言語。初めて覚える言語としても十分に良いだろうが、C#を使う仕事は近年無くなりつつある。
ほぼ全てのLinux系ディストリビューションに含まれており、ツールや様々な用途で使われていた。
上に紹介したC、C++、Java、C#のようなコンパイル言語とは違い、(少し語弊はあるが)1行ずつ実行してエラーがあれば止まるスクリプト言語である。
ちょっと開発してすぐに実行ということが出来るのと、コマンドラインでワンラインのコードを読み込ませてちょっとした処理が出来るなど応用範囲の広い言語である。
20年近く前にWebでCGIが普及した時には、ほぼどのようなサーバ環境でも実行可能だったこともあり、Perlを使うことが極めて多かった。
しかし、主に読みづらい言語仕様のせいで、近年新規ではほとんど使われなくなった。既存のコードもどんどん別の言語に置き換えられていることが多い。
日本の大手Web企業の一部が使っているので、そこに就職するために覚えるのもアリっちゃアリだけど、今からPerlをわざわざ覚えるのは強くオススメしない。
後発のスプリクト言語。こちらもほぼ全てのLinux系ディストリビューションに含まれており、それゆえに広く使われている。
インデントまで言語仕様で規定することで、誰が書いても読みやすいコードになるように考えられている言語である。
Perlの代わりに使われることが増えていて、周辺ツールなども充実しており、小規模から大規模までカバーする勢いがある。
ただ、Python2とPython3のバージョン間での非互換性があまり綺麗に設計されていなかったため、そこで混乱を招いていたこともあった。
最近だとマシンラーニング系のライブラリでPythonが使われていたり、海外ではPerlに代わる言語として受け入れられつつある。
Web開発に特化したスクリプト言語。CGIの代わりに使われ始め、一世を風靡した。
以前CGIでWebに何かを表示するには比較的大変な労力を割かなければいけなかったのが、PHPを使うと誰でも即座にWeb開発が出来たので爆発的に普及した。
またphp.netの豊富なドキュメント&スニペットのおかげもあり、開発初期の効率が大変に良い言語である。
残念なことに、言語やAPIの設計がいけていない点が多く、一部の人からは蛇蝎の如く嫌われている。
今でも根強い人気があり、海外でも小規模プロジェクトの最初の開発にPHPを選ぶのは比較的よくある選択肢であるようだ。
Webアプリを開発をしたいという明確な目的を持つ人が、最初に学ぶ言語としてPHPを選ぶのは理にかなっていると思う。
なおこの言語を本気でディスってる人は大体視野の狭いエンジニアであることが多いので、地雷エンジニアを見分けるのにも役立つ。
綺麗なスクリプト言語。日本発で世界的に普及している数少ないIT技術の一つ。
言語仕様が美しく、それゆえにファンが多い。Ruby on RailsというWeb用フレームワークの登場で、Webアプリでの採用例も一気に増えている。
基本的には他のスクリプト言語と同じくサーバサイドでのプログラミングに用いられることがほとんどである。
スクリプト言語で何かを作成するのであれば、Rubyを選んでおけばそう失敗することはない万能言語。
サーバサイドで何かすることに興味を持っているならば、最初に覚える言語としてはとてもオススメ出来る。
一方で、なぜかRubyが採用するWeb側のフレームワーク(具体的にはprototype.jsやCoffeeScript)はいつもクソなので、そちらは深入りしないのが吉。
ブラウザで動くスプリクト言語。ブラウザ戦争が勃発していた18年前、奇跡のようなめぐり合わせでベンダー間の合意が取れ実装された言語。
言語としてはプロトタイプベースのオブジェクト指向という少しめずらしい形式を取っているが、実際にはあまりその特徴は利用されていない。
言語仕様がイマイチで、大変バグを生みやすい言語であり、また関数のスタックが深くなる特性もあり、あまり積極的に使うべき言語ではないが
ブラウザで動く言語が現在これしかないので、大きなシェアを持っている。
一部の物好きがサーバサイドでこの言語を使おうと(主にnode.jsで)四苦八苦している(とはいえ、1つの言語でWebとサーバが完結するのは大きなメリットだ)。
ブラウザで動く唯一の言語のくせにとにかく書くのが面倒ということもあり、多数のAltJSと呼ばれるJavaScriptに変換される別言語を生み出されている。
まあJavaScript本体人が手で書く言語ではない…というのがECMAScript5までの印象だったが、新しい規格が順次導入されており、今後に期待。
Web業界で生きていくならば、好むと好まざるとにかかわらず覚えなければいけない言語である。
最初に覚える言語としては、ブラウザ上でゲームなども作れるし、node.jsでサーバサイドもできるしで、意外とオススメだったりする。
C、C++やJavaと同じでコンパイル言語。サーバサイドで高速かつ安定なバイナリを出力することを目的とされ設計されたGoogle発の言語。
その目的においてはかなり高性能を誇るので、特に速度を要求されるサーバサイドでのプロジェクトでは導入が進んでいる。
それ以外の目的ではあまりこの言語を採用するメリットはないが、ニッチな用途をピンポイントで抑えており、これから広く利用されることも期待される。
コミュニティも活発であり、初めて言語を覚える人が参入すれば喜ばれるだろう。言語としても美しい言語なので、サーバ系のプログラムに興味があればオススメである。
繰り返しだけれど、それぞれの言語ごとに特徴があり、特徴のない言語は廃れていく。
ここに挙げた言語は何らかの特徴があり、何らかの用途で必要なので生き残っている。
その背景を知った上で、ここにある言語は全部ある程度読み書きが出来るようになると素晴らしいと思う。
いくら仕様がアップデートされたって、生JSでDOM弄るのjQueryで弄るより辛いでしょ?
機械語を人間にわかりやす書くためにアセンブラがあるのと、生JSでDOM弄るの"人間にわかりやすくするためにjQueryがあるのって、似てない?
個人的な考えは以下の通り。
そもそもコンポーネント指向のライブラリだから、チュートリアルからして構造化を基本において書かれてるのが入門用にこそ適していると思う。
だって、初心者の頃jQueryで場当たり的にコード追加していって九龍城みたいになったこと、あるでしょ?
もちろん自分で間違いを犯してその痛みを知るってのも方法論としてはありかもしれんけど、
DOM操作を抽象化したライブラリから入って、徐々に具体的なところに落とし込んでいくのが効率的じゃない?
ライブラリ自体が構造化を念頭に置いてるから、自然とパーツごとに作るようになって、
その次の段階として自分の作ったパーツの再利用を考えられると思う。
jQueryってホントに何でも出来るからキチンと扱える技術を既に持ってる人には良いだろうけど
しかもその振れ幅が広くて、どの方法論もそれなりに意味がある場合が多い。
正解が沢山ある問題をいきなり解かせるんじゃなくて、
まずは答えがある程度決まってる問題から入って、徐々に馴らしていくべき。
ある程度経験を積んだプログラマーこそが手を出すべきと言うか。
どんなに抽象化が高度になっても、裏でやってるのはDOMの直接操作なんだから。
でも、大事な基礎技術だからといって、それだけで済ませて技術の革新を放棄するべきではないでしょ
むしろ、抽象化の高いところから入門して、基礎技術に触れる必要が出来てから触った方が理解が早いと思う。
と、私は考えます。
「富士通を退職した話」を読んで、20年近く努めている側からの感想と疑問について書いてみたいと思います。
私も、情報科学を大学時代専攻した後、新人で山奥というかむしろ雲の上にある天空の工場に勤務してメインフレーム関連の仕事をしていました。
その工場に配属される新人は(希望すれば)寮に入るわけですが、高専卒は工場の敷地内にある山頂の寮で二人部屋、学士卒は山の5合目にあるアパートの一人部屋、修士とドクターは街中にあるマンションという感じでした。
街中の下界から工場がある天上界への通勤はバスで移動することになるのですが、わたしは、バスのディーゼルエンジンの排気ガスが苦手なので、頼み込んで工場の敷地内にある寮にしてほしいと願い出て、山頂の寮に特別に入れてもらいました。そもそもが2人で一部屋なのですが、学歴の関係か私は一人で2人部屋を使わせてもらっていたため、ものすごく広々と部屋が使えました。
わりと頼み込めば、人事や勤労も柔軟に対応してくれる会社という印象です。
20年前でさえ、メインフレームは古いというイメージがありました。
ただ、私は古臭い部署に配属されたことは不幸とは思いませんでした。電話からスーパーコンピュータまで幅広く扱っている世界でも稀な会社に入ったからには、いろんなことを経験してみたい。
そのためには、そろそろ絶滅してしまいそうなメインフレームを今経験せずにいつ経験出来るのか?くらいな感じでむしろラッキーくらいに考えていました。
最新の流行を追いかけるのもそれはそれで面白いが、そういったものは出来合いのライブラリを組み合わせて流行を少し遅れて追っていく2位集団であるし、やりたければ個人で家でも出来るじゃないか程度の感覚です。
ただ、せっかくメインフレームの部署に来たのですが、私の担当はワークステーションで動作するUNIXやPCでの開発が主体でした。
そもそもが、メインフレームを扱っていた部署ですから、先輩の人達はあまりUNIXやPCに詳しくなかったので、大学でUNIXやPCを経験した新人が入ってきたことは非常に重宝されました。
その部署では開発言語は、社内の独自の言語(Cよりもさらに機械語に近い言語をマウスでグラフィカルに操作してコーディングする言語)を使っていました。もともとはメインフレーム用の言語なのですが、UNIXワークステーションやPC用にも
その言語コンパイラはあり、あわやその言語でUNIXの開発する羽目になりそうだったのですが、私は猛烈に反対して自分の意見を通しました。当時はJavaやRubyなどの言語は無くCが全盛でしたが、
その部署の開発メンバーはCをほとんど知らなかったのです。そこで、社内のカイゼン活動として、C言語の勉強会を開くことを提案し私が講師になってC言語をメンバーに習得してもらい、
PCやUNIXでの開発は独自言語ではなくC言語を利用することを認めさせました。
元の増田の方は、自分はエクセルのVBAソースが見れない立場のようだと言っていましたが、ソースをみようとしたらシートにロックがかかっていたのを見て諦めてしまったのではないでしょうか?
元のEXCELを使った業務が非効率であるならば、業務の改善活動として提案すれば、それを拒む上司というのはちょっと考えにくいです。
忙しい部署にも、改善活動のノルマが課せられるのですが、先輩はそういったことに関わっている時間が中々取れないので新人がそういった仕事をやると宣言しても拒むのはまずありえません。
下請けのプログラマーからみると富士通のような会社は中間搾取していて高給をとっているのに、仕事は丸投げという印象があるでしょうが、実際やってみると案外大変です。
私は、富士通本社のSE的な立場、グループ孫会社に出向して、そこから顧客先に派遣される4次受け5次受けのプログラマ両方を経験しましたが、はっきりと下請けの方が精神的に楽と感じました。
客商売や、自分でやっているわけではない人に依頼した仕事について、責任をとるのは非常に苦しいものがあります。そもそもプログラミングはとても楽しいというのもありますが。
私見ている範囲では違う部署に異動したいという希望は100%通りました。異動を希望しているのにその部が解散するまでその部署にいる羽目になった人など見たことがないです。
もちろん、「プロジェクトが佳境で君に今抜けてしまわれては困る」というケースはあるのですが、IT業界のプロジェクトの開発周期は年々短くなる一方ですから、割と早い段階で異動の希望は通る感じです。
もとの増田の方は巨大プロジェクトだったので大量の人がいるわけですが、こういった部署は異動の希望は通りやすいです。
なぜなら、新規プロジェクトで最も忙しいときは大量の人員を動員しているわけですが、バージョン2、バージョン3あるいはメンテナンスのフェーズに入ればそんなに大量の人員は必要がないので、会社としてもその部署の人員を異動させたいわけです。
けれど、プロジェクトで中核の技術を担っているようなメンバー、マイホームを天上界に立ててしまったメンバー、新しい仕事に対応しにくい高齢のメンバーは異動させにくいので、
EXCELをいじっているだけのような新人は異動の希望が通りやすいのです。
もとの増田も、もう少し我慢していれば希望が通った可能性は極めて高いですが、プロジェクトが佳境でまだ新人で入ったばかりといった状態では、もう少しその部署で頑張れと言われるだろうと思います。
ただし、異動先の都合もありますので、ここから出たいはほぼ100%通りますが、あそこに行きたいは必ずしも通りません。
今更「京」のスーパーコンピュータをやりたいといっても、人気部署ですし、プロジェクトの最盛期は過ぎているのでその希望が通る可能性は低いでしょう。
色々な部署がある大きな会社では、管理職クラスは頻繁に異動が起こりますから、嫌いな上司はわりと直ぐにいなくなります。小さい会社だとそもそも部署が開発部と人事部と営業部しかないというかんじなので、上司がやめるか自分が辞めるまで、嫌な上司と付き合う羽目になりがちです。
新人研修期間が終わった後、人事の面談のチャンスがあるのですが、そこにはコツがあります。
「おおざっぱにはっきりと希望を言うこと」です。
いちばん最悪なのが、大学での研究を話し、それを活かせる部署に行きたいと話すことです。
人事の人は技術には詳しくないですから、研究内容が最先端であればあるほど、人事の人には通じないです。
キャッシュコヒーレンシが。。とか話すと、「よくわからないけどこの人は基本ソフトウェアに向いているのかな?だったら、自社でOSを開発しているメインフレーム回そう」という感じになってしまいます。
それよりは、人事の人が、会社組織のどの部署に配属すればいいかわかりやすいように、おおざっぱに希望をいうことです。
例えば、
上記のことを強い口調ではっきりというのが良いと思います。
そのうえで、できれば○○製品をやりたいだとか、こういった業種のSEをやりたい等の希望だすと、どの部署に配属すればいいか相手にも伝わり希望が通りやすくなります。
私の同期で入社して新人研修で山奥に配属されたバブル時代の末裔のようなおねーちゃんとか、数人は、割とはっきり希望をいって、下界に戻っていきました。