<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>mojidong (mojidong)</title>
    <link>https://ruby-china.org/mojidong</link>
    <description>在拖延剁手啊~~~~</description>
    <language>en-us</language>
    <item>
      <title>‘DevOps’ 是如何伤害一个开发者的</title>
      <description>&lt;p&gt;转载：&lt;a href="http://www.oschina.net/translate/how-devops-is-killing-the-developer" rel="nofollow" target="_blank"&gt;http://www.oschina.net/translate/how-devops-is-killing-the-developer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;最近有两个趋势我真的很讨厌：DevOps 及“全栈”开发者的概念。随着 DevOps 运动越来越受欢迎我越发讨厌 x86 架构和单内核。但确实如此：我受不了。是什么引发我的痛苦呢？这是原因：不是每一个公司都刚起步，那怎么还要每个公司都必须表现得像它们的经历一样。&lt;/p&gt;
&lt;h2 id="DevOps"&gt;DevOps&lt;/h2&gt;
&lt;p&gt;“DevOps”用来表示密切地协作，将之前纯粹的开发者、纯粹的操作者以及纯粹的 QA 的角色内容进行穿插。因为软件需要以不断加快的速度释放出来，老的开发 - 测试 - 发布的“瀑布”型周期被打破了。开发者还必须为测试及发布环境的质量责任。&lt;/p&gt;

&lt;p&gt;“开发者”（这个词是否适当有待商榷）越来越广的责任范围导致了对联合体求职者的需求：“全栈”开发者。这样的开发者能够做开发工作，是 QA 团队的成员，能够进行业务分析，做系统管理员和 DBA。在你指责我夸张前回头再看下这个列表。列表中有你不希望“全栈”开发者精通的吗？
这些概念是从哪来的呢？初创公司，对（以及敏捷方法）。初创公司初起时奇形怪状，需要以一种艰苦的方式撑过最初的几年。对此我不否认。但不幸的是，初创公司的工程师承担了多种技术角色，被迫在缺乏一系列最基本能力的情况下承担“开发者”的角色。&lt;/p&gt;
&lt;h2 id="身兼多职"&gt;身兼多职&lt;/h2&gt;
&lt;p&gt;想象你在一家初创公司，开发团队共有 7 人。你已经开发了一年某个 web 应用，现在看起来像模像样，一切顺利，但是在保持正常运转这方面却往往是令人抓狂的混乱。如果有一个特别麻烦的问题，需要深度研究数据库，你可没有权力说“这不是我的专长”，然后交给 DBA 团队处理。 &lt;strong&gt;条件所限&lt;/strong&gt; ，你不得不承担起 DBA 的工作，自己解决这个问题。
现在把这个情景扩展到之前列出的所有职位吧。一个初创公司的开发者可能同时担任开发，QA，部署/操作分析员，系统管理员，还有 DBA。初创公司天然如此，而有些人会特别适合这种环境。然而，不知从什么时候起，我们开始自欺欺人说自己适合；因为在任何时候，一个初创公司的开发者不得不身兼多职，他/她还必须一下子担任所有这些角色。&lt;/p&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;好的开发者都是聪明人。我知道我这么说肯定会被拍，但一个组织里的技术人员还是有一个重要程度的层次区别的。最顶层是开发，接下来是系统管理员和 DBA。QA 团队，“操作员”之类，发布管理员等等角色处于阶级的最底层。为什么是这么个顺序呢？
&lt;strong&gt;因为每个角色有能力做比它低的层次的所有工作。&lt;/strong&gt;
初创公司教会我们这个道理。如果需要，好的开发者也能当合格的 DBA。他们也能当不错的测试，“部署工程师”，或者其他什么形形色色的职位。他们的工作需要他们对更低层工作的领域也了如指掌。但这其中有一个问题，希望说到这里你也能看出来：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;反过来却行不通。&lt;/strong&gt;
QA 无法凑合当开发用，构建 (build) 工程师也做不了 DBA 的工作。他们不具备担任这些角色所必须的专业知识。这也没关系。无论你喜欢与否，每个组织里都有这种阶级层次，而成员的能力层次、技术水平也有所不同。尽管如此，你让开发去做其他工作，没有人能来替他做开发的工作！
举个例子能说得更清楚一些。我爸爸是一个开私人诊所的牙医。他雇了一个秘书，一个保健专家和一个牙医助理。在所谓的“牙医 Ops”环境下，我爸爸需要一边记录病人的预约，一边洗牙，同时还要挤出时间来给牙钻孔，实施根管治疗术，等等。我爸爸能做得了诊所里的其他工作，因为他具备这些工作所需的专业知识。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;但是其他人做不了他的工作，即使全加起来也不行。&lt;/strong&gt;
如果诊所要这么运转，牵涉到的所有人都会受到损害，（当然）除了雇员们。这场本意是希望提高软件质量的实验演变成了一场闹剧，最有才华的员工疲惫不堪（并且有价值的工作产出远远减少），而低层次的职位根本不存在。
这就是这个问题的关键所在。之前那些职位由不同能力层次的人分别担任，而“全栈”工程师使得这些职位没必要存在了。大公司非常喜欢这一点，因为这意味着它们可以远远减少雇佣人数，来完成同样的工作量。然而，在这个过程中，真正的开发在开发者工作所占的比例越来越小。这就是为什么我们会看到这么多的开发者通过不了 FizzBuzz：他们从来不用真正写任何代码。现在这个问题已经太普遍了，你能想象面试厨师时要问他，每天他有多少时间是真正用来烹饪的吗？&lt;/p&gt;
&lt;h2 id="什么都做过一点，什么都不精通"&gt;什么都做过一点，什么都不精通&lt;/h2&gt;
&lt;p&gt;如果你是一个有点规模的软件的开发者，你会需要一个能用的部署系统。考考你，马上说出以下系统各自的好处和坏处：Puppet，Chef，Salt，Ansible，Vagrant，Docker。现在实现你的部署解决方案吧！你恐怕都没有注意到，上面列出那些系统里有一项是完全无关的吧？
专业化是有原因的：人类能运用的知识有限。在任务之间切换，无疑是代价昂贵的。强迫开发者去承担其他专业人员的角色，意味着他们将：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;没有把时间花在开发上&lt;/li&gt;
&lt;li&gt;需要跟上一个极其庞大的知识领域&lt;/li&gt;
&lt;li&gt;会不堪重负&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;不仅如此，要强迫开发者接受“全栈”的任务，公司要付给雇员的工资远高于完成其中大部分任务的市场平均价格。如果一个开发者 1 年赚 100K，你可以雇 4 个 1 年 100k 的开发者来做一个两人的任务，50% 的时间做开发，50% 的时间做发布管理；或者，你也可以只雇一个发布管理员，花上大概 75k，然后两个开发者全职开发。更不用说兼职发布管理的开发者，在没有发布需要管理时浪费的时间了。&lt;/p&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;p&gt;原文：&lt;a href="http://jeffknupp.com/blog/2014/04/15/how-devops-is-killing-the-developer/" rel="nofollow" target="_blank" title=""&gt;How 'DevOps' is Killing the Developer&lt;/a&gt;&lt;/p&gt;</description>
      <author>mojidong</author>
      <pubDate>Thu, 17 Apr 2014 09:57:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/18653</link>
      <guid>https://ruby-china.org/topics/18653</guid>
    </item>
    <item>
      <title>全栈程序员最后难道是个悲剧！</title>
      <description>&lt;p&gt;转载 : &lt;a href="http://www.oschina.net/news/50110/what-happens-to-older-developers" rel="nofollow" target="_blank"&gt;http://www.oschina.net/news/50110/what-happens-to-older-developers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;长期从事编程活动的程序员都期望在 50 多岁时能爬到一个足够高的职位，或者能顺利的退休。&lt;/p&gt;

&lt;p&gt;但我在这里讨论的可能是一个你还没有想过的问题：如果到那时你失业了呢？&lt;/p&gt;

&lt;p&gt;50 多岁时你的职业仕途会成为一个问题。如果你有很好的技术，有人雇你，你会有一个很高的职衔，或你是一个专家，或有很好的人际关系，你都有可能找到一个新的职务。&lt;/p&gt;

&lt;p&gt;否则，你会从衣食无忧沦落为无家可归。这是真的。我 55 岁，我的简历会让你感觉非常优秀，10 年前我能挣到多达 100 万美元。现在我是一个流浪汉。我身体不是很好，没有医险，没有牙医。能找到的工作只是一些基本不需要技术的体力劳动，我也干不了。&lt;/p&gt;

&lt;p&gt;我在试着做家教。然而，这点钱基本上不够付燃气费的。一个行政助理公司的老总拒绝了我，他们只要有经验的。&lt;/p&gt;

&lt;p&gt;有两个人考虑让我去照料他们更老的亲属，但我没去。我去那里后将有一个职责是伺候拉屎撒尿。&lt;/p&gt;

&lt;p&gt;不希望你们也变成我这样。我能给你们的是我的一些建议：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;职场上往上爬，不要停。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;成为某一方面的专家——虽然保持足够宽的技术面也很重要，这样你才不会被淘汰。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;建立一个人际圈。扩大它。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;多样化你的投资。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;有工作时医疗保险一定要上，这方面不要出问题。如果你没了工作，没了钱，医疗保险也没有，这将会成为一个严重的问题。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;与人为善。但也不要犯傻。大部分你帮助过的人不会回报你。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;关于成为某一方面的专家，我在 2011 年做了一段招聘工作，我敢肯定，市场上并不太喜欢全才/通才技术人员。&lt;/p&gt;

&lt;p&gt;技术上我做全能选手做了 35 年。工作要求我这样。大部分任何项目只要来了我都做，包括任何类型的编程开发。互联网泡沫出现时，公司钱都花完了，我承担了所有的技术角色；IT，网站，开发，技术支持，文档编写，等等。所有工作我都会一点。&lt;/p&gt;

&lt;p&gt;后来，这些经历没有给我带来任何改变。很少有招聘启事上写“需要一个什么都会一点”的人。&lt;/p&gt;

&lt;p&gt;2003 年，互联网泡沫破灭时，我的持股收入有 1 百万美元。之后大部分都损失掉了，我只好重新到人才市场求职。这才认识到，招聘单位对大龄的技术通才需求并不多。&lt;/p&gt;

&lt;p&gt;就我个人的情况，有些事情跟你们不太一样，这是另外一个故事，下回再说。但如果你是一个技术通才，而且在中年失业，你很可能会遇到这样的情况：&lt;/p&gt;

&lt;p&gt;“有这样的经验阅历，你应该是一个 CTO 呀？为什么连个工作都没有？”&lt;/p&gt;

&lt;p&gt;他们会问你一下算法问题——你有 30 年没思考过的问题。或要求你进行编码考试——在这种不利的情况下你根本发挥不出特长。&lt;/p&gt;

&lt;p&gt;提早打算。人生不如意十有八九。&lt;/p&gt;

&lt;p&gt;这是我的简历：&lt;/p&gt;

&lt;p&gt;&lt;a href="http://oldcoder.org/general/misc/Kiraly_Resume.pdf" rel="nofollow" target="_blank"&gt;http://oldcoder.org/general/misc/Kiraly_Resume.pdf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Regards, Robert (the Old Coder)&lt;/p&gt;

&lt;p&gt;[英文原文：&lt;a href="http://christfollower.me/#D140313ADVICE" rel="nofollow" target="_blank" title=""&gt;What happens to older developers?&lt;/a&gt; ]&lt;/p&gt;</description>
      <author>mojidong</author>
      <pubDate>Thu, 27 Mar 2014 15:34:48 +0800</pubDate>
      <link>https://ruby-china.org/topics/18209</link>
      <guid>https://ruby-china.org/topics/18209</guid>
    </item>
    <item>
      <title>编辑完个人资料保存后跳转是不是可以改改</title>
      <description>&lt;p&gt;编辑完个人资料保存后转到首页，这个体验不好，是不是可以改改&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;保持在当前页&lt;/li&gt;
&lt;li&gt;跳转回之前过来的页面&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>mojidong</author>
      <pubDate>Mon, 10 Mar 2014 13:29:35 +0800</pubDate>
      <link>https://ruby-china.org/topics/17779</link>
      <guid>https://ruby-china.org/topics/17779</guid>
    </item>
    <item>
      <title>国产软件真强大</title>
      <description>&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/2013/67d3ad4bb82213fd0556f165bd244995.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;马上要成为 win 了&lt;/p&gt;</description>
      <author>mojidong</author>
      <pubDate>Tue, 17 Dec 2013 09:47:09 +0800</pubDate>
      <link>https://ruby-china.org/topics/16240</link>
      <guid>https://ruby-china.org/topics/16240</guid>
    </item>
    <item>
      <title>年底了大家注意防火防盗！</title>
      <description>&lt;p&gt;今天凌晨 5 点左右，发现阳台窗外有响动，本来以为风大被吹的，迷迷糊糊瞟了一眼窗帘，惊！窗帘压根就没动，窗户本来是开的有风窗帘肯定会动！&lt;/p&gt;

&lt;p&gt;起床来到阳台发现一个黑影居然在阳台一角边缘，正抓这我的一双鞋，哥当即大吼一声，小偷吓尿差点掉下去 (五楼)，他随即跳到楼道外面的空调机上进入楼道一溜烟跑没影了。。。眼看是追不上了。&lt;/p&gt;

&lt;p&gt;我赶紧回去检查看丢了什么结果 ip5 没了，其他东西都在。。。。rMBP 居然还在。。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;年底了小偷开始活跃了大家都注意，睡觉关好门窗保护好重要财物。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PS: 已经报过警了，警察已经取证过了说小偷比较专业戴手套作案没留下指纹，不过最后在窗边发现了几个指纹，要带回去比对。和警察叔叔闲聊的时候听他说最近好多盗窃事件，我隔壁就被盗过 2 次。。。&lt;/p&gt;</description>
      <author>mojidong</author>
      <pubDate>Thu, 28 Nov 2013 16:55:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/15865</link>
      <guid>https://ruby-china.org/topics/15865</guid>
    </item>
    <item>
      <title>如何解决数据库挂掉，其他不依赖数据库的功能依然可用？</title>
      <description>&lt;p&gt;controller 中&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;search&lt;/span&gt;
      &lt;span class="c1"&gt;# 搜索服务，solr，sphinx之类&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;login&lt;/span&gt;
     &lt;span class="c1"&gt;# 登陆，需要访问数据&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;数据库挂了，search 居然也不可用，这太不科学了，求解！&lt;/p&gt;</description>
      <author>mojidong</author>
      <pubDate>Thu, 16 May 2013 21:20:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/11044</link>
      <guid>https://ruby-china.org/topics/11044</guid>
    </item>
    <item>
      <title>gem source add 报错</title>
      <description>&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;rvm&lt;/span&gt; &lt;span class="n"&gt;pkg&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;zlib&lt;/span&gt;
&lt;span class="n"&gt;rvm&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="mf"&gt;1.9&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;zlib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sr"&gt;/home/use&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rvm&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;
&lt;span class="n"&gt;rvm&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="mf"&gt;1.9&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="ss"&gt;:/&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ruby&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;taobao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;

&lt;span class="n"&gt;直接报错&lt;/span&gt;
&lt;span class="sb"&gt;`require': cannot load such file -- zlib (LoadError)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为什么还是提示找不到 zlib&lt;/p&gt;</description>
      <author>mojidong</author>
      <pubDate>Tue, 24 Jul 2012 16:57:13 +0800</pubDate>
      <link>https://ruby-china.org/topics/4527</link>
      <guid>https://ruby-china.org/topics/4527</guid>
    </item>
  </channel>
</rss>
