2009-03-02 69 views
20

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

我常常想学习新的编程语言。不过,我觉得,要真正了解它,我必须写的东西是:

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

  • 的东西,我可以得到热情,它需要时间来学习新的编程语言的来龙去脉。那意味着我必须投入那个时间。为了帮助我保持积极性,我想解决在某种程度上吸引我的问题。我认为这部分是最困难的,至少对我来说,我所有的一半完成的项目都是如此;这也是最重要的部分。无论现实世界存在多大的问题,如果你不用它,你也不会从中学习。

  • 机最终连接到充满激情的方面,我想要的东西,我相信我可以给一个可交付状态时,只有在我的业余时间工作。即使“C编译器”是非常的真实世界,我真的很喜欢编译器,这是一个有点大嘴巴。即使是一个简单的表达式评估器,当您不熟悉特定语言的习惯用法时,您可以重新设计,调试和优化多次。

那么,您(或您)如何解决寻找有趣的工作问题?

特别的解决方案,也就是说,问题并予以解决,将不胜感激,但(原谅傲慢),他们只是“哑巴知识”。我最感兴趣的是思考和攻击问题的新方法(即算法>>数据:D)。

编辑:迄今为止的获胜者是“制作游戏”和“修复令您恼火的东西(编程|使用comptuers)”。我可以重新实现许多合理简单的游戏(给我一大堆攻击难度),他们绝对是真实的世界,而且我是一名玩家,对好游戏充满激情。

“解决烦人的事情”具有内在的激情和现实世界,但它要求我不会因为事物的正常工作而被宠坏,而且修复不会修改某些未写入的程序我想学习的语言。

(你们都赢得了给予好评。一个可以接受在它的途中)

+0

应该是社区wiki – Malfist 2009-03-02 21:45:22

回答

2

每当我看到一些正在做过来,我再次看到了机会创造一些片的可重用代码。正是在我的DAL以及我所从事的其他许多项目中。

+0

达姆 - 这是我的答案...所以它是+1! – 2009-03-02 21:51:02

0

我经常发现,已经在那里,我已经遇到的问题可以用不同的语言来更容易地完成。例如:使用多种语言的PDF。

3

我收集的,我用了几次学习一门新语言这个“标准”的问题。

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

这是真实的。它有一些有形的价值。它是完成的。

+0

这个问题可能很有趣,但是我得到了这种无法逃避的感觉,书中提出的设计包含了大量的YAGNI概括和大量简单地夸大设计的类。 – 2009-03-03 07:29:56

+0

一些概括性有助于学习该语言的功能。有些人在那里教OO设计原则。所以,你可以争辩说他们“过于普遍”。一个人的“可扩展”总是另一个人的YAGNI。 Extensible在你真正需要它之前总是有争议的。 – 2009-03-03 10:54:17

0

嗯。如果这是你的目标,那么你可以在两个阶段尝试它......对于算法方面,我强烈建议看看一些编程挑战out there,并结合阅读Skeina的书Programming Challenges。它提供了大量关于如何从算法和数据结构的角度来处理问题的理论,然后向您提供了一些示例问题,您可以尝试将这些想法付诸实践。这将非常好地让你完成精神榨汁。非常类似于欧拉计划,但是对于硬核算法和数据结构人员而言,而不是数学人员。

对于只是“学习语言,觉得你可以真正使用它”,好吧,有很多想法...对我来说,只是为了使用一个例子,我喜欢建立一个数据库驱动的网站。强迫我做很多事情,你将不得不做一些事情来深入一些语言。

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

+0

“你可以联系你喜欢的一些慈善机构[...]” - 我会更愿意(比起内在的兴趣来获得更多的义务感(避免让人失望的惩罚)我想出于个人原因)。 – 2009-03-03 00:29:47

+0

正是!如果这个人感觉他们需要一个很好的理由去闯过一些困难,那么这将成为一个出色的激励者。当然,一旦他们完成了,他们会收获既做了一件好事,也学会了他们想学的东西。 – Beska 2009-03-03 14:57:24

3

在自己的生活中发现一些可以通过编程解决的“问题”。虽然说起来容易做起来难,但我会举一个例子。我收到了其中一个日历,其中包含一年中的每一天(真实)。我喜欢文字拼图等激情,当时我一直想要一个项目潜入蟒蛇。所以我创建了一个简单的命令行脚本来解决sqlite后端的问题,并且从那以后我一直在用python做很多事情。该项目完成后,我仍然希望它能够完成,并且继续改进和增加它,但它对我来说是一个启动项目。所以我真的觉得诀窍就是找到一些你可以在那里工作的东西,它很容易和直接地连接到你的日常生活中。

12

为了产生创意,我发现询问“编程有什么问题”以及“在计算机上工作有什么问题”总是很有帮助。

完成的事情是另一回事。整理的东西是真的很难。我认为,如果你接受了你将拥有一个项目组合,其中许多项目仍未完成,你会更开心。如果你完成了一切,你将有机会探索更少的想法和技术。

仔细选择哪些项目要完成,并记住海恩的话:在一个地方竖起


它很容易地看到
隐秘训诫

T. T. T. 

当你感到压抑时
慢慢地你爬上,
是要记住,

Things Take Time. 
7

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

1

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

有时我只是看人们是人......或者是蟑螂在忙着日常活动。

很多时候,如果你这样做,你会遇到新的问题需要解决。不要试图考虑复杂的问题,这样做通常会导致复杂的解决方案。你想到的每一个想法都会训练你的大脑,你和你想象的一样多,你所吃的就是你的东西。

1

软件开发(或者只是探索技术如何工作)的“灵感”的另一个来源是那些“为什么它不能处理这个问题?”或者“它应该与此一起工作!”时刻。我有一些像XSD的代码生成那样的时刻。

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

有些人之前提到的另一个来源是“我可以写一个系统来做到这一点吗?”时刻(或修辞问题)。我认识一些曾经在ISAM系统上修过一年的程序员,因为喜欢玩这个而在这里和那里调整。没有想法甚至完成该项目,只是玩不同的想法和实施。

0

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

1

虽然不是显然现实世界,我有一个想法的是至少最终处理,并且可能是你应该动机做(话又说回来,你应该项目的良好来源每天使用牙线:p)。

为了回顾和测试理解,实现您作为CS教育一部分学到的各种算法。一些项目:

  • 实现有限状态自动机库,具有语言成员资格测试,产品构造和brzozowski最小化。
  • 实现最大流量,最小成本流量和线性程序求解器。
  • 实现选择NP完全问题,多项式时间逼近和蛮力求解器之间的约简。
  • 写自己的实现加密算法(但不使用它们:d)

IIRC,mona是用来验证电路的正确性有限状态机的thingie; ISTR我的讲师谈论线性规划在经济学中的应用,而gcc确实记录了分配(这是图形着色,它是NP完全的)。加密当然可以保证所有的信用卡交易在线。所以它不是完全不真实的世界:)

1

我太迟了吗? 这里是一个“亚真实”的问题。既然你喜欢游戏的事情。检查这个Java4K,你应该只在4096字节的游戏。 你会学到很多关于Java的知识,很多代码优化和肯定,如何简单思考。

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

0

你可以尝试编码解决一个真正的问题的朋友或家庭成员都有一台计算机上。如果您为相对不熟悉计算机的人创建解决方案,这可能是一种练习编码的特别好方法 - 这类人会问您另一个编码员从来不会遇到的问题。关于你的解决方案的这些现实世界的问题可能是这样的:“为什么这个会在所有这些写作的黑色窗口中出现?” - 参考从DOS命令提示符运行的脚本。当你遇到这样的问题时,你需要牢牢把握自己对语言的理解,并且必须能够以外行的语言回应,以便能够回答它们。

我现在正在学习perl的过程,我正在使用它来为运行公寓大楼的家庭成员设计一个物业管理系统。

通过为某人靠近你并期待你完成某件事情,你可能会发现自己更有动力写出整个解决方案,而不是半途而废。