<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Lara Martín on Medium]]></title>
        <description><![CDATA[Stories by Lara Martín on Medium]]></description>
        <link>https://medium.com/@laramartin?source=rss-42754ec47023------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*y9lKrr9eB_0hMNZTKol4nQ.jpeg</url>
            <title>Stories by Lara Martín on Medium</title>
            <link>https://medium.com/@laramartin?source=rss-42754ec47023------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 07:26:31 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@laramartin/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Learning functional programming]]></title>
            <link>https://medium.com/@laramartin/learning-functional-programming-3f2041c3590a?source=rss-42754ec47023------2</link>
            <guid isPermaLink="false">https://medium.com/p/3f2041c3590a</guid>
            <category><![CDATA[learning]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[functional-programming]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Lara Martín]]></dc:creator>
            <pubDate>Sun, 09 Feb 2020 18:47:47 GMT</pubDate>
            <atom:updated>2020-02-09T18:47:47.363Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4oWdEraeKx1gMjGhCzvOUQ.jpeg" /></figure><p>I recently finished an <a href="https://www.coursera.org/learn/programming-languages">online course</a> whose goal was to teach concepts in programming languages. As a Software Developer, I was already comfortable with most of the ideas, but the highlight of this course was that I could learn <strong>functional programming</strong> for the very first time. All with a language I didn&#39;t hear before: <strong>Standard ML (SML)</strong>.</p><p><a href="https://www.coursera.org/learn/programming-languages">Programming Languages, Part A | Coursera</a></p><h3><strong>Why a course in SML?</strong></h3><p>If you never heard about SML (which I will call ML from now on) before, do not worry, you aren’t behind the trends! <strong>ML is a programming language mostly used in academy.</strong></p><p>I didn&#39;t choose this course because of the language, but instead I chose it because it was teaching functional programming for people that have programming experience, but not necessarily knowledge on functional programming.</p><p><strong>In this post I share some of the main language concepts that I have learned in the course</strong>, starting with the basics to more complex functional programming concepts.</p><p><em>Note: comments are surrounded by </em><em>(* *)</em></p><h4><strong>Bindings</strong></h4><p>A binding is any sequence that will get type-checked and evaluated in ML.</p><p>As any other language, you can declare variables and functions:</p><pre>val x <strong>=</strong> 4;</pre><pre>fun sum(x: int, y: int) <strong>=</strong> x + y</pre><h4><strong>Let expression</strong></h4><p>The let expression allows you to define bindings in a local scope. You can declare local variables within a function:</p><pre>fun double_plus_one(number: int) = <br>    <strong>let</strong> val x = 1  <br>    <strong>in</strong><br>        number * 2 + x<br>    <strong>end</strong></pre><p>Or define local functions within a function!</p><pre>fun double_plus_one(number: int) = <br>    <strong>let</strong> <strong>fun</strong> sum_one x = x + 1<br>    <strong>in</strong> <br>      sum_one(number * 2)<br>    <strong>end</strong></pre><h4><strong>Options</strong></h4><p>option is a construct that can either have a value or not. An option in ML has only two states: NONE or SOME v, where v is a value.</p><p>In the example below, numbers_in_list returns NONE when the list is empty, and SOME when the list has numbers in it.</p><pre>fun numbers_in_list(numbers: int list) = <br>    case numbers of <br>        []  =&gt; <strong>NONE</strong>          (* the list is empty *)<br>        | _ =&gt; <strong>SOME numbers</strong>  (* _ is a wildcard pattern *)</pre><h4>Recursion</h4><p>Recursion is when a function calls itself but without causing an infinite loop, by stoping at some point and returning the solution.</p><pre>fun <strong>sum_list</strong>(numbers : int list) =<br>  if null numbers<br>  then 0<br>  else hd numbers + <strong>sum_list</strong>(tl numbers) (* hd = head, tl = tail *)</pre><p>What was mind-blowing for me was to learn that any <em>for loop</em> can be written using recursion. I didn’t write any <em>for loops </em>during this course, but instead I had to only use recursion, which required a shift on they way I usually work.</p><blockquote>Any <em>for loop</em> can be written using recursion.</blockquote><h4>Pattern matching</h4><p>Pattern matching is a mechanism from ML that checks a value against a pattern. Similar to switch/case in Java or when in Kotlin, but way more powerful.</p><p>We can rewrite the function sum_list we wrote in the previous section to use pattern matching:</p><pre>fun sum_list(numbers : int list) =<br>  <strong>case </strong>numbers<strong> of</strong> <br>    <strong>[]</strong>  =&gt; 0                                  (* if list is empty *)<br>    <strong>| _</strong> =&gt; hd numbers + sum_list(tl numbers)  (* any other match *)</pre><p>We specify that we want to pattern match the list by writing case numbers of. Then we first match numbers to an empty list [] and do something (return 0 in this case). And finally for any other match, the “else” case, we&#39;ll take the first element from the list and sum the <em>tail</em> calling the function recursively.</p><p>In this example, we already declared the type of the parameter numbers as an int list, so the second pattern we matched was basically any int list that isn&#39;t empty.</p><p>We can leverage pattern matching by not explicitly declaring the type of the function parameter:</p><pre>fun sum_list(numbers) =<br>  <strong>case numbers of</strong> <br>    <strong>[]</strong>  =&gt; 0                     <br>    <strong>| x::x&#39; </strong>=&gt; x + sum_list(x&#39;)  </pre><p>In this example, numbers&#39; type is inferred to be an int list because we are adding with a sum operation. Then we match numbers to a second pattern: x::x&#39; which means that if numbers is a construct that has an element as head (x) that can be concatenated (::) with the rest of the elements (x&#39;), then do something: a list.</p><p>This is very powerful, as it extracts the head element into x and the rest of the list into x&#39;.</p><p><strong>Pattern matching looks cool but why using pattern matching if I can achieve the same with an </strong><strong>if else statement?</strong></p><p>Imagine you write the same function but with an if else statement:</p><pre>fun <strong>sum_list</strong>(numbers : int list) =<br>  (hd numbers + <strong>sum_list</strong>(tl numbers))</pre><p>and let&#39;s say you forget the case when the list is empty. Your program will still compile, but it will fail when the list is empty. The head of an empty list hd [] will throw an exception.</p><p>By using Pattern Matching, <strong>the compiler will let you know with a warning that you forgot to check all the cases</strong>. It&#39;s better to get a compiler warning that a runtime exception!</p><blockquote>By using Pattern Matching, <strong>the compiler will let you know with a warning that you forgot to check all the cases</strong>.</blockquote><h4><strong>Tail recursion</strong></h4><p>Tail recursion is the same as recursion because a function will call itself, but the difference is that when the recursion ends there is no extra computation to do.</p><p>Notice that in the previous example where we had a recursive call, we were doing x + sum_list(x&#39;) , meaning that once we get to the end of the list, we still have to go back and apply sum all the heads of the list (x).</p><p>We can rewrite the same function but using <strong>tail recursion</strong>. To do so, we can define a local helper function that will hold the total sum. This is so we have a way to accumulate the result plus a function that will call itself:</p><pre>fun sum_list(numbers) = <br>  let fun <strong>helper</strong>(list, result) =<br>    case list of <br>      [] =&gt; result<br>      | x&#39;::x&#39;&#39; =&gt;  <strong>helper</strong>(x&#39;&#39;, result + x&#39;) <br>  in <br>    helper(numbers, 0)  (* initial state *)<br>  end;</pre><p><strong>The compiler can optimise the call stack when there is tail recursion</strong>, therefore tail recursion is an effective recursive function.</p><h4>Functions as arguments</h4><p>Functions can be passed as arguments to other functions.</p><p>Let&#39;s say we already have a function implemented called double_function</p><pre>fun double_plus_one (double_function, x) = <br>   double_function(x) + 1</pre><p>and now we need another function that will add 1 to the double of a number. We can create the function double_plus_one that expects you to pass a a function that doubles a number, and a number:</p><pre>fun double_plus_one (double_function, x) = <br>   double_function(x) + 1</pre><pre>fun double x = x * 2</pre><pre>double_plus_one (double_function, 3)</pre><h4>Combining functions</h4><p>What if we already had the function double and another one that adds 1 to a number, couldn&#39;t we combine them instead of creating the previous function?</p><p>Yes! We can do it:</p><pre>fun double x = x * 2<br>fun plus_one x = x + 1</pre><pre>fun double_plus_one x = plus_one <strong>o</strong> double x</pre><p>where o indicates that you<strong> combine two functions</strong>.</p><h4><strong>Currying</strong></h4><p>Any function that can take multiple arguments can be called only with the first argument, and the output will be another function that takes the rest of arguments.</p><p>This technique is called currying, where a function takes an argument and returns another function that will take a second argument, and so on.</p><p>Like in this example, the function my_curry takes the arguments a and b:</p><pre>fun my_curry a b  (* same as ((mycurry a) b) *)</pre><pre>val out_a = my_curry a<br>val out_b = out_a b</pre><pre>&#39;out_b&#39; is the same as &#39;my_curry a b&#39;</pre><p>Calling my_curry a outputs a new function that takes one parameter. The resulting function can now be called with b. And this is exactly the same as calling my_curry a b.</p><p>While learning Standard ML, I’ve found some similarities with languages I use nowadays like Kotlin or Dart, while other features are not supported by those languages, like currying.</p><p>And as well, there’s other things like creating Type classes, closures and fold, that were taught in the course but I didn’t cover here.</p><p>The course content was very well explained, though have in mind that only covers the surface of functional programming. Unfortunately, I found the assignments quite difficult, so this is something to keep in mind.</p><p>I hope that this article has inspired you to learn a new programming paradigm like functional programming. Happy learning!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3f2041c3590a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Flutter Europe 2020 sketched live]]></title>
            <link>https://medium.com/@laramartin/flutter-europe-2020-sketched-live-a822d614afa6?source=rss-42754ec47023------2</link>
            <guid isPermaLink="false">https://medium.com/p/a822d614afa6</guid>
            <category><![CDATA[dart]]></category>
            <category><![CDATA[flutter]]></category>
            <category><![CDATA[google]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Lara Martín]]></dc:creator>
            <pubDate>Sat, 01 Feb 2020 14:30:18 GMT</pubDate>
            <atom:updated>2020-02-03T07:57:30.453Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fmLlV-e_hVKpBhhkY4HXKg.jpeg" /></figure><h3>Flutter Europe 2020 sketched</h3><h4>From desktop to convincing your stakeholders</h4><p>Flutter Europe 2020 is the first edition of the biggest Flutter Conference. Two days, two tracks, 26 talks and 2 keynotes!</p><p>Here I present you the talks I attended and was able to sketch live in the conference. The videos aren&#39;t available yet, but once they are published, I will link them here.</p><h3>Flutter for desktop — what is it good for?</h3><p>Talk by <a href="https://twitter.com/OrestesGaolin">Dominik Roszkowski</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zTYRAdeKYIfqfm8kiljx5g.jpeg" /></figure><h3>Performance: Optimizing your Flutter app</h3><p>Talk by <a href="https://medium.com/u/696ae61bc6e2">Filip Hracek</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2p7muh79tArwc9LICcG5kQ.jpeg" /></figure><h3>Flutter at work</h3><p>Talk by <a href="https://medium.com/u/49be9fe426e">Swav Kulinski</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*B4NUgfz1O2tru88QrnM1Xw.jpeg" /></figure><h3>Flutter at scale</h3><p>Talk by <a href="https://medium.com/u/9bdcf3c55e8">Jorge Coca</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1AKiYmfDkEmWQ5M5HdmXdw.jpeg" /></figure><h3>Navigator and Routes and Transitions… Oh, My!</h3><p>Talk by <a href="https://medium.com/u/91cb19edfc82">Simon Lightfoot</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*X2drf0Xn2lCXh6dIrqYyCg.jpeg" /></figure><p>I&#39;m personally very looking forward to <a href="https://fluttereurope.dev/">Flutter Europe 2021</a> 😉</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a822d614afa6" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Resources to learn Flutter]]></title>
            <link>https://medium.com/flutter-community/resources-to-learn-flutter-2ade7aa73305?source=rss-42754ec47023------2</link>
            <guid isPermaLink="false">https://medium.com/p/2ade7aa73305</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[dart]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[flutter]]></category>
            <dc:creator><![CDATA[Lara Martín]]></dc:creator>
            <pubDate>Sat, 06 Jul 2019 16:25:49 GMT</pubDate>
            <atom:updated>2019-07-13T15:57:44.140Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nvEGMayh9BLHstljm7auFg.jpeg" /></figure><h4>Learn by reading, doing courses and watching videos</h4><p>Everyone learns in different ways. Whether you prefer reading articles and documentation, watch videos, do courses or a mix, I have you covered!</p><h3>Reading</h3><h4>Official documentation</h4><p>The official documentation is pretty nice as it&#39;s well explained and contains lots of examples:</p><p><a href="https://flutter.dev/docs">Flutter documentation</a></p><p>If you come from Android, iOS, React Native, web or Xamarin, in the Flutter docs you will find an explanation on how Flutter compares to the platform you already know: <a href="https://flutter.dev/docs/get-started/flutter-for/">https://flutter.dev/docs/get-started/flutter-for/</a></p><h4><strong>Flutter Cookbook</strong></h4><p>The Flutter team created a <a href="https://flutter.dev/docs/cookbook">cookbook</a> where you will find many recipes that will teach how you can implement different mobile application components like navigation, persistence, animations, networking and more.</p><p><a href="https://flutter.dev/docs/cookbook">Cookbook</a></p><h4>Blog Posts</h4><p>You can find articles written by members of the Flutter team:</p><p><a href="https://medium.com/flutter">Flutter</a></p><p>as well as many articles written by developers from the community:</p><p><a href="https://medium.com/flutter-community">Flutter Community</a></p><h4><strong>Flutter Gallery</strong></h4><p>This is an application showcasing the power of Flutter. It also allows you to switch platform to iOS to see how the same application behaves if your mobile device ran iOS.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OqGil6r4Ai8AHAYrI86nGg.png" /><figcaption>Screenshot of the Flutter Gallery in Google Play Store</figcaption></figure><p>Find it <a href="https://play.google.com/store/apps/details?id=io.flutter.demo.gallery">on Google Play</a>, or if you wish to take a look at the source code, here is the repository: <a href="https://github.com/flutter/flutter/tree/master/examples/flutter_gallery">https://github.com/flutter/flutter/tree/master/examples/flutter_gallery</a></p><h4>Sample apps</h4><p>If you want to learn looking at code, there&#39;s a list of sample applications linked in the Flutter repository:</p><p><a href="https://github.com/flutter/samples/blob/master/INDEX.md">flutter/samples</a></p><h3>Practicing</h3><h4>Codelabs</h4><p>If you like to learn by coding while following some tutorials, I recommend you the Google Codelabs. You will find a <a href="https://codelabs.developers.google.com/codelabs/from-java-to-dart/#0">Dart Google Codelab</a> and several <a href="https://flutter.dev/docs/codelabs">Flutter Google Codelabs</a>:</p><ul><li><a href="https://codelabs.developers.google.com/codelabs/from-java-to-dart/#0">Intro to Dart for Java Developers</a></li><li><a href="https://flutter.dev/docs/codelabs">Codelabs</a></li></ul><h4><strong>Udacity Flutter Course</strong></h4><p>Google and Udacity collaborated creating a course to learn how to build apps using Flutter:</p><p><a href="https://eu.udacity.com/course/build-native-mobile-apps-with-flutter--ud905">Build Native Mobile Apps with Flutter | Udacity</a></p><h4>Flutter Meetup Events</h4><p>Meetup events focused on Flutter are appearing in many cities.<a href="https://www.meetup.com/find/?keywords=flutter&amp;radius=Infinity"> Find one close to you</a>!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CCoRvJ2fsvlC_0mcFSU3uw.png" /><figcaption>Diverse Flutter Meetup events</figcaption></figure><h4>Flutter Study Jam</h4><p>If you want to learn together with a group of people, I suggest you to look for <strong>Flutter Study Jams</strong>. These are study groups organized by Google Developer Groups (GDG). Check if there are any <a href="https://developers.google.com/community/gdg/">GDG groups in your area</a>, then check if they are planning to run a Flutter Study Jam and join them!</p><h3>Watching</h3><h4><strong>Flutter YouTube Channel</strong></h4><p>The Flutter team has an official YouTube channel where they post different content as talks given at conferences, tutorials and events:</p><p><a href="https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw"></a></p><p>From the video series they publish, the ones I like the most are:</p><ol><li><strong>Flutter in Focus. </strong>This video series are 5–10 minutes Flutter tutorials:</li></ol><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fvideoseries%3Flist%3DPLjxrf2q8roU2HdJQDjJzOeO6J3FoFLWr2&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DwgTBLj7rMPM&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FwgTBLj7rMPM%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/4e75fa7d808fb1abe9784a22bda734c1/href">https://medium.com/media/4e75fa7d808fb1abe9784a22bda734c1/href</a></iframe><p><strong>2. The Boring Flutter Development Show</strong>. In this show, two developers will code, get stuck and debug together different Flutter components while building apps. <a href="https://www.youtube.com/watch?v=vqPG1tU6-c0&amp;list=PLjxrf2q8roU3ahJVrSgAnPjzkpGmL9Czl"><strong>Playlist</strong></a></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FvqPG1tU6-c0%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DvqPG1tU6-c0&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FvqPG1tU6-c0%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/2c57d254da4183619d1d0dbd00ab996b/href">https://medium.com/media/2c57d254da4183619d1d0dbd00ab996b/href</a></iframe><p><strong>3. Flutter Widget of the Week</strong>. Every week they present a Widget, explaining what it is for and how to use it. This is a cool way to learn new widgets every week: <a href="https://www.youtube.com/watch?v=b_sQ9bMltGU&amp;list=PLjxrf2q8roU23XGwz3Km7sQZFTdB996iG"><strong>Playlist</strong></a>.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fb_sQ9bMltGU%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Db_sQ9bMltGU&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fb_sQ9bMltGU%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/80144cb1784dec3b1b613228242bb846/href">https://medium.com/media/80144cb1784dec3b1b613228242bb846/href</a></iframe><h4><strong>MTechViral</strong></h4><p>Flutter tutorials created by <a href="https://medium.com/u/9aa4b1addb2e">Pawan Kumar</a>:</p><p><a href="https://www.youtube.com/channel/UCFTM1FGjZSkoSPDZgtbp7hA">MTECHVIRAL</a></p><h4><strong>WhatsUpCoders</strong></h4><p>Flutter tutorials created by <a href="https://twitter.com/whatsupcoders">Kamal</a>:</p><p><a href="https://www.youtube.com/channel/UCDCFIqDZ1QUqivxVFQDxS0w">whatsupcoders</a></p><p>Those are the resources I like the most. I wish you a <strong>happy learning! 😃</strong></p><p>Would you like to send me a question? Do it here <a href="https://ask.fm/asklariki"><strong>https://ask.fm/asklariki</strong></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2ade7aa73305" width="1" height="1" alt=""><hr><p><a href="https://medium.com/flutter-community/resources-to-learn-flutter-2ade7aa73305">Resources to learn Flutter</a> was originally published in <a href="https://medium.com/flutter-community">Flutter Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lara's Q&A — vol. 1]]></title>
            <link>https://medium.com/@laramartin/laras-q-a-vol-1-f0ef4ae1dd54?source=rss-42754ec47023------2</link>
            <guid isPermaLink="false">https://medium.com/p/f0ef4ae1dd54</guid>
            <category><![CDATA[computer-science]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[growth]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[careers]]></category>
            <dc:creator><![CDATA[Lara Martín]]></dc:creator>
            <pubDate>Mon, 17 Jun 2019 08:10:20 GMT</pubDate>
            <atom:updated>2019-06-17T09:59:13.327Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-M6LbkMX0V7VdAuSPHy8nw.png" /></figure><h3>Lara&#39;s Q&amp;A — vol. 1</h3><h4>Questions about technology, Software Development and careers</h4><p>Here I answer some of the interesting questions I received via <a href="https://ask.fm/AskLariki">https://ask.fm/AskLariki</a></p><h3>Q: I just started learning Android. Should I learn Kotlin or Java?</h3><p>I would focus first on the basics of Android, and learn Java or Kotlin on the go. Later on you can learn the best practices for each programming language. As an Android Developer, you&#39;ll probably use both Java and Kotlin, depending on the project you&#39;re working on, as you will probably have to maintain both at work.</p><p>Don’t worry, once you are able write in one programming language, the next programming languages will be easy to learn! 🙂</p><h3>Q: People suggest me to learn JavaScript. I like learning Android with Kotlin and Java. Most of the job postings I see are for JavaScript positions. Should I learn JavaScript or Android?</h3><p>If there&#39;s a lesson I learned is that you should focus on things you&#39;re passionate about. I learned Android because I loved it. I am learning Flutter because I enjoy it.</p><p>It&#39;s true it&#39;s more difficult to find entry level jobs for Android than other platforms. It also depends on the area you live, though. So keep in mind the local market, specially if you&#39;re starting. Participate in local communities to see how it is. That can also help you decide. I personally found the Berlin Android community awesome and that helped me.</p><h3><strong>Q: How to progress to tech lead?</strong></h3><p>I haven&#39;t done that. I have only seen people getting into that role. For me, a good tech lead is not someone that only has a great technical knowledge and can work cross teams taking important technical decisions. But someone who is good at working with people, at communicating with all roles and levels, and can help others grow.</p><p>It&#39;s difficult to find this kind of roles in the market, but it seems those roles appear naturally as the team grows. Be good at communication, organization and personal time management, and you will grow into the role.</p><h3><strong>Q: How do some of the famous twitter devs get time to write blog posts on all the latest tech?</strong></h3><p>I often ask myself the same. I can only answer from my own experience. The truth is that I dedicate part of my free time for creating blog posts, talks and learning. You can find time during the day in some ways. For example, when I work from home and don&#39;t commute, that saves me 1.5h that I can use for it. The support I get from my family is also crucial, otherwise it would be almost impossible.</p><h3><strong>Q: How to start contributing to open source?</strong></h3><p>The easiest way I found is fixing documentation, typos and examples. Reporting bugs is also very important, even better if you can create projects or tests that can reproduce the issue.</p><p>You can also create examples for existing libraries, to help others learn how to use it. For example the <a href="https://github.com/brianegan/flutter_architecture_samples">architecture samples for Flutter</a>.</p><h3><strong>Q: What’s your preferred state management approach in Flutter?</strong></h3><p>I don&#39;t have a preferred one. All have their advantages and disadvantages. I&#39;m right now using <a href="https://pub.dev/packages/scoped_model">ScopedModel</a> for a small project. Next I want to give a try to <a href="https://pub.dev/packages/provider">Provider</a>, which I haven&#39;t used yet.</p><h3><strong>Q: What should I expect at my final onsite interview?</strong></h3><p>It depends on the hiring process. If you already had the technical interview, then at your final onsite you will probably talk with managers and spend some time getting to know the team.</p><p>The worst part already passed, just be nice and be yourself. At this stage you are very very close to get in. Take the opportunity to see if they are the right fit for you. They will be doing the same.</p><h3><strong>Q: How can I change my career into programming?</strong></h3><p>Long story short: I started learning programming a long time ago, but I was never focusing on it. I took my first step into tech by getting a job as Quality Assurance. During that time, I spent my evenings and weekends learning Android programming. By already being a QA, it made my switch to professional Android development less difficult.</p><p>I wrote some blog posts about my path that will give you more details:</p><ul><li><a href="https://medium.com/@laramartin/how-i-took-my-first-step-in-it-6e9233c4684d">How I took my first step in tech</a></li><li><a href="https://medium.com/udacity/a-year-of-android-ffba9f3e40b6">A year of Android</a></li></ul><h3><strong>Q: What are the topics an Android developer needs to know to work in cool tech companies like Blinkist?</strong></h3><p>If you want to work on a modern code base you &quot;need&quot; to know: RxJava, Dagger, architecture patterns like MVP and MVVM, Kotlin and testing. You don&#39;t have to be an expert on those, but you need to know how to explain concepts to your peers, like what they do or why you need those libraries.</p><h3>Q: Can you be my mentor?</h3><p>Sometimes I get this question. Unfortunately I cannot be your mentor, as I barely have time ☹️.</p><p>I suggest you to go to local meetups and study groups. Finding one peer is all it takes, so that you will be able to help each other! You have to be accountable for each other: if you say you will study every weekend, you need them to check you are doing that.</p><p>Thank you all for taking the time to send me questions 😊 If you have any question you would like to send me, you can do it directly here <a href="https://ask.fm/AskLariki">https://ask.fm/AskLariki</a> or on Twitter at <a href="http://twitter.com/lariki">http://twitter.com/lariki</a> 😃</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f0ef4ae1dd54" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Flutter at Google I/O 2019 sketched]]></title>
            <link>https://medium.com/@laramartin/flutter-at-google-i-o-2019-sketched-7d58de39cf13?source=rss-42754ec47023------2</link>
            <guid isPermaLink="false">https://medium.com/p/7d58de39cf13</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[dart]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[google]]></category>
            <category><![CDATA[flutter]]></category>
            <dc:creator><![CDATA[Lara Martín]]></dc:creator>
            <pubDate>Tue, 28 May 2019 19:42:56 GMT</pubDate>
            <atom:updated>2019-05-28T19:52:15.727Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*meVYbxP2Ha7-uZvU_cXa1A.png" /></figure><h4>From design to architecture and language features</h4><h3>Beyond Mobile: Material Design, Adaptable UIs, and Flutter</h3><p>Talk by <a href="https://medium.com/u/790460f492fa">Will Larche</a> and Anthony Robledo.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qL3VZM3h0rQFuYg9dXn5Jw.jpeg" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FYSULAJf6R6M%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DYSULAJf6R6M&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FYSULAJf6R6M%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/b11d19cbf37b1c4211a501a5ea6a5bcb/href">https://medium.com/media/b11d19cbf37b1c4211a501a5ea6a5bcb/href</a></iframe><h3>Building for iOS with Flutter</h3><p>Talk by <a href="https://medium.com/u/26a19a14addb">Andrew Brogdon</a> and <a href="https://medium.com/u/dfd5de850c70">Brett Morgan</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_HheZM4dvviqDJ1tnD_HpA.jpeg" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FZBJa-xjZl3w%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DZBJa-xjZl3w&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FZBJa-xjZl3w%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/5dabf79a7482e6d31dfc9f664911095e/href">https://medium.com/media/5dabf79a7482e6d31dfc9f664911095e/href</a></iframe><h3>Beyond Mobile: Building Flutter Apps for iOS, Android, Chrome OS, and Web</h3><p>Talk by Emily Shack and <a href="https://medium.com/u/45d6b1e163cc">Emily Fortuna</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7ql5Sm7ww_SfcX2OXTHMrQ.jpeg" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FIyFZznAk69U%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DIyFZznAk69U&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FIyFZznAk69U%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/c370e676078694c4303313646167d627/href">https://medium.com/media/c370e676078694c4303313646167d627/href</a></iframe><h3>Dart: Productive, Fast, Multi-Platform — Pick 3</h3><p>Talk by <a href="https://medium.com/u/441fe70f4b5e">Kevin Moore</a> and <a href="https://medium.com/u/9e0692285f8b">Bob Nystrom</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZQPoNesnF64_dXRG_ST68g.jpeg" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FJ5DQRPRBiFI%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DJ5DQRPRBiFI&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FJ5DQRPRBiFI%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/19f23bc6ed92042c93784b85306dada3/href">https://medium.com/media/19f23bc6ed92042c93784b85306dada3/href</a></iframe><h3>Pragmatic State Management in Flutter</h3><p>Talk by <a href="https://medium.com/u/696ae61bc6e2">Filip Hracek</a> and <a href="https://medium.com/u/687b78093a96">Matt Sullivan</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hdf5nY46bwdRZMU-KHq9Tg.jpeg" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fd_m5csmrf7I%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dd_m5csmrf7I&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fd_m5csmrf7I%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/7a3c70439dd3c91251d7f9ccf879d114/href">https://medium.com/media/7a3c70439dd3c91251d7f9ccf879d114/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7d58de39cf13" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Master-Detail views with Navigation Components]]></title>
            <link>https://proandroiddev.com/master-detail-views-with-navigation-components-a20405f31974?source=rss-42754ec47023------2</link>
            <guid isPermaLink="false">https://medium.com/p/a20405f31974</guid>
            <category><![CDATA[android-development]]></category>
            <category><![CDATA[android]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[Lara Martín]]></dc:creator>
            <pubDate>Sat, 09 Mar 2019 19:34:49 GMT</pubDate>
            <atom:updated>2019-03-18T20:05:12.701Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VVCNY4lmMal-gw4AEmaXYA.png" /><figcaption>Lara’s wow moments!</figcaption></figure><p>I researched if the Navigation Architecture Components could be integrated with our own navigation system at work. The navigation of this app was implemented via &quot;pushing and popping&quot; fragments.</p><p>One thing I could not find was how to deal with Master-Detail views and Navigation Components. A Master-Detail view is a view that contains a list of items on the side of the layout, and by tapping an item, the detail is shown next to it. These views are mostly used in big devices such as tablets, as they have more space to display more information.</p><p>In this article, I will show you how you can have Master-Detail views with Navigation Components, but without going into details on how Navigation Components work. For deep-dives on Navigation Components, I recommend you to <a href="https://www.pluralsight.com/courses/android-navigation-architecture-components-getting-started">take a course</a>, or read these series of <a href="https://medium.com/google-developer-experts/android-navigation-components-part-1-236b2a479d44">articles</a>.</p><h3>Sample App</h3><p>The Sample Application that I will use to explain this, is basically a BottomNavigationView with three “master” screens: Feed, Messages and Profile.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6-TT-2mkQFXt6vVP2DXKZQ.png" /><figcaption>My Sample App running on a phone device</figcaption></figure><p>When opening the Profile, the user can navigate deep into Account, Notifications and Settings, and navigate back to the Profile.</p><p>When we are using a tablet, we want to display the Profile master screen as seen below. The idea is to have the Profile Fragment screen on the left, and the detail screens on the right. This is what we call the Master-Detail views.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nh4mMPMTTeiMP7ne9yP0sQ.png" /><figcaption>My Sample App running on a tablet device</figcaption></figure><h4>Creating The Navigation Graphs</h4><p>The way we are going to solve this, is by having two navigation graphs.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/920/1*91f3mE83_e3tPkcbpyuP1g.png" /><figcaption>Two navigation graphs</figcaption></figure><p>The “main” navigation graph, covers the whole application navigation, for both phones and tablets, but with an exception, as we won’t be using the actions that take the user from the Profile to the details screens when using a tablet. More on that later.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TuOWVa3atOpjEys3wEbatA.png" /><figcaption>nav_graph_main.xml</figcaption></figure><p>The “profile” navigation graph contains only the three details screens. This graph is going to be used only on tablet, on the right side of the screen.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/946/1*yZBhEMAUU5yiWv0qbEvy2g.png" /><figcaption>nav_graph_profile.xml</figcaption></figure><p>You may have an idea already of how are we going to solve this. On tablets, we are going to have a second NavHostFragment which is going to use the nav_graph_profile.xml. Let’s see now how to do that.</p><h4>How To Handle Tablet Mode</h4><p>A trick I love to use to easily know if we are on a tablet or a phone is to use a resource value that is going to change depending on the device configuration.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/444/1*eyjvzLhAznbE95fITw2RWQ.png" /><figcaption>bools.xml contains the value</figcaption></figure><ol><li>Create a bools.xml file in your values folder.</li><li>Create a variant of the same file, under values-sw600dp, which will be used by “big” devices.</li></ol><p>On values we will have:</p><pre><em>&lt;?</em>xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;<em>?&gt;<br></em>&lt;<strong>resources</strong>&gt;<br>    &lt;<strong>bool </strong>name=&quot;isTablet&quot;&gt;false&lt;/<strong>bool</strong>&gt;<br>&lt;/<strong>resources</strong>&gt;</pre><p>On values-sw600dp:</p><pre><em>&lt;?</em>xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;<em>?&gt;<br></em>&lt;<strong>resources</strong>&gt;<br>    &lt;<strong>bool </strong>name=&quot;isTablet&quot;&gt;true&lt;/<strong>bool</strong>&gt;<br>&lt;/<strong>resources</strong>&gt;</pre><p>Now let’s look on how to handle this on the ProfileFragment.</p><h4>Loading A Different Layout On Tablet</h4><p>In our onCreateView we will load a different layout depending on the type of device, we can do that with a snippet like this one:</p><pre><strong>val </strong>isTablet = <em>context</em>.<em>resources</em>.getBoolean(<strong>R</strong>.<strong>bool</strong>.<em>isTablet</em>)<br><br><strong>when </strong>{<br>    isTablet -&gt; {<br>        view = inflater.inflate(<strong>R</strong>.<strong>layout</strong>.<em>fragment_profile_land</em>, ...)<br>        displayMasterDetailLayout(view)<br>    }<br>    <strong>else </strong>-&gt; {<br>        view = inflater.inflate(<strong>R</strong>.<strong>layout</strong>.<em>fragment_profile</em>, ...)<br>        displaySingleLayout(view)<br>    }<br>}</pre><p>The fragment_profile.xml layout is very simple, and it only contains three buttons.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1002/1*EhdWGjCxR2MwyIVCj0lBNw.png" /></figure><p>The profile fragment_profile_land.xml is a bit more complex:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vgMRoolP6ySfL20m5t7ghQ.png" /></figure><p>On the left we have exactly the same layout as we had in the fragment_profile.xml, but on the right, there’s another Fragment with the id profile_nav_container, the NavHostFragment (which is previewed as the Account screen).</p><pre>&lt;<strong>fragment<br>        </strong>android:id=&quot;@+id/profile_nav_container&quot;<br>        android:name=&quot;androidx.navigation.fragment.NavHostFragment&quot;<br>        android:layout_width=&quot;0dp&quot;<br>        android:layout_height=&quot;0dp&quot;<br>        app:defaultNavHost=&quot;false&quot;<br>        app:layout_constraintBottom_toBottomOf=&quot;parent&quot;<br>        app:layout_constraintEnd_toEndOf=&quot;parent&quot;<br>        app:layout_constraintStart_toEndOf=&quot;@id/guideline&quot;<br>        app:layout_constraintTop_toTopOf=&quot;parent&quot;<br>        <strong>app:navGraph=&quot;@navigation/nav_graph_profile&quot;</strong>/&gt;</pre><p>As you can see, the navGraph is the nav_graph_profile we defined before, and here is were the Master-Detail navigation will happen.</p><p>If we run the project like that, it will look correct both on phone and tablet, but the navigation wouldn’t work yet, because we have to implement it.</p><h4>How To Navigate</h4><p>You noticed before that I had two methods: displaySingleLayout and displayMasterDetailLayout. These methods take care of configuring the navigation on both cases.</p><p>Let’s see how:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/417ae0c532686b9ea9e18ed3ecde7517/href">https://medium.com/media/417ae0c532686b9ea9e18ed3ecde7517/href</a></iframe><p>On displaySingleLayout, I am just configuring the buttons I have to navigate to the corresponding detail screen. So for example, the account_textview is going to navigate to the Account Fragment using the <em>action_profile_fragment_to_fragment_account </em>Action<em>.</em></p><p>With the displayMasterDetailLayout function is a bit more complicated.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e919de01ebe00030ed26cb78f9ad38ac/href">https://medium.com/media/e919de01ebe00030ed26cb78f9ad38ac/href</a></iframe><p>The idea is to use the NavHostFragment we have on the right of the screen to perform navigation, instead of using the one contained in the MainActivity.</p><p>First, obtain the NavHostFragment by calling to the childFragmentManager.findFragmentById and then passing the id of the NavHostFragment.</p><p>Then, instead of using the createNavigateOnClickListener, we need to call to navigate manually using the NavHostFragment we just got.</p><h3><strong>WOW! 🤯</strong></h3><h4>Summary</h4><p>Handling tablet navigation can be daunting task, but if we apply the principles of the Navigation Component, we can create our own solutions easily. However, this may not be obvious when looking at the official documentation.</p><p>The way I solved this was by having two navigation graphs, and by having two different layouts for my ProfileFragment.</p><p>Having more than one navigation graph is completely OK, so don’t be afraid of doing that.</p><p>You can find all the code from this article here:</p><p><a href="https://github.com/laramartin/android-navigation-master-detail">laramartin/android-navigation-master-detail</a></p><h4>Update:</h4><p>As <a href="https://medium.com/u/2bbf49fa59bf">Nicole Borrelli</a> pointed out, we could place the layout for tablet in the resource folder layout-sw600dp and name our two layouts the same. Then, as we are trusting that the layout for tablet will be the one with the second NavHostFragment, we could reduce our code as:</p><pre><strong>val </strong>isTablet = <em>context</em>.<em>resources</em>.getBoolean(<strong>R</strong>.<strong>bool</strong>.<em>isTablet</em>)<br><br>view = inflater.inflate(<strong>R</strong>.<strong>layout</strong>.<em>fragment_profile</em>, ...)</pre><pre>if (isTablet) displayMasterDetailLayout(view) else displaySingleLayout(view)</pre><p>Thank you, <a href="https://medium.com/u/2bbf49fa59bf">Nicole Borrelli</a>!! 💚</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a20405f31974" width="1" height="1" alt=""><hr><p><a href="https://proandroiddev.com/master-detail-views-with-navigation-components-a20405f31974">Master-Detail views with Navigation Components</a> was originally published in <a href="https://proandroiddev.com/">ProAndroidDev</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Supporting Each Other]]></title>
            <link>https://medium.com/@laramartin/supporting-each-other-d708aa59a4ae?source=rss-42754ec47023------2</link>
            <guid isPermaLink="false">https://medium.com/p/d708aa59a4ae</guid>
            <category><![CDATA[tech]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[careers]]></category>
            <category><![CDATA[personal-development]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Lara Martín]]></dc:creator>
            <pubDate>Tue, 26 Feb 2019 09:17:57 GMT</pubDate>
            <atom:updated>2019-02-26T09:17:57.673Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uMC5_vhAaVv0pQ0JDGahIQ.png" /></figure><h4>Growth for Juniors and Seniors</h4><p>We often talk about the importance of hiring Juniors, a topic that pops up every now and then, but it is still undecided how to solve this problem, specially in smaller companies. I’m going to share with you my experience and the tips that helped me and other Juniors grow in a professional environment, but also, how that helps the rest of the team.</p><h3>Problem</h3><p>In the tech industry there’s a high demand nowadays for software developers, and this is widely known. Perhaps you are struggling finding developers to join your team, and you discussed many times with your manager who to hire. “What is the level we are looking for?” you might have asked.</p><blockquote>Seniors, we only want Seniors.</blockquote><p>Sadly, when it comes to hiring, companies prefer Seniors. This may be because Seniors already have the knowledge and the experience, and companies are always chasing after the market with their products, but even some <a href="https://www.quora.com/Why-aren%E2%80%99t-there-interns-at-Netflix">big companies pride themselves saying they only hire Seniors</a>! So even big names aren’t investing in Juniors.</p><blockquote>“Where do Seniors come from?”</blockquote><p><strong>No one is being born a Senior</strong>. You all have been Juniors before.</p><p>It’s very difficult for Juniors to find their first job, as there are just a fewer job openings for that level. But companies forget that<strong> Juniors also bring lots of good things</strong> to your team.</p><h3>Juniors bring good things</h3><p>Juniors bring <strong>fresh motivation</strong>. They are really excited to have their first job and to work with you!! Their motivation is contagious 😊</p><p>Juniors bring a <strong>learning mindset</strong>. They are excited to learn. They are excited to learn with you and from you! You, Senior, might not have the motivation sometimes to learn something new. However, Juniors are continuously learning to improve. They’ll probably share what they’re doing with you, and this will motivate you.</p><p>Juniors bring <strong>fresh knowledge</strong>, as they have probably played with new components and libraries you didn’t have the chance to try out yet. And more importantly: <strong>every person is different</strong>. Everyone has different life experiences and backgrounds. Perhaps the Junior has some knowledge on AI, Biology, or data science!</p><p>Juniors bring a <strong>flexible mindset</strong>. Let’s be honest, when it comes to new technologies and libraries, Seniors may not be flexible sometimes. Perhaps because they want to keep a stable product, but…sometimes because they just don’t have the energy or motivation to learn something new.</p><h3>What Seniors gain</h3><p>At this point you have seen that Juniors will benefit your team, but you might be thinking…</p><blockquote>“What do I, the Senior, gain from it?”</blockquote><p>You will demonstrate your company that you can <strong>lead</strong>.</p><p>Most importantly, this will help your <strong>career growth</strong>. As part of your Senior role, you are expected to be able to mentor people.</p><p><strong>Are you ready to mentor Juniors?</strong> I will give you some tips on making your mentoring more effective. But first, let’s see what mentoring is.</p><h3>Mentoring</h3><p>Mentoring is not a teacher-student relationship. Mentoring works both ways. <strong>The key of mentoring is sharing your knowledge</strong>.</p><p>How can I share my knowledge if I don’t act as a teacher? Well, you can share your knowledge in many ways!</p><p>You are sharing your knowledge…</p><ul><li>when you give <strong>constructive answers in code reviews</strong></li><li>when you share an article or a talk</li><li>when you explain why you’re using certain library in your project because that another one didn’t fit</li><li>when you talk about how certain approach or new library you think could benefit your product</li></ul><h3>Make your mentoring more effective</h3><p>There are many things that helped me growing as a Junior developer. Though, believe it or not, all the things I will mention here, apply to any level.</p><h4><strong>Focus on one topic</strong></h4><p>Choose one single topic to explain in a session. If you are working on something complex, choose only one topic to explain. Let’s say you want to focus the learning session on the architecture pattern your app follows. Whenever another topic comes up, like Dependency Injection or Reactive Programming, you can let the Junior copy an example or guide them step by step, without going into details.</p><p>This way you will introduce concepts <strong>slowly and without overwhelming</strong>.</p><h4>Communication</h4><p>This is probably the hardest skill to master for Software developers. Think of “effective communication”. How can you explain a complex concept to a Junior?</p><p>Have <strong>pen and paper</strong> always available. Write and draw while making complex explanations. This won’t only help the Junior, but anyone else listening to you. Besides, if you draw diagrams on a paper, Juniors will have it as reference for the next time they need it. :)</p><p>When communicating, always <strong>be constructive</strong>. Be constructive when writing code reviews. Never say directly <em>“Why did you do this?”</em>. Instead, you can say <em>“As I understand, you used this because of this reason. However, have you considered using this other approach instead?”</em>.</p><blockquote>Be constructive!</blockquote><h4>Environment</h4><p>Be sure you have a good environment, with good mood and without sexism. If Seniors ask questions without attacking each other, Juniors will do the same!</p><h4>Tasks</h4><p>With time, you will see the Junior’s capacity. Don’t give them always the same kind of tasks. Instead, give them diverse tasks so they see different parts of the project. From end to end, from API to UI. <strong>Always challenge their capacity!</strong></p><p>Also, don’t give them difficult tasks to do nor review. You don’t want to overwhelm them. In little time you will start understanding what they can do and you will feel more comfortable suggesting them tasks to do.</p><h4>Pair Programming</h4><p>Not everyone nor every company understands how good and effective pair programming is. Pair programming is NOT <em>“you code what I say”</em>. <strong>Pair programming is a conversation around a problem</strong>.</p><p>To help the Junior feel more comfortable doing pair programming with you, do it in their space. Let them take over the keyboard. They will feel more comfortable being in their space. Sit next to them.</p><p><strong>Be patient</strong>.</p><h3>Tips for Juniors</h3><h4>Starting a task</h4><p>When the Sprint starts, we get excited to start working on tasks. But when you read again the acceptance criteria, you might thinking <em>“I have no idea on how to start this task!”</em>.</p><p>A little tip: <strong>ask for guidance</strong>! A teammate can help you breaking down the task in small <em>Todos</em> and steps you can follow.</p><p>But what if you already have a rough idea of what to do? Ask for guidance too! But instead, this time you can write the list of <em>Todos</em> and steps, and then share it with your teammates. They can help you spot things you need to consider when not knowing the project.</p><h4>Asking questions</h4><p>Keep in mind that you have to ask questions and you have to bother your teammates. They won’t mind, they will get back to focus really quickly. The right time to <strong>ask a question</strong> is <strong>at any time</strong>.</p><h4>I got stuck!</h4><p>Welcome to the developers life! We all get stuck! Although, not everyone has the same capacity to move forward.</p><p><em>“Is it too soon to ask for help?”</em> Something that helps a lot when getting stuck is to <strong>time-box it</strong>. Give yourself 1–3 hours of research before asking for help.</p><p>However, sometimes we just need to take a break. <strong>Take breaks!</strong> Getting stuck is normal, and sometimes what we need is to stop focusing on the problem and refresh our minds. Go for a walk, make a tea, have some laughs with a colleague, watch a cute video of a puppy. Once you get back to your problem, you will see it from another perspective. I’m sure you solved many problems before by taking a break! :)</p><blockquote>Nice tips, but…I’m still stuck!</blockquote><p>One thing I also recommend doing when debugging your code, is <a href="https://en.wikipedia.org/wiki/Rubber_duck_debugging"><strong>Rubber Duck Debugging</strong></a>. Have a rubber duck next to you (or any other toy) and start explaining to it what you wanted to achieve with your code and every step you’ve done. Many times you can spot the issue yourself when explain it. And you can do the human version too: the <strong>Human Duck Debugging</strong> :) Tell a colleague you are stuck with something and start explaining them the problem. Again. Many times you will spot the issue alone, and that’s good! Other times, your colleagues will ask you questions that will help you debugging.</p><h4>Copy-Pasting</h4><p>Copy-Pasting is OK! We all google problems, we all copy code from StackOverflow. Copy-pasting is OK as long as you understand the problem you have and the solution you are copying.</p><p>One type of copy-pasting I suggest you to do is <strong>copying code from your own project</strong>. Search within your project some examples of what you want to do. This will help you see the patterns they follow, so you keep the code consistent.</p><h3>Final words</h3><p>We all are aware on the problem of the lack of Juniors in our industry. Only a few see the benefits that Juniors can bring. Be one of those few!</p><p>Remember:</p><ul><li>You will learn a lot, <strong>the best way to master something is to teach it</strong>.</li><li>You will have a rewarding experience by helping others grow and learn.</li></ul><p>Being nice to your Juniors can help you in the future too. You never know when you will need their help!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d708aa59a4ae" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Wow! Declaring classes in Kotlin]]></title>
            <link>https://proandroiddev.com/wow-declaring-classes-in-kotlin-dbcb56388443?source=rss-42754ec47023------2</link>
            <guid isPermaLink="false">https://medium.com/p/dbcb56388443</guid>
            <category><![CDATA[android]]></category>
            <category><![CDATA[tech]]></category>
            <category><![CDATA[kotlin]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Lara Martín]]></dc:creator>
            <pubDate>Mon, 17 Sep 2018 06:57:20 GMT</pubDate>
            <atom:updated>2018-09-23T15:52:06.513Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*I718FfWrGxuy4rzFWM3r9Q.png" /><figcaption>Lara&#39;s wow moments!</figcaption></figure><p>As part of my self-learning goals at work, I am reading “Kotlin in Action” in detail. I want to share with you something I learned that blew my mind!</p><p>In Kotlin, when you define a class, you can declare the constructor with the keyword constructor (which you can also omit) followed by the arguments required to initialize that class within parenthesis. This constructor is the primary constructor of your class.</p><p>Let&#39;s say we want to create the class Gamer that requires a username to be passed as an argument in its constructor.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/62cac4e41deacce4ee4249d761772d2b/href">https://medium.com/media/62cac4e41deacce4ee4249d761772d2b/href</a></iframe><p>Then you can declare any properties you want in the body of your class. But not only that, you can also declare one or more init blocks that can contain code that is needed for the initialization of the class.</p><p>Following our example, in our class Gamer we declare the property val username : String first, then within the init block, we assign the value we get from the constructor to the property:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c73bf7cf738dd026cd0583183b046fd8/href">https://medium.com/media/c73bf7cf738dd026cd0583183b046fd8/href</a></iframe><p>But there is a concise way to write the same code in only one line:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/0290b48491d8f022ceba1b7d4d75d55d/href">https://medium.com/media/0290b48491d8f022ceba1b7d4d75d55d/href</a></iframe><p><strong>YES!</strong> You can declare the property within the constructor. It behaves the same, and generates the same Java code. When you add the keyword val in front of an argument in the constructor, Kotlin will generate the property for you and will assign the value passed to the class to the property when the class is initialized.</p><p>To verify that they are 100% equivalent, I decompiled them to Java, so we can compare the Java-equivalent source code. I will rename the 1 line class declaration to GamerConciseSyntax.</p><p>Here you can see how they look like in Java:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/3888e661d9c35bb731d13697da297f77/href">https://medium.com/media/3888e661d9c35bb731d13697da297f77/href</a></iframe><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/d87739ac5f13aa915047b1b66ef8d42f/href">https://medium.com/media/d87739ac5f13aa915047b1b66ef8d42f/href</a></iframe><p>As you can see, the two code snippets look exactly the same. The Kotlin compiler is generating exactly the same bytecode for both, so there is no reason for you to not use the concise constructor syntax.</p><h3>WOW! 🤯</h3><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=dbcb56388443" width="1" height="1" alt=""><hr><p><a href="https://proandroiddev.com/wow-declaring-classes-in-kotlin-dbcb56388443">Wow! Declaring classes in Kotlin</a> was originally published in <a href="https://proandroiddev.com/">ProAndroidDev</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sketchnoting & Lettering Workshop]]></title>
            <link>https://medium.com/dachfest/sketchnoting-lettering-workshop-bf7875d43071?source=rss-42754ec47023------2</link>
            <guid isPermaLink="false">https://medium.com/p/bf7875d43071</guid>
            <category><![CDATA[conference]]></category>
            <category><![CDATA[workshop]]></category>
            <category><![CDATA[sketchnote]]></category>
            <category><![CDATA[tech]]></category>
            <dc:creator><![CDATA[Lara Martín]]></dc:creator>
            <pubDate>Sun, 09 Sep 2018 10:33:40 GMT</pubDate>
            <atom:updated>2018-09-09T11:11:14.676Z</atom:updated>
            <content:encoded><![CDATA[<h4>By Lara Martín &amp; Miquel Beltran</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0JTsKysyz7Ac5CeGQoRvcw.jpeg" /></figure><p>Unleash your creativity while actively listening to talks! Sketchnoting is the art of using visuals to record and share ideas. Come to learn about taking notes, and how to make beautiful sketches with the help of lettering techniques.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F-dctL1UUUM0%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D-dctL1UUUM0&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F-dctL1UUUM0%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/e1c1dfdbc4613a4470044ccbd1f5c0d6/href">https://medium.com/media/e1c1dfdbc4613a4470044ccbd1f5c0d6/href</a></iframe><p>Taking notes in a visual way, while actively listening to talks, is an excellent way to remember the most important ideas and going back to them in the future. You can also use sketchnoting to share ideas at work or to organize your day.</p><p>You will learn sketchnoting techniques from us while making your first sketch! And as well, you will learn the basics of lettering, the art of writing beautiful captions. We will be also sketchnoting with you, sharing our process live!</p><p><strong>Everyone can get started with sketchnoting, you only need pen and paper!</strong></p><p><em>Join us at </em><a href="http://dachfest.com/"><em>DACHFest</em></a><em>! The workshop is free for all conference attendees, and the conference tickets are already </em><a href="https://ti.to/dachfest/2018"><em>on sale</em></a><em>!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bf7875d43071" width="1" height="1" alt=""><hr><p><a href="https://medium.com/dachfest/sketchnoting-lettering-workshop-bf7875d43071">Sketchnoting &amp; Lettering Workshop</a> was originally published in <a href="https://medium.com/dachfest">DACHFest</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A year as Android Engineer]]></title>
            <link>https://proandroiddev.com/a-year-as-android-engineer-55e2a428dfc8?source=rss-42754ec47023------2</link>
            <guid isPermaLink="false">https://medium.com/p/55e2a428dfc8</guid>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[careers]]></category>
            <category><![CDATA[android]]></category>
            <category><![CDATA[android-app-development]]></category>
            <dc:creator><![CDATA[Lara Martín]]></dc:creator>
            <pubDate>Tue, 15 May 2018 06:47:24 GMT</pubDate>
            <atom:updated>2018-05-21T16:34:58.138Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tqshw1o4JZZlA1HW3Cki1Q.png" /><figcaption>Awesome drawing by <a href="https://medium.com/u/fe4cbfc9fac2">Miquel Beltran</a></figcaption></figure><p>Two years ago I started my career in tech. I started as QA Tester and then transitioned into a developer role a year after. Not without a lot of effort and a lot of personal time invested.</p><p>You can find that part of the story in this post about <a href="https://medium.com/@laramartin/how-i-took-my-first-step-in-it-6e9233c4684d">how I switch careers from Biology to tech</a> and how I <a href="https://medium.com/udacity/a-year-of-android-ffba9f3e40b6">learned Android for a year</a>. Today I want to talk about how I started my first role as Android developer, how I switched companies and how my first year as Android Engineer has been overall.</p><h3>My first role</h3><p>My first role as Android developer started out just a year ago. The company I was working at provided me with the opportunity to transition from QA to Android developer by dedicating half of the time to each role.</p><p>This transition was <strong>thanks to the time I invested learning Android on evenings and weekends</strong>. I went through the <a href="https://de.udacity.com/course/android-basics-nanodegree-by-google--nd803">Android Basics Nanodegree</a>, the <a href="https://de.udacity.com/course/android-developer-nanodegree-by-google--nd801">Android Developer Nanodegree</a> and as well I got the <a href="https://developers.google.com/training/certification/">Google Developers Certification</a>. <a href="https://medium.com/udacity/a-year-of-android-ffba9f3e40b6">That part of the story is explained in more detail here.</a></p><p>After two months I switched to full time when they hired another QA. Here&#39;s were all the challenges began!</p><p>Transitioning someone into a developer role is a lot harder than just providing them with a laptop and a git account. And here I explain some of the roadblocks I got during that time:</p><h4>Lack of expectations</h4><p>The first problem I faced was not knowing the expectations that the company had on me. My thought was that they expected me to deliver since the very first day, probably not like my experienced colleagues, but deliver by doing small tasks. This feeling caused me a lot of pressure. <strong>By not having clear goals, I was constantly thinking I wasn&#39;t good enough</strong> and that I was an impostor.</p><h4>Lack of mentorship</h4><p>There was no concept of mentorship in the company and the environment didn’t allow us to work together. We barely did pair-programming, because there was always a deadline and the company wanted us to keep delivering. Luckily <strong>my colleagues were always willing to help!</strong> They sat with me to help me whenever I got stuck or asked for help.</p><h4><strong>Lack of feedback</strong></h4><p><strong>I never got any feedback during that time.</strong> What was I doing well or bad? What could I improve? I didn&#39;t know since I didn’t have anyone whom to report.</p><h4>Lack of learning culture</h4><p>I think that in order to keep up to date we need to continue learning by reading blog posts, watching talks, attending conferences, trying new things, etc. <strong>The company didn’t offer learning hours during working time</strong>, which is unfortunately quite common as other devs told me. Without having learning time, I felt I wasn&#39;t entitled to spend even 10 minutes to read a blog post I found to be interesting and relevant for my job.</p><p>The problem was not only the lack of an explicit learning time allowance, but also that when I requested it, it got denied.</p><p>An example of that occurred when I finished my tasks for the sprint and we were already at the end of it, so I asked if I could spend the rest of the day learning Kotlin. This request got denied.</p><p>Another case was when I requested to attend an Android conference, and then <strong>I was asked to take days from my paid time off</strong>.</p><h4><strong>Impostor syndrome</strong></h4><p>The lack of expectations, the lack of feedback, and the lack of learning culture in the company <strong>made the first 9 months of my developer career even more challenging</strong>. I have the feeling that it contributed to increase my internal impostors syndrome.</p><p>One example of it was opening and reviewing pull requests. Sometimes I&#39;d ask a colleague to check my code privately, rather than opening a pull request, to avoid showing my code to everyone.</p><p>Other times, when I was reviewing, I would spend minutes staring the &quot;approve&quot; button, worried of approving something that another colleague would have considered wrong.</p><p>And when I didn&#39;t agree on something, I was never speaking loud enough worried of a backslash due to my lack of knowledge.</p><blockquote>Sometimes I’d ask a colleague to check my code privately […] to avoid showing my code to everyone.</blockquote><h3>New company, new challenges</h3><p>Later on I got a new opportunity in my hands. I was invited to the hiring process for a Junior Android Engineer position at <a href="http://babbel.com/">Babbel</a> thanks to a friend who worked with me in the past.</p><p>I met the team while volunteering in a local meet-up that was hosted at their offices. That helped me a lot when deciding to apply. I loved the company&#39;s motto: <strong>learning for all</strong>. Also everyone was very friendly and looked happy working there! But I didn&#39;t apply straight away, because<strong> why would I apply if I though that I wasn&#39;t good enough?</strong></p><p>Luckily my friend and my partner pushed me to do it. They gave me the strength I needed to send my CV. Shortly after I got into the interview process. It was fairly simple: I had to do a coding challenge in the form of a small app, and then later a technical interview with the team and team fit interview with the hiring manager.</p><h4>Hiring process</h4><p>I spent the weekend with the coding challenge and sent it right after on Monday. Soon after I got invited for an on-site interview.</p><p>The technical interview was about the coding challenge itself, we talked about good and bad things on Android, why did I implement things in a way, how could it be improved, etc. It followed a short team fit interview with the hiring manager, where we talked about challenges I faced, how I solved this problems, and so on.</p><p><strong>They offered me the job and I accepted the offer!</strong></p><p>On my first year working as Android developer, I spent 9 months in a company and the next 3 with my current employer.</p><h4>Learning environment</h4><p><strong>One big change for me is having 1:1 meetings </strong>with my Engineering Manager every two weeks. That way, it&#39;s clear for me what are our expectations.</p><p>We are getting constant feedback and ideas on what to improve and how to help and be helped. Beside the internal trainings they offer, <strong>I also have a weekly learning time allowance to learn anything I want</strong>. So far, I&#39;ve been using it to improve my Kotlin and RxJava knowledge.</p><p>We also do pair-programming almost daily. There&#39;s always paper and pens nearby my desk to sketch ideas. And I keep a second chair by my side so my colleagues can sit with me :-)</p><p>However, I still struggle with the impostor syndrome.</p><h4>Still the Impostor syndrome</h4><p>I still struggle with it. For example, when doing pair-programming, if we reach a topic I don&#39;t quite understand, even when my colleagues have the patience to explain it to me many times, there are times I just can&#39;t get it.</p><p>After the second or third time I start feeling a big pressure on my chest. How come I don&#39;t get it? Why is it so difficult for me to understand? This situation creates me anxiety.</p><p>I realized I need to <strong>accept that I might not understand a given topic but that getting the idea is the first step! </strong>Sometimes we just require more time and practice so it finally &quot;compiles in our brains&quot; :-)</p><p>For example, I used to struggle with Java interfaces vs. abstract classes, I just couldn&#39;t understand them completely, no matter how many examples I saw. But then I started using them, and even if I could not explain how they worked, I knew how and when to use them.</p><h4>Confidence</h4><p>The learning environment in my current company helps me in building confidence. Even if I&#39;ve been asking a lot of questions, there&#39;s always room for more!</p><p>Having less experience doesn&#39;t mean your opinions will be less valued. For example if a proposed solution seems too complex, I will challenge them to write it in a clearer way. Also, I provide a different set of experience and points of view, which has been helpful so far for polishing the app user experience.</p><h3>To improve</h3><p>The engineer role isn&#39;t just coding, but rather a broad range of skills. I am still at the beginning of the journey, and on my way of mastering it, I want to focus on the following ideas:</p><ul><li><strong>Communication</strong>: as English isn&#39;t my first language, sometimes I struggle to transmit an idea, which is essential for my job. I can work on that by writing, reading and talking more.</li><li><strong>Give constructive feedback</strong>: I want to give meaningful feedback to my colleagues so they can grow with me as well.</li><li><strong>Be proud of my achievements</strong>: I need to create a list to track all kind of achievements, small or big, and my overall progress, so I can look back and feel good when I struggle.</li><li><strong>Not being obsessed on what I don&#39;t know</strong>: hard to do when there&#39;s so many new things coming up, so keeping focused on the essentials, and what&#39;s required for my project in hand, is important.</li><li><strong>Share more knowledge</strong> with my colleagues! That I&#39;m a junior doesn&#39;t mean I don&#39;t have anything to share! I need to keep sharing articles and talks I find interesting. I know my colleagues appreciate that.</li><li><strong>Be patient and constantly learn</strong>: keep learning as I am doing, but being more patient with myself.</li><li><strong>Self-care</strong>: take breaks whenever needed and don&#39;t be hard with myself. Relaxing is also productive.</li></ul><p>I am very happy at my new job, and I want to keep learning, improving and sharing. I hope that my experience can help you achieve your goals.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=55e2a428dfc8" width="1" height="1" alt=""><hr><p><a href="https://proandroiddev.com/a-year-as-android-engineer-55e2a428dfc8">A year as Android Engineer</a> was originally published in <a href="https://proandroiddev.com/">ProAndroidDev</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>