売れる技術者、

077 オープンソースを使いこなせ2 #10

03 : コンピュータとシステム

オープンソースとは開発者の著作権を守りながらソースコードを改変することができる。そのためソースを公開し、再配布可能にする等のライセンス契約がある。

そのライセンス形態には、 GLP系、MPL系、BSD系などがある。
しかし、深く知る必要なんかない。有難く使わせて頂ければ良いのだ。(笑)

オープンソース

これこそがオープンソース。勿論、食べられる本物

MySQLは、現在オープンソース界で最も使われているデータベース。
もともと Perl言語を拡張したPHPと一緒に使用するケースが非常に多い。

少し前までは Java がウェブシステムの首席言語だった。今や小規模なシステムならPHPの方が多く使われている。

PHPは、HTMLの必要な箇所にプログラムを埋め込むことが出来る。何と言ってもウェブシステム構築のための関数が豊富だ。おまけにマルチバイトの扱いが容易。

最大の長所は、データベースへの接続(特にMySQL)が容易であること。関数を利用してデータの参照や更新(SQL文の発行)を簡単に行うことが出来る。

これらオープンソースを利用して、高機能な商用ウェブシステムを構築することが出来る。
この文章にピンと来ない人も多いかもしれない。

かっては開発言語(コンパイラ言語)を使用する場合もお金を出さなければいけなかった。データベースなんか非常に高価だった。
しかし、今や全てオープンソースで構築することさえ出来る。

定番のオープンソースは完成度が非常に高く、SEにとってオープンソースは必要不可欠なツールになったのだ。

076 オープンソースを使いこなせ #9

03 : コンピュータとシステム

人によってさまざまだと思うが、オープンソースと言うと何を思い浮かべるか?

マイクロソフト対抗の OpenOffice、ウェブ系なら WordPressXOOPS、Drupal などある。ネットShop構築だけ考えても EC-CUBE、osCommerce、Live-Commerce、CS-Cart …など思い当たる。

ウェブサーバーに必要な ApacheTomcat もオープンソースだよな。おっと、最大のオープンソースと言える Linux を忘れちゃいけない。
それに載せる MySQLPHP、開発ツール Eclipse だってタタで使える。MySQL と言えば PostgreSQL を記載しなければ片手落ちだ。

どれも非常に多くの人に利用されている。Apacheだけ記載しても、高い信頼性もあり実質業界標準になっている。

どれも下手な商用ソフトより遥かに性能が良い。まあ、世界中の頭脳人により改良に改良が加えられるのだから当然かな。
オープンソースと呼ばれるものは驚くほど沢山ある。使用にあたってライセンスが発生するものも出てくるが、どれも基本的にタダで使用できる。
そう言えば PerlRuby もプログラム開発にタダで使える。

Open SOURCE

オープンソースと呼べないが、ブラウザの Internet Explorer をはじめ Firefox、Chrome、Safari なども基本的に全て無料だ。Firefox と言えば、メールソフトの Thunderbird を忘れてはいけない。
グラフィックソフトなら GIMP も書かなきゃいけないし、最大のGoogleが提供する各種サービスも非常に高機能で多くの人に利用されている。

まあ、各種ブラウザやGoogle等に代表されるクラウドサービスは、オープンソースでなく、フリーソフト・無料ソフトと言うべきなんだろうが。

以前、クリス・アンダーソンの「フリー」が流行ったが、デジタルの世界に於いてタダでサービスを受けられることが実に多い。「フリー」の手法は、極端に言えば、タダでユーザーを集めて一部を有料化する方法。

オープンソースは無料で使えるが、ビジネスとしてそれを利用してシステム化したものは、大抵は有料となる。Linuxは無料だけど、それをそのまま使う人なんていない。Linuxのコアを入手してもそれを使える人なんか殆どいないからだ。

自分も Linux がもてはやされた頃 Red Hat Linux の箱に入れられたソフトを数千円のお金を出して買った。専門雑誌にタダでCD-ROMが付いているのに何故と思うかもしれない。
仕事や業務に使う場合、無料のオープンソースであってもサポートが必要な場合があるからだ。

既に主流は変わった感はあるが、ウェブシステムを開発する際にオープンソースソフトを組み合わせた LAMP なるものが流行った。
OSに Linux、Webサーバに Apache、データベースに MySQL、プログラム言語に PHP。各ジャンルで定番ソフトを合わせた安易的な発想だが、意外と利用される機会は多かった。(過去形で書いているのは、既に微妙な時期だからだ)

基本的に開発環境はタダで入手できる。その開発環境を利用してシステムを構築する訳だ。今は非常に有難い時代なのだ。

このオープンソースにはライセンスがつきまとう。
これからのSEはオープンソースをどうつきあうべきか?

075 知識を広げろ #8

03 : コンピュータとシステム

システム開発を行う場合、一番重要なのは業務をいかに理解しているかだ。次にシステム環境の理解が重要。つまりターゲットマシンやプログラム言語等を何にするかだ。勿論、予算あっての話だが、それは別の話。

繰り返すが、プログラミング言語は重要ではない。業務知識の方がずっと重要だ。システムは仕事に有効活用されて意味がある。使われないシステムなんぞ何の意味もない。
要は言語とはシステムを動作させる手段でしかないのだ。但し、これが非常に重要な位置を占めるんだけどね。

NEXT WORLD 私たちの未来

同じIT業界でも、旬の仕事をしていない人の方が多い、保守運用作業しか経験のない人も多い、更にシステム開発と無縁のITサポート業務の人はもっと多い。

よって、好きでその仕事をしている人なんて僅かだ。今現在、将来のスキルアップに役立ち、仕事が楽しい職場であれば、感謝しなければいけない。
多くは生活のために仕方なくやっている人の方が多いのだ。

仕事の愚痴を言っても仕方がない。現在の従事している作業を徹底的に理解しよう。業務を徹底的に理解し、システムの開発手法・プロジェクトの運営方法などを貪欲に学んでおく。即ち今ある環境を利用して知識を広げよう。

「でもさ、俺の仕事ってルーチンワークだから覚えることもさほどなく、無理なんだよなあ」と思う人がいても、意外と吸収すべき箇所は沢山残っている。どうしても無理と判断するなら上長に配置転換の希望を出すべきだ。まず、それを自分が堂々と言えるか自問して欲しい。

私は30代になった頃から上流行程ばかりをやってきた。今となっては色あせた業務知識もあるが、時が過ぎても多くの知識は役に立つものばかりだ。確かに無駄な経験もあったが、どれも肥やしになっている。業務SEってそんなもんだ。

技術者は目の前のプログラム技法にばかり目が行くものだが、プログラム言語は必ず移り変わる。
業務SEでない人でプログラム言語に拘るなら、徹底的にプログラミング開発のベテランになることだ。
言語の考え方は基本はどれも同じだから一流技術者と認められれば、開発環境が変わってもさほど恐れることはない。
どこで一流技術者と分かるか? スキルシートや職務経歴書で分かる。一流の人の職務経歴書ってとにかく凄い内容だ。

面接の段階で、圧倒的な知識で面接官に立ち振る舞い「明日からでもウチに来て下さい!」と言わせよう。どうせ生きるならそこまで目指そう。目指すだけなら誰でも目指せるからね・・・笑。


まず、自分の好きな分野で一流になろう。若ければ若いほど失敗しても挽回できる。若いうちに沢山失敗しましょう。

074 未来のコンピュータ #7

03 : コンピュータとシステム

ここまで数回に渡って記述した内容は、私の過去のコンピュータ経験によるものだ。
アセンブラの経験こそないが、汎用機のCOBOL、C言語、Java、更には VB や VBA 、HTMLは当然として各種スクリプト言語、ActionScriptまで好奇心で試した。

こうした言語はノイマン型コンピュータと呼ばれる現在世間一般にある殆ど全てのコンピュータの基本構造で成り立っている。即ち、CPU、メモリ、外部記憶装置が前提に考えられている。

昨今はクラウドコンピューティングがIT業界では重要キーワードになっているのはご承知の通り。これは、ネットの常時接続が前提として考えられている。今やネットワークありきでコンピュータは進化している。これがもっと進化すると、コンピュータの考え方は変わってくる。

NEXT WORLD 私たちの未来
NHKスペシャル「NEXT WORLD」より クリックするとジャンプします

今年1月のNHKスペシャル「NEXT WORLD 私たちの未来」の第1回目に未来のコンピュータが紹介された。
未来のコンピュータは、現在のノイマン型コンピュータでなく、非ノイマンコンピュータとなる。

IT用語辞典で調べると、「脳の神経細胞に基づくニューロコンピューターや量子力学の原理を応用する量子コンピューターなど」 と定義されている。
現在のコンピュータはデジタル信号「0」「1」の2進法で処理を行われているが、この概念が覆る。ここで、ニューロコンピュータ? 量子コンピュータ?って何なのか疑問が生じる。

ちょっとキーワード検索して調べてみたが、もう何を言いたいのかよく分からない。
実現には20年から50年後になるようなことが書いてあるが、早ければ 現在赤ちゃんが大人になった頃、非ノイマンコンピュータが登場している可能性はあるってことだ。

どんなコンピュータアーキテクチャになるのか非常に好奇心をくすぐられる。すごく長生きしないといけないけどね。

ひとつだけ言える。
コンピュータのアーキテクチャーが変わるってことは、プログラミングの概念が変わるから、現在の Java や C++ をはじめ 現在の全ての言語は間違いなく過去の言語になり、新しい概念のプログラム言語が生まれるだろう。

073 ソフトの基礎知識を学ぼう3 #6

03 : コンピュータとシステム

プログラムの基本は、上から下に流れる。勿論、サブルーチンの定義でプログラムの最初に戻ったり最後に行って、また元の場所に戻ったりするが、それは処理の定義の仕方であり、原則プログラムは上から下に流れる。

前回、Java、C♯、C++、objective-C は、C言語から派生している。C言語から派生したこれらはオブジェクト指向言語として登場し、クラスと継承を利用することで生産性が格段に向上する。と記した。

ここで「オブジェクト指向」は何ぞや?だが、クラスインスタンスと言う言葉が必ず登場する。
クラスとは、かって流行ったインベーダーゲーム。インベーダーを定義したものがクラス、そのクラスによって生成されたインスタンスがインベーダーたち。
たこ焼き屋なら、たこ焼きのプレートがクラス、出来たたこ焼きがインスタンス・・・よく「オブジェクト指向入門」で登場する説明文だ。

しかし、これから学ぼうと思う人にこんな例え話をしても、「だからどうなのさ?意味わかんない」となる。そりゃそうだ、現実の例をむりやりこじつけても理解に苦しむ。

om

アセンブラ言語の登場から、これまで幾つものコンパイラ言語は登場してきた。
コンパイラ言語はターゲットマシンに合わせて人間が組んだプログラムを機械語に変換してくれる。しかし、コンピュータが浸透しネットワークが普及すればするほど、ターゲットマシンは特定されなくなった。

パソコン一つとっても Windowsあり、Appleあり、UnixあるいはLinux かもしれない。そのOSだってOSのバージョンが変わるだけで仕組みが変わってくる。昨今はタブレットやスマホも登場している。

オブジェクト指向言語のJavaが普及した最大の要因は、Java VM(Virtual Machine)の概念を取り入れたことだ。

Javaで組んだプログラムをコンパイルすると、中間コード(Javaバイトコード)になる。ターゲットマシンはあらかじめこの中間コードを Java VM で機械語に変換する。

「何でそんな面倒なことをするの?」と思うかもしれないが、これには深い意味がある。

本来ならプログラムはターゲットマシンに合わせて機械語に変換される。CPUやメモリ空間、外部記憶装置とのやりとりなど機械語に変換されるのだが、この Java VM が各プラットフォームに用意することで、その中間コードをターゲットマシンに合わせた機械語に翻訳してくれる。
よって機種を意識しないでプログラムを作成することが出来る。

即ちコンピュータのハード上にあたかも仮想のコンピュータが出来て、コンピュータの機種やOSを超えて動作するのだ。だから Java VM(Virtual Machine)って言うんだけどね。

西暦2000年前後から Javaは急速に普及し、Java技術者は非常に優遇された。
もう、猫も杓子もJava Java と言い出し、Java技術者が不足した頃だ。

072 ソフトの基礎知識を学ぼう2 #5

03 : コンピュータとシステム

そこでアセンブラ言語を改善し、登場したのが COBOLやFORTRANであり、C言語だ。
これら言語はコンパイラ言語と呼ばれ、プログラムをそのコンピュータで動作する機械語に変換してくれる。

コンピューター初期の頃はメーカーによっては、アーキテクチャーは異なるので、そのハードウェア前提にプログラムを組まなければならなかった。それがアセンブラ言語だった。

まもなくコンパイラ言語が登場する。これは、人間が命令形式で作成したプログラムをコンパイラがそのハードウェアで動作する機械語に変換してくれる有り難い仕組みのことである。
これによりより生産性の高い、より複雑な処理を行えるプログラミングの考え方が重視されるようになった。

汎用機全盛の頃は、COBOL、FORTRAN、PL/Iなどの言語を使用することになる。事務処理のCOBOL、科学技術計算のFORTRAN、両方を兼ね備えたPL/Iが広く使用された。
その後、汎用機を背を向けて登場してくるC言語は、マイクロプロセッサの制御、その後のUNIX系、PC系で多く利用されるようになる。

om

上記に記載した COBOL、FORTRAN、PL/Iで、今も生き続けているいるのはCOBOLとC言語くらいだろうか。
COBOLは汎用機が超高価だった頃に登場した言語であり、あえてハードの制御が出来ないようになっている。
逆にC言語はハードの制御が可能だ、C言語で制御プログラムを組めるのはそこにある。C言語を学ぶと分かるが、Java、C♯、C++、objective-C に近いものがある。
それは当然だ。Java、C♯、C++、objective-C は、C言語から派生しているからだ。

C言語から派生したこれらはオブジェクト指向言語の特徴を持つ。オブジェクト指向言語の詳細は別に触れるが、言語の備えるクラスと継承を利用することで生産性が格段に向上する。

こうして一見遠回りで面倒に思えるかもしれないが、ハードとソフトの歴史を詳しく紐解いていると、コンピュータが非常に良く分かる。これから何の言語を勉強すべきかさえも見えてくる。
そして、本格的な言語を1つマスターしていると、いつのまにかコンピュータの仕組みさえも分かってくるから面白い。繰り返すが、本格的な言語を1つマスターすることだ。

この業界を志して、思うように言語開発が出来ずに挫折する人は沢山いる。
それは言語が分からないのでなく、アルゴリズムが分からないからだ。
言語の文法をしっかり覚えているのに、いざプログラムを組みだそうとすると、どう組んで良いのか分からないのだ。身に覚えのある人は沢山いるはずだ。

アルゴリズムを理解していないためプログラムを組む「こつ」が掴めないのだ。
一つ良いヒントを与えよう。マネから始めれば良いのだ。

071 ソフトの基礎知識を学ぼう #4

03 : コンピュータとシステム

(その2)ソフトウェアの基礎知識を学ぶ
前回、「ハードの知識を吸収したいなら、コンピュータの歴史を紐解いていくのが一番だ」と記述した。特にCPU、メモリ空間の歴史を追っていくとコンピュータの実像が何となく見えてくる。

一見、この理解は非常に遠回りで ひどく効率が悪く感じるが、SEの道として非常に近道と私は思う。コンピュータの歴史を知ることは、その後の理解度に大きな差となるからだ。

言語開発の基礎知識を持たずに面接で、「今、Java言語を勉強しています」等を答えたことはないだろうか? これはJava言語の奥深さと開発工程を知らない故に答えてしまう大胆な発言だ。

Java言語を使ってシステムを稼働させることは、Java言語の文法を知っているだけでは到底補えない沢山のバックエンドがある。
つまり、Java言語を覚える前に(覚える後に) 沢山の知っておくべきことがある。それが何かを知らずに、自分が勝手に言語優先主義を唱え「ひとまず、流行りのJavaを勉強しておこう」となっているだけだ。

「じゃあ何が大事でどうすれば良いの?」と思う人は、暫くお付き合いください。

om

さて、CPUやメモリの歴史を紐解いていくと、自然にプログラム言語が登場してくる。そのコンピュータを制御する最初に登場する言語がアセンブラだ。

アセンブラ言語は、CPU、メモリ、ハードディスクを直接制御するプログラムであり、コンピュータの基本を一番手っ取り早く理解することが出来る。

メモリ上のアドレスを指定し、CPUのどのレジスタを使用するとかを記載する。特定のハードウェア前提でプログラムを組むからだ。

コンピュータの基本原理は同じだから、アセンブラ言語を経験することは必然的にハードウェアの基本原理が理解できる。
但し、アセンブラ言語をしっかり覚える必要なんか全くない。どういうものか概念を知っておくだけで十分だ。
アセンブラ言語はハードウェアに依存するし、生産性が悪く高機能なソフトウェア開発なんか出来ない。

そこで登場したのが、COBOLやFORTRANであり、C言語となる。

070 ハードの基礎知識を学ぼう #3

03 : コンピュータとシステム

今回は、化石にならないための予防策にいくつか徒然に触れます。
化石化の予防としてご服用下さい。

(その1)ハードウェアの基礎知識を学ぶ
優秀なソフトウェア技術者になるには、ハードウェアの基礎知識は必須だ。最近は2進、8進、16進法とプログラムの関係がろくに分からないソフトウェア技術者がいる。C言語やJavaの技術者なら「そんな馬鹿な?」と思うだろうが、世の中そういう言語ばかりじゃないのだ。

コンピュータの初期は、真空管に電気が流れたら1、そうでなければ0だった。その後の紙テープ・紙カードは、穴が空いていたら1、空いていなかったら0とした。まもなく磁気テープが登場し、テープの磁気に1と0の信号を記録するようになった。全てはこうした2進法が原点だ。

この頃のコンピュータの特徴は、中央演算装置、主記憶装置、外部記憶装置 で構成されていた。当然も今もコンピュータの基本原理は変わらない。

これらの言葉にピンとこない人でも、CPU、メモリ、ハードディスク と言えば、ピンとくるはずだ。

磁気ディスク
沢山のディスクパックが並ぶ

ちなみに、初期の頃にはハードディスクを取り換えられるディスクパックなるものがあった。「よっこらしょ」と、両手で抱えるくらい大きかったのだが、記憶容量は100MBも満たないものだった。

ディスクパック装置
これがディスクパック

このディスクパック(要はハードディスク)を交換してデータを読み込ませる。
CPUがディスクパックのデータをメモリにロードし、プログラムの命令通りに1ステップずつ処理を行う。
これがプログラム内蔵方式って呼ばれるものだ。CPU、メモリ、ハードディスク(外部記憶装置)の関係が分かる。
ハードの知識を吸収したいなら、コンピュータの歴史を紐解いていくのが一番だ。面白いほど自然と知識がついてくる。何と言っても子供の成長のように自然と理解出来るのだ。

さて、今のハードウェアの基礎知識を覚えるにはどうすれば良いか?

一番の早道は、基本情報技術者試験・応用情報技術者試験を受かるために勉強をすることだ。奇策なんかない。

結局、自分も基礎知識はそうした試験対策から学んでいる。それをベースとして更に知識は積み重ねられる。近道であり試験に受かると自分の価値もあがる。一石二鳥だ。

069 化石になっていく技術者たち #2

03 : コンピュータとシステム

数回に渡って、エンジニア魂・クリエーター魂について触れます。
自分が経験談で語れるSEをメインにして記載します。
SE以外のクリエーター志望の方にも共通する箇所が沢山含まれていると思います。

まず、SEになるには何を勉強すればよいか?

私が学校を卒業した当時は、パソコンなんてなかった。会社に入社して初めてキーボードなるものに触れた。システム開発は未来の職業としてもてはやされたが、今ほど華やかな業界ではなく、ひどく泥臭い業界だった。

ともあれ新入社員として、文系・理系・22~23歳前後の男女が入り乱れて新入社員教育が始まった。

化石になっていく技術者たち

多くの企業の新人教育は下記の (1)、(2)、(3) のいずれかだ。

(1) コンピュータの基礎をしっかり学び、プログラミングの基本だけしっかり学び、その後は現場で実体験。
(2) プログラミングと技法をしっかり学び、その後は現場で実体験。
(3) 一通りプログラム基礎を学び、その後は現場で実体験。



(1)と(2)の違いに大差ないと思うだろうが、要はしっかりコンピュータの基礎知識を教育するか否かだ。大抵の研修ではコンピュータの概要を説明するにはするが、直ぐにプログラミング学習となる。
(2)のやり方は即戦力として有効で、現場で沢山のプログラム作成を行えばスキルは飛躍的に向上していくだろう。(3)はよく見かけるスタイル。

(1)は会社に体力がないと出来ない教育方法だが、SEに必要な コンピュータの感覚 が理解できる。決してプログラミング優先とせず、業務知識の習得と問題解決能力を身に付けさせるため、最初から上流工程に近い位置から経験させる。企業の大小に関係なく非常に恵まれた環境だ。

誤解を恐れず記載すると、SEとは業務を改善するための問題解決能力が重要であり、決してプログラミング能力ではない。極端に言えば、開発言語はシステムを構築する手段でしかない。要は開発言語は何だって良いのだ。

言語にとらわれ過ぎると、その言語が主流から外れると非常に困ったことになる。
いづれ言語の主流は他の言語に移り変わる。まさに私も時代の流れを経験している。後で触れるがこれには非常に悩んだ。

クリエーター職に言い換えれば非常に分かり易い。
Adobe製品を自由に使いこなすことが重要ではない。要はツールを使って生み出す創造力が重要なのだ。

(2)の方法で、一つの言語で同じターゲットマシンで開発を行っていると、開発手法が変わるとタダの人になり易い。

じゃあどうすればよいの?・・・徒然に記載していきます。

068 ものを創る喜び覚えていますか? #1

03 : コンピュータとシステム

ウェブデザイナー、イラストレーター等を仕事にしている人は、仕事が楽しくて仕方がない人が実に多い。直接、制作物が視覚に飛び込んでくるため達成感を得られるからだ。

エンジニアの場合、自分が設計したシステムが実際に動く現場を見ると喜びと達成感を得られる。

ものを創る喜び覚えていますか?

例えプログラマーであっても、そのプログラムが業務の一つとして重要な機能だと知れば、責任を強く感じる。
しかし、昨今はシステムが巨大化して自分の担当が、全体のどこの部分かさえ分からない場合も少なくない。
「この機能って、何のためにあるの?」、「この機能が実現すると何が変わるの?」・・・きっと一度は感じたことがあるはずだ。システムが大きいと、機能の存在意味が分からないのだ。

「システム設計書を見れば分かるんじゃないの?」と思うかもしれないが、設計側も明確な情報が与えられない場合は少なくない。

設計段階は勿論、ようやく製造段階になって環境を提示させられ、ターゲットマシンが何であるか知らされた場合も過去にあった。有り得ない話と思うかもしれないが、大規模システムになればなるほど、全体像が下まで伝わらない。

「そんな事、質問すればいいだけじゃないか」と言わないで欲しい。それが出来れば全然苦労はしないのだ。

仕組みが大きくなり、プロジェクトメンバーが多くなればなるほど、そうしたケースに遭遇する。

いずれ自分が上級SEとなりシステム全体を見渡せる立場になると、当然全容は分かってくる。
と、同時にそれと異なるプレッシャーと大きな不安に襲われるようになる。

経験を積むにつれ、任される仕事は確実に難しくなり責任が重くなるのだ。逃げ出したくなる現場もあった。修羅場を経験したことは何度かある。
しかし、何故かこの業界から離れられずここまでやってきた。

昨今は、ウェブを用いた開発が全盛となり、開発(制作)手法は大きく変わった。とは言えSEの業務開発とウェブ系開発には共通する部分が多々ある。

あれこれ数回に渡って、エンジニア魂、クリエーター魂について触れていきたい。

1 2 3 >