SSブログ

コンピューター技術者で初心者、初級者を脱するためには [プログラミング]

コンピューター技術者と大きく書いてしまったけど、主にLinuxまわりでプログラミングをやりたいと思っている人向けのものを書きたいと思います。

まず初心者の定義というか、どういう状況にあるのか、ということを自分で理解しないといけません。大体の状態を書いておきます。そういう状態ではなかったら読む必要はありません。

・とりあえず何をやるべきか(使うOS、ミドルウェア、作るものが)わかっていない人
・何かわからないことがあったら、とりあえずググって解決できるほどではない人
・何か問題が出てきて、自分で既存のソフトを選んで使うことができない人

少なくともこれができない人は初級者と言えるでしょう。
ちなみに中級者は曲がりなりにもプログラマとして仕事をしていける人。
それと上級者はみんなが使うライブラリを作ったりメンテをしている人あたりですかね。

大体の定義はそんなもので、SIerなんかは文系出のノンプログラマーをいきなり現場に投入することもあるのですが、それはそれとして何をしていったらいいかというのを考えてみました。ちなみに私は中級者ぐらいだと思います。やれることの幅としては普通の人よりかいくらか広いかもしれませんが(経歴に無駄が多いw)。





●まずLinuxに触れてみる

自分は基本的にC/C++でWindowsでUNIXにつなぐみたいな仕事から始まったのだけれど、わりとLinux系には恵まれていなくて自分で家でLinuxを入れて遊んでいました。その遊びが役に立ったのだけれど、そういうのを遊びと思えない人はあまりプログラマ向きじゃないかもしれませんね。

上司にLinuxをやっとくと仕事があるぞ、みたいなことを言われたことがあって、その頃のLinuxインストールブームも手伝って自分のマシンにデュアルブートにしてみたりしていました。それでも良かったんですが一番良かったのが、玄箱ハックでした。若い人とコンピューターに詳しくなかった人は知らないと思うけど、その頃出始めたNASにLinuxを入れるというものでした。

当然、正式なものではなかったので、製品版としてサポートされたものではなかったんだけど、玄人志向の方も入れているLinuxのソースも郵送代を払えば出してくれるという基礎があったので、色々な人がハッキングしたようです。そんなわけで本も数冊出ていて、そこでDynamicDNSを使ってWebサーバを立てるとか面白いことができるのを教えてもらえました。Debianの作法もそこで覚えました。

今、玄箱自体を手に入れるのも面倒でしょうし、今やるとしたらRaspberry Piあたりがいいんじゃないでしょうか。PCでVirtualBoxでデスクトップLinuxを使うのもいいのかもしれないですが、コンソールを嫌でも叩かないといけない状態で、SSHでつないでLinuxを使うってのも勉強にはなります。それとある程度制限された環境っていうのが初心者にとってはプラスに働くと思うのです。GUIな環境を使うことになってもGUIで設定できない項目とかが出てくると思うので、CUIでつないでいた方が応用は利くと思うんですよね。

あとわりとLinuxの技術は日進月歩な割には基本的なところはずっと使われる場合も多いようなので、知識が陳腐化しにくいというのもあると思います。どこかでシェルスクリプトなんて使わなくなるんだろうなぁと思って10年以上現役で使い続けているとか普通にあるみたいですからね。確かにやる仕事によって、必要とされるスキルは変わってしまうんですが、OSのコア部分に近かったりすると使わなければいけない時も出てくるので、要所要所で確信を持って作業できますね。Webの情報はいろいろあって便利だけれど、完全に自分の環境とあっているのかと言われると、大体は部分的には違いますからね。


ラズベリーパイを使うといいと思うのはIoTの世界が広がっていく昨今だからというのもあるけれど、固定されたハードウェアであるというメリットがあるからですね。仮想マシンもハードウェアは仮想的に固定化はされてはいるんですが、あくまで仮想的ではあるので、そのあとのハードウェアの増設などを考えると基礎のハードウェアが固まっているというのは初期学習のハードルが下がります。

まずRaspberry Piで何か有用で興味があるものを目的としている本を買ってみましょう。あるのかわからないけど、Webサーバを立ててみるとか、Sambaサーバを立ててみるとか、ストリーミングサーバを立ててみるとか、そういう具体的な目的があるとわかりやすいです。実用的かもしれないですし。それとそこに出ている操作をすれば必ずできそうなものができればいいですね。

というか、その通りにやってできないなんて本は出すなと言いたいのですが、最初はその通りにやってできるというのが大事だったりします。仮にできないことが出てきても部分的だったり、Webでちょっと調べれば解決できることも多いので、やりたい事が一揃いになっている書籍は初心者には適切だったりします。Webだと一気通貫にできる記事ってなかなかないので、各論的に物を調べるのは適していても、体系的に物を覚えるというのはやはり書籍でやるのが始めはいいと思います。古いやり方と言われるかもしれないけど、Webで金をかけずにやれるのはある程度知識が溜まってきてからにした方が挫折しないで済みそうな気がします。


専門学校出の子がLinuxでなくWindowsでWebシステムを組んでいて器用なもんだと思っていましたが、ただ単に専門学校でLinuxを教えてくれなかったみたいです。専門学校に行ったくらいなんだから、Linuxの基本的な利用方法くらい教えて欲しいものですが、教える人もできる人を潤沢に揃える事ができなかったんでしょうかね。

仕事に入ると有無を言わせずUNIXやLinuxを使わされるので、勉強しようと思ったらまずLinuxを頑張ってみてください。コマンド単体を勉強していると嫌になると思うので、何か目的を立ててその実現に向けてCUIを叩いてみてください。最初は調べた方がいいんだけど、コマンドの数が多くてしんどいから、わからなくてもできることを何回かやっているうちに大体の挙動は覚えられます。それにツールを全部わかって使っている人なんてほとんどいないから安心してください。




●HTML5をそこそこ覚えておく。

Webシステムを作らないにしても、HTMLくらいは覚えていた方がいいだろう。プログラミングを志すぐらいだから、どこかでやっているとは思うけど、Webシステムを作るに当たってはプログラムでそれを生成しないといけないので、そこそこその内容は把握していないと話にならない。

HTML5ではJavaScriptもよく使うので、文法ぐらいは知っておいた方がいい。C言語とかJavaとかには似てはいるものの、オブジェクト指向とかは独特なので深くやっていくにはそこそこ勉強は必要だろう。実用的にはjQueryあたりのライブラリを使ったコードはある程度読めるようになった方がいい。できれば書けた方がいいけど、まずは読めないとパクるにもパクれないのでまずは読む事が優先。

Pythonをやるにしても、Rubyをやるにしても、Webシステムを組むとしたらHTMLは避けられません。全部タグを覚えろとは言いませんが、何があって何ができるのかはある程度知っておいた方がいいです。できる事がわかればやれる事も分かってくる。




●何かプログラミング言語を勉強する

これは当たり前なんだけど、システム管理系の仕事だったりするとそこまでマストではないですね。でも、シス管みたいな仕事だとシェルスクリプトを組んだりもするので、プログラミング的な素養は必要ですね。

一つプログラミングを習得すると、他の言語にも活かせます。同じところは案外多く、差分を覚えればいいので、一つ覚えるだけでもかなり融通が利くようになります。ただ落とし穴はあるので、差異はきちんと把握しないと空で書いていてハマる事もあります。

それとサンプルコードを読むことは結構大切だと思います。そうすれば他人の書き方もわかるし、そこで使われているライブラリの知識も調べる事ができます。大体わかってきたら、ソースの一部を抜き取ったり、書き換えたりしていろいろやってみるのがいいと思います。誰でも一からスクラッチってのはしんどいですから、部分的に借り物ってのはよくある話だと思います。

ただ仕事で使う時などは特にライセンス形式は気にしていた方がいいですね。それと自分が出すソフトウェアのライセンスを考えようと思い出したら、それはもう中級の域であると思います。その時は"gpl bsd mit"あたりでググってみてください。今はあまりOSSのライセンスに関して口うるさく言われることは少なくなってはいるけれども、一時期みんなが気にしていた時があったので。まぁ現実的にGPL汚染とかが問題になっていたしねぇ。




何のプログラミング言語を選ぶかというのは難しい話です。僕の時はとりあえずC言語やっとけっていう感じで、他の言語は少々マイナーだったので、あまり悩まないで済んでいた事もありました。その時もいろいろと言語はありましたが、潰しがきくのがC言語だったという事でした。Linuxも黎明期でしたし、UNIXを触る環境も大学とかではない限りは使えないので、Perlとかのスクリプト言語も範疇に入っていませんでした。

なのでWindowsでVisual C++を使うか、Borland C++ Builderを使うかぐらいの選択肢しかなかったので楽ではあったのです。今とは違ってお金はかかりましたが、買ってしまえばわりと勉強するパスは決まっている感じではあったのです。あとWindows上でやるとすると、Visual BasicかTurbo Pascalとかだったんだろうけど、今はタダでできるという縛りがあってもそこそこ選択肢はあるんだろうと思います。ここまで無償でできるようになったのもOSS様様ですが、商用ソフトが無償バージョンを出すことになったのもOSSの圧力が大きかったからなんでしょうね。

今ではLinuxもお手軽に導入できるようになったので、使えるコンピューター言語は星の数ほどあります。やろうと思えば、自作の言語さえ作れます。まぁ初めから言語作ろうという人はいないと思いますが、DSLとかを書く気になれば容易に準備された言語はあったりもします(Rubyとか)。





何がいいかと聞かれると、仕事で使う言語か、今よく使われている言語、ということになるんでしょう。Javaでビジネスロジックを書くSIerならJavaをやればいいと思うし、RubyでWeb系をやっているソフトウェアハウスであればRubyをやればいいし、Pythonで機械学習をやる人はもうPythonを使えるようになっているレベルだと思います。

オススメは何かと言われると、仕事で使わねーじゃねぇかと言われそうなので、何を選んでいいか迷います。でもなんとなく流行りはありますよね。

https://ferret-plus.com/8887#p6

上は話題になっているコンピュータ言語ということなんですが、結局仕事で使われている言語がWeb上に情報がたくさん出てくるのでしょう。だから、言語的に優れているとか、好きな人がたくさんいるとか、そういう事が直結しているわけではないですね。ただメジャーであることは確かです。仕事を前提として勉強したい人にはいいんじゃないでしょうか。ただアセンブラやMATLABやR言語を使っている人が多いかと言われれば人数的に少なそうなので、あくまで目安としてみればいいと思います。

一般的にプログラマとして考えれば、こっちの方がより実感があるかな。

https://www.businessinsider.jp/post-202166

とりあえず何がやりたいかが先にあって、それをやりやすい言語を選ぶのが順当なやり方だとは思いますね。ゲームを作ろうとしてCOBOLを今から勉強する人はいないわけで。

Rubyと競合するのであまり好きにはなれないのですが、Pythonあたりはいろいろできて潰しは効くとは思います。ただRubyは国産の言語なので、変な翻訳や英語を読まなくても割とできるというのは、純日本的なプログラマには向いているんじゃないかなとは思う。でもそのRubyも海外産のRuby on Railsで火がついたので、結局英語はできるようになっておくのがいいです。というか、どのプログラミング言語をやるにしても英語は読めるようになっていないと苦労するでしょう。

何がやりたいかで決めろと言いましたが、それを調べるにも面倒がありますね。でも今はWebがあるので、ある程度気持ちが固まっていればそんなに選ぶのは難しくないと思います。でも、実際に使われているから自分がそこまで達する事ができるかどうか、というのはまた別の話ですよね。

まずOSSの言語はたくさんありますが、クライアントとしてメジャーなWindowsに移植されているとは限りません。そして移植されていたとしても、移植方法に癖があったりでLinux系統でできていた事がすんなりできなかったりすることはよくあるみたいです。なのでLinuxを操作できるスキルというのはあった方がいいということになります。というか、Windowsへのサポートを望むのは開発者の負担になるのでやめた方がいいような気がします。サポートを望んでもいいですが、自分でなんとかできる範囲はLinuxでするより狭くなるので、結局面倒なことになるのが普通です。

そんなわけでLinuxの操作をできるようになった方がいいという理由の一つがわかりました。別に俺はWindowsでGUIアプリケーションが作りたいんだ、という人はC#でも勉強してください。たとえC#を勉強しても、言語の生まれの歴史からJavaに似ているので、Javaに乗り換えすることは難しいことではないでしょう。基本C言語系統の言語はわりと似ているので、その言語の差分部分を覚えていけばいいだけです。

あとマイナーな言語は未来があるかどうかわからないので、自分がその開発に関わっていく気がない限りはやめましょう。最初は何がメジャーでマイナーかわからないかもしれませんが、勉強していくうちにググっても情報が出てこないことで薄々気がつくはずです。

世の中にはマイナー好きな人が存在しますが、言語でマイナーなものを選ぶと、自分で書かないといけない量が膨大に増えます。ユーザーが多いとその分楽ができ、やれる事も少ない行数で実現できます。コンピュータ言語は工具と材料なようなもので、使いにくいものをわざわざ使って作ることは普通はしないです。それじゃないとできないこととかがあるなら仕方ないですが、大体の場合は代替が効きます。




個人的な見解を述べておきましょう。好きでやっているのは

・C/C++
・Ruby
・Golang

あたりです。あとは好きじゃないけどやっている感じです。片手間なのでサンプルとかリファレンスを見ながらじゃないと書けません。上の三つも大して練熟しているわけじゃないですが。

C/C++あたりは対象に使われているから使っているという感じですね。まぁ古い言語なので、細かいことはあまり気にしない。それとLinuxのカーネル周りでは必ずと言っていいほど使われているので、やってないですがカーネルをいじろうとするとまず使わないわけにはいかないですね。ただ新しいことをするのにC言語を使う気にはなりません。もっと楽ができる言語はたくさんありますし、システムやプアな環境以外はあえて使うということはないです。C++に関しては言語体系が大きくなりすぎて手に余りました。やってやれないことはないけど、仕事で使えと言われない限りは使わないかもですね。

Rubyはまつもとゆきひろさんが作った日本産のスクリプト言語で、先に述べたように日本語ドキュメントが揃っているために日本人ユーザーが多そうです。Ruby on Railsからは海外のユーザーも増えたみたいですが、同じようなスクリプト言語のPythonよりかはマイナーです。PythonにできてRubyではやりにくい事も多いので、潰しがきく言語を選びたい場合は、RubyよりはPythonですね。個人的にはRubyを推したいですが、Rubyで機械学習をしているって話はあまり聞かないですしね。

Golangはより良いC言語という感じで、オブジェクト指向もないですが、言語としての素養もいいです。C言語と同じように改めて勉強しなくてはいけない事が少ないのは良い事です。そしてスクリプト言語的な方法が割と可能なので、書くのも読むのも比較的に楽です。標準ライブラリというかパッケージ?が充実しているので、別途外部ライブラリから引っ張ってこなくても、わりあいいろんな事ができたりするのも好感があります。仮に外部ライブラリを取り入れるにしても、それをgitから引っ張ってくるのも楽です。C言語ではネックになるメモリ操作も、GCがあるので気にしないでいられる事が多いですしね。厳密なパフォーマンスを求めない限りはメリットの方が大きいでしょう。

あとやっていないのですが、次期C/C++言語的な様相を帯びてきたRustとかは将来性がある気がします。言語的な素養としてC/C++を代替できるコンパイル言語はあまりないからです。実際、ドライバなどのパフォーマンスがC言語と同等なところまで来ているという話を読んだことがありますし、書籍もそこそこ出だしてきました。あとは周りの盛り上がりいかんですね。こればっかりは使われていかないと使うユーザーも増えないので、時間をかけてユーザーを獲得していくしかないでしょう。

個人的にはインタプリタのスクリプト言語よりか、コンパイル言語の方が速くて好きです。スクリプト言語は実行環境を整えるのが面倒だしね。どっちつかずのJavaは嫌いです。昔は今はなきSunの言っていたどこでも動くという妄想を抱いていたけど、わりと面倒な事が多すぎなのと、仕事のツールとしての発展がありすぎて辟易したってのもありますしね。なんというかホビーで使う類の言語ではない気がする。


私が言えるのはそのくらいですね。何が流行るか、何が自分の目的に合うかはわかりませんが、とりあえず何かをやってみるということは必要ですね。マイナーでも自分で使い良ければいいとも思いますし、仕事で泣く泣くやらされる事もあります。コンピューターに何かをやらせて思い通りに行くのはいいものですよ。そういう原始的な感動は昔からありますね。最近はなかなか大きな感動は少ないですが。

コメント(0) 
共通テーマ:パソコン・インターネット

Twitterまとめ投稿 2020/01/13 [Twitter]


コメント(0)