Questions tagged «programming-practices»

编程实践是软件开发中常用或不常用的实践。这些可以包括敏捷开发,看板,编码快捷方式等。

5
如何巧合地克服编程问题?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 在《实用程序员》一书中,作者提到了巧合概念编程。它解释了它的原因,原因,可能遇到的危险,并将其与战争中的地雷场进行了比较。 您是否曾经看过黑白战争电影?疲倦的士兵谨慎地从灌木丛中驶出。前面有一个清理工作:是否有地雷,或者可以安全穿越?没有任何迹象表明它是雷区-没有迹象,铁丝网或陨石坑。士兵用刺刀猛扑着他的脚向前扑地,期待爆炸。没有一个。因此,他在田野上辛苦地前进了一段时间,并在前进时刺探和戳戳。最终,他确信场地是安全的,他站起身来,骄傲地向前迈进,结果被炸成碎片。 士兵最初对地雷的探测没有发现任何东西,但这只是幸运。他被误认为是一个错误的结果。 作为开发人员,我们还在雷区工作。每天都有数百个陷阱在等着我们。记住士兵的故事,我们应该警惕得出错误的结论。我们应该避免碰巧进行编程(依靠运气和偶然的成功),而要刻意进行编程... 但是我对他们描述“如何克服它”问题的方式并不满意。是的,您必须在编写代码之前先思考,但是如何实践呢?我唯一能想到的就是在现有的开放源代码项目中添加功能,您必须在这些知识上既了解“我现在正在做什么”又了解“其他代码段如何工作”,但这并不适用当您编写自己的项目时。 编辑: 您的帖子摘要: 不要猜测您的下一步行动,证明它是正确的 必要时尽可能进行单元测试和重构 添加功能-编译-经常测试 如果您无法向菜鸟解释代码,则可能是巧合。 顺便说一句,很难接受答案,这真的很难。所有答案都非常棒:)

3
为什么应该在IEnumerable <T>上使用List <T>?
在我的ASP.net MVC4 Web应用程序中,我使用IEnumerables,试图遵循这一口头禅来编程接口,而不是实现。 Return IEnumerable(Of Student) 与 Return New List(Of Student) 人们告诉我使用List而不是IEnumerable,因为列表会强制执行查询,而IEumerable不会。 这真的是最佳做法吗?有没有其他选择?我对使用可以使用界面的具体对象感到奇怪。我的奇怪感觉合理吗?

16
花费太多时间进行调试
昨天,我发布了一个Web项目的v1.0版本,该项目花费了大约6周的时间(即打开和关闭)。我没有记录我的时间,但是根据我的经验,我估计在编程的全部时间中,有一半用于调试。我估计大约要花15到20个小时进行调试,这对我来说是宝贵的时间,本来可以更好地花费在编写新代码或更早完成项目上。特别是对我要在5周内上大学一年级的新生也无济于事。 事实是,我花所有的时间进行调试感到很难过。花在调试上的所有时间使我意识到在开发项目时我犯了一些非常愚蠢的错误,这些错误花费了我非常长的时间来修复。 如何防止这种情况将来发生?我不想花费50%的时间进行调试,而宁愿花费10%的调试时间,其余时间编写新代码。我可以尝试哪些技巧来帮助我实现这一目标?

10
激励同事采用更好的编码实践?
在“ 处理我过时的同事”问题中,许多人讨论了与不愿将工作流与团队的工作流程整合在一起的同事打交道的策略。 我想,如果可能的话,学习一些策略来“教”一位不了解现代技术和工具的同事,并且可能有些冷漠。 我已经开始与一位程序员合作,直到最近,他一直在公司的不同部门进行相对隔离的工作。他具有丰富的领域知识,最重要的是,他展示出了很好的解决问题的能力,而这是许多候选人似乎所缺乏的。 但是,我看到的实际(C#)代码是对VB6天的回顾。程序结构,匈牙利符号,全局变量(的滥用static),没有接口,没有测试,不使用泛型,抛出System.Exception...您就会明白。 这个程序员比我年龄大一点,至少从第一印象来看,他并没有积极寻求积极的改变。我不会说要抗拒变革,因为我认为这很大程度上是有关如何提出主题的问题,我想做好准备。 程序员往往是固执的人,大肆宣传,建立撕碎的代码审查和严格执行的政策很可能不会产生我想要的最终结果。如果这是一个新员工,一个初级程序员,那么我不会三思而后行地采取“导师”的立场,但是我非常谨慎地将有经验的员工视为无知的新手(他不是-他只是没有与该领域的某些进步保持同步)。 我如何通过柔和的说服力和非实质性的激励措施以Dale Carnegie的方式提高开发人员的代码质量标准?在不造成对抗性情况的情况下,进行细微,渐进式变化的最佳策略是什么? 之前是否有其他人(尤其是首席开发人员)遇到过这种情况?哪些策略成功地激发了兴趣并创造了积极的群体动力?哪些策略没有成功,会更好地避免? 说明: 我真的觉得有些人是根据个人的感觉来回答的,而没有真正阅读问题的所有细节。请注意以下内容,这些内容本应暗示,但我现在要明确指出: 由于年龄的原因,这个同事只是我的“高级”。我从未说过他的头衔,势力范围或在该组织的任职年限超过我,而实际上,这些都不是真的。他是一名LOB程序员,已经被主要开发部门所吸引。而已。 我不是新员工,也​​不是初级程序员,也不是其他幼稚的白痴,他们都计划在一夜之间将公司转型。我基本上负责软件过程,但是正如许多作为“潜在客户”工作过的人所知道的那样,职责并不总是与组织结构图完全相关。 我不是在问别人如何走我的路,来死还是要高水。如果我愿意,我可以这样做,最终结果是这个人会变得不满和/或辞职。请尝试了解我正在寻找一种社交,合作的方式来推动变革。 提到“ ...全局变量...没有测试...抛出System.Exception”是为了证明问题不仅是表面的或美学的。可能适用于相对较小的CRUD应用程序的做法不一定适用于大型企业应用程序,实际上,到目前为止,没有代码实际通过了集成测试。 请尝试从表面上看待这个问题,接受我实际上知道我在说什么,然后回答我实际提出的问题或继续前进。 PS对那些提供建设性建议而不是与前提争论的人,我表示由衷的感谢。我希望将其保留一段时间,因为我希望能从现实生活中听到更多。

8
为什么通常认为使用字符串键是一个坏主意?
这一直困扰着我一段时间。大多数时候,在将数据存储在诸如哈希表之类的结构中时,程序员,书籍和文章都坚持认为用String值对所述结构中的元素进行索引是不正确的做法。然而,到目前为止,我还没有找到一个单一的资料来源来解释为什么这被认为是不好的作法。是否取决于编程语言?在底层框架上?在执行上? 举两个简单的例子,如果有帮助的话: 类似于SQL的表,其中的行由String主键索引。 .NET字典,其中的键是字符串。

8
谎言2:代码应该围绕世界模型进行设计吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 我最近读了《三大谎言》博客,我很难证明第二种谎言的正确性,在此引用: (LIE#2)应该围绕世界模型设计代码 代码是虚拟世界的某种模型或地图,没有任何价值。我不知道为什么这个程序对某些程序员如此引人注目,但是它非常受欢迎。如果游戏中有火箭,请放心,有一个“火箭”类(假设代码是C ++),其中包含仅一枚火箭的数据并具有火箭的功能。完全不考虑实际上是在进行什么数据转换,也不考虑数据的布局。或就此而言,如果没有基本的了解,那就是哪里有一件东西,可能不止一件。 尽管这种设计会带来很多性能损失,但最重要的是它无法扩展。完全没有 一百枚火箭的成本是一枚火箭的一百倍。而且极有可能它的成本甚至更高!即使对于非程序员,这也没有任何意义。规模经济。如果您有更多东西,它应该会更便宜,而不是更贵。做到这一点的方法是正确设计数据并通过类似的转换对事物进行分组。 特别是这是我的问题。 作为虚拟世界的模型/地图,代码具有价值,因为对虚拟世界进行建模有助于(至少个人而言)可视化和组织代码。 对我来说,开设“火箭”课是一个完全有效的选择。也许“火箭”可以分为多种类型的火箭,例如AGM-114地狱火等,其中包含有效载荷强度,最大速度,最大转弯半径,瞄准类型等,但仍然每个发射的火箭都需要有一个位置和速度。 当然拥有100枚火箭弹的成本要高于1枚火箭弹的成本。如果屏幕上有100个火箭,则必须进行100次不同的计算才能更新其位置。第二段听起来好像是在宣称如果有100枚火箭,更新状态的花费应该少于100次计算? 我的问题是作者提出了一个“有缺陷的”编程模型,但没有提出“纠正”的方法。也许我在模仿Rocket类,但我真的很想了解这个谎言的原因。有什么选择?

4
比文档更喜欢示例。这是行为问题吗?
每当我遇到新的API或编程语言,甚至是简单的Linux 手册页时,我总是(从我记得以来)就避免使用它们,而是懒惰地依靠示例来理解新概念。 在潜意识中,无论文档/ API不是简单明了,晦涩难懂还是无聊,我都会避免使用它。自从我开始编程已经有好几年了,现在我觉得我需要修正自己的方式,因为我现在意识到我要避免阅读晦涩难懂的文档,从而造成更大的损失,因为它仍然比官方示例高一百万倍文档的覆盖面比那里的任何示例都多。即使意识到这一点,示例也应被视为“附加”价值,而不是“主要”学习资源。 我该如何改掉作为程序员的这种坏习惯?


1
seq在Haskell生产代码中多久使用一次?
我在使用Haskell编写小型工具方面有一些经验,我发现使用起来非常直观,尤其是对于编写过滤器(使用interact)来处理其标准输入并将其通过管道传输到标准输出。 最近,我尝试在比通常大10倍的文件上使用这样的过滤器,但出现Stack space overflow错误。 在阅读了一些内容之后(例如,在这里和这里),我确定了两个节省堆栈空间的准则(有经验的Haskellers,如果我写的东西不正确,请纠正我): 避免使用非尾递归的递归函数调用(这对所有支持尾调用优化的功能语言均有效)。 引入seq强制对子表达式进行早期评估,以使表达式在被缩减之前不会变得太大(这是Haskell所特有的,或者至少是使用惰性评估的语言所特有的)。 seq在我的代码中引入了五到六个调用之后,我的工具再次运行平稳(也适用于较大的数据)。但是,我发现原始代码更具可读性。 由于我不是一位经验丰富的Haskell程序员,所以我想问一下seq以这种方式进行介绍是否是一种常见的做法,以及通常seq在Haskell生产代码中看到该代码的频率。还是有什么技术可以避免使用seq太频繁而仍然只使用很少的堆栈空间?

5
代码示例和面试?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 自从我来到这里以来,我已经看到了许多问题,答案是有人断言他们永远不会使用面试过程之外编码的作品集或代码样本来判断候选人,因为这样做很可能代码已由其他人编写。我为此感到惊讶。 我的观察方式是,如果我要求某人进场并在现场解决一个简单的问题,那么我将学到的东西很少。我不在像Google这样的公司寻求工作,我可以要求某人有一天的时间。但是大量的业余爱好代码可以告诉我很多东西。 是的,存在窃的可能性,但是必须对他们进行很好的训练,才能进行长达一个小时的有关该代码的讨论。并且,在这种情况下,他们必须是非常快速的学习者,以度过三个月的试用期(在此期间,我可以无缘无故地将其摆脱,而无需另行通知)。如果他们很快成为公平的优秀程序员,我就会受骗了,但我仍然有一个好的程序员。 最后,对我们公司的成本和对candidate窃候选人的好处是很小的。 这使我开始考虑其他行业。艺术家,摄影师,设计师都在使用作品集,没有人担心那里的窃。作者将根据他自己所写的章节获得一本书的资助。在面试时,您不会要求建筑师介入并为房屋绘制设计规格。 那么,什么使我们与众不同?为什么将某人放在计算机前并让他们对数据合并或阶乘计算器进行编码如此重要,而有时却无法使用我们日常使用的工具(例如Internet),为什么如此重要?代码组合的想法有什么问题? 我真的很想知道,以防万一我可能犯了一个巨大的错误,而这还没有把我烧死。

11
重构或专注于完成应用
您会随身重构应用程序还是专注于首先完成应用程序?重构意味着应用程序的进度会变慢。 完成应用程序将意味着您以后可能很难维护应用程序吗? 该应用程序是一个个人项目。我真的不知道如何回答“什么驱动功能和设计”,但是我想这是为了解决现有软件的低效率问题。我也喜欢最小的易用软件。因此,我要删除一些功能,并添加一些我认为会有所帮助的功能。

17
为什么正则表达式如此令人着迷?
已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 图表1,图表2,我想您会很难回想起其他示例。 问题是:如果有多种方法可以解决问题,PHP程序员(我通常在StackOverflow上浏览PHP标记)将寻求有关正则表达式的解决方案的帮助。 即使经济性较差,当不需要花哨的替换规则时,即使 php手册建议(link)str_replace代替任何preg_*或ereg_*函数使用,也是如此。 有人知道为什么会这样吗? 别误会我的意思,我最好的朋友中有一些是正则表达式,我也不鄙视Perl。我没有得到的是为什么即使在过度杀伤很明显(正则表达式切换字符串)或代码复杂性呈指数增长(正则表达式用于从PHP中的 html获取数据)的情况下,也没有寻找替代方法的原因

3
我应该避免在C#中使用unsigned int吗?
我最近想到了在C#中使用无符号整数(并且我猜可以对其他“高级语言”说类似的论点) 当需要整数时,我通常不会遇到整数大小的难题,例如Person类的age属性(但问题不限于属性)。考虑到这一点,据我所知,使用无符号整数(“ uint”)优于有符号整数(“ int”)的唯一优势-可读性。如果我想表达年龄只能为正数的想法,可以通过将年龄类型设置为uint来实现。 另一方面,对无符号整数的计算可能会导致各种错误,并且使其难以执行诸如减去两个年龄的运算。(我读到这是Java省略无符号整数的原因之一) 在C#的情况下,我还可以认为setter上的保护子句可以提供两个世界中最好的解决方案,但是,例如当我将年龄传递给某种方法时,这将不适用。一种解决方法是定义一个名为Age的类,并将属性age作为唯一的对象,但是这种模式将让Me创建许多类,并且会造成混乱(其他开发人员将不知道什么时候对象只是包装器)以及更复杂的内容)。 关于此问题的一些最佳常规做法是什么?我应该如何处理这种情况?

1
“ exit(-1)”来自哪里?
我看到在建议使用在互联网上有很多传统的软件和坏的教程exit(-1),return -1或类似的表示“异常终止”。问题是,至少在POSIX中,该问题-1从未存在过,并且不是有效的状态码。man 3 exit说明了exit()将的值返回status &amp; 0377给父对象,即-1变为255。在非POSIX系统上,EXIT_FAILURE建议可移植。但是我从没看到“ -1表示异常终止”和“ EXIT_FAILURE可能不是1”,这表明他们清楚地相信“ -1”即使在非POSIX系统上也是常规的。 这是一个StackOverflow问题的例子,这个问题可以永久存在。软件“ unrealircd”也是exit(-1)用于终止程序的程序示例。实际上,这使与的交互变得困难systemd。 这种反模式是从哪里来的?在某些情况下有效吗?

7
结对编程可能有哪些缺点?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 3年前关闭。 结对编程在当今非常有名。 它具有以下优点: 错误较少的程序。 后期制作维护成本要少得多。 既定的做法受到挑战,导致出现新的想法。 程序员可以互相学习。 程序员发展软技能。 但是结对编程的缺点是什么?

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.