<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: UppLabs</title>
    <description>The latest articles on DEV Community by UppLabs (@upplabs).</description>
    <link>https://dev.to/upplabs</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%2F560464%2Fb386f898-5712-4282-afba-4ffb3e1e03b4.jpg</url>
      <title>DEV Community: UppLabs</title>
      <link>https://dev.to/upplabs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/upplabs"/>
    <language>en</language>
    <item>
      <title>All you need to know about software development process</title>
      <dc:creator>UppLabs</dc:creator>
      <pubDate>Thu, 20 Jan 2022 15:15:54 +0000</pubDate>
      <link>https://dev.to/upplabs/all-you-need-to-know-about-software-development-process-ji6</link>
      <guid>https://dev.to/upplabs/all-you-need-to-know-about-software-development-process-ji6</guid>
      <description>&lt;p&gt;Recently in our blog we published an article about the &lt;a href="https://upplabs.com/blog/software-development-roadmap-in-detail/"&gt;software development roadmap in detail&lt;/a&gt; where we described the connections between different processes and the whole work of IT infrastructure. Here we will outline the main points and help you understand the estimation of time and resources necessary for each process. &lt;/p&gt;

&lt;h2&gt;
  
  
  Software development stages
&lt;/h2&gt;

&lt;p&gt;Before you start a project, you need to define your &lt;a href="https://upplabs.com/blog/how-to-prepare-the-documentation-for-successful-software-project-development/"&gt;documentation types&lt;/a&gt;, necessary for the team and the client. Each process and stage require its accompanying documentation. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The stages include:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analysis and Planning;&lt;/li&gt;
&lt;li&gt;Design;&lt;/li&gt;
&lt;li&gt;Backend development;&lt;/li&gt;
&lt;li&gt;Frontend development;&lt;/li&gt;
&lt;li&gt;Quality Assurance and testing;&lt;/li&gt;
&lt;li&gt;Intermediate deliveries;&lt;/li&gt;
&lt;li&gt;Documentation;&lt;/li&gt;
&lt;li&gt;Maintenance and &lt;a href="https://upplabs.com/blog/software-development-roadmap-in-detail/"&gt;others&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hP-sj48H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/14wh42ju1ncazkqfzgj7.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hP-sj48H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/14wh42ju1ncazkqfzgj7.jpeg" alt="Image description" width="880" height="389"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Life cycle of the development process&lt;/strong&gt;&lt;br&gt;
There are several reliable &lt;a href="https://upplabs.com/blog/how-to-build-a-software-product-everybody-would-like-to-use/"&gt;software development lifecycle models&lt;/a&gt; you can use for your project depending on your target audience, market, and business requirements. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WrM8oRvu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4ys2q88az1y4astsfd8x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WrM8oRvu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4ys2q88az1y4astsfd8x.png" alt="Image description" width="880" height="545"&gt;&lt;/a&gt;&lt;br&gt;
In our article, we pay attention to such types of &lt;a href="https://upplabs.com/blog/software-development-roadmap-in-detail/"&gt;SDLC or software development methodologies&lt;/a&gt; like: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Waterfall Model&lt;/li&gt;
&lt;li&gt;V-Shaped Model&lt;/li&gt;
&lt;li&gt;Iterative Model&lt;/li&gt;
&lt;li&gt;Spiral Model&lt;/li&gt;
&lt;li&gt;Big Bang Model&lt;/li&gt;
&lt;li&gt;Agile Model&lt;/li&gt;
&lt;li&gt;Prototyping Model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We describe every model-specific development process and write about the types of businesses and projects for every model.&lt;/p&gt;

&lt;p&gt;Btw, you can &lt;a href="https://share.hsforms.com/1Xhdur72eRKqJA40Y8SYVpw45lzw"&gt;Download the SDLC comparison table&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Development of documentation&lt;/strong&gt;&lt;br&gt;
Each stage of the process requires specific documentation that will describe the software requirements, design process, quality and security requirements, technical description, and &lt;a href="https://upplabs.com/blog/software-development-roadmap-in-detail/"&gt;others&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;The list of typical development documents include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Development analysis;&lt;/li&gt;
&lt;li&gt;Requirements specifications;&lt;/li&gt;
&lt;li&gt;Functionality specifications;&lt;/li&gt;
&lt;li&gt;User Experience design specifications;&lt;/li&gt;
&lt;li&gt;Development plans;&lt;/li&gt;
&lt;li&gt;Quality assurance plans, &lt;a href="https://upplabs.com/blog/software-development-roadmap-in-detail/"&gt;etc&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is a &lt;a href="https://share.hsforms.com/13fIg2310RM6v5jLBI8d5OA45lzw"&gt;software development cheat sheet you can download&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product documentation&lt;/strong&gt;&lt;br&gt;
Every project needs product requirement documentation that describes the specific product and its final presentation. It can be one document or a list of &lt;a href="https://upplabs.com/blog/software-development-roadmap-in-detail/"&gt;various detailed requirements&lt;/a&gt; or diagrams. &lt;/p&gt;

&lt;p&gt;The requirements are usually functional and non-functional and require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a project’s purpose, goal, terms;&lt;/li&gt;
&lt;li&gt;general description, functionality, framework, restrictions;&lt;/li&gt;
&lt;li&gt;specific requirements, speed, security, intellectual property. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mJj29hY7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mzmz2wf5uf9olqsnlveo.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mJj29hY7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mzmz2wf5uf9olqsnlveo.jpeg" alt="Image description" width="880" height="389"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Different categories of requirements&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://upplabs.com/blog/how-to-control-the-quality-of-your-software-product/"&gt;quality of software products&lt;/a&gt; divides into two major categories – functional and non-functional requirements. You can read more on how to &lt;a href="https://upplabs.com/blog/the-importance-of-functional-and-non-functional-requirements-in-software-development/"&gt;differentiate between them&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6SMHMiwn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x9qyukcemm28xb59t2xn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6SMHMiwn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x9qyukcemm28xb59t2xn.png" alt="Image description" width="815" height="595"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;UX Design documentation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The UX design stage needs to be documented specifically carefully as it includes various stages, research, diagrams, analysis, prototyping, usability testing, and &lt;a href="https://upplabs.com/blog/software-development-roadmap-in-detail/"&gt;other stages&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It usually includes such a list of documents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wireframes &lt;/li&gt;
&lt;li&gt;Mockups &lt;/li&gt;
&lt;li&gt;Prototype&lt;/li&gt;
&lt;li&gt;Site maps&lt;/li&gt;
&lt;li&gt;User flow schemes/user journeys&lt;/li&gt;
&lt;li&gt;Usability testing reports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;QA Documentation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Software &lt;a href="https://upplabs.com/services/quality-engineering-testing/"&gt;Quality Assurance&lt;/a&gt; (SQA) documentation include the requirements of QA and usually offer such plans as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The test strategy&lt;/li&gt;
&lt;li&gt;The quality management plan&lt;/li&gt;
&lt;li&gt;The test plan&lt;/li&gt;
&lt;li&gt;The test case specification&lt;/li&gt;
&lt;li&gt;The test checklist, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Tdz8kYFX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lppkqc7t9blgmdk0zmke.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Tdz8kYFX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lppkqc7t9blgmdk0zmke.png" alt="Image description" width="694" height="402"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Quality measures specification&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To measure the quality, you need to understand which &lt;a href="https://upplabs.com/blog/how-to-control-the-quality-of-your-software-product/"&gt;quality metrics&lt;/a&gt; to choose. There can be types like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open/Closed Bugs &lt;/li&gt;
&lt;li&gt;Reopened/Closed Bugs &lt;/li&gt;
&lt;li&gt;Rejected/Opened Bugs &lt;/li&gt;
&lt;li&gt;Bugs by Severity&lt;/li&gt;
&lt;li&gt;Bugs by Priority and others&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Documentation for users&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every product is made for users who need to estimate the product’s quality later. For this, there should be detailed information about the type of maintenance and instructions that provide following information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start guide of the product&lt;/li&gt;
&lt;li&gt;Instructions on software installation &lt;/li&gt;
&lt;li&gt;The troubleshooting guide&lt;/li&gt;
&lt;li&gt;Video tutorials&lt;/li&gt;
&lt;li&gt;FAQs&lt;/li&gt;
&lt;li&gt;Support Portals&lt;/li&gt;
&lt;li&gt;Functionality Description &lt;a href="https://upplabs.com/blog/software-development-roadmap-in-detail/"&gt;etc&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Digital Metrics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Among the tools UppLabs can recommend for measuring products’ performance are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Analytics&lt;/li&gt;
&lt;li&gt;Matomo&lt;/li&gt;
&lt;li&gt;Woopra&lt;/li&gt;
&lt;li&gt;Mixpanel&lt;/li&gt;
&lt;li&gt;StatCounter&lt;/li&gt;
&lt;li&gt;Hotjar&lt;/li&gt;
&lt;li&gt;Kissmetrics and others&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The detailed roadmap and documentation that covers all software development stages can ensure your product success and smooth project implementation. You can read more about &lt;a href="https://upplabs.com/blog/software-development-roadmap-in-detail/"&gt;software development roadmap&lt;/a&gt; in our blog.&lt;/p&gt;

</description>
      <category>methodologies</category>
      <category>programming</category>
      <category>webdev</category>
      <category>roadmap</category>
    </item>
    <item>
      <title>How to control the quality of your software product?</title>
      <dc:creator>UppLabs</dc:creator>
      <pubDate>Wed, 09 Jun 2021 12:48:10 +0000</pubDate>
      <link>https://dev.to/upplabs/how-to-control-the-quality-of-your-software-product-425m</link>
      <guid>https://dev.to/upplabs/how-to-control-the-quality-of-your-software-product-425m</guid>
      <description>&lt;p&gt;How to control the quality of your software product? Quality is one of the most important features that applies not only to the product but to every stage of its delivery. If you want to create a successful product, you have to be professional in everything you do. Testing the software product is an important part of development, because even minor errors can affect the effectiveness and success of a whole project. &lt;/p&gt;

&lt;p&gt;Poor quality assurance can lead to the main causes of software startup failures, so the purpose of executing quality assurance tests is to avoid the delivery of poor quality products. In this article, we are going to share with you our ideas for quality measurements.&lt;/p&gt;

&lt;h3&gt;
  
  
  QUALITY CHARACTERISTICS
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Functionality&lt;/strong&gt; – is determined by the ability of the software to solve problems that correspond to the fixed and anticipated needs of the user under the given conditions of software. Ths characteristic ensures that the software operates correctly and accurately, is interoperable, meets industry standards, and is protected from unauthorized access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability&lt;/strong&gt; – the ability of software to perform the required tasks under specified conditions for a specified period of time or a specified number of operations. The attributes of this characteristic are the completeness and integrity of the entire system, the ability to independently and correctly recover from operational failures, and resiliency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usability&lt;/strong&gt; is the user’s ability to easily understand, study, use the software.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficiency&lt;/strong&gt; is the ability of the software to provide the required level of performance in accordance with the allocated resources, time and other specified conditions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability&lt;/strong&gt; provides the ease to analyze and test the software, change and fix defects, meet the new requirements, facilitate further maintenance, and to adapt to the existing environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portability&lt;/strong&gt; characterizes software in terms of ease of portability from one environment (software/hardware) to another.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  QUALITY MEASUREMENTS
&lt;/h3&gt;

&lt;p&gt;The introduction and use of metrics is essential for improving control over the development process, and in particular over the testing process. If we choose the Bug/Defect Metrics, there are following types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open/Closed Bugs (the ratio of the number of open bugs to closed (corrected and rechecked)&lt;/li&gt;
&lt;li&gt;Reopened/Closed Bugs (the ratio of the number of reopened bugs to closed (fixed and rechecked)&lt;/li&gt;
&lt;li&gt;Rejected/Opened Bugs (the ratio of the number of rejected bugs to open)&lt;/li&gt;
&lt;li&gt;Bugs by Severity&lt;/li&gt;
&lt;li&gt;Bugs by Priority&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before delivering a software product, we need to measure its quality to ensure that it is bug-free. The bugs need to be reported per month on all possible environments (Staging, Development, Production) in components. The goal is to minimize the number of bugs on the production on a monthly basis reviews. In case of bugs, the QA needs to meet and find out the reason to fix the problems. The team can use the Jira tool and create the dashboard gadget “Filter Results.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0b8t4yg1e4pmh7p5a4iw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0b8t4yg1e4pmh7p5a4iw.png" alt="QA: Bugs reported on staging"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The bugs can be reported per feature or epic. The goal is to maximize the quality of every feature/epic on the weekly basis. If needed, this can be followed by the discussion on the code quality lessons learned session with the development team and tech lead. &lt;/p&gt;

&lt;p&gt;The open or resolved bugs per sprint have the goal to minimize the number of open bugs and manage the backlog efficiently on a weekly basis. If needed, the team can discuss the code quality lessons learned session and create the Jira Dashboard gadget “Created vs. Resolved Chart.”&lt;/p&gt;

&lt;p&gt;Backlog Management Index (BMI) is used to manage the backlog of open and unresolved problems.&lt;/p&gt;

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

&lt;p&gt;If BMI is larger than 100, it means the backlog is reduced. If BMI is less than 100, then the backlog increased.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7tevtm01mre7gkyyiz2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7tevtm01mre7gkyyiz2.png" alt="Created vs Resolved Chart: OD bugs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The average time in status and average number of times in the status are used to identify bottlenecks and improve the development process on a daily basis. The team has to discuss the average time with the responsible for blocked items to unblock the team, so everyone can be updated of the process. For these purposes, we can use the Jira dashboard gadgets “Average Number of Times in Status” and “Average Time in Status.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4ib8aquvf60i2eo0ipw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4ib8aquvf60i2eo0ipw.jpeg" alt="Average Time in Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  QUALITY REQUIREMENTS
&lt;/h3&gt;

&lt;p&gt;Standards should be applied when writing test plans, specifications, user interfaces, documentation, training materials, and other products. A shared project’s vision can help ensure its quality. But along with the standards, it is necessary to determine the situations of their use and develop guidelines and requirements for adopting the standards to the needs of the team and the product, if necessary. Any standard you adopt should help you do your best job.&lt;/p&gt;

&lt;p&gt;Most of the requirements could be used directly from the technical reports and all of them had to for the project’s definitions. Bugs reported as a result of poor requirements have to minimize the number of bugs caused by poor requirements or the lack of them. The team usually can perform such reports per sprint after the demo. If needed, the PM has to outline action items with the team and feature owner to avoid poor/lack of requirements in the future.&lt;/p&gt;

&lt;h3&gt;
  
  
  PULL REQUEST
&lt;/h3&gt;

&lt;p&gt;The quality metric can give you an idea of the amount of time (usually in days) needed for the pull requests to be merged or closed. You can calculate the lead time of all repositories and get an understanding of the team dynamics.&lt;/p&gt;

&lt;p&gt;To get this number, it’s important to track every pull request and save the date and time for each pull request when it’s opened and it’s merged. For the quality measurement we need to calculate:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pull requests that did not pass the test suite&lt;/li&gt;
&lt;li&gt;Pull requests that broke the build&lt;/li&gt;
&lt;li&gt;The number of rejected and merged requests&lt;/li&gt;
&lt;li&gt;The number of pull requests comments&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  PREVENTATIVE MEASURES
&lt;/h3&gt;

&lt;p&gt;In a management review meeting, the quality manager gives valuation of the product’s quality.  The information should correspond to satisfaction surveys. In order to prevent a potential problem, the management team chooses the responsible parties to review code reviews and implement actions that will help to analyze the data. Among the preventative measure we can highlight:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Internal code reviews&lt;/em&gt;&lt;/strong&gt;
performed by one developer and Tech Lead on a daily basis, if there is a ready task. If needed, the responsible developer should provide code improvement. If it is a common issue, it should be discussed in the Lessons learned session. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Code quality lessons learned sessions&lt;/em&gt;&lt;/strong&gt;
to review the feedback in PRs per sprint to raise team awareness, improve code quality and avoid the same mistakes in future. If needed, the responsible developer should provide code improvements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Story opening sessions&lt;/em&gt;&lt;/strong&gt;
to confirm technical approach and prevent from rework in future performed by developers and Tech lead with the Client’s developers. If needed,the team should research the suitable solutions and review the areas for related components.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To analyse the preventative measures, we can use such trusted best practices, as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lessons Learned, Post Project Analysis – is one of the most powerful tools for proactive improving the quality of your work.&lt;/li&gt;
&lt;li&gt;The retrospective – is a separately allocated period of time in order to study the experience gained and ask yourself the following questions: “What worked for this product and how to do the same in the future?” and “What went wrong for this product and how to avoid this?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Despite the fact that retrospectives are classified as Best Practices, they are rarely used, because it is difficult to gather an entire team: retrospectives take place at the end of project development. Most of the team members are already working on other projects, and those who remain are busy releasing the project or supporting it.&lt;/p&gt;

&lt;p&gt;TYPES OF QUALITY ENGINEERING AND TESTING SERVICES WE PROVIDE IN UPPLABS&lt;/p&gt;

&lt;p&gt;We deal with quality engineering and testing processes covering all stages starting with test management and automation to such categories of testing software services as: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Technical Consulting&lt;/li&gt;
&lt;li&gt;Automation Testing&lt;/li&gt;
&lt;li&gt;Performance Testing&lt;/li&gt;
&lt;li&gt;Security QA&lt;/li&gt;
&lt;li&gt;Regression Testing&lt;/li&gt;
&lt;li&gt;Smoke Testing&lt;/li&gt;
&lt;li&gt;Functional Testing&lt;/li&gt;
&lt;li&gt;Automation Services for Web/Mobile Apps&lt;/li&gt;
&lt;li&gt;API Testing&lt;/li&gt;
&lt;li&gt;Integration and unit testing&lt;/li&gt;
&lt;li&gt;Review of product automation framework and process&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Thanks for reading! &lt;/p&gt;

</description>
      <category>qa</category>
      <category>testing</category>
      <category>pullrequest</category>
      <category>programming</category>
    </item>
    <item>
      <title>How asynchronous works in JavaScript. Event Loop concept</title>
      <dc:creator>UppLabs</dc:creator>
      <pubDate>Tue, 25 May 2021 15:52:34 +0000</pubDate>
      <link>https://dev.to/upplabs/how-asynchronous-works-in-javascript-event-loop-concept-1ddb</link>
      <guid>https://dev.to/upplabs/how-asynchronous-works-in-javascript-event-loop-concept-1ddb</guid>
      <description>&lt;p&gt;&lt;em&gt;Written by Kirill Bychkov for &lt;a href="https://upplabs.com/" rel="noopener noreferrer"&gt;UppLabs&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;JavaScript is easy when all you need is a simple working interface. The problems begin when the interface becomes more complex. Here you need to have a deeper understanding of JavaScript. It is important that even a large and &lt;a href="https://upplabs.com/services/web-and-mobile-app-development/" rel="noopener noreferrer"&gt;complex interface&lt;/a&gt; remains fast and responsive. Responsiveness is usually achieved through the use of asynchronous functions. This means that you can let your code do several things at the same time without stopping or blocking the main thread.&lt;/p&gt;

&lt;p&gt;In this article, I will try to tell you as simply as possible about the work of asynchronous in JavaScript. At all interviews in my life, I have been always asked this question. When you start learning JS, it can seem daunting but in reality, everything is much simpler. &lt;/p&gt;

&lt;h2&gt;
  
  
  How does the Event Loop work?
&lt;/h2&gt;

&lt;p&gt;Event Loop is one of those things that every JavaScript developer encounters in one way or another. JavaScript provides a concurrency model based on an event loop, which executes the code, collecting and processing events, and performs queued sub-tasks.&lt;/p&gt;

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

&lt;p&gt;I think it's not difficult to guess what sequence these logs will be called in. Let's check.&lt;/p&gt;

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

&lt;p&gt;But let's take a look at what's going on under the hood. In the example, I am using this &lt;a href="http://latentflip.com/" rel="noopener noreferrer"&gt;helpful site&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhs8spmlttew0hok9v0u.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhs8spmlttew0hok9v0u.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the program starts, it runs through the lines of code. When an asynchronous operation comes across, the interpreter throws this operation into a Call Stack. In the stack, it begins to look like a certain set timeout and as a browser API. Then it throws out the set timeout and registers some anonymous function in the web APIs, which will be executed when the browser completes the set timeout after 5000 seconds. Next, the anonymous function enters the callback queue. An endless loop runs in the queue, which runs over its elements, and if it detects that the function is ready, it throws it back into the call stack and executes.&lt;/p&gt;

&lt;p&gt;Thus, we do not block the work of the code. We are talking not only about set timeouts but also about other asynchronous operations, such as event listeners that work along with the server.&lt;/p&gt;

&lt;p&gt;But what happens if 0 is passed as the second parameter to the timeout set? Exactly the same. Let's see.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fziu1p9pmeulv5p21wrrh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fziu1p9pmeulv5p21wrrh.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The browser will still drop the function into the web API, and the program will continue to work.&lt;br&gt;
Let's also take a look at how the event listener works.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjw2r5244x6t2ox2pmhe0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjw2r5244x6t2ox2pmhe0.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The event listener, as mentioned above, is also an asynchronous event and goes to the web API. You now understand the importance of unsubscribing from listening to events. You can read more details &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Macro tasks
&lt;/h2&gt;

&lt;p&gt;Let's take the same event example and try to click the button a few times.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcb9iopo035zykvq6x2n2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcb9iopo035zykvq6x2n2.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We see a queue of events. This is the macro task callback queue, a v8 term. Tasks from the queue are executed according to the first-in-first-out rule.&lt;/p&gt;

&lt;h4&gt;
  
  
  Let's note two details:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Rendering of the page never happens during the execution of a task by the engine. It doesn't matter how long the task takes. Changes to the DOM are rendered only after the task is completed.&lt;/li&gt;
&lt;li&gt;If the task takes a very long time and the browser cannot perform other tasks or process user events. So, sometime later the browser offers you to "kill" the long-running task. This is possible when the script contains a lot of complex calculations or an error leading to an infinite loop.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Micro tasks
&lt;/h2&gt;

&lt;p&gt;We could see the micro tasks in the last example. When the macro task is executing, the functions from it are placed in the call stack. The new macro task does not start its execution until the micro tasks have finished there. If you need more examples, you can check &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusions
&lt;/h3&gt;

&lt;p&gt;Thanks to JavaScript, we can write asynchronous applications without thinking about multithreading like data integrity and data consistency.  If we are performing an operation that takes time, such as querying a database and using the results to fill the templates, it is better to push them out of the main thread and execute the task asynchronously. We compensate for these benefits with a huge number of callbacks, and constant loss of context. &lt;/p&gt;

&lt;p&gt;Depending on the specifics of the task, it may turn out that you will be using async/await, callbacks, or some mixture of different technologies. In fact, the answer to the question which asynchronous development methodology to choose depends on the specifics of the project. If a certain approach allows you to solve a problem using readable code that is easy to maintain and other team members can easily understand, then this approach is what you need!&lt;/p&gt;

&lt;p&gt;Now you can use callback, promises or async / await with understanding how it works in the browser :)&lt;/p&gt;

&lt;p&gt;I hope this article was helpful for you. You can also find more useful information on our &lt;a href="https://upplabs.com/upplabs-blog/" rel="noopener noreferrer"&gt;blog&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>How to generate a PDF document in a React Native project?</title>
      <dc:creator>UppLabs</dc:creator>
      <pubDate>Thu, 18 Feb 2021 13:02:53 +0000</pubDate>
      <link>https://dev.to/upplabs/how-to-generate-a-pdf-document-in-a-react-native-project-fi7</link>
      <guid>https://dev.to/upplabs/how-to-generate-a-pdf-document-in-a-react-native-project-fi7</guid>
      <description>&lt;p&gt;Originally, this post was published on &lt;a href="https://upplabs.com/how-to-generate-a-pdf-document-in-a-react-native-project/" rel="noopener noreferrer"&gt;UppLabs blog&lt;/a&gt; by Pavlo Ihnatiev.&lt;/p&gt;

&lt;p&gt;Not so long ago UppLabs was working on a &lt;a href="https://upplabs.com/upplabs-created-healthcare-app-for-preventing-hair-loss/" rel="noreferrer noopener"&gt;project&lt;/a&gt; which key functionalities included a PDF generation on mobile. In this material, we’ll share some tips on how to generate a PDF document using React Native. &lt;/p&gt;

&lt;h3&gt;Basics&lt;/h3&gt;

&lt;p&gt;The simplest way to create a PDF document in a React Native project includes the use of &lt;a href="https://docs.expo.io/versions/latest/sdk/print" rel="noreferrer noopener"&gt;Expo Print&lt;/a&gt; plugin.&lt;/p&gt;

&lt;p&gt;The first step is to write HTML with a sample of content that should be in our PDF. You can insert CSS styles, custom fonts, images, links, etc to your markup.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;const htmlContent = `
    &amp;lt;!DOCTYPE html&amp;gt;
    &amp;lt;html lang="en"&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset="UTF-8"&amp;gt;
        &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt;
        &amp;lt;title&amp;gt;Pdf Content&amp;lt;/title&amp;gt;
        &amp;lt;style&amp;gt;
            body {
                font-size: 16px;
                color: rgb(255, 196, 0);
            }

            h1 {
                text-align: center;
            }
        &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;h1&amp;gt;Hello, UppLabs!&amp;lt;/h1&amp;gt;
    &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
`;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then you should write function, that creates a PDF document with defined HTML markup:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import * as Print from 'expo-print';

const htmlContent = `
....
`;

const createPDF = async (html) =&amp;gt; {
    try {
        const { uri } = await Print.printToFileAsync({ html });
        return uri;
    } catch (err) {
        console.error(err);
    }
};&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Notice&lt;/strong&gt;: &lt;/p&gt;

&lt;p&gt;This function will create a PDF file and save it to the application cache folder. So if you want to replace or copy this file, you can use &lt;a href="https://docs.expo.io/versions/latest/sdk/filesystem" rel="noreferrer noopener"&gt;Expo Filesystem&lt;/a&gt;. If you want to save it to the Gallery on your device, you can use  &lt;a href="https://docs.expo.io/versions/latest/sdk/media-library" rel="noreferrer noopener"&gt;Expo MediaLibrary&lt;/a&gt; on Android platform and &lt;a href="https://docs.expo.io/versions/latest/sdk/sharing" rel="noreferrer noopener"&gt;Expo Sharing&lt;/a&gt; on IOS platform.&lt;/p&gt;

&lt;p&gt;Example of function, that allows you to create PDF and save it to Gallery:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import * as Print from "expo-print";
import * as MediaLibrary from "expo-media-library";
import * as Sharing from "expo-sharing";


....

const createAndSavePDF = async (html) =&amp;gt; {
  try {
    const { uri } = await Print.printToFileAsync({ html });
    if (Platform.OS === "ios") {
      await Sharing.shareAsync(uri);
    } else {
      const permission = await MediaLibrary.requestPermissionsAsync();

      if (permission.granted) {
        await MediaLibrary.createAssetAsync(uri);
      }
    }

  } catch (error) {
    console.error(error);
  }
};&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can use this functionality in your React Native components and that will be enough if you need to create a quick PDF document with simple content.&lt;/p&gt;

&lt;h2&gt;
&lt;strong&gt;Advanced cases&lt;/strong&gt; &lt;/h2&gt;








&lt;h3&gt;&lt;strong&gt;PDF page margin&lt;/strong&gt;&lt;/h3&gt;





&lt;p&gt;If you're using the function &lt;strong&gt;Print.printToFileAsync&lt;/strong&gt;, the resulting PDF document might contain page margins (it depends on WebView engine). They are set by &lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/page"&gt;@page&lt;/a&gt;&lt;/strong&gt; style block and you can override them in your HTML content  code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;style&amp;gt; 
   @page { margin: 20px; } 
&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;&lt;strong&gt;Avoiding breaking content&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;If you insert a few content sections in your HTML markup, it may not fit together on the same document page. In such cases, the content of the second section breaks, and part of it is placed on the next page of the document. But sometimes such an approach is unacceptable when you want to avoid breaking the content section.&lt;/p&gt;

&lt;p&gt;To control the breaking of some HTML elements you can use the &lt;a href="https://css-tricks.com/almanac/properties/b/break-inside/" rel="noreferrer noopener"&gt;“&lt;strong&gt;break-inside&lt;/strong&gt;”&lt;/a&gt; CSS property in your HTML slicing.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;section {
  break-inside: avoid;
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So, if two sections are not fit on the same page, the second section will be placed on the next page of the document without breaking.&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;Using fonts, images and other assets in PDF&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;You can use custom fonts, images, or other assets in your HTML without any troubles if it’s placed remotely. But if you want to use the image from React Native app assets, it may be a problem, because such images can’t be loaded to your document when your React Native app is built for production. In such cases, you should first copy the file from assets to your application’s cache directory. Unfortunately,  on the IOS platform, local files can’t be loaded to PDF as well, so you should convert the local file to &lt;strong&gt;base64&lt;/strong&gt; string. After that, you can use the URL of the copied file (on Android platform) or &lt;strong&gt;base64 &lt;/strong&gt;string (on IOS Platform) in your HTML markup.&lt;/p&gt;

&lt;p&gt;In such cases, you can use &lt;a href="https://docs.expo.io/versions/latest/sdk/asset/" rel="noreferrer noopener"&gt;Expo Asset&lt;/a&gt; and &lt;a href="https://docs.expo.io/versions/latest/sdk/imagemanipulator" rel="noreferrer noopener"&gt;Expo ImageManipulator&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Example of code, that copies an image from assets and converts it to &lt;strong&gt;base64 &lt;/strong&gt;for IOS platform before using it in a PDF document:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import { Platform } from "react-native";
import { Asset } from "expo-asset";
import * as ImageManipulator from "expo-image-manipulator";


....

const copyFromAssets = async (asset) =&amp;gt; {
  try {
    await Asset.loadAsync(asset);
    const { localUri } = Asset.fromModule(asset);

    return localUri;
  } catch (error) {
    console.log(error);
    throw err;
  }
};


const processLocalImageIOS = async (imageUri) =&amp;gt; {
  try {
    const uriParts = imageUri.split(".");
    const formatPart = uriParts[uriParts.length - 1];
    let format;

    if (formatPart.includes("png")) {
      format = "png";
    } else if (formatPart.includes("jpg") || formatPart.includes("jpeg")) {
      format = "jpeg";
    }

    const { base64 } = await ImageManipulator.manipulateAsync(
      imageUri,
      [],
      { format: format || "png", base64: true }
    );

    return `data:image/${format};base64,${base64}`;
  } catch (error) {
    console.log(error);
    throw error
  }
};

....

const htmlContent = async () =&amp;gt; {
    try {
        const asset = require('./assets/logo.png');
        let src = await copyFromAssets(asset);
        if(Platform.OS === 'ios') {
            src = await processLocalImageIOS(src);
        }

        return `&amp;lt;img src="${src}" alt="Logo" /&amp;gt;`
    } catch (error) {
        console.log(error);
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So after calling this code you can use the returned URL of the asset image in your PDF document.&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;Optimization of large images&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;If you want to place large images in your PDF document, you should optimize them before. It can greatly reduce the size of your PDF document. Optimizing the images is useful when you want to insert images that are made using the camera of your device. To optimize images you can use &lt;a href="https://docs.expo.io/versions/latest/sdk/imagemanipulator" rel="noreferrer noopener"&gt;Expo ImageManipulator&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notice&lt;/strong&gt;: This plugin works only with images placed locally on the device. You need to download the image first.&lt;/p&gt;

&lt;p&gt;Example of function, that optimizes large images:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import * as ImageManipulator from 'expo-image-manipulator';


....

const optimizeImage = async (imageUri) =&amp;gt; {
  try {
      const { uri } = await ImageManipulator.manipulateAsync(
        imageUri,
          [
              {
                  resize: {
                      width: 600,
                  },
              },
          ],
          { compress: 0.1 },
      );

      return uri;
  } catch (error) {
      console.log(error);
      return imageUri;
  }
};&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Check the example! &lt;/h3&gt;

&lt;p&gt;&lt;a href="https://expo.io/@upplabs/upplabs-pdf-example" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupplabs.com%2Fwp-content%2Fuploads%2F2020%2F06%2Fexpo-logo-1.png" alt="See the exmple of how UppLabs' app for creating PDF on mobile works"&gt;&lt;/a&gt;&lt;a href="https://expo.io/@upplabs/upplabs-pdf-example" rel="noreferrer noopener"&gt;&lt;/a&gt;&lt;a href="https://expo.io/@upplabs/upplabs-pdf-example" rel="noopener noreferrer"&gt;https://expo.io/@upplabs/upplabs-pdf-example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://snack.expo.io/@upplabs/upplabs-pdf-" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupplabs.com%2Fwp-content%2Fuploads%2F2020%2F06%2Fsnack-expo-upplabs-1.png" alt="See the example of how UppLabs' app for creating PDF on mobile works"&gt;&lt;/a&gt;&lt;a rel="noreferrer noopener" href="https://snack.expo.io/@upplabs/upplabs-pdf-"&gt;&lt;/a&gt;&lt;a href="https://snack.expo.io/@upplabs/upplabs-pdf-" rel="noopener noreferrer"&gt;https://snack.expo.io/@upplabs/upplabs-pdf-&lt;/a&gt;&lt;/p&gt;












&lt;a href="https://upplabs.com/portfolio/hairmax/" rel="noreferrer noopener"&gt;View the case study&lt;/a&gt;

&lt;p&gt;Thank you for reading!&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>mobile</category>
      <category>ios</category>
      <category>android</category>
    </item>
  </channel>
</rss>
