<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>jasonliu (liuxingqi)</title>
    <link>https://ruby-china.org/jasonliu</link>
    <description>write code, change myself!</description>
    <language>en-us</language>
    <item>
      <title>创业公司团队管理的四大挑战——裁人篇</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/jasonliu/dea41fc3-1286-44b6-a035-0e405041e078.jpeg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;一天早上，我步入办公室刚走到办公桌前，主管就匆匆地把我叫入了一间会议室，他的表情显得很凝重，眼中血丝清晰可见，我有一种不好的预感。“你需要给我一份名单，我们要裁掉你团队中一半的开发人员......”主管用疲惫且无奈的口吻对我说道。我并没有显得过于震惊，因为最近公司的扩张速度太快了，而业绩显然没有跟上这种扩张速度，裁员也只是时间问题。确认一些问题后，我深吸一口气，调整了一下表情，起身走出了会议室。来到办公桌前，我看到一些伙伴在埋头工作，一些伙伴还在和产品激烈的争论需求方案，他们朝气蓬勃，充满干劲，但一场暴风雨即将来临......我坐在椅子上显得有些恍惚，各种名字在我脑海中闪过，我知道我将经历职业生涯中最艰难的一天！&lt;/p&gt;

&lt;p&gt;这次裁员的结果很糟糕，公司不仅损失了一批忠诚的员工，良好的声誉也遭受打击，各种负面的报道充斥在新闻媒体、知乎、微博......连我自己都没有预想到结果是如此之糟糕，外界的负面报道、被裁员工的愤怒是意料之中，但留下来的员工所展现出来的失望情绪是如此的强烈让我们始料未及，由此引发了我持续的反思：公司的裁员过程到底哪里做错了？如果重来一次，我们是否会处理的更好？以下是我一年多来的思考和总结，希望这些经验你永远都用不到。&lt;/p&gt;
&lt;h2 id="裁人篇"&gt;裁人篇&lt;/h2&gt;&lt;h2 id="承认管理的失败"&gt;承认管理的失败&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;万亿美金教练比尔·坎贝尔曾说过："裁员说明了公司管理的失败，而不是任何被解雇的人的失败"&lt;/strong&gt;。但往往实际传递给被裁员工的信息就像是言情剧的陈词滥调："不是你人不好，只是我们不合适"。承认失败是很丢脸的事情，是需要勇气的事情，但这是凝聚团队的有效手段。就像是部队打了一场败仗，指挥官应该负首要责任，而不能责怪士兵无能。&lt;/p&gt;

&lt;p&gt;但不得不说，当今时代让我们对创业公司的 CEO 有着近乎苛刻的期待，睿智、聪明、勇气、魅力都成了基本标配，还希望 CEO 们能力挽狂澜、让公司起死回生，高速增长，直到上市才能彰显成功，修成正果。但实际上乔布斯、马云之辈只是稀有物种，更多数的 CEO 只是比大众在某些方面更强而已，他们也是普通人。因为背负了太多，让 CEO 亲自说出自己的失败是很困难的一件事情，但我还是建议面对裁员的时候，公司的 CEO 能当着所有人说出是因为自己的管理失败导致这样的结果。&lt;strong&gt;投身创业公司的员工也需要理解，你们的老板是人而不是神，不要抱有过分的期待&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="自己的员工要自己亲自辞退"&gt;自己的员工要自己亲自辞退&lt;/h2&gt;
&lt;p&gt;"没有辞退过人的管理者不是一个好的管理者"，这是一句有道理又有些残酷的话，但我并不喜欢这样的表达，在这句话的背后隐藏着一些管理者要承担的责任，这个才是你应该去了解的。我曾经辞退过团队中的一个高级开发，说实话，辞退他以后，我整个人都轻松了好多，再也不用为了让他准时参加早会而绞尽脑汁，也不用为了他引发的团队矛盾而忧心忡忡，但过程是很痛苦的，对方会辱骂你，甚至要状告公司。那段时间，我晚上都没法安然入睡，你会自责给主管和公司带来麻烦，你会质疑自己的决定：是不是大家相安无事就不会落到今天找个地步？现在回想起来，这次的经历让我成长了很多。&lt;strong&gt;识别团队中不合适的成员是简单的，但有勇气辞退对方才是巨大的挑战&lt;/strong&gt;，很多管理者都会选择忍受，付出的代价不仅是自己痛苦，还会毁掉你的团队，如果你连一个人按时参加早会都做不到，如何让团队和主管认可你的管理能力？正如本·霍洛维茨在《创业维艰》这本书中提到：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"对管理人员的培训需遵循一条黄金法则：自己的员工要自己亲自辞退，不能将这项工作推卸给人力资源部门或某个更严厉的同事，不能像电影《在云端》中那样雇用一家外包公司来完成。"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;如果你已经决定辞退团队中的某一个成员，你应该寻求你的主管以及 HR 部门的支持，让他们提前做好准备，随时应对可能出现的意料之外的状况&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="不要上交管理责任"&gt;不要上交管理责任&lt;/h2&gt;
&lt;p&gt;很多管理者在辞退人的过程中会犯一个很多人都会犯的错误叫：&lt;strong&gt;管理责任上交&lt;/strong&gt;，就是你把自己的应该肩负的责任推给你的主管。"不是我不给你涨薪，是领导不批准", "不是我要辞退你，这是领导的决定"，是不是听着很耳熟？如果你只是作为员工和上级之间的传话筒，那么你作为管理者的价值在哪里呢？&lt;strong&gt;管理者要做的事情就是处理这些困难的事情，如果你只是当个传话筒，拖拖 Jira 的卡片，盯着任务的进度，这样的事情任何人都可以做，你要经常思考：我带这个团队和其他人带有什么不同么？&lt;/strong&gt;。我所面试的很多所谓有“团队管理”经验的人，做的都是他的团队成员都可以去做的事情。这也是目前很多公司的优秀开发人员不愿意去做团队 leader 的原因，他们认为 leader 的主要工作就是拖下任务卡片。&lt;/p&gt;
&lt;h2 id="不要制造惊吓"&gt;不要制造惊吓&lt;/h2&gt;
&lt;p&gt;我想谁都不会期望突然被叫到办公室被告知：你被辞退了。但“裁人要快”这句话已经被各大公司的管理者奉为圭臬，但实际取得好的效果的少之又少，那到底要多快呢？我在一天之内就辞掉了团队的成员，过程异常顺利，但我非常的难受，我宁愿大家当面骂我一顿，但是每个人都抱着理解的心态，我感受得到他们内心的失落和愤怒，只是他们刻意压制住了，不想在我的面前展现出来。我想问题的关键不在于到底有多快，而是在于我们是否提前给大家传递了一些信息。&lt;strong&gt;对于裁员，公司之前是否已经将业绩不佳的情况如实告知所有人，还是只是少数的几个高管知道。对于辞退不合适的员工，你是否提前和他沟通了对于他的要求和没有达到预期的点在哪里。如果没有提前告知这些信息，对于他们来说就是一场“惊吓”，导致情况失控就不足为奇了&lt;/strong&gt;。隐瞒坏消息的理由有很多，比如不希望竞争对手恶意中伤，不希望媒体过分解读，不希望影响员工士气，不希望投资人因此撤资等等，但最终你会发现：一旦隐瞒，事情的发展会和你的期望背道而驰。&lt;/p&gt;

&lt;p&gt;公司裁员就像一个男人和女朋友说分手，你不能拖着耽误人家青春，也不能像电视剧中的桥段：我们不合适！然后扭头就走。分手肯定不是一时冲动，而是在相处的过程中发现了不合适的地方，你应该平时就说出来，搭建沟通的桥梁，而不是藏在心里在某一刻突然爆发。还要有点人情味，帮对方还清信用卡、清空购物车、行李搬上车，祝福对方找到真爱！&lt;/p&gt;
&lt;h2 id="谨慎选择你的名单"&gt;谨慎选择你的名单&lt;/h2&gt;
&lt;p&gt;裁员的时候，我被告知要保留核心开发人员，现在回想起来，我在选择名单的时候犯下了巨大的错误：我裁掉了所有的实习生和初级开发人员。我到现在依然后悔不已。一方面这些实习生中不乏基础能力好，对团队认可度高的人，这些人可能是未来公司的核心成员，另一方面我在后面不得不辞退掉团队内的一名高级开发，他的薪水超过了 2 个初级开发的薪水总和了。相当于留下了不合适的人，裁掉了有潜力的人，导致双输的局面。现在我认识到，&lt;strong&gt;对于一个创业公司，裁员只是创业过程中的一个挫折而已，你所面临的挑战远不止此，能陪你走到最后的不一定是专业能力最强的，往往不是，他们反而会去前景更好的公司，那些对公司或团队认可度高的人才能和你一起披荆斩棘，克服各种困难还能留到最后&lt;/strong&gt;。我当时是没有这样的认知的。如果你面临这样的选择，请谨慎填写你的名单，不仅要考虑现在，还要为未来做准备。&lt;/p&gt;
&lt;h2 id="如何回答：凭什么裁的是我？"&gt;如何回答：凭什么裁的是我？&lt;/h2&gt;
&lt;p&gt;面对裁员，我相信你大概率会遇到这个问题，我没有遇到过，但是我相信大家心里都有这样问过。“这是领导的决定”，上面已经提到过，千万不要这么干。”可能是你，现在还没有最终决定“，更不能这么干，你是在给自己挖坑，给对方找不痛快。对于初级的开发，理由会是公司目前没有资源来培养你们；对于高级开发，理由会是你的薪水太高了，公司需要降低成本。这些答案都是合理的，但不一定有效，因为&lt;strong&gt;你面对的不是问题，而是情绪，先解决情绪再解决问题，你表现出的态度比逻辑更重要&lt;/strong&gt;。面对这个问题，我想这不会是一个糟糕的回答：公司目前遇到经营困难，需要裁员才能继续走下去，我不得不让团队中的一部分人离开，这是一个艰难的决定，离开的成员名单里有你，我为此感到非常抱歉，我会帮助你渡过接下来的艰难时刻，如果我能在任何方面帮助到你，请你一定告诉我。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;作为管理者，你的权利就在于你可以做出这个决定，哪怕不是最优的决定，后果是公司来承担，但你不能不做决定，不做决定比错误的决定更糟糕&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="好好说再见"&gt;好好说再见&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;帕蒂·麦考德在《奈飞文化手册》一书中提到的奈飞企业文化准则第八条就是：离开时好好说再见&lt;/strong&gt;。我想如果企业或管理者可以做到这一点，我上面所说的都是废话了。好好说再见的方式有很多，我当时做的是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;拉一个被裁掉同事的微信群，把 HR 也拉进来，给大家推荐工作&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;给每一个人写推荐信（在国内这个似乎没什么用）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保持手机畅通，当员工重新加入一家公司需要做背调的时候把情况说清楚&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请大家吃饭，保持私下的联络&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;帮大家搬东西，亲自送大家离开&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;公司的角度可以做到更多，比如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;在力所能及的情况下给一份丰厚的补偿金&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高管可以推荐一些人去认识的公司&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高管给全体员工发一封邮件或者讲一次话，说明公司目前的情况，感谢离开员工过去的付出&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="你不用担下一切“罪责”"&gt;你不用担下一切“罪责”&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;你不用担下一切罪责，实际上你确实也担不下&lt;/strong&gt;。那段时间我很难走出来，感觉自己很失败，感觉对不起那些离开的人，他们有的都还刚毕业啊，面对人生的第一份工作就要面临被裁，换做是我，我也难以接受。但还是那句话：&lt;strong&gt;这就是作为一个管理者要面对的事情。你能做的就是与离开的人好好说再见，还能和他们成为生活中的朋友，你最应该做的就是整理好自己的心情和思绪，为团队还留下的人负责，你需要带领他们走出当前的阴霾，努力不要让这样的事情再次发生&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="结语"&gt;结语&lt;/h2&gt;
&lt;p&gt;前段时间我请了之前离开的同事一起吃火锅，再次相见，那种团队的感觉依然还在，大家一起说说笑笑，互诉衷肠，那些不愉快的经历似乎都已经远去了，我的内心还带着一些歉意，真的很开心和这些朋友一起共事过，希望我们还有在一起再次共事！&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Fri, 21 May 2021 15:19:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/41294</link>
      <guid>https://ruby-china.org/topics/41294</guid>
    </item>
    <item>
      <title>创业公司团队管理的四大挑战——招人篇</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/jasonliu/55f64f19-a6b2-4f0b-9fad-5f83474b26c7.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;在创业公司的近三年时间里，给我最深的一个领悟就是——&lt;strong&gt;人才是企业发展的核心驱动&lt;/strong&gt;。200+ 的面试经验和带领多个团队的管理经验让我获取了很多宝贵的知识，涵盖招人、用人、裁人、留人这四大部分，我希望将这些总结出来分享给更多的人，也是作为个人经历的一个回顾，无论你是在创业中，还是打算创业，我相信一定会有某些点能给你带来一些启发！&lt;/p&gt;
&lt;h2 id="招人篇"&gt;招人篇&lt;/h2&gt;&lt;h3 id="1、告诉 HR 你的团队需要什么样的人"&gt;1、告诉 HR 你的团队需要什么样的人&lt;/h3&gt;
&lt;p&gt;作为 Team Leader，你的时间其实是很宝贵的，会议会占用你很多的时间，如果你是技术团队的负责人，还要做一部分编码、代码 review 的工作，为不合格的简历浪费筛选时间实在是不值得的，尤其是你在缺乏人员甄别能力的时候，一场无意义的面试会耗费你至少一个小时的时间。此时你需要 HR 帮助你筛选出你想要的团队成员，甚至你要亲自给 HR 写一份 JD，专业的 HR 还会先和候选人电话沟通，确保没有明显的风险，这样就形成一个漏斗，保证到你手上的简历都是高质量的，这些候选人才是值得你花时间接待的。&lt;/p&gt;

&lt;p&gt;不要把招人的事情认为是你的 leader 或 HR 团队负责的事情，你应该争取用人的决策权，因为你是最了解当前团队和业务状况的人，是招一个初级的开发实习生去解决琐事，还是招聘一个高级工程师解决技术难题，你应该是最清楚的人。把一个不合适的人放在团队里有可能毁掉整个团队。&lt;/p&gt;

&lt;p&gt;在这里，我会介绍几个筛选简历的最佳实践，可以让你快速判断这个人是否要邀请这个人参加面试：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;简历排版混乱、包含错别字&lt;/strong&gt;。这样的简历可以果断放弃，这无法体现出求职者对自己和公司的尊重；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;隐瞒经历&lt;/strong&gt;。我认为，不管是失败的创业经历，还是错误的择业选择，都不是隐瞒经历的理由，逃避的东西往往是需要正视的；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;不以专业或学校背景武断下决定&lt;/strong&gt;。如果一个应聘软件开发工程师岗位的求职者在大学是采矿专业，要么他只是为了混口饭吃，要么就是他对软件开发抱着极大的热情，你应该仔细的研究下他的简历，还能否体现出他对软件开发的热爱。我见过一些优秀的开发者甚至没有大学文凭，武断地判断可能会让你错失优秀的人，除非公司由于学历有明确的要求；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;最近几年频繁更换工作。这是一个危险的信号，求职者可能并不知道自己想要什么&lt;/strong&gt;。面试要规避的一个重要风险点就是求职者是否能和公司长期合作，因为招聘一个人对于公司或团队的成本是很高的，不仅是金钱、还有协作、培训、交接各种成本。对于刚毕业的那几年频繁换工作是可以理解的，因为每个人在职业生涯的初期阶段付出一些试错的成本是值得的，也是可以理解的；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;特点是吃苦耐劳或可接受高强度的加班&lt;/strong&gt;。如果你招的是"码农"或者体力工作者，这可能是一个优势，但我相信你不会希望你的团队里有这样的人；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;展示成绩而不是罗列项目&lt;/strong&gt;。我看过非常多的简历体现的都是做过什么而不是做成了什么，作为一个程序员，你应该说你主导了订单系统的设计而不是开发了订单系统，因为大部分情况下开发是整个团队的工作，你只做了其中的一部分而已；&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2、尊重应聘者"&gt;2、尊重应聘者&lt;/h3&gt;
&lt;p&gt;即便在应聘者做完自我介绍后你就已经判断他不合适，我也希望你将面试进行下去，也许在一定的程度是浪费了彼此的时间，但我觉得面试不仅是互相选择的过程，也是一种互相学习的过程，甚至在一定程度上你会积极地影响对方，给你和公司带来好的口碑。有多位面试者就曾跟我说过："我真的很感谢你，我从来都没有从这个角度去思考过这个问题..."，"我之前就意识到我在这方面存在不足，但是我都没有采取行动，我觉得现在是到了改变的时候了..."。还有应聘者和 HR 打听我的名字，说刚才面试我的人真的很好。我并不觉得自己因为指导了别人而洋洋自得，而是因为我从他们的身上看到了以前的自己，我也希望在职业发展的某个节点上能有人给我一些忠告或建议，这样的机会其实是很少的，我愿意这样去做，虽然我和他们未来可能没有任何交集。&lt;/p&gt;

&lt;p&gt;面试官经常犯的一个错误就是试图让应聘者接受自己的观点或者让对方觉得自己的观点是错的，其实完全没有必要做一个说服者，也没有必要以居高临下的姿态，大家没有什么不同，就是在互相选择，你只需要判断对方是否适合这个岗位，仅此而已。&lt;/p&gt;

&lt;p&gt;我还有几个面试行动值得借鉴：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提前看简历，不要问简历上已经有的答案&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;准时参加面试，迟到了要和应聘者道歉&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;让行政准备一杯水或者亲自代劳&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关注对方而不只是盯着电脑做笔记&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对来到公司参加面试表达感谢&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结束时主动握手，再次表达感谢，亲自送出公司&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3、你不需要套路"&gt;3、你不需要套路&lt;/h3&gt;
&lt;p&gt;面试是在有限的时间内判断一个人是否合适某个岗位，这就要求面试官的问题能问到"点"上，从而诞生了所谓的面试"套路"，通过所谓的某个问题让应聘者陷入其中，暴露出他的问题，从而乘胜追击，把对方"剥的"干干净净。我开始经常用这样的方式，也曾沾沾自喜过，就像猎物落入圈套一样，但其实这并没有让我发现多么优秀的人才，而是让我找出了更多"不合适"的人。后面我会反思：如果一个人因为最近半年没有看过任何技术类的书籍，我就认为他不是个爱学习的程序员么？这个结论看起来并不严谨。包括很多所谓的管理上使用的"套路"，也并不会让你在管理上获得多大的效果，因为没人愿意被套路，只要被识破，你的管理就无效了。我在后期带团队的时候就放弃了所谓的套路，只遵循一条原则——&lt;strong&gt;真诚地对待身边的人并让大家感受到你的真诚&lt;/strong&gt;。无论是招聘还是管理团队，真诚就是是最简单并且最有效的方法。&lt;/p&gt;
&lt;h3 id="4、互补而不是趋同"&gt;4、互补而不是趋同&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;物以类聚，人以群分，人的本性就是愿意和自己相似的人走的更近，大部分团队通常会往这个方向演进，这个是抑制高质量决策和创新的一大隐患&lt;/strong&gt;。在合适的阶段招一些"鲶鱼"放入团队是非常有必要的，可以有效的激发团队的活力，但这对面试官是一个很大的考验，你很容易因为对方和你观点不同而拒绝掉对方，你甚至都难以发现，因为你可能从来没有理性的对待面试中的分歧。&lt;/p&gt;
&lt;h3 id="5、如果犹豫，那么放弃"&gt;5、如果犹豫，那么放弃&lt;/h3&gt;
&lt;p&gt;我个人坚持的一个观点就是：&lt;strong&gt;如果你对应聘者是否适合这个岗位而犹豫不决，那么你就应该放弃了&lt;/strong&gt;。首先，真正优秀的人是你急切盼望一起合作的，你唯一需要想的事情就是怎么吸纳他加入你的团队；其次，"试一下"的成本是很高的，辞退一个人的心理障碍是远大于招人的，尤其是对不成熟的管理者。&lt;/p&gt;
&lt;h3 id="6、如何面试比你高阶的人"&gt;6、如何面试比你高阶的人&lt;/h3&gt;
&lt;p&gt;我曾一度很紧张，因为所面试的人是某些大公司的架构师、技术 leader、创业公司的 CTO，我怕自己问的问题会让对方觉得很白痴，从而质疑公司的人才密度和技术水平，但我现在反而很期待能和这样的人面试，哪怕我觉得对方不太可能加入我们的团队，我也想认识对方、了解对方。和高阶的人才面试是非常宝贵的机会，你应该感到兴奋。&lt;strong&gt;我强烈建议你提前花一个小时的时间认真的分析简历，从 HR 口中获得更多的信息，准备一些好问题，优秀的人总是可以用很简单的语言表达出一个复杂的概念或理论，这是一个检验他的机会，也是你学习的机会。不要怕暴露自己的无知，假装自己很强大通常更容易翻车&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="7、面试最重要的目的是识别风险"&gt;7、面试最重要的目的是识别风险&lt;/h3&gt;
&lt;p&gt;面试最重要的目的不是把人招到么？我认为不是。招人是一件容易的事情，难的是对方能否留下来和公司长期合作，这里面最要管控的就是风险。想象一下，如果你招聘了一个高管或核心系统的高级技术，但是对方待了一个月就走了，我想你团队中的人感受不会太好。那么我们需要如何识别会存在哪些风险呢？我会介绍一些通用的问题，可以有效地帮助你发现潜在的风险，更好地帮助你判断。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;为什么从上家公司离职&lt;/strong&gt;？对方可能会说自己以前的领导是傻逼，那你可要注意了，他入职后可能也会觉得你是傻逼。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;为什么要加入我们公司？你对我们公司有哪些了解&lt;/strong&gt;？你很难相信会有人回答："我不知道，你能给我介绍下么？"，还有人会说："我觉得教育行业非常有发展前景"，我会问："那你知道我们公司融资到第几轮了么？"，很多人也是回答不上来的。大多数人只是看重了这份工作的薪水或者搭上快车期望赚一把而已，并不在乎公司做的是什么，在公司遇到困难的时候就马上退出也就不奇怪了。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;你目前住哪里？通勤要多久&lt;/strong&gt;？如果一个员工上下班的通勤时间要花费 4 个小时，你要考虑下公司是否有租房或者打车的福利，不然你会担心对方连续几天加班后的心情以及安全问题。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;如果你加入公司会带来什么样的价值&lt;/strong&gt;？问题不在于你是否能带来多大的价值，而是对方是否想过这个问题。我希望我们是一起来做一份事业或做成一件什么事情，而不是引入一个先进的流程或写多少代码。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;你期望从公司获得什么&lt;/strong&gt;？你可能会觉得如果对方说想要获得一份满意的薪水是一个坏答案，我反而觉得是一个好答案，因为这让问题变得极其简单，如果在公司的预算内，这个交易就达成了，职业的底层逻辑就是等价交换。如果对方期望实践高并发、大流量的技术挑战，而你目前的用户数量还停留在 6 位数，哪怕对方再优秀，你也只能放弃了，千万不要说谎，这是对面试者的要求，也是对企业的要求。不过我建议你可以再深入问下：你为什么希望有这样的挑战？有可能对方并没有想过这个问题，最好能挖掘出他的底层诉求，可能最终能达成交易。你不得不面对现实，在创业公司，你能且仅能招到满足当前发展需要的人才，更高级的人才很可能是需要 CEO 出面去引进的。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="8、缺点易现，亮点难得"&gt;8、缺点易现，亮点难得&lt;/h3&gt;
&lt;p&gt;我曾经给 HR 推荐了不少的产品经理和开发人员，但大多数都倒在了 HR 的初面上，我得到的反馈结果是某项"通用胜任力"太差，比如沟通能力、学习能力、反思能力等。我起初并不确定具备"通用胜任力"的人是否会在岗位上展现出过人的价值，也尝试用这种方式去筛选面试者，但根据实践的结果看，我们所筛选出的所谓通用胜任力很好的人在工作上的表现都是平庸之辈。难道各方面能力都很好的人不是我们所期望的么？一定是，只是这样的人属于稀有物种。当你期望去找这样的人的时候，你通常会偏离目标，你的潜意识会让你觉得：各方面都还不错的人比某一方面特别强但是其他方面有明显问题的人更符合你的期望。比如你认为他的学习能力特别强，所以经验少一些或技术差一点是可以培养的，你相信他会很快适应岗位，但很多情况下，这只是不切实际的幻想而已。你如何通过面试的一个钟头里花几分钟判断一个人的学习能力呢？公司的业务会给这个新人多少时间去试错呢？&lt;/p&gt;

&lt;p&gt;有研究表明：一个人在一个领域里面要超过 80% 的人只需要投入 20% 的时间甚至更少就足够了，这就意味着一个人在各方面超越一般的人是不需要投入太多的精力的，但是企业需要的是在某个领域里面的那 20% 的精英，这些精英会投入 80% 的时间在自己的专业领域里耕耘，当你发现这样的人才，会因为他沟通能力差就放弃么？我觉得是很可惜的。项目管理中最核心的理念就是管理风险，其实对人的管理也是一样，你没有办法做到规避一切风险，你要做的是容忍那些你可以控制的风险。让技术人员有产品意识，让产品经理有技术思维我觉得是很可笑的一件事情，就像你期望电饭煲除了能蒸出香喷喷的米饭又能熬汤，希望煲汤的砂锅还能蒸出柴火味的米饭，那你为啥不买一个最做出最美味的米饭的电饭煲和熬出最美味的汤的砂锅呢？分工带来的效率就是你能把一件事情做到极致，否则只能是平庸而已。你不能因为招了一个不靠谱的产品经理，所以要求开发具备产品思维，两个团队就会陷入内耗，互相指责，对员工和公司带来的伤害不可估量。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;如果一个面试者在专业技能上有特别好的一个亮点，而管理者又能规避缺点带来的影响，这样的人是不应该放弃的，应该大胆用。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="结语"&gt;结语&lt;/h2&gt;
&lt;p&gt;我觉得企业招人应该像是找"老婆"而不是"女朋友"，女朋友会因为你没钱离开你，你老婆可能还会坚持一下，"离婚"也是不得已的选择。不过现实最残酷的地方是企业像男人一样都会变成三类人：一类是你认为他是绩优股，结果却是个垃圾股；一类是他成了"凤凰男"，却对你始乱终弃；还有一类是特别有钱的花花公子，根本不想和你结婚，你却抱有不缺实际的幻想。所以你要做的就是一个独立的"女性"，找"男朋友"的时候要擦亮眼睛。&lt;/p&gt;

&lt;p&gt;招人不是一项容易的工作，我见过一些团队的管理者是很反感去参与面试的，认为会浪费自己大量的时间，我是持不同看法的，公司授权将面试的工作交给管理者是要付出很大代价的，这会影响到公司的声誉（有多少人在社交网络上骂面试官你就知道了，甚至到打官司的地步）、招错人的成本也是企业来负担的。而你在面试的过程中付出的是时间，获得的不仅是如何学习提出一些好问题、结交优秀的人、给团队赋能，还可以让自己自我审视：我离优秀的人还差了什么。&lt;strong&gt;我建议你不要错过这样的机会，认真面对每一份简历和每一场面试！&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;来源个人博客：&lt;a href="https://liuxingqi.com/articles/how-to-recruit/" rel="nofollow" target="_blank" title=""&gt;https://liuxingqi.com/articles/how-to-recruit/&lt;/a&gt; &lt;br&gt;
CSDN: &lt;a href="https://blog.csdn.net/weixin_52662236/article/details/115284147" rel="nofollow" target="_blank" title=""&gt;https://blog.csdn.net/weixin_52662236/article/details/115284147&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <author>jasonliu</author>
      <pubDate>Thu, 01 Apr 2021 19:26:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/41103</link>
      <guid>https://ruby-china.org/topics/41103</guid>
    </item>
    <item>
      <title>尝试翻译 ElasticSearch 官方文档</title>
      <description>&lt;p&gt;Elasticsearch 是一个非常强大的开源搜索引擎，工作中也经常用到，很多网站都使用 Elasticsearch 做搜索，包括 Stack Overflow，Github，Ruby-China 的搜索也是由 Elasticsearch 实现的。Elasticsearch 的官方文档写的非常好，简单易读，例子图示都很多，连我这种英语很烂的也能很快看得懂（我英语四级都考了 5 次才勉强过😓），如果你想学习 Elasticsearch，官方文档真的很值得细看。&lt;/p&gt;

&lt;p&gt;除了官方文档以外，Elasticsearch 的中文资料确实不多，网上也可以搜索到一些翻译，但大多数都不完整，而且版本比较旧，因此才有翻译官方文档的打算。翻译的过程中让我觉得很烦躁，Elasticsearch 的官方文档写的太细致了，任何一个很小的概念都会详细解释并带上实例，如果完整翻译，工作量也太大了，还不如去支援官方的中文站点，但在 github 上发现中文站点都好多年没更新了。因此我还是觉得翻译一些比较核心和常用的部分，包括搜索 API，查询 DSL，性能调优这些部分，因为发现工作中这些地方是用的最多的。因为工作比较忙，所以尽量保持每天更新一两节的样子，有兴趣的可以一起搞搞😄。&lt;/p&gt;

&lt;p&gt;再介绍两本书有关 Elasticsearch 的书，翻译成中文的书籍基本上就这两本了，一本是《Elasticsearch 服务器开发（第 2 版）》：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/47f99825dc11b5ba11bcbd92812a99c6.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;这本书讲的还是比较全面，入门书籍，不过有些地方翻译的是在拗口，也有些错误，如果不愿意读官方文档的，可以买这本书看看，否则就没有买的必要了。&lt;/p&gt;

&lt;p&gt;还有一本是《深入理解 ElasticSearch》，这本书讲的比较深入，包括了 Apache Lucene 的工作方式和 ElasticSearch 的工作机制，如果你不是需要深入的钻研 ElasticSearch，没有必要买这本书，而且 ElasticSearch 的更新是比较快的，都快出 5.0 了，所以这些书都不会介绍最新的特性，还是看官方文档好。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/cdcd2af78a623e6c75882b9162effd7c.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;附：&lt;/p&gt;

&lt;p&gt;Github 地址：&lt;a href="https://github.com/liuzxc/Elasticsearch_reference_cn" rel="nofollow" target="_blank"&gt;https://github.com/liuzxc/Elasticsearch_reference_cn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ElasticSearch 官方文档：&lt;a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html" rel="nofollow" target="_blank"&gt;https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html&lt;/a&gt;&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Tue, 05 Jul 2016 22:53:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/30459</link>
      <guid>https://ruby-china.org/topics/30459</guid>
    </item>
    <item>
      <title>Rails－ 让我欢喜让我忧！</title>
      <description>&lt;p&gt;从 12 年毕业到现在，前前后后经历了 2 个 rails 项目，从机缘巧合接触 ruby，到专职从事 rails 开发，再到暂时告别 rails，我有太多的感触。我见过有人把 rails 视作神兵利器，也见过有人将其视作花拳绣腿，而我从来不愿意参与这些口舌之争，我只觉得写 rails 挺开心，这就足够了。但是悲催的是，我所经历的 rails 项目，都让我觉得非常郁闷！&lt;/p&gt;

&lt;p&gt;都说幸福的人都一样，不幸的人各有各的不幸！但是不幸的 rails 代码大多数都是相同的。&lt;/p&gt;
&lt;h3 id="不幸之一：Fat View, Fat Controller"&gt;不幸之一：Fat View, Fat Controller&lt;/h3&gt;
&lt;p&gt;Rails 采用了 MVC 的架构：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model: 处理数据及业务逻辑&lt;/li&gt;
&lt;li&gt;Controller: 处理 web 请求，是模型层和视图层沟通的桥梁 &lt;/li&gt;
&lt;li&gt;View: 向浏览器提供数据，显示用户界面&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;rails 社区一直推荐 fat model, thin controller (也有人持不同意见)。与数据库查询和业务逻辑相关的均会放在 model 层，视图层根据请求的参数选择合适的模型并向视图层返回数据，而视图层只根据接受的数据渲染页面。但我见过很多人把业务逻辑放在 controller，动不动就是几百行代码，视图层还掺杂着数据库操作，erb 模版已经够混乱了，再加上各种 where, find_by...... 欲哭无泪啊！而这还不是问题的关键，关键是 Fat View, Fat Controller 会导致代码难以测试（咋们就不追求啥 BDD 了，有这个问题的基本上都不会有测试）。视图层的代码会根据请求参数的不同输出不同的结果，本身测试就很麻烦，如果再掺杂业务逻辑（数据库操作，异步任务，第三方接口调用等），测试复杂度急剧上升，所以很多的开源项目都会放弃控制层的测试，前提是控制层的代码简单的不需要测试，因为它本身就是处理请求的，不是处理业务的。&lt;/p&gt;
&lt;h4 id="不幸之二：没有测试用例"&gt;不幸之二：没有测试用例&lt;/h4&gt;
&lt;p&gt;如果有前面的不幸，这个不幸必然发生。曾经有位技术总监面试我的时候跟我说：“我看你以前有持续集成相关的工作经验，我希望你加入公司以后，可以帮助项目搭建一套 CI 系统...... ”当我从 gitlab 克隆下代码，翻开 rspec 目录一看——空空如也！心中直呼：臣妾做不到啊！！！&lt;/p&gt;

&lt;p&gt;可以弥补测试用例的前提是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;没有犯第一个错误，或者说是犯的还不是很严重；&lt;/li&gt;
&lt;li&gt;项目还处于萌芽期。高速成长的项目不会给你时间去填补以前的坑，弥补测试用例或多或少都会涉及到重构某些方法，而重构本身就回有引入 bug 的风险，尤其是对本身就没有测试用例的方法进行重构，风险还会增加。稳定的项目也不值得去弥补缺失的测试用例，最好保证新添加的特性没有问题。&lt;/li&gt;
&lt;li&gt;说服你的同事，我觉得这个是最难的。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;其实没有测试用例的最大痛苦在于，明明代码写的很烂，你却不敢动！！！&lt;/p&gt;
&lt;h4 id="不幸之三：没有 code review"&gt;不幸之三：没有 code review&lt;/h4&gt;
&lt;p&gt;个人觉得要远离没有 code review 的公司，是否有 code review 并不是某个人或某个团队可以决定的，通常是一家公司的风格，价值观所决定的，如果开发者本身连研发的时间都不能自己评估和决定，还怎么去保证质量呢。ruby 本身做为一门动态语言，自由度灵活度都很高，我见过把 ruby 写的像 C 语言一样的。如果你待的 ruby 团队没有 code review，建议你早点离职，因为最后离职的人总是最痛苦的，他要接下所有人留下的烂摊子。&lt;/p&gt;
&lt;h4 id="不幸之四：过度依赖或滥用 gem 包"&gt;不幸之四：过度依赖或滥用 gem 包&lt;/h4&gt;
&lt;p&gt;gem 包的好处显而易见，它可以极大的加快你的开发进程。登录认证用 Devise，权限管理 Cancancan，样式用 Bootstrap，部署用 Capistrano...... 在开发一个功能的时候，你首先会想是否有现成的 gem 包实现这个功能。这很正常，我也是这样，不去重复去发明轮子。但是在用一个 gem 之前，至少要看几个指标：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;start 数够不够多（个人觉得最低不得少于 50）&lt;/li&gt;
&lt;li&gt;更新是否频繁（如果超过一年都没有更新，提的 issue 也没有人处理，最好慎用）&lt;/li&gt;
&lt;li&gt;文档是否齐全&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;有人会说，我的 Gemfile 里面只加了 20 个 gem 包啊，也没多少啊！但每个 gem 包本身会依赖于其它的 gem，rails 本身也会默认使用很多 gem 包，实际上你安装的 gem 包数量会超过 100 个，甚至 200 个都有可能。这么多的 gem 包不仅占内存，导致启动慢，有的 gem 包也会有内存泄漏的风险。我也见过有人自己写了个 gem 包直接在项目上用，我鼓励这样做，但是自己的写的 gem 包至少有基本的容错处理，异常处理吧。&lt;/p&gt;
&lt;h4 id="小结"&gt;小结&lt;/h4&gt;
&lt;p&gt;Rails 上手的门槛真的很低，我见过非科班出身，做产品，做设计的用 rails 写应用，写的还不错，但我也见过一些有经验的程序员，使用了一两年的 rails，依然写的马马虎虎。这不奇怪，有些人是真的对此感兴趣，有的人是因为“工作需要”而已。很高兴的是，有越来越多的公司开始使用 ruby，很担忧的是，随着越来越多的人接触到 ruby 和 rails，他们可能会被一些不良代码“吓倒“，从此脱离 rails。从头写一个项目的机会是很难得的，如果你有机会从头开始写一个 rails 项目，我希望你可以了解一些 rails 的最佳实践或者绕过一些”坑“。&lt;/p&gt;

&lt;p&gt;强烈推荐一篇文章：&lt;a href="https://www.toptal.com/ruby-on-rails/top-10-mistakes-that-rails-programmers-make" rel="nofollow" target="_blank" title=""&gt;top-10-mistakes-that-rails-programmers-make&lt;/a&gt;
译文&lt;a href="http://liuzxc.github.io/articles/rails-common-mistakes/" rel="nofollow" target="_blank" title=""&gt;10 个最常见的 Rails 编程错误&lt;/a&gt;(很久之前翻译的，英文水平有限，见谅！）&lt;/p&gt;

&lt;p&gt;这篇文章最经典的一句话是： &lt;strong&gt;rails 很好用，但是也很容易被滥用！&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;我所遇到的问题在这篇文章都有提到，希望对即将踏上 rails 之旅的伙伴有所帮助！&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Tue, 15 Mar 2016 00:32:03 +0800</pubDate>
      <link>https://ruby-china.org/topics/29336</link>
      <guid>https://ruby-china.org/topics/29336</guid>
    </item>
    <item>
      <title>如何分辨请求来自于 Web 端还是 App 端？</title>
      <description>&lt;p&gt;目前在开发一个功能，需要针对 web 端和 App 端的请求分别作处理，来自 App 端的请求要跳过某些验证，目前的方案是在 http header 或者 url 带上个参数，有这个参数的表示是 web 端来的请求，需要进行验证，但是感觉这种方式太安全了，有种此地无银三百两的感觉。大家有没有什么好的方案？想请教一下。&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Fri, 20 Nov 2015 14:31:59 +0800</pubDate>
      <link>https://ruby-china.org/topics/28129</link>
      <guid>https://ruby-china.org/topics/28129</guid>
    </item>
    <item>
      <title>如何设计登录错三次之后才输入验证码？</title>
      <description>&lt;p&gt;目前在做一个登录验证码的功能，ruby-china 是登录的时候就显示验证码，但是我要做的是登录错三次才显示验证码，我的设计思路是在登录的时候，如果密码验证错误，&lt;code&gt;session["login_filed"] += 1&lt;/code&gt;, 如果超过三次就让客户端拉验证码，用户成功登录之后就把 session 清除掉，大家觉得这样的设计有没有什么问题？有没有更好一些的方案？&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Mon, 16 Nov 2015 19:25:20 +0800</pubDate>
      <link>https://ruby-china.org/topics/28078</link>
      <guid>https://ruby-china.org/topics/28078</guid>
    </item>
    <item>
      <title>关于给一些接口添加验证码的问题</title>
      <description>&lt;p&gt;我想给一些接口添加验证码，验证码的生成和校验都在服务端，客户端只需要通过服务器提供的接口获取验证码，比如登录，注册接口，用户登错超过 5 次需要填写验证码，而注册一开始就要有验证码，那服务器如何去控制这个次数，我的想法是通过 redis 来记录，但是服务器如何控制知否应该给客户端验证码呢？没有做过这类的功能，希望有经验的伙伴可以指点一下，非常感谢！&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Fri, 13 Nov 2015 15:35:13 +0800</pubDate>
      <link>https://ruby-china.org/topics/28051</link>
      <guid>https://ruby-china.org/topics/28051</guid>
    </item>
    <item>
      <title>Ruby 程序员如何理解 Python 中的一些概念</title>
      <description>&lt;p&gt;不知道社区里面有没有做过 python 的小伙伴，最近转 python，本来以为 ruby 转 python 会比较容易，但实际操作起来还是遇到了一些困难，有些概念理解不是很清楚，例如：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;python 的装饰器。我发现装饰器在 python 中应用的非常之广泛，类方法都要通过装饰器实现，这让我感觉很奇怪，个人觉得装饰器就是在执行函数之前去执行装饰器中的代码，不太理解 python 中为什么会用这么多。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;静态方法和类方法。ruby 中静态方法和类方法是等价的，但是 python 中二者的概念却不一样，不知道为什么要这样设计？&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;希望有经验的大牛可以指点一下，非常感谢！&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Thu, 12 Nov 2015 08:54:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/28031</link>
      <guid>https://ruby-china.org/topics/28031</guid>
    </item>
    <item>
      <title>在 MySQL 里如何存储图书的标签信息？</title>
      <description>&lt;p&gt;一个用户可以收藏很多的书籍，但是每本书籍都有不同的标签（一个或者很多个），需要列出用户的所有标签以及当前的热门标签，如何在 mysql 里存储标签信息呢，是只用一个单独的字段存储还是单独创建一张表去存储？&lt;/p&gt;

&lt;p&gt;希望有相关经验的可以指点一下？&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Sun, 18 Oct 2015 17:31:44 +0800</pubDate>
      <link>https://ruby-china.org/topics/27712</link>
      <guid>https://ruby-china.org/topics/27712</guid>
    </item>
    <item>
      <title>为什么 Python 没有 ruby-china 这样的论坛？</title>
      <description>&lt;p&gt;最近因为工作需要要转 python，python 也有 Django 这样有名的 web 框架，但是为什么也没有个像样点的论坛呢？看了下 &lt;a href="http://python-china.org/" rel="nofollow" target="_blank" title=""&gt;python-china&lt;/a&gt;，这个和 ruby-china 差远了吧，其他的 python 论坛都是满屏闪广告，实在看不下去，记得以前 ruby-china 也有 python-china 的链接啊，怎么现在没有了？&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Sat, 17 Oct 2015 23:51:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/27710</link>
      <guid>https://ruby-china.org/topics/27710</guid>
    </item>
    <item>
      <title>如何评估或计算某些 Redis 数据的内存占用量？</title>
      <description>&lt;p&gt;我搭建了一个中心服，不同服务器的数据都会发送到中心服进行计算和存储，主要是用于全服排行这样的需求，为了满足实时性和高效性，我采用了 redis，大量使用了哈希和有序集合这样的数据结构去存储用户的数据，随着用户数量的增长，我如何去有效评估内存的使用量，从而合理设置内存大小，避免数据量过大导致内存溢出？&lt;/p&gt;

&lt;p&gt;不知道大家有没有相关的实战经验，若能指点一二，不胜感激！！！&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Thu, 08 Oct 2015 15:48:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/27583</link>
      <guid>https://ruby-china.org/topics/27583</guid>
    </item>
    <item>
      <title>使用 Turbolinks 实现网页进度条</title>
      <description>&lt;p&gt;之前在 Ruby-China 上遇到一些朋友在询问怎么实现网页进度条，我看了下没怎么深究，这次在做 GitHub 账户登录的过程中碰到一个问题：由于认证过程会发送几次 http 请求，点击登录按钮之后发现没有任何反应，过几秒之后才会进入登录状态，开始还以为是按钮不起作用，这样的体验是非常不好的，我们希望有个进度条能够显示当前请求的进度，幸运的是，Rails 自带了 gem 包可以帮助实现这个功能，那就是 turbolinks。&lt;/p&gt;

&lt;p&gt;turbolinks 的主要作用是为了加速页面渲染，进度条功能只是它提供的功能之一。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/rails/turbolinks" rel="nofollow" target="_blank" title=""&gt;turbolinks&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;如果 turbolinks 3 正式发布之后（目前还是开发版本），也许我这篇文章就没有什么作用了，因为版本 3 已经默认进度条功能是开启状态，如果用的是 turbolinks 3 之前的版本，你只需要做简单的配置，只需要一行代码：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#app/assets/javascripts/application.js
Turbolinks.enableProgressBar();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;该行代码的意思是打开 Turbolinks 的进度条功能，当重新点击网站页面的时候，进度条就会出现，超 easy！&lt;/p&gt;

&lt;p&gt;&lt;img src="http://zippy.gfycat.com/IncomparableDeadlyArctichare.gif" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;如果想定制进度条的外观，可以通过 CSS 来实现：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#app/assets/stylesheets/application.scss
html.turbolinks-progress-bar::before {
  background-color: red !important;
  height: 5px !important;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后点击网站页面，进度条变成红色，并且宽度增加：&lt;/p&gt;

&lt;p&gt;&lt;img src="http://zippy.gfycat.com/AdeptGranularArmyant.gif" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;是不是很简单😄，建议多阅读官方的文档，可以了解到 turbolinks 的更多功能。&lt;/p&gt;

&lt;p&gt;转自我的博客：&lt;a href="http://liuzxc.github.io/articles/" rel="nofollow" target="_blank" title=""&gt;http://liuzxc.github.io/articles/&lt;/a&gt;&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Wed, 09 Sep 2015 00:10:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/27245</link>
      <guid>https://ruby-china.org/topics/27245</guid>
    </item>
    <item>
      <title>初次尝试用 Rails 做一个网站</title>
      <description>&lt;p&gt;从初次接触 Ruby 到现在已经有两年多的时间了，做过持续集成的项目，也做过游戏后端开发，主要是写脚本，工具以及 API，但是从来没有真正的用 Rails 做过网站。最开始的时候有过尝试，从 Rails Guide 的 blog 示例，到《Head First Rails》，再到《Agile Web Development with Rails》，这些书我都看完过，也敲过代码，但是过段时间之后会发现，这些知识不属于自己，总是很容易遗忘。而真正的困难在于——我是做后端开发的，对前端的知识很贫乏，每次做出的 Demo 都丑陋无比，这严重的打击了我的自信心。如果不会前端的知识，你很难说自己是一个合格的 Rails 程序员，而前端的技术栈真心让我心生畏惧，HTML，CSS，Ajax，Javascript，jQuery，Coffeescript...，还有好几个流行的前端框架，比如 Twitter Bootstrap，这其中的任何一样你都可以在网上搜到一堆教科书。我尝试过从 HTML 学起，可惜坚持了几天之后就受不了了，因为很枯燥，很没有成就感，看着看着就昏昏欲睡... 因此我想写一个网站的计划一直都没有真正开始过。
        在 8 月底的时候，我发现公司的很多新项目都在开始使用 MongoDB，为了跟上步伐，我也开始打算学，想来想去最有效的办法就是用 Rails 写个 Demo，数据库用 MongoDB。有意思的是，我一开始只是想实现最简单的增删改查操作，却慢慢的变成了一个博客，随着功能的堆积，然后变成了一个论坛，而前前后后也只花了一个多周的时间，用的还是业余时间。网站目前的效果是这样：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/f33059fe96503d674eb5bc2f7e14a770.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;最近看到有不少刚接触 Rails 的人在问怎么用 Rails 做一个网站，作为一个新手，我自己总结了一些经验：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;开始动手做是最重要的，不要只抱着书看，看 100 遍还是不会；&lt;/li&gt;
&lt;li&gt;不要等到熟悉一切在去做，比如前端的技术栈很深，任何一项都要花很多时间才能熟悉，更别说精通了，你不可能在用 Rails 之前把 Ruby 和 Javascript 两门语言都学通，你实际用到的其实都是一些相对简单的东西，没有那么复杂，可以等到后面再由浅入深。&lt;/li&gt;
&lt;li&gt;记录下你实现每个小的功能点的过程，即写博客，如果你能完整描述功能的具体实现过程，那么说明你已经大概掌握了这个知识点，如果描述的过程中有不明白的地方，还需要巩固，否则这些知识还是不属于你。&lt;/li&gt;
&lt;li&gt;要克服自己的畏惧心理，有些东西没有你想的那么难，就算很难，还可以求助 Ruby-China 和 Stackoverflow。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;目前我这个 Demo 还是比较粗躁，最大的问题主要是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;没有单元测试用例；&lt;/li&gt;
&lt;li&gt;只关注了功能的实现，没有关注性能；&lt;/li&gt;
&lt;li&gt;还是很难看，哈哈&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;之后我会一直改进，希望大牛们可以多提意见，新手们和我一起学习交流（不好的地方就不要学了😄）。
项目链接：&lt;a href="https://github.com/liuzxc/mongo_project" rel="nofollow" target="_blank" title=""&gt;https://github.com/liuzxc/mongo_project&lt;/a&gt;&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Mon, 07 Sep 2015 01:25:03 +0800</pubDate>
      <link>https://ruby-china.org/topics/27218</link>
      <guid>https://ruby-china.org/topics/27218</guid>
    </item>
    <item>
      <title>Rails 有没有什么好的办法查询汇率或着计算货币兑换</title>
      <description>&lt;p&gt;目前项目要做个小功能，需要根据国家把价格 (美元) 转换成其他币种，比如美元转人民币，欧元，卢布，日元等，所以需要知道当时的汇率。&lt;/p&gt;

&lt;p&gt;我试了下 &lt;code&gt;number_to_currency&lt;/code&gt; 似乎不起作用&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;rb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mi"&gt;082&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;number_to_currency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;locale: :fr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"$100.00"&lt;/span&gt;
&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mi"&gt;083&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;number_to_currency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;locale: :ru&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"$100.00"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我看 github 上有些 gem 包可以实现，但是为了很小的一个功能装个 gem 包不太划算，大家有没有什么好的主意，不使用 gem 包来实现这个功能？&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Tue, 07 Jul 2015 14:53:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/26366</link>
      <guid>https://ruby-china.org/topics/26366</guid>
    </item>
    <item>
      <title>Java 有没有像 ruby-china 这样的社区？</title>
      <description>&lt;p&gt;在大学的时候一直以 Java 为主，出来工作好几年了却一直没有在实际工作中用过 Java，现在想回头熟悉一下，平时遇到问 ruby 相关的问题的时候，来 ruby－china 基本上都可以有所收获，社区各方面的资源也挺丰富，但是遇到 java 相关的问题，却找不到这样一个社区，只有 CSDN，什么 OPEN source 之类的网站，这些网站东西比较杂，满篇弹窗广告，找不到十分有价值的信息，不知道大家有没有什么推荐？&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Fri, 03 Jul 2015 13:44:24 +0800</pubDate>
      <link>https://ruby-china.org/topics/26310</link>
      <guid>https://ruby-china.org/topics/26310</guid>
    </item>
    <item>
      <title>咨询小公司网络配置方案</title>
      <description>&lt;p&gt;姐夫创业开了家公司，询问我网络配置的方案，虽然我是学软件的，但是对这个还真一窍不通，所以请教诸位有没有相关的经验传授一下。&lt;/p&gt;

&lt;p&gt;公司基本的情况：&lt;/p&gt;

&lt;p&gt;公司预计会有 30 名左右的员工，每人均会配备电脑，70-80 平方的办公面积（同一楼层），需满足日常的有线，无线上网，2-3 台打印机。&lt;/p&gt;

&lt;p&gt;请教一下比较经济可行的方案，需要购置什么样的服务器，路由器和交换机。&lt;/p&gt;

&lt;p&gt;补充一下，服务器上需要运行 OA，支持内网及外网访问，那就是不仅做 WEB，也要兼做 DB，同时处理的并发数能支撑 30 人左右即可。倾向于 IBM 或者 DELL 的 1U 服务器，2 块硬盘 raid1 形式使用。推荐二手的服务器。我也请不起网管。&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Wed, 17 Jun 2015 00:07:03 +0800</pubDate>
      <link>https://ruby-china.org/topics/26055</link>
      <guid>https://ruby-china.org/topics/26055</guid>
    </item>
    <item>
      <title>关于 Ruby 中 return 的一些疑问</title>
      <description>&lt;p&gt;在 ruby 中，return 的作用是从方法中返回一个或多个值，所以如果直接从块中 return 是会报错的：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;LocalJumpError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;unexpected&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果把块包裹在方法中就不会报错：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;a&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是从 Proc 和 lambda 中却可以使用 return:&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Proc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;#&amp;lt;Proc:0x007fb39408b0e8@(irb):6&amp;gt;&lt;/span&gt;
&lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;#&amp;lt;Proc:0x007fb39408dac8@(irb):7 (lambda)&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但 Proc 和 lambda 并不是方法啊，难道 Proc 和 lambda 中的 return 与方法中的 return 的含义是不同的么？&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Fri, 05 Jun 2015 19:01:10 +0800</pubDate>
      <link>https://ruby-china.org/topics/25907</link>
      <guid>https://ruby-china.org/topics/25907</guid>
    </item>
    <item>
      <title>关于 N+1 查询的问题</title>
      <description>&lt;p&gt;在项目中有时候会遇到 N＋1 问题，例如：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;clients&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;clients&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postcode&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;rails 提供了按需加载机制，可以避免这个问题：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;clients&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:address&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;clients&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postcode&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是如果在预加载的过程中，相关联的数据发生了变化，那读出来的数据会和数据库中的不一致，这个问题要如何解决呢？&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Fri, 05 Jun 2015 17:33:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/25906</link>
      <guid>https://ruby-china.org/topics/25906</guid>
    </item>
    <item>
      <title>各种编程语言的优缺点，对 Ruby 的评价挺高啊</title>
      <description>&lt;p&gt;翻译的挺幽默
&lt;a href="http://blog.jobbole.com/18587/" rel="nofollow" target="_blank"&gt;http://blog.jobbole.com/18587/&lt;/a&gt;&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Mon, 20 Apr 2015 16:15:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/25212</link>
      <guid>https://ruby-china.org/topics/25212</guid>
    </item>
    <item>
      <title>用 Jekyll 搭了个轻量级的博客玩玩</title>
      <description>&lt;p&gt;最近用&lt;a href="http://jekyllrb.com/" rel="nofollow" target="_blank" title=""&gt;Jekyll&lt;/a&gt;搭了个轻量级的博客&lt;a href="http://liuzxc.github.io/" rel="nofollow" target="_blank" title=""&gt;http://liuzxc.github.io/&lt;/a&gt;,引用了&lt;a href="https://github.com/mmistakes/so-simple-theme/" rel="nofollow" target="_blank" title=""&gt;so-simple-theme&lt;/a&gt;这个 jekyll 主题。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://jekyllthemes.org/" rel="nofollow" target="_blank" title=""&gt;http://jekyllthemes.org/&lt;/a&gt;,这个网址有很多 jekyll 的主题，你可以选个自己喜欢的。&lt;/p&gt;

&lt;p&gt;Jekyll 用起来很方便，但是有个让人很不爽的地方——不支持按&lt;code&gt;tags&lt;/code&gt;或&lt;code&gt;categories&lt;/code&gt;分页，这样导致的结果是如果你的博客过多，且有很多分类，这些博客不得不挤在一个页面上，既不好看又不方便查找，不知道官方什么时候才能支持这个功能。。。。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
Pagination does not support tags or categories
Pagination pages through every post in the posts variable regardless of variables defined in the YAML Front Matter of each. It does not currently allow paging over groups of posts linked by a common tag or category. It cannot include any collection of documents because it is restricted to posts.
&lt;/code&gt;&lt;/p&gt;</description>
      <author>jasonliu</author>
      <pubDate>Wed, 01 Apr 2015 11:29:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/24946</link>
      <guid>https://ruby-china.org/topics/24946</guid>
    </item>
  </channel>
</rss>
