<?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>Coding on Jimmy's Blog</title><link>https://blog.jimersylee.com/tags/coding/</link><description>Recent content in Coding on Jimmy's Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 29 May 2023 05:15:00 +0800</lastBuildDate><atom:link href="https://blog.jimersylee.com/tags/coding/index.xml" rel="self" type="application/rss+xml"/><item><title>为什么我们不愿意code review</title><link>https://blog.jimersylee.com/posts/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%BB%AC%E4%B8%8D%E6%84%BF%E6%84%8Fcode-review/</link><pubDate>Mon, 29 May 2023 05:15:00 +0800</pubDate><guid>https://blog.jimersylee.com/posts/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%BB%AC%E4%B8%8D%E6%84%BF%E6%84%8Fcode-review/</guid><description>&lt;h2 id="介绍"&gt;介绍&lt;/h2&gt;
&lt;p&gt;Code review 是软件开发的重要组成部分。它是指由一名开发者对另一名开发者编写的代码进行审查，以确保符合编码标准、高效并无错误。这种过程是团队合作和质量保障的重要环节，有助于提高代码的可维护性和可读性，降低代码缺陷率，保证软件质量和安全性。然而，尽管它的重要性，许多团队仍难以有效地实施 code review。在本篇博客中，我们将探讨几个原因，为什么 code review 很难推进执行。&lt;/p&gt;
&lt;h2 id="缺乏时间"&gt;缺乏时间&lt;/h2&gt;
&lt;p&gt;实施 code review 面临的最大挑战之一是缺乏时间。在软件开发项目中，时间非常宝贵，开发人员需要紧密协作，不断推进项目进度以满足客户的要求和期望。日常的任务往往已经排满，且项目进度紧张，将 code review 加入日程表可能会导致难以满足截止日期。此外，code review 需要大量的时间和注意力，这使得它难以融入已经排满的日程中。因此，code review 可能会被搁置或赶工，导致效果不佳。&lt;/p&gt;
&lt;h2 id="抵制变化"&gt;抵制变化&lt;/h2&gt;
&lt;p&gt;另一个导致 code review 难以实施的原因是抵制变化。作为开发人员，每个人都有自己的编程习惯和风格，已经习惯了某种工作方式，可能不愿意接受新的流程或工具。在某些情况下，开发人员可能认为 code review 是不必要的，他们的代码已经足够好了。在这些情况下，很难获得团队的认同，code review 可能会被视为阻碍而不是有帮助的流程。因此，为了让 code review 更好地融入软件开发项目中，需要在团队中树立共识，让每个人明白 code review 的重要性，以及它对整个项目的质量和项目进度的影响。&lt;/p&gt;
&lt;h2 id="缺乏责任制"&gt;缺乏责任制&lt;/h2&gt;
&lt;p&gt;最后，缺乏责任制可能会使实施 code review 成为一项挑战。如果没有人负责确保 code review 及时进行，可能根本不会进行。在某些情况下，开发人员可能会假定其他人会接手他们的工作失误，导致延迟和错过截止日期。为避免这种情况，建立清晰的 code review 流程所有权并确保每个人都知道自己的责任至关重要。需要指定专人负责 code review 的执行，并建立相应的流程和标准，确保每个人都清楚自己的角色和职责，以及执行的时间和方式。&lt;/p&gt;
&lt;h2 id="合并困难"&gt;合并困难&lt;/h2&gt;
&lt;p&gt;在一个项目中，如果不同的程序员使用不同的代码风格编写代码，合并代码时会遇到一些问题。这些问题包括变更点过多，很难分清什么是业务代码，什么是格式化导致的变更。因此，为了避免这种情况，我们需要制定一套标准的代码风格，并确保所有的程序员都遵守这个标准。这样可以使代码更易于阅读和维护。此外，我们还可以使用自动化工具，如代码格式化器，来自动化执行代码风格指南中的规则，并确保所有的代码都符合标准。这样可以节省时间和减少错误。&lt;/p&gt;
&lt;h2 id="提交不够独立"&gt;提交不够独立&lt;/h2&gt;
&lt;p&gt;在第一次审核中，发现有太多的提交次数，这导致涉及的文件过多，给后续的分析带来了很大的困难。&lt;/p&gt;
&lt;h2 id="权限问题"&gt;权限问题&lt;/h2&gt;
&lt;p&gt;如果项目的权限集中在某几个人手中，则可能出现以下问题：第一，由于这些人的原因，可能会导致 code review 请求无法及时处理；第二，这些人可能会因为自己的优先事项而错过一些重要的 code review 请求，从而造成项目的延误；第三，这些人可能会对他们不熟悉的代码审查请求感到不耐烦，从而使得 code review 的效率受到影响。&lt;/p&gt;
&lt;h1 id="代码审查的好处"&gt;代码审查的好处&lt;/h1&gt;
&lt;p&gt;一个精心设计的代码审查过程和认真对待代码审查的文化可以在短期内没有质变的好处，但是长期来看可以解决以下问题：&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;li&gt;从心理上促进团队的所有权。新入职员工看到一段代码，可能提交者是个离职员工，现在已经找不到了。但是这段代码现在是谁维护呢？可以查看OWNERS文件找到这个人。&lt;/li&gt;
&lt;li&gt;实现知识共享&lt;/li&gt;
&lt;li&gt;提供代码审查本身的历史记录。某段代码不知道为什么这么写，可以在Git仓库找到这个合并链接，查找review时的评论，理解为什么这样修改&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="改进措施"&gt;改进措施&lt;/h1&gt;
&lt;p&gt;以下是一些可以实际操作的让团队爱上 code review 的措施：&lt;/p&gt;</description></item><item><title>使用json_table实现json转关系表,进行聚合统计</title><link>https://blog.jimersylee.com/posts/%E4%BD%BF%E7%94%A8json_table%E5%AE%9E%E7%8E%B0json%E8%BD%AC%E5%85%B3%E7%B3%BB%E8%A1%A8%E8%BF%9B%E8%A1%8C%E8%81%9A%E5%90%88%E7%BB%9F%E8%AE%A1/</link><pubDate>Fri, 15 Jul 2022 11:40:00 +0000</pubDate><guid>https://blog.jimersylee.com/posts/%E4%BD%BF%E7%94%A8json_table%E5%AE%9E%E7%8E%B0json%E8%BD%AC%E5%85%B3%E7%B3%BB%E8%A1%A8%E8%BF%9B%E8%A1%8C%E8%81%9A%E5%90%88%E7%BB%9F%E8%AE%A1/</guid><description>&lt;h2 id="表结构"&gt;表结构&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;article,&lt;span style="color:#e6db74"&gt;&amp;#34;CREATE TABLE `article` (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; `id` bigint(20) NOT NULL AUTO_INCREMENT,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; `title` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; `content` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; `create_at` bigint(20) DEFAULT NULL,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; `update_at` bigint(20) DEFAULT NULL,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; `user_id` bigint(20) DEFAULT NULL,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; `category_id` bigint(20) DEFAULT NULL,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; `tags_string` json DEFAULT NULL,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; PRIMARY KEY (`id`)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="table-data"&gt;table data&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;标题1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;content111&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;create_at&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1640966400&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;update_at&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;123123123&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;user_id&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;12123132&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;category_id&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tags_string&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;[\&amp;#34;&lt;/span&gt;linux&lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;, \&amp;#34;&lt;/span&gt;dev&lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;标题2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;111&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;create_at&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;111&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;update_at&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;user_id&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;category_id&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tags_string&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;[\&amp;#34;&lt;/span&gt;linux&lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sql"&gt;SQL&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;select&lt;/span&gt; a.tag,&lt;span style="color:#66d9ef"&gt;count&lt;/span&gt;(a.tag) &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;count&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;from&lt;/span&gt; article, json_table(tags_string,&lt;span style="color:#e6db74"&gt;&amp;#39;$[*]&amp;#39;&lt;/span&gt; columns (tag varchar(&lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;) PATH &lt;span style="color:#e6db74"&gt;&amp;#39;$&amp;#39;&lt;/span&gt;)) a &lt;span style="color:#66d9ef"&gt;group&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;by&lt;/span&gt; a.tag;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="result"&gt;Result&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;linux,&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dev,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>