<?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>Forem: Yeti</title>
    <description>The latest articles on Forem by Yeti (@yetillc).</description>
    <link>https://forem.com/yetillc</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%2Fuser%2Fprofile_image%2F1236233%2F00704bb3-cd8b-4d60-9567-f80386ed7a7a.png</url>
      <title>Forem: Yeti</title>
      <link>https://forem.com/yetillc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/yetillc"/>
    <language>en</language>
    <item>
      <title>Crafting Adaptive UX Across Diverse Devices: Strategies for IoT Software Development</title>
      <dc:creator>Yeti</dc:creator>
      <pubDate>Fri, 26 Jul 2024 20:32:52 +0000</pubDate>
      <link>https://forem.com/yetillc/crafting-adaptive-ux-across-diverse-devices-strategies-for-iot-software-development-3hmf</link>
      <guid>https://forem.com/yetillc/crafting-adaptive-ux-across-diverse-devices-strategies-for-iot-software-development-3hmf</guid>
      <description>&lt;p&gt;&lt;strong&gt;In 2024, relying solely on one device is a rarity - and nowhere is this more true than in the realm of IoT software.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Todays users demand applications that can seamlessly operate across their entire collection of gadgets - from smartphones and tablets to Apple Watches and beyond. For UX designers in the IoT software development world, navigating this diverse landscape of devices can be a significant challenge.&lt;/p&gt;

&lt;p&gt;Imagine being tasked with creating consistent designs that work for the compact screen of a wristwatch AND the sprawling interfaces of smart homes. It’s a challenging task that  calls for a nuanced approach blending creativity, innovation, and empathy.&lt;/p&gt;

&lt;p&gt;In this article, we delve into the hurdles of designing across divergent devices and explore effective strategies to guarantee user satisfaction across all platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adapting to Various Screen Sizes:
&lt;/h2&gt;

&lt;p&gt;Picture this: You're designing an app that tracks fitness metrics, intended to be accessible not only on smartphones but also on wearable devices like smartwatches. In this scenario, the first step in crafting a seamless experience is embracing responsive design principles. This entails creating interfaces that dynamically adjust to different screen sizes, ensuring content remains legible and interactions intuitive.&lt;/p&gt;

&lt;p&gt;The first step you’ll want to take when designing for dynamic screen sizes is focusing on the most important actions and information, and optimizing them for visibility and accessibility on smaller screens. For instance, if calories burned and step taken is the most important feature of your fitness app you might prominently display those metrics and include prominent, wast to access buttons for starting workouts or checking progress. Meanwhile, you can tuck away secondary features in menus to maintain a clutter-free interface.&lt;/p&gt;

&lt;p&gt;One simple approach to this is making a list of your apps most important information and actions, and begin designing for those features, ensuring that they're easy to see and use on smaller screens. Once complete, you can work around them to add in additional features.&lt;/p&gt;

&lt;p&gt;Finding the balance between showcasing the optimal mix of features and keeping thing simple is crucial. It’s important to remember that you don’t necessarily have to restrict the number of features your product offers in order to design for screen size - in the case of our fitness app, users check the quick stats on their smartwatch while jogging and then seamlessly delve into more detailed data on their smartphone or computer when they're home.&lt;/p&gt;

&lt;h2&gt;
  
  
  Voice and Gesture Controls:
&lt;/h2&gt;

&lt;p&gt;The era of tapping and swiping is evolving into one where users can simply speak or gesture to interact with their devices. From smart speakers to motion-sensing cameras, integrating voice and gesture controls opens up new dimensions of accessibility and convenience. However, designing intuitive experiences in this realm requires careful consideration of user expectations and contextual nuances.&lt;/p&gt;

&lt;p&gt;Take, for example, a smart lighting system that responds to voice commands and hand gestures. In such a scenario, the UX designer must ensure that the device accurately interprets user inputs while minimizing errors and false positives. Natural language processing algorithms can help decipher spoken commands, while motion sensors and machine learning algorithms can refine gesture recognition over time.&lt;/p&gt;

&lt;p&gt;Moreover, providing clear feedback is crucial to enhance user confidence and comprehension. Visual or auditory cues signaling successful interactions, such as a subtle chime or a gentle glow, reassure users that their commands have been understood and executed. By harnessing the power of voice and gesture controls thoughtfully, IoT devices can empower users of all abilities to effortlessly engage with technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cross-Platform Consistency:
&lt;/h2&gt;

&lt;p&gt;Today’s users are not content to limit their interactions to a single device. Instead, users can be found seamlessly switching between smartphones, tablets, and laptops, making consistency across platforms is paramount. This challenge becomes even more pronounced in the realm of IoT software development, where devices often belong to disparate ecosystems and operating systems.&lt;/p&gt;

&lt;p&gt;It’s important to remember that achieving cross-platform consistency isn’t just about uniformity—it also involves crafting cohesive experiences that feel native to each device while also upholding brand identity and usability standards.&lt;/p&gt;

&lt;p&gt;Imagine a smart thermostat that can be controlled via a mobile app, a web interface, and voice commands through a smart speaker. If the designs between these devices are inconsistent, the user will have to learn how to use each platform separately - a frustrating prospect. To avoid this,  it’s important for designers to establish a unified design language that includes common visual elements, interaction patterns, and terminology between devices - reducing the cognitive load users experience as they between platforms.&lt;/p&gt;

&lt;p&gt;An important thing to keep in mind is the fact that leveraging each devices unique features can improve the user experience without sacrificing consistency. For example, a smart thermostat app might utilize a smartphone’s ability to send push notifications, while using a smart speaker’s microphone to offer voice-controlled temperature adjustments. Utilizing the unique strengths of each device/platform allows designers to create cohesive experiences that transcend the abilities of a single device.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Navigating the dynamic realm of IoT requires solutions that seamlessly adapt to the diverse array of devices users rely on. From wearables to smart home gadgets, crafting user experiences that resonate across this spectrum demands a delicate balance of creativity, innovation, and empathy. By embracing these principles and implementing tailored strategies, designers can ensure inclusivity and enhance user satisfaction across all platforms in the ever-evolving landscape of IoT.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Yeti is an &lt;a href="https://www.yeti.co/" rel="noopener noreferrer"&gt;IoT application development company&lt;/a&gt;. For more insightful content, don't miss  our free library of free &lt;a href="https://www.yeti.co/yeti-explains/iot-software-development" rel="noopener noreferrer"&gt;IoT Software Development&lt;/a&gt; resources!&lt;/p&gt;

</description>
      <category>uxdesign</category>
      <category>development</category>
      <category>mobile</category>
      <category>programming</category>
    </item>
    <item>
      <title>Crafting Custom Career Development Matrices for the Tech Industry: A Step by Step Guide</title>
      <dc:creator>Yeti</dc:creator>
      <pubDate>Fri, 26 Jul 2024 20:25:26 +0000</pubDate>
      <link>https://forem.com/yetillc/crafting-custom-career-development-matrices-for-the-tech-industry-a-step-by-step-guide-38l2</link>
      <guid>https://forem.com/yetillc/crafting-custom-career-development-matrices-for-the-tech-industry-a-step-by-step-guide-38l2</guid>
      <description>&lt;p&gt;&lt;strong&gt;Guiding team members through their personal growth trajectory is a pivotal responsibility for people managers in the software development world. Harnessing the power of a tailored career development matrix can pave the way.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As a people manager at a software development company, I spend a lot of time getting to know my team members and figuring out how to support their unique needs—whether it's improving their work environment or helping them chase their career dreams. My mission is to create a space where personal and company goals can grow together.&lt;/p&gt;

&lt;p&gt;Now, it might seem like I have career development all figured out, but it wasn't always this way. When we started Yeti, my background in computer science didn't exactly prepare me for managing the career growth of a team. But I knew it was important, so I dove in and started having career development meetings with everyone on the team.&lt;/p&gt;

&lt;p&gt;In those early days, I focused on what I thought mattered: monitoring growth in relevant areas, understanding their feelings about current projects, and setting goals for the future. But I quickly realized that my approach had some gaps. It wasn't consistent, and I wasn't doing a great job of actually guiding folks towards meeting their goals. Plus, it made things tricky when it came to raises and promotions. Without clear expectations and a solid plan for advancement, it was tough for team members to link their career goals with their job responsibilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Crafting Your Career Development Matrix
&lt;/h2&gt;

&lt;p&gt;It became clear that the career development issues I was facing were not unique to me or my company—others were surely struggling with the same problems. I began researching how other companies managed their teams' career development plans and quickly found Progression, a collection of open-source frameworks that provided examples of career development plans that immediately resonated with me.&lt;/p&gt;

&lt;p&gt;Using some of these examples as an initial structure, I started outlining a career development matrix for each of our  software development roles, from Junior Developer up to Senior Developer.&lt;/p&gt;

&lt;p&gt;I began my setting up an empty Google Spreadsheet and, across the top, outlined each job title and the salary bands each position is paid, with a $10k -&amp;gt; $15k range inside of each band.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating your Competencies
&lt;/h2&gt;

&lt;p&gt;Once the structure was outlined, my next step involved establishing the role competencies, which I then detailed for each job level in the matrix. To brainstorm these competencies, I drew inspiration from current job descriptions and postings, example frameworks from progression.fyi, and ChatGPT.&lt;/p&gt;

&lt;p&gt;After creating a comprehensive list of potential competencies, I grouped them into similar categories and began refining them. This process involved prioritizing what was most important and ensuring there was no overlap. While there’s no correct number of competencies, it’s crucial to consider the most critical areas your team should focus on for their roles.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Generating &amp;amp; Refining your Expectations
&lt;/h2&gt;

&lt;p&gt;Next comes the most demanding part of the task: outlining the expectations for each competency at each level in your matrix. My strategy for this has evolved over time as I've continued creating matrices for multiple roles in the company. This is my current process:&lt;/p&gt;

&lt;p&gt;For each competency I created a brief bulleted list that summarizes what the competency entails. I then fed this to ChatGPT, and prompted it to outline appropriate expectations for fulfilling this competency at every level of the job.  I’ll share an example of a recent prompt I used below.&lt;/p&gt;

&lt;p&gt;I take the output from ChatGPT and put it into my matrix. This initial output isn’t perfect, but it is a starting point that helps alleviate the overwhelming feeling of having too much to write.&lt;/p&gt;

&lt;p&gt;I then review each competency across the roles, identifying what is redundant, non-critical, or missing, especially for the higher levels of the role. If I make major changes, I might run the individual competency through ChatGPT again with the newly rewritten expectations for the higher level, allowing ChatGPT to backfill the lower levels for me.&lt;/p&gt;

&lt;p&gt;I repeat this process until all competencies are filled out with clear and concise expectations. Remember, you are incentivizing your team to meet these expectations in order to achieve raises or promotions, so ensure they are meaningful to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  My ChatGPT Example Prompt
&lt;/h2&gt;

&lt;p&gt;“ You are helping to create a career development plan for the development team at a small software development agency that creates web and mobile applications for clients. I am going to give you information about a specific competency for the development team and you will give me bullet points describing the expectations, responsibilities, and activities for each of the following seniority levels: Senior Developer 1, Senior Developer 2, Technical Director. &lt;/p&gt;

&lt;p&gt;Each bullet point should be no longer than 25 words and should be tailored to the seniority level of each position. Please give me 6 bullet points per seniority level. Please do this for each competency and description I give you after this message. Please make the bullet points unique per seniority level and they must be related to the competency description. Please give me this without the title in each line item and as bullets in an unordered list instead of an ordered list.“&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Feedback on your Career Development Matrix
&lt;/h2&gt;

&lt;p&gt;Now that you have the first draft of your plan, it's crucial to get feedback from others to help polish it. After working on it for a while, you might have missed some expectations, included redundant competencies, or placed some expectations incorrectly.&lt;/p&gt;

&lt;p&gt;Consider asking one of the most senior team members to review the matrix, especially the junior bands, to get their involvement and buy-in. It can also be beneficial to seek feedback from individuals outside the role you created the matrix for, asking them to consider their expectations for people in this role at different levels. This can provide valuable insights and feedback.&lt;/p&gt;

&lt;p&gt;Consolidate all the feedback in a final pass at editing the matrix. Feel free to ignore, add verbatim, or draw inspiration from the feedback you received. Ultimately, you need to feel comfortable holding your team accountable to the expectations outlined in this document.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rolling it Out
&lt;/h2&gt;

&lt;p&gt;Next, announce the existence (or completion) of the matrix to your team and provide individual copies for each person to read through and conduct a self-review. Simultaneously, create a version for yourself to review as their manager. The process involves going row by row through each competency and highlighting the appropriate level that the person is currently at, based on the expectations described in each box. You can also highlight or make notes on specific bullet points in each row where you or the team member want to emphasize something they are or are not doing well.&lt;/p&gt;

&lt;p&gt;You’ll then meet with each of your direct reports to discuss the outcomes of their self-review and your review, addressing any discrepancies and areas of agreement. Part of this process involves assessing where the majority of their competencies align and making a judgment call on whether they deserve a raise or a promotion from their current position.&lt;/p&gt;

&lt;p&gt;After the review portion, work with team members to decide on 2-3 “boxes” they’d like to focus on over the next three months. The goal is to help them level up in specific competencies where they may be weaker. I personally like to have team members provide their input and ultimately choose their focus areas&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Ongoing Upkeep
&lt;/h2&gt;

&lt;p&gt;Now that you have your plan in place, have established your team’s position on the matrix, and have set goals for each member, it's time to follow through on helping them reach those goals. This involves discussing their progress in 1:1s, finding opportunities for them to gain relevant experience, and periodically re-reviewing the matrix with them to determine if they qualify for a raise or promotion.&lt;/p&gt;

&lt;p&gt;Additionally, the matrix may eventually feel outdated or some of the expectations might not seem entirely accurate. As your company and team evolve, you will need to revisit and update your career development plan. However, I recommend doing this no more frequently than once a year because, firstly, it requires considerable effort, and secondly, your team needs stability in the goals they’re striving to achieve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optional: Integrate Lattice HR Software
&lt;/h2&gt;

&lt;p&gt;As part of our operations software stack, we use Lattice, which fits really well with managing this career development matrix process. We use Lattice for 1:1s, weekly updates, 360 reviews, and monitoring performance and promotions. Lattice specifically calls this feature “Grow”.  While you can manage this process with spreadsheets and documents, Lattice makes it seamlessly integrated into all aspects of your people management if you use the software.&lt;/p&gt;

&lt;p&gt;By following this step-by-step guide to creating career development matrices, you now have a clear framework to enhance professional growth within your software development team. Ultimately, this proactive approach empowers your team to achieve higher levels of performance and satisfaction, driving sustained success for your organization.&lt;/p&gt;

&lt;p&gt;Yeti is an &lt;a href="https://www.yeti.co/" rel="noopener noreferrer"&gt;IoT application development company&lt;/a&gt;. If you'd like to learn more about what we do, be sure to take a look at our work, featuring case studies that showcase our collaborations with clients like Google, Netflix, Westfield, and many more. For more insightful content, don't miss  our free library of free IoT Software Development resources!&lt;/p&gt;

</description>
      <category>careerdevelopment</category>
      <category>management</category>
      <category>tutorial</category>
      <category>career</category>
    </item>
    <item>
      <title>The Hidden Costs of Rushing to Market: Navigating Tech Debt</title>
      <dc:creator>Yeti</dc:creator>
      <pubDate>Fri, 26 Jul 2024 20:17:05 +0000</pubDate>
      <link>https://forem.com/yetillc/the-hidden-costs-of-rushing-to-market-navigating-tech-debt-15pk</link>
      <guid>https://forem.com/yetillc/the-hidden-costs-of-rushing-to-market-navigating-tech-debt-15pk</guid>
      <description>&lt;p&gt;&lt;strong&gt;The world of technology moves fast. In fact, we often see teams in a frenzied rush to launch their products, operating under the belief that, in order to be successful, their app needs to be the first to seize current trends. But does being first always mean being best?‍&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In reality, the quest to be "first" often conflicts with the essential need for long-term success. Compromising best practices and taking shortcuts to launch will inevitably result in technical debt – a serious threat to your products ecosystem… and your success&lt;/p&gt;

&lt;p&gt;In this article, we'll delve into technical debt, exploring its causes, far-reaching consequences and, most importantly, effective strategies for mitigating and handling it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Technical Debt?
&lt;/h2&gt;

&lt;p&gt;In the IoT software development process, technical debt is an issue that emerges when developers opt for quick solutions or take shortcuts to meet pressing business demands - typically at the expense of optimal code quality or system design.&lt;/p&gt;

&lt;p&gt;These shortcuts, akin to financial debt, accumulate interest over time, gradually complicating the software landscape - complexity mounts with each workaround, resulting in a codebase that is increasingly difficult to decipher, maintain and scale.&lt;/p&gt;

&lt;p&gt;While technical debt may provide a temporary reprieve in meeting deadlines or delivering features promptly, its long-term repercussions can be significant. Elevated costs, reduced productivity, heightened risk of errors and user dissatisfaction all become potential pitfalls that can threaten the longevity and competitiveness of software projects.&lt;/p&gt;

&lt;p&gt;The following is a simple example illustrating how tech debt can occur, and the challenges it can create:&lt;/p&gt;

&lt;p&gt;A development team faces a tight client deadline for completing an app project. Rather than request a deadline extension, the team works towards completing the project as quickly as possible, which ultimately requires them to take a few coding and testing shortcuts.&lt;/p&gt;

&lt;p&gt;While these shortcuts enable the team meet their deadline, they also lead to a convoluted codebase and several bugs that are quickly discovered through an influx of negative user feedback. Unfortunately, fixing these issues requires an additional developer to decipher and repair the confusing codebase, ultimately delaying the release of an important new product feature.&lt;/p&gt;

&lt;p&gt;*** Not sure if you're in Tech Debt? Our &lt;a href="https://www.yeti.co/resources/navigating-technical-debt" rel="noopener noreferrer"&gt;Free Tech Debt Checklist&lt;/a&gt; can help!**&lt;/p&gt;

&lt;h2&gt;
  
  
  The Impact of Tech Debt
&lt;/h2&gt;

&lt;p&gt;While design and development shortcuts might seem like a quick fix for meeting tight deadlines, it’s crucial to understand the negative impact it can have on your development journey and your end*-*user’s experience.&lt;/p&gt;

&lt;p&gt;For instance, coding shortcuts used to meet a tight deadline often result in complex and convoluted codebases. While these codebases may work in the short term, they often present substantial challenges down the line, forcing developers to decipher their complexity in order to implement any new features. This, in turn stifles innovation, leaving the team with far less capacity for exploring new ideas, building new features and adapting to evolving market trends and technological advancements.&lt;/p&gt;

&lt;p&gt;It’s important to understand that, as time progresses and the codebase grows, technical debt tends to worsen and become more apparent. Because tech debt accumulates interest over time, each new feature added or modification made without addressing underlying issues further compounds the debt - and the effort required to repay this debt grows exponentially, often surpassing the initial time saved by taking shortcuts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strategies for Managing Technical Debt
&lt;/h2&gt;

&lt;p&gt;For all the reasons listed above, managing technical debt is a critical aspect of the software development process. At Yeti, we have a comprehensive approach to managing technical debt, throughout the software development lifecycle. If you'd like a primer covering all the strategies and best practices you can use to manage tech debt, don't miss our free guide!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agile Development Practices:&lt;/strong&gt;&lt;br&gt;
At Yeti, we employ Agile methodologies to oversee all our software projects. The Agile process is an iterative development cycle, which means that we operate within two-week sprint cycles, completing, testing, and receiving feedback on each piece of work before proceeding to the next. This structured approach inherently minimizes the accumulation of technical debt, ensuring that our codebase remains clean, maintainable, and aligned with project goals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Continuous Integration and Deployment:&lt;/strong&gt;&lt;br&gt;
Continuous integration (CI) and continuous deployment (CD) practices automate the process of combining code changes and putting them into action in live environments,  allowing for quicker feedback loops and a lower chances of accruing technical debt. By catching integration problems early on and delivering smaller changes that are easier to handle, CI/CD pipelines help keep the code in good shape and prevent debt from piling up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Reviews&lt;/strong&gt;&lt;br&gt;
Code reviews involve team members examining each other's code before it's integrated into the project. This process encourages sharing knowledge, enhancing code quality, and spotting potential technical debt at an early stage. By tapping into the collective expertise of the team, code reviews act as a barrier against less-than-optimal coding practices and help maintain clean, maintainable codebases that adhere to established coding standards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automated Testing:&lt;/strong&gt;&lt;br&gt;
Automated testing involves having a program check your code to ensure it’s working correctly before deployment. Unit tests, integration tests, and end-to-end tests detect mistakes and ensure that any new changes won’t break anything that was previously working. These tests give quick feedback on any changes made to the code, confirm that the software behaves as expected, and make sure it's reliable and stable. This helps prevent bugs that can cause technical debt, saving time and effort in the long run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scheduled Refactoring:&lt;/strong&gt;&lt;br&gt;
Scheduled refactoring sessions are regular opportunities for the development team to tidy up their code and fix any issues that have built up over time. This allows them to proactively address any accumulated technical debt by systematically improving code, enhancing the systems design, and eliminating any bugs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technical Debt Backlog&lt;/strong&gt;&lt;br&gt;
A technical debt backlog serves as a prioritized to-do list for developers, focusing on cataloging and ranking debt-related issues. By transparently documenting and prioritizing these issues, the development team can systematically integrate the most critical ones into their regular task list, ensuring that technical debt receives the necessary attention and resources for resolution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regular Assessments:&lt;/strong&gt;&lt;br&gt;
It is crucial for development teams to conduct regular tech debt assessments, such as code quality analyses, architectural reviews, or performance audits. This allows the team to identify and quantify existing debt within the codebase and make informed decisions about prioritizing those fixes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Communication and Collaboration:&lt;/strong&gt;&lt;br&gt;
Effective communication and collaboration among team members and clients are essential for managing tech debt successfully. At Yeti, we foster a culture of transparency, openness, and shared responsibility that allows us collectively identify, prioritize, and address technical debt, and ensure that it remains a visible and actionable aspect of our development process.&lt;/p&gt;

&lt;p&gt;Navigating the app development landscape is fraught with challenges, but perhaps none as insidious as technical debt. While the allure of meeting deadlines and delivering features promptly may seem enticing, the long-term repercussions of accumulated debt can be severe. From increased maintenance costs to diminished user experiences, the consequences of technical debt are far-reaching and can undermine the very foundation of your software projects.&lt;/p&gt;

&lt;p&gt;If you'd like a comprehensive guide to understanding and managing tech debt, &lt;a href="https://www.yeti.co/resources/navigating-technical-debt" rel="noopener noreferrer"&gt;be sure to download our free guidebook!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yeti is an &lt;a href="https://www.yeti.co/iot-software-development" rel="noopener noreferrer"&gt;IoT software development company&lt;/a&gt;. If you'd like more content like this be sure to check out our blog and resources!&lt;/p&gt;

</description>
      <category>development</category>
      <category>programming</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Shopify Checkout UI Extensions</title>
      <dc:creator>Yeti</dc:creator>
      <pubDate>Tue, 07 May 2024 00:01:58 +0000</pubDate>
      <link>https://forem.com/yetillc/shopify-checkout-ui-extensions-2ep9</link>
      <guid>https://forem.com/yetillc/shopify-checkout-ui-extensions-2ep9</guid>
      <description>&lt;p&gt;&lt;strong&gt;Shopify is a leading e-commerce platform that empowers businesses of all sizes to seamlessly create, manage, and scale their online stores, offering robust tools and integrations that cater to a wide array of needs.&lt;/strong&gt;&lt;br&gt;
This article explains how we at Yeti recently created a custom Shopify App using Checkout UI extensions to pull real-time data from a client’s Enterprise Resource Planning (ERP) system into Shopify. By the end of this article you will better understand what Shopify Checkout UI extensions are, how to approach building them, and some of the things to keep in mind during the implementation process.&lt;/p&gt;
&lt;h2&gt;
  
  
  What are Shopify Checkout UI Extensions?
&lt;/h2&gt;

&lt;p&gt;Checkout UI extensions are customizable components available to users with Shopify Plus stores. They are essentially small React applications that use Shopify-provided tools and APIs to securely and reliably extend existing Shopify features. The extensions run in isolated &lt;a href="https://github.com/Shopify/ui-extensions/blob/unstable/documentation/runtime-environment.md"&gt;sandbox environments &lt;/a&gt;with limited access to browser APIs, helping to protect customer data and ensure the checkout process remains secure.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Did We Need One?
&lt;/h2&gt;

&lt;p&gt;Our client, a construction materials and equipment sourcing company, needed a direct connection between their ERP system and Shopify checkout page to display an up-to-date list of active projects to their customers during checkout. This feature would help our client’s customers indicate which project their order is for, simplifying order fulfillment.&lt;/p&gt;
&lt;h2&gt;
  
  
  How Did We Build It?
&lt;/h2&gt;

&lt;p&gt;First, to build a Shopify Checkout UI extension you will need access to a &lt;a href="https://www.shopify.com/plus"&gt;Shopify Plus store&lt;/a&gt;. Checkout UI extensions are currently only available to merchants on a Shopify Plus plan. &lt;/p&gt;

&lt;p&gt;You’ll also need to install &lt;a href="https://shopify.dev/docs/api/shopify-cli"&gt;Shopify’s command-line interface&lt;/a&gt;, have a &lt;a href="https://www.shopify.com/partners?shpxid=11c9e290-04F0-4D0F-EE06-D3DB639C9158"&gt;Partner account&lt;/a&gt;, and have access to &lt;a href="https://shopify.dev/docs/apps/tools/development-stores#create-a-development-store-to-test-your-app"&gt;development store&lt;/a&gt; for testing the extension.&lt;/p&gt;
&lt;h3&gt;
  
  
  Identify the Extension Target
&lt;/h3&gt;

&lt;p&gt;Extensions can be added to any of the &lt;a href="https://shopify.dev/docs/api/checkout-ui-extensions/2024-04/extension-targets-overview"&gt;extension targets&lt;/a&gt; defined by Shopify. The target defines where in the storefront our extension will appear. For example, if we wanted to add an extension just below the checkout page’s header we might choose a target of &lt;code&gt;purchase.checkout.header.render-after&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We chose an appropriate target within the Shopify checkout flow to add our extension, making sure it fits naturally without disrupting the user experience.&lt;/p&gt;
&lt;h3&gt;
  
  
  Create a Shopify App
&lt;/h3&gt;

&lt;p&gt;We &lt;a href="https://shopify.dev/docs/apps/getting-started/create"&gt;created our new app locally&lt;/a&gt; using the Shopify CLI. This generates all the code needed for developing a Shopify App.&lt;/p&gt;

&lt;p&gt;Our extension needed network access since it requests data from our client’s ERP at runtime. It also needed checkout-blocking permissions to prevent customers from submitting orders without selecting a project id. We configured both of these permissions with the following block in our extension’s &lt;code&gt;shopify.extension.toml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[extensions.capabilities]
# Gives your extension access to make external network calls, using the
# JavaScript `fetch()` API. Learn more:
# https://shopify.dev/docs/api/checkout-ui-extensions/unstable/configuration#network-access
network_access = true

# Allows extension to block progress of the checkout flow.
block_progress = true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This file is also where other general configuration for the app is located, including the extension target we chose above.&lt;/p&gt;

&lt;p&gt;We also had to &lt;a href="https://shopify.dev/docs/api/checkout-ui-extensions/unstable/configuration#network-access"&gt;request network access&lt;/a&gt; for our app in the Shopify Partners dashboard, which is not granted by default. At the time of writing, once the request is submitted it is automatically approved and the app is immediately granted network access permissions.&lt;/p&gt;




&lt;p&gt;Now for the checkout UI extension itself — which, as a reminder, is a small React app created by the Shopify CLI that will be added to our store at the target we selected above — we had several requirements:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Request up-to-date data from our client’s ERP system via our backend.&lt;/li&gt;
&lt;li&gt;Prove to our backend that the request came from our Shopify extension.&lt;/li&gt;
&lt;li&gt;Display a list of active projects to customers on the checkout page.&lt;/li&gt;
&lt;li&gt;Prevent customers from checking out if they haven’t selected an active project from the list.&lt;/li&gt;
&lt;li&gt;Store the selected active project identifier on the Shopify order so that our client can efficiently fulfill the order.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I’ll cover the first two points when describing our extension’s backend below.&lt;/p&gt;

&lt;p&gt;Once we have the project data we need, showing a list of projects took some basic React code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    &amp;lt;Banner title="Select Project for Order"&amp;gt;
      {!projects.length ? (
        &amp;lt;&amp;gt;Loading...&amp;lt;/&amp;gt;
      ) : (
        &amp;lt;Select
          label="Active Projects"
          options={projects.map((project) =&amp;gt; ({
            value: project.projectId,
            label: `${project.projectId} - ${project.description}`,
          }))}
          onChange={handleChange}
          value={selectedProject}
        /&amp;gt;
      )}
    &amp;lt;/Banner&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All we needed to do here was to first show a loading value while we wait for the data from our backend, and then to show a dropdown with the list of active projects that was returned. &lt;/p&gt;

&lt;p&gt;This is pretty standard React code, which is one of the great things about working with the Shopify extension system: if you already know React it’s pretty easy to get started.&lt;/p&gt;

&lt;p&gt;To prevent customers from checking out before selecting a project, we used a React hook provided by Shopify called &lt;code&gt;useBuyerJourneyIntercept&lt;/code&gt;. This hook allows us to tweak what happens when any number of conditions are met, giving us more control over the checkout flow.&lt;/p&gt;

&lt;p&gt;We used this hook to set up the progress blocking behavior we added permissions for previously in our extension’s configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  useBuyerJourneyIntercept(({ canBlockProgress }) =&amp;gt; {
    return canBlockProgress &amp;amp;&amp;amp; !selectedProject
      ? {
          behavior: "block",
          reason: "No Project Selected",
          errors: [
            {
              // shows an error at the page level
              message:
                "Please select a project before proceeding with your order.",
            },
          ],
        }
      : {
          behavior: "allow",
        };
  });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This checks both whether this extension has permission to block progress and whether the user has selected a project. If both are true we allow the customer to submit their order, otherwise we block progress and show an appropriate error message.&lt;/p&gt;

&lt;p&gt;Finally, to store the customer’s selected project on the Shopify order we used another React hook provided by Shopify called &lt;code&gt;useApplyMetafieldsChange&lt;/code&gt;. This hook provided a function that allowed us to write custom values to meta fields on the Shopify order. &lt;/p&gt;

&lt;p&gt;We used this function in the change handler of our dropdown component to store the selected project id:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  const handleChange = (projectId: string) =&amp;gt; {
    setSelectedProject(projectId);

    applyMetafieldsChange({
      type: "updateMetafield",
      namespace: "&amp;lt;client name&amp;gt;",
      key: "projectId",
      valueType: "string",
      value: value,
    });
  };
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Develop the Backend
&lt;/h3&gt;

&lt;p&gt;The final piece of the puzzle was a custom backend that bridges between our Shopify App and the ERP system. We couldn’t request data directly from our Shopify App since all the app’s code is sent to the browser, so any sensitive credentials would be essentially public. Our backend’s responsibilities are first to validate that all incoming requests came from Shopify, and then to return the list of active projects to our app.&lt;/p&gt;

&lt;p&gt;We can validate that incoming requests came from Shopify by verifying that the session token sent on the request from our app is valid. Once we verify that the request came from Shopify, we can request the data that we need from our client’s ERP system and return it to our app in an easy-to-use format. With this piece in place we are finally able to pull the list of active projects into our Shopify store’s checkout page.&lt;/p&gt;

&lt;p&gt;In closing, our work to create a custom Shopify Checkout UI extension has streamlined our client's checkout process, linking it directly with their ERP system for real-time project data.&lt;/p&gt;

&lt;p&gt;This project not only solved a complex technical challenge for our client but also demonstrated the robust customization capabilities of Shopify Plus. We hope this overview of the development process has given you a clearer understanding of what Shopify Checkout UI extensions can do and how they can be effectively implemented.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yeti is an &lt;a href="https://www.yeti.co/iot-software-development"&gt;IoT application development company&lt;/a&gt;. If you'd like to learn more about what we do, be sure to take a look at our extensive library of &lt;a href="https://www.yeti.co/iot-software-development"&gt;IoT software development&lt;/a&gt; content.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>webdev</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Accessibility First In React Native</title>
      <dc:creator>Yeti</dc:creator>
      <pubDate>Mon, 06 May 2024 23:36:11 +0000</pubDate>
      <link>https://forem.com/yetillc/accessibility-first-in-react-native-o02</link>
      <guid>https://forem.com/yetillc/accessibility-first-in-react-native-o02</guid>
      <description>&lt;p&gt;&lt;strong&gt;Accessibility-first development is gaining steam. Nowhere is this more important than for mobile developers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not only are more people using mobile devices as their primary way to engage on the internet, but mobile devices also present the biggest need for an accessibility-first mindset. Small screens and gesture-powered navigation present unique challenges. So what are the challenges facing developers, and why are some hesitant to encourage accessibility as a primary design priority? &lt;/p&gt;

&lt;p&gt;Accessibility implementation takes time, especially when retrofitting an app– one of the reasons why accessibility first is so important. This time may sound expensive or unnecessary to a client or manager who doesn’t understand the benefits of an accessible app. Perhaps more fundamentally, however, accessibility is not part of standard developer training. Whether one is brought into app development via a computer science degree, self-teaching, or a boot camp, little-to-no time is spent discussing accessibility strategies, technologies, or best practices. So, in this post, I’m going to introduce three best practices and three potential gotchas for accessibility development on one of the most popular app-building frameworks, React Native.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples below are given in TypeScript and are taken from &lt;a href="https://github.com/jonnyschult/accessibility-demo"&gt;this repo.&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1: Use React Context to create an AccessibilityProvider&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React Context provides a built-in state management tool that greatly simplifies passing top-level data throughout the component tree. This eliminates the necessity of rewriting the same checks or convenience functions in many children components. &lt;/p&gt;

&lt;p&gt;For example, storing a boolean representing the state of the screen reader can be used whenever some custom accessibility logic is needed. In the AccessibilityProvider component, you can use a useEffect to create a listener for the changing screen-reader state. Then, pass the screenReaderIsEnabled boolean. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1a: Setup check for screen readers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can access this value using the useContext hook. I commonly use this when ensuring interactive text components are accessible or on carousel screens in order to pause automatic slides. You can also define other useful utilities or values and functions in accessibilityContext. Be sure to put the AccessibilityProvider component near the top of the component tree, probably in App.tsx, so as to have it accessible throughout the app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const [screenReaderIsEnabled, setScreenReaderIsEnabled] = useState(false);
…
 useEffect(() =&amp;gt; {
   // Create listener for when a screen reader is enable
   // If it is, set a state variable to be used throughout the app
   const screenReaderListener = AccessibilityInfo.addEventListener(
     'screenReaderChanged',
     isActive =&amp;gt; {
       updateScreenReaderStatus(isActive);
     },
   );


   return () =&amp;gt; {
     screenReaderListener.remove();
   };
 }, []);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2: Put Accessibility Props in Reusable Components&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Creating reusable components to be used throughout the app is essential for efficient development. This method can be leveraged to make your accessibility work easier as well. By placing accessibility props in shared components, you save yourself the trouble of writing the same roles/labels over and over again.&lt;/p&gt;

&lt;p&gt;Two common examples, demonstrated below, are perfect use cases for putting accessibility information in a reusable component.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2a: Simplified Reusable Button&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const CustomButton = ({
 onPress,
 children,
 isLoading,
 isDisabled,
 width,
 accessibilityRole,
 accessibilityLabel,
 accessibilityElementsHidden,
 importantForAccessibility,
}: Props) =&amp;gt; {
 return (
   &amp;lt;Button
     accessibilityElementsHidden={accessibilityElementsHidden}
     importantForAccessibility={importantForAccessibility}
     …
     accessibilityRole={accessibilityRole ?? 'button'}
     accessibilityLabel={isLoading ? 'Loading' : accessibilityLabel}&amp;gt;
     {isLoading ? (
       &amp;lt;Icon source={loadingIndicator} size={48} /&amp;gt;
     ) : (
       &amp;lt;CustomText&amp;gt;{children}&amp;lt;/CustomText&amp;gt;
     )}
   &amp;lt;/Button&amp;gt;
 );
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2b: Reusable Icon&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const Icon = ({
…
 accessibilityLabel,
 accessibilityRole,
 onPress,
 ...props
}: IconProps) =&amp;gt; {
 return (
   &amp;lt;TouchableOpacity
    …
     accessibilityRole={
       accessibilityRole ? accessibilityRole : onPress ? 'button' : undefined
     }
     accessibilityLabel={accessibilityLabel}&amp;gt;
     &amp;lt;StyledIcon
      …
     /&amp;gt;
   &amp;lt;/TouchableOpacity&amp;gt;
 );
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s important to still allow the role/label to be passed to the reusable component as an optional prop. React Native’s accessibilityRole has a set of values it is able to receive, such as header and button, as shown above. Though it would seem that the role of button will always be a button, there are more specific values that can be useful to pass, such as link for when the button opens a browser or email client.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3: Announce UI Updates, Especially Popups&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Announcing changes helps keep the UI current for those using screen readers. It can be very frustrating to submit a form or have an error message appear but not be aware of it because there was no announcement. Announcing these changes allows users to properly alter their expectations for the screen.&lt;/p&gt;

&lt;p&gt;React Native has a couple of methods for announcing such changes, and the right one may depend on which platform you are developing and how aggressive you want the message to be. For Android, there is a handy prop called accessibilityLiveRegion which will automatically announce the changes whenever the component updates. Logic that dynamically updates the UI is required to appropriately display the message, and the same is true for announcing it. If the error has been resolved, it is likely the component displaying the error will animate out/close. We don’t want to alert the user to this all the time, so you can conditionally add the announcement depending on whether the element is visible or not. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.1: Announcing an Error Message&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const FormErrorMessage = ({
 errorMessage,
 isVisible,
 …
 accessibilityElementsHidden,
 importantForAccessibility,
}: Props) =&amp;gt; {
 const growTranslation = useRef(new Animated.Value(0)).current;
…
 return (
   &amp;lt;Layout
     accessibilityElementsHidden={accessibilityElementsHidden}
     importantForAccessibility={importantForAccessibility}
     accessibilityLiveRegion={isVisible ? 'polite' : 'none'}
     style={grow}&amp;gt;
     &amp;lt;ErrorContainer&amp;gt;
       &amp;lt;Icon source={alert} size={22} /&amp;gt;
       &amp;lt;ErrorText accessibilityRole="alert"&amp;gt;{errorMessage}&amp;lt;/ErrorText&amp;gt;
     &amp;lt;/ErrorContainer&amp;gt;
   &amp;lt;/Layout&amp;gt;
 );
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FormErrorMessage.tsx&lt;/p&gt;

&lt;p&gt;accessibilityLiveRegion can accept either ’polite’ (wait for any message being read to end before reading the announcement), ’assertive’ (interrupt any message being read and read the new message), or ’none’ (say nothing at all). For an error message which appears under an input when form validation fails, ’polite’ is probably the best option, but for a pop-up modal, ’assertive’ is likely to be more appropriate since that is now the only accessible content. &lt;/p&gt;

&lt;p&gt;For iOS, a more imperative approach is required. Luckily, React Native has the AccessibilityInfo API. The announceForAccessibility and announceForAccessibilityWithOptions methods can be used to have VoiceOver, iOS’s screen reader, announce messages. We can add this useEffect to the code above to have it behave like accessibilityLiveRegion, but on iOS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.2: Announce Error Message on iOS&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;useEffect(() =&amp;gt; {
   if (IS_IOS &amp;amp;&amp;amp; isVisible) {
     announce({message: 'Error alert: ' + errorMessage, queue: true});
   }
 }, [isVisible, errorMessage, announce]);```





&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;3.3: Announce Reusable Announce Method&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

const announce = ({message, queue = false, delay}: AnnounceOptions) =&amp;gt; {
 if (delay) {
   setTimeout(() =&amp;gt; {
     // @ts-ignore for some unknown reason, this method isn't recognized.
     AccessibilityInfo.announceForAccessibilityWithOptions(message, {
       queue,
     });
   }, delay);
 } else {
   // @ts-ignore for some unknown reason, this method isn't recognized.
   AccessibilityInfo.announceForAccessibilityWithOptions(message, {
     queue,
   });
 }
};



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If the queue option is set to true, then it behaves like ’polite’ for accessibilityLiveRegion. If it is set to false, it behaves like ’assertive’. &lt;/p&gt;

&lt;h2&gt;
  
  
  Gotchas and Heads Ups
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1: Nested Links&lt;/strong&gt;&lt;br&gt;
Because of the way React Native interprets nested text, in-line links become difficult to handle for accessibility. Essentially, React flattens the text into a string and then does some behind-the-scenes work to apply the appropriate styling. &lt;a href="https://reactnative.dev/docs/text#nested-text"&gt;You can read more about it in the official documentation&lt;/a&gt;. This is not a problem when all that is changing is the styling, but when a link is nested in the Text component, the accessibility API has no way to access the inner Text component’s unique accessibility props, and the screen reader is unable to select and activate the link. This makes nested links inaccessible. Consider this example: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.1: Nested Link&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&amp;lt;Copy&amp;gt;
 Want a list of all the mysteries?{'\n'} Checkout{' '}
 &amp;lt;Link
   accessibilityRole="link"
   onPress={() =&amp;gt; Linking.openURL('https://www.imdb.com/list/ls023545027/')}&amp;gt;
   IMDB's
 &amp;lt;/Link&amp;gt;{' '}
 ranked list
&amp;lt;/Copy&amp;gt;;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;It looks pretty straightforward. There is a link nested inside some text which, when pressed, links out to IMDB. When the screen reader is off, you can tap the Link text. But when the screen reader is on, it can only access the Copy text block as a single string, making the onPress callback in Link unreachable and leaving the accessiblityRole unread. In some cases where the wording is ambiguous, the user may not even know that there is a link to be reached from the text block. &lt;/p&gt;

&lt;p&gt;There are a number of solutions to this problem. Perhaps one early thought would be to try un-nesting the text components, putting them inside a container, and styling the container such that it has flexDirection: ‘row’ and justifies the content to make the text look right. Despite the initial appeal, this approach has at least two drawbacks. First, it can make the actual link hard to select since it is likely only a word or two surrounded by more text. Secondly, and more importantly, this solution is only feasible when a link comes either at the beginning or the end of the text block and the length lines up just right. Attempts to finagle such a solution are brittle and overly complicated, if not entirely unfeasible. &lt;/p&gt;

&lt;p&gt;Luckily, there is a more practical solution. It’s helpful to remember that accessibility is a part of an app that, in React Native, is written in JavaScript. So we can use JS instantiated logic and utilize the setup explained in the “Best Practices” section to make a clean solution. First, we import the screenReaderIsActive boolean from our accessibilityContext. We then use this value to dynamically determine which text component has the onPress functionality and to set the accessibilityRole. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.2: Accessible Nested Link&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&amp;lt;Copy
 accessibilityRole="link"
 onPress={
   screenReaderIsEnabled
     ? () =&amp;gt; {
         Linking.openURL('https://www.imdb.com/list/ls023545027/');
       }
     : undefined
 }&amp;gt;
 Want a list of all the mysteries?{'\n'} Checkout{' '}
 &amp;lt;Link
   onPress={() =&amp;gt; Linking.openURL('https://www.imdb.com/list/ls023545027/')}&amp;gt;
   IMDB's
 &amp;lt;/Link&amp;gt;{' '}
 ranked list
&amp;lt;/Copy&amp;gt;;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The onPress value in Link can be left alone. It’s not going to hurt anything when the screen reader is enabled. The important part is to make the parent-level Copy component handle the onPress event only when the screen reader is enabled. If it is, the role of the text will be read as link, and selecting the text will open the link. If the screen reader is not enabled, then the parent-level Copy component will not be selectable, which is the expected behavior. The Link component will handle the onPress event. &lt;/p&gt;

&lt;p&gt;There is one more important note about nested links which the following code block will demonstrate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.3: Doubly Nested Link&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&amp;lt;Copy&amp;gt;
 Want a list of all the mysteries?{'\n'} Checkout{' '}
 &amp;lt;Link
   accessibilityRole="link"
   onPress={() =&amp;gt; Linking.openURL('https://www.imdb.com/list/ls023545027/')}&amp;gt;
   IMDB's
 &amp;lt;/Link&amp;gt;{' '}
 ranked list{'\n'}
 or{' '}
 &amp;lt;Link
   accessibilityRole="link"
   onPress={() =&amp;gt;
     Linking.openURL(
'https://www.tvguide.com/news/british-murdery-mystery-shows-watch-netflix-hulu-amazon-britbox/',
     )
   }&amp;gt;
   TV Guide's
 &amp;lt;/Link&amp;gt;{' '}
 ranked list
&amp;lt;/Copy&amp;gt;;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;As the above example shows, there are now two links in our text block, which is easy enough and straightforward when accessibility is not part of the picture. But this raises serious problems for implementing sensible accessibility solutions. The workaround suggested in this section does not work here because the parent Copy components onPress can only open and handle one link. So it can’t handle the logic of selecting multiple links nested inside. &lt;br&gt;
Perhaps there could be some complicated solution, but from my research and attempts to find a solution to this problem, I think it is safe to consider this design an anti-pattern. The best approach is to talk to your app designer and/or any other stakeholders and explain the limitations of this design and why it’s particularly hard for screen-reader users to navigate. I’ve done this, and the designer clearly understood the issue and graciously refactored the design to be more accessibility friendly by separating the links into distinct text blocks. Problem solved!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2: Absolutely Positioned Elements&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Screen readers attempt to follow the flow of the elements on screens. Elements with position set to ‘absolute’ typically disrupt the pattern, and some, most notably Android’s TalkBack screen reader, simply cannot access such elements if they are outside of the space designated to their ‘relatively’ positioned ancestor. If your app is an iOS-only app, this isn’t as big of a concern. &lt;/p&gt;

&lt;p&gt;There are a couple of strategies I’ve used to cope with this issue. The appropriate method will depend on the use case. Tooltips are often absolutely placed. Since tooltips typically don’t contain any elements with pressable content, not being able to access them with a screen reader should not be that big of a deal. We can use accessibilityLiveRegion on Android and use the announce method on iOS from accessibilityContext.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.1: Tooltip Accessibility&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

useEffect(() =&amp;gt; {
   if (IS_IOS &amp;amp;&amp;amp; showTooltip) {
     announce({message: text, delay: 100});
   }
 }, [showTooltip, text, announce]);




&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;When the showToolTip boolean is true, announce function will fire. This means when the tooltip opens, the text will be read by the screen reader. Since nothing needs to be pressed, the problems caused by the fact that the element cannot be focused on by the screen reader are moot. &lt;/p&gt;

&lt;p&gt;Other times when developers are inclined to use ‘absolute’ positioned elements, accessing the inner content of the element is required. As stated above, on iOS, this is generally fairly straightforward since VoiceOver can still access elements with ‘absolute’ position. But with TalkBack, this generally cannot be done. As such, a bit of creativity with styling is needed to give the appearance of an element that is absolutely positioned.&lt;/p&gt;

&lt;p&gt;Consider a dropdown menu. Typically a dropdown menu on a form slides down, covering other inputs, allowing a user to select a dropdown item. This is the perfect scenario for an element with &lt;code&gt;position&lt;/code&gt; &lt;code&gt;’absolute’&lt;/code&gt;. But, that is not an option, since the dropdown item would not be able to be selected by TalkBack. Setting the bottom margin to a negative value will achieve the same effect, however, and it will still be accessible! Note, however, that component will still occupy the extra space if the parent container is set to &lt;code&gt;flex: 1&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;The idea of negative margins may make some devs' skin crawl, but it works well in such a scenario. &lt;a href="https://github.com/jonnyschult/accessibility-demo"&gt;An example can be found in the demo repo&lt;/a&gt;. The trick is to determine the height of the input bar and the dropdown menu. Then you can use the marginBottom styling value to offset the elements below into the position they would naturally occupy if the dropdown menu were set to ‘absolute’. Animation can then handle the sliding effect.&lt;/p&gt;

&lt;p&gt;In brief, if the content of your element is interactive, try to avoid ‘absolute’ because it’s difficult for screen readers. There’s almost always a way to achieve the same UI and functionality in an accessible way. &lt;/p&gt;

&lt;h2&gt;
  
  
  3: Accessibility Delay
&lt;/h2&gt;

&lt;p&gt;Unfortunately, React Native’s accessibility API has its limitations. The UI isn’t entirely in sync with accessibility, and sometimes, when creating an accessibility announcement or setting the accessibility focus, it can be overridden when React’s accessibility catches up with UI updates. This can be particularly confusing when Android and iOS handle these situations differently. &lt;/p&gt;

&lt;p&gt;In lieu of an integrated, uniform way of managing some important accessibility features, creative problem-solving is essential, even if a bit unsatisfying. For example, while Android has the accessibilityLiveRegion, there is no equivalent prop in iOS. An initial thought is to have a useEffect that uses the AccessibilityInfo.announceForAccessibility method. This approach, however, fails because when accessibility registers that the UI has updated, it cuts off the announcement. There are a number of legitimate workarounds, including setting a timeout to delay the announcement so that it trumps the standard accessibility flow. Below is an example of another workaround that ensures that the appropriate message is read, though it comes at the cost of overriding the proper accessibility label of a component.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.1: Announce Modal&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

useEffect(() =&amp;gt; {
   const timer = setTimeout(() =&amp;gt; {
     if (IS_IOS &amp;amp;&amp;amp; visible) {
       setHasAnnounced(true);
     }
   }, announcementDuration);
   return () =&amp;gt; {
     clearTimeout(timer);
     setHasAnnounced(false);
   };
 }, [announcementDuration, visible]);
…
&amp;lt;Icon
 size={50}
 source={exitIcon}
 onPress={handleClose}
 accessibilityRole="none"
 accessibilityLabel={
   hasAnnounced || !IS_IOS ? 'exit modal: button' : accessibilityAnnouncement
 }
/&amp;gt;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Icon is the component first selected by accessibility, so its accessibilityLabel is temporarily set to the desired announcement when the modal is open. After a certain duration, the hasAnnounced boolean is switched, and the regular accessibility label for Icon is set.&lt;br&gt;
Another example comes from DropDownMenu in the example repo. The desired behavior is that when the DropDown is opened, accessibility focuses on the first option on that menu. When opening the dropdown, accessibility will only read the first option with a call to the AccessibilityInfo.setFocus method, but it won’t focus on it, and therefore it will not be selectable. Again, the solution isn’t ideal, but it’s functionally adequate to simply delay the focusing method. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.2: Focus on first dropdown menu option&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

// handles opening and closing dropdown menu
const handlePress = (openStatus: boolean, option?: string) =&amp;gt; {
…
   // Auto focus on the first menu item
   // Android requires a bit of time to properly focus
   if (!isOpen &amp;amp;&amp;amp; firstOptionRef.current) {
     setFocus(firstOptionRef, IS_IOS ? 0 : 500);
   }
  …
 };



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

 // Create a setFocus function so you can simplify focus setting throughout the app
 const setFocus = ({ref, delay}: SetFocusOptions) =&amp;gt; {
   const reactTag = findNodeHandle(ref.current);
   if (reactTag) {
     if (delay) {
       setTimeout(() =&amp;gt; {
         AccessibilityInfo.setAccessibilityFocus(reactTag);
       }, delay);
     } else {
       AccessibilityInfo.setAccessibilityFocus(reactTag);
     }
   }
 };



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;iOS doesn’t need the timeout workaround, but Android does, so delaying the focus via this custom function from accessibilityContext.tsx achieves the desired effect and is unobtrusive from a UX perspective. &lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Creating an accessible app can be difficult, but doing so opens up your business to a broader audience.  Accessibility is like every other dimension of development–imperfect, but with some familiarity with the tools available and a little ingenuity, creating a friendly UX for all users is possible. *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Yeti is an &lt;a href="https://www.yeti.co/iot-software-development"&gt;IoT application development company&lt;/a&gt;. If you'd like to learn more about what we do, be sure to take a look at our   extensive library of &lt;a href="https://www.yeti.co/iot-software-development"&gt;IoT software development&lt;/a&gt; content.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>webdev</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Iot Software Development: Building Scalable + Secure Solutions</title>
      <dc:creator>Yeti</dc:creator>
      <pubDate>Fri, 26 Apr 2024 00:40:06 +0000</pubDate>
      <link>https://forem.com/yetillc/iot-software-development-building-scalable-secure-solutions-an0</link>
      <guid>https://forem.com/yetillc/iot-software-development-building-scalable-secure-solutions-an0</guid>
      <description>&lt;p&gt;&lt;strong&gt;Crafting successful IoT applications requires more than technical expertise—it demands a nuanced understanding of the unique challenges and opportunities inherent in IoT development.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this dynamic landscape, where devices communicate seamlessly and data flows incessantly, navigating the complexities of &lt;a href="https://www.yeti.co/iot-software-development"&gt;IoT software development&lt;/a&gt; is no small feat. &lt;/p&gt;

&lt;p&gt;Whether you're a visionary entrepreneur with a groundbreaking idea or an established company seeking to harness the power of IoT, the journey to creating a successful application is filled with challenges. Join us as we explore the essential principles of designing, developing, and deploying scalable and secure IoT software solutions - from architectural considerations to data privacy measures, encryption techniques to compliance with industry standards and regulations, we'll uncover the foundational elements that drive innovation in the world of IoT. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Architectural Considerations:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Architectural considerations form the cornerstone of every successful IoT software solution. These decisions, made during the development phase, have profound impacts on the system's performance, scalability, and security. A well-designed architecture provides the foundation for a robust and resilient IoT application, capable of meeting the evolving needs of users and adapting to changing technological landscapes.&lt;/p&gt;

&lt;p&gt;One key principle of architectural design is &lt;strong&gt;modularity&lt;/strong&gt;. By breaking down the system into modular components, developers can achieve greater flexibility and adaptability. This modular approach allows for the independent development, testing, and deployment of individual components, streamlining the development process and facilitating easier maintenance and updates. Moreover, modular architectures enable seamless integration of new features and functionalities, ensuring that the IoT application remains agile and responsive to user needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scalability&lt;/strong&gt; is another critical consideration in IoT software development. As the number of connected devices and data volumes continues to grow, the architecture must be capable of scaling to accommodate increasing demands. Microservices-based architectures offer an elegant solution to scalability challenges by decomposing the application into small, independently deployable services. These services can be scaled horizontally to handle spikes in traffic and accommodate growing user bases, ensuring that the application remains responsive and performant even under heavy loads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Containerization&lt;/strong&gt; technologies such as Docker and Kubernetes further enhance scalability and deployment flexibility. By encapsulating applications and their dependencies into lightweight containers, developers can achieve consistent deployment across diverse environments, from development to production. Containers also facilitate resource isolation and efficient resource utilization, optimizing infrastructure costs and enhancing scalability.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Data Privacy Measures:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Given the substantial amounts of personal and sensitive information processed by IoT devices, ensuring data privacy is an absolutely crucial part of the development process. To safeguard user privacy and comply with stringent regulations, such as GDPR, CCPA, and HIPAA, implementing robust privacy measures is critical. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Encryption techniques&lt;/strong&gt; serve as the fundamental safeguard for data privacy in IoT applications, ensure data confidentiality and integrity, mitigating the risk of data breaches and unauthorized access. These include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transport Layer Security (TLS)&lt;/strong&gt;
Encrypts data during transmission, ensuring that it remains confidential and secure as it traverses networks.&lt;/li&gt;
&lt;li&gt;Advanced Encryption Standard (AES)
Encrypts data at rest, protecting it from unauthorized access and tampering.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In addition to encryption, &lt;strong&gt;data anonymization&lt;/strong&gt; techniques play a vital role in protecting user privacy. By removing personally identifiable information (PII) from datasets, anonymization techniques help mitigate privacy risks associated with data collection and processing. This anonymized data can still provide valuable insights for analysis and decision-making while preserving user anonymity and privacy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Granular access controls&lt;/strong&gt; further enhance data privacy by restricting access to sensitive information based on user roles and permissions. By implementing access control mechanisms, developers can ensure that only authorized individuals have access to specific data, reducing the risk of unauthorized disclosure or misuse. These access controls help organizations comply with regulatory requirements and demonstrate their commitment to protecting user privacy.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Encryption Techniques:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Encryption provides a critical layer of protection for the vast amounts of data transmitted and stored within IoT ecosystems. At every stage of it’s journey, data faces potential vulnerabilities that encryption helps to mitigate -  from generation by sensors to transmission across networks and storage in databases, un-encrypted data can easily find its way into the wrong hands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;End-to-end encryption&lt;/strong&gt; is particularly vital in IoT applications, as it ensures that data remains confidential and secure throughout its entire lifecycle. This means that data is encrypted at its source and remains encrypted as it traverses networks and storage systems, only being decrypted by authorized recipients. By employing end-to-end encryption, developers can safeguard sensitive information from interception and unauthorized access, preserving the integrity and confidentiality of the data.&lt;/p&gt;

&lt;p&gt;To achieve robust encryption in IoT systems, developers also utilize a variety of &lt;strong&gt;cryptographic techniques&lt;/strong&gt;. &lt;strong&gt;Public-key cryptography&lt;/strong&gt;, for instance, enables secure communication between devices by utilizing pairs of public and private keys to encrypt and decrypt data. &lt;strong&gt;Symmetric encryption algorithms,&lt;/strong&gt; on the other hand, use a single shared key for both encryption and decryption, offering fast and efficient data protection. &lt;/p&gt;

&lt;p&gt;By implementing encryption mechanisms effectively, a good IoT software development company   can fortify systems against a myriad of security threats, including unauthorized access, data interception, and tampering. This not only helps to protect sensitive information from malicious actors but also fosters trust among users, reassuring them that their data is being handled with the utmost care and security. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Compliance with Industry Standards and Regulations:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Compliance with industry standards and regulations is crucial in IoT software development - especially when it comes to ensuring security and privacy. Adhering to established standards and frameworks provides a solid foundation for building robust and trustworthy IoT solutions. &lt;/p&gt;

&lt;p&gt;Standards such a*&lt;em&gt;s ISO/IEC 27001 for information security management&lt;/em&gt;* and the &lt;strong&gt;NIST Cybersecurity Framework for risk management&lt;/strong&gt; offer comprehensive guidelines and best practices for safeguarding sensitive information and mitigating cybersecurity risks.&lt;/p&gt;

&lt;p&gt;Furthermore, compliance with regulations such as the &lt;strong&gt;General Data Protection Regulation (GDPR)&lt;/strong&gt; and the &lt;strong&gt;California Consumer Privacy Act (CCPA)&lt;/strong&gt; is essential for protecting user privacy and maintaining legal compliance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GDPR&lt;/strong&gt;, which applies to organizations processing personal data of EU citizens, mandates strict data protection measures and imposes significant penalties for non-compliance. Similarly, &lt;strong&gt;CCPA&lt;/strong&gt; grants California residents rights over their personal information, including the right to access, delete, and opt-out of the sale of their data. Ensuring compliance with these regulations not only helps to build trust with users but also avoids costly legal consequences and reputational damage.&lt;/p&gt;

&lt;p&gt;Staying abreast of evolving regulatory requirements and proactively addressing compliance concerns is a critical aspect of IoT software development. This requires continuous monitoring of regulatory changes and updates, as well as ongoing assessment and enhancement of security and privacy measures. &lt;/p&gt;

&lt;p&gt;Building scalable and secure IoT software solutions requires a comprehensive approach, encompassing architectural considerations, data privacy measures, encryption techniques, and compliance with industry standards and regulations. By adhering to these essential principles and integrating security and scalability into every phase of the development lifecycle, developers can create robust, resilient, and future-ready IoT solutions that empower businesses and enhance user experiences in an increasingly connected world.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're looking for an experienced &lt;a href="https://www.yeti.co/iot-software-development"&gt;IoT Application Development Company&lt;/a&gt; or if you have any questions about a project you're currently working on, we'd love to chat! And, if you're interested in learning more about the process of creating an IoT app, be sure to check out our free library of &lt;a href="https://www.yeti.co/iot-software-development"&gt;IoT Software Development&lt;/a&gt; resources.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>iot</category>
      <category>appconfig</category>
    </item>
    <item>
      <title>Navigating the Challenges of IoT Software Development: Strategies for Success</title>
      <dc:creator>Yeti</dc:creator>
      <pubDate>Thu, 25 Apr 2024 23:35:46 +0000</pubDate>
      <link>https://forem.com/yetillc/navigating-the-challenges-of-iot-software-development-strategies-for-success-17o1</link>
      <guid>https://forem.com/yetillc/navigating-the-challenges-of-iot-software-development-strategies-for-success-17o1</guid>
      <description>&lt;p&gt;&lt;strong&gt;Eager to propel your business into the age of connectivity? Ready to revolutionize your company's operations and enhance customer experience? If so, it sounds like you're poised to dive into the world of IoT software development!&lt;/strong&gt;&lt;br&gt;
‍&lt;br&gt;
As exciting as those first steps on your journey to connectivity may be, it can also feel especially challenging. &lt;a href="https://www.yeti.co/iot-software-development"&gt;IoT software development&lt;/a&gt; demands a specialized skill set, making it a unique challenge for both tech-savvy project managers and non-technical executives alike. Diving headlong into the intricacies of IoT  can indeed feel like venturing into uncharted waters.&lt;/p&gt;

&lt;p&gt;But fear not! We've written this guide to help you understand and navigate the most common challenges you’ll face during the IoT software development process. From safeguarding your data against cyber threats to ensuring seamless integration across  devices, this article delves into the top six hurdles you'll need to clear to create a successful IoT application - and the actionable strategies you'll need to overcome them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.yeti.co/blog/iot-software-development-explained"&gt;**New to the world of IoT Software Development? Take a look at "The Internet of Things and IoT Software Development Explained".&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6 IoT Software Development Challenges - and how to overcome them.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Security Vulnerabilities:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Given the interconnected nature of IoT and the looming threat of cyber attacks, ensuring security is of paramount concern during the IoT software development process. While the inherent interdependence and complexity of IoT systems make them incredibly valuable for many purposes, it also makes these systems lucrative targets for anyone seeking to exploit any vulnerabilities the system may have.&lt;/p&gt;

&lt;p&gt;From unauthorized access to data breaches and device tampering, the  risks of unsecured systems are manifold -  and can have far-reaching consequences for businesses and individuals alike. For this reason, it’s crucial to ensure that your development team is adopting a proactive approach to mitigating security risks including robust authentication mechanisms, robust encryption protocols and  secure coding practices, such as input validation and parameterized queries.&lt;/p&gt;

&lt;p&gt;Investing in robust security measures from the get-go is one of the most important challenges to overcome while building your IoT software - so ensure that your development team is capable of fortifying your system from a wide range of security vulnerabilities&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Interoperability Issues:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Given the diverse array of devices and protocols inherent in IoT software development, interoperability issues often pose a significant hurdle. Today, there are numerous manufacturers producing wide ranges of devices - each of which utilizing their own proprietary protocols and standards. This diversity makes  achieving seamless interoperability a significant challenge, and can lead to devices struggling to communicate effectively, integration bottlenecks and compatibility issues.&lt;/p&gt;

&lt;p&gt;To address these challenges, you’ll want to ensure that your development team is adopting open-source platforms that can provide a standardized foundation for IoT development. Open-source solutions offer flexibility and interoperability by providing a common framework that supports a wide range of devices and protocols.&lt;/p&gt;

&lt;p&gt;To streamline data exchange between devices, we recommend leveraging standardized communication protocols such as MQTT (Message Queuing Telemetry Transport) or CoAP (Constrained Application Protocol) - which offer lightweight, efficient communication mechanisms tailored for IoT environments, enabling devices to communicate reliably and efficiently.&lt;/p&gt;

&lt;p&gt;Middleware solutions can also play a vital role in facilitating interoperability, by acting as intermediaries between devices with disparate protocols. These middleware platforms provide translation services, protocol conversion, and message routing capabilities, allowing devices to communicate seamlessly despite their differences.&lt;/p&gt;

&lt;p&gt;Overall, ensuring that your development team is addressing interoperability issues is essential for building robust and scalable IoT systems that can realize their full potential in today's interconnected world.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Scalability Concerns:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As IoT deployments expand in scale and complexity, scalability concerns loom large. Unfortunately, traditional software architectures often buckle under the weight of surging data volumes and device counts, leading to performance degradation and resource bottlenecks. To successfully navigate this challenge, it’s important that your development team has the ability to devise solutions that can seamlessly scale alongside the growing demands of IoT ecosystems.&lt;/p&gt;

&lt;p&gt;To meet these scalability challenges, many teams are increasingly turning to cloud computing platforms as a solution, as cloud services offer the flexibility and elasticity needed to accommodate fluctuating workloads and scaling requirements. By leveraging cloud infrastructure, developers can dynamically allocate resources, scale computing power, and expand storage capacity as needed, without the constraints of on-premises hardware limitations.&lt;/p&gt;

&lt;p&gt;Distributed architectures are another avenue for addressing scalability concerns in IoT software development. By decentralizing computing tasks across a network of interconnected devices or servers, distributed systems can efficiently handle growing workloads and distribute processing tasks to where they are needed most. This approach enhances fault tolerance, improves system reliability, and enables seamless scalability as IoT deployments evolve.&lt;/p&gt;

&lt;p&gt;By embracing these scalable technologies and architectures, your team can future-proof your IoT solutions and ensure they can seamlessly adapt to the ever-expanding demands of the IoT landscape.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Device Management Complexities:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Managing a multitude of IoT devices dispersed across various locations presents a formidable logistical challenge, as the sheer scale and geographic distribution of these devices can make tasks such as provisioning, configuration, monitoring, and firmware updates incredibly complex. To navigate these challenges effectively, ensure that your IoT software development team implements streamlined processes and centralized control mechanisms to maintain oversight and ensure the smooth operation of IoT deployments.&lt;/p&gt;

&lt;p&gt;One approach to simplifying device management is the adoption of IoT device management platforms. These platforms offer a centralized hub for managing and monitoring IoT devices, providing developers with tools and functionalities to streamline administrative tasks. Equipped with remote management capabilities, development teams can remotely configure devices, troubleshoot issues, and perform updates without the need for physical access. Additionally, over-the-air (OTA) firmware updates enable developers to deploy software updates and patches seamlessly, ensuring devices remain up-to-date with the latest features and security enhancements.&lt;/p&gt;

&lt;p&gt;Device health monitoring tools also play a crucial role in maintaining optimal device performance and reliability, as they  continuously monitor device metrics such as connectivity status, battery life, and sensor readings, allowing you to identify and address potential issues proactively - before they escalate into critical failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Data Privacy Regulations:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The recent surge of IoT devices collecting vast troves of sensitive data underscores the critical importance of complying with stringent data privacy regulations like GDPR, CCPA, and HIPAA. Non-compliance not only exposes organizations to hefty fines but also jeopardizes their reputation and erodes customer trust. For development teams navigating this regulatory landscape, ensuring adherence to data privacy standards is non-negotiable.&lt;/p&gt;

&lt;p&gt;To safeguard sensitive data and maintain regulatory compliance, developers must implement robust data privacy measures throughout the IoT software development process. This includes employing encryption techniques to protect data both in transit and at rest, rendering it unreadable to unauthorized parties. Additionally, anonymization techniques can further enhance privacy by dissociating personal information from individual identities, minimizing the risk of data breaches and unauthorized access.&lt;/p&gt;

&lt;p&gt;Granular access controls play a pivotal role in restricting access to sensitive data, ensuring that only authorized individuals can view or manipulate it. By implementing role-based access controls and authentication mechanisms, developers can enforce strict access policies tailored to different user roles and permissions. Furthermore, transparent privacy policies and user consent mechanisms are indispensable for fostering trust and compliance. Clear communication regarding data collection practices, purposes, and rights empowers users to make informed decisions about their data, fostering transparency and accountability within the organization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Power Constraints and Energy Efficiency:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;‍Many IoT devices operate in resource-constrained environments with limited power sources, making energy efficiency a crucial consideration. Excessive power consumption can shorten device lifespan and increase operational costs.&lt;/p&gt;

&lt;p&gt;To address these power constraints effectively, be sure your development team is  adopting a multifaceted approach that encompasses hardware optimization, communication protocols, and energy harvesting technologies. Employing low-power hardware components reduces energy consumption without compromising device performance, prolonging battery life and minimizing the need for frequent recharging or replacement.&lt;/p&gt;

&lt;p&gt;Implementing efficient communication protocols further enhances energy efficiency by minimizing the amount of data transmitted and reducing power overhead. By prioritizing lightweight, energy-efficient protocols such as MQTT or CoAP, developers can optimize energy usage and extend device battery life.&lt;/p&gt;

&lt;p&gt;Incorporating power-saving features such as sleep modes and scheduling algorithms can further optimize energy usage by minimizing idle power consumption during periods of inactivity. By dynamically adjusting power states based on usage patterns and environmental conditions, developers can maximize energy efficiency and prolong device autonomy.&lt;/p&gt;

&lt;p&gt;With its promises of revolutionizing business operations and enhancing customer experiences, IoT technology is an exciting venture - though it comes with its fair share of challenge. To help ensure the success of your application, we recommend choosing an IoT software development company with a wide range of experience, and the ability to surmount the challenges specific to the IoT development process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're looking for an experienced &lt;a href="https://www.yeti.co/iot-software-development"&gt;IoT Software Development Company&lt;/a&gt; or if you have any questions about a project you're currently working on, we'd love to chat! And, if you're interested in learning more about the process of creating an IoT app, be sure to check out our free library of free &lt;a href="https://www.yeti.co/iot-software-development"&gt;IoT Software Development resources&lt;/a&gt;!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>iot</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Cross-Domain Product Analytics with PostHog</title>
      <dc:creator>Yeti</dc:creator>
      <pubDate>Fri, 08 Mar 2024 00:14:53 +0000</pubDate>
      <link>https://forem.com/yetillc/cross-domain-product-analytics-with-posthog-4g7g</link>
      <guid>https://forem.com/yetillc/cross-domain-product-analytics-with-posthog-4g7g</guid>
      <description>&lt;p&gt;The following is an excerpt from our recent blog article, "Cross-Domain Product Analytics with PostHog". &lt;a href="https://www.yeti.co/blog/cross-domain-product-analytics-with-posthog"&gt;If you'd like to read the comprehensive article, you can do so here&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product analytics play a vital role in gauging the effectiveness of marketing strategies.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They provide clear insights into the impact of marketing initiatives on user engagement and behavior within an app or website. By tracking and analyzing data related to user navigation patterns, interactions, and sign-ups, companies gain concrete, evidence-based understanding of their products. This allows stakeholders to accurately assess the success of their marketing efforts, identify which campaigns are fostering meaningful user actions and how the product is funneling users. Unfortunately there are also a larger number of challenges, including ad blockers, difficult UIs and, as is the focus of this article, cross-domain tracking.&lt;/p&gt;

&lt;p&gt;Luckily there are a suite of tools available to help companies gain these insights and avoid the difficulties. At Yeti, we have recently been working with PostHog to provide a low-effort, cost-effective, and flexible service which can help with some unique difficulties, namely getting data when an experience or user-flow crosses over to platforms with a different domain. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.yeti.co/blog/cross-domain-product-analytics-with-posthog"&gt;Read the full article here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yeti is an &lt;a href="https://www.yeti.co/about"&gt;IoT application development company&lt;/a&gt;. If you'd like to learn more about what we do, be sure to take a look at &lt;a href="https://www.yeti.co/work"&gt;our work page&lt;/a&gt; featuring insightful case studies showcasing our collaborations with renowned clients such as Google, Netflix, Westfield, and many others. For more insightful content, don't miss the Yeti blog and our extensive library of &lt;a href="https://www.yeti.co/iot-software-development"&gt;IoT software development&lt;/a&gt; content.&lt;/p&gt;

</description>
      <category>posthog</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>coding</category>
    </item>
    <item>
      <title>The Symbolicon: My Journey to an Ineffective 10-key Keyboard</title>
      <dc:creator>Yeti</dc:creator>
      <pubDate>Thu, 07 Mar 2024 23:33:08 +0000</pubDate>
      <link>https://forem.com/yetillc/the-symbolicon-my-journey-to-an-ineffective-10-key-keyboard-aib</link>
      <guid>https://forem.com/yetillc/the-symbolicon-my-journey-to-an-ineffective-10-key-keyboard-aib</guid>
      <description>&lt;p&gt;&lt;strong&gt;This article is a brief overview of a recent talk given by Jonny Shult. To learn more and take a deeper dive into the Symbolicon, be sure to check out the video below!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/gjln109QuVo"&gt;
&lt;/iframe&gt;
.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As a weekend project, I decided to delve into the intricacies of keyboard design - seeking to enhance the typing experience in ways that conventional keyboards had not explored.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The idea behind Symbolicon stemmed from a simple yet profound question: How can we reimagine the standard keyboard to enhance the typing experience? This exploration led me to consider unconventional inspirations, ultimately settling on the Braille alphabet.&lt;/p&gt;

&lt;p&gt;While the Braille alphabet is designed for tactile reading, translating it into an efficient keyboard input posed a unique challenge. Despite my unfamiliarity with Braille, I embarked on the task of creating an ergonomic Braille alphabet specifically tailored for keyboard usage. The result was a thoughtful design that opened up new possibilities for accessibility and efficiency.&lt;/p&gt;

&lt;p&gt;Crafting an ergonomic keyboard is a delicate blend of art and science. Through a process of trial and error, I developed a set of criteria to guide the design. From single key presses to mirroring fingers, each criterion aimed to enhance the user experience, resulting in a meticulously crafted keyboard that prioritizes both efficiency and user comfort.&lt;/p&gt;

&lt;p&gt;The Symbolicon keyboard materialized through a Korn five-column keyboard kit. Assembling the 36 keys and a microcontroller unit required a bit of soldering, and the choice of ZMK firmware for programming, along with the Zephyr real-time operating system, ensured a deterministic environment crucial for optimal performance.&lt;/p&gt;

&lt;p&gt;Symbolicon isn't just a keyboard; it's an entire universe of layers designed to cater to diverse typing needs. The alphabet layer, symbol layer, navigation layer, and numbers layer seamlessly integrate to offer a versatile typing experience. From efficient code typing to swift navigation, Symbolicon adapts to user demands with the switch of a layer.&lt;/p&gt;

&lt;p&gt;Symbolicon transcends traditional setups, offering potential applications in the mobile realm. Envision handheld devices or finger rings equipped with technology capable of deciphering muscle contractions for typing. This opens up exciting possibilities for virtual workspaces and mobile applications.&lt;/p&gt;

&lt;p&gt;As with any innovation, the Symbolicon keyboard comes with its set of challenges. Switching between layers demands a learning curve, and the firmware logic is a work in progress. Yet, the satisfaction derived from typing on this ergonomic marvel is unparalleled. While my typing speed may not have skyrocketed yet, the journey has just begun.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Future of Symbolicon&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While Symbolicon might not replace my daily driver just yet, its potential to revolutionize typing experiences is undeniable. As I aim to improve my typing speed and explore the intricacies of the keyboard, I invite fellow enthusiasts to join me on this journey of innovation and discovery.&lt;/p&gt;

&lt;p&gt;In conclusion, the Symbolicon keyboard represents a fusion of creativity, ergonomic design, and technological ingenuity. As we navigate the evolving landscape of input devices, Symbolicon stands as a testament to the power of reimagining the familiar for a more efficient and enjoyable typing experience. Stay tuned for more updates, and let's continue to push the boundaries of what's possible in the world of keyboards!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yeti is an &lt;a href="https://www.yeti.co/about"&gt;IoT application development company&lt;/a&gt;. If you'd like to learn more about what we do, be sure to &lt;a href="https://www.yeti.co/work"&gt;take a look at our work page&lt;/a&gt; featuring insightful case studies showcasing our collaborations with renowned clients such as Google, Netflix, Westfield, and many others. For more insightful content, don't miss the Yeti blog and our extensive library of &lt;a href="https://www.yeti.co/iot-software-development"&gt;IoT software development&lt;/a&gt; content.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>keyboard</category>
    </item>
    <item>
      <title>Navigating Neural Networks</title>
      <dc:creator>Yeti</dc:creator>
      <pubDate>Thu, 07 Mar 2024 23:05:53 +0000</pubDate>
      <link>https://forem.com/yetillc/navigating-neural-networks-4g8b</link>
      <guid>https://forem.com/yetillc/navigating-neural-networks-4g8b</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/sEjD2vvGjAM"&gt;
&lt;/iframe&gt;
.&lt;/p&gt;

&lt;p&gt;James McNamara recently gave t[his insightful talk on navigating the intricate world of neural networks, deep learning, and artificial intelligence - which you can watch above, or at the link below &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.yeti.co/blog/navigating-neural-networks"&gt;This discussion provides a comprehensive overview of neural networks and deep learning, exploring their evolution, fundamental concepts, and applications.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Throughout this talk, James, delves into various aspects of neural network architectures, discussing their relevance in image recognition, natural language processing (NLP), and coding assistance, and covers essential topics such as Convolutional Neural Networks (CNNs), Recurrent Neural Networks (RNNs), and the breakthroughs achieved with word embeddings, particularly through the example of Word2Vec.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here's an outline of everything covered in the video:&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Outline: An Introduction to Neural Networks
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;I. Introduction to Neural Networks and Deep Learning:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Brief introduction to neural networks and deep learning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Overview of the history and evolution of neural networks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Explanation of the fundamental building blocks of neural networks.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;II. Basics of Neural Networks:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Overview of the structure and components of neural networks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Introduction to neurons, layers, weights, biases, and activation functions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Explanation of feedforward and back propagation processes in training neural networks.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;III. Image Recognition and Convolutional Neural Networks (CNNs):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Introduction to image recognition as a neural network application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Overview of Convolutional Neural Networks (CNNs) for image processing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Explanation of convolutional layers and pooling layers in CNNs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;IV. Natural Language Processing (NLP) and Recurrent Neural Networks (RNNs):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Introduction to Natural Language Processing (NLP) and its challenges.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Overview of Recurrent Neural Networks (RNNs) for sequential data processing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Explanation of the vanishing gradient problem in training RNNs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;V. Encoding Text as Numbers and Word Embeddings:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Addressing challenges in encoding text as numbers for neural networks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Discussion on the locality of images vs. text.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Issues with one-hot encoding for representing text.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Introduction to Word2Vec and embeddings for efficient text representation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Explanation of embeddings as semantic representations of words.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Demonstrating the breakthrough in learning meaningful semantics through embeddings.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;VI. Transformers and Self-Attention Mechanism:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Introduction to transformers as an innovation for handling large text collections.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Overview of the self-attention mechanism in transformers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Discussion on handling long-range dependencies in human language.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;VII. Application of Generative AI in Coding:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Brief mention of OpenAI's Codex and Sourcegraph's use of generative AI for coding assistance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Challenges in using generative AI for coding tasks, especially in large codebases.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;VIII. Future Outlook and Optimism:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IX. Audience Questions and Clarifications:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yeti is an &lt;a href="https://www.yeti.co/about"&gt;IoT application development company&lt;/a&gt;. If you'd like to learn more about what we do, be sure to take a look at &lt;a href="https://www.yeti.co/work"&gt;our work page&lt;/a&gt; featuring insightful case studies showcasing our collaborations with renowned clients such as Google, Netflix, Westfield, and many others. For more insightful content, don't miss the Yeti blog and our extensive library of &lt;a href="https://www.yeti.co/iot-software-development"&gt;IoT software development &lt;/a&gt;content.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>neural</category>
      <category>coding</category>
      <category>deeplearning</category>
    </item>
    <item>
      <title>Unlocking the Power of Chat GPT: A Developer's Guide to Streamlining Workflows and Boosting Productivity</title>
      <dc:creator>Yeti</dc:creator>
      <pubDate>Wed, 14 Feb 2024 23:05:32 +0000</pubDate>
      <link>https://forem.com/yetillc/unlocking-the-power-of-chat-gpt-a-developers-guide-to-streamlining-workflows-and-boosting-productivity-b3h</link>
      <guid>https://forem.com/yetillc/unlocking-the-power-of-chat-gpt-a-developers-guide-to-streamlining-workflows-and-boosting-productivity-b3h</guid>
      <description>&lt;p&gt;Hi all! We recently had software engineer James Feore give a talk on how he has improved his processes through AI, ChatGPT and Co-Pilot. &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/S6QqOBCEvoQ"&gt;
&lt;/iframe&gt;
.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Below you'll find a brief re-cap of the video. *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Greetings fellow developers! Today, we're excited to take you on a journey into the  world of Chat GPT and its transformative impact on software development. Strap in, because we're about to explore the ins and outs of this incredible tool that's changing the way we approach coding and problem-solving.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Embracing the Power of Chat GPT&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine a tool that not only understands your coding challenges but also assists you in generating solutions swiftly. That's the promise of Chat GPT, an advanced language model that has become my go-to companion in the development process. Whether you're a seasoned coder or just dipping your toes into the programming pool, Chat GPT is here to simplify and supercharge your workflow.In James' Feore's talk, he dissects the transformative impact that ChatGPT has had on the software development process; highlighting the multitude of ways it can be used to streamline any developers workflows - from generating code snippets and providing insightful solutions, to helping answer complex queries with actionable responses. It's more than just a sidekick; it's a reliable partner for developers across a spectrum of projects.&lt;/p&gt;

&lt;p&gt;Throughout his talk, James takes a comprehensive deep dive into how you can use ChatGPT for: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Debugging‍‍&lt;/li&gt;
&lt;li&gt;Learning new libraries‍‍&lt;/li&gt;
&lt;li&gt;Walking through new codebases‍‍&lt;/li&gt;
&lt;li&gt;Architecture questions + decisions‍‍&lt;/li&gt;
&lt;li&gt;Technical Writing‍‍&lt;/li&gt;
&lt;li&gt;and much more!!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The integration of Chat GPT into software development marks a paradigm shift. As we embrace this AI-powered tool, we're on the cusp of increased efficiency, accelerated project timelines, and a redefined role for engineers. Don't miss this opportunity to streamline your workflows and boost productivity with the assistance of your new partner,ChatGPT! &lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yeti is an &lt;a href="https://www.yeti.co/about"&gt;IoT application development company&lt;/a&gt; with over a decades worth of experience building meaningful digital products. If you're beginning your app development journey, and are looking for an experienced parter, we'd love to talk. Feel free to send a message our way and we'll get back to you ASAP!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>chatgpt</category>
      <category>githubcopilot</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Introducing Yurt: A CLI Tool for Rapid Codebase Setup</title>
      <dc:creator>Yeti</dc:creator>
      <pubDate>Tue, 30 Jan 2024 02:07:23 +0000</pubDate>
      <link>https://forem.com/yetillc/introducing-yurt-a-cli-tool-for-rapid-codebase-setup-4i6k</link>
      <guid>https://forem.com/yetillc/introducing-yurt-a-cli-tool-for-rapid-codebase-setup-4i6k</guid>
      <description>&lt;p&gt;Hi all! I wanted to share an internal tool that our team at Yeti ( an &lt;a href="https://www.yeti.co/iot-software-development"&gt;IoT software development&lt;/a&gt; company,) has developed, called Yurt. In a nutshell, Yurt is a command line application designed to streamline the process of setting up new code bases by incorporating our preferred preferences and patterns.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.loom.com/share/02f78229503949858e2a50fb3a7697a8?sid=612632c8-09b2-44ba-9458-a04fb3d648d4"&gt;I put together a loom video&lt;/a&gt; walking through the tool that covers:  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Initiating Yurt:&lt;/strong&gt; Yurt is kicked off by calling the start command, leading you through a series of questions to configure your code base.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration Options:&lt;/strong&gt; Yurt allows you to specify details like the repository name, the location in your file system, and the type of application you're creating. There are options for standalone React and backend applications or a React and Apollo GraphQL integrated setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automated Setup:&lt;/strong&gt; Yurt automates the process of creating the directory, copying templates, installing dependencies, setting up a local Docker file with a Postgres database, generating GraphQL types and schema, and committing the changes to Git.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Front-end and Back-end Integration:&lt;/strong&gt; The resulting code base includes a Git repository with front-end and back-end packages. You can easily run and test the React app and Apollo server locally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Yurt?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Efficiency:&lt;/strong&gt; Yurt is aimed at making developers more efficient by handling the initial 80% of setup, including essential configurations, libraries, and basic routing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open Source:&lt;/strong&gt; Yurt is open source on GitHub, inviting&lt;br&gt;
collaboration, feedback, and suggestions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Value:&lt;/strong&gt; The tool has already provided significant value at Yeti, enabling our developers to move quickly.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're interested in checking out Yurt, head over to GitHub. Feel free to explore, suggest changes, or even take it for a spin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.loom.com/share/02f78229503949858e2a50fb3a7697a8?sid=612632c8-09b2-44ba-9458-a04fb3d648d4"&gt;Watch the Video for a hands-on demonstration by Will.&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading and happy coding!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>cli</category>
      <category>codebase</category>
      <category>tools</category>
    </item>
  </channel>
</rss>
