<?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 Sky Chin on Medium]]></title>
        <description><![CDATA[Stories by Sky Chin on Medium]]></description>
        <link>https://medium.com/@just4sky?source=rss-b2e2d8f50bbb------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*aFBEpda8ULeOGdstifyr0w.jpeg</url>
            <title>Stories by Sky Chin on Medium</title>
            <link>https://medium.com/@just4sky?source=rss-b2e2d8f50bbb------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 08:15:02 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@just4sky/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[Thinking Development Workflow in System]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://just4sky.medium.com/thinking-development-workflow-in-system-b7d40d8de61?source=rss-b2e2d8f50bbb------2"><img src="https://cdn-images-1.medium.com/max/751/0*SeGZGvQTAQh2xAwR.png" width="751"></a></p><p class="medium-feed-snippet">Software development teams use ticketing systems to manage work requests, such as Jira, Asana, etc. They use source code management tools&#x2026;</p><p class="medium-feed-link"><a href="https://just4sky.medium.com/thinking-development-workflow-in-system-b7d40d8de61?source=rss-b2e2d8f50bbb------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://just4sky.medium.com/thinking-development-workflow-in-system-b7d40d8de61?source=rss-b2e2d8f50bbb------2</link>
            <guid isPermaLink="false">https://medium.com/p/b7d40d8de61</guid>
            <category><![CDATA[engineering-mangement]]></category>
            <category><![CDATA[source-code-management]]></category>
            <category><![CDATA[ticketing-system]]></category>
            <category><![CDATA[systems-thinking]]></category>
            <category><![CDATA[development-workflow]]></category>
            <dc:creator><![CDATA[Sky Chin]]></dc:creator>
            <pubDate>Wed, 01 Dec 2021 16:33:38 GMT</pubDate>
            <atom:updated>2021-12-01T16:38:17.984Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Conway’s Law]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://just4sky.medium.com/conways-law-99fbbff9ccf0?source=rss-b2e2d8f50bbb------2"><img src="https://cdn-images-1.medium.com/max/600/0*7Wfsk0hosPc1LVHe" width="600"></a></p><p class="medium-feed-snippet">Changing software architecture by changing teams.</p><p class="medium-feed-link"><a href="https://just4sky.medium.com/conways-law-99fbbff9ccf0?source=rss-b2e2d8f50bbb------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://just4sky.medium.com/conways-law-99fbbff9ccf0?source=rss-b2e2d8f50bbb------2</link>
            <guid isPermaLink="false">https://medium.com/p/99fbbff9ccf0</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[conways-law]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Sky Chin]]></dc:creator>
            <pubDate>Wed, 19 May 2021 13:04:30 GMT</pubDate>
            <atom:updated>2021-05-19T13:10:21.405Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[2020 Year In Review: Part 2]]></title>
            <link>https://medium.com/mindvalley-technology/2020-year-in-review-part-2-8e0c58c72c7a?source=rss-b2e2d8f50bbb------2</link>
            <guid isPermaLink="false">https://medium.com/p/8e0c58c72c7a</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[year-in-review]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[engineering-mangement]]></category>
            <dc:creator><![CDATA[Sky Chin]]></dc:creator>
            <pubDate>Thu, 28 Jan 2021 14:40:47 GMT</pubDate>
            <atom:updated>2021-01-29T10:30:04.233Z</atom:updated>
            <content:encoded><![CDATA[<h3>2020 Year In Review: Part 2 — Measuring Cycle Time, Regular 1-on-1, Writing RFCs</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ixU8CtjpssrHGHTowdImyA.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@kellysikkema?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Kelly Sikkema</a> on <a href="https://unsplash.com/s/photos/2020?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>In my previous <a href="https://just4sky.medium.com/2020-year-in-review-part-1-f0e0112c7bf4">post</a>, I reviewed feature flagging and using Tailwind CSS. In this post, I continue my review of engineering management.</p><h3>Measuring Cycle Time</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xXE_mwwSsk9gZ6wtTM2F9g.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@sonjalangford?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Sonja Langford</a> on <a href="https://unsplash.com/s/photos/measure-cycle-time?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>Cycle time starts from the engineers move a ticket from To-Do to In Progress, and it ends at Done.</p><p>I review the average ticket cycle time every two weeks with my team. Jira Control Chart comes as a handy tool to measure cycle time.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*jnjLreidA6kLUvnE" /></figure><p>When the average cycle time increases, it indicates our delivery speed slows down. The factors could be scope creep, too many WIP, big PR, etc.</p><p>When the average cycle time decreases, it indicates that we are doing well. We need to maintain the same practices.</p><p>We identify a couple of ways to shorten the cycle time and they make engineers’ life easier.</p><p><strong>Reduce PR size.</strong> We observed our code review pattern. Team members tend to choose to review a smaller PR over a bigger one. If the PR is huge, the reviewers prefer to block off an hour or two from their calendar to perform the review. This delays the time to review. To deal with this, we split the feature into many smaller chunks to make the review process easier.</p><p><strong>Pair code review.</strong> Sometimes, we discover new information during development and we change the implementation. In this case, the review is difficult. If this happens, the code author will set up a meeting with reviewers to walk through the code together. Reviewers will ask questions and the code author answers on the spot. This minimizes the back-and-forth conversations to clear things up.</p><p><strong>Deploy more.</strong> Before, we performed deployment only if there was a hot-fix or urgent feature. If nothing urgent, the merged code will stale for a while before going into production. Now, we deploy every day. We intend to get the task out of our heads and focus on the next feature.</p><h3>Regular 1-on-1</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2cQxxNATyDBSRzgeV6cOQg.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@productschool?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Product School</a> on <a href="https://unsplash.com/s/photos/one-on-one?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>“I work with my direct report every day. We don’t need any 1-on-1 session.”</p><p>I have a misconception in 1-on-1 before. Now, regular 1-on-1 with direct reports is mandatory to me as a manager.</p><p>I run two types of 1-on-1 with my reports, monthly regular 1-on-1, and weekly engineering 1-on-1.</p><p><strong>Monthly Regular 1-on-1.</strong> In this session, I concern about their personal and career growths. Instead of acting as a superior, I position myself as a career mentor. I often give advice based on their growth in general, not limited only to the current company.</p><blockquote><em>Speaking to team members and motivating them as a recommendation from a friend, more so than an order from superior. I personally enjoy the refreshing discussions we have.</em></blockquote><p>This is the feedback I received from my report. I am happy our 1-on-1s bringing value to her.</p><p><strong>Weekly Engineering 1-on-1.</strong> I started this session as an experiment with one member. In this session, we exchange our thoughts in writing code and making technical decisions. As a result, we kick-started a side project to build a design system.</p><h3>Writing RFCs</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TmOSaHMdBCN6V5be4HpPQg.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@beatriz_perez?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Beatriz Pérez Moya</a> on <a href="https://unsplash.com/s/photos/documents?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>RFCs stands for Request For Comments.</p><blockquote><em>For better or worse, Requests for Comments (RFCs) are how we specify many protocols on the Internet. — </em><a href="https://www.ietf.org/blog/how-read-rfc/"><em>https://www.ietf.org/blog/how-read-rfc/</em></a></blockquote><p>IETF (Internet Engineering Task Force) adopts some of the proposals published as RFCs as Internet Standards.</p><p>The OAuth 2.0 Standard is the creation of the process of RFCs.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*-F8vFppGFI2x52zW" /><figcaption><a href="https://www.rfc-editor.org/search/rfc_search_detail.php?title=Token&amp;pubstatus%5B%5D=Any&amp;pub_date_type=any">https://www.rfc-editor.org/search/rfc_search_detail.php?title=Token&amp;pubstatus[]=Any&amp;pub_date_type=any</a></figcaption></figure><p>Some large companies, such as Uber, use the RFC process to maintain their open source projects, <a href="https://github.com/uber-web/baseui">BaseUI</a>. You can read how it helps Uber to scale its engineering teams from Gergely Orosz’s <a href="https://blog.pragmaticengineer.com/scaling-engineering-teams-via-writing-things-down-rfcs/">post</a>.</p><p>Our teams adopted this process based on similar reasons, such as information silos and too many meetings. Although, we don’t have a standard process and a task force to guardrail this process yet. But, I definitely feel that this is a necessary process for growing teams.</p><p>I’ve written a few RFCs. I started to write one when:</p><ol><li>a change is affecting many systems</li><li>I have more than one approaches to solve the problem</li></ol><p><strong>Encourage collaboration between teams.</strong> When a change is affecting many systems, we write RFC and ask for feedbacks from affected teams.</p><p><strong>Crowdsource solution.</strong> In the RFC review meetings, we accept the new ideas and improve the solutions.</p><p><strong>Documented solution.</strong> Although I don’t write code often nowadays, from all the RFCs I’ve written, my team executed them well. I also indirectly influence the code.</p><p>Thank you for reading.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8e0c58c72c7a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/mindvalley-technology/2020-year-in-review-part-2-8e0c58c72c7a">2020 Year In Review: Part 2</a> was originally published in <a href="https://medium.com/mindvalley-technology">Mindvalley Technology</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[2020 Year In Review: Part 1]]></title>
            <link>https://medium.com/mindvalley-technology/2020-year-in-review-part-1-f0e0112c7bf4?source=rss-b2e2d8f50bbb------2</link>
            <guid isPermaLink="false">https://medium.com/p/f0e0112c7bf4</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[year-in-review]]></category>
            <category><![CDATA[engineering-practices]]></category>
            <dc:creator><![CDATA[Sky Chin]]></dc:creator>
            <pubDate>Thu, 07 Jan 2021 15:11:47 GMT</pubDate>
            <atom:updated>2021-03-11T16:56:41.606Z</atom:updated>
            <content:encoded><![CDATA[<h3>The 2020 Year In Review: Part 1 — Feature Flagging &amp; Using Tailwind CSS</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ixU8CtjpssrHGHTowdImyA.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@kellysikkema?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Kelly Sikkema</a> on <a href="https://unsplash.com/s/photos/2020?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>As a Tech Lead in <a href="https://mindvalley.com/">Mindvalley</a>, I had an inspiring and productive year.</p><p>2020 allowed me to add several best practices and skills into my engineering and management toolbox. In this post, I review them and hope this post inspires you.</p><p>I break them down into three categories:</p><ul><li><strong>Engineering practices</strong> — practices we use to develop software.</li><li><strong>Engineering management </strong>— manage team and communication.</li><li><strong>Product management </strong>— manage communication and expectation.</li></ul><h3>Short Introduction About Me</h3><p>I joined the Mindvalley Tech team in October 2020. In the Tech team, we have four web teams, two mobile teams, and one data team. There is a total of 60 engineers and designers.</p><p>I lead a team of six full-stack engineers, a designer, and a product manager. My team handles the customer-facing web application and supports mobile applications with API.</p><p>Let’s start with engineering practices.</p><h3>Engineering Practices</h3><p>In the year 2020, my team starts to feature flagging and using Tailwind CSS.</p><h3>Feature Flagging</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5ran_hd3E_eM0GxC1OcTYA.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@spenas88?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Gabriel</a> on <a href="https://unsplash.com/s/photos/on-off?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><blockquote><em>“Feature Toggling” is a set of patterns which can help a team to deliver new functionality to users rapidly but safely. — </em><a href="https://martinfowler.com/articles/feature-toggles.html"><em>source</em></a></blockquote><p>Feature Flagging (also known as Feature Toggling) is a powerful technique. Generally, you wrap a feature under a feature flag and turn it on to expose it to the users.</p><pre>if flag_is_on do<br>  feature()<br>end</pre><p>Feature flagging allows you to change the application’s behavior in production without deployment. This practice isn’t a silver bullet. It increases complexity but improves safety and productivity.</p><p><strong>Complexity.</strong> Feature flagging increases code complexity. At one time, we have many versions of the UI living in the production code. To manage this complexity, we review the flags and clean up the codebase.</p><p><strong>Safety.</strong> Deploy on Friday worries engineers because things usually break in the weekend. Feature flagging improves deployment safety. We are confident that Friday’s deployment has a minimal impact on the application. We can choose to keep the flag off or on. We can turn it off if something breaks.</p><p><strong>Productivity.</strong> When we are fearless, we move faster. Before feature flagging, we always had to double-check with other teams before deploying. We did this to prevent deploying any unstable functionalities. But now, we deploy every day without breaking the application.</p><p>Besides safe deployment, feature flagging opens up a lot of new possibilities.</p><h4>New Possibilities</h4><p><strong>Canary Launches.</strong> You can introduce a new feature to the users gradually.</p><p><strong>A/B testing.</strong> Running experiments with the target user group. You can keep two different versions of a feature to see which version performs better.</p><p><strong>Personalized features.</strong> We can assign users a role or level. The feature enables or disables based on role or level.</p><h4>When to use it?</h4><ul><li>Building a significant impact feature, such as the feature that impacts the revenue.</li><li>Have a fixed release date; you can make dark launch the feature ahead of schedule.</li><li>Turn things off as a kill switch. Lately, we migrated major systems to new cloud infrastructure. During the migration, we turn off the flag to stop communicating to the migrating system.</li></ul><h4>When not to use it?</h4><ul><li>Fixing a bug</li><li>During refactoring, unless refactoring for performance.</li><li>Working on a minor impact feature. You don’t want to manage too many flags and reduce the works to deprecate the flags later.</li></ul><h3>Using Tailwind CSS</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*igbedXeZjJ3k2bbHIQA20g.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@servuspaul?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Paul Felberbauer</a> on <a href="https://unsplash.com/s/photos/swiss-army-knive?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>Using Tailwind CSS to style application UI offers more than technical benefits.</p><pre>&lt;!-- <br>Normal CSS <br>--&gt;<br>&lt;div class=&quot;events-page&quot;&gt;<br>  &lt;div class=&quot;limited-width-content&quot;&gt;<br>    &lt;div class=&quot;header&quot;&gt;<br>      &lt;h3 class=&quot;font-bold title&quot;&gt;<br>        Events<br>      &lt;/h3&gt;<br>    &lt;/div&gt;</pre><pre>    &lt;!-- Content --&gt;<br>  &lt;/div&gt;<br>&lt;/div&gt;</pre><pre>&lt;!-- <br>Tailwind CSS<br>--&gt;<br>&lt;div class=&quot;container mx-auto&quot;&gt;<br>  &lt;div class=&quot;mt-6 text-warm-gray-600 xs_mt-9 md_mt-12&quot;&gt;<br>    &lt;h3 class=&quot;font-bold leading-10 text-warm-gray-650 text-3xl-1 xs_text-4xl-2 xs_tracking-normal md_text-5xl-2 md_tracking-tight&quot;&gt;<br>      Events<br>    &lt;/h3&gt;<br>  &lt;/div&gt;</pre><pre>  &lt;!-- Content --&gt;<br>&lt;/div&gt;</pre><p>From the code snippet above, you can see the difference between regular CSS and Tailwind CSS. Using Tailwind CSS, the style is more comfortable to learn from the template file. Using it also reduces the engineer’s cognitive load, maintains consistency, and works well with the feature flag.</p><h4>Reduces cognitive load</h4><p>You don’t need to remember the properties of custom CSS classes. By looking at the template file, you know the implemented styles.</p><h4>Maintains consistency</h4><p>Sometimes you have the same element style using across pages. You can avoid duplicating class names in many places.</p><h4>Works well with the feature flag</h4><p>Let’s say you update the UI of the Events page. You add some top margin and set the background color to light gray, and a feature flag guards the changes. You can see the different implementations below.</p><pre>&lt;!-- <br>Normal CSS <br>--&gt;<br>&lt;!-- if flag is on --&gt;<br>&lt;div class=&quot;events-page-v2&quot;&gt;&lt;/div&gt;<br>&lt;!-- if flag is off --&gt;<br>&lt;div class=&quot;events-page&quot;&gt;&lt;/div&gt;</pre><pre>&lt;!-- <br>Tailwind CSS<br>--&gt;<br>&lt;!-- if flag is on --&gt;<br>&lt;div class=&quot;container mx-auto mt-6 bg-gray-50&quot;&gt;&lt;/div&gt;<br>&lt;!-- if flag is off --&gt;<br>&lt;div class=&quot;container mx-auto&quot;&gt;&lt;/div&gt;</pre><p>You can avoid creating more redundant CSS codes, and it makes the maintenance easier.</p><h3>To Be Continued</h3><p>I’ll review engineering management practices in the next post.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f0e0112c7bf4" width="1" height="1" alt=""><hr><p><a href="https://medium.com/mindvalley-technology/2020-year-in-review-part-1-f0e0112c7bf4">2020 Year In Review: Part 1</a> was originally published in <a href="https://medium.com/mindvalley-technology">Mindvalley Technology</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Getting started to lead an engineering teams]]></title>
            <link>https://just4sky.medium.com/getting-started-to-lead-an-engineering-teams-ff2c22853baa?source=rss-b2e2d8f50bbb------2</link>
            <guid isPermaLink="false">https://medium.com/p/ff2c22853baa</guid>
            <category><![CDATA[engineering-mangement]]></category>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[agile]]></category>
            <category><![CDATA[manager]]></category>
            <category><![CDATA[management]]></category>
            <dc:creator><![CDATA[Sky Chin]]></dc:creator>
            <pubDate>Sun, 27 Oct 2019 10:15:26 GMT</pubDate>
            <atom:updated>2019-10-27T10:15:26.102Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NiQBQdOFDnvqUwoRtyIu7Q.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@austindistel?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Austin Distel</a> on <a href="https://unsplash.com/s/photos/software-development?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>At the year 2018, I’d become a VP of Engineering in a small startup from a software engineer.</p><p>I’m writing this article to you <strong>who just started to lead an engineering team</strong> and you <strong>have no clue what to do and where to start</strong>. At the same time, I’m writing to myself.</p><p>As I was managing a 12-person engineering team, the advice in this article might not apply to the bigger team.</p><h3>Clear communication</h3><p>First and foremost, you are working with people, communication plays the most essential part.</p><p>To form a clear communication channel, you shall start documenting the conversation. When I say about documentation, it’s not recording every single word, instead, capturing the important information and actionable items.</p><p>At this stage, don’t worry about the format. Keep all the documents in one place and keep them updated. You’ll figure out the format in the future.</p><p>These are two good documents for a starter, <a href="https://www.atlassian.com/agile/product-management/requirements">product requirements document</a> and meeting note.</p><p>Although it requires some portion of your time to write the document but the time you’ve spent is worthy.</p><p>Why <a href="https://www.atlassian.com/agile/product-management/requirements">product requirements document</a>?</p><p>When the requirements are written down, it sets a clear expectation between stakeholders and engineers. It saves a ton of meeting to clarify the expected outcome.</p><p>Additionally, you can invite other teams or departments to contribute to the document. In this way, everyone will be on the same page.</p><p>Why meeting note?</p><p>The main purpose is reviewing the decisions that have been made and what has been done. Without it, you might let a certain amount of great ideas go into lost memory.</p><h3>Effective and efficient workflow</h3><p>Second, establish an effective and efficient workflow. Why bother mentioning effective and efficient here? I want to highlight that effective means <strong>it makes sense to the business or user</strong> and efficient means you can <strong>do it as least effort as possible</strong>.</p><p>Hereby, I recommend <a href="https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow">Gitflow</a> which gives you a sense of the stage of the development and the control of the releases. Only the tested and verified pull requests will merge to the master branch and deploy it to the production.</p><p>Then, set up on-call rotation or dedicated role to provide technical support to the operation if necessary.</p><h3>Mission statement</h3><p>Third, mission statement. In the early stage, this is good to have. What’s the mission statement and why? The mission statement is one or two sentences summarise your team’s purposes and values.</p><p>Why this team exists? What does this team want to achieve? What values does this team hold?</p><p>Alright, why do you need this? A clear and strong mission statement gives your team a sense of belonging and responsibility. It tells everyone in the team how you treat each other, how you react to the problems and how you make decisions.</p><h3>Fail fast. Fail again. Fail better.</h3><p>Last, keep this in mind.</p><blockquote>Try again. Fail again. Fail better. – Samuel Beckett</blockquote><p>You won’t get everything right immediately. Keep improving. Furthermore, nowadays most of the information is right on your palm. Everything is happening lightning fast. “Try again” is not enough.</p><blockquote>Fail fast. Fail again. Fail better. – Sky Chin</blockquote><p>Whether you are running scrum or free flow with your team, I strongly suggest having a retrospective meeting. In this meeting, the simplest format is asking these few questions.</p><ul><li>What was going well last sprint/week?</li><li>What was going wrong during the last sprint/weeks?</li><li>What can be improved next sprint/week?</li></ul><p>The retrospective meeting allows you and your team to allocate time to reflect on what’s working and what’s not. Continuous improvement is the air for growth.</p><h3>Thank you for reading</h3><p>If something works for you and your team but not appear in this article, please share it to me in the comment section below. I’m happy to learn from you.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ff2c22853baa" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Flutter is so easy, but managing plugin is hard]]></title>
            <link>https://just4sky.medium.com/flutter-is-so-easy-but-managing-plugin-is-hard-3337262bed3d?source=rss-b2e2d8f50bbb------2</link>
            <guid isPermaLink="false">https://medium.com/p/3337262bed3d</guid>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[dart]]></category>
            <category><![CDATA[flutter]]></category>
            <dc:creator><![CDATA[Sky Chin]]></dc:creator>
            <pubDate>Tue, 30 Apr 2019 14:30:23 GMT</pubDate>
            <atom:updated>2019-04-30T14:30:23.451Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3PX9TTH1FO1rPU77kWeDGQ.png" /></figure><p>Flutter is so easy to learn.</p><p>Flutter is the new mobile UI framework by Google for creating high-quality native experiences on iOS and Android. Yes, it’s cross-platform.</p><p>You can learn more about Flutter from <a href="https://medium.com/flutter-community/in-plain-english-so-what-the-heck-is-flutter-and-why-is-it-a-big-deal-7a6dc926b34a">here</a>.</p><p>There is a significant difference between Flutter and React Native, which is you are writing UI code in an object-oriented way. IMO, Flutter is easy for native mobile developer or Backend developer. React Native is easy for a Frontend developer.</p><p>Writing a Hello World app is as simple as writing a <em>Class</em>.</p><pre>class MyApp extends StatelessWidget {<br>    @override<br>    Widget build(BuildContext context) {<br>        return MaterialApp(<br>            title: &#39;Welcome to Flutter&#39;,<br>            theme: ThemeData(<br>                primaryColor: Colors.white,<br>                ),<br>            home: Scaffold(<br>                appBar: AppBar(<br>                    title: Text(&#39;Hello World App&#39;),<br>                    ),<br>                body: HelloWorld()<br>                )<br>            );<br>    }<br>}</pre><pre>class HelloWorld extends StatelessWidget {<br>  @override<br>  Widget build(BuildContext context) {<br>    return Center(<br>      child: Text(&#39;Hello World&#39;)<br>    );<br>  }<br>}</pre><p>In Flutter, everything is a widget, which is similar to the component in React Native.</p><p><em>HelloWorld</em> class is a `StatelessWidget` that builds a `Text` widget on the centre of the screen.</p><p><em>MyApp</em> class renders <em>HelloWorld</em> widget on the body with Material theme.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/296/1*T0IkXNvQETuDRz04psxVmw.png" /></figure><p>How about making a <em>ListView</em>?</p><pre>class HelloWorldList extends StatelessWidget {<br>  @override<br>  Widget build(BuildContext context) {<br>    return ListView.builder(<br>      itemBuilder: (BuildContext _context, int i) {<br>        return ListTile(<br>          title: Text(&#39;Hello World &#39; + i.toString()),<br>          trailing: Icon(Icons.android),<br>        );<br>      }<br>    );<br>  }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/296/1*OuE4iae3oluZyjN3-k6qzg.png" /></figure><p>Simple, huh?</p><p>Flutter saves you tons of time from figuring out the right padding size and making sure the android icon sticks on the right of the list item.</p><p>So, Flutter is the best? It’s too soon to say that.</p><p>I spent 6 hours making a simple countdown app that can speak. Among the 6 hours, I spent 2 on learning the Flutter and writing the code. The other 4 were spending on updating XCode and solving the plugin compatibility issue.</p><p>First of all, I don’t think updating Xcode is a major issue. Unless you are the person like me who seldom write an iOS app and have a MacBook with 128GB HDD only (always running out of space).</p><p>The second problem is the plugin compatibility. I was installing this plugin, <a href="https://pub.dartlang.org/packages/flutter_tts">flutter_tts</a> to implement the text to speech feature. I faced an error during the installation.</p><blockquote>Unable to determine Swift version for the following pods</blockquote><p>I’m not alone having the same problem.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TEjiYeWZD24Lr08Bb36-rA.png" /></figure><p>The problem is solved by adding a few lines in the Podfile. I hope this solution helps you too.</p><pre>target &#39;Runner&#39; do<br>  <strong>use_frameworks! # &lt;--- add this</strong><br>  system(&#39;rm -rf .symlinks&#39;)<br>  system(&#39;mkdir -p .symlinks/plugins&#39;)</pre><pre>  ...<br>end</pre><pre>post_install do |installer|<br>  installer.pods_project.targets.each do |target|<br>    target.build_configurations.each do |config|<br>      config.build_settings[&#39;ENABLE_BITCODE&#39;] = &#39;NO&#39;<br>      <strong>config.build_settings[&#39;SWIFT_VERSION&#39;] = &#39;5.0&#39; # &lt;--- specify SWIFT_VERSION<br>      if target.name == &#39;flutter_tts&#39; # &lt;--- specify SWIFT_VERSION for plugin<br>        config.build_settings[&#39;SWIFT_VERSION&#39;] = &#39;4.0&#39;<br>      end</strong><br>    end<br>  end<br>end</pre><p>If you are a plugin user, choosing and managing plugin is hard, especially when you are excited to upgrade your app to the newest version of Swift or Android.</p><p>If you are a plugin developer, maintaining plugin compatibility is hard, especially it is supporting Android and Swift at the same time, the effort is double. Sincerely appreciate for the plugin developers who diligently producing updates.</p><p>But, that shouldn’t stop us from creating great things. Let’s create a great ecosystem around Flutter.</p><p>This post is originally posted at my blog, <a href="http://www.skychin.me./">www.skychin.me.</a> Check it out <a href="http://www.skychin.me/posts/2019-04-27/flutter-is-so-easy-but-managing-plugin-is-hard/">here</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3337262bed3d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Mocking is not making fun of the class or object]]></title>
            <link>https://just4sky.medium.com/mocking-is-not-making-fun-of-the-class-or-object-cd5021ec7997?source=rss-b2e2d8f50bbb------2</link>
            <guid isPermaLink="false">https://medium.com/p/cd5021ec7997</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[php]]></category>
            <category><![CDATA[unit-testing]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[coding]]></category>
            <dc:creator><![CDATA[Sky Chin]]></dc:creator>
            <pubDate>Tue, 05 Mar 2019 00:01:00 GMT</pubDate>
            <atom:updated>2019-03-05T00:01:00.919Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pmIbzE_TE6w5_0wsZQI76Q.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/photos/i1fuCC7f49I?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Wim van ‘t Einde</a> on <a href="https://unsplash.com/search/photos/mocking-jay?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>Back to development.</p><iframe src="https://www.instagram.com/p/Bud-N_knHEV/embed" width="658" height="756" frameborder="0" scrolling="no"><a href="https://medium.com/media/e4366b2956bdb9cef2e5da7bdb945777/href">https://medium.com/media/e4366b2956bdb9cef2e5da7bdb945777/href</a></iframe><p>Lately, I was busy with management tasks. This week, I have the chance to contribute to our latest API project.</p><p>This is a very productive week. I managed to setup monorepo, practised TDD by writing unit testing and end-to-end testing, and learned to use mocking strategy in the testing.</p><p>Monorepo and Manyrepos are a very interesting topic. I figured them out while diving deep into how Taylor Otwell structured the Laravel’s code.</p><p>I’m writing about it, but I need some time because it is a big topic. Source code repository strategy is a very important decision to an engineering team. I’ll spend some time to explain it better.</p><p>Therefore, I want to share with you another thing I’ve learned in this week. Mocking in the unit test is a very useful strategy.</p><h3>Mocking</h3><p>Mocking is simulating the behaviour of a class or an object. You can define the expected value from a class.</p><p>If you have a Post model, which has a getContent method that returns the post content. The post content is a string containing HTML script like &lt;p&gt;, &lt;div&gt;, etc.</p><p>In the unit testing, you can mock a Post model and returns different post content to simulate different use cases. For example, you can mock the model to returns malicious script from getContent method and see how it breaks the application.</p><h3>Simple example</h3><pre>$mock = \Mockery::mock(Post::class);</pre><pre>$mock-&gt;shouldReceive(&#39;getContent&#39;)-&gt;andReturn(&#39;&lt;img src=&quot;http://url.to.file.which/not.exist&quot; onerror=alert(document.cookie);&gt;&#39;);</pre><pre>$mock-&gt;getContent();<br>// returns &#39;&lt;img src=&quot;http://url.to.file.which/not.exist&quot; onerror=alert(document.cookie);&gt;&#39;</pre><p>I know this can be done by inserting a row in the database.</p><p>Remember these two points.</p><ul><li>First, unit testings should be isolated and not involving the database. If you want to test with the database, you can write integration testing.</li><li>Second, for a complex case like a series of actions/operations are needed to reproduce the steps, you can mock the object to behave as expected without going through all the steps.</li></ul><p>In my case, I was creating a new API endpoint for Subscription services. This endpoint is returning a list of available subscription plans for a shop.</p><p>To list down the available subscription plans, there were few considerations.</p><ol><li>Is the current shop has an active subscription?</li><li>Is the current shop eligible for upgrading to higher value plans?</li><li>Is the current shop eligible to extend the subscribed plan?</li></ol><p>To test all the above, I need multiple shops with different subscription plans.</p><p>Let’s say I have three types of subscription plan, they are Trial, Limited, and Beginner.</p><h3>Installation</h3><p>The mock library I am using is <a href="http://docs.mockery.io/en/latest/index.html">Mockery</a>.</p><pre>composer require mockery/mockery --dev</pre><h3>Mock a class or object</h3><p>In this example, I mock a Shop model and getActivePlans method is defined to return an empty Collection.</p><pre>// This method mocks a Shop model which can be reused to simulate<br>// different subscriptions.<br>private function mockShop()<br>{<br>    $mock = \Mockery::mock(Shop::class);<br>    return $mock;<br>}</pre><pre>// This method mocks a Shop that subscribed to Limited plan. <br>// No active plan means it is Limited.<br>private function mockShopWithLimitedPlan($countryCode = &#39;MY&#39;)<br>{<br>    $shop = $this-&gt;mockShop();<br>    $shop-&gt;shouldReceive(&#39;getActivePlans&#39;)<br>        -&gt;andReturn(collect([]));<br>    return $shop;<br>}</pre><h3>Mock a collection</h3><p>In this example, I mock a Shop model and getActivePlans method is defined to return a Collection that contains an active SubscriptionPlan.</p><pre>// This method mocks a Shop that subscribed to Beginner plan<br>private function mockShopWithBeginnerPlan($countryCode = &#39;MY&#39;)<br>{<br>    $shop = $this-&gt;mockShop();</pre><pre>    // Mock a SubscriptionPlan which has a property named plan_code<br>    $beginnerPlan = \Mockery::mock(SubscriptionPlan::class);<br>    $beginnerPlan-&gt;shouldReceive(&#39;getAttribute&#39;)<br>        -&gt;with(&#39;plan_code&#39;)<br>        -&gt;andReturn(&#39;beginner_plan&#39;);</pre><pre>    // Create a collection<br>    $collection = new Collection();<br>    $collection-&gt;push($beginnerPlan);</pre><pre>    $shop-&gt;shouldReceive(&#39;getActivePlans&#39;)<br>        -&gt;andReturn($collection);</pre><pre>    return $shop;<br>}</pre><p>Otherwise, you can use the shorthand.</p><pre>$shop-&gt;shouldReceive(&#39;getActivePlans&#39;)<br>        -&gt;andReturn(collect([$beginnerPlan]));</pre><p>Have fun mocking!</p><p>This post is also posted on my blog. You can read it at <a href="http://www.skychin.me/posts/2019-03-05/mocking-is-not-making-fun-of-the-class-or-object/">http://www.skychin.me/posts/2019-03-05/mocking-is-not-making-fun-of-the-class-or-object/</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cd5021ec7997" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Developers, what would you be if you are in an RPG game?]]></title>
            <link>https://just4sky.medium.com/developers-what-would-you-be-if-you-are-in-an-rpg-game-b547be1a79ac?source=rss-b2e2d8f50bbb------2</link>
            <guid isPermaLink="false">https://medium.com/p/b547be1a79ac</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[php]]></category>
            <category><![CDATA[careers]]></category>
            <dc:creator><![CDATA[Sky Chin]]></dc:creator>
            <pubDate>Sat, 06 Oct 2018 00:01:02 GMT</pubDate>
            <atom:updated>2018-10-06T00:01:02.441Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TXvXp7EaDUWQdzGEmu3AqQ.jpeg" /></figure><p>In a few years back, your parents want you to find a full-time position in a good company, your friends tell you freelancing can receive a good pay.</p><p>People talk about full-time position gives you job security, freelancing gives you freedom.</p><p>In my opinion, they both have their own challenges and downsides. No clear winner.</p><p>In the recent years, remote position is growing rapidly and becoming trendy. Working remotely gives you the job security and the freedom at the same time.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*93TDi4OzdLKfp-oRq9nfww.png" /><figcaption>The interest of people in the remote job is increasing</figcaption></figure><p>Well, I know this statistics is dull and boring.</p><p>However, I find it interesting when I realise that choosing between full-time, freelance, and remote positions are like choosing job classes in the RPG game.</p><p>Do you play RPG game, don’t you?</p><h3>Job classes in real life vs job classes in RPG game</h3><p>The full-time developer is a crusader.</p><p>Crusaders are the protectors of the kingdom. Their missions are to protect the king (CEO or boss), the kingdom (company), and the people (customers) from the threat.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*lWh02B2vzc9itNtUiK8tig.png" /><figcaption>Source: <a href="http://ragnarok.wikia.com/wiki/Crusader?file=Character_Crusader.jpg">http://ragnarok.wikia.com/wiki/Crusader?file=Character_Crusader.jpg</a></figcaption></figure><p>The freelance developer is a bounty hunter.</p><p>Bounty hunters are the survivors. Their missions are to survive as long as they can (more projects) and collect as much reward as possible (higher pays) by themselves.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*el6GtRXDK-8UJYk9f_3iIg.png" /><figcaption>Source: <a href="http://ragnarok.wikia.com/wiki/Hunter?file=Character_Hunter.jpg">http://ragnarok.wikia.com/wiki/Hunter?file=Character_Hunter.jpg</a></figcaption></figure><p>The remote developer is a wizard.</p><p>Wizards are the adventurers. They share the same missions as crusaders, the only difference is they do it without being seen.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*Of_nfAlI-u_fk7kVX2l94w.png" /><figcaption>Source: <a href="http://ragnarok.wikia.com/wiki/Wizard?file=Character_Wizard.jpg">http://ragnarok.wikia.com/wiki/Wizard?file=Character_Wizard.jpg</a></figcaption></figure><h3>The decision making</h3><p>In a different job class, the decision making is different.</p><p>Let’s say they have a mission which writing a new feature.</p><p>Crusaders and wizards will focus on the long run. They don’t protect the kingdom for one or two months only.</p><p>Full time and remote developers will consider:</p><ul><li>How can I make this feature scalable, so that we can add new capabilities easily next time?</li><li>How can I make this code more readable, so that other team members can understand?</li></ul><p>Bounty hunters will focus on the speed and the accuracy.</p><p>Freelance developers will consider:</p><ul><li>How can I complete the project on time or earlier?</li><li>How can I fulfil the requirements?</li></ul><h3>The growth</h3><p>When you become a full-time (crusader) developer, you can grow into a very skilful and collaborative developer.</p><p>You have the opportunity to learn from your peers or seniors and your career path is clear. In this position, your growth is easier and quicker than the freelancer.</p><p>When you become a freelance (bounty hunter) developer, you can grow into a very independent and well-rounded developer.</p><p>You have the advantage to learn from pitching a project, negotiating the deal, to delivering the project.</p><p>IMHO, you are more competent in this position comparing to full-timer. The reason is most of the full-timers are too dependent on the guidance from the peers. You need to learn to solve the problem on your own.</p><p>When you become a remote developer (wizard), you can be more independent (as a freelance developer), and more collaborative (you have a team), and your career path is clearer.</p><p>The tradeoff is you are far away from your peers. The communication is the greatest challenge.</p><h3>Who are you?</h3><p>Are you a crusader, bounty hunter, or wizard? Perhaps, you are a crusader at daytime and a bounty hunter at night?</p><p>This article is originally posted at <a href="https://tribehired.com/story/developers-what-would-you-be-if-you-are-in-a-rpg-game/the-future-commerce-sdn-bhd-avana">TribeHired</a>. If looking for a freelance job in Malaysia - visit <a href="https://tribehired.com/story/4-major-ways-tribehired-is-fixing-issues-with-hiring-freelance-devs-in-m%E2%80%99sia-15356106086230/tribehired">tribehired.com</a></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fupscri.be%2F1f0bc3%3Fas_embed%3Dtrue&amp;dntp=1&amp;url=https%3A%2F%2Fupscri.be%2F1f0bc3%2F&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=upscri" width="800" height="400" frameborder="0" scrolling="no"><a href="https://medium.com/media/6787673efa1ea11b300ece35d4f4313c/href">https://medium.com/media/6787673efa1ea11b300ece35d4f4313c/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b547be1a79ac" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[3 simple ways to use Collection’s map method]]></title>
            <link>https://just4sky.medium.com/3-simple-ways-to-use-collections-map-method-7a55f9ee44f3?source=rss-b2e2d8f50bbb------2</link>
            <guid isPermaLink="false">https://medium.com/p/7a55f9ee44f3</guid>
            <category><![CDATA[php]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[laravel]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[Sky Chin]]></dc:creator>
            <pubDate>Fri, 28 Sep 2018 00:01:02 GMT</pubDate>
            <atom:updated>2018-09-28T00:01:02.058Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2kVG4qDSmvBM4lFlJKMChg.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/photos/kBLURuMTENI?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Victoria Kure-Wu</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><h3>Laravel’s Collection has many powerful methods that can help you to do the complex tasks.</h3><p>Map method applies a callback function to each of the items in the collection. In the callback function, you can modify the item before returning it.</p><p>Here are three simple ways you can use the map method.</p><p>Given you have a collection of fruits.</p><pre>$fruits = collect([&#39;apple&#39;, &#39;orange&#39;, &#39;watermelon&#39;]);</pre><p>You can transform the value in the collection.</p><p>You turn the fruits into big size.</p><pre>$bigFruits = $fruits-&gt;map(function($fruit) {<br>    return strtoupper($fruit);<br>});</pre><pre>// [&#39;APPLE&#39;, &#39;ORANGE&#39;, &#39;WATERMELON&#39;]</pre><p>Besides, you can perform checking in the callback function.</p><p>You don’t like to eat the orange, so you replace it with the grape.</p><pre>$noOrange = $bigFruits-&gt;map(function($fruit) {<br>    if ($fruit === &#39;ORANGE&#39;) {<br>        return &#39;GRAPE&#39;;<br>    }</pre><pre>    return $fruit;<br>});</pre><pre>// [&#39;APPLE&#39;, &#39;GRAPE&#39;, &#39;WATERMELON&#39;]</pre><p>Otherwise, you can modify the item. For example, modify the string collection into associative array collection.</p><p>You put the fruits into the basket in order.</p><pre>$fruitBasket = $noOrange-&gt;map(function($fruit, $index) {<br>    return [<br>        &#39;name&#39; =&gt; $fruit,<br>        &#39;seq&#39; =&gt; $index + 1<br>    ];<br>});</pre><pre>// [[&#39;name&#39;: &#39;APPLE&#39;, &#39;seq&#39; =&gt; 1], [&#39;name&#39;: &#39;GRAPE&#39;, &#39;seq&#39; =&gt; 2], [&#39;name&#39;: &#39;WATERMELON&#39;, &#39;seq&#39; =&gt; 3]]</pre><p>This article was originally posted at <a href="https://tribehired.com/story/as-a-laravel-developer-in-malaysia-do-you-use-collection-in-your-daily-job/the-future-commerce-sdn-bhd-avana">TribeHired</a>.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fupscri.be%2F1f0bc3%3Fas_embed%3Dtrue&amp;dntp=1&amp;url=https%3A%2F%2Fupscri.be%2F1f0bc3%2F&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=upscri" width="800" height="400" frameborder="0" scrolling="no"><a href="https://medium.com/media/6787673efa1ea11b300ece35d4f4313c/href">https://medium.com/media/6787673efa1ea11b300ece35d4f4313c/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7a55f9ee44f3" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Delivering A Mobile Backend API In Short Time For Laravel Developers]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://just4sky.medium.com/delivering-a-mobile-backend-api-in-short-time-for-laravel-developers-38ef4747e2e6?source=rss-b2e2d8f50bbb------2"><img src="https://cdn-images-1.medium.com/max/2600/1*A4yjt_j5kJBKEIys0JSMuw.jpeg" width="5370"></a></p><p class="medium-feed-snippet">Recently I was working on a mobile app project with my friend, Steven where the user can receive location updates from friends and family&#x2026;</p><p class="medium-feed-link"><a href="https://just4sky.medium.com/delivering-a-mobile-backend-api-in-short-time-for-laravel-developers-38ef4747e2e6?source=rss-b2e2d8f50bbb------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://just4sky.medium.com/delivering-a-mobile-backend-api-in-short-time-for-laravel-developers-38ef4747e2e6?source=rss-b2e2d8f50bbb------2</link>
            <guid isPermaLink="false">https://medium.com/p/38ef4747e2e6</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[laravel]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[Sky Chin]]></dc:creator>
            <pubDate>Thu, 20 Sep 2018 12:48:26 GMT</pubDate>
            <atom:updated>2018-09-20T12:48:26.127Z</atom:updated>
        </item>
    </channel>
</rss>