私は12歳から(こだわり)プログラミングをしてきました。私は、アセンブリ、C++、Javascript、Haskell、LISP、Qiまで、さまざまな言語に精通しています。しかし、私のプロジェクトはすべて自分で行ってきました。
私はCSやコンピューターエンジニアリングではなく、化学工学の学位を取得しましたが、この秋に初めて、他の人と大規模なプログラミングプロジェクトに取り組み、準備方法がわかりません。私はずっとWindowsを使ってきましたが、このプロジェクトは非常にunix-yになるので、環境に慣れるために最近Macを購入しました。
私はこの1年間、CSの両方のメジャーである友人とハッカソンに参加できて幸運でした。しかし、彼らと一緒に仕事をしていると、彼らのワークフローは私のものとは非常に異なることに気づきました。彼らはバージョン管理にGitを使用しました。当時は使ったことがありませんでしたが、それ以降はできる限りのことを学びました。彼らはまた、多くのフレームワークとライブラリを使用しました。私はRailsがハッカソンの夜通しであったことを学ぶ必要がありました(一方で、彼らは字句スコープやクロージャが何であるかを知りませんでした)。すべてのコードはうまくいきましたが、私のことを理解していなかったし、私も彼らのことを理解していなかった。
実際のプログラマーが日常的に行っていること、つまりユニットテスト、コードレビューへの言及を聞きますが、私はこれらが何であるかについて漠然とした感覚しか持っていません。私は通常、小さなプロジェクトに多くのバグを抱えていないため、バグ追跡システムやそれらのテストは必要ありませんでした。
そして最後に、他の人のコードを理解するには長い時間がかかります。変数の命名規則(新しい言語ごとに異なります)は難しく(__mzkwpSomRidicAbbrev)、疎結合は難しいと思います。疎結合ではないというわけではありません。自分の仕事にはかなり適していると思いますが、LinuxカーネルやChromiumソースコードのようなものをダウンロードしてそれを見ると、何時間も費やしています。これらの奇妙な名前のすべてのディレクトリとファイルがどのように接続するかを理解します。車輪を再発明するのはプログラミングの罪ですが、ライブラリを何時間も分析するよりも、自分で機能を作成する方が速いと思うことがよくあります。
明らかに、これを生計のために行う人々はこれらの問題を抱えていないので、私自身もその点に到達する必要があります。
質問:他の人と「統合」を開始するために実行できる手順は何ですか?
ありがとう!
グループで働くことに少し不安と興奮を感じていると思います。
本からグループやチームで働くことを学んだり、ベビーステップや「チームで働くためのダミーガイド」を与えられた人はいません。
INグループを操作することで、WITHグループの操作を学習します。
プロのプログラマについて聞いたすべてのことは、チームで作業するにつれて徐々に適切なものになります。バージョン管理、ユニットテストなどのように、それらすべてを1つずつ学びます。
私にとって、一番下の行は
チームの一員になります。
私はあなたの文章のいくつかを選んで、いくつかの一般的なポイントを作ります:
(その一方で、彼らは字句スコープやクロージャーが何であるかを知りませんでした)。私たちのコードはすべてうまくいきましたが、彼らは私のことを理解していませんでしたし、私もそれらを理解していませんでした。
...
実際のプログラマーが日常的に行っていること、つまりユニットテスト、コードレビューへの言及を聞きますが、私はこれらが何であるかについて漠然とした感覚しか持っていません。私は通常、小さなプロジェクトに多くのバグを抱えていないため、バグ追跡システムやそれらのテストは必要ありませんでした。
...
私はこれらの奇妙な名前のディレクトリとファイルがどのように接続するかを理解するために何時間も費やしています...自分で機能を作成する方が、ライブラリを何時間も解剖するよりも速いことがよくあります。
私があなたが学ぶ必要があると思う最大のことはこれです:
n
開発者のチームは、特定の開発者の能力の基準に対して以下をn
倍にして、開発者の1人ができることを行います一人でやる-しかし、彼らはまだ一人一人ができる以上のことをします。
理由は簡単です。他の人と作業するときは、時間の一部をこれらの人と情報交換する必要があります。一方、一人で作業する場合、情報交換はすべて頭の中で行われます。どちらが自然に速いですか。
他の重要なことは:
(= /// =)同僚の中には、確かにいくつかのスキルであなたより能力が低下するものもあります。 all skillでは、あなたよりも能力が低いものもあります
これらの2つのアイデアを念頭に置いて、上で引用したすべてが理にかなっています。多くの人がクロージャを「取得」しません。テストとコードレビューは、コードがグループの混合能力。バグ追跡は、十分に大きなシステムを作成するとバグが避けられないためです。そして、その規約を備えた無限のライブラリは、規約がないと学ぶか書き直すたびに(= /// =)コードが多すぎるためです。それが必要。
本当に、チームで働く方法を学ぶ唯一の方法は、実際にそれを行うことだと思います。うまくいけば、上記はあなたが精神的に準備するのに役立ちます。幸運を!
最も効率的な方法は、チームの一員になることです。
多くの学生や他の開発者と協力せずに仕事をする多くの人々のように、あなたはまだチームの一員ではないと理解しているので、チームに参加するのは難しいように思えるかもしれません。
私はあなたが非常に活発で、最新のopen-to-allチャネルで頻繁なコミュニケーションを支持するオープンソースプロジェクトに参加することをお勧めします(issue tracker 、メーリングリスト、wikiなど)。オープンコミュニケーションは重要です。おそらく他の人々のやり取りを観察することから始めるので、コアデベロッパー間のメールに依存するプロジェクトや、アーカイブされていないIRCは避けてください。
すべてを行う1人のプロジェクトではなく、数人のかなり頻繁な寄稿者で歓迎されるプロジェクトを優先します。また、(開発者が区切られた領域を持つ各開発者ではなく)誰でもすべてに触れることができるプロジェクトを選択してください。これは、より楽しく、コミュニケーションの機会が増えるためです。
恥知らずなプラグイン:どういたしまして こちら !
他の皆が"just do it"
の効果についてすでに言ったことを繰り返し述べることはしませんが、私が言及していない追加のポイントを追加します。優れたマネージャーは、チームへの統合を本当に支援します。
あなたは仕事のプログラミングの部分についてあなたについてあなたに適切なものをすべて持っているかもしれませんが、より個人的なソフトウェア開発関連のもののいくつかを見逃しているかもしれません。優れたマネージャーは、チームプラクティス(ソフトスキルとハードスキルの両方)にあなたを導き、あなたがゲル化するのを助け、うまくいけば、それらのプラクティスに反対することをしたか、またはしたかどうかを教えてくれます。あなたが知らない何かが壊れているので修正できないからです。
まず、プログラミングを本当に楽しんでいるような人物であることをお祝いします。ただし、プログラミングは、有用なシステムを提供することの始まりと終わりではありません。あなたはあなたの前で挑戦するでしょう、そしてあなたが趣味のプログラムに戻るか、あなたが好きなことをすることができてそれのために支払われることができるキャリアに行くかどうかはあなた次第です。
ソフトウェアの構築に関する教育を受けていないという点で不利です。その教育では、CSの卒業生や経験豊富なソフトウェア開発者にとって第二の性質であることを教えています(プログラミング方法だけでなく)。職場で頻繁に登場するわけではありませんが(私には一度はありましたが)、NP-hardは理解できる用語の例であり、理解できないかもしれません。おそらく、計算の背後にある正式な理論の背景が不足している可能性がありますが、それについて学習する用意がある限り、それは問題ありません。多分あなたの将来のCSのマスターですか?一部のコードは慣用的であるように聞こえます。つまり、自分には明白であるように見えるプログラミングスタイルを持っているという意味です。コードレビューに注意を払い、批判を受け入れて学ぶことをいとわない。これはうまくいくでしょう、そしてイライラするかもしれませんが、それに固執してください。
あなたがあなたのために行っていることは貴重です。あなたは本当にプログラミングを楽しんでいるように見えます。デザイン、アーキテクチャ、テスト、最適化など、システム開発の他の側面もお楽しみいただけると思います。プログラミングはパズルの一部であり、ソフトウェア開発者になるには他のスキルを習得する必要があります。ハッカソンは別として、ビジネスの多くは、コミュニケーション、お互いからの学び、聞き取り、計画を伴います。私は、CSの卒業生であり、自動車や絵画の家を売るよりもソフトウェア開発が好きである多くの人々と協力してきましたが、それに対する真の愛情はありませんでした。
良いことチームメンバーは、大胆にコミュニケーションを取り、大学を信頼し、チームとしてプロジェクトの障害を克服し、deliver project as a team.
時間を使用し、患者を使用し、プログラマとして快適で自信を持つために学習するを必要とします。すべてのプログラマーが良いとは限りませんチームプレーヤー。チームプレーヤーは成功を共有し、失敗から教訓を学びます。
優れたチームメンバーの一部の文字を強調表示するが役立つでしょう。
a)良いチームメンバーは自己志向ではなく、目標志向の人です。
b)品質:自己満足ではなく、全体像についてより深く考える。これがポイントです。他のすべての品質(信頼性、建設的なコミュニケーションなど)はこれから継承します
c)改善方法:日中にチームとどのようにやり取りし、良い点と悪い点を定義し、次の会議でそれらに注意を払うようにしてください。また、さまざまな角度からチームの決定を見るを試してください。他人の役割に身を置き、他人の仕事にどのように影響を与えることができるか考えてください。
もう1つお伝えしたいのは、2つのチームが同じであることはなく、1人以上のユーザーが参加すると、既存のチームでさえも変化することです。
チームは、お互いを知り、共通の方法が見つかるまで協力する方法を理解しようとする個人の相互作用から始まります(例: タックマンのグループ開発の段階 を参照)。
ですから、私のアドバイスは、今すぐ質問の答えを見つけようとするのではなく、実際に新しいチームで働き始めたときに何が起こるかを見ることです。一部の問題は同僚によって非問題と見なされる可能性があり、他の問題は関連性があると見なされ、それらについて一緒に議論したり、トピックに関する独自の見方を促進したりする可能性があります。そして最後に、あなたはおそらくあなたが考えもしなかった側面も扱うでしょう。
私はElYusubovに同意します。あなたは多くの忍耐力を必要とし、あなた自身と新しい同僚にチームになるまで一緒に働くことを学ぶためのいくつかのチームを与えます。あなたがチームスポーツを練習するなら、あなたはすでにこれを経験しているはずです。
他の人のコードを理解するために多くの時間を費やすことについての最後のコメント。チームで作業するということは、あなたが他の誰かのコードに取り組み、他の開発者があなたのコードに取り組むことを意味します。コードが複雑すぎてゼロから書き直すことができない場合があります。典型的な解決策は、元の開発者に変更をレビューするよう依頼することです。そうすることで、コードの何も壊していないという確信が少し高まります。
これは私にとって、ソロプログラマからチームプログラマへの移行における大きな飛躍でした。部分的にしか理解していないコードに取り組み、それに慣れる必要があります。これには、同僚とのより多くのコミュニケーション、多くの尊敬(そうです、変数の奇妙な命名規則があるので、どうですか?)と相互信頼(彼らは異なるコーディングスタイルを持っていますが、実際に機能するコードを提供していることを知っています)を伴います。 。