好奇心旺盛ですが、経験豊富なプログラマーや初心者 (私のような) が何をしたのか気になります。では、あなたが書いた中で最も難しいプログラムは何ですか?
20 に答える
私が 2005/6 年に作成したアプリケーションでは、さまざまな色で塗装された家や車などの視覚化を作成できます。これは確かに Photoshop で行うことができますが、それだけではありません。
コンパイラ
私が書きたくなかった、または書きたくなかったもの。
私はかつてBWT(Burrows Wheeler Transform)を使用する圧縮アルゴリズムを作成する必要がありましたが、アルゴリズムには巨大な行列を作成する必要があるステップがあります。マトリックスが非常に大きいため、メモリの問題と速度に問題がありました。見つけに来てください、私が使用してマトリックスを完全に回避することができた本当に単純なアルゴリズムがあります。
また、ASMで単純なオペレーティングシステムを作成する必要があり、それはかなりトリッキーでした。
非線形部分微分方程式を解くためのライブラリ。理論物理学グループでこれを使用して、非常に特殊な低温環境で発生するシュレディンガー方程式の非線形適応を解きました。
単純なソルバーを機能させるのは比較的簡単でしたが、それを一般化して高速化することは困難でした。
現在、Googleコードでオープンソースです:fdtl
私はかつて、33MHz プロセッサと 640Mb の RAM で、モーション検出と累積ヒストグラフィック マジックを実行するリアルタイム マルチカメラ ビデオ処理ソフトウェアを作成しました。難しかったのは、これを高速化することでした。約4年間、大量のハッシング、ビットシフト、不正行為、罵倒、深夜のピザとエピファニー。ああ、色を扱ったバージョンも作りました。ああ、それから大きな部屋(いわば原子炉のようなもの)で蒸気と白煙の違いを見ることができるモジュール。ハッ、あなたはそれを試してみてください!そのような例は、どの教科書にもありません。:)
1 つのコードベースで Windows と Mac の両方でコンパイルおよび実行されるアプリケーション。
暗号化とセキュリティに関係することは、常に見た目よりも1000%難しくなります。
不安定なオンライン サービス用の汎用モデム ドライバー。また、30 種類のモデム (Hayes モデムより前) をサポートする必要がありました。それらはすべて異なるタイミング特性を持っていました。
当社製品の CP/M および DOS バージョンでは、8086 および Z80 アセンブラーの両方で作成する必要がありました。ある半二重モデムの悪夢をまだ見ている...
おそらく同点:満足度モジュロ理論を使用したセットの決定問題ソルバーと、UNIXオペレーティングシステム上で実行されるC/ASMの協調プロセススケジューラ。最初のものは単純に難しいものでした。SMTを使用する前に行われたことはなく、高度に理論的な論文を別のコンテキストで実際の実装に変換することは困難でした。2つ目は、OSデータ構造を掘り下げて理解し、ビットとピースを置き換えて、別々にスケジュールされたスレッドであるかのように、プログラム内の関数間を行き来することでした。
ffmpeg apiを使用した独自のビデオストリーミングクラス-パケットを処理し、適切なタイミングでフレームを表示し、オーディオと同期するレベルで。リストされている他のいくつかほど難しくはありませんが、それは何週間も私のお尻を蹴りました!
COM による自動化、グリッド全体での実行
2つのこと:
1) コンパイラ。言語の名前は「3-balls」(彼のボールを操作した友人へのオマージュ)
2) 単一のマクロのない Windows アセンブリ プログラム。すべてがスタックにプッシュされ、アドレスはすべて相対でした。すべての Windows で動作します (アドレスはハードコーディングされていません)。基本的には、いくつかのボタンとラベルを備えた単純なウィンドウです。しかし、良い点は、オブジェクト ファイルと実行可能ファイルからオペコードを抽出し、そこからシェルコードを生成したことです。したがって、プログラムの任意のバッファを利用して、実行中のアプリケーションの上に文字通り独自のアプリケーションを作成できます。リモート コンピューターに画面を表示すると、リモート コンピューターは自分のコンピューターには存在しないプログラムを実行します。文字通り、実行するプログラムをリモート コンピューターに送信します。
もちろん、これは何の役にも立たないヘッドキャッシュが多すぎます...しかし、入力したすべてのバイトの価値があります!
デバッガー
私が 1998 年に書き始めたベクター グラフィックス ライブラリは、動的なシーンで高いフレーム レートを維持するために、O(log n) で多くの操作を提供するために階層的なサブディビジョンと、OpenGL ディスプレイ リストでメモ化された異方性テッセレーションを広範囲に使用しました。特に、複雑なベクター グラフィックスをスムーズに拡大できました。これは、それらをツリーに分解し、効率的にカリングしたためです。長年にわたり、世界最速のコンシューマー レベルのベクター グラフィックス レンダラーでした。
元のバージョンは 200kLOC の C++ でしたが、その設計の基礎となった理論上の問題を解決するのに 2 年かかりました。
複数の空間次元(3次元から最大約7次元)でモデリングを行うコードをいくつか作成しました。実際にプロットしたり、視覚化することさえできないものに取り組むと、問題はさらに難しくなります。
しかし実際には、他の人が自分の仕事で使用するためのツールキットを構築することにほとんどの時間を費やしてきた人として、私が行った最も複雑なプログラムは実際にはツールボックスであり、一貫した方法。これらはすべて連携して動作するように作られているため、実際には数十のユーティリティが1つのツールとして機能していると言えます。(もちろん、どのモジュラーコードもこの点で似ています。)ここでも、私が提供したのは、カラーマネジメントの問題を解決するために作られたモデリングツールです。
数週間前のインタビューで、まさにこの質問をされました(仕事に就いたかどうかはまだ聞いていません)。
私にとっては、基本的な入門クラスの後の最初のプログラミングクラスでのいくつかの課題でした. 私の大学で Web デザインのコースが提供されたのはこれが初めてでした。新設ということもあり、卒業生数名が入会し、クラスの約半数を占めていました。インストラクターは上級レベルのクラスを教えることに慣れており、クラスの多くのクラスをすでに知っていました。基本的に、彼はかなり経験の浅いクラスの残りの半分ではなく、彼らのレベルでそれを教えました.
おそらく最も困難な課題は、テキストのみのブラウザーを作成することでした。さまざまなタグの解析に問題があり、助けを求めました。インストラクターは、「まあ、コンパイラのコースを持っていれば、簡単なものを書くことができたでしょう. その時点で「コンパイラ」は、プログラムが実行される前に魔法のようなことをするブラック ボックスでした。私はそれが何であるかを本当に知りませんでした。
作業を困難にしたのは、作業を行うために必要なツールを持っていなかったことです。Google で調べたときに得た結果を理解することも含まれていました。(man ページと API は、探しているものを既に理解している場合に最適ですが、初心者を教えるには適していません。) 私の共同作業の経験では、メンターから次のように言われたときに最も多くのことを学びました。数時間以上かかる場合はお知らせください。毎週かそこらを除いて私から連絡を取りたくない人よりもはるかに優れています.
私は現在iPhoneアプリケーションを書いています。これは間違いなく、私がこれまでに書いた中で最も難しいプログラムです。言語が難しい、コードが難しい、またはその他の理由ではなく、デバイス上のすべてが非常に流暢でなければならないためです。
すべてが自然に見え、自然に感じられる必要があります。私は本物のプログラマーなので(流暢さ、滑らかさ、デザインについてまったく理解していないようです)、これは私にとって本当に難しいことです。プログラムはコード的には機能しますが、ユーザー インターフェイスに関しては、物事を成し遂げるのにずっと苦労しています。
また、スレッドは吸う;-)
私は今、Yet Another PHP Framework に取り組んでいますが、これまでのところ楽しい旅でした。
特別なことは何もありませんが、nxn ポイントの三角形で「球」を描画し、2 つの色の間の三角形を補間する関数です (したがって、入力は半径、分割数、color1、color2 でした)。大変でしたが、うまくいったときはとても楽しかったです:)