<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vets Who Code</title>
    <description>The latest articles on DEV Community by Vets Who Code (@vetswhocode).</description>
    <link>https://dev.to/vetswhocode</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F858%2Fc306cb83-5ee8-4246-9e27-4aaa86ebbe41.jpg</url>
      <title>DEV Community: Vets Who Code</title>
      <link>https://dev.to/vetswhocode</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vetswhocode"/>
    <language>en</language>
    <item>
      <title>Ten Things I’ve Learned After Ten Years at Vets Who Code</title>
      <dc:creator>Jerome Hardaway</dc:creator>
      <pubDate>Mon, 03 Jun 2024 00:49:39 +0000</pubDate>
      <link>https://dev.to/vetswhocode/ten-things-ive-learned-after-ten-years-at-vets-who-code-37dp</link>
      <guid>https://dev.to/vetswhocode/ten-things-ive-learned-after-ten-years-at-vets-who-code-37dp</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://vetswhocode.io/blogs/ten-things-learned-after-10-years-at-vets-who-code" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;As I reflect on a decade of leading Vets Who Code, the journey from a 27-year-old founder to a seasoned executive director has been nothing short of extraordinary. Over the years, I have accumulated a wealth of knowledge through my own career and by helping countless veterans and military spouses transition into software engineering. Here are ten valuable lessons I've learned during this time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Document Your Journey
&lt;/h2&gt;

&lt;p&gt;One of the most powerful tools for growth is documenting your journey. Whether you're self-taught, boot camp trained, or college-educated, sharing your learning process publicly can accelerate your career. By doing so, you not only track your progress but also inspire and educate others. This transparency builds a robust community around you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pair Programming
&lt;/h2&gt;

&lt;p&gt;Engage in pair programming as much as possible. This collaborative approach accelerates your learning curve and prepares you for real-world job scenarios. The shared experience of problem-solving and code review enhances your skills and fosters a deeper understanding of coding practices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Network Early and Often
&lt;/h2&gt;

&lt;p&gt;Start networking from day one, regardless of your current expertise. Building relationships within the industry is crucial for long-term success. Attend meetups, join online communities, and stay connected with peers even after landing a job. Networking opens doors to opportunities and keeps you informed about industry trends.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Value of Mentorship
&lt;/h2&gt;

&lt;p&gt;Mentorship often outweighs formal education in today’s world of democratized learning resources. Finding a mentor who can guide you through the complexities of the tech industry can provide invaluable insights and accelerate your professional development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build Solutions, Not Just Projects
&lt;/h2&gt;

&lt;p&gt;Focus on creating solutions that address real-world problems rather than merely completing projects. This mindset shift helps you gain practical, impactful experience and demonstrates your ability to apply knowledge in meaningful ways. Solutions-oriented thinking also makes you more attractive to potential employers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Depth Over Breadth
&lt;/h2&gt;

&lt;p&gt;When starting out, it's more beneficial to dive deep into a specific area rather than spreading yourself too thin. Mastering a particular skill set or technology can make you a subject matter expert, which is more advantageous than having superficial knowledge across many topics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understand Language Ecosystems
&lt;/h2&gt;

&lt;p&gt;Delve into the ecosystems of the programming languages you use. Knowing the tools, libraries, and best practices within these ecosystems allows you to work more efficiently and solve problems more effectively. This comprehensive understanding can distinguish you from other developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cultivate Adaptability
&lt;/h2&gt;

&lt;p&gt;The tech industry is in a constant state of flux. Being adaptable is crucial to staying relevant and resilient amidst these changes. Embrace new technologies, methodologies, and perspectives to continually evolve with the industry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Commit to Continuous Learning
&lt;/h2&gt;

&lt;p&gt;Never stop learning. The rapid pace of technological advancements means there’s always something new to master. Commit to ongoing education through courses, certifications, and staying updated with the latest industry developments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Focus on Personal Growth
&lt;/h2&gt;

&lt;p&gt;Prioritize your growth by leveraging the best tools and practices within your field. Understand your strengths and weaknesses, and continually work on improving your skill set. Personal growth fuels professional success and ensures you remain at the top of your game.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;My journey with Vets Who Code has been a blend of challenges, triumphs, and continuous learning. These ten lessons encapsulate the essence of what I've discovered over the past decade. Whether you're a budding software engineer or a seasoned veteran, I hope these insights will guide and inspire you on your path to success.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Join Us in Making a Difference&lt;/strong&gt;&lt;br&gt;
If you believe in the power of coding to transform lives and want to support veterans and military spouses in their journey into tech, consider making a donation to Vets Who Code. Your contribution can help us provide the resources, mentorship, and training necessary to bridge the gap between military service and successful tech careers. &lt;a href="https://vetswhocode.io/donate" rel="noopener noreferrer"&gt;Donate Now&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Together, we can continue to empower those who have served our country to achieve their full potential in the tech industry.&lt;/p&gt;

</description>
      <category>veterans</category>
      <category>coding</category>
      <category>mentorship</category>
    </item>
    <item>
      <title>Your Post-Bootcamp Journey: A Guide to Landing Your First Developer Role</title>
      <dc:creator>Jerome Hardaway</dc:creator>
      <pubDate>Mon, 29 May 2023 21:26:13 +0000</pubDate>
      <link>https://dev.to/vetswhocode/post-bootcamp-tips-for-rookies-a77</link>
      <guid>https://dev.to/vetswhocode/post-bootcamp-tips-for-rookies-a77</guid>
      <description>&lt;h2&gt;
  
  
  Your Post-Bootcamp Journey: A Guide to Landing Your First Developer Role
&lt;/h2&gt;

&lt;p&gt;Congratulations on completing your coding bootcamp! You've already accomplished something remarkable – learning a new set of complex skills in a compressed timeframe. That's no small feat, and it demonstrates your dedication, ability to learn quickly, and passion for technology. Now it's time to build on that foundation and launch your career in tech.&lt;/p&gt;




&lt;h2&gt;
  
  
  Embracing the Journey Ahead
&lt;/h2&gt;

&lt;p&gt;One of the most exciting things about entering the tech field is that you're joining an industry built on &lt;strong&gt;continuous learning and growth&lt;/strong&gt;. The next 6-12 months will be your opportunity to transform from a bootcamp graduate into a professional developer. Think of this as your personalized apprenticeship period – a time to &lt;strong&gt;deepen your knowledge&lt;/strong&gt;, &lt;strong&gt;build your portfolio&lt;/strong&gt;, and &lt;strong&gt;connect with the tech community&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Keep Learning and Practicing
&lt;/h2&gt;

&lt;p&gt;Your bootcamp has given you a strong foundation, but technology evolves rapidly. Create a learning plan that excites you. Look at the incredible array of technologies available and choose the ones that spark your interest.  &lt;/p&gt;

&lt;p&gt;Whether it's mastering React, diving into cloud services, or exploring mobile development, &lt;strong&gt;follow your curiosity&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set up a schedule that works for you:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dedicate an hour each day for focused learning
&lt;/li&gt;
&lt;li&gt;Practice coding challenges regularly
&lt;/li&gt;
&lt;li&gt;Stay up-to-date with the latest technology trends
&lt;/li&gt;
&lt;li&gt;Choose specific areas of specialization that interest you
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Build Your Portfolio
&lt;/h2&gt;

&lt;p&gt;Your portfolio is where you get to shine. Each project is a chance to demonstrate not just your coding abilities but your unique approach to solving problems.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For each project, include:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A clear problem statement
&lt;/li&gt;
&lt;li&gt;Your solution approach
&lt;/li&gt;
&lt;li&gt;Technologies used
&lt;/li&gt;
&lt;li&gt;Live demos or screenshots
&lt;/li&gt;
&lt;li&gt;Links to the source code
&lt;/li&gt;
&lt;li&gt;Your learning process and challenges overcome
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a more detailed checklist to help you build a strong portfolio, check out this guide:&lt;br&gt;&lt;br&gt;
&lt;a href="https://vets-who-code.notion.site/Portfolio-Checklist-for-Software-Engineers-44e9b849bf6d4c5db8273993dfd748c3?pvs=4" rel="noopener noreferrer"&gt;Portfolio Checklist for Software Engineers&lt;/a&gt;  &lt;/p&gt;




&lt;h2&gt;
  
  
  Network with Other Developers
&lt;/h2&gt;

&lt;p&gt;One of the best parts about entering tech is joining an &lt;strong&gt;incredibly supportive community&lt;/strong&gt;. Developers love sharing knowledge and helping others grow.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here's how to get involved:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Attend local meetups and conferences
&lt;/li&gt;
&lt;li&gt;Join online communities and coding forums
&lt;/li&gt;
&lt;li&gt;Share what you're learning
&lt;/li&gt;
&lt;li&gt;Don't be shy about asking questions
&lt;/li&gt;
&lt;li&gt;Offer help where you can – even as a newcomer, you have valuable perspectives to share
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Contribute to Open Source Projects
&lt;/h2&gt;

&lt;p&gt;Contributing to open-source projects is an excellent way to gain &lt;strong&gt;real-world experience&lt;/strong&gt; and improve your coding skills. It demonstrates your commitment to the development community and can help you stand out to potential employers.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start with:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Finding beginner-friendly projects
&lt;/li&gt;
&lt;li&gt;Reading documentation
&lt;/li&gt;
&lt;li&gt;Fixing small bugs or improving documentation
&lt;/li&gt;
&lt;li&gt;Working on feature enhancements
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prepare for Technical Interviews
&lt;/h2&gt;

&lt;p&gt;Technical interviews are your opportunity to show potential employers &lt;strong&gt;not just what you know, but how you think&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prepare by:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Practicing common coding problems regularly
&lt;/li&gt;
&lt;li&gt;Understanding data structures and algorithms
&lt;/li&gt;
&lt;li&gt;Improving problem-solving skills
&lt;/li&gt;
&lt;li&gt;Preparing to discuss your projects in detail
&lt;/li&gt;
&lt;li&gt;Approaching challenges with curiosity rather than frustration
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tailor Your Resume and Cover Letter
&lt;/h2&gt;

&lt;p&gt;Your professional narrative matters. When crafting your application materials:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Customize&lt;/strong&gt; for each role
&lt;/li&gt;
&lt;li&gt;Highlight &lt;strong&gt;relevant skills and experiences&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Focus on specific accomplishments
&lt;/li&gt;
&lt;li&gt;Include &lt;strong&gt;metrics&lt;/strong&gt; where possible
&lt;/li&gt;
&lt;li&gt;Proofread thoroughly
&lt;/li&gt;
&lt;li&gt;Showcase your &lt;strong&gt;passion for technology&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Maintain Balance and Stay Positive
&lt;/h2&gt;

&lt;p&gt;The job search process can be challenging, but maintaining perspective is crucial:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Celebrate &lt;strong&gt;small wins and progress&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Make time for activities &lt;strong&gt;outside coding&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Stay connected with your &lt;strong&gt;bootcamp cohort&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Keep refining your approach based on feedback
&lt;/li&gt;
&lt;li&gt;Remember that &lt;strong&gt;every developer started where you are&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Don't Be Afraid to Ask for Help
&lt;/h2&gt;

&lt;p&gt;The tech community values &lt;strong&gt;collaboration and mutual support&lt;/strong&gt;. When you need assistance:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reach out to bootcamp instructors and classmates
&lt;/li&gt;
&lt;li&gt;Engage with online communities
&lt;/li&gt;
&lt;li&gt;Join developer forums
&lt;/li&gt;
&lt;li&gt;Share your learning journey
&lt;/li&gt;
&lt;li&gt;Offer help to others when you can
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Remember&lt;/strong&gt;, every successful developer started exactly where you are now. Your bootcamp graduation isn't the end—it's the beginning of an exciting journey in tech. The tech industry needs people like you – individuals who are eager to learn, ready to tackle challenges, and passionate about creating solutions through code.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stay curious, keep coding, and trust in your ability to grow&lt;/strong&gt;. With dedication and persistence, you'll build the programming career you've envisioned.  &lt;/p&gt;




&lt;h3&gt;
  
  
  Ready to take the next step in your journey?
&lt;/h3&gt;

&lt;p&gt;Choose &lt;strong&gt;one action&lt;/strong&gt; from this guide and get started today. Your future in tech is waiting!&lt;/p&gt;

</description>
      <category>career</category>
      <category>coding</category>
      <category>bootcamp</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Why I Created a Portfolio Checklist for JavaScript Engineers</title>
      <dc:creator>Jerome Hardaway</dc:creator>
      <pubDate>Wed, 03 May 2023 03:23:46 +0000</pubDate>
      <link>https://dev.to/vetswhocode/why-i-created-a-portfolio-checklist-for-javascript-engineers-3o91</link>
      <guid>https://dev.to/vetswhocode/why-i-created-a-portfolio-checklist-for-javascript-engineers-3o91</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;As someone who has been in the tech industry for a while, I have noticed that many students and new professionals struggle with creating a portfolio that showcases their skills and experience. I have often been approached by students who have questions about how to create a portfolio that stands out and gets noticed by potential employers. This is why I decided to create a portfolio checklist that focuses on the most frequently asked questions that students ask me. My goal was to help newer students ask better questions and get better results.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Importance of a Portfolio
&lt;/h2&gt;

&lt;p&gt;In the tech industry, a portfolio is crucial for showcasing your skills and experience to potential employers. It's your chance to show what you can do and what you have accomplished. However, many students struggle with creating a portfolio that stands out and accurately represents their skills. With my portfolio checklist, I aim to guide students through the process of creating a portfolio that accurately represents their skills and experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Most Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;When creating the portfolio checklist, I focused on the most frequently asked questions that I have received from students. These questions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What should I include in my portfolio?&lt;/li&gt;
&lt;li&gt;How do I showcase my skills?&lt;/li&gt;
&lt;li&gt;How do I choose the right projects to showcase?&lt;/li&gt;
&lt;li&gt;How do I make my portfolio stand out?&lt;/li&gt;
&lt;li&gt;What do I need on my portfolio that I might not think of?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope to help students create portfolios that accurately represent their skills and experience by addressing these questions and providing detailed answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Creating a portfolio can be a daunting task, especially for students and new professionals. However, with the right guidance and resources, it can be a great opportunity to showcase your skills and experience to potential employers. By creating a portfolio checklist that focuses on the most frequently asked questions, I hope to guide newer students through the process of creating a portfolio that accurately represents their skills and experience. I encourage all students and new professionals to check out my portfolio checklist and use it as a guide to creating their own successful portfolios.&lt;/p&gt;

&lt;p&gt;Check out my portfolio checklist for JavaScript Engineers &lt;a href="https://www.notion.so/Portfolio-Checklist-for-Javascript-Engineers-44e9b849bf6d4c5db8273993dfd748c3" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Dev Grind is Real</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Tue, 02 May 2023 19:56:00 +0000</pubDate>
      <link>https://dev.to/vetswhocode/the-dev-grind-is-real-2na</link>
      <guid>https://dev.to/vetswhocode/the-dev-grind-is-real-2na</guid>
      <description>&lt;p&gt;I'm a social media junky and there are all these dev lifestyle accounts. A lot of them put on this fake veneer of happiness and ease about work. But, that's not been my experience. &lt;/p&gt;

&lt;p&gt;I wanted to make this post because this peachy perspective is actually detrimental to those joining the industry. I got boot camp students who are afraid to push incomplete git commits because they don't have a shiny veneer. They're afraid to share their authentic selves even though that's the most valuable thing they have.&lt;/p&gt;

&lt;p&gt;We should normalize how hard development is. That's why I'm a huge fan of the &lt;a href="https://twitter.com/gitlost"&gt;Developers Swearing Twitter account&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--soRvyRkz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ovbnaw2h5kvqkw1jtcw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--soRvyRkz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ovbnaw2h5kvqkw1jtcw.png" alt="Developers Swearing Twitter account" width="593" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It normalizes that we're out here struggling and it ain't all peaches and rainbows. Sometimes development is banging your head against a wall a whole bunch and then asking for help and it finally clicks. This is normal and in fact healthy. &lt;/p&gt;

&lt;p&gt;Here's me troubleshooting build issues&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qU-iyZ3d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vvt0y39rzj2qtmzshb3a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qU-iyZ3d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vvt0y39rzj2qtmzshb3a.png" alt="A list of build issues on September 2nd" width="720" height="710"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What a great green box on my git chart&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r3t50Aq6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yq01egbxsy4xzfkeh8nu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r3t50Aq6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yq01egbxsy4xzfkeh8nu.png" alt="Github contribution chart with 36 commits on September 2nd" width="720" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can tell that the day of September 2nd was not fun. &lt;/p&gt;

&lt;p&gt;In the end, troubleshooting doesn't mean you're a bad developer. I propose the opposite in fact, because once you get out on the other side usually that knowledge won't go to waste. It's okay to bet on yourself and not always be perfect.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>devlive</category>
    </item>
    <item>
      <title>Why Vets Who Code is Becoming an AI-Powered Nonprofit</title>
      <dc:creator>Jerome Hardaway</dc:creator>
      <pubDate>Tue, 04 Apr 2023 19:40:29 +0000</pubDate>
      <link>https://dev.to/vetswhocode/why-vets-who-code-is-becoming-an-ai-powered-nonprofit-3c3g</link>
      <guid>https://dev.to/vetswhocode/why-vets-who-code-is-becoming-an-ai-powered-nonprofit-3c3g</guid>
      <description>&lt;p&gt;Recently, we announced that we are becoming an AI-powered nonprofit. Our organization incorporates AI technologies into its programs and operations to enhance its impact and better serve our community.&lt;br&gt;
So, why is VWC becoming an AI-powered nonprofit? There are several reasons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Improving Training Programs
&lt;/h2&gt;

&lt;p&gt;First, AI can help the organization improve its training programs. By analyzing data on how veterans learn and progress through the program, VWC can better tailor its curriculum to meet their needs. This can help veterans complete the program more efficiently and tremendously successfully.&lt;br&gt;
For example, by analyzing the performance data of troops while leveraging the GitHub API, we can identify their strengths and weaknesses, which can be used to develop personalized learning plans that meet their individual needs. Additionally, we can use AI to analyze industry trends and identify the most in-demand skills in the tech industry. This information can be used to update the training curriculum to ensure veterans have the skills employers seek.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tracking Outcomes
&lt;/h2&gt;

&lt;p&gt;Second, AI can help us better track the progress and outcomes of its participants. By analyzing data on job placements, salaries, and other metrics, we can better understand the impact of its programs and make adjustments to improve them. This can help the organization demonstrate the effectiveness of its programs to donors and other stakeholders. In our goal to start serving 2500 veterans and military spouses a year, this will be very important to our scaling.&lt;br&gt;
For example, we can use AI to analyze data on job placements and salaries of its participants. By doing so, we can identify the most successful job placement strategies and adjust its training programs accordingly. Additionally, we can use AI to analyze data on the impact of its training programs on the participants' lives. This information can be used to develop data-driven stories demonstrating our programs' effectiveness to donors and other stakeholders.&lt;/p&gt;

&lt;h2&gt;
  
  
  Streamlining Operations
&lt;/h2&gt;

&lt;p&gt;Finally, AI can help us streamline our operations efforts. As a lean organization with only one contractor, with both directors being volunteers, this frees up our time and resources to focus on more strategic initiatives by automating specific tasks, such as veteran outreach and grant applications.&lt;/p&gt;

&lt;p&gt;In conclusion, our decision to become an AI-powered nonprofit is an intelligent move to help the organization enhance its impact and better serve our community. By leveraging AI technologies, we can improve our training programs, track outcomes more effectively, and streamline operations. We will be using AI to drive positive change and make a difference.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Guide to Accessibility Advocacy</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Thu, 23 Mar 2023 16:39:25 +0000</pubDate>
      <link>https://dev.to/vetswhocode/guide-to-accessibility-advocacy-3ddb</link>
      <guid>https://dev.to/vetswhocode/guide-to-accessibility-advocacy-3ddb</guid>
      <description>&lt;p&gt;You work at a company and some pages of the website aren't addressing accessibility concerns. You don't own those pages, but would like to advocate for accessibility at your company. Here's a guide on how to advocate for accessibility at your company.&lt;/p&gt;

&lt;h2&gt;
  
  
  Legal exposure
&lt;/h2&gt;

&lt;p&gt;Digital accessibility is a legal requirement as put forth by the Americans with Disabilities Act (ADA).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In February [2023], 181 lawsuits were filed. 86% were filed in New York; MARS KHAIMOV LAW, PLLC filed 47 lawsuits in New York; 7 Plaintiffs filed 44% of lawsuits; and 17% of the litigated websites used overlay tools.&lt;br&gt;
~ &lt;a href="https://www.accessibility.com/digital-lawsuits"&gt;https://www.accessibility.com/digital-lawsuits&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's important that companies take accessibility issues seriously because users do. Accessibility is not a nice to have it is a legal requirement like GDPR and privacy compliance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build reports
&lt;/h2&gt;

&lt;p&gt;Create a metric that teams can use to move a needle and prove progress. You could use &lt;a href="https://developer.chrome.com/docs/lighthouse/overview/"&gt;Lighthouse&lt;/a&gt; to help you accessibility audit single pages. If you need to do something more at scale and can code you could build an &lt;a href="https://www.npmjs.com/package/accessibility-checker"&gt;accessibility checker&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Path to Success
&lt;/h2&gt;

&lt;p&gt;Once an organization is convinced to make the investment here are some resources to help build on that success and scope work.&lt;br&gt;
&lt;a href="https://www.ibm.com/able/toolkit"&gt;IBM Equal Access Toolkit&lt;/a&gt; will help you to plan, design, develop, verify, and launch accessible digital products. There is also the &lt;a href="https://www.a11yproject.com/"&gt;A11y Project&lt;/a&gt; who also build accessibility tooling and resources.&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Documentation is Agile</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Thu, 23 Mar 2023 15:56:19 +0000</pubDate>
      <link>https://dev.to/vetswhocode/documentation-isnt-anti-agile-2hbm</link>
      <guid>https://dev.to/vetswhocode/documentation-isnt-anti-agile-2hbm</guid>
      <description>&lt;p&gt;A question came across the Vets Who Code community where they asked about "where does documentation come in the dev process?" They further explained that folks on their team believe that documentation is "anti-agile" and boy I have opinions. &lt;/p&gt;

&lt;h2&gt;
  
  
  Where does Documentation come into the Dev Process
&lt;/h2&gt;

&lt;p&gt;Different forms of documentation fall into different stages of the dev process for me. Though I probably have a looser definition of what documentation is than some. This is just my ideal workflow&lt;/p&gt;

&lt;h3&gt;
  
  
  Ticket
&lt;/h3&gt;

&lt;p&gt;I think a general ticket should be started by someone who's not going to take on the work. This is the requirement for building of a system. It's a piece of documentation that will tell you who the owner is.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design
&lt;/h3&gt;

&lt;p&gt;Depending on complexity of that ticket you may need to get multiple eyes on mapping out a solution. This piece of documentation can be a motivating factor to get everyone's goals aligned and get general expectations of the products.&lt;/p&gt;

&lt;h3&gt;
  
  
  Epic/User Stories
&lt;/h3&gt;

&lt;p&gt;Again depending on complexity build out general technical user stories that folks should be able to pick up and with the context of the design should be able to execute on (it's okay if there are questions).&lt;/p&gt;

&lt;h3&gt;
  
  
  Tasks/sub-tasks/User Stories
&lt;/h3&gt;

&lt;p&gt;I'll document all the work that I'm doing (pretty much my standup updates) get turned into sub tasks or comments on my user story. This way, if folks aren't paying attention in standup, which I found often is the case they can check progress via tickets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code comments
&lt;/h3&gt;

&lt;p&gt;I think if something doesn't fit the general pattern comment it. If there are side effects that could possibly be unexpected, comment it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Function/Variable naming
&lt;/h3&gt;

&lt;p&gt;Make them explicit, it's a form of documentation&lt;/p&gt;

&lt;h3&gt;
  
  
  PR Reviews
&lt;/h3&gt;

&lt;p&gt;Are a type of documentation. When using Git Blame you can find the PR that the piece of code comes from. I've gone back to those PRs to find out the point of the feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  Confluence/Wikis
&lt;/h3&gt;

&lt;p&gt;Document workflows and full features that folks need to know about to be able to complete certain tasks. These are guides that can be shareable between teams. They're good for onboarding. They also reduce fragility of a team, so folks can feel like they can take time off.&lt;/p&gt;

&lt;h3&gt;
  
  
  API Docs
&lt;/h3&gt;

&lt;p&gt;If you're building an API that's meant to be consumed by anyone, please set these up for the love of Bob.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anti-Agile Sentiment
&lt;/h2&gt;

&lt;p&gt;I've heard this anti-agile sentiment before. The challenge here is that they're possibly mis-using the concept.&lt;br&gt;
They could be saying that it's anti-agile because it could feel like waterfall. I've had push back when I do design docs because folks believe that's waterfall. It could be a waterfall practice if it was meant to be a source of truth as opposed to a general plan.&lt;br&gt;
The second reason I've heard folks misuse the "anti-agile" concept is that they believe docs slow teams down. I disagree with the concept that agile means fast. I've always interpreted it as agile means flexible.&lt;br&gt;
In the end though when it comes to documentation I have yet to see a verbal argument win. What I do is document as much as possible. You create the trail of breadcrumbs and people find it and are grateful. Sometimes I'll get told that I'm special and like to document. But honestly if you just have it as a part of your workflow folks eventually join, because you're providing value and people will see it.&lt;br&gt;
Warning it may get frustrating because you're the only one doing it. Or maybe folks will tell you to stop. In any case, documentation is good for you and will help you grow irregardless. A team agreement doesn't have to block you from providing value.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>agile</category>
      <category>community</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Why basic programming is a pre-req for VetsWhoCode</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Wed, 01 Feb 2023 22:49:52 +0000</pubDate>
      <link>https://dev.to/vetswhocode/why-basic-programming-is-a-pre-req-for-vetswhocode-5dh4</link>
      <guid>https://dev.to/vetswhocode/why-basic-programming-is-a-pre-req-for-vetswhocode-5dh4</guid>
      <description>&lt;p&gt;This &lt;a href="https://livecode.byu.edu/programmingconcepts/ControlStruct.php"&gt;BYU article&lt;/a&gt; shows that there are three basic programming concepts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sequence of commands&lt;/strong&gt; (The right commands in the right order)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditional Structures&lt;/strong&gt; (Do certain things based on a true or false, yes or no decision)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Looping structures&lt;/strong&gt; (A list of instructions to do more than once)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;They further explain the programming strategies of &lt;strong&gt;top-down design&lt;/strong&gt; and &lt;strong&gt;pseudo code&lt;/strong&gt;. These concepts are required to understand to begin a journey of programming. &lt;/p&gt;

&lt;p&gt;Basic programming courses can be found all over the internet for free (W3 Schools, Odin Project, Free Code Camp, Net Ninja, etc...). Vets Who Code could create their own basic programming course. By having that knowledge as a part of the pre-work we can assume several characteristics of our candidates. These applicants will have demonstrated the ability to find information on the internet and translate it into runnable code. Furthermore, this is prerequisite knowledge for teaching javascript syntax. We have run into instructors teaching "here's how to loop in Javascript" and students going "okay". Then when they go to enact a loop, they don't understand what the point of it is resulting in their projects not incorporating those concepts. It has led to quite a bit of confusion.&lt;/p&gt;

&lt;p&gt;We hope that with this format of the pre-work, we'll be able to have clearer goals when it comes to programming in the boot camp.&lt;/p&gt;

</description>
      <category>beginners</category>
    </item>
    <item>
      <title>Vets Who Code Pre-Work</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Wed, 01 Feb 2023 22:49:23 +0000</pubDate>
      <link>https://dev.to/vetswhocode/vets-who-code-pre-work-1gld</link>
      <guid>https://dev.to/vetswhocode/vets-who-code-pre-work-1gld</guid>
      <description>&lt;h2&gt;
  
  
  Web Development with Javascript
&lt;/h2&gt;

&lt;p&gt;Welcome to the official Vets Who Code Prework.&lt;br&gt;
This document outlines background work that the troop must complete before starting the course. The prework covers the basics so we can focus on more complex subjects. This means we only teach troops the basics of programming once accepted. Here's an article on our thoughts on why we've set this bar. Completing the prework allows us to focus on introducing troops to programming as a job. Troops will work as if they already have a job by solving the types of problems you would focus on in a team environment instead of working on assignments focused on complete isolation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is basic programming a prereq at Vets Who Code?
&lt;/h3&gt;

&lt;p&gt;Programming is a lot like baking. It's easy to make a cake, but it's also not easy to make a good one. A programmer needs to understand three concepts:&lt;/p&gt;

&lt;p&gt;A sequence of commands (The proper commands in the correct order)&lt;/p&gt;

&lt;p&gt;Conditional structures (Do certain things based on a true or false, yes or no decision)&lt;/p&gt;

&lt;p&gt;Looping structures (A list of instructions to do more than once)&lt;/p&gt;

&lt;p&gt;By having that knowledge as a part of the prework, we can assume several characteristics of our candidates. These applicants will have demonstrated the ability to find and translate information on the internet into runnable code.&lt;/p&gt;

&lt;p&gt;They have also proven their ability to manage time effectively and meet deadlines. This is important because we will ask our candidates to work in teams and submit work promptly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proof of work
&lt;/h2&gt;

&lt;p&gt;The central traits we look for in students are technical problem-solving, consistency, and grit. To demonstrate that we'd like students to demonstrate their understanding of programming basics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variable assignment&lt;/li&gt;
&lt;li&gt;Basic Math operations&lt;/li&gt;
&lt;li&gt;Strings&lt;/li&gt;
&lt;li&gt;Conditional logic&lt;/li&gt;
&lt;li&gt;Loops&lt;/li&gt;
&lt;li&gt;Functions&lt;/li&gt;
&lt;li&gt;Arrays&lt;/li&gt;
&lt;li&gt;String/Array methods&lt;/li&gt;
&lt;li&gt;Objects (properties/methods)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Programming Basic Submission Formats
&lt;/h4&gt;

&lt;p&gt;Use any one of the below formats to get something that you can prove your understanding of the above programming basics.&lt;/p&gt;

&lt;p&gt;Running Code&lt;br&gt;
You can upload your code to one of these services and have it run. There will be a shareable URL that you can use to reference this code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://repl.it" rel="noopener noreferrer"&gt;repl.it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Code in a &lt;a href="https://codepen.io" rel="noopener noreferrer"&gt;codepen&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/codespaces" rel="noopener noreferrer"&gt;Github codespaces&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Code Repository
&lt;/h5&gt;

&lt;p&gt;If you know a programming language that isn't easy to run then you can use a &lt;a href="https://www.quora.com/What-is-a-code-repository-used-for" rel="noopener noreferrer"&gt;code repository&lt;/a&gt;. However, please have a detailed README.md document explaining how the code is run and maybe screenshots of what it looks like when it is run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Work Submission Format
&lt;/h3&gt;

&lt;p&gt;In the Prework text box on the course application form, submit a link to a deployed &lt;a href="https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site" rel="noopener noreferrer"&gt;Github Pages&lt;/a&gt; website that has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A link to the &lt;a href="https://docs.github.com/en/repositories" rel="noopener noreferrer"&gt;Github Repository&lt;/a&gt; holding the website code&lt;/li&gt;
&lt;li&gt;A link or image showing the proof of work demonstrating understanding of Programming Basics
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Shaye Howe's &lt;a href="https://learn.shayhowe.com/html-css/getting-to-know-html/" rel="noopener noreferrer"&gt;Getting to Know HTML&lt;/a&gt; explains how to build a web page.&lt;/li&gt;
&lt;li&gt;The Odin Project's &lt;a href="https://www.theodinproject.com/paths/foundations/courses/foundations#javascript-basics" rel="noopener noreferrer"&gt;Javascript Basics&lt;/a&gt; course up until &lt;a href="https://www.theodinproject.com/lessons/foundations-fundamentals-part-4" rel="noopener noreferrer"&gt;Fundamentals Part 4&lt;/a&gt; covers all the programming topics needed for proof of work.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>gaming</category>
      <category>development</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Daily message Slack bot</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Tue, 31 Jan 2023 17:07:31 +0000</pubDate>
      <link>https://dev.to/vetswhocode/daily-message-slack-bot-ne6</link>
      <guid>https://dev.to/vetswhocode/daily-message-slack-bot-ne6</guid>
      <description>&lt;p&gt;I built a bot that posts for daily code challenges in a VetsWhoCode (VWC) Slack channel.&lt;/p&gt;

&lt;p&gt;The first iteration of it was using &lt;a href="https://slack.com/features/workflow-automation" rel="noopener noreferrer"&gt;Slack's workflow builder&lt;/a&gt;. I just made a slew of scheduled messages. Each message was a different day. So, when all the messages were posted, I needed to go back in and reschedule with what the new date was. After doing this a few times I felt like it was time for a change.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh4i7z0vymw8v3wpkgkzy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh4i7z0vymw8v3wpkgkzy.png" alt="Image description" width="540" height="950"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next iteration is a super simple Node.js AWS Lambda connected to a daily event bridge trigger. The Lambda sends an authenticated POST request to our Slack app's web hook.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdns4wdc0vwwm3ors4cfo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdns4wdc0vwwm3ors4cfo.png" alt="Image description" width="630" height="175"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The code reads a markdown file of code challenges delimited by &lt;code&gt;---&lt;/code&gt;. It then divides the number of days in a year by the challenge array length. That way it will post a challenge every day.&lt;/p&gt;

&lt;p&gt;Future work that could be done with it is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build a Challenge explorer/editor&lt;/li&gt;
&lt;li&gt;Update the bot so it could work in multiple channels so you can have different kinds of languages&lt;/li&gt;
&lt;li&gt;Setup Continuous Deployment. I currently just log in to the AWS account and manually update the challenges/code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the end, it's as simple as I could think to make it. I like to build that way, with room to expand. &lt;/p&gt;

</description>
      <category>crypto</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>offers</category>
    </item>
    <item>
      <title>Before joining a boot camp program, start here</title>
      <dc:creator>Schuster Braun</dc:creator>
      <pubDate>Tue, 10 Jan 2023 17:28:02 +0000</pubDate>
      <link>https://dev.to/vetswhocode/before-joining-a-boot-camp-program-start-here-2olp</link>
      <guid>https://dev.to/vetswhocode/before-joining-a-boot-camp-program-start-here-2olp</guid>
      <description>&lt;p&gt;I work at &lt;a href="https://vetswhocode.io"&gt;Vets Who Code&lt;/a&gt; a programming bootcamp nonprofit and we get a number of folks who reach out and ask whether they would be a good fit for the course and what are some of the prerequisites. I would say that the prerequisite for any code boot camp is going to be a budding passion for coding. Boot camps are fast paced and teach programming syntax and job specific tools. Boot camps are good at teaching how to do loops in a programming language. However, students should know what the point of loops are and how they can be helpful.&lt;/p&gt;

&lt;p&gt;There's a spectrum of skill that folks come to a boot camp with. On one side of the spectrum there are folks who want to get into tech, but have never done anything considered tech related before. On the other side of the spectrum are folks who have taken other courses and other boot camps with all the knowledge seeking the network and career services of the boot camp. Along that spectrum there are folks who've played video games, created myspace pages, built their own online stores etc.&lt;/p&gt;

&lt;p&gt;The approach of this guide is to list a number of resources and what I find their usefulness is to help determine a learning path to prepare for a boot camp, university, or self learning journey.&lt;/p&gt;

&lt;h2&gt;
  
  
  Websites
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Free Learning platforms
&lt;/h2&gt;

&lt;p&gt;There are a number of free learning platforms to teach development. I think they're great at programming, but I feel they don't get students to a place where they're confident enough to start applying for jobs. I recommend students go through one of these curriculums to learn the basics of at least one programming language.&lt;/p&gt;

&lt;p&gt;A few that I like.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://launchschool.com/books"&gt;Launch School Books&lt;/a&gt; (CLI, Git, Ruby, JS)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.freecodecamp.org/"&gt;Free code camp&lt;/a&gt; (Javascript)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.theodinproject.com/"&gt;The Odin Project&lt;/a&gt; (Ruby/Javascript)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What is Code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TU5_scVI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/235f7khysb49de2h8dni.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TU5_scVI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/235f7khysb49de2h8dni.png" alt="Image description" width="880" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best for: Intro to coding as a career&lt;/li&gt;
&lt;li&gt;Link: &lt;a href="https://www.bloomberg.com/graphics/2015-paul-ford-what-is-code/"&gt;What is Code by Paul Ford&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Description: A single story devoted to ­demystifying code and the culture of the people who make it. &lt;em&gt;~Josh Tyrangiel&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Roadmap
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Exur3pvJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/douvpfjml4lsjzjh5uka.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Exur3pvJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/douvpfjml4lsjzjh5uka.png" alt="Image description" width="880" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best for: Planning out learning tools/skills&lt;/li&gt;
&lt;li&gt;Link: &lt;a href="https://roadmap.sh/"&gt;roadmap.sh&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Description: List of road maps that outlines the tools/skills to become a developer in a specific field&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Video Games
&lt;/h2&gt;

&lt;p&gt;Students who enjoy programming have a distinct advantage to succeeding in a programming learning journey. If you have the ability to play video games. I highly recommend checking these out to help along your programming journey.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code Combat
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ccJgWIe9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gkq1ajxmbbcssqno7098.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ccJgWIe9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gkq1ajxmbbcssqno7098.png" alt="Image description" width="647" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best for: Learning how to code&lt;/li&gt;
&lt;li&gt;Link: &lt;a href="https://codecombat.com/"&gt;CodeCombat.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Description: Teaches programming concepts in the context of Javascript or Python programming languages.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Factorio
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NhgQZw0F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/70ax6w9ush7nqaxur75t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NhgQZw0F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/70ax6w9ush7nqaxur75t.png" alt="Image description" width="520" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best for: How to think like a programmer&lt;/li&gt;
&lt;li&gt;Link: &lt;a href="https://www.factorio.com/"&gt;factorio.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Description: A game in which you build and maintain factories.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Else Heart.Break()
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SYY26Ge2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dniiqe0180rpujfnh18f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SYY26Ge2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dniiqe0180rpujfnh18f.png" alt="Image description" width="616" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best for: Basic to intermediate coding&lt;/li&gt;
&lt;li&gt;Link: &lt;a href="http://elseheartbreak.com/"&gt;elseheartbreak.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Description: An actually fun video game that has a story and creates a fake programming language gives the player the ability to change the world around them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Screeps
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jVF9OZ_i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ucnd8okbb9dri37shpef.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jVF9OZ_i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ucnd8okbb9dri37shpef.png" alt="Image description" width="616" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best for: Intermediate to advanced coding&lt;/li&gt;
&lt;li&gt;Link: &lt;a href="https://screeps.com/"&gt;screeps.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Description: It's an open-source game for programmers, wherein the core mechanic is programming
your units' AI. You control your colony by writing JavaScript.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>codenewbie</category>
      <category>community</category>
    </item>
    <item>
      <title>Concurrency in Golang with a Binary Search Problem</title>
      <dc:creator>Phil Tenteromano</dc:creator>
      <pubDate>Fri, 24 Jun 2022 18:04:52 +0000</pubDate>
      <link>https://dev.to/vetswhocode/concurrency-in-golang-with-a-binary-search-problem-2j5b</link>
      <guid>https://dev.to/vetswhocode/concurrency-in-golang-with-a-binary-search-problem-2j5b</guid>
      <description>&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;Solving problems with Go can be a really fun and rewarding experience. In this post, I'll go through a "medium" Leetcode challenge "&lt;a href="https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/" rel="noopener noreferrer"&gt;Find First and Last Position of Element in Sorted Array&lt;/a&gt;".&lt;/p&gt;

&lt;p&gt;The problem is fairly straight forward - it's a sorted array, so we know we can use Binary Search. However, the array is non-decreasing, meaning that elements are allowed to repeat. We're given the task to return a size-2 array with the start and ending index of where the targeted element exists in the array. &lt;/p&gt;

&lt;p&gt;Here is the prompt: &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fciex87mmnaky273d4bmk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fciex87mmnaky273d4bmk.png" alt="Leetcode prompt for Find First and Last Position of Element in Sorted Array" width="735" height="383"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Solution Steps
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Try to think of a mental solution for yourself before reading any further.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ignoring the trivial linear solution, we'll focus on the Binary Search solution. Let's think of the steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Binary Search for the &lt;code&gt;target&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Split the array into "lower" and "upper"&lt;/li&gt;
&lt;li&gt;Binary Search on both, separately&lt;/li&gt;
&lt;li&gt;Repeat until both splits no longer find the target&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pretty straight forward, I had a lot of fun solving it with Go - most of the syntax is similar to other languages. One of Go's most important features is how simple it makes Concurrency and multi-threading. It uses a data type called &lt;a href="https://gobyexample.com/channels" rel="noopener noreferrer"&gt;Channels&lt;/a&gt; with its native &lt;a href="https://gobyexample.com/goroutines" rel="noopener noreferrer"&gt;Goroutine&lt;/a&gt; to synchronize data across threads. Think of it as &lt;code&gt;async / await&lt;/code&gt; in other languages.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;We'll make a simple Binary Search method, with runtime of &lt;code&gt;O(log n)&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// BinarySearch method&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;findTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;low&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;low&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;low&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;low&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We'll call this method a few times, but on ever-decreasing slices of the array - we'll never call it with the same memory space twice.&lt;/p&gt;

&lt;p&gt;Now we can easily find any initial target:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;searchRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Initial Search&lt;/span&gt;
    &lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;findTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Didn't find it, return early&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c"&gt;// TODO: finish function&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we have the early return, when the &lt;code&gt;target&lt;/code&gt; does not exist at all. But now what happens when we find it? Well we need to search up and down the array. We can of course do this linearly, but think about the worst case: what if theres an array of 10 million elements, all &lt;code&gt;target&lt;/code&gt;. If we started with the center - now we have to linearly crawl through 5 million elements up and down the array. Not great!&lt;/p&gt;

&lt;p&gt;Because of that, we'll stick with Binary Search. Golang allows us to cut up its &lt;code&gt;slice&lt;/code&gt; datatype (slices are pretty much arrays, with a lot more flexibility, read more &lt;a href="https://gobyexample.com/slices" rel="noopener noreferrer"&gt;here&lt;/a&gt;). Without using concurrency, here's the rest of the method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;searchRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c"&gt;// ...&lt;/span&gt;

&lt;span class="c"&gt;// Found target, lets search left and right&lt;/span&gt;
    &lt;span class="n"&gt;low&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;high&lt;/span&gt;

    &lt;span class="c"&gt;// Search lower half of array&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;findTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;low&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;low&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Search upper half of array&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;        
        &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;findTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="c"&gt;// temp is reindexed at 0 - account for that&lt;/span&gt;
        &lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;low&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;high&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pretty straight forward, we're just binary searching until we no longer find the element on each slice. Great! This passes on Leetcode, and we can be done. But how can we make this a little better? A primary bottleneck with this code is the fact that the "Upper" search is completely blocked until the "Lower" search completes. &lt;/p&gt;

&lt;p&gt;We have an opportunity here - the two for loops are acting on completely separate memory addresses. Let's see what we can do with &lt;code&gt;Goroutines&lt;/code&gt; and a &lt;code&gt;Channel&lt;/code&gt;, here's the entire completed function, with added concurrency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;searchRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Initial Search&lt;/span&gt;
    &lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;findTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Didn't find it, return early&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Hold our data from the threads&lt;/span&gt;
    &lt;span class="n"&gt;bounds&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Search lower half of array, in its own thread (goroutine)&lt;/span&gt;
    &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;low&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;findTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;low&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;low&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; 
        &lt;span class="c"&gt;// Shovel the lower-bound into the Channel&lt;/span&gt;
        &lt;span class="n"&gt;bounds&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;low&lt;/span&gt;
    &lt;span class="p"&gt;}(&lt;/span&gt;&lt;span class="n"&gt;high&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Search upper half of array, in its own thread (goroutine)&lt;/span&gt;
    &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;findTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="c"&gt;// Shovel the upper-bound into the Channel&lt;/span&gt;
        &lt;span class="n"&gt;bounds&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;high&lt;/span&gt;
    &lt;span class="p"&gt;}(&lt;/span&gt;&lt;span class="n"&gt;high&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;newLow&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;bounds&lt;/span&gt;
    &lt;span class="n"&gt;newHigh&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;bounds&lt;/span&gt;

    &lt;span class="c"&gt;// No garauntee which one finishes first, so order them&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;newLow&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;newHigh&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;newLow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newHigh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newHigh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newLow&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;newLow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newHigh&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we create an anonymous function and call it immediately, but we use the &lt;code&gt;go&lt;/code&gt; keyword to run a Goroutine. With the scope of the &lt;code&gt;bounds&lt;/code&gt; Channel, we can shovel data in and out of it. When pulling data out of the Channel (&lt;code&gt;&amp;lt;-bounds&lt;/code&gt;), Go will block until there is actually data there.&lt;/p&gt;

&lt;p&gt;This means that both the "lower" and "upper" slices will be processed simultaneously! Congratulations, you just solved a Leetcode challenge using thread-safe concurrency💪🧵!&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow up
&lt;/h2&gt;

&lt;p&gt;We can also clean this code up a bit by pulling the functions for "lower" and "upper" out into their own methods. This would make the primary &lt;code&gt;searchRange&lt;/code&gt; method a bit cleaner. But for the sake of simplicity, I left them in.&lt;/p&gt;

</description>
      <category>go</category>
      <category>algorithms</category>
      <category>concurrency</category>
      <category>leetcode</category>
    </item>
  </channel>
</rss>
