<?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: ⛩ Caio Zullo</title>
    <description>The latest articles on Forem by ⛩ Caio Zullo (@caiozullo).</description>
    <link>https://forem.com/caiozullo</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%2F102673%2Fd7a084a0-2a4d-40fd-8852-056bb69f47b8.jpg</url>
      <title>Forem: ⛩ Caio Zullo</title>
      <link>https://forem.com/caiozullo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/caiozullo"/>
    <language>en</language>
    <item>
      <title>Decomposing Swift code into modules – Intro to modular design</title>
      <dc:creator>⛩ Caio Zullo</dc:creator>
      <pubDate>Wed, 21 Nov 2018 10:21:36 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/decomposing-swift-code-into-modules--intro-to-modular-design-2cdp</link>
      <guid>https://forem.com/essentialdeveloper/decomposing-swift-code-into-modules--intro-to-modular-design-2cdp</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/E0_3uTdCVew"&gt;
&lt;/iframe&gt;
 &lt;a href="https://www.youtube.com/watch?E0_3uTdCVew?list=PLyjgjmI1UzlT2jbk9WeqNrZhZyKpPPaWq" rel="noopener noreferrer"&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this episode, we zoom out from the component level view of &lt;a href="https://www.essentialdeveloper.com/articles/composable-code-can-be-simple-intro-to-dependency-diagrams-and-composition" rel="noopener noreferrer"&gt;the system created previously&lt;/a&gt; and we showcase how to organize it into modules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning Outcomes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Understand the representation of relationships of components and modules in a diagram&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Understand &lt;a href="https://www.essentialdeveloper.com/articles/clean-ios-architecture-part-2-good-architecture-traits" rel="noopener noreferrer"&gt;how concrete or modular a system is&lt;/a&gt; from its diagram representation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Understand that every system needs to be tailored, rather than fit a predefined template&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Understand that the process of abstracting needs to be applied incrementally&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Description
&lt;/h2&gt;

&lt;p&gt;We start things off by substituting the type names in the diagram with the name of the modules they belong to. For example, the &lt;code&gt;FeedViewController&lt;/code&gt; can belong to a &lt;code&gt;UI&lt;/code&gt; module, since it is responsible for rendering views and gathering user interactions, and the &lt;code&gt;RemoteFeedLoader&lt;/code&gt; to an &lt;code&gt;API&lt;/code&gt; module, as it is responsible &lt;a href="https://www.essentialdeveloper.com/articles/careful-with-singleton-lookalikes-way-too-common" rel="noopener noreferrer"&gt;for communicating with the network&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Moreover, we demonstrate various kinds of organization and modularity levels, and finally, we examine the case of the famous monolith, where all components belong to a single module and discuss possible tradeoffs.&lt;/p&gt;

&lt;p&gt;Understanding the tradeoffs and risks that each design brings can be a tremendous asset while moving forward with the development of our systems. As developers and risk managers we shouldn’t be searching for one-to-rule-them-all kind of solution (it doesn’t exist); instead, we can tailor a solution based on the available resources and requirements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/essentialdeveloper?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe now to our Youtube channel&lt;/a&gt; and catch &lt;strong&gt;free new episodes every week&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/decomposing-swift-code-into-modules-intro-to-modular-design" 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>ios</category>
      <category>swift</category>
      <category>learning</category>
      <category>mastery</category>
    </item>
    <item>
      <title>Composable Code Can Be Simple – Intro to dependency diagrams and composition</title>
      <dc:creator>⛩ Caio Zullo</dc:creator>
      <pubDate>Wed, 14 Nov 2018 12:53:45 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/composable-code-can-be-simple--intro-to-dependency-diagrams-and-composition-3dka</link>
      <guid>https://forem.com/essentialdeveloper/composable-code-can-be-simple--intro-to-dependency-diagrams-and-composition-3dka</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Mk34R-Q9-RE"&gt;
&lt;/iframe&gt;
 &lt;a href="https://www.youtube.com/watch?v=Mk34R-Q9-RE&amp;amp;t=0s&amp;amp;list=PLyjgjmI1UzlT2jbk9WeqNrZhZyKpPPaWq" rel="noopener noreferrer"&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this episode, we continue exploring the dependency inversion principle and composition, while documenting our system's evolution in diagrams.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning outcomes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Understand basic depiction of dependencies, abstractions and concrete types in diagrams&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Understand how diagrams translate into code and vice versa&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Understand how the &lt;a href="https://www.essentialdeveloper.com/articles/clean-ios-architecture-part-3-composing-types-in-swift" rel="noopener noreferrer"&gt;SOLID principles and composition&lt;/a&gt; are applied through the examples&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Understand differences and similarities between closures and protocols as abstractions in Swift (unnamed type signatures vs. strictly named types)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Visualizing the dependency graph
&lt;/h2&gt;

&lt;p&gt;Visualizing our code in diagrams can be a great framework to think while modeling &lt;a href="https://www.essentialdeveloper.com/articles/clean-ios-architecture-part-2-good-architecture-traits" rel="noopener noreferrer"&gt;the design of our systems&lt;/a&gt;. The early visualization of the design can make an excellent tool for communicating ideas to our colleagues and planning/coordinating a team effort. Diagrams can also help with &lt;a href="https://www.essentialdeveloper.com/articles/consequences-of-ineffective-communication-in-ios-teams" rel="noopener noreferrer"&gt;independent development&lt;/a&gt;, as the team can quickly plan new features design (5-10 minutes on a whiteboard), build them in parallel and later integrate the pieces without conflicting with the work of other developers.&lt;/p&gt;

&lt;p&gt;Moreover, diagrams serve as a great diagnostic tool as they embody the dependency graph of components and modules, revealing tight coupling and even retain cycles that could potentially lead to rigidity and &lt;a href="https://www.essentialdeveloper.com/articles/the-minimum-you-should-do-to-prevent-memory-leaks-in-swift" rel="noopener noreferrer"&gt;memory leaks&lt;/a&gt;. Learning how to draw and read diagrams is an excellent addition in the skillset of developers that aim to create sustainable codebases.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/essentialdeveloper?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe now to our Youtube channel&lt;/a&gt; and catch &lt;strong&gt;free new episodes every week&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/composable-code-can-be-simple-intro-to-dependency-diagrams-and-composition" 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>ios</category>
      <category>swift</category>
      <category>learning</category>
      <category>mastery</category>
    </item>
    <item>
      <title>Careful With “Singleton” Lookalikes (WAY TOO COMMON)</title>
      <dc:creator>⛩ Caio Zullo</dc:creator>
      <pubDate>Fri, 09 Nov 2018 15:16:47 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/careful-with-singleton-lookalikes-way-too-common-2hl5</link>
      <guid>https://forem.com/essentialdeveloper/careful-with-singleton-lookalikes-way-too-common-2hl5</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/YrLzLiAoOnY"&gt;
&lt;/iframe&gt;
 &lt;a href="https://www.youtube.com/watch?v=YrLzLiAoOnY&amp;amp;list=PLyjgjmI1UzlT2jbk9WeqNrZhZyKpPPaWq"&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you ever been told that Singleton is an anti-pattern?&lt;/p&gt;

&lt;p&gt;Well, Singletons can be ok, but if you are not careful, they aren’t just an anti-pattern. THEY CAN BE DANGEROUS!&lt;/p&gt;

&lt;p&gt;In this episode, we discuss the good and bad traits of the Singleton pattern, its common benefits and pitfalls, and showcase how dependency inversion can help us protect our systems in 4 simple steps.&lt;/p&gt;

&lt;p&gt;We received the following question from a member of the community:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I have been looking for a robust way to write a testable networking layer. And I am always confused about when and when not to use singletons. If you can answer these questions, I will be really grateful. Thank you for the video!”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is a Singleton?
&lt;/h2&gt;

&lt;p&gt;The Singleton pattern as described in the &lt;a href="https://www.essentialdeveloper.com/book-suggestions"&gt;Design Patterns book (GOF) by Gamma, Johnson, Vlissides, and Helm&lt;/a&gt; is a way to make sure that a class has only one instance and it provides a single point of access to it. The pattern specifies that the class itself should be responsible for keeping track of its sole instance. It can further ensure that no other instance can be created by intercepting requests for creating new objects and provide a way to access the sole instance.&lt;/p&gt;

&lt;p&gt;Moreover, to ensure that the class can't be instantiated from the outside world more than once, the singleton pattern prohibits the declaration of a visible to the module, initializer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a singleton with a lowercase "s"?
&lt;/h2&gt;

&lt;p&gt;A variation known as a singleton with a lowercase "s," constitutes a class that is being instantiated only one time in the whole lifecycle of the app, however, its API does not prohibit developers from creating a new instance of the class. The constraint is up to the developer's choice or discipline to instantiate it only once.&lt;/p&gt;

&lt;p&gt;Some examples of such objects are Apple’s &lt;code&gt;URLSession.shared&lt;/code&gt; and &lt;code&gt;UserDefaults.standard&lt;/code&gt;. Although they offer a shared instance for accessing an immutable reference of themselves, they also allow their clients to instantiate them through their initializers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Singletons vs. Global Mutable Shared State
&lt;/h2&gt;

&lt;p&gt;Another important point when it comes to singleton objects is not to be confused with mutable global shared state. Mutable global state is usually accessed by a &lt;code&gt;static sharedInstance&lt;/code&gt; of a class and allows the access and mutation of that reference (&lt;code&gt;static var&lt;/code&gt; instead of &lt;code&gt;static let&lt;/code&gt;). For example, a global mutable "Context" that provides access to various values and references such as &lt;code&gt;Date&lt;/code&gt;, &lt;code&gt;Networking&lt;/code&gt; and &lt;code&gt;Database&lt;/code&gt; components.&lt;/p&gt;

&lt;p&gt;Mutable global shared state can be risky but offers ease of use when it comes to accessing objects throughout the system and the easy configuration of the system environment (e.g., mocking the current time, locale, or network responses).&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples of good Singleton candidates
&lt;/h2&gt;

&lt;p&gt;So when should we use the singleton pattern?&lt;/p&gt;

&lt;p&gt;When we need precisely one instance of a class, and it must be accessible to clients from a well-known access point.&lt;/p&gt;

&lt;p&gt;For example, a class that logs messages to the console is a good candidate to do so, as the system may require access to it from any given point, plus we should only need its public API to log something, instead of re-creating and mutating its reference.&lt;/p&gt;

&lt;p&gt;Moreover, if we need to extend the functionality of that class, then the singleton pattern allows us to subclass or create extensions on the class type.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples of bad Singleton candidates
&lt;/h2&gt;

&lt;p&gt;The rule of thumb is to decide which objects should be created just once. Singleton objects should be rare in most systems and need to have a one-to-one relationship with the system. Meaning "it makes sense" or it’s &lt;em&gt;mandatory&lt;/em&gt; for a system to have only one "instance of such type."&lt;/p&gt;

&lt;p&gt;For example, Views are bad Singleton candidates as they should be able to allocate and deallocate memory on demand. The same holds for types of components such as Presenters, View Models, and Coordinators, for example.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dependency Inversion
&lt;/h2&gt;

&lt;p&gt;It's a common practice for libraries to use singleton objects instead of allowing us to instantiate internal classes to facilitate their use. Although this approach provides convenience for developers, it can create tight coupling in the system. A simple way to break the tight coupling and protect the rest of the system is to use dependency inversion instead of accessing the concrete singleton instance directly. By hiding the third-party dependency behind an interface that we own and we can extend (e.g., protocol/closure), we can keep the modules of our system free of knowing about the implementation details of another system. Such separation can protect our codebase from external library breaking changes.&lt;/p&gt;

&lt;p&gt;As we showcase in the video, our modules can break the tight coupling and internal dependency of a shared instance, by injecting and inverting the dependency of the shared instance.&lt;/p&gt;

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

&lt;p&gt;It's important to differentiate between bad and good Singletons.&lt;/p&gt;

&lt;p&gt;By unnecessarily introducing Singletons (especially as implicit dependencies) we can increase coupling and risk, thus the probability of introducing regressions and making mistakes. It may be ok initially, but we need to be proactive and identify when it’s time to invert dependencies and decouple the modules.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/essentialdeveloper?sub_confirmation=1"&gt;Subscribe now to our Youtube channel&lt;/a&gt; and catch &lt;strong&gt;free new episodes every week&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://www.essentialdeveloper.com/articles/careful-with-singleton-lookalikes-way-too-common"&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>testing</category>
      <category>ios</category>
      <category>swift</category>
      <category>learning</category>
    </item>
    <item>
      <title>“How do you think when writing tests?” – It’s simpler than you may think</title>
      <dc:creator>⛩ Caio Zullo</dc:creator>
      <pubDate>Thu, 01 Nov 2018 14:25:05 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/how-do-you-think-when-writing-tests--its-simpler-than-you-may-think-4ojk</link>
      <guid>https://forem.com/essentialdeveloper/how-do-you-think-when-writing-tests--its-simpler-than-you-may-think-4ojk</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/9CyIrbCNWPs"&gt;
&lt;/iframe&gt;
 &lt;a href="https://www.youtube.com/watch?v=9CyIrbCNWPs&amp;amp;list=PLyjgjmI1UzlT2jbk9WeqNrZhZyKpPPaWq" rel="noopener noreferrer"&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this episode, we reply to an important question raised by a member of our community.&lt;/p&gt;

&lt;h2&gt;
  
  
  Question
&lt;/h2&gt;

&lt;p&gt;“I'm trying to understand how you think when writing tests. Do you just try to cover everything that comes to mind or you have some kind of list with priorities? Or you just try to reach max possible coverage?﻿”&lt;/p&gt;

&lt;h2&gt;
  
  
  Answer
&lt;/h2&gt;

&lt;p&gt;We follow the basics. Our main process is to write the test first, see the test fail (red), then write the minimum amount of code to make the test pass (green), then refactor the code/test *if needed.* By following this process, we end up with pretty high coverage (not always 100% but very close to it). The coverage is not a direct goal. The coverage is more like a positive side effect of &lt;a href="https://www.essentialdeveloper.com/articles/whats-more-essential-for-developers-to-focus-on-result-or-process" rel="noopener noreferrer"&gt;following the process&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;With that said, it requires &lt;a href="https://www.essentialdeveloper.com/articles/the-importance-of-discipline-for-ios-programmers" rel="noopener noreferrer"&gt;discipline and skill&lt;/a&gt; to *always* write the test first. You may get stuck in the &lt;a href="https://www.essentialdeveloper.com/articles/junior-ios-developers-can-be-more-productive-than-they-think" rel="noopener noreferrer"&gt;beginning&lt;/a&gt;. We've been doing this for many years, and we still get stuck sometimes! However, the goal is never to be stuck for long. It's wasteful. At the end of the day, shipping is more important than testing first.  &lt;/p&gt;

&lt;p&gt;When you're stuck, spike some ideas. Go free, without tests (or anything else) in your way. Play with the code (Xcode Playgrounds, Swift REPL, Debugging...) until you're unstuck and found the solution you are happy with. Then think, "now that I know what I want to build, how could I have written the test first?"   &lt;/p&gt;

&lt;p&gt;When you have the answer, you can discard the spiked solution (commit the spike solution into a separate spike branch), and start fresh, by writing the test first. Next time you have to solve a similar problem, you know how to do it test-first without spiking.  &lt;/p&gt;

&lt;p&gt;We &lt;a href="https://www.essentialdeveloper.com/articles/number-1-reason-why-you-dont-improve-as-a-software-developer" rel="noopener noreferrer"&gt;practice, learn, and get a little bit better every day&lt;/a&gt;. The daily practice compounds!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/essentialdeveloper?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe now to our Youtube channel&lt;/a&gt; and catch &lt;strong&gt;free new episodes every week&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;

</description>
      <category>tdd</category>
      <category>testing</category>
      <category>swift</category>
      <category>productivity</category>
    </item>
    <item>
      <title>What’s More Essential for Developers to Focus On: Result or Process?</title>
      <dc:creator>⛩ Caio Zullo</dc:creator>
      <pubDate>Thu, 25 Oct 2018 12:10:11 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/whats-more-essential-for-developers-to-focus-on-result-or-process-4245</link>
      <guid>https://forem.com/essentialdeveloper/whats-more-essential-for-developers-to-focus-on-result-or-process-4245</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/IoN-TbTdvJY"&gt;
&lt;/iframe&gt;
 &lt;a href="https://www.youtube.com/watch?v=IoN-TbTdvJY"&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this video, I'd like to ask you an important question, but before that let me tell you what we believe to be one of the best skills a software developer can master: &lt;strong&gt;Long-term vision&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It might sound obvious, but in our experience, most developers focus on short-term gains in the endless pursuit of &lt;em&gt;Silver Bullets&lt;/em&gt; and &lt;em&gt;Magic Solutions&lt;/em&gt;, when the fastest route is usually patience.&lt;/p&gt;

&lt;p&gt;Why is the long-term so important? Most results in our life/career are asynchronous (good results take time) or are even out of our control. Instead of trying to control the result, we can visualize what the result can be (the long-term vision) but &lt;strong&gt;focus on the process to get there&lt;/strong&gt;. Even better, be flexible and welcome changes along the way!&lt;/p&gt;

&lt;p&gt;For example, &lt;strong&gt;&lt;a href="https://www.essentialdeveloper.com/professional-ios-engineering-season-1"&gt;Test Driven Development&lt;/a&gt;&lt;/strong&gt; is a discipline that can give you control over the development process. For TDD to work, it's required consistency. &lt;strong&gt;&lt;a href="https://www.essentialdeveloper.com/articles/the-importance-of-discipline-for-ios-programmers"&gt;Consistency is the key&lt;/a&gt;.&lt;/strong&gt; Consistency is the focus on the process. TDD is just an example, you can choose your own preferred process. But follow the process. Every day.&lt;/p&gt;

&lt;p&gt;Now, the important question I want to ask you: Right now, do you focus more on the result or the process to get there?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/essentialdeveloper?sub_confirmation=1"&gt;Subscribe now to our Youtube channel&lt;/a&gt; and catch &lt;strong&gt;free new episodes every week&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"&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/whats-more-essential-for-developers-to-focus-on-result-or-process"&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>learning</category>
      <category>mastery</category>
      <category>discuss</category>
    </item>
    <item>
      <title>iOS Interview Experience: Why You Didn't Pass the iOS Technical Test</title>
      <dc:creator>⛩ Caio Zullo</dc:creator>
      <pubDate>Mon, 22 Oct 2018 11:28:07 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/ios-interview-experience-why-you-didnt-pass-the-ios-technical-test-3egj</link>
      <guid>https://forem.com/essentialdeveloper/ios-interview-experience-why-you-didnt-pass-the-ios-technical-test-3egj</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C-ysc0g2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static1.squarespace.com/static/5891c5b8d1758ec68ef5dbc2/t/5bcdb144e4966bca9c928048/1540206947336/thumbnail.png%3Fformat%3D1000w" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C-ysc0g2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static1.squarespace.com/static/5891c5b8d1758ec68ef5dbc2/t/5bcdb144e4966bca9c928048/1540206947336/thumbnail.png%3Fformat%3D1000w" alt="thumbnail.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At Essential Developer, we help many developers go through the iOS Interview Experience. Recently, we got this message from one of the members of our community:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Hello Caio. I have recently had a job interview with a tech test, which&lt;/em&gt; &lt;strong&gt;&lt;em&gt;I completed in two days&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;and got rejected.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The story goes: I got a message from a&lt;/em&gt; &lt;strong&gt;&lt;em&gt;successful search/indexing company&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;willing to have an iOS interview with me. I had a 30 min conversation with an iOS developer from the company.&lt;/em&gt; &lt;strong&gt;&lt;em&gt;I don’t know what level they are looking for. I&lt;/em&gt;&lt;/strong&gt;  &lt;strong&gt;&lt;em&gt;said to him that I am at a mid-junior level&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;in my opinion. He said they were going to send me&lt;/em&gt; &lt;strong&gt;&lt;em&gt;a tech test to see how I organize code, objects, what architecture I use (they mentioned VIPER), design patterns, testing approaches, TDD, XP, etc&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;I tried following TDD for the test, but not entirely.&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;They replied with: "I appreciate the time you took and your interest in our company. Unfortunately, on this occasion, we have decided not to progress your application further. I really enjoyed talking to you, and I wish you success with your current job search.“&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;That’s it.&lt;/em&gt; &lt;strong&gt;&lt;em&gt;I don’t know what’s wrong with my project&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;. Can I send you the test description and my little project to hear your opinion on&lt;/em&gt; &lt;strong&gt;&lt;em&gt;how good or how bad it is&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most companies do not give full details of their decisions, and that’s fine. It’s their choice. As a job candidate after an iOS Interview Experience like that, it’s common to &lt;a href="https://www.essentialdeveloper.com/articles/ios-interview-experience-7-essential-nontechnical-skills"&gt;blame&lt;/a&gt; &lt;a href="https://www.essentialdeveloper.com/articles/ios-interview-experience-7-essential-nontechnical-skills"&gt;our technical skills first&lt;/a&gt;. Notice the &lt;em&gt;“how bad is it?”&lt;/em&gt; question. Such negative look of the events can discourage developers from further pursuing their dream job. Maybe it has nothing to do with the candidate’s skills. So it’s important to remember that there are many factors out of our control. However, for this blog post let’s focus and assume the motives for the rejection were solely technical.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tech test
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Given a text file:&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Write an application that outputs the individual words (ignore punctuation and capitalization) that appear in the text file, and how many times that word appears in the text file.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Output whether the number of times each word appears is a prime number.&lt;/em&gt;  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;The test is intended to show your skills on Problem-solving, TDD, OO, Architecture, Code Quality, and Performance. Bonus if you can come up with more than one solution and explain the pros/cons.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Research What the Company is Looking For
&lt;/h2&gt;

&lt;p&gt;As a job candidate, before going through an iOS Interview Experience and the tech test, it’s essential to do a bit of research on the company. So, before having a look at the candidate test project, I did a bit of research on the company. By looking at the company’s website, I quickly noticed how proud they are about their &lt;em&gt;fast&lt;/em&gt;, &lt;em&gt;efficient&lt;/em&gt;, &lt;em&gt;scalable&lt;/em&gt;, &lt;em&gt;reliable&lt;/em&gt;, &lt;em&gt;great, first-class, successful,&lt;/em&gt; and &lt;em&gt;state of the art&lt;/em&gt; platform. It looks like they perform several web scrapings a day and serve several clients through their APIs. In short, scalability, performance, and correctness of data are vital to the company. Also, from the conversation and the tech test description, the company looks very keen on TDD, OO, Clean Code, and Architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fulfill the iOS Test Requirements
&lt;/h2&gt;

&lt;p&gt;From a quick look, the project looked good overall. The project was well organized, the classes were small and the code was readable. The candidate really proved he can make an app from scratch and I would gladly offer him a junior/mid-level position. The candidate even made an extra effort to build a very nice user interface and added a great feature to enable importing files from a URL. However, there are some areas where I believe the candidate could have focused more to &lt;strong&gt;fulfill the test requirements of this iOS Interview Experience&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The code was organized and readable, but it seemed not to handle errors accordingly. It might be ok for a tech test to assume input is always valid, but going the extra mile to handle error cases can help you show great programming skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pay Attention to Detail
&lt;/h2&gt;

&lt;p&gt;There were common anti-patterns to avoid like primitive obsession, leaky abstractions, refused bequest, unused code, and unnecessary/redundant comments. All of which can be acceptable for junior developers, but might be red flags for the interviewer.&lt;/p&gt;

&lt;p&gt;The code was not under version control. We suggest you always use &lt;strong&gt;&lt;em&gt;git&lt;/em&gt;&lt;/strong&gt; for your tech tests. And send it over to the interviewer. Many teams will look at the history to understand how you got to the end solution. It’s in your favor, so don’t hide this from them!&lt;/p&gt;

&lt;p&gt;The test coverage was not throughout enough. The candidate is conscious that he couldn’t follow TDD completely, but he showed a great effort. Candidates with TDD experience are hard to find. The company could have made a choice of investing in a candidate that showed aptitude, but it’s up to them. (Tip: If &lt;a href="https://www.essentialdeveloper.com/professional-ios-engineering-season-1/"&gt;you want to increase your value as a developer, TDD skills are valuable and scarce&lt;/a&gt;. Companies are continually looking for experienced candidates!)&lt;/p&gt;

&lt;p&gt;The candidate followed the &lt;a href="https://www.essentialdeveloper.com/articles/clean-ios-architecture-pt-5-mvc-mvvm-and-mvp-ui-design-patterns"&gt;MVC design pattern&lt;/a&gt;. MVC is fine, but the company was very keen on &lt;a href="https://www.essentialdeveloper.com/articles/clean-ios-architecture-pt-6-viper-design-pattern-or-architecture"&gt;VIPER&lt;/a&gt;. Maybe investing a bit of time making it more like VIPER could have won the candidate some extra points.&lt;/p&gt;

&lt;h2&gt;
  
  
  Always Implement Bonus Challenges
&lt;/h2&gt;

&lt;p&gt;When trying to pass a tech test, it can be essential to tune your skills to impress the interviewer during the iOS Interview Experience. Taking the time to implement different solutions is an excellent way of doing so. The company even requested it as a bonus, but &lt;strong&gt;the candidate provided only one solution&lt;/strong&gt;. The solution provided would not scale well and would not be performant with larger amounts of data. Nothing wrong with that, it is still &lt;em&gt;a valid solution.&lt;/em&gt; However, the candidate could have invested that time to provide different approaches and explain their pros and cons. Especially because when running at scale, the cost of a lousy implementation can quickly jump up to 7 digits. Being a &lt;a href="https://www.essentialdeveloper.com/articles/number-1-reason-why-you-dont-improve-as-a-software-developer"&gt;mid-level developer is no excuse here&lt;/a&gt;. A bit of research and googling around could have helped the candidate provide different solutions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explain Your Solution
&lt;/h2&gt;

&lt;p&gt;Reviewing code is very subjective. A pairing session is much better to communicate intent, but not every company would invest the time in the first stage of the iOS interview experience. Taking the time to write down some notes, draw some diagrams, and even recording a video explaining your decisions can be a great way to &lt;a href="https://www.essentialdeveloper.com/articles/how-to-prepare-for-an-ios-interview"&gt;engage with the interviewer&lt;/a&gt; at this stage. Using &lt;strong&gt;&lt;em&gt;git&lt;/em&gt;&lt;/strong&gt; can also be a great way to show the progression from start to end. Small and meaning &lt;strong&gt;&lt;em&gt;git commits&lt;/em&gt;&lt;/strong&gt; can make a big difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deliver the Test in a Reasonable Time
&lt;/h2&gt;

&lt;p&gt;The candidate took &lt;strong&gt;two days&lt;/strong&gt; to complete the test, which could have been a red flag. The requirements were not complicated. However, from what I gathered, there was no agreed deadline to send the test. Also, the candidate made it clear he was not working on it full-time. The real red flag is that a lot of the time was spent on the UI and the extra &lt;strong&gt;unrequested&lt;/strong&gt; feature, instead of the bonus challenge. For the test reviewer, it could have been taken as “this candidate might have a hard time following requirements.” In Lean and Agile teams, it’s important to eliminate waste, such as over-engineering/complicating implementations (YAGNI!). Of course, that can be a wrong assumption about the candidate, but how we present ourselves in the iOS interview and tech test can help eliminate those assumptions.&lt;/p&gt;

&lt;p&gt;Always negotiate a deadline. If you work full-time and don’t have much time to work on the tech test, let the interviewer know and negotiate a reasonable delivery date that makes sense to you. The company shouldn’t expect you to stop your life to finish the test, but showing some energy and effort can help you show interest in the job.&lt;/p&gt;

&lt;h2&gt;
  
  
  iOS Interview Experience Conclusion
&lt;/h2&gt;

&lt;p&gt;It's important to remember that from this point we're just &lt;em&gt;wondering/assuming&lt;/em&gt; what could have gone &lt;em&gt;right/wrong&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I believe the candidate is a great developer and that he should be motivated to learn from the experience and try again. &lt;a href="https://www.essentialdeveloper.com/articles/the-importance-of-discipline-for-ios-programmers"&gt;&lt;em&gt;Practice makes perfect!&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We wish all candidates good luck in their future iOS Interview Experience and we hope this article gave you enough tips to help you succeed.&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://essentialdeveloper.com/articles/ios-interview-experience-why-you-didnt-pass-the-ios-technical-test"&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>ios</category>
      <category>swift</category>
      <category>tips</category>
    </item>
    <item>
      <title>The Minimum You Should Do To Prevent Memory Leaks in Swift</title>
      <dc:creator>⛩ Caio Zullo</dc:creator>
      <pubDate>Thu, 18 Oct 2018 10:38:44 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/the-minimum-you-should-do-to-prevent-memory-leaks-in-swift-305o</link>
      <guid>https://forem.com/essentialdeveloper/the-minimum-you-should-do-to-prevent-memory-leaks-in-swift-305o</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Gg-2nZYRd2g"&gt;
&lt;/iframe&gt;
 &lt;a href="https://www.youtube.com/watch?v=Gg-2nZYRd2g&amp;amp;list=PLyjgjmI1UzlTtsImzQ4cT8bQ3_RXtkqLg"&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this episode, we continue &lt;a href="https://www.essentialdeveloper.com/articles/xctest-swift-setup-teardown-vs-factory-methods"&gt;the Clean Swift Tests discussion&lt;/a&gt;, and we demonstrate a way for preventing memory leaks through automated testing.&lt;/p&gt;

&lt;p&gt;There's a large class of bugs, security threats and user experience problems (e.g. crashes and high memory consumption) related to memory leaks. Although this is an important topic, why do the majority of apps (Apple included) fail to prevent memory leaks?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer: many developers rely on error-prone manual checks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Manual checks might seem like a good fit in early stages. However, the codebase expands, requirements change, new developers join the team, pressure builds up, and deadlines approach. Under those stressful conditions, the manual checks have a high probability of failure due to human error. Moreover, the number of possible combination checks are too many, and they grow exponentially, which makes it humanly impossible to check all logical branches. Can we avoid such a scenario?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer: yes, with&lt;/strong&gt; &lt;a href="https://www.essentialdeveloper.com/articles/clean-ios-architecture-part-2-good-architecture-traits"&gt;&lt;strong&gt;good architecture&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;and&lt;/strong&gt; &lt;a href="https://www.essentialdeveloper.com/articles/ios-automation-testing-tools-vs-economics-is-it-worth-the-cost"&gt;&lt;strong&gt;automated tests&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/essentialdeveloper?sub_confirmation=1"&gt;Subscribe now to our Youtube channel&lt;/a&gt; and catch &lt;strong&gt;free new episodes every week&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"&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/the-minimum-you-should-do-to-prevent-memory-leaks-in-swift"&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>ios</category>
      <category>swift</category>
      <category>testing</category>
      <category>learning</category>
    </item>
    <item>
      <title>XCTest + Swift: SetUp/TearDown vs Factory Methods</title>
      <dc:creator>⛩ Caio Zullo</dc:creator>
      <pubDate>Wed, 10 Oct 2018 15:04:58 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/xctest--swift-setupteardown-vs-factory-methods-385</link>
      <guid>https://forem.com/essentialdeveloper/xctest--swift-setupteardown-vs-factory-methods-385</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/UpduAlWLliU"&gt;
&lt;/iframe&gt;
 &lt;a href="https://www.youtube.com/watch?v=UpduAlWLliU&amp;amp;list=PLyjgjmI1UzlSWtjAMPOt03L7InkCRlGzb"&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this episode, we dive into &lt;code&gt;XCTestCase&lt;/code&gt;’s lifecycle and show different ways for configuring your system under test.&lt;/p&gt;

&lt;p&gt;XCTest, similarly to JUnit, invokes each test method on a separate instance of the test case. To illustrate with an example, imagine that you have ten test methods, the XCTest framework will instantiate ten instances of the test case class and invoke only one of the methods per instance. We believe this is a good design choice, as by running the test methods in separate instances we can avoid sharing state between tests. However, &lt;code&gt;XCTestCase&lt;/code&gt;’s behavior isn’t that obvious which can make it counterintuitive when compared with how we're used to using objects to share state between methods.&lt;/p&gt;

&lt;h2&gt;
  
  
  Swift Factory methods
&lt;/h2&gt;

&lt;p&gt;Although the &lt;code&gt;setUp/tearDown&lt;/code&gt; configuration method is valid, at Essential Developer we noticed that moving configuration code to factory methods would yield better results in most cases.&lt;/p&gt;

&lt;p&gt;Here are the main reasons why we prefer factory methods over the &lt;code&gt;setUp/tearDown&lt;/code&gt; configuration:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Many tests have a different setup/configuration, so there are no significant benefits in sharing the object instantiation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We normally use &lt;strong&gt;constructor injection&lt;/strong&gt;. If we create a class as a property in the class scope, we would have to use &lt;strong&gt;property injection&lt;/strong&gt; to be able to configure the instance for each test. Which is fine too, but we prefer constructor injection since most of our classes don’t allow mutability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We want to test the whole lifecycle of the system under test instance, to guarantee there are no issues when it's removed from memory. We could achieve this with the &lt;code&gt;setUp()&lt;/code&gt; approach, but to test the whole lifecycle we would also need to set it to &lt;code&gt;nil&lt;/code&gt; in the &lt;code&gt;tearDown()&lt;/code&gt;. By creating the instance in the test method scope, we guarantee its lifecycle is tested within the method (since the instance will be freed automatically).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It would take more lines of code to do the same thing and, in our opinion, it would negatively impact the design of the test and the production code (e.g., &lt;code&gt;constructor-&amp;gt;property&lt;/code&gt; injection).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;setUp/tearDown&lt;/code&gt; can make the tests harder to read/understand since, when reading the code, we would have to scroll/jump scope (from test method to &lt;code&gt;setUp/tearDown&lt;/code&gt; code) to understand the whole context. We prefer to keep our test setup (Given/When/Then or Arrange/Act/Assert) in the shortest scope possible.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  When we use XCTestCase setUp/tearDown in Swift
&lt;/h2&gt;

&lt;p&gt;To be clear, we &lt;em&gt;avoid&lt;/em&gt; &lt;code&gt;setUp/tearDown&lt;/code&gt; configuration because we believe there are better ways, but we do use it when it's useful to us.&lt;/p&gt;

&lt;p&gt;For example, &lt;code&gt;setUp/tearDown&lt;/code&gt; can be useful when dealing with global state (e.g., databases) that needs to be restated for each test (as we don't want to pollute the test methods with those details).&lt;/p&gt;

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

&lt;p&gt;We would like you to be proactive and think about the problems you're facing so you find the best solution for you. For example, our approach could be wrong for you, so be critical and let us know your preferred way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/essentialdeveloper?sub_confirmation=1"&gt;Subscribe now to our Youtube channel&lt;/a&gt; and catch &lt;strong&gt;free new episodes every week&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"&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/xctest-swift-setup-teardown-vs-factory-methods"&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>swift</category>
      <category>ios</category>
      <category>testing</category>
      <category>learning</category>
    </item>
    <item>
      <title>iOS Interview Experience – 7 Essential Nontechnical Skills</title>
      <dc:creator>⛩ Caio Zullo</dc:creator>
      <pubDate>Tue, 02 Oct 2018 12:14:48 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/ios-interview-experience--7-essential-nontechnical-skills-3di8</link>
      <guid>https://forem.com/essentialdeveloper/ios-interview-experience--7-essential-nontechnical-skills-3di8</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/ZpYWT803Esg"&gt;
&lt;/iframe&gt;
 &lt;a href="https://www.youtube.com/watch?v=ZpYWT803Esg"&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you ever had an iOS interview experience, never heard back and wondered what went wrong? In this article, we’d like to share some reasons why that might have happened.&lt;/p&gt;

&lt;p&gt;For at least 7 years in a row, I’ve been an active part of the dev recruitment process in every company I work with. At the same time, I’ve been &lt;a href="https://www.essentialdeveloper.com/courses/career-and-market-strategy-for-professional-ios-developers"&gt;helping developers build up their technical and nontechnical skills to stand out in the job market&lt;/a&gt;. A typical reaction I noticed when developers don’t get the job is to ask “what’s wrong with my technical skills?” “Did I do something wrong in my coding test?” What they don’t know is that a lot of times, the nontechnical skills can be as critical as the technical ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  iOS Interview: What are nontechnical skills?
&lt;/h2&gt;

&lt;p&gt;Nontechnical or as also called “soft skills,” usually refers to a collection of social skills that can help the individual to interact effectively with others. In a professional environment, soft skills can relate to how one build and foster relationships with colleagues and customers, resolve conflicts, take responsibility, solve problems, and more.&lt;/p&gt;

&lt;p&gt;After a rejection in an iOS Interview, I usually recommend developers to evaluate not just their technical skills, but also their soft skills. Here is a list of 7 soft skills employers are looking for, and you might need to improve:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Communication
&lt;/h2&gt;

&lt;p&gt;Good communicators can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Clearly and comprehensively pass their message&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comprehend and act efficiently on instructions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Explain complex issues in simple terms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mediate meetings and conflicts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Be good leaders&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Be good listeners&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Teamwork
&lt;/h2&gt;

&lt;p&gt;Good team players can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Work together towards a common goal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hold each other accountable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide honest and empathetic feedback&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Help underperforming members step up to the team standards&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Incentivize team collaboration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Be proud of collectively decisions and outcomes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Know when to be a leader&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Know when to be a follower&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Leadership
&lt;/h2&gt;

&lt;p&gt;Good leaders can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Build trust to achieve a prosperous collaboration inside (within the team) and outside (within the business)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Build a fearless environment where everyone contributes with ideas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Help the team members be focused on shared goals and priorities&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Incentivize collaboration within the team&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable the members to tackle and deal with controversial matters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Never resort to the “I’m the lead so do what I say” card&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Responsibility
&lt;/h2&gt;

&lt;p&gt;Professionals that hold themselves accountable can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Accept responsibility for mistakes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Respect, comply and encourage high-quality standards&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Be focused on continuous progress&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Be humble&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Be a constant learner&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Strive to not to let other team members down&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Conflict resolution
&lt;/h2&gt;

&lt;p&gt;Good leaders can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Find solutions that can benefit all parties&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Establish a harmonious relationship with peers and clients&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Seek commitment to decisions from all members, instead of consensus&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Respectfully exerts influence&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tackle and deal with controversial matters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Respectfully address people’s misbehavior&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make everyone’s opinions heard and valued&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Time management
&lt;/h2&gt;

&lt;p&gt;Disciplined professionals can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Get things done effectively&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simplify tasks&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clarify priorities&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Limit work in progress&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Estimate better&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Think clearly under pressure&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Delegate&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Outperform and over deliver&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Flexibility
&lt;/h2&gt;

&lt;p&gt;Flexible professionals can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Quickly respond to change (e.g. goals, expectations, resources)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Find creative to perform tasks more efficiently&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Find ways to improve work/life balance in the team (e.g. flexible hours/work from home on snow days)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Help others and never say “That’s not my job.”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cover for others on vacation or sick leave&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Learn from constructive criticism&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why we should care
&lt;/h2&gt;

&lt;p&gt;A healthy work environment depends on soft skills. In iOS Interviews, they not only search for technically talented developers but individuals that the team would be happy to work with.&lt;/p&gt;

&lt;p&gt;Soft skills are valuable and scarce. Developers that build their soft skills will have a substantial advantage and in the job market. Also, soft skills can be essential to function and thrive in high-performance software teams.&lt;/p&gt;

&lt;p&gt;Junior developers can benefit and accelerate their growth by building their soft skills early in their career. Mid-level to senior developers should be able to display good soft skills.&lt;/p&gt;

&lt;p&gt;As the professional gets more experience, those soft skills are expected to improve as well. So, for example, it’s not uncommon to see senior developers applying to lead roles and getting rejected. Even though senior developers may have a strong technical background, they may not have other essential skills like good communication, teamwork, and leadership.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus reasons (Out of our control)
&lt;/h2&gt;

&lt;p&gt;Sometimes we prepared accordingly, had our technical and soft skills sharp, did everything right, but still didn’t hear back. When I’m on the interviewer side, I usually like to give feedback to all candidates. I don’t want to leave people “wondering,” and it doesn’t hurt to help them realize areas they can improve. Not every interviewer follow this principle, and there’s nothing wrong with that.&lt;/p&gt;

&lt;p&gt;Many other factors are out of our control. For example, they could have already hired another strong candidate, the budget for the role was suddenly not available anymore, we were overqualified (yes, that’s a real thing!).&lt;/p&gt;

&lt;p&gt;It’s essential to be resilient against things out of our control on an iOS Interview. To endure and accelerate our career path, we should focus our energy on what we can control.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/essentialdeveloper?sub_confirmation=1"&gt;Subscribe now to our Youtube channel&lt;/a&gt; and catch &lt;strong&gt;free new episodes every week&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://www.essentialdeveloper.com/articles/ios-interview-experience-7-essential-nontechnical-skills"&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>ios</category>
      <category>career</category>
      <category>tips</category>
      <category>learning</category>
    </item>
    <item>
      <title>Migrating to Swift 4.2 using a TDD + Git workflow [S01 Extras]</title>
      <dc:creator>⛩ Caio Zullo</dc:creator>
      <pubDate>Tue, 25 Sep 2018 12:08:24 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/migrating-to-swift-42-using-a-tdd--git-workflow-s01-extras-198k</link>
      <guid>https://forem.com/essentialdeveloper/migrating-to-swift-42-using-a-tdd--git-workflow-s01-extras-198k</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/1bYNmMILkEw"&gt;
&lt;/iframe&gt;
 &lt;a href="https://www.youtube.com/watch?v=1bYNmMILkEw&amp;amp;list=PLyjgjmI1UzlSUlaQD0RvLwwW-LSlJn-F6"&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this episode, we migrate the &lt;a href="https://github.com/essentialdevelopercom/quiz-app"&gt;Quiz project&lt;/a&gt; and its dependencies to &lt;strong&gt;Swift 4.2&lt;/strong&gt; and modernize our code with the newest additions.&lt;/p&gt;

&lt;p&gt;Just like in the &lt;a href="https://www.essentialdeveloper.com/articles/s01-extras-migrating-the-project-to-swift-4"&gt;Swift 4&lt;/a&gt; and &lt;a href="https://www.essentialdeveloper.com/articles/migrating-to-swift-4-1-using-a-tdd-git-workflow-s01-extras"&gt;Swift 4.1&lt;/a&gt; migration episodes, we migrate each module independently, while making sure that all tests are passing at every step and that we end up with no build warnings.&lt;/p&gt;

&lt;p&gt;One delightful change that &lt;strong&gt;Swift 4.2&lt;/strong&gt; brings is the improved ability of the compiler to synthesize an implementation of the &lt;code&gt;Hashable&lt;/code&gt; protocol. We take advantage of this change and, by following our standard workflow combining &lt;code&gt;Git&lt;/code&gt; and Automated Tests, we remove our custom implementation of &lt;code&gt;hashValue&lt;/code&gt; we wrote for the &lt;code&gt;Question&lt;/code&gt; type in &lt;a href="https://www.essentialdeveloper.com/articles/s01e13-improving-the-game-flow-with-swift-generics"&gt;Episode 13 - Improving the Game Flow with Swift Generics&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;During the &lt;code&gt;Hashable&lt;/code&gt; refactoring, we are surprised by some of the tests breaking. We resist the urge of deleting the tests by following a highly disciplined approach to solving the problem.&lt;/p&gt;

&lt;p&gt;It’s important to notice that without &lt;strong&gt;a test suite we trust&lt;/strong&gt;, it can be much harder to do such changes with confidence.&lt;/p&gt;

&lt;p&gt;Finally, we take advantage of the new &lt;code&gt;Sequence.shuffled&lt;/code&gt; function that &lt;strong&gt;Swift 4.2&lt;/strong&gt; offers. We use &lt;code&gt;Sequence.shuffled&lt;/code&gt; to showcase how to test randomness by using probability rather than &lt;em&gt;mocking&lt;/em&gt;. By not relying on mocking, we can freely change the implementation of our code without breaking any of the tests.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/essentialdeveloper?sub_confirmation=1"&gt;Subscribe now to our Youtube channel&lt;/a&gt; and catch &lt;strong&gt;free new episodes every week&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://www.essentialdeveloper.com/articles/number-1-reason-why-you-dont-improve-as-a-software-developer"&gt;www.essentialdeveloper.com&lt;/a&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"&gt;access now our latest research for free&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>swift</category>
      <category>ios</category>
      <category>git</category>
      <category>tdd</category>
    </item>
    <item>
      <title>#1 Reason Why You Don’t Improve As a Software Developer</title>
      <dc:creator>⛩ Caio Zullo</dc:creator>
      <pubDate>Wed, 19 Sep 2018 11:25:46 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/1-reason-why-you-dont-improve-as-a-software-developer-1mhk</link>
      <guid>https://forem.com/essentialdeveloper/1-reason-why-you-dont-improve-as-a-software-developer-1mhk</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/csm6kK8jUkY"&gt;
&lt;/iframe&gt;
 &lt;a href="https://www.youtube.com/watch?v=csm6kK8jUkY&amp;amp;list=PLyjgjmI1UzlT2jbk9WeqNrZhZyKpPPaWq"&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this video, we are going to discuss the main reason why we set goals to improve but sometimes cannot achieve them.&lt;/p&gt;

&lt;p&gt;There’s a common trend that we all go through. It’s one of the oldest problems people face and, as part of our evolution, it’s deeply wired in our brains. The problem is: we want something, but we don’t want to do what it takes. We procrastinate and avoid doing the work at all costs. In other words, we want to avoid the uncomfortable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Plateau
&lt;/h2&gt;

&lt;p&gt;Our learning curve looks typically like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0YF82gR0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static1.squarespace.com/static/5891c5b8d1758ec68ef5dbc2/t/5ba22d008a922da48d810837/1537355023367/graph-1-plateau.png%3Fformat%3D1000w" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0YF82gR0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static1.squarespace.com/static/5891c5b8d1758ec68ef5dbc2/t/5ba22d008a922da48d810837/1537355023367/graph-1-plateau.png%3Fformat%3D1000w" alt="The plateau."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We want to learn something new, and we may even think we know what we need (or What We Know We Don’t Know). All of us go through this initial phase with ups and downs until we hit a roadblock or a plateau. It feels like we stopped progressing.&lt;/p&gt;

&lt;p&gt;When we hit a plateau, it doesn’t mean we’re doing something wrong, but often it’s a sign we need to do something different. Progress often doesn’t come from doing the same thing that generates the same mediocre results. A roadblock usually means we should go back to basics and reevaluate if we really got it right. That’s one of the most critical steps to improve. We probably have some misconceptions that need to be adjusted.&lt;/p&gt;

&lt;p&gt;The problem is that we might not even know we really need. We call this gap “What We Don’t Know We Don’t Know.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sgA-ltKJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static1.squarespace.com/static/5891c5b8d1758ec68ef5dbc2/t/5ba22d384d7a9c88ca62383d/1537355069841/%3Fformat%3D1000w" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sgA-ltKJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static1.squarespace.com/static/5891c5b8d1758ec68ef5dbc2/t/5ba22d384d7a9c88ca62383d/1537355069841/%3Fformat%3D1000w" alt="The gap from “what we think we need” to “what we really need.”"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To make matters worse, we usually expect continuous growth. Always going up. Continuous growth is, most of the times, an “Unrealistic expectation.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wJpusx-z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static1.squarespace.com/static/5891c5b8d1758ec68ef5dbc2/t/5ba22d58aa4a99ebfd0b27c1/1537355103352/graph-3-unrealistic-expectation.png%3Fformat%3D1000w" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wJpusx-z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static1.squarespace.com/static/5891c5b8d1758ec68ef5dbc2/t/5ba22d58aa4a99ebfd0b27c1/1537355103352/graph-3-unrealistic-expectation.png%3Fformat%3D1000w" alt="Unrealistic expectations."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We often hear people say that: "Developers don't follow good practices because they don't know them or don't understand their value." and we believe that’s a fallacy.&lt;/p&gt;

&lt;p&gt;The more we teach, meet, and collaborate with developers, the more we see that many developers already know what they should do to improve. Many developers know which skills will get them to the next level. They don’t need to “gather more information” – they need to choose a path, act and stay in the path with discipline and focus.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Comfort Zone (The 99%)
&lt;/h2&gt;

&lt;p&gt;Fear of the plateau and avoiding the “adjustment phase” plus unrealistic expectations create a false perception of progress. The false sense of progress is also called the “comfort zone.”&lt;/p&gt;

&lt;p&gt;The comfort zone prevents us from achieving what we really want or even worse, it may create limiting beliefs. We often hear developers say “I really tried X/Y/Z, but I just can’t do it.” Which is limiting and not true. Everyone can do it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VisXZ94_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static1.squarespace.com/static/5891c5b8d1758ec68ef5dbc2/t/5ba22d8b4d7a9c88ca623adf/1537355160108/graph-4-comfort-zone.png%3Fformat%3D1000w" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VisXZ94_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static1.squarespace.com/static/5891c5b8d1758ec68ef5dbc2/t/5ba22d8b4d7a9c88ca623adf/1537355160108/graph-4-comfort-zone.png%3Fformat%3D1000w" alt="The comfort zone prevents us from achieving our best potential."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see in the graph, the red line shows the common path 99% of the people take. The comfort zone. And it’s often far from what we really need. And the times where growth seems to go down, are probably times where we try something new–trying to improve. When we try something, it’s natural that performance can go down. The problem is that mostly we seek the “Unrealistic Expectation of Continuous Growth,” and we go back to what we know (the comfortable). We give up too quickly.&lt;/p&gt;

&lt;p&gt;And to be fair, there’s nothing wrong in staying in the 99% or the comfort zone. Most people can have a decent living in this zone. However, we often find individuals unhappy with their performance, and they want to improve.&lt;/p&gt;

&lt;h2&gt;
  
  
  The high-performance individuals (The 1%)
&lt;/h2&gt;

&lt;p&gt;When learning to ride a bike, for example, we are probably going to move slower than we would if we just walked. One may say “walking is faster and easier than riding this bike, why would I waste more time trying to balance in this very uncomfortable mode of transportation?” The same happens when we’re learning advanced software development topics, collaboration skills, leadership, software architecture, automated testing, etc.&lt;/p&gt;

&lt;p&gt;A more realistic approach of high-performance individuals looks similar to the green line in the graph below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pbXnR5kS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static1.squarespace.com/static/5891c5b8d1758ec68ef5dbc2/t/5ba22dc370a6adc92989d9b1/1537355211081/graph-5-uncomfortable-zone.png%3Fformat%3D1000w" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pbXnR5kS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static1.squarespace.com/static/5891c5b8d1758ec68ef5dbc2/t/5ba22dc370a6adc92989d9b1/1537355211081/graph-5-uncomfortable-zone.png%3Fformat%3D1000w" alt="The uncomfortable zone high-performance individuals go through."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It starts similar to the others, but growth goes down as these individuals understand that to ride a bike properly, they need to take the supporting wheels off, fall a couple of times, and practice until they learn. They had to slow down at first, but, as they learn to ride the bike, they will be able to move much faster in the future.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Our brain is wired mostly to survive, not to go through the uncomfortable phase.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And most of the time we know what we have to do to improve. We know the skills we need. We attend courses. We read books. We even practice it for a while. But we don't have the discipline or focus to keep doing “what we know we should be doing.” So, it doesn't matter what we know. It matters what we do with what we know.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mentors
&lt;/h2&gt;

&lt;p&gt;When learning how to ride a bike, it may seem like an impossible task at first. And incredibly enough most people learn how to ride the bike. Why? A big reason is that there’s usually a person we trust pushing and helping us go through the fear (the uncomfortable phase). That’s why it’s so important to find mentors we trust. Mentors that have achieved what we want and that can guide us through the tough phases to achieve the “impossible.” However, mentors can’t do the work for us. We have to do it.&lt;/p&gt;

&lt;p&gt;It’s not our fault that our brain is wired to avoid uncomfortable situations, but it’s our responsibility to do something about it. ⛩&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/essentialdeveloper?sub_confirmation=1"&gt;Subscribe now to our Youtube channel&lt;/a&gt; and catch &lt;strong&gt;free new episodes every week&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://www.essentialdeveloper.com/articles/number-1-reason-why-you-dont-improve-as-a-software-developer"&gt;www.essentialdeveloper.com&lt;/a&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"&gt;access now our latest research for free&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>coding</category>
      <category>learning</category>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Clean iOS Architecture pt.7: VIP (Clean Swift) – Design Pattern or Architecture?</title>
      <dc:creator>⛩ Caio Zullo</dc:creator>
      <pubDate>Tue, 11 Sep 2018 12:08:12 +0000</pubDate>
      <link>https://forem.com/essentialdeveloper/clean-ios-architecture-pt7-vip-clean-swift--design-pattern-or-architecture-34cl</link>
      <guid>https://forem.com/essentialdeveloper/clean-ios-architecture-pt7-vip-clean-swift--design-pattern-or-architecture-34cl</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/AnUcZUMGVBI"&gt;
&lt;/iframe&gt;
 &lt;a href="https://www.youtube.com/watch?v=AnUcZUMGVBI?list=PLyjgjmI1UzlSWtjAMPOt03L7InkCRlGzb" rel="noopener noreferrer"&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today we're going to analyze the VIP (Clean Swift) Architecture. And, as we did in previous videos with &lt;a href="https://dev.to/essentialdeveloper/clean-ios-architecture-pt6-viper--design-pattern-or-architecture-3f1f-temp-slug-2599990"&gt;VIPER&lt;/a&gt;, &lt;a href="https://dev.to/essentialdeveloper/clean-ios-architecture-pt5-mvc-mvvm-and-mvp-ui-design-patterns-5ha5-temp-slug-7121127"&gt;MVC, MVVM, and MVP&lt;/a&gt;, we will decide if we can call VIP a Software Architecture or a Design Pattern.&lt;/p&gt;

&lt;p&gt;The Clean Swift Architecture or, as also called, "VIP" was introduced to the world by &lt;a href="https://clean-swift.com" rel="noopener noreferrer"&gt;clean-swift.com&lt;/a&gt; and, just like VIPER and other patterns, the main goals for the architecture were Testability and to fix the Massive View Controller problem.&lt;/p&gt;

&lt;p&gt;The name VIP can be confused with VIPER, and interestingly enough the creators of VIPER &lt;a href="https://mutualmobile.com/resources/meet-viper-fast-agile-non-lethal-ios-architecture-framework" rel="noopener noreferrer"&gt;almost called it VIP&lt;/a&gt; but decided to drop the name because it could stand for “Very Important Architecture,” which VIPER creators thought it was derogatory.&lt;/p&gt;

&lt;p&gt;VIP is very similar to VIPER as both originated from &lt;a href="https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html" rel="noopener noreferrer"&gt;Uncle Bob's Clean Architecture&lt;/a&gt; ideas.&lt;/p&gt;

&lt;p&gt;So can we consider VIP a Software Architecture or just a Design Pattern?&lt;/p&gt;

&lt;p&gt;The VIP diagram describes its main structure, which explains its acronym definition: the ViewController/Interactor/Presenter relationship, or as they call it: The VIP cycle.&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%2Fstatic1.squarespace.com%2Fstatic%2F5891c5b8d1758ec68ef5dbc2%2Ft%2F5b97ac750ebbe8b81e090c9e%2F1536666750484%2Fthe-vip-cycle.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%2F5b97ac750ebbe8b81e090c9e%2F1536666750484%2Fthe-vip-cycle.png%3Fformat%3D1000w" alt="The unidirectional VIP cycle."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The unidirectional VIP cycle.&lt;/p&gt;

&lt;p&gt;The VIP cycle differs from the VIPER relationship model described in our previous video. In VIPER, the communication between Interactor and Presenter, and View and Presenter is bidirectional.&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%2Fstatic1.squarespace.com%2Fstatic%2F5891c5b8d1758ec68ef5dbc2%2Ft%2F5b97aca5cd8366c14a4dd945%2F1536666797140%2Fviper.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%2F5b97aca5cd8366c14a4dd945%2F1536666797140%2Fviper.png%3Fformat%3D1000w" alt="The bidirectional VIPER cycle."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The bidirectional VIPER cycle.&lt;/p&gt;

&lt;p&gt;Instead, VIP follows a unidirectional approach, where the ViewController talks to the Interactor, the Interactor runs business logic with its collaborators and passes the output to the Presenter, and the Presenter formats the Interactor output and gives the response (or view model) to the ViewController, so it can render its Views.&lt;/p&gt;

&lt;p&gt;Does this unidirectional communication model define an architecture? Also, are those 3 components (the ViewController, Interactor, and Presenter) enough to describe the Application Architecture?&lt;/p&gt;

&lt;p&gt;It may seem like an architecture, but the VIP cycle is such a limited outlook of the application that we consider it a Design Pattern. And this design pattern has a name already: MVP. Regardless of what we call it, the MVP design pattern is not a software architecture.&lt;/p&gt;

&lt;p&gt;However, VIP or "Clean Swift" has more components than just ViewControllers, Interactors, and Presenters, for example, Data Models, Routers and Workers.&lt;/p&gt;

&lt;p&gt;Like VIPER, the Clean Swift author describes that VIP can have less or even more layers of separation, as needed. But the core must follow MVP or the VIP cycle! So the VIP cycle sounds more like an organizational design pattern that can solve the Massive View Controller problem and make your code more testable, but it doesn't describe the big picture or the “Software Architecture.”&lt;/p&gt;

&lt;p&gt;VIP or Clean Swift, just like VIPER and other patterns, is trying to solve class dependency issues like the Massive View Controller and testability, rather than module dependency issues, like modularity. With the described Clean Swift components, we may end up with testable code but Spaghetti Architecture.&lt;/p&gt;

&lt;p&gt;VIP also encourages the use of templates to "facilitate" its implementation. It can be very convenient to have templates, but, at the same time, it may create a limited framework to think. We don't believe there's a design pattern or "template" that can solve all the problems and can be infinitely extended. We believe that, instead of trying to fit every problem into a template, every software architecture must be carefully crafted to solve the system challenges. For example, some systems would benefit more from an Event-Driven (Producer/Consumer) streaming model where other systems would not.&lt;/p&gt;

&lt;p&gt;Let's have a look at the &lt;a href="https://github.com/Clean-Swift/CleanStore" rel="noopener noreferrer"&gt;Clean Swift sample project (CleanStore)&lt;/a&gt; dependencies diagram.&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%2Fstatic1.squarespace.com%2Fstatic%2F5891c5b8d1758ec68ef5dbc2%2Ft%2F5b97ad101ae6cfbcdbd675a7%2F1536666904060%2Fdiagram-1.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%2F5b97ad101ae6cfbcdbd675a7%2F1536666904060%2Fdiagram-1.png%3Fformat%3D1000w" alt="CleanStore sample project class and module dependencies diagram."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Clean-Swift/CleanStore" rel="noopener noreferrer"&gt;CleanStore sample project&lt;/a&gt; class and module dependencies diagram.&lt;/p&gt;

&lt;p&gt;As you can see, there are arrows everywhere, crossing module boundaries, so changes to the software can break multiple modules (and of course, numerous tests...).&lt;/p&gt;

&lt;p&gt;In the Clean Swift sample app, the application is separated in scenes (or modules). There’s a List Orders Scene, Create Order Scene and Show Order Scene. A higher level look at the modules dependencies shows that scenes are highly coupled with each other and with other system’s components.&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%2Fstatic1.squarespace.com%2Fstatic%2F5891c5b8d1758ec68ef5dbc2%2Ft%2F5b97ad3a40ec9af58bd2391d%2F1536666949774%2Fdiagram-2.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%2F5b97ad3a40ec9af58bd2391d%2F1536666949774%2Fdiagram-2.png%3Fformat%3D1000w" alt="High-level modules dependencies diagram shows a highly coupled architecture."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;High-level modules dependencies diagram shows a highly coupled architecture.&lt;/p&gt;

&lt;p&gt;Another way to look at the application architecture is to examine its modules in a circular form so we can see the dependencies between the modules. The closer to the center, the more abstract and independent the module is.&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%2Fstatic1.squarespace.com%2Fstatic%2F5891c5b8d1758ec68ef5dbc2%2Ft%2F5b97ad6e575d1f202ba3b2b9%2F1536667007880%2Fdiagram-3.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%2F5b97ad6e575d1f202ba3b2b9%2F1536667007880%2Fdiagram-3.png%3Fformat%3D1000w" alt="High-level modules dependencies diagram shows a highly coupled, monolithic architecture."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;High-level modules dependencies diagram shows a highly coupled, monolithic architecture.&lt;/p&gt;

&lt;p&gt;Different than Uncle Bob’s Clean Architecture, we can see services, frameworks, and drivers in the core rings. Also, inside each scene, some Interactors might contain business logic, and they depend on frameworks and other services. Throughout the codebase, we can even notice that core models are used in all levels of abstraction (UI/Presentation/Business Logic/Routing/Services/Workers) which is a no-no in Uncle Bob’s Clean Architecture.&lt;/p&gt;

&lt;p&gt;The VIP sample app architecture is a highly coupled and monolithic architecture. If we want to create a somewhat testable monolith, it might work well. However, we might quickly find out that the lack of modularity prevents us from scaling the team, moving fast and prevents us from achieving key business metrics. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployment Frequency&lt;/li&gt;
&lt;li&gt;Estimation Accuracy&lt;/li&gt;
&lt;li&gt;Lead Time for Changes&lt;/li&gt;
&lt;li&gt;Mean Time to Recover&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As explained in the previous video, we believe that software architecture is less about types, classes, and even responsibilities and more about how the components communicate to each other, how they depend on each other, and what is the shared understanding of the senior developers regarding: What are the important parts? What is coupled? What is decoupled? What is hard to change, What is easy to change? How is the data flowing between layers and why – is the data going in one direction? Two directions? Multiple directions? Can we support the business short and long-term goals?&lt;/p&gt;

&lt;p&gt;We would like to reinforce that our codebases are like living organisms and they're changing all the time. So does the architecture. It's continually evolving, and there are no templates for that.&lt;/p&gt;

&lt;p&gt;At Essential Developer, we do believe software architecture has a strong correlation with Product Success, Product Longevity, and Product Sustainability. We advise professional developers to learn from Uncle Bob's Clean Architecture, VIP, VIPER, MVC, MVVM, MVP, and other patterns, but not try to copy and paste solutions. Remember: Every challenge is different, and there are no silver bullets.&lt;/p&gt;

&lt;p&gt;VIP, VIPER, MVC, MVVM, MVP, as design patterns, can guide you towards more structured components. However, they don't define the big picture or the Software Architecture. So, use them with care!&lt;/p&gt;

&lt;p&gt;For more, visit &lt;a href="https://www.youtube.com/watch?v=PnqJiJVc0P8&amp;amp;list=PLyjgjmI1UzlSWtjAMPOt03L7InkCRlGzb" rel="noopener noreferrer"&gt;the Clean iOS Architecture Playlist&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/essentialdeveloper?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe now to our Youtube channel&lt;/a&gt; and catch &lt;strong&gt;free new episodes every week&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://www.essentialdeveloper.com/articles/the-importance-of-discipline-for-ios-programmers" rel="noopener noreferrer"&gt;www.essentialdeveloper.com&lt;/a&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;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>
    </item>
  </channel>
</rss>
