<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Oleksandr Masliukivskyi</title>
    <description>The latest articles on DEV Community by Oleksandr Masliukivskyi (@oleksandr_masliukivskyi_1).</description>
    <link>https://dev.to/oleksandr_masliukivskyi_1</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%2F781563%2F688b1a28-6aff-49b4-8e67-37726151e167.png</url>
      <title>DEV Community: Oleksandr Masliukivskyi</title>
      <link>https://dev.to/oleksandr_masliukivskyi_1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oleksandr_masliukivskyi_1"/>
    <language>en</language>
    <item>
      <title>Most essential Xcode shortcuts every developer should know</title>
      <dc:creator>Oleksandr Masliukivskyi</dc:creator>
      <pubDate>Mon, 11 Sep 2023 14:53:23 +0000</pubDate>
      <link>https://dev.to/oleksandr_masliukivskyi_1/most-essential-xcode-shortcuts-every-developer-should-know-2dff</link>
      <guid>https://dev.to/oleksandr_masliukivskyi_1/most-essential-xcode-shortcuts-every-developer-should-know-2dff</guid>
      <description>&lt;p&gt;As iOS developers, we spend most of our time at work in the Xcode. To put it into perspective - It's about &lt;strong&gt;20–35 hours per week&lt;/strong&gt;! What if I told you that you may use this time &lt;strong&gt;inefficiently&lt;/strong&gt;, and you can &lt;strong&gt;optimise&lt;/strong&gt; it?&lt;/p&gt;

&lt;p&gt;Imagine having an elevator in your house, but still using stairs to get to the top floor.&lt;/p&gt;

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

&lt;p&gt;At the end of the day, you'll reach the same floor, but at the cost of &lt;strong&gt;time&lt;/strong&gt; and &lt;strong&gt;exhaustion&lt;/strong&gt;. The same is applicable to using Xcode without shortcuts.&lt;br&gt;
 &lt;br&gt;
In this article, I'll show you a few &lt;strong&gt;Xcode shortcuts&lt;/strong&gt; that will boost your productivity and elevate your skills in writing code.&lt;/p&gt;

&lt;p&gt;We'll separate them by &lt;strong&gt;Project View and Navigation&lt;/strong&gt;, &lt;strong&gt;Code Editing&lt;/strong&gt;, and &lt;strong&gt;Project Build&lt;/strong&gt; sections. Some of them might be well-known, and some - can be new to you, but I'm sure all of those mentioned are essential to every iOS developer.&lt;/p&gt;

&lt;p&gt;Plus, there's a very helpful &lt;strong&gt;bonus&lt;/strong&gt; at the end of the article 👀&lt;/p&gt;

&lt;p&gt;First things first, let's agree on the dictionary of the symbols. In this article, I'll follow this setup:&lt;br&gt;
&lt;strong&gt;⌘ – Command&lt;/strong&gt; key&lt;br&gt;
&lt;strong&gt;⌃ – Control&lt;/strong&gt; or Ctrl key&lt;br&gt;
&lt;strong&gt;⌥ – Option&lt;/strong&gt; or Alt key&lt;br&gt;
&lt;strong&gt;⇧ – Shift&lt;/strong&gt; key&lt;/p&gt;

&lt;h2&gt;
  
  
  Project View and Navigation
&lt;/h2&gt;

&lt;p&gt;In this section, we'll focus on the shortcuts that will help you to navigate through your Xcode project and understand its file system way faster than you used to.&lt;/p&gt;

&lt;p&gt;The first one is &lt;strong&gt;⌘ + ⇧ + O&lt;/strong&gt;. To open a file by its name, just press this combination, type the filename, and you'll see a list of options matching your input.You can search by class/struct name and methods declaration.This is the fastest way of getting around the big projects when trying to find something, especially when onboarding into a new project.&lt;/p&gt;

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

&lt;p&gt;The next one is &lt;strong&gt;⌘ + J&lt;/strong&gt; - focus on a file in the navigator. It's very helpful while working on projects with complex structures - you can easily end up in some unknown location, and this shortcut will show you exactly where you are right now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⌘ + N&lt;/strong&gt; - create a new file. A common shortcut for all IDEs, but in combination with the previous one, you can create a new file in the right place of your project very fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⇧ + ⌘ + Y&lt;/strong&gt; - show/hide debug area. Also comes in very handy for quickly accessing the debug area view.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⌘ + ⌥ + Enter&lt;/strong&gt; - toggle SwiftUI Preview/Canvas. While working with SwiftUI, this one is helpful to toggle the additional Previews view when needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;^ + ⌘+ J&lt;/strong&gt; - Jump to the definition. After selecting a property or function, just use this shortcut, and it will navigate you to the definition of the selection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⌘ + ⌃ + left/right arrows&lt;/strong&gt; - jump between the previous and next opened file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⌘ + ⇧ + 0 (zero)&lt;/strong&gt; - show a documentation view. I encourage you to use this one from time to time or when dealing with some unknown Swift issues, Apple's documentation is very user-friendly and easy to navigate through.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Editing
&lt;/h2&gt;

&lt;p&gt;Now we'll focus on how to boost your code editing with shortcuts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⌘ + ⌃+ E &lt;/strong&gt;- Select all in scope. Very useful shortcut for refactoring small chunks of code in a local scope. Let's say you've misspelled your property name, and you want to fix it quickly in all local-scope usages. You can do so by selecting a word and using this shortcut:&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;⌘ + ⌥ + E&lt;/strong&gt; - find in the current file. Just select a word and press this shortcut to jump to the next usage of this word.&lt;/p&gt;

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

&lt;p&gt;But be careful, this shortcut is &lt;strong&gt;case-insensitive&lt;/strong&gt; and matches by parts, not the whole word.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⌃ + I&lt;/strong&gt; - Re-indent code. After making some changes to your functions, you may notice that code indentation can mess up. Use this shortcut to quickly fix your code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⌘ + ⌥ + Up/Down arrows&lt;/strong&gt; - fold/unfold method or class. It will cover the selected part of the code. Very helpful to use this in big and complicated parts of code, just in order to focus on what's important right now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⌘ + ⌥ + /&lt;/strong&gt; - create a documentation. It just pastes a documentation template right above the selection, which is way faster than writing it all by yourself.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Project build
&lt;/h2&gt;

&lt;p&gt;As for the project build shortcuts, I consider these most helpful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;⌘ + R&lt;/strong&gt; - run current target&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⌘ + B&lt;/strong&gt; - build current target&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⌘ + U&lt;/strong&gt; - build and run testing target. Add &lt;strong&gt;⇧&lt;/strong&gt; (&lt;strong&gt;⌘ + ⇧ + U&lt;/strong&gt;) to just build without running. Or add &lt;strong&gt;⌃&lt;/strong&gt; (&lt;strong&gt;⌘ + ⌃+ U&lt;/strong&gt;) to skip building when it's not needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⌃ + ⌥ + ⌘ + G&lt;/strong&gt; -re-run a previous test case. Very helpful while fixing just one problematic test. If your last testing action was running the whole class, it will run the whole class again&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⌘ + ⇧ + K&lt;/strong&gt; - clean build&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Bonus time!
&lt;/h2&gt;

&lt;p&gt;For a quick multiline change in your code, you can use &lt;strong&gt;⌃ + ⇧ + up/down arrows&lt;/strong&gt;. This way, you will activate a multiline cursor, which can be very handy for refactoring chunks of code without repetitions. And, to make it sound even better, you can use &lt;strong&gt;mouse clicks&lt;/strong&gt; to select the specific parts of lines to edit!&lt;/p&gt;

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

&lt;p&gt;I can guarantee that after using it a few times, you'll love it and will not imagine your Xcode development without this shortcut!&lt;/p&gt;

&lt;p&gt;And also, as a bonus-bonus, you can change and create your own shortcuts in Xcode. To do so, go to Xcode → Settings → Key Bindings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8d3p2u1q3urqp7d6zyp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8d3p2u1q3urqp7d6zyp.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Be careful not to use some macOS system shortcuts though, because the OS will treat it with a bigger priority&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;In conclusion&lt;/strong&gt;, I'd say that the usage of the Xcode shortcuts is a pretty good marker of how proficient a developer is. After hosting multiple iOS job interviews with live coding/debugging sessions, I always paid attention when an interviewee was using them. It shows that the person is not totally new to iOS development and is interested in becoming more proficient by learning how to use a tool a bit more than just creating a project and being able to run it.&lt;/p&gt;

&lt;p&gt;And that's it! I hope you've learned something new from this article and that I've helped you become an even more productive iOS Developer than you were before. &lt;/p&gt;

&lt;p&gt;Have I missed some interesting shortcuts? Let me know in the comments, let's learn together!&lt;/p&gt;

</description>
      <category>xcode</category>
      <category>ios</category>
      <category>swift</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Development of a Multiplatform project from iOS Engineer's perspective</title>
      <dc:creator>Oleksandr Masliukivskyi</dc:creator>
      <pubDate>Wed, 05 Jan 2022 15:27:06 +0000</pubDate>
      <link>https://dev.to/oleksandr_masliukivskyi_1/development-of-a-multiplatform-project-from-ios-engineers-perspective-gnh</link>
      <guid>https://dev.to/oleksandr_masliukivskyi_1/development-of-a-multiplatform-project-from-ios-engineers-perspective-gnh</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;How an unthinkable thing turned out to be an interesting experience&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Throughout my career, I was always focused on learning only native iOS technologies such as &lt;strong&gt;Objective-C&lt;/strong&gt; and &lt;strong&gt;Swift&lt;/strong&gt;. I considered (and still consider) myself as a "non-believer" in cross-platform solutions like React Native or Flutter  -  it's interesting and usable for small-scale projects and not really for bigger ones, because of its maintenance problems and scalability. And recently, at &lt;strong&gt;FootballCo&lt;/strong&gt;, we started building brand-new Goal news and live scores application for &lt;a href="//goal.com"&gt;Goal.com&lt;/a&gt;, which will be developed using Kotlin Multiplatform, and in this article, I want to share my experience of writing and maintaining a Multiplatform code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Humble beginnings
&lt;/h2&gt;

&lt;p&gt;At first, I was very confused (and a bit scared, there's nothing to be ashamed of).&lt;br&gt;
Surely, I've already had some experience in building Android applications in Kotlin, but still, as an iOS Engineer, just the thought of working with Kotlin on a daily basis was frightening. Imagine  -  you just started a career with a pretty complicated language like &lt;strong&gt;Objective-C&lt;/strong&gt;, then switched to much more pleasant &lt;strong&gt;Swift&lt;/strong&gt;, developed your skills there and now you should change your paradigm and work on &lt;strong&gt;Kotlin&lt;/strong&gt; and think as an Android developer (spoiler - not really).&lt;/p&gt;

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

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

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

&lt;blockquote&gt;
&lt;p&gt;Swift, Kotlin, and Objective-C "Loved vs. Dreaded" comparison, according to &lt;a href="https://insights.stackoverflow.com/survey/2021#most-loved-dreaded-and-wanted-language-love-dread" rel="noopener noreferrer"&gt;StackOverflow&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But as an &lt;strong&gt;Engineer&lt;/strong&gt; - you should be always open to new challenges and for learning new technologies, our world evolves so fast that you should be on the same pace with new technologies, and gaining new skills is a MUST if you want to succeed.&lt;br&gt;
And surely I wasn't a totally new person in the Android world - my Uni thesis was about an application written in Kotlin, so life kind of prepared me for such a turn of things :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Why did we decide to go with the Multiplatform approach?
&lt;/h2&gt;

&lt;p&gt;The biggest benefit - &lt;strong&gt;code reusability and maintenance&lt;/strong&gt;. In our legacy applications, we saw that big chunks of codebase could be shared between platforms - network layer, analytics, data persistence, most parts of business logic. All of these are pretty essential parts of any mobile application and we could easily write them once in cross-team collaboration, cover it with tests and use it on both platforms.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Every Multiplatform project in a nutshell&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With it, comes the speed of delivery, better quality, and knowledge sharing. Just imagine - this big part of business logic, that your team worked on for months, could've been written by x2 amount of people, which could catch more bugs and come up with some interesting solutions.&lt;/p&gt;

&lt;h2&gt;
  
  
  MVP and our start with KMM
&lt;/h2&gt;

&lt;p&gt;Along with &lt;strong&gt;KMM&lt;/strong&gt; (from now on I'll use this as a shortcut for Kotlin Multiplatform), we decided to write our apps using brand new platform technologies such as &lt;strong&gt;SwiftUI&lt;/strong&gt; and &lt;strong&gt;Jetpack Compose&lt;/strong&gt;. We kicked off our process with an MVP project in order to test all of the frameworks which I mentioned above and it turned out pretty well. We built a simple proof of concept application, integrated and tested all frameworks which we would use in a production app, and prepared all necessary automations.&lt;/p&gt;

&lt;p&gt;To learn more about our MVP project and our findings , check this article by our Android Engineer Aleksander Jaworski: &lt;a href="https://akjaw.com/kotlin-multiplatform-mobile-poc-conclusions/" rel="noopener noreferrer"&gt;https://akjaw.com/kotlin-multiplatform-mobile-poc-conclusions/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We decided to put all our automations into fastlane, most of our engineers are used to use it and it contains a lot of pre-built solutions suitable for our needs. From the get-go, we understood that, at the initial stages, we would need to rebuild the KMM framework regularly - pretty much with every minor change in it, so putting it to the separate repository and accessing it from there was not the way to go, so we needed to come up with a solution that builds shared framework fast enough. At later stages, when changes to the shared framework will occur more rarely, we will surely encapsulate it into a separate repository.&lt;/p&gt;

&lt;p&gt;While creating this proof-of-concept, we also changed our approach to daily ceremonies and merged most of them, we "switched" our mindset from thinking that we are two different teams (Android and iOS ) and started to position ourselves as one mobile team. I think for every project and every company it's very important to have such close communication between Android and iOS folks - after all, we are building almost the same application but for two different platforms, and our end-users should have the same experience on both.&lt;br&gt;
As part of this process, we introduced pair-programming sessions, during which iOS developer sits with Android folks and, in collaboration, they build a multiplatform part of some feature - from modeling, implementing, and covering it with tests to performing a basic platform integration and checking if everything works fine.&lt;/p&gt;

&lt;p&gt;These sessions were the most helpful thing so far - they gave our team members a brief introduction to Kotlin and after just one session you can debug, test, and introduce changes to multiplatform code by yourself!&lt;/p&gt;

&lt;h2&gt;
  
  
  Pros and cons of the KMM approach
&lt;/h2&gt;

&lt;p&gt;So, after 6 months of working in a multiplatform approach, we already noticed a lot of very cool things that changed our way of work in a positive way.&lt;/p&gt;

&lt;p&gt;Some of them are minor and not widely applicable, some will be surely helpful for any team, so here's the list:&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You are a pioneer of new technology&lt;/strong&gt;. I've heard only about 2–3 serious applications written in KMM and it's very exciting to try and work on something that fresh.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You can learn Kotlin and widen your horizons&lt;/strong&gt;. Believe me - it's very similar to Swift and pretty easy to write in.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shared codebase - write once and use by two teams. It is really very comfortable to write some big chunk of business logic just once and re-use it on a different platform (just imagine starting a sprint and receiving a message that we introduced a DB layer in our app and there's no need to build it!)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;All core libraries are there to use!&lt;/strong&gt; You are free to call iOS SDK libraries in KMM without any problems if needed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can see how the project works on Android and you can take part in the development of it. It's really crazy: Gradle, modules for features, co-routines, manifests - there's lots to learn about the d̶a̶r̶k̶ Android side of app development.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No need to test business logic on the app's side.&lt;/strong&gt; All code that we share in KMM framework is covered by tests on the Kotlin side. This also means that you'll learn how to write and maintain tests in Kotlin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Our team and our possibilities doubled!&lt;/strong&gt; Now it's not just two groups of people with different mindsets and proficiency in different technologies, but one big team of mobile engineers that collaborates on a daily basis, plans accordingly and solves problems much, much faster. In all approaches that I recollect thought my career, KMM was the only one that made it possible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Knowledge sharing.&lt;/strong&gt; I'm sure, your initial thought about the KMM approach was that only you, iOS Engineer, will need to adapt and learn, but that's not the case. The Android team also runs and debugs our code, so it works in both ways and is very beneficial for the team as a whole.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In order to start - you'll need to &lt;strong&gt;invest some time into learning&lt;/strong&gt; the basics of Kotlin and Android development. There's no way to go around it - you just need to do it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Very similar to the first one - you should bear in mind that it's a &lt;strong&gt;very fresh technology&lt;/strong&gt;, so be ready to come up with workarounds and solutions for some weird problems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You'll need to have &lt;strong&gt;two IDEs on your Mac&lt;/strong&gt; - Idea or Android Studio for Kotlin/Android side and Xcode for the iOS one (AppCode - please don't do it)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It takes time&lt;/strong&gt; to familiarise yourself with a new language and IDE. You'll need to learn a lot of new shortcuts, terminal commands and in general how the project is structured in Android.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Slow feedback loop.&lt;/strong&gt; As mentioned before, any change in the shared KMM framework requires rebuilding it, so changes could be used in the iOS environment. The only way around is to run KMM tests, which will build a shared framework much faster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In order to use the KMM code in Swift, you'll need &lt;strong&gt;a lot of wrappers. Like a lot.&lt;/strong&gt; Most of the things are returned to our iOS world as Flow/Suspended Wrappers and you need to know how to handle them properly, keeping in mind async calls and error handling. It sounds kind of like RxSwift, but you will use it not only in network calls - even in order to get some static data (hardcoded in KMM or taken from some DB). At first, it might sound like taking a sledgehammer to crack a nut&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Debugging might be really painful.&lt;/strong&gt; If anything crashes on KMM side - you'll need to scroll through the debugger a lot and do it very carefully in order to find a source of the problem. Also, familiarise yourself with InvalidMutabilityException - it will be there with you for quite some time :)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;In general, our team (as a whole, not just the iOS part of it) is very happy with the KMM approach. Quality-wise, positive feedback that we have is much bigger than the cons of it - most of the problems, like learning Kotlin and IDE, will be resolved in the first months and later on - you'll just catch the wave and you'll forget you used to hate it :)&lt;/p&gt;

&lt;p&gt;We do see a very big future in the Multiplatform approach and we are looking forward to seeing where it gets us.&lt;br&gt;
If you have any questions regarding our process, interesting findings during building proof-of-concept application, maintaining KMM in the iOS environment - don't hesitate to ask!&lt;/p&gt;

</description>
      <category>swift</category>
      <category>kotlin</category>
      <category>mobile</category>
      <category>kmm</category>
    </item>
  </channel>
</rss>
