我不是一个优秀的程序员(逻辑上),应该如何解决?[关闭]


50

好的,这是我的问题:

我在一家大公司工作,有些是如何找到工作的(坦率地说,因为面试很容易)。不是我不了解我的东西,我很擅长理解java,它是库等。

但是,每当我尝试解决一些逻辑问题时,我都会发现很难提出解决方案。

例如,conversion of decimal to roman当我看到解决方案时,我发现这是一个简单的问题。但是经过1-2小时的试用后,我无法实现它!

我觉得我很笨,不值得当软件工程师。解决难题的能力应该是优秀的程序员的本性。但是,当我尝试解决一些难题时,我无法找到解决方案,而只是将其用谷歌搜索!....我讨厌那个!

在工作中遇到问题时(例如实施xyz工具功能),我相当快,对此我很尊重,但是对此我并不感到骄傲。因为当我尝试解决任何数学或逻辑方面的挑战性问题时,我感到很困惑。我仍然觉得我爱我做的(作为一名工程师)正在做的事情,但是对于我无法解决我朋友提出的一些棘手的逻辑问题,我感到非常难过。

我感到沮丧:(

TL; DR:我从实用的角度理解东西(在产品中实现功能),但是当尝试解决ProjectEuler上的问题时,我感到非常遗憾!而且我需要动脑筋

因此,我的问题是:

  1. 我应该如何解决?我应该从解决(强迫自己)项目欧拉问题开始吗?即使我需要几个小时才能解决一些基本问题
  2. 还是我应该回到基础知识并学习一些基础数学?
  3. 我真的没有找到解决难题的乐趣。但是我想让自己开心!而且我认为,如果我能更好地理解它们,我会喜欢的!

PS:我从没受过CS的教育(我的本科生是电气的)。但是,这并不是成为一个笨拙的开发人员的借口。

谢谢!


3
如果为您解决难题不是一件有趣的事,那为什么还要麻烦!
V4仇杀队

3
它不好玩,因为我很难解决它。如果我擅长的话,我相信我会喜欢的!
约翰

1
你总是可以试试这个(警告,严重上瘾,如果你为解谜)
Benjol

2
没有什么是本机的。即使是最基本的技能也需要学习。我建议微积分和古典力学作为训练所需能力的游乐场,但是许多其他主题(包括完全非数学的主题)也可以做到这一点。
SK-logic

3
@John确认。这是一个困难的问题。如果您不能在5分钟内解决问题,就不会感到难过。在阅读了有关罗马数字的Wiki之后,花了一个半小时的时间,仅通过将它的结果与另一个实现的结果进行比较,我才能够纠正错误。我(和其他许多人一样)认为IL是有效数字。错误。XXXIX是正确的号码。另外,我还必须观察其他实现以对其进行优化(我已经预先缓存了II,III,XX,XXX等,但是它没有用)。不要难过!
xanatos 2011年

Answers:


24

首先,很高兴您将其视为技能的弱点。您实际上知道您需要改进的地方,这可以使您轻松得多,并且表明您比您想象的要好。

我相信您以前没有见过的主要问题是您没有“问题解决工具集”。遇到问题时,您该怎么办?您如何解决它?我的数学很,但是因为我知道如何一起使用数学的小工具,所以我提高了微积分的速度。

因此,除了着力解决问题外,您还需要查看自己在餐桌上掌握了哪些工具和技能。如果您打算使用一项正在工作的新功能,您是否只是坐下来没有IDE,调试器,文档,互联网和源代码?当然不是!

有工具来解决问题,你只是不知道他们.... 维基百科文章有一些指向问题解决技术的链接。但是最重​​要的工具是科学方法维基百科文章包含一种务实的方法:

  1. 定义问题
  2. 收集信息和资源(观察)
  3. 形成解释性假设
  4. 通过执行实验并以可重复的方式收集数据来检验假设
  5. 分析数据
  6. 解释数据并得出结论,将其作为新假设的起点
  7. 发布结果
  8. 重新测试(通常由其他科学家完成)

所有问题都可以用这种方式解决!但是,许多人没有执行这些步骤。就像一个拒绝测试其代码的开发人员。完全没有 他将很难找出甚至存在的错误。

最后,解决问题的另一个主要工具是通过简单的步骤将其分解。例如,项目Euler的示例中的第一个问题:

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

我们有两个事实,这里有一个问题。事实一向我们展示了如何在10以下定义三个或五个的倍数。3 * 1,3 * 2,3 * 3,5 * 1都是有效的。5 * 2不是因为它等于10。那么,事实二告诉我们我们将它们加在一起得到23。

因此,我们已经有了一种查找值的方法,可以将它们相加以获得总和。当然,我们可以查看事实,然后对顺序进行简单的逆转。3、5、6和9是3或5的倍数。即3%3、5%,5%,6%,3%和9%3的mod均为零。因此,另一种方法是将999乘以1,并将每个数字模数分别为3和5。

我建议将Unix编程的艺术作为在编程世界中使用小型工具的一个很好的例子。将它们链接在一起可以解决非常复杂的问题,而我无法计数这些概念为我提供帮助的次数。


19

许多程序员也是天生的“难题解决者”,但是编程要比这更多。如果所有程序员都专注于解决有趣的算法问题,那么我们将拥有大量可以解决很酷问题的软件,但是它们都不可用或不可维护。

我发现我的工作中很少有“难题解决”类型的挑战。大多数挑战更多地是关于学习旧代码,学习新的API,设计某些组件的体系结构,以使人们在三年的时间里不会对此发誓。所有这些都是具有挑战性的,但不是那么多的逻辑难题。另一方面,我的同事们大部分时间都在考虑编译器优化算法,并且非常擅长于此。

我认为对于程序员而言,不断思考“如何才能做得更好”是很重要的,但是成为一名优秀的程序员并不一定要求您擅长解决难题。

就我个人而言,我通过解决“神秘地缓存”来解决难题。


但是很多热门的初创公司强调解决难题的技巧。以facebook。如果我不擅长解谜,那么我什至没有资格在这里申请!
约翰

6
Facebook拥有拼图机器人作为第一道检查工具,目的是避免筛选成千上万的简历。如果您真的想为FB工作,那么您需要能够解决这类问题,但是还有很多其他好的工作场所。
JesperE 2011年

很棒的答案。也让我感到轻松... =]
哈特利·布罗迪

9

让我警告您,您知道的越多,对自己的了解却越少。

只是不要因此而灰心。继续学习并尝试在您意识到不足的领域工作。

现在开始您的问题。我的建议是着手解决eule r 项目中的问题。

我这样做的原因很简单,从最流行的问题开始,这些通常是较容易解决的问题。

当您遇到问题时,请尝试解决它,自行解决,然后尝试其他方法。项目Euler的工作方式使您可以检查和测试答案。

如果您确定无法解决此问题,请开始研究问题(不寻找答案)。不再尝试。

解决问题后,欧拉专案就会在一节中向您展示每种语言实现的最佳答案。用您喜欢的语言浏览他们的答案,了解他们的解决方案以及其中的想法。

现在,关闭他们提供的答案,然后自行尝试,直到再次解决。

如果您练习得足够多,那么解决这些问题的逻辑和思路将变得越来越容易。


4

大多数编程工作不需要很多逻辑。但是这些可能不是您喜欢的工作。

作为一般准则,请尝试学习算法和结构。我可以建议Skiena的《算法设计》手册。了解这些内容后,您将开始对问题进行分类。这看起来很像旅行商问题,在这里我可以使用树,在这里我可以使用二进制搜索...

欧拉计划的拼图种类繁多。只需具备基本的数学知识,即可轻松完成其中的许多操作。一旦您知道其中一些算法,其他问题就更容易解决。


2

我非常相信您刚刚开始编程,所以第一件事是,如果需要一些时间甚至掌握并正确处理它,这似乎不是问题。唯一的不同是每次尝试都使您学习类似WoW的东西!!我做的最后一件事根本没有意义,因为我需要十进制而不是双精度

如果解决难题对您不感兴趣,那么您就不必为此而努力,一旦您知道自己的代码库,就会有其他逻辑问题浮出水面,您可以选择对它们进行处理,并向导师或领导介绍任何建议的编辑内容。(不要担心,如果您犯了一些错误,它们会帮助您知道为什么您的方法有问题,因此,作为敏锐的观察者和适当的倾听者)

您需要一些时间才能安定下来,然后可能会继续在所有气缸上射击。不用说,避免在Google或SO上搜索解决方案的冲动,从您的终端进行一些努力,仅在您有疑问或完全无知时才启动浏览器


1

首先,知道自己的弱点是真正的优势,因此,您知道该学习什么才能获得更好的比赛。

我的建议是,阅读许多解决逻辑问题的代码。每个人在解决难题时都有自己的风格,阅读代码可能会向您提示如何学习的方式。此外,能够理解代码还可能使您指向描述问题的数学理论,因此一路上您还将了解潜在的问题。

干杯,卡罗


1

我觉得我应该补充一点。

正如选择的答案已经说明的那样,知道自己的弱点是一个巨大的优势,并且有一些用于学习解决问题技巧的基本工具。但是,我认为答案中缺少的只是仅仅是找到解决难题的方法。对于完全解决您尝试的每个问题都要固执。与阅读有关解决问题的书籍一样,阅读代码(很多代码)也很好,但是编写代码几乎更重要。

在某些方面,我们也有相同的弱点(尽管它没有您想象的那么糟糕)。为了练习我的问题解决能力,我一直在研究一些项目Euler或HackerRank问题。如果这是一个简单的问题,我选择7种编程语言并尝试在所有语言中加以解决。对于更棘手的问题,我可能会选择3种彼此不同的语言,只是为了使我花在解决问题上的时间合理。对于所有问题,一旦提出解决方案,我就会搜索其他人提出的解决方案,并确保我理解它们。如果您不了解某些解决方案,则可以始终将其发布到StackOverflow或什至在此处发布到Programmers Stack Exchange或其他任何东西,并且我确定该站点上有人可以回答您的问题(很少有没有人回答)。

但是,基本上,请确保您正在练习,而不仅仅是阅读,并且要练习很多。就像运动一样,思维清晰需要时间和精力。

您可以做的另一件有助于您思考问题的方式是为您首先解决的问题编写测试套件。您必须先完全理解问题,才能为问题编写好的测试。如果针对不同的语言执行此操作,则具有可以同时教您不同的测试技术的优势。

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.