<?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[Kent and Lime Engineering - Medium]]></title>
        <description><![CDATA[You will now witness the power of street knowledge - Medium]]></description>
        <link>https://medium.com/kent-and-lime-engineering?source=rss----bef3f440c473---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Kent and Lime Engineering - Medium</title>
            <link>https://medium.com/kent-and-lime-engineering?source=rss----bef3f440c473---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 12:57:21 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/kent-and-lime-engineering" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Preventing data corruption in a microservices architecture]]></title>
            <link>https://medium.com/kent-and-lime-engineering/preventing-data-corruption-in-a-microservices-architecture-c93db321ae4f?source=rss----bef3f440c473---4</link>
            <guid isPermaLink="false">https://medium.com/p/c93db321ae4f</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[microservices]]></category>
            <dc:creator><![CDATA[Mikhail Asavkin]]></dc:creator>
            <pubDate>Fri, 06 Jan 2017 06:04:00 GMT</pubDate>
            <atom:updated>2017-01-06T06:04:00.086Z</atom:updated>
            <content:encoded><![CDATA[<p>At Kent and Lime we strive for efficiency and separation of concerns, thus high modularity and micro service architecture is a natural choice for us. We have several API and job queue applications which in turn work with various 3rd party services, and of course make requests to our MongoDB instances. Recently our operations achieved such a high pace that it became quite common for several applications to modify the same object simultaneously. This object may be a document in our database, like a Kit or a product, or an entity in 3rd party service, like a shipment order or a purchase order in a stock management system. Simultaneous updates to the document may lead to inconsistent data or more serious errors preventing the update altogether.<br>We needed a solution that would guarantee that only one process can update the object at a time and during this period of object ownership by that process, other processes would wait to acquire the object. If we would use a relational database, we could employ transactions, but we would still have to do something about external APIs.</p><p>So we came up with a lightweight locking framework that allows us to lock and unlock any object we are about to update, be it a database document or an entity in 3rd party API, it also ensures that a process requesting lock would get the most actual version of the object once it is unlocked.</p><p>The framework is based on <a href="https://redis.io/topics/distlock">Redis distributed locks</a> and is very easy to use, and since we use <a href="http://mongoosejs.com/">mongoose</a> for object modeling, we also crafted a plugin that adds locking functionality to the mongoose documents.</p><pre>const kit = await Kit.findById(kitId).lock().exec();</pre><pre>// the kit is now locked and other processes<br>// that are also trying to acquire the lock<br>// on this particular kit<br>// are waiting for the lock to be released</pre><pre>kit.status = &#39;Sent&#39;;</pre><pre>await kit.save();<br>// kit is now unlocked,<br>// the next process that requires a lock on this kit<br>// will now get the latest version of the document<br>// and may update it further</pre><p>The same technique can be applied to other types of documents, including entities, obtained via 3rd party API.</p><pre>const order = await TradeGecko.getOrder(orderId).lock();<br>// TradeGecko sales order is now locked to this process<br>await TradeGecko.invoice(order);<br>await TradeGecko.pay(order);<br>await order.unlock();<br>// once we are done updating the order<br>// we can unlock it and make available<br>// for other processes requiring it</pre><p>We decided to not make locking mandatory on fetching of every document, but instead, it is at developer’s discretion whether to use locks in the particular case or not. Sometimes we just want to fetch current version of the object and show it on the frontend, in this case, we are not waiting for the lock to be released thus reducing the number of pending requests.</p><p>As an author of the plugin and locking framework I’m curious to know about your solutions to the similar problem as well as your thoughts on whether your product would benefit from our framework. We might consider publishing this module as a part of our open source initiative once it proves to be stable.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c93db321ae4f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/kent-and-lime-engineering/preventing-data-corruption-in-a-microservices-architecture-c93db321ae4f">Preventing data corruption in a microservices architecture</a> was originally published in <a href="https://medium.com/kent-and-lime-engineering">Kent and Lime Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What role does Product play?]]></title>
            <link>https://medium.com/kent-and-lime-engineering/what-role-does-product-play-ea46e3892bee?source=rss----bef3f440c473---4</link>
            <guid isPermaLink="false">https://medium.com/p/ea46e3892bee</guid>
            <category><![CDATA[product-management]]></category>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[entrepreneurship]]></category>
            <dc:creator><![CDATA[Nick Tong]]></dc:creator>
            <pubDate>Wed, 25 May 2016 00:52:47 GMT</pubDate>
            <atom:updated>2016-05-25T00:52:46.986Z</atom:updated>
            <content:encoded><![CDATA[<p>Typically most people know what role a designer or developer has, what they do on a day to day basis as well as the potential outputs they may have. What is interesting then is when people get asked what role product management plays in a company. Across different companies you’ll be hard pressed to find a unified definition of Product Management. This is probably a reflection of how flexible the role itself can be, depending on the various needs of the business, structure and even the background of the Product Manager themselves.</p><p>Product at Kent &amp; Lime sits with technology and serves as a conduit between business, customers and engineering. Our fundamental aim with Product is to:</p><blockquote>“Ship the right product, to the right customer, at the right time”</blockquote><h4>1. Shipping Quickly</h4><p>Shipping at the right time normally for us at Kent &amp; Lime is shipping quickly. This is not new in this space. Shipping quickly has numerous advantages — for example you can test things faster and fix things faster. On average we ship every 3–4 days. Shipping faster also avoids the problem more commonly seen in a waterfall methodology where constantly changing requirements are different to when the initial scoping was done to when it is implemented.</p><p>Something we’ve learnt and followed is not to be scared to slow down delivery in order to allow to speed it back up. An example of this would be when we spent a long time automating what’s known as continuous integration (CI). By working closely with the Engineering team, we discovered that a lot of time was actually being taken up by relatively manual deployments. We then decided as part of the roadmap to lessen our delivery by building out continuous integration. We’ve seen massive output in velocity after this was done, with a decrease in deployment time from 20% to effectively 0%.</p><p>There is a caveat to shipping quickly however and that’s to make sure to ship at the right time. For some cases where we ship major updates we may time our deployments or spend a little bit more time testing specific things until we launch. Shipping at the right time lies on a range between shipping fast and shipping when things are perfect. We tend towards the faster end though it is a fine balance.</p><h4>2. Ship the right product</h4><p>Shipping the right product is key. If you only ship quickly and ship the wrong product, what’s the point! Whilst this seems to be a pretty obvious point, when you get into the subtleties of planning features and functionality, the lines become blurred. What we’ve seen a lot is that when asked to rank functionality on a scale of 1–5 (1 being most important), we often see nearly all of it tending towards the 1. This isn’t exactly helpful when prioritising and so a key phrase that we use to help us prioritise ruthlessly is:</p><blockquote>“The customer comes first”</blockquote><p>Customer first as a mindset allows us to prioritise the product roadmap aggressively and only deliver things that will provide a better customer experience. Instead of focusing on things such as revenue, we prioritise for the best customer experience. The follow-on effects we have seen from this is immense. To help facilitate this, we collect and use <a href="https://engineering.kentandlime.com.au/customer-driven-development-incorporating-the-customer-voice-into-our-product-design-79bf8c762d5b">feedback</a> to inform the roadmap.</p><p>Another aspect of shipping correctly lies in when we ship and what we ship as part of it. What has worked well with us is breaking each feature down to a specific “MVP” concept, delivering it and then building the rest of the feature out. Doing so has allowed us to test various assumptions quickly and rectify where needed.</p><h4>3. Shipping to the right customer</h4><p>To ship the right product we need to know who we are shipping to in order to set ourselves in their mindset. Not all customers are made equal. We know that at Kent &amp; Lime we cater for a specific customer. We can’t cater to the entire population of men in Australia and the world nor do we want to at our stage (though we aspire to in the future). This means honing in on our customer personas and making sure when we receive feedback to inform our roadmap, we are talking to the right customer.</p><h4>Putting it together</h4><p>What then is Product Management to Kent &amp; Lime? Product Management is the ownership of the product and the product roadmap through liaising with the various facets of the business. Talking to customers to understand customer requirements, talking to business to understand constraints and possible improvements, and talking with engineering to work around complexities and future-proof the platform.</p><p>If we were to distill product management then, it would be a single key word: prioritisation. We as product managers take in all the various conflicting inputs and try to understand and prioritise what needs to be done in order to deliver a well thought out product. Not enough prioritisation and we face the feeling of slow delivery. Wrong prioritisation and we then go into ineffective delivery.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ea46e3892bee" width="1" height="1" alt=""><hr><p><a href="https://medium.com/kent-and-lime-engineering/what-role-does-product-play-ea46e3892bee">What role does Product play?</a> was originally published in <a href="https://medium.com/kent-and-lime-engineering">Kent and Lime Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Move over CSS grids, it’s flexy time]]></title>
            <link>https://medium.com/kent-and-lime-engineering/move-over-css-grids-its-flexy-time-fac91d9f205b?source=rss----bef3f440c473---4</link>
            <guid isPermaLink="false">https://medium.com/p/fac91d9f205b</guid>
            <category><![CDATA[css]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[Paul Pagnan]]></dc:creator>
            <pubDate>Sat, 07 May 2016 04:56:18 GMT</pubDate>
            <atom:updated>2016-05-07T04:56:18.451Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*g290gwlrxbbNDS8v.jpg" /></figure><p>Jump back a few years and the only real way to achieve true webpage responsiveness was to either use a pre-built CSS grid system, such as Bootstrap, or use messy CSS media queries to adjust elements based on the device size. This has some inherent limitations in that it forces developers to make their content fit within the 12 column grid container. This system works great for very simple large layouts, such as a single page designs. However, we see the limitations of this grid when creating complex pages, containing multiple smaller components (such as cards in a material design layout).</p><p><strong>Enter the Flexbox</strong></p><p>Flex-box aims to provide a system to which a container is able to affect the size, order, position and distribution of its child elements. Through a use of a number of flex properties it allows control over the width/height of items, the direction, and most importantly it allows you to control how elements fill the remaining space within a container. Items within a flexbox are able to expand or shrink to fill remaining space or prevent overflow. The flex-grow and flex-shrink properties define how the remaining space within a container is utilised. In the below example the right-most element has the flex-grow property which allows it to expand to fill the remaining space in a full width div. Notice that by default, items within a flex box container will act like inline elements.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/461/0*mZYy4K2OsvWNZITJ.png" /></figure><p>The main property available in flexbox is that of flex. By assigning the flex property to an element within a flexbox, we can control the width of items easily and responsively. Flex allows us to define the width of elements as a ratio of the total container width. In the below example, the last element (flex 2) takes up the same space as the first two (flex 1 + flex 1 = flex 2). This is very similar to the traditional CSS grid but with much greater flexibility. Any number can be used as the flex value (including decimals) allowing much finer control than a CSS grid.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/458/0*XMj27GSwvLrmbUyi.png" /></figure><p>My favourite flex-box feature by far is the ease in which alignment can be achieved. Prior to flexbox, achieving vertical alignment was a near impossible task which often left me giving up and manually setting the margin-top property of the element in frustration. Flex-box saves the day by providing an align-items property for aligning items vertically. A justify content property is also available for horizontal alignment. Using these properties on a container allows us to easily and painlessly align all child elements within a flex container both vertically and horizontally. The following example shows the various values available for the justify content property:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/365/0*wTxgqARsaW6zwBMb.png" /></figure><p>If you would like to read more, <a href="http://t.umblr.com/redirect?z=https%3A%2F%2Fcss-tricks.com%2Fsnippets%2Fcss%2Fa-guide-to-flexbox%2F&amp;t=ZGJjZDc5OTg2OTEwZTk2MTIyYmJlZWQzYzVhZjgyNzRlYTA1YWM3NyxlWGt6N3BKaQ%3D%3D">CSS Tricks</a> provides a comprehensive explanation of the various flexbox properties available, as well as providing detailed examples. I highly recommend you check it out!</p><p><strong>Here’s one I prepared earlier</strong></p><p>Now let’s take a look at flex-box in action! The below example is one of our new web components showing off its flexy goodness. You’ll notice that for desktop, the right content view will stay at a fixed width in order to maintain readability and the image on the left the shrinks to fit into the remaining space.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/394/1*adWmS4JelLKVOOFpgyWj1A.gif" /></figure><p>To achieve this, we apply the flex-basis property with a value of 330px to the content container which tells flexbox that the container should not flex below 330px which ensures the content does not get too small. Next, we assign the flex-shrink property to the image container and set the background image to cover. This tells flex-box to shrink the image container to fill the remaining space in the container while maintaining the content at a fixed width of 330px.</p><p>When the mobile breakpoint is reached, we want the card to split into one column. To achieve this, we simply add a mobile media query to our container and set the flex-wrap: wrap property on the container. This property will break the content onto multiple lines if an overflow occurs.</p><p><strong>Browser Compatibility</strong></p><p>It is important to consider your user base when adopting flexbox. Flex-box is unsupported for Internet Explorer 10 and earlier, so you should either not use it at all, or use alternate stylesheets for IE. It is also worth noting that Safari 7.0 and newer have an telnet version of the align items property known as WebkitAlignItems.</p><p><strong>Final Thoughts</strong></p><p>While flexbox is amazing for achieving responsiveness in small web components, it does not do a very good job of laying out the page as a whole. For page layout, I still believe that the traditional CSS grid system is the best option. I recommend using a CSS grid system to lay out the main By Paul Pagnancomponents on the page, then using flexbox to achieve responsiveness on the individual components. This allows the page layout to remain intact when resizing, but allows the individual components to resize to suit.</p><p>In summary, I recommend considering flexbox for your next project (as long as you don’t have too many IE users).</p><p>Happy flexing!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fac91d9f205b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/kent-and-lime-engineering/move-over-css-grids-its-flexy-time-fac91d9f205b">Move over CSS grids, it’s flexy time</a> was originally published in <a href="https://medium.com/kent-and-lime-engineering">Kent and Lime Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Customer Driven Development — incorporating the customer voice into our product design]]></title>
            <link>https://medium.com/kent-and-lime-engineering/customer-driven-development-incorporating-the-customer-voice-into-our-product-design-79bf8c762d5b?source=rss----bef3f440c473---4</link>
            <guid isPermaLink="false">https://medium.com/p/79bf8c762d5b</guid>
            <category><![CDATA[feedback]]></category>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[product-management]]></category>
            <dc:creator><![CDATA[Nick Tong]]></dc:creator>
            <pubDate>Mon, 02 May 2016 04:24:10 GMT</pubDate>
            <atom:updated>2016-05-02T04:24:10.028Z</atom:updated>
            <content:encoded><![CDATA[<p>We take customer feedback seriously at KENT &amp; LIME, and one of our key focuses in our strategy is to listen and action customer feedback. Here is our method of elegantly including the customer voice in our design.</p><p>Net Promoter Score (NPS) is an easy way of tracking customer satisfaction, which we send to the customer after each purchase. As part of the NPS feedback, we incorporate a free text asking the customer either what went wrong or what we could do better.</p><p>Whenever feedback is captured it auto-populates and creates a task in JIRA (for those not interested in using the API you can always use <a href="http://t.umblr.com/redirect?z=http%3A%2F%2Fzapier.com&amp;t=OTQwMGM4MmEwNWVhNTE2Njg4MDk1M2QyOTdlYmM4MWExYTk4ZTc2NyxkWjlwcm9Dcg%3D%3D">Zapier</a> for integrations). The severity of each one was correlated to the actual score itself (1–6 was detractor and major, 7–8 was medium, 9–10 was minor). At the end of each week we amalgamate the feedback.</p><p>We are then able to prioritise tasks based on a function of the rank and count/frequency of severity. For example, we would prioritise feedback which had 10 items and had a number of majors and mediums over another piece of feedback that had 20 items with only minors and mediums.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*xeDkqGbnVYpBdS-i.png" /></figure><p>Finally, we build stories out of each one of these and discuss feasibility before assigning story points to each one.</p><p>So, how has this simple strategy worked out for us?</p><p>When we started to collect feedback we were sitting at an NPS of <strong>16.4</strong>. Since then, we’ve incorporated a lot of the feedback using the method above and from that the NPS has been growing. As of writing this article, we are sitting at an NPS of <strong>27</strong>, a near <strong>70%</strong> increase from just a couple of months back.</p><p><em>By Nick Tong</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=79bf8c762d5b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/kent-and-lime-engineering/customer-driven-development-incorporating-the-customer-voice-into-our-product-design-79bf8c762d5b">Customer Driven Development — incorporating the customer voice into our product design</a> was originally published in <a href="https://medium.com/kent-and-lime-engineering">Kent and Lime Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>