質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.97%

理解するのに苦労した概念はありますか?

解決済

回答 8

投稿 編集

  • 評価
  • クリップ 8
  • VIEW 1,951

argius

score 9399

プログラミングを学習するにあたって、つまずきやすいポイントがありますよね。
よく知られたものに、(主にC言語の)ポインターやオブジェクト指向、モナドなどがあります。


私は、プログラミング歴が浅かった頃に、雑誌のPerl講座やWebページなどで登場する
「汚染」という概念の理解に苦しみました。
「汚染」があると何が問題なのか、という解説を見つけることができなかったのです。
今思うと、手当たり次第に読んでいたのが問題で、ちゃんと体系的に学んでいればそのようなことは起こらなかったのではないかと思っています。


こんな感じで、プログラミングを学習する際に理解するのに苦労した概念というのがあったら、どの辺が苦労したのかを詳しく教えていただけるとうれしいです。


よろしくお願いします。



追記:あと2,3日受け付けています。回答お待ちしております。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 8

+2

苦労したのは「関数型プログラミング」かな。

「関数型プログラミング」がわからない、書けない、できないというわけではなくて、「『関数型プログラミング』とは○○である」という決まった定義がないから、いまだに人に説明するのに苦労します。Haskell等の「関数型プログラミング」でしか書けない言語で遊んで、ああ、こういうスタイルや考え方でコーディングするのが「関数型プログラミング」なんだ・・・って理解するしか無いような気がしました。モナド?ああ、あんこがはいったあれね、おいしいよね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/27 12:28

    回答ありがとうございます!

    関数型プログラミング、説明するのは難しいですね。

    私はちゃんと人に教えられるほど関数型プログラミングを理解できていませんが、人に説明するとしたら
    ・文でなくて関数の組み合わせでプログラミングする
    ・デフォで状態が無い(代入でなく束縛)
    ・ラムダ的な何か
    あたりから話を発展させていくのが良いかなと思います。

    キャンセル

+2

最近ではJavaEEの「依存性注入」でしょうか。原文はCDI(Contexts and Dependency Injection)なので、そのまま訳した感じなのですが、和名だけ見ると敷居が高く感じてしまいます。

私としてはアプリケーションとは別体のサービスがbeanを生成・保持し、アプリケーションはそのbeanをアクセスする仕組みと解釈しています。実際には使いやすくWebプログラミング初めての方でも利用できるのではないかと思えるぐらいです。
2冊目に買った参考書でやっと理解できた(理解し始めた)感じです。本代は掛かってしまいましたが理解できて、使えそうと感じたときの喜びは大きかったですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/28 15:56

    回答ありがとうございます!


    JavaEEはまだまだ不勉強なので間違ったこと言ってるかもしれませんが...

    依存性注入が主流になって、EJBの時代から格段に使いやすくなった感じですね。
    バックエンド的には似たようなものだと思うんですけど。

    この辺はやはり「疎結合」というキーワードが重要になるのでしょうか?

    キャンセル

  • 2015/09/28 16:44

    「疎結合なので(結合テストの際の?)コード変更量が少なくて済む」「未完成のClassをnewしなくて済む」などの説明記事は良く目にするのですが、私は実績不足なのでそのように感じたことが未だ無いのです。実感しているのはCDIによってページ間のデータ共有がとても簡単にできる点です。
    多分EJBから使いやすくなっているのはアノテーションの導入で、web.xmlなど殆どの定義ファイルの編集が不要となった点ではないかと思っています。

    キャンセル

  • 2015/09/28 17:38

    まあ、疎結合というのはいまや当たり前すぎてありがたみはあまり無いかも知れないですね。

    それよりも、SessionとEJBの良いとこ取りになったのが重要、というべきでしょうか。

    > 多分EJBから使いやすくなっているのはアノテーションの導入
    これは大きいですね。

    キャンセル

checkベストアンサー

+1

もともとBASICやCからプログラミングを始めたもので、「プログラムのソースコード」と「プログラムで操作するデータ」というように、世界を二分するような考え方をしていました。

JavaScriptを始めた時に、foo.barというような「ソースコード上に書いた識別子」と、foo['ba' + 'r']のような「プログラムで生成した結果」が同様に扱われる、ということをなかなか飲み込めなくて、しばらく戸惑った思い出があります。

もっとも、今となっては「プログラムコードも一種のデータ」という考え方に馴染んで、Rubyでループを回してメソッドを一気に生成する、なんてことも平然とするようになっています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/28 16:04

    回答ありがとうございます!

    私も最初はBASICでしたが、本格的にプログラミングをやり始めたのがPerlだったので、その辺は早いうちに受け入れられました。
    でも、evalのようにどんな文字列でも評価できてしまう点は怖くもありますね。

    メタプログラミングというのも、一般的に理解するのに苦労するもののひとつと言えそうです。

    キャンセル

+1

C言語から入った方はCOBOLのMOVE命令がわからないといいますね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/27 15:07

    なるほど。
    C言語では明示的な変換が必要になりますからね。

    キャンセル

  • 2015/09/27 15:20

    2進→2進  間違えました、
    2進→10進 ですね。

    単に10進と書きましたが、パック10進、ゾーン10進があります。
    これらも自動変換で代入できます。

    文字型を10進に入れることもできますよ。

    01 a.
    02 b pic 9(5). aという項目と同じ場所をさす。cでいうunionに似ています。

    と定義しておけば、
    move '12345' to A. ここは文字代入
    でbを取り出せば数値になっているので計算にも使えます。

    キャンセル

  • 2015/09/27 15:44

    業務アプリだとこういう機能が欲しくなるんですよね。

    キャンセル

+1

遅延静的束縛

説明を読むと分かりにくいのだけど、
実例を見るとどういう機能なのかはわかる
だがなんでそれがこういう名前なのかわからない
難しく感じるのは多分名前のせい

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/27 18:06

    回答ありがとうございます!

    PHPにはこういう機能があるんですね。(≧PHP 5.3.0)
    どういうときに使うのかは思いつきませんけれど...

    確かに名前は理解の妨げになってそうです。

    キャンセル

  • 2015/09/29 16:34

    interface以上Class未満の拡張を前提としたクラスの定義とかですかね
    基本的な処理手順は同じなんだけど、具体的な処理内容が違うみたいな
    同じじゃないけど似た処理がたくさんあるとか、そんなときに使えそうです

    キャンセル

+1

Javaのワイルドカード総称型、しばらくなんだこりゃってわからなかったです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/28 16:23

    回答ありがとうございます!

    ワイルドカード総称型はいまだにちゃんと覚えられてないですね...ちゃんと使えてないです。
    共変性とか反変性とかの用語もまた難易度を上げているように見えます。

    キャンセル

+1

「継続(continuation)」、「コルーチン(coroutine)」、「スレッド(thread)」は、最初のハードルを越えるのが難しかった記憶があります。色々な説明を読んで、やっと自分自身が納得できるモデルが脳内に出来上がったという感じです。

どれも古典的な手続型&構造化プログラミングから離れるものだからでしょうかねぇ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/01 13:10

    回答ありがとうございます!

    パラダイムシフトよりももっと小さな言語固有の機能でも、頭の切り替えが難しいですね。大昔、BASICしか知らない頃に、他の言語は行番号(エディター上のそれではない)が無くてどうやってプログラミングするのだろうと思ったことがありました。

    継続は、私はいまだにはっきりとしたイメージができていないです...

    キャンセル

0

締め切られていますが、ただいま絶賛「モナド」に苦戦中でございます(笑)

そもそもモナドとは何なのか?概念的なところを調べてみても、サイトによって様々、多種多様で未だに概要が掴みきれていません汗

それ以外のところだと、オブジェクト指向を学び始めた時はポリモーフィズムに苦戦した記憶がありますね。
よくある「動物クラスと犬、猫クラスがあって・・・」のような解説をされたのでチンプンカンプンでした。
なんとかボンヤリと理解していましたが、後に、デザインパターンを独学している時に「これがポリモーフィズムの用法なのか」ってハッとなった経験があります。(アハ体験っていうんですかね?)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/06 15:59

    回答ありがとうございます!


    私の考えでは、オブジェクト指向は比喩的なアプローチのための概念なので、例え話が(適切かどうかは別として)し易い特徴があるのだと思います。

    一方、モナドについては、私も完全には理解していませんが、よく「モナドはモナドである」と言われるように、数学や計算機科学を土台にした概念なので、何かに例えることが本質的に難しいのだと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる