• 非常的不想要 prefix attribute name

    Rails 6 可以 override model attribute 级别的 error format https://blog.bigbinary.com/2019/04/22/rails-6-allows-to-override-the-activemodel-errors-full_message-format-at-the-model-level-and-at-the-attribute-level.html

  • 我们不说 “平庸”,“低水平”,我们说平均水平

    软件工程目的真的就是为了实现低水平的程序员都能完成工作?

    软件工程的目的是利用现有资源完成目标。精英工程师是稀缺资源,绝大部分公司不可能全员精英,如何利用好平均水平工程师才是关键。

    还是优秀人才难招聘(或者不愿招聘)、难培养(或者没能力培养)的结果?

    同上点,优秀人才稀缺是不可改变的现实,请不要把人才培养的责任推给企业,企业顶多占 20%,个人因素最重要。

    平庸 平均水平员工就能以可接受质量完成工作” 是我们应该追求的目标?

    是。

  • 公司隐含的要求是:员工要能解决问题,并且还要平庸,所以让员工变得平庸的技术反而能大行其道。

    是不是有点因果倒置,平庸员工都能解决问题的技术就应该大行其道。别人都上先进生产线,招高中毕业生,培训 2 天直接上岗,你还非要找 20 年经验老手工师傅。当然不是说老手工师傅不行,只是适合的场景不一样。

    有不少公司招新人进来不让接触根本的东西,自己封装了一层 “指导原则” 的东西,招进来的人在这个框架上工作,甚至连编程语言(Ruby)本身、技术框架(Rails)本身都没怎么掌握,就被赶鸭子上架,照葫芦画瓢的 copy and paste 写代码。

    copy paste 写代码跟公司没什么关系,没有公司会禁止员工进步。就软件行业来说,大批优秀开源项目、文章等学习资料唾手可得,进步不了怪公司有点说不过去。

    总结:平庸员工就能以可接受质量完成工作是生产方式优秀的体现,有上进心的人可以没有障碍(科学上网不算)的接触业界先进知识是行业优秀的体现。

  • 这个方法怎么定义 at 2020年06月29日

    你需要的是子方法跳出到父方法的能力,考虑一下用catchthrow

    def fun
      r = catch(:tag) do
        a_fun
        b_fun
        ...
    
        return 0
      end
    
      return r
    end
    
  • 只有我名字没打码,明显是冲我来的

  • Raft 笔记 at 2020年06月26日

    Raft 是一个复制 log 的算法

    Raft 是解决分布式系统一致性的算法,log 其实是 commit log,不说明一下容易产生歧义。

  • Twitter 上被 Hey 刷屏了 at 2020年06月23日

  • 哪个资本闲着没事还去宣传技术?

    Rails 本身不适合业务急速扩张的场景,倒不是 Ruby 本身的 scalability 问题,是团队的 scalability 问题。急速扩张大量需求的是蓝领工程师,Rails 作为蓝领工具没有特别优势,甚至还有不少劣势。

    归根结底还是因为软件相关行业利润太高,能堆人解决的问题都不是问题;rails 工程师大多是 generalist,堆人的公司也用不上。

  • JSON.generate(hash, space: " ", indent: " ").sub(/\s/, '')

  • require "socket"
    require "nio"
    
    def run(host, port)
      server = TCPServer.new(host, port)
      puts "Listening to #{host}:#{port}"
    
      selector = NIO::Selector.new
      monitor = selector.register(server, :r)
      monitor.value = ->(_) do
        socket = server.accept
        puts "New client #{socket}"
        client_monitor = selector.register(socket, :r)
        client_monitor.value = ->(mon) do
          s = mon.io
          puts "Got: #{s.read_nonblock(4096)}"
        end
      end
    
      loop do
        selector.select { |monitor| monitor.value.call(monitor) }
      end
    end
    
    run('localhost', 1234)