使用するプログラミング言語やオペレーティングシステム、開発環境に関係なく、すべてのプログラマは何を知っておくべきですか?
背景:
できる限り最高のプログラマーになりたいです。このプロセスの一環として、わからないことを理解しようとしています。そうすれば、多くの利益が得られます。 「すべての[プログラミング言語を挿入]開発者が知っておくべきn個のこと」というリストに沿ってたくさんのリストがありますが、特定の言語に限定されない類似のものはまだ見つけていません。
私はまた、この情報が他の人にとって興味深く、有益であることを期待しています。
自分の仕事に誇りを持ち、同時に間違いを認めることができる方法。
プライドを飲み込まないでください!
私はこれらのモットーに従っています:
「成功は、10%のインスピレーションと90%の発汗です。」
「私がどれほど頻繁に、あなたが不可能を排除したとき、どんなに残っていても、ありそうもないことが真実でなければならないことをあなたに言ったことがありますか?」
仕事に入ると、自我は車の中にとどまります。仕事とその品質以上に重要なことはありません。彼らがどれほど愚かに聞こえるかもしれませんが、個人的に批判を受け入れて皆に耳を傾けないでください。しかし、それがより速くまたはより簡単であるという理由だけで、品質を決して妥協しないでください。
そしてもちろん、学ぶ、学ぶ、学ぶ。 :)
何をコーディングし、どのようにコーディングするかを知っている必要があります。わからない場合は、少なくともそれを学ぶための適性と熱意を持っている必要があります!
優れた(最良の)プログラムは必ずしも高速で実行されるプログラムではないことを理解してください。優れたプログラムとは、次のようなものです。-理解および変更が容易です。 -使いやすいです-それはシンプル/明確/習得が容易なインターフェースを持っています。
最高のプログラマーは、最悪のプログラマーでも理解できるプログラムを作成でき、最もカジュアルなユーザーでも使用できるプログラマーだと言いたいです。
素晴らしいスレッド!さらに、Programming Pearlsの本から多くのことを学びました。
私は数学にかなり熱心ですが、プログラマーが知っておくべきことは、時間の経過とともに、どのウサギを追跡し、どれを手放すかということになると思います。質問への回答を検索しても、どこにも回答が見つからない場合でも、別の方法を試してみることはあきらめません。問題を解決するために報酬が支払われます。問題を解決するためのmethodは支払われません。
あなたも間違いを犯すことができます。これは2つの点で役立ちます。最初に、あなたは自分自身に降りていません。第二に、同僚を軽蔑することはありません。この2つ目は、キャリアを積む上で役立ちます。
完璧ではなくても十分に良いソフトウェアを書くように自分を訓練する
明確かつ簡潔に書く方法。私はコードについて話しているわけではありませんが、それも良いでしょう。
すべてのプログラマは、問題を解決する方法を知っている必要があります。どのツールや方法論を使用するかについて、オープンマインドですべてのタスクに取り組むことが重要です。フレームワークやパターンが答えになることもありますが、そうでない場合もあります。
ゲームをプレイして、日常業務のほとんどが職場の政治であり、プログラミングではないことを学びます。
明らかに、バージョン管理。しかし、もっと重要なことは、コンピューターのメカニズムです。
コンパイラ理論:ある言語を別の言語にどのように変換しますか?これがどのように機能し、何ができるかについてのアイデアがなければ、コードは悪い決定に満ちていることになります。コンパイラーは、初心者でない人には不思議に見える傾向があり、恐ろしいコードを書く傾向があります。
コンピュータアーキテクチャ:優れたコードを実際に作成するには、マシンをある程度深く理解する必要があります。ミドルウェアの複数の層の上にさえ、基本的なマシンが輝きます。キャッシュ、マルチプロセッシング、およびIOの動作の仕方をある程度理解して、まともなコードを書くチャンスを得るには、理解する必要があります。メモリサイズやキャッシュなどの問題に気付かずにコードを書くと、ある程度はうまく機能しますが、同期が取れていない場合やパフォーマンスの壁に達した場合は、マシンの内部で何が起こっているのかを理解する必要があります。
あなたよりも賢い人で自分を囲んでください。
彼らが働いている問題ドメイン。
そこにいるすべての開発者はこれを読む必要があります post :
「コードを書くより読むのが難しい」
私がアドバイスのためにあきらめることができる一つのこと:
オープンソースプロジェクトからコードを取得する怠惰な形式ではなく、それで十分だと思い、自分のアプリでそれをカットアンドペーストしてください。つまり、将来、怠惰になる準備をするということです。
私は常に、すべてを専用のタスクを実行する基本的な標準オブジェクトに分解しようとします。 SSH接続処理とSCP処理を実行するSSHオブジェクト、すべてのdb通信を処理するdbconnectionオブジェクトには、名前を付けます。
ドロップインして、機能させれば完了です。優れたプログラマであるほど、何かを成し遂げるのが簡単になります。
また、もしあなたがnot十分に怠惰な場合(たとえば、 TheDailyWTF を確認してください)、他の仕事をしてください。 makesプログラミング言語を言語自体に再実装したくない、またはTheDailyWtfで見られる他の愚かなことをしたくない場合。
それを行うには複数の方法があることを知ってください。これはPerlのモットーですが、非常に一般的です。 無料のソフトウェアソング を学ぶこともできます。
謙虚。あなたは人間であり、作業しているマシンの延長ではありません。あなたは何も知らないし、決して知ることはなく、常に間違いを犯します。
すべてを再発明しない方法を知る。開発者が直面する問題の大部分は、ずっと以前に、より賢い開発者が直面し、うまく解決してきました。この知識を使用しないことは、開発者が犯すことができる最大の間違いです。最悪の場合、問題を解決することができません。最良のケースでは、既存のソリューションを思いつくのに時間を浪費します。
ゴラン
P == NPの場合
そして、いくつかのプラットフォームでのアセンブリ。おそらくそれを使いたくないでしょうが、それがずっとカメ(またはオブジェクト)ではないという認識があると、バイトはここで止まります。
もちろん私はNPについて冗談を言っていますが、実際に問題を解決するのが難しい問題を理解することは非常に役立ちます。
理想主義と実用主義の違いを理解し、ソフトウェアを設計するときに両方が重要である理由を理解します。
これらは、教育とキャリアの過程で試行錯誤から学んだことです。自分の不足を克服するのに苦労することもありますが、これらのレッスンは私に役立ったと思います。
コーディングする前に問題を概念化する方法。事前に設計することが重要であり、問題を適切に概念化する機能があると、優れた設計を得ることができます。
謙虚。私たちは学習を止めることはなく、私たちはそれをすべて知っていると決して考えるべきではありません。常に学ぶべきことがあり、私たちは常に間違っている時を経験します。それを認識して受け入れることが重要です。
コードを壊す方法。私を含む多くの人(私を含む)は、要件を満たすようにコーディングしており、コードが不正なデータや不正な制御フローに対して堅牢であることを確認するのに十分な時間を費やしていません。
コードを理解する方法。他人から借りるのは悪いことではありませんが、何を借りているのか分からないまま借りるのは悪い習慣です。アヒルのように見えるし、アヒルのように鳴くからといって、ライオンのように食べたり、空飛ぶ象のようにBMを食べたりしないわけではありません。
彼らの後にプロジェクトを引き受ける可能性のある開発者の立場に自分自身を置くために-よくコメントし、賢明な名前を付けます。
すべてのプログラマーは、少なくとも一度は彼の顧客/ユーザーに会うべきです。あなたはユーザーのより良い見解と彼が時々そのような「奇妙な」要件を持っている理由を得るでしょう。
バグレポートを受け取った場合、非難や再考する人を検索しないでください。多分それはあなたのせいです。
最近、私はテクニカルマネージャーから信頼できるブログを読んでいますが、プログラミングポジションの求職者のほとんどすべてが、CSの学位を含むものを含め、実際にはコーディングできないと不平を言っています。これが本当なら、あなたの質問への答えは明らかです:すべてのプログラマーが知っておくべきことは、彼らが実際にプログラムできるかどうかです。警告がなければ、簡単な問題を聞いてから、コンピューターの前に座って、数分で正しい解決策をコーディングできるはずです。
http://steve.yegge.googlepages.com/five-essential-phone-screen-questions を参照してください
一般:
テクニカル:
そこからのほとんどのものは一般化するのが難しいです。たとえば、組み込みコントローラーで作業している人はおそらくSQLを知る必要はなく、同様にDBAはおそらくSTLを知る必要はありません。
すべてのプログラマーは、作業する基本的なハードウェアの基本を知っている必要があります。言語を選択する前の言語間の違いは何ですか。彼が取り組んでいる言語のあらゆる面を知っている。ほぼ10の異なるコンテナーを知っています。一般的なプログラミング。基本的なブール論理、いくつかの基本的な数学の原理。 100の基本的なアルゴリズム。そして、良いgogglingテクニック。
しかし、優れたプログラマーの最大の能力は、問題を解決してすぐに使える思考であり、あなたがそれで生まれていることを学ぶことができないと私が信じていることです。
明白なことに加えて:
コミュニケーションスキル
グラフィカル、音声、書面。
何も想定しない。スティーブンキングのセルのように..AssumeはUとMeからロバを作る
厄介者に注意してください!
優れた開発者は、次のことができる必要があります。
いつ停止するかを知っています。
過度の装飾や過度の洗練によって、良いプログラムを台無しにしないでください。次に進んで、コードをしばらくの間そのままにしておきます。
-「Pragmatic Programmer」より
時々、私はそれを助けることができず、私の手は単に「もう少し」それを最適化するために単にかゆみます。 =)
指を指すのではなく、可能な解決策を指摘します。重要なのは良い結果です。
(from: "アジャイル開発者の実践")
ほんの数時間または数日の探索で十分です。これらに慣れる必要はありません。
主なポイントは、プログラマーのviewを広げることです。非常に異なるプログラミングには多くの種類があります。 使用する言語に思考を制限させないでください。
私の.02セントの価値......
クライアントがタスクを要求しているときに、タスクをどのように設計/コード化/達成するかを知らないことは、クライアント要求を拒否する十分な理由にはなりません。時々、クライアントがそれを必要とするために何かをすることに同意する必要があります...そして、それを行う方法を見つけます。
パットンがかつて言ったように:「私たちは不可能なことをするためにビジネスにいます」....どんなslobも可能なことを成し遂げることができます。その最後の部分は;))で追加しました
ここにはたくさんの素晴らしい答えがありますが、もう1つあげます。スキルを向上させるために仕事に依存しないでください。多くのプログラマーは、通常のITショップでCRUDプログラミングを行って5年間の注文とバグ修正作業を行うと、自動的に「上級プログラマー」になると考えています。必ずしもそうとは限りません。私はJared Richardsonのラインが好きです。「一部のプログラマーは5年の経験を積んでいます。一部のプログラマーは1年の経験を5回経験しました。」
それは最終的にはあなたの上司の責任ではなくあなたの責任であり、スキルセットを改善し、新しい言語を学び、高品質で適切に設計されたコードを生成することを受け入れます。これは、職場で独自のツールを作成することを意味することもあれば、余暇に行われる副次的なプロジェクトを意味することもあれば、月に1度新しい技術書を作成することもあれば、オープンソースプロジェクトに貢献することを意味することもあります。あなたが情熱を注いでいる何かに関連するプロジェクトを見つけることができれば、はるかに良いでしょう。
サラリーマンであろうと請負業者であろうと...最終的には、私たちはすべてフリーランサーです。
すべてのプログラマが知っておくべき97のこと: http://programmer.97things.oreilly.com/wiki/index.php/Edited%5FContributions
グーグルの使い方
エゴを落とす
批判は悪ではない
失敗を受け入れる
障害から迅速に回復する
練習、練習、練習...
他の人から学びたがる
喜んで変える
学んでいないプログラミング言語で書かれたプログラムを理解する方法。
(たとえば、a Java C#を学習せずにC#コードを読み取るプログラマー)
堅牢なコードを本当に作成したい場合は、自分のドッグフードを食べる必要があります。
LISPについて学びます。
ESR釘付け これ :
「ハッカーにとって特に重要な言語には、PerlやLISPが含まれます」...「LISPは、別の理由で学ぶ価値があります—最終的にそれを手に入れたときに得られる深い啓蒙体験です。この経験は、残りの人にとってより優れたプログラマになりますLISP自体を実際に何度も使用したことがなくても、あなたの日々。」
私は、非常に簡単に新しい言語を選択することができないLISPプログラマーを見たことはありませんが、新しい言語を学ぶのに苦労した他のすべての想像できる言語。 LISPには、脳を伸ばすものがあります。 (私はそれ自体が何かを定義する循環性に関係していると思います。)曲芸師のように、もはや他に何もないようです。
私の大学では、すべての学生に、非西洋文化を含む外国語や文化のコースを履修するように要求しました。 C++とJavaしか学んでいないコンピューターサイエンススクールを卒業することを許可してくれたことに驚いています。
はい、採用の際、私はこの方法で他の多くのものよりも上位にランク付けしています。すべてのLISPプログラマーは「ソース管理、ユニットテスト、継続的インテグレーション」をほとんどすぐに学ぶことができますが、これら3つのことを知っているJavaのみのプログラマーは、クロージャー、パーサー、または実際に必要なものに苦労するかもしれません。コンピュータサイエンスとプログラミングを知っている場合は、プロセスを教えることはできますが、その逆はできません。少なくとも、給与を支給する予定のあるタイムスケールでは教えていません。
大学卒業生といえば、学校で学んでいないことがたくさんあるので、自分で習得しなければなりません。私は自分で学ばなければならないさまざまなことについて続けることができましたが、それはしばらくかかるかもしれません:)代わりに、次のことは特定のツールやテクノロジーよりも優先されます:
新しいことを学び続ける。鋭い競争力を維持するためには、継続的な改善への意欲が必要です。
おかしいですが、私の仕事で最も重要なスキルはググリングです。時々私はそれについて考える前でさえググってググって:)
または、一般化すると、それを「情報処理」と呼びます。大量のデータをすばやく「スキャン」して、必要な情報を見つける機能です。
すべてのプログラマーはプログラマーです。それからデザイナーやアナリストもいます。分析フェーズがスキップされている場合、プログラマーが間違ったことをプログラムしたとしても、プログラマーのせいにするべきではありません...
もちろん、小規模なプロジェクトの開発者は1人だけかもしれませんが、要点はわかります。
プライドラインを飲み込む-より良いアイデアが提案された場合に、ハートビートでアイデアを離婚する方法を学びます。
数学。プログラミングは、数学の言語の恐ろしく小さなサブセットです。
クールな方法を知ることに加えて、ボイラープレート、誕生、および冗長です。一つのことを知って学び、あなたは置き換え可能です。それを乗り越えると、あなたは仕事が簡単になります。 「インターネット時間」があるとしても、やりがいのあることには時間がかかり、上司が何を考えていても5分で達成できないことを知ってください。
理論とアルゴリズムを理解します。誰でもコーディングを学ぶことができますが、コーディングを教えることができる人になるのはごくわずかです。
ステップ1. http://www.pragprog.com/the-pragmatic-programmer を読みます。
ステップ2.勝つ。
あなた自身で物事を理解してください。または、少なくとも、自分で問題を解決するために、真に正直な試みをしてください。他の人から答えを得ることは、これまで以上に学び、はるかにやりがいがあります。
プログラミングはコンピュータを作っています
1) Get input
2) Process input data
3) Generate output
コンピュータは馬鹿げていますが、本当に速いです。
そして、電気「または関連するエネルギー源」がなければ、スプーンはありません。
すべてのプログラマーはリソースを大量に消費する必要があり、絶えず学習して適応する必要があります。
私のリスト:
ユーザーの満足度が重要で、コードの品質はそれほどではない
to understand
to think
to write well
to optemize
..and to cheer up :D
ちょうど良いチームプレーヤーであること-常に破壊的な批判ではなく、改善の提案としてフィードバックを受け入れます。
あなたの気性を失うことなくイライラする人々に対処する方法。
マネージャーがデスクにアイテムのリストをドロップし、金曜日までに完了することを期待していると言ったとき。 DBAがデータロードスクリプトを2回実行するとき。 sysadminが誤ったバージョンのコードをデプロイした場合。 again-ユーザーがそれがどのように機能するかを説明するように頼んだとき、それはあなたが優雅にそれを扱うことができる必要があるときです。あなたはこれらすべての人々と仕事をしなければならないので、どんなに 間違った であっても、あなたが嫌なジャークだと思わなければ、それははるかにうまくいくでしょう。
あなたが思っているほど多くのことを知ることは決してないでしょう。ビジネスで数年経った後でも、あなたは自分の専門分野についてあなたよりも多くのことを知っている人々に出会います。それについて心配しないで、勉強と学習を続けてください。
十分な言語、アーキテクチャ、パラダイム、流行語を学んだことは決してありません。すべてを理解したら、誰かが新しい(ここにお気に入りのテクノロジーを挿入)を発明し、再び連絡が取れなくなるためです。
あなたはすぐに、その古い古臭いダディになります。彼/彼女のたるみを切り、昔々、彼/彼女はあなたの靴を履いていたと仮定します。
ボックスの外側を考えてください!
現実の世界は、あなたが学校にいたときと同じようには動かないかもしれません。企業がソフトウェア開発を実行する方法は、あなたが教えられた理論と正確には一致しないことを受け入れてください。
新しい組織での状況を理解するために、少し時間をかけてください。これはすべての人に当てはまりますが、卒業生は他の人よりも落ち着きがあると思います。
開発ジョブを取得するために必要なスキルと、開発ジョブで成功するために必要なスキルは、通常、2つの非常に異なるものです。キャリアの選択をする際には、彼らが同じである場所を選んでください。
逆に、ほとんどのジョブでは、データ構造/アルゴリズムのニーズの95%がライブラリクラスによって提供されます。あなたの時間の95%は、CSの忍者であるが、ロボトマイズされたビーバーのエンジニアリングスキルを持っている人々によって作成された保守不可能なコードを処理することによって無駄になります。
なんと獣医師が彼の仕事をしているのでしょう!
今日、私はこの本に出くわしました。これは非常に素晴らしい本であり、すべてのベストプラクティスの良い要約です。
通常、独創的な考え方は良いことです!開発のほとんどは単純なものではありません。
現在の組織の内部と外部の両方で連絡先のネットワークを活用する方法。あなたが誰かとあなたの問題を検討する必要があるときや、次の興味深いプロジェクトがどこから来るのかわからないためです。
すべてのプログラマは、コードに適切なドキュメントを添付する方法を知っている必要があります。
十分に文書化されたコード(埋め込まれたコメントの自由な使用)は、保守とアップグレードが容易であることがわかりました。
プログラマーが(コードにインラインで)実装の理論的根拠を埋め込むと、機能の追加や他の関連する問題のデバッグに関係なく、それを理解するのにかかる時間を減らし、手元のタスクにより多くの時間を費やすことができます。