ANSI Cが私たちの新しいプロジェクトには不十分であると上司に納得させるにはどうすればよいですか?[閉まっている]


64

数か月前、社内で開発されたテスト機器を制御し、一連の測定値を記録するアプリの開発を開始しました。シンプルなUIが必要です。また、継続的な記録が必要なため、スレッドが必要になる可能性があります。このアプリケーションは数年間使用され、この期間中は多くのコンピューターサイエンスの学生によって維持されます。

私たちの上司は約30年前に卒業しました(犯罪とは見なされません。私もその半分以上を背負っています)。このアプリケーションをANSI Cで開発することを義務付けています。ほぼ全時間であり、したがって、彼は私たちが何をしているかを理解できなければなりません。彼はまた、抽象データ型を使用しないことを決定しました。彼は私たちが使用したいグローバル変数(ため息)の名前のリストさえも私たちに与えました。

私は実際にしばらくこのアプローチを試しましたが、すべてのポインター操作が安全で、すべての文字列が正しいサイズであることを確認するのに本当に時間がかかりました。さらに、実際に手元の問題に関連するコードの行数は、コードベースのほんの一部でした。数日後、私は全体を廃棄し、C#を使用して新たに始めました。私たちの上司はすでにプログラムが実行されていることを見ており、その動作方法は気に入っていますが、別の言語で書かれていることを知りません。

来週、私たち二人はソースコードを調べるために会い、彼は「それを維持する方法を知っている」。私はちょっと怖いです、そして、私は私の決定を支持するためにどんな議論を使用することができるかあなたたちから聞きたいです。

ward病なあなたのもの、


220
「いや、これは最終バージョンではありません。要件を理解し、UIを微調整するために、プロトタイピングとテストのために数日ですぐに書いたC#バージョンです。これをANSI Cに実装するには、あとX週間、すべてのファンシーなデータ構造を持たないように回避しなければならないので、...そうですね、あなたがそれについて言及した今、C#バージョン最終的なプログラムがすべきことをすべて行っていますが、あなたは言いましたANSI Cで必要になります。...OK、あなたが主張するなら、このバージョンを
使い続け

8
@Heinzi:私は同じ経験をしました:2日でライブラリのC#プロトタイプを作成し、Cで数週間書き直しました。幸いなことに、そのプロジェクトの後、私はより多くの賢明な言語選択。
dan04

49
グローバル変数とスレッド?使用しているプログラミング言語に関係なく、あなたは困っています。
ネマンジャトリフノビッチ

16
あなたが本当に必要とする議論は、あなたが仕事を続けるべき理由です。
エポ

11
あなたの仮定は間違っています-ANSI Cはほぼすべてのプロジェクトに適しています。だからこそ、この数年後もまだ人気があります。最適かどうかは別の質問です。
マークランサム

回答:


108

「そう、私は確信している。このようにそれを行ってくださいことに注意してください、私はそれを維持することができ、」実際には非常に良い条件である-ほとんどのプログラムははるかに長く過ごす書かれており、公知の技術で解決策を維持することは通常は良いアイデアですされているよりも、維持されています。

C#アプリケーションの作成を求められた新しいコンピューターの子供が2日間でHaskellでそれを書き、「おい、それは機能し、私は行って、さようなら」と言ってメンテナンスをあなたに任せたと想像してください。

15年前にANSI Cアプリケーションの作成を求められたときに、新しいコンピューターの子供が2日でVisual Basic 6で作成し、それを残していたとします。今、あなたはそれを維持する必要があり、インストールメディアが挿入されると、Windows 7はすでに文句を言い始めます

Heinziがコメントで示唆したように、これは「これはC#で書かれたクイックプロトタイプであり、Cによく似ています-生産準備を整えるか、またはANSI Cで再実装しますか」と言う良い機会かもしれません。 」を選択し、今すぐ議論を始めます。実際のソースを確認することは、「ねえ、Haskellで次のアプリケーションを書くべきではないからです」

つまり、新しいプラットフォームを検討できることを実証する機会が得られました。コードレビューのにプロトタイプを作成したことを確認してください。これにより、レーダーの下でC#をこっそり盗もうとしているという印象を取り除くことができます。また、ANSI Cで記述された既存のコードはすべてC#内から使用できることを示すことをお勧めします。個人的には、ターゲットはANSI Cのままで単一のプラットフォームにとどまると言われると思います。


26
+1:要件を指摘するために、「このようにすることで、それを維持できると確信しています」。C#は(一般的に)Cよりも開発が容易/高速ですが、Cは過去15年間でC#が変更されたよりも過去30年間で変更されたのは確かです。したがって、長年にわたって保守する必要がある製品の場合、Cの方が適している可能性があります。すべての要件の間で妥協する必要があります:プロジェクトの複雑さ(C#がおそらくより良い選択です)、長期メンテナンス(Cはより安定しているようです)、誰がメンテナンスを行うかなど
Giorgio

4
@Ramhound VB6のサポートについてではなく、Visual Basic 6 開発環境のサポートについてです。Windows 7のコピーは、インストールメディアを挿入するときに、これは良い考えではないことを明示的に通知しました。

12
良い点ですが、上司がCOBOLで作成するように要求した場合はどうなりますか?または6502アセンブリ?「この目的のためにその言語は時代遅れであり、あなたがいなくなるとこのことを理解している人は誰もいないでしょう」と、あなたは上司にどの時点で言うことができますか?
アリ

6
@アレックス:一貫性はいい、本当です。しかし、もしあなたの部門が書いた他の(非Web)ソフトウェアがすべてCで書かれていたら、Cで新しいWebシステムを書くでしょうか?それは、あなたが書いているシステムに適切なテクノロジーを選択することと、チームの既存のスキルとの間のバランスにあると思います。それはあなたが常に使用するものであるため、熟慮のない言語を選択することは有害である可能性があります。
アリ

8
@ant、バンドにお金を払う人が音楽を選ぶようになります。(そして私たちはCOBOLショップです-それをサポートする問題はありません)

35

この場合、あなたの上司はあなたの顧客であるように思われ、彼の主な要件は、あなたが先に進むときに彼がアプリケーションを維持できることです。これはかなり合理的です。

そのため、彼が求めていることを実行するか、開発を完了し、時間の制約内で低コストでC#アプリケーションを維持する方法を教えることができます。それができない場合、プロジェクトの要件を満たしていません。


21
OPは、通知や議論なしで要件を明示的に無視しました。上司が商業顧客であった場合、支払いを拒否し、時間の無駄のために発生した費用で訴える可能性があります。役割を逆にします。たとえば、オーダーメイドのスーツを注文し、仕立て屋があなたが指定した布で作業するのが好きではなかったので、彼が好きなものを静かに交換しました。現在、OPの問題は、彼が綿密な監督なしにプロジェクトを信頼することができず、明らかに人々のスキルを欠いており、管理を尊重していないことです。
エポ

1
@epo上司は、求められたことを行わなかったため、OPがOPを信頼できないというあなたの主張を理解していると思います。ただし、彼が合理的なマネージャーである場合、それは起こりません。開発者が当初考えられていたよりも優れたソリューションでマネージャーにアプローチした場合、マネージャーがそれに対してオープンであることを望みます。あなたの例を少し変更するかもしれませんが、それは、仕立て屋が、買い手がタイプを求めたにもかかわらず、新しい、より耐久性があり、より良い感じで、より安いタイプの布で希望の色/パターンでスーツを作るようなものです彼らが精通していた布の。
テイラー価格

とはいえ、この場合、メンテナンスは重要な要件であることに同意します。OPは、マネージャーが迅速かつ効果的に維持することを学習できるように、残りの要件を解決したことをマネージャーに証明するようになりました。
テイラー価格

26

あなたは多くの情報を提供していませんが、私はCが絶対に正しい選択だと思います-私は工業プラントでエンジニアとして働いており、私たちのコードのほとんど(すべてではないにしても)はCで書かれていますデバイス(ここでは流量計や熱電対などを想定しています)をリアルタイムCに近い状態で表示することは優れた選択肢です。

高速で移植性があります(C#で記述したことはありませんが、特定のバージョンのフレームワークがインストールされていないと動作するとは思わず、通常はWindowsベースのみです)。

必ず別の言語を使用してGUIを実行できます。しかし、労力を節約し、既存のトレンドパッケージを使用するだけで済みます(優れたオープンソースパッケージがいくつかあります)。

要約すると、ハードウェアパーツCとの基本的なインターフェイスについては良い選択です。


7
C ++コードを使用した場合よりも、WindowsからLinuxに(Monoを使用して)C#コードを移植することに成功しました。
dan04

8
@ dan04:C ++でどのような問題がありましたか?C ++は非常に移植性が高いと思いました。また、C ++はCではありません。GNUCライブラリと一緒にCを使用すると、GNU Linuxとcygwinの間などで、かなり移植性が高いことがわかりました。
ジョルジオ

4
@ dan04 C!= C ++。

2
@Giorgio:迷惑なほど大きな部分は文字列でした。Windows固有のTCHARがらくた(すべて一貫して使用していなかった)をすべて取り除き、Linux移行と同時にUTF-8を使用するチーム標準を採用しました。残念ながら、これにはWindowsで標準ライブラリの大きな部分を再実装する必要boost::nowideがありましたが、当時は存在していませんでした。
dan04

3
@ dan04:前述したように、Cは確かにC#(またはその点ではC ++)ほど表現力がありませんが、1997年からGNU Cライブラリ(gnu.org/software/libc)を使用しています。C ++の場合、Qt(またはboostおよび標準ライブラリ)は非常に移植性が高いため、それらを調べます。可能な場合はWindows固有のものを避けます。顧客ロックインはマーケティング戦略の一部であるため、ポータブルソフトウェアを製造することはMicrosoftの目標ではありませんでした。
ジョルジオ

24

まあ。これはリアルタイムアプリケーションですか?リアルタイムで機器を制御しますか?リアルタイムでデータを収集しますか?ガベージコレクターで言語を使用していますか?まあ。

あなたはおそらくより短い時間でより現代的な言語でアプリを実行できることに同意しますが、それはおそらく主要な基準ではありません。プログラミングのしやすさは、他の基準(おそらく、上司が定めた基準、応答時間、決定論的な行動など)ほど重要ではありません。

主な機能とUIをテストするために、C#またはPythonでプロトタイプを作成することをお勧めします。その後、何日にもわたって連続して実行されているアプリが大量のデータでヒットしたときの実際のレイテンシーと応答時間を測定します。VMやガベージコレクターが起動すると、アプリが遅くなりすぎたり、ランダムに遅れたりする可能性があります。

プロトタイプとして行ったことを提示することをお勧めします。

Cでのコーディングはそれほど難しくありません。あなたがそれまでではないなら、そう言ってください。私たちの挑戦はたく​​さんあります。(私は何十年もの間リアルタイムCコーディングを行ってきました)。


3
最初のビットを異なるフレーズにしましょう。まあ。これはリアルタイムアプリケーションですか?リアルタイムで機器を制御しますか?リアルタイムでデータを収集しますか?非リアルタイムのスレッド環境で実行していますか?まあ。デバイスの境界を越えるときは、常にサンプリングする必要があります。「リアルタイム」は、ストローマンの議論であり、定義が不十分な要件です。C#は問題ありません。
ガスドール

ジョー・ダフィーの作品を聞いたことがないのは明らかです。彼は少なくとも2013年からC#システムプログラミングに取り組んでいます。Roslynコンパイラーはネイティブコードにコンパイルでき(これがUWPの動作方法です)、ガベージコレクションは、実行していることに注意を払えば問題になりません。
ラバーダック

14

まあ、最初にすることはあなたの上司に行き、怒りを上げることです。あなたは彼の明確な要求を無視しており、さらに悪いことに何ヶ月もそうしている。これにどれだけの時間を費やしたかはわかりませんが、ほとんどの時間をプロジェクトの完了に割り当てると仮定すると、すぐに新しい仕事を探しているという事実に直面する必要があります。

これに早く対処するほど良い。

第二に、ANSI Cが不十分であることを彼に納得させることはできないと思います。あなたがする必要があるのは、他のいくつかのことを彼に納得させることです(1)c#が適切である、(2)彼がc#を維持することを簡単に学ぶことができる、(3 )あなたはCでそれを書くのが不適当だった。あなたがまだこのプロジェクトで仕事と役割を担っていると仮定して、私は2に集中してcとc#の類似性を強調します。

コメントへの応答での引用...

数ヶ月前、私たちはアプリの開発を開始しました[...]数日後、私はすべてを廃棄し、C#を新たに使い始めました


彼は何ヶ月もの間C#バージョンを構築していたとはどこにも言及していませんか?
匿名

1
@匿名-彼がまだ彼のマネージャーの指示に従わなかった日または月だったかどうかは関係ありません。著者は、ANSI Cでアプリケーションを開発するために必要なスキルを持っていなかったことは明らかです。
Ramhound

1
@Ramhound-私は彼がマネージャーの指示に従わなかったことに異議を唱えていません。私はjmoernoが接線で何ヶ月も過ごしたかのようにうまくいっていると言っているだけです。それに、もし彼が数日でプロジェクトをつなぎ合わせて、指定されたより安定したCバージョンがベースにできる作業プロトタイプとして機能するなら、それは完全に理にかなっています。これは計画段階の一部です。
匿名

@jmoreno-謝罪、私は質問を読み違えたに違いありません。
匿名

2
@jmoreno-もちろん。追加した見積もりを確認した後、最後のコメントを投稿しました。もう一度おApび申し上げます。
匿名

12

ANSI Cでこのアプリケーションを開発することを義務付けています。理論的根拠は、彼が全体の時間の周りにいる唯一のものであり、したがって、彼は私たちがしていることを理解できなければならないということです。

これはかなり合理的な要件です。

彼はまた、抽象データ型を使用しないことを決定しました。

これは意味がありません。これは言語の要件ではなく、プログラムの設計要件であるため、少し疑わしい匂いがし始めています。コードの保守が容易な場合、ADTを実装するか、十分にテストされた既存のコードを使用することを優先する必要があります。

彼は私たちが使用したいグローバル変数(ため息)の名前のリストを私たちに与えてくれました。

わかりました、それで今臭い。これで、上司はさまざまなプログラミング言語だけでなく、一般的なプログラミングの経験も限られていることがわかります。熟練したベテランプログラマは、言語の好みに関係なく、そのような発言をすることはありません。(私が考えることができる唯一の例外は、ほとんどのコードがかなり小さな組み込みシステムで実行されることを意図しているため、コードに必要なすべての作業メモリが事前に割り当てられると予想された場合です。ただし、画面レベルのUIがそうであることに強く反論することが期待されます)。

上司は大規模でミッションクリティカルなソフトウェアプロジェクトに関与したことはありませんが、さまざまな低品質のプロジェクトに浮かんでいる可能性が高いと思います。

したがって、これはプログラミング言語Cとは何の関係もありません。C#でも同様に厄介なプログラムを簡単に作成できます。優れたプログラム設計は言語に依存すると信じることは非常によくある間違いです。それは単に真実ではありません!

C#は、確かにCよりもきれい、きれいであまりあいまいな構文を持ち、それがCよりもはるかに多くのOO-関連するキーワードを持っていますが、それとは別に、それはあなたを教えてくれないので、それは、プログラムの設計支援をたくさん持っているどのようにあなたのプログラムを書くこと。Cで書かれたすべてがデフォルトでひどいものであり、C#で書かれたすべてがデフォルトで天国だと信じているなら、あなたはそれを気づかずにかなりひどいC#プログラムを書いているに違いない。

私が提案するのは、何よりも先に抽象的な、言語に依存しないが詳細なプログラム設計を行うことです。通常のオブジェクト指向のアプローチを使用します。どのオブジェクトがあり、どのように相互に通信するのか、必要な依存関係などは何ですか。プログラムの設計に十分な考えを与え、紙に書き留めたとき、それはあなたにとっても上司にとっても重要ではありません。実装することを選択した言語。


1
+1「C#でも同じように厄介なプログラムを簡単に書くことができます。」
ハビエル

11

最初に対処しなければならない問題は、感情的で不合理な問題です。IT業界は絶え間ない変化を遂げており、あらゆるものに対応できる場所がありますが、変化を改善または受け入れることを拒否することは問題です。

上司がなぜANSI Cにしがみついているのですか?それが彼または彼女が知っている唯一の言語であるならば、多分それは変化の時であるかもしれませんが、合理的な議論は不十分かもしれません。上司は、なじみのない言語で働くことを余儀なくされると、過小評価されたり、解雇されたりしますか?彼が持っている経験と彼がもたらす他の利点を強調します。

この問題を解決しないと、持てる合理的な議論はすべて無駄になります。部下として、あなたは彼とこの議論を持つことができるものではないかもしれません。おそらく、他のマネージャーがいれば、この件を他のマネージャーに伝えます。

また、あなたの観点から検討してください。なぜC#を使用するのですか?新しくてクールなものを使いたいという欲求はどれくらいですか?あなた自身に正直であれ。これを認識すれば、より効果的に議論するのに役立ちます。

2番目の問題は、リスクとコストの1つです。ソフトウェアを書くことは高価であり、言語の選択はその大きな要因です。考慮してください:

  1. C#対Cで書くのにどれくらい時間がかかりますか?オブジェクトの向きが簡単になり、ガベージコレクションが改善されるため、C#の方が簡単になります。ただし、アプリケーションが多くのアンマネージAPI呼び出しを使用する場合、Cの方が簡単な場合があります。
  2. C#を使用している場合、追加のツールを購入する必要がありますか?既にVisual Studioを使用しているようですが、ローカライズ、コードのレビューと分析、デバッグなどのために追加のツールが必要ですか?
  3. 保守はどれくらい簡単ですか?バグを見つけた場合、どれくらい早く修正できますか。C#は、このオブジェクトの向きを減らすことができます。自動ガベージコレクションは、ほとんどのメモリリークとポインタの問題も回避します。
  4. サポートは簡単ですか?サポートスタッフがいる場合、クラッシュダンプの読み方を知っているかもしれませんが、SOSでwindbgを使用する方法を知っていますか?ターゲットマシンには、適切なバージョンの.Netフレームワークがすでにインストールされていますか?
  5. 人員配置を検討してください。C対C#を知っている人は何人いますか?どちらかまたは両方が退職した場合、あなたを置き換えるのはどれくらい簡単ですか?C開発者はC#開発者よりも安いですか、それとも高価ですか?

私は続けることができますが、ポイントは、言語だけの技術的なメリットについて議論するのをやめることです。技術的なメリットは、あなたと上司だけが理解できるものです。ビジネスへの影響について話し始めると、はるかに幅広いグループの人々を引き込み、説得力のある議論をすることになります。

たぶんCの方が良い選択です。C#はすべての状況で自動的に改善されるわけではありません。たぶん、Cを使用してこのプロジェクトを実行しますが、次のC#の概念実証を実行します。戦いに負けても、戦争に勝つことができることを忘れないでください。


5
デフォルトでは、C#がANSI Cよりも良い選択であるという暗黙の仮定に同意しません。たとえば、プラットフォームに依存しないC#を維持したい場合は、おそらく悪い選択です。

@ThorbjørnRavnAndersen同意します。最後の段落をご覧ください。また、アンマネージコードを呼び出すようなケースについても言及します。プラットフォームに依存しないため、OPでC#が除外されると思います。おそらくこれは間違った仮定です。
アクトン

1
プラットフォームの独立性は、考えられる1つの理由にすぎません。「ANSI Cにしがみつく」のような表現は-私の意見では-バイアスを示しています。

@akton-C#からアンマネージコードをいつ呼び出せないのか。もちろん、ラッパーが必要であり、追加のサポート問題が発生しますが、可能です。さらに、必要に応じてマルチプラットフォームでC#をサポートできます。Monoは、すべての主要なデスクトッププラットフォーム(OS X、Windows、およびLinux)でサポートされています。Microsoft Windowsベースの.NET Frameworkが進歩すると、Monoの機能ベースが完全に一致しなくなり(WPFの場合は既にそうなります)、もちろんLinuxで実行されるMetroアプリケーションを開発できなくなります。もちろん、この場合はその可能性は低いでしょう。
ラムハウンド

@Ramhound C#からアンマネージコードを呼び出すことはできないとは言いませんでしたが、その多くが苦痛になる可能性があります。同様に、C#でクロスプラットフォーム開発を行うこともできますが、Thorbjornが言ったように、Cはほぼ普遍的です。
アクトン

7

たぶん別の議論:間違いを犯さずにCコードを書くのに十分な経験があるコンピューターサイエンスの学生を見つけるのはおそらく非常に難しいでしょう。ANSI Cは、今日人々が最初に学ぶものではありません。

今、すべてのコンピューターサイエンスの学生は私を殺します。


ANSI Cは、実際に大学で学んだ最初のことの1つでした。私は2004年に始めました。したがって、過去10年以内にまだ教えられていました。私は夜遅くまでSSH経由でUnix環境に接続してコードをコンパイルしようとしていました。
ラムハウンド

1
面白いことに、大学での最終学年までANSI Cを学びませんでした。教えられた最初の言語はパスカルだったので、私は保護されています
...-tehnyit

ここの最近の卒業生。CとC ++の両方にさらされましたが、Cは埋め込まれたコンテキストで最小限でした。どちらも私の最後の年でした-それ以前は純粋にC#とJavaでした。
ロス

2
Cは、単に権利をプログラムすることは困難であることは、おそらくC.使用に対して最良点である
ポールネイサン

7

ANSI Cが不適切であると私たちを説得することは完全に失敗しました。Cは、あなたが説明した種類のタスクに適合していると思われる優れた言語です。タスクの簡単な説明(言語の要件を除く)があれば、Cもお勧めします(または行くこともできます)。

問題は、あなたがC#で考えながらCでプログラミングしていたことだと思います。PerlからCまたはjavaに切り替えると、同様の問題が発生します。あなたはその言語に適応することを学ばなければならず、その日の言語に向かってあなたの考え方から翻訳することを学ばないでください。

問題はあなたの上司やC言語ではなく、問題は異なる考え方に心を開くことです。プログラミング言語の変更は、あなたにとって有益なものです。


4
Stack Exchange Programmersに関する最初の質問にお答えいただきありがとうございます。ただし、「あなたは完全に失敗しました」、「問題は心を開くことです」などのフレーズを使用しないことで、将来の答えを少し個人的にしたい場合があります。FAQ Programmers.stackexchange.com/faq#etiquetteを確認してください。ニュートラルな言語で自分の主張をうまく説明できると思います。
DeveloperDon

2

まず、今度は上司に別の言語であることを伝える必要があります。通知なしに要件に対して意図的に何かを持ち帰った場合、彼は(当然のことながら)怒っています。

今、これらのことを上司やマネージャーに説明する最善の方法は、時間とお金の観点から説明することです。このようなプロジェクトがANSI Cにかかる時間を見積もり、C#などのより高いレベルにかかる時間を見積もります。注:私はより高いレベルであり、現代的ではないと述べました。これは、物事をスムーズにするのにも役立ちます。つまり、小さなペイントブラシだけで部屋をペイントするのではなく、ローラーなどを使用して、各ストローク(コードの行)がプロジェクトのより多くの領域をカバーするようにします。また、あなたまたはあなたのチームメンバーのいずれかがCを知らない場合、またはCで大規模なプロジェクトを作成することに慣れていない場合、これは時間の問題にさらに食い込みます。

上司がマイクロ管理を試みているようにも聞こえます。他の答えの1つは、上司にそれをやらせる方法を説明しようとしていると確信しています


手頃な価格は可能な議論のようです。(顧客として、@ MatthewFlynnの提案による)上司は、Cで書かれていないプログラムを購入する余裕がないと主張しますが、OPは、いずれにせよ、物事を起こすには妥協が必要です。
rwong

1

ADTに対するスーパーバイザーの嫌悪感は、開発者がGCコストを認識していないように、別の場所で対処されたため、「スレッド」に焦点を当てます。

おそらく、.NET(または、JVMのように教化された)スレッドの観点から考えるのではなく、複数のプロセスで、プロセス間通信(IPC)メカニズムを使用してそれらの間で通信することができます。たとえば、Windowsメッセージ、共有メモリ、メモリマップファイルバッファ、名前付きパイプなど。デバイスまたはデバイスの一部と対話し、更新と通信要求を確認するためにIPCをチェックする小さなプロセスに専念し、GUIを維持し、選択したIPCを使用して機器「モニター」と通信するためのやや大きなプロセスがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.