通用编程技术可加快编码时间


20

我正在准备一场编程比赛,我们必须使用C ++进行编程,而这一切都是关于在短时间内生成有效的代码。一个例子是使用宏获取最少两个整数或使用内存集初始化数组(但是有人告诉我,您既不应该在这里使用它)。

这就引出了一个问题,在实际工作中要使用哪种编码技术?


26
我想您在编码竞赛中使用的技术可能与您在实际工作中使用的技术无关。
Doug T.

1
我并不是在真正的工作中寻求技术,而是在编码竞赛中寻求技术。
marktani 2012年

1
@DougT。我同意,编码竞赛的技巧不是主题,但我也认为您可以扩展讨论工作环境中的生产率,以及如何最好地减少花在猴子代码上的时间
James

1
为什么不应该使用内存集来初始化动态数组?
2012年

3
不要使用c ++。尽可能使用最高级的语言。
凯文

Answers:


52

快速生成工作代码的方法是...放慢速度。采取非常小的步骤。确保您知道每个步骤的用途。确保在每个步骤之后,代码都可以编译并运行。

最重要的是,使用测试驱动开发。编写失败的测试。编写足够的代码以使测试通过。进行重构以使代码整洁,确保其仍通过所有测试。重复。

如果您不这样做,那么编写一大堆代码是很容易的,这是行不通的。然后,您将需要长时间才能弄清楚为什么它不起作用。


21
你是认真的吗?TDD参加编程比赛?
Codism 2012年

1
@Codism:问题已扩展为包括适用于常规软件开发的技术。
迪马2012年

2
TDD无疑有助于使我的代码变得更好,但它从未帮助我更快地编写代码。在我的经验中,交互式编程环境(例如Groovy控制台,Lisp REPL等)节省了最大的时间。
erturne 2012年

3
TDD为-1。如果该项目是长期的,而不是短期的黑客马拉松,那是有道理的。
TheLQ 2012年

1
@TheLQ仅仅因为您愿意花费所有时间使用调试器并不意味着TDD不是一个好的建议。
byxor

29

仔细检查标准库,尤其是STL算法。这将节省许多代码行和大量时间。赢得编程比赛的关键是在尽可能高的水平上进行编程。在没有外部库的C ++中,这意味着STL调用而不是for循环。


+1-我完全同意。在这些竞争中,知道如何在STL中快速编写代码非常重要。
Jordan Parmer 2012年

23

我定期参加ACM竞赛,希望其中一些技巧对您有帮助:

  • 正如其他人所说,要熟悉该语言,在C ++特别是STL中,它既具有您要使用的常用功能(binary_search,min,max),又具有健壮的数据结构以节省您的时间(堆栈,以避免直接递归) ,请为BFS排队,如果您喜欢的话,甚至可以为Dijkstra排队为priority_queue)。

  • 确定问题的类别,例如数学,动态编程,图论等。问问自己:您对这种类型的问题有多熟悉?完成此操作后,您应该决定要解决的顺序,这与下一点密切相关...

  • 您想在打字之前完全理解问题,解决正确的问题,在我的第一场比赛中,我认为如果我不打字,那是在浪费时间。后来我发现这是一个错误。

  • 不要以为注释是浪费时间,至少在“聪明的”代码中,您不想去逐行调试以查看出了什么问题(这是真正的时间浪费),价值清晰

  • 乐趣


6
+1,以便在键入之前完全了解问题。否则,您会浪费团队的时间(ACM竞赛是3个人一台计算机)
Codism 2012年

好答案。:)
Jared Farrish 2012年

13

好吧,对我来说听起来像您只了解C而根本不了解C ++。具有基本语言工作知识的人员可以轻松回答这些问题。

一个示例是使用宏获取至少两个整数

只是使用一个功能?std::min已经存在。

或使用内存集初始化数组

std::array<T, N> 已经初始化了它的内容。

实际工作中使用哪种编码技术?

第一步是了解您使用的语言。


我试图了解我使用的语言,这就是为什么我问这个问题!感谢您对此的投入。
marktani 2012年

7
哦。那我一定误会了你的问题。我会推荐一本书。我们只介绍那些值得阅读的书,而不是那些讲授C语言垃圾的书。
DeadMG 2012年

10

除了了解语言之外,还要了解您的工具,尤其是您的编辑器。我从事编码已经有15年以上的专业经验,而且我看到其他优秀的程序员也会放慢脚步,因为他们使用的唯一编辑器命令是光标键和crtl-x / c / v。

您的编辑器是否支持单个按键删除行?要重新缩进一行?在功能/方法之间移动?阻止选择/粘贴?书签?按字移动?编辑器可以自动生成类/方法/函数吗?它是否支持您可以提前创建的模板?快速重构?宏录制?

了解您的编辑器可以大大缩短开发时间。


1
阿们 我只是和一个新手一起工作,这个新手非常快...并且使用vim。它对他有用,因为他花时间学习如何使用它。
gbjbaanb 2012年

另外...如果您的编辑器几乎不支持此处列出的所有功能,请找一个更好的编辑器。
Abhi Beckert 2012年

在google文档中进行面试...为此,最糟糕的经历。
UmNyobe 2012年

6

三思而后行。最好在编写类实现之前进行思考和计划,而不要在三个失败的实现之后进行思考和计划。另外,行动时思考-分步做事大大简化了开发过程。

仅编写您当前需要的代码。也就是说,不要一开始就怀着这样的心态写代码:“ 稍后我将需要这些功能,因此我可能会在编写它们的同时也编写它们的原型 ”。事情改变了,计划改变了。您最终将获得甚至无法使用的代码。浪费时间。

知道你在做什么。没有什么比尝试记住语言和/或库的基本功能和特性更糟糕的了。熟悉您使用的工具。


+1代表YAGNI
恢复莫妮卡

4

已经有很多答案,但我仍然想补充一下我的看法。

为了加快编码速度,请以一定的速度成为触摸打字员,以使您在打字时能够专注于逻辑和代码。有很多学习打字的软件(例如,打字大师,快速打字,KTouch,gTypist),可以使用它们

我见过许多经验丰富的程序员,他们仍然是两指打字员。这导致没有文档的讨厌代码,以及带有宏和缩写类型名称的真正的隐秘代码。


用食指
投票

好答案。我还要补充一点,那些看着键盘而不是屏幕的人们经常在意识到之前必须输入垃圾,并且不得不回溯。否则他们将在错误的窗口中键入。可悲的是,他们没有意识到这会减慢他们的速度。
戴夫·马克勒2012年

2

软件开发是80-20项经典活动之一,即前80%的工作需要20%的时间,而后20%的工作则需要80%的时间。

因此,总体上加快工作速度的关键是在最后20%的工作中努力提高绩效。通常,这是调试阶段以及将所有内容捆绑在一起并使其可用的工作。

您可以通过在早期阶段多加注意来改善这一点。当您想进入硬核编程时,在项目一开始就进行规划和设计工作似乎是在浪费时间,但是以后可以节省大量时间。

人们将谈论诸如TDD或BDD之类的特定方法。这些很棒,但是如果您现在不这样做,它们会花费您一些时间来适应,因此,它们可能不是您想参加编程竞赛的起点。但是,无论您做什么,在潜水之前停止计划自己的工作都会收获很多。无论如何,它们是迈向TDD和BDD的第一步。这是您要开始的地方。


-2

如果是为了进行实际的编程比赛,请不要使用C ++。使用快速的交互式RAD脚本语言。这是VB6绝对主导的东西。预备您预编写的库。字符串拆分,数组反转,搜索,排序,原始图形,控制台控件。

如果是为了工作,请执行相反的操作。了解其中的内容,使用扎实的语言(C ++很好),注释所有内容,等等。两种类型的环境离得更远。


3
我不是拒绝投票的人之一,但我认为他们可能是-1,因为问题是关于用C ++进行更快的编程
戈登·古斯塔夫森

9
VB6?认真吗 你是过去吗
Konamiman 2012年

2
@Konamiman:嘿,是的。我不知道他是说“我正在用C ++为编程竞赛做准备”还是“我正在为C ++编程竞赛做准备”。哦,好吧,筹码就在哪里。尽管如此,在编程竞赛中,没有什么比非常快速的RAD环境更胜一筹的了。
Bryan Boettcher 2012年

我编辑了该问题以进行澄清。
marktani 2012年

在RAD上:Delphi 6可能是最好的选择。
mlvljr 2012年
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.