- この記事を読めば
- 「プログラミングがなにか」が分かります。
- どうやって勉強すれば良いかも書いています。
先ず、僕の学歴・経歴から紹介します。
僕は情報系の大学・大学院を卒業して、今は医薬系の企業でCTOをしています。
僕の経歴
- 大学、大学院はIT系
- 新卒でコア30銘柄採用のメーカーにITエンジニア職で就職
- 米ランキング一位の大学に通信プログラムを納品
- Appleストアに自分のiPhoneアプリを配信
- 現在は医薬系の企業のCTO
こうやって経歴だけ見ると、さぞ凄いんだろうなと思われます。
その逆です。
大して頑張らないで「脱力系」で生きてきました。
※プログラミングで「脱力」して生きていこうと言いたい訳ではありません。
今、社会・企業ではDXと声高に叫ばれています。
それに伴いIT人材の需要がますます上がっています。今後もIT人材のニーズは高まっていく一方です。
本記事では一人でも多くの方にプログラミングが出来るようになってもらいたいと思って、初心者の方に向けて「プログミングとはなにか?」を解説していきたいと思います。
プログラミングとはなにか?
function add_ad_before_h2($content) {
$h2ad = ''; // ブログパーツ H2すべて
$h2ad_ymm4 = ''; // ブログパーツ H2ymm4
$h2ad_gaming = ''; // ブログパーツ H2ゲーミングPC
$h3ad = ''; // Advanced Ads 期間限定
/* $h2 = '/<h2>.+<\/h2>/u'; // H2見出しのパターン */
$h2 = '/^<h2.*?>.*?<\/h2>$/im'; //H2見出しのパターン
$h3 = '/^<h3.*?>.*?<\/h3>$/im'; //H3見出しのパターン
// 投稿ページ
if ( ( is_single() && !has_tag( array('no-ads') ) ) || ( is_page() && !is_page( array(55968) ) ) ) {
if ( preg_match_all($h2,$content,$h2s) ) { // H2見出しが本文中にあるかどうか
for ( $i=1; $i<count($h2s[0]); $i++ ){ // SWELLの目次にバグが出るので2つ目のh2タグから表示
if( has_tag( array('ymm4') ) ){
$content = str_replace($h2s[0][$i], $h2ad_ymm4.$h2s[0][$i], $content);
} elseif ( has_tag( array('gaming') ) ){
$content = str_replace($h2s[0][$i], $h2ad_gaming.$h2s[0][$i], $content);
} else {
$content = str_replace($h2s[0][$i], $h2ad.$h2s[0][$i], $content);
}
}
}
if ( preg_match_all($h3,$content,$h3s) ) { // H3見出しが本文中にあるかどうか
for ( $i=0; ($i*3)<count($h3s[0]); $i++ ){
$content = str_replace($h3s[0][($i*3)], $h3ad.$h3s[0][($i*3)], $content);
}
}
if ( get_post_type() === 'post' ) {
// preg_replace:指定回数で
$content = preg_replace('/^<p/im', $figures[0][0].''.'<p', $content, 1); // ブログパーツ Word Balloon(プロフィール)
}
}
return $content;
}
add_filter('the_content','add_ad_before_h2');
さっそく本題の「プログラミングとはなにか?」ですが、上を見て下さい。
これが「プログラム(プログラミング)」です。
僕のサイト上で実際に動いているプログラムです。
まぁ、僕のプログラムを見れるなんて"かなりレア"です。
手短にウンチクを垂れると、このプログラムには"正規表現"と言われる文書処理のテクニックを組み込んでいます。
このプログラムで出来ること
- 数百以上ある広告を表示
- 文脈の適切な箇所に広告を挿入
- 200以上ある記事に表示する広告を管理
短く見えるこのプログラムが達成していることは「かなり多い」です。
そして、かなり価値があります。
200以上ある記事に手作業で広告を一つ一つ表示する手間を考えれば、このプログラムの価値を分かってもらえると思います。
膨大な作業を一瞬で操作できるのが「プログラム」です。
実際、会社で作ってきたプログラム(プログラミング)
#! /usr/bin/perl -w
use strict;
use warnings;
use Time::Local;
use File::Basename;
use File::Copy qw/copy move/;
# 引数が無ければ終了する
print "error: copy.pl \$1 ... \$n \n" and exit unless($#ARGV == 0);
our @COPY_DIRS = ();
open IN, "<copy.conf" or die "$!";
my $i = 0;
while (<IN>){
$_ =~ s/\x0D?\x0A?$//;
$COPY_DIRS[$i++] = $_;
}
#Perlでは、グローバルを大文字、レキシカル変数を小文字にする。
our $FROM_MOV_DIR = $COPY_DIRS[0];
our $TO_MOV_DIR = $COPY_DIRS[1];
our $FROM_THUMB_DIR = $COPY_DIRS[2];
our $TO_THUMB_DIR = $COPY_DIRS[3];
#コピー先ディレクトリが無ければ作成する。
unless( -d "$TO_MOV_DIR"){
mkdir "$TO_MOV_DIR";
}
unless( -d "$TO_THUMB_DIR"){
mkdir "$TO_THUMB_DIR";
}
our $TO_TARGET_DIR = 1;
our $TO_TARGET_FILE = 1;
# 警告を捕捉して、処理を実行する。
#local $SIG{__WARN__} = sub {
# print $_[0];
#};
LP: while (<>) {
$_ =~ s/\x0D?\x0A?$//; #改行文字を削除
my $target = $_;
print "target=$target\n";
my $dir = $TO_TARGET_DIR;
print "36dir=$TO_TARGET_DIR\n";
print "$TO_TARGET_FILE\n";
while(){
if( -d "$TO_MOV_DIR/$dir"){
#ディレクトリがあったらファイル走査
for($TO_TARGET_FILE..10){
if( -f "$TO_MOV_DIR/$dir/$dir$_.mp4"){
#ファイルがあったらコピーしない。
print "$dir$_.mp4\n";
}else{
#ファイルが無かったらコピーする。
#copy "$FROM_MOV_DIR/$target.mp4", "$TO_MOV_DIR/$dir/$dir$_.mp4" or die "Can't copy $target to $TO_MOV_DIR/$dir/$_.mp4 : $!"; #ここのout.txtを変数にする
copy "$FROM_MOV_DIR/$target.mp4", "$TO_MOV_DIR/$dir/$dir$_.mp4" or warn "Can't copy $target to $TO_MOV_DIR/$dir/$dir$_.mp4 : $!" and print"hoge\n"; #ここのout.txtを変数にする
$TO_TARGET_FILE = $_;
$TO_TARGET_FILE++;
if($TO_TARGET_FILE > 10){
$TO_TARGET_FILE = 1;
$TO_TARGET_DIR++;
print "dir=$TO_TARGET_DIR\n";
}
next LP;
}
}
}else{
#ディレクトリがなかったらディレクトリを作成してから、$targetをコピー
mkdir "$TO_MOV_DIR/$dir";
#copy "$FROM_MOV_DIR/$target.mp4", "$TO_MOV_DIR/$dir/$dir"."1.mp4" or die "Can't copy $target to $TO_MOV_DIR/$dir/1.mp4 : $!"; #ここのout.txtを変数にする
copy "$FROM_MOV_DIR/$target.mp4", "$TO_MOV_DIR/$dir/$dir"."1.mp4" or warn "Can't copy $target to $TO_MOV_DIR/$dir/$dir"."1.mp4 : $!" and print"hoge\n"; #ここのout.txtを変数にする
$TO_TARGET_FILE=2;
next LP;
}
$dir++; # $TO_TARGET_DIR の値とズレるので注意する。
$TO_TARGET_DIR++;
}
}
プログラム(プログラミング)が、実際に会社でどのように役立てられているか紹介します。
上はPerlという言語で書いたプログラムです。
まぁ意味を細かく理解しなくても構いません。
このプログラムを実行すると、該当するフォルダや、ファイルをすべて任意のフォルダに移動させます。
このプログラムは何に役立ったか?
誰もが知るメーカーの製品データを、このプログラムですべて移行させました。
まぁ、よくも悪くも会社で役立つプログラミングスキルは"この程度"でしかありませんが。
このプログラムで膨大にある作業の手間・時間を削減することが出来ました。
ただ、僕が考えるプログラミングは、より"創造的"に新しいサービスを作るための能力であるべきです。
仕事・就職のために学習するプログラミングは「価値がない」。
僕の意見ですが、仕事・就職のためにプログラミングを学習しても「価値がない」です。
仕事・就職のためにプログラミングを学ぼうとする初学者にとって、出鼻を挫く言い方になって申し訳ないです。
理由は、業務を効率化する程度のプログラミングは役に立たないからです。
それどころか、自分のキャリアをIT土方たらしめるだけで「視野が狭くなる」だけです。
ということで、日本ではほとんどの人がITから離れます。
なので、日本ではITスキルを活かす場はありません。
どれだけやっても少ない給料で、ずっと高度になり続ける技術を求められ続けます。
少なくとも日本では、これがずっと続きます。
ただ、そういう日本の職業観に矛盾するようにしてITスキルの需要は上がる一方です。
僕が思うにIT人材を目指す時点で「孤立してでも自力で何かを成し遂げる覚悟」が必要になると思います。
僕も例に漏れずそうやって組織から孤立して人生を歩んでる気がします。
プログラミングを学習する(身につける)には?
プログラミングを学習する(身につける)には?と悩む方は多いと思います。
なぜなら、プログラミングに関する書籍、スクール、動画など選択肢がありすぎて「どう学習すれば良いか?」が分からないからです。
僕なりのプログラミング学習法
- 必ず手を動かす(自分でプログラミングする)
- 手軽に済ませる(高額なスクールに通わない)
- 書籍も最低限にする
Web上で安く勉強するなら「progate」をオススメします。
理由は、学びながらきちんと手を動かすからです。
プログラミングを学ぶ上で最重要なのは手を動かすことに尽きます。
また、プログラミングスクールは、よほどお金に余裕がない限りはオススメしません。
ITに関して言えば、お金を払って何かを学ぶという姿勢ではキリがないからです。
さて、一番オススメするやり方を言うと。
結局は"エンジニア"に教わることです。
書籍で勉強すると、必ず文法から始まります。
はっきり言いますが、あれを丸覚えしても世にあるアプリを作れるようになりません。
情報系の学生ですら"書籍を読んでも作れるイメージが湧かない"と言う始末ですから。
プログラミングのきっかけは「データ構造」から掴む!
さて、エンジニアに学ぶと言われても、身近にITエンジニアがいません。
まぁ大企業にもいません。
実際、数万人いる企業ですら、まともにプログミングができるITエンジニアはめちゃくちゃ少ないです。
Word、Excel、パワポの使い方に詳しいITエンジニアなら腐るほどいますが。
なので、自分で言うのも何ですが「僕に習うのが良い」と思います。
少なくとも、この記事は無料でありながら、読めば人生の学習時間の短縮にはなると思います。
と言うことで、プログラミングの「つかみ」が、この記事で分かります。
プログラミングのつかみ、、、それは「データ構造」です。
データベースでも、データを読み取ろうとかではありません。
「データ構造」は、プログラム(プログラミング)の土台づくりです。
プログラミングの土台となる「データ構造」とは?
理系の学生は、四年時に研究室に配属になります。僕はいわゆる人気のない研究室に一人だけ配属となりました。
すべて僕の計算通りだったのですが、これの何が良かったか?
その研究室は、学科で一番プログラミングが出来る先生がいる研究室だったからです。僕は、毎日その先生を独り占めしてマンツーマンでプログラミングを教わりました。
一年経って、僕のプログラミングスキルは恐ろしく上達していました。
そんな先生が良く言っていたのが「データ構造が大切」ということです。
プログラミング上達は「データ構造」を作る練習から
情報系の学生ですら「データ構造」の重要性を理解している人は少ないです。
その言葉からデータ構造≒データの集まりと連想する人は多いと思いますが違います。
「データ構造」は現実の事象(とそのパターン)に対して意味づけしたデータのことです。
例えば、プログラムで「じゃんけんゲーム」を作って下さい。
と言われて困りませんか?
何をどうアプローチすれば良いのか分からない。
これがプログラミングで最初にぶち当たる壁です。
1.「じゃんけんゲーム」のデータ構造
さて、「じゃんけんゲーム」のデータ構造の例です。
言葉よりも、実際に見た方が早いです。
「じゃんけんゲーム」のデータ構造の例
/* プレイヤー */
#define IAM 0
#define CPU 1
/* 出し手 */
#define PA 0
#define CHOKI 1
#define GU 2
/* 勝敗 */
#define LOSE 0
#define TIE 1 /* 単語はDRAWでも何でも良い */
#define WIN 2
/* プレイヤー情報(自分or相手、手)を格納する構造体 */
typedef struct Player {
int player;
int te;
} Player;
上が「じゃんけんゲーム」の「データ構造」です。
「データ構造」では「事象」と「パターン」を精査します。
何をどう考えているのか分からない?という方は、机上で下をなぞってみて下さい。
- プレイヤー:「自分」「相手」の2パターン
- 手:「ぐー」「ちょき」「ぱー」の3パターン
- 勝敗:「勝ち」「あいこ」「負け」の3パターン
大切なことは、事象とそのパターンを網羅して意味づけして、データ(情報)として扱えるようにすることです。
そして、そのデータに機能(振る舞い)を与えるとプログラムになります。
「じゃんけんゲーム」の機能の例
/* 引数にプレイヤー情報を与えたらじゃんけんの勝敗が判定される。 */
int judge(Player p, Player cpu);
2.「○✕ゲーム」(三目並べ)のデータ構造
次は、○✕ゲームの「データ構造」を考えます。
上の「じゃんけんゲーム」では、すべて事象(とそのパターン)を定数で定義しましたが、この辺は自由に変数と定数を組み合わせて、使いやすい形に「データ構造」を考えます。
「○✕ゲーム」(三目並べ)では、定数と変数を組み合わせて「データ構造」を作ってみます。「○✕ゲーム」(三目並べ)の事象(とそのパターン)は、プレイヤー:「自分」「相手」の2パターン、手:「○(まる)」「✕(ばつ)」の2パターン、勝敗:「勝ち」「あいこ」「負け」の3パターン、その他に盤面:3x3の盤面情報です。
「○✕ゲーム」(三目並べ)のデータ構造の例
/* プレイヤー */
#define IAM 0
#define CPU 1
/* 出し手 */
#define MARU 0
#define BATSU 1
/* 勝敗 */
#define LOSE 0
#define TIE 1 /* 単語はDRAWでも何でも良い */
#define WIN 2
/* 盤面 */
#define TATE 3
#define YOKO 3
typedef struct Game {
int turn;
int board[TATE][YOKO];
} Game;
次に機能(振る舞い)を考えます。「○✕ゲーム」(三目並べ)の場合は盤面情報から勝敗を判定する機能が必要です。勝敗判定の中身までは記述していませんが、皆さんで考えてみると良いでしょう(作ったもの出来は僕が採点しても構いません。)。○✕ゲームを「データ構造」としてプログラム(C言語)で表現すると下記になります。これがプログラミングの土台です。
「○✕ゲーム」(三目並べ)の機能の例
int judge(Game game);
この後のプログラミング(実装)については、かんたん思考ルーチンありのCPUを実装する方法も含めて詳しく記事にしています。「データ構造」が、具体化される流れの確認として参考にしていただければ幸いです。
3.「身長・体重を管理するアプリ」のデータ構造
本ケース「身長・体重を管理するアプリ」は、気持ちとしてフワッとするような「データ構造」のケースです。
理由は、カチッと決まる定数値が少なく、変数によって管理される「データ構造」であるためです。
こうでなければならないという解はありません。
僕の「データ構造」を示すなら、日毎に入力を促すパターンで、データが都度増えることを想定した下記です(これを動的データ構造と言います。)。
ただし、直感として僕のこの「データ構造」だと中途半端な気がします。
後の入力受付部のコーディングで、この「データ構造」を適宜修正してより管理しやすい形に修正すると思います。
実際のプログラミングにおいては、最初から100%の「データ構造」になっていなくてもかまわないのです。お
そらく、データを一意に決める識別番号の定義をどこかに組み込むと思います。
「身長・体重を管理するアプリ」のデータ構造の例
typedef struct Body {
char name[256]; /* 名前は初回だけ入力 */
struct tm *today; /* 測定日付の取得 */
double height;
double weight;
} Body;
コメント