<?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>Everything-as-Code on 翟志军 Jack Zhai</title>
    <link>https://showme.codes/tags/everything-as-code/</link>
    <description>Recent content in Everything-as-Code on 翟志军 Jack Zhai</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <copyright>showme.codes</copyright>
    <lastBuildDate>Thu, 20 Apr 2023 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://showme.codes/tags/everything-as-code/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>当同事实践Everything as Code之后</title>
      <link>https://showme.codes/zh-cn/2023-04-20-when-coworker-use-everything-as-code/</link>
      <pubDate>Thu, 20 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://showme.codes/zh-cn/2023-04-20-when-coworker-use-everything-as-code/</guid>
      <description>&lt;h3 id=&#34;背景&#34;&gt;背景&lt;/h3&gt;
&lt;p&gt;团队基于Jsonnet（配置语言）和Bazel（构建工具）实现Everything as Code。但是，将近一年的时间里，团队也只有少数人深入参与Everything as Code的代码的编写（其实，大多数人是不需要深入参与）。&lt;/p&gt;
&lt;p&gt;最近，组内的一个开发同学——他之前对Everything as Code完全零基础——在运维同事的辅助下，为网关配置增加了金丝雀的能力。&lt;/p&gt;
&lt;p&gt;在这种能力下，开发人员可以只需要改几行配置，并部署配置，就可以实现金丝雀发布。这种能力的根本就是：通过Jsonnet动态生成网关“根据Header进行流量路由”的配置的能力。&lt;/p&gt;
&lt;p&gt;如果没有这种能力，需要手写大量的重复的YAML配置，即麻烦，又容易出错。&lt;/p&gt;
&lt;h3 id=&#34;同事使用everything-as-code的工具后有感&#34;&gt;同事使用Everything as Code的工具后有感&lt;/h3&gt;
&lt;p&gt;在他与Everything as Code“亲密”接触一个多月后，他说出了他的感受：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;直接写yaml的话，所见即所得，非常直观。但是有个致命缺陷，没法动态化生成配置，所以必须要寻找一个脚本语言。&lt;/li&gt;
&lt;li&gt;jsonnet其实就是一门简单化的脚本语言，通过自定义方法，通过for循环，通过读取自定义的变量，更灵活生成我们想要的json。但是写代码都有一个共性，代码可以写的很复杂，现在用jsonnet了，你想看一个key的value是什么，需要看懂别人的代码才知道value是什么甚至可能理解错别人的代码，违背了配置所见即所得，这对新手来说非常痛苦。很多时候，我们不关心jsonnet的过程，我们只想看到生成最终的配置文件是什么。&lt;/li&gt;
&lt;li&gt;如果能把云端编译好的jsonnet展示出来，就可以看到生成的最终json是啥了，但是我们没有。所以需要本地搭建bazel，但是bazel对win非常不友好，搞起来非常困难，但是本地如果不能把monorepo buil通过，那么可以宣告你无法彻底搞清楚monorepo，更不可能自定义更多自己想要的东西了。&lt;/li&gt;
&lt;li&gt;既然是通过代码来生成json，用jsonnet和python和js甚至是用java都可以，现在我觉得jsonnet的设计者对灵活性做了一个取舍，有一些我想要的操作jsonnet没法实现。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;然后他又补充到：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;只要自己本地能build monorepo，那么就既能享受jsonnet的灵活性，又能通过编译好的文件做到所见即所得。可惜bazel对win不友好，新手能在win 编译通过mainrepo太难了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;总结下来，这位同事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;对Jsonnet的理解还不够：Jsonnet并不是脚本语言，而是一门可编程的配置语言，一种为配置而生的DSL（领域特定语言）；&lt;/li&gt;
&lt;li&gt;在Windows系统上使用Bazel遇到了非常大的阻力。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以上是同事针对Jsonnet和构建工具Bazel的感受。&lt;/p&gt;
&lt;p&gt;我认为不是Bazel对Windows不友好，而是Bazel在Windows下的生态太弱了。谁叫后端服务是Linux的天下呢？&lt;/p&gt;
&lt;h3 id=&#34;同事对everything-as-code本身的看法&#34;&gt;同事对Everything as Code本身的看法&lt;/h3&gt;
&lt;p&gt;接着，他说出对Everything as Code的看法：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我觉得everything as code太理想，只能面向开发人员。你不能保证运维的能力，绝对不开放给第三方使用。指不定某天某个需求就需要你的运维的某个能力，让不懂代码的人也要操作。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;假如某个运维能力，要开放给产品或者测试来用，要让别人给你学个jsonnet，那要我是产品或者测试只能口吐芬芳了。所以我认为，面向开发者的部分，使用every thing as code是趋势，比较好溯源跟踪，迭代。但是架构设计上，还需要有支持面向第三方的部分，可以做到让不懂代码的人也能用到一些运维的能力。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这位同事实现的是金丝雀配置生成，是需要修改Jsonnet代码的。当产品经理需要将某用户的流量路由到后端服务的某个版本上时，这位同事就认为产品经理就需要去改Jsonnet代码了。&lt;/p&gt;
&lt;p&gt;同事认为这就是Everything as Code的问题：不方便非开发人使用。&lt;/p&gt;
&lt;p&gt;同事的另一层意思没有说出来：并不是所有的事情都适合as Code。&lt;/p&gt;
&lt;p&gt;其实，有这样的误解很正常，“Everything as Code”中的“Everything”字面含义上就是所有的，一切的意思。而Code是代码的意思。&lt;/p&gt;
&lt;p&gt;所以，“Everything as Code”字面上完整的意思是：一切皆代码。&lt;/p&gt;
&lt;p&gt;从字面上理解“Everything as Code”，只看到了它的表面&lt;/p&gt;
&lt;h3 id=&#34;everything-as-code的本质&#34;&gt;Everything as Code的本质&lt;/h3&gt;
&lt;p&gt;“Everything as Code”中的”Code“，其实指的是配置，即：一切皆配置。&lt;/p&gt;
&lt;p&gt;这句话本身是没有错的，如同“道生一，一生二，二生三，三生万物“这句话。&lt;/p&gt;
&lt;p&gt;“Everything as Code”这句话并没说什么是配置，以及哪些配置该放哪。这才是我们实践时真正要考虑的问题。&lt;/p&gt;
&lt;p&gt;配置的本质是软件的灵活（soft）部分。通过这个”灵活部分“，我们可以根据自己的需求，有限地改变软件的行为。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
