最近、プログラミングが上達していないような気がしていて困っています。
プログラミングの勉強の仕方なのですが、皆さんはどうやっていますか??
・本をたくさん買ってひたすらプログラムを作りまくる。
・本を絞って数学や物理の勉強のように繰り返す。
・ノートに写す(書いて覚える)
が、なんとなく思いつきますが・・・
困っているのがC言語とかで関数の使い方を忘れてしまうんですよね。
関数の数が多いと覚えきれません、パラメータが多い関数とかはすぐに忘れてしまいます。
「こんなプログラムを作りたいのに何の関数を使うんだっけ??」ってことが良くあります。
ネットワークプログラミングだと関数を使う順序を忘れることが多いですね。
C++だとcoutの使い方を忘れて、調べるのがめんどくさいからprintfでいいやぁ~~ みたいなことがよくあります。
1人で勉強してきたので他の人がどのようにして勉強しているか全く分かりません。
「自分はこんな風に勉強してきた!」というのがあったら教えてください。
ちなみに、自分は最初の頃はノートにひたすら書いて覚えていました。(写経みたいな感じですね。)
最近は本を買ってきて、ひたすら作っています。(次の日には忘れてしまいますね。)
是非教えてください!!
実際には仕事の現場でもプログラマも検索しながら記述をしています。
え?そうなんですか? プロだと、パパーーンと作れるものだと思っていました。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答12件
0
「プログラミング初心者が絶対やっちゃいけない5つの勉強方法」
の内容に沿って回答して見ます。
1 いきなり書籍で学習すること
初めは本を買ってやりました。ざーと本の内容に沿って、基本的な記述と、データベースのつなぎ方とかを中心にやっていました。
2 いきなり難易度の高い言語を学習すること
HTMLがもともとかけるがけの知識はありましたので、PHP部分、MySQLの内容をやっていましたね。
3 プログラミングを暗記しないこと
そもそも暗記なんてしようと思わなかったです。未だによくやるし、意識していることは、「知っている関数」であっても、必ずリファレンスに目を通すようにしています。そうすると、浅い知識がより深まって、新しい発見があったりします。
こんな感じで→ https://qiita.com/ShibuyaKosuke/items/b2667b95be8df9dd8d5b
4 1つの技術を完璧にしてから次の技術を学ぼうとすること
teratail でもこういう人を見かけますが、一体何年かけるつもりだろうかと、疑問に思います。完璧にできる人なら、teratailに頼らなくてもできる人でしょうね。
5 手段を目的にすること
プログラミング言語は、文字どうり「言語」ですから、英語の知識がいくらあっても、英語で話しができない人と同じ。プログラミング言語を使ってソフトウェアを作ることが目的のはず。
投稿2017/10/31 13:44
退会済みユーザー
総合スコア0
0
多くの人が「プログラミング」で「ガチガチに決まったもの」という印象を持ってしまうかと思いますが、個人的には非形式的な感覚も、重要なものだと捉えています。
自転車に乗る時に、テキストで乗り方を教わるわけでもないように、プログラミングも、「作りたい」という状況になれば、その情熱だけでかなりのところへと進んで行けてしまいます。何度か書いていれば基本的な文法は身につくでしょうし、そしてプログラミングやライブラリに関する感覚もついてきます。
どんな言語でも取り組む問題は似ていますし、今時の言語であればRubyGems、npm、Packagist、cabalのようにパッケージリポジトリもありますので、「こんなことをするライブラリが欲しい」となったときに(特に、同様なものが他言語にある場合)、たいていは標準ライブラリかリポジトリに転がっています。
あるとわかれば、探して調べて取り入れることは容易ですので、細かな引数の順番を覚えるよりは、「こんな機能がありそう」という嗅覚を身につけたほうが確実に役立ちます。
投稿2017/10/31 14:10
総合スコア145183
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
かれこれ30年近くはほぼ毎日何かしら趣味か仕事でコンピュータプログラミングをしています。日本と海外とで情報処理に関する学習と研究と仕事と教育の経験があります。現在は海外で大学生や大学院生に教えていますが日本で大学生や社会人にも教えた経験があります。
一言で「プログラミング」と言っても幅広いので、まずは自分が「どの分野」の「どの段階」の学習が必要か(学習をしたいのか)、を知ることが重要かもしれません。
質問から察するに、おそらくC言語をベースとして、「言語の文法」や有名どころの「アルゴリズム」を学習されているのだと、思われます。その段階ですと、独学であるならば、何か一冊体系的にまとまった本を読めば良いと思います。いわゆる「書式」は暗記する必要はなくどこに何が書いてあったかだけ覚えておけば良いかと思います。あ、これなんだっけ、と思った時にさっと調べられるようにしておくことが大事です。googleを使うにしても自分の問題を解決できるキーワード(と概念)を持っていることが重要です。私でも一日に何度も関数(メソッド)のreferenceをgoogleで調べることがあります。
printfかcoutかどちらを使うか、といようなことはプログラミングの本質的なことではないですし、よく使う関数はなんども使っていれば自然と覚えます。逆に言えば、書式などは無理して暗記しなくても自然と出てくるくらいまで、何度でも何度でも使う場面に遭遇するぐらいの経験量が大事ということです。
私が思いますに、プログラミング言語初学者の一番の難関は、アルゴリズムの構築部分、です。文法はわかった、配列や関数や変数の意味もわかった、解くべき問題も知っている、でも自分で考えて問題を解決するためのプログラミングを一から組むことができない、といった状況です。
英語の勉強で例えるなら、外国人の話していることはだいたい理解できるが、自分から言いたいことを話せない、というような状況です。
もしstrikeさんがこの状況であるのだとするなら、ヒントとしては、論理的な思考、ができるかどうかにかかっています。もし大学の講義などで論理学の講義があればぜひ参加して、論理的思考が自然とできる訓練を積んでください。悩みながらいっぱいコードを書け、人のコードを読んで理解しろ、的なことを言われる人も時折いますが、それでは「どう勉強したら良いか」の回答になっていません。
遠回りのようでもこれが、1.問題をプログラミングで解決できる小問題に分割して、2.それをアルゴリズムの形で頭の中で構成して、3.プログラミング言語という形で表現する、ための近道になりますし、将来プログラミング作業を続けていく上で重要な基礎になります。
デバッグの仕方やエディタの使い方、githubの使い方、ライブラリ、フレームワークの使い方などは、確かにプログラミング作業上大事ですが、プログラミングを使った問題解決のための本質的な部分ではないと私は考えています。
プログラミング言語によって、その背景となる哲学や数学的基礎、パラダイムなどが異なりますが、C言語のような「手続き型言語」と呼ばれる言語をベースに学び始めるのが良いかと私は思います(賛否はあるかもしれませんが)。
もし、効率よく学びたい、というのであれば、一度は体系的にプログラミング言語の講義を受けるのが早いですし、そのあとではプログラミング上級者と一緒に作業することができればスキルアップが加速されます。いずれにしましても、毎日何かプログラミングしていたいと思えるくらいプログラミングが好きであれば自然と上達すると思います。
とりとめなくなりましたが、何かのご参考になれば幸いです。
投稿2017/12/01 20:42
総合スコア98
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/02 04:04
2017/12/02 04:05
2017/12/02 07:02
2017/12/02 11:20
2017/12/03 14:39
2017/12/03 17:47
2017/12/04 05:56
0
昔は動画なんて無かったし、今ほどネットに入門のサイトが溢れてなかったし(当時はとほほぐらいかな・・・てか今でもあるあそこはある意味すごいけど)、書籍ぐらいしか体系的に学べる物が無かったんですがねー。これが時代が変わったと言うことでしょうか…。
さて、関数の使い方を忘れたという話についてです。いやはや、忘れるだけマシです。私の場合、はじめから覚えていないのですから。cout
なんてcount
と書いて、何でコンパイルが通らないんだと2~3分悩むような人間です。
各言語には膨大な標準関数やクラスが存在します。それに加えて無限とも思えるほどの外部ライブラリがあり、それらにも多くの関数やクラスが存在します。それら全てを覚えることは無理です。だから、初めから覚えません。では、どうするのかというと、どうやったら使い方がわかるかだけを覚えておくのです。ツールでもサイトでも書籍でも何でもいいのですが、ここを見たら使い方がわかるという事だけ覚えます。
なんか、すごいプログラマーは一つの画面でガチャガチャやっているイメージがありますが、昔は大抵、分厚いリファレンス本を脇に置いていたものです。ネットも本もみてないと思っても、IDE内で関数リファレンス等が読めるので、よーく見るとちょくちょくそれらを見ているだけだったりします。ターミナル一つでガチャガチャやっている人も見るかも知れませんが、man
が入ってなかったら、その人はたぶん何もできません。みんな調べながらやっているのであり、それが普通であり、全て覚えるなんて無駄なことはしません。
投稿2017/10/31 22:32
総合スコア21735
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
私自身は「プログラムを作りまくる。」でした。本は多少は買いましたけどたくさんは買ってないです。基本だけ読んだら(読んだだけではちんぷんかんぷんでした。)後はひたすら作りまくった感じです。当然、なかなかうまくいかないです。でもあの頃は若かったので根性が続きました。
困っているのがC言語とかで関数の使い方を忘れてしまうんですよね。
(後略)
力いっぱい「あるある」です。最初はcout <<
だっけ? cout >>
だっけ?のような時さえありました。coutを使い始めたのはここ3年ほどですが...間抜けですよね。
流石に散々使ったので今はcoutでこれはないですが、頻繁に使わない関数ではいつものことです。cerrだっけcerrsだっけみたいなことは今もあります。
ですので、リファレンスを見ずにコンパイルを通せることの方が少ないです。たぶん永遠にこのままです。言語はどんどん進化するけど、記憶は必ず忘却しますから。むしろ、うろ覚えな記憶に頼るプログラミングは逆に怖いかも。
投稿2017/10/31 14:08
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
私がある程度プログラミングに慣れてきたな、と思ったのはブログを自分で作成し、作ったものやちょっとしたコードをアウトプットするように心がけてからです。
(もしかしたら、これはコップの水が溢れるという例えで有名なアレかもしれません。成長する時期がたまたま重なっただけだったかもしれない)
私が思うに、これは大まかに2つに分けられると感じました。
1.自分で常に使うもの(例えばブログ)を自分で作成したこと
大きなプログラムでも、初めはシンプルなものだったりします。繰り返し改良し、機能を加えていくことで巨大化させることができますし、その経過というものは有意義だったように思います。
また、自分が常日頃使うものですから、必然的にプログラムに触れる時間が増えます。
愛着も湧きますし、楽しいというのも大きい理由ですね。
2.学んだ知識をアウトプットすること
アウトプット自体も良い習慣だと思いますが、一番良いと感じたのは過去に作成したコードを再利用できることです。
大きめなプログラムはGithubに上げてますが、Githubに上げるコードの多くはブログにも小さい粒度に分けて書き直しています。
メモやブログといったものへのアウトプットは1行1行解説するということも簡単ですし、それらをタグやカテゴリー分けし後から見直すことも容易な為、Githubに上げたコードよりも自分のブログのコードを参考にすることが私は多いです。
自分で書いた説明ですから、やっぱり自分で読んでてすぐわかります。
私のブログはそんなにアクセスがないですが、場合によっては詳しい方が突っ込んでくれることもあるでしょう。アドセンス広告なんかを貼ってから、内容を推敲する癖も少しつきました。金になればやっぱ嬉しいですからね。
上の2つは良い効果があったように思いますが、私が個人的に行っていることもいくつかあります。
ただ、他のエンジニアの方を見る限り推奨されないと思うので、参考にはしない方が良いかもしれません。
アンチパターンや、何かの参考になればいいのですが...
1.書籍を繰り返しよく読み、あまり写経はしない
私が書籍を読むときは写経はあまりせず、できる限り頭の中でコードを理解しようとします。
これは書かなきゃ理解できないなと思ったら流石に写経するのですが、それでも1回2回写経したら後は読むだけです。読んでてこれはあれに使ってみようとかあれば、早速使ってみます。
その後も定期的に読んでいますが、その際は割と息抜きがてらです。コード書きつかれたなーという時など
元々向こうの書籍なんかは、ジョークもあって結構楽しいです。
2.言語はできるだけ1つに絞る
これは仕事の都合もあるので難しいとは思いますが、私はできるだけ一つの言語に習熟してから他の言語を学ぶようにしたい派です。
いくつもの言語を学ぶことで様々な考え方を吸収できる一方で、その言語特有の設計思想やベストプラクティクスが存在するのも事実です。少なくとも、それらがある程度身につくまでは他の言語を深くはやらないようにしています。
ただ、先程書いたように仕事上の都合もありますし、他の方を見るにこの考えは間違っているかもしれません
3.目的がプログラミング
私はプログラミングそのものが目的です。綺麗だと思えるコードを書いたりそれを説明してる時が単純に好きです。
何かを作るのは当然楽しいですし、興味のないモノは作る気がしません。ただ、プログラミングをそもそもしたいので多少興味があればそれを作るというスタンスです。
この考えは他の方を見る限り、間違っているような気がします。
投稿2017/11/01 01:47
編集2017/11/01 01:53総合スコア972
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/01 03:51
2017/11/03 15:05
0
C言語とかで関数の使い方を忘れてしまうんですよね
関数の数が多いと覚えきれません
パラメータが多い関数とかはすぐに忘れてしまいます
関数を使う順序を忘れることが多いですね
回答時点で一ヶ月前の質問ですし、本題とは別角度の回答ですが、
おそらく盲点になっているので、「忘却」をテーマに回答してみます。
今回のテーマに合わせてあえて強調して言えば、
オブジェクト指向は、忘れても組める手法です。
たとえば、ご質問に対しては、以下のような対策があります。
- 関数の数が多い → クラスにまとめる
- パラメータが多い関数 → 状態を内部に持ち、引数を減らす
- 関数を使う順序を忘れる → ファサードやアダプターパターン
「なぜ、OOPでわざわざ複雑に組むんだろう」と思うかもしれませんが、
多少書くときに冗長になっても、後で忘れても変更しやすいからです。
逆に、手続き的に書くと、作りやすいが変えにくい。
たとえば、newしてもいいものを、わざわざファクトリを使ったりするのは、
初期化の手順を忘れてもいいようにするわけです。
あるいは、アダプターでラップするのは、APIを忘れてもいいからです。
そういうオブジェクトに覚えさせるという発想があると、
長期間に渡って変更し続けるような開発や保守の負担が減ります。
投稿2017/12/02 01:11
総合スコア5592
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
勉強自体は、独学と職場でのOJT。
大抵やりたいロジックが先にあって、書籍を見たり、ググったりして標準関数等がないか探す。
この業界に入った時、プログラムを作る事より大切な事として、上司や先輩に言われた事。
●書籍ではなく他人が作ったプログラムをいっぱい見る事。
※いっぱい見るうちに、綺麗なプログラムなのか、汚いプログラムなのか分かるようになる。
●誰が見ても美しいプログラムを目指す事。
●他人が理解出来るくらいに可読性があり、適切なコメントがある事。
●コーディング規約に遵守している事。
※標準コーディング規約以外に、そのプロジェクトでのコーディング規約がある為、絶対に遵守する。ただ読みやすいプログラムを作るのみならず、処理速度やバグを減らす為に考えられて作られている規約なので、遵守する事。
●共通関数が用意されているのであれば極力共通関数を使用する事。
●セキュリティについて常に意識する事。
※一般的にはSQLインジェクションや、クロスサイトスクリプティングなど。
●変数名や関数名は、コーディング規約に遵守する。
コーディング規約なき場合は、命名規約を自ら熟考し設計した上で命名する。
抽象的な変数名や関数名は、バグの元になるので、具体的な変数名とする事。
●コーディング規約に準拠となるが、省略形態を使用しない。バグの元になり、また可読性が低くなる。
※例えば、IF文のBoolean型判定でtrueの省略など。
●コーディング規約なき場合は、自らコーディング規約を作成する事。
ちなみに上達という事であれば、先に書いた通り、
兎に角、書籍ではなく他人の書いたコードに触れる事。
また、身近な誰かの為に作成する事で上達します。
自分の為でも結構です。
ちなみに趣味で所属していた団体の為に作成したPHPで作成したプログラムは団体を去った後でも使用されているそうです。
そもそも仕事で使わないPHPの勉強がしたかった為、画面設計書いて、こんなのなら作れると思うよと団体のスタッフに提案して、PHP単体ベースのプログラムと、PHP+MySQLベースの2本プログラムを作成しました。
例えば、家族の為に、友人の為に、こんな事が出来ないかな?と言われた時に、作ってみると面白いかもしれませんね。
覚える事が目的ではなく、作って誰かに使ってもらう若しくは自分自身で使う事が目的なので、関数を覚えて損はないけれど果たしてそれだけの関数を使いこなせるのか?って事です。
一般的なプログラムであれば、別段覚えていなくても、基本構文さえ分かっていれば特殊なロジック部分は調べれば済む話なので、特に覚えていません。
色んな言語で開発するのに、いちいち覚えてられませんよ笑
頭の中の設計がその言語で実現出来れば良い訳で、「実際には仕事の現場でもプログラマも検索しながら記述をしています。」は事実ですね。
基本構文は、どのプログラム言語も同じなので、どちらかと言うと思想や設計が重要かと思います。
一つの言語である程度作成出来るのであれば、後はググる笑
これに限ります。
投稿2017/10/31 16:20
編集2017/11/01 11:17退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
*私が使っているのはJavaなのでどこまで同じかわかりませんが私はこうやっています。
*参考にしていただければ嬉しいです。
私はノートに書くのは辛いのでパソコンのメモ帳にあらかじめ使いそうなプログラムを片っ端から入力して保存します。「保存した時の名前はどんなプログラムか書いて下さい」
これで使う時にパソコンのメモ帳を開いてコピーしてペーストです。
こうすれば全て覚えなくてもOKです。
投稿2017/12/02 00:41
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/02 04:00
退会済みユーザー
2017/12/02 04:06
0
とにかくたくさん作ることですね。
最初は書籍を買ってましたが、情報が古くなってしまうので今はネット頼みです。
以下、勉強という程でもないですがよくやっていることです。
■ 技術系ブログやTwitter巡回
全く知らなかった情報を得る為に使用しています。
そこから気になったことは検索したり。実際に使わないことも多いですが刺激になります。
■ プログラミング中に予測変換で出て来たメソッドを調べる
Unity(Monodevelop)でよくやります。
例えば「何かのコンポーネント.get」と入力して出て来た予測変換(候補メソッド)を眺めて、目的に沿ったものや関連するメソッドに当たりを付けてみたりとか。
普通にリファレンス眺めることもありますが、「確かあったと思うけど、何だっけ?」という時はこちらの方が早いです。
一緒に引数の説明も出て来るので「何を渡せばいいんだっけ?」というケースはあまり無いです。
出て来ないツール(言語)の場合はひたすらリファレンスを検索しまくりです。
■ ググる
「Unity 並べ替え 配列」とか未だに何回も検索してます。
ふわっとした単語でもGoogle先生が意図を汲んでくれるので大抵はこれで何とかなります。
■ teratailの質問に回答する
自分じゃ使わなかったり、そこまで深く見ていなかったプログラムの挙動を調べたりと結構知識は深まるなぁと。
「問題を起こしている部分を予測する」「他人への教え方を学ぶ」という意味でも面白いです。
投稿2017/11/01 01:55
総合スコア11427
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
横から失礼します
質問者様と同じことで悩んでおり大変参考になります。
ありがとうございます。
写経に関してなのですが…
自分はRubyとRuby on Railsを勉強していてオープンソースのデータをgithubからダウンロードして写経しようと思っているのですが、Ruby on Railsの場合ファイルが複数個所にあって連動しあっているからどこをどう写経すれば良いか分からないくないでしょうか?
routesを読んでそれに関連したcontrollerファイル、viewファイルを読み込んでいけば良いという事なのでしょうか?
ダウンロードしたデータをローカルサーバーで立ち上げて動きを一つ一つ追いながら関連しているコードを探し出して追っていけばよいのでしょうか?
投稿2018/02/02 07:52
総合スコア15
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/02 08:09 編集
2018/02/02 08:04
2018/02/02 09:47
2018/02/02 10:02
2018/02/02 10:05
2018/02/02 10:11
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/31 14:06
退会済みユーザー
2017/10/31 14:07 編集
退会済みユーザー
2017/10/31 14:11