<?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: Nabil Kazi</title>
    <description>The latest articles on DEV Community by Nabil Kazi (@nqaze).</description>
    <link>https://dev.to/nqaze</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%2F174033%2Fc6fcb73e-13cc-41ec-ae3b-efc57bfcea5e.jpg</url>
      <title>DEV Community: Nabil Kazi</title>
      <link>https://dev.to/nqaze</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nqaze"/>
    <language>en</language>
    <item>
      <title>Mocking APIs while Development using Mockoon</title>
      <dc:creator>Nabil Kazi</dc:creator>
      <pubDate>Mon, 17 Feb 2020 17:19:54 +0000</pubDate>
      <link>https://dev.to/nqaze/the-api-dependency-conundrum-solved-35aj</link>
      <guid>https://dev.to/nqaze/the-api-dependency-conundrum-solved-35aj</guid>
      <description>&lt;p&gt;&lt;em&gt;This article was originally shared on &lt;a href="https://www.instamobile.io/mobile-development/the-api-dependency-conundrum-solved/"&gt;InstaMobile&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Are you a mobile app developer? Do you work in a team along with Web developers? Does your app depend on APIs provided by the Web team? Have you ever faced issues with the unavailability of APIs to develop or test a certain feature in your app? If your answer to all the above questions was yes, then this article is for you.&lt;/p&gt;

&lt;p&gt;Hello everyone, It’s been a while since I wrote my last article where I talked about easing off your App distribution process via Firebase App Distribution. You can find it &lt;a href="https://www.instamobile.io/mobile-development/firebase-app-distribution/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now let’s move to the topic which we would be discussing in this article. I would be touching in on a topic or rather we can call it as a difficulty which almost every mobile app developer regardless of the domain, be it Android, iOS or Hybrid faces when working with APIs. Let’s break this article into the 3 parts –&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The Problem&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Solution&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Solution - Demonstrated&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;So let’s begin…&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  The Problem
&lt;/h1&gt;

&lt;p&gt;While working in a fast-paced environment where everyone is rushing towards completing their tasks &amp;amp; features, we often encounter a dependency on web teams for providing us with APIs. It can be a certain feature like login or getting a list of items from the web to display them in List View or post something on the web, it can be anything.&lt;/p&gt;

&lt;p&gt;Let’s take an example of building a List-View which is powered by content from API. To implement List-Views, Recycler Views or Table Views, we need data to simulate and test our development. If the APIs are not ready by that time, we end up creating mock functions which returns an array and pass that as a data source to our views. While this may help you test your flow or views, below are some downsides of this approach –&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unnecessary Code&lt;/strong&gt; – Adds unnecessary code which we would have to clean up when connecting to actual APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incomplete Code&lt;/strong&gt; – We don’t write our actual Networking code: the API methods &amp;amp; functions that would be fetching us the data and hence a lot of code remains to be actually written when we are to connect with the actual APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incomplete features&lt;/strong&gt; – Since your features depend on the API and you just mocked it in your code to test, your actual feature implementation is incomplete and you would have to come back at a later stage to pick up where you left and start developing the remaining part again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2x Lost Effort&lt;/strong&gt; – Both the Android and iOS teams would have to do this in their respective codebases and hence when you look from a Lead’s perspective, the time lost is actually 2x.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  The Solution
&lt;/h1&gt;

&lt;p&gt;What if..? What If..? What If I told you there is a way to avoid all the above. A way wherein you can write all your networking code – the actual production level networking code in the app. A way wherein you can write your exact functions to fetch you the data from API. Write your entire API Models, DB Models exactly the way it should have been written. A way where you don’t have to write mock functions to get you the data.&lt;/p&gt;

&lt;p&gt;Yes! You heard it right, you can mock the APIs and this would not be in your app’s code-base. We would be utilising a 3rd party tool to create these APIs and provide us with the data and we would be doing it only once and the same can be accessed by both our Android and iOS teams.&lt;/p&gt;

&lt;p&gt;Now there are a lot of Mock API service providers, some are paid, some are free, maximum is online while some are offline apps. To name a few – Mockoon, Postman, Swagger, TestAPI, Mocky etc.&lt;/p&gt;

&lt;p&gt;I wouldn’t be comparing these services in this article, that would have to be a separate article in itself &amp;amp; I would like to know if you, the readers would be interested in that. For now, I’ll just use what I have been using for a while and really like – Mockoon. I’ll go ahead and demonstrate how easy it is to set up, create Endpoints, enter your response and start using them in your app.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Solution - Demonstrated
&lt;/h1&gt;

&lt;p&gt;The tool I would be using to demonstrate building your API and connecting it with your app is Mockoon. It is a free app available for all the platforms – Mac, Linux and Windows with unlimited Mocking. Also yes it ain’t an online web app so your data and API structure remains to yourself. That’s great right?&lt;/p&gt;

&lt;p&gt;So let’s begin by &lt;strong&gt;installing Mockoon&lt;/strong&gt; from &lt;a href="https://mockoon.com/"&gt;https://mockoon.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open the app and start creating your first mock API. I’ll be creating a sample Login API wherein I’ll set up both success and failure response for our login flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Creating your first Mock API :&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UKClX-cO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13706140/72914194-53ca1d00-3d64-11ea-9117-853c3e7951ce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UKClX-cO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13706140/72914194-53ca1d00-3d64-11ea-9117-853c3e7951ce.png" alt="https://user-images.githubusercontent.com/13706140/72914194-53ca1d00-3d64-11ea-9117-853c3e7951ce.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add your Environment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your Environment is your single Project. So if you are working on 2 different apps/projects, you would be creating a separate environment for that other project. &lt;/p&gt;

&lt;p&gt;In short : 1 Environment = 1 Project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add your Environment route&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is that part of URL which goes after your base URL and before your API Endpoint. Example: &lt;a href="https://www.sampleapp.com/"&gt;https://www.sampleapp.com/&lt;/a&gt;&lt;strong&gt;api/v1&lt;/strong&gt;/loginThe &lt;strong&gt;api/v1&lt;/strong&gt; would be your environment route over here. You can add a custom route to your base URL to keep your mock API structure as close to your actual API URLs. I usually keep it similar to our backend route structure so when I actually have to replace my mockoon API endpoint with our actual APIs, I just have to update the host URL.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add your API route&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is your actual API Endpoint. Examples of this would be &lt;strong&gt;/login, /movies&lt;/strong&gt; etc. Over here I would be creating an API endpoint named — &lt;strong&gt;login&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set your API method&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This would be your API method — &lt;strong&gt;GET, POST, PUT, DELETE.&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add your header&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can add custom headers for your API. The most common is setting the content type for the response. It can easily be set by clicking on &lt;strong&gt;Headers -&amp;gt; Add Header -&amp;gt; Add Header Name (Eg. Content-Type) -&amp;gt; Set Value (Eg. application/json)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add your response&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Type your response JSON here that you would want to return from the API. I am returning a sample Login Success Response with a User object and Access Token. This can also be an array of JSON objects if the API is, for example, GET/Movies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Start Mockoon server to access your API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All that remains is to start your server and start hitting the APIs and accessing the response. To quickly test if my API works and returns the intended response, I'll change the API method from POST to GET and try accessing it from the browser. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZrMOh2_2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13706140/72914536-d5ba4600-3d64-11ea-9ffe-81e8cb45bc80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZrMOh2_2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13706140/72914536-d5ba4600-3d64-11ea-9ffe-81e8cb45bc80.png" alt="A05I02"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;VOILA! It worked!&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Now I’ll change it back to POST to connect this with my App and start working. &lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: For this API to be accessible from your mobile app while developing/testing, your Mockoon server and your mobile should be connected to the same network. I had connected both my Macbook and iPhone to the same WiFi network to make this work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But wait! &lt;strong&gt;What about testing your error workflow?&lt;/strong&gt; How can you test your error conditions and validate your UIs for certain workflows when your API fails? What happens when your Login fails? What happens when your GET API returns an empty array? You definitely would have to handle those scenarios in-app and there would be appropriate UIs &amp;amp; functionalities developed to handle the same. Thanks to Mockoon’s latest update (v1.5.0 at the time of writing this article) we can now add rules to API routes and return different responses for the same API endpoint. How cool is that??&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Setting Rules in your API :&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Let's add a rule to this same API wherein if I send &lt;strong&gt;password = demo&lt;/strong&gt; in my POST request, it will return an HTTPS Status - 401 (Unauthorized Access) response.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Although it would have been better had Mockoon provided an option to change the operator in Rule from “=” to “!=” or “&amp;gt;” or “&amp;lt;”. That would have added more power to rules and also made it more closer to actual scenarios. I could have set my success response only if username=demo &amp;amp; password=demo else return 401-Unauthorized Access. But for now lets go ahead with the flow, hope this feature would be available in the future releases.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I would be sending the below POST request to the same &lt;strong&gt;/login&lt;/strong&gt; API -&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "username" : "nabil",
    "password" : "demo"
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Lets go through the steps to setup the trigger rules and vary responses based on the same -&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s1RJWdl2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13706140/72914806-45303580-3d65-11ea-9ad3-ef40a3899b5e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s1RJWdl2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13706140/72914806-45303580-3d65-11ea-9ad3-ef40a3899b5e.png" alt="https://user-images.githubusercontent.com/13706140/72914806-45303580-3d65-11ea-9ad3-ef40a3899b5e.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Click on Add Response&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add your Rule&lt;/strong&gt;&lt;br&gt;
This the place where you would be actually adding your Rule. I won’t go into much detail about the possibilities here. Mockoon’s official feature page does a wonderful job of explaining that in depth. You can find it &lt;a href="https://mockoon.com/tutorial/multiple-route-responses/"&gt;here&lt;/a&gt;&lt;br&gt;
Here I am adding a Rule to check if the value of API request parameter &lt;strong&gt;“password”&lt;/strong&gt; is set as &lt;strong&gt;“demo”&lt;/strong&gt;. Basically, we are setting the Trigger Condition here. The Action would be set up in the subsequent steps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q79njzpz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13706140/72915072-bbcd3300-3d65-11ea-94bf-f9634a30c375.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q79njzpz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13706140/72915072-bbcd3300-3d65-11ea-94bf-f9634a30c375.png" alt="https://user-images.githubusercontent.com/13706140/72915072-bbcd3300-3d65-11ea-94bf-f9634a30c375.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Update the response HTTP status code&lt;/strong&gt;&lt;br&gt;
This is the first part of setting the Action to our Rule i.e If the above rule is met, what should be the Status code of API Response?&lt;br&gt;
You can change the HTTP status code of the response and test them accordingly in your app. Over here I would be keeping it to 401 for invalid password rule to return an Unauthorized Access error in the API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Add JSON response&lt;/strong&gt;&lt;br&gt;
This is the second part of setting the Action to our Rule i.e If the above rule is met, what should be the Body of API Response? This is optional, but would be extremely helpful for setting up HTTP Status 200 Success responses like an empty list, returning different API objects based on certain criteria, etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now test these Conditions and Rules by varying your Request parameters from your app and see the magic happen!&lt;/p&gt;

&lt;h1&gt;
  
  
  Final Notes…
&lt;/h1&gt;

&lt;p&gt;I have barely scratched the surface here. You can do a lot with &lt;strong&gt;Dynamic Variables, Templating, Latency, HTTPS, CORS etc&lt;/strong&gt; with Mockoon. You can find a list of all its features here - &lt;a href="https://mockoon.com/features/"&gt;https://mockoon.com/features/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, &lt;a href="https://twitter.com/255kb"&gt;Guillaume&lt;/a&gt; has done a great job by providing a series of tutorials for you to learn these features and easily get started with them. You can access them here - &lt;a href="https://mockoon.com/tutorials/"&gt;https://mockoon.com/tutorials/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am certain this article would have given you a fair idea of mocking your own APIs and a realization that there is no need to depend on web APIs anymore to develop and test our API dependent functionalities.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tip: In cross-domain teams, it is always advisable to decide on an API structure with the Web team before even developing your Mock APIs. This can be done by aligning yourself with the web team on the API structure, finalizing the basics and then start Mocking them. This can be a small task before the actual development but would save a huge amount of rework in the code at a later stage. Trust me on this one!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;If you enjoyed reading this article and learned something, share it amongst your developer friends/colleagues and spread the love! If you have anything to discuss regarding Mocking APIs or any other topic related to Mobile Apps, Development, Designing, Engineering… Drop a comment below or DM me on &lt;a href="https://twitter.com/nQaze"&gt;Twitter&lt;/a&gt; :)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you find this interesting, chances are you’ll find my twitter feed too! I keep sharing articles and stuff related to development, design and productivity on a daily basis. So hop on, follow me on &lt;a href="https://twitter.com/nQaze"&gt;Twitter&lt;/a&gt; and enjoy the learning ride!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Till the next Article…&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>android</category>
      <category>mobile</category>
      <category>api</category>
    </item>
    <item>
      <title>Managing your App Distribution using Firebase</title>
      <dc:creator>Nabil Kazi</dc:creator>
      <pubDate>Tue, 10 Dec 2019 15:54:10 +0000</pubDate>
      <link>https://dev.to/nqaze/why-do-you-need-to-switch-to-firebase-app-distribution-3n3k</link>
      <guid>https://dev.to/nqaze/why-do-you-need-to-switch-to-firebase-app-distribution-3n3k</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SJaL7YiP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13706140/67194533-f052eb00-f414-11e9-8eee-fdc015a5d9b9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SJaL7YiP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13706140/67194533-f052eb00-f414-11e9-8eee-fdc015a5d9b9.png" alt="Banner-FirebaseAppDistribution"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now before I actually start blabbering about all the praises of the newly released Firebase App Distribution, I would like to give you all some context here. &lt;br&gt;
App Distribution..., well we develop apps to be distributed right? Apart from those side projects which are looming around in some folder buried deep inside a stack or other folders, I assume rest all the apps are meant to be distributed, right? So let's talk about it.&lt;br&gt;&lt;br&gt;
Distribution comes in phases, you don't just build an app and make it live to the public? At least I hope not! Your app goes through various other users before it actually reaches its intended audience. Now these can be your fellow developers from your own team, or from QA, or these can be your early beta testers, or users from your Client's team identified for UAT. &lt;br&gt;
As you can see I am talking about distributing the apps before it is actually published on Appstore or PlayStore. We call it Pre-release distributions. In this article, I would be covering the distribution of both Android and iOS apps using one single unified platform, &lt;strong&gt;Firebase App Distribution&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The focus of this article would be to highlight the available options other than firebase, the ones which we were using until now, how I used to manage the distributions in my Team, the difficulties we faced and how we can avoid all of that by switching to Firebase App Distribution. If you are still interested, which I am sure you would be, let's get started...&lt;/p&gt;

&lt;h2&gt;
  
  
  Distributing Android App Vs an iOS App
&lt;/h2&gt;

&lt;p&gt;Now this is a section where iOS people would wanna know how Android apps are shared and Android devs would wanna know a little something of iOS. &lt;/p&gt;

&lt;p&gt;To distribute Android apps, you create a key-store file right from Android studio and generate a signed APK using that key-store. &lt;br&gt;
Now you host this APK file anywhere on the web and any user with the link would be able to download and install this app. &lt;/p&gt;

&lt;p&gt;Reaction of iOS Developers right now... WWhhaaaaattt???? That's it? And their reaction is valid, let's go through the steps to distribute iOS apps.&lt;br&gt;&lt;br&gt;
You would first need to get the UDIDs (Unique Device Identifier) of all the users on whose device the app is going to be installed. Then you add these UDIDs on your Apple Developer Portal, create a provisioning profile and generate an IPA using this Profile. &lt;/p&gt;

&lt;p&gt;Now unlike Android you cannot just host this IPA anywhere, well you can, but the users cannot install that IPA on their devices. First you would have to create an over the air install Manifest file where you specify the URL where the IPA is hosted. You then need to host this Manifest file on the internet and then your users would be able to install the IPA. Note that only those users would be able to install the app whose UDIDs were added in the provisioning profile you used to generate the IPA.&lt;/p&gt;

&lt;p&gt;Well this was the standard way to just get you that link which you can share with the User's &amp;amp; distribute your app. Now for a project with very few pre-release distributions, you can manage like this (Even though I wouldn't recommend it). But when you constantly develop loads of apps and would need to keep a track of all them along with their distributions, you need some system in place. So let's have a look at various other &lt;strong&gt;Free Platforms&lt;/strong&gt; which we can leverage to distribute our apps. &lt;/p&gt;

&lt;h2&gt;
  
  
  App Distribution Platforms &amp;amp; Their Shortcomings
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Default Options : Google Play Internal Test Platform &amp;amp; iOS TestFlight&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The major drawback of these default options is the setup required. Since they are the platform default options, the setup required is very close to the actual publishing of your app. Usually at this stage we want something simple like just upload your file, get the link and share. &lt;/p&gt;

&lt;p&gt;With respect to TestFlight, the Builds have to go through an approval process before being available to the users, thats something huge which developers would like to avoid specifically at this stage.&lt;/p&gt;

&lt;p&gt;Apart from the above points, from a Team's perspective, Managing both your Android and iOS apps require looking over these 2 platforms which is again not so good. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://support.google.com/googleplay/android-developer/answer/3131213?hl=en"&gt;Read more about Google Internal Play Testing&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://testflight.apple.com/"&gt;Read more about iOS TestFlight&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sharing APK / IPA files using Cloud File Sharing Platforms&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These platforms can be Google Drive, Dropbox etc. You just have to upload the respective files over their, generate the share link and distribute the link across your users to download and install the app. &lt;/p&gt;

&lt;p&gt;Android will work perfectly fine in this scenario, but iOS IPA cannot be installed directly. The user should have access to a Macbook to install the shared IPA on their device using Xcode or iTunes. &lt;/p&gt;

&lt;p&gt;Apart from this, there is no User/Tester Management, nothing of the sorts to keep track of your versions and share links. That's some additional work that your team would have to do manually to keep track of all the versions distributed and their URLs. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Diawi&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Diawi overcomes the iOS distribution issue of requiring a Macbook to install the IPA by generating a over the air installation Manifest file by itself. You need to upload your iOS IPA or Android APK and it gives you a share link. &lt;br&gt;
Your users would be able to install both Android and iOS apps directly from the generated link.&lt;br&gt;&lt;br&gt;
Looks good? There's a limit on File Upload size - 75 MB and the link is valid for a maximum of 3 Days. Now I guess it doesn't look that good. &lt;/p&gt;

&lt;p&gt;Again, apart from this there is no User/Tester Management. The same Cons discussed above for Cloud sharing platform apply here. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.diawi.com/features-services"&gt;Read more about Diawi&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AppBox&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This one's just for iOS, I have included this since it overcomes the number of days &amp;amp; upload size limit that we had in Diawi. It basically connects with your Dropbox account, uploads your file on your account and generates a installable URL which you can share with your Users. &lt;/p&gt;

&lt;p&gt;Again, there is no User/Tester Management. The same Cons discussed above for Cloud sharing platform apply here. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://getappbox.com/features/"&gt;Read more about AppBox&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How I used to manage &amp;amp; maintain the distribution in my team&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since there was no unified platform that worked well for both Android and iOS, I used a couple of them and maintained a list of versions and their URLs in an OneNote Notebook which was shared amongst the team.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We used Dropbox to upload APKs and get the sharable link.
&lt;/li&gt;
&lt;li&gt;We used AppBox to generate Installable Links for iOS Apps.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once we get these links, we maintained a Notebook in OneNote where there was a list of all projects and URLs for the latest Android and iOS apps and the last updated date. If Anyone had to share a particular app to any user, they can access the shared notebook and find the URL and just share those downloadable URLs. &lt;/p&gt;

&lt;p&gt;As you can see, there was a lot of manual overhead in maintaining this Notebook plus usage of multiple platforms for generating APK and IPA files.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1Urz3M03--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13706140/67196533-a23fe680-f418-11e9-979f-23220d29f96c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1Urz3M03--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13706140/67196533-a23fe680-f418-11e9-979f-23220d29f96c.png" alt="A4I01"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Firebase App Distribution&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We talked enough about the problems in not just distributing the apps, but managing them ones they are distributed, maintaining a list of versions, their URLs, your testers, your Clients etc. etc. The list just doesn't end.&lt;/p&gt;

&lt;p&gt;Firebase is known for its developer-friendly tools from Analytics, Cloud Messaging to Crashlytics. Here it comes again as our Saviour with the latest Firebase App Distribution. &lt;br&gt;
Let's first see what they themselves say about this feature - &lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/SiPOaV-5j9o?list=PLl-K7zZEsYLmOF_07IayrTntevxtbUxDL"&gt;Watch The Intro to Firebase App Distribution here&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Cross-platform&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Manage both your iOS and Android pre-release distributions from the same place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fast distributions&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Get early releases into your testers' hands quickly, with fast onboarding, no SDK to install, and instant app delivery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fits into your workflow&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Distribute builds using the Firebase console, the Firebase Command Line Interface (CLI) tool, or Gradle (Android). Automate distribution by integrating the CLI into CI jobs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tester management&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Manage your testing teams by organizing them into groups. Easily add new testers with email invitations that walk them through the onboarding process. See the status of each tester for specific versions of your app: view who has accepted a testing invitation and downloaded the app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Works with Crashlytics&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
When combined with Crashlytics, get insights into the stability of your test distributions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gain valuable pre-release insights&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
App Distribution gives you a centralized dashboard to view insights on pre-release versions of your app. Testers are able to provide you with timely feedback on usability and pairing App Distribution with Crashlytics gives you real-time crash reporting for your app.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q4B9djx0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13706140/67198508-bab20000-f41c-11e9-871c-96dddf2f3f79.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q4B9djx0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13706140/67198508-bab20000-f41c-11e9-871c-96dddf2f3f79.png" alt="A04I02"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I would leave explaining the setup of Firebase out of this article since Firebase itself does a good job with its detailed &lt;a href="https://firebase.google.com/docs/app-distribution"&gt;documentation.&lt;/a&gt; Instead, I would walk you through the steps in brief -  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sign in to Firebase using your Google Account.
&lt;/li&gt;
&lt;li&gt;Create your Project. &lt;/li&gt;
&lt;li&gt;Add your Android and iOS Apps. &lt;/li&gt;
&lt;li&gt;Add Firebase SDK to your iOS / Android App [This would help in Analytics].&lt;/li&gt;
&lt;li&gt;Go to App Distribution and add your Users/Testers.&lt;/li&gt;
&lt;li&gt;You can also group your testers based on Teams like QA / Clients etc.&lt;/li&gt;
&lt;li&gt;Upload your IPA / APK and publish it.&lt;/li&gt;
&lt;li&gt;Your Users would get a nice professional-looking email with steps to download your app. &lt;/li&gt;
&lt;li&gt;Don't have emails of all your testers / Users? Don't worry, Firebase got you covered. Generate an app invite link and share it across with anyone.&lt;/li&gt;
&lt;li&gt;They would have to sign in via their Google account and then the download would initiate.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where Does Firebase App Distribution Stand Out Amongst others?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Its &lt;strong&gt;Free!!!&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;No limitation on App Upload size&lt;/li&gt;
&lt;li&gt;Manage both your Android and iOS apps using a single console.
&lt;/li&gt;
&lt;li&gt;Manage all your testers / Users from a single platform.&lt;/li&gt;
&lt;li&gt;Get to know how many of your users have accepted the invite and how many of them have downloaded the app.&lt;/li&gt;
&lt;li&gt;Maintain various versions of your App distribution.&lt;/li&gt;
&lt;li&gt;Access Control over the download link. Consider a scenario where you have shared a link with your testers and your Clients and now for some reason, you don't want your Clients to be able to download the app. With Firebase app distribution you can disable this access to particular Users using the Firebase Console. &lt;/li&gt;
&lt;li&gt;Ability to get the stability of your App Distributions when combined with Firebase Crashlytics.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Register Tester / Client Devices by getting their UDIDs [iOS]&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If anyone has worked with a varied set of Clients you would have noticed that not all Client's / Users are tech savvy. To just get their UDIDs, we have to walk them through "n" number of steps. Well, Firebase App Distribution comes to the rescue here again - &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When testers accept an invitation to test a build not signed with an Enterprise profile, they are asked for permission to share their device's UDID with you. If they agree, App Distribution collects the UDID from the device and notifies you by email of the newly-shared UDID.&lt;br&gt;&lt;br&gt;
When you receive one of these emails, update your provisioning profile with the UDID and distribute a new build to your testers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Combine Firebase App Distribution with CI/CD
&lt;/h2&gt;

&lt;p&gt;With almost everyone moving towards CI/CD you would be wondering how do we leverage Firebase App Distribution in our CI/CD workflow. Well hopefully these guides may help you get started - &lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.codemagic.io/firebase-app-distribution-with-codemagic/"&gt;Firebase App Distribution with Codemagic&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://proandroiddev.com/firebase-app-distribution-fastlane-docker-bitbucket-pipelines-telegram-and-all-that-jazz-2dcb770da7dd"&gt;Firebase App Distribution, Fastlane, Docker, Bitbucket Pipelines, Telegram, and all that jazz&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on &lt;a href="https://www.instamobile.io/mobile-development/firebase-app-distribution/"&gt;InstaMobile&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you enjoyed reading this article and learnt something, share it amongst your developer friends and colleagues and spread the love!&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;If you have anything to discuss regarding App Distribution or any other topic related to Mobile Apps, Development, Designing, Engineering... Drop a comment below or DM me on &lt;a href="https://twitter.com/nQaze"&gt;Twitter&lt;/a&gt; :)&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you find this interesting, chances are you’ll find my twitter feed too! I keep sharing articles and stuff related to development, design and productivity on a daily basis. So hop on, follow me on &lt;a href="https://twitter.com/nQaze"&gt;Twitter&lt;/a&gt; and enjoy the learning ride!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Till next Article...&lt;/em&gt;&lt;/p&gt;

</description>
      <category>firebase</category>
      <category>mobile</category>
      <category>ios</category>
      <category>android</category>
    </item>
    <item>
      <title>Managing White Label Solutions</title>
      <dc:creator>Nabil Kazi</dc:creator>
      <pubDate>Mon, 21 Oct 2019 11:34:02 +0000</pubDate>
      <link>https://dev.to/nqaze/managing-white-label-solutions-58gb</link>
      <guid>https://dev.to/nqaze/managing-white-label-solutions-58gb</guid>
      <description>&lt;h1&gt;
  
  
  A little bit about White Labeled Solutions
&lt;/h1&gt;

&lt;p&gt;Don’t worry I am not going to mention any definition or something like that. I’ll try to explain in a way that I have understood and I myself interpret it.&lt;/p&gt;

&lt;p&gt;So.. You have a product which you feel can be used by various companies, for example, an ERP system, or an HRMS system or something on similar lines. Just that, these companies would love to have their branding on it to have a personal touch for their users. So you change the logo, the colors, and the fonts as per company’s branding and give the exact same (or with a few customizations) product to that company.&lt;/p&gt;

&lt;p&gt;Voila! That product is a White Labeled Solution. Congrats buddy, you are a creator &amp;amp; an owner of a White Labeled Solution!&lt;/p&gt;

&lt;p&gt;Now that you have a pretty good idea about what it is. I would like to share my experience of building one. I’ll share issues I came across, solutions I implemented. Also, I’ll show you how to generate a new app for a new client with completely customized branding within minutes and all this while maintaining a single structured codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  It all started a few hundred years ago…
&lt;/h2&gt;

&lt;p&gt;I had developed Android and iOS apps for one of our company’s product. We delivered it to our first client. It was a huge success!&lt;/p&gt;

&lt;p&gt;Then we had our second client for the same product. They needed some slight modifications in the app, branding was obvious. Apart from branding, there were also some minor changes that they required. So I did what every new developer would do, created a clone of this project and made changes in the new project, changed the branding and delivered it. Voila, Success!!&lt;/p&gt;

&lt;p&gt;Then came the third… Story repeated… Success repeated!!&lt;/p&gt;

&lt;h2&gt;
  
  
  Now came the Nightmare…
&lt;/h2&gt;

&lt;p&gt;I got a crash report from one of the client’s app. But the code was same across all clients apps, so that meant the issue would exist in all of them. I had to quickly fix the issue, copy-paste the same in all the projects, push all of them to production and create APKs and IPAs for all of them. All these while switching from one project to another. Ufff… Somehow managed to remain sane throughout the day :D&lt;/p&gt;

&lt;p&gt;Then came a feature request from one of our client. Again as a smart new developer, I jumped right into that client’s repository, Implemented the feature, pushed it to production. Done and dusted, right?&lt;/p&gt;

&lt;p&gt;Nope. Not quite. After a while, that same feature request came from a different client. I had to dabble around the earlier implemented code, copy-paste this in current client’s project and release new updates. Also, don’t forget to count in the double efforts as we had to update both Android and iOS apps.&lt;/p&gt;

&lt;p&gt;Now it was becoming a headache to maintain all these different projects for each client. Keeping track of bug fixes and new features over the period of time was a nightmare.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Product Flavors — some light in this dark world!&lt;/strong&gt;
&lt;/h1&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%2Fmiro.medium.com%2Fmax%2F720%2F1%2AZWJEpjwUoGW_QQcqFBDJLg.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%2Fmiro.medium.com%2Fmax%2F720%2F1%2AZWJEpjwUoGW_QQcqFBDJLg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, what is Product Flavors? In a very small gist, It helps us create multiple variants of an app from a single code base. You can configure the resources, branding, hell even the working of an app.&lt;/p&gt;

&lt;p&gt;Now for all the iOS developers reading this and wondering why didn’t we came across this yet? Well because it's not in iOS, it’s an Android feature. What a bummer! Well, if it gives any hope, people have replicated this manually in iOS using the Build Configurations, but that’s another post in itself. You can find it  &lt;a href="http://onebigfunction.com/ios/2017/03/14/flavor-ios/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Coming back to Flavors in Android, I would quote a line from Android developer documentation itself here, which can sum up Product flavors for you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“You can define basic functionality in the main/ source set and use product flavor source sets to change the branding of your app for different clients.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For developers wanting to know more, you can find it  &lt;a href="https://developer.android.com/studio/build/build-variants" rel="noopener noreferrer"&gt;here&lt;/a&gt;  and for a small realistic example  &lt;a href="https://medium.com/@iammert/android-product-flavors-1ef276b2bbc1" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hell Yeah! This is what we were looking for, right?
&lt;/h2&gt;

&lt;p&gt;Well, it gets a little bit tricky managing for a large number of clients.&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%2Fmiro.medium.com%2Fmax%2F720%2F1%2AOonZJ7ocr8VChBh9GalCCw.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%2Fmiro.medium.com%2Fmax%2F720%2F1%2AOonZJ7ocr8VChBh9GalCCw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See Android goes on adding flavors as folders in your source code so that you can separate the custom code/resources for each flavors here. Also, if you have to just change a little bit of functionality, you can use If Else in your class to separate client wise functionalities. This sounds great at first, but as your clientele will increase managing and reading this code later with a lot of If and Else throughout your codebase will be a headache.&lt;/p&gt;

&lt;p&gt;Also, on a higher level, if at any point you would want separate developers to handle separate clients parallelly, It wouldn’t be possible.&lt;/p&gt;

&lt;p&gt;Same goes for iOS, even if you manage to replicate the working of Flavors using the Build Configurations, you would end up in the same place as our fellow Android Developers.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;GitFlow Workflow (A bit modified one!)&lt;/strong&gt;
&lt;/h1&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%2Fmiro.medium.com%2Fmax%2F575%2F1%2ACU4vj1T9qBOZ_57k9QcTlg.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%2Fmiro.medium.com%2Fmax%2F575%2F1%2ACU4vj1T9qBOZ_57k9QcTlg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow" rel="noopener noreferrer"&gt;https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I was facing all this on Earth-1, my doppelgänger from Earth-88 was researching on implementing a Git workflow for the team. He comes across various Git workflows  &lt;a href="https://www.atlassian.com/git/tutorials/comparing-workflows" rel="noopener noreferrer"&gt;here&lt;/a&gt;  and emails me the link. Yeah, emails work across the multiverse!&lt;/p&gt;

&lt;p&gt;There were these 2 workflows which I could implement for my scenario — GitFlow Workflow and Forking Workflow. You can read about the workflows on the  &lt;a href="https://www.atlassian.com/git/tutorials/comparing-workflows" rel="noopener noreferrer"&gt;Atlassian link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In Forking workflow, you can fork out the repo for each client from your base project, but since I wanted to keep the Codebase same and wanted to manage a single repository since it was a single product, I chose to stay with GitFlow Workflow.&lt;/p&gt;

&lt;p&gt;Now for those who know GitFlow workflow or those who did go through the above link might be wondering there is no such thing about managing multiple clients with GitFlow workflow out there.&lt;/p&gt;

&lt;p&gt;And you are right! That’s something I came up by modifying the workflow a bit and setting some rules!&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of Branches in the app :
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Master Branch:&lt;/strong&gt;  Will always contain the latest stable code.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Development Branch:&lt;/strong&gt;  Will contain the latest merged code from Developer Branches / Feature Branches.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Developer Branch:&lt;/strong&gt;  Every Developer’s Individual Branch&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Release Branch:&lt;/strong&gt;  Will be created at the time of Release and will be deleted once the code is merged into Master and Development.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Feature Branch:&lt;/strong&gt;  A Specific Feature Branch. There will be multiple feature branches, each for the individual feature.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Hotfix Branch:&lt;/strong&gt;  Will be created from master when an issue appears in production code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When a new client comes into the picture :
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  A new branch will be created from master Branch =&amp;gt; &lt;strong&gt;ClientName-master&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  A new branch will be created from ClientName-master =&amp;gt;  &lt;strong&gt;ClientName-development&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  All the branding and client-specific customizations will take place in ClientName-development branch.&lt;/li&gt;
&lt;li&gt;  Once a release date is fixed, we will plan “&lt;em&gt;Submit to QA&lt;/em&gt;” Date and create a  &lt;strong&gt;ClientName-release&lt;/strong&gt;  Branch from ClientName-development on that date and APK and IPA will be generated from ClientName-release Branch.&lt;/li&gt;
&lt;li&gt;  If there are a list of issues to be fixed, we will plan next release date, all bug fixes will be done in ClientName-release Branch and then new APK and IPA will be created and given to QA again.&lt;/li&gt;
&lt;li&gt;  Once a release is good to go live, we will merge ClientName-release into ClientName-master and ClientName-development and delete the ClientName-release Branch. We will tag the commit in ClientName-master branch to the specific version number and create the APK and IPA and submit it to client.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If an issue is found out in live app:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;If it is an issue in client-specific customization&lt;/strong&gt;, we will create a new branch from ClientName-master =&amp;gt; ClientName-hotfix and fix the issue in this and after testing merge this branch back into ClientName-master and ClientName-development and then delete this ClientName-hotfix branch.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;If the issue is not client-specific i.e. it is in base code&lt;/strong&gt;, we will create a new branch from master =&amp;gt; hotfix and fix the issue in this and after testing merge this branch back into master, development, ClientName-master, ClientName-development and then delete this Hotfix branch.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Specific to each client these will be the branches:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  ClientName-master&lt;/li&gt;
&lt;li&gt;  ClientName-development&lt;/li&gt;
&lt;li&gt;  ClientName-release&lt;/li&gt;
&lt;li&gt;  ClientName-feature Name&lt;/li&gt;
&lt;li&gt;  ClientName-hotfix&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NEVER EVER&lt;/strong&gt;  will changes be merged  &lt;strong&gt;FROM&lt;/strong&gt;  Client Branches  &lt;strong&gt;TO&lt;/strong&gt;  Main Branches. The flow will always be from Main Branches to Client Branches.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  That little problem…
&lt;/h2&gt;

&lt;p&gt;Sounded all good? Yeah! It’s just this little tiny problem in Android. It’s the Application ID or in iOS development terms, it is the Bundle ID. Application ID in Android looks like the package name. For those who have worked in Android might know that unlike iOS where Bundle ID is just a parameter in .plist file, here its actually the folder structure of the app. So when we say package name is  &lt;em&gt;“com.company.product”&lt;/em&gt;, there is a folder  &lt;em&gt;“com”&lt;/em&gt;  inside which there is another folder called  &lt;em&gt;“company”&lt;/em&gt;  inside which there is another one  &lt;em&gt;“product”&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  But how is this a problem?
&lt;/h2&gt;

&lt;p&gt;Well, when we create client branches from the master branch, the package name remains the same. With their branding, they might also wanna have their package name or signing configurations, etc. Also, you might want to have multiple APKs installed on your device for different clients for testing/ debugging purpose which requires unique Application ID for each APK.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doppelgänger to the rescue!
&lt;/h2&gt;

&lt;p&gt;Do I sense a dead end here? No, not really. Remember my doppelgänger from Earth-88? He emails me this  &lt;a href="https://developer.android.com/studio/build/application-id.html" rel="noopener noreferrer"&gt;link&lt;/a&gt;  about a feature in Android Product Flavors where you can define the Application ID in each product flavors. Hell Yeah!!&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%2Fmiro.medium.com%2Fmax%2F513%2F1%2AAZJW36LH4NIONJKN9QGvGg.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%2Fmiro.medium.com%2Fmax%2F513%2F1%2AAZJW36LH4NIONJKN9QGvGg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I created a single Flavor named  &lt;em&gt;“client”&lt;/em&gt; (Not the client name) in the base codebase. Now when I Checkout and create new Client branches, I just go into the flavor block and update the application ID parameter.&lt;/p&gt;

&lt;p&gt;Also, as I said above, in iOS, this can be handled pretty straightforwardly by updating the Bundle ID in each client’s branches.&lt;/p&gt;

&lt;p&gt;Now all the customizations specific to particular clients were in their own branches while also allowing me to keep a singular codebase updated with all my features and handling crashes and bugs across multiple apps like a pro.&lt;/p&gt;

&lt;h1&gt;
  
  
  Take it to the next level with Firebase Remote Config!
&lt;/h1&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%2Fmiro.medium.com%2Fmax%2F1280%2F1%2Aj93gTlJAAO_1EyyijcejPw.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%2Fmiro.medium.com%2Fmax%2F1280%2F1%2Aj93gTlJAAO_1EyyijcejPw.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://firebase.google.com" rel="noopener noreferrer"&gt;https://firebase.google.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Guess what? My doppelgänger is always one step ahead! This time he emails me about  &lt;a href="https://firebase.google.com/docs/remote-config" rel="noopener noreferrer"&gt;Firebase Remote Config&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can update your app’s look and feel, enable disable some features remotely without pushing an update to your app. Really? We can do that?&lt;/p&gt;

&lt;p&gt;Yeah, as it turns out, we can remotely manage all this stuff using Firebase Remote Config. So if you are planning for a white label solution, there might be some features that you feel may depend on the client to whether take it or not. Or you might want to have some premium features or whatever your reason might be. There are always such set of features. You just have to think and jot down these features first hand. Make a config like  &lt;em&gt;“feature name: true”&lt;/em&gt; where keys can be your feature names and value can be a Boolean flag to determine the availability of that feature in the app. Now, while developing your app, check for these flags and appropriately display/hide these features.&lt;/p&gt;

&lt;h1&gt;
  
  
  Time for the conclusion!
&lt;/h1&gt;

&lt;p&gt;Before setting up a workflow about how you are going to architect your codebase, there are some questions that you might want to answer first.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How big customizations are you ready to accommodate per client?&lt;/p&gt;

&lt;p&gt;Will these changes turn my app or product into something like a whole new customised solution?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If that’s the case, I would rather go with Git Forking workflow and maintain a whole another repository for such clients.&lt;/p&gt;

&lt;p&gt;Also, try and find out the dynamic features of your product which can change client wise. Implement these using Firebase remote config or you can create a remote configuration framework of your own too with the help of your Backend team.&lt;/p&gt;

&lt;p&gt;Also, if you plan on keeping your clientele to bare minimum, which I am sure no one would want. But still, if that’s the case, I would suggest going with Product Flavors only without the client wise GitFlow.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;That’s all for this one. If you liked this article and if it helped in any way, then like and share with your Friends and Colleagues. Also, I would love to hear how you handle such scenarios and also if you have any suggestions please shoot them.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you find this interesting, chances are you’ll find my twitter feed too! I keep sharing articles and stuff related to development, design and productivity on a daily basis. So hop on, follow me on &lt;a href="https://twitter.com/nQaze" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; and enjoy the learning ride!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Till next article…&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was originally written &amp;amp; published on  &lt;a href="https://medium.com/flawless-app-stories/managing-white-label-solutions-8ed8ce9d7fa8" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>android</category>
      <category>whitelabel</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Will Storyboards still be alive?</title>
      <dc:creator>Nabil Kazi</dc:creator>
      <pubDate>Mon, 07 Oct 2019 15:56:21 +0000</pubDate>
      <link>https://dev.to/nqaze/will-storyboards-still-be-alive-4389</link>
      <guid>https://dev.to/nqaze/will-storyboards-still-be-alive-4389</guid>
      <description>&lt;p&gt;The introduction of SwiftUI at Apple WWDC 2019 has raised many questions. The major one being — “&lt;strong&gt;Will Storyboards still be alive?&lt;/strong&gt;”. Let’s have a quick look at what some people are saying about it on Twitter:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UyQO-sFd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1280/1%2A1mKjsfm5i85rC0GUPpfm4g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UyQO-sFd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1280/1%2A1mKjsfm5i85rC0GUPpfm4g.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have read about SwiftUI, the latest framework that Apple has released to build User Interfaces, you would be aware of its powers. Just to mention a few: the declaration syntax, ease of adding animations, drag &amp;amp; drop interface editor like in code, property editor in code, hot reload or as you may call it live refresh, etc. For those of you who want to learn more about SwiftUI, you can start here —  &lt;a href="https://developer.apple.com/xcode/swiftui/"&gt;https://developer.apple.com/xcode/swiftui/&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;I’ll answer a question about the future of Storyboards by going through a personal experience of my last 4 years in iOS development.&lt;/p&gt;

&lt;p&gt;Even before the introduction of  SwiftUI, there was a question that every iOS developer would ask himself at some point in life — &lt;strong&gt;Storyboards or No Storyboards?&lt;/strong&gt;  The real question was WHEN? It actually depends on what kind of project the developer is working on — short term app or long term product.&lt;/p&gt;

&lt;p&gt;In this article, I am going to take you through my journey in iOS development to the point where I asked myself… Storyboards or No Storyboards?&lt;/p&gt;

&lt;p&gt;Prior to developing iOS apps, I was an Android developer (I still am 😄). Shifting to iOS, Storyboards were the first thing that grabbed my interest. In Android, I hardly ever used the drag and drop tool to design UI. It was always me and the XML playing together. So looking at storyboard and seeing all those options at once was a bit overwhelming, but once I got a hang of it, there was no looking back. I started developing UIs faster than I ever developed in Android. Everything was so cool. I quickly started designing UIs, creating  prototypes  and developing apps.&lt;/p&gt;

&lt;p&gt;At this point, I was the sole iOS developer and these were small to medium sized apps.&lt;/p&gt;

&lt;h1&gt;
  
  
  First Taste…
&lt;/h1&gt;

&lt;p&gt;With time the app size started to increase, new features started to pour in and the number of view controllers eventually increased.&lt;/p&gt;

&lt;p&gt;My Storyboard grew in size and this had a direct effect on the performance of loading Storyboards. Which was obvious since the storyboard is nothing but xml code behind the scene. The more lines of code, the more time it’ll take to load. Also, to scroll through such a huge storyboard to find and fix a small thing had become a headache now. The thing which I liked was now the pain point. At this point, I started  designing  view cells and other views in separate nib files. This took off some load from storyboards and kept its size in check. Still, this wasn’t a good solution.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Saviour.
&lt;/h1&gt;

&lt;p&gt;I came across an article — “&lt;a href="https://medium.com/@gurdeep060289/clean-code-for-multiple-storyboards-c64eb679dbf6"&gt;Clean Code for Multiple Storyboards&lt;/a&gt;”.&lt;/p&gt;

&lt;p&gt;Our apps usually have different modules or different user flows. We can group these view controllers either as per ‘User Flows’ or ‘Modules’ and create separate storyboards for each user flow / module. It was now much easier to navigate through the Storyboards. Also, it kept the sizes of Storyboard files in check thus reducing its load time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Saviour? Not for long.
&lt;/h2&gt;

&lt;p&gt;Soon, multiple developers joined me on the app and whoever has worked on GIT with storyboards would know this… It Just Doesn’t work! The Merge conflicts here just cannot be resolved. The way Xcode displays the merge conflicts for Storyboards is another story in itself. After going through a lot of merge conflicts, my fellow colleagues were now scared hearing the word ‘Merge’.&lt;/p&gt;

&lt;h1&gt;
  
  
  Plan your development
&lt;/h1&gt;

&lt;p&gt;Thankfully I was able to resolve this by planing the development in such a way that each developer had his own module to work on. Hence Say Developer-1 was working on Module-1 which had its own Storyboard-1. I was working on another module which had its own storyboard. This reduced merge conflicts in storyboards to a great  extent  since no two developers were working on the same storyboard at the same time.&lt;/p&gt;

&lt;p&gt;Phew, life was sorted over here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unless…
&lt;/h2&gt;

&lt;p&gt;iOS had different plans for me. Now came the point wherein we were tasked to develop features which would be available in some releases while absent in others. Obviously, we could not keep on copy-pasting these features whenever required and remove whenever not required. To solve this problem, Feature branches came to the rescue. We started to develop these additional features or change requests in their own branches. Now theoretically everything was fine until… we had to merge our feature branches into our development branch. Merge Conflicts came back saying “Missed me?”&lt;/p&gt;

&lt;h1&gt;
  
  
  Finally, the time arrived…
&lt;/h1&gt;

&lt;p&gt;Now this was the time when I had to ask myself…. Storyboards or No Storyboards?  With all due respect to the benefits that storyboard gives, It just fails to go hand in hand with Git.  This was the biggest drawback for our team which was currently working on a large product with tons of features and multiple developers. So we started to develop new UIs, especially in feature branches programmatically without using Storyboards.&lt;/p&gt;

&lt;p&gt;Trust me it will be difficult at the start, especially if you had never designed UIs programatically, but it becomes a lot easier. And with the long term benefits that it gives, its definitely a better option. To summarise, here are  &lt;strong&gt;Pros and Cons of using Storyboards:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pros: Simplifies Prototyping, Faster User Interface Development, Live Feedback in Interface Builder, Attributes at disposal.&lt;/p&gt;

&lt;p&gt;Cons: No proper reusability, Lacks Collaboration, Merge conflicts with Git, Load time of Storyboard directly proportional to Size of Storyboard.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Conclusion — Prior SwiftUI
&lt;/h1&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;When can we use Storyboards?&lt;/em&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Lifespan — Short-lived&lt;/li&gt;
&lt;li&gt;  App size — Small or Medium&lt;/li&gt;
&lt;li&gt;  Number of Developers — 1!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Some tips around&lt;/strong&gt; &lt;strong&gt;that&lt;/strong&gt; &lt;strong&gt;—&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Go with the approach of having multiple storyboards from the start.&lt;/li&gt;
&lt;li&gt;  Architect your app into logical modules and split the storyboards accordingly.&lt;/li&gt;
&lt;li&gt;  Also to keep the sizes of storyboards in check, use separate nib files to design TableView and CollectionView Cells and also other reusable views wherever possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;When should we avoid Storyboards?&lt;/em&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Lifespan — Short-lived!&lt;/li&gt;
&lt;li&gt;  App size — Large&lt;/li&gt;
&lt;li&gt;  Number of Developers — 2 and more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Some tips around that —&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Use a hybrid approach with Multiple Storyboards, Custom Views and View Cells in NIBs and creating views programatically.&lt;/li&gt;
&lt;li&gt;  To work with Version control and to avoid headaches of Merge Conflicts, Plan your development in such a way that no 2 developers would work on a single storyboard at one time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conclusion — Post SwiftUI
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cZ7oBWf3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/643/1%2ADqez18l3sd-oTCbtD16mDg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cZ7oBWf3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/643/1%2ADqez18l3sd-oTCbtD16mDg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I mean seriously? Is there any need to use Storyboards and not SwiftUI? For all the power, the ease, the reactiveness etc. etc. that it offers?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It turns out YES!!! If you want your apps to support &amp;lt; iOS13 you cannot use SwiftUI.&lt;/p&gt;

&lt;p&gt;So I guess, The ‘&lt;strong&gt;when to&lt;/strong&gt;’ and ‘&lt;strong&gt;when not to&lt;/strong&gt;’ just boils down to a single point now. Do you want your app to support OS version below iOS 13? With this, we can also say that the future of Storyboards will depend on — “Till when apps are willing to support iOS 12 and below.”&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you liked this article, like and share it with your fellow iOS developers. If you have your own **Story-Board-Story&lt;/em&gt;&lt;em&gt;, do share it in comments. If you have anything to discuss regarding Storyboards or any other topic related to Mobile App Development, Designing, Engineering… Drop a comment below or DM me on Twitter :)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you find this interesting, chances are you’ll find my twitter feed too! I keep sharing articles and stuff related to development, design and productivity on a daily basis. So hop on, follow me on &lt;a href="https://twitter.com/nQaze"&gt;Twitter&lt;/a&gt; and enjoy the learning ride!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Till the next Article…&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was originally written &amp;amp; published on  &lt;a href="https://medium.com/flawless-app-stories/storyboard-or-no-storyboard-d3ce6eda91eb"&gt;Medium&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>swift</category>
      <category>xcode</category>
      <category>swiftui</category>
    </item>
    <item>
      <title>7 things to keep in mind during your initial days in Software Development.</title>
      <dc:creator>Nabil Kazi</dc:creator>
      <pubDate>Sun, 06 Oct 2019 14:20:10 +0000</pubDate>
      <link>https://dev.to/nqaze/7-things-to-keep-in-mind-during-your-initial-days-in-software-development-hp6</link>
      <guid>https://dev.to/nqaze/7-things-to-keep-in-mind-during-your-initial-days-in-software-development-hp6</guid>
      <description>&lt;p&gt;It’s been more than 4 years working in Software Industry designing and developing web, android &amp;amp; iOS applications. During this period I have come across various people and companies and have seen the way people work. Based on my experience and a lot of reading, I would like to share some piece of advice for people who are aspiring to join this industry or are new and want to get better at what they do.&lt;br&gt;
This article is mainly focused on software engineers and developers but can also be aligned with other domains. Please feel free to add your thoughts &amp;amp; experiences at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  THE MINDSET
&lt;/h2&gt;

&lt;p&gt;I urge every one of you to set your mindset right. The mindset to &lt;strong&gt;“Learn, &amp;amp; Improve”.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No one is born a master.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Try to keep learning new things, reading articles, reviewing your work and improving on it. If your code from 6 months back and today is the same, you my friend are not improving. There are tons of resources out there which will help you learn as well as improve in your work. If you have written a piece of code and it worked, now’s the time to research &amp;amp; see if there is a better way to achieve the same results.&lt;/p&gt;

&lt;p&gt;Everyone improves, even the companies who develop programming languages improve over time. Why else would you think there are versions of languages and frameworks out there??&lt;/p&gt;

&lt;h2&gt;
  
  
  LEARN &amp;amp; GROW
&lt;/h2&gt;

&lt;p&gt;The start of your career is not just about making money, it’s about learning. I would recommend against joining a company which has a multi-tier hierarchical structure where you would be assigned a work and you would have to just complete and submit it without having the whole idea of the project or the impact of your work.&lt;br&gt;
A Startup or a company with flat hierarchical structure offers you the opportunity to see the whole picture of the project, understand it and you could see the impact of your work in real world.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why are these things important?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Seeing the impact of your own work drives you to do better and the experience &amp;amp; knowledge you gain by working on projects where you have the whole idea &amp;amp; insights about them is invaluable.&lt;/p&gt;

&lt;h2&gt;
  
  
  UNDERSTAND THE PROBLEM
&lt;/h2&gt;

&lt;p&gt;We as software developers or engineers are constantly designing and building new software. This cycle goes on and on. The clients change, the users change, the requirements change, day on day you’ll be building new software.&lt;br&gt;
But before you design or start building one, have you ever tried to understand why are you designing or building this? Who are your users? What impact will this have on the users? What problem are you actually trying to solve with this software?&lt;br&gt;
This is very important to understand for us as a developer. Knowing what problem we are trying to solve will bring out your inputs on the problem and in turn help in building better solutions. This will help you grow a lot faster than to just sit and code whatever is asked form you.&lt;/p&gt;

&lt;h2&gt;
  
  
  CARE ABOUT YOUR CLIENTS &amp;amp; USERS
&lt;/h2&gt;

&lt;p&gt;Whatever we are developing, these applications are going to be used by its intended end-users. Try to put yourself into their shoes and picture yourself using the application. If we don’t see the solution from their perspective, we may not be able to build something that they’ll like.&lt;br&gt;
Caring about the end-users would drive you to develop the application in the best possible way.&lt;br&gt;
Also, be open to feedbacks. Every software &amp;amp; design out there has improved from the feedbacks of its users. Taking user feedbacks seriously, builds a sense of trust in the users.&lt;br&gt;
Note this — &lt;strong&gt;An appreciation from a single user would make your day!&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  OWN YOUR WORK
&lt;/h2&gt;

&lt;p&gt;Your work defines you. Whatever you do, try to complete it in the best possible way. At times you’ll fail, but doesn’t every failure teach us something? If not what to do, it at least teaches us what NOT to do.&lt;br&gt;
At times you would be asked to do something different from your usual work. Maybe you don’t know how to do it, maybe you are not good at it, but why not give it a try? Try researching and you’ll find tons of ideas and then do it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;With ownership comes accountability — With accountability comes confidence.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  DON’T GET OVERWHELMED
&lt;/h2&gt;

&lt;p&gt;At times there are too many projects/tasks going around simultaneously. This means a lot of work on the plate. Every one of us gets overwhelmed by the amount of work which is pending. This decreases productivity since you spend most of the time thinking about all the pending work. This also takes a toll on your mind causing stress and also decreases the efficiency of your work.&lt;br&gt;
Instead, &lt;strong&gt;Plan them&lt;/strong&gt;. Let the tasks come as they may…&lt;br&gt;
Make a &lt;strong&gt;TODO list&lt;/strong&gt; of all the tasks that you have to complete. Break down each todo item from that list into a &lt;strong&gt;checklist&lt;/strong&gt;. Your Todo item is your specific task you want to accomplish &amp;amp; your checklist should be the steps that would help you accomplish that task. Now, arrange this TODO list as per your priority and focus on one todo item at a time. This would make you more efficient and ease off your stress.&lt;br&gt;
I suggest to use some tool on a daily basis to help you plan and keep you on track. I use Microsoft Todo for personal use and Trello for project management.&lt;/p&gt;

&lt;h2&gt;
  
  
  TAKE A BREAK!
&lt;/h2&gt;

&lt;p&gt;Every once in a while take a break from your work and chill. Burning out from work takes a toll on your mind and decreases its creativity. Not thinking about work for sometime refreshes &amp;amp; rejuvenates your mind and helps you see a problem from a different angle.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What are your thoughts on the above? Do let me know in the comments below. Also if you liked the article, Don’t forget to Share it with your friends and colleagues!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you find this interesting, chances are you’ll find my twitter feed too! I keep sharing articles and stuff related to development, design and productivity on a daily basis. So hop on, follow me on &lt;a href="https://twitter.com/nQaze"&gt;Twitter&lt;/a&gt; and enjoy the learning ride!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was originally published on my &lt;a href="https://medium.com/@nsk.qaze/lessons-learned-from-my-4-years-in-software-development-product-designing-c906491ac54a"&gt;Medium account&lt;/a&gt;&lt;/em&gt; &lt;/p&gt;

</description>
      <category>tips</category>
      <category>productivity</category>
      <category>software</category>
      <category>development</category>
    </item>
  </channel>
</rss>
