<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Programming on CctoctoFX</title>
    <link>https://pillumina.github.io/posts/programming/</link>
    <description>Recent content in Programming on CctoctoFX</description>
    <image>
      <title>CctoctoFX</title>
      <url>https://pillumina.github.io/imgs/icon_head.png</url>
      <link>https://pillumina.github.io/imgs/icon_head.png</link>
    </image>
    <generator>Hugo -- 0.148.2</generator>
    <language>en</language>
    <lastBuildDate>Mon, 05 Apr 2021 12:40:29 +0800</lastBuildDate>
    <atom:link href="https://pillumina.github.io/posts/programming/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>(转)程序员如何把控自己的职业</title>
      <link>https://pillumina.github.io/posts/programming/programmer-career/</link>
      <pubDate>Mon, 05 Apr 2021 12:40:29 +0800</pubDate>
      <guid>https://pillumina.github.io/posts/programming/programmer-career/</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;这篇文章摘自陈皓（左耳朵耗子）的blog（2020/08/07上传），其中很多观点击中了我内心的想法，或许可以在我遇到方向性问题的时候给我提醒。&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;这篇文章的主要内容主要是我今年3月份在腾讯做的直播，主要是想让一些技术人员对世界有一个大体的认识，并且在这个认识下能够有一个好的方法成就自己。而不是在一脸蒙圈的状态下随波逐流，而日益迷茫和焦虑。直播完后，腾讯方面把我的直播形成文字的形式发了出来，我觉得我可以再做一个精编版。所以，有了这篇文章，希望对大家有帮助。&lt;/p&gt;
&lt;p&gt;对我来说，在我二十多年的工作经历来看，期间经历了很多技术的更新换代，整个技术模式、业务模式也是一直变来变去，我们这群老程序员成长中所经历的技术比今天的程序员玩的还更杂更多。我罗列一下我学过的，而且还被淘汰掉的技术，大家先感受一下。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;- MIS应用开发：FoxPro，PowerBuilder，Delphi
- OA：Lotus Notes，VBScripts
- 微软：ODBC/ADO，COM/DCOM，MFC/ATL，J++
- 服务器：AIX，HP-UX，SCO Unix
- Web：CGI，ISAPI，SOAP
- RPC：CICS，Tuxedo
- J2EE：Websphere，Weblogic
- DB：Sybase，Informix 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;我想说的是，无论过去还是今天，我们这些前浪和你们后浪所面对的技术的挑战和对技术的焦虑感是相似的，我们那个时候不但玩996，还玩封闭开发（就是一周只能回家一天）。当然，唯一好的东西，就是比起今天的程序员来说，我们那个年代没有像微信、微博、知乎，抖音这些巨大消耗你人生的东西，所以，我们的工作、生活和成长都有很效率，不会被打断、喜欢看书、Google还没有被封……当然，那时代没有StackOverlow和Github这样的东西，所以，能完成的东西或质量都一般。&lt;/p&gt;
&lt;p&gt;当然，这里并不是想做一个比较，只是想让大家了解一下两代程序员间的一些问题各有千秋，大同小异。在整个成长过程中，其实有很多东西是相通的，其本上来说，就是下面的三件事——&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一&lt;/strong&gt;，如果想要把控技术，应对这个世界的一些变化，&lt;strong&gt;需要大致知道这个世界的一些规律和发展趋势，另外还得认识自己&lt;/strong&gt;，自己到底适合做什么？在这个趋势和规律下属于自己的发挥领域到底是什么？这是我们每个人都需要了解的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二&lt;/strong&gt;，&lt;strong&gt;打牢基础，以不变应万变&lt;/strong&gt;，不管世界怎样变化，我都能很快适应它。基础的重要程度对于你能够飞多高是相当有影响的，懂原理的人比不懂原理的人能做出来的事情或是能解决的问题完全是两个层级的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三，提升成长的效率&lt;/strong&gt;，因为现在社会的节奏实在太快了，比二十年前快得太多，技术层出不穷，所以我们的成长也要更有效率。效率并不单指的快，效率是怎么样更有效，是有用功除以总功（参看《&lt;a href=&#34;https://coolshell.cn/articles/10217.html&#34;&gt;加班与效率&lt;/a&gt;》），怎么学到更有效的东西，或者怎么更有效学习，是我们需要掌握的另一关键。&lt;/p&gt;
&lt;p&gt;下面是我这多年来的一些认识，希望对你有帮助。&lt;/p&gt;
&lt;h2 id=&#34;世界发展趋势&#34;&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;1990年代到2000年，这个时代MB时代&lt;/strong&gt;，是雅虎、新浪、搜狐、网易门户网站的时代，这个时代就是ISP/ICP互联网提供商，把一些资讯数字化，然后发布到网络上。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2000年到2010年，这个时代叫GB时代，或是叫多媒体或UGC时代&lt;/strong&gt;，上网开始变得普遍了，每个人手里的数码设备开始变得多了起来，可以上传照片，可以上传视频，甚至可以在网上做社交。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2010年到2020年，这个时代叫TB时代，这过去的十年是移动互联网时代&lt;/strong&gt;，移动互联网只需要手机在线，不需要依靠电脑。因为手机随时在线，所以个人的各种各样的数据始终在被收集，只要用户上网就会产生数据，所以人的行为最终也被数字化了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所有的硬件和软件都是跟着需要处理的数据而演进的，我们需要更大的带宽，更大的硬盘，更多的处理器……大到一定时候就只能进入分布式化的技术架构了，再大，数据中心也顶不住了，就会要引入更为分布式的边缘计算了。&lt;/p&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;h4 id=&#34;人才需求&#34;&gt;人才需求&lt;/h4&gt;
&lt;p&gt;在这个过程中，需要什么样的人？下面是我的一些认识——&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;技工&lt;/strong&gt;，在机器和自动化面前，肯定是需要能够操作机器的技术工人了，这类人是有技术的劳动力。在编程的圈子里俗称“码农”，他们并不是真正的工程师，他们只是电脑程序的操作员，所以，&lt;strong&gt;随着技术门槛的下降或是技术形式的变更他可能就会变得越来越不值钱，直到被淘汰掉&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特种工&lt;/strong&gt;，这种人是必须了解原理和解决难题的一类人，他们是解决比较难的、特定的一些技术问题。&lt;strong&gt;当一种技术被淘汰，他并不容易被淘汰，因为他懂原理，原理就是解决问题的能力，是解决问题的套路和方法&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工程师&lt;/strong&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;，经理主要是组织团队、完成项目、创造利润。这类人中，即有身先士卒的leader，也有高高在上的boss，但无论怎么样，这些人只不过是为了让一个公司或是一个团队更好组织在一起的“粘合剂”，这类人只有在大公司中才会变成更有价值。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这就是我总结的世界需要哪些人才，我们了解这些东西以后大概就明白我们现在所处的位置有什么样的问题，我们应该去什么样的地方。&lt;/p&gt;
&lt;h2 id=&#34;google-评分卡&#34;&gt;Google 评分卡&lt;/h2&gt;
&lt;p&gt;接下来，我们再来看看Google的SRE的自我评分卡：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;0 – 对于相关的技术领域还不熟悉
1 – 可以读懂这个领域的基础知识
2 – 可以实现一些小的改动，清楚基本的原理，并能够在简单的指导下自己找到更多的细节。

3 – 基本精通这个技术领域，完全不需要别人的帮助
4 – 对这个技术领域非常的熟悉和舒适，可以应对和完成所有的日常工作。

对于软件领域 – 有能力开发中等规模的程序，能够熟练和掌握并使用所有的语言特性，而不是需要翻书，并且能够找到所有的冷知识。
对于系统领域 – 掌握网络和系统管理的很多基础知识，并能够掌握一些内核知识以运维一个小型的网络系统，包括恢复、调试和能解决一些不常见的故障。
5 – 对于该技术领域有非常底层的了解和深入的技能。

6 – 能够从零开发大规模的程序和系统，掌握底层和内在原理，能够设计和部署大规模的分布式系统架构
7 – 理解并能利用高级技术，以及相关的内在原理，并可以从根本上自动化大量的系统管理和运维工作。
8 – 对于一些边角和晦涩的技术、协议和系统工作原理有很深入的理解和经验。能够设计，部署并负责非常关键以及规模很大的基础设施，并能够构建相应的自动化设施

9 – 能够在该技术领域出一本经典的书。并和标准委员会的人一起工作制定相关的技术标准和方法。
10 – 在该领域写过一本书，被业内尊为专家，并是该技术的发明人。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;SRE需要自评如下这些技术或技能。&lt;/p&gt;</description>
    </item>
    <item>
      <title>IaaS vs PaaS vs SaaS</title>
      <link>https://pillumina.github.io/posts/programming/iaas-paas-diff/</link>
      <pubDate>Tue, 16 Feb 2021 12:40:29 +0800</pubDate>
      <guid>https://pillumina.github.io/posts/programming/iaas-paas-diff/</guid>
      <description>&lt;p&gt;如果你在考虑将你的在线电子业务转移到云上，下面三个名词会经常遇到：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;IaaS&lt;/li&gt;
&lt;li&gt;PaaS&lt;/li&gt;
&lt;li&gt;SaaS&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这些是&lt;a href=&#34;https://www.bigcommerce.com/ecommerce-answers/what-is-cloud-computing/&#34;&gt;云计算领域的三个主要类别&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;你很可能早就听说过它们，在各种各样的业务转移到云上的趋势下，它们各自占据的不同的比例：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;SaaS占据大概24%的企业负载&lt;/li&gt;
&lt;li&gt;IaaS在12%左右波动&lt;/li&gt;
&lt;li&gt;PaaS是近年来最流行的模型，大概占据32%，且当下和未来会有更多的增长&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;on-premise-saas-paas-iaas的关键区别&#34;&gt;On-Premise, SaaS, PaaS, IaaS的关键区别&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;on-premise这里理解成本地部署的含义，比如企业内部部署的CRM软件系统，其反义词即为云端&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;不久以前，所有公司的IT系统都是on-premise的，云的概念比较模糊和遥远。&lt;/p&gt;
&lt;p&gt;SaaS, PaaS, IaaS只是三种简单描述你如何为你的业务使用云设施的方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;IaaS&lt;/strong&gt;:  cloud-based services, 为存储、网络以及虚拟化等服务提供pay-as-you-go&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PaaS&lt;/strong&gt;: 通过internet提供硬件和软件工具&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SaaS&lt;/strong&gt;: 完全由第三方提供的软件服务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On-Premise&lt;/strong&gt;: 企业内部部署&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面是一个图解：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;breakdown&#34; loading=&#34;lazy&#34; src=&#34;https://www.bigcommerce.com/blog/wp-content/uploads/2018/10/saas-vs-paas-vs-iaas-breakdown.jpg&#34; data-zoomable&gt;
&lt;/p&gt;
&lt;h3 id=&#34;saas-paas-iaas-举例&#34;&gt;SaaS, PaaS, IaaS 举例&lt;/h3&gt;
&lt;p&gt;大多数的业务一般使用SaaS以及IaaS云计算服务模型的组合，此外有很多业务会鼓励开发者使用PaaS去构建应用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SaaS举例&lt;/strong&gt;： BigCommerce, Google Apps, Salesforce, Dropbox, MailChimp, ZenDesk, DocuSign, Slack, Hubspot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PaaS举例&lt;/strong&gt;： AWS Elastic Beanstalk, Heroku, Windows Azure (mostly used as PaaS), Force.com, OpenShift, Apache Stratos, Magento Commerce Cloud.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IaaS举例&lt;/strong&gt;： AWS EC2, Rackspace, Google Compute Engine (GCE), Digital Ocean, Magento 1 Enterprise Edition*.&lt;/p&gt;</description>
    </item>
    <item>
      <title>(转)别让自己墙了自己</title>
      <link>https://pillumina.github.io/posts/programming/do-not-wall/</link>
      <pubDate>Mon, 01 Feb 2021 12:40:29 +0800</pubDate>
      <guid>https://pillumina.github.io/posts/programming/do-not-wall/</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;这篇文章摘自陈皓（左耳朵耗子）的blog（2019/12/01上传），作为给自己的提醒。&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;这一两周与几个朋友聊天，有年轻的90后，也有大叔级的70后，这些人在我看来都是很有能力的人，但是一些喜好过于强烈，让我不经意地回顾了我工作20年来身边的人，有发展得好的，也有发展的不好的，有些人是很可惜的，因为限制他们的不是其它人，也不是环境，而是自己，所以，很想写下这篇文章。（注：这篇文章可能会是一篇说教的文章，所以，可能会让你看着犯困，所以，我会尽量地短一些，而且尽可能多讲故事，少道理，这里的故事，全是真实发生的）&lt;/p&gt;
&lt;h2 id=&#34;几个故事&#34;&gt;几个故事&lt;/h2&gt;
&lt;p&gt;2019年年初，我面试了一个很年轻的小伙子（93/94年出生），这个小伙子特别有灵性，也很聪明，计算机专业出身，也很喜欢技术，基础和学习能力也很好。在我这20年来认识的人中，如果他能呆在北京、上海、深圳这样的城市，我保证不出三年，他会成为他们同龄人中非常出色的技术人员，如果有个好的舞台有一个好的团队带他，他的未来会非常成功。然而，这个小伙子有两大喜好：1）只愿（或是说被迫）呆在一个毫无IT的环境的三/四线城市，2）对技术有非常大的偏好，只喜欢Go语言，非常不喜欢其它的语言，比如：Java（离开Java的世界，基本上离开了做架构的世界（&lt;strong&gt;相关解释见文末&lt;/strong&gt;））。&lt;/p&gt;
&lt;p&gt;他的这两个喜好，足以让一个未来会很优秀的人毁掉，因为，这个时代没有限制他，他的能力也没有限制他，但是他的意识完完全全地限制了他。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;他把自己最宝贵的青春放在了很烂的项目上，就算能用一些新的技术，他也只能算是自娱自乐，在实验室中玩玩具罢了。&lt;/li&gt;
&lt;li&gt;他把自己的技术栈封闭起来，而直接放弃了这个时代最具工业化的技术Java，对于一个好的程序员来说，同时掌握几门语言和技术完全是没什么问题，但是自己封闭了自己的视野。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实在是非常可惜，我本来是可以为他介绍到一些很不错的公司的，但是他这样的习性，等于自己把自己未来的门给关上了，虽然我跟他长谈过，但是我也没有办法叫醒不想醒的人……&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;视野、环境和舞台，对一个人的限制是非常大的。井蛙不知道大海，被空间维度所限制；夏虫不知道冬天，是被时间维度所限制；圈养的动物没有斗志，是被自己意识所限制。&lt;/li&gt;
&lt;li&gt;偏见和不开放，对一个人的限制是真正有毁灭性的。主动让自己成为一个瞎子和聋子，主动把自己的能力阉割掉，这是一件令人痛心的事。想想大清的闭关锁国是如何让亚洲第一的北洋水师给毁掉的……&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我还有个同学，他的技术并不差，就算呆在昆明这种很落后的地方，他也非常地好学，学习英文，学习各种新技术，对技术没有任何的偏好，喜欢C/C++/Java/Python/Shell，同样喜欢前端Javascript，对基础知识非常地踏实，他在技术上没有限制自己的潜力，有什么就学什么。后来，我带他玩Docker/Go/K8S……分布式架构，他也上手的很快……像他这样的人，技术能力完全没得说，比我还大一岁，44岁了，还是一样的天天追代码细节，看Youtube的各种大会，翻github里的各种issue和pull request……&lt;/p&gt;
&lt;p&gt;我同学这人，拥有了成为一个技术牛人几乎所有的条件：基础知识过硬，细节扎得深，面很广，学习能力强，有英文能力，逻辑思维能力不错，非常的自律，执行力也很强，抓得住重点……然而，只有一个小问题，就是没有到大公司历练过，我三番五次叫他从昆明出来，但是最终他都呆在昆明这个城市没有出来，因为有所谓的家庭约束。然而，我身边还有好些人，把自己家从北京搬到上海，从上海搬到深圳，从厦门搬到深圳……这样的人大有人在……像他这样的能力，在哪个公司都会是主力和骨干，对于一个公司的主力和骨干来说，家庭上的这些问题都是小问题都是有很多解的……&lt;/p&gt;
&lt;p&gt;另外，我这个同学还是一个比较悲观的人，任何事情都是先想到不好的事，他关注负面的东西会胜于正面的东西，而且他还有一定的社交恐惧，怕与人相处和交流，时间越长越害怕，甚至有时候直接跟我说，“我就是不想改变”这样的话……其实，我以前也是一个很害怕与人交流的人，面试的时候，我根本不敢正眼看面试官一眼，也不知道与人怎么交流。但是，我与他不一样，我努力克服，不断地面试，与人面对面的交流，到一线技术客服接用户的电话，在公司里做分享，慢慢地到外面分享……3-5年就完全克服掉了。&lt;/p&gt;
&lt;p&gt;其实，很多事情，完全是有解的，也没有必要担心，自己的心理障碍也是可以克服的，重点就是自己愿不愿意，只要愿意完成了一半，接下来就是不断的摸爬滚打坚持了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不限制自己的人，会穷举各种方法来解决问题，限制自己的人，只会找各式各样的问题或借口。&lt;/li&gt;
&lt;li&gt;不限制自己的人，会努力改变自己的问题和缺陷，限制自己的人，会放任自己。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;另外几个故事&#34;&gt;另外几个故事&lt;/h2&gt;
&lt;p&gt;我还有另外几个故事（活到四十多，能看到好多人十几年的发展过程，感觉有点上帝视角了）&lt;/p&gt;
&lt;p&gt;我还有一个以前团队里的一个小伙，人是很聪明，但就完全就是野路子，他对技术没有什么偏好，一个PHP程序员，做那个Discuz!论坛，公司被并购了，转成Java，开始研究Java的各种细节，对技术从来没有什么偏见，有什么就玩什么，每做一个项目，就算是一样的他都要用新的技术做一遍，然后跟着我做云计算，我教他TCP，教他C/C++，后来一起玩Docker/Go，等等，反正是一点就通，他是我见过学习能力最强的人。但是，有一个事他一直与我的想法不一样，就是我希望他先把软件设计好，再写代码，他非常不能理解，他习惯于直接动手开干，然后有什么问题就整什么问题，我也很难教育他。&lt;/p&gt;
&lt;p&gt;有一天，他电话面了一下Facebook，电话面了15分钟后对方就放弃了，他受到了严重的打击。然后，他就开始找菲利宾人练英文口语了，我也让他做算法题，然后，他才发现，一道连算法都不是的纯编程题都提交几次都过不了，等他做完了Leetcode最初的那151道题后，整个人都改变了，写代码前认认真真地在纸上把程序的状态，处理时序以及可能遇到的一些条件先罗列出来，然后，进行逻辑设计后，再写，从此，他就开启他更大的天地了。我后来把他推荐给了微软，先在中国的Bing，在中国升好2-3级，然后去了美国的Azure，现在听说他准备要跟 k8s 的 co-founder &lt;a href=&#34;https://github.com/brendandburns&#34;&gt;Brendan Burns&lt;/a&gt; 混了（虽然，他现在还在印度人手下，但是，我真的不知道他未来能玩多大，因为今年他才33岁，而且非常聪明）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;他以前是把自己封闭起来的，我叫他出来，他也不出来，后来因为一些办公室政治的原因不得不来找我，于是我就带着他玩了两年，跟他讲了很多外面的世界是怎么玩的，他这个人也是一个相当不善于社交的人，但是心是开放的，愿意接受新的东西，虽然对技术也有一定偏见，比如不喜欢Windows，但是也不会不喜欢到完全封闭。后来我跟他说，微软的技术相当的强的，你看到的技术只是表面，深层次的东西都是相通的，直到他到了微软后发现各种牛逼的东西，对微软系统的技术的态度也有了改变，而且我让他跟我说很多微软那边的事，我发现，他对技术了解的维度已经是越来越高级的了……&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;还是我以前团队的一个小伙，他是一个前端，他说前端的东西没什么意思，想来找我做后端，我也一点点带他……后来，我说，你如果想要玩得好，你必需来北京，无论现在你觉得过得有多好，你都要放弃掉，然后，尽最大可能出去经历一下世界最顶尖的公司，我甚至跟他说，如果他女朋友不跟来的话，就先分开一段时间，先自己立业，他来北京的时候，他之前的同事都等着看他的笑话，我说，那些人连想都不敢想，不必管他们。于是，他去了Amazon，再过了一年去了西雅图，我跟他说，接下来就是去AWS，然后，如果有足够的野心，用自己的年轻这个资本去硅谷创业公司赌一把……未来他怎么样我不知道，但至少他没有限制自己，他的未来不会有封顶……&lt;/p&gt;
&lt;p&gt;也是我的同学，我跟他在大学是上下铺，后来他去了人民大学读计算机博士，大学的时候做国产数据库kingbase，然后去了一家外企，天天被派到用户那边做数据分析，后来，他想回科研单位做国产数据库，我说，别啊，你的技术比我好太多，还有博士理论加持，你不去国外顶尖公司玩玩，你不知道自己有多强的，于是他跟公司申请去了国外做核心，后来因为Hadoop的原因，公司的产品最终成为了历史，于是我说，你来了美国么，你一定要去AWS，于是他就去了AWS的Aurora团队，成为了AWS明星级产品的中坚力量，天天在改MySQL的核心源码，干了两年，正在晋升 Principal Software Engineer ……&lt;/p&gt;
&lt;p&gt;这里我到不是说出国有多牛，也许你只关注能挣多少钱，但是我想说，他们之所以能有这样的际遇，除了他们本来就有实力，还更因为他们从来不给自己设制什么限制，就是那种“艺多不压身”，有什么就学什么，有更高的就去向更高的迈进，其它的像家庭什么的问题其实都是会有解的，真的不必担心太多……&lt;/p&gt;
&lt;h2 id=&#34;别限制了自己&#34;&gt;别限制了自己&lt;/h2&gt;
&lt;p&gt;上面的这些故事，也许你能看得懂，也许你看得不一定能懂，这里，让我来做个总结吧&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;做有价值的事&lt;/strong&gt;。这个世界对计算机人才的要求是供不应求的，所以，不要让自己为自己找各式各样的借口，让自己活在“玩玩具”、“搬砖”和“使蛮力加班”的境地。其实，我发现这世界上有能力的人并不少，但是有品味的人的确很少。&lt;strong&gt;所谓的有价值，就是，别人愿付高价的，高技术门槛的，有创造力的，有颠覆性的&lt;/strong&gt;……&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;扩大自己的眼界，开放自己的内心&lt;/strong&gt;。人要变得开放，千万不要做一个狭隘的民族主义者，做一个开放的人，把目光放在全人类这个维度，不断地把自己融入到世界上，而不是把自己封闭起来，这里，&lt;strong&gt;你的英文语言能力对你能不能融入世界是起决定性的作用&lt;/strong&gt;。开放自己的心态，正视自己的缺点，你才可能往前迈进。&lt;strong&gt;你的视野决定了你的知不知道要去哪，你的开放决定了你想不想去&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;站在更高的维度&lt;/strong&gt;。面的维度会超过点的维点，空间的维度会超过面的维度，在更高维度上思考和学习，你会获得更多。&lt;strong&gt;整天在焦虑那些低维度的事（比如自己的薪水、工作的地点、稳不稳定、有没有户口……），只会让你变得越来越平庸，只要你站在更高的维度（比如： 眼界有没有扩大、可能性是不是更多、竞争力是不是更强、能不能解决更大更难的问题、能创造多大的价值……），时间会让你明白那些低维度的东西全都不是事儿&lt;/strong&gt;。技术学习上也一样，站在学习编程语法特性的维度和站在学习编程范式、设计模式的维度是两种完全不一样的学习方式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;精于计算得失&lt;/strong&gt;。很多人其实不是很懂计算。绝大多数人都是在算计自己会失去多少，而不会算会得到多少。而一般的人也总是在算短期内会失去什么，优秀则总是会算我投入后未来会有什么样的回报，前者在算计今天，目光短浅，而后者则是舍在今天，得在明天，计算的是未来。&lt;em&gt;&lt;strong&gt;*精于计算得失的，就懂得什么是投资，不懂的只会投机。对于赚钱，你可以投机，但是对于自己最好还是投资。*&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;勇于跳出传统的束缚&lt;/strong&gt;。有时候，跳出传统并不是一件很容易的事，因为大多数人都会对未知有恐惧的心理。比如：我看到很多人才都被大公司垄断了，其实，有能力的人都不需要加入大公司，有能力的人是少数，这些少数的人应该是所有的公司share着用的，这样一来，对于所有的人都是利益最大化的。这样的事现在也有，比如：律师、设计师……。但是，绝大多数有能力的技术人员是不敢走出这步。我在2015年到2016年实践过一年半，有过这些实践，做“鸡”的比“二奶”好多了，收入也好很多很多（不好意思开车了）……&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;庄子说过几句话——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;井蛙不可以语于海者，拘于虚也；//空间局限&lt;/p&gt;
&lt;p&gt;夏虫不可以语于冰者，笃于时也；//时间局限&lt;/p&gt;
&lt;p&gt;曲士不可以语于道者，束于教也。//认识局限&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;别自己墙了自己，人最可悲的就是自己限制自己，想都不敢想，共勉！&lt;/p&gt;
&lt;p&gt;————————————————————&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注：这篇文章就是要劝大家更为开放，让自己有更多的可能性，能到更高的层次，做更有价值的事，成为更强更好的人……当然，如果你觉得你只想做一个平凡人，也和本文并不冲突……另外你也不要觉得这篇文章是让你要成为一个精英，但你一定要去摸高……这篇文章是告诉你一种面对人生的思考方式，在这种思考方式下，你会有更多的可能性，更大的场景……而不是直接把自己归到“平常人”，把自己“墙”了！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;注：我以为用Java适合做架构这事应该是常识了，但是评论中有很多人非常反对这个事。那我解释一下吧：首先，小型的项目用什么语言都行，爱用什么用什么。但是，真正的企业级架构就不一样了，其中并不仅仅只是RESTful API或RPC，还有各种配套设施和控制系统，比如：应用网关，服务发现、配置中心、健康检查、服务监控、服务治理（熔断、限流、幂等、重试、隔离、事务补偿）、Tracing监控、SOA/ESB、CQRS、EDA……这些东西在非Java的技术栈体系内，很难看到全貌，&lt;strong&gt;Java强大的生态环境，就是让你把注意力放到更高层次的架构和业务上来的&lt;/strong&gt;。（千万不要觉得，整几个服务RPC一下，加个缓存，加个队列，就能叫架构，那只是系统集成罢了）&lt;/p&gt;</description>
    </item>
    <item>
      <title>(转)工程师应该如何高效学习</title>
      <link>https://pillumina.github.io/posts/programming/how-to-learn/</link>
      <pubDate>Mon, 01 Feb 2021 12:40:29 +0800</pubDate>
      <guid>https://pillumina.github.io/posts/programming/how-to-learn/</guid>
      <description>&lt;p&gt;&lt;code&gt;此文转自曹春晖blog，也用于自己学习的一些参考&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://xargin.com/every-arch-will-finally-become-shit/&#34;&gt;博客地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;阅读书籍&#34;&gt;阅读书籍&lt;/h2&gt;
&lt;p&gt;对于工程师来说，从书籍得来的知识是必不可少的。现在很多年轻的程序员会从网络博客来学习技术，但博客内容大多缺乏体系(主要说总结性质的博客内容)，不系统。很多博主为了掩饰自己的未知，遇到不知道的关键点就一笔带过，进而导致缺失。即使原作者非常努力，内容上没有缺失，你能从中获取的也只是别人总结好的知识，没有自己的主动思考，这中间便缺少过程式的沉淀，一味地满足于背诵别人总结好的知识，最后也只不过沦为他人的复读机而已。&lt;/p&gt;
&lt;p&gt;对于工程师来说，书籍依然是最重要的知识获取媒介。即使只是通过目录概览，也能获取某个领域的大致蓝图。&lt;/p&gt;
&lt;p&gt;目前大部分优秀的技术书籍依然以英文为主，能够读懂英文技术书籍是工程师的硬实力。英语阅读能力怎么训练呢？如果不是为了应试，可以尝试逼迫自己去翻译一些英文文档/文章来进行专门训练。举个例子，为了学习 Go，笔者曾经和社区的小伙伴合作翻译过&lt;a href=&#34;https://github.com/gopl-zh/gopl-zh.github.com&#34;&gt;《The Go Programming Language》&lt;/a&gt;，后来为了深入学习 es，参与了社区的 &lt;a href=&#34;https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html&#34;&gt;《es 权威指南》&lt;/a&gt; 的翻译和校对工作。如果某篇技术文档你从生理上很厌恶它，但是又觉得内容不得不学习的话，那你就逼迫自己去翻译它。千字以内的文档，周末抽一个下午就可以搞定。这里已经说是逼迫了，自然可以想见这个过程并不像打游戏那么轻松愉快，但只要熬过了这个阶段，阅读技术相关的英文文档可以显著提升速度。&lt;/p&gt;
&lt;p&gt;具备一定的英语能力之后，接下来就是从什么渠道去获取内容。如果对电子书不排斥的话，目前比较经济的选择是申请一个国内的 ACM 会员，并且用该会员去注册&lt;a href=&#34;https://learning.oreilly.com/home/&#34;&gt;oreily 在线书店&lt;/a&gt;。一年大概 20 美元，可以及时地阅读到大部分出版社的技术出版物。因为现在出版社的网站大多还支持 early preview，所以你甚至可以在书籍还没有上市之前就预先学习内容，第一时间获取整个业界的一线情报，能够帮助你站在时代的潮头。等两年后同事拿到翻译生涩的中文版的时候，你已经可以从容地 diss 他在信息源上落后了自己整整两年。(当然，如果你有兴趣，国内的出版社一般在英文新书出版的时候会招募翻译志愿者，如果你对一个领域特别感兴趣，关注出版社的这些招募消息也可以去参与。这里要指出，不要对做翻译这件事情抱太高期望，重在提升自己的能力。想赚钱的话就算了。)&lt;/p&gt;
&lt;p&gt;如果喜欢一边阅读一边在页边写写画画，电子书还是稍微困难点，当然这个问题你也可以用 ipad pro + apple pencil 来解决。但有些人比较喜欢实体书捧在手上的实感，国外有些书甚至是个人出版物，例如笔者之前购入的《timeless law of software development》，这些书在互联网上正盗均无，只能考虑通过海淘渠道入手。前些年淘宝的海淘服务也可以用来淘书，书籍大多比较重，运费不菲。有些老书运费可能会到书费的一半让人格外肉疼。又因为国内对出版物管制比较严格，所以为了避险，这两年这些海淘服务商基本上都不帮忙代购出版物了。对于个人用户来说，也就只剩下了直邮和转运两种选择。直邮虽然比较便宜，但是万国联盟的 EMS 一走到中国可能就上了牛车，速度慢到突破极限。基本脑子稍微正常的都会选择转运。除了速度之外，有些出版社的书籍是只在美帝本土销售的，不支持 global delivery。&lt;/p&gt;
&lt;p&gt;走转运的话，需要办一张 visa 或者 mastercard 的多币种信用卡，这样才能在海外网站进行支付 。&lt;/p&gt;
&lt;p&gt;上面这些问题都解决了以后，书籍的获取就不再是问题。&lt;/p&gt;
&lt;h2 id=&#34;信息源&#34;&gt;信息源&lt;/h2&gt;
&lt;p&gt;虽然文章开头对于传统的书籍大赞特赞，但书籍的缺点也是显而易见的。在技术领域，这个缺点就尤为明显：时效问题。如果我们所学习的是相对比较老的领域知识，那只要读书基本上就够了。&lt;/p&gt;
&lt;p&gt;但技术的发展日新月异，如果你想要成为知晓领域内所有新技术的那个人。你还是需要关注一些书籍以外的新闻源，下面是一些例子：&lt;/p&gt;
&lt;h3 id=&#34;github-trending&#34;&gt;Github Trending&lt;/h3&gt;
&lt;p&gt;Github Trending 代表的是一种风向，一般一个项目能上 trending 的话，可能是作者自己去 hacker news、reddit 做了宣传，也可能是被某个业界大佬带了流量。因为现在 Github 上的国人越来越多，很多国人学习技术比较显著的诉求其实只是面试(汗，一旦什么 xx interview/xx road to 架构师之类的仓库开了就会吸引一大批国人点星，近两年 trending 的质量有下跌趋势。&lt;/p&gt;
&lt;p&gt;不过最近 Github Trending 增加了按照 Spoken Language 筛选功能，所以你可以过滤特定的语言，相对比之前还是好多了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Black Magic</title>
      <link>https://pillumina.github.io/posts/programming/black-magic/</link>
      <pubDate>Sun, 20 Dec 2020 12:40:29 +0800</pubDate>
      <guid>https://pillumina.github.io/posts/programming/black-magic/</guid>
      <description>&lt;p&gt;&lt;code&gt;阅读到的一些方便、有趣的技巧或者ideas的随手记录，后续考虑对相关话题专门开坑&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;一行代码画出专业的论文图&#34;&gt;一行代码画出专业的论文图&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/garrettj403/SciencePlots&#34;&gt;SciencePlots&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;计算机专业向来不缺少专业的绘图软件，从Excel到PPT，从最近沸沸扬扬的Matlab到Matplotlib、pyplot、ggplot，乃至其他更为专业的软件，着实丰富了我们的画图生活。&lt;/p&gt;
&lt;p&gt;但是，这些软件或工具的背后，常常需要我们付出更多的努力：调色、统一格式、展示要高大上，等等。&lt;/p&gt;
&lt;p&gt;现在，一款开源的软件工具包问世了：&lt;strong&gt;SciencePlots&lt;/strong&gt;。它让你用一行代码画出天然高端且美观的论文图。&lt;/p&gt;
&lt;p&gt;SciencePlots是一个依附于Matplotlib的扩展包，可以通过pip一键安装：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install SciencePlots
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后我们在画图时，只需要一句&lt;code&gt;with.plt.style.context([&#39;science&#39;]):&lt;/code&gt;，就可以画出非常美观且专业的图：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;plot1&#34; loading=&#34;lazy&#34; src=&#34;https://pic1.zhimg.com/80/v2-90ced58bd948b48122c7c49f6dd3aeb8_1440w.jpg&#34; data-zoomable&gt;
&lt;/p&gt;
&lt;p&gt;你还可以加一个选项&lt;code&gt;with.plt.style.context([&#39;science&#39;,&#39;ieee&#39;]):&lt;/code&gt;，就能画出IEEE格式的图：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;plot-ieee&#34; loading=&#34;lazy&#34; src=&#34;https://pic3.zhimg.com/80/v2-65a94e294409928599dc91745f01662e_1440w.jpg&#34; data-zoomable&gt;
&lt;/p&gt;
&lt;p&gt;甚至是超美的散点图：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;plot-scatter&#34; loading=&#34;lazy&#34; src=&#34;https://pic4.zhimg.com/80/v2-db5c1cc749638e5bfba236fa9acdb4ff_1440w.jpg&#34; data-zoomable&gt;
&lt;/p&gt;
&lt;p&gt;还有很多自定义的图像风格，保证节约我们的画图时间&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这个包默认会调用latex来画图，如果不想用latex（也不是完全需要），可以在context里写一个属性&amp;rsquo;nolatex&amp;rsquo;即可。不然如果没有安装latex或latex路径配置有问题，则会报错。&lt;/p&gt;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>书单记录</title>
      <link>https://pillumina.github.io/posts/programming/links/</link>
      <pubDate>Sat, 19 Dec 2020 12:40:29 +0800</pubDate>
      <guid>https://pillumina.github.io/posts/programming/links/</guid>
      <description>&lt;p&gt;&lt;code&gt;这个post为记录目前正在阅读与研究的section&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;go语言设计&#34;&gt;Go语言设计&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://draveness.me/golang/&#34;&gt;Go语言设计与实现&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://golang.design/under-the-hood/&#34;&gt;Go Under The Hood&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;这两本在写作目的和内容规划都是一致的，不过第二个原本不再维护内容，作者开了下面的新的项目，把撰写原本而积累的与Go相关的资源进行了重新的整理。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&#34;[golang.design/history]%28https://changkun.de/s/go-history%29&#34;&gt;Go设计历史&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;pprof对服务端性能影响的研究&#34;&gt;pprof对服务端性能影响的研究&lt;/h2&gt;
&lt;p&gt;考虑一些极端场景，比如极度追求性能，压榨系统资源以及技术栈必须是Go的业务场景下，是否能自己构建Reactor网络模型&lt;/p&gt;
&lt;h2 id=&#34;grpc框架对服务侧性能的影响&#34;&gt;GRPC框架对服务侧性能的影响&lt;/h2&gt;
&lt;h2 id=&#34;russ-cox正则表达式系列&#34;&gt;Russ Cox正则表达式系列&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;You should not be permitted to write production code if you do not have an journeyman license in regular expressions or floating point math. &amp;ndash; Rob Pike&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://swtch.com/~rsc/regexp/regexp1.html&#34;&gt;Regular Expression Matching Can Be Simple And Fast&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cnblogs.com/Ninputer/archive/2011/06/08/2075714.html&#34;&gt;编译器词法分析:正则语言和正则表达式&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;go内存原理与调度模型&#34;&gt;Go内存原理与调度模型&lt;/h2&gt;
&lt;p&gt;正在整理专栏&lt;/p&gt;
&lt;h2 id=&#34;bound-checking-elimination&#34;&gt;Bound Checking Elimination&lt;/h2&gt;
&lt;h2 id=&#34;crafting-interpreter&#34;&gt;Crafting Interpreter&lt;/h2&gt;
&lt;p&gt;时常看PL和Compiler的基础&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://craftinginterpreters.com/contents.html&#34;&gt;crafting interpreters&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;kosarajus-algorithm&#34;&gt;Kosaraju&amp;rsquo;s Algorithm&lt;/h2&gt;
&lt;p&gt;看William Lin的coding interview觉得用来处理树和图很好，算法4里也有&lt;/p&gt;
&lt;h2 id=&#34;heilmeier问题系列&#34;&gt;Heilmeier问题系列&lt;/h2&gt;
&lt;p&gt;思考某篇paper的选题&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;What are you trying to do?&lt;/strong&gt; Articulate your objectives using absolutely no jargon.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How is it done today, and what are the limits of current practice?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who cares?&lt;/strong&gt; [Support other’s research? Shape research landscape? Power applications in industry?]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What&amp;rsquo;s new in your approach&lt;/strong&gt; and why do you think it will be successful?&lt;/li&gt;
&lt;li&gt;If you&amp;rsquo;re successful, &lt;strong&gt;what difference will it make?&lt;/strong&gt; [e.g. Contributions in theory/modeling? Improve accuracy by 5% on dataset A, B, C…?]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What are the risks and the payoffs?&lt;/strong&gt; [Further, how would you mitigate the risks? If your proposed method does not work, what could be alternative design? These can end up as discussions such as ablation studies in your paper.]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How much will it cost?&lt;/strong&gt; [e.g. How many GPUs do your experiments require? How long is each training process? How about data storage?]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How long will it take?&lt;/strong&gt; [How many hours are you going to work on this per week? When is the submission DDL? Can you make it?]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What are the midterm and final &amp;ldquo;exams&amp;rdquo; to check for success?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
    </item>
  </channel>
</rss>
