<?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" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ 编程 - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ freeCodeCamp 是一个免费学习编程的开发者社区，涵盖 Python、HTML、CSS、React、Vue、BootStrap、JSON 教程等，还有活跃的技术论坛和丰富的社区活动，在你学习编程和找工作时为你提供建议和帮助。 ]]>
        </description>
        <link>https://www.freecodecamp.org/chinese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ 编程 - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/chinese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 11 May 2026 15:33:08 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/chinese/news/tag/coding/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ 降序和升序是什么意思？ ]]>
                </title>
                <description>
                    <![CDATA[ 你可能以前听说过降序和升序这两个术语，但它们到底是什么意思？ 本文以通俗的语言解释了这两个术语的基本区别，并给出了一个类比，可能有助于你区分它们。 什么是降序？ 当一系列数据从高到低或从大到小排列时，这意味着它是按降序排列的，也被称为递减顺序。 这可以适用于任何一组信息，如数字、日期、物体的大小或字母——同样的原则适用于你所处理的任何问题。 例如，将一组数字从最大值到最小值排序，意味着你是按降序排列的。 假设你有以下数字：49, 80, 56, 11, 20。 按降序排序会是这样的：80, 56, 49, 20, 11。 你总是先从左边最大的数字开始，然后到右边最小的数字结束。在这个例子中，80 是最大的，11 是最小的。中间的数字也是按照从大到小的顺序。 数字不断减少，每一个数字都比这一行中的前一个数字小。 字母表中的字母也是如此。当把它们按降序排列时，你会把它们从 Z 写到 A（倒过来写），也就是从结尾到开头。 当你把事情按时间顺序排列时，日期也是如此——它们从最新、最近的一个排列到最古老的一个。 想想看，这就像下一组楼梯——你从一个高处开始，最后在一个较低的 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/descending-order-vs-ascending-order-what-does-it-mean/</link>
                <guid isPermaLink="false">63adabd7f490ad0743626952</guid>
                
                    <category>
                        <![CDATA[ 编程 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Wed, 21 Dec 2022 06:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/12/justin-main-iCjri8xaV7w-unsplash.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/descending-order-vs-ascending-order-what-does-it-mean/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Descending Order VS Ascending Order – What Does it Mean?</a>
      </p><p>你可能以前听说过降序和升序这两个术语，但它们到底是什么意思？</p><p>本文以通俗的语言解释了这两个术语的基本区别，并给出了一个类比，可能有助于你区分它们。</p><h2 id="-">什么是降序？</h2><p>当一系列数据从高到低或从大到小排列时，这意味着它是按降序排列的，也被称为递减顺序。</p><p>这可以适用于任何一组信息，如数字、日期、物体的大小或字母——同样的原则适用于你所处理的任何问题。</p><p>例如，将一组数字从最大值到最小值排序，意味着你是按降序排列的。</p><p>假设你有以下数字：<code>49, 80, 56, 11, 20</code>。</p><p>按降序排序会是这样的：<code>80, 56, 49, 20, 11</code>。</p><p>你总是先从左边最大的数字开始，然后到右边最小的数字结束。在这个例子中，<code>80</code> 是最大的，<code>11</code> 是最小的。中间的数字也是按照从大到小的顺序。</p><p>数字不断减少，每一个数字都比这一行中的前一个数字小。</p><p>字母表中的字母也是如此。当把它们按降序排列时，你会把它们从 Z 写到 A（倒过来写），也就是从结尾到开头。</p><p>当你把事情按时间顺序排列时，日期也是如此——它们从最新、最近的一个排列到最古老的一个。</p><p>想想看，这就像下一组楼梯——你从一个高处开始，最后在一个较低的地方结束。你从顶部开始，想往下走。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/Screenshot-2021-10-26-at-6.54.15-PM.png" class="kg-image" alt="Screenshot-2021-10-26-at-6.54.15-PM" width="600" height="400" loading="lazy"></figure><p>所以，简而言之，降序是将项目从高到低排列。</p><h2 id="--1">什么是升序？</h2><p>升序是与降序完全相反的，它也被称为重要性递增。</p><p>项目从最低值到最高值排列。顺序从最小的值开始，以最大的值结束。</p><p>因此，将上一节中的数字：<code>49, 80, 56, 11, 20</code>，按升序排列，看起来是这样的：<code>11, 20, 49, 56, 80</code>。</p><p>最小的数字总是排在前面，在这个例子中是 <code>11</code>，最后一个总是最大的一个，在上面的例子中是 <code>80</code>。</p><p>同样的规则也适用于字母表中的字母。当以升序排列时，它们从 A 到 Z——或从头到尾排列。</p><p>当涉及到日期时，升序意味着最古老的日期在前，最近的日期在后。</p><p>再想想楼梯的例子。</p><p>当你向上爬一组楼梯时，你从低处开始，最后在比你开始的地方高得多的地方结束。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/Screenshot-2021-10-26-at-6.53.40-PM.png" class="kg-image" alt="Screenshot-2021-10-26-at-6.53.40-PM" width="600" height="400" loading="lazy"></figure><p>总的来说，升序是事物从低处到高处。</p><p>谢谢你阅读本文！</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何给恺撒密码编程：基本加密简介 ]]>
                </title>
                <description>
                    <![CDATA[ 恺撒密码是早期加密的一个著名实践。它会根据字母表上设定的密钥对句子进行重组加密。举个例子，密钥为3，取一个句子“I like to wear hats.”。 当这个句子使用密钥3加密后，它变成了： L olnh wr zhdu kdwv. 这让它很难阅读并且不被查觉地传递。 虽然这是一个非常简单的加密案例，但对于学习编码的人来说，它是一个完美的练习项目。 理解加密 为了实现这个代码，至少在JAVA里，你需要思考实际要做些什么。所以，让我们看看必要的编码步骤。 步骤 1：识别句子中的字符 步骤 2：找到字符在字母表中的位置 步骤 3：识别字符位置+密钥key后的位置 注意* 如果字符位置 + key > 26, 那么要从字母表的第1个字符继续循环。 步骤 4：用新字符代替原来的字符，生成一个新句子 步骤 5：重复直到达到句子原来的长度（for 循环） 步骤 6：返回结果 编码加密 当我们清楚要遵循哪些绝佳的步骤后，我们应该想一想编码时要做什么。 步骤 0：建立一个可以读取信息和密钥的函数 就像这样： public String Encrypt(String ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/how-to-code-the-caesar-cipher-an-introduction-to-basic-encryption/</link>
                <guid isPermaLink="false">63638bc473e419079177bda1</guid>
                
                    <category>
                        <![CDATA[ 编程 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Keren Ma ]]>
                </dc:creator>
                <pubDate>Thu, 03 Nov 2022 09:49:30 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/11/0_tuogeHoQ53SQACY-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/how-to-code-the-caesar-cipher-an-introduction-to-basic-encryption-3bf77b4e19f7/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to code the Caesar Cipher: an introduction to basic encryption</a>
      </p><!--kg-card-begin: markdown--><p>恺撒密码是早期加密的一个著名实践。它会根据字母表上设定的密钥对句子进行重组加密。举个例子，密钥为3，取一个句子“I like to wear hats.”。</p>
<p>当这个句子使用密钥3加密后，它变成了：</p>
<p>L olnh wr zhdu kdwv.</p>
<p>这让它很难阅读并且不被查觉地传递。</p>
<p>虽然这是一个非常简单的加密案例，但对于学习编码的人来说，它是一个完美的练习项目。</p>
<h2 id="">理解加密</h2>
<p>为了实现这个代码，至少在JAVA里，你需要思考实际要做些什么。所以，让我们看看必要的编码步骤。</p>
<p>步骤 1：识别句子中的字符</p>
<p>步骤 2：找到字符在字母表中的位置</p>
<p>步骤 3：识别字符位置+密钥key后的位置</p>
<p>注意* 如果字符位置 + key &gt; 26, 那么要从字母表的第1个字符继续循环。</p>
<p>步骤 4：用新字符代替原来的字符，生成一个新句子</p>
<p>步骤 5：重复直到达到句子原来的长度（for 循环）</p>
<p>步骤 6：返回结果</p>
<h2 id="">编码加密</h2>
<p>当我们清楚要遵循哪些绝佳的步骤后，我们应该想一想编码时要做什么。</p>
<p>步骤 0：建立一个可以读取信息和密钥的函数</p>
<p>就像这样：</p>
<pre><code>public String Encrypt(String message, int key) {

}
</code></pre>
<p>步骤 1：识别句子中的字符</p>
<p>为此，我们需要建立一张字母表用来查找字符。</p>
<p>创建一个包含26个字母的变量“alphabet”。</p>
<pre><code>String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String alphabet2 = alphabet.toLowerCase();
</code></pre>
<p>步骤 2：找到字符在字母表中的位置</p>
<p>创建一个for循环来遍历消息中的每个字符。创建一个StringBuilder可以更便于我们来做这件事。</p>
<pre><code>StringBuilder encrypted = new StringBuilder(message);
for (int q = 0; q &lt; encrypted.length(); q++) {
    char currchar = encrypted.charAt(q);
    int index = alphabet.indexOf(currchar);
}
</code></pre>
<p>与此同时，我们要确保每个位置是一个字母。</p>
<pre><code>if (index != -1) {

}    
</code></pre>
<p>步骤 3：识别字符位置+密钥key后的位置</p>
<p>如果识别出字符是一个字母，那么我们要在修改后的字母表中找到它的位置。因此，我们需要建立一个修改后的字母表。</p>
<p>步骤 4：用新字符代替原来的字符，生成一个新句子</p>
<p>一旦我们在修改后的字母中找到了相应的值，我们应该将它设置到我们创建的StringBuilder中的相同位置。</p>
<pre><code>public String Encryption(String input, int key){
    StringBuilder encrypted = new StringBuilder(input);
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";        
    String alphabet2 = alphabet.toLowerCase();
    String keyedalphabet = alphabet.substring(key) + alphabet.substring(0, key);
    for (int q = 0; q &lt; encrypted.length(); q++) {
        char currChar = encrypted.charAt(q);
        int index = alphabet.indexOf(currChar);
        if (index != -1) {
        char newChar = keyedalphabet.charAt(index);
        encrypted.setCharAt(q, newChar);
        }
    }
}
</code></pre>
<p>步骤 5：重复直到达到句子原来的长度（for 循环）</p>
<p>现在，我们已经检查了字符是否为大写，但我们还需要检查字符是否为小写。为此，我们需要访问之前建立的alphabet2。</p>
<pre><code>index = alphabet2.indexOf(currChar);
if (index != -1) {
    String keyedalphabet2 = keyedalphabet.toLowerCase();
    char newChar = keyedalphabet2.charAt(index);
    encrypted.setCharAt(q, newChar);
}

</code></pre>
<p>步骤 6：返回结果</p>
<p>现在，我们已经完成了For循环。剩下的就是退出循环并返回String。</p>
<pre><code>public String Encryption(String input, int key){
    StringBuilder encrypted = new StringBuilder(input);
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    String alphabet2 = alphabet.toLowerCase();
    String keyedalphabet = alphabet.substring(key) + alphabet.substring(0, key);
    for (int q = 0; q &lt; encrypted.length(); q++) {
        char currChar = encrypted.charAt(q);
        int index = alphabet.indexOf(currChar);
        if (index != -1) {
            char newChar = keyedalphabet.charAt(index);
            encrypted.setCharAt(q, newChar);
        }
        index = alphabet2.indexOf(currChar);
        if (index != -1) {
            String keyedalphabet2 = keyedalphabet.toLowerCase();
            char newChar = keyedalphabet2.charAt(index);
            encrypted.setCharAt(q, newChar);
        }
    }
    return encrypted
}
</code></pre>
<p>步骤 7：调试</p>
<p>但是等等，不对！encrypted不是一个字符串，它是一个StringBuilder，这个函数特别要求返回一个字符串！</p>
<p>幸运的是，有一个非常简单的函数可以纠正这种疏忽。</p>
<pre><code class="language-java">public String Encryption(String input, int key){
    StringBuilder encrypted = new StringBuilder(input);
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    String alphabet2 = alphabet.toLowerCase();
    String keyedalphabet = alphabet.substring(key) + alphabet.substring(0, key);
    for (int q = 0; q &lt; encrypted.length(); q++) {
        char currChar = encrypted.charAt(q);
        int index = alphabet.indexOf(currChar);
        if (index != -1) {
            char newChar = keyedalphabet.charAt(index);
            encrypted.setCharAt(q, newChar);
        }
        index = alphabet2.indexOf(currChar);
        if (index != -1) {
            String keyedalphabet2 = keyedalphabet.toLowerCase();
            char newChar = keyedalphabet2.charAt(index);
            encrypted.setCharAt(q, newChar);
        }
    }
    return encrypted.toString();
}
</code></pre>
<p>这就是你如何得到原始句子的加密版本的方法。自己试试吧！</p>
<p>感谢你阅读本文！</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 编码是用来做什么的？ ]]>
                </title>
                <description>
                    <![CDATA[ 原文：What is Coding Used For [https://www.freecodecamp.org/news/what-is-coding-used-for/]，作者：Dionysia Lemonaki [https://www.freecodecamp.org/news/author/dionysia/] 你是否意识到你每天使用的应用和设备背后数以亿计的代码。 代码可以用来做很多事情——超乎你的想象。 在这篇文章中，我会先讲解“编写代码”这个术语到底是什么意思，然后我会简单地解释代码是如何运作的。 我还会解释为什么你需要考虑是否应该学习代码，日常生活的哪些方面受到了代码的影响。 下面是全文概览：  1. 计算机编码定义 * 代码是如何运行的？      * 编程语言的定义            2. 为什么学习代码？ * 代码是一种思考工具      * 代码帮助你实现想法    ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/what-is-coding-used-for/</link>
                <guid isPermaLink="false">628af5fd60237306d2607036</guid>
                
                    <category>
                        <![CDATA[ 编程 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ PapayaHUANG ]]>
                </dc:creator>
                <pubDate>Mon, 23 May 2022 02:50:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/05/ilya-pavlov-OqtafYT5kTw-unsplash.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>原文：<a href="https://www.freecodecamp.org/news/what-is-coding-used-for/">What is Coding Used For</a>，作者：<a href="https://www.freecodecamp.org/news/author/dionysia/">Dionysia Lemonaki</a></p><!--kg-card-begin: markdown--><p>你是否意识到你每天使用的应用和设备背后数以亿计的代码。</p>
<p>代码可以用来做很多事情——超乎你的想象。</p>
<p>在这篇文章中，我会先讲解“编写代码”这个术语到底是什么意思，然后我会简单地解释代码是如何运作的。</p>
<p>我还会解释为什么你需要考虑是否应该学习代码，日常生活的哪些方面受到了代码的影响。</p>
<p>下面是全文概览：</p>
<ol>
<li><a href="#definition">计算机编码定义</a>
<ul>
<li><a href="#work">代码是如何运行的？</a></li>
<li><a href="#language">编程语言的定义</a></li>
</ul>
</li>
<li><a href="#skill">为什么学习代码？</a>
<ul>
<li><a href="#tool">代码是一种思考工具</a></li>
<li><a href="#build">代码帮助你实现想法</a></li>
<li><a href="#free">学习代码免费</a></li>
<li><a href="#digital-literacy">代码将提高你的数字素养</a></li>
</ul>
</li>
<li><a href="#use">现实生活中的代码</a>
<ul>
<li><a href="#devices">电子设备</a></li>
<li><a href="#applications">数字服务和应用</a></li>
<li><a href="#transportation">交通</a></li>
<li><a href="#house">家居用品</a></li>
</ul>
</li>
</ol>
<h2 id="definition">什么是编写代码？写给初学者的计算机编码简明定义</h2>
<p>编码是人类和计算机或者其他机器交流的方式。</p>
<p>编码指的人类给计算机或者其他机器下指令或者命令的过程，指令或者命名通常非常具体、有逻辑并且分步骤。</p>
<p>从本质上来说，告诉计算机要做什么是一门艺术。你需要告诉计算机你希望它执行具体什么，甚至<em>不执行</em>什么行为。</p>
<p>编写和组织到文本文件中的指令被称为<strong>计算机程序</strong>。</p>
<p>计算机或者机器在收到指令后，可以读取、处理、解析并执行指令，解决特定的问题。</p>
<p>计算机和机器能够以相当快的速度来处理数据、读取和执行命令，比人类极限还要快得多。</p>
<h3 id="work">代码是如何运行的？</h3>
<p>电是计算机和机器的动力来源。电只有两种状态：<strong>开</strong>或者<strong>关</strong>。</p>
<p>在计算机和机器内部，有成千上万个被称为<strong>晶体管</strong>的微型开关，用于控制电流的涨落。它们要么打开电源，要么关闭电源。</p>
<p>晶体管接受指令来控制电流开关。这些指令的形式是<strong>二进制代码</strong>，二进制代码是所有机器的原生语言。</p>
<p>二进制是一种基数为二的数学系统，仅由<strong>两个数字</strong>组成：<code>0</code>和<code>1</code>。这和电只有两个状态的事实吻合。</p>
<p>所以二进制代码是一种机器语言，它包含不同组合的 <code>0</code>（代表 <code>关</code>）和 <code>1</code>（代表<code>开</code>）。</p>
<p>在计算早期，计算机科学家们编写二进制代码，但编写过程让人困惑、复杂且费时，并且特别容易出错。</p>
<p>虽然如今二进制仍应用于电子设备、电脑硬件以及操作系统设计，但是程序员使用高级编程语言来写代码。</p>
<h3 id="language">什么是编程语言？</h3>
<p>编程语言分为两种类型：</p>
<ul>
<li><strong>低级</strong>编程语言</li>
<li><strong>高级</strong>编程语言</li>
</ul>
<p>使用低级编程语言来编写代码需要给机器内部每一个单独的处理器编写对应的指令，指令是特定于某个机器，面向机器，并且依赖于机器的，指令控制每一个单独的晶体管。</p>
<p>机器语言（二进制的另一个名称）和汇编语言是低级编程语言。</p>
<p>高级编程语言从机器层面的细节和指令中抽离出来，提供更高层次的抽象。</p>
<p>高级编程语言独立于机器，意味着它们不需要考虑机器内部是如何运作的，高级编程语言是抽离的。</p>
<p>高级编程语言更人性化，因为它们更接近于人类的自然语言。</p>
<p>它们的语法类似于英语，所以更方便读取、编写、理解、调试和学习。</p>
<p>这些特质使得高级编程语言成为人和计算机之间的桥梁，两者间的交流更加容易达成。</p>
<p>计算机世界里有许许多多高级编程语言。</p>
<p>虽然每一种语言都服务于不同的目的，并且由其独特的用例，但是它们具备相同的编写逻辑和运行方式，这些共同之处可以被称作为编程范式。</p>
<p>一些流行的高级编程语言和它们的用例包括：</p>
<ul>
<li><strong>Python</strong> 是一种用于处理、操作和分析大型复杂数据的语言。它也是执行网页抓取的首选语言。网页抓取是用来收集原始用户数据的一种技术。</li>
<li><strong>Ruby</strong> 是用来创建自动化工具和脚本的语言。借助Rails框架（一种构建在Ruby之上的web框架），你可以创建各种动态web应用。</li>
<li><strong>JavaScript</strong> 是万维网的三种语言之一（其他两种是HTML和CSS标记语言），JavaScript是创建交互式web应用的首选语言。</li>
<li><strong>Java</strong> 不能和JavaScript混淆——它们完全不同。Java经常被用于编写手机应用、桌面软件和嵌入式系统。</li>
<li><strong>Swift</strong> 是用于创建iOS手机应用的语言。</li>
<li><strong>C#</strong> 用于创建桌面应用、企业软件和游戏开发。</li>
</ul>
<p>同时也有必要提一下高级编程语言通常分为两类：</p>
<ul>
<li><strong>前端</strong>（或者客户端）语言。用来负责和创造所有和用户交互相关的部分。</li>
<li><strong>后端</strong>（或者服务器端）语言。 负责执行背后的逻辑，后端负责创建用户直接交互以外的部分，或许用户没有感知到这些部分，包括存储用户数据到数据库，确保用户能够登陆和登出等。总之，后端给前端赋能，确保程序能够流畅运行。</li>
</ul>
<p>感兴趣的话，你可以<a href="https://chinese.freecodecamp.org/news/frontend-vs-backend-whats-the-difference/">阅读这篇关于前后端语言区别的文章</a>。</p>
<h2 id="skill">为什么编码是对未来有益的技能？</h2>
<p>即便你不希望成为专业的程序员，你也可以学习代码。这可以帮助你优化、提高并且自动化你当前工作或者行业中那些重复并且费时的部分。</p>
<p>如果你想要成为专业程序员，拥有这方面的技能，能够帮助解决人类正在面临的一些问题。</p>
<p>接下来我会列举一些理由，告诉你为什么现在应该学习代码，以及你可以考虑学习代码：</p>
<h3 id="tool">代码教你如何思考</h3>
<p>苹果曾经的联合创始人、董事会主席以及CEO乔布斯曾经说过：</p>
<blockquote>
<p>“我认为这个国家（美国）的每一个人都应高学习如何编写计算机程序，学习一种计算机语言，因为它指导你如何思考。这就像去读法学院一样。我不认为每一个人都应该成为一名律师，但是去读法学院十分有帮助，因为它能够帮助你建立思考方法。所以我认为计算机科学实际上隶属于文科，每一个人都应该学习。</p>
</blockquote>
<p>代码教你将复杂、大型的问题拆分成一个个小问题。</p>
<p>代码教你识别重复的模式，并且辨别系统或者过程中什么失效了，你可以如何改进。</p>
<p>你可以充分利用计算机的能力优势和潜力来补充你已有的技能，解决问题。</p>
<p>你可以将代码视为解决问题或者寻求解决方法的思维工具。</p>
<p>编写代码也培养并且提高想象力、创造力和创新精神——代码也是一种艺术。</p>
<p>在解决问题的过程中，你不得不跳出既定框架思考，构思出新的想法和方式来处理事情。代码迫使你从另外的角度来看待问题。</p>
<h3 id="build">代码帮助你实现想法</h3>
<p>你是否有想要实现的想法？</p>
<p>你可能想要创业，成立一个非盈利组织，或者是慈善机构。</p>
<p>你可以使用代码给你的社区提供帮助、工具和资源。</p>
<p>那么有一个网站就非常有必要，你可以在网站推广你所提供的服务和产品。</p>
<p>与其雇人来搭建你的想法，不如你自己来，还省钱。</p>
<p>即便你依旧决定雇人，了解软件编程可以帮助你做更好的用人决定，以及更好地和技术人员交流。</p>
<h3 id="free">学习代码免费</h3>
<p>没有比现在更适合学习代码了。</p>
<p>由于互联网的流行和技术的进步，学习和检索信息变得越来越便捷，只需要点击鼠标就行。</p>
<p>和我们上一辈相比，现在获取高质量的教学资源的门槛降低了。</p>
<p>不论身处在哪里，越来越多的人可以通过学习必要的技能，来获得薪酬更好的技术工作，提升生活质量。</p>
<p>freeCodeCamp的使命就是帮助人们完全免费学习代码。</p>
<p>freeCodeCamp搭建了经过深思熟虑、结构完善的<a href="https://www.freecodecamp.org/">互动教程</a>，包含响应式网页设计、关系数据库、SQL、Python等课程。</p>
<p><a href="https://www.youtube.com/channel/UC8butISFwT-Wl7EV0hUK0BQ">freeCodeCamp YouTube频道</a>也包含数千小时的内容，你可以浏览并且找到各种技术话题的完整教学视频。</p>
<p>如果你想更深入了解某个话题，可以浏览<a href="https://chinese.freecodecamp.org/news/">freeCodeCamp专栏</a>。这里有超过8000篇文章，包括代码技术话题的完全手册。</p>
<h3 id="digital-literacy">代码将提高你的数字素养</h3>
<p>我们搜索信息，和他人通过数字设备交流合作。</p>
<p>学习如何编写代码可以让你更加了解甚至欣赏技术是如何工作的，了解你日常使用的电子设备和应用是如何工作的。</p>
<p>在学习的过程中你将收获解决问题的技巧和批判性思维，帮助你在数字环境中更有效和自信地搜索、定位、导航、评估、过滤、存储信息。</p>
<h2 id="use">代码可以用来做什么？现实生活中代码的应用</h2>
<p>即便代码并不出现在我们生活的方方面面，但由于我们处在数字世界，代码也存在我们生活的大部分地方。</p>
<p>你使用得最频繁的物品，其实是由人通过编写合适的函数实现的。</p>
<p>代码和技术即便没有没有时时刻刻出现出现在我们的生活之中，但是它们出现的频率在增加。</p>
<p>代码取代了过时的技术。</p>
<p>一方面，代码使得一些工作更加安全，减少了密集人力劳动，降低了发生事故和受伤的风险。</p>
<p>另一方面，所有的产业都在逐步自动化。</p>
<p>我将列举一些代码出现在我们每日活动的情况：</p>
<h3 id="devices">电子设备</h3>
<p>代码给工作和娱乐的电子设备赋能。</p>
<p>这些由代码驱动的电子设备包括：</p>
<ul>
<li>手机</li>
<li>平板</li>
<li>笔记本电脑</li>
<li>台式电脑</li>
<li>智能电视</li>
<li>MP3播放器或者iPods</li>
<li>用来记录和检测心率和跑步时间的智能手环和计步器。你也可以通过它们连接手机来获取通知，甚至可以连MP3播放器来听音乐。</li>
<li>计算机</li>
<li>数码相机</li>
<li>逐渐取代纸质签名方式的数字签字板</li>
</ul>
<h3 id="applications">数字服务和应用</h3>
<p>所有你喜欢的网站和手机应用都是由代码编写的。</p>
<p>包括：</p>
<ul>
<li>社交媒体网站</li>
<li>个人博客</li>
<li>即时消息平台</li>
<li>视频会议平台</li>
<li>你每天和家人、朋友、远距离的同事保持联系的通讯工具</li>
<li>你用来听音乐和博客的音乐流媒体平台</li>
<li>实现线上付款、检查信用卡账单或者转账的数字银行和电子服务</li>
<li>用来文档的文字处理器</li>
<li>电子表格程序</li>
<li>用来记笔记、提升效率、做计划清单、记录项目进展和目标进展的应用</li>
</ul>
<h3 id="transportation">交通</h3>
<p>交通工具背后也有代码，如：</p>
<ul>
<li>驾车的时候，小轿车内的控制系统来控制更高效地使用汽油、调节功率以及空调。</li>
<li>交通信号灯内置了微处理器，能够根据道路交通流量来变化信号灯。</li>
<li>电子停车咪表和停车场售票机。</li>
<li>地铁或者火车的售票机以及条形码扫码机器。它们读取车票上的条形码，就能够得知你从哪里来，你在车上待了多久，还可以计算你的票还剩多少时间，车票什么时候过期。</li>
<li>GPS定位系统确保你在不熟悉的地方也不会迷路。</li>
<li>公共场所、主干道和购物中心的CCTV（闭路电视）摄像头确保监管和安全。</li>
<li>垂直电梯里微处理器，确保停靠在你通过按钮选择的楼层，传感器来检查是否有物品挡住了电梯门。</li>
</ul>
<h3 id="house">家居用品</h3>
<p>许多家居和厨房用品也需要代码来驱动，如：</p>
<ul>
<li>电子报警器</li>
<li>使用微处理器远程调节、控制水温的淋浴加热器</li>
<li>吸尘器</li>
<li>智能泡茶器和咖啡机，它们可以控制出多少杯茶或者咖啡</li>
<li>微波炉</li>
<li>可以控制转圈和转速的洗碗机和洗盘机</li>
<li>空调</li>
<li>冰箱和冰柜</li>
<li>你可能还拥有虚拟数字助理或通过语音激活软件和语音识别设备。例如你提出问题或告诉它们向联系人列表中的某人发送电子邮件。它们执行你通过语音设置的任务</li>
<li>将你所有设备连接到网络的WiFi路由</li>
</ul>
<h2 id="">总结</h2>
<p>希望现在你已经了解什么是编码，以及为什么你的日常生活中代码无处不在。</p>
<p>迈出学习代码的第一步，可以使用<a href="https://www.freecodecamp.org/learn/">freeCodeCamp教程</a>。</p>
<p>从第一个证书——<a href="https://chinese.freecodecamp.org/learn/2022/responsive-web-design/">响应式网页设计</a>开始，然后按照你自己的节奏来。</p>
<p>感谢你阅读本文！</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 编程范式简介 ]]>
                </title>
                <description>
                    <![CDATA[ 原文：Programming Paradigms – Paradigm Examples for Beginners [https://www.freecodecamp.org/news/an-introduction-to-programming-paradigms/] ，作者：Germán Cocca [https://www.freecodecamp.org/news/author/gercocca/] 大家好！这篇文章将讲解不同的编程范式，编程范式是对一些流行的组织编程方式的“花哨”称呼。 我把话题拆分，并且每个范式补充一个例子。通过这篇文章，你就可以了解当人们在说“面向对象”、“函数式”以及“声明式”时，他们在说什么。 虽然我会提供一些伪代码和代码示例，但是这篇文章的讨论仅停留在范式表层和理论层面。 我计划将在之后用JavaScript示例来深入讲解每一个范式，如果你感兴趣的话可以关注我（关注方式见文章结尾）。 让我们开始吧！ 文章目录  * 编程范式是什么  * 编程范式不是什么  * 我为什么了解编程范式？  * 常见的编程范式 * 命令式编程     * 过 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/an-introduction-to-programming-paradigms/</link>
                <guid isPermaLink="false">62725009395ec5063718b64e</guid>
                
                    <category>
                        <![CDATA[ 编程 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ PapayaHUANG ]]>
                </dc:creator>
                <pubDate>Wed, 04 May 2022 06:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/05/anne-nygard-OJzEnupZWGM-unsplash.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>原文：<a href="https://www.freecodecamp.org/news/an-introduction-to-programming-paradigms/">Programming Paradigms – Paradigm Examples for Beginners</a>，作者：<a href="https://www.freecodecamp.org/news/author/gercocca/">Germán Cocca</a></p><!--kg-card-begin: markdown--><p>大家好！这篇文章将讲解不同的编程范式，编程范式是对一些流行的组织编程方式的“花哨”称呼。</p>
<p>我把话题拆分，并且每个范式补充一个例子。通过这篇文章，你就可以了解当人们在说“面向对象”、“函数式”以及“声明式”时，他们在说什么。</p>
<p>虽然我会提供一些伪代码和代码示例，但是这篇文章的讨论仅停留在范式表层和理论层面。</p>
<p>我计划将在之后用JavaScript示例来深入讲解每一个范式，如果你感兴趣的话可以关注我（关注方式见文章结尾）。</p>
<p>让我们开始吧！</p>
<h2 id="">文章目录</h2>
<ul>
<li><a href="#what-is-a-programming-paradigm">编程范式是什么</a></li>
<li><a href="#what-a-programming-paradigm-is-not">编程范式不是什么</a></li>
<li><a href="#why-should-i-care">我为什么了解编程范式？</a></li>
<li><a href="#popular-programming-paradigms">常见的编程范式</a>
<ul>
<li><a href="#imperative-programming">命令式编程</a></li>
<li><a href="#procedural-programming">过程式编程</a></li>
<li><a href="#functional-programming">函数式编程</a></li>
<li><a href="#declarative-programming">声明式编程</a></li>
<li><a href="#object-oriented-programming">面向对象的编程</a></li>
</ul>
</li>
<li><a href="#roundup">总结</a></li>
</ul>
<h1 id="what-is-a-programming-paradigm">编程范式是什么</h1>
<p>编程范式指的是一种程序或者程序语言的组织风格、方式。每一种程序范式都包含了代码结构、特征以及处理常见编程问题的方式。</p>
<p>存在各种各样编程范式的原因和存在各种编程语言一样。特定范式适合解决特定问题，所以针对不同项目采取不同的编程范式。</p>
<p>随着时间的推移，不同的范式实践也层出不穷。归功于软件和硬件的发展，新的方式也不断涌现。</p>
<p>我认为是人类的创造力推动了范式的发展。我们热衷于创造新的东西，改善旧的东西，调整生产工具以符合现代需求，提高效率。</p>
<p>所以当现在我们想要写一个程序时，我们有非常多的选择来编写、构建这个程序。</p>
<h1 id="what-a-programming-paradigm-is-not">编程范式不是什么</h1>
<p>编程范式不是语言或者工具，不能使用范式来“构建”任何东西。它们更像是一套约定俗成的理想和准则，开发者遵循并且扩展这套范式。</p>
<p>编程语言并不总是和一个特定范式相关联。有些语言在创建的时候就考虑到了某种范式，并且具有比其他语言更利于这种范式的特性。（<a href="https://www.haskell.org/">Haskel</a> 和函数式编程就是很好的例子）。</p>
<p>但也存在“多范式”语言，意味着你可以以这样或那样的范式来调整代码（JavaScript和Python就是非常好的例子）。</p>
<p>同时，编程和范式并不是相互排斥的，也就是说你可以在同一个项目中同时使用不同的范式。</p>
<h1 id="why-should-i-care">我为什么要了解编程范式？</h1>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/04/whatever-yeah-1.gif" alt="whatever-yeah-1" width="600" height="400" loading="lazy"></p>
<p>一句话回答：这是常识！</p>
<p>详细回答：我觉得了解不同的编程实践方式很有趣，探索相关话题可以帮助你打开思路，跳出既定框架和工具。</p>
<p>另外，这些术语在编程实践被广泛应用，所以对它们有一个基本概念，对你了解其他编程话题也有帮助。</p>
<h1 id="popular-programming-paradigms">常见的编程范式</h1>
<p>在介绍完编程范式是什么、不是什么之后，让我们来看看一些常见范式，它们的特征和它们之间的比较。</p>
<p>需要注意这篇文章的范式清单并不完整，还有其他一些流行的范式我并没有提到。这里我会提到最常见和使用最广泛的一些范式。</p>
<h2 id="imperative-programming">命令式编程</h2>
<p>命令式编程由一组详细的指令组成，让计算机以一定的顺序执行。之所以被称作“命令式”是因为开发者以非常具体的方式，准确地规定计算机必须做什么。</p>
<p>命令式编程强调描述程序<em>怎么样</em>一步一步地运行。</p>
<p>假如你想烤一个蛋糕，命令式编程的制作方式如下：（我不是专业烘焙师，别嫌弃我的步骤😒 ）</p>
<pre><code>1- Pour flour in a bowl //将面粉倒入碗中
2- Pour a couple eggs in the same bowl //在碗中打入两个鸡蛋
3- Pour some milk in the same bowl //倒入一些牛奶
4- Mix the ingredients //将它们混合
5- Pour the mix in a mold //将混合物倒入模具
6- Cook for 35 minutes //烤35分钟
7- Let chill //冷却
</code></pre>
<p>若使用真实的代码，假设我们想要从一个数组中过滤出大于5的所有元素，命令式编程如下：</p>
<pre><code class="language-javascript">const nums = [1,4,3,6,7,8,9,2]
const result = []

for (let i = 0; i &lt; nums.length; i++) {
    if (nums[i] &gt; 5) result.push(nums[i])
}

console.log(result) // 输出: [ 6, 7, 8, 9 ]
</code></pre>
<p>我们告诉程序要遍历整个数组的每一个元素，并且和5来比较，如果这个元素的值大于5，就将它推入另一个数组。</p>
<p>我们的指令非常的具体详尽，这就是命令式编程的特点。</p>
 <h2 id="procedural-programming">过程式编程</h2>
<p>过程式编程是命令式编程的派生，在其基础上添加了函数特性（也被称作“过程” procedures 或者“子程序” subroutines）。</p>
<p>在过程式编程中，开发者被鼓励将程序的执行拆分成不同的函数，以此来提高程序的模块化和组织性。</p>
<p>改写刚才做蛋糕的例子：</p>
<pre><code>function pourIngredients() {
    - Pour flour in a bowl
    - Pour a couple eggs in the same bowl
    - Pour some milk in the same bowl
}

function mixAndTransferToMold() {
    - Mix the ingredients
    - Pour the mix in a mold
}

function cookAndLetChill() {
    - Cook for 35 minutes
    - Let chill
}

pourIngredients()
mixAndTransferToMold()
cookAndLetChill()
</code></pre>
<p>可以发现因为使用了函数，我们只需要阅读结尾三个函数的调用就知道这个程序到底要做什么。</p>
<p>这种简化和抽象化就是过程式编程的一个优势。但是在函数中，我们还是使用了原来命令式编程的模式。</p>
<h2 id="functional-programming">函数式编程</h2>
<p>函数式编程将函数的概念往前再推进了一步。</p>
<p>在函数式编程中，函数被认为是<strong>一等公民</strong>，意味着可以将它们赋值给变量，作为参数传入其他函数，或者由函数返回。</p>
<p>另一个核心观点是<strong>纯函数</strong>。<strong>纯</strong>函数指的是输出仅取决于输入的函数。如果输入相同，输出的结果始终保持不变，另外纯函数没有副作用（对函数外部环境的改变）。</p>
<p>基于这些概念，函数式编程鼓励使用函数编程（惊不惊喜，意不意外😲 ）。同时，函数式编程也坚持将代码模块化、取消副作用，这样可以在代码库内更清晰的分离各个部分代码的责任。提高代码的可维护性。</p>
<p>回看之前过滤数组的例子，可以发现使用命令式范式需要在外部使用一个变量来存储函数结果，这就是一种副作用。</p>
<pre><code class="language-javascript">const nums = [1,4,3,6,7,8,9,2]
const result = [] // 外部变量

for (let i = 0; i &lt; nums.length; i++) {
    if (nums[i] &gt; 5) result.push(nums[i])
}

console.log(result) // 输出: [ 6, 7, 8, 9 ]
</code></pre>
<p>改写成函数式编程如下：</p>
<pre><code class="language-javascript">const nums = [1,4,3,6,7,8,9,2]

function filterNums() {
    const result = [] // 内部变量

    for (let i = 0; i &lt; nums.length; i++) {
        if (nums[i] &gt; 5) result.push(nums[i])
    }

    return result
}

console.log(filterNums()) // 输出: [ 6, 7, 8, 9 ]
</code></pre>
<p>用两种方式编写的代码几乎一样，但在这里我们将遍历和结果数组都打包在函数内部。这样我们就可以确保函数不会更改任何作用域以外的东西。我们只创造了一个处理自己信息的变量，一旦执行结束，变量也就被回收。</p>
<h2 id="declarative-programming">声明式编程</h2>
<p>声明式编程隐藏了复杂性，使编程语言更接近人类的语言和思维，这和命令式编程正好相反。命令式编程给指令告诉计算机 <em>怎么样</em> 执行任务，但是声明式编程告诉计算机需要 <em>什么</em> 样的结果。</p>
<p>使用例子理解会更清晰，同样的过滤数组改写成声明式：</p>
<pre><code class="language-javascript">const nums = [1,4,3,6,7,8,9,2]

console.log(nums.filter(num =&gt; num &gt; 5)) // 输出: [ 6, 7, 8, 9 ]
</code></pre>
<p>使用过滤函数，我们不再告诉计算机具体的操作是需要遍历数组并且将结果存储到另一个数组中，我们只需要告诉计算机我们需要过滤（filter），过滤的条件是（num &gt; 5）。</p>
<p>这样做的好处是代码更易读易理解，并且更简洁。JavaScript的<code>filter</code>、<code>map</code>、<code>reduce</code>和<code>sort</code> 函数都是声明式编程的例子。</p>
<p>另一个例子是JS框架/库——React，如下面的代码：</p>
<pre><code class="language-javascript">&lt;button onClick={() =&gt; console.log('You clicked me!')}&gt;Click me&lt;/button&gt;
</code></pre>
<p>这里有一个按钮元素，绑定了一个事件监听器，一旦点击按钮就会触发console.log函数。</p>
<p>React使用的JSX语法结合了HTML和JS，这样编写应用就更加简单快捷。但是JSX并不是浏览器读取和执行代码的方式。React的代码之后会被编译成正常的HTML和JS代码，这才是浏览器实际执行的代码。</p>
<p>JSX就是声明式的，目的是为了使得开发者有一个更加友好、高效的工作接口。</p>
<p>需要注意即便我们书写的是声明式代码，但是计算机还是以命令式来执行信息。</p>
<p>在上述数组的例子里，计算机实际上还是循环遍历了整个数组，但是不需要开发人员直接写出这个指令。声明式编程实际上做的是在开发者面前<strong>隐藏</strong>代码的复杂性。</p>
<p>这里有一个<a href="https://www.youtube.com/watch?v=E7Fbf7R3x6I">比较命令式和声明式编程的视频</a>，推荐你阅读。</p>
<h2 id="object-oriented-programming">面向对象的编程</h2>
<p>最受欢迎的编程范式之一莫过于面向对象的编程（OOP）。</p>
<p>OOP的核心概念是将关注点分离成对象实体，每一个实体包含一组信息（属性）和行为（方法），可以由实体来执行。</p>
<p>OOP大量使用类（是由程序员设定的从蓝图或者模板创建新对象的方法），由类创建的对象叫做实例。</p>
<p>改写之前的伪代码烤蛋糕例子，假设我们蛋糕房有一个主厨（叫Frank），和一个厨师助理（叫Anthony），他俩分别有各自的烘培任务。如果使用OOP，代码如下：</p>
<pre><code>// 给每一个实体创建一个类
class Cook {
	constructor constructor (name) {
        this.name = name
    }

    mixAndBake() {
        - Mix the ingredients
    	- Pour the mix in a mold
        - Cook for 35 minutes
    }
}

class AssistantCook {
    constructor (name) {
        this.name = name
    }

    pourIngredients() {
        - Pour flour in a bowl
        - Pour a couple eggs in the same bowl
        - Pour some milk in the same bowl
    }
    
    chillTheCake() {
    	- Let chill
    }
}

// 将每一个类实例化
const Frank = new Cook('Frank')
const Anthony = new AssistantCook('Anthony')

// 调用实例的方法
Anthony.pourIngredients()
Frank.mixAndBake()
Anthony.chillTheCake()
</code></pre>
<p>OOP的优势在于，通过清晰的关注点和责任分离，编程更加易于理解。</p>
<p>在这个例子中我只介绍了OOP的表面，如果你感兴趣的话，推荐观看下面两个视频：</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=cg1xvFy1JQQ">OOP 视频 1</a></li>
<li><a href="https://www.youtube.com/watch?v=pTB0EiLXUC8">OOP 视频 2</a></li>
</ul>
<p>以及观看这个<a href="https://www.youtube.com/watch?v=08CWw_VD45w">对比命令式、函数式和面向对象编程的视频</a>。</p>
<h1 id="roundup">总结</h1>
<p>如你所见，编程范式是不同的处理编程问题和组织代码的方法。</p>
<p>命令式、过程式、函数式、声明式以及面向对象的编程范式是目前最受欢迎，使用最广泛的范式。了解这些基础，有助于你更好地理解编程世界。</p>
<p>希望你喜欢这篇文章，并且有所收获。你可以在<a href="https://www.linkedin.com/in/germancocca/">Linkedin</a>或<a href="https://twitter.com/CoccaGerman">Twitter</a>上关注我。</p>
<p>干杯！下篇文章见！=D</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/04/200.gif" alt="200" width="600" height="400" loading="lazy"></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 程序员的最重要的技能 ]]>
                </title>
                <description>
                    <![CDATA[ 原文：The most important skill a programmer can learn [https://www.freecodecamp.org/news/the-most-important-skill-a-programmer-can-learn-9d410c786baf/] ，作者：Huseyin Polat Yuruk [https://www.freecodecamp.org/news/author/huseyin/] No, no, no, no, and no. And no. 一个大大的 NO，就这么清楚。 你所要做的就是把这两个字母放在一起，然后说这个词。 现在，让我们一起说：NOOOOOOO！ 这是一个好的开始。 但是等一下，对什么说不，什么时候说？ 好的，这是大多数程序员（甚至是资深的）容易混淆的重要一点。 作为一个程序员，编写代码是你工作的最大部分。在你的编程生涯中，你将不得不处理不同种类的代码需求。每个需求都会迫使你做出困难的决定。这都是可以的。这没有什么不对。作为一个程序员，这也是大家对你的期望——写代码。然而，这里有一个问题 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/the-most-important-skill-a-programmer-can-learn/</link>
                <guid isPermaLink="false">626a6f1f395ec5063718af1d</guid>
                
                    <category>
                        <![CDATA[ 编程 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ luojiyin ]]>
                </dc:creator>
                <pubDate>Thu, 28 Apr 2022 04:40:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/04/1651143246966.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>原文：<a href="https://www.freecodecamp.org/news/the-most-important-skill-a-programmer-can-learn-9d410c786baf/">The most important skill a programmer can learn</a>，作者：<a href="https://www.freecodecamp.org/news/author/huseyin/">Huseyin Polat Yuruk</a></p><!--kg-card-begin: markdown--><p><strong>No, no, no, no, and no. And no.</strong></p>
<p>一个大大的 NO，就这么清楚。</p>
<p>你所要做的就是把这两个字母放在一起，然后说这个词。</p>
<p>现在，让我们一起说：NOOOOOOO！</p>
<p>这是一个好的开始。</p>
<p>但是等一下，对什么说不，什么时候说？</p>
<p>好的，这是大多数程序员（甚至是资深的）容易混淆的重要一点。</p>
<p>作为一个程序员，编写代码是你工作的最大部分。在你的编程生涯中，你将不得不处理不同种类的代码需求。每个需求都会迫使你做出困难的决定。这都是可以的。这没有什么不对。作为一个程序员，这也是大家对你的期望——写代码。然而，这里有一个问题：你应该写出所有需求的代码吗？</p>
<p>这个问题把我们带到了一个程序员可以学习的最重要的技能：</p>
<blockquote>
<p>知道什么时候不写代码可能是一个程序员能学到的最重要的技能。— <a href="https://www.amazon.com/Art-Readable-Code-Practical-Techniques/dp/0596802293">The Art Of Readable Code</a></p>
</blockquote>
<p>我非常同意。为什么这么说呢？</p>
<p>编程是解决一个问题的艺术。因此，程序员自然是问题解决者。作为程序员，当我们用代码解决的新问题或任何其他需求，我们会感到兴奋。</p>
<p>这也没关系，因为我们是程序员，我们喜欢写代码。</p>
<p>然而，对写代码过于兴奋使我们盲目。它使我们忽视了一些重要的事实，而这些事实可能会导致我们在未来不得不处理的更大的问题。</p>
<p>那么，那些我们容易忽视的重要事实是什么呢？</p>
<p>你写的每一行代码都是：</p>
<ul>
<li>必须被其他程序员阅读和理解的代码</li>
<li>需要进行测试和调试的代码</li>
<li>会增加你的软件缺陷的代码</li>
<li>可能会在未来引入新的错误的代码</li>
</ul>
<p>正如 Rich Skrenta 所写的，<a href="http://www.skrenta.com/2007/05/code_is_our_enemy.html">代码是我们的敌人</a>:</p>
<blockquote>
<p>代码是坏的。它会腐烂。它需要定期维护。它有需要被发现的错误。新的功能意味着旧的代码必须被调整。</p>
<p>你的代码越多，就有越多的地方可以藏匿错误，检查或编译的时间越长。新员工要花更多的时间来理解你的系统。如果你必须重构，就会有更多的东西需要修改。</p>
<p>此外，更多的代码往往意味着更少的灵活性和功能。这是违反直觉的，但很多时候，一个简单、优雅的解决方案比一个天赋较差的程序员所产生的蹒跚混乱的代码更快、更通用。</p>
<p>代码是由工程师生产的。要制作更多的代码需要更多的工程师。工程师有 n² 的交流成本，他们向系统添加的所有代码，在扩大其能力的同时，也增加了大量的成本。</p>
</blockquote>
<p>这是非常正确的，不是吗？ 那些用他们的生产力和编码心态激励你的程序员们知道什么时候说不，和不编写代码。易于维护、持续时间长并不断帮助其用户的软件是不包含任何不必要的代码行的。</p>
<blockquote>
<p>最好的代码是根本没有代码，最有效的程序员是知道什么时候不编码的人。</p>
</blockquote>
<h3 id="">你怎么能知道什么时候不编程？</h3>
<p>当你在一个项目上工作时，很自然地会感到兴奋，想到你很想实现的所有很酷的功能。但程序员往往高估了他们的项目需要多少功能。许多功能未完成或未使用，或只是使应用程序过于复杂。你应该知道什么是你的项目所必需的，以避免犯这种错误。</p>
<blockquote>
<p>了解你的软件的目的和它的核心定义是知道何时不编码的第一步。</p>
</blockquote>
<p>让我给你举个例子。假设你有一个软件，它只有一个目的：管理电子邮件。而为了这个目的，发送和接收电子邮件是你的项目的两个基本功能。你不能指望那个软件也能管理你的待办事项，对吗？</p>
<p>因此，你应该对任何可能的与此定义无关的功能要求说不。这时你可以确切地确定，你知道什么时候不应该写代码。</p>
<blockquote>
<p>永远不要扩大你的软件的用途。</p>
</blockquote>
<p>一旦你知道什么是你的项目所必需的，你下次在评估可能的代码要求时就会有意识。你会确切地知道你写代码的要求。哪些功能应该被实现？哪些代码是值得写的？你会质疑一切，因为你会清楚地知道不必要的代码会如何扼杀你的项目。</p>
<blockquote>
<p>知道什么时候不写代码可以使你的代码库变小。</p>
</blockquote>
<p><img src="https://cdn-media-1.freecodecamp.org/images/AaXgIsHTyVquQeabDnz5kMCsyEmPuMnod3E9" alt="AaXgIsHTyVquQeabDnz5kMCsyEmPuMnod3E9" width="650" height="361" loading="lazy"></p>
<p><a href="https://www.amazon.com/Art-Readable-Code-Practical-Techniques/dp/0596802293">The Art Of Readable Code</a></p>
<p>当你开始你的项目时，只有两到三个源文件。一切看起来都很简单。编译和运行代码只需要几秒钟。你知道在哪里可以准确地找到你要找的东西。</p>
<p>然后，随着项目的发展，越来越多的源文件填满了你的目录。每个代码文件包含数百个代码行。为了组织它们，你将很快需要多个目录。记住哪些函数调用其他函数更加困难，跟踪 bug 也需要更多的工作。管理你的项目变得困难，你需要更多的程序员来帮忙。<a href="https://en.wikipedia.org/w/index.php?title=Communication_overhead&amp;action=edit&amp;redlink=1">通信开销</a> 随着程序员人数的增加而增加。你会变得越来越慢。</p>
<p>最后，这个项目变得巨大。增加新的功能是痛苦的。即使是做小的改动也要花上几个小时。修复现有的 bug 总是会引入新的 bug。你开始错过最后期限。</p>
<p>现在，生活对你来说是一种挣扎。为什么？</p>
<p>因为你不知道什么时候不写代码，你对每一个可能的功能请求都说 “YES”。你很盲目。编写新的东西导致你忽视了基本的事实。</p>
<p>这就像一部恐怖电影，对吗？</p>
<p>这就是如果你一直对所有事情都说“是”会发生什么。清楚地知道什么时候不需要编码。从你的项目中消除所有不必要的代码。这将使你的生活更轻松，使你的软件更持久。</p>
<blockquote>
<p>我最有成就感的一天是删除了 1000 行的代码。— Ken Thompson</p>
</blockquote>
<p>我知道，知道什么时候不写代码是如此困难。即使对高级程序员来说也是如此。也许我在这篇文章中写的内容对初级程序员来说很难理解，这也没关系，可以理解。</p>
<p>我知道你刚刚开始你的编程之旅，你想写代码。你对此感到非常兴奋，这很好，千万不要失去这种兴奋，但也不要忽视重要的事实。我们通过犯自己的错误来学习它们。你也会犯错，你也会从这些错误中学习。但是如果你能从我们的经验中学习，至少你可以在编码时有意识地避免错误。</p>
<blockquote>
<p>学习编程，但要知道何时不编程。</p>
</blockquote>
<p><em>原文发表于 <a href="http://huseyinpolatyuruk.com/the-most-important-skill-a-programmer-can-learn">http://huseyinpolatyuruk.com</a>。</em></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 数据结构 101：数组——面向初学者的可视化指南 ]]>
                </title>
                <description>
                    <![CDATA[ 通过这篇文章了解你每天使用的数据结构 👋 你好，让我们从一些重要的背景开始。让我问你几个问题： ✅ 你在智能手机上听音乐吗？ ✅ 你在手机上保存联系人列表吗？ ✅ 你在比赛中见过排行榜吗？ 如果你对这些问题中的任何一个的回答是肯定的，那么几乎可以肯定你已经使用过数组，而你甚至不知道它！😃 数组是非常强大的数据结构，用于存储元素列表 。它们有无穷无尽的应用，在计算机科学领域非常重要。 在本文中，你将了解数组的优缺点、结构、操作和用例。 我们开始吧！ 👍 🔎 深入了解基本的数组结构 要了解它们的工作原理，将计算机的内存可视化为网格非常有帮助，如下所示。每条信息都存储在构成网格的其中一个小元素（正方形）中。 数组利用这种“网格”结构在相邻的内存位置存储相关信息的列表，以保证极高效率地找到这些值。🔳🔳🔳🔳 你可以将数组视为： 它们的元素在内存中彼此相邻。如果你需要访问其中多个数组，该过程会得到极大的优化，因为你的计算机已经知道该值的位置。 很棒，对吧？ 让我们来了解一下这在幕后是如何运行的！😃 📚 归类 数组被归类为同构数据结构，因为它们存储相同类型的元素 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/data-structures-101-arrays-a-visual-introduction-for-beginners/</link>
                <guid isPermaLink="false">60bc9e2e176e4005380a79eb</guid>
                
                    <category>
                        <![CDATA[ 数据结构 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 编程 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Sun, 06 Jun 2021 10:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/06/1_plaTqL5DDa2MgqeK-0EClg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <h3 id="-">通过这篇文章了解你每天使用的数据结构</h3><p>👋 你好，让我们从一些重要的背景开始。让我问你几个问题：<br>✅ 你在智能手机上听音乐吗？<br>✅ 你在手机上保存联系人列表吗？<br>✅ 你在比赛中见过排行榜吗？</p><p><strong>如果你对这些问题中的任何一个的回答是肯定的，那么几乎可以肯定你已经使用过数组，而你甚至不知道它！</strong>😃 数组是非常强大的数据结构，用于存储<strong>元素列表</strong>。它们有无穷无尽的应用，在计算机科学领域非常重要。</p><p>在本文中，你将了解数组的优缺点、结构、操作和用例。</p><p>我们开始吧！ 👍</p><h3 id="--1"><strong><strong>🔎 深入了解基本的数组结构</strong></strong></h3><p>要了解它们的工作原理，将计算机的内存可视化为网格非常有帮助，如下所示。每条信息都存储在构成网格的其中一个小元素（正方形）中。</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/uxNDqnrhHuS197WjrTeak8WQq2QZKAJD5xp4" class="kg-image" alt="uxNDqnrhHuS197WjrTeak8WQq2QZKAJD5xp4" width="600" height="400" loading="lazy"></figure><p><strong>数组</strong>利用这种“网格”结构<strong>在相邻的内存位置存储相关信息的列表</strong>，以保证极高效率地找到这些值。🔳🔳🔳🔳</p><p><strong><strong>你可以将数组视为</strong>：</strong></p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/HjKZtf6JKxcrH8t51iRrId-4lTqjOlGtICip" class="kg-image" alt="HjKZtf6JKxcrH8t51iRrId-4lTqjOlGtICip" width="600" height="400" loading="lazy"></figure><p><strong>它们的元素在内存中彼此相邻。</strong>如果你需要访问其中多个数组，该过程会得到极大的优化，因为你的计算机已经知道该值的位置。</p><p>很棒，对吧？ 让我们来了解一下这在幕后是如何运行的！😃</p><h4 id="--2"><strong><strong>📚 归类</strong></strong></h4><p>数组被归类为<strong>同构数据结构</strong>，因为它们存储<strong>相同类型的元素</strong>。</p><p>它们可以存储数字、字符串、布尔值（真和假）、字符、对象等。但是<strong>一旦定义了数组将存储的值的类型，它的所有元素都必须是相同的类型。你不能“混合”不同类型的数据。</strong></p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/sbk9-CGxQ5VKddqpz9S12GxpR26I8f8e0hj6" class="kg-image" alt="sbk9-CGxQ5VKddqpz9S12GxpR26I8f8e0hj6" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/oS1i6uyY71HPvrPCVEqEVDpscFgyeUCAwlPN" class="kg-image" alt="oS1i6uyY71HPvrPCVEqEVDpscFgyeUCAwlPN" width="600" height="400" loading="lazy"></figure><h3 id="--3"><strong><strong>👀 读取值——魔法开始啦</strong>！</strong></h3><p>数组的惊人力量来自于它们<strong>访问值的效率</strong>。这是由于其网格状结构而实现的。让我们更详细地了解一下。🔍</p><p><strong><strong>当你创建一个数组</strong>，你：</strong><br>- 将它赋值给一个变量 👈<br>- 定义它存储元素的类型 🎈<br>- 定义它的大小（最多有多少个元素）📚</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/xzGLFN8ymKFdxyZWHk4YInJ6cyQQHxUJiJQX" class="kg-image" alt="xzGLFN8ymKFdxyZWHk4YInJ6cyQQHxUJiJQX" width="600" height="400" loading="lazy"></figure><p><strong><strong><strong><strong>💡</strong></strong> 注意</strong>：</strong>你分配给该变量的名称非常重要，因为稍后你将在代码中使用它来访问值和修改数组。</p><p>但是你怎么能告诉计算机你想访问哪个特定的值呢？这就是索引发挥重要作用的地方！</p><h4 id="1-"><strong><strong>1️⃣ 索引</strong></strong></h4><p>你<strong>通过索引</strong>来读取数组中的某个值。这是一个数字，指的是存储值的位置。</p><p>正如你在下图中所看到的，数组中的第一个元素的索引是 0。当你向右移动时，内存中每个空间的索引都会增加 1。</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/TuWNHRYkAgpBEjuszG9DElXUIAf8Osw2z--7" class="kg-image" alt="TuWNHRYkAgpBEjuszG9DElXUIAf8Osw2z--7" width="600" height="400" loading="lazy"></figure><p><strong><strong><strong><strong>💡</strong></strong> </strong>注意：</strong>我知道从 0 而不是 1 开始计数，起初看起来很奇怪，但这被称为<a href="https://en.wikipedia.org/wiki/Zero-based_numbering">基于零的编号</a>。这在计算机科学中很常见。</p><p><strong><strong><strong><strong>读取一个元素的通用语法是</strong></strong></strong>：<strong><strong><strong><code>&lt;ArrayVariable&gt;[&lt;index&gt;]</code></strong></strong></strong></strong></p><p><strong><strong><strong><strong>例如</strong></strong></strong>：</strong><br>如果你的数组存储在变量 <code><strong><strong><strong><strong>myArray</strong></strong></strong></strong></code> 中，并且你想访问第一个元素（在索引 0 处），那么你将使用 <code><strong><strong><strong><strong>myArray[0]</strong></strong></strong></strong></code><strong>。</strong></p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/Yu9nSlzmHkZV4e7f7sulFIamSwWONw4wNcpg" class="kg-image" alt="Yu9nSlzmHkZV4e7f7sulFIamSwWONw4wNcpg" width="600" height="400" loading="lazy"></figure><h4 id="2-"><strong><strong>2️⃣ 内存</strong></strong></h4><p>现在你知道如何读取值了，让我们看看数组是如何存储在计算机内存中的。当你定义数组的大小时，从那一刻起，内存中的所有空间都将被“保留”以供将来可能要插入的值使用。</p><p><strong><strong><strong><strong>💡 注意</strong></strong></strong>：</strong>如果你没有用值填充数组，则该空间将被保留并为空，直到你填充数组为止。</p><p><strong><strong>例如</strong>：</strong><br>假设你定义了一个大小为 5 的数组，但只插入了一个值，所有剩余的空间都将是空的并被“保留”在内存中，等待未来的分配。</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/7Hoys8sq0RuDF4-Rgr4WRD4RrImGhtQmzR9P" class="kg-image" alt="7Hoys8sq0RuDF4-Rgr4WRD4RrImGhtQmzR9P" width="600" height="400" loading="lazy"></figure><p>这是关键，数组在访问值方面非常有效。因为所有元素都存储在内存中的连续空间中，这样，计算机就知道在哪里可以找到你请求的信息。</p><p>但是......它有一个缺点😞，因为<strong>这对内存来说不是高效的</strong>。你正在为将来可能不会发生的操作保留内存。<strong>这就是为什么在你事先知道要存储多少个元素的情况下，推荐使用数组的原因。</strong></p><h3 id="--4"><strong><strong>🔧 幕后操作</strong></strong></h3><p>现在你知道什么是数组，什么时候使用它们，以及它们如何存储元素，我们将深入研究关于数组的操作，如插入和删除元素。</p><h4 id="1--1"><strong><strong>1️⃣ 插入元素</strong></strong></h4><p>假设我们有一个大小为 6 的数组，但仍有一个空白空间。我们想在数组的开头（索引 &nbsp;0）插入一个元素 “e”，但是这个位置已经被元素 “a” 占据了。我们应该怎么做？</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/JX8sviJCpwXkWT6mZ4fDIwzSNFDUZ0C8LfrP" class="kg-image" alt="JX8sviJCpwXkWT6mZ4fDIwzSNFDUZ0C8LfrP" width="600" height="400" loading="lazy"></figure><p><strong><strong>要在数组中插入元素</strong></strong>，我们将位于插入点右侧的所有元素向右移动一个索引。元素 “a” 现在将位于索引 1，元素 “b” 将位于索引 2，依此类推……</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/8KFz74m1v5dPBzXGr5IXAvt3a5XFbzL78gVs" class="kg-image" alt="8KFz74m1v5dPBzXGr5IXAvt3a5XFbzL78gVs" width="600" height="400" loading="lazy"></figure><p><strong><strong><strong><strong>💡</strong></strong> 注意</strong>：</strong>你将需要创建一个变量来跟踪包含元素的最后一个索引。在上图中，数组在插入之前被填充到索引 4。这样，你可以确定数组是否已满，以及应该使用什么索引在末尾插入元素。</p><p>这样操作之后，我们就成功插入元素啦。👏</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/VqmOSyTnIvPWbkw9p1PIhenPthaxd3bHxzvS" class="kg-image" alt="VqmOSyTnIvPWbkw9p1PIhenPthaxd3bHxzvS" width="600" height="400" loading="lazy"></figure><h4 id="--5"><strong><strong>⚠️ 等等</strong>！<strong>如果数组是满的呢</strong>？</strong></h4><p>如果数组已满，并且你尝试插入一个元素，会发生什么？ 😱</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/IlI473xQSRYYCMjlcF0YMSOs-Kca2hqqupGk" class="kg-image" alt="IlI473xQSRYYCMjlcF0YMSOs-Kca2hqqupGk" width="600" height="400" loading="lazy"></figure><p>在这种情况下，你需要创建一个新的更大的数组，并手动将所有元素复制到这个新数组中。此操作<strong>非常麻烦</strong>，而且<strong>非常耗时</strong>。 想象一下，如果你有一个包含数百万个元素的数组会发生什么？这可能需要很长时间才能完成。⏳</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/P2q2OaohnsEPDa3KMu3e6eOJaPpw-bpufH95" class="kg-image" alt="P2q2OaohnsEPDa3KMu3e6eOJaPpw-bpufH95" width="600" height="400" loading="lazy"></figure><p><strong><strong><strong><strong>💡</strong></strong> 注意</strong>：</strong>当插入元素非常快时，此规则的唯一例外是，当你在数组<strong>末尾</strong>（位于最后一个元素右侧的索引处）插入一个元素，并且仍有可用空间时。这是在恒定时间 O(1) 内完成的。</p><h4 id="2--1"><strong><strong>2️⃣ 删除元素</strong></strong></h4><p>现在假设你要从数组中删除一个元素。</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/yG5HNXTX7Xj7aXAstjEMU2VNWHkEZXtG9q5z" class="kg-image" alt="yG5HNXTX7Xj7aXAstjEMU2VNWHkEZXtG9q5z" width="600" height="400" loading="lazy"></figure><p>为了保持随机访问的效率（能够极快地通过索引访问数组），元素必须存储在连续的内存空间中。<strong>你不能只是删除元素，并将该空间留空。</strong></p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/bd9KRk22FyVVrW3RJEKvCd8y-VAJQodeABOD" class="kg-image" alt="bd9KRk22FyVVrW3RJEKvCd8y-VAJQodeABOD" width="600" height="400" loading="lazy"></figure><p>你应该将要删除的元素之后的元素向左移动一个索引。</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/G13PaxPTyIQRCBJdh2Ioup-4jM-qlDMnTVd7" class="kg-image" alt="G13PaxPTyIQRCBJdh2Ioup-4jM-qlDMnTVd7" width="600" height="400" loading="lazy"></figure><p>最后，你会得到这个数组👇。如你所见，“b” 已被成功删除。</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/85yhQ9XK19hJ2paBhkb9Cf0-8v52DO0igncc" class="kg-image" alt="85yhQ9XK19hJ2paBhkb9Cf0-8v52DO0igncc" width="600" height="400" loading="lazy"></figure><p><strong><strong><strong><strong>💡 注意</strong></strong></strong>：</strong>由于你需要创建一个变量来跟踪包含元素的最后一个索引（在上图中，是索引 3），你可以使用索引直接删除该元素。</p><h4 id="3-"><strong><strong>3️⃣ 查找一个元素</strong></strong></h4><p>你可以通过三种方式在数组中查找一个元素：</p><ul><li><strong><strong>如果你知道元素的位置</strong>，</strong>就使用索引。</li><li><strong><strong>如果你不知道元素的位置以及数据储存在哪里</strong>，</strong>你可以使用算法来优化搜索，例如二分查找。</li><li><strong><strong>如果你不知道元素的位置以及数据储存在哪里</strong>，</strong>你需要搜索数组中的每个元素，并检查当前元素是否是你要查找的（请参见下面的图表序列）。</li></ul><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/hlrl4kdBl3eM8cT7DXJX7rItWeHzTvrretfG" class="kg-image" alt="hlrl4kdBl3eM8cT7DXJX7rItWeHzTvrretfG" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/nFz0jZQu4dtAqv4fauEE-7zVqxtGlKVVfKew" class="kg-image" alt="nFz0jZQu4dtAqv4fauEE-7zVqxtGlKVVfKew" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/hxcwNp-VfOem0psPkl26HCLrILCR1mlrdpku" class="kg-image" alt="hxcwNp-VfOem0psPkl26HCLrILCR1mlrdpku" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/dEd3ArmSERT63fk95KSlKwwCqdwjvUBAOQen" class="kg-image" alt="dEd3ArmSERT63fk95KSlKwwCqdwjvUBAOQen" width="600" height="400" loading="lazy"></figure><h3 id="--6"><strong><strong>👋 总结</strong></strong></h3><ul><li><strong>数组是非常强大的数据结构，</strong>可以存储相同类型的元素。元素的类型和数组的大小是在创建时确定和定义的。</li><li><strong>内存在数组创建后立即分配的</strong>，在你分配值之前它是空的。</li><li><strong>它们的元素位于内存中的连续位置</strong>，因此可以使用索引非常有效地访问它们（随机访问，O(1) = 常数时间）。</li><li><strong><strong>索引是从</strong> 0 开始，</strong>不像我们习惯的从 1 开始。</li><li>在数组的开头或中间<strong>插入元素</strong>涉及向右移动元素。如果数组已满，则创建一个新的更大的数组（效率不高）。在数组末尾插入非常高效，恒定时间 O(1)。</li><li>从数组的开头或中间<strong>删除元素</strong>涉及将所有元素向左移动，以避免在内存中留下空白空间。这保证了元素存储在内存中的连续空间中。在数组末尾删除元素的效率非常高，因为你只删除最后一个元素。</li><li><strong>要查找元素</strong>，你需要检查整个数组，直到找到它为止。如果对数据进行排序，则可以使用二分查找等算法来优化流程。</li></ul><blockquote><em>“</em>总结昨天的经验，努力过好今天，对明天充满希望。最重要的是不要停止思考。”<br><br><em><em>— </em></em>阿尔伯特·爱因斯坦</blockquote><h4 id="--7"><strong><strong>👋 谢谢你</strong>！</strong></h4><p>我希望你喜欢我的文章。❤️<br>在 <a href="https://twitter.com/Estefania_CN_" rel="noopener">Twitter</a> <strong>关注我</strong>，阅读更多文章。😃</p><p>原文：<a href="https://www.freecodecamp.org/news/data-structures-101-arrays-a-visual-introduction-for-beginners-7f013bcc355a/">Data Structures 101: Arrays — A Visual Introduction for Beginners</a>，作者：<a href="https://www.freecodecamp.org/news/author/estefaniacn/">Estefania Cassingena Navone</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 编程与人生 ]]>
                </title>
                <description>
                    <![CDATA[ 我相信人类内心最深的意愿是：在有生之年，尝试接触到宇宙最基础的真相的一点微光，聆听它们的耳语，明白它们的意义。 并且，如果你对这些经历有过足够努力的体会，你就会找到答案。无论是它们是你思想的体现还是手中握着的实物，一但你看到它们，它们就会伴随你一生。 编程很多地方与生活有相似之处。我们的任务是创作一些东西 —— 一种整体的体验会比部分重要的多的东西。就像人生，这是对有限创造力的考验。这里有一些我们必须遵守的规则，一些我们应该遵守的规则和其他一些我们可以忽略的规则。无论多么短暂，世间真理通过编程略见一斑。 编程与人生之间的四个平衡 迭代就是进步 你知道吗，如果你在一个月的开始拥有一分钱，并且每天它都会翻倍，你会在这个月的第 15 天获得 163 美元。当然，你想，在 15 天内获得 163 美元肯定还有别的更好的渠道。但是，如果你再等待 15 天，你会拥有超过 5 百万美元。 去吧，我会等你做完计算。 在编程中，我们使用迭代这个术语去表示重复某件事。用更正式的定义，它重复地将一个过程叠加到该先前这个过程的结果上。例如，1 加 1 等于 2，然后 2 再加 1 等于 3，以此类推 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/life-and-programming/</link>
                <guid isPermaLink="false">5f845eec5f583f0565090a77</guid>
                
                    <category>
                        <![CDATA[ 人生经验 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 自我认知 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 编程 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Jiawei Pan ]]>
                </dc:creator>
                <pubDate>Mon, 12 Oct 2020 09:20:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2020/10/caspar-camille-rubin-oI6zrBj3nKw-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>我相信人类内心最深的意愿是：在有生之年，尝试接触到宇宙最基础的真相的一点微光，聆听它们的耳语，明白它们的意义。</p><p>并且，如果你对这些经历有过足够努力的体会，你就会找到答案。无论是它们是你思想的体现还是手中握着的实物，一但你看到它们，它们就会伴随你一生。</p><p>编程很多地方与生活有相似之处。我们的任务是创作一些东西 —— 一种整体的体验会比部分重要的多的东西。就像人生，这是对有限创造力的考验。这里有一些我们必须遵守的规则，一些我们应该遵守的规则和其他一些我们可以忽略的规则。无论多么短暂，世间真理通过编程略见一斑。</p><h2 id="-">编程与人生之间的四个平衡</h2><h3 id="--1">迭代就是进步</h3><p>你知道吗，如果你在一个月的开始拥有一分钱，并且每天它都会翻倍，你会在这个月的第 15 天获得 163 美元。当然，你想，在 15 天内获得 163 美元肯定还有别的更好的渠道。但是，如果你再等待 15 天，你会拥有超过 5 百万美元。</p><p>去吧，我会等你做完计算。</p><p>在编程中，我们使用<em>迭代</em>这个术语去表示重复某件事。用更正式的定义，它重复地将一个过程叠加到该先前这个过程的结果上。例如，1 加 1 等于 2，然后 2 再加 1 等于 3，以此类推。</p><p>当我们进行迭代时，我们希望得到反馈。我们等待某些条件的满足，这样我们就可以知道是否应该停止迭代，或则调整迭代的方式。如果我们监听反馈失败了，我们会陷入无限循环中。</p><p>人生没有什么不同。我们总是期望从目标 A 跳到目标 B，却从不去想目标 A 和目标 B 究竟是什么。而且，就算我们定义了这些目标，我们总是期望能够马上达成目标。相反的，真相往往是，我们必须从头到尾逐步的完成我们的目标。我们必须听取反馈，告诉我们我们在哪里，以便进行相应调整。</p><p>当我们有目标，开始的几天，几个星期，几个月我们通常感受不到进步。我们经常被诱惑重头开始或者从别的新目标开始。但在这样做时，我们未能意识到，虽然我们可能尚未到达目的地，但我们已经远远超出了开始的地方。完全重新开始不是必要的，我们只需要进行一些小的调整。</p><p>停止重新开始。让迭代来增加进步。</p><h3 id="--2">许多复杂的问题包是由很多已经解决的小问题构成</h3><p>即使是体验最棒的 APP 也是由一系列解决普通问题的普通方案堆起来的。实际上，程序中大多数的解决方案都不是唯一的。是通过将这些普通的解决方案联系起来才诞生了一款与众不同的产品。</p><p>在编程中，使用这些普通的解决方案有很多种形式。其中一种用专业术语讲叫 <em>抽象</em> 。就是从众多相似的事物中提炼出共性。</p><p>在计算机编程中，当我们抽象化某个事物，我的通常在低级技术上构建高级技术。这会让使用底层技术变得简单。</p><p>例如，很多编程语言都是由神秘的二进制语言抽象而成（0 和 1）。它们使我们和计算机之间有了一座基础的但是构建复杂的桥梁。这些高级语言允许我们专注于更高层次的问题。</p><p>另外一种能帮助我们有效解决问题的方法是使用别人用过的解决方案。你也许听过 <em>库</em> 这个计算机术语。我不是在谈论一个布满灰尘，光线幽暗的存放图书的地方，库并不遥远。</p><p>在计算机术语中 <em>库</em> ，是一个由其他人编写的为了解决某个问题的代码。它通常不是直接解决你面临的问题的方案，而是对这些问题的抽象。</p><p>例如，如果你在编写需要某人登录的应用，你 <em>可以</em> 自己来编写加密和解密的代码，<em>或者</em> 你也可以使用别人已经编写好的代码。通过一些设置，我们可以有更多的时间去解决我们应用中更加重要的问题。</p><p>我们所有人都在某种环境中使用抽象概念和库。例如，杂货店是对我们提供食物的抽象。汽车是徒步旅行的抽象。烤箱是生火的抽象。这些摆在我们面前的一层可以帮助我们分配更多的时间给更高层级的问题。</p><p>重新造轮子只是为了学习怎么去制造一个轮子，而不是开着它去商店。</p><h3 id="--3">你如何看待问题将会决定你如何解决它</h3><p>回想一下一辆卡车在桥下行驶并被卡住的故事。工程师需要花费数小时想办法将卡车弄出桥。一个小孩出现了，站在卡车轮胎前，说到：“如果你们把轮胎的气放掉会怎么样？”</p><p>从这个孩子的角度出发，问题不是桥太矮了，而是卡车太高了。</p><p>大多数人都可以解他们面临决任何问题。实际上，大多数问题就是在表明解决方案。例如，如果因为桥导致问题的产生，那么答案肯定是对桥做些什么。当然，如果问题是卡车太高了，那么解决方案显而易见是让卡车变矮。</p><h3 id="--4">整体比部分更重要</h3><p>谷歌地图源代码，《独立宣言》，马丁路德金《我有一个梦想》的演讲，2005 年史蒂夫乔布斯斯坦福的毕业演讲，以及我的第一个应用 <em>Hello World</em> 这些有什么共同点？</p><p>它们都是由 26 个英文字母拼接而成。</p><p>没有什么比文字更让我着迷了。文字是人类诞生到现在最强大的 <em>技术</em> 之一。</p><p>是的，我使用 <em>技术</em> 这个词，因为 —— 即使是刻在洞穴上的壁画 —— 它们从根本上改变了我们保存信息的方式。数据不在受我们大脑记忆的约束。</p><p>虽然文字最初目的是用来记录，但它马上变成了一种传递思想的方式。其中一些想法会令人愤怒，而另一些会让人受到启发。</p><p>每种语言（包括计算机语言）在通过文字或演讲传送信息时都会有些不同的分地方。每个单词及其组成部分也会略微不同。但是，语言仍然是一组符号，可以将其组合成近乎无限的思想。</p><p>例如，在英语中，我可以用大约 29 种符号来表达几乎整个宇宙。除了我前面已经提到的 26 个字母，句号，逗号，问号这些也同样有帮助。</p><p>无论对于你，我还是史蒂夫乔布斯这 29 个符号都很有价值。然而，我们每个人会因为我们选择相信的文字和语言，而产生不同的人生轨迹。</p><p>有趣的是，虽然我们经常在字典中添加词组，但是我们通常不会添加单个字母。这就意味着，在最基本的层面上，所有可能存在的想法都已经存在，正在静静等待我们去发现它们的存在。</p><p><strong><em>Les Brown</em> （美国励志演说家）通过下面这个思想实验很好的总结了这一点：</strong></p><p><em>想象一下，假如你临死时躺在病床上。站在你床周围的是生活赋予你的思想，梦想，能力和才华的灵魂。</em></p><p>但是由于出于某些原因，你从未对这些思想采取过行动，从未追寻过那个梦想。你从未使用过这些才能。我们从未见过你的领导力。你从来没有为自己发声。你从未开始写那本书。</p><p>现在它们就站在你的床边，并用愤怒的目光瞪着你说： “我们为你而来。只有你能给我们生命。现在我们必须要和你一起离去”</p><p><em>问题是 —— 如果你今天就死了，哪些思想，梦想，能力，天赋，礼物是会和你一起离去？</em></p><p>谢谢你的阅读！</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 从全职妈妈到 Web 前端开发者 ]]>
                </title>
                <description>
                    <![CDATA[ 原文：How I went from stay-at-home mum to Front-end Web Developer [https://www.freecodecamp.org/news/how-i-went-from-stay-at-home-mum-to-front-end-web-developer-39724046692a/] ，作者：Phoebe Voong-Fadel [https://www.freecodecamp.org/news/author/phoebe/] 我想过很多次写一写自己学习编程的经历，但一直没有勇气去写，一方面我觉得没啥好写的，另一方面，我想：“谁会看呢？” 每一位开发者都有自己的故事，这里我想聊聊如何一边带小孩儿一边学习编程，以及其中的挑战。 我的背景 我成为一名 Web 开发者的经历跟大家普遍看到的不同。我修的是人文专业，没有计算机科学的背景，毕业后曾经在高等院校任职，后来晋升为管理层。我喜欢我的工作，但是我对这样的职业生涯并不满足。 大概七年前，我开始为自己做新的职业规划，想进入到技术领域，也听取了一些建议，然后我开始学习 HTM ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/how-i-went-from-stay-at-home-mum-to-front-end-web-developer/</link>
                <guid isPermaLink="false">5d1ed3fffbfdee429dc5eafa</guid>
                
                    <category>
                        <![CDATA[ 编程 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Fri, 05 Jul 2019 04:41:17 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2019/07/1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>原文：<a href="https://www.freecodecamp.org/news/how-i-went-from-stay-at-home-mum-to-front-end-web-developer-39724046692a/">How I went from stay-at-home mum to Front-end Web Developer</a>，作者：<a href="https://www.freecodecamp.org/news/author/phoebe/">Phoebe Voong-Fadel</a></p><p>我想过很多次写一写自己学习编程的经历，但一直没有勇气去写，一方面我觉得没啥好写的，另一方面，我想：“谁会看呢？”</p><p>每一位开发者都有自己的故事，这里我想聊聊如何一边带小孩儿一边学习编程，以及其中的挑战。</p><h3 id="-">我的背景</h3><p>我成为一名 Web 开发者的经历跟大家普遍看到的不同。我修的是人文专业，没有计算机科学的背景，毕业后曾经在高等院校任职，后来晋升为管理层。我喜欢我的工作，但是我对这样的职业生涯并不满足。</p><p>大概七年前，我开始为自己做新的职业规划，想进入到技术领域，也听取了一些建议，然后我开始学习 HTML 和 CSS 等 Web 基础知识。刚开始我对编程并没有全心投入，主要是因为害怕这个转型会花费太多时间，并且那时候我快要结婚了，也需要花心思筹备婚礼。6 年之后，现在，我已为人妻，有一套公寓，还有两个不到两岁的宝宝！</p><p>2015 年 1 月，我有了第一个宝宝。不夸张地说，我儿子的出生彻底颠倒了我的世界，睡眠不足的折磨、母乳喂养的困难......让我在前六个月都处于行尸走肉的状态。</p><p>好不容易各方面情况开始稳定下来，我回到工作岗位才一周，却发现自己又怀孕了！2016 年 9 月，我的女儿出生了。现在，我有两个不到 20 个月的宝宝！</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/2.jpeg" class="kg-image" alt="2" width="640" height="444" loading="lazy"></figure><h3 id="--1">职业转型的动力和体会</h3><p>2017 年年中，我 34 岁，那时候我决定辞职。我这样做有两个原因，一是财务方面允许我可以暂停工作，二是我的孩子们正需要照顾。另外我的丈夫长期在外工作，我没办法一边全职工作一边照看两个年幼的孩子。</p><p>我七年前的想法一直都在，我可以等到孩子们长大，然后找一份兼职工作，或者最终在技术领域发展。我的丈夫已经在技术领域工作，他给了我同样的建议。</p><p>然后我学习了 HTML，CSS 和 JavaScript 这些基础知识，我觉得自己可以成为一名前端开发者。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/3.jpeg" class="kg-image" alt="3" width="640" height="426" loading="lazy"></figure><h3 id="-freecodecamp-">在 freeCodeCamp 入门编程</h3><p>于是我搜索应该在什么在线平台学习编程，读到了很多关于 freeCodeCamp 的内容，我也很喜欢它的课程结构，它适合任何零编程基础的人。</p><p>刚开始学习的时候，看到我的代码在预览窗口渲染出来，我非常开心，然后我告诉自己：“挺好的，我能做到！”</p><p>我还记得自己第一次被困住的场景。</p><p>在我学习 <code>&lt;div&gt;</code> 标签的时候，题目里描述到 “div 元素大概是最常使用的 HTML 元素”，我不明白为什么要把一个 <code>&lt;div&gt;</code> 元素嵌套在 <code>&lt;div&gt;</code> 元素中。</p><p>我丈夫跟我说 “Google 是你的朋友”，所以我开始搜索了解 <code>&lt;div&gt;</code> 是什么。</p><p>这件事并不容易。我已经毕业 13 年了，而现在我进入到一个与我以前学到的东西相去甚远的领域。起初，我很怀疑自己根本没办法学会编程，随着时间的推移，即使课程越来越难，我常常感到沮丧，我也仍然坚持努力学习，学习编程这个过程慢慢变得容易了。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/4.jpeg" class="kg-image" alt="4" width="640" height="480" loading="lazy"></figure><h3 id="--2">一边学编程一边带孩子是巨大的挑战</h3><p>“为人父母” 是一份没有尽头的 “工作”，这是我所担任过的最苛刻的角色！我必须是最好的厨师、表演家、管家、歌手、护士、养育者、办事员、老师、故事家…...还有很多别的身份。即使我的孩子睡着了，我也随时待命，准备放下一切以满足他们的需求。</p><p>因此，最大的挑战是找到时间敲代码。我的丈夫在外地工作，一周大部分时间都是我在照顾两个小孩，我精疲力尽！刚开始，我只能在他们睡着的时候敲代码。</p><p>通常，我从早上 6 点到晚上 8 点都在照顾孩子，一直到晚上 9 点，我才能坐下来，打开笔记本电脑，开始编程。即使那个时候我已经感觉很疲惫了，但是一开始编程，我也就恢复了活力。</p><p>有些晚上情况好一点，孩子们没那么需要我，我可以在睡觉前学习 30 分钟到 3 个小时，不过大部分晚上我根本没法学习。</p><p>坚持下去，一切都会变得更好。</p><p>最终，编程成为了我日常生活的一部分。孩子们在托儿所的时候，我暂时获得解放，可以学习一会儿。我通常这样安排时间：</p><p>6:00 早餐，亲子时间</p><p>9:00 学习</p><p>12:00 午餐，做家务</p><p>13:00 继续学习</p><p>15:00 做饭，做家务，接孩子</p><p>21:00 学习</p><p>22:00 - 23:00 睡觉</p><p>小孩子难免会生病，但是没有人告诉我小孩子生病有多频繁！当他们生病的时候，我都不得不中止学习好长一段时间。</p><p>比如，2017 年冬天，我女儿患上流感，很快，我儿子也患上了，两周之后他们才康复。当我终于可以放松下来，不再 “疲于奔命”，我自己和我丈夫都病倒了。这样，我就有一个多月时间没能学习。</p><p>所以，我得考虑到这样的中断情况并且做好准备，不能让它过多影响我的学习节奏。（每次中断之后）我努力尽快恢复学习状态，并且针对一些项目做短期编程训练，这样在我恢复学习的时候，可以很快完成这些项目。</p><p>我尝试尽可能保持自己每天的规划，这对我和孩子们来说都非常重要。例如，我必须暂停在做的某个练习去接孩子，我也不能熬夜编程到凌晨，否则就没办法在第二天早上好好照顾孩子们。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/5.jpeg" class="kg-image" alt="5" width="640" height="534" loading="lazy"></figure><h3 id="--3">我的经验</h3><p>最近有人问我在学习编程的过程中学到的最重要的东西是什么，我罗列出最重要的经验，其中一些是特别面向父母的，但是我相信它们对于没有为人父母的读者来说也非常有用。</p><p>1、<strong>人人都可以学习编程：</strong>无论你是什么背景，只要你有兴趣和动力，你都可以学习编程。网上有非常多的资源，可以满足各个层面的知识需求，你只需要会使用计算机，并且花时间去学习，不断地实践，你就会成功！</p><p><strong>2、每天敲代码：</strong>这是我从 freeCodeCamp 的创始人 Quincy 那里得到的一个建议，这点非常重要！我尽量坚持每天敲代码，但如果你没办法做到也没有关系，孩子们总有各种突发情况，所以我有时候也做不到。我尝试在履行作为母亲的职责之余调整我的学习计划。灵活地处理问题是关键。</p><p><strong>3、不要让自己疲惫不堪：</strong>尽量找时间让自己放松，不学习的时候我会去健身房。</p><p><strong>4、处理并发任务：</strong>孩子们在托儿所的时候，是我做家务的时间。把衣服扔进洗衣机之后，我会敲代码；打扫卫生或者做饭的时候，我会看 YouTube 上的编程教程视频或者听播客；我也会在周末时多做些饭菜冻起来，以便挤出更多学习时间。</p><p><strong>5、学会管理你的恐惧：</strong>不要让消极的情绪消耗你。在学习编程的某些时间点，你可能会感到自我怀疑。每个人对恐惧都有自己的应对方法，对我来说，我学得越多，练习得越多，我就越有自信。</p><p><strong>6、学习如何研究：</strong>这是你需要掌握的重要技能。在遇到困难的时候，一开始我发现很难搞清楚应该搜索什么正确的关键词。其实，搜索也是需要练习的，你在网上搜索得越多，你就越懂怎么搜索。记得把有用的网站添加到书签。</p><p>7、<strong>不要被击垮：</strong>你应该思考学习编程会给你带来什么，但是注意不要被它击垮。想象你的知识是正态分布曲线，峰值意味着你非常了解两种语言或框架，而它逐渐下降则意味着你对其他部分的知识的了解没那么广泛而深入。了解新技术和趋势总是很好，但这并不意味着你必须成为专家！</p><p><strong>8、制作你的作品集：</strong>即使你没有正式的编程工作经验，你也可以制作一个优秀的作品集。我的作品集包括两个 freeCodeCamp 项目，甚至不需要自己配置编程环境，可以直接使用 CodePen 等在线资源来演示代码。</p><p><strong>9、版本控制：</strong>学习如何使用 Git 和 GitHub。当你开始做更复杂的项目时，你需要使用 IDE（集成开发环境）。我使用 Atom，但我不太关注工具本身。选择一个工具然后学会使用它就行了。另外你需要学习在 GitHub 创建仓库和提交代码。</p><p><strong>10、代码审核：</strong>找人帮助你审核项目代码非常重要。我一开始很难做到这一点，但是这一步会帮助你成为一个更好的程序员。当然，你也能从审核别人的代码中学到很多。</p><p><strong>11、学无止境：</strong>人们也会问我另一个问题——什么时候停止学习，我的回答是我会永远保持学习状态。 Web 开发领域有很多创新，我会始终关注最新动态和 “必备技能”。</p><h3 id="--4">我目前的状态</h3><p>我已经利用业余时间学习编程将近一年了，获得了 freeCodeCamp 六个证书的其中三个。</p><p>我现在是一名自由职业的 Web 开发者，建立了两个商业网站，一个是帮客户做的，另一个是我的个人作品集，此外我正在帮另一个客户重新设计和构建网站。我也继续在 freeCodeCamp 和其他平台比如 Udemy 学习。</p><h3 id="--5">再分享一些想法</h3><p>有人问我为什么在有了孩子之后才转行，而之前有更多时间的时候没有这么做。这其实挺讽刺的：在我有宝宝之前，我没有意识到时间有多么宝贵，我是一个满足现状害怕冒险的人；而有了宝宝之后，我想成为孩子们眼中的榜样，并且拥有我热爱的事业。</p><p>成为母亲之后，我觉得养育孩子就是我唯一的目标，在这个过程中我感觉失去了自我。而当我再次开始学习时，我有了另一个目标：我既是两个孩子的妈妈，也是一名开发者。</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
