<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: ⛩ Mike Apostolakis</title>
    <description>The latest articles on Forem by ⛩ Mike Apostolakis (@mrmichael).</description>
    <link>https://forem.com/mrmichael</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%2F102674%2F3a058074-9b62-4b79-a24a-f8f45b81136f.jpg</url>
      <title>Forem: ⛩ Mike Apostolakis</title>
      <link>https://forem.com/mrmichael</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mrmichael"/>
    <language>en</language>
    <item>
      <title>Why mocking in iOS tests may not stop network and DB activity entirely</title>
      <dc:creator>⛩ Mike Apostolakis</dc:creator>
      <pubDate>Tue, 13 Aug 2019 07:19:10 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/why-mocking-in-ios-tests-may-not-stop-network-and-db-activity-entirely-1nj7</link>
      <guid>https://forem.com/essentialdeveloper/why-mocking-in-ios-tests-may-not-stop-network-and-db-activity-entirely-1nj7</guid>
      <description>&lt;p&gt;An excellent iOS test suite is &lt;a href="https://www.essentialdeveloper.com/articles/why-mocking-in-ios-tests-may-not-stop-network-and-db-activity-entirely"&gt;fast, reliable, precise, and reproducible&lt;/a&gt;. A common problem that makes automated testing in iOS slow and flaky is the presence of unexpected side-effects and artifacts during the execution of unit tests.&lt;/p&gt;

&lt;p&gt;For example, unexpected state/artifacts will make:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some tests fail after running the app&lt;/li&gt;
&lt;li&gt;Some tests fail after an unfinished test run

&lt;ul&gt;
&lt;li&gt;Even if you clean up state in &lt;code&gt;tearDown&lt;/code&gt;, if somehow the test suite does not finish properly (e.g., breakpoint or manually stopped), &lt;code&gt;tearDown&lt;/code&gt; may never be executed (so the state is never cleaned)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Some tests fail due to temporal coupling when running:

&lt;ul&gt;
&lt;li&gt;in random order&lt;/li&gt;
&lt;li&gt;in isolation&lt;/li&gt;
&lt;li&gt;the whole test suite&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The examples above will make your iOS test suite slow, unreliable, inaccurate, and irreproducible. That’s why running real network requests and/or persisting state to disk during unit tests is undesired.&lt;/p&gt;

&lt;p&gt;To make your iOS test suite fast, reliable, precise, and reproducible, every test run should start in a clean state and end in a clean state (no side-effects/artifacts left behind).&lt;/p&gt;

&lt;p&gt;To solve the problem, iOS developers will rightly replace network clients and databases with some kind of test double. However, that may not solve the problem entirely.&lt;/p&gt;

&lt;p&gt;Here’s a common question we receive:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“I’m mocking my HTTP APIClient, but when running my tests, I can still see network requests being fired in the logs. It slows down my tests, and sometimes I get unexpected errors.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For example, if I run my app and login (e.g., manually or on a UI Test), I get a bunch of failures and network requests in my unit test target because the logged-in user state is persisted and we fire a bunch of requests in the AppDelegate to update the logged-in user data.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How can this happen if I’m mocking my HTTP APIClient in the tests?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I can clean the simulator before every run but that also really slows down my test process (a reset takes several seconds or even minutes).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What am I doing wrong, and how can I solve this?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The reason real network requests will be fired when running the test suite (even though the HTTP &lt;code&gt;APIClient&lt;/code&gt; is being mocked) is that there is probably a Host Application attached to the test target.&lt;/p&gt;

&lt;p&gt;If your test target has a Host Application, every time you run your tests, the Application will also run with them. For instance, if you watch your simulator while running tests, you’ll see the initial UI getting rendered depending on the state of the app.&lt;/p&gt;

&lt;p&gt;So the &lt;code&gt;AppDelegate&lt;/code&gt; is being instantiated, and it triggers the API requests through the real &lt;code&gt;APIClient&lt;/code&gt; like it would if you just run the Application. Such behavior may be desired on an End-to-End UI test target, but not in an Isolated/Unit test target.&lt;/p&gt;

&lt;p&gt;If that’s your case, instead of tweaking Xcode’s parameters to clean the startup state or blaming your app’s architecture, consider the following solutions (in order of our preference):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure the tests to run without a Host Application.&lt;/li&gt;
&lt;li&gt;Create a new Test Target for Application-independent tests without a Host Application.&lt;/li&gt;
&lt;li&gt;Alter the app's entry point by creating a &lt;code&gt;main.swift&lt;/code&gt; file without instantiating the Application's delegate.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. Run your tests without a Host Application
&lt;/h2&gt;

&lt;p&gt;In our experience, the best and cleanest way to decouple your tests from a Host Application is to move your Host-Application-independent code (the majority of code you write!) into frameworks.&lt;/p&gt;

&lt;p&gt;Framework targets do not require a Host Application and won’t have one by default. As added benefits, decomposing your Application into frameworks will help you create modular systems that are easier to maintain, extend, test, replace, reuse, and independently develop and deploy.&lt;/p&gt;

&lt;p&gt;Alternatively, you can remove the Host Application from any existing test target, as shown below.&lt;/p&gt;

&lt;p&gt;In Xcode, in the General tab of a Test Target, you can change the Host Application option to "none." By doing so, the tests will run without a running Application. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1W0KFBBY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/xy8gyq4363g607mr4ct3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1W0KFBBY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/xy8gyq4363g607mr4ct3.png" alt="host_application_none.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Removing the Host Application also makes the tests faster to boot, and there's no need to make any changes to the production target (such as checking for “IS_TESTING” launch arguments). &lt;/p&gt;

&lt;p&gt;However, if the components you want to test reside in an &lt;em&gt;Application target&lt;/em&gt;, you won’t have access to them in the test target:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IluVWpiS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/qu9so8fm1af2wh0qynpm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IluVWpiS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/qu9so8fm1af2wh0qynpm.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you don’t want to move your code from an &lt;em&gt;Application target&lt;/em&gt; into &lt;em&gt;frameworks&lt;/em&gt;, you’ll have to add your components into the test target manually. You can do so by ticking the checkbox in the target membership pane:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lBbfq6X9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/1e085pbelfzs6znisthz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lBbfq6X9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/1e085pbelfzs6znisthz.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note that, if your components or tests depend on a running &lt;code&gt;UIApplication&lt;/code&gt;, this solution won't cut it for you. For example, the tests will fail if they're testing any component that references &lt;code&gt;UIApplication.shared&lt;/code&gt; directly because the shared &lt;code&gt;UIApplication&lt;/code&gt; instance won’t exist without a Host Application.&lt;/p&gt;

&lt;p&gt;But that’s a good thing as it helps you to avoid bad practices such as accessing implicit dependencies, mutable global state, and singletons like the &lt;code&gt;UIApplication.shared&lt;/code&gt; throughout the Application and use proper Dependency Injection instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Create a new Test Target without a Host Application
&lt;/h2&gt;

&lt;p&gt;If you're working on a test target with too many entangled dependencies on a running Application, then the cost of making the tests run without a Host Application might be too high. If that’s the case, you can take small steps instead of a significant refactoring. &lt;/p&gt;

&lt;p&gt;In Xcode, create a new test target and move all the Application-independent tests to a faster and more reliable Isolated/Unit test target without a Host Application. By doing so, the Application won't load when you run those tests independently. &lt;/p&gt;

&lt;p&gt;Gradually, make your way towards the first solution by decoupling as many components as you can from a Host Application and moving them to the new test target.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Make sure to run all test targets as part of your Continuous Integration pipeline before merging code into the master branch.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Replace your AppDelegate class when running tests
&lt;/h2&gt;

&lt;p&gt;The third option is a complement of the approaches above. While you can’t fully decouple your test target from a Host Application or if you want to prevent your Application from creating the real &lt;code&gt;AppDelegate&lt;/code&gt;, you can replace the &lt;code&gt;AppDelegate&lt;/code&gt; class when running tests.&lt;/p&gt;

&lt;p&gt;To replace the &lt;code&gt;AppDelegate&lt;/code&gt;, you need to create a custom starting point for your Application. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Regardless if you're executing a test suite or running your iOS app, every execution has a starting point.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Historically, in Objective-C, the main entry point for an iOS app was the main function defined in the &lt;code&gt;main.m&lt;/code&gt; file, where you would create the &lt;code&gt;UIApplication&lt;/code&gt; instance with an &lt;code&gt;AppDelegate&lt;/code&gt; class.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;However, in Swift, this code is "autogenerated" for you while using the &lt;code&gt;@UIApplicationMain&lt;/code&gt; attribute above the &lt;code&gt;AppDelegate&lt;/code&gt; class declaration.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;@UIApplicationMain&lt;/code&gt; attribute denotes that the &lt;code&gt;AppDelegate&lt;/code&gt; is the Application's delegate. When you run your tests with a Host Application, you’re also running your Application with the default &lt;code&gt;AppDelegate&lt;/code&gt;, which might execute network requests, analytics events, database side-effects, and a lot of other unnecessary work.&lt;/p&gt;

&lt;p&gt;To bypass the default main entry point, you can &lt;strong&gt;remove&lt;/strong&gt; the &lt;code&gt;@UIApplicationMain&lt;/code&gt; attribute from your &lt;code&gt;AppDelegate&lt;/code&gt; subclass and create a new file called &lt;code&gt;main.swift&lt;/code&gt; at the top level of your project.&lt;/p&gt;

&lt;p&gt;In the custom &lt;code&gt;main.swift&lt;/code&gt;, similar to the old Objective-C &lt;code&gt;main.m&lt;/code&gt;, you must explicitly call the &lt;code&gt;UIApplicationMain&lt;/code&gt; function passing a delegate class:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The following code snippet below shows what is required to add in the &lt;code&gt;main.swift file&lt;/code&gt; to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start a &lt;code&gt;UIApplication&lt;/code&gt; without a &lt;code&gt;UIApplicationDelegate&lt;/code&gt; when testing&lt;/li&gt;
&lt;li&gt;Start a &lt;code&gt;UIApplication&lt;/code&gt; with a &lt;code&gt;UIApplicationDelegate&lt;/code&gt; in production&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Notice that the &lt;code&gt;func delegateClassName()&lt;/code&gt; function checks if the Swift runtime can find the &lt;code&gt;XCTestCase&lt;/code&gt; class. &lt;code&gt;XCTestCase&lt;/code&gt; is only available when running tests, so it can't be loaded in production.&lt;/p&gt;

&lt;p&gt;The return value of the &lt;code&gt;delegateClassName()&lt;/code&gt; is being used as the delegate class name argument in the &lt;code&gt;UIApplicationMain&lt;/code&gt; function, which is the main entry point of the app.&lt;/p&gt;

&lt;p&gt;If the Swift runtime can't find the &lt;code&gt;XCTestCase&lt;/code&gt; class, then the name of your &lt;code&gt;AppDelegate&lt;/code&gt; subclass will be returned, otherwise, return &lt;code&gt;nil&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Thus, if you're running the tests, the Application won't instantiate the real &lt;code&gt;AppDelegate&lt;/code&gt; as the delegate class name value is &lt;code&gt;nil&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Alternatively, you could create a custom &lt;code&gt;UIApplicationDelegate&lt;/code&gt; in your test target and use it instead of returning a &lt;code&gt;nil&lt;/code&gt; delegate class name:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Solutions to avoid
&lt;/h2&gt;

&lt;p&gt;There are other popular solutions such as adding launch arguments or compile-time conditions such as &lt;code&gt;#if TESTING&lt;/code&gt; clauses but, in our experience, they usually do more harm than help.&lt;/p&gt;

&lt;p&gt;We don't recommend launch arguments or compile-time checks as they can quickly spread throughout the production codebase and become unmaintainable, e.g., creating many different execution paths when running your app for tests or production. Ideally, there should be no test execution path in your production code, making it easier and safer to develop and maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;To create a fast, reliable, precise, and reproducible iOS test suite, it’s essential to eliminate unexpected/unnecessary side-effects and artifacts during the execution of unit tests. Running unit tests with a Host Application is a common source of such problems.&lt;/p&gt;

&lt;p&gt;In our experience, the best strategy is to develop and maintain a modular codebase composed of frameworks/packages instead of developing your whole project in a single Application target.&lt;/p&gt;

&lt;p&gt;One of the advantages of the modular approach is that this problem becomes almost non-existent as frameworks don't require a Host Application.&lt;/p&gt;

&lt;p&gt;Finally, note that there are cases where you would want to run an Application while executing tests. For example, a UI Test target needs to run with a real Application. There's nothing wrong with that. However, if you don't need a running Application, it's better to avoid running one.&lt;/p&gt;

</description>
      <category>swift</category>
      <category>ios</category>
      <category>testing</category>
      <category>learning</category>
    </item>
    <item>
      <title>How burnout endangers your iOS career and well-being</title>
      <dc:creator>⛩ Mike Apostolakis</dc:creator>
      <pubDate>Tue, 09 Jul 2019 07:51:20 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/how-burnout-endangers-your-ios-career-and-well-being-22l3</link>
      <guid>https://forem.com/essentialdeveloper/how-burnout-endangers-your-ios-career-and-well-being-22l3</guid>
      <description>&lt;p&gt;Burnout is widespread among professional iOS developers. However, we don’t see enough talks, discussions, and content being created to help devs understand and prevent it.&lt;/p&gt;

&lt;p&gt;Many iOS devs experiencing burnout are not even aware of it. Some even start to wrongly believe that &lt;em&gt;“This negative state I’m constantly in is just how things are.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As a result, they end up jeopardizing their well-being, career, and life plans.&lt;/p&gt;

&lt;p&gt;In this article, you’ll learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what are the common reasons for burnout among iOS developers&lt;/li&gt;
&lt;li&gt;how burnout can negatively affect your career and life plans&lt;/li&gt;
&lt;li&gt;actions to prevent burnout and experience a fulfilling career&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common reasons for burnout
&lt;/h2&gt;

&lt;p&gt;Burnout was recently listed as an occupational phenomenon by the World Health Organization (WHO). It is being described as a syndrome resulting from chronic workplace stress that has not been managed successfully. Burnout is being characterized by exhaustion, negative feelings related to one’s job, and low productivity.&lt;/p&gt;

&lt;p&gt;Software development is a creative and mentally draining activity, so work overload is a common theme. It’s tough to keep up with the constant challenges, demands, short deadlines, and incoming/changing requirements.&lt;/p&gt;

&lt;p&gt;iOS developers have been sharing with us various professional challenges they face daily. We’ve repeatedly been hearing phrases such as “I’m working all the time,” “I wish I had better colleagues,” “I wish I had more time and space to deliver better results,“ “I’m not proud of the work we deliver,” “I don’t feel appreciated,” “I don’t have time to study,” “I don’t have time for anything fun...”&lt;/p&gt;

&lt;p&gt;If not handled appropriately, those challenges can lead to burnout and negatively impact their work performance, overall career progression, and life plans. However, &lt;em&gt;what many iOS devs don’t seem to understand are the root causes of their burnout&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Some of the main reasons causing stress and burnout among iOS devs are the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an ever-growing backlog of tasks without clear expectations (even though the team produces a lot, they don’t feel like they ever accomplish any goals/milestones; the lack of celebrations is a clear sign)&lt;/li&gt;
&lt;li&gt;too much work-in-progress at the same time&lt;/li&gt;
&lt;li&gt;the accumulation of missed deadlines&lt;/li&gt;
&lt;li&gt;impossible-to-meet deadlines enforced by managers or non-devs&lt;/li&gt;
&lt;li&gt;shallow and cloudy requirements that are hard (or impossible) to estimate&lt;/li&gt;
&lt;li&gt;very long and stressful iterations; usually releasing new app versions only every 3 to 12 months&lt;/li&gt;
&lt;li&gt;spaghetti code and &lt;a href="https://www.essentialdeveloper.com/articles/clean-ios-architecture-part-2-good-architecture-traits"&gt;lousy architecture slowing down the team&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;lack of automation in general (tests, continuous integration, continuous deployment...)&lt;/li&gt;
&lt;li&gt;git branches that take days, weeks, or even months to be merged (when devs attempt to merge them, the work is already out of sync causing conflicts in the code and the team)&lt;/li&gt;
&lt;li&gt;lack of proper and &lt;a href="https://www.essentialdeveloper.com/articles/engineering-the-journey-of-continuous-learning"&gt;continuous training and education&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;feeling intense anxiety when pushing an app to production or releasing to the App Store because of the possibility of bugs, mistakes or simply doing something wrong (e.g., releasing with the wrong dev endpoints configuration)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.essentialdeveloper.com/articles/3-steps-to-prepare-your-apps-for-swiftui-combine-ipados-project-catalyst-and-any-other-leaps-in-the-ios-industry"&gt;fear of missing out new developments&lt;/a&gt; in the industry or &lt;a href="https://www.essentialdeveloper.com/articles/should-ios-devs-learn-kotlin-or-other-programming-languages"&gt;being left behind by new technologies and platforms&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.essentialdeveloper.com/articles/why-ios-developers-feel-stuck-in-their-careers-and-what-to-do"&gt;inability to see a clear career progression&lt;/a&gt;; “things seem fine now, but what about in five years?”&lt;/li&gt;
&lt;li&gt;not feeling appreciated&lt;/li&gt;
&lt;li&gt;working in companies that don’t offer a career plan&lt;/li&gt;
&lt;li&gt;bully bosses/managers/peers and hostile work environment&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.essentialdeveloper.com/articles/why-switching-ios-dev-jobs-is-not-the-best-way-to-increase-your-salary"&gt;switching jobs frequently&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;bad dietary choices&lt;/li&gt;
&lt;li&gt;lack of physical exercise&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sadly, such highly stressful situations can deprive iOS developers of enjoying and appreciating their contributions and drastically minimize the rewards of their hard work.&lt;/p&gt;

&lt;h2&gt;
  
  
  How burnout affects your career
&lt;/h2&gt;

&lt;p&gt;If you can relate to the issues above, or you feel you’re struggling with similar problems, you’re not alone.&lt;/p&gt;

&lt;p&gt;For many years we’ve been helping iOS devs achieve enriching and fulfilling careers. And burnout is one of the top factors we see destroying career plans.&lt;/p&gt;

&lt;p&gt;In our experience, &lt;em&gt;&lt;a href="https://www.essentialdeveloper.com/articles/number-1-reason-why-you-dont-improve-as-a-software-developer"&gt;a career plan is only good if you can follow it in the long-term&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If you set a career plan, burnout and give up after six months, that was a bad—unsustainable—plan.&lt;/p&gt;

&lt;p&gt;It may take years to recover from burnout and regain passion for your job. Without proper help, it can actually never go away. So every time devs reach burnout, there’s a huge chance it’ll set them back years in their career and life plans.&lt;/p&gt;

&lt;p&gt;Thus, an essential element for long-term gains is a sustainable plan. In other words, you must master skills and practices that generate positive returns in the short- and long-term.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supercharging your skill set
&lt;/h2&gt;

&lt;p&gt;We have faced the challenges that lead to burnout, and in our experience, they are manageable and mostly preventable. In fact, solving those challenges and helping your fellow devs thrive is one of the most rewarding experiences you can go through as a professional.&lt;/p&gt;

&lt;p&gt;For example, it’s common for developers to get stressed, even panic when they face the so-called “spaghetti” code with a massive number of dependencies and no automated tests.&lt;/p&gt;

&lt;p&gt;Such fragile systems are quite hard to change with confidence. So ensuring that your contributions work and that no defects were introduced is, of course, extremely stressful. Moreover, short deadlines will just add extra anxiety to the mix.&lt;/p&gt;

&lt;p&gt;It’s not easy to solve those challenges, but it’s rewarding (and much better than the alternative of just coping!).&lt;/p&gt;

&lt;p&gt;The solution, in this example, is to design components with a low degree of coupling and write a &lt;a href="https://www.essentialdeveloper.com/articles/ios-automation-testing-tools-vs-economics-is-it-worth-the-cost"&gt;fast, reliable, and comprehensive suite of tests&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Of course, if your peers don't follow or care for good practices as you do, you can’t do it alone. Software development is a social activity, so &lt;a href="https://www.essentialdeveloper.com/articles/culture-of-integrity-within-successful-software-teams"&gt;a healthy and sustainable operation is a team effort&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Another source of conflict and frustration in the workplace is when devs put so much effort into creating good solutions, and their peers completely nullify it with lousy changes.&lt;/p&gt;

&lt;p&gt;That’s why excellent education, training, mentoring, high-standards, team building exercises, leadership, and a healthy team culture is so important.&lt;/p&gt;

&lt;p&gt;It’s not easy, but it’s simple if you and your team &lt;a href="https://www.essentialdeveloper.com/articles/the-importance-of-discipline-for-ios-programmers"&gt;commit to daily disciplines&lt;/a&gt;. In turn, it can drastically alleviate you from stress, help others along the way, and clear your path for a long-term career fulfillment.&lt;/p&gt;

&lt;p&gt;Maybe you can’t find joy in your current work environment. If you’re working with bullies, it may be time to look for a better place. But if you like your peers, be sure it can be a rewarding experience to start &lt;em&gt;leading&lt;/em&gt; them to a healthier, more sustainable, balanced and profitable work-life.&lt;/p&gt;

&lt;p&gt;And if you don’t have the skills to do so, it’s time to start building them. You can either request your employer/HR for better training or use your resources to do so. Regardless, it’s essential to invest in yourself to achieve your goals and experience short- and long-term career fulfillment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;You shouldn’t feel alone if you’re experiencing burnout, stress, or anxiety. It can happen to everyone.&lt;/p&gt;

&lt;p&gt;However, &lt;strong&gt;you don’t have to accept this negative state as the “norm.”&lt;/strong&gt; If you feel like your stress and anxiety levels are getting out of control, you should seek professional help.&lt;/p&gt;

&lt;p&gt;You can prevent burnout by building up valuable dev and leadership skills and incorporating sustainable practices and healthy habits into your daily routine.&lt;/p&gt;

&lt;p&gt;Remember: Delivering work you’re proud of—while helping your fellow iOS devs along the way—is exceptionally rewarding.&lt;/p&gt;

</description>
      <category>swift</category>
      <category>ios</category>
      <category>career</category>
      <category>learning</category>
    </item>
    <item>
      <title>Should iOS devs learn Kotlin or other programming languages?</title>
      <dc:creator>⛩ Mike Apostolakis</dc:creator>
      <pubDate>Tue, 02 Jul 2019 08:26:04 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/should-ios-devs-learn-kotlin-or-other-programming-languages-b6i</link>
      <guid>https://forem.com/essentialdeveloper/should-ios-devs-learn-kotlin-or-other-programming-languages-b6i</guid>
      <description>&lt;p&gt;Have you ever found yourself wondering if you should learn Kotlin or another programming language?&lt;/p&gt;

&lt;p&gt;This is a common question we receive from iOS developers. With so many different languages, frameworks, and platforms in the dev industry, it’s natural for iOS devs to wonder if they are missing out big opportunities out there.&lt;/p&gt;

&lt;p&gt;In this article, you’ll learn a simple framework for deciding if a new technology can help you accelerate your success and long-term fulfillment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;choosing between a generalist and specialist approach&lt;/li&gt;
&lt;li&gt;setting up clear objectives&lt;/li&gt;
&lt;li&gt;building up valuable technology-specific skills&lt;/li&gt;
&lt;li&gt;building up essential technology-agnostic skills&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Should I be a Generalist or a Specialist?
&lt;/h2&gt;

&lt;p&gt;Of course, the answer is, “it depends!”&lt;/p&gt;

&lt;p&gt;Some developers believe that &lt;em&gt;“If I know both iOS and Android development, I should be paid double!”&lt;/em&gt; The problem is… Developers are typically paid by the hour (and how much they can produce!), and knowing two platforms don’t make you twice as productive (context-shifting, for example, can actually make you &lt;em&gt;less&lt;/em&gt; productive)!&lt;/p&gt;

&lt;p&gt;So, if you're an iOS dev, we believe you should strive to become an iOS dev specialist. Thus, Swift should be your specialist language.&lt;/p&gt;

&lt;p&gt;It’s counterintuitive but, usually, becoming a specialist (e.g., “I am an iOS/Swift dev specialist”) pays off more than trying to be a generalist (“I am an iOS/Android/Swift/Kotlin/Obj-C/JS/PHP/JAVA/C#/... dev”).&lt;/p&gt;

&lt;p&gt;The cost of dabbling with new technology may be small. But mastering many technologies and making them part of your success and long-term fulfillment is a whole different proposition (it can take decades!).&lt;/p&gt;

&lt;p&gt;That doesn’t mean you shouldn’t learn other technologies. Quite the contrary. Absolutely, you should learn other languages. We know many highly-paid iOS developer specialists that use Objective-C, Kotlin, JS, Ruby, JAVA, etc., on their day-to-day. But when advertising themselves for a high paying iOS position, &lt;strong&gt;they show up as iOS/Swift specialists&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Let's illustrate with a real story. Caio had a serious knee injury practicing jiu-jitsu. Specifically, he had torn his meniscus and needed emergency surgery.&lt;/p&gt;

&lt;p&gt;Imagine yourself in his position. Would you choose a "do-it-all surgeon" or a "knee surgeon specialized in torn meniscus sports injury"?&lt;/p&gt;

&lt;p&gt;Of course, it doesn't mean the "do-it-all surgeon" can't do a great job. But we believe that most people would pick the specialist as a safer choice.&lt;/p&gt;

&lt;p&gt;The same principle applies to your career. There are many outstanding iOS opportunities at the moment for iOS/Swift specialists. Because businesses deem expensive specialists to be a safer choice.&lt;/p&gt;

&lt;p&gt;Certainly, there are generalist devs making a good living! However, in our experience, that’s not the norm. Simply because a do-it-all generalist dev often looks “less knowledgeable” to challenging—and rewarding—iOS projects.&lt;/p&gt;

&lt;p&gt;If working with multiple languages, frameworks, and platforms is what makes your heart tick, go for it! Otherwise, becoming a specialist may be a better (and more profitable) alternative.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up clear objectives
&lt;/h2&gt;

&lt;p&gt;Learning new languages, frameworks, and platforms indeed open up opportunities to improve as a developer. However, you must clearly define objectives as it may not be the best choice for career progression.&lt;/p&gt;

&lt;p&gt;For example, if your objective is to explore how MVC, MVVM, and MVP solutions are implemented in other platforms, learning how to build Android/Kotlin apps can be a great exercise. Or if you want to learn different programming paradigms such as Functional Programming, learning Clojure or Haskell would be fantastic.&lt;/p&gt;

&lt;p&gt;In other words, if your goal is to improve your programming skills, you should definitely consider giving another technology a try as it can expand your knowledge and consequently your value as a developer (you can always translate what you learned to iOS/Swift development!).&lt;/p&gt;

&lt;p&gt;Moreover, building an open-source side-project for learning a new technology can be extremely fun and rewarding. Ideally, you should document your learning in articles to increase your exposure online (always good to promote yourself!).&lt;/p&gt;

&lt;p&gt;On the other hand, if you’re thinking about learning a new technology for professional reasons (e.g., increase your salary), consider your decision carefully. Before diving into learning a new programming language, make sure to research what would take (time, money, and effort!) until you can provide value in the workplace and start collecting rewards. Additionally, be sure of what kind of expected returns you’ll see from your investment and for how long these returns will potentially exist.&lt;/p&gt;

&lt;p&gt;As we said previously, instead of learning many languages (generalist), it often makes more economic sense to master one first (specialist).&lt;/p&gt;

&lt;h2&gt;
  
  
  Building up valuable technology-specific skills
&lt;/h2&gt;

&lt;p&gt;Many factors influence the popularity, adoption, and compensation for a technology-specific skill. Ideally, you should build up highly-paid skills that are currently hot and are expected to have high demand in the long-term as well.&lt;/p&gt;

&lt;p&gt;A simple principle is: &lt;em&gt;Scarcity plays a significant role in compensations.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Swift is an example of a new language with current and future expectations for high-demand and high compensation. Since there are not a lot of experienced Swift developers (scarcity), remarkable Swift developers can achieve very high compensations.&lt;/p&gt;

&lt;p&gt;However, the demand for a particular skill and the compensation aren’t always aligned.&lt;/p&gt;

&lt;p&gt;An interesting example would be technologies that don’t have a mass appeal anymore (low demand) but that have a potential for high returns. Take Objective-C as an example. For decades, Objective-C was the go-to language to develop apps on Apple’s platforms, but it keeps losing its appeal since the announcement of Swift. Sooner or later, professional iOS developers will have to jump on the Swift train, as Apple has expressed clearly that Swift is the future of their platforms. As a result, future iOS developers will most likely never learn Objective-C.&lt;/p&gt;

&lt;p&gt;However, that doesn’t mean that there won’t be good Objective-C opportunities in the future. For example, as Objective-C usage fades away, there’ll be fewer Objective-C specialists in the market (low supply), thus there’ll be a massive &lt;strong&gt;scarcity for the skill.&lt;/strong&gt; As long as there are businesses that depend on Objective-C, there’ll be the need to maintain those systems. In this long-term scenario, Objective-C developers can be so scarce that they could potentially land very lucrative roles to maintain or migrate legacy codebases.&lt;/p&gt;

&lt;p&gt;With that said, we don’t recommend beginners or even mid-level iOS developers to master Objective-C as it’ll require a lot of effort and it may not pay off in the long-term. Such opportunities are more suitable for senior and veteran Objective-C developers (specialists) that already built the skills along the years.&lt;/p&gt;

&lt;p&gt;In our opinion, you should avoid investing time, money and effort on legacy technology-specific skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building up essential technology-agnostic skills
&lt;/h2&gt;

&lt;p&gt;Ok, now you understand the importance of becoming a specialist.&lt;/p&gt;

&lt;p&gt;But… &lt;em&gt;“what if I become a specialist in a specific technology and later it becomes obsolete?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Indeed that’s a legitimate concern. The tech landscape is continually changing, and with it, the technologies we use for developing remarkable products change as well (hopefully for the best!).&lt;/p&gt;

&lt;p&gt;Placing all your eggs in one basket probably won't yield the best results for your long-term career fulfillment.&lt;/p&gt;

&lt;p&gt;However… Instead of trying to become a “do-it-all generalist,” what if you build up highly-paid skills that combine extreme scarcity with high demand in the job market? And what if those valuable skills could also translate to any other platform, so you wouldn’t have to start from scratch every time there’s a new technology shift in the industry?&lt;/p&gt;

&lt;p&gt;The good news is… such valuable skills exist, and you can master them!&lt;/p&gt;

&lt;p&gt;The best long-term investment, in our opinion, is to develop essential skills that apply to any platform or language; skills that withstand the test of time. Such timeless skills are vital for generating business value and accelerating your career growth.&lt;/p&gt;

&lt;p&gt;For example, the following highly-paid skills are independent of the language or platform you use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;modular design&lt;/strong&gt; , for adapting to change with high-speed and low-cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;automated testing&lt;/strong&gt; , for quickly, reliably, and repeatedly asserting correctness in the codebase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;dependency management&lt;/strong&gt; , for creating low coupling between reusable components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;effective version-control&lt;/strong&gt; , for smooth continuous integration and deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;short release cycles&lt;/strong&gt; , for easier and more accurate planning, gathering fast feedback, and delivering value continuously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;codebase health monitoring&lt;/strong&gt; , for maintaining a sustainable codebase in the short- and long-term.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;excellent cross-team communication&lt;/strong&gt; , for a collaborative and knowledge-sharing culture.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Building up essential—and timeless—skills will give you a positive outlook and a comfortable attitude towards big shifts in the industry. That means you won’t have to worry about which language or platform you should learn next. Adapting to future challenges and changes will be easy and cost-effective. In fact, every shift will become a rewarding and quite profitable experience!&lt;/p&gt;

&lt;p&gt;So… strive to get the best of both worlds: build up a foundational skill set consisting of scarce, highly-paid and timeless technology-agnostic expertise while specializing in technology-specific languages, frameworks, and platforms that are hot in the market.&lt;/p&gt;

&lt;p&gt;In retrospect, go ahead and learn anything that is interesting and rewarding to you (it’s important to have fun!). If you are after success, long-term fulfillment, and a remarkable career, make sure also to master the timeless fundamentals of professional software development.&lt;/p&gt;

</description>
      <category>swift</category>
      <category>ios</category>
      <category>career</category>
      <category>learning</category>
    </item>
    <item>
      <title>3 Steps to Prepare Your Apps for SwiftUI, Combine, iPadOS, Project Catalyst, and Any Other Leaps in the iOS Industry</title>
      <dc:creator>⛩ Mike Apostolakis</dc:creator>
      <pubDate>Fri, 21 Jun 2019 14:32:47 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/3-steps-to-prepare-your-apps-for-swiftui-combine-ipados-project-catalyst-and-any-other-leaps-in-the-ios-industry-544k</link>
      <guid>https://forem.com/essentialdeveloper/3-steps-to-prepare-your-apps-for-swiftui-combine-ipados-project-catalyst-and-any-other-leaps-in-the-ios-industry-544k</guid>
      <description>&lt;p&gt;At this year's WWDC, Apple caught us, developers, by surprise with the announcement of new frameworks and platforms such as SwiftUI, Combine, iPadOS, Project Catalyst, and many other fantastic updates.&lt;/p&gt;

&lt;p&gt;Once more, iOS developers are looking at a fantastic opportunity for getting ahead in the game by mastering new technologies and providing outstanding value in the iOS job market.&lt;/p&gt;

&lt;p&gt;However, for many iOS developers, the news denotes massive paradigm shifts they have to go through to stay up to date with the new industry trends.&lt;/p&gt;

&lt;p&gt;And just like when Swift was introduced, we noticed many developers being afraid of missing out on this fantastic opportunity.&lt;/p&gt;

&lt;p&gt;Of course, as part of the Essential Developer community, we don't want you to be left behind. So, in this article, you’ll learn what’s the ultimate strategy to adopt for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;preparing your codebase for the upcoming migration to take advantage of all the new platforms and frameworks, such as SwiftUI&lt;/li&gt;
&lt;li&gt;extending your supported platforms by separating your components into platform-agnostic and platform-specific&lt;/li&gt;
&lt;li&gt;thriving through tectonic changes in our industry such as language and paradigm shifts&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The migration challenges of new frameworks and platforms
&lt;/h2&gt;

&lt;p&gt;Although exploring SwiftUI’s capabilities on pet/test projects with no need for long-term maintenance can be fun and educational, adopting the new changes on iOS codebases backing commercial products bears a lot more effort and risks.&lt;/p&gt;

&lt;p&gt;For iOS developers that create and treat the UI and other frameworks (especially 3rd-party) as &lt;a href="https://www.essentialdeveloper.com/articles/fearless-and-productive-use-of-3rd-party-ios-frameworks" rel="noopener noreferrer"&gt;standalone frameworks that can be plugged into the business logic&lt;/a&gt;, the &lt;em&gt;migration to new technologies such as SwiftUI will be simple, fast and remarkably low-cost&lt;/em&gt;. That’s because there is a low degree of coupling between the business logic components and the UI code of the application. For example, with decoupled logic, developers will only need to replace the current UIKit module with a new SwiftUI implementation (the business logic stays untouched!).&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzc21y9uv36sjasr47695.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzc21y9uv36sjasr47695.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the other hand, codebases with high coupling between the business logic and the UI will have to be rewritten (or have parts be rewritten) to adopt the new APIs. The cost for migrating to SwiftUI, in this case, will be much higher.&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fbouw7qk1r9ei6dtbeboj.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fbouw7qk1r9ei6dtbeboj.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Migrating business logic from a UI framework to another is a risky and slow process, with chances of breaking existing features and business logic since there’s no clear decoupling between the UI and the core logic. Many teams in that situation might rightly decide not to migrate at all.&lt;/p&gt;

&lt;p&gt;Additionally, the iOS team will have to shift its focus to rebuilding &lt;em&gt;existing&lt;/em&gt; functionality to the new UI paradigm, instead of directing their efforts on &lt;em&gt;extending&lt;/em&gt; the app’s functionality and enriching the product. Moreover, by migrating existing functionality, testing the app’s behavior with the new UI components will most likely have to start from scratch.&lt;/p&gt;

&lt;p&gt;A better approach to migrating core logic from a UI framework to another is to start extracting and decoupling the business logic from UIKit or any other UI framework.&lt;/p&gt;

&lt;p&gt;SwiftUI is iOS13+, and since most companies support at least two previous iOS versions, that gives you enough time (~2 years) to prepare your codebases for a smooth migration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The first step for preparing to migrate to SwiftUI and the new frameworks and platforms is to establish low coupling between your application layers (a modular approach).&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Platform-agnostic vs platform-specific components
&lt;/h2&gt;

&lt;p&gt;Aim to isolate the UI components from business logic components through &lt;em&gt;iterative refactorings over time&lt;/em&gt;. In other words, strive to work in small batches (frequent small commits and merges) guided by a fast and reliable suite of tests.&lt;/p&gt;

&lt;p&gt;By isolating the business logic from UI components, you essentially treat the UI like any other framework, a “plug, and play” solution. Then, you can compose all modules in the Main iOS application (Composition Root).&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ftoz8swyk4dp1g8mlypbt.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ftoz8swyk4dp1g8mlypbt.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The separation and homogeneity between the modules contribute to your team’s and codebase adaptability towards big paradigm shifts we’ve been experiencing in the past years (the unknown that the future holds!). As a result, the cost for changing even whole layers, such as the UI of your application, becomes substantially smaller.&lt;/p&gt;

&lt;p&gt;Adding a watchOS application with a SwiftUI implementation, for example, would be fast and simple as you can reuse the domain logic:&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fai54etxizsmbiydr7c96.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fai54etxizsmbiydr7c96.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By striving to achieve isolation and uniformity in the codebase modules, you can also witness the following very welcoming side-effects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;faster development and testing times&lt;/li&gt;
&lt;li&gt;increased happiness and fulfillment within the iOS team&lt;/li&gt;
&lt;li&gt;smoother operations lead to better outcomes and subsequently faster career progression&lt;/li&gt;
&lt;li&gt;faster time (and adaptability) to market&lt;/li&gt;
&lt;li&gt;less confusion and miscommunication within the iOS team, especially new team additions&lt;/li&gt;
&lt;li&gt;more controlled management of state throughout the system&lt;/li&gt;
&lt;li&gt;fewer bugs and defects&lt;/li&gt;
&lt;li&gt;less exposure to risk for new technologies/requirements/experiments as they become isolated and easily replaceable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another benefit of organizing your code into isolated homogenous modules is the separation of the platform agnostic business logic components and the platform specific ones. Migrating your iOS app to SwiftUI will be just a matter of composing your application differently:&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F3vx578v6yi0q5o217lw0.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F3vx578v6yi0q5o217lw0.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can even start delivering better SwiftUI experiences to your customers while supporting old iOS versions by having different compositions of your application depending on the iOS version:&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F2ifemvw6v2dd2ycors6t.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F2ifemvw6v2dd2ycors6t.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Classifying components as platform-agnostic and platform-specific enable us to reuse a significant portion of the codebase for deployment to multiple platforms.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can represent business logic with raw Swift types (classes, structs, enums), which makes it platform-agnostic. The same business logic components can be used for different deployment platforms depending on the UI you’d like to plug them. In other words, you can end up with the same “brain” of the app (business logic components) but deploy on the iOS, watchOS, tvOS, iPadOS, macOS, Linux, and even the web.&lt;/p&gt;

&lt;p&gt;You can even decouple the UI from the domain module when needed (e.g., to reuse UI elements in separate applications with different domain logic).&lt;/p&gt;

&lt;p&gt;Xcode 11 makes it extremely easy to extract code into independent platform-agnostic frameworks and packages that can be shared.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The second step for preparing to migrate to SwiftUI and the new frameworks and platforms is to extract components into decoupled frameworks and packages (modules).&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Thriving through tectonic shifts in the iOS industry
&lt;/h2&gt;

&lt;p&gt;Achieving modularity enables you to deal with change much more straightforward, even in rare and unpredictable events where the whole industry must shift and adopt the new standard.&lt;/p&gt;

&lt;p&gt;A modular design drives down the cost and time for adapting to change, regardless if it comes from within the company in the form of product requirements, or from external factors such as Apple’s announcements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The third and final step for preparing to significant shifts in the industry is to maintain low coupling between your frameworks and packages as you implement new features.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As professional iOS developers, we write software to solve problems and improve the lives of our customers. Although it can be appealing to adopt the latest technologies, we need to remember that we have a responsibility to our customers to strive to provide them with the best possible experience first.&lt;/p&gt;

&lt;p&gt;A smooth migration (supported by modularity!) goes a long way in helping you to adopt new technologies and features that make your app great with &lt;strong&gt;high speed, low cost,&lt;/strong&gt; and &lt;strong&gt;confidence&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>swift</category>
      <category>ios</category>
      <category>career</category>
      <category>learning</category>
    </item>
    <item>
      <title>Why switching iOS dev jobs is not the best way to increase your salary</title>
      <dc:creator>⛩ Mike Apostolakis</dc:creator>
      <pubDate>Sat, 15 Jun 2019 11:58:51 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/why-switching-ios-dev-jobs-is-not-the-best-way-to-increase-your-salary-14m8</link>
      <guid>https://forem.com/essentialdeveloper/why-switching-ios-dev-jobs-is-not-the-best-way-to-increase-your-salary-14m8</guid>
      <description>&lt;p&gt;Many iOS developers believe that switching jobs frequently is the best (and easiest) way to increase their compensation and progress in their career.&lt;/p&gt;

&lt;p&gt;Although it can yield improvements, we believe that switching jobs frequently generates only micro-improvements while bearing huge risks.&lt;/p&gt;

&lt;p&gt;For example, we often see iOS developers (both permanent and contractors) switching jobs for a tiny salary bump ($2-5K) which end up tying them to this amount for another year or more.&lt;/p&gt;

&lt;p&gt;There are faster strategies that can yield much better results—with integrity!&lt;/p&gt;

&lt;p&gt;As part of our teaching and consulting jobs, we work closely with developers and businesses. Although most of the iOS professionals we talk to claim to be "satisfied" at their current work, they're &lt;em&gt;confident&lt;/em&gt; they can find new (better) opportunities and switch jobs reasonably easily if they decide to.&lt;/p&gt;

&lt;p&gt;For iOS developers, the ability to switch jobs on demand can be empowering. It provides a sense of financial security and also lets candidates seek or negotiate better salaries, work environment/culture, interesting work, health benefits, work/life balance, and appreciation for their work.&lt;/p&gt;

&lt;p&gt;What they don't know is &lt;em&gt;how much better those opportunities can be&lt;/em&gt; when they build valuable (scarce) skills.&lt;/p&gt;

&lt;p&gt;Following a strategy to get tiny salary bumps after long periods makes developers miss huge opportunities (to double or even triple their compensation!).&lt;/p&gt;

&lt;p&gt;For example, the demand for professional iOS developers, especially those demonstrating technical excellence and stellar leadership skills, has been skyrocketing. However, only a few are developing the skills to tackle those challenges (high demand &amp;amp; low supply!).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Switching jobs is a good strategy when you build valuable (scarce) skills that will help you get fantastic job offers. Otherwise, you'll be only getting micro-improvements.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The hidden risks of switching jobs frequently
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;"I make more money now, but I hate working here"&lt;/em&gt; is a recurrent theme among developers changing jobs frequently. Often, they wish they could go back to a previous job (being paid less) to enjoy work again. What we learn from this is that, of course, money is not everything.&lt;/p&gt;

&lt;p&gt;From our recent research, most developers that switch jobs frequently are in one of these two categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Happy with their compensation, unhappy with work&lt;/li&gt;
&lt;li&gt;Happy with work, unhappy with their compensation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This may lead developers to jump to the wrong conclusions. "I can either be paid more or work in a place I enjoy."&lt;/p&gt;

&lt;p&gt;But… they couldn't be more wrong!&lt;/p&gt;

&lt;p&gt;You can—and should aim for—a compensation you're happy with while working on a job you enjoy!&lt;/p&gt;

&lt;p&gt;The problem is that switching jobs frequently is like gambling. You don't know where you'll land. You just hope to land in a good place.&lt;/p&gt;

&lt;h2&gt;
  
  
  The legacy problem
&lt;/h2&gt;

&lt;p&gt;One of the most common challenges developers face when starting a new job is dealing with the newly inherited codebase.&lt;/p&gt;

&lt;p&gt;New developers report having difficulties navigating and understanding the existing (messy/buggy) code. Additionally, they might be unable to get clarifications from the authors of the code as they might have already left the company!&lt;/p&gt;

&lt;p&gt;Lousy codebases lacking proper structure, high cohesion (and low coupling), and reliable automated testing strategies are a threat to any iOS developer career plan. It can slow your career progression by a huge factor, as the odds to improve it are low, and you wouldn't be proud to add buggy/low-rated apps to your CV!&lt;/p&gt;

&lt;p&gt;Such codebases are often deemed by developers as "legacy" because of their unmanageable and cumbersome nature.&lt;/p&gt;

&lt;p&gt;Legacy codebases are not just the fault of developers, but the whole operation (from business people to product owners, managers, etc.). Usually, the pressures coming from above make developers rush and make lousy decisions.&lt;/p&gt;

&lt;p&gt;Thus, inheriting a legacy codebase may not be the worst of your problems. A legacy codebase can be improved, but only if the company/team/management allows it (e.g., by giving the time and space for developers to make it better).&lt;/p&gt;

&lt;p&gt;The truth is… When you inherit a legacy codebase, you inherit a legacy development process (and management)!&lt;/p&gt;

&lt;p&gt;And… changing processes and company/team culture (which is usually what's necessary) is much harder than improving a messy codebase.&lt;/p&gt;

&lt;p&gt;When a codebase reaches the legacy status, the incentive is for iOS developers to move on to a new greenfield or more manageable/high-profile project, for a chance to increase their compensation and boost their CV.&lt;/p&gt;

&lt;p&gt;Who can blame them? That's probably the right thing to do.&lt;/p&gt;

&lt;p&gt;Working in a legacy codebase is super stressful and rarely rewarding (unmaintainable or "legacy" codebases drastically increase burnout and drop developer happiness).&lt;/p&gt;

&lt;p&gt;Changing jobs can indeed give you a (small) salary bump. However, you probably don't want to be the one to inherit an unmaintainable legacy codebase developed under a "legacy" management.&lt;/p&gt;

&lt;p&gt;As a result, greenfield projects are the go-to option for iOS developers looking for a new job.&lt;/p&gt;

&lt;p&gt;The problem is… If most iOS devs want to work on greenfield projects, the competition for those job positions is pretty high (high demand, but high supply)! In turn, it may decrease the compensation offers for everyone.&lt;/p&gt;

&lt;p&gt;The best opportunities out there have low supply (scarcity). As far as possible from the competition!&lt;/p&gt;

&lt;p&gt;To take advantage of rare opportunities, you need to develop scarce skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  The (missed) learning opportunity problem
&lt;/h2&gt;

&lt;p&gt;Many valuable lessons come from developing and maintaining a codebase for an extended period.&lt;/p&gt;

&lt;p&gt;Developers that switch jobs frequently don't acquire the experience (valuable lessons) of maintaining a project in the long-term (one of the most valuable skills a developer can master!).&lt;/p&gt;

&lt;p&gt;For example, when a change in the codebase makes the code less resilient to change (e.g., tight coupling or lack of testing), it might be weeks or even months in the future until production might start to slow down because of those changes. And it's tough to trace back the origin of the problem.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The decaying effect in code quality appears with a delay. It's asynchronous.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The asynchrony between the state of the health of the codebase and the team's productivity (and happiness!) is basically "invisible," until one day it catches up and people start leaving.&lt;/p&gt;

&lt;p&gt;Many don't even see the down effects of bad dev decisions, as they move on to new jobs before the codebase becomes "legacy." &lt;em&gt;(In fact, it's rare to see developers call their codebases "legacy." It's usually the new developers that dread it!).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Of course, developers are not to blame (universities and traditional education systems are often to blame—as they don't teach us essential lessons about dealing with the long-term). However, if you want to progress faster and achieve a fulfilling career, you owe it to yourself to learn how to create sustainable and profitable dev operations!&lt;/p&gt;

&lt;p&gt;Since we don't learn it from traditional ways, learning at work (real-world knowledge) is vital. But you don't have to stay in a negative environment to learn such lessons. If you're working with toxic people and you have the opportunity to leave, take it (even for less money)!&lt;/p&gt;

&lt;p&gt;Your well being is much more important than delivering great software or making more money.&lt;/p&gt;

&lt;p&gt;At the same time, we understand that many don't have a choice. Many don't have the means to quit or the opportunity to work on great projects with remarkable people. So they feel trapped. Trapped because they know their work environment is limiting their growth. And that limitation prevents them from getting the skills to find a better job.&lt;/p&gt;

&lt;p&gt;It's like a vicious circle.&lt;/p&gt;

&lt;p&gt;But there's a solution... find mentors and invest in yourself!&lt;/p&gt;

&lt;h2&gt;
  
  
  Investing in yourself
&lt;/h2&gt;

&lt;p&gt;Let us say that again: Invest in yourself!&lt;/p&gt;

&lt;p&gt;In other words, invest in your (non-traditional) education.&lt;/p&gt;

&lt;p&gt;For example, developers may not value certain dev principles and practices that can boost their career progression until they know &lt;em&gt;why&lt;/em&gt; those principles are valuable in the workplace. Again, this knowledge usually comes from experiencing the asynchronous down effects of lousy dev decisions (and it takes time and a lot of effort to learn on your own!).&lt;/p&gt;

&lt;p&gt;The fastest and simplest way to learn the _why_s is by learning from experienced mentors (successful/experienced developers) you trust.&lt;/p&gt;

&lt;p&gt;And the faster you learn the &lt;em&gt;why_s, the quicker you progress. _(We call those the "a-ha!" moments.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We noticed that when our iOS dev students and mentees understand "the why" behind counterintuitive principles, many things start to click immediately. In turn, principles stop being an "annoying overhead," and instead, they become powerful tools in their dev arsenal (valuable skills!).&lt;/p&gt;

&lt;p&gt;Another insight from our students is the realization that there are no silver bullets in software development. Although many start their education by asking, "which is the best architecture" or "what design patterns should I learn," they quickly realize that everything depends on the needs of the business, the product, and the team.&lt;/p&gt;

&lt;p&gt;There is no "best architecture" or "best design pattern" to follow to solve all of their problems.By focusing on the needs of their systems, developers can cultivate the confidence to build custom solutions after carefully assessing challenges such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;complex domains&lt;/li&gt;
&lt;li&gt;technical debt&lt;/li&gt;
&lt;li&gt;time to market (short deadlines)&lt;/li&gt;
&lt;li&gt;limited team capacity&lt;/li&gt;
&lt;li&gt;cloudy requirements&lt;/li&gt;
&lt;li&gt;inadequate training&lt;/li&gt;
&lt;li&gt;low resources (time/money)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;leading to fantastic job offers, as excellent dev skills are in high demand and low supply!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The effects of seriously investing in your (non-typical) education result in a fulfilling professional and personal life.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Self-fulfillment, freedom of choice, financial rewards, and continuous learning are indicators of success.&lt;/p&gt;

&lt;p&gt;At the end of the day, there's no way to separate your professional and personal life fully, so experiencing a fulfilling career is essential for you to live a fulfilled life.&lt;/p&gt;

</description>
      <category>swift</category>
      <category>ios</category>
      <category>career</category>
      <category>learning</category>
    </item>
    <item>
      <title>How Deleting Swift Code Can Make You a More Valuable iOS Developer—Clean iOS Codebase Series</title>
      <dc:creator>⛩ Mike Apostolakis</dc:creator>
      <pubDate>Wed, 05 Jun 2019 12:07:51 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/how-deleting-swift-code-can-make-you-a-more-valuable-ios-developer-clean-ios-codebase-series-1jgo</link>
      <guid>https://forem.com/essentialdeveloper/how-deleting-swift-code-can-make-you-a-more-valuable-ios-developer-clean-ios-codebase-series-1jgo</guid>
      <description>&lt;p&gt;The ability to develop and maintain a clean iOS codebase is essential to becoming a remarkable iOS Developer.&lt;/p&gt;

&lt;p&gt;A simple but extremely valuable action you can take is removing unused code—mercilessly.&lt;/p&gt;

&lt;p&gt;At the same time, we meet many developers afraid of deleting code &lt;em&gt;because they might need it in the future&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Today, you’ll learn two ways for retrieving deleted code from a &lt;em&gt;git&lt;/em&gt; repository and how good practices for commits facilitate the maintenance of a clean iOS codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Good practices for commits
&lt;/h2&gt;

&lt;p&gt;We teach our students and mentees to break down their changes in tiny/concise commits with explicit and descriptive messages.&lt;/p&gt;

&lt;p&gt;Tiny, single-focused, commits with detailed messages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make code easier to review, change, and maintain.&lt;/li&gt;
&lt;li&gt;Serve as documentation.&lt;/li&gt;
&lt;li&gt;Facilitate and reduce the cost of undoing changes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We recommend you to commit every time the behavior or state of the codebase changes while maintaining a green state (all tests passing), regardless of how small the changes are (the smallest, the better).&lt;/p&gt;

&lt;p&gt;As a result, you’ll deal with smaller and less risky changes and become more adaptable as you’ll be free to explore solutions, revert, and restore their changes.&lt;/p&gt;

&lt;p&gt;Usually, two is the ideal number of changed files per commit as we’re writing production code and tests at the same time. Refactoring commits change generally only one file but occasionally may affect more when we change a public interface.&lt;/p&gt;

&lt;p&gt;Tight coupling between components is often what prevents developers from contributing in small chunks. Thus, the ability to edit only a small number of files per commit can signify a positive loosely-coupled relationship between components of the system!&lt;/p&gt;

&lt;p&gt;In other words, a system designed with good abstractions allows you to change specific components without affecting others, making changes in the codebase easier, faster, and less risky. On the contrary, lousy abstractions will force you to edit multiple components, in various files, at the same time, even for minor changes (increasing the risk for mistakes and merge conflicts, slowing down the team).&lt;/p&gt;

&lt;h2&gt;
  
  
  Reverting a commit
&lt;/h2&gt;

&lt;p&gt;If you follow the &lt;em&gt;commit&lt;/em&gt; good practices (concise changes with a descriptive message), reverting changes becomes very simple and cheap—close to zero undo-cost!&lt;/p&gt;

&lt;p&gt;For example, in the persistence module of the Essential Developer Academy: iOS Lead Essentials course, we demonstrated how to create supple abstractions enabling seamless replacement of any underlying caching mechanisms.&lt;/p&gt;

&lt;p&gt;By using that abstraction, we created two production-ready caching implementations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A &lt;code&gt;Codable&lt;/code&gt; implementation backed by the file system using the &lt;code&gt;FileManager&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;Core Data&lt;/code&gt; implementation with a persistent &lt;code&gt;SQLite&lt;/code&gt; store. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Although both solutions work and perform well, we need a single persistence implementation. &lt;code&gt;Core Data&lt;/code&gt; is a more robust fit for the app we’re creating in the course; thus, we opted to—fearlessly—delete the &lt;code&gt;Codable&lt;/code&gt; implementation.&lt;/p&gt;

&lt;p&gt;We bundled the file deletions in a concise, single-focus commit, containing only:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the deletion of the &lt;code&gt;Codable&lt;/code&gt; store implementation’s production file&lt;/li&gt;
&lt;li&gt;the deletion of the &lt;code&gt;Codable&lt;/code&gt; store implementation’s test file&lt;/li&gt;
&lt;li&gt;any changes made by Xcode in the project structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, the commit held the following message describing the changes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Delete the &lt;code&gt;CodableFeedStore&lt;/code&gt; in favor of the &lt;code&gt;CoreDataFeedStore&lt;/code&gt; (we just need one in this project). If needed, of course, we can revert this commit and restore the &lt;code&gt;Codable&lt;/code&gt; implementation.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By including &lt;strong&gt;only&lt;/strong&gt; the minimal necessary changes in a commit, such as the deletion of a file or a variable rename, you can quickly &lt;code&gt;revert&lt;/code&gt; specific changes if you ever need to. To do so, all is required is the hash of the commit you want to revert.&lt;/p&gt;

&lt;p&gt;To revert a commit, simply run &lt;code&gt;git revert &amp;lt;commit hash&amp;gt;&lt;/code&gt;. Git will then create a new commit, reverting the changes introduced by the given commit hash. Git will prompt you to edit the default message for the new commit with the reverted changes. The default message is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Revert “&amp;lt; given commit message &amp;gt;”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you are happy to use the default message you can skip the editing by running &lt;code&gt;git revert &amp;lt;commit hash&amp;gt; --no-edit&lt;/code&gt; instead. Notice the &lt;code&gt;--no-edit&lt;/code&gt; flag telling git that you don’t wish to edit the new commit message.&lt;/p&gt;

&lt;p&gt;As you develop iOS apps, you make many decisions like deleting code. You should be able to freely change your mind and restore changes with minimum friction and cost.&lt;/p&gt;

&lt;p&gt;In our case, we know we may change our minds and decide to bring back the &lt;code&gt;Codable&lt;/code&gt; store. Thus, we could only &lt;em&gt;fearlessly&lt;/em&gt; make this change because it’s an easy change to undo (low cost). It’s easy to undo because we’ve created:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A supple abstraction that decouples our production and test code from the concrete backing store.&lt;/li&gt;
&lt;li&gt;A concise—single-focus—commit for the code deletion.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;A concise git history, with carefully written messages, can help developers understand the history of changes, creating a three-dimensional view of the code, where time becomes an axis we can travel on.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Extracting deleted files from messy commits
&lt;/h2&gt;

&lt;p&gt;A &lt;em&gt;git history&lt;/em&gt; with contributions that contain many &lt;em&gt;non-specific changes&lt;/em&gt; per single commit, can make reverting a &lt;em&gt;specific change&lt;/em&gt; very hard (or impossible!).&lt;/p&gt;

&lt;p&gt;For example, you wouldn’t be able to quickly revert &lt;em&gt;only&lt;/em&gt; a deleted file if the commit also introduced important business logic changes. If you tried to revert the commit, you would also revert the important business logic changes (which you probably don’t want to do!).&lt;/p&gt;

&lt;p&gt;When reverting a specific file deletion in a commit (the easy way) is not an option, you can use an alternative technique by broadening your search scope for the deleted file (the hard way).&lt;/p&gt;

&lt;p&gt;In the following process, you’ll learn how to find the deleted files, inspect and restore them. Of course, you can customize this process and optimize your workflow to your needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;em&gt;Get a list of all the deleted files in the repository&lt;/em&gt;:
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;git log --diff-filter=D --summary | grep delete&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;--diff-filter=D&lt;/code&gt; argument, tells git to select only files that are deleted and the &lt;code&gt;--summary&lt;/code&gt; flag to instructs git to format the output to contain a condensed summary of extended header information including the mode changes, which we can then filter the printed deletions with &lt;code&gt;grep&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This command will yield the full path of all deleted files. There you can find the full path of the file you'd like to restore which is required for the next steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;em&gt;Get a list of all commits that contained the deleted file&lt;/em&gt;:
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;git log --all --full-history -- &amp;lt;file path&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;First, when typing the command, make sure to add a space between the &lt;code&gt;--&lt;/code&gt; and the file path, as the dashes denote a separator and not an argument for this command.&lt;/p&gt;

&lt;p&gt;The command above will yield a list of all the commits containing the deleted file.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;--all&lt;/code&gt; and &lt;code&gt;--full-history&lt;/code&gt; flags tell git to search &lt;strong&gt;all the branches&lt;/strong&gt; containing commits referencing the deleted file, instead of just the current branch. This functionality comes in handy when working in teams and large scale projects that there are multiple branches created in the repository, and you know you're not the only one making changes in the codebase. By not including the &lt;code&gt;--all&lt;/code&gt; and &lt;code&gt;--full-history&lt;/code&gt; options you could potentially miss significant changes that you weren't aware.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;em&gt;Find the version of the file you want, and show its contents&lt;/em&gt;:
&lt;/h3&gt;

&lt;p&gt;Now that you have the hash of the deleted commit and the file path of the file you’re looking to restore, you can ask git to show you the file to review its contents. Simply run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git show &amp;lt;commit hash&amp;gt; -- &amp;lt;file path&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Again, make sure you add a space between the &lt;code&gt;--&lt;/code&gt; and the file path.&lt;/p&gt;

&lt;p&gt;This is an optional step, but can be essential to validate you’re restoring the correct file!&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;em&gt;Restore the deleted file into your working directory&lt;/em&gt;:
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;git checkout &amp;lt;commit hash&amp;gt;^ -- &amp;lt;file path&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;By running the above command git will &lt;strong&gt;restore&lt;/strong&gt; and &lt;strong&gt;stage&lt;/strong&gt; the addition of the new file and its contents to your current working directory.&lt;/p&gt;

&lt;p&gt;The caret symbol (^) denotes that the parent of the given commit will be used, instead. That's because, in the given commit, the file remains deleted, meaning it doesn't exist; thus, you need to instruct git to look at the commit &lt;em&gt;before&lt;/em&gt; it (parent) to fetch the missing file.&lt;/p&gt;

&lt;h2&gt;
  
  
  “But I don’t use git!”
&lt;/h2&gt;

&lt;p&gt;Regardless of the version-control system you use, you can apply those simple, but essential techniques to maintain a clean iOS codebase.&lt;/p&gt;

&lt;p&gt;The goal is to break down your contributions in tiny, concise batches so you can manipulate them easily!&lt;/p&gt;

&lt;h2&gt;
  
  
  Maintaining a clean iOS codebase
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Clean iOS codebases consist of sequences of carefully thought commits.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;By being disciplined with your contributions and keeping the codebase clean and well organized, you gain various degrees of freedom as you move forward, such as easily reviewing, maintaining, deleting, and reverting code.&lt;/p&gt;

&lt;p&gt;Unfortunately, we see many codebases needlessly carrying unused code. The “dead” code adds a time overhead with every build and test run. Moreover, the unused code can cause significant confusion to new team members as they have to research about its reference or ask other team members about its lack of usage and existence in the codebase.&lt;/p&gt;

&lt;p&gt;As a professional iOS developer, you’re also a risk manager. By proactively thinking about your future needs and spending a few seconds to organize your contributions properly, you and your team save hours of pain and wasted hours in the long run!&lt;/p&gt;

</description>
      <category>ios</category>
      <category>git</category>
      <category>swift</category>
      <category>mastery</category>
    </item>
    <item>
      <title>Why iOS Developers Feel Stuck In Their Careers &amp; What To Do</title>
      <dc:creator>⛩ Mike Apostolakis</dc:creator>
      <pubDate>Tue, 28 May 2019 16:05:56 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/why-ios-developers-feel-stuck-in-their-careers-what-to-do-3imp</link>
      <guid>https://forem.com/essentialdeveloper/why-ios-developers-feel-stuck-in-their-careers-what-to-do-3imp</guid>
      <description>&lt;p&gt;We have been receiving messages and questions from iOS developers of all levels asking for advice on how to evolve professionally and financially.&lt;/p&gt;

&lt;p&gt;The messages usually start with “I feel stuck,” followed by questions like “Should I learn Android/Backend Development?” This pattern indicates that iOS developers are looking to progress in their careers, which is fantastic! But they end up finding suboptimal solutions, such as deciding to become more “generalized” developers (constantly jumping to new technologies &amp;amp; frameworks). When, in fact, we’ve learned that “specialized” developers (mastering specific technologies &amp;amp; foundational concepts) achieve much better outcomes.&lt;/p&gt;

&lt;p&gt;In this article, we have gathered some essential findings from our research and discussions we had with iOS developers to help you progress faster in your career and achieve your professional and financial goals. You’ll learn insights on the following key topics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How unrealistic expectations prevent iOS developers from progressing professionally. &lt;/li&gt;
&lt;li&gt;The most common challenges and aspirations of iOS developers we meet.&lt;/li&gt;
&lt;li&gt;What iOS developers can do to prevent and/or overcome these challenges and achieve an enriching and fulfilling career.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Beware of setting unrealistic expectations
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;One of the biggest problems we see that many developers face is setting unrealistic expectations regarding the time needed for achieving their goal&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is imperative to understand the timeframe required to cultivate a particular skill. Also, realize that everyone learns at a different speed.&lt;/p&gt;

&lt;p&gt;In many cases, developers expect to learn a skill faster than the actual time required. Since their expectations aren’t met, they end up dropping the learning process and subsequently stop evolving.&lt;/p&gt;

&lt;p&gt;As discussed in the video &lt;a href="https://www.essentialdeveloper.com/articles/number-1-reason-why-you-dont-improve-as-a-software-developer"&gt;“#1 Reason Why You Don’t Improve As a Software Developer,”&lt;/a&gt; the main reason that developers can’t seamlessly progress in their career is that they prematurely stop the learning process. They stop before the “a-ha!” moments. Before the learning occurs.&lt;/p&gt;

&lt;p&gt;Why is this happening? One key reason is setting unrealistic expectations.&lt;/p&gt;

&lt;p&gt;For example, we’ve talked to many folks that expected to improve their skills by just reading a book, watching some videos or even, in some cases, by being promoted to a more senior role and taking on more responsibility. That’s rarely the case.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Technical excellence comes through continuous learning, practice, and execution.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It’s imperative to understand that improvement takes time and comes in multiple forms. For instance, if your goal is to learn Test-Driven-Development (TDD), you need to recognize that the learning process itself is a crucial element contributing to your improvement.&lt;/p&gt;

&lt;p&gt;Improving your learning i.e., enduring longer learning sessions, learning faster, finding better sources, becoming more consistent, deliberate practice, and applying what you’ve learned, are catalysts for achieving your goals. Although such practices may not refer to TDD directly, they all facilitate the underlying path you need to take to reach the goal of getting better at TDD or any other skill. &lt;strong&gt;They refer to learning as a process.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In other words, you can learn how to learn better (&amp;amp; faster).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Another reason why iOS developers stop the learning process is the perception of not having enough spare time &lt;em&gt;currently&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If the time allocated for learning—an essential component in increasing your professional value and financial returns—is perceived as &lt;strong&gt;spare&lt;/strong&gt; , it’s natural to become eager to stop. That’s because &lt;strong&gt;spare denotes a surplus&lt;/strong&gt; or a &lt;strong&gt;nice to have&lt;/strong&gt;. However, in this case, developers are actually dealing with a &lt;strong&gt;deficit in their expected value&lt;/strong&gt; or a &lt;strong&gt;must have&lt;/strong&gt;. Learning needs are a &lt;strong&gt;must have&lt;/strong&gt; because they are identified aspects of your professional skill set that can be improved to generate better outcomes (and rewards!).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OvXkVjUt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/neqxejmz8q5aj46ed2sm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OvXkVjUt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/neqxejmz8q5aj46ed2sm.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the graph above, you can see how we have highlighted the dip of the green line also labeled “Uncomfortable zone.” That’s the stage where students go through materials, ideas, principles, etc. that are unknown to them. That’s also the stage where growth and productivity seems to fall drastically, so many quit before the breakthrough (green line peak).&lt;/p&gt;

&lt;p&gt;It’s common and natural to feel stuck when learning something new. It may even be appealing to stop learning because of the &lt;strong&gt;unknown return on investment&lt;/strong&gt;. &lt;em&gt;“What if I’m just wasting time?” “Will this pay off?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The good news is that you are not alone or on “uncharted territory.” Advanced topics, such as TDD and Modular Architecture, have been mastered by many developers in the industry. So when in doubt about the return on investment when learning such skills, you can study their careers, articles, books, talks, and see if it was worth it. Also, of course, feel free to ask their opinion if you can!&lt;/p&gt;

&lt;p&gt;We often see iOS developers who want better skills and being capable of better results (and rewards!); however, they aren’t aware of how to achieve it. &lt;strong&gt;iOS Developers really want a remarkable career, so complacency is not the issue&lt;/strong&gt;. The lack of investment in learning happens because many times, we just aren’t incentivized enough to justify learning as a rational investment. The immediate short-term happiness and utility we get from allocating our resources to more comfortable or familiar options seem like a better investment (with potential huge long-term loss).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Learning XYZ is hard. Maybe I should be spending my time doing something more entertaining.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you experience such thoughts, don’t feel bad. We can assure you that’s natural. Even the most accomplished students face these kinds of thoughts. They just get extremely good at ignoring them. They actually get enormous satisfaction and happiness by shutting those thoughts down as they’re getting closer and closer to achieving their ambitious goals! These students are experiencing a fulfilling and enriching life.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Feeling stuck
&lt;/h2&gt;

&lt;p&gt;We have received dozens of emails and comments from developers feeling stuck in their careers. They come from all seniority levels and a lot of different educational backgrounds, including self-taught programmers, CS degree graduates, and boot camp graduates.&lt;/p&gt;

&lt;p&gt;The most prevalent challenges include the following issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ineffective cross-team communication with other developers and business/product folks.&lt;/li&gt;
&lt;li&gt;Being responsible for unrealistic expectations and being blamed for failed results.&lt;/li&gt;
&lt;li&gt;Lack of free time &amp;amp; resources to invest in functional training.&lt;/li&gt;
&lt;li&gt;Unrealistic expectations from the business side for dealing with inherited “legacy” codebases.&lt;/li&gt;
&lt;li&gt;Lack of proper processes when pushing to production.&lt;/li&gt;
&lt;li&gt;Less qualified professionals being compensated more.&lt;/li&gt;
&lt;li&gt;Translating iOS specific knowledge to other platforms, e.g., android/backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many developers don’t anticipate to face those issues, nor are they trained to deal with them.&lt;/p&gt;

&lt;p&gt;On the other hand, when we asked them to discuss their goals and aspirations, these are the most popular answers we’ve received:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Working with teams of more knowledgeable professionals (mentors) that can teach them how to effectively create and maintain a high-quality codebase (short &amp;amp; long-term).&lt;/li&gt;
&lt;li&gt;Working under great leadership.&lt;/li&gt;
&lt;li&gt;Working in worthwhile projects with remarkable people.&lt;/li&gt;
&lt;li&gt;Working in companies that give them space &amp;amp; resources for professional and personal growth.&lt;/li&gt;
&lt;li&gt;Receiving mentorship that leads to professional and personal growth.&lt;/li&gt;
&lt;li&gt;Developing skills to become a remarkable developer in the eyes of their peers.&lt;/li&gt;
&lt;li&gt;Gaining experience to lead a team of iOS developers effectively.&lt;/li&gt;
&lt;li&gt;Increasing compensation/bonuses/perks.&lt;/li&gt;
&lt;li&gt;Working under a more flexible schedule and/or remotely.&lt;/li&gt;
&lt;li&gt;Master software architecture and be able to create large scale apps effectively.&lt;/li&gt;
&lt;li&gt;Improve technical abilities and efficiency in automated testing.&lt;/li&gt;
&lt;li&gt;Learn how to work with and improve legacy codebases effectively.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stress less&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We can deeply understand and relate to these problems and aspirations as we have experienced many of them throughout our careers. Many of these items are not related directly to the discipline of programming; rather, they have to do with communication and economics. Programming is just a single activity of the daily multi-disciplined operations in the life of a professional iOS developer.&lt;/p&gt;

&lt;p&gt;The way we understand the underlying challenges iOS developers face in their careers is outlined through the following three-layered realization:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;“My goal is to build a profitable career building remarkable apps.” (aspiration)&lt;/li&gt;
&lt;li&gt;“Many of my professional challenges have nothing to do with building apps.” (realization)&lt;/li&gt;
&lt;li&gt;“I don’t know how to deal with such challenges (feeling stuck), but to progress faster in my career, I do know I have to find the answers.” (action)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The faster you go through those phases, the faster you’ll achieve a prosperous and fulfilling career.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Getting unstuck: combining technical excellence with real-life business challenges
&lt;/h2&gt;

&lt;p&gt;The common pattern for many iOS developer careers is an initial struggle to get an opportunity in the iOS market, followed by a fairly quick career (&amp;amp; salary) progression, then stagnation as a mid/senior developer.&lt;/p&gt;

&lt;p&gt;Many iOS developers are experiencing frustration in their day-to-day professional life, and they feel stuck. They don't know what to do or where to search to get through these challenges. Most importantly, &lt;strong&gt;these are not only technical challenges&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;_Software development is a social activity, and it comes with social challenges too. &lt;strong&gt;In a job market with increasingly more participants and more significant challenges, developers that can collaborate well and lead with Empathy, Integrity, Economics in mind will thrive.&lt;/strong&gt; _&lt;/p&gt;

&lt;p&gt;We recognized this phenomenon in the professional lives of iOS developers and founded the &lt;em&gt;Essential Developer Academy&lt;/em&gt; to provide a solution and accelerate the career growth rate of iOS developers around the world. By continuously studying our most successful students, we have concluded that iOS Developers need two essential elements:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Exceptionally well-thought education integrating technical excellence and leadership to tackle real-life business challenges.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Caring for long-term success equally as the short-term success.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Transforming your challenges into opportunities
&lt;/h2&gt;

&lt;p&gt;The demand for Technical Excellence and Leadership skills in the iOS market is skyrocketing. However, only a few are mastering the skills to tackle those challenges effectively. Ignoring such market needs will lead to stagnation and a massive amount of money left on the table.&lt;/p&gt;

&lt;p&gt;When you develop the skills to tackle business challenges and market yourself accordingly efficiently, you become a vital asset to any company striving to adapt and overcome the never-ending opportunities of the business world.&lt;/p&gt;

&lt;p&gt;As mentors, educators, and iOS developers, we have been helping many iOS developers break free of salary/market caps and achieve professional and financial independence, with integrity. However, an enriching and fulfilling career doesn’t come easy. It requires dedication, and we’ve learned that, &lt;em&gt;not every iOS developer will do what it takes to achieve their dreams&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;To maximize and accelerate your career growth, we recommend you to find mentors that understand what makes successful iOS developers thrive and can help you achieve your best potential. Then, &lt;strong&gt;learn, practice, and execute continuously!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>leadership</category>
      <category>learning</category>
      <category>career</category>
    </item>
    <item>
      <title>How to prepare for an iOS interview</title>
      <dc:creator>⛩ Mike Apostolakis</dc:creator>
      <pubDate>Mon, 08 Oct 2018 07:35:23 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/how-to-prepare-for-an-ios-interview-h1f</link>
      <guid>https://forem.com/essentialdeveloper/how-to-prepare-for-an-ios-interview-h1f</guid>
      <description>&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%2Fstatic1.squarespace.com%2Fstatic%2F5891c5b8d1758ec68ef5dbc2%2Ft%2F5bba2aba1905f431b731c82e%2F1538927476719%2FEssential_Developer_thumbnail_v01.png%3Fformat%3D1000w" 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%2Fstatic1.squarespace.com%2Fstatic%2F5891c5b8d1758ec68ef5dbc2%2Ft%2F5bba2aba1905f431b731c82e%2F1538927476719%2FEssential_Developer_thumbnail_v01.png%3Fformat%3D1000w" alt="Essential_Developer_thumbnail_v01.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A question we are frequently asked, usually by less experienced iOS developers, is how to prepare for an iOS interview. Most candidates look for our advice for preparing on technical details such as what frameworks or libraries to invest their time in, what architectural patterns should they be using, and other technical details. We believe that it is essential to acquire the knowledge and develop a proper understanding of such tools and notions and the ability to use them efficiently. Moreover, we like to introduce developers in thinking somewhat differently when considering changing jobs or even starting a career in software development, emphasizing on the relationship and mutual benefits for both you, the employee, and your future employer.&lt;/p&gt;

&lt;p&gt;If your goal as a candidate, is solely to receive an offer, regardless the characteristics of the employer and team, then you should probably focus on two aspects; answering all the questions correctly during the interview and convincing the interviewers that you can deliver what they require. You can approach interviews as a “number’s game” where the more of them you attend, the more offers will get if you’re meeting the criteria, especially when the demand for iOS developers in the job market is high.&lt;/p&gt;

&lt;p&gt;However, becoming capable of passing interviews with only short-term goals may very well not work for the best in the long-run. While it can be exciting (and scary) in the beginning to prepare for and jump into the deep waters of commercial software development, we believe you ought to think what kind of career you’d like to have. Because the career is what’s important. That’s how you’ll spend most of your time, opposed to the interview process that overall might take less than ten hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passing an iOS interview as a skill
&lt;/h2&gt;

&lt;p&gt;In all the years being responsible for hiring new developers for our teams, we’ve seen competent candidates performing suboptimally during interviews due to the stress and pressure they experience. It's not uncommon during the interview process (over the phone or in person) for fear to kick in because of many unknown elements candidates might be facing. For example, such elements may consist of the environment like the room or office space or questions that the candidate might not know how to answer immediately. Moreover, the lack of instant feedback from interviewers may lead candidates to a false perception that the interview is going bad, which can influence their performance.&lt;/p&gt;

&lt;p&gt;Although it may sound counterintuitive, a way to overcome such fears is by accumulating more experience at interviews. By attending a lot of interviews and testing yourself, regardless if you progress to the next stage or not, you can identify weak spots on your performance and start working on them. Perhaps you may feel that you are strong technically, but lacking good communication skills. Or even the opposite. What's important is to identify what improvements you need to undergo and work on them yourself or expedite the process by asking help from expert coaches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a career as an investment
&lt;/h2&gt;

&lt;p&gt;Joining a new team is a gamble for both the newcomer and for the hiring team, as both have only established assumptions as to how the other party will perform in the future. Of course, this shouldn’t stop you from being thorough and conduct your “due diligence” of potential employers, the market they operate in, the products they produce, the growth and problems that might have faced over the years. &lt;strong&gt;Most importantly you should be able to justify how you will be able to contribute to the company’s needs and at the same time how the company will contribute to the increase in your market value&lt;/strong&gt;. You should be able to ask these questions during the interview process and develop metrics and filters throughout your career. By thinking in terms of reciprocity, you can align your incentives with other developers and businesses and try to create a mutually beneficial relationship.&lt;/p&gt;

&lt;p&gt;Because of the dynamics in the capital and job markets, we have reached a point where a significant portion of developers jump between jobs every six to twelve months. We believe that this period doesn’t suffice to create meaningful relationships and exchange maximum value with a company or a team. Moreover, in an ever increasing pool of iOS developers (increase in supply in the job market), competition may start becoming more fierce. &lt;strong&gt;Relying only on technical excellence can be a risky proposition when we already know that teams require qualities such as sound&lt;/strong&gt; &lt;a href="https://essentialdeveloper.com/articles/ios-interview-experience-7-essential-nontechnical-skills" rel="noopener noreferrer"&gt;&lt;strong&gt;leadership, communication, and risk assessment to function optimally&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Finally, most importantly, such a mindset isn’t constrained by seniority levels. &lt;strong&gt;Regardless the years of prior commercial experience, your attitude should promote the eagerness for personal and communal continuous improvement through the pursuit of creating more value for others.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;In summary, each interview process is different, and the candidate’s incentives will vary from time to time. Being offered roles solely based on your technical skills and/or your seniority level may work well in the short-run. However, if you want to build meaningful collaborations with other developers and companies, you’ll need to fill the needs of non-technical nature. Many companies aren’t looking just for programmers, but for people that can provide solutions to a plethora of internal problems that might be facing. You shouldn’t be afraid to ask the interviewers about what may be valuable to you to know, as it’s probably the first substantial step to start developing a foundation for reciprocity. Even if the interview process doesn’t move forward, it’s advised to maintain a friendly an open attitude towards the business or the interviewers, as your paths may cross again in the future.&lt;/p&gt;




&lt;p&gt;We’ve been helping dedicated developers to get from low paying jobs to high tier roles. Sometimes in a matter of weeks! To do so, we continuously run and share free market researches. Learn how to improve your skills with Empathy, Integrity, and Economics in mind. If you want to step up in your career, &lt;a href="https://www.essentialdeveloper.com/courses/career-and-market-strategy-for-professional-ios-developers" rel="noopener noreferrer"&gt;access now our latest research for free&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://www.essentialdeveloper.com/articles/how-to-prepare-for-an-ios-interview" rel="noopener noreferrer"&gt;www.essentialdeveloper.com&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let’s connect
&lt;/h2&gt;

&lt;p&gt;If you enjoyed this article, visit us at &lt;a href="https://essentialdeveloper.com" rel="noopener noreferrer"&gt;https://essentialdeveloper.com&lt;/a&gt; and get more in-depth tailored content like this.&lt;/p&gt;

&lt;p&gt;Follow us on: &lt;a href="https://youtube.com/essentialdeveloper" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; • &lt;a href="https://twitter.com/essentialdevcom" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; • &lt;a href="https://facebook.com/essentialdeveloper" rel="noopener noreferrer"&gt;Facebook&lt;/a&gt; • &lt;a href="https://github.com/essentialdevelopercom" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>ios</category>
      <category>leadership</category>
      <category>learning</category>
    </item>
    <item>
      <title>Culture of Integrity Within Successful Software Teams</title>
      <dc:creator>⛩ Mike Apostolakis</dc:creator>
      <pubDate>Thu, 13 Sep 2018 13:15:14 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/culture-of-integrity-within-successful-software-teams-3i81</link>
      <guid>https://forem.com/essentialdeveloper/culture-of-integrity-within-successful-software-teams-3i81</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--827yyNFo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static1.squarespace.com/static/5891c5b8d1758ec68ef5dbc2/t/5b99f290758d4663942c2ca4/1536815772952/EssentialDeveloper_Enxoval_Thumbnail_12-09-v02.png%3Fformat%3D1000w" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--827yyNFo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static1.squarespace.com/static/5891c5b8d1758ec68ef5dbc2/t/5b99f290758d4663942c2ca4/1536815772952/EssentialDeveloper_Enxoval_Thumbnail_12-09-v02.png%3Fformat%3D1000w" alt="EssentialDeveloper_Enxoval_Thumbnail_12-09-v02.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The macOS dictionary defines “integrity” as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;integrity | inˈteɡrədē |&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;noun&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;1. the quality of being honest and having strong moral principles; moral uprightness: he is known to be a man of integrity.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;2. the state of being whole and undivided: upholding territorial integrity and national sovereignty.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What we can conclude from this definition is that &lt;strong&gt;Integrity&lt;/strong&gt; can be perceived and expressed differently depending on the environment we operate in. For example, the second definition of “being a whole and undivided” may not apply when working alone, thus, if we want to act with integrity, we can rely on the first definition: setting and consistently upholding strong moral principles by ourselves.&lt;/p&gt;

&lt;p&gt;When working in a team though, if we want to operate with integrity, the first definition holds true for the individual; however, it is maximized through the state of being whole and undivided as a team. Meaning that we can’t act with integrity as a team unless we act with integrity as individuals first. The effects of the sum of our individual actions will reflect as the behavior traits of the team.&lt;/p&gt;

&lt;p&gt;Functional teams operate with shared values and principles that they will never compromise for quick conveniences. Thus, forming team Integrity.&lt;/p&gt;

&lt;p&gt;At Essential Developer, we have adopted &lt;strong&gt;Integrity&lt;/strong&gt; as one of our three pillars that form the foundation of our principles, along with &lt;strong&gt;Empathy&lt;/strong&gt; and &lt;strong&gt;Economics&lt;/strong&gt;. We believe that, in the context of a business, to achieve a level of high performance and being unified as a whole with a team full of people holding the same values we must first be able to grasp the possible effects of our actions. Every action we take will influence both our team members and the business. We opt to study and practice &lt;strong&gt;Empathy&lt;/strong&gt; over morality, to understand how we can maximize the probability of our actions to impact our fellow team members positively. And &lt;strong&gt;Economics&lt;/strong&gt; to influence the collective outcome positively.&lt;/p&gt;

&lt;p&gt;At the same time, the &lt;strong&gt;Team&lt;/strong&gt;  &lt;strong&gt;Integrity&lt;/strong&gt; will affect us as individuals, so we must carefully choose who we work with.&lt;/p&gt;

&lt;p&gt;We’ve been helping dedicated developers to get from low paying jobs to &lt;strong&gt;high tier roles – sometimes in a matter of weeks!&lt;/strong&gt; To do so, we continuously run and share free market researches on how to improve your skills with &lt;strong&gt;Empathy, Integrity, and Economics&lt;/strong&gt; in mind. If you want to step up in your career, &lt;a href="https://www.essentialdeveloper.com/courses/career-and-market-strategy-for-professional-ios-developers"&gt;access now our latest research for free&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://www.essentialdeveloper.com/articles/culture-of-integrity-within-successful-software-teams"&gt;www.essentialdeveloper.com&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let’s connect
&lt;/h2&gt;

&lt;p&gt;If you enjoyed this article, visit us at &lt;a href="https://essentialdeveloper.com"&gt;https://essentialdeveloper.com&lt;/a&gt; and get more in-depth tailored content like this.&lt;/p&gt;

&lt;p&gt;Follow us on: &lt;a href="https://youtube.com/essentialdeveloper"&gt;YouTube&lt;/a&gt; • &lt;a href="https://twitter.com/essentialdevcom"&gt;Twitter&lt;/a&gt; • &lt;a href="https://facebook.com/essentialdeveloper"&gt;Facebook&lt;/a&gt; • &lt;a href="https://github.com/essentialdevelopercom"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>teamwork</category>
      <category>culture</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Junior iOS Developers Can Be More Productive Than They Think</title>
      <dc:creator>⛩ Mike Apostolakis</dc:creator>
      <pubDate>Fri, 07 Sep 2018 05:46:46 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/junior-ios-developers-can-be-more-productive-than-they-think-520p</link>
      <guid>https://forem.com/essentialdeveloper/junior-ios-developers-can-be-more-productive-than-they-think-520p</guid>
      <description>&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%2Fstatic1.squarespace.com%2Fstatic%2F5891c5b8d1758ec68ef5dbc2%2Ft%2F5b920ba3758d469ab9e6e46c%2F1536297923193%2FEssential-Developer-thumbnail_v02.png%3Fformat%3D1000w" 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%2Fstatic1.squarespace.com%2Fstatic%2F5891c5b8d1758ec68ef5dbc2%2Ft%2F5b920ba3758d469ab9e6e46c%2F1536297923193%2FEssential-Developer-thumbnail_v02.png%3Fformat%3D1000w" alt="Essential-Developer-thumbnail_v02.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When we teach beginner and junior iOS developers it’s not uncommon for us to observe a false sense of low productivity and lack of accomplishment by them. We notice that many new and motivated programmers sit for hours, practicing, attending courses, watching videos and searching online for potential solutions to their problems. However, when we periodically ask them to give us a picture of how they feel they often respond negatively or with doubt as they couldn’t move forward on their project at the pace they expected. This is a false perception as we believe Junior iOS Developers can be much more productive than they think they are.&lt;/p&gt;

&lt;p&gt;Unfortunately, what a lot of young programmers don’t understand is that they measure their productivity with false metrics, such as lines of code produced per day. For example, assuming that a new developer aspires to be able to build successful products consisting of thousands of lines of code, it’s only natural for them to feel like they are “not getting close to their goal.” Building such complex systems can be an incredibly overwhelming task for a beginner. In reality, they are just setting up almost unachievable goals for their current experience. It takes years of practice to achieve the level of proficiency to carefully craft a clean and sustainable complex system.&lt;/p&gt;

&lt;p&gt;At Essential Developer, we teach our students that becoming a proficient software developer is a long and complex process. Not only it requires mastering the technical but also the social aspect of creating a system. Learning to understand how people and businesses operate and how to effectively collaborate is essential. Two skills can help beginners endure, the ability to persist over adversity and always keep learning. Thus, &lt;strong&gt;we advise our students that if they end the day more knowledgeable and capable than they started, they are on the right path and should stop worrying.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We’ve been helping dedicated developers to get from low paying jobs to &lt;strong&gt;high tier roles – sometimes in a matter of weeks&lt;/strong&gt;! To do so, we continuously run and share free market researches on how to improve your skills with &lt;strong&gt;Empathy, Integrity, and Economics&lt;/strong&gt; in mind. If you want to step up in your career, &lt;a href="https://www.essentialdeveloper.com/courses/career-and-market-strategy-for-professional-ios-developers" rel="noopener noreferrer"&gt;access now our latest research for free&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://www.essentialdeveloper.com/articles/junior-ios-developers-can-be-more-productive-than-they-think" rel="noopener noreferrer"&gt;www.essentialdeveloper.com&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let’s connect
&lt;/h2&gt;

&lt;p&gt;If you enjoyed this article, visit us at &lt;a href="https://essentialdeveloper.com" rel="noopener noreferrer"&gt;https://essentialdeveloper.com&lt;/a&gt; and get more in-depth tailored content like this.&lt;/p&gt;

&lt;p&gt;Follow us on: &lt;a href="https://youtube.com/essentialdeveloper" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; • &lt;a href="https://twitter.com/essentialdevcom" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; • &lt;a href="https://facebook.com/essentialdeveloper" rel="noopener noreferrer"&gt;Facebook&lt;/a&gt; • &lt;a href="https://github.com/essentialdevelopercom" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>productivity</category>
      <category>ios</category>
    </item>
  </channel>
</rss>
