私たちはオープンソースコードを開発しています-ソフトウェア開発スキルを開発し、皆に示しています

多くの初心者開発者は、ソフトウェア開発の既存の経験を示す必要に直面しています。 欠員が「実務経験のないプログラマー」と呼ばれる場合でも、キャプテンがいなくても、ある程度理解しやすいコードを示した応募者が優先され、作品の有用なスキルの存在を多かれ少なかれ確認します。



どうする? 初期のコースまたは卒業プロジェクトからの典型的な課題の解決策を示しますか? おそらくこれで十分ではないでしょうか? 印象的なプログラムを作成し、同時に開発経験を積むことができますか? たとえば...計算機またはコンパイラ、または経験を得るために通常何を書くのですか? そして、あなたが終了するのに十分な力を持っていない場合は?



これらの質問と疑問に対するほぼ普遍的な答えが1つあります。オープンソースプロジェクトの完成です。 さまざまな難易度の実際の問題を解決する機会が得られます。その結果は世界中の何億もの人々に有効であるだけでなく、表示することもできます。 この機能について言及されることもありますが、通常はそれで終わりではありません。 今回は、それについて詳しく見ていきましょう。





多くの人のためにオープンソースを完成させるというアイデアは、さまざまな異論を思い付きます。 最も一般的なものを次に示します。



最初の異議は、「自分」を作る代わりに「エイリアン」を完成させる理由です。 これは、ソフトウェア開発の経験のない人々の間では非常に一般的であり、開発経験のない高齢者の話が原因であることがよくあります。 通常、プロットは次のようになります。



1.「息子/娘、あなたはあの美しい大学を卒業します、

2. TYZHプログラマーになる

3.クールなプログラムを書く

4. ??????

5.利益-成功、お金、そして一般的にはすべてがあなたのものです”



ここでは、1つを除いてすべてが素晴らしいです。開発者は通常、コードを最初から作成せず、ほとんどの場合、既存のコードを変更します。 どこかで、大量のコードを見つけ出し、別の大量のコードを追加する必要があります。 どこかで大量のコードをデバッグしてから、2行を適切に再配置する必要があります(行自体を変更する必要はありません)。 その理由は簡単です。ゼロからの開発は非常にコストのかかる喜びであり、新しいコードには多くの間違いがあります。そのため、「兄弟が毎日フェンスを白塗りするわけではありません」、通常は落書きを塗りつぶします。



したがって、経験がなくても、多少複雑なものをゼロから開発し始めると、次の問題が発生する可能性があります。

1.コードの記述とデバッグを最後まで完了することはできません。難しいので、まだ十分な強度がなく、十分な忍耐力がないかもしれません。

2.ポイント1が合格した場合、非常に限られた機能のプログラムがあり、ほとんど誰も使用しません。なぜなら、潜在的なユーザーは既に同じまたは類似の使い慣れた既製のプログラムを既に持っていますが、新しいプログラムについては聞いていません。それを変更するには、プロモーションに徹底的に関与する必要があります

3.コードの品質を評価してフィードバックを提供する資格のある開発者。ごくわずかしか、またはまったくフィードバックしません。これにより、成長が大幅に遅くなり、将来的に怪我をする可能性があります。



これらの問題を無視すると、忘却の運命にある仕事に多くのエネルギーを費やすというリスクを負うことになります(「テーブルでの仕事」でもあります)。 これらの問題の規模に気づいていて、すべてがあなたに合っているか、あなたがそれらを解決する準備ができているなら、さらに読むことはせず、開発してください...そこで何を開発したいですか?



比較のために、オープンソースを完成させるには、次のことを行います。



1.ゼロから開発することはできませんが、すでに動作しているものを修正し(はい、バグがありますが、修正しようとしています)、微調整は簡単(単純なエラーの修正)または非常に難しい(ある種の印象的な新機能またはコンパイラーによる機械コード生成の15%の加速)、簡単に始めて、より高く動かすことができます

2.編集が受け入れられると、最終的なプログラムの既存の流通チャネルに分類され、作業結果のプロモーションが自動的に取得されます。

3.あなたの編集は、例えば、非自明なエラーを指摘し、改訂を完了するように頼むかもしれない比較的多数の開発者に直面して、 普遍的な笑い株であることが判明します

4.既存のコード、その損傷のない開発、および編集の本質を説明し、場合によっては発生する質問に答える必要がある人々とのコミュニケーションの経験があります。これらのスキルは、開発者にとって非常に重要です-編集のリスクの評価、修正の重要性の評価間違い、1番目と2番目に興味があるすべての人への説明は、開発のすべての参加者が有意義な決定を下すのに役立ちます。



そのため、「エイリアン」のオープンソースコードを完成させながら、多くの重大な障害を取り除きます。 始めるのは簡単で、フィードバックを得るのは簡単です。あなたの仕事の結果はプログラムの次のリリースであり、次第に数億人のユーザーになります。さらに、読むためのオープンなリポジトリにあり、みんなに見せることができます。 道はとげが少なくなります。



2番目の異論は、すでにスキルと多くの知識、数千のスキルを開発している必要があるが、まだ知識がないため、十分な強度がなく、開始できないことです。



このコードを見てみましょう(必要なマルチスレッドライブラリのコードの簡略版)



DWORD waitTime; DWORD secondsInMilliseconds; DWORD millisecondss; /*...............................*/ /*    */ secondsInMilliseconds = (DWORD)interval->seconds * 1000; /*       */ milliseconds = (interval->nanoseconds + 999999) / 1000000; /* *     "   ", *     ,    - . */ if (0 > (waitTime = secondsInMilliseconds + milliseconds)) { return EINVAL; }
      
      







ご覧のように、多くのコンパイラがこのコードに対して警告を発するというコメントもありますが、コードは「何らかの理由で必要です」。 実際、VC ++、gcc、clangはこのコードに対して警告を発し、チェックは無意味であると言います。



ネタバレ:著者は加算がオーバーフローしないことを確認したかったのですが、符号付き整数の場合、このトリックは未定義の動作を与えますが、ほとんどのプラットフォームで動作し、ここでは数字は符号なしで、動作は言語標準で定義されていますが、検証では何もチェックしません 正しくそう:



  if (secondsInMilliseconds > UINT_MAX - milliseconds) { return EINVAL; } waitTime = secondsInMilliseconds + milliseconds;
      
      







上記の同じコードには定数を使用した乗算と加算がありますが、オーバーフローをチェックすることさえしませんでした。



このコードが何をすべきなのか、少なくとも大まかに修正する方法を理解するには、どのような資格が必要ですか? 5年間の実務経験はありますか? 十? たぶん20?



専門大学の十分に興味のある2年から3年生。 たとえば、ある大学では、第4学期に、教科書のプロンプトで学生が入力されたデータを単一リンクリストに保存し、そのリンクが動的メモリに作成され、単純なメモリアロケータを含むすべてのコードがx86。 メモリアロケータの動作を理解するには十分ですが、上記のコードを理解するには十分ではありませんか? はい、本当に。



まだ複雑すぎますか? その後、よりシンプルに-また、実際のコードに基づいています。



 void* impl_calloc(size_t numberOfObjects, size_t objectSize) { unsigned int totalSize = numberOfObjects * objectSize; void *p; p = malloc( totalSize ); /* WHATEVER */
      
      







ここでは、size_tを使用して、乗算時にオーバーフローがないことを確認する必要がありました。 これを修正するにはどのような資格が必要ですか?



それは複雑すぎますか? さらに簡単-非常に必要なプログラムのかなりきちんとしたコードの腸のどこかに、関数の真ん中にこの広告があります:



  std::stack<const Token*> f;
      
      







はい、もちろん、すべてが明確です。 明らかに、 ffです。 ここでは「すべてが機能します」が、周囲のコードをデバッグする開発者は、しばらくの間、それが何で、なぜ、そしてなぜこれらのポインターがこのstd :: stackオブジェクトに追加されるのか疑問に思うでしょう。 ここでは、変数がなぜ意味があるのか​​を理解し、周囲のコード内の他の名前と一貫性のある短い意味のある名前を見つけて修正することはまったく有害ではありません。 おそらく、変数フィールドまたは関数に名前を付ける必要があります 。 これを修正するにはどのような資格が必要ですか?



オープンソースコードには、さまざまな複雑さの多種多様な欠陥がたくさんあり、多くは探す必要すらありません。長年目立った場所にあり、ジャンプしてきしみます。



3番目の異論は、編集が受け入れられない可能性があることです。 本当にできる。 プロジェクト所有者は、何らかの理由で提案された改訂が適切でないと判断する場合があります(たとえば、新しい機能は必要ありません)。 火星に生命が存在するかどうかを理解するために、最初に変更の履歴を見てから、それがそれほど不快にならないように小さな編集を送信するのに役立ちます。 あるいは、著作権放棄の形式で前提条件がある場合があります( SQLiteなど )。これは技術的に満たすのが難しく、これはまれですが、事前に確認することをお勧めします。 ほとんどの場合、すべての特別な条件はすぐに、目に見える場所で交渉されます(たとえば、貢献者セクションがあります)。 すべてのプロジェクトが同じように簡単に編集を受け入れるわけではありませんが、適切なプロジェクトを見つけるのは簡単です。



4番目の異論はそこにあるゴミ捨て場であり、あなたが長年勉強したことではありません。 開発者は通常、既存のコードを変更しますが、これにはさまざまな欠陥が多少なりとも含まれているため、特に混乱はありません。 これを反対側から見てください-複雑なあいまいな(時には非常に複雑で非常に理解しにくい)コードを見つけ出し、改善することができます。 広く使用されているマルチスレッドライブラリに10行のコードを追加することは、千行計算機よりもはるかに価値があります。



5番目の異議 -適切なプロジェクトに「参加」するのが難しい何かをする必要があります。 いいえ、もう必要ありません。 Githubのようなシステムでは、数回クリックするだけで編集を提案できます。 プロジェクトエラーリストで欠陥を見つけるには、コードを表示するか、静的アナライザー(たとえば、コードも開いていてGithubにある完全に無料のCppcheck)またはコンパイラーの警告を使用します。 プロジェクトは自分で選択できます。たとえば、用語集でXMLを操作するために使用したライブラリを簡単に調べてください。



任意の数の異議を思いつくか、すでにオープンソースコードを完成させることができます。



ドミトリー・メッシェリャコフ、

開発者製品部門



All Articles