<?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[ english - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ english - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 16 May 2026 16:29:34 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/english/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ freeCodeCamp's B1 English for Developers Certification is Now Live ]]>
                </title>
                <description>
                    <![CDATA[ The freeCodeCamp community just published our new B1 English for Developers certification for intermediate learners of English as a second language. You can now sit for the exam to earn the free verified certification, which you can add to your résum... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/freecodecamps-b1-english-for-developers-certification-is-now-live/</link>
                <guid isPermaLink="false">69458ad0ac78bce0b11301d9</guid>
                
                    <category>
                        <![CDATA[ freeCodeCamp.org ]]>
                    </category>
                
                    <category>
                        <![CDATA[ english ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Certification ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Nielda Karla ]]>
                </dc:creator>
                <pubDate>Fri, 19 Dec 2025 17:26:40 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1765908045980/195acca4-af23-4800-9889-378c893cf9ff.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>The freeCodeCamp community just published our new <a target="_blank" href="https://www.freecodecamp.org/learn/b1-english-for-developers/">B1 English for Developers certification</a> for intermediate learners of English as a second language. You can now sit for the exam to earn the free verified certification, which you can add to your résumé, CV, or LinkedIn profile.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765908529561/29db2c2d-8ef2-447b-a67d-9dda207665ea.png" alt="Two coworkers in a modern office setting discussing cybersecurity training, shown within an interactive dialogue lesson interface." class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h2 id="heading-how-does-the-b1-english-for-developers-certification-work">How Does the B1 English for Developers Certification Work?</h2>
<p>This Intermediate level English for Developers Curriculum will help you strengthen the foundational skills developed in the <a target="_blank" href="https://www.freecodecamp.org/learn/a2-english-for-developers/">A2 English for developers certification</a> while introducing more complex grammar and expanding on work-related topics.</p>
<p>This entire curriculum will follow the B1 level of the Common European Framework of Reference (CEFR). And, as always, we've focused on vocabulary that is particularly useful for developers.</p>
<p>You'll learn how to describe places and things, share past experiences, and confidently use tenses like Present Perfect and Future. Practical communication strategies are included as well, such as managing conversations, expressing opinions, and building agreement or disagreement in discussions.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765908306493/fe7a163a-3e60-4a75-8700-482f59c01474.png" alt="Course interface showing an expanded section titled “Learn How to Talk About Past Activities.” A short description explains that the course teaches how to talk about things you did. A “Start project” button appears below, followed by a section called “Dialogue 1: The Latest User Feedback” with a numbered grid of lesson steps from 1 to 41." class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>You'll also practice vocabulary and phrases essential for developers, such as describing code, participating in meetings, and discussing tech trends. Advanced topics include conditionals, comparative structures, and conversation management, so you can prepare for more complex interactions.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765908919292/8fe9608f-b724-4133-9692-245a9eeb46ce.png" alt="Interactive lesson screen showing Task 1 of a listening exercise. An illustrated woman stands in a modern office setting. Below the image, learners are prompted to listen to audio and complete a sentence with a missing word: “Hey, James. blank for the interruption earlier.”" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>This entire B1-level curriculum includes <strong>73 different dialogues</strong> recorded by native English speakers. Each section follows a unique theme, contains several dialogues, and is filled with hundreds of interactive tasks that will help you develop your English skills.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765909055094/7fd43858-ffcb-4ab6-848b-7d93b849b3fa.png" alt="Course interface showing multiple collapsed learning sections focused on expressing opinions, agreement, disagreement, concerns, decisions, modal verbs, and conversation management." class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>These tasks will introduce new vocabulary, teach grammar, or review concepts that you’ll need to know in order to understand what the characters from the dialogues are saying. Each task will have an accompanying question that will help you practice the content.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765909109549/88a9ca37-37ba-4aa4-bbd0-65f2b716303d.png" alt="Multiple-choice question about concerns with remote work, followed by an explanation defining communication and collaboration." class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>The curriculum also has fill-in-the-blank questions that will help you practice writing in English.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765909156282/d47b9dd9-dc17-45ba-b5fd-f0fe13897ce6.png" alt="Listening exercise featuring an illustrated man in a conference room. Learners are asked to listen to audio and complete a sentence by filling in two missing words related to managing work across different times." class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>Once you’ve completed the certification, you’ll be able to take the B1 English for Developers exam. This exam contains 54 grammar questions, 24 listening questions, and 9 reading questions. All the questions are based on what’s covered in the certification course.</p>
<p>You can take the exam by using our new open source exam environment. The freeCodeCamp community designed this exam environment tool with two goals in mind: respecting your privacy while also making it harder for people to cheat.</p>
<p>Once you download the app to your laptop or desktop, you can take the exam.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765910321184/bb75700d-fe58-4a9d-affa-2c3be1b48e10.png" alt="Screen showing the B1 English for Developers Certification Exam page. It explains that the exam is required to earn the certification and is free to take. The page includes information about the exam environment app, the current app version, buttons to open or download the latest version of the app, an option to manually download it, and a support email for help with downloading issues." class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h2 id="heading-frequently-asked-questions">Frequently Asked Questions</h2>
<h3 id="heading-is-all-of-this-really-free">Is all of this really free?</h3>
<p>Yes. freeCodeCamp has always been free, and we’ve now offered free verified certifications for more than a decade. These exams are just the latest expansion to our community’s free learning resources.</p>
<h3 id="heading-can-i-study-the-certification-courses-in-languages-other-than-english">Can I study the certification courses in languages other than English?</h3>
<p>We aim to make every course available in all supported languages on freeCodeCamp. Check your account settings to see if the course you are studying is already offered in your preferred language.</p>
<h3 id="heading-what-language-skills-does-the-curriculum-cover">What language skills does the curriculum cover?</h3>
<p>The languages courses currently cover listening, reading, and writing. We have plans to add speaking later on.</p>
<h3 id="heading-are-the-audio-in-the-language-courses-and-exams-recorded-by-native-language-speakers">Are the audio in the language courses and exams recorded by native language speakers?</h3>
<p>Yes. All the audios present in the language courses were recorded by native speakers of that language.</p>
<h3 id="heading-i-am-deaf-or-hard-of-hearing-can-i-still-study-the-language-courses">I am Deaf or hard of hearing. Can I still study the language courses?</h3>
<p>Yes! All audio lesson have closed captions and transcripts available for reading.</p>
<h3 id="heading-i-am-blind-or-have-limited-vision-and-use-a-screen-reader-can-i-still-study-the-language-courses">I am blind or have limited vision, and use a screen reader. Can I still study the language courses?</h3>
<p>Yes! freeCodeCamp courses are designed to be accessible, and you can study the language courses using a screen reader. If you run into any accessibility issues, you can report them on our GitHub repository so the community can address them.</p>
<h3 id="heading-what-are-the-letters-and-numbers-beside-the-certification-name-for-example-a1-a2-b1">What are the letters and numbers beside the certification name? (For example: A1, A2, B1)</h3>
<p>These labels refer to the CEFR levels, which is an international framework used to describe language proficiency. A1 and A2 represent beginner levels, B1 and B2 represent intermediate levels, and C1 and C2 represent advanced levels.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765475620837/6822cf7c-d05f-4a5c-8e8a-994c540ed369.png" alt="Graphic titled “CEFR Levels Explained” showing the six CEFR language proficiency levels from A1 to C2. A1 is described as communicating with help from the listener. A2 involves communicating in a limited range of contexts. B1 focuses on communicating essential points in familiar contexts. B2 involves communicating with some fluency in a range of contexts. C1 emphasizes flexible and fluent communication in many contexts. C2 represents precise and sensitive communication in most contexts. The freeCodeCamp logo appears at the bottom." class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>Each level indicates the skills and knowledge you are expected to have at that stage of your language learning journey.</p>
<h3 id="heading-what-prevents-people-from-just-cheating-on-the-exams">What prevents people from just cheating on the exams?</h3>
<p>Our goal is to strike a balance between preventing cheating and respecting people's right to privacy.</p>
<p>We've implemented a number of reliable, yet non-invasive, measures to help prevent people from cheating on freeCodeCamp's exams:</p>
<ol>
<li><p>For each exam, we have a massive bank of questions and potential answers to those questions. Each time a person attempts an exam, they'll see only a small, randomized sampling of these questions.</p>
</li>
<li><p>We only allow people to attempt an exam one time per week. This reduces their ability to "brute force" the exam.</p>
</li>
<li><p>We have security in place to validate exam submissions and prevent man-in-the-middle attacks or manipulation of the exam environment.</p>
</li>
<li><p>We manually review each passing exam for evidence of cheating. Our exam environment produces tons of metrics for us to draw from.</p>
</li>
</ol>
<p>We take cheating, and any form of academic dishonesty, seriously. We will act decisively.</p>
<p>This said, no one's exam results will be thrown out without human review, and no one's account will be banned without warning based on a single suspicious exam result.</p>
<h3 id="heading-are-these-exams-open-book-or-closed-book">Are these exams “open book” or “closed book”?</h3>
<p>All of freeCodeCamp’s exams are “closed book”, meaning you must rely only on your mind and not outside resources.</p>
<p>Of course, in the real world you’ll be able to look things up. And in the real world, we encourage you to do so.</p>
<p>But that is not what these exams are evaluating. These exams are instead designed to test your memory of details and your comprehension of concepts.</p>
<p>So when taking these exams, do not use outside assistance in the form of books, notes, AI tools, or other people. Use of any of these will be considered academic dishonesty.</p>
<h3 id="heading-do-you-record-my-webcam-microphone-or-require-me-to-upload-a-photo-of-my-personal-id">Do you record my webcam, microphone, or require me to upload a photo of my personal ID?</h3>
<p>No. We considered adding these as additional test-taking security measures. But we have less privacy-invading methods of detecting most forms of academic dishonesty.</p>
<h3 id="heading-if-the-environment-is-open-source-doesnt-that-make-it-less-secure">If the environment is open source, doesn't that make it less secure?</h3>
<p>"Given enough eyeballs, all bugs are shallow." – Linus’s Law, formulated by Eric S. Raymond in his book <em>The Cathedral and the Bazaar</em></p>
<p>Open source software projects are often more secure than their closed source equivalents. This is because a lot more people are scrutinizing the code. And a lot more people can potentially help identify bugs and other deficiencies, then fix them.</p>
<p>We feel confident that open source is the way to go for this exam environment system.</p>
<h3 id="heading-how-can-i-contribute-to-the-exam-environment-codebase">How can I contribute to the Exam Environment codebase?</h3>
<p>It's fully open source, and we'd welcome your code contributions. Please read our general <a target="_blank" href="https://contribute.freecodecamp.org/intro/">contributor onboarding documentation</a>.</p>
<p>Then check out the <a target="_blank" href="https://github.com/freeCodeCamp/exam-env">GitHub repo</a>.</p>
<p>You can help by creating issues to report bugs or request features.</p>
<p>You can also browse open <code>help wanted</code> issues and attempt to open pull requests addressing them.</p>
<h3 id="heading-are-the-exam-questions-themselves-open-source">Are the exam questions themselves open source?</h3>
<p>For obvious exam security reasons, the exam question banks themselves are not publicly accessible. :)</p>
<p>These are built and maintained by freeCodeCamp's staff instructional designers.</p>
<h3 id="heading-what-happens-if-i-have-internet-connectivity-issues-mid-exam">What happens if I have internet connectivity issues mid-exam?</h3>
<p>If you have internet connectivity issues mid exam, the next time you try to submit an answer, you’ll be told there are connectivity issues. The system will keep prompting you to retry submitting until the connection succeeds.</p>
<h3 id="heading-what-if-my-computer-crashes-mid-exam">What if my computer crashes mid-exam?</h3>
<p>If your computer crashes mid exam, you’ll be able to re-open the Exam Environment. Then, if you still have time left for your exam attempt, you’ll be able to continue from where you left off.</p>
<h3 id="heading-can-i-take-exams-in-languages-other-than-english">Can I take exams in languages other than English?</h3>
<p>Not yet. We’re working to add multi-lingual support in the future.</p>
<h3 id="heading-i-have-completed-my-exam-why-cant-i-see-my-results-yet">I have completed my exam. Why can't I see my results yet?</h3>
<p>All exam attempts are reviewed by freeCodeCamp staff before we release the results. We do this to ensure the integrity of the exam process and to prevent cheating. Once your attempt has been reviewed, you'll be notified of your results the next time you log in to freeCodeCamp.org.</p>
<h3 id="heading-i-use-a-keyboard-instead-of-a-mouse-can-i-navigate-the-exams-using-just-a-keyboard">I use a keyboard instead of a mouse. Can I navigate the exams using just a keyboard?</h3>
<p>This is a high priority for us. We hope to add keyboard navigation to the Exam Environment app soon.</p>
<h3 id="heading-are-exams-timed">Are exams timed?</h3>
<p>Yes, exams are timed. We err on the side of giving plenty of time to take the exam, to account for people who are non-native English speakers, or who have ADHD and other learning differences that can make timed exams more challenging.</p>
<p>If you have a condition that usually qualifies you for extra time on standardized exams, please email support@freecodecamp.org. We’ll review your request and see whether we can find a reasonable solution.</p>
<h3 id="heading-what-happens-if-i-fail-the-exam-can-i-retake-it">What happens if I fail the exam? Can I retake it?</h3>
<p>Yes. You get one exam attempt per week. Afterward, if you don’t pass, there is a one-week (exactly 168 hour) “cool-down” period where you cannot take any freeCodeCamp exams. This is to encourage you to study and to pace yourself.</p>
<p>There is no limit to the number of times you can take an exam. So if you fail, study more, practice your skills more, then try again the following week.</p>
<h3 id="heading-will-the-exam-be-available-to-take-on-my-phone">Will the exam be available to take on my phone?</h3>
<p>At this time, no. You’ll need to use a laptop or desktop to download the exam environment and take the exam. We hope to eventually offer these certification exams on iPhone and Android.</p>
<h3 id="heading-i-have-a-disability-or-health-condition-that-is-not-covered-here-how-can-i-request-accommodations">I have a disability or health condition that is not covered here. How can I request accommodations?</h3>
<p>If you need specific accommodations for the exam (for example extra time, breaks, or alternative formats), please email support@freecodecamp.org. We’ll review your request and see whether we can find a reasonable solution.</p>
<h2 id="heading-anything-else">Anything else?</h2>
<p>Good luck working through freeCodeCamp’s languages coursework and preparing for the exam.</p>
<p>Happy learning!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ freeCodeCamp's A2 English for Developers Certification is Now Live ]]>
                </title>
                <description>
                    <![CDATA[ The freeCodeCamp community just published our new A2 English for Developers certification. You can now sit for the exam to earn the free verified certification, which you can add to your résumé, CV, or LinkedIn profile. How Does the A2 English for D... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/freecodecamps-a2-english-for-developers-certification-is-now-live/</link>
                <guid isPermaLink="false">6939973f5518db00ad552055</guid>
                
                    <category>
                        <![CDATA[ english ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Certification ]]>
                    </category>
                
                    <category>
                        <![CDATA[ freeCodeCamp.org ]]>
                    </category>
                
                    <category>
                        <![CDATA[ languages ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Nielda Karla ]]>
                </dc:creator>
                <pubDate>Wed, 10 Dec 2025 15:52:31 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1764781521906/b24af8b2-4bc2-4e0c-88ae-c121507cebdc.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>The freeCodeCamp community just published our new <a target="_blank" href="https://www.freecodecamp.org/learn/a2-english-for-developers/">A2 English for Developers certification</a>. You can now sit for the exam to earn the free verified certification, which you can add to your résumé, CV, or LinkedIn profile.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764791175004/4e87d250-0d73-4b63-adb9-da912470dfe6.png" alt="4e87d250-0d73-4b63-adb9-da912470dfe6" class="image--center mx-auto" width="870" height="703" loading="lazy"></p>
<h2 id="heading-how-does-the-a2-english-for-developers-certification-work">How Does the A2 English for Developers Certification Work?</h2>
<p>In this English for Developers Certification, you'll learn the essentials of English communication. This will follow the A2 level of the Common European Framework of Reference (CEFR). And we've focused on vocabulary that is particularly useful for developers.</p>
<p>The first half of the curriculum will help you get comfortable with English grammar and usage. It will give you tons of hands-on practice. You'll learn basics like introducing yourself, making small talk, and discussing your work.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764686677811/cf3ce628-e000-44be-a778-6f7bdb2685f3.png" alt="A list of conversation learning topics with expandable sections. Topics include learning greetings at the office, introductions in online meetings, conversation starters in the break room, discussing workdays and tasks, morning or evening routines, describing current projects, sharing educational and professional backgrounds, and talking about hobbies and interests. Each section has a downward arrow icon indicating expansion." class="image--center mx-auto" width="789" height="728" loading="lazy"></p>
<p>In the second half, you'll practice vocabulary specific to software development. You'll learn how to describe code, discuss tech trends, and participate in meetings.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764686758073/4c4aa5fa-7455-49c3-9c6a-43169d46fe3e.png" alt="A list of seven learning topics with dropdown arrows: 1) Roles and Responsibilities, 2) Preferences and Motivations, 3) Trends in Technology, 4) Clarifying Information, 5) Programming Vocabulary, 6) Code-related Concepts, 7) Tech Trends and Updates." class="image--center mx-auto" width="796" height="629" loading="lazy"></p>
<p>Each section in this curriculum follows a unique theme, contains several dialogues, and is filled with hundreds of interactive tasks that will help you develop your English skills.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764687943712/6dae55ae-5a74-41da-a6b5-9696717865cb.png" alt="Course interface titled &quot;Learn Greetings in your First Day at the Office,&quot; offering lessons on introductions, getting to know people, and more. Includes a &quot;Start project&quot; button and a grid with numbered options for Dialogue 1: Maria Introduces Herself to Tom." class="image--center mx-auto" width="804" height="617" loading="lazy"></p>
<p>These tasks will introduce new vocabulary, teach grammar, or review concepts that you’ll need to know in order to understand what the characters from the dialogues are saying.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764790485872/be6dc74a-0de2-402b-b7c9-220157dc7092.png" alt="Alt text: A language exercise titled &quot;Task 1&quot; explains contractions, focusing on &quot;you're&quot; as a combination of &quot;you&quot; and &quot;are.&quot; Below is an illustration of a woman in an office setting saying, &quot;Hello. You’re the new graphic designer, right?&quot;" class="image--center mx-auto" width="817" height="769" loading="lazy"></p>
<p>Each task will have an accompanying question that will help you practice the content.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764790734210/2f952812-1758-4df8-ada4-621ba22834a1.png" alt="Animated character named Sarah in an office setting asks, &quot;Hi, Tom. Are you happy with the workplace so far?&quot; Below, a question about the meaning of &quot;so far&quot; is presented with multiple-choice answers." class="image--center mx-auto" width="808" height="884" loading="lazy"></p>
<p>The curriculum also has fill-in-the-blank questions that will help you practice writing in English.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764790830165/736cda34-33e8-403a-af6d-312382dd0b79.png" alt="An animated character with glasses and a beard is standing in a modern office with wooden floors and colorful furniture. A fill-in-the-blank question at the bottom asks, &quot;That's awesome! _____ time have you spent on it?&quot; A play button and transcript toggle are visible." class="image--center mx-auto" width="810" height="710" loading="lazy"></p>
<p>This entire A2-level curriculum includes 105 different dialogues recorded by native English speakers. Each dialogue is designed to build your vocabulary and boost your confidence when speaking in a professional tech setting.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764686875732/911a6f71-006e-4800-a92e-1ff83e34e927.png" alt="Two animated characters, Sophie and James, are in an office setting discussing a cybersecurity project. Sophie asks James about his project. The office has large windows with a city view and a landscape painting on the wall." class="image--center mx-auto" width="889" height="677" loading="lazy"></p>
<p>Once you’ve completed the certification, you’ll be able to take the A2 English for Developers exam. This exam contains 48 grammar questions, 36 listening questions, and 24 reading questions. All the questions are based on what’s covered in the certification course.</p>
<p>You can take the exam by using our new open source exam environment. The freeCodeCamp community designed this exam environment tool with two goals: respecting your privacy while also making it harder for people to cheat.</p>
<p>Once you download the app to your laptop or desktop, you can take the exam.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764687114424/16878c68-e511-484b-89d7-0ce2e46edf01.png" alt="Alt text: Screenshot of a webpage advertising the A2 English for Developers Certification Exam. It encourages downloading the freeCodeCamp Exam Environment App. The app's latest version is production/1.3.0. There are three buttons: &quot;Open Exam Environment Application,&quot; &quot;Download the Latest Version,&quot; and &quot;Manually download the app.&quot; Contact support is available at support@freecodecamp.org." class="image--center mx-auto" width="842" height="669" loading="lazy"></p>
<h2 id="heading-frequently-asked-questions">Frequently Asked Questions</h2>
<h3 id="heading-is-all-of-this-really-free">Is all of this really free?</h3>
<p>Yes. freeCodeCamp has always been free, and we’ve now offered free verified certifications for more than a decade. These exams are just the latest expansion to our community’s free learning resources.</p>
<h3 id="heading-can-i-study-the-certification-courses-in-languages-other-than-english">Can I study the certification courses in languages other than English?</h3>
<p>We aim to make every course available in all supported languages on freeCodeCamp. Check your account settings to see if the course you are studying is already offered in your preferred language.</p>
<h3 id="heading-what-language-skills-does-the-curriculum-cover">What language skills does the curriculum cover?</h3>
<p>The languages courses currently cover listening, reading, and writing. We have plans to add speaking later on.</p>
<h3 id="heading-are-the-audio-in-the-language-courses-and-exams-recorded-by-native-language-speakers">Are the audio in the language courses and exams recorded by native language speakers?</h3>
<p>Yes. All the audios present in the language courses were recorded by native speakers of that language.</p>
<h3 id="heading-i-am-deaf-or-hard-of-hearing-can-i-still-study-the-language-courses">I am Deaf or hard of hearing. Can I still study the language courses?</h3>
<p>Yes! All audio lesson have closed captions and transcripts available for reading.</p>
<h3 id="heading-i-am-blind-or-have-limited-vision-and-use-a-screen-reader-can-i-still-study-the-language-courses">I am blind or have limited vision, and use a screen reader. Can I still study the language courses?</h3>
<p>Yes! freeCodeCamp courses are designed to be accessible, and you can study the language courses using a screen reader. If you run into any accessibility issues, you can report them on our GitHub repository so the community can address them.</p>
<h3 id="heading-what-are-the-letters-and-numbers-beside-the-certification-name-for-example-a1-a2-b1">What are the letters and numbers beside the certification name? (For example: A1, A2, B1)</h3>
<p>These labels refer to the CEFR levels, which is an international framework used to describe language proficiency. A1 and A2 represent beginner levels, B1 and B2 represent intermediate levels, and C1 and C2 represent advanced levels.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765475620837/6822cf7c-d05f-4a5c-8e8a-994c540ed369.png" alt="6822cf7c-d05f-4a5c-8e8a-994c540ed369" class="image--center mx-auto" width="1024" height="768" loading="lazy"></p>
<p>Each level indicates the skills and knowledge you are expected to have at that stage of your language learning journey.</p>
<h3 id="heading-what-prevents-people-from-just-cheating-on-the-exams">What prevents people from just cheating on the exams?</h3>
<p>Our goal is to strike a balance between preventing cheating and respecting people's right to privacy.</p>
<p>We've implemented a number of reliable, yet non-invasive, measures to help prevent people from cheating on freeCodeCamp's exams:</p>
<ol>
<li><p>For each exam, we have a massive bank of questions and potential answers to those questions. Each time a person attempts an exam, they'll see only a small, randomized sampling of these questions.</p>
</li>
<li><p>We only allow people to attempt an exam one time per week. This reduces their ability to "brute force" the exam.</p>
</li>
<li><p>We have security in place to validate exam submissions and prevent man-in-the-middle attacks or manipulation of the exam environment.</p>
</li>
<li><p>We manually review each passing exam for evidence of cheating. Our exam environment produces tons of metrics for us to draw from.</p>
</li>
</ol>
<p>We take cheating, and any form of academic dishonesty, seriously. We will act decisively.</p>
<p>This said, no one's exam results will be thrown out without human review, and no one's account will be banned without warning based on a single suspicious exam result.</p>
<h3 id="heading-are-these-exams-open-book-or-closed-book">Are these exams “open book” or “closed book”?</h3>
<p>All of freeCodeCamp’s exams are “closed book”, meaning you must rely only on your mind and not outside resources.</p>
<p>Of course, in the real world you’ll be able to look things up. And in the real world, we encourage you to do so.</p>
<p>But that is not what these exams are evaluating. These exams are instead designed to test your memory of details and your comprehension of concepts.</p>
<p>So when taking these exams, do not use outside assistance in the form of books, notes, AI tools, or other people. Use of any of these will be considered academic dishonesty.</p>
<h3 id="heading-do-you-record-my-webcam-microphone-or-require-me-to-upload-a-photo-of-my-personal-id">Do you record my webcam, microphone, or require me to upload a photo of my personal ID?</h3>
<p>No. We considered adding these as additional test-taking security measures. But we have less privacy-invading methods of detecting most forms of academic dishonesty.</p>
<h3 id="heading-if-the-environment-is-open-source-doesnt-that-make-it-less-secure">If the environment is open source, doesn't that make it less secure?</h3>
<p>"Given enough eyeballs, all bugs are shallow." – Linus’s Law, formulated by Eric S. Raymond in his book <em>The Cathedral and the Bazaar</em></p>
<p>Open source software projects are often more secure than their closed source equivalents. This is because a lot more people are scrutinizing the code. And a lot more people can potentially help identify bugs and other deficiencies, then fix them.</p>
<p>We feel confident that open source is the way to go for this exam environment system.</p>
<h3 id="heading-how-can-i-contribute-to-the-exam-environment-codebase">How can I contribute to the Exam Environment codebase?</h3>
<p>It's fully open source, and we'd welcome your code contributions. Please read our general <a target="_blank" href="https://contribute.freecodecamp.org/intro/">contributor onboarding documentation</a>.</p>
<p>Then check out the <a target="_blank" href="https://github.com/freeCodeCamp/exam-env">GitHub repo</a>.</p>
<p>You can help by creating issues to report bugs or request features.</p>
<p>You can also browse open <code>help wanted</code> issues and attempt to open pull requests addressing them.</p>
<h3 id="heading-are-the-exam-questions-themselves-open-source">Are the exam questions themselves open source?</h3>
<p>For obvious exam security reasons, the exam question banks themselves are not publicly accessible. :)</p>
<p>These are built and maintained by freeCodeCamp's staff instructional designers.</p>
<h3 id="heading-what-happens-if-i-have-internet-connectivity-issues-mid-exam">What happens if I have internet connectivity issues mid-exam?</h3>
<p>If you have internet connectivity issues mid exam, the next time you try to submit an answer, you’ll be told there are connectivity issues. The system will keep prompting you to retry submitting until the connection succeeds.</p>
<h3 id="heading-what-if-my-computer-crashes-mid-exam">What if my computer crashes mid-exam?</h3>
<p>If your computer crashes mid exam, you’ll be able to re-open the Exam Environment. Then, if you still have time left for your exam attempt, you’ll be able to continue from where you left off.</p>
<h3 id="heading-can-i-take-exams-in-languages-other-than-english">Can I take exams in languages other than English?</h3>
<p>Not yet. We’re working to add multi-lingual support in the future.</p>
<h3 id="heading-i-have-completed-my-exam-why-cant-i-see-my-results-yet">I have completed my exam. Why can't I see my results yet?</h3>
<p>All exam attempts are reviewed by freeCodeCamp staff before we release the results. We do this to ensure the integrity of the exam process and to prevent cheating. Once your attempt has been reviewed, you'll be notified of your results the next time you log in to freeCodeCamp.org.</p>
<h3 id="heading-i-use-a-keyboard-instead-of-a-mouse-can-i-navigate-the-exams-using-just-a-keyboard">I use a keyboard instead of a mouse. Can I navigate the exams using just a keyboard?</h3>
<p>This is a high priority for us. We hope to add keyboard navigation to the Exam Environment app soon.</p>
<h3 id="heading-are-exams-timed">Are exams timed?</h3>
<p>Yes, exams are timed. We err on the side of giving plenty of time to take the exam, to account for people who are non-native English speakers, or who have ADHD and other learning differences that can make timed exams more challenging.</p>
<p>If you have a condition that usually qualifies you for extra time on standardized exams, please email support@freecodecamp.org. We’ll review your request and see whether we can find a reasonable solution.</p>
<h3 id="heading-what-happens-if-i-fail-the-exam-can-i-retake-it">What happens if I fail the exam? Can I retake it?</h3>
<p>Yes. You get one exam attempt per week. Afterward, if you don’t pass, there is a one-week (exactly 168 hour) “cool-down” period where you cannot take any freeCodeCamp exams. This is to encourage you to study and to pace yourself.</p>
<p>There is no limit to the number of times you can take an exam. So if you fail, study more, practice your skills more, then try again the following week.</p>
<h3 id="heading-will-the-exam-be-available-to-take-on-my-phone">Will the exam be available to take on my phone?</h3>
<p>At this time, no. You’ll need to use a laptop or desktop to download the exam environment and take the exam. We hope to eventually offer these certification exams on iPhone and Android.</p>
<h3 id="heading-i-have-a-disability-or-health-condition-that-is-not-covered-here-how-can-i-request-accommodations">I have a disability or health condition that is not covered here. How can I request accommodations?</h3>
<p>If you need specific accommodations for the exam (for example extra time, breaks, or alternative formats), please email support@freecodecamp.org. We’ll review your request and see whether we can find a reasonable solution.</p>
<h3 id="heading-anything-else">Anything else?</h3>
<p>Good luck working through freeCodeCamp’s languages coursework and preparing for the exam.</p>
<p>Happy learning!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Learn English for Developers – freeCodeCamp A2 English Curriculum ]]>
                </title>
                <description>
                    <![CDATA[ I'm thrilled to announce that the freeCodeCamp community has been developing a comprehensive English for Developers curriculum. Together, we're going to help millions of non-native English speakers prepare for careers in tech. https://www.youtube.com... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/learn-english-for-developers-a2/</link>
                <guid isPermaLink="false">66b8d48698b552b8a8592b01</guid>
                
                    <category>
                        <![CDATA[ english ]]>
                    </category>
                
                    <category>
                        <![CDATA[ freeCodeCamp Curriculum ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Quincy Larson ]]>
                </dc:creator>
                <pubDate>Wed, 20 Dec 2023 17:26:20 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2023/12/English-Curriculum.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>I'm thrilled to announce that the freeCodeCamp community has been developing a comprehensive English for Developers curriculum. Together, we're going to help millions of non-native English speakers prepare for careers in tech.</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/cT8lMv_hwdE" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<h2 id="heading-why-teach-english">Why teach English?</h2>
<p>For the first 9 years of freeCodeCamp's history, we've mainly focused on teaching math, computer science and programming. So why start teaching English all the sudden?</p>
<p>The answer: millions of developers need to improve their English so they can realize their full career potential.</p>
<p>Internationally, English has become the language of technology, with so many key technologies coming out of the English-speaking world.</p>
<p>English is also the language of business in many countries. I have lots of friends who use English at the office – even though they live in non-English-speaking countries.</p>
<p>In short: it is worth it for most people to invest the time in getting really good at speaking English. And freeCodeCamp is going to help people do this. For free.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/12/Learn_Greetings_in_your_First_Day_at_the_Office_-_Task_33___Learn___freeCodeCamp_org_--.png" alt="Image" width="600" height="400" loading="lazy">
<em>A screenshot of freeCodeCamp's English for Developers curriculum, showcasing a listening comprehension challenge and our enhanced accessibility modes.</em></p>
<h3 id="heading-how-freecodecamp-is-teaching-english-for-developers">How freeCodeCamp is teaching English for Developers</h3>
<p>We are teaching English interactively, right in your browser.</p>
<p>We're teaching the essentials of English communication. We do this by following the A2 level of the Common European Framework of Reference (CEFR). And we've focused on vocabulary that is particularly useful for developers.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/12/freeCodeCamp-CEFR-Levels-Explained-2.png" alt="Image" width="600" height="400" loading="lazy">
<em>A graphic I created to explain the 6 CEFR levels. freeCodeCamp has started with A2 and will eventually develop B1, B2, C1, and C2.</em></p>
<p>The first half of the curriculum will help you get comfortable with English grammar and usage. It will give you tons of hands-on practice. You'll learn basics like introducing yourself, making small talk, and discussing your work.</p>
<p>In the second half, you'll practice vocabulary specific to software development. You'll learn how to describe code, discuss tech trends, and participate in stand-up meetings.</p>
<p>This entire A2-level curriculum includes 105 different dialogues. Each is designed to build your vocabulary and boost your confidence when speaking in a professional tech setting. </p>
<p>We've already published 278 English challenges, with videos. And over the coming months we'll publish the rest of Level A2 – more than 1,200 additional challenges.</p>
<p>From there, we'll develop Levels B1, B2, C1, and eventually C2. (We're skipping level A1 since it is covered by most high school and college English courses in most non-English speaking countries.)</p>
<p>I want to give a special thanks to prolific freeCodeCamp contributor <a target="_blank" href="https://forum.freecodecamp.org/u/bbsmooth/summary">Bruce B</a>, who helped us ensure that the curriculum has subtitles and accessibility functions for people with hearing impairment.</p>
<h3 id="heading-this-is-only-the-beginning">This is only the beginning</h3>
<p>We'll be working throughout 2024 and 2025 to help as many developers as possible improve their English fluency.</p>
<p>You can get involved in our open source efforts by <a target="_blank" href="https://contribute.freecodecamp.org/#/">becoming a volunteer in the freeCodeCamp community</a>.</p>
<p>And if you want to help us speed up development of our English for Developers curriculum, and the <a target="_blank" href="https://www.freecodecamp.org/news/a-very-freecodecamp-christmas/">many other initiatives we have underway</a>, you should <a target="_blank" href="https://www.freecodecamp.org/donate">become a monthly supporter of our charity</a>.</p>
<p>Happy English learning. 🏕️</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What is a Contraction? Grammar and Definition ]]>
                </title>
                <description>
                    <![CDATA[ Take  a look at the following sentences: I’m learning how to  code. I'll get a software developer job.  Learning how to code doesn’t have to cost you money. The words I’m, I’ll and doesn’t are called contractions. In this article, you'll learn all ab... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-a-contraction-grammar-and-definition/</link>
                <guid isPermaLink="false">66b1e4cf98966ccde43c3c62</guid>
                
                    <category>
                        <![CDATA[ english ]]>
                    </category>
                
                    <category>
                        <![CDATA[ grammar ]]>
                    </category>
                
                    <category>
                        <![CDATA[ language ]]>
                    </category>
                
                    <category>
                        <![CDATA[ reading ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technical writing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dionysia Lemonaki ]]>
                </dc:creator>
                <pubDate>Mon, 20 Sep 2021 13:59:58 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/09/clarissa-watson-jAebodq7oxk-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Take  a look at the following sentences:</p>
<p>I’m learning how to  code.</p>
<p>I'll get a software developer job. </p>
<p>Learning how to code doesn’t have to cost you money.</p>
<p>The words <strong>I’m</strong>, <strong>I’ll</strong> and <strong>doesn’t</strong> are called contractions.</p>
<p>In this article, you'll learn all about contractions – what they are, when and where you'll most likely come across them, when and when not to use them. Finally you'll see some of the most common contractions used in the English language.</p>
<p>Let's get started!</p>
<h2 id="heading-what-are-contractions">What are contractions?</h2>
<p>Contractions, also known as 'short forms', are shortened words.</p>
<p>Specifically, a contraction is when two words are shortened in form and are put together to form one new word.</p>
<p>For example, <code>you</code> and <code>are</code> can be combined to create a shorter word, <code>you’re</code>.</p>
<p>When two words are combined, certain letters will disappear. You can lose just one letter or more, depending on the contraction.</p>
<p>When you combine those two words and the letter(s) disappear, an apostrophe (<code>’</code>) will take their place. </p>
<p>The missing, original letters get replaced by the apostrophe to show the place where the missing letters should be. Those letters will not appear in the contraction (as they've been replaced by the apostrophe).</p>
<p>For example, take the word <code>isn't</code>. This contraction combines the words <code>is</code> and <code>not</code>. When those two get paired together, the letter <code>o</code> disappears. An apostrophe now takes its place to show where the missing letter was.</p>
<p>Another example is when <code>you</code> and <code>will</code> get combined to form <code>you'll</code>. Now two letters disappear,<code>w</code> and <code>i</code>, and the apostrophe fills that space of two missing letters.</p>
<h2 id="heading-when-do-you-use-contractions">When do you use contractions?</h2>
<p>We use contractions every day in both speech and writing.</p>
<p>You'll hear them from your friends, family, and on TV. You'll see them in novels, non-fiction books, newspapers, instruction manuals, blog posts, learning material, and much more. There are a couple in this very paragraph, and I use them throughout this article.</p>
<p>They are informal and casual, since they give your writing a more friendly, light, accessible, and approachable tone. </p>
<p>Contractions can make the reader feel like you are talking directly to them and having a conversation. It helps make your writing appear uncomplicated for everyone to understand and make sense of.</p>
<p>Because contractions are shorter, it also means that they take up less space. Because of that, you'll often see them in advertisements where space is valuable.</p>
<p>In a nutshell, you can comfortably use contractions in more informal writing and on relaxed occasions.</p>
<h3 id="heading-when-to-avoid-using-contractions">When to avoid using contractions</h3>
<p>It's best to avoid using contractions when you want to maintain a more serious and formal tone in your writing.</p>
<p>For example, skip using them in academic research papers, important business presentations, or in any situation where informal writing or speech would not make much sense.</p>
<h2 id="heading-common-contractions">Common contractions</h2>
<p>Below are some of the most widely used and common contractions you'll encounter when speaking and writing in English.</p>
<h3 id="heading-common-contractions-ending-in-ll">Common Contractions ending in <code>-ll</code></h3>
<p>Contractions ending in <code>-ll</code> include the word <code>will</code>. The <code>w</code> and <code>i</code> letters get dropped.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Contracted</td><td>Uncontracted</td></tr>
</thead>
<tbody>
<tr>
<td>I’ll</td><td>I + will</td></tr>
<tr>
<td>She’ll</td><td>She + will</td></tr>
<tr>
<td>It’ll</td><td>It + will</td></tr>
<tr>
<td>We’ll</td><td>We + will</td></tr>
<tr>
<td>You’ll</td><td>You + will</td></tr>
<tr>
<td>They’ll</td><td>They + will</td></tr>
<tr>
<td>Who’ll</td><td>Who + will</td></tr>
<tr>
<td>That’ll</td><td>That + will</td></tr>
<tr>
<td>There’ll</td><td>There + will</td></tr>
<tr>
<td>What’ll</td><td>What + will</td></tr>
<tr>
<td>When’ll</td><td>When + will</td></tr>
<tr>
<td>Where’ll</td><td>Where + will</td></tr>
<tr>
<td>How’ll</td><td>How + will</td></tr>
</tbody>
</table>
</div><h3 id="heading-common-contractions-ending-in-re">Common Contractions ending in <code>-re</code></h3>
<p>Contractions ending in <code>-re</code> include the word <code>are</code>. The letter <code>a</code> gets dropped.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Contracted</td><td>Uncontracted</td></tr>
</thead>
<tbody>
<tr>
<td>We’re</td><td>We + are</td></tr>
<tr>
<td>You’re</td><td>You + are</td></tr>
<tr>
<td>They’re</td><td>You + are</td></tr>
<tr>
<td>Who’re</td><td>Who + are</td></tr>
<tr>
<td>What’re</td><td>What + are</td></tr>
<tr>
<td>When’re</td><td>When + are</td></tr>
<tr>
<td>Where’re</td><td>Where + are</td></tr>
<tr>
<td>Why’re</td><td>Why + are</td></tr>
<tr>
<td>How’re</td><td>How + are</td></tr>
</tbody>
</table>
</div><h3 id="heading-common-contractions-ending-in-s">Common Contractions ending in <code>-s</code></h3>
<p>Contractions ending in <code>-s</code> include either the word <code>is</code> or <code>has</code>.</p>
<p>For example:</p>
<ul>
<li><code>He is going = He’s going</code></li>
<li><code>It has gone = It’s gone</code>.</li>
</ul>
<p>The letter <code>i</code> or the letters <code>h</code> and <code>a</code>, respectively, get dropped.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Contracted</td><td>Uncontracted</td></tr>
</thead>
<tbody>
<tr>
<td>He’s</td><td>He + is / He + has</td></tr>
<tr>
<td>She’s</td><td>She + is / She + has</td></tr>
<tr>
<td>It’s</td><td>It + is / It + has</td></tr>
<tr>
<td>Who’s</td><td>Who + is / Who + has</td></tr>
<tr>
<td>There’s</td><td>There + is / There + has</td></tr>
<tr>
<td>Thats’s</td><td>That + is / That + has</td></tr>
<tr>
<td>What’s</td><td>What + is</td></tr>
<tr>
<td>When’s</td><td>When + is</td></tr>
<tr>
<td>Where’s</td><td>Where + is</td></tr>
<tr>
<td>Why’s</td><td>Why + is</td></tr>
<tr>
<td>How’s</td><td>How + is</td></tr>
</tbody>
</table>
</div><p>What about <code>let's</code> ? That is a bit different. <code>let's</code> comes from <code>let + us</code>.</p>
<h3 id="heading-common-contractions-ending-in-ve">Common Contractions ending in <code>-ve</code></h3>
<p>Contractions ending in <code>-ve</code> include the word <code>have</code>. The letters <code>h</code> and <code>a</code> get dropped.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Contracted</td><td>Uncontracted</td></tr>
</thead>
<tbody>
<tr>
<td>I’ve</td><td>I + have</td></tr>
<tr>
<td>You’ve</td><td>You + have</td></tr>
<tr>
<td>We’ve</td><td>We + have</td></tr>
<tr>
<td>They’ve</td><td>They + have</td></tr>
<tr>
<td>Could’ve</td><td>Could + have</td></tr>
<tr>
<td>Would’ve</td><td>Would + have</td></tr>
<tr>
<td>Should’ve</td><td>Should + have</td></tr>
<tr>
<td>Must’ve</td><td>Must + have</td></tr>
<tr>
<td>Might’ve</td><td>Might + have</td></tr>
<tr>
<td>Who’ve</td><td>Who + have</td></tr>
<tr>
<td>What’ve</td><td>What + have</td></tr>
<tr>
<td>When’ve</td><td>When + have</td></tr>
<tr>
<td>Where’ve</td><td>Where + have</td></tr>
<tr>
<td>Why’ve</td><td>Why + have</td></tr>
<tr>
<td>How’ve</td><td>How + have</td></tr>
</tbody>
</table>
</div><h3 id="heading-common-contractions-ending-in-d">Common Contractions ending in <code>-d</code></h3>
<p>Contractions ending in <code>-d</code> include either the word <code>had</code> or <code>would</code>.</p>
<p>Some examples with the word <code>had</code>:</p>
<ul>
<li><code>I'd better go now = I had better go now</code></li>
<li><code>I wish I'd never left = I wish I had never left</code>.</li>
</ul>
<p>Some examples with the word <code>would</code>:</p>
<ul>
<li><code>I'd rather not go there = I would rather not go there</code></li>
<li><code>I'd like something to drink please = I would like something to drink please</code>.</li>
</ul>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Contracted</td><td>Uncontracted</td></tr>
</thead>
<tbody>
<tr>
<td>I’d</td><td>I + had / I + would</td></tr>
<tr>
<td>She’d</td><td>She + had / She + would</td></tr>
<tr>
<td>We’d</td><td>We + had / We + would</td></tr>
<tr>
<td>They’d</td><td>They + had / They + would</td></tr>
<tr>
<td>Who’d</td><td>Who + had / Who + would</td></tr>
<tr>
<td>That’d</td><td>That + had / That + would</td></tr>
<tr>
<td>What’d</td><td>What + had / What + would</td></tr>
<tr>
<td>There’d</td><td>There + had / There + would</td></tr>
<tr>
<td>When’d</td><td>When + had / When + would</td></tr>
<tr>
<td>Where’d</td><td>Where + had / Where + would</td></tr>
<tr>
<td>Why’d</td><td>Why + had / Why + would</td></tr>
<tr>
<td>How’d</td><td>How + had / How + would</td></tr>
</tbody>
</table>
</div><h3 id="heading-common-contractions-ending-in-m">Common Contractions ending in <code>-m</code></h3>
<p>Contractions ending in <code>-m</code>,include the word <code>am</code>. </p>
<p>The letter <code>a</code> gets dropped.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Contracted</td><td>Uncontracted</td></tr>
</thead>
<tbody>
<tr>
<td>I’m</td><td>I + am</td></tr>
</tbody>
</table>
</div><h3 id="heading-negative-contractions">Negative contractions</h3>
<p>Negative contractions are those that end in <code>-nt</code>.</p>
<p>You achieve this by adding the word <code>not</code> to a verb, making it negative.</p>
<p>In this case,the letter <code>o</code> gets dropped.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Contracted</td><td>Uncontracted</td></tr>
</thead>
<tbody>
<tr>
<td>Can’t</td><td>Can + not</td></tr>
<tr>
<td>Hadn’t</td><td>Had + not</td></tr>
<tr>
<td>Hasn’t</td><td>Has + not</td></tr>
<tr>
<td>Haven’t</td><td>Have + not</td></tr>
<tr>
<td>Didn’t</td><td>Did + not</td></tr>
<tr>
<td>Doesn’t</td><td>Does + not</td></tr>
<tr>
<td>Don’t</td><td>Do + not</td></tr>
<tr>
<td>Daren’t</td><td>Dare + not</td></tr>
<tr>
<td>Couldn’t</td><td>Could + not</td></tr>
<tr>
<td>Wouldn’t</td><td>Would + not</td></tr>
<tr>
<td>Shouldn’t</td><td>Should + not</td></tr>
<tr>
<td>Mustn’t</td><td>Must + not</td></tr>
<tr>
<td>Mightn't</td><td>Might + not</td></tr>
<tr>
<td>Oughtn’t</td><td>Ought + not</td></tr>
<tr>
<td>Needn’t</td><td>Need + not</td></tr>
<tr>
<td>Wasn't</td><td>Was+ not</td></tr>
<tr>
<td>Isn’t</td><td>Is+ not</td></tr>
<tr>
<td>Aren’t</td><td>Are + not</td></tr>
<tr>
<td>Weren’t</td><td>Were + not</td></tr>
<tr>
<td>Shan’t</td><td>Shall + not</td></tr>
</tbody>
</table>
</div><p>A word that is a little different and an exception to what has been shown so far is <code>won’t</code> – it comes from <code>will + not = won’t</code>. </p>
<p><code>will</code> does not turn into <code>willn’t</code>. In fact the word "will" does not appear in the contraction at all. Just think of it as an irregular contraction (like how we have irregular verbs).</p>
<h2 id="heading-common-mistakes-with-contractions">Common mistakes with contractions</h2>
<p>A couple of contractions commonly cause confusion and people often use them in the wrong way - you'll even see native English speakers make these mistakes.</p>
<p>These contractions sound exactly the same with other words, so these mistakes commonly occur in writing.</p>
<h3 id="heading-youre-and-your">You’re and Your</h3>
<p><code>You’re</code> is a contraction, a combination of the words <code>you</code> and <code>are</code>.</p>
<p>For example, <code>You’re learning how to code</code> or <code>You’re doing great!</code>.</p>
<p><code>Your</code> is a possesive pronoun, it is used to indicate that something is owned by/belongs to someone.</p>
<p>For example, <code>Your cat is so cuddly!</code> or <code>Your cooking always tastes so good</code>.</p>
<p><code>Your doing great</code> makes no sense since it doesn't indicate that something belongs to someone. <code>You’re doing great</code> does, since it indicates action and verbs are used for that.</p>
<p>If you get confused and don't know which to use, read it out to yourself as <code>you are</code> and see if it sounds right.</p>
<p><code>Your are cat is so cuddly!</code> doesn't make sense or sound right, for example.</p>
<h3 id="heading-its-and-its">It’s and Its</h3>
<p><code>It’s</code> is a contraction – a combinations of <code>it</code> and <code>is</code> or <code>has</code>.</p>
<p>For example, <code>It’s raining outside</code> or <code>It’s been great for me so far, I’m really enjoying it here</code>.</p>
<p><code>Its</code> is a possesive pronoun. <code>Its</code> shows possession.</p>
<p>For example, <code>Don’t judge a book by its cover</code> or <code>The cat is in its sleeping basket</code>.</p>
<p>Similarly to the example from the previous section, if you're confused use the verbs <code>is</code> or <code>has</code> in your sentence and check to see if it makes sense to add the apostrophe/make it a contraction: <code>Don’t judge a book by it is cover</code> doesn't make sense, so you use the possessive "its" with no apostrophe.</p>
<p><code>It is raining outside</code> makes sense, so you now know that you can use an apostrophe.</p>
<h3 id="heading-theyre-their-and-there">They’re, Their, and There</h3>
<p>All three of these words sound the same.</p>
<p><code>They’re</code> is a contraction. <code>They</code> and <code>are</code> were combined.</p>
<p>For example,<code>They’re going away for the holiday season</code> or <code>They’re buying a house together</code>.</p>
<p>Does the sentence sound right when you use <code>they are</code>? Then use <code>they’re</code>.</p>
<p><code>Their</code> shows possesion. </p>
<p>For example,<code>Their dog bit me last night</code> or <code>I don’t like their attitude</code>.</p>
<p>Finally, <code>There</code> indicates a place, a location.</p>
<p>For example,<code>I wish I was there instead</code> or <code>I’m never going there again</code>.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>And there you have it!</p>
<p>This article gave an overview of contractions and how to use them in both spoken and written English.</p>
<p>You saw some of the most common ones used and some frequent mistakes made when using them.</p>
<p>Thanks for reading!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Data Is or Data Are? Is The Word "Data" Singular or Plural? ]]>
                </title>
                <description>
                    <![CDATA[ I'll cut right to the chase: the word "data" is plural. It's the plural form of Latin word "datum." Many data. One datum. Datum means "a given" or "something that should be taken into consideration." Nobody really uses the word "datum." Instead peopl... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/data-is-or-data-are-singular-or-plural/</link>
                <guid isPermaLink="false">66b8d2f8064c610cf26d29b5</guid>
                
                    <category>
                        <![CDATA[ Data Science ]]>
                    </category>
                
                    <category>
                        <![CDATA[ english ]]>
                    </category>
                
                    <category>
                        <![CDATA[ statistics ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Quincy Larson ]]>
                </dc:creator>
                <pubDate>Wed, 01 Apr 2020 23:54:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/04/data-is-data-are.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>I'll cut right to the chase: the word "data" is plural. It's the plural form of Latin word "datum." Many data. One datum.</p>
<p>Datum means "a given" or "something that should be taken into consideration."</p>
<p>Nobody really uses the word "datum." Instead people say "data point" to represent a single unit of data.</p>
<p>So yes – when developers and data scientists say: "the data <em>suggest</em> these two phenomena are correlated" instead of "<em>suggests</em>" – they are indeed using the correct subject-verb agreement for the word "data".</p>
<p>This is not a matter of being cheeky. There is a single objective reality we all live in. And in that reality, the word "data" is plural.</p>
<h2 id="heading-but-its-ok-for-people-to-say-the-data-is-instead-of-the-data-are">But it's OK for people to say "the data <em>is</em>" instead of "the data <em>are</em>"</h2>
<p>It really is.</p>
<p>Life is too short for this kind of nitpicking.</p>
<p>I often hear people who work with data use the wrong subject-verb agreement for the word data. I don't correct them. Because I don't want them to dismiss me as pedantic. Or to take this as some form of deeply-felt criticism.</p>
<p>And I recommend you don't correct people on this, either. It's just not that big a deal.</p>
<p>But remember, there 3 things that can instantly make anyone sound smarter:</p>
<ul>
<li>Black frame glasses</li>
<li>A white lab coat</li>
<li>Saying "data are" instead of "data is"</li>
</ul>
<p>Happy coding.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Common word bugs in software documentation and how to fix them ]]>
                </title>
                <description>
                    <![CDATA[ I’ve been an editor longer than I’ve been a developer, so this topic for me is a real root issue. ? When I see a great project with poorly-written docs, it hits close to /home. Okay, okay, I’m done. I help the Open Web Application Security Project (O... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/word-bugs-in-software-documentation-and-how-to-fix-them/</link>
                <guid isPermaLink="false">66bd8fa2c1ca1df1936e29ed</guid>
                
                    <category>
                        <![CDATA[ documentation ]]>
                    </category>
                
                    <category>
                        <![CDATA[ english ]]>
                    </category>
                
                    <category>
                        <![CDATA[ open source ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Software Testing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Testing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Victoria Drake ]]>
                </dc:creator>
                <pubDate>Thu, 19 Dec 2019 14:59:56 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2019/12/cover-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>I’ve been an editor longer than I’ve been a developer, so this topic for me is a real root issue. ? When I see a great project with poorly-written docs, it hits close to <code>/home</code>. Okay, okay, I’m done.</p>
<p>I help the <a target="_blank" href="https://github.com/OWASP">Open Web Application Security Project (OWASP)</a> with their <a target="_blank" href="https://github.com/OWASP/wstg">Web Security Testing Guide (WSTG)</a>. I was recently tasked with writing a <a target="_blank" href="https://en.wikipedia.org/wiki/Style_guide">style guide</a> and article template that show how to write technical instruction for testing software applications.</p>
<p>I thought parts of the guide would benefit more people than just OWASP’s contributors, so I’m sharing some here.</p>
<p>Many of the projects I participate in are open source. This is a wonderful way for people to share solutions and to build on each others’ ideas. Unfortunately, it’s also a great way for misused and non-existent words to catch on. Here’s an excerpt of the guide with some mistakes I’ve noticed and how you can fix them in your technical documents.</p>
<h2 id="heading-use-correct-words">Use Correct Words</h2>
<p>The following are frequently misused words with tips for how to correct them.</p>
<h3 id="heading-andor"><em>and/or</em></h3>
<p>While sometimes used in legal documents, <em>and/or</em> leads to ambiguity and confusion in technical writing. Instead, use <em>or</em>, which in the English language includes <em>and</em>. For example:</p>
<blockquote>
<p>Bad: “The code will output an error number and/or description.”<br>Good: “The code will output an error number or description.”</p>
</blockquote>
<p>The latter sentence does not exclude the possibility of having both an error number and description.</p>
<p>If you need to specify all possible outcomes, use a list:</p>
<blockquote>
<p>“The code will output an error number, or a description, or both.”</p>
</blockquote>
<h3 id="heading-frontend-backend"><em>frontend, backend</em></h3>
<p>While it’s true that the English language evolves over time, these are not yet words.</p>
<p>When referring to nouns, use <em>front end</em> and <em>back end</em>. For example:</p>
<blockquote>
<p>Security is equally important on the front end as it is on the back end.</p>
</blockquote>
<p>As a descriptive adverb, use the hyphenated <em>front-end</em> and <em>back-end</em>.</p>
<blockquote>
<p>Both front-end developers and back-end developers are responsible for application security.</p>
</blockquote>
<h3 id="heading-whitebox-blackbox-greybox"><em>whitebox</em>, <em>blackbox</em>, <em>greybox</em></h3>
<p>These are not words.</p>
<p>As nouns, use <em>white box</em>, <em>black box</em>, and <em>grey box</em>. These nouns rarely appear in connection with cybersecurity.</p>
<blockquote>
<p>My cat enjoys jumping into that grey box.</p>
</blockquote>
<p>As adverbs, use the hyphenated <em>white-box</em>, <em>black-box</em>, and <em>grey-box</em>. Do not use capitalization unless the words are in a title.</p>
<blockquote>
<p>While white-box testing involves knowledge of source code, black-box testing does not. A grey-box test is somewhere in-between.</p>
</blockquote>
<h3 id="heading-ie-eg"><em>ie</em>, <em>eg</em></h3>
<p>These are letters.</p>
<p>The abbreviation <em>i.e.</em> refers to the Latin <em>id est</em>, which means "that is" or “in other words.” The abbreviation <em>e.g.</em> is for <em>exempli gratia</em>, translating to “for example.” To use these in a sentence:</p>
<blockquote>
<p>Write using proper English, i.e. correct spelling and grammar. Use common  words over uncommon ones, e.g. “learn” instead of “glean.”</p>
</blockquote>
<h3 id="heading-etc"><em>etc</em></h3>
<p>These are also letters.</p>
<p>The Latin phrase <em>et cetera</em> translates to “and the rest.” It is abbreviated <em>etc.</em> and typically placed at the end of a list that seems redundant to complete:</p>
<blockquote>
<p>WSTG authors like rainbow colors, such as red, yellow, green, etc.</p>
</blockquote>
<p>In technical writing, the use of <em>etc.</em> is problematic. It assumes the reader knows what you’re talking about, and they may not. Violet is one of the colors of the rainbow, but the example above does not explicitly tell you if violet is a color that WSTG authors like.</p>
<p>It is better to be explicit and thorough than to make assumptions of the reader. Only use <em>etc.</em> to avoid completing a list that was given in full earlier in the document.</p>
<h3 id="heading-ellipsis"><em>…</em> (ellipsis)</h3>
<p>The ellipsis punctuation mark can indicate that words have been left out of a quote:</p>
<blockquote>
<p>Linus Torvalds once said, "Once you realize that documentation should be laughed at… THEN, and only then, have you reached the level where you can safely read it and try to use it to actually implement a driver."</p>
</blockquote>
<p>As long as the omission does not change the meaning of the quote, this is acceptable usage of ellipsis in technical writing.</p>
<p>All other uses of ellipsis, such as to indicate an unfinished thought, are not.</p>
<h3 id="heading-ex"><em>ex</em></h3>
<p>While this is a word, it is likely not the word you are looking for. The word <em>ex</em> has particular meaning in the fields of finance and commerce, and may refer to a person if you are discussing your past relationships. None of these topics should appear in technical writing.</p>
<p>The abbreviation <em>ex.</em> may be used to mean “example” by lazy writers. Please don’t be lazy, and write <em>example</em> instead.</p>
<h2 id="heading-go-forth-and-write-docs">Go forth and write docs</h2>
<p>If these reminders are helpful, please share them freely and use them when writing your own READMEs and documentation! If there’s some I’ve missed, I’d love to know.</p>
<p>And if you’re here for the comments…</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/12/crowder-change-my-mind.png" alt="Image" width="600" height="400" loading="lazy">
<em>"Change my mind" meme.</em></p>
<p>If you’d like to help contribute to the OWASP WSTG, please read <a target="_blank" href="https://github.com/OWASP/wstg/blob/master/CONTRIBUTING.md">the contribution guide</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How I reverse-engineered the  Hemingway Editor - a popular writing app - and built my own from a beach in Thailand ]]>
                </title>
                <description>
                    <![CDATA[ By Sam Williams I’ve been using the Hemingway App to try to improve my posts. At the same time I’ve been trying to find ideas for small projects. I came up with the idea of integrating a Hemingway style editor into a markdown editor. So I needed to f... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/https-medium-com-samwcoding-deconstructing-the-hemingway-app-8098e22d878d/</link>
                <guid isPermaLink="false">66d460d98812486a37369d48</guid>
                
                    <category>
                        <![CDATA[ english ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ lessons learned ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 03 Jul 2019 04:30:00 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/5f9ca1be740569d1a4ca5067.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Sam Williams</p>
<p>I’ve been using the Hemingway App to try to improve my posts. At the same time I’ve been trying to find ideas for small projects. I came up with the idea of integrating a Hemingway style editor into a markdown editor. So I needed to find out how Hemingway worked!</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/07/Hemingway_Editor.png" alt="Image" width="600" height="400" loading="lazy">
<em>A screenshot of the Hemingway Editor</em></p>
<h3 id="heading-getting-the-logic">Getting the Logic</h3>
<p>I had no idea how the app worked when I first started. It could have sent the text to a server to calculate the complexity of the writing, but I expected it to be calculated client side.</p>
<p>Opening developer tools in Chrome ( Control + Shift + I or F12 on Windows/Linux, Command + Option + I on Mac) and navigating to <em>Sources</em> provided the answers<em>.</em> There, I found the file I was looking for: <strong>hemingway3-web.js.</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/5j4RVt-ESeQ5r1KyFgUI4bQ9lzJeEY0FQfpE" alt="Image" width="600" height="400" loading="lazy">
<em>Minified file on the top, Formatted file on the bottom. What a difference it makes!</em></p>
<p>This code is in a minified form, which is a pain to read and understand. To solve this, I copied the file into VS Code and formatted the document (<em>Control</em>+ <em>Shift</em> + <em>I</em> for VS Code). This changes a 3-line file into a 4859-line file with everything formatted nicely.</p>
<h3 id="heading-exploring-the-code">Exploring the Code</h3>
<p>I started to look through the file for anything that I could make sense of. The start of the file contained immediately invoked function expressions. I had little idea of what was happening.</p>
<pre><code class="lang-js">!<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>) </span>{
  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">t</span>(<span class="hljs-params">r</span>) </span>{
      <span class="hljs-keyword">if</span> (n[r])
          <span class="hljs-keyword">return</span> n[r].exports;
      <span class="hljs-keyword">var</span> o = n[r] = {
          <span class="hljs-attr">exports</span>: {},
          <span class="hljs-attr">id</span>: r,
          <span class="hljs-attr">loaded</span>: !<span class="hljs-number">1</span>
      };
...
</code></pre>
<p>This continued for about 200 lines before I decided that I was probably reading the code to make the page run (React?). I started skimming through the rest of the code until I found something I could understand. (I missed quite a lot that I would later find through finding function calls and looking at the function definition).</p>
<p>The first bit of code I understood was all the way at line 3496!</p>
<pre><code>getTokens: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>) </span>{
  <span class="hljs-keyword">var</span> t = <span class="hljs-built_in">this</span>.getAdverbs(e), 
    n = <span class="hljs-built_in">this</span>.getQualifiers(e),
    r = <span class="hljs-built_in">this</span>.getPassiveVoices(e), 
    o = <span class="hljs-built_in">this</span>.getComplexWords(e);
  <span class="hljs-keyword">return</span> [].concat(t, n, r, o).sort(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e, t</span>) </span>{
    <span class="hljs-keyword">return</span> e.startIndex - t.startIndex
  })
}
</code></pre><p>And amazingly, all these functions were defined right below. Now I knew how the app defined adverbs, qualifiers, passive voice, and complex words. Some of them are very simple. The app checks each word against lists of qualifiers, complex words, and passive voice phrases. <code>this.getAdverbs</code> filters words based on whether they end in ‘ly’ and then checks whether it’s in the list of non-adverb words ending in ‘ly’.</p>
<p>The next bit of useful code was the implementation of highlighting words or sentences. In this code there is a line:</p>
<pre><code class="lang-js">e.highlight.hardSentences += h
</code></pre>
<p>‘hardSentences’ was something I could understand, something with meaning. I then searched the file for <code>hardSentences</code> and got 13 matches. This lead to a line that calculated the readability stats:</p>
<pre><code class="lang-js">n.stats.readability === i.default.readability.hard &amp;&amp; (e.hardSentences += <span class="hljs-number">1</span>),
n.stats.readability === i.default.readability.veryHard &amp;&amp; (e.veryHardSentences += <span class="hljs-number">1</span>)
</code></pre>
<p>Now I knew that there was a <code>readability</code> parameter in both <code>stats</code> and <code>i.default</code>. Searching the file, I got 40 matches. One of those matches was a <code>getReadabilityStyle</code> function, where they grade your writing.</p>
<p>There are three levels: normal, hard and very hard.</p>
<pre><code class="lang-js">t = e.words;
n = e.readingLevel;
<span class="hljs-keyword">return</span> t &lt; <span class="hljs-number">14</span>
  ? i.default.readability.normal
  : n &gt;= <span class="hljs-number">10</span> &amp;&amp; n &lt; <span class="hljs-number">14</span>
    ? i.default.readability.hard
    : n &gt;= <span class="hljs-number">14</span> ? i.default.readability.veryHard 
      : i.default.readability.normal;
</code></pre>
<p>“Normal” is less than 14 words, “hard” is 10–14 words, and “very hard” is more than 14 words.</p>
<p>Now to find how to calculate the reading level.</p>
<p>I spent a while here trying to find any notion of how to calculate the reading level. I found it 4 lines above the <code>getReadabilityStyle</code> function.</p>
<pre><code class="lang-js">e = letters <span class="hljs-keyword">in</span> paragraph;
t = words <span class="hljs-keyword">in</span> paragraph;
n = sentences <span class="hljs-keyword">in</span> paragraph;

getReadingLevel: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e, t, n</span>) </span>{
  <span class="hljs-keyword">if</span> (<span class="hljs-number">0</span> === t 
 <span class="hljs-number">0</span> === n) <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
  <span class="hljs-keyword">var</span> r = <span class="hljs-built_in">Math</span>.round(<span class="hljs-number">4.71</span> * (e / t) + <span class="hljs-number">0.5</span> * (t / n) - <span class="hljs-number">21.43</span>);
  <span class="hljs-keyword">return</span> r &lt;= <span class="hljs-number">0</span> ? <span class="hljs-number">0</span> : r;
}
</code></pre>
<p>That means your score is 4.71 <em> average word length + 0.5 </em> average sentence length -21.43. That’s it. That is how Hemingway grades each of your sentences.</p>
<h3 id="heading-other-interesting-things-i-found">Other Interesting Things I Found</h3>
<ul>
<li>The highlight commentary (information about your writing on the right hand side) is a big switch statement. Ternary statements are used to change the response based on how well you’ve written.</li>
<li>The grading goes up to 16 before it’s classed as “Post-Graduate” level.</li>
</ul>
<h3 id="heading-what-im-going-to-do-with-this">What I’m going to do with this</h3>
<p>I am planning to make a basic website and apply what I’ve learned from deconstructing the Hemingway app. Nothing fancy, more as an exercise for implementing some logic. I’ve built a Markdown previewer before, so I might also try to create a writing application with the highlighting and scoring system.</p>
<h1 id="heading-creating-my-own-hemingway-app">Creating My Own Hemingway App</h1>
<p>Having figured out how the Hemingway app works, I then decided to implement what I had learnt to make a much simplified version.</p>
<p>I wanted to make sure that I was keeping it basic, focusing on the logic more that the styling. I chose to go with a simple text box entry box.</p>
<h4 id="heading-challenges">Challenges</h4>
<ol>
<li><p>How to assure performance. Rescanning the whole document on every key press could be very computationally expensive. This could result in UX blocking which is obviously not what we want.</p>
</li>
<li><p>How to split up the text into paragraphs, sentences and words for highlighting.</p>
</li>
</ol>
<h4 id="heading-possible-solutions">Possible Solutions</h4>
<ul>
<li>Only rescan the paragraphs that change. Do this by counting the number of paragraphs and comparing that to the document before the change. Use this to find the paragraph that has changed or the new paragraph and only scan that one.</li>
<li><p>Have a button to scan the document. This massively reduces the calls of the scanning function.</p>
</li>
<li><p>Use what I learnt from Hemingway — every paragraph is a </p><p> and any sentences or words that need highlighting are wrapped in an internal <span> with the necessary class.</span></p>
</li>
</ul>
<h3 id="heading-building-the-app">Building the App</h3>
<p>Recently I’ve read a lot of articles about building a Minimum Viable Product (MVP) so I decided that I would run this little project the same. This meant keeping everything simple. I decided to go with an input box, a button to scan and an output area.</p>
<p>This was all very easy to set up in my index.html file.</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">”stylesheet”</span> <span class="hljs-attr">href</span>=<span class="hljs-string">”index.css”</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Fake Hemingway<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Fake Hemingway<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">textarea</span> <span class="hljs-attr">name</span>=<span class="hljs-string">””</span> <span class="hljs-attr">id</span>=<span class="hljs-string">”text-area”</span> <span class="hljs-attr">rows</span>=<span class="hljs-string">”10</span>"&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">textarea</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">”format()”</span>&gt;</span>Test Me<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">”output”</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">”index.js”</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></pre>
<p>Now to start on the interesting part. Now to get the Javascript working.</p>
<p>The first thing to do was to render the text from the text box into the output area. This involves finding the input text and setting the output’s inner html to that text.</p>
<pre><code class="lang-js"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">format</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">let</span> inputArea = <span class="hljs-built_in">document</span>.getElementById(“text-area”);
    <span class="hljs-keyword">let</span> text = inputArea.value;
    <span class="hljs-keyword">let</span> outputArea = <span class="hljs-built_in">document</span>.getElementById(“output”);
    outputArea.innerHTML = text;
}
</code></pre>
<p>Next is getting the text split into paragraphs. This is accomplished by splitting the text by ‘\n’ and putting each of these into a </p><p> tag. To do this we can map over the array of paragraphs, putting them in between </p><p> tags. Using template strings makes doing this very easy.</p>
<pre><code class="lang-js"><span class="hljs-keyword">let</span> paragraphs = text.split(“\n”);
<span class="hljs-keyword">let</span> inParagraphs = paragraphs.map(<span class="hljs-function"><span class="hljs-params">paragraph</span> =&gt;</span> <span class="hljs-string">`&lt;p&gt;<span class="hljs-subst">${paragraph}</span>&lt;/p&gt;`</span>);
outputArea.innerHTML = inParagraphs.join(“ “);
</code></pre>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*Nv9Mb4gnGQZTMmYReYb1HQ.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Whilst I was working though that, I was becoming annoyed having to copy and paste the test text into the text box. To solve this, I implemented an Immediately Invoked Function Expression (IIFE) to populate the text box when the web page renders.</p>
<pre><code class="lang-js">(<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">start</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">let</span> inputArea = <span class="hljs-built_in">document</span>.getElementById(“text-area”);
    <span class="hljs-keyword">let</span> text = <span class="hljs-string">`The app highlights lengthy, …. compose something new.`</span>;
    inputArea.value = text;
})();
</code></pre>
<p>Now the text box was pre-populated with the test text whenever you load or refresh the web page. Much simpler.</p>
<h3 id="heading-highlighting">Highlighting</h3>
<p>Now that I was rendering the text well and I was testing on a consistent text, I had to work on the highlighting. The first type of highlighting I decided to tackle was the hard and very hard sentence highlighting.</p>
<p>The first stage of this is to loop over every paragraph and split them into an array of sentences. I did this using a <code>split()</code> function, splitting on every full stop with a space after it.</p>
<pre><code class="lang-js"><span class="hljs-keyword">let</span> sentences = paragraph.split(‘. ’);
</code></pre>
<p>From Heminway I knew that I needed to calculate the number of words and level of each of the sentences. The level of the sentence is dependant on the average length of words and the average words per sentence. Here is how I calculated the number of words and the total words per sentence.</p>
<pre><code class="lang-js"><span class="hljs-keyword">let</span> words = sentence.split(“ “).length;
<span class="hljs-keyword">let</span> letters = sentence.split(“ “).join(“”).length;
</code></pre>
<p>Using these numbers, I could use the equation that I found in the Hemingway app.</p>
<pre><code class="lang-js"><span class="hljs-keyword">let</span> level = <span class="hljs-built_in">Math</span>.round(<span class="hljs-number">4.71</span> * (letters / words) + <span class="hljs-number">0.5</span> * words / sentences — <span class="hljs-number">21.43</span>);
</code></pre>
<p>With the level and number of words for each of the sentences, set their difficulty level.</p>
<pre><code class="lang-js"><span class="hljs-keyword">if</span> (words &lt; <span class="hljs-number">14</span>) {
    <span class="hljs-keyword">return</span> sentence;
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (level &gt;= <span class="hljs-number">10</span> &amp;&amp; level &lt; <span class="hljs-number">14</span>) {
    <span class="hljs-keyword">return</span> <span class="hljs-string">`&lt;span class=”hardSentence”&gt;<span class="hljs-subst">${sentence}</span>&lt;/span&gt;`</span>;
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (level &gt;= <span class="hljs-number">14</span>) {
    <span class="hljs-keyword">return</span> <span class="hljs-string">`&lt;span class=”veryHardSentence”&gt;<span class="hljs-subst">${sentence}</span>&lt;/span&gt;`</span>;
} <span class="hljs-keyword">else</span> {
    <span class="hljs-keyword">return</span> sentence;
}
</code></pre>
<p>This code says that if a sentence is longer than 14 words and has a level of 10 to 14 then its hard, if its longer than 14 words and has a level of 14 or up then its very hard. I used template strings again but include a class in the span tags. This is how I’m going to define the highlighting.</p>
<p>The CSS file is really simple; it just has each of the classes (adverb, passive, hardSentence) and sets their background colour. I took the exact colours from the Hemingway app.</p>
<p>Once the sentences have been returned, I join them all together to make each of the paragraphs.</p>
<p>At this point, I realised that there were a few problems in my code.</p>
<ul>
<li>There were no full stops. When I split the paragraphs into sentences, I had removed all of the full stops.</li>
<li>The numbers of letters in the sentence included the commas, dashes, colons and semi-colons.</li>
</ul>
<p>My first solution was very primitive but it worked. I used split(‘symbol’) and join(‘’) to remove the punctuation and then appended ‘.’ onto the end. Whist it worked, I searched for a better solution. Although I don’t have much experience using regex, I knew that it would be the best solution. After some Googling I found a much more elegant solution.</p>
<pre><code class="lang-js"><span class="hljs-keyword">let</span> cleanSentence = sent.replace(<span class="hljs-regexp">/[^a-z0–9. ]/gi</span>, “”) + “.”;
</code></pre>
<p>With this done, I had a partially working product.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*aAQaw7iyax7r87qlh2i_sg.png" alt="Image" width="600" height="400" loading="lazy">
<em>Hard sentence highlighting</em></p>
<p>The next thing I decided to tackle was the adverbs. To find an adverb, Hemingway just finds words that end in ‘ly’ and then checks that it isn’t on a list of non-adverb ‘ly’ words. It would be bad if ‘apply’ or ‘Italy’ were tagged as adverbs.</p>
<p>To find these words, I took the sentences and split them into an arary of words. I mapped over this array and used an IF statement.</p>
<pre><code class="lang-js"><span class="hljs-keyword">if</span>(word.match(<span class="hljs-regexp">/ly$/</span>) &amp;&amp;, !lyWords[word] ){
    <span class="hljs-keyword">return</span> <span class="hljs-string">`&lt;span class=”adverb”&gt;<span class="hljs-subst">${word}</span>&lt;/span&gt;`</span>;
} <span class="hljs-keyword">else</span> {
    <span class="hljs-keyword">return</span> word
};
</code></pre>
<p>Whist this worked most of the time, I found a few exceptions. If a word was followed by a punctuation mark then it didn’t match ending with ‘ly’. For example, “The crocodile glided elegantly; it’s prey unaware” would have the word ‘elegantly;’ in the array. To solve this I reused the <code>.replace(/^a-z0-9. ]/gi,””)</code> functionality to clean each of the words.</p>
<p>Another exception was if the word was capitalised, which was easily solved by calling <code>toLowerCase()</code>on the string.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*iIvcSMYCHDp7Z5BhUnAogw.png" alt="Image" width="600" height="400" loading="lazy">
<em>Adverbs working</em></p>
<p>Now I had a result that worked with adverbs and highlighting individual words. I then implemented a very similar method for complex and qualifying words. That was when I realised that I was no longer just looking for individual words, I was looking for phrases. I had to change my approach from checking if each word was in the list to seeing if the sentence contained each of the phrases.</p>
<p>To do this I used the <code>.indexOf()</code> function on the sentences. If there was an index of the word or phrase, I inserted an opening span tag at that index and then the closing span tag after the key length.</p>
<pre><code class="lang-js"><span class="hljs-keyword">let</span> qualifiers = getQualifyingWords();
<span class="hljs-keyword">let</span> wordList = <span class="hljs-built_in">Object</span>.keys(qualifiers);
wordList.forEach(<span class="hljs-function"><span class="hljs-params">key</span> =&gt;</span> {
    <span class="hljs-keyword">let</span> index = sentence.toLowerCase().indexOf(key);
    <span class="hljs-keyword">if</span> (index &gt;= <span class="hljs-number">0</span>) {
    sentence =
        sentence.slice(<span class="hljs-number">0</span>, index) +
        ‘&lt;span <span class="hljs-class"><span class="hljs-keyword">class</span></span>=”qualifier”&gt;’ +
        sentence.slice(index, index + key.length) +
        “&lt;/span&gt;” +
        sentence.slice(index + key.length);
    }
});
</code></pre>
<p>With that working, it’s starting to look more and more like the Hemingway editor.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*szV4gRH35rLe0xxRSgOxZw.png" alt="Image" width="600" height="400" loading="lazy">
<em>Getting complex phrases and qualifiers working</em></p>
<p>The last piece of the highlighting puzzle to implement was the passive voice. Hemingway used a 30 line function to find all of the passive phrases. I chose to use most of the logic that Hemingway implemented, but order the process differently. They looked to find any words that were in a list (is, are, was, were, be, been, being) and then checked whether the next word ended in ‘ed’.</p>
<p>I looped though each of the words in a sentence and checked if they ended in ‘ed’. For every ‘ed’ word I found, I checked whether the previous word was in the list of pre-words. This seemed much simpler, but may be less performant.</p>
<p>With that working I had an app that highlighted everything I wanted. This is my MVP.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*pgZcfGjZGkRiyE48v-UTOQ.png" alt="Image" width="600" height="400" loading="lazy">
<em>All the highlighting working</em></p>
<h3 id="heading-then-i-hit-a-problem">Then I hit a problem</h3>
<p>As I was writing this post I realised that there were two huge bugs in my code.</p>
<pre><code class="lang-js"><span class="hljs-comment">// from getQualifier and getComplex</span>
<span class="hljs-keyword">let</span> index = sentence.toLowerCase().indexOf(key);
<span class="hljs-comment">// from getPassive</span>
<span class="hljs-keyword">let</span> index = words.indexOf(match);
</code></pre>
<p>These will only ever find the first instance of the key or match. Here is an example of the results this code will produce.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*jKeU9Dn7Yu1XZn8YHUmh6w.png" alt="Image" width="600" height="400" loading="lazy">
<em>Code with bugs in</em></p>
<p>‘Perhaps’ and ‘been marked’ should have been highlighted twice each but they aren’t.</p>
<p>To fix the bug in getQualifier and getComplex, I decided to use recursion. I created a <code>findAndSpan</code> function which uses .<code>indexOf()</code> to find the first instance of the word or phrase. It splits the sentence into 3 parts: before the phrase, the phrase, after the phrase. The recursion works by passing the ‘after the phrase’ string back into the function. This will continue until there are no more instances of the phrase, where the string will just be passed back.</p>
<pre><code class="lang-js"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">findAndSpan</span>(<span class="hljs-params">sentence, string, type</span>) </span>{
    <span class="hljs-keyword">let</span> index = sentence.toLowerCase().indexOf(key);
    <span class="hljs-keyword">if</span> (index &gt;= <span class="hljs-number">0</span>) {
        sentence =
            sentence.slice(<span class="hljs-number">0</span>, index) +
            <span class="hljs-string">`&lt;span class="<span class="hljs-subst">${type}</span>"&gt;`</span> +
            sentence.slice(index, index + key.length) +
            <span class="hljs-string">"&lt;/span&gt;"</span> +
            findAndSpan(
                sentence.slice(index + key.length), 
                key,
                type);
    }
    <span class="hljs-keyword">return</span> sentence;
}
</code></pre>
<p>Something very similar had to be done for the passive voice. The recursion was in an almost identical pattern, passing the leftover array items instead of the leftover string. The result of the recursion call was spread into an array that was then returned. Now the app can deal with repeated adverbs, qualifiers, complex phrases and passive voice uses.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*15D7mV2ycniuDJ7As5en1A.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h3 id="heading-statistics-counter">Statistics Counter</h3>
<p>The last thing that I wanted to get working was the nice line of boxes informing you on how many adverbs or complex words you’d used.</p>
<p>To store the data I created an object with keys for each of the parameters I wanted to count. I started by having this variable as a global variable but knew I would have to change that later.</p>
<p>Now I had to populate the values. This was done by incrementing the value every time it was found.</p>
<pre><code class="lang-js">data.sentences += sentence.length
or
data.adverbs += <span class="hljs-number">1</span>
</code></pre>
<p>The values needed to be reset every time the scan was run to make sure that values didn’t continuously increase.</p>
<p>With the values I needed, I had to get them rendering on the screen. I altered the structure of the html file so that the input box and output area were in a div on the left, leaving a right div for the counters. These counters are empty divs with an appropriate id and class as well as a ‘counter’ class.</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">”adverb”</span> <span class="hljs-attr">class</span>=<span class="hljs-string">”adverb</span> <span class="hljs-attr">counter</span>”&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">”passive”</span> <span class="hljs-attr">class</span>=<span class="hljs-string">”passive</span> <span class="hljs-attr">counter</span>”&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">”complex”</span> <span class="hljs-attr">class</span>=<span class="hljs-string">”complex</span> <span class="hljs-attr">counter</span>”&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">”hardSentence”</span> <span class="hljs-attr">class</span>=<span class="hljs-string">”hardSentence</span> <span class="hljs-attr">counter</span>”&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">”veryHardSentence”</span> <span class="hljs-attr">class</span>=<span class="hljs-string">”veryHardSentence</span> <span class="hljs-attr">counter</span>”&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>With these divs, I used document.querySelector to set the inner html for each of the counters using the data that had been collected. With a little bit of styling of the ‘counter’ class, the web app was complete. <a target="_blank" href="https://samwsoftware.github.io/Projects/hemingway/">Try it out here</a> or look at <a target="_blank" href="https://github.com/SamWSoftware/Projects/tree/master/hemingway">my code here.</a></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*C1uc-HKl7IAjxXYDWWIWqQ.png" alt="Image" width="600" height="400" loading="lazy">
<em>The completed app</em></p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
