web-dev-qa-db-ja.com

一般的にプログラミングは、経験を積むにつれて読み、書き、理解しやすくなりますか?

私はプログラミングの初心者で、本を読んだり、勉強したり、記事を読んだりしてきました。プログラミングを学び始めて以来、素晴らしい結果が得られています。また、初心者の頃は、プログラミングについてすべてを知っていると思っていましたが、学んだことで、この分野の難しさを実感しました(実際、すべての分野が難しいです。しかしそれはポイントではありません)。

今日、私は機能的なソフトウェアを書き、3つの言語の基礎を学びました、そして私はただ1つの言語の中間です。 MYSQLやOpenGLプログラミング、さらにはビジュアルスタジオC++コードなどの高度なものを見ると、頭痛の種になり、多くのWebサイトのHTMLソースコードを視覚化するときにも(ウェブサイトのほとんどのソースコード、google chrome非常に乱雑で整理されていないように見えます)頭の限界に戸惑っています。最初はすべて単純に見えますが、これらの高度なことを見ると、どうしてそんなに多くを学ぶことができるのか不思議に思うだけです。

簡単に言えば、プログラマーがキャリアを進めるにつれて、これらのことがより明確になるかどうかという問題です。上記のトピック(OpenGL、MySQL、高度なhtmlサイト)は、詳細を学ぶにつれて読み、書き、理解しやすくなるので、複雑なトピックはありますか?あなたがプログラミングの世界でアリであり、これがあなたをつぶそうとしているというこの感情とどうやって闘うことができますか?

80
Bugster

短い答え:いいえ

長い答え:

はい、他の人のコードを読むのが簡単になります。しかし、読むだけです。 経験とスキルを習得するにつれて、開発者としての個人的な要件が大きくなります。

  • あなただけのコードを書きたくありません。 美しいコードと書きたい。

  • コードが理想的な条件で実行されるとは限りません。コードの実行時に発生する可能性のあるすべての悪いことについて考え始め、例外を処理し、ハードウェアの問題、ネットワーク遅延について考え、スキルが成長するにつれて問題が大きくなります。

  • あなたが知っている唯一の言語でコードを読み書きしない。熟練した開発者として、あなたは今あるこの特定の問題を解決するために、関数型プログラミングがはるかに優れた代替手段であることを知っています。したがって、関数型プログラミング言語でコードを読み書きする必要があります。

  • あなたはあなたが知っているライブラリの小さなセットに自分を制限しません。 C#でコーディングする場合は、.NET Frameworkの多くのライブラリの能力をすべて把握して使用するを使用します。

  • メモ帳はもう使用しません。 強力なIDEが必要であり、コードを単体テストする方法、コードメトリックについて、およびIDEで実行できる何百ものオプションとウィンドウの意味を知りたいあなたに見せます。

  • あなたは控えめにしたくない言語があなたに与える基本的なツールのセットに自分を制限する。 C#では、ジェネリックス、コードコントラクト、リフレクション、イベント駆動型開発、LINQを使用した機能面、Reactive拡張機能、および学習した他の多くのことをすべて1つのプロジェクトで使用したいとします。コード。

  • コードの作成を開始しない。時間の80〜90%を費やします要件の収集、アプリケーションのアーキテクチャの作成、単体テストの作成、ドキュメントの作成など、およびわずか10実際のコードを書く時間の20%まで

  • あなたはsecurityを気にします。あなたは法的問題を知っています。これは、アプリケーションによって操作されるデータで発生する可能性があります。 [〜#〜] itil [〜#〜]とは何かを知っています。あなたはいくつかのISO標準を知っており、あなたの仕事にそれらを毎日適用します。

はい、経験とスキルを得ることができ、得られたすべての知識と知的能力を使用して、特定の問題を解決するのが容易になります。しかし、解決しなければならない問題も大きくなり、プログラミングを始めたときに私が解決したレベルの問題を解決することに興奮しているわけではありません。

スキルを習得すると同時に、ソフトウェア開発の複雑さについての洞察を得て、プログラミングの学習を始めたときに想像もできなかった側面を学び、毎日学んだすべてのものを適用したいと思っています。

要するに:

  1. プログラムの学習を開始した最初の日、1から100までのすべての数値を2で割り切れるようにリストするタスクは非常に複雑です。ループを作成して画面に数値を表示する方法を学習したばかりですが、数は2で割り切れます。

  2. 10年後、同じ演習は非常に簡単に見えます。ただし、10年後、トランザクションを使用する必要があり、複数のサーバーでホストされ、サーバー間のセッション状態を適切に処理し、顧客の銀行口座の詳細を保存するアプリケーションを作成し、結果として生じるすべてのセキュリティと法的側面を保存します。

  3. ...そして、「どうすればそれができるのでしょうか?」ループで画面に数値を表示する必要があった10年前とまったく同じ方法で。

ドメインですべてが簡単になると、それはこのドメインで完璧を達成したか、もはや気にしないことを意味します。

どんなに賢くても、ソフトウェア開発と同じくらい広大な領域で完璧を達成することは不可能です。

134

子供の時、あなたは話し、次に母国語を読むことを学びます。単純なメカニズムは最初は苦労しますが、ある時点で流暢になります。ただし、まだ読んでいない本は無制限にあり、一部のトピックでは、本を理解できるようにするために、まず語彙を増やす必要があります。

同じことがコンピュータプログラミングにも言えます。ある時点で、言語自体が外国語のように感じるのをやめますが、まだその言語で書かれていて、まだ知らないことがたくさんあります。しかし、すべては少しの努力であなたにアクセス可能です。

一部のプログラミングジョブは非常に反復的であり、基本的には異なる顧客向けに非常に類似したソフトウェアを再実装します。これらの仕事では、学習の頭打ちのように感じるかもしれません。あなたがいつも新しくてユニークな何かをしている他の仕事、そして新しいことを学ぶことを決して止めません。

20
Karl Bielefeldt

ここには本当に良い答えがいくつかありますが、私はいくつかの短いポイントを追加するかもしれないと思いました:

初心者の頃は、プログラミングについてはすべて知っていると思っていましたが、もっと学ぶと、この分野の難しさを実感しました。

これは Dunning-Kruger効果 と呼ばれます。初心者プログラマーの間で非常に一般的であり、実際、多くの分野の初心者です。

Google chromeで表示されるWebサイトのほとんどのソースコードは、非常に乱雑で整理されていないように見えます

それらのウェブサイトを書いた人達はあなたがそれらを理解できるようにしたかった?おそらく違います。理解するのが難しいコードを持つことは彼らの利益になります。

どうしてそんなに多くを学ぶことができるのだろうと思うだけです。

specializing。私は、C#コンパイラのセマンティックアナライザーの設計と実装という非常に狭い分野の専門家です。 OpenGLやXML、HTMLなどを15年間研究していたとしたら、私はその専門家であり、セマンティックアナライザーに不思議に思います。しかし、私はそうしなかったので、OpenGL、XML、およびHTMLの非常に基本的な理解しか持っていません。

簡単に言えば、プログラマーがキャリアを進めるにつれて、これらのことがより明確になるかどうかという問題です。

はい、あなたはより大きなパターンを見始めているので。例としてOpenGLを取り上げます。おそらく「APIライブラリ」の束を見たことがあるでしょう。特定の引数を使って名前付き関数の束を呼び出すことによってコードとやり取りする方法である、関連する大きなコード。また、OpenGLの基本的な理解は、それがAPIであることを理解するだけで得られます。

より多くの経験を積み、さまざまなプログラミング手法をたくさん見たとき、一見関連のないテクノロジ(たとえば、OpenGLとC#のLINQ)には共通点があることに気付くでしょう。どちらもAPIであり、データをパイプするワークフローを構築し、オプティマイザやその他の変換を実行できます。ワークフローを豊かで興味深い方法で。ツールのボックスにその概念を取り入れたら、突然、そのパターンを使用するすべてのAPIの能力を最大限に活用することがはるかに容易になります。

上記のトピック(OpenGL、MySQL、高度なhtmlサイト)は、詳細を学ぶにつれて読み、書き、理解しやすくなるので、複雑なトピックはありますか?

それらはより簡単でより複雑になります。私が言ったように、システムの設計の根底にあるより大きな思考パターンを認識し始めるので、より簡単です。これにより、システムをより効果的に使用することができます。 これでシステムを使用してより複雑な問題を解決できるため、さらに複雑になり、システムの制限に直面し始めます。

あなたがプログラミングの世界でアリであり、これがあなたをつぶそうとしているというこの感情とどうやって闘うことができますか?

あなたはアリです。私たちはすべてアリです。しかし、ものはあなたをつぶす足ではありません。それはあなたが探求し、生活し、利益を得、そして改善する世界です。あなた、アリは、そのほんの一部を探求するだけです。あなたが本当の価値を追加し、その専門家になることができる場所をあなたが好きな部分を選んでください。

18
Eric Lippert

短い答え、はい。

時間と露出を考えると、これらの事柄は理解しやすくなります。

ブラウザの開発ツールからサイトを表示しているときは、フレームワークによって生成されることがよくあります。それをいくつでも... ASP.NET、JSP、RoR、Django ...と知っている人にしましょう。これらのフレームワークのいくつかは、他よりもクリーンなコードを生成します。

最後に...暴露は熟練につながります。その感情を打ち消す方法はありません。ただ経験と学習。移動してドメインの知識を得て、環境が使用するスキルを習得するには時間がかかります。

14
Rig

私はすでに与えられた答えのいくつかに同意しますが、それらはコードの読み取りについて議論されていない根本的なポイントでもあると思います。私がいくつかのオープンソースコードを初めて見始めたとき、それは圧倒的で巨大に見えました。しかし、何だと思いますか?それは常に巨大になるでしょう。ある時点で、具体的に知りたいものを抽出して先に進むことができるようになることに気づきます。

あなたが与えた1つの例は、しかし、HTMLコードの束を見ていました:

なぜHTMLコードを見ているのですか?サイト全体のHTMLを学びたいからではないでしょう。おそらくあなたがピックアップしたいと思っている特定のトリックがあるでしょう。その場合は、firebugなどのツールで関連するHTMLを見つけてください。

サイト全体がどのように作成されるかを本当に知りたいのであれば、レンダリングされたHTMLはそれを行う方法ではないことに気づきました。同様のテクノロジーを使用したオープンソースプロジェクトを検討することをお勧めします。 ただし、プロジェクト全体のコードを学習しようとすることは、思ったほど価値がありません。退屈で時間がかかり、学習したことを忘れがちであり、最後にそれを示すものは何もありません。学習は少なくなります。プラグインや機能の追加を記述したり、独自のプロジェクトの足場やアドバイスとして、特定の興味深い部分を使用して他の人のコードを際限なく読み取ることから。

あなた自身の何かを働かせるために、絶対最小値を学ぶようにしてください。行き詰まったり、特定の新しいことを学びたい場合にのみ、参照ポイントに戻ります。これは、すべてを理解しなければならない、または暗闇の中でプログラミングしているという従来の知恵に反します。しかし、最終的には目標が不可能であることに気付き、すべてを知ることの目標と実際に作業を終えることの目標のバランスをとることを学びます。

2
MetricSystem

短い答えはYESですが、その多くは経験をどのように定義するかによって異なります。

開発には少なくとも3つの部分があると思います。各セグメントが良くなるにつれて、特定のことがより明確になります。

  1. ビジネス要件の理解。これにより、アプリケーションの鳥瞰図がよくなります。ビジネスルールとは何かを理解できるほど、特定の処理が特定の方法で行われる理由をすばやく理解できます。例えば。お客様は政府の規制Xに準拠する必要があります。そのため、文書Yを準備する必要があります。これは、この一見役に立たない情報を保存しておく必要がある理由です。

  2. 技術要件の理解。これは、技術レベルで理由を理解することを除いて、#1に似ています。一部のツールやテクノロジーには、なぜ物事が特定の方法で行われるのか理解するのが難しい前にそれらに対処するまで、独自の癖があります。これは、レガシーシステムを扱う場合により明白です。例えば。アプリケーションは、XMLのみを使用する特定のサービスバスを使用します。

  3. 言語要件の理解。他の人が述べたように、言語に慣れているほど、元のコーダーが達成しようとしていたことをより速く読むことができます。それでも#1と#2がないと、この増加した能力のピークがかなり速くなることがわかります。

開発を複数回行うようにしてください。少なくとも数回は、エリアを完了するまでは簡単にはなりませんall

他人のコードの完成度(および目的)は、常に#1および#2に関連していることに注意してください。これらは、コードが現在の状態にある主な要因です。これら2つの領域が頻繁に変更されることが、常にスパゲッティコードを取得する最大の理由です。したがって、ビジネス要件と技術要件を熟読していない限り、コードを読み取る作業は常にロイヤルPITAになります。

2
Permas

同時に、より簡単で複雑になります!

他人を知ることは知恵です。
自己を知ることは悟りです。
他者を習得するには力が必要です。
自己を習得するには強さが必要です。
自分が十分だと知っている彼は金持ちです。
忍耐力は意志力のしるしです。
彼がいるところにとどまる彼は耐えます。
死ぬのではなく、死ぬのは永遠に存在することです。

ソフトウェア開発に翻訳

多くの技術を知ることは知恵です。 (すべてがALGOLの子孫です)
あなたが知らないことを知ることは悟りです。 ( 舌足らずの発音 )
多くの言語、フレームワーク、プラットフォームを習得するには、多くの努力が必要です。 (Java)
知っておく必要があることだけをマスターし、それだけに強さが必要です。 (およびGoogleまたはstackoverflow.com)
コーディングを停止して何かを提供するタイミングを知ることは、十分に理解している場合です。 (分析麻痺や金メッキはありません)
達成しようとしていることに引き続き取り組み、集中力を必要とし、力を発揮します。 (すべてが絶えず変化し、あなたは決して終わらない)
1つまたは2つのテクノロジーにこだわると、耐えられます。 (COBOLはCと同様に十分に支払います)
プログラミングをやめて管理職に入るのは永遠に存在することです。 (または、FOSSソフトウェアのレガシーを残して、あなたが死んでも誰もが使い続けることができます)。

2
user7519

簡単に言えば、プログラマーがキャリアを進めるにつれて、これらのことがより明確になるかどうかという問題です。上記のトピック(OpenGL、MySQL、高度なhtmlサイト)は、詳細を学ぶにつれて読み、書き、理解しやすくなるので、複雑なトピックはありますか?あなたがプログラミングの世界でアリであり、これがあなたをつぶそうとしているというこの感情とどうやって闘うことができますか?

他の回答者とは少し異なる方法で説明します。コードを読んだり書いたりすることは実際、あなたがそれを行うほど簡単になると私は信じています。簡単なアナロジーでそれをデモンストレーションします。

最初にスポーツを始めたときのことを思い出してください。あなたが学んだ最初のスポーツの最初は、単一のスポーツの単純なタスクの基本的な調整はおそらく本当に難しいように思われました。もう少し経験を積むと、単純なタスクをマスターし始めて、それらについて考える必要がなくなるようになり、注意を払うことができるより複雑なタスクがあることに気づきました(他のプレイヤーを見て予測するなど)彼らの行動)。

それから、別のスポーツであなたの手を試したとき、あなたはおそらくあなたが始めたときあなたがそれほど遠くないことに気づいたでしょう。バスケットボールをキャッチすることは野球をキャッチすることとは大きく異なりますが、それらのいずれかをマスターした人は、これまで一度も行ったことのない人よりもはるかに簡単に他の人を拾うでしょう。 2番目のスポーツを練習した経験から、最初のスポーツで特定の一般的なの両方のスキルが得られたことがわかりました。特定のスキル(バスケットボールをキャッチする)はそのドメインでのみ役立ちますが、一般的なスキル(3次元空間で近づいてくる高速で移動するオブジェクトを追跡し、それに対処するための計画を立てる)は、関連するすべてのドメインであなたをより良くします。


これはプログラミングとどのような関係がありますか?読み取るコードの最初の行は、特定のルールに基づいて構築された世界にあなたを公開します。これらのルール(その言語の構文とイディオム)を特定のスキルとして学びましたが、いくつかの貴重な一般的なスキルも学びました。コンピューターが内部でどのように動作するかを理解し、コンピューターが理解できる方法で意図を表現する方法です。新しい言語を習得するたびに、特定の新しいスキルが得られますが、一般的なスキルも強化され、峡谷の壁に沿って堆積した鉱物の堆積物など、すべてのコンピューター言語を通してパターンを確認できます。いくつかの異なる言語に精通すると、曖昧さを許せば、ほとんどのコードの「形」を認識することができるようになります。それが書かれている言語について何も知らなくても。

たとえば、あなたが言及した3つの言語すべて(MYSQL、OpenGL、C++)には、いくつかの共通機能があります。

  • アルゴリズムの小さな部分を個別に計算し、後でそれらを完全なソリューションに構成することが可能です
  • コンピュータは通常、特定の問題(テーブルの作成、キャンバスの初期化、または一般的なライブラリのロード)に取り掛かる前に、ある程度の一般的な準備が必要です。
  • 以前のステートメントが優先され、後のステートメントに影響します。つまり、コンピューターはコードの先頭から始まり、下に向かって進みます。

プログラミングをすればするほど、ボールの形に関係なく、ボールは自分に向かってくるだけであり、何を考えなくてもそれをどうするかがわかります。すべてのプログラミングは、コンピュータが理解できる方法であなたの意図を表現しようとすることです。十分に学習すれば、コードの代わりに意図を読み取ることができるようになります。

PS-いつでも、ついにあなたが自分の道を知っているように感じ始めたら、絶対にあなたの脳を壊し、ランクの初心者のように感じる何かに出くわすでしょう。それが私たちがこの仕事で気に入っていることです。常に新しいことを学びます。

0
Handyman5

コンピュータ言語がいくつあるか、そして言語がどれだけ変化し続けるのかという不思議(と不安)の終わりのない源です。さらに、各言語のさまざまなフレームワークの数と、各フレームワークごとに、利用可能な膨大な数のライブラリとプラグインが用意されています。これに、コードエディターとIDEの数を追加します。

これらすべてのバリエーションには、2つの複雑な側面があります。

  1. 彼らの語彙と構文は異なります。
  2. それらがサポートする抽象化(高レベルの概念)は異なります。

また、共通点が1つあります。チューリング完全。プログラマーの側の十分な努力で、それらはすべてすべての問題を解決するために使用することができます!したがって、Cなどの言語(小さな語彙、複雑な構文、ほとんど抽象化がないもの)から始めた場合は、間違いなく何でもできる(まったく正しい)と感じるでしょう。

次に、CSS、HTML、JavaScriptなどの「簡単なもの」に切り替え、さらにBootstrap and Reactのようなフレームワークにも切り替えます。そうすれば、アルバートアインシュタインのように、あなたの脳は焼けるでしょう。人々は「私はフランス語を知っているので、ドイツ語を学ぶのは簡単なはずです。

ソフトウェアパターンから、多くのプログラミング抽象化を学ぶことができます。このトピックに関する本がいくつかあります。パターンは至る所にあり、言語に依存せず、学習および理解できます1回。パターンがわかっている場合は、任意の言語でパターンを使用できます。パターンは、言語に組み込まれたときに認識され、さまざまなフレームワークに頻繁に組み込まれます。

ほとんどの人が新しい言語に堪能になるまでに1〜2年かかり、雇用主はそれを知っています。新しい従業員が言語との格闘に多くの時間を費やし、実際にビジネスの問題を解決するのに十分な時間がないため、彼らは彼らの言語に慣れていない人々を雇わないのはそのためです。

要約すると、コンピュータサイエンスの原則/抽象化、ソフトウェアパターン、および遭遇するビジネス上の問題の種類は、すべてゆっくりと変化します。一度学習すれば、新しい知識を段階的に蓄積できます。逆に、いわゆる「エコシステム」と呼ばれるコンピューター言語、フレームワーク、およびコンポーネントライブラリは、それらを取り巻くすべてのツールと同様に、非常に迅速に変化します。ここでは、学習のペースが遅く、時間がかかることが予想されます。

0
bcperth

短い答え:はい一般

ただし、一般化するとスペシャリストにはなりません。スペシャリストになることは、あなたが知らないことすべてを実現することも意味します。これは圧倒的な気持ちになる可能性があります。

時間の経過とともに、経験を積むことができます。

時が経つにつれ、他の言語/パターンなどもあなたの開発と並行して発展しています。

質問に対するもう1つの変数は、同じ一定の時間を移動する業界について、有意義な経験を積んでいるかどうかです。ハイテク業界は、他のほとんどの業界とは異なり、動くターゲットです。

良い質問はまた、特定の言語で自分自身を薄すぎたり厚すぎたりすることです。

0
EhevuTov