編集部注:本稿は初心者向けにプログラミングやWebデザインの講座を開催している TechAcademy(テックアカデミー)による連載企画。「非エンジニアの起業家が知っておくべきプログラミングの知識」というテーマで数回に分けて極めて基礎的なプログラミングの基礎知識をお伝えする。全連載はこちらから
photo credit: elliottcable via photopin cc
「非エンジニアが知っておくべきプログラミングの知識」というテーマで、10回に分けてお届けする連載企画。第5回目のテーマは「これからプログラミングを学び始める方へ」です。
前回は「CSS3からSassまで ─ これから学ぶ人のためのCSS全体像」というテーマでお送りしました。今回からいよいよ「プログラミング」の記事テーマで、考察・ご紹介します。本連載は、インターネット業界で、これまで技術的なバックグラウンドを持たないまま起業した方や、これから独立・起業しようと思い立った方をサポートするための、連載記事です。
プログラミングといっても、カバーされる非常に広範囲なため1つの記事だけでは表現できません。そこで、本記事では「プログラミング的な考え方」について中心に解説します。
0と1の世界へようこそ
コンピューターの世界では、0と1という情報しか扱うことができません。普段手にしているスマートフォンのディスプレイの発色も、0と1の組み合わせによって発色が表現されています。プログラミングを学び始める上で、情報工学の基礎となる「bit」について正しく理解をしておきましょう。
よく喩えられる表現が、電球(ランプ)の ON / OFF の状態です。ある1つの電球によって表現できる状態は「ON」または「OFF」の2種類です。では、3つの電球を組み合わせるとどうなるでしょうか? 2^3=8種類となります。コンピュータ内では、2進数計算の0と1を高速に、かつ大量にやりとりしています。1bitが8つ集まった単位を1バイトと呼び、その後キロバイト、メガバイトと単位が増えていきます。
コンピュータに表示されている1つの文字(英数字、ひらがな、カタカナ、漢字も含む)も、この組み合わせ(bit)で表現されています。しかし、1バイト=8つの電球(8bit)だけでは、2^8=256通りの組み合わせしか表現できず、アルファベットと数字くらいです。日本語やひらがなは、どのように表現すればよいでしょうか。
日本語の表現では、それを2倍にした16bit、すなわち2バイトで表現します。日本語が2バイト文字と呼ばれるのは、16bit(2^16=65,536種類)で表現することができるからです。
bitは、binary digitの略で、情報工学における最小単位として知られています。bit単位に意識をおいたプログラミングをする機会は減ってきていますが、高機能なウェブアプリケーションや、スマートフォンアプリなども、メモリ管理など、最終的には「bit」の思想に行き着くのです。
そもそもプログラミングとは?
プログラミングは、0と1だけで構成されたデジタルの世界に登場した概念です。プログラミングとは、そもそも何なのでしょうか?
一般的に、プログラミングとはコンピュータに対して「指示や命令を伝えること」です。そして、先に述べたような0と1の世界に 人間の意図を正しく伝えるために、プログラミング言語というインターフェースがあります。私たちはプログラミング言語を使うことで、0と1の世界のコンピュータとコミュニケーションを取るのです。
アルゴリズムとは何か?
プログラミングを学ぶ上で、「アルゴリズム」という存在を知ることになります。
アルゴリズムを簡単に説明すると、「問題解決のための考え方」です。問題の数だけ、もしくはそれ以上にアルゴリズムが存在し得ます。しかし、世の中には常に新しい解決法が求められているわけではないので、「◯◯ということがしたい」という希望に大して、「それでは、XXというアルゴリズムを使おう」と言えることもあるのです。
後述するFizzBuzz問題も、「反復構造」「条件分岐」といった、プログラミングの考え方を組み合わせたものとして有名なもので、プログラミングとアルゴリズムの基礎を学ぶのに最適なことから、研修や大学の情報工学の授業でも、頻繁に取り上げられます。
【コラム】FizzBuzz問題
FizzBuzz問題という、有名なプログラミングのアルゴリズムに関する問題があります。
1から100までの数をプリントするプログラムを書け。 ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、 3と5両方の倍数の場合には「FizzBuzz」とプリントすること
この問題に対する答えは無数にあります。それぞれの言語で、何十通りの答えがありますが、一つの例として、Rubyでこの問題をシンプルに解くと、以下のようなコードを書くことで実現できます。
(1..100).each do |num| if num % 15 == 0 puts :FizzBuzz elsif num % 5 == 0 puts :Buzz elsif num % 3 == 0 puts :Fizz else puts num end end
Macの環境の方は、Rubyの動作環境が最初から入っているため、上記コードをテキストエディタで「fizzbuzz.rb」等という名前で保存したあと、ターミナルを起動し「ruby fizzbuzz.rb」というコマンドで実行してみてください。以下のような結果が出れば成功です。
【コラム】世界でもっとも強力な9のアルゴリズム
英ディッキンソン大学のコンピュータ・サイエンス教授、ジョン・マコーミック氏の『世界でもっとも強力な9のアルゴリズム』という書籍が発刊されています(日本国内では日経BP社が発刊)。こちらで紹介されている9つのアルゴリズムは、以下の通りです。
- 1. 検索エンジンのインデキシング
- 2. ページランク
- 3. 公開鍵暗号
- 4. 誤り訂正符号
- 5. パターン認識
- 6. データ圧縮
- 7. データベース
- 8. デジタル署名
- 9. 決定不能性
初心者の方が手にとっても、内容を理解するのは難しいかもしれませんが、デジタル化された現代社会で成り立っている、もっとも高度なアルゴリズムを「読み物」として知っておくためには、あなたの学習のモチベーションをアップさせる一冊になるかもしれません。
プログラミングを支える基礎的な考え方
これからRubyという言語を通して、どの言語にも共通するプログラミングの基本的な概念を一部だけ、ご紹介します。
変数
変数とは、情報を格納しておく箱のようなものです。名前を付けて管理することで、値を処理しやすくします。値とは具体的に、”Hello”という文字列や、1という整数などのデータのことを指します。
x = 1 y = "Hello"
上のコードを日本語で表現すると、「iという変数に1という値を代入する」となります。
条件分岐
条件分岐とは、「〜なら…しなさい」という命令の出し方です。たとえば「変数に入った値が1なら”Hello”と出力しなさい」というようなことができます。
i = 1 if i == 1 puts “Hello” end
反復構造
反復構造とは、繰り返し行いたい処理を行う際に用います。ほとんどのソフトウェアにおいて、条件分岐とともに反復構造も基礎構文として使われています。
i = 1 while i < 10 puts i i += 1 end
上のコードは、変数iが10未満の間、iを1ずつ増やし、その値を出力します。反復構造は、検索アルゴリズムの「線形探索」など、多くの場面で登場する基礎的な概念です。
配列
配列は、複数のデータを一つのまとまりとして扱う仕組みのことです。配列にデータをまとめて入れておいて、それぞれに対して処理を行うようなケースはとても多いです。
numbers = [1,2,3,4,5,6,7,8,9] numbers.each do |n| puts n end
また、上のケースで特定の値、たとえば8だけを取り出したして出力したいときは以下のようにアクセスできます。
puts numbers[7]
この [] の中に書いた数字を、インデックスと呼びます。注意したいのは、インデックスは1ではなく0からスタートするということです。そのため、8という値にアクセスするためには、7というインデックスを指定しています。
プログラミングの学び方まず作りたいものをイメージし、その方法を探ろう
photo credit: hackNY via photopin cc
さて、プログラミングの考え方について大まかにつかんだところで、これから勉強を始めようと思ったら何から始めるべきでしょうか。
プログラミングを始めるにあたって、書店に出向いたり、Google検索などをすると様々な言語・開発環境が見つかりますが、プログラミング上達のもっとも速い方法は、「最初に作りたいものを明確にイメージすること」です。あなたが身の回りにある、ちょっとした不便や、自分が使いたいと思うもの(たとえプログラミング学習ノート共有のWebサービス、位置情報をもとに現在地に最も近いバス停からの、次の出発時刻を出すスマートフォンアプリなど)をイメージしてみましょう。
世界中には、似たようなアイデアを実現している人がたくさんいます。まずGitHubにアカウントを登録し、さまざまなアプリケーションがどのように構成されているか覗いてみるのも良いかもしれません。
まずはHTMLと組み合わせてブラウザ上で動く「JavaScript」から始めてみよう
HTMLの学習を終えた方は、JavaScriptを用いて「自分が生まれた日から現在までの日数をカウントする機能」など、20〜30行程度でサンプルソースコードも多く出回っている題材を探してみて、実際に手を動かして作ってみてください。JavaScriptは、HTML内に埋め込むことで動作して、難しい環境構築なども不要です。
その次は、流行のWebアプリケーション開発フレームワークである「Ruby on Rails」などで、タスク管理ツールを作る、といった目標を立ててみると良いかもしれません。
2014年現在、Web上にはチュートリアル動画サイトなど無料の学習サイトが豊富な時代です。書籍を買って積ん読にするのではなく、1日1時間ずつ学習を進めてみましょう。一冊の本をおすすめするとすれば、『コーディングを支える技術 ~成り立ちから学ぶプログラミング作法』(技術評論社)など良いかもしれません。
【よくある質問】最初に何の言語を学べば良いか?
何の言語を学べばよいか、多くの人が質問をします。まずはそんなことは考えずに、自分が作りたいものをイメージしてみましょう。無数にある「プログラミング言語」は、どんな種類があり、どのようにカテゴライズできるのか。歴史や、設計思想についても、まずは自分なりに調べてみてください。
「何の言語から学ぶか?」この答えの一つに「最も身近にいる人が使っているプログラム言語から始める」というものもあります。
その他にも「実現したいサービスに合わせて学ぶ」「環境構築が不要なJavaScriptから学ぶ」や、「WordPressなどでも採用され、2000年代に多くの開発者が誕生したPHP言語」、その他にも「楽しくプログラミングするという設計思想のRuby」「スタートアップを中心に盛んに採用されている、RubyをもとにWebアプリケーションの枠組みを作りやすくするRuby on Rails(これ自体はプログラミング言語ではありません)」など、選択肢は様々です。
今の時代、新しいプログラミング言語・派生型言語もどんどん登場していますので、1つの言語に強くこだわる必要はないでしょう。まずはJavaScriptなどすぐに書けるもので「動くシステム」という成果物の創造の成功体験を小さく積み重ね、全体像から広く浅く学んでいくことをおすすめします。
【最後に】挫折ポイントは「環境構築」です
多くのプログラミング独学者に共通している挫折ポイントは、実はプログラミングそのものではなくて、自分のコンピューター上でプログラミングを行うための環境構築(=設定)です。環境構築の壁を超えて初めて「ものづくり」の楽しみを味わうことができます。本記事では全てを解説することはできませんが、環境構築には1週間や2週間かかったとしても、根気よく取り組んでみてください。今日から、あなた自身とコンピューターとの対話が始まります。
まだ、デジタルの世界は始まったばかりです。これから30年、50年後の世界をイメージしてみましょう。様々な社会問題や、人々のビジネスニーズ、経済的な課題が溢れているはずです。プログラミングを学び、アルゴリズムを通して問題解決手法をスキルとして身に付けることは、もはや専門職ではなく、全てのビジネスパーソンや、10代の教育にも良い影響をあたえることでしょう。
次回以降の連載では、PHPやRubyなど、各プログラミング言語ごとの設計思想や、簡単な構文などについて解説する予定です。
BRIDGE Members
BRIDGEでは会員制度の「Members」を運営しています。登録いただくと会員限定の記事が毎月3本まで読めるほか、Discordの招待リンクをお送りしています。登録は無料で、有料会員の方は会員限定記事が全て読めるようになります(初回登録時1週間無料)。- 会員限定記事・毎月3本
- コミュニティDiscord招待