MENU
ここはC#を使ってWindows上で動くプログラムを自分で組める様になるための知識を身に着けることを目標にしたサイトです。
機能はそれほど多くないシステムを一人で組める様になることを目標にしています。それが、例えばサブタイトルに付けているブログやTwiterへの記事の自動投稿クラスのものを想定しています。

対象:情報処理について初めて勉強する人
年齢不問なので、還暦過ぎて定年退職した人でもウエルカムです。ただ、カタカナ用語や英単語はたくさん使います。無理して変な漢字は使いません。
また、C#という言語を使ってプログラムを組んでいきますので、英単語はたくさん出てきます。
コンピュータシステム、ソースプログラム、オブジェクトプログラム、コンパイラ、インタープリタ、クラス、オブジェクト、OS、C#、HTML、CSS、if、while、swich、...
分からない言葉が沢山出てきます。分からないから立ち止まる人には向かないかもしれません。理解は出来なくても、言葉を覚えて下さい。(もちろん意味が理解できないと覚えることも難しいです。)コンピュータ言語についていえば、どちらかというと、たくさん使って練習して慣れてくると理解が深まると思ってもらった方が良いかと思います。

システムを作るというのは、単純に書くと、どんな機能を持ったシステムを作りたいのかと言うことをはっきりさせた上で、それをどうやって実現するのかというアルゴリズムを考えて、最後にそのアルゴリズムをコンピュータ言語で書き表すことになります。なので、アルゴリズムとコンピュータ言語の知識が必要になります。

そもそもどんな機能を実現するシステムなのかを定義するのが、機能要件定義と言われる作業です。機能要件定義と並んで、最初の段階で行うのが、どういう環境(インフラ)でシステムを動かすのか、セキュリティはどうするのか、どの程度の性能を求めるのかという、システムにとって機能とは違った面で必要な項目を定める非機能要件定義と言う作業もあります。

要件定義作業を行うためには、コンピュータ言語の知識と言うよりも、システムで構築しようとしている業務知識が必要になります。
また非機能要件定義では、どのようなインフラが利用可能で、それらの得意・不得意、使うメリット・デメリットを知っておく必要がありますし、情報セキュリティに関する知見も必要です。要は幅広い知識が必要になってきます。

ここでは、動作する環境としては、Windows上で動くプログラムを想定し、言語はC#で開発します。また、開発環境はWindowsの提供元であるMicrosoft社が無償で提供してくれているVisual Studioを使用します。

Visual Studioを使ってC#でプログラムを開発している開発者は非常に多く、大量の情報がWEB上で提供されている点もこれらを選択した理由です。

開発言語としてC#を選んでいるのは、基本的にアルゴリズムを少ないステップで実現でき、情報セキュリティについても考慮された言語だからです。更には、オブジェクト指向言語なのでこれでプログラムが作れるようになれば、基本的に現在利用されているたいていの言語で(色々と調べながらではあっても)プログラムが比較的早くスムーズに作れるようになるからです。

なお、現在このサイトは作成途上にあります。サイト作成中は、分かりやすさは気にせず、書いていますので、おそらく初心者の人が、ここの文章を読んでもちんぷんかんぷんかもしれません。このサイトの文章を読まれる方は、上に書いた様に、意味わからなくても良いので、何回か読んでみてください。(将来的に、一通りサイトが完成したら、内容をもう少し読みやすくしていくかもしれません。)


【ここは重要】
初心者の人はプログラム言語を勉強すればシステムが作れると考えているかもしれませんが、幾ら言語の勉強をしてもシステムは作れません。


そもそも最初にトップページに来る人は少ないでしょうから、ちょっとグダグダ書かせていただきます。

一般的に、システムに盛り込む機能を決める工程及び機能を実現するアルゴリズムを考える工程を設計工程と呼びます。そして設計工程で作成された仕様書をもとにアルゴリズムをコンピュータ言語で書き表す工程をプログラミングと呼んでいます。

冒頭書いた個人で作るような機能が少ないシステムであれば、どんな機能を実現するのかという部分をワープロでA4用紙1枚程度にまとめれば十分の場合もあり、余り考えなくてもシステムを作れてしまいます。ただ、少なくてもその機能を実現するアルゴリズムが分からなければ、システムは作れません。
プログラム言語の本を買ってもアルゴリズムの部分はそれほど書かれていないので、プログラム言語でプログラムを書けるようになったけれど、システムが作れないという状況が発生します。

因みに、システム開発の現場ではシステム開発の作業工程が、もう少し細分化されています。機能を実現するアルゴリズムをプログラミング言語でキチンと書き表せているかどうかと言ったプログラミングにミスが無いことを確認する工程をデバッグと呼び、機能が想定通りに実現できているかどうかを確認する工程をテスト工程と呼んでいます。(テスト工程はさらに個々の機能が想定通り実現出来ているかを確認する工程を単体テスト工程、前後関係のあるような複数の機能をまとめてキチンと実現出来ているかを確認する工程を結合テスト工程、全ての機能をまとめて、実現で来ているかどうかを確認する工程を総合テスト工程と細分化されています。また、最終的にはシステムの開発者ではなく発注者であるユーザーが実現したいと考えていた機能が実現で来ているかどうかを確認する工程をユーザー確認テスト工程と呼んでいます。)

ただ、工程を分けて考えることは仕事を整理する上では意味がありますが、必ずしも設計工程が全て終わって、次のプログラミング工程に移り、システムが完成する訳ではありません。

何を開発するのかによっても変わってきますが、一般的にコンピュータシステムの開発には時間がかかります。そのためシステム構築の途中で、作りたい機能が変わることもあるでしょうし、当初は見込んでいなかった機能を追加する場合もあるでしょう。逆に場合によっては、すでに完成に近づいていた機能をシステムから外すという場合もあります。また機能を実現するためのアルゴリズムが間違えていたと言うことも発覚したりします。その場合はアルゴリズムの見直しをしなければいけなくなります。アルゴリズムの間違いに気づくのは、すでにプログラミングがほぼ終わっている時期だったりしますから、関連する機能についてはプログラミングの工程から設計の工程に戻す必要があったりします。また、アルゴリズムをコンピュータ言語で書き表す際にミスをすることもあります。

つまり、コンピュータの開発は、なかなかキチンと工程順に進むわけではなく、先に進んだり元に戻ったりと言うことを繰り返します。

もっとも、すべての機能でそのようなことが起きるわけではなく、一部の機能で起こるので、どの機能がど卯いう経過をたどってどこまで開発が進んでいいるのかを把握することは、多くの人がかかわる大規模なシステム開発を成功させるために重要なポイントになります。そこで、大規模なシステム構築ではシステム開発の進捗状況をマネジメントする必要があります。それを担うのが、プロジェクトマネジメントです。そしてプロジェクト内でそれを専任して行うのがプロジェクトマネジメントオフィス(PMO)です。

企業や、イベントなどでは、複数のシステム開発やプロジェクトの進行が同時並行で行われるので、そう言った複数のプロジェクトを総称してプログラムと呼んで、複数のプロジェクトマネジメントを効率的に進める手法としてプログラムマネジメントが必要になったりします。

また、工程ごとに管理するのではなく、細かい機能ごとに、設計からテストを行ったり来たりしながら開発を進めていくような方法もあり、システムの開発の仕方も色々と試行錯誤が行われています。

SEの仕事

最近はコンピュータシステムの開発にあたって、役割分担がどんどん細分化しています。

それは、昔であれば、仕事でコンピュータを使うのであれば汎用コンピュータしか選択肢がなかったのに、今は汎用機で稼働させるのか、サーバーで稼働させるのか、それともWebシステムにするのか、さらには、クラウドを使うのかどうか、またデータベースは使うのか、使うとしたら何を使うのかと言った、そもそもどこでシステムを稼働させるのかから検討をする必要があるから、仕方がない面があります。

ただ、ここでは、あくまでも自宅にあるPCで稼働するプログラムを作る前提で進めていきます。それであれば、基本的に昔の様にSEのお仕事とプログラマーのお仕事程度に分けて考えれば事足りるでしょう。更に言うと、個人で作るので、基本はあなたがSE兼プログラマーになる必要があります。

では、SEとは何か?

単純に書くと、「どんなシステムを作るのか」を決めるのがSEの仕事です。

このサイトでは、すでに「あらかじめ用意した記事を、ブログとTwitterに自動投稿する」が目標だから、どんなシステムを作るのかは決まっている前提なので、特にSEの仕事は発生しないかと言うと、必ずしもそういうわけではありません。

例えば「あらかじめ用意した記事」とは、どういうものなのかが全く情報が無いので、これを決めていく必要があります。

さらには、

・記事を入力する手段はどうするのか。
・そもそもブログ用の記事とTwitterで呟く記事って違うのでは?
・記事を書くブログは何を対象にするの?
 無料のブログ?ワードプレス?それとも...
・ブログのアカウントをシステムに知らせる手段は?
・Twitterで呟くアカウントは、何にするの?
・呟くアカウントをシステムに知らせる手段はどうするの?

と言う様に、今回の「あらかじめ用意した記事を、ブログとTwitterに自動投稿する」システムでも、どんなシステムにするのかを掘り下げて決めておく必要がある項目はたくさんあることが分かります。

同じ様な機能を持つシステムでも、SEの仕事によって、見た目が全く違うシステムになったりします。

少なくても、

・システムへの入力は何か
・システムから出力されるものは何か
・入力されたものに対してどのような処理をしてどのような出力が得られるのか

というシステムの機能を決定して取りまとめていく必要があります。

こうして分析され文書にとりまとめられたものが仕様書とか設計書と呼ばれるものです。上記で決定したものをまとめたものは「基本設計書」とか「外部仕様書」などと呼ばれます。

最近では、さらにデザインなどでも、操作のしやすいデザインであったり、色覚に困難な方にも色遣いを分かりやすくするなどと言った配慮を求められたりします。(本来は非機能要件で決める事項)

そもそも、企業が作るシステムでは、複数の機能を持っています。というよりも、そのシステムにどんな機能が備わっていて欲しいのかというユーザーの要望を認識しておく必要があります。それをまとめたものが要求定義です。

しかし、単に要求を受け入れていくと、巨大なシステムになってしまい予算をオーバーしてしまいます。またある要求を叶えると別の要求が叶えることが出来ないと言った背反的な要求があったりします。そこで、要求を整理して要件として取りまとめる機能要件定義と、さらには稼働する環境であったり、必要なレスポンスやセキュリティなどの機能とは異なる要件を定めていく非機能要件定義が行われます。

個人で作る様な簡単なシステムなので、上で書いた要件定義・非機能要件定義の内容も含めて基本仕様をまとめるのが良いかなと個人的には思います。

ただ、そういう企業で作るシステムはここでは範疇外なのでこれ以上書くのは控えます。

「何を作るのか」が決まった後に、それを「どう実現するのか」を考える必要があります。それを人間が分かる言語で記述したものが「プログラム設計書」とか「内部仕様書」と呼ばれるものです。

最終的にはコンピュータが理解可能なプログラミング言語による記述に落とし込む必要があるので、このプログラム設計書も、基本的には日本語などの人間が理解できる言語で記述しますが、(書き方・まとめ方は業者によって違いますが)コンピュータ言語に落とし込みやすいようにまとめていきます。

その、「どうやって」を実現するものがアルゴリズムです。つまり「プログラム設計書」には機能を実現するためのアルゴリズムを記載していくわけです。

現在は基本的に設計書は最終的にユーザーが確認しろということになっています。しかし、アルゴリズムはそれなりに勉強して、良く出てくるパターン位は覚えておかないと、正しいかどうかを判断するのは難しいので、単にユーザーが印鑑を押すだけという無駄な文化を創り出すことになっている気がします。(とは言え、コンピュータのプログラミングをしなくても簡単なアルゴリズム位勉強したらとは思いますが、それを言うと、高校の数学T程度は身に付けたらとは思いますが。)

プログラミングとは

プログラミングはSEが作成した人間の言葉で書かれた内部仕様書をもとに、コンピュータが理解できる言語で、どうやって実現するのかを記載する仕事です。

なので、プログラマーとは人間が使う言葉で書かれている仕様を最終的にコンピュータ言語に変換していく作業を行う人です。

基本的には、プログラミング言語を知っていれば、出来る仕事です。

ただ、SEの人のコンピュータ言語の理解不足で例えばC#で書く場合には、こういうアルゴリズムにした方が良いという場合もあります。

個人的には、内部設計書もプログラマーが書いた方が良いかと考えています。

(最近は分からないのだけれど)昔は、先週までスーパーで魚を売っていたお兄ちゃんが、いきなりソフトウェアハウスに転職してプログラムを組勝れると言ったことが普通に行われていた。(今も変わらない?)1か月程度、社内教育を行っている所は良い方で、採用してすぐ現場に派遣している会社が本当に多かった。(10年位前、契約締結時点で再委託をなるべくしない様にと外部監査などで監査法人から指導をする時代もあったが、最近は機能していないような気が)

そうすると、アルゴリズムなんて聞いたこともない人間がプログラムを組むので、SEが作った内部仕様書をもとにプログラム言語に変換するのがプログラマーの仕事とされた時代がありました。プログラムの仕事をしながら、少しずつアルゴリズムなどを覚えて、SEの仕事が出来るようになるというのが、当時のキャリアパスだったりします。なので、プログラマーではなくコーダーという役割が提唱されていた時期もありました。(どうも今は、デザイナーが作った仕様通りにHTMLやCSSでWebサイトを作る人がコーダーと呼ばれるようだ。)

困ったことにアルゴリズムなんて覚えなくて良いという人も昔は多かった。しかし、個人でシステムを組む場合は、少なくても代表的なアルゴリズムは理解できるようにしておいた方が良い。少なくてもアルゴリズムを組み合わせられない人はシステム構築は難しい。まあ、ただそれでもシステムが作れないかというとそういう訳でもない。作りたいシステムのイメージがしっかりと出来ているのであれば、外注する方法もある。今は簡単に外注も可能な時代だから。

プログラミング言語の講座を勉強してもシステムは作れない

通常プログラミング講座は、内部仕様をプログラミング言語に変換する作業を学びます。もちろん場合によっては、その前段階のアルゴリズムについても、必要な都度学んでいく講座もあるかもしれません。

ただ、実際にシステムを構築する際には、上に書いてきた、「どんなシステムをつくるのか」「どんなアルゴリズムを適用して実現していくのか」という部分が非常に重要です。

それが出来ていないと、到底システムは出来ません。

しかも、小さなプログラムでも、意識せずにさまざまなアルゴリズムを組み合わせてプログラムを組む必要があります。EXCELのでいつも繰り返す処理をマクロに出来た人は、VBAを勉強することで、いつも繰り返している処理をプログラムにすることは出来るかもしれません。それは一つの処理をプログラム言語に変換するだけなので比較的簡単に出来るかもしれません。(それすら無理という人もいる訳ですが)

ただ、複雑な処理になると、一つ一つのアルゴリズムをゼロから考えていたら、システムの完成はいつになるか分かりません。そのために、現在のプログラミング言語は過去に誰かによって実現されたアルゴリズムを部品として使えるようになっているのです。そんな部品を検索して、自分のシステムに組み込んでいく作業が必要になります。

現在使える部品はあまりにも大量なので、覚える必要はありません。ただ、部品を使いこなすためには、作りたいシステムによっては、実はWindowsやらWebシステムやtらコンピュータサイエンスの知識やらAIやらと言ったが必要になったりします。コンピュータ言語とは違う知識を覚える必要があったりします。

何を書きたいのかというと、プログラム言語を覚えれば自分が作りたいコンピュータシステムが作れる様になる訳ではないと言うことです。

それ以外の「作りたいこと」に関連する知識が必要で、中には覚えなくても検索すれば済むものもありますが、覚えておかなければいけないもの理解しておかなければいけないものがあったりすると言うことです。
(しかも時間の経過で覚えなければいけないことが増えたり減ったりします。)

さらには、そもそもなんで、その機能を実現したいのかという、そもそもの業務について知っていないと、システムが上手く作れなかったり、形は出来ても使えないシステムになってしまいます。
更新履歴
このページの先頭へ