你如何找到有趣的问题来解决?

时间:2009-03-02 21:34:56

标签: discovery

你如何找到有待解决的有趣问题?

我经常想学习新的编程语言。但是,我觉得真的理解它,我必须写一些东西:

  • 真实 - 它应该解决一些现实世界的问题。这个问题不一定是新的(事实上,有一个参考解决方案可能是一个好主意),但它必须是一些东西,迫使我找出一些肮脏,肮脏的细节。我不想解决数学难题或实现算法和数据结构,因为这只会教我如何解决'new-language中的数学(或A& DS)问题。

  • 我可以充满热情的东西 - 学习新编程语言的细节需要时间。这意味着我必须投入那段时间。为了帮助我保持动力,我想在某种程度上解决对我有吸引力的问题。我认为这部分是最困难的,至少对我而言,从我所有的半成品项目来看;它也是最重要的部分。无论一个问题是多么现实,如果你不采取行动,你就不会从中吸取教训。

  • 与充满激情的方面相关联,我想要一些我有信心只有在业余时间工作才能带到可运送状态的东西。即使“C编译器”是非常现实世界,我真的很喜欢编译器,但它有点大。即使是简单的表达式评估器,当您不熟悉特定语言的习语时,也可以多次重新设计,调试和优化。

那么,你(或者你)如何解决找到有趣工作的问题?

特别的解决方案 - 也就是工作中的问题 - 将受到高度赞赏,但(原谅傲慢)他们只是“愚蠢的知识”。我印象最深刻的是思考和攻击问题的新方法(即算法>>数据:D)。

编辑:到目前为止,获胜者是“制作游戏”并“修复令您烦恼的事情(编程|使用comptuers)”。

游戏建议认为有很多相当简单的游戏我可以重新实现(给我一大堆选择的问题进行攻击),它们绝对是现实世界,我是游戏玩家所以我是对好游戏充满热情。

“修复烦人的东西”内置了激情和现实世界,但它要求我不会因为工作正常而被破坏,并且修复不会修改某些不是用语言编写的程序我想学习。

(你们都赢了一个赞成票。接受可能正在接受)

15 个答案:

答案 0 :(得分:12)

为了产生想法,我发现询问“编程中有什么问题”以及“在计算机上工作会让我感到烦恼”总是有帮助的。

完成事情是另一回事。完成事情真的很难。如果您接受将拥有一系列项目,我认为您会更高兴,其中许多项目仍未完成。如果你完成了一切,你将有机会探索更少的想法和技术。

仔细选择您想完成的项目,并记住Piet Hein的话:

  

放在一个地方
  在哪里很容易看到   神秘的警告

     
T. T. T.
  
     

当你感到压抑的时候   慢慢地,你爬,   很记得

     
Things Take Time.
  

答案 1 :(得分:7)

制作游戏。你会学到很多关于任何语言的知识。它不一定是花哨的。做一个地牢爬行或什么的。

答案 2 :(得分:5)

杰夫·阿特伍德(Jeff Atwood)在博客中写了一段关于编码练习“代码卡塔”的文章。

http://www.codinghorror.com/blog/archives/001138.html

另见(杰夫博客中的参考资料):

http://www.codekata.com/

答案 3 :(得分:3)

我收集了这个“标准”问题,我多次使用它来学习一门新语言。

http://homepage.mac.com/s_lott/books/oodesign.html

这是真的。它具有一定的实际价值。它是完成的。

答案 4 :(得分:3)

在自己的生活中找到一些可以通过编程解决的“问题”。虽然说起来容易做起来难,但我会给你一个例子。我收到了其中一个日历,其中一年中的每一天都有一个字混乱(真实)。我喜欢单词拼图等(激情),当时我一直想要一个潜入python的项目。所以我创建了一个简单的命令行脚本来解决与sqlite后端的混乱,从那以后我一直在用python做很多事情。该项目已按照我的要求完成,我仍然添加了它并继续改进并添加到它,但它的目的是作为我的初学项目。所以我真的认为诀窍是找到一些可以轻松直接与日常生活相关的东西。

答案 5 :(得分:3)

答案 6 :(得分:2)

每当我看到一遍又一遍地完成某些事情时,我就有机会创建一些可重复使用的代码。就是我的DAL和我工作过的许多其他项目。

答案 7 :(得分:1)

我不会在代码或其他方面寻找问题。相反,我尽可能地睁大眼睛,这样我就不会错过更简单解决旧问题的灵感:)

有时候,我只是看着人们......或者是蟑螂参与其日常活动。

通常情况下,如果你这样做,你将遇到要解决的新问题。不要试图考虑复杂的问题,这样做通常会导致复杂的解决方案。你认为每一个想法都会培养你的大脑,就像你所想的一样,你和你吃的一样多。

答案 8 :(得分:1)

开发软件(或者只是探索技术如何运作)的“灵感”的另一个来源是“为什么它不能解决这个问题?”或者“它应该与之合作!”时刻。我有一些关于XSD代码生成等问题的时刻。

另一个来源是“必须有更优雅的方式来做到这一点!”时刻。简单的小东西,比如C#“if(x is typea)do_a else if if(x is type_b)bo_b else ....”。让我开始考虑更好的做事方式。

之前提到过的另一个消息来源是“我能写一个系统吗?”时刻(或修辞问题)。我知道程序员已经修改了ISAM系统一年,在这里和那里调整只是因为喜欢玩它。不知道甚至完成项目,只是玩不同的想法和实现。

答案 9 :(得分:1)

虽然不是显然现实世界,但我已经想到了一个至少可以完成的项目的良好来源,并且可能应该被激励的项目做(然后再次,你应该每天使用牙线:p)。

为了检查和测试理解,实施您在CS教育中学到的各种算法。一些项目:

  • 实现有限状态自动机库,语言成员资格测试,产品构建和brzozowski最小化。
  • 实现最大流量,最小成本流量和线性程序求解器。
  • 实现选择NP完全问题,多项式时间近似和强力求解器之间的减少。
  • 编写您自己的加密算法实现(但不要使用它们:D)
IIRC,mona是一个有限状态自动机,用于验证电路的正确性; ISTR我的讲师谈论线性规划在经济学中的应用,而gcc确实进行了寄存器分配(图形着色,即NP完全)。加密当然可以在线保护所有信用卡交易。所以这不是完全不真实的世界:)

答案 10 :(得分:1)

我来不及? 这是一个“次实”问题。既然你喜欢游戏的话。检查这个Java4K,你应该只用4096字节制作一个游戏。 您将学到很多关于Java,很多代码优化的知识,以及如何简单地思考。

在一天结束时,你将有一个新游戏:)

答案 11 :(得分:0)

我经常发现我遇到过的问题可能更容易用不同的语言完成。示例:使用多种语言的PDF。

答案 12 :(得分:0)

嗯。如果这是你的目标,那么你可以分两个阶段尝试......对于算法方面的问题,我强烈建议你看一些编程挑战out there,并结合阅读Skeina的书来做Programming Challenges。它提供了大量关于如何从算法和数据结构的角度处理问题的理论,然后指出了一系列示例问题,您可以尝试将这些想法付诸实践。它肯定会以非常好的方式让你经历精神紧张。非常类似于Project Euler,但对于硬核算法和数据结构的人而不是数学人。

对于“学习语言足以感觉你真的可以使用它”,嗯,有很多想法......对我来说,只是用一个例子,我喜欢建立一个数据库驱动网站。强迫我做很多事情,你需要做的就是进入某种广度/深度的语言。

如果您需要一个网站的特定示例,并且真的想要被推动做一些真实的事情,您可以联系一些您喜欢的慈善机构,并查看谁需要免费为他们完成的网站或其他应用程序。你被迫学习,并有理由在合理的时间内完成,并且他们免费获得一个有用的应用程序。双赢。

答案 13 :(得分:0)

我维护一个项目/类/函数列表来创建“当我得到时间和倾向”时。我为其他爱好保留了类似的名单。如果我感到无聊或想要挑战,总会有事可做。

答案 14 :(得分:0)

您可以尝试将解决方案编码为朋友或家人在计算机上遇到的真实问题。如果你为那些对计算机缺乏相关经验的人创建解决方案,这可能是一种特别好的编码方法 - 那些人会问你另一个编码器永远不会想到的问题。关于你的解决方案的这些现实问题可能是这样的:“为什么这会在所有这些写作的黑色窗口出现?” - 引用从DOS命令提示符运行的脚本。当你遇到类似的问题时,你需要牢牢掌握自己对语言的理解,并且必须能够以外行的方式回答才能回答它们。

我现在正在学习perl,我正在用它为一个经营公寓大楼的家庭成员设计物业管理系统。

通过为亲近的人建立一些东西并期望你完成它,你可能会发现自己更有动力去编写整个解决方案,而不是半途而废。