<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[蒸汽与魔法 - Medium]]></title>
        <description><![CDATA[生命如此短暂，掌握技艺却要如此长久 - Medium]]></description>
        <link>https://xuwenhao.com?source=rss----107b35121b42---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>蒸汽与魔法 - Medium</title>
            <link>https://xuwenhao.com?source=rss----107b35121b42---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 10 Feb 2024 07:25:18 GMT</lastBuildDate>
        <atom:link href="https://xuwenhao.com/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Don’t Sleepwalking, Be a builder]]></title>
            <link>https://xuwenhao.com/dont-sleepwalking-be-a-builder-efa4b0ff85c1?source=rss----107b35121b42---4</link>
            <guid isPermaLink="false">https://medium.com/p/efa4b0ff85c1</guid>
            <dc:creator><![CDATA[Xu Wenhao]]></dc:creator>
            <pubDate>Wed, 01 Jan 2020 07:57:33 GMT</pubDate>
            <atom:updated>2020-01-01T07:56:08.438Z</atom:updated>
            <content:encoded><![CDATA[<p>2020年，听起来有点让人恍惚。今天早上在微博上看到，有人说上海世博会都已经过去10年了，吓了自己一跳。昨天晚上在朋友圈里，也有朋友说，似乎blog停更很久了。</p><p>2019年是特别忙碌的一年，有时候觉得自己简直是在蒙眼狂奔，无论是工作还是生活都发生了各种各样的变化。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Vk-bP5xKOZ4q-2EM3OqQkw.png" /><figcaption>You‘re sleepwalking</figcaption></figure><p>往年常常在元旦或者春节前都会留下一点完整的时间休整、梳理、乃至总结一下过去的一年。而今年似乎无时无刻都有干不完的事情，说实话，到了年底的这两天，多少有一些Burnout了。</p><p>2019年的的确确做了很多事情，有些已经看到了成效，有些还没有，还有一些虽然发生了各种各样的纠葛，但是多少也算解决得差不多了。</p><p>2019年最重要的一个决定，就是重新起了一个新的公司和产品D，也是今年投入时间最多的一件事情。比较幸运的是，这个业务终于找到了让自己能够感觉背靠背互相信任、沟通顺畅能够共同来解决问题的合伙人。当然，更重要的是业务上的专业性，让我这种原本比较“自大”的人产生了“这事儿我可以完全不关心细节”的放松感。虽然新的业务只能说刚刚起步，还只能说如履薄冰，不过的确终于找到那种长期共同奋斗，做成一点事情的感觉了。希望未来的10年里，能够和这个团队一起做成一些事情。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SudbukDrlH-On0MPALrm-w.png" /><figcaption>You are a builder</figcaption></figure><p>也因为这个新业务，除了5/1照常跑美国的F8之外，今年还去了几个东南亚国家。分别去了菲律宾、泰国、越南以及新加坡，以及接下来马上要去的印尼，不过飞了那么多地方，一个旅游景点都没去过，批发市场和仓库倒是跑了不少。</p><p>而对于2016年底开始启动的B产品，今年其实是蛰伏的一年，不过到了年底终于厘清了一些思路，也重整好了整个团队，同时也拿到了自己一直想要重点解决的一些支持和权限。在这个过程中，也产生了各种各样的纠葛，也得到了各种各样的帮助，特别是来自很多老朋友的帮助。明年应该是B产品可以发力的一年，希望团队能在我抽离的情况下，能给行业、客户和合作伙伴创造一些价值。</p><p>虽然整整一年半Blog都没有更新，但是其实文字并没有少写。按时把答应给极客时间的专栏交付了，到了年底一看，也算排上了十大新课的最后一名。比我自己开始设定的心里底线——不要是倒数第一名，还是强上了不少的。说实话有一半功劳要放在对接的编辑身上，如果没有人督促疯狂催稿改稿以及在Deadline前几小时交稿然后熬夜剪音频的情况下，这个事情肯定是完不成的。</p><p>不过回顾2019年，整体对自己还是不满意的。做了太多的事情，但是每件事情产出的质量其实并不够高。因为各种事情并发，Deadline特别多，很多时候为了赶上Deadline，只能对自己说“Done is better than perfect”。而大部分这些Deadline，如果回过头去看，都是一些短期目标，都是在清理Backlog，数量因素远远大于质量因素。大部分如果拉长时间周期来看，其实价值没有那么大。于是很多时间和精力都变成了“消耗”，而不是“积累”和“产出”。如果回过头来看的话，过去几年创业做的不好的地方，其实核心点也是在这一点上。而很多Burnout的感觉，也来自于此。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-8vZQuJSm8viDVrv10AwHw.png" /><figcaption>You need to build</figcaption></figure><p>2020年里，想在这一点上多做一些改变，少做一些事情，做好一些事情。少做一些不得不“应付”而做的事情，多做一些有价值的长期建设。归根到底，我对自己的期望，还是做一个Builder。</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=efa4b0ff85c1" width="1" height="1" alt=""><hr><p><a href="https://xuwenhao.com/dont-sleepwalking-be-a-builder-efa4b0ff85c1">Don’t Sleepwalking, Be a builder</a> was originally published in <a href="https://xuwenhao.com">蒸汽与魔法</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[如何（不靠运气）变得富有 - - 来自AngelList创办人的经验]]></title>
            <link>https://xuwenhao.com/%E5%A6%82%E6%9E%9C-%E4%B8%8D%E9%9D%A0%E8%BF%90%E6%B0%94-%E5%8F%98%E5%BE%97%E5%AF%8C%E6%9C%89-%E6%9D%A5%E8%87%AAangellist%E5%88%9B%E5%8A%9E%E4%BA%BA%E7%9A%84%E7%BB%8F%E9%AA%8C-aa9f64f5883e?source=rss----107b35121b42---4</link>
            <guid isPermaLink="false">https://medium.com/p/aa9f64f5883e</guid>
            <dc:creator><![CDATA[Xu Wenhao]]></dc:creator>
            <pubDate>Fri, 08 Jun 2018 14:34:31 GMT</pubDate>
            <atom:updated>2018-06-09T08:40:33.592Z</atom:updated>
            <content:encoded><![CDATA[<h3>如何（不靠运气）变得富有 — — 来自<a href="https://twitter.com/AngelList">AngelList</a>创办人的经验</h3><p>根据一些朋友的意见，做一下中英文对照</p><p>最近两天，<a href="https://twitter.com/AngelList">AngelList</a>的CEO，同时也是Twitter的天使投资人<a href="https://twitter.com/naval">Naval</a>在Twitter上的40条致富经推引起了一阵推文风暴，目前这些推文已经被转译成了数十种语言，并可能已经被30%以上的Twitter活跃用户看到了。经过Naval的同意，我把他转译成了中文，放在了推上，因为推特不能编辑和修订，而有些错别字和翻译值得推敲修订，我也一并放在这里，欢迎大家给出建议，我会根据建议做更适当的修订。</p><p>Twitter英文原链接<a href="https://twitter.com/naval/status/1002103360646823936">在此</a></p><p>我在推上的中文链接<a href="https://twitter.com/xuwenhao/status/1004759917427740672">在此</a></p><p>以下是原文和译文全文</p><p>How to Get Rich (without getting lucky):</p><p>如何（不靠运气）变得富有:</p><p>Seek wealth, not money or status. Wealth is having assets that earn while you sleep. Money is how we transfer time and wealth. Status is your place in the social hierarchy.</p><p>寻求财富，而不是钱或者身份。财富是拥有你在睡觉的时候都能挣钱的资产。钱是我们用来转移时间和财富的东西。身份是你在社会层级中所处的位置。</p><p>Understand that ethical wealth creation is possible. If you secretly despise wealth, it will elude you.</p><p>懂得创造道德的财富是可能的。如果你暗地里轻视财富，财富就会躲着你。</p><p>Ignore people playing status games. They gain status by attacking people playing wealth creation games.</p><p>忽视那些玩身份游戏的人。他们通过攻击玩财富创造游戏的人来获得“身份”。</p><p>You’re not going to get rich renting out your time. You must own equity — a piece of a business — to gain your financial freedom.</p><p>你不会通过出租你的时间变得富有。你必须拥有资产 — — 一个生意的一部分 — — 来收获你的财务自由。</p><p>You will get rich by giving society what it wants but does not yet know how to get. At scale.</p><p>通过规模化地给予社会所需要，但还不知道如何得到的东西，你会变得富有。</p><p>Pick an industry where you can play long term games with long term people.</p><p>选取一个你可以和“长期的人”进行“长期游戏”的行业。</p><p>The Internet has massively broadened the possible space of careers. Most people haven’t figured this out yet.</p><p>互联网已经大大地拓宽了职业空间。大部分人还没有理解这一点。</p><p>Play iterated games. All the returns in life, whether in wealth, relationships, or knowledge, come from compound interest.</p><p>进行重复博弈。无论是财富，关系还是知识，生活中所有的回报都来自于复利。</p><p>Pick business partners with high intelligence, energy, and, above all, integrity.</p><p>选择高度聪明，有能量的，以及正直这一高于所有其它因素的人，作为商业伙伴。</p><p>Don’t partner with cynics and pessimists. Their beliefs are self-fulfilling.</p><p>不要和愤世嫉俗者以及悲观主义者合伙，他们的信念会自我实现的。</p><p>Learn to sell. Learn to build. If you can do both, you will be unstoppable.</p><p>学习销售，学习创建。如果两个你都能做，你是不可阻挡的。</p><p>Arm yourself with specific knowledge, accountability, and leverage.</p><p>用“特种知识”，“靠得住”，以及“影响力”来武装你自己。</p><p>Specific knowledge is knowledge that you cannot be trained for. If society can train you, it can train someone else, and replace you.</p><p>“特种知识”是你不能通过培训得到的知识。如果社会可以培训你，它也可以培训其他人来取代你。</p><p>Specific knowledge is found by pursuing your genuine curiosity and passion rather than whatever is hot right now.</p><p>“特种知识”是通过追求你真正的好奇心和激情，而不是现在热门的东西被找到的。</p><p>Building specific knowledge will feel like play to you but will look like work to others.</p><p>构建“特种知识”对你来说好像是玩游戏，但是对其他人来说看起来像工作。</p><p>When specific knowledge is taught, it’s through apprenticeships, not schools.</p><p>“特种知识”是通过学徒制，而不是学校被教会的。</p><p>Specific knowledge is often highly technical or creative. It cannot be outsourced or automated.</p><p>“特种知识”通常是有着高度技术性或者创造性的，它不能被外包出去或者被自动化掉。</p><p>Embrace accountability, and take business risks under your own name. Society will reward you with responsibility, equity, and leverage.</p><p>拥抱问责，并把商业风险放在你自己的名下。社会会以责任，资产和影响力来回报你。</p><p>The most accountable people have singular, public, and risky brands: Oprah, Trump, Kanye, Elon.</p><p>最靠得住的人有着奇异地，公开的，冒险性的品牌：奥普拉，川普，凯恩，马斯克</p><p>“Give me a lever long enough, and a place to stand, and I will move the earth.” — Archimedes</p><p>“给我一个足够长的杠杆，一个立足之地，我就可以撬动地球” — — 阿基米德</p><p>Fortunes require leverage. Business leverage comes from capital, people, and products with no marginal cost of replication (code and media).</p><p>财富需要杠杆，商业杠杆来自于资本，人以及没有边际成本就可以复制的产品（代码和媒体）。</p><p>Capital means money. To raise money, apply your specific knowledge, with accountability, and show resulting good judgment.</p><p>资本指的是钱。用上你的特种知识，承担责任，并展示出好的判断力来募集钱。</p><p>Labor means people working for you. It’s the oldest and most fought-over form of leverage. Labor leverage will impress your parents, but don’t waste your life chasing it.</p><p>劳动力是为你工作的人。这是最古老的，以及最具争议的杠杆形式。劳动力杠杆会让你的父母留下深刻印象，但是不要浪费你的生命来追逐它。</p><p>Capital and labor are permissioned leverage. Everyone is chasing capital, but someone has to give it to you. Everyone is trying to lead, but someone has to follow you.</p><p>资本和劳动力都是需要别人允许的杠杆。每个人都在追逐资本，但是需要有某个人把它给你。每个人都在尝试领导，但是需要有某个人来追随你。</p><p>Code and media are permissionless leverage. They’re the leverage behind the newly rich. You can create software and media that works for you while you sleep.</p><p>代码和媒体是无需别人允许的杠杆。它们是“新富”们背后的杠杆，你可以通过创造软件和媒体内容，让它们在你睡觉的时候仍然为你工作。</p><p>An army of robots is freely available — it’s just packed in data centers for heat and space efficiency. Use it.</p><p>有一个机器人大军可以免费得到 — — 它只是因为需要散热和太占地方而被放在数据中心里了，把它们用起来。</p><p>If you can’t code, write books and blogs, record videos and podcasts.</p><p>如果你不会写代码，写书或者博客，录制视频或者播客。</p><p>Leverage is a force multiplier for your judgement.</p><p>影响力是你的判断力的力量乘数。</p><p>Judgement requires experience, but can be built faster by learning foundational skills.</p><p>判断力需要经验，但是可以通过学习基础技能更快地建立。</p><p>There is no skill called “business.” Avoid business magazines and business classes.</p><p>从没有一种技能叫做“商业”，避开商业杂志和商业课程。</p><p>Study microeconomics, game theory, psychology, persuasion, ethics, mathematics, and computers.</p><p>学习微观经济学，博弈论，心理学，说服力，伦理学，数学以及计算机。</p><p>Reading is faster than listening. Doing is faster than watching.</p><p>读比听快，做比看快。</p><p>You should be too busy to “do coffee,” while still keeping an uncluttered calendar.</p><p>你应该忙得没空“喝个咖啡”，但是仍然能够保持不让日程表支离破碎。</p><p>Set and enforce an aspirational personal hourly rate. If fixing a problem will save less than your hourly rate, ignore it. If outsourcing a task will cost less than your hourly rate, outsource it.</p><p>设立并强制实施一个有雄心的个人时薪。如果解决一个问题能够省下的低于你的时薪，忽视它。如果外包一个任务的成本低于你的时薪，外包掉。</p><p>Work as hard as you can. Even though who you work with and what you work on are more important than how hard you work.</p><p>尽你全力努力工作，即使你和谁一起工作以及工作内容比你有多努力更加重要。</p><p>Become the best in the world at what you do. Keep redefining what you do until this is true.</p><p>在你所做的事情上做到全世界最好，持续重新定义你所做的事情直到这成为事实。</p><p>There are no get rich quick schemes. That’s just someone else getting rich off you.</p><p>没有快速致富的方案，那种方案只是让别人从你身上发财。</p><p>Apply specific knowledge, with leverage, and eventually you will get what you deserve.</p><p>通过杠杆应用你的“特种知识”，最终你会得到你所应得的。</p><p>When you’re finally wealthy, you’ll realize that it wasn’t what you were seeking in the first place. But that’s for another day.</p><p>当你最终变得富有，你会意识到这不是一开始你寻找的位置。但那是新的一天了。</p><p>—</p><p>Summary: Productize Yourself.</p><p>最后，Naval提供了一句话的总结 —— <a href="https://twitter.com/naval/status/1003356436091400192">“总结：把你自己产品化”。</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=aa9f64f5883e" width="1" height="1" alt=""><hr><p><a href="https://xuwenhao.com/%E5%A6%82%E6%9E%9C-%E4%B8%8D%E9%9D%A0%E8%BF%90%E6%B0%94-%E5%8F%98%E5%BE%97%E5%AF%8C%E6%9C%89-%E6%9D%A5%E8%87%AAangellist%E5%88%9B%E5%8A%9E%E4%BA%BA%E7%9A%84%E7%BB%8F%E9%AA%8C-aa9f64f5883e">如何（不靠运气）变得富有 - - 来自AngelList创办人的经验</a> was originally published in <a href="https://xuwenhao.com">蒸汽与魔法</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[理解IAM，云时代的软件开发系列之一]]></title>
            <link>https://xuwenhao.com/%E7%90%86%E8%A7%A3iam-%E4%BA%91%E6%97%B6%E4%BB%A3%E7%9A%84%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E7%B3%BB%E5%88%97%E4%B9%8B%E4%B8%80-4a8e7d251238?source=rss----107b35121b42---4</link>
            <guid isPermaLink="false">https://medium.com/p/4a8e7d251238</guid>
            <category><![CDATA[cloud-computing]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[ami]]></category>
            <category><![CDATA[google-cloud]]></category>
            <dc:creator><![CDATA[Xu Wenhao]]></dc:creator>
            <pubDate>Thu, 17 Aug 2017 15:14:27 GMT</pubDate>
            <atom:updated>2017-08-17T15:26:39.603Z</atom:updated>
            <content:encoded><![CDATA[<h3>1. 痛苦的古代科技</h3><p>最近一段时间，在不断地和同事们改进<a href="https://goo.gl/d3LckM">BotHub.AI</a>现有的基础架构，发现过去自己，包括现在身边的很多同学，还在拿上一个时代，自行维护或者托管数据中心的方式在运营，维护，以及部署完全依托于云服务器的应用，各种笨办法不一而足。所以准备写一系列文章，讲一讲在所有的服务器都在各大公有云的时代，或者用两个字来说“现代”，应该如何进行软件开发，眼下这篇是第一篇文章。</p><p>尽管我深度相信<a href="https://goo.gl/2oNfkV">Serverless</a>是大势所趋，不过大部人应该一开始用的都是云服务提供的VM，比如Google Compute Engine或者AWS EC2。有了VM，稍有一些安全概念的开发者或者运维人员，通常都会按照老习惯设置创建一系列用户，权限，SSH Keys等，于是，问题就来了。</p><p>大家常常犯的错误是，不通过云服务自带的机制，而是自行根据经验去维护一套运维和安全的体系。而自行维护一套权限系统的成本是很高的，特别是对于早期创业团队来说，于是，各种简化山寨的办法就出现了。</p><p>1. 只有一个人（通常这个人被称呼为CTO），拥有登陆生产服务器的权限<br>2. 因为为每个人维护一个SSH Key以及进行权限分组太麻烦了，所以所有人公用一组SSH Key<br>3. 因为设置VPC太麻烦了，所以生产环境和测试环境都在云服务的整个内网中，所有服务器对于内网都开放<br>4. 当然，上述的3过于奔放了，所以通过IP白名单来设置一些服务器之间的互相访问的权限</p><p>然而，上述的这些设置其实都会有一些问题，比如</p><p>1. 对于上面的1，显然你的CTO不能生病，请假，坐飞机了<br>2. 对于上面的2，显然你的工程师千万不能离职，不然每当有一个人离职你必须在全公司换一次SSH Key<br>3. 对于上面的3，尽管你已经禁止了各种外网访问的端口，保不齐通常的这个Zone/Region中，有人看到了有什么新的漏洞想要试一把<br>4. 对于上面的4，如果你想要做服务器的Auto-Scale怎么办</p><p>事实上，现代的云服务其实都已经提供了一种机制来解决这个问题了，就是云服务内的IAM，全称试 Identity and Access Management（身份和访问权限服务）。</p><h3>2. 理解现代云服务 —— IAM 概览</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*q9nM0fNvbhda8lyzUGWAIg.png" /><figcaption>Google Cloud IAM Overview</figcaption></figure><p>所有的现代云服务都提供了<a href="https://goo.gl/tZ1CJp">IAM服务</a>，IAM服务的大部分概念，对于做过一些web后台开发，开发过权限系统的人来说，并不难理解。除了少数的概念之外，其实就是一个标准的权限系统。</p><ol><li>Users and Groups，IAM中的I指的是Identity，简单来说，就是某一个“用户”，如果我们把一组用户放在一个Group里，那么一个Group就是代表了这些所有用户的一个特殊的Identity</li><li>Permissions and Roles，IAM中的A指的是Access，你也可以理解为就是Permission，很多个Permission打包在一起，就是一个Role</li><li>Policy，I和A的组合，或者说 Member Identity 和 Roles 的组合，就是一个Policy，意味着我们一组的Permission，授予了某一个Member(通常是一个Group)</li></ol><p>可以看到这里的I+A的组合，其实就是一个普通的，支持Group和Role的权限系统。而其中所有的基础的User，最简单的方式，就是和公司内部的邮箱绑定，而Groups，可以和公司内部的邮件组绑定（事实上，如果你使用的是G Suite+Google Cloud的话，Google Groups和G Suite User就是Google Cloud的IAM中支持的用户和Groups）。而这个基本的I+A的组合，加上Cloud中管理Resource（资源）的层级结构，以及Service Accounts这个特殊的概念，就构成了基本的IAM服务。</p><h3>3. 云服务上资源的层级结构</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/548/1*GnoO2YWHNxhzxNAPvo9q3w.png" /><figcaption>Google Cloud Policy Hierachy</figcaption></figure><p>在上面描述I+A的体系的时候，我们引入了一个概念叫做Permission，那么这个Permission针对的是什么呢？在云服务中，Permission是针对Resource（资源而言）的，一个VM在云中是一个Resource，一个Cloud Storage在云中的一个Bucket是一个Resource，而Permission，就是是否有权限针对这些Resource进行一个特定的操作，比如，是否可以读取Bucket中的内容，或者是否可以重启某个VM。</p><p>而云服务，又可以把Resource通过Organization+Project两级组织起来。Organization，通常就是指你的公司，一般来说，你的Cloud中应该只有一个Organization。而Project，则可以按照你的要求把一系列Resource组织起来，比如上图中，我们把Resource按照生产，测试和开发环境，组织成了example-prod, example-test以及example-dev。你不仅仅可以按照部署环境来组织Resource，你也可以按照不同的Service来组织服务，特别是在比较大采用SOA架构的公司中，不同团队负责不同的服务，那么可以将不同的Service变成一个个独立的Project。</p><p>将Resource组合成Project的用途有两个，其一是，上面讲到的I+A组合而成的Policy，不仅仅可以应用在Resource上，还可以直接应用在Organization以及Project上。并且，下层的Resource会继承来自上层Organization和Project的Policy。这样，你就不用再一一在每个Resource上单独应用Policy了。其二是，同一个Project内，有一个默认的信任边界(trust boundary)，比如，Compute Engine可以直接访问对应的Cloud Storage的Bucket。这样，很大程度上也就解决了之前所说的权限管理问题。</p><p>对于人数不多的开发团队，上图中简单将环境区分成Prod, Test以及Dev可能就足够了。</p><h3>4. Service Account，让程序和程序对话</h3><p>最后说说<a href="https://goo.gl/9GWzc7">Service Account</a>，前面我们说到了IAM中的I，主要指的都是“人”，可能是一个工程师，也可能是一个有多个工程师的邮件组。但是，实际对于任何线上的服务和资源，如果是长期运行的话，我们的Policy不应该设置在“人”这个层面。不然的话，一旦有人离职，意味着这个Identity在系统中消失，也就意味着对应的所有Policy相当于失效了，严重的话，所有的线上服务也就不能正常提供了。</p><p>所以，在Google Cloud中，引入了一类特殊的Identity，叫做Service Account。Service Account的特殊性在于，他既是Identity，又是Resource，这个带来的作用就是，对于Resource，我们可以授权给Service Account，对于希望有Service Account对应权限的“人”，我们可以把对应的Service Account视作是一个Resource，设定好特定的Policy，使得普通的Identity可以“扮演”（Act As）这个Service Account。</p><p>这样，我们无需分享Service Account帐号给到工程师，而是只要给他们对应的Policy，工程师即可以在线上Act As这个Service Account，来运行程序。对应访问的Resource，验证的也是Service Account的权限。</p><p>而既是工程师离职，或者换了团队，我们只需要修改对应的Policy，既不会影响线上的服务（因为服务使用的Service Account的权限没有变化），也不必收回帐号或者重新创建帐号（因为用户并没有拿到Service Account，只是有一个Policy允许他Act As Service Account，把这个权限取消即可）。</p><p>好了，了解了IAM，Cloud内的Resource层级结构，以及Service Account，对于云内的IAM体系也就有了一个基本的了解。下回，我们来讲讲另一个现代软件开发和权限相关的问题，OAUTH 2.0。</p><p>本文主要参考了 <a href="https://goo.gl/k9EB4t">Google Cloud IAM 的官方文档</a>。我始终建议任何进行严肃的软件开发的同学，要去读自己使用的云服务的手册。</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4a8e7d251238" width="1" height="1" alt=""><hr><p><a href="https://xuwenhao.com/%E7%90%86%E8%A7%A3iam-%E4%BA%91%E6%97%B6%E4%BB%A3%E7%9A%84%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E7%B3%BB%E5%88%97%E4%B9%8B%E4%B8%80-4a8e7d251238">理解IAM，云时代的软件开发系列之一</a> was originally published in <a href="https://xuwenhao.com">蒸汽与魔法</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[重新开始写Blog]]></title>
            <link>https://xuwenhao.com/%E9%87%8D%E6%96%B0%E5%BC%80%E5%A7%8B%E5%86%99blog-ede753a70ed4?source=rss----107b35121b42---4</link>
            <guid isPermaLink="false">https://medium.com/p/ede753a70ed4</guid>
            <dc:creator><![CDATA[Xu Wenhao]]></dc:creator>
            <pubDate>Thu, 10 Aug 2017 06:40:12 GMT</pubDate>
            <atom:updated>2017-08-10T06:40:11.665Z</atom:updated>
            <content:encoded><![CDATA[<p>今天有点被刺激到了，之前聊好的一个工程师在入职前三天微信上和我说不过来了，电话一问，说要去百度，可以做点大数据什么的。我心里想，“多大算大，一浴缸算大还是一脸盆算大？”。在所有的“Buzz Word”中，“大数据”是我最讨厌的，快要没有之一了，远远超过“AI”。关于讨厌“大数据”这个“Buzz Word”，我准备接下来专门写一篇文章来谈谈为什么。</p><p>虽然我认为在2017年的今天加入百度，好比49年加入国军或者15年加入Yahoo，是一个完全错误的决定。我仍然在反思，为什么在持续多次的沟通之后，别人最终还是拒绝了我以及BotHub.AI。而反思的结果则是，我决定重新开启这个Blog，并将未来的主题，集中在软件公司创业，Machine Learning应用（是的，我不喜欢AI这个词），以及技术公司文化上。</p><p>事实上，真正认真反思一下，被任何候选人拒绝其实我都不该意外，除了和我长期共事过的朋友之外，任何一个候选人，前前后后能花上几个小时来面对面沟通已经算不少了。但是通过几个小时，任何人都很难对我，我们在做的产品以及我们的公司有一个深入的了解。而且，我们也没有提供除了面对面沟通以外，了解我和公司的渠道。而单单介绍一下目前我们的产品，并不能真正让别人从情感和价值层面了解我们。而我一直认为，一个公司的核心价值，并不是当前他们有的，在做的产品，而是本身整个团队的“文化”和“价值观”是一样的。因为随着时间变更和市场反馈，我们可能会去创建各种不同的新产品（典型的就是 <a href="https://goo.gl/7CGJWB">Joel Spolsky</a> 的 <a href="https://goo.gl/yArZkW">Fog Creek</a> 先后孵化了 <a href="https://goo.gl/m73EMq">Stackoverflow</a> 和 <a href="https://goo.gl/N31RBq">Trello</a>）。然后，团队的“文化”和“价值观”才是吸引优秀的，志同道和的团队成员共同的办法。</p><p>同时，让我觉得写点东西有意义的一点在于，因为真的有人会读，而且读者中，时不时会带来一些意外之喜。虽然整个Blog停止更新差不多有两年多了，每周仍然会有几十次的访问过来。目前主要来自于我6年前的一篇文章 “<a href="https://goo.gl/a2EGwQ">建议的程序员学习LDA算法的步骤</a>”。而去年开始创业的时候，也很意外的收到一封来自Reza Zadeh的邮件，原因是当时我的blog挂了，导致我之前翻译的<a href="https://goo.gl/vZezwM">一篇Twitter的Blog</a>的中文版本访问不了，他写了一封信给我说有人要看中文本你的Blog挂了，然后说你要来Stanford我请你吃午饭啊。</p><p>因为很多原因，我原来不再想写太多东西了，不过今天开始，重新出发，写一点有意义的东西给这个世界。</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ede753a70ed4" width="1" height="1" alt=""><hr><p><a href="https://xuwenhao.com/%E9%87%8D%E6%96%B0%E5%BC%80%E5%A7%8B%E5%86%99blog-ede753a70ed4">重新开始写Blog</a> was originally published in <a href="https://xuwenhao.com">蒸汽与魔法</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[回顾过去这一年]]></title>
            <link>https://xuwenhao.com/%E5%9B%9E%E9%A1%BE%E8%BF%87%E5%8E%BB%E8%BF%99%E4%B8%80%E5%B9%B4-708e8895f0f6?source=rss----107b35121b42---4</link>
            <guid isPermaLink="false">https://medium.com/p/708e8895f0f6</guid>
            <category><![CDATA[life]]></category>
            <dc:creator><![CDATA[Xu Wenhao]]></dc:creator>
            <pubDate>Sat, 03 Jan 2015 08:09:12 GMT</pubDate>
            <atom:updated>2016-08-29T12:48:40.889Z</atom:updated>
            <content:encoded><![CDATA[<h4>计划</h4><p>50本书的计划没有达成，翻了一下豆瓣，一共39本，虎头蛇尾，上半年看得多，下半年就没有看多少书了。旅行的计划也没有实行，唯一还能聊以自慰的就是上了些MOOC的课程，拿了些证书。</p><h4>生活</h4><p>老二顺利出生，虽然因为时间不巧导致家里领导要延期毕业，不过好在找工作的时候还算顺利，找了份还不错的工作，就是出差多了一些。老二出生之后时间就更少了，基本上没有任何娱乐活动。家里附近的健身房终于开了，开始还能坚持每周去一次，最近则是彻底松懈下来了，跑步和练力量的目标都完全没有达成，只有静待2015了。</p><h4>学习</h4><p>今年比较成功的一件事情，是从三月份开始，逼迫自己去学习<a href="http://www.coursera.org">MOOC</a>，通过花钱参加认证课程，逼自己把作业都在deadline之前看完，发现这是一个很有效地快速学习一些新知识的办法，比慢慢看书有效多了。一是节奏明确，Video和作业都是按周放出来的，避免一开始雄心勃勃，天天看好几个小时，但是没过两个礼拜就放弃了，而且为了拿证书，必须把作业都做完，不会浮光掠影看完就忘了。扔了好几百美金进去，成果一是学会了用R做一些快速的数据分析和可视化，以及用Knitr和Slidify写report，二是写了一些小的Scala程序，不过这部分没有什么感觉，因为前几年用scheme刷过一些SICP的题，年初自己也看过一些Scala，最后就是通过<a href="https://www.coursera.org/course/ntumlone">机器学习基石</a>的课程开始按下心来理解理论，公式，自己实现算法，而不是只会看代码和扯淡。可惜的是基于R的Data Science的Capstone Project在年底的时候，因为时间和精力的因素最终还是放弃了，希望能够在2015新开课的时候重新补上。</p><h4>工作</h4><p>工作上，五月份的时候公司发生了比较大的变动，有新的战略投资者进入，替换了原来的财务投资者。自己也一度考虑过是不是应该换一个环境，也拿到一些机会，不过考虑再三最后还是决定留下来，既觉得对团队有责任也因为手上又多了很多值得深入挖掘的数据，自己对于自己在机器学习上的水准还是不太满意，想再彻底做完一些事情。三季度的时候升了一次头衔，不过其实也没有什么本质的变化，道阻且长，离目标还是远得很。</p><h4>心态</h4><p>过去一年的心态变化很大，可惜是变得糟糕了，年龄上的数字变化导致内心非常焦躁。功利之心日盛，好奇之心却在逐步衰退。看东西越来越着急，逼着自己，乐趣却约来越少，虽然自知，但是却改不过来，变成慌慌张张的一个人。</p><h4>互联网广告</h4><p>过去几年在效果广告层面，被证明唯一有效的方式就是重定向广告，相信明年也不外如是。相信明年，整个行业的重定向广告本身的边界会被扩大，Look-Alike，跨屏重定向相信会在明年有比较大的发展。事实上，由于效果广告需要在短期内就有用户的点击和Action，并且“广告”本身并不是用户在媒体端的主要目的，而广告主本身除了所谓的ROI之外没有别的评估手段，所以最终Agency只能走向重定向广告。唯一的区别在于，数据来源的不同，使得各个Agency能够做的“重定向”广告是不同的，普通的站内行为之外，搜索和Look-Alike，本质上也只是一种数据来源不同的“重定向”广告罢了。而如果尝试走得太远，由于缺少有效合理的评估手段，广告主看到的“效果”，恐怕是好不到哪里去的。所以目前海外这些上市的互联网广告公司，我的个人观点是只有Criteo才值得长期持有。</p><h4>机器学习</h4><p>在工业界，Deep Learning应该还会再火一阵，但是其实区分各个公司实际能力的仍然是数据，和架构能力，除了巨头之外，Startup们的关注点仍然是用开源的机器学习工具，而不是自己去实现一个新的Deep Learning算法。结合到我上面所说的“所有有效的效果广告都是一种重定向广告”，所以最终结果是机器学习最终只是用来作为工具，主要的精力在工业界，仍然是在“数据挖掘”上，也就是人工写程序寻找特征。</p><h4>数据分析</h4><p>其实对于“大数据”这个词来说，过去几年都是让人失望的几年。炒作之外，即使是小数据，能让人看到眼前一亮的新产品和新应用也没有看见。我个人还是期望看到更多和广告，变现无关的数据可视化和分析的国内的真实的应用和案例。而不是所有人都把拉拉日志，写点统计，然后让大家看广告点广告评估流量来当成真正的数据分析。</p><h4>技术管理</h4><p>如果说三四年前我对于技术管理是乐观派，一二年前是实践派，那么过去一年随着管的团队越来越大，则偏向悲观了。即使花了很多力气在过去几年，把从Code Review到自动化测试和部署的流程都建立起来了，随着团队越来越大，还是会看到同样的错误在反复犯。整个行业看起来欣欣向荣，工资水涨船高，但是人才密度也随着需求量的增长在不断被稀释，所以技术团队通常都在OKR的业务目标和On-Call的人肉运维中苦苦挣扎。前两天看到微博的TimYang的两篇文章(<a href="http://timyang.net/tao/thoughts-2014/">链接一</a>，<a href="http://timyang.net/management/reusability/">链接二</a>)顿时觉得“于我心有戚戚焉”，除了人本身之外，似乎也找不到能够解决好这些问题的办法。然而，更加痛苦地是，即使在技术团队内部，OKR驱动也导致真正关注代码质量的反而是异类。</p><h4>展望</h4><p>新的一年，目标更少了，把想上的几个MOOC上完，健身房按时去，出去看看不一样的世界，如此而已。最重要是希望能够把心态调整过来，少一些功利心，多一些好奇心</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=708e8895f0f6" width="1" height="1" alt=""><hr><p><a href="https://xuwenhao.com/%E5%9B%9E%E9%A1%BE%E8%BF%87%E5%8E%BB%E8%BF%99%E4%B8%80%E5%B9%B4-708e8895f0f6">回顾过去这一年</a> was originally published in <a href="https://xuwenhao.com">蒸汽与魔法</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[做个自我节制的好人]]></title>
            <link>https://xuwenhao.com/%E5%81%9A%E4%B8%AA%E8%87%AA%E6%88%91%E8%8A%82%E5%88%B6%E7%9A%84%E5%A5%BD%E4%BA%BA-a6bc3275eecf?source=rss----107b35121b42---4</link>
            <guid isPermaLink="false">https://medium.com/p/a6bc3275eecf</guid>
            <category><![CDATA[life]]></category>
            <dc:creator><![CDATA[Xu Wenhao]]></dc:creator>
            <pubDate>Sat, 01 Mar 2014 14:46:34 GMT</pubDate>
            <atom:updated>2016-08-29T12:48:40.994Z</atom:updated>
            <content:encoded><![CDATA[<p>上一周没有更新blog，然后上个月的30 Days Challenge也没有达成，借口自然是很容易找的，就是橙汁同学满月了，于是从上周末开始生活的节奏就及其紧凑，睁开眼就上班，回到家就开始奶孩子，半夜里总也要起来一两趟。到了周末偶尔的闲暇时间，就睡觉补充一下体力。然而实际上也并不是没有时间，在橙汁同学回家之前，有几晚一个人回家睡觉，偷偷地把纸牌屋看完了。所以目标没完成，还是只能怪自己怠惰了。</p><p>本月学会Scala的目标没能完成，只能基本上熟悉了一下语法，在研究Twitter的Scala School过程中遇到无数坑，一方面是Scala School的信息非常过时了，并且本身Scala School中的很多代码也不是开箱可用。在Finagle的版本以及Scrooge上折腾了很长时间，最后还是靠自己研究代码和各个项目的文档把Searchbird的代码框架给架起来了。有空的时候，争取重新写一个scala-bootstrapper的gem或者教程吧。学习使用Scala的目标应该还会继续，但是不会再作为30 Days Chanllege的目标了。</p><p>在每日公车来回上班的路上，抽空把&lt;富兰克林自传&gt;给看完了，过去一段时间的读书体验也让自己有些小小后悔没有早一点入手KPW，导致不少书买在了多看平台上，导致管理起电子书多少显得有些麻烦。</p><p>&lt;富兰克林自传&gt;对我自己是颇有鼓舞，把这本书当成是美国开国者的传记，其实并不恰当，因为这本书其实只写到了富兰克林50岁的经历，而离美国革命爆发尚有20年。事实上，这本书就如同富兰克林的个人秘书本杰明-沃恩所说的，是适合青年人通过了解一个伟大人物的青年时代是如果度过，而让自己按照类似的生活原则，去学习和进步的材料。</p><p>富兰克林自己，出生于一个蜡烛匠的家庭，也没有太好的教育机会，没有读两年书，就开始了学徒生涯。基本上，是依靠自学，以及勤奋工作，开创了自己的生意，以及后来的政治事业。如果说这其中有一点点的幸运的因素，大概就是他是一个印刷业的学徒，使得他有了相对更多的读到一些书的机会。而更多的成就，则来自他的“品格”，或者说良好的自我约束和勤勉工作学习的习惯。就像他在书中有些极端地所说的“一个能力尚可的人可以在人类中促成大变革，成就大事业，只要他首先制定一个好计划，然后剪除一切娱乐活动或其他可以让他分心旁骛的事务，把推行这一计划当作他唯一的研究和事业”。</p><p>富兰克林重视基本的美德，他也将这些基本的美德，视为自己成就的根本来源。可惜我年青的时候不明白这些道理，这一两年开始，才发现“让自己变成一个更好的人”是解决很多问题，并且获得更加快乐美好生活的根本途径。况且年轻人多少容易有些傲慢，即使知道了这些道理也未必愿意遵守或者改变，而人性中的惰性又是如此之多，所以养成了不少恶习，比如不爱早起，不愿节制。于是只能到现在30多岁，重新去修正自己，尝试把这些恶习慢慢从自己的身上去除掉，实在是殊为不易。而据我自己的观察，周围那些更为杰出的人，通常都更加自律与自我节制，而其中环境的影响也会很大。很多时候，年青人的自我节制的习惯，并不是有着自我一是的，而是受家庭环境的影响。这也是为什么同样聪明优秀的人，从进入大学开始，发生了巨大的差别，通常，都是在自我管理上出现了很大的问题。而这一点，又使得富兰克林的成就显得格外突出，因为他并没有一个贵族，或者学者的家庭环境。</p><p>富兰克林的另一个成就来源，是来自他擅长社会交往。可以看到，他发起、组织了不少的社会组织，无论是从北美最早的图书馆，消防队，还是他和志同道合者组建的俱乐部，都可以看出他通过这些组织，发挥了远比他一个人更大的社会影响和社会作用。而这一点，其实是非常值得我们这些技术宅们去借鉴和学习的。</p><p>看完这本书，得说富兰克林让人敬重，据说他也是巴菲特的合伙人查理－芒格心目中的英雄，接下来，可以考虑也看看查理－芒格的作品。</p><p>最后，新的30 Days Challenge是乘着现在总要早睡然后半夜起来，养成早起的习惯，做到每天6:30之前起来吧。</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a6bc3275eecf" width="1" height="1" alt=""><hr><p><a href="https://xuwenhao.com/%E5%81%9A%E4%B8%AA%E8%87%AA%E6%88%91%E8%8A%82%E5%88%B6%E7%9A%84%E5%A5%BD%E4%BA%BA-a6bc3275eecf">做个自我节制的好人</a> was originally published in <a href="https://xuwenhao.com">蒸汽与魔法</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[时时思量 — — 《公正》读后感]]></title>
            <link>https://xuwenhao.com/%E6%97%B6%E6%97%B6%E6%80%9D%E9%87%8F-%E5%85%AC%E6%AD%A3-%E8%AF%BB%E5%90%8E%E6%84%9F-a966504adcf1?source=rss----107b35121b42---4</link>
            <guid isPermaLink="false">https://medium.com/p/a966504adcf1</guid>
            <category><![CDATA[books]]></category>
            <dc:creator><![CDATA[Xu Wenhao]]></dc:creator>
            <pubDate>Sat, 15 Feb 2014 07:31:20 GMT</pubDate>
            <atom:updated>2016-08-29T12:48:46.032Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="s4604609" src="https://cdn-images-1.medium.com/max/318/0*MjRcUebasfDfUwLq.jpg" /></figure><p>春节里还是没有忍住，入手了国行的Kindle PaperWhite，在这个上面看完的第一本就是<a href="http://book.douban.com/subject/5408882/">&lt;公正&gt;</a>。之前也看过这个对应的公开课的视频，也推荐给家里领导，但是书的好处就是随时随地都能看，而且整个的节奏会更快一些，所以公开课的视频我是没有看完，书却是没有花几天就看完了。</p><p>公开课出现的时候，最抓人眼球的部分是那些我们很难回应的道德困境，而精良的拍摄，以及桑德尔先生笔挺的西装更是为“公正”这样一个简洁却又恒久的主题加了不少附加分。而当我们回到这本书里的时候，不再收到精良制作带来的观感的时候，反而更容易让人关注到我们想要了解的核心主题 — — 什么是迈向社会公正的道路？</p><p>作为一本政治哲学的入门之作，这本书并不高深复杂，而是从一些具体的事实和假想的案例，驱动你去时时反思，询问自己“这是正确的吗？”。他让你不再是根据简单的个人好恶，和直觉判断来确定事务的对和错，而是通过明确的，理性的政治哲学角度，重新去思考这个问题。而这些问题，的确是值得在每一个人开始承担完整的责任的时候，去时时思量的问题。所以，这门公开课原本是针对哈佛大学的新生的，然而，在你离开校园多年之后，回头来看这些问题的时候，反而更有些力量。</p><p>从大学开始，我们就倾向于专业主义，我们让自己去学习更好地写程序，更好地和团队合作，更好地完成商业上的目标。而当我们完成这些目标得到回报之后，我们开始思考买哪里的房子，和谁谈恋爱，和谁结婚，接下来应该做什么样的工作。然而当你回过头来去重新思量，什么样的社会是公正的时候，你会发现，曾经你觉得自己“应得的”，当你反思的时候，也许只是来自幸运或者家庭环境。你会发现，简单的专业主义，并不能达成你曾经有过，却早已淡忘的理想。</p><p>照此说来，过去几年，我从一个极端的“自由主义者”，重视选择权，信奉简单的市场竞争，其实慢慢变成了一个认为自己的所得更多是来自于幸运。虽然我仍然认为桑德尔先生在书里最后所要追求的“团结的公民美德”是非常危险的，尤其是在我们这个曾经因为“团队的公民美德”受到过很多伤害的国家，但简单的“无知之幕”也好，“最大化福利”也好，都已经不能简单地说服我了。</p><p>这个也许才是关于“公正”这个概念最终的归宿，我们通过政治哲学，反复思量，谨慎地做出判断。但是更重要的是，我们时时思量，反复地在实践中运用我们的道德，把自己变得更好，也尝试着，让这个世界更加公正。</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a966504adcf1" width="1" height="1" alt=""><hr><p><a href="https://xuwenhao.com/%E6%97%B6%E6%97%B6%E6%80%9D%E9%87%8F-%E5%85%AC%E6%AD%A3-%E8%AF%BB%E5%90%8E%E6%84%9F-a966504adcf1">时时思量 — — 《公正》读后感</a> was originally published in <a href="https://xuwenhao.com">蒸汽与魔法</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Finagle里Future的flatMap]]></title>
            <link>https://xuwenhao.com/finagle%E9%87%8Cfuture%E7%9A%84flatmap-d376a86d31d0?source=rss----107b35121b42---4</link>
            <guid isPermaLink="false">https://medium.com/p/d376a86d31d0</guid>
            <category><![CDATA[tech]]></category>
            <category><![CDATA[scala]]></category>
            <dc:creator><![CDATA[Xu Wenhao]]></dc:creator>
            <pubDate>Mon, 10 Feb 2014 12:52:30 GMT</pubDate>
            <atom:updated>2016-08-29T12:48:40.038Z</atom:updated>
            <content:encoded><![CDATA[<p>最近业余时间在学习Scala，最近的一个目标是用Finagle写一个简单和现有系统相关的查询服务。在看Finagle里面Future的flatMap的时候被绕了一下，所以简单做个记录。</p><p>flatMap是flatten和map两个函数的组合，先map，然后flatten，这个在collection类型的对象上很容易理解，这个对于写过Ruby或者Python这样的脚本语言的人应该很直观就能认识，好比下面的代码这样</p><pre>val nestedNumbers = List(List(1, 2), List(3, 4))<br>nestedNumbers.flatMap(x =&gt; x.map(_ * 2))</pre><p>然后返回的结果就是这样</p><pre>res0: List[Int] = List(2, 4, 6, 8)</pre><p>这个代码相当于这样</p><pre>val nestedNumbers = List(List(1,2), List(3,4))<br>val mappedNestedNumbers = nestedNumber.map(x =&gt; x.map(_ * 2))<br>val flatMappedNumber = mappedNestedNumbers.flatten</pre><p>但是当直接用flatMap来完成Future的组合和链式调用的时候我一开始一直没有理解，如果把一个Future作为一个Collection，不应该map之后可以是任意东西，然后flatten之后就不是一个Future了，而为什么实际的代码示例是返回的还是一个Future呢？比如来自Finagle的Guide里面下面这样的示例呢？</p><pre>def fetchUrl(url: String): Future[Array[Byte]]<br>def findImageUrls(bytes: Array[Byte]): Seq[String]</pre><pre>val url = &quot;http://www.google.com&quot;</pre><pre>val f: Future[Array[Byte]] = fetchUrl(url) flatMap { bytes =&gt;<br>  val images = findImageUrls(bytes)<br>  if (images.isEmpty)<br>    Future.exception(new Exception(&quot;no image&quot;))<br>  else<br>    fetchUrl(images(0))<br>}</pre><pre>f onSuccess { image =&gt;<br>  println(&quot;Found image of size &quot;+image.size)<br>}</pre><pre>然后花了一点时间看了一下Effective Scala，发现之前理解错了。这个事情原来是这样的，首先，我们看一下Future的flatMap方法的函数签名和含义</pre><pre>def flatMap[B](f: A =&gt; Future[B]): Future[B] = {<br>   val mapped: Future[Future[B]] = this map f<br>   val flattened: Future[B] = mapped.flatten<br>   flattened<br>}</pre><pre>需要注意的是，实际Twitter Util库中flattenMap的实现不是这样的，这里只是为了说明语义。<br>这个函数签名，也就是说，对于当前的Future容器内的对象A（这里只有一个A，而不是List这样有一个List的A），接收一个函数，输入是A，map成为Future[B]，然后map函数本身再回把他重新封装回容器Future，那么就编程了Future[Future[B]]。<br>然后flatten再去除外部的第一层容器，最终的返回值就变成了Future[B]。</pre><pre>这个解释了一个Future[A]，以及一个针对A映射到Future[B]的函数g，通过flatMap组合之后，返回值就是第二个用于映射的函数返回的Future[B]。而Future[A]本身可以是一个函数f的计算结果。那么对于 f(g) 来说，就是两个函数通过flatMap组成了一个新函数。</pre><pre>这个机制在Twitter Util的Future以及2.10的官方库的Future的实现是类似的。</pre><pre>准备之后再研究一下Future和Future的实际flatMap的实现，看看这个异步Callback的机制是泽呢么实现的。</pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d376a86d31d0" width="1" height="1" alt=""><hr><p><a href="https://xuwenhao.com/finagle%E9%87%8Cfuture%E7%9A%84flatmap-d376a86d31d0">Finagle里Future的flatMap</a> was originally published in <a href="https://xuwenhao.com">蒸汽与魔法</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[学习Scala小记]]></title>
            <link>https://xuwenhao.com/%E5%AD%A6%E4%B9%A0scala%E5%B0%8F%E8%AE%B0-252c986a6cda?source=rss----107b35121b42---4</link>
            <guid isPermaLink="false">https://medium.com/p/252c986a6cda</guid>
            <category><![CDATA[life]]></category>
            <dc:creator><![CDATA[Xu Wenhao]]></dc:creator>
            <pubDate>Tue, 04 Feb 2014 14:04:30 GMT</pubDate>
            <atom:updated>2016-08-29T12:49:04.982Z</atom:updated>
            <content:encoded><![CDATA[<p>今年有一个计划就是在工作上推动用Scala慢慢替代掉Java的代码，以增加团队的生产力和乐趣。</p><p>所以春节，花了大概5–6天时间，看了一遍，为了实际感受一下语法，基本上把书里的代码都自己敲了一遍，花了不少时间。</p><p>应该说Scala是一门有自己特色的语言。traits和函数是一等公民两个特点有大量的动态语言也都支持，所以算不上太大的特点。而静态类型，类型推导和隐式转化也许对写语言和编译器的人来说很有价值，但是对于利用Scala来写应用的工程师来说，只算做简化的语法糖，很不错但是也没有什么新鲜的。然而模式匹配和以及Actor算是Scala特有的核心的特点，也基本上道出了这门语言设计的目的 — — — — 尽量利用消息传递作为模块之间的沟通机制，使得多线程编程以及异步编程不再是库一级的功能而是语言一级的功能，非常吸引人。而这个独特的特点，加上前面的种种虽然常见，但是Java中缺失的语言特性，让你不得不承认他是替代“新时代的汇编语言”Java的最佳人选了。</p><p>最后这本书我不太推荐，一方面是有些过时了，不少代码在Scala 2.10下都编译不过，另一方面是Scala最重要的语言特性Actor这部分，一个是官方库也已经换成Akka的了，另一方面是这本书本身对于这个特性也讲得不够好。国内Scala圈的大拿<a href="http://weibo.com/laogaome">@laogao</a>推荐的是<a href="http://book.douban.com/subject/19971952/">&lt;快学Scala&gt;</a>以及<a href="https://leanpub.com/theneophytesguidetoscala">The Neophyte’s Guide to Scala</a>。后者很有意思，自出版物，虽然有指导价，但是花多少钱买你随意，不知道作者实际收到了多少钱。</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=252c986a6cda" width="1" height="1" alt=""><hr><p><a href="https://xuwenhao.com/%E5%AD%A6%E4%B9%A0scala%E5%B0%8F%E8%AE%B0-252c986a6cda">学习Scala小记</a> was originally published in <a href="https://xuwenhao.com">蒸汽与魔法</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[假日琐记]]></title>
            <link>https://xuwenhao.com/%E5%81%87%E6%97%A5%E7%90%90%E8%AE%B0-f7797f6e1a8f?source=rss----107b35121b42---4</link>
            <guid isPermaLink="false">https://medium.com/p/f7797f6e1a8f</guid>
            <category><![CDATA[life]]></category>
            <dc:creator><![CDATA[Xu Wenhao]]></dc:creator>
            <pubDate>Tue, 04 Feb 2014 13:35:00 GMT</pubDate>
            <atom:updated>2016-08-29T12:48:42.015Z</atom:updated>
            <content:encoded><![CDATA[<p>今年的节日，和往年不同的是电商们开始节日也送货了，尝试了一下京东和亚马逊，基本都能做到第二日送货，有些令人难以置信。特别是老二出生没几天，要去医院检查黄疸的时候缺个小小孩儿的婴儿座椅，结果在京东上上午下单晚上就送到了。亚马逊比较强大的一点是现在可以送货到全家的门店取货，解决了买东西要么从公司搬回去，要么得周末在家守着快递得大问题。就这么没有几年，我已经基本不去商场买东西了，”Software is Eating the world”来得是如此之快，好在我似乎还是站在可能会战胜得一方的。</p><p>这个假日，特别清净。因为老二在春节前出生，老婆坐月子又是找了个月子中心，整个节日除了偶尔跑出去吃个饭之外，基本上都处于在“宾馆”内坐牢。特别是基本不看电视，外加网速奇慢之外，反而一下子多出了很多看书的时间。短短几天，就翻完了<a href="http://book.douban.com/subject/4909629/">Scala的语法</a>，重新看了一遍Manning的<a href="http://book.douban.com/subject/10438832/">Big Data</a>，以及<a href="http://book.douban.com/subject/10825215/">苹果</a>。即便如此，其实也没有少刷微博浪费时间，这样得悠闲时光，大概会很长时间再不会有了吧。</p><p>前两天，和多年未见的老同学Z一起吃了顿晚饭，这种自己不够勤奋的内疚感更加强烈了。在学校的时候，写程序Debug就常常要找Z帮忙，现如今，Z在某互联网大厂工作，是做自然搜索的核心成员，级别不低，Z的爱人所在的互联网公司去年则是成功上市。两个在北京也已经靠自己买房子之后又换了更大的房子。然而即便是过年，Z同学还在研究算法，推导公式，吃饭的时候还拉着我看我们投出来的广告。</p><p>本来过年的时候基本了解了Scala的语法，觉得自己还挺努力的，结果这顿饭吃完，内疚感油然而生，觉得之前的日子实在还是过于懒散，日子都过到狗身上去了。</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f7797f6e1a8f" width="1" height="1" alt=""><hr><p><a href="https://xuwenhao.com/%E5%81%87%E6%97%A5%E7%90%90%E8%AE%B0-f7797f6e1a8f">假日琐记</a> was originally published in <a href="https://xuwenhao.com">蒸汽与魔法</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>