如何使老板相信ANSI C不适合我们的新项目?[关闭]


64

几个月前,我们开始开发一个应用程序,以控制内部开发的测试设备并记录一组测量值。它应该具有简单的UI,并且由于必须进行连续记录,因此可能需要线程。该应用程序将使用几年,并且在此期间应由许多计算机科学专业的学生维护。

我们的老板大约30年前毕业(不要被视为冒犯;我也有一半以上的时间都在我的背上),并责令我们在ANSI C中开发此应用程序。理由是他是唯一的一位将一直存在,因此他必须能够了解我们在做什么。他还裁定我们不应使用抽象数据类型。他甚至给我们列出了他希望我们使用的全局变量的名称(叹气)。

我实际上尝试了这种方法一段时间,但确实让我放慢了脚步,以确保所有指针操作都是安全的并且所有字符串的大小均正确。此外,与手头问题实际相关的代码行数仅占我们代码库的一小部分。几天后,我放弃了整个工作,并使用C#重新开始。我们的老板已经看到了程序的运行,他喜欢它的工作方式,但是他不知道该程序是用另一种语言编写的。

下周,我们两个人将开会讨论源代码,以便他“知道如何维护它”。我有点害怕,我想听听你们可以用哪些论点支持我的决定。

ward弱的你


220
“哦,不,这不是最终版本,它只是几天后我们迅速编写的C#版本,用于原型设计和测试,以确保我们理解要求并微调UI。在ANSI C中实现此过程将需要另一个X周,因为,你知道,我们必须解决没有所有那些花哨的数据结构。......嗯,是的,既然你提到它,C#版本确实已经尽了最后的方案应该,但你说您需要在ANSI C中使用它。...好吧,如果您坚持要让我们继续使用此版本...“
Heinzi 2012年

8
@Heinzi:我也有过同样的经历:2天编写一个C#库原型,并花几周时间用C重写它。幸运的是,在完成该项目之后,我有机会转移到另一个拥有更多经验的团队。明智的语言选择。
dan04'9

49
全局变量和线程?我的朋友,无论使用哪种编程语言,您都遇到了麻烦。
Nemanja Trifunovic 2012年

16
您真正需要的观点是为什么您应该继续工作。
epo 2012年

11
您的假设是不正确的-ANSI C几乎适用于所有项目。这就是为什么这些年来它仍然很受欢迎。是否最优是另一个问题。
Mark Ransom 2012年

Answers:


108

请注意,“请像这样做让我确信能保持它”其实是一个很不错的要求-大多数程序花费更长的时间维持比被写入并保持在已知技术的解决方案通常是一个好主意。

试想一下,如果某个新的计算机小子在被要求编写C#应用程序时被要求在两天内用Haskell编写它并说:“嘿,它可以工作,我走了,再见”,然后把维护工作交给了您。

试想一下,如果某个新的计算机小伙子在15年前被要求编写ANSI C应用程序时,是否已经在两天内用Visual Basic 6编写了它并离开了它。现在您必须维护它,并且在插入安装媒体时Windows 7已经开始抱怨。

正如Heinzi在评论中所暗示的那样,这可能是一个很好的机会-“这是一个用C#编写的快速原型,恰好看起来很像C-我们是否应使其准备就绪,或者像您一样在ANSI C中重新实现它?问”,然后立即进行讨论。可以看到实际的源代码要比“嗨,我们不应该在Haskell中编写下一个应用程序,因为它更快”。

换句话说,您现在有机会证明可以考虑使用新平台。在代码审查之前提出您编写了一个原型-这将有助于消除您试图偷偷摸摸C#的印象。我建议您还演示可以在C#中使用所有用ANSI C编写的现有代码。就个人而言,我相信您会被告知目标仍然是ANSI C以保留在单个平台中。


26
+1:指出要求“像这样做,这样我就可以维护了”。一般而言,C#肯定比C的开发容易/快得多,但是C在过去30年中的变化少于C#在过去15年中的变化。因此,对于必须保持多年的产品,C可能更适合。你把所有的需求之间的妥协:项目的复杂性(C#可能是一个更好的选择),长期维护(C似乎比较稳定),谁是打算做维护等
乔治

4
@Ramhound我不是在谈论VB6支持,而是关于支持Visual Basic 6 开发环境。当插入安装媒体时,我的Windows 7副本明确通知我这不是一个好主意。

12
好点,但是如果老板要求用COBOL编写该怎么办?还是6502组件?在什么时候您可以对老板说:“这种语言已经过时了,一旦走了,就不会剩下一个懂这种东西的人了”?
2012年

6
@Alex:一致性很好,是的。但是,如果您部门编写的所有其他(非Web)软件都是用C编写的,那么您会用C编写新的Web系统吗?我认为,这可以在为您正在编写的系统选择合适的技术与团队现有技能之间取得平衡。选择一种没有经过深思熟虑的语言,因为您一直使用的语言可能会有害。
2012年

8
@ant,付钱给乐队的人可以选择音乐。(而且我们是一家COBOL商店

35

在这种情况下,您的老板似乎是您的客户,他的主要要求是当您继续前进时,他能够维护该应用程序。这似乎很合理。

因此,选择是按照他的要求做,或者证明您可以完成开发并教他如何在有限的时间内以较低的成本维护C#应用程序。如果您不能这样做,则说明您不符合项目的要求。


21
OP明确忽略了要求,没有进行通知或讨论。如果老板是一名商业客户,他可以拒绝付款,并可能因时间浪费而提起诉讼。颠倒角色,如果您例如订购了一套定制西装,却发现裁缝不喜欢使用您指定的布料,那么在选择颜色时会默默替代他喜欢的布料怎么办?现在,OP的问题在于,如果没有密切的监督,他就无法获得项目的信任,这显然缺乏人际交往能力,也不尊重管理。
epo 2012年

1
@epo我相信我理解您的断言,即老板不信任OP,因为他们没有按照要求进行操作。但是,如果他是一个合理的经理,那不应该发生。如果开发人员以比最初考虑的更好的解决方案与经理联系,我希望经理可以接受。如果我可以稍微修改一下您的示例,就好像裁缝以所需的颜色/图案制作西装,用比要求的衣服还要新,更耐用,更好的感觉和更便宜的衣服,即使买家要求的是哪种类型他们熟悉的布料
泰勒·普莱斯

话虽如此,我也同意在这种情况下维护是一项重要的要求。现在,OP不得不向经理证明,他们以经理可以快速而有效地学习维护的方式解决了其余要求。
泰勒·普莱斯

26

您没有提供太多信息,但是我认为C绝对是正确的选择-我在一家工业工厂担任工程师,并且我们的大多数(如果不是全部)代码都是用C编写的。一个设备(这里假设使用流量计或热电偶或类似设备)并以接近实时C的方式显示它是一个很好的选择。

它快速,可移植(我从未用C#编写过,但我认为如果没有安装特定版本的框架,它就无法工作,并且通常仅基于Windows)。

绝对可以使用其他语言来制作GUI。但是您可以省下精力,而只需使用一个预先存在的趋势包(有一些不错的开源包)。

总而言之,我想说与硬件C部分的底层接口是一个不错的选择。


7
与将C#代码从Windows移植到Linux(使用Mono)相比,我获得了更大的成功。
dan04'9

8
@ dan04:您在使用C ++时遇到什么问题?我认为C ++可以移植。另外,C ++不是C。我总是发现将C与GNU C库一起使用非常容易移植,例如在GNU Linux和cygwin之间。
乔治

4
@ dan04 C!= C ++。

2
@乔治:令人讨厌的很大一部分是弦。我们必须清除所有Windows特定的TCHAR废话(无论如何我们一直都没有使用过),并采用了在Linux过渡的同时使用UTF-8的团队标准。不幸的是,这要求在Windows上重新实现很大一部分标准库,boost::nowide而当时还不存在。
dan04 2012年

3
@ dan04:如上所述,C肯定不如C#(或C ++)具有表现力,但是自1997年以来我一直在使用GNU C库(gnu.org/software/libc),它确实稳定且可移植。对于C ++,我会看一下Qt(或boost和标准库),因为它们很容易移植。如果可能的话,我会避免使用Windows专用的东西:AFAIK由于客户锁定是他们营销策略的一部分,因此生产可移植软件从来不是Microsoft的目标。
乔治

24

噢亲爱的。这是实时应用程序吗?实时控制设备?实时收集数据?使用带有垃圾收集器的语言?噢亲爱的。

尽管我同意您可以在更短的时间内用更现代的语言来开发应用程序,但这可能不是主要标准。轻松进行编程可能比其他标准(例如老板放下的标准,响应时间和确定性行为)更重要。

我建议您使用C#或Python做一个原型,只是为了测试主要功能和UI。然后,在连续运行几天的时间内,当应用程序被大量数据击中时,测试一下实际情况,测量实际延迟和响应时间。奇怪的是,当VM或垃圾收集器启动时,该应用程序最终可能会变得太慢或随机落后。

我建议您介绍您作为原型所做的工作。

用C编码并不难。如果您不满意,请说出来。我们中有很多人准备迎接挑战。(几十年来,我一直在进行实时C编码)。


3
让第一句话的措辞有所不同。噢亲爱的。这是实时应用程序吗?实时控制设备?实时收集数据?在非实时线程环境中运行?噢亲爱的。跨越设备边界时,您总是必须采样。“实时”是一个稻草人的论点,而且定义不明确。C#很好。
Gusdor

您显然没有听说过乔·达菲的作品至少从2013年开始,他就开始从事C#的系统编程工作。Roslyn编译器可以编译为本机代码(这就是UWP的工作方式),如果您注意自己在做什么,则垃圾回收就不是问题。
RubberDuck

14

好吧,要做的第一件事就是去找老板和老兄。您无视他的明确要求,而且更糟的是这样做已经有几个月了。我不知道您要花多少时间,但是假设大部分时间都花在了完成项目上,那么您必须直面一个事实,即您可能很快会在寻找新工作。

您越早处理这个问题越好。

其次,我认为您无法说服他ANSI C不足,您需要做的是让他相信其他几件事:(1)c#足够;(2)他可以轻松学习维护c#,(3 ),不适合用C编写它。假设您仍然有工作和这个项目的一部分,我将专注于2,强调c和c#之间的相似之处。

行情回应评论...

几个月前,我们开始开发应用程序[...]


他没有提到他几个月来一直在构建C#版本吗?
2012年

1
@Anonymous-无论是几天还是几个月,他仍然不遵循经理的指示。作者显然没有所需的技能,以发展ANSI C的应用
Ramhound

1
@Ramhound-我并不是说他没有遵循他的经理的指示,我只是说jmoerno正在做出判断,好像他花了几个月的时间切线一样。此外,如果他在几天之内将项目拼凑起来,作为一个工作原型,并且可以基于此版本指定更稳定的C版本,那么这很有意义。这是计划阶段的一部分。
匿名

@jmoreno-抱歉,我必须误解了这个问题。
匿名

2
@jmoreno-当然。在看到您添加的报价后,我发表了最后一条评论。再次道歉。
匿名

12

要求我们使用ANSI C开发此应用程序。理由是他是唯一一个始终存在的人,因此他必须能够理解我们在做什么。

这是一个相当合理的要求。

他还裁定我们不应使用抽象数据类型。

这没有道理。现在开始有点可疑了,因为这是程序设计的要求,而不是语言的要求。如果代码应该易于维护,实现ADT或使用经过良好测试的预先存在的代码,则应该优先考虑。

他甚至给我们列出了他希望我们使用的全局变量的名称(叹气)。

好的,所以现在很臭。现在我们可以告诉您,您的老板不仅在各种编程语言方面,而且在一般编程方面的经验有限。熟练的资深程序员,无论使用哪种语言,都不会发表这样的声明。(我能想到的唯一例外是,大多数代码是否旨在在相当小的嵌入式系统上运行,因此,该代码的所有必要工作内存都应预先分配。同一代码的想法预计屏幕级别的UI强烈反对这种说法,但是)。

我猜想您的老板从未参与过大规模,关键任务软件项目,但他更有可能在各种低质量的项目中徘徊。

因此,这与C语言无关。您也可以轻松地用C#编写同样棘手的程序。认为良好的程序设计取决于语言是一个非常普遍的错误。很显然这不是真的!

C#的语法肯定比C更漂亮,更简洁并且晦涩难懂。它具有大量的程序设计支持,因为它与C有关的OO相关关键字远远多于C。但是除此之外,它不告诉您如何编写程序。如果您认为默认情况下用C编写的所有内容都是糟糕的,而默认情况下,用C#编写的所有内容都是天堂,那么我敢打赌,您当前正在编写相当糟糕的C#程序,而没有意识到。

我的建议是,在进行任何其他操作之前,请先进行抽象的,独立于语言的,但详细的程序设计。使用常规的,面向对象的方法。那里有什么对象,它们之间如何通信,需要什么依赖关系等等。当您对程序设计有了足够的思考并将其记入纸上时,对您或您的老板来说都无所谓您选择用于实施的语言。


1
+1表示“您也可以轻松地用C#编写同样棘手的程序。”
哈维尔

11

您必须解决的第一个问题是情感上的,非理性的。IT行业是一个不断变化的行业,尽管万事俱备,但拒绝改进或接受变化是一个问题。

为什么您的老板坚持使用ANSI C?如果那是他或她唯一知道的语言,那么也许是时候进行改变了,但是理性的争论可能还不够。如果被迫以一种不熟悉的语言工作,您的老板会不会被低估或被解雇?强调他的经验和他带来的其他好处。

如果您不解决这个问题,那么您可以提出的所有合理论据都将被浪费掉。作为下属,您可能不是可以与他进行此讨论的人。如果有的话,也许可以把这个话题交给其他经理中的一个。

还要从您的角度考虑它。为什么要使用C#?想要使用新颖新颖的东西有多少?不要自欺欺人。如果您认识到这一点,将有助于您更有效地辩论。

第二个问题是风险和成本之一。编写软件很昂贵,而语言的选择是其中的主要因素。考虑:

  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#。也许这是一个错误的假设。
akton 2012年

1
平台独立性只是可能的原因之一。我认为,像“紧贴ANSI C”这样的措辞确实表明存在偏见。

@akton-从什么时候起您就不能从C#调用非托管代码。当然,它需要一个包装器,这会带来附加的支持问题,但有可能。此外,如果需要,您可以在多平台上支持C#。每个主要桌面平台(OS X,Windows和Linux)都支持Mono。随着基于Microsoft Windows的.NET Framework的不断发展,Mono的功能库将无法与之完全匹配(WPF就是这样),当然您将无法开发在Linux上运行的Metro应用程序。当然,这种情况下不太可能做到。
Ramhound 2012年

@Ramhound我并不是说您不能从C#调用非托管代码,只是其中的许多内容可能会很痛苦。同样,您可以使用C#进行跨平台开发,但正如Thorbjorn所说,C几乎是通用的。
akton 2012年

7

也许还有另一个说法:要找到有足够的经验编写C代码而不犯错误的计算机科学专业的学生,​​可能很难。ANSI C并不是人们今天学习的第一件事。

现在所有计算机科学专业的学生都会杀了我。


ANSI C实际上是我在大学中学到的第一件事。我从2004年开始。所以在过去的十年中,它仍然在教授中。我花了许多深夜通过SSH连接到Unix环境,试图编译我的代码。
Ramhound 2012年

1
有趣的是,直到上大学的最后一年,我才学习ANSIC。教的第一语言是帕斯卡,所以我受到了保护……
tehnyit 2012年

应届毕业生 我们曾经接触过C和C ++,但是C是在嵌入式环境中使用的,而且数量很少。两者都在我的最后一年-在那之前纯粹是C#和Java。
罗斯

2
Ç只是被硬编程权可能是反对使用C的最佳点
保罗·内森

7

您完全无法说服我们ANSI C是不足的。C是一种出色的语言,似乎适合您所描述的任务。随着任务的简短描述(语言要求除外),我也建议使用C(或者可以选择)。

我认为问题在于您正在用C#进行思想编程。从Perl切换到C或Java时,我也遇到类似的问题。您必须学习适应语言,而不是将思维方式转换为当今的语言。

问题不在于您的老板或C语言,而是在于使您对不同的思维方式敞开胸怀。更改编程语言将使您受益。


4
感谢您回答关于Stack Exchange编程器的第一个问题。但是,您可能希望不使用诸如“您已完全失败”,“问题在于打开思路”之类的短语,以使将来的答案变得不太个人化。请查看FAQ 程序员programs.stackexchange.com/faq#etiquette。我认为您可以使用中立的语言很好地描述您的观点。
DeveloperDon

2

首先,您现在需要告诉老板它是另一种语言。如果您故意不按要求带回某些东西,他会(可以理解)生气。

现在,向老板/经理解释这些事情的最好方法是将其放在时间和金钱上。估计此项目在ANSI C中将花费多少时间,然后估计在更高级别的项目(例如C#)中将花费多少时间。注意我说的是更高级别的,不是现代的。这也可能有助于使事情变得顺利。我的意思是,您不会只用一个很小的画笔就可以绘画房间,而不会使用滚筒和其他东西来使每个笔画(代码行)覆盖项目的更多区域。另外,如果您或您的团队成员中的某人不了解C,或者不愿意在C中进行大型项目,那么这将更加困扰时间问题,因为他们将不得不加快速度。

听起来您的老板正在尝试进行微观管理。我敢肯定,其他答案之一将尝试解释如何让老板少做些事情


负担能力似乎是一个可能的论点。而老板(作为一个客户,每@ MatthewFlynn的建议)认为,他买不起程序没有被写在C,OP可以争辩说,老板也不会能够负担得起与程序存在相关的实施和维护成本无论哪种方式,都需要妥协才能使事情发生。
rwong 2012年

1

主管对ADT的厌恶在其他地方得到解决,因为开发人员似乎对GC成本一无所知,因此我将重点介绍“线程”。

也许不是考虑.NET(或JVM,如果使用的话),而是要使用多个进程间通信(IPC)机制在它们之间进行通信,这是多个进程。例如-Windows消息,共享内存,内存映射文件缓冲区,命名管道等。专门用于与设备或设备方面进行交互的小过程,并检查IPC以传达更新和确认请求,并具有更大的过程来维护GUI并使用您选择的任何IPC与设备“监视器”进行通信。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.