お世話になっております。
具体的なプログラミングの質問ではないのですが、昨日「こういう出力を期待しているけどこういう出力になる」と質問をしたら数分で自前のロジックを組んで的確に回答される方がいらっしゃることに驚きました。この質問でいうと、一時間くらい考えて「forループ中にそのループする配列をループ内でpopしたらダメなんじゃないか」という仮説にたどり着いたのですが、原因を探す遅さを嘆いています。
私自身文系出身で作業効率化のためにゆるゆるとPythonを書いていて、最近ロジックを組むのが面白くなりつつあるのですが、なぜそんなに速いんだろう?とふと疑問に思いました。ちなみに基本情報の資格を持っていないくらいのペーペーです。
そこで思ったのですが、teratailで知識ではなくロジック関連の質問で即答されるような方は普段はどういうことをされているんでしょうか?
もちろんいろんな要素が絡み合っている問題であり、かつ、短絡的だとは思うのですが、理由を何個か考えてみました。
①身もふたもないですが単純にプログラミング適性があって頭がいい
②競技プログラミングにどっぷりはまっている
③フローチャートを毎回簡単にでも書いている
④「いかにして問題をとくか」や「プログラマの数学」のような書籍を愛読している
⑤codeIQやpaizaのようなプログラミングの問題をたくさん解いている
⑥デバッグのやり方が確立しているのでPDCAを回すのが速い
⑦アルゴリズムを熟知している
⑧常に抽象的にモデリングすることを考えている
プログラミングを組むのが速くなったと思ったことのある方、速いと言われる方、日常的に何をされていましたか?
以上よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答15件
0
ベストアンサー
こんにちは。
小さなプログラム作成の速さであれば、解いた問題の数のように感じます。考えて解くにはそれなりに時間がかかりますが、覚えているプログラムが多ければ、それをベースに作れるので短時間で作れます。
もちろん、頭の回転がむちゃくちゃ速い人はいますので、そのような人は地頭で勝負できるのかも知れません。(頭の回転の早い人、うらやまです。)
しかし、現実の場面のプログラムは小さなプログラムの集まりではありません。ご存知かもしれませんが、開発工数は規模の指数関数で増えていきます。
(指数関数は要するにねずみ算です。最初はゆっくりですが、ある点を超えると急激に増えます。)
そして、ビジネスの場面においては、大きなプログラムの開発力がものを言います。
これには⑥~⑧が大きく効くのではないかと思います。
⑥デバッグのやり方が確立しているのでPDCAを回すのが速い
モグラ叩きデバッグ(闇雲に修正してみる)より、シーケンシャルなデバッグ(思いついた順で1つ1つ潰していく)の方が速いですし、シーケンシャルなデバッグより、2分探索なデバッグ(「全体を2つに分けてどちらにバグがあるか判断→残りを2つに分けて判断」を繰り返す)の方が速いです。
これらのテクニックを適切に使いこなせる人はデバッグを効率的に行えます。
⑦アルゴリズムを熟知している
多くのアルゴリズムが引き出しに入っていると、全体設計の際により適切なアルゴリズムを選択できます。
性能を取るべき場面、開発工数を取るべき場面、信頼性を取るべき場面などなど、状況に応じて選択するアルゴリズムも変わってくると思います。
ついでに、どんなライブラリが存在するのかの知識も有用と思います。
⑧常に抽象的にモデリングすることを考えている
全体をモデル化して見渡して設計すれば全体設計が外れにくいですね。
全体設計を外すと、手戻りが激しいので開発期間が大きく増大してしまいます。
経験的には、大きなプログラム開発についてはタイピング速度や小プログラム開発の速度より、上記スキルのほうが効果的なように感じます。
投稿2018/02/17 01:35
編集2018/02/17 01:39総合スコア23272
0
トラブル対応から得られる学習効果という観点から一言・・・
昨日「こういう出力を期待しているけどこういう出力になる」と質問をしたら数分で自前のロジックを組んで的確に回答される方がいらっしゃることに驚きました。
数分で答が得られてしまうと学習効果が少ないということがあるかもしれんせんね。
自分で徹底的に調べまくって、1 ~ 2 日ハマって、自己解決したといういうケースと比べると、学習効果には大きな差があるのではないでしょうか。
前者の場合はすぐ忘れてしまうかもしれませんが、後者の場合は痛い目にあって努力した分覚えている期間が長い(引き出しか多くなる)と自分は思います。
上のループの中でのコレクションの操作をして失敗したというのは自分も痛い目にあったことがあります。調べまくって悩みまくったことをよく覚えています。
最近はネット上に情報があふれていますので、調べて解決のために必要な情報を得るのも容易になっていて、自己解決できるケースは多いのではないでしょうか。
ググって調べるにもスキル(キーワードの選択、英語のサイトも含める、正しい情報を見つける等々)が必要ですが、自分で調べて解決するという努力をするとそのスキルも上がってくるはずです。そのスキルの向上も重要だと思います。
業務上での問題など時間的・工数的に無理ということでなければ、できるだけ自分で調べて解決するという方向で考えてはいかがでしょう。
投稿2018/02/17 02:38
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
プログラミングのスピードって言葉の定義にもよりますけど、
「こういう出力を期待しているけどこういう出力になる」と質問をしたら数分で自前のロジック
てことを言っているのであれば、回数の問題です。これは「作業」です。
典型的な input と output の間を埋める方法を知っているか、知らないかだけの話なので、典型例を知ることがスピードにつながります。
一次ドキュメントをよく読む。っていうのも含んでいい気もします。
こちらは、熟練者になれば、思考の速度で書き上げることができる人もいるらしいですw
で、プログラミングのスピードっていうのが、要件を満たすプログラムを作る。ってことなのであれば、これは「要件の整理」と「設計」が素早くできるかどうかってことです。
設計ができれば、プログラムを要素単位に分解して、知識の範囲内で組み立てるっていう前述の「作業」に落とし込むことが出来ます。拘束される時間は、こちらの方が長いので、スピードアップをはかるのであれば、こちらを鍛える必要があります。
「要件の整理」と「設計」をする事は、「データの持ち方(構造)」と「ロジック」を学ぶことで、スピードアップを実現することが可能です。
これも典型例をどの程度知っているか?ってことに左右されるので、訓練することで早くなります。
小さなプログラムでも、「要件」が何であるか?どのような「データの持ち方」をしそれを「どのようなロジック」で処理するか。を意識するようになると、スピードはかなりあげることができると思います。
投稿2018/02/17 01:22
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
経験と知識にもとづく引き出しの数だと思いますね。私の場合は、質問者さんと同じように些細なことでつまづいて小一時間なやんだこと何度もあります。それから、私の場合は、書籍などを通じて定石を身につけるようにしています。
それをもとに回答してみています。こういうサイトは点数が入るなどの競技性があるので、それを目当てに回答することもありますが、そのほかのメリットとしては次の3つがあります。
- 間違っていたらツッコミが即座に入るので、自分の知識を修正する。
- あっていれば自信につながる。
- 他の回答者さんのいいところは盗んで真似をする。
実は、回答するにあたって一番難しいのは、質問者さんが知りたい、やりたいことを読み解くことだったりします。それもまた経験ですね。
投稿2018/02/17 00:31
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「経験がものを言う」のではないでしょうか。
たくさんプログラムを作って、たくさんトラブルに遭遇して、それらの問題を解決して、そうしていくうちに「こういうときにはこうすれば良い」という直観的な判断が身に付いていきます。数をこなせばそのバリエーションも増えていきますし、そのバリエーションが新たなアイディアの源となります。
①身もふたもないですが単純にプログラミング適性があって頭がいい
頭が良いかどうかは別として、「プログラミングが楽しい」と思えることが最大の適正ですね。そして、そう思えるようになるかどうかが大きな分かれ目となります。問題(バグ)の解決すら楽しいと思えるようなら最高ですね。方法論は後から付いてきます。継続は力なり。そのための原動力です。
まぁ、実務におけるプログラミングでは、納期やコストの兼ね合いから楽しんでばかりはいられないのですけどね。
投稿2018/02/17 00:58
総合スコア5938
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
常日頃からプログラムを書いているからその分色々な場面でのデバッグに強い。
成功法だけを知ってる人より失敗法を知ってる人の方が強い。
何故ならばプログラムはプログラムを書いてる時間より書いたプログラムのバグを潰しながら作業することが多いからです。
投稿2018/02/16 18:40
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
・デバッグの経験はあったほうがいいですね。不要なソースをみつけたりとか、いろんな視点が持てます。
仕様がおりて、実際に組む前に聞けることも多いと思います。
・他人のソースを見て、やっていることの解釈ができるようにする
teratailの様な所でも十分にその環境は備わっています。
・『調べてとりあえず実装できた』だけにせず、調べた事を自分の中に落とし込めるまで理解して、次に自分でパッと書けるようにしておく
3番目がいちばん重要な気がします。
あとは、それをパッと引き出せるか…。
投稿2018/02/17 10:48
総合スコア3404
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
⑨teratailで他の回答者としのぎを削っている
これも選択肢に入ると思います。自分はかなり遅い方ですが(^ ^;
さらにどうでもいいことですが私は⑤に当てはまります。
投稿2018/02/16 17:05
総合スコア2043
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
日常的にここに入り浸って自分の好きなように解答を書いてみる、人の解答で良いところを見つけたら調べる、読む書く読む書く。そうする事で定石や良く引っかかる箇所が経験として身に付いてだんだん速くなってくる。
投稿2018/02/16 17:04
総合スコア6142
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
日頃から同様なバグに出会ってデバッグしているせいではないでしょうか…
結局動くコードを書いてしまうと成長を遅く感じます。
エラーにぶつかって悩みぬくことで理解が深まっていく気がします。
困っていない、満ち足りていることは敵です。
ですので、このようなトラブルがたくさん挙げられているサイトをのぞいて勉強します。
一人で引き起こせるバグの量には限界がありますので、他人の力を借ります。
例えば、
あるプログラミング言語に慣れてくると、これはこう書く、と「わかる」ようになります。
それではエラーは起きないし、もっと良い方法を探るためのエネルギーも生じにくいです。
そこで、このようなサイトでは、それは絶対にそのように書かない、と思っていた書き方をして困っている人を見つけるわけです。
なんでこの人はこう書こうとしたのかな、メリットはなにか、デメリットはなにか、とああでもないこうでもないことを考えるのです。
すると、横からこう書けばよいと、見たこともない書き方で問題を解決する回答が投稿されるのです。
それをふむふむと読んで、自分ならこう書くなあ、こう書けばこういうメリットがあるのではないかとなんとか差別化して別解を投稿します。
その結果慣れない書き方でバグを仕込み、ご指摘を受けることになるのです。
この過程でいろいろと考えることで学習します。
これを機に暇があったら回答してみてはいかがでしょう。
しばらくやってみると、パターンが見えてくるのかもしれません。
一番多いのはインストールできませんのたぐいですが…
投稿2018/02/16 16:59
編集2018/02/17 01:59総合スコア8560
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
問題を分割して順序だてて組み立てることに慣れているからじゃないですかね。
ピタゴラスイッチ的なあれです。
投稿2018/02/17 00:53
総合スコア1430
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/19 10:02