每个程序员应该对编程了解什么?


52

留在技术问题上,避免行为,文化,职业或政治问题。



这种问题真的让我很烦。它只能从以黑白方式看待世界的人的心中产生。并非每个程序员都有相同的工作,如果这是您要寻找的最小公分母,则下面的答案表明您最终只会遇到一些讨厌的人。
明智船长

Answers:


92
  1. 该错误位于您的代码中,而不是编译器或运行时库中。

  2. 如果看到不可能发生的错误,请检查是否已正确构建并部署了程序。(特别是如果您使用的是复杂的IDE或构建框架试图向您隐藏杂乱的细节……或者您的构建涉及很多手动步骤。)

  3. 并发/多线程程序很难编写,也很难正确测试。最好将尽可能多的委派给并发库和框架。

  4. 编写文档是您作为程序员的一部分工作。不要把它留给“别人”做。

编辑

是的,我的第一点被夸大了。即使是设计最好的应用程序平台,也确实存在许多错误,并且一些设计欠佳的应用程序也泛滥成灾。但是即使这样,您也应该始终首先怀疑您的代码,并且只有在您有明确的证据证明您的代码没有错误时才开始指责编译器/库错误。

早在我进行C / C ++开发的时候,我还记得一些情况下,所谓的优化程序“错误”是由于我/其他一些程序员完成了语言规范所说的未定义结果而导致的。这甚至适用于Java之类的安全语言。例如,仔细研究一下Java内存模型(JLS第17章)。


17
我更喜欢说“错误可能在您的代码中”,因为我在运行时库中遇到过几次错误。我还没有遇到编译器错误。还是+1。
Chinmay Kanchi 2010年

29
如果您从未在编译器中发现过真正的错误,那么您对代码的冒险程度还不够。;)
梅森惠勒2010年

8
@ Chinmay,@ spudd86,@ Mason-是的...而且我在30多年的编程中也发现了自己的编译器和库错误。但是根据我的经验,有99%以上的错误(至少部分是)是我的代码错误。我的回答故意夸大了这一点,以至于使您始终应该首先怀疑您的代码。
斯蒂芬·C

5
我没有人们对多线程编程的非理性恐惧。我怀疑支持这种观点的人不会编写太多的多线程代码。并不难。+1一切。
史蒂文·埃弗斯

4
如果您使用的是编译器,则该错误可能同时存在于您的代码和编译器中;)
Legooolas 2010年

84
  • 如何阅读别人的代码。
  • 如果在版本控制系统中未检查代码,则该代码不存在。

8
如果可以的话,请加上+10000。历史记录和更改日志记录绝对是必不可少的,这也是您应从一开始就将所有内容都放入版本控制中的原因。
Legooolas

2
...并且该存储库已同步到至少另一个位置。对于DVCS很重要,但对于集中式VCS也很重要。

因此,除非存在授权开发人员编写的工作项,否则代码不存在。
Jesse C. Slicer 2010年

2
我将加一本,以学习如何阅读他人的代码。我们大多数人都很难实现,但这是成功编程的重要组成部分。
bogeymin 2010年

再加上一个学习如何阅读他人代码的方法。
itsaboutcode 2011年

76

浮点计算是准确的。



如果有人不知道我在说什么,请阅读@Adam的链接。这是浮点计算的陷阱的绝佳摘要。
Chinmay Kanchi 2010年

1
如果他们不知道,他们可能会成为每天询问stackoverflow的人之一。
Brian R. Bondy 2010年

1
@布莱恩:是的。我希望有一种方法可以识别由浮点算法解释的问题。您可以创建一个Stack App,每天显示一个不同的浮点问题!
亚当·佩恩特


44

您可以提高代码质量和可维护性的第一件事就是减少重复。


4
干,是的!我怎么会忘记?;-)
Maniero

这是如此重要,我再次回答

我宁愿说:减少条件。每个while / if / for都是潜在的错误。
zvrba

1
您知道,关于DRY的有趣之处在于它在各处重复出现。:) +1
Billy ONeal

39

故障排除和调试技巧

在我参加的任何编程课程中,他们几乎都不会花任何时间在这个主题上,而根据我的经验,这是决定程序员生产力水平的最大决定因素之一。不管您喜不喜欢,与新开发阶段相比,您在应用程序的维护阶段花费的时间更多。

我与许多程序员合作,他们通过随机更改事物进行调试,而没有发现问题的任何策略。我已经进行过数十次对话。

其他程序员:我认为我们应该尝试看看它是否可以解决问题。
我:好的,假设可以解决问题。这能告诉您问题的根源在哪里?
其他程序员:我不知道,但是我们必须尝试一些


2
我正要发布这个。程序员的大部分工作是修复错误,而且很多人往往无能为力(尤其是在其他人的代码中)。
Dov

+1我从javascript / php转到C#,并爱上了逐步执行代码的过程。我希望动态类型的语言可以在此方面做得更好。
Evan Plaice 2010年

另一个奇怪的行为是程序员坚持认为程序的每个部分都是正确的,而如果出错则结果是错误的。“-您不需要在控制台上打印数组来检查它是否已排序,因为上面的行是array.sort()。” “-好吧...您知道,它不起作用。某处一定有问题。您现在不能仅仅保护您的代码!”
gawi 2010年

2
我认为调试的目的是验证程序中的假设。有时,您需要钓鱼以寻求一些线索。这必须系统地完成。尝试一些可能会告诉您新事物的方法是完全有效的。我经常这样做。
gawi 2010年


34

基础。当前,程序员学习的技术不是概念。这是不对的。


是的,没有。听起来就像我在大学里遇到过的每一个教授一样……所有这些人一生都从没做过软件。没有技能的知识在我们的职业中是无用的。
史蒂文·埃弗斯

4
+1,是这样。是的,这是象牙塔类型要说的东西,但这对于我们其他人在战es中并没有什么错。
MAK 2010年

2
喜欢拼写吗?例如,Its wrong应该it's wrong为。
Konerak 2010年

2
不,像这样的基础知识并不关心打字错误,但是关心编程问题。
clrod

5
学习做某事的步骤很容易,通常很难找出何时应该使用它,更重要的是何时可以使用但不应该使用它。教科书特别擅长于显示如何而不是为什么(而不是为什么)。
HLGEM

27

每个程序员都应该知道他一直在代码中进行假设,例如“这个数字将是肯定的和有限的”,“此代码将能够在眨眼之间一直连接到服务器”。

而且他应该知道他应该为这些假设破裂做准备。


6
尤其要指出那些assert()随处可见的人。 assert()将帮助您记录您的假设并在出现错误时挽救您。
达斯汀

@Dustin +1您不可能只记住所有假设-以编程方式记录它们,而当它们被证明是错误的假设时,您会被准确告知。
Skilldrick 2010年

1
...除非使用NDEBUG进行编译。


17

学习概念。您可以使用Google语法。


从理论上讲很好,但是Google很难找到特定的语法:给定成千上万个结果,搜索诸如“对象引用”或“ this”之类的术语,并搜索诸如“ $?”之类的成语。完全没有结果。
l0b0 2011年


14

单元测试。这是整理关于如何使用代码的假设的好方法。



13

那比你想的要难。

虽然将正常使用时可以正常工作的东西放在一起很容易,但要应对错误的输入,所有边缘和拐角情况,可能的故障模式等都是很耗时的,并且可能是工作中最困难的部分。

然后,您还必须使应用程序看起来也不错。


3
我认为这是一句老话:“ 90%的工作需要90%的时间。最后10%会花费其他90%的时间”
GSto

我认为很多人总是一贯低估复杂性。“ X能有多难?” -著名的遗言:/
罗马·斯塔科夫

@GSto我不想180%的时间工作,我认为100%很好!
adamk 2010年



11

指针,显然。:)


3
对于一小部分任务,仅在语言的子集中确实需要指针。对于大多数任务,您可以(并且应该能够)进行编程,就好像指针的概念不存在一样。
Chinmay Kanchi 2010年

14
@Chinay Kanchi号。每个人都应该理解指针。
替代

5
真的取决于您指的是什么。如果您指的是可以操纵的C风格指针(这就是我所假设的),那么我会争辩说Java / C#/ Python程序员不需要了解它们。如果您像Java的“引用”中那样指指针,即指针不能被摆弄,那么是的,为了防止滑倒,对它们的一些了解是必要的。
Chinmay Kanchi 2010年

@mathepic如果您要了解每年有多少不知道指针第一件事的CS学生毕业,那您将被震撼。如果我没有在每个夏天全力以赴地安排工作,我什至都不会听说过C指针或Java引用...
Mike B 2010年

5
@Chinmay:一个不了解指针概念的Python / Java / C#程序员丢失了。 L = [[]] * 2; L[0].append(42) 不同的语言使用不同的名称,但是间接在任何地方都是必不可少的。


11

数据比代码更重要。

如果您的数据很智能,则代码可能很笨。

愚蠢的代码很容易理解。智能数据也是如此。

我曾经遇到过的几乎每一种算法问题都是由于数据放置在错误的位置或滥用了其真实含义。如果您的数据具有含义,则将该含义放入类型系统中


2
直到您说出“类型系统”,您才一路拥有我。



8

真正的技能反映在良好执行简单设计的能力上,而不是完全完成复杂设计的能力。

该技能来自对基础知识的更好掌握,而不是对奥术的掌握。高素质的程序员的定义并不在于他们是否具备编写其他人无法做到的能力(使用高级功能,高级功能编程,随您所想),而是在于其完善平凡的编码的能力。选择类之间功能的适当分解;建立稳健性;使用防御性编程技术;并使用可带来更多自我证明的模式和名称,这些都是高水平编程的基础。

编写您或其他人可以在一个月或一年的一周内恢复工作并了解如何使用,修改,增强或扩展该代码的良好代码至关重要。它可以节省您的时间和精力。通过消除以前可能遇到的障碍(可能打断了思路,或者可能需要花费数小时或数天的时间来完成其他工作,等等),它可以提高生产率,从而更加轻松地专注于难题,有时会使棘手的问题消失。

一言以蔽之:优雅。每个类,每个方法,每个条件,每个块,每个变量名:追求优雅。


8

永远不要责怪用户,更干净的用户体验或更好的文档可以解决什么问题。通常,当问题是整体体验不佳或缺乏沟通时,程序员会自动认为用户是白痴,无能为力。程序是要使用的,而鄙视用户是一开始就错过了编程的要点。


6

每个程序员都应该知道如何使用调试器,并且知道如何很好地使用它。





4

如何准确估计功能需要花费多少时间。更重要的是,提交该估算值时如何传达您的信息不会被大肆宣传。


2
或了解如何很好地进行表扬,并传达您不是在表扬...;)
Billy Coover

4

编码风格很重要:

  • 一致的缩进问题,
  • 始终如一地使用空白(例如在操作员周围)很重要,
  • {}事项的一致放置,
  • 精心挑选的标识符很重要,
  • 等等

...和好的设计很重要。

理想情况下,程序员在第一次代码审阅之前(或期间)会学习这些东西。在最坏的情况下,当老板告诉他/她急忙对一些可怕的代码进行一些不重要的更改时,程序员会学习它们。

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.