2013-03-27

プログラミングの初級になるためにの目次

http://anond.hatelabo.jp/20130325172822 の続き

言語Java7を想定。(Java8が迫っていますが、Lambdaなど関数型は、まだ早いと言うことで)

定理由は、C++比較して学べるところが大きく、安全シンプル言語から

※いきなりJavascriptはやめとけ、PHPは論外。

RubyScalaでないのは、筆者が初心者には適切には教えられないから。

おもちゃToyとしてjQueryで遊ぶのは、悪くは無いと思う。

0.はじめに

これ以降は名著の紹介や学習方法の紹介が主体となります。名著のコンポジションという形が時間限界ですね。

量については「初級になるなら、専門書を計3,000ページは修得することは覚悟してね」なんて言ったりしています

Javaで初級のわかりやすい指標ですと、[amazon:Effective Java]とGoFまでの修得。

初級になるまでに登竜門への挑戦期間を含めて、3~4年はかかっても仕方が無いとも思います

※逆に「一山いくらのコーダー」というのは、Effctive JavaGoFが達成している技術も知らずに「自分Javaプログラマー」だと誤解してしまっているような人達です。

そういったコーダーは何年経とうとも初級プログラマーにすら敵いません。

初級を目指して、プログラミングを楽しんでください。

ただ、学ぶべきことはべらぼうですが、「各分野毎に、エレガントな方法がある。だから探して修得する」ということが大切です。

※「一を聞いて十を知る」ような優秀な人に、50冊くらいドーンと本を置いてあげて、各本の目次を読ませるだけで、

底の見え無さを悟ってくれたりすると、嬉しくなってしまます

※余談ですが、その底の見え無さは数学という学問のものですね。例えば、関数型言語の底流に「圏論」というここ100年の最新の数学があります

また中級くらいで、Liskovの置換原則などが載っている本を紹介しますが、

そのLiskovの置換原則の周辺で出てくるcovariant(共変)って、圏論という数学概念だったりします。

数学出身としては、数学現実に活かされている嬉しい事例です。

閑話休題

1.目次

1)エディター・コマンドライン正規表現友達

「速く正確に大量の出力」という能力は、プログラミングをする上でも、ドキュメントを書く上でも、何より「つまら仕事」の時間圧縮ができるようになるため、重要です。

スローガンとしては「思考のスピードで出力することを目指そう」です。

紹介するエディターはemacsvimExcelです。ついでにIMEとしてATOKを使用しているため、ATOK操作Emacsライクにする話も紹介します。

ExcelWindows環境Meadowすら入れさせてくれない場合最後の砦という扱いです。

コマンドラインは、「コマンドラインというものがある」「時として非常に強力である」程度の紹介です。

※筆者はzsh全然使えません。使いこなしている方々と接する度に「勉強しなきゃな~、でも、あっちの方を先にやりたい・・・」とグズグズして、はや何年・・・

正規表現は置換を用いて、テキストの一括編集重要です。後、遭遇したくない事態ですが、スパゲッティコードの解析をする上での最後の砦です。

※遭遇したくない例

ん?何か変なところで副作用のある処理があるようだなぁ(消沈)、SQLのInsertかUpdateか一応Mergeも使っているところから逆算して原因箇所を探すか・・・(諦念)

この糞コードがっ!!こんなところに書くんじゃねぇ!!(憤怒激高)

(ここで、他にやらかしていそうな似たようなコード正規表現grep検索。改行コード込みにすれば複数文検索も可能)

わはは、予想通り共通化すべきロジックメソッドがそこら中にある・・・

2)アルゴリズムに始まりアルゴリズムに終わる(データ構造アルゴリズムの一部という認識言葉を使っています)

入門編で一つLinkedListというアルゴリズムを学びました。

少なくとも一つ本を読みながら自力でアルゴリズムを学べる人なら、大成できる可能性があります

前に紹介した[amazon:C++実践プログラミング]には、LikedListやStackなど基本的なアルゴリズムが載っておりますが、

これに加えて、初級になるためにはこれくらいは知っておいて欲しいというものを紹介します。

※後、最初から必ずしも手を出さなくても良い上限も紹介いたします。

3)正・不正の定式化・自動テスト・ロギング・アサーション・例外・契約プログラミング

プログラムは、データ入力して、加工して出力・保存する処理の繰り返しです。

まり、各一連の繰り返し毎に、「正しい入力」「正しい出力」を定式化する必要があります

それを人間の手では無くコンピューターやらせられるように、つまり自動テストできるようにテストプログラミングします。

そこで処理の進捗を確認するためにロギングし、処理が想定通りであるかをアサーションでチェックし、

不正入力不正な出力=例外が起きたら、対処策をプログラミングします。

(ex 途中で処理を中断して、入力者に適切な入力メッセージを伝えてあげる。入力自動補正などもあり得る)

で、ここら辺をまとめてどうあるべきかとして「契約プログラミング」があります

※余談。定式化・テストに際して、数学畑の人間としては、Javaだとequalsのオーバーライドでも必要になるし、同値関係同値分割だけでなく、集合論群論から学んで欲しい・・・(ここいらは数学科学部1~2年の学習内容)

4)名著を読め、新たな名著を探せるようになれ・素晴らしい人を見つけたら、縁を大切に

名著は英語で読みましょう。名著が名著たる由縁は、度々引用されることにあります

まり最新の技術書を読むときに、引用された名著のフレーズが、新旧のリンクをなし、理解の助けになります

対話は学問をする上で非常に重要です。

壁打ちといって、独り言で思考補助をするよりも遙かに有益です。

※素晴らしい師匠を探すなら、大学行くのが一番ですが、見聞を広げていく中で出会いを待つしかないとも思います

5)オブジェクト指向とはなんぞやとGoFデザインパターン + マルチスレッドプログラミング

マルチスレッドが難しいのは「バグを起こしにくいプログラミング」を求められるから

まりTry and Errorからの決別が求められ、今後の仕様変更拡張も踏まえて慎重に慎重にデザインする必要があります

できる限りステータス変数を持たずに安全に、でもマルチスレッドにするのだから効率を追求しなければ本末転倒

でも効率のためにはメモ化に代表されるキャッシング必須と、アンビバレンツな要素のバランス取りが難しい。

このために、リエントラントな実装・抽象と実装の分離など様々なエッセンスを駆使することが必要です。

床屋哲学者問題

6)日々コツコツと

というよりも孔子曰く、知っているよりも好きであること。好きであることよりも楽しめることのほうが強く、

気づいたら日々時間が許す限りプログラミングをしてしまうのが理想です。

仕事として嫌々スキルを磨かなきゃということが、これほど不幸な職業も無いですね。

余談 FizzBuzz写経について

FizzBuzz」は、本来の目的通り、協力会社の選定の際の足切りには便利ですが、

学習の達成度を測るには、簡単すぎる不適切な問題ですね。

写経

数学畑の人間として言わしてもらうと、

写経数学証明問題を、教科書テンプレ通りに、数値や名称だけ変えて記述することしか出来ない人の発想。

まり矛盾無く一貫した論理モデル」の構築が自由に出来ず、テンプレの微修正しか出来ない人の発想。

また、外部の「矛盾無く一貫した論理モデル」の吸収が不自由で、アルゴリズムを「手順」としてしか捉えられないように見受けられる。

プログラマーとしての大成は見込めないと思う。

数学畑として提供できる試金石

連続であること確かめるための「ε-Δ論法」(数学科学部1年の学習内容)

事前知識無く、このモデルを理解できる人は、十分に「矛盾無く一貫した論理モデル」を構築できる人。

1.まず「連続」とは何ぞやと考えて概念を膨らませてください。

2.十分思考できたと思えたら、Wikiあたりでイプシロン デルタ論法を見てください。

記事への反応 -
  • プログラムの定義 プログラム:定義づけられた物事を進めていく妥当な手順・方法の決定、および物事・手順・方法の記述書 プログラミングの定義 (コンピューター)プログラミング:コン...

    • http://anond.hatelabo.jp/20130325172822 の続き 言語はJava7を想定。(Java8が迫っていますが、Lambdaなど関数型は、まだ早いと言うことで) 選定理由は、C++と比較して学べるところが大きく、安全でシ...

      • 増田が実際にプログラミングしている分野を知りたい

      • http://anond.hatelabo.jp/20130327020050 の続き emacsを使う意味 キーバインドのおかげで、掌を左右に動かす必要が少なく、動きが小さい分速くなります。加えて動きが小さいためホームポジショ...

        • キーバインドがどうしても覚えられなくてEmacsやVimはあきらめました

          • いまどき、普通のハッカーはそこらの人よりEclipseやVisualStudioを上手に使いこなしますよ。 この手の、むやみに自分の趣味を押しつけてくる手合いにはろくなやつはいません。 それより...

            • 横だけど、VisualStudioに関しては、クソなものも多いMS製品の中でも屈指の神ツールだと思う。 VSに比べたらEclipseなんて使ってらんないし、xcodeもかなり微妙。 VisualStudio for macとかfor linuxと...

            • 横だけど、VisualStudioに関しては、クソなものも多いMS製品の中でも屈指の神ツールだと思う。 VSに比べたらEclipseなんて使ってらんないし、xcodeもかなり微妙。 VisualStudio for macとかfor linuxと...

        • http://anond.hatelabo.jp/20130327182715 上の候補に戻す場合や誤入力を消す場合に、結局BSや矢印キーを押すことになってしまいます。 ……?? 私は、1つ上の候補に戻したい場合はShift-Spaceを押...

          • 漢字変換の最中というIMEが動作握っているときですと、emacs上でもC+hは押しても、 前文字を一文字消すにはなりませんよ。 日本語入力するとき、タイポしてからそのまま変換したときに...

          • 漢字変換の最中というIMEが動作握っているときですと、emacs上でもC+hは押しても、 前文字を一文字消すにはなりませんよ。 日本語入力するとき、タイポしてからそのまま変換したときに...

          • 漢字変換の最中というIMEが動作握っているときですと、emacs上でもC+hは押しても、 前文字を一文字消すにはなりませんよ。 日本語入力するとき、タイポしてからそのまま変換したときに...

    • とりあえず「プログラマー」と呼んでいる職業の具体的な対象をもう少し定義した方がいいと思うよ

    • 間違ってはいないが、業務系の現場ではポインタよりも先にオブジェクト指向を抑えておいて欲しいというのが本音。 LinkedListをスクラッチできる人なら、すぐ理解できると思うけどね。...

    • http://anond.hatelabo.jp/20130325172822 正直、プログラミング初学者にやたらc言語とポインタ学習を勧める風潮には辟易している。   ポインタは何にでも使えすぎるんだよ。自由すぎる代わりに...

      • 「関数ポインタを駆使しろ」というわけでも無く、 LinkedList程度なら「ポインタを使いこなす」には到底及ばない「簡単な話」という認識。 >>やるとしてもそれは直接叩くのではな...

        • 見づらくて保守性の低いコードを書く奴より、多少コストが高くても読みやすいコードを書く人の方が好かれる。

          • コスト度外視は三流、コストを考えて二流、コストパフォーマンスを考えてようやく一流。

          • 連結リストとSQLのループ分解程度で見辛いなんていう人初めて見た。 よくてSIer営業だよね?まさかプログラム書いてないよね?

            • 多分そこにいるのは 「連結リストとSQLのループ分解程度で見辛いなんていう人」 じゃなくて、 「相手の文も読まずに適当に上から目線を開陳する人」 というだけだと思う。よくいる、...

      • いやだからさ、ここで言ってる「プログラマー」っていうのは、制約多くてAPIも大して整備されてないゲーム専用機上で超綺麗なリアルタイムレンダリングするエンジン開発するぜ!サ...

        • 筆者としては、ゲームプログラマーの話は、「プログラミング入門」からは離れた尖った話だね。 明日以降の日記で書く「プログラミング初級者」以降の分化した世界の話だね。 そして...

        • 筆者としては、ゲームプログラマーの話は、「プログラミング入門」からは離れた尖った話だね。 明日以降の日記で書く「プログラミング初級者」以降の分化した世界の話だね。 そして...

    • 不勉強なもので教えて頂きたいのですが、「LinkedListの入れ子でTree構造をつくり」というのは、どういう意味でしょう? 普通、木構造といえば、ノードは子ノードを2つ以上持てるようなも...

      • 横だけど、君の日本語の解釈がおかしいだけじゃね。 struct Node{uint nchild;Node **children;} とかやればいいんじゃないの?

        • 具体的なコードを出していただいて助かります。もしかして、中間テーブルをmallocしろ、という話ですか?? あと、これは連結リストにもなっていないようですね。(ま、キャストすれば無...

      • もしかすると、連結リストの各ノードに保存するcharなどのデータのかわりにポインタを入れればいいだろう、という話なのかもしれませんが、それだと「入れ子」とは言わないでしょ...

        • それは「今はC++の話をしているから」ですね。 あいにくLispはよく知りませんが、Lispの場合はタプルに実データだろうが他のタプルへのポインタだろうが何でも入れられるので、連結リ...

          • C++ははるかな昔にBetter Cの段階で挫折した経験しかないが、 一方、Cのような変数の方に型のある言語の場合、連結リストの自然な実装では それは「自然な実装」じゃなくて「原始的な...

            • そもそも、よくよくLinkedListクラスのインターフェースを眺めてみると、これは連結リストのノードを表現するクラスではなく、連結リストそのものを表現するクラスのようですね。こん...

          • データ部をNode*型にすればいいだろ。SICPあたり読むといいんじゃね?

    • 実際の現場では5年経験がありますとかいう癖にfizzbuzz書けませんとか言う連中をまとめて一仕事完成させないといけない。 俺の師匠はベタなプログラムを書きなぐるだけの俺の横に三か...

      • 入門者にもなれない人間が、そのままズルズル残って役に立った例は見たこと無いんだよね~ 大成できないなら、日本のソフトウェア業界から足洗わせた方が温情という見解 単純労働し...

        • >入門者にもなれない人間が、そのままズルズル残って役に立った例は見たこと無いんだよね~ それはあなたが育てられないからだし、育てられないのはあなたの能力が低いからだよ。 ...

        • >入門者にもなれない人間が、そのままズルズル残って役に立った例は見たこと無いんだよね~ それはあなたが育てられないからだし、育てられないのはあなたの能力が低いからだよ。 ...

        • >入門者にもなれない人間が、そのままズルズル残って役に立った例は見たこと無いんだよね~ それはあなたが育てられないからだし、育てられないのはあなたの能力が低いからだよ。 ...

          • 「誰もがプログラマーになれる」という幻想を信じているのでしょうか? 同様に、「誰もが努力すれば何にだってなれる」という幻想を信じていらっしゃるのでしょうか? 信じているよう...

          • 「誰もがプログラマーになれる」という幻想を信じているのでしょうか? 同様に、「誰もが努力すれば何にだってなれる」という幻想を信じていらっしゃるのでしょうか? 信じているよう...

            • →「誰もがプログラマーになれる」という幻想を信じているのでしょうか? →同様に、「誰もが努力すれば何にだってなれる」という幻想を信じていらっしゃるのでしょうか? なんだこ...

    • 「プログラミング出来ない奴ちょっと来い」と「プログラミングの入門」のプログラマ分類がSI業界的なので、別視点を引用。 プログラマには、プログラマ、職業プログラマ、真のプロ...

      • 「プログラミング出来ない奴ちょっと来い」http://anond.hatelabo.jp/20130322031333 う~ん、この人の日記の意見は、駄目だな~ 特に駄目だと感じるのは、 「というのも、多くの人は計算機科学を...

    • この人もプログラマに向いてなさそう

    • http://anond.hatelabo.jp/20130325172822 いや,入門者にLinkedListは無理ゲーだろ. この人,入門者に教えたことあるのかな? 無いだろうなあ.

      • 横だが、Linked Listを本を参考にして実装できない奴は門前払いでいいと思うよ? 入門者に教えたことがあるかないかと言われればないが、学生時代に同期の手伝いをしていた記憶を思い...

      • 筆者ですが、新卒や第2新卒に教えるけど5割は脱落するよ。 それはもう仕方ない。 短期で転職という経歴に傷をつけることを避けるため、 3年見込みが無いことをやることになって、見...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん