私は、ジュニア(およびシニア)ソフトウェアエンジニアによる一般的なエラーと貧弱な仮定に関する調査を行っています。
最終的に修正されたあなたの長年の仮定は何でしたか?
たとえば、整数のサイズは標準ではなく、言語とターゲットに依存するという誤解がありました。少し恥ずかしいですが、そこにあります。
気さくに;あなたはどのような確固たる信念を持っていましたか?それは、アルゴリズム、言語、プログラミングの概念、テスト、またはプログラミング、プログラミング言語、またはコンピューターサイエンスに関するその他のことです。
関数の最初(Pascalスタイル)で使用するすべての変数を定義する必要があること。
コーディングを開始する前に、関数で使用されるすべてのリソースについて考え、それらを定義する必要があると思っていました。これはおそらく、私の最初の言語がPascalであったためです。次に、Cに移動すると、ループ内のスコープを無視して、ループの外側でのみ使用される一時変数を定義し、「すべてが最初に定義される」ようにします。
事前にすべてのリソースを定義することはひどいことではなく、スコーピング自体がコードの可読性にとって非常に重要であることを理解するのに数年かかりました。
そのプログラミングはジュニア向けであり、最高のプロジェクトマネージャーはプログラミングできない人です。
私のC++時代(髪の毛がかなり前)の最初に戻ったとき、私はJava学者。JavaよりもC++の利点を求められたとき、通常、私は不自然なものとして却下しようとしますが、そこに行きます)、C++が参照andポインターを与えたことを私の答えに含めます。Java guys信じられないように見えて、参照areポインタであることを示唆し、部屋から笑い出してしまいます。
そして、公平にするために、私は正しかった。参照とポインタは、意味的にも構文的にも異なります。残念なことに、私は自分の主張を誤解で裏付けました:基礎となる実装が異なっていたということです。
標準化により、typedef
がストレージを持たないタイプエイリアスであるのと同じように、参照の構文はname aliasesであると私は確信していました。
参照はオブジェクトではなく、ストレージも持たず、「名前」から「オブジェクト」への複数のトップレベルマッピングを提供するだけだと確信していました。その点で、ファイルシステムではsoft-linksのようなものだと思いました。
Code: int a = 3; int& b = a;
Names Objects Memory
+-----+ +-------------+ +-------+
| a |---->| | | |
+-----+ | | | |
| int |---->| 3 |
+-----+ | | | |
| b |---->| | | |
+-----+ +-------------+ +-------+
もちろん、最適化はこれにつながる可能性がありますが、参照にはストレージがあります。たとえ構文がプログラマーからそれを抽象化するために最善を尽くしても、それらは別個のオブジェクトです。
ただ、最適化をオフにしたコンパイラーがポインターとして参照を実装し、逆参照操作を必要とする可能性があることを知ってがっかりしました:実際にハードリンク inファイルシステム:
Code: int a = 3; int& b = a;
Names Objects Memory
+-----+ +-------------+ +-------+
| a |---->| int |---->| |
+-----+ +-------------+ | |
| 3 |
+-----+ +-------------+ | |
| b |---->| int& |---->| |
+-----+ +-------------+ +-------+
標準C++は、参照の実装方法を実際に指定していないため、私の理論はいくつかのツールチェーンに当てはまる可能性がありますが、どのメインストリームコンパイラにも当てはまりません...
SQLやリレーショナルデータベースに不慣れな手続き型開発者/プログラマーは、SQLの操作方法や使用方法に関する正式なトレーニングや理解を必要とせず、SQL For Dummiesのようなものをすばやく読むだけで十分ですOracle&SQL Serverのようなリレーショナルデータベースを扱うには十分です。
OracleやSQL Serverなどのリレーショナルデータベースに保存されたデータを処理するアプリケーションで多くのエラーが発生するのは、リレーショナルデータベースの言語の理解や使用方法の欠如が原因であることが非常に多くあります。 [〜#〜] sql [〜#〜].
開発者が必要とするのはSQL For Dummiesの本かそれに類するものだけであり、リレーショナルデータベースの問題を処理するための完全な装備を備えたソフトウェアベンダーで働いていました。このベンダーのクライアントは数百ギガバイト単位のデータベースを持っているため、このSQL知識の欠如は否定的な形で戻ってきています。問題のある検索や更新、挿入の実行が悪いだけでなく、実際の障害となるのはデータベース自体の実際の設計です。
その時点で、開発リーダーがSQLおよびリレーショナルデータベースを、アプリケーションを構築した言語で行ったのと同じ敬意を持って扱っていれば、これらすべてを回避でき、コストを大幅に削減できました。
最終的にあなたを悩ませるために戻ってくるので、SQLを重要でないとして却下しないでください。しばらく、数年でもそれを逃れることができるかもしれませんが、最終的にはデータベースの完全な再設計なしでは進行できない限界点に達し、それがコストが最も高くなります。
あなたが始めなかったプロジェクトを決して終わらせないこと。
本当にばかげているように見えますが、規模が単純に圧倒的だったので、私は非常に多くのプロジェクトを延期しました。プロジェクトのモンスターを完成させたばかりで、その範囲に気付いたら始めたことはなかったことに気付きました。しかし、実際には、最も複雑なシステムであっても、個別の部分と定義された部分に分けると非常に簡単です。しかし、マクロレベルで見ると、すぐに圧倒されます。
物事を行う「正しい」方法が常にあること。私は大学を卒業してからずっとこの仮定を持ち続けました。
もちろん、タスクを完了する方法は常にたくさんあることに気づきました。各方法には、常に長所と短所があります。入手可能な情報を見て、決定し、上司に正当化できることを確認してください。
私が最初にそれを聞いたとき、私は「ダックタイピング」が実際に「ダクトタイピング」であると思いました、人々がしばしばダックテープを言う方法に似ています。 「ダックタイピング」は間違っているように聞こえましたが、「ダクトタイピング」は奇妙な意味を持ちました(玉石でつながれたタイプ)。
人々がベストプラクティスや一貫性を気にすること。
正規表現を学習すると時間を節約できます
私の最も長い間保持されていた(したがって、最もコストのかかる)誤った仮定は、「ビジネスの要件は健全で合理的であり、まだ理解していないだけです」でした。
壁に座っている100の緑の仮定、
そして、ある緑の仮定が誤って落ちた場合、
壁に座っている99の緑の仮定があるでしょう。
代わりに:
ハンプティダンプティが壁に座っていた。
ハンプティダンプティは大きく落ちました。
すべての王馬とすべての王人、
エフィムは言った、彼はただの技術者だ。
他の人々は、私と同じように既知のバグに悩まされ、それらを修正することをプロジェクト作業よりも優先させるでしょう。
私はいつも、あらゆる言語のコードを書く人は誰でも編集プログラムを使うと思っていました。
私は主にサポートとして、そして彼のためにもっと複雑なことを書いてくれた私のクライアントと仕事をしていました。ある日、彼はファイルを台無しにしてしまいました。彼は誤って3時間以上自分の仕事を保存しましたが、なぜ頻繁に保存しないのかと尋ねると、「私は終わっていないから」と答えました。当然、これは受け入れられる答えではありませんでした。私は少し突いて突進しました。最終的に、彼はこれまでに編集プログラムを使用したことがないことに気付きました。 notepad.exeでもありません!彼はファイル用にオンラインCPanelエディターを使用していました! 「検索」機能さえありませんでした。彼はサイトでライブファイルを編集していたため、完了するまで保存できませんでした!
言うまでもありませんが、彼は今日までCPanelエディターを使用しています...
大学時代から、私は自分がプログラミングの達人だと思っていました。私はコーディングできましたが、他の人はできませんでした。しかし、会社に入社したとき、基本についての無知さに感銘を受けました。自分についての私の仮定はすべて間違っていることが判明しました!今、私は知っておくべきこととわからないことを知っています!
OOPの利点は、実際にはコードのrestの再利用であるときにobjectを再利用できることです同じインターフェースを持つ新しいオブジェクトを作成します。
実際には、オブジェクトはコードの2%である可能性があるため、再利用しても2%のメリットしか得られません。本当の利点は、他のすべてのコードをまったく異なるものにできる新しいオブジェクトを作成することにより、コードの他の98%を再利用することです。これで、コードの98%を再利用できます。オブジェクトとして何かを書くのに3倍の時間がかかります。
たとえば、描画プログラムを使用していて、突然描画できる新しい図形がある場合は、ShapeObjectを変更するだけです(インターフェイスは同じままにします)。プログラム内の他の何も変更する必要はありません。
C/C++のifステートメントの評価順序はコンパイラ固有のものであること。だから書く:
if(pointer!= NULL)&&(pointer-> doSomething())
評価順序を交換できるため、安全ではありませんでした。 ANSI-C仕様の一部であるため、順序とその完全な安全性を保証できることを最近(うそをついた長い年月を経て)発見しました。
ジェームス
大学時代(90年代半ば)には、コンピュータラボにWindows 3.11マシンしかありませんでした(変な大学を知っています)。
しばらくの間、私はWindowsプラットフォームのみがプロのプログラマーとして私に関連しているであり、他のすべてのプラットフォームは歴史的な学術的観点からのみ興味深いと考えました。
学校を卒業して現代のUNIXとLinux環境について学んだ後、私は自分のlame学校について怒って失望することを余儀なくされました。
まだbashシェルを見たり、emacsやvimについて聞いたりすることなく、コンピューター工学の学位を取得したとはまだ信じられません。
K&Rを読んでCを独学しました。残念ながら、Word for Wordを読んでいなかったので、いくつか見落としていたに違いありません。私はあなたが既存のライブラリとリンクするだけでよいことに気づかなかったので、私は仕事から仕事へ私と一緒に持ち歩いたmallocとcallocの私自身のバージョンを書きました。私はこれを数年かけて、誰かが最終的にそのようなものを持ち歩いている理由を尋ねるまで、「ええと...既存のライブラリにリンクするだけでいいことを知っていますか?」
Karnaugh maps のプログラミングで実際の使用法を見つけることは決してないだろうと私はコンピューターサイエンスのカリキュラムで教えられました。
バイトやCPUサイクルを無駄にせずに効率的なプログラムを作成することが非常に重要でした。
しかし、より多くの経験があれば、バイトやCPUサイクルについてではなく、思考の流れについて、連続的で、途切れることなく、詩のようになります。
基本的に、一生懸命やろうとしないでください。
そのテストは、先延ばしの単なる別の方法でした。
exact scienceを学習することで、限られた社会的スキルを向上させる必要はありません。
オブジェクト指向コードを迅速にリファクタリングする必要がないこと。マーティン・ファウラーがついに目を開きました。
そのPythonは非実用的で迷惑な言語でした(私はまだ初期のコードに関するコメントを読んで文句を言うことができます)そしてC++は真のオブジェクト指向言語でした。
私はとても恥ずかしかったので間違っていました。
私が他の誰かのために裕福なプログラミングソフトウェアになるまで
学校では、プログラミングは「入力の読み取り、データの処理、出力の書き込み」であると教えられています。実際には、処理ステップはめったにありません。ほとんどのコーディングは「入力、出力を読み取る」だけです
通常、「ユーザーからの読み取り、データベースへの書き込み」または「データベースからの読み取り、画面への表示」のいずれかです。これら2つのケースは、これまでに行う作業の約95%をカバーします。
顧客が望むものを認めることで顧客を満足させます-残念ながら、これは顧客が望むものを知っていることを意味します。
コードが少ないほど良い。今では、読みやすく/理解しやすい場合は、より多くのコード行を追加する価値があることを知っています
PHPのmysql_fetch_rowが、実行されたSQLクエリからデータを取得する唯一の方法でした。
正直に言うと、mysql_fetch_arrayを使用せずにWebアプリケーション全体をプログラミングし、関数を変更して列を追加するたびに、一連の数字を変更する必要がありました。
Linuxでは、実際にlieを参照し、将来のある時点で実際にメモリを割り当てるか、またはメモリをアボートするため、Linuxでメモリ割り当てが参照を返すかどうかを確認するかどうかは関係ありません必要なメモリがない場合は完全にプログラムします。
それ....ブレークポイントが有効なときにJUnitテストを必要とするのは誰ですか? (デバッグモードでアプリケーションをテストする場合)。後で気づいた....
システムプログラミングに適した言語must [可変]変数をサポートしていること。
マーケティング担当者はあなたが何をするかを気にします。
一般的な貧しい仮定:「コードの品質は二次的です」。さらに悪い仮定:「コードの品質はまったく重要ではありません。」
コードの品質は非常に広い概念になり得ます。私はそれをかなり徹底的に開示しました ここ 。
その単純さはほとんどの場合、複雑さを打ち負かします。 KISS-Keep It Simpleバカなルール。
編集:ゲオルグが以下に述べるように、私はこれを逆にした。返信で私の心が失われたに違いありません。シンプルに使用すると、ほとんどの場合、コードがより適切になります。
優れたプログラマーになるには、システムの内部動作をすべて知っている必要があると私はいつも信じていました。コーディングを始める前に、ライブラリ、パターン、スニペットなど、言語について知られていることをすべて知らなかったという事実を恥ずかしく思いました。まあ、私はもうそれほど素朴ではありません。
プロジェクトを完了するためにクライアント仕様が必要であること。営業会議とメモ帳から始めるよりも多くの場合。もちろん、会議の終わりに、彼らは「ちょうどそれを大まかに」締め切りを望みます。
すべてのOOP言語はオブジェクト指向の同じ概念を持っています。
interface
!=メソッドのインターフェース。自動化と組み合わされたプログラミングの優雅さは、古き良きテストの適切な代替品でした。
締め切り前にそれを完了するのに十分な時間が常にないこと。
以前は、MS開発者のようなトップレベルの開発者のようにプログラムすることはないと思っていましたが、今では同じクリーンなコードを書くことができると思います。
WTFは常に悪い専門家の証拠です。
実際、最近私は自分のキャリアを通じて自分がどれだけのWTFをコミットしているかに気付きましたが、StackOverflowが それらは単なるソフトウェアメトリックである を見せてくれて安心しました。
あなたが私のコードを読めないなら、あなたは言語を知らないだけです。いくつかのコードレビューがあり、そこで反論しようとしました。
コードに魔法をかける時間と場所があり、それがアプリケーションではなくライブラリにあることを知るために、さらに数年かかりました。アプリは明快さと読みやすさのためです。マジックは、拡張メソッドとフレームワークの背後に隠れている場合に最適です。
成功したアプリケーションの作成は、プログラマーだけが簡単に行うことができます。ソフトウェアは、使いやすさ、見栄え、ドキュメント、適切なマーケティングも重要です。ソフトウェア開発は複数の分野にまたがり、1つの分野に失敗するとおそらくアプリケーションに失敗します。
Windows 3.1は、ソリティアをプレイするためのプラットフォームに過ぎないと考えました。 DOSはBASICAのプラットフォームです。
コードを徹底的にテストした場合、エラー処理は不要です。
その変数は、実際にはメモリ内の特定の領域の単なる名前です。
プログラミングを理解したこと。 SICPの本を読んで、何も知らないことがわかりました。少なくとも今、私はもっとプログラミングを掘り下げています。
Javaは、オブジェクトのコピーを参照ではなく関数に渡します。
言い換えれば、オブジェクトをメソッドに渡してから、何らかの方法でオブジェクトを変更しても、呼び出しスコープのオブジェクトは変更されないと考えました。私は常にオブジェクトをメソッドに渡し、それらを操作してから返しました!
負の結果を伴うことなく、コンストラクターでC++オブジェクトをmemset(this、0、sizeof(TheObject))できること
長くはないが、ある時点で、数年間私は:
それが高校で「コンピューターコース」を選択しなかった理由です。コンピューターについてはもう十分知っていると思いました。
後で大学で、私の間違いから:
最後に、長い間、私はそれを考えました:
コードの行が多ければ多いほど、ソフトウェアは良くなります。
私がコードを本当に上手く、できるだけバグのないように書くなら、それが私ができる最善のことだという仮定。時々、マネージャーはニースの仕事をするよりも自分のお気に入りになろうとする人を好むことがあります。
私はプロのプログラマーになるとは思っていませんでした。電子機器を扱うことになると思いました。しかし、最終的には、プログラミングが非常に簡単になり、費用が非常に安くなるため、副業として始まったものが私の主なものになりました。
私の最大の先入観は、私が望む方法でプログラムを許可されるということでした。それからもちろん大学を卒業して、ばかげたフレームワーク、ルール、手順を備えた会社に雇われました。これは、自分が思い通りにプログラミングしていなかっただけでなく、プログラミングしていたことを意味していました悪い 。
これは恥ずかしいことですが、C#で各メソッド呼び出しの値を格納する変数を作成するよりも、メソッド呼び出しをネストする、または複数のメソッド呼び出しを行う方が、ずっと長い間メモリ効率が良いと考えていました。
一時的な解決策は永続的な解決策ではないこと
または換言すると、回避策は永遠にありません:))。
それはどういうわけか、かなり多くのかなり知名度の高い/トラフィックの多いウェブサイトを運営する会社が実際に彼らが何をしていたかを知っていました。最終的に彼らはほとんど無知であり、彼らがいた位置にいることは非常に幸運だった。だから私は道徳がそうなると思う
堅実なソフトウェアエンジニアリングとベストプラクティス!=ビジネスの成功
または....
最も重要なソフトウェアシステム==がらくた
8時間連続でコーディングすると思いました。現実的には、1日4時間のコーディング、1時間の昼食、1時間のコーヒーブレーク、2回のねじ回し/チャット/スタックの流れが発生します。
仕事をする前に、私はすべてのクライアントがばか者であり、コンピューターに関する2つのくだらないことを知らないと思っていました。少年は私がそれについて間違っていた。時々、私たちは私たちができる以上にそれを行うことができる人々によってプロジェクトを受け取ります、彼らはただそれをする時間がないだけです。
私はキュービクルが悪いと思った、今私はそれらを愛している:D私は実際にドアのあるオフィスからキュービクルに移動しました。私は開放性が好きです。
すべてのプログラマーは運動能力がありません。ジムに行くのは自分だけだと思った。私が働いている場所では、少なくとも10人が毎日午前5時にジムに通っています。
女性プログラマーはいないと思いました。リードのカップルは女性です。
従来の手続き型プログラマーに、なぜOOP oft-timesがより良い解決策を提供するのかを納得させることができた。
つまり、世界を記述する言語には、複雑なオブジェクトとそれらの関係を記述する機能が必要です。
引数には通常、抽象クラスに関するナンセンスが含まれており、「OOPプログラマーは、Uniに慣れていないのに抽象に夢中だというわけではありません。」と答えました。 OOP厳密な手続き型プログラミングではできなかったこと]、私は通常、「あなたはできた、それはあなたかより広範なツールセットがあれば」.
私は彼らが私と同じレンズを通して世界を見ないことをただ受け入れることを学んだ。
実行時のパフォーマンスが重要でした。多くの場合、合計ソリューション時間が重要です。
Pythonを学んでから、添付ファイルから静的型付けまで引き離しました。
そのソフトウェアエンジニアは、現在行っていること、または過去にソフトウェアに対して行ったことに対して常に正直です。
私たちの開発方法は、最高の品種であるために選択され、使用されました。
それから、私が使用したツールは、私が思っていたよりも、何をしたか、いつ、どのようにしたかに、はるかに大きな影響を与えていることがわかりました。
ポインターと再帰性を理解するのは大変なことです。
VB6の整数は、.Netとはサイズが異なります。
そのVB6はビットレベルの操作を行うことができます。
プロのプログラマーはバグのないソフトウェアを作ります。
「標準」環境でソフトウェアを構築したため、誰のマシン/サーバーでも動作します。実際に使用されていた不明瞭なライブラリとサービスをインストールしたことを発見するためだけに。そして、私はバグを活用し、その後パッチが適用されたことを発見します。
仕様は完全で十分です
そのプロファイリングとパフォーマンス分析は同じものでした。
次に、プロファイラーは、何よりも優れているものの、次のような誤った仮定を含んでいることがわかりました。
ID列に重複した値を含めることはできません: SQLサーバーのID列
80年代前半にコンピューター(1Kのメモリを搭載したZX81)をいじり始めたとき、私は基本的にBASIC Poke命令を使用して、雑誌のゲーム用に一連のマシンコード(人間が読めるアセンブリ言語ではなくバイト)を入力するのに何時間も費やしていました。
誤って1つの命令を入力した場合、最初に戻って最初からマシンコードの入力を再開する必要があると考えました。
適切なWebアプリケーションを作成することを知っていて、すべてのブラウザーで機能するものを設計しなければならなかったとき、それはすべて明らかでした。
Javascriptで0で割ったものが無限(IEEE 754算術)であることは知りませんでした。最近大変なことを学びました。
人々は実際に使用されている技術(オープンソース/クローズドソース)を気にかけていた。
Windowsのスレッドは安価です。
これはやや真実であることが判明しました。スレッドにはある程度のオーバーヘッドがあり、スレッドが存在して満足できる独自のアドレススペースが必要です。したがって、単一のアプリケーション内で数十のスレッドを処理していることに気付いた場合、すべてをより少ないスレッドに簡素化および統合する方法を自問します。
Unicodeの完全なサポートは、アジア地域にソフトウェアを正常に展開するための前提条件でした。
本番環境では「断続的なエラー」を診断できません。サーバーを再起動することが唯一の修正方法です。
私の初期のASPコーディング。アプリケーションに診断ログをコーディングする必要があります。
その640Kは誰にとっても十分なはずです(DOS)。それは長年にわたって多くの人々に広く信じられていました。
8MBのRAMを搭載したシステムを初めて使用したとき、それは必要以上に大きいと思いました。 OS(Mac)に加えて、使用していたすべてのアプリケーション(Word、Email、Firefoxなど)を実行しました。
Html要素のidとname属性は交換可能です。
「name」属性を持つ要素は、POSTなどに関連/使用されています。また、「id」属性はDOM参照に使用されています。
私が書いたものはすべて、予見可能な将来のある時点で失敗するでしょう。
すべてが最終的にバラバラになるわけではありませんが、プログラミング教育の早い段階で、try..catchブロックを見つけました...すべてを包みました...私のプログラムが処理するよりも問題がある(例えば、北極と南極が入れ替わっている)
速い車、ゆるい女性、プライベートジェット、大胆な冒険のジェットコースターに乗ることになると思いました。そのキャリアアドバイザーに手が届くまで待ってください。
MLやHaskellのような強力な静的型システムがある場合は、それを使用してできるだけ多くの不変式をエンコードする必要があります。経験を積んで初めて、不変式を動的にした方が良い場合があることを学びました。
まったく新しい言語を学ぶことは本当に難しいでしょう。
それはOOPは時代遅れでした:(私はまだこの日までそれを考えて後悔しています。
スレッド=プロセス
十分なソフトウェアを書くのは簡単だと思った
中学校でアルゴリズムを学んでいたとき、NPCは単なる非多項式問題であり、この問題の複雑さは多項式ほど簡単ではないことを意味していました。大学で計算理論を学ぶまでは間違っていた-_- b
セールスマンが顧客の期待を現実的に管理すること。 (見込みのないものと過剰なものの訓練を受けた)
そのソフトウェア要件は一般に市場調査から来ています。
その次元nは、次元(n + 1)が同等である場合のインスタンスです。
それ:
for (int i = 0; i < myObj.variable; i = i + 1)
以下に最適化されます:
int j = myObj.variable;
for (int i = 0; i < j; i = i + 1)
うわー、私はそれらが毎回実行されていることに気付いたとき、jの代わりに関数呼び出しを置くことを止めました!
理由:
for (int i = 0; i < myObj.variable; i = i + 1){
if (function_argument == NULL){
myObj.variable++;
} else {
printf("%d", myObj.variable);
}
}
以下と同じではありません:
int j = myObj.variable;
for (int i = 0; i < j; i = i + 1){
if (function_argument == NULL){
myObj.variable++;
} else {
printf("%d", myObj.variable);
}
}
任意の例ですが、最適化によって実行がどのように変わるかを確認できます。
もちろん FindBugs と [〜#〜] pmd [〜#〜] を見ることができますが、これらは私のお気に入りの落とし穴とトリック(すべてJava)です。
フィールドはオーバーライドされず、シャドウされます。
明示的なsuper.superアクセスはありません。
コンストラクターが定義されていないクラスには、暗黙的な引数なしのコンストラクターがあります。今年、これに関連した実際的な誤りを犯しました。
内部クラスの親への参照を取得するには、構文「Outer.this」を使用してメソッド呼び出しを明確にするか、同期します。
クラスはC++の用語で「自分自身の友」であり、プライベートメソッドとそのクラスのインスタンスのフィールドは、同じクラスのメソッド(静的メソッドも含む)から参照できます。これにより、初期のclone()の一部が作成され、コンストラクタがコピーされます。
保護されたメソッドとフィールドは、クラスを拡張する静的コンテキストでアクセスできますが、そのクラスが同じパッケージ内にある場合のみです。 flex.messaging.io.amfが密封されたパッケージではないことを嬉しく思います。
彼はプログラミングを知っていると言った、それは真実でなければならない!
プログラムは、最終的にすべての問題を解決できます。
自分がコードを作成する唯一の人間だと思って...そのルーチンが必要になったとき、自分がしたことを思い出せず、自分のコードをコピー/貼り付けするだけです。
今、私は誰もがそれを行うことを知っています。