分享 我们不组织个 “每周一题” 之类的活动吗?

willmouse · 2014年03月09日 · 最后由 willmouse 回复于 2014年03月22日 · 3928 次阅读

想法源自百度贴练字吧的“每周一练”(http://tieba.baidu.com/p/2906841172)。

大体思路很简单:由某个或者某几个人,每周发布一道题目,感兴趣的人回帖,贴上自己的代码即可。

  1. 题目要好理解,尽量不涉及较复杂的算法和数据结构,竟可能的让更多的人参与。
  2. 题目要符合“易上手,难精通”这条规则,也就是绝大多数人都可以完成,但想完成的非常好,却不是那么简单。解决题目的问题是次要的, 主要是通过引出一个简单的问题,让大家用自己认为最高效、最优雅地方式去解决它
  3. 问题不应该具体到实现,例如像“使用正则表达式自己实现一个String#split方法”,“实现一个B+树”等。最好是一个比较宏观,并且实际可能遇到的问题,例如“实现一个可用的用户系统”,稍微具体一点也可以,“实现一个类似Rspec的describe it 结构,以及一个简单的 should”。问题如果描述的不好,就特别容易让人无从下手(其实前面这个用户系统的问题就是如此,你可能不知道该从什么地方开始写起),这也是出题最难的地方。
  4. 题目不需要太具有故事性,例如“某一天阳光明媚,李雷和韩梅梅一起出去玩,走着走着,韩梅梅突然让李雷用 Ruby 实现一个观察者模式,如果写不出来,她就不和李雷一起出去了”,其实就是实现观察者模式,故事没有太大的意义。
  5. 各式各样的博弈类,益智类,扑克牌,掷筛子等问题,我觉得都不是很合适。虽然他们都是很值得解决、研究的问题,但是不是很符合出现在这里。
  6. 最后要记住,重要的不是解决这个问题,而是写出来的代码。

比较符合我的想法的帖子,来自@blacktuliphttp://ruby-china.org/topics/13178

比较不符合我的想法的帖子: http://ruby-china.org/topics/12837

不符合我的想法,主要并不是因为涉及到了算法,而是上面帖子里的代码,几乎每个人都把注意力放在了解决这个问题上,而不是在 Ruby 的代码上面。所有人都把代码都写在了一个方法里,与其说是在写 Ruby 代码,不如说是在写 C 代码,只不过这个 C 代码有一些语法糖罢了。另外,我对上面这个帖子本身没有任何意见,我只是说不太符合我这里的想法。

我想如果每周能有一道合适的题目,让大家都可以参与进来,并且相互讨论,应该是件比较有趣的事。

这些都是初步想法,抛砖引玉吧,有兴趣的话,大家讨论讨论。


以下个人观点:不得不说,Ruby China 现在值得看,尤其是值得参与的帖子越来越少了,很多帖子看了之后,都不知道该说些什么好。既然有这么个环境,应该好好利用。 与其让自己的朋友跟自己有同样的兴趣,不如找和自己有同样兴趣的人做朋友,我觉得像这种“每周一题”的活动,在 Ruby China 弄是最合适的,虽然不是朋友,但大家都有同样的兴趣。没有必要自己再去做个 Web App,然后召集每个人都去那里答题、做题什么的。

/-------------------------------------------------------------------------------------------------/

更新一下我预想的一道题:

例如实现一个 Rails 中的 before_filter 或者 around_filter:

class PeopleController < ApplicationController 
  before_filter :locate_person, :only => [:show, :edit, :update]

  def show
    puts "showing a person's data"
  end

  def edit
    puts "displaying a person edit form"
  end

  def update
    puts "committing updated person data to the database"
  end

  def create
    puts "creating a new person"
  end

  def locate_person
    puts "locating a person"
  end
end

或者是实现一个简单的 XML Builder 之类的,我所想的题目应该是尽可能和 Ruby 相关的,题目看一眼所有人都明白意思,不会对题目本身有什么疑惑,题目本身也没有不需要很严格的限制,例如输入、输出。

题目的解决时间根据个人水平的不同,花费 15-60 分钟为最佳。因为我觉得像这样的余兴活动,只有在不花费过多时间的情况下,才可以长久。

我觉得解决问题比 Ruby 语法糖有意义啊

哈哈,好提议!

#1 楼 @bhuztez 恩,其实从后面提到的帖子来看,喜欢解决这种问题的人,聊得就会很开,不过相对来说,参与的人就不那么多。

总之,你算这里的异类,解决问题的能力跟你在一个起跑线上的人不多,所以也不能代表绝大多数人的意见。

没恶意,别见怪。

#3 楼 @willmouse 第一种的问题是脱离具体问题谈抽象,全都在瞎扯好不好 ... 很容易就变成茴香豆的 N 种不同的写法的

匿名 #5 2014年03月09日

http://www.codewars.com 这里的不少题目似乎比较接近楼主的要求


我来发个邀请链接 www.codewars.com/r/5zGAiQ 😄

#4 楼 @bhuztez 不能同意更多。

#4 楼 @bhuztez 那是问题不合适,我只是拿那个帖子举个例子,并没有说那是个很好的问题。不过那个问题也算是挺好理解的,至少不论技术高低,计算机科学方面的水平有多少,都可以参与的进来。

我有个问题,怎么在 markdown 的 ` ` 里面打出 ` 来?

我觉得实现一个常用方法的精简版是个不错的方向。

例如上面提到的 Rspec 的 describe it should,或者 Factory Girl 常用接口的实现方法,又或者包装一下 Ruby China 的 API 等等。

看起来都不是非常的难,但每个人实现起来总会有好有坏。

我觉得这种活动意义不大。。

#14 楼 @iBachue 总之讨论下吧,大部分人觉得没意义也就作罢。

#13 楼 @willmouse 要做就做好玩点产品向的吧,重写 rspec 这种再造轮子什么的太索然无味了……

比如,写一个音频过滤器,在线实现死神小学生的变声器,能把大叔声变成可爱的男孩子声,把女神音变成女汉字音等各种效果什么的……

#17 楼 @aptx4869 我觉得这种规模的问题不太适合在论坛这样的地方展开。

class TimeSetter
  def self.convert(d)
    y = 1980
    while (d > 365) do
      if (y % 400 == 0 ||
          (y % 4 == 0 && y % 100 != 0))
         if (d > 366)
            d -= 366
           y += 1
         end
       else
        d -= 365
         y += 1
       end
     end
     return y
 end
end

这个代码不知道大家有没有兴趣重构。微软的,被翻译成 ruby 了(不是我翻译的,原来代码就存在 bug,所以翻译过来也有 bug)。

#18 楼 @willmouse 其实没有想像的规模大,组合下参数调用一下 sox 什么的大概就能实现了,我做过本地外星音的……

建议要求单行代码实现,要不然对于 Ruby 这种语言来说太没挑战性了

提议真的很不错,可以开展一下!

#20 楼 @aptx4869 有标准库以外的外部依赖我觉得也不合适。并且你提到音频过滤器,我觉得问题最好不要涉及到额外的一个领域(视频、音频、自然语言处理),因为宗旨是让尽可能多的人参与,这样的问题需要在回答问题之前,了解一下相关领域的内容,否则便会无从下手。像这样的活动,如果做不到极低的参与门槛,我觉得应该算是很失败。

提议不错,气氛搞起来

#21 楼 @swordray 除及其特殊的情况,使用单行代码能实现的功能应该是十分有限。并且为了使用单行实现,刻意降低可读性,我觉得不会让人从中学到什么。

#25 楼 @willmouse 可读性取决于读者

出题容易,Sphere Online Judge (SPOJ) 有整套系统,支持 Ruby,玩了很多年了。关键是怎么区别开其它语言,表现出 Ruby-style。

#27 楼 @swordray 那里的题目我看了下,还是偏益智类的题目,算是 Quiz 吧。

我比较倾向于实际可能会用到的代码,我觉得组织很多的人,重造同一个轮子,并且这个轮子是一个大家平常一直在用,但却不是很清楚怎么实现的功能。这样大家可以看出来针对这个大家都很熟悉的功能,怎样地实现是比较好的。

#29 楼 @ctrlaltdeletel 那样的话,大家都去学 APL 系列了...

#29 楼 @ctrlaltdeletel 我预想的题目不是这种 Puzzle 类的风格,就是类似:

The Problem: Example Input: Example Output:

这种类似 ACM 的题目,我觉得很多时候,使用 Ruby 都不如其它语言合适,而且很容易写成算法类的代码,就像我在顶楼提到的后面一种。

#30 楼 @krazy

Thin 作者这个属于撘个脚手架,你来进一步完成,这也不太适合在论坛展开啊,太广了。

更新一下我预想的一道题:

例如实现一个 Rails 中的 before_filter 或者 around_filter:

class PeopleController < ApplicationController 
  before_filter :locate_person, :only => [:show, :edit, :update]

  def show
    puts "showing a person's data"
  end

  def edit
    puts "displaying a person edit form"
  end

  def update
    puts "committing updated person data to the database"
  end

  def create
    puts "creating a new person"
  end

  def locate_person
    puts "locating a person"
  end
end

或者是实现一个简单的 XML Builder 之类的,我所想的题目应该是尽可能和 Ruby 相关的,题目看一眼所有人都明白意思,不会对题目本身有什么疑惑,题目本身也没有不需要很严格的限制,例如输入、输出。

题目的解决时间根据个人水平的不同,花费 15-60 分钟为最佳。因为我觉得像这样的余兴活动,只有在不花费过多时间的情况下,才可以长久。

#28 楼 @willmouse 按你的想法直接做成开源项目就行了,我前两天才和 @Rei 讨论过

#34 楼 @swordray 顶楼我也写了,我觉得没有必要单独作成一个 App,我觉得在这里开展比较合适。

LZ 的想法很实际,如果能展开确实帮助很多人。

应该以具体某些实际常见功能为题,讨论不同场景的最合适的实现代码。

比如,controller test 中 每个 action 都测试 sign in / sign out 情况 是不是多余。

#19 楼 @yfractal

首先代码有 bug, 366 无限循环了... 直接的:

require 'date'
def year_for_days_after_1980 d
  (Date.new(1980) + d).year
end

#37 楼 @luikore 本来代码就有 bug。。。好像这个 bug 让好多人开不开机。。。不过我应该提醒下的。。。

#33 楼 @willmouse 穷人版 before filter

def before_filter(filter, methods)
  methods.each do |m|
    alias_method "__before__#{m}", m
    define_method(m) {send filter; send "__before__#{m}";}  
  end
end  

class Foo
  def show
    p "show"
  end

  def edit
    p "edit"
  end

  before_filter :bar, [:show, :edit]

  def bar
    p "bar"
  end
end  

#39 楼 @quakewang 挺简洁的实现方法,我没想到有这么个思路。

我觉这个 before_filter 不算很简单,也不算很难,但想实现的好也是绝对不是一件简单的事,其实比较符合我的初衷。

#11 楼 @zgm 数字键1前面的那个键。

让我想起了训练营和 codewars。。。

形式上面我觉得挺好的,不过我觉得内容上面不一定要 focus 在语言,可以放在一些稍微大一些的东西上面。比如如何设计一个 todolist,如何设计一个更好的 forum,如何设计一个更好的 SNS,当然大家要给原型。有点大,可能是一个周末项目了。

话说这个有下文么

#44 楼 @aptx4869 No,看反响,意义不大,故作罢。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号