2014-09-16

【随時更新】プログラムが上達するには ― レベルアップのヒント

martin-terber-cockpit.jpg

[ PR ]


(タイトル画像: Martin Terber ― Cockpit Poser)

「プログラムが書けるようになりたい!」 ― このページに辿り着いたあなたは、きっと一度はそう思ったはずです。

しかし、プログラムに関して一つはコンプレックスを持っていませんか?

  • 自分にはセンスがない
  • 技術が足りない
  • 時間がない
  • 無理やりさせられた

それでも、プログラマという職業は魅力的です。頭が良さそうで、給料も良い。すこし仕事が大変なだけ。

では、どうすればプログラムが書けるようになるのでしょうか。

<入門>

(1) 1つに言語を決める。

まずは、書き始めることです。考えていては何も進みません。

おすすめは、Processing(プロセシング)です。ほとんどの環境で何もせず動きますし、開発環境も揃っています。何より、楽しい絵が描けるというのが素晴らしいですね。

ここからダウンロードしてダブルクリックすると始まりますよ。

processing.png

animation.png

(2) 概念を知る

概念といえば難しそうですが、犬にはシェパードや柴犬があるというのも概念です。

同じように、プログラムの世界にも、言語(Processing、Java、Ruby...)や 文法(変数、ループ、関数、クラス...)のような概念があります。

Processingに関しては、それらのほとんどは『Built with Processing』という本に網羅されています。

出来るだけ多くの概念を知ることが、この次へのステップを楽にします。ただ、ここが一番時間がかかるので、半年〜1年くらいは気長にやりましょう。

Built with Processing[Ver. 1.x対応版] -デザイン/アートのためのプログラミング入門
田中 孝太郎 前川 峻志
ビー・エヌ・エヌ新社
売り上げランキング: 191,238
ifとelseの思考術 プログラマ脳育成講座
矢沢 久雄
ソフトバンククリエイティブ
売り上げランキング: 557,102

(3) 作る・壊す・また作る

入門の段階では、とにかく手で覚えることが大事です。例えば、『Built with Processing』に書いてある例を何度も反復して写しましょう。

日本には「写経」という言葉がありますが、何事も理解する前に覚えるのが重要です。

とにかく書いて覚えましょう。そうすると自然に楽しくなり、興味が湧いてきます。

<初級>

(1) 本を読む

入門から初級へと変化する段階では、基礎的な概念(変数やループなど)は理解しており、簡単なプログラムを見ても抵抗がなくなります。

例えば以下の様なコードです。

void setup(){
  size(100,100);
}

void draw(){
  background(255,255,255);
  fill(255,0,0)
  ellipse(10,10,30,30);
}

ここから次の段階へ進むには、より根本的な知識が必要になります。そのためには、さらに新しい本や情報を得て、詳しい知識を得ることが大切です。

例えば、なぜプログラムは動くのか、コンピュータとは何か、メモリとは何か、プログラミングの役割は何か、Processing以外にどのような言語があり、どの分野で活躍しているのか など、広く浅く知っておくことが大切です。

コンピュータープログラミング入門以前
岩永信之
毎日コミュニケーションズ
売り上げランキング: 543,289
プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識
矢沢久雄
日経ソフトウエア
売り上げランキング: 6,302

(2) プログラムを作り、改変する

初級程度では、簡単プログラムを言われた通り作れるようになる訓練が大切です。

そのためには、例えば解説書を読みながらテトリスのようなゲームを作ってみたり、電卓のような簡単なアプリケーションを作ることが大切です。

Processing アニメーションプログラミング入門
田中 孝太郎
技術評論社
売り上げランキング: 54,066
Excel VBA アクションゲーム作成入門 Excel 2007/2003/2002 対応
近田 伸矢 谷 孝一 武藤 玄 USA【うさ】 影斬
インプレスジャパン
売り上げランキング: 137,322

それを通じて、プログラミングの重要さや面白さが見に染みて分かるようになり、バグに出会うことで、臨機応変な対応が徐々に出来るようになります。

(3) プログラムを披露する

プログラミングは、1人でも楽しいですが、作ったものを披露することでより楽しくなります。

例えば、Scratchやスクイークといった、子供向けのプログラミング環境があります。これを使うと、簡単にプログラムを公開することができます。

プログラムを公開することで、公開(デプロイ)することの難しさを勉強できますし、みんなから幅広い意見をもらうことができるので、開発意欲も上がります。

小学生からはじめるわくわくプログラミング
阿部 和広
日経BP社
売り上げランキング: 1,890

<中級>

(1) 別の言語を知る

中級に上がる頃には、まとまったプログラム(100〜1000行程度)が書けるようになり、専門書がなくてもプログラムが出来るようになってきます。

この頃になると、Processingに飽きてくるようになり、他の分野に興味が出てきます。

すると自然に、ProcessingはJava仮想マシンで動いていること、上位互換の言語にJavaというものがあること、OpenGLという描画エンジンを使っていること などに興味が湧いてきます。

その意欲をそのまま活かして、一旦最初の言語は置いといて、いろんな言語や環境に視野を広げてみてはどうでしょうか。(多分この辺りで大きな挫折をすると思います)

やさしいJava 第5版 (「やさしい」シリーズ)
高橋 麻奈
ソフトバンククリエイティブ
売り上げランキング: 82,495

(2) 汎用言語(+標準フレームワーク)を一つ詳しくなる

実は、最初に紹介したProcessingは画像処理に特化した言語であり、汎用言語ではありません。

そこで、JavaCC++C#(・Ruby・Python・JavaScript)の中から、1つ選んで、とにかく詳しく知り、自分のパートナーとするといいと思います。

すると、自然と中級者から上級者にステップアップします。汎用言語があれば何でも作れるので、そのまま仕事にも繋げることもできます。

オブジェクト指向でなぜつくるのか 第2版
平澤 章
日経BP社
売り上げランキング: 22,645

(3) 様々なパラダイムに出会う

プログラミング言語というのは、 1つの考え方に基いて出来ているわけではなく、様々なケースに特化しているものです。

汎用言語とはいっても、手続き型言語、構造化言語、オブジェクト指向言語、宣言型言語 という1つのベクトルもありますし、他にも、静的型言語・動的型言語汎用言語・ドメイン特化言語プロトタイプ型言語、関数型言語 などといった様々な特徴があります。

そのような多様な世界の中から、いくつかピックアップしてその違いを知りましょう。

7つの言語 7つの世界
Bruce A. Tate
オーム社
売り上げランキング: 286,146

(4) データベース、Web、ゲーム、組み込みなどの知識を深める

もちろん上級者になるとすれば、プログラム以外にも知識を求められます。

ゲームプログラマになるならば、数学や物理、C++やOpenGL/DirectXの知識は必須でしょうし、Webプログラマになるならば、データベースやJavaScript、HTMLやCSSなどの知識は必須でしょう。

このように、単にプログラム言語学者になるのでなければ、現場では幅広い知識が求められます。

ゲームプログラマになる前に覚えておきたい技術
平山 尚(株式会社セガ)
秀和システム
売り上げランキング: 9,250
PHP+MySQLマスターブック
永田 順伸
マイナビ
売り上げランキング: 40,971

(5) コミュニティに参加する

上級者になるには、独りよがりの知識では実践には敵いません。

そこで、プログラマのコミュニティに参加することもときには必要です。

例えば、ZussarやAtndなどで勉強会を探してみると、いろんな人の集いが見つかります。飲み会で親睦を深めるのもいいでしょう。

勉強会が苦手ならば、ハッカソンに参加したり、発表会やコンペに出席するのもいいでしょう。

もちろん、時には踏み入れる勇気も必要です。

エンジニアとしての生き方  IT技術者たちよ、世界へ出よう! (インプレス選書)
中島 聡
インプレスジャパン
売り上げランキング: 91,988

<上級>

(1) 言語やフレームワークを作る

見事上級者になったあなたは、町ではちょっとした有名なプログラマになっていることでしょう。

そこで、ステップアップするには、1つ言語やフレームワークを作ることでレベルアップが図れます。

ゲーム業界では有名なUnityという開発環境がありますが、あれも誰かが作ったものです。もちろん、最初に紹介したProcessingもオープンソースです。

アイディアがわかなければ、GitHubSourceForgeGoogleCodeを見て勉強しましょう。ときにはコンパイラやバイトコードの知識も必要になりますが、それもステップアップのためです。

プログラミング言語を作る
前橋 和弥
技術評論社
売り上げランキング: 333,867
ガベージコレクションのアルゴリズムと実装
中村 成洋 相川 光
秀和システム
売り上げランキング: 409,801
GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)
大塚 弘記
技術評論社
売り上げランキング: 5,189

(2) 社内/社外勉強会に参加したり、転職をする

上級者になると、なかなか技術が上達しないものです。そこで、社内や社外の勉強会などに積極的に参加して、刺激を受けましょう。

就職・転職したり、よりレベルの高い会社を見学したりすることでも、より実践的な知識を学ぶことができます。

プロダクティブ・プログラマ -プログラマのための生産性向上術 (THEORY/IN/PRACTICE)
Neal Ford
オライリージャパン
売り上げランキング: 204,393

(3) よい道具を使う

レベルが上がってくると、効率も重視されてきます。そこで、良い道具を使いましょう。

例えば、キーボード1つ取っても、Realforce、HHKB など優れた逸品があります。メンブレン式、メカニカル式、静電容量式など、良い道具には必ず理由があります。

特に、エディタは良い物を選びましょう。昔からあるものでは、Vim、Emacs といった、歴代のプログラマが使ってきたものもありますし、TextMate、Sublime Text のように、最近台頭してきたものもあります。

作業効率に直接関わるものですので、吟味して選びましょう。

東プレ NG01B0 REALFORCE91UBK
東プレ (2006-02-25)
売り上げランキング: 732
開発ツール徹底攻略 (WEB+DB PRESS plus)
Junio C Hamano 大塚 弘記 川口 耕介 kana 大竹 智也(tomoya) 尾藤 正人
技術評論社
売り上げランキング: 24,032

(4) コードリーディングをする

作業に没頭していると、なかなか他人のコードを見ることは少ないものです。

最近ではGitHubなどに良質なコードが多数アップされています。特に、ls、cd、curl のようなLinuxのコードを読むと勉強になります。Processingなどのフレームワークを読み解くのもいいでしょう。

フレームワークを利用するときに、中身を理解していなければただのブラックボックスとなり、リスクも伴います。必ず同様のオープンソースを読み、理解することが大切です。

巨人の肩の上に乗ることもたまには必要です。今の作業のヒントになることもきっとあるでしょう。

lsを読まずにプログラマを名乗るな!
藤原 克則
秀和システム
売り上げランキング: 212,306

(5) バイトコードを知る

C++言語のコーダーは、アセンブラを知ることで知識を得ると言います。

同様に、JavaのコーダーもJava仮想マシンバイトコードを知ることで、開発の役に立てる事ができます。

バイトコードを知ることで、Javaに最低限必要な物が何かを知ることに繋がりますし、言語やフレームワークを開発する助けにもなります。

それを支援するツールとして、javapや、asmJasmin といった道具を活用しましょう。GroovyやAspectJなどにもバイトコードの動的変更が使われています。

コンパイラ (未来へつなぐ デジタルシリーズ 24)
佐渡 一広 寺島 美昭 水野 忠則
共立出版
売り上げランキング: 1,380,597

(6) テストを重視する

実際の現場では、アイディアも大事ですが、製品の品質が問われます。品質を向上させるツールが『テスト』です。

有名なものに、xUnit(JUnit、PHPUnit、PyUnit)、RSpec、TestNG、などがあります。

特に、RubyやPythonなどの動的型付け言語では、テストは仕様書となります。型によるチェックが少ないので、最も大事なドキュメントになるのです。

テストを極めると、TDD (Test Driven Development)や、BDD (Behavior Driven Development)を知ることになり、アジャイル開発にも通じます。テストを蔑ろにしないように。

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)
渡辺 修司
技術評論社
売り上げランキング: 13,894

(7) 英語をスムーズに読める・話せるようにする

高いレベルになるほど、情報源は少なくなってきます。そこで、英語を学習することでStackOverflowHackers Newsといった海外の情報を吸収し、コミュニケーションを取る事ができるようになります。

英語の学習は1日で上達するものではないので、毎日少しずつ学習しましょう。

良い本を手に入れることでも達成できるレベルは違ってきます。

早く上達したければ、英英辞典を使い、詳しい文法書を持ちましょう。

ロイヤル英文法―徹底例解
綿貫 陽 須貝 猛敏 宮川 幸久 高松 尚弘
旺文社
売り上げランキング: 3,740
基礎英文問題精講 3訂版
中原 道喜
旺文社
売り上げランキング: 2,098
英辞郎 第八版(辞書データVer.141/2014年8月8日版)

アルク
売り上げランキング: 10,320

(8) オン・オフを付ける

作業に没頭していると時間を忘れがちで、特に難しいことを考えていると家に帰っても作業をしてしまうものです。

そうすると生活が不摂生になり、体調を崩すことも増えてきます。

そういうときは、思い切って音楽を聞いたり、映画を見て、リフレッシュすることが大切です

人間何事も休みなくすると辛いものです。自分だけでは難しい時は、家族や仲間に支えてもらいましょう。

もし体調を崩した時は、思い切って会社を休む勇気もときには必要です。

〈増補改訂 第2版〉いやな気分よ、さようなら―自分で学ぶ「抑うつ」克服法
夏苅 郁子 小池 梨花 野村 総一郎 David D. Burns 佐藤 美奈子 林 建郎
星和書店
売り上げランキング: 5,810

(9) Lispを知る

多くのプログラマは手続き型言語をベースにした言語を使っています。

新しいアイディアや刺激を得るには、積極的に関数型言語に触れ、メタプログラミングを習得しましょう。

新しいパラダイムを知ることでより技術と知識に深みが出てきます。

その一方で、C言語を極めることも忘れないで下さい。メタプログラミングを極めると同時に、メモリ管理や低レイヤーの知識も必要です。

ハッカーと画家 コンピュータ時代の創造者たち
ポール グレアム
オーム社
売り上げランキング: 7,266
On Lisp
On Lisp
posted with amazlet at 14.09.16
ポール グレアム 野田 開
オーム社
売り上げランキング: 150,522
省メモリプログラミング―メモリ制限のあるシステムのためのソフトウェアパターン集 (Software patterns series)
ジェイムズ ノーブル チャールズ ウィアー
ピアソンエデュケーション
売り上げランキング: 424,568

(10) 哲学を知る

最後に、過去の偉人たちがどのようにして今を創っていったかを知ることも重要です。

特にUNIXの哲学や、C言語が出来るまで、仮想マシンの経緯など、知ることで得るものは大きいです。

是非、常に好奇心を持つことを忘れずにいたいですね。

UNIXという考え方―その設計思想と哲学
Mike Gancarz
オーム社
売り上げランキング: 35,156
プログラマが知るべき97のこと

オライリージャパン
売り上げランキング: 20,925
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
Dustin Boswell Trevor Foucher
オライリージャパン
売り上げランキング: 1,442
詳説 正規表現 第3版
詳説 正規表現 第3版
posted with amazlet at 14.09.16
Jeffrey E.F. Friedl
オライリージャパン
売り上げランキング: 238,509
コンピュータプログラミングの概念・技法・モデル(IT Architect' Archiveクラシックモダン・コンピューティング6) (IT Architects’Archive CLASSIC MODER)
セイフ・ハリディ ピーター・ヴァン・ロイ Peter Van-Roy Seif Haridi
翔泳社
売り上げランキング: 367,634

まとめ

どうでしたか?参考になることが1つでもあれば幸いです。

とにかく、自分を棚に上げてすみません(笑)

今回は、職業プログラマーとして仕事が出来る人のうちで、プロジェクトを主導したり、仕事内容や使っているフレームワークの詳細を理解できる人を上級者と定義しました。

プログラマには暗いイメージがつきまといますが、全体のレベルが上がってくればいつかはTwitterやFacebookのように、高いレベルへと認識が変わることを期待します。

何かわからないことがあれば、いつでもFacebookページに質問を下さい。

コメントはTwitterアカウントにお願いします。

RECENT POSTS


[ PR ]

.