<?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 Carl0zen on Medium]]></title>
        <description><![CDATA[Stories by Carl0zen on Medium]]></description>
        <link>https://medium.com/@perezpriego7?source=rss-f0f96cfa4507------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*jkFpT6sl4oRdOB7DfQ46TQ.png</url>
            <title>Stories by Carl0zen on Medium</title>
            <link>https://medium.com/@perezpriego7?source=rss-f0f96cfa4507------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 31 May 2026 20:34:45 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@perezpriego7/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[CSS Evolution: From CSS, SASS, BEM, CSS Modules to Styled Components]]></title>
            <link>https://medium.com/@perezpriego7/css-evolution-from-css-sass-bem-css-modules-to-styled-components-d4c1da3a659b?source=rss-f0f96cfa4507------2</link>
            <guid isPermaLink="false">https://medium.com/p/d4c1da3a659b</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[ux]]></category>
            <category><![CDATA[tech]]></category>
            <category><![CDATA[design]]></category>
            <dc:creator><![CDATA[Carl0zen]]></dc:creator>
            <pubDate>Tue, 03 Jan 2017 16:21:27 GMT</pubDate>
            <atom:updated>2018-01-12T14:13:31.685Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yBxZo9LNEjRaL7eKUBqRSA.png" /></figure><p>Since the beginnings of the Internet we’ve always had the need to style our websites, CSS has been around forever and has evolved at its own pace over the years, this article will take you through it.</p><p>To begin with we need to be on the same page of what CSS is, I think we can all agree that css is used for describing the <a href="https://en.wikipedia.org/wiki/Presentation_semantics">presentation</a> of a document written in a <a href="https://en.wikipedia.org/wiki/Markup_language">markup language</a>.</p><p>It’s no news that CSS has evolved along the way and has become more powerful nowadays, but it’s widely known that additional tooling needs to be used in order to make css somehow work for teams.</p><h3>CSS in the wild-west</h3><p>In the 90’s we use to focus on creating “fancy” interfaces, the wow factor was the most important thing, inline styles were the thing back then, we just didn’t care if things looked different, in the end Webpages were like cute toys we could threw some gifs, marquees and other horrible (at the time impressive) elements over and expect to catch your visitors’ attention.</p><h3>Ivan Todorov on Twitter</h3><p>Microsoft&#39;s fist website, back in 1994. :) Looking pretty cool #microsoft</p><p>After that, we started creating dynamic sites, but css remained a consistent mess, every developer had his/her way of doing css. Some of us struggled with <strong>specificity</strong>, causing visual regressions when introducing new code, we relied on using <strong>!important </strong>to set in stone our strong will to make a UI element look in a certain way. But we soon realized that:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/439/1*vePubKIIK_96qGEgKo5G4Q.jpeg" /></figure><p>All those practices became more evident and bigger problems as soon as projects grew in size, complexity, and team members. So not having a <strong>consistent pattern</strong> to do styling became one of the biggest <em>blockers</em> for experienced and inexperienced developers who struggled to find a right way to do things in CSS. In the end there was no right or wrong thing to do, we just cared to make the thing look ok.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/512/1*3IDlXD210gSmF5jYko1RtQ.gif" /></figure><h3><strong>SASS to the rescue</strong></h3><p>SASS transformed CSS into a decent programming language in the form of a preprocessing engine that implemented <strong>nesting, variables, mixins, extends </strong>and<strong> logic </strong>into stylesheets, so you could better organize your css files and have at least some ways of deconstructing your css chunks in smaller files, which was a great thing back then.</p><p>It essentially takes scss code, preprocesses it and outputs the compiled versions of the file in a global css bundle. Great right? but not so much I’d say, After a while it became apparent that unless there were strategies and best practices in place, SASS only caused more troubles than it alleviated.</p><p>Suddenly we became unaware of what the preprocessor was doing under the hood and relied on lazily nesting to conquer the specificity battle but causing compiled stylesheets to go nuts in sizes.</p><p>Until BEM came along….</p><h3>BEM and component based thinking</h3><p>When BEM came along it was a breath of fresh air that made us think more about reusability and components. It basically brought semanticity to a new level, it let us make sure that className is unique thus reducing the risk of specificity clash by using a simple Block Element Modifier convention. Look at the following example:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/9ad77b5d7dbe098c4bdff8004418d2c6/href">https://medium.com/media/9ad77b5d7dbe098c4bdff8004418d2c6/href</a></iframe><p>If you analyze a bit the markup you can see immediately the Block Element Modifier convention in play here.</p><p>You can see that we have two very explicit blocks in the code: .scenery and .sky, each one of them have their own blocks. Sky is the only one that has modifiers as it could be foggy, daytime or dusk, those are different characteristics that could be applied to the same element.</p><p>Let’s take a look at the companion css with some pseudo code that will let us analyze it better:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2ba5bf8d50c6ffbcaa401db93638e556/href">https://medium.com/media/2ba5bf8d50c6ffbcaa401db93638e556/href</a></iframe><p>If you want to have an in-depth understanding of how BEM works, I recommend you <a href="https://m.alphasights.com/bem-i-finally-understand-b0c74815d5b0#.9vdcmiugz">take a look at this article </a>, written by my colleague and friend Andrei Popa.</p><p>BEM is good in the sense that you made sure that components were unique #reusabilityFtw. With this kind of thinking some apparent patterns became more evident as we started migrating our old stylesheets into this new convention.</p><p>But, another set of problems came along:</p><ul><li>Classname selection became a tedious task</li><li>Markup became bloated with all those long class names</li><li>You needed to explicitly extend every ui component whenever you wanted to reuse</li><li>Markup became unnecessarily semantic</li></ul><h3>CSS Modules and local scope</h3><p>Some of the problems that neither SASS or BEM fixed was that in the language logic there is no concept of true encapsulation, thus relying on the developer to choose unique class names. A process that felt could be solved by tools rather by conventions.</p><p>And this is exactly what CSS modules did, it relied on creating a dynamic class names for each locally defined style, making sure no visual regressions are caused by injecting new css properties, all styles were properly encapsulated.</p><p>CSS-Modules quickly gained popularity in the React ecosystem and now it’s common to see many react projects using it, it has it’s pros and cons but over all it proves to be a good paradigm to use.</p><p>But… CSS Modules by itself doesn’t solve the core problems of CSS, it only shows you a way of localizing style definitions: <em>a clever way of automating BEM so you don’t need to think about chosing a class name ever again </em>(or at least think about it less).</p><p>But it does not alleviate the need for a good and predictable style architecture that is easy to extend reuse and control with the least amount of effort.</p><p>This is how local css looks like:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f4cfcb9e871d9e87c0f80c835f53fde0/href">https://medium.com/media/f4cfcb9e871d9e87c0f80c835f53fde0/href</a></iframe><p>You can see that it’s just css, the main difference is that all classNames prepended with :local will generate a unique class name that looks something like this:</p><p>.app-components-button-__root — 3vvFf {}</p><p>You can configure the generated ident with the localIdentName query parameter. Example: css-loader?localIdentName=[path][name]---[local]---[hash:base64:5] for easier debugging.</p><p>That’s the simple principle behind Local CSS Modules. If you can see, local modules became a way to automate the BEM notation by generating a unique className that was sure it wouldn’t clash with other’s even if they used the same name. Quite convenient.</p><h3>Styled Components to blend css in JS (fully)</h3><p>Styled-components are pure visual primitives that act as a wrapping component; they can be mapped to actual html tags and what they do is wrap the children components with the styled-component.</p><p>This following code will explain it better:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e15f92ff42fa0a109e557806b06c9ea4/href">https://medium.com/media/e15f92ff42fa0a109e557806b06c9ea4/href</a></iframe><p>If you see the styled component is very simple to understand, it uses the template literal notation to define css properties, it seems that the core styled-components team nailed it this time as it blends the full power of ES6 and CSS.</p><p>Styled-components provides a very simple pattern to reuse and fully separate UI from Functional and Stateful components. Creating an api that has access to native tags either in the browser as HTML or Natively using React Native.</p><p>This is how you pass custom props (or modifiers) to a Styled Component:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/99f7003f10f7fdf089ef3d7e90a03d0c/href">https://medium.com/media/99f7003f10f7fdf089ef3d7e90a03d0c/href</a></iframe><p>You can see that the props suddenly become the modifiers that each of the components receive and they can be processed to output different lines of css, neat right?</p><p>This allows us to move faster and use the full power of JS to process our styles while making sure they remain consistent and reusable.</p><h3>Core UI for everyone to reuse</h3><p>It quickly became apparent that CSS Modules nor Styled Components by themselves was not the perfect solution, it needed some kind of pattern in order for it to work and scale. The pattern emerged by defining what a component is and separating it fully from logic, creating core components which sole purpose is to style and nothing more.</p><p>An example implementation of such component using CSS Modules:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/db824fac1bee9f258636e781c7d45e44/href">https://medium.com/media/db824fac1bee9f258636e781c7d45e44/href</a></iframe><p>If you see, there’s nothing fancy in here, just a component that receives props and those are mapped to the children component. In other words: the wrapping component transfers all the props to the children.</p><p>Then your component can be consumed in the following way</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ef3dd826b5a866bb12a22e8de6622b2c/href">https://medium.com/media/ef3dd826b5a866bb12a22e8de6622b2c/href</a></iframe><p>Let me show you a similar example of a full implementation of a button using styled-components:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/bc28f3eab9560944dad476cf895efb0f/href">https://medium.com/media/bc28f3eab9560944dad476cf895efb0f/href</a></iframe><p>What’s interesting about this pattern is that the component is dumb and only serves as a wrapper of css definitions mapped to the parent component. There is one advantage of doing this:</p><p><em>It lets us define a base UI api which you can swap at will and make sure that all UI remains consistent throughout the application.</em></p><p>This way we can fully isolate the design process from the implementation process, making it possible to trigger them in parallel if wanted; you can have 1 developer focusing on the implementation of the feature and another polishing the UI achieving full separation of concerns.</p><p>Sounds like a great solution so far, internally we had discussions around it and thought it was a good idea to follow this pattern. Together with this pattern we started identifying other useful patterns as well:</p><h4><strong>Prop receivers</strong></h4><p>These do the function of listening to props passed to any component, thus making it easy to use these functions in any component you want, making it the holy grail for reusability and extending the capabilities of any given component, you can think of it as a way of inheriting modifiers, an example of what I mean by this:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/786ce8067716e616ce391003afba0a3f/href">https://medium.com/media/786ce8067716e616ce391003afba0a3f/href</a></iframe><p>This way you are sure that you won’t need to hardcode all the borders again for each specific component 🏆, saving you tons of time.</p><h4>Placeholder / Mixin like functionality</h4><p>In styled components you can use the full power of JS to be able to create functions not just as prop receivers but also as a way of sharing code between different components, here is an example:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/98f73ae6928457fec17906092dc509f1/href">https://medium.com/media/98f73ae6928457fec17906092dc509f1/href</a></iframe><h4>Layout Components</h4><p>We’ve detected that one of the first things we need to do when working in an application is layout our UI elements, for this purpose, we’ve identified some components that aid us in the process.</p><p>These components have proven to be very useful as often some developers (not familiar enough with css positioning techniques) have a hard time setting the structure, here is an example of such components:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/29b91a5c8a7f00bc59168dcc593d0f3b/href">https://medium.com/media/29b91a5c8a7f00bc59168dcc593d0f3b/href</a></iframe><p>If you can see we have the &lt;ScrollView /&gt; component which takes a width and a height as props and also receives the horizontal prop so the scrollbar appears below.</p><h4>Helper components</h4><p>Helper components make our life easier and allow us to reuse heavily. This is the place where we store all our common patterns.</p><p>These are some of the helpers I’ve found quite useful so far:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f9ca05ea35a82a2f9245280584a27c07/href">https://medium.com/media/f9ca05ea35a82a2f9245280584a27c07/href</a></iframe><h4>Theme</h4><p>Having a theme lets you have 1 source of truth of values that can be reused throughout the application, it’s been proven useful for storing values that are commonly reused in the application like color palette and general look and feel.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e8222383a307d54113d7663f4dbe452a/href">https://medium.com/media/e8222383a307d54113d7663f4dbe452a/href</a></iframe><p><strong>Pros</strong></p><ul><li>The full power of JS at our hands, meaning full communication with the component’s UI.</li><li>Eliminates the need of mapping components and styles through the use of a className (this is done under the hood)</li><li>Great development experience so far, it reduces the amount of time spent thinking about classNames and mapping them to the component.</li></ul><p><strong>Cons</strong></p><ul><li>Yet to be tested in the wild</li><li>Built for React</li><li>Super young</li><li>Testing needs to be done via aria-labels or using classNames</li></ul><h3>Conclusion</h3><p>Whatever technology you use whether it is SASS, BEM, CSS Modules or Styled Components there is no substitute for a well defined styling architecture that makes it intuitive for other developers to contribute to your code base without thinking too much, breaking or introducing new moving parts to the system.</p><p>This approach is crucial to scale properly and can be achieved even if using plain CSS and BEM, the main difference is the amount of work and LOC needed for each implementation, overall styled-components feels like a great suit for pretty much all React projects, yet to test it in the wild but quite promising indeed.</p><p>If you have any feedback thoughts, opinions, advices or anything please comment below, or feel free to reach me via twitter @perezpriego7</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d4c1da3a659b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Design Shouldn’t Be Just Beautiful]]></title>
            <link>https://medium.com/@perezpriego7/design-shouldnt-be-just-beautiful-10e6e3252f9a?source=rss-f0f96cfa4507------2</link>
            <guid isPermaLink="false">https://medium.com/p/10e6e3252f9a</guid>
            <category><![CDATA[design]]></category>
            <category><![CDATA[ux]]></category>
            <dc:creator><![CDATA[Carl0zen]]></dc:creator>
            <pubDate>Tue, 09 Aug 2016 19:41:33 GMT</pubDate>
            <atom:updated>2016-08-10T13:13:50.784Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*u_nBNP-CktH5URBAxd6hdg.jpeg" /></figure><h3>Design shouldn’t be just beautiful</h3><h4>A light introspection on what I think about design .</h4><p>When talking design the word “beautiful” often comes to mind as if it was the ultimate goal, we tend to forget that design has a purpose; its purpose is to give life to ideas and ensure that they become a reality. By definition design is:</p><p>As a noun:</p><ol><li>A plan or drawing produced to show the look and function or workings of a building, garment, or other object before it is built or made.</li><li>A decorative pattern.</li></ol><p>As a verb:</p><ol><li>Decide upon the look and functioning of (a building, garment, or other object), by making a detailed drawing of it.</li></ol><p>You can see immediately that when design is used as a noun it has a static meaning, something that lives only in someone’s head, some plan that hasn’t been implemented yet.</p><p>But when used as a verb you can see how design has a voice, it is the guiding force that puts the idea in motion so it can become a “real thing”, it is not longer about pleasant or beautiful but it’s more about making it happen.</p><h4>Design should be transparent</h4><p>So many companies and agencies focus on providing great looking experiences, most of the time to win awards or have a richer portfolio. Rather than spending a lot of time designing the product for great looks, it is always more important to focus on solving a core problem. Quoting <a href="https://blog.intercom.io/the-dribbblisation-of-design/">this great article</a> from the people at Intercom:</p><blockquote>Too many designers are designing to impress their peers rather than address real business problems.</blockquote><p>In fact design should be transparent, it should help people to visualize possible solutions for a problem. Once the solution is understood, there’s no point on throwing noise on top of that choosing a nicely looking color palette (at least early in the process). It’s always better to present ideas in the form of wireframes or even drawings so all the noise caused by other factors is not relevant when discussing about a possible solution.</p><h4>The 80 /20 rule</h4><p>There are two types of designers, the ones whose primary focus is in providing solutions and the ones who spend most of their time making things look awesome.</p><p>The first kind is the one who spends 80% of the time thinking about the problem, trying to think about the most important possible scenarios, even if their designs don’t look great they succeed at providing solutions, this type of designer is humble, asks the right questions, would sacrifice some eye catching graphics in exchange for many other factors like development speed, complexity, scalability, etc.</p><p>The second type of designer is utterly focused on making things look great and spends 80% of the time creating awesome mockups that look amazing, but often fail to be the easiest path to solve a problem, some of us spend too much time refining the details and fail to see that the ultimate purpose is to solve a problem as fast as possible with the minimal effort.</p><p>I think this quote summarizes these thoughts clearly:</p><blockquote>“I have found that all ugly things are made by those who strive to make something beautiful, and that all beautiful things are made by those who strive to make something useful.” Oscar Wilde</blockquote><p>Maybe this quote is a bit too drastic but it shows perfectly the point I am trying to make. It’s almost always the case that beautiful is not a requirement for functional. Design shouldn’t be confused with art. Now a days we tend to applaud awesome looking sites that win awards but often focus on superficial things rather than solving a real problem.</p><h4><strong>Design is not Perfect</strong></h4><p>Often design is done in a passive manner by using a linear way of thinking about it. When we think of a product often we realize design is something that should be done before the product comes to life but most often we end up wasting time postulating the wrong premises before exposing them to the final user.</p><p>Design is more about doing and proving yourself right or wrong. It is about continuously make an effort to make something better everytime. It is about solving problems for people and make a commitment to always figure out how to make them accomplish more with less effort.</p><h4><strong>Design is embedded in each step of the process.</strong></h4><p>Every stage of a project needs design, wheather it is designing how data will flow, how an architecture should be built, how a product should serve its purpose or how a button should give feedback. Design is in all the extense of the word just pure attitude towards problem solving.</p><p>Good design is not about making pixel perfect UI but more about taking the user through a flow with the least amount of friction. It is not about colors or spacing but about anticipation. It is about daring to explore different ways of doing things trusting that each iteration your product will become a better tool.</p><p>Design is a continuous process, it never ends, there are always better ways to accomplish things, better patterns to follow, better tools for communicating and making things happen faster.</p><blockquote>We should never stop designing.</blockquote><h4><strong>TDD (Test Driven Design)</strong></h4><p>In programming we are used to do test driven development which essentially consists in writing an hypothesis, make the test fail and figure out a way to make it pass. Design is not much different, we take a premise, build an hypothesis (prototype) and then work around ways to make the hypothesis solve the right problem.</p><p>This can be done at scale, weather it is a simple feature or a more complex endeavour we can use this process to be able to come up with valuable solutions. Test Driven Design is just about decreasing the feedback lifecycle to be able to adapt faster to a problem solving scenario.</p><p>There are tools and techniques that can help us along the way to test our design such as A / B testing, Behavioral analysis, observation and any other idea to help you better understand your users.</p><h4><strong>Design needs eagle vision</strong></h4><p>Every designer needs to be aware of the primary context of the problem to solve. Weather it is talking to stakeholders for clarification on requirements, talk to developers about implementation and decide what is a possible solution. Design is about making choices and be sure that the scenarios are tested properly before releasing to a broader audience.</p><p>A designer needs to be aware of the circumstances surrounding product decisions. Weather it is business value, development complexity, or even release strategy.</p><blockquote>“A great designer solves the problem the user is facing, a great designer anticipates solutions for problems users don’t even know they have”</blockquote><h4><strong>Design is doing</strong></h4><p>The only way of testing something is by doing, this can be done in several ways, whether it is a sheet of paper or a working prototype, designs can only be tested when they are built, so we need to make sure that enough effort is put in place in order to prove premises right or wrong.</p><blockquote><em>Design is not right or wrong, it’s proving that you are one or another.</em></blockquote><p>Once you dare to jump in the doing cycle you will see that by investing enough time and effort into building something that can be refined in each step of the process is really exciting. Designs suddenly become not only passive things to admire but useful tools to use, test and refine.</p><h4><strong>Design is about empathy</strong></h4><p>Having the ability to take a time and see how a user feels a product is essential for becoming a good designer, spending enough time understanding the user context is crucial to come up with great ideas.</p><p>Most often simple solutions are better than astonishing interfaces. Design needs to be subtle, almost invisible. It is not about the designer itself, it’s about solving a problem for somebody else. In order to design something useful you need to go beyond what you think it’s best and dare to put your idea on the wild and iterate through it along the way.</p><h4><strong>Design is for everyone</strong></h4><p>Whether your users are other developers, children, professionals, housewives, you always need to think about how design impacts their lives. Need to wear their shoes for a while and try harder every time to empathize with their problem. That way is the only way to fully become a good UX designer.</p><p>Design for everyday use, think about objective facts around you not just pure subjective aesthetic decisions. It is not about learning Photoshop but more about the way to approach a solution to problems. Everyone can learn to design, in fact we are all potential designers; it’s not as much as a technical skill but more of an attitude towards providing solutions that matter.</p><p>Getting immersed in the problem before providing a solution is critical, I won’t lie and say that everyone should be a designer, because it requires passion and dedication, but I feel that being a designer is such an intuitive task that everyone can learn how to do; if enough attention and dedication is put into it.</p><p>Would love to hear your thoughts.</p><p>Here at AlphaSights we are a group of passionate engineers and designers and always welcome new talent. Are you interested in joining the team? remember <a href="https://engineering.alphasights.com/#positions">we are hiring</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=10e6e3252f9a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[10 Principles for Effective Software Development]]></title>
            <link>https://medium.com/alphasights-engineering-blog/10-principles-for-effective-software-development-aa5df91d0f00?source=rss-f0f96cfa4507------2</link>
            <guid isPermaLink="false">https://medium.com/p/aa5df91d0f00</guid>
            <category><![CDATA[self-improvement]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[teamwork]]></category>
            <dc:creator><![CDATA[Carl0zen]]></dc:creator>
            <pubDate>Mon, 21 Mar 2016 16:41:23 GMT</pubDate>
            <atom:updated>2016-03-21T16:41:23.861Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sjpeJdx9jGWr9MPEfZIZJg.jpeg" /></figure><p>A few days ago I watched a really interesting video presented by <a href="https://twitter.com/csswizardry">Harry Roberts</a> at dotCSS 2014. He talks about principles, or best practices, to become an effective front-end developer. In reality, however, these principles can apply to all kinds of developers. Below I have summarized these 10 principles and provided my thoughts on each.</p><h4>1. The Simplest Option is Usually the Best</h4><p>As engineers our job is to solve problems. We are curious by nature and many of us feel the strange desire to constantly learn new things, frameworks and technologies. Often in an effort to become better developers we tend to over-engineer solutions. Most of the time we feel the need to ditch everything that we know in favor of new paradigms, but most of the time it comes with a cost: the cost of overcomplicating things.</p><blockquote>No one appreciates over engineered stuff.</blockquote><p>I couldn’t agree more on this point. Whenever choosing a way to execute a solution, pick the simplest option. It’s less likely to break, it’s less complex, and it’s easier to understand. In addition, it is always faster and cheaper to implement. Conversely adding levels of abstraction introduces the need to learn new ways of approaching a common problem. Less cognitive overhead when working at scale is always welcome.</p><p>I think it’s important to stress the word “usually” in this principle because I would not always consider it a rule of thumb. There are certain cases where we need to sacrifice simplicity over adaptability, scalability and security. But more often than not these are rare exceptions.</p><h4>2. Reduce the Amount of Moving Parts</h4><p>Code that is simple and concise is always easier to maintain. As dependencies grow in a project the overall complexity of the code-base increases as well. This also increases the chances of injecting bugs and problems. It may seem easier to add a shiny new library that solves the problem faster, but in reality this introduces new problems that in the beginning you may fail to consider.</p><p>Any moving part we inject in a system comes with an added cost tied to its maintainability. So whenever you think about adding new things in a system think twice and ask yourself if the benefit of adding new dependencies will solve the problem in a more efficient manner or if it will only take you out of the problem temporarily.</p><blockquote>The best code is no code at all</blockquote><p>I believe that whenever there is a chance of getting rid of something, it’s better to choose that path instead of adding more moving parts to the system.<em> </em>Think of it this way: more code = more time spent maintaining, fixing, and refactoring. So next time you see the possibility of safely getting rid of something, do it. Every moving part of the system is a potential point of failure.</p><p>Refactor to reduce complexity. It’s always a good exercise to try to refactor things in such a way that lets you simplify your solutions. I’ve found that it’s most often a good idea to try to find the patterns that are core, and kill code and even features that don’t add much value.</p><h4>3. Understand the Business</h4><p>Put yourself in your employer’s shoes. Always think about where your effort can lead to the greater benefit. Understand the value of your work for the good of the company. Connect with everyone else’s problems and always be ready to help. Know that others can avoid making the same mistakes you did by providing useful advice. This kind of mentality will put you in a much more valuable position in the long run.</p><p>Increasing your technical abilities is good for you but not necessarily for your company. Find a good balance between self-improvement and team-development. Remember that you are not isolated and that your work has a big impact even if you haven’t realized it yet.</p><p>Know your strengths and also your weaknesses so you can be ready to guide and ask for guidance whenever needed. Understand all the things that make you valuable. Don’t be just a developer, try to have a wider perspective and also understand how your work translates into wealth for your company. Don’t just build features, create solutions.</p><h4>4. Care Less, Care Appropriately</h4><p>No one cares more about your work than you do. Often there are trade-offs that need to be made in order to keep the workflow running smoothly. You will always find different opinions about everything, Whilst it is sometimes useful to engage in a debate, you may not want to waste the time debating superficial stuff.</p><p>Know that every time you express your opinion, there is time spent by your colleagues, understanding you and responding to you. Be respectful of the time of others and also to yourself while expressing an opinion. So the next time you share something publicly, think twice on the value that it will add to your team’s collective knowledge. Pick the right battles. Stand up whenever you are sure about something with humility and be open to hear opinions. Remember you won’t always be right and that there is value in considering different points of view.</p><blockquote>Balance the needs and wants of everyone</blockquote><p>Care less about your work but more for your team. Be less selfish and also be ready to make sacrifices for the good of others. Care more appropriately for everyone else’s jobs. Remember that your work, words and opinions have an impact on your team mates work even if it’s not that evident at first. Think about how you can make your teammates’ lives better by removing stress, not adding it.</p><h4>5. Pragmatism Trumps Perfection</h4><p>It is better to be timely than perfect. Things change fast in our industry. We are continually trying to innovate and find new ways of making better products. Sometimes in an effort to ensure the quality of a product we make certain trade-offs. I am not saying quality is not important; every company should have at least a basic set of quality standards so every product provides the best experience possible. But in my opinion there should be a right balance between good enough and perfection.</p><blockquote>Good enough today is better than perfect tomorrow</blockquote><p>Measure features based on business value. Don’t wait so long to release. Does it work to the minimal quality standard set by your company? If so, ship now to solve the core problem and assign some time to refactoring tasks later (Make sure you do, otherwise quality can deteriorate over time). Measure every feature built based on its business value and prioritize accordingly. Nothing is or will ever be perfect. You shouldn’t delay a project for superficial decisions. Focus on defining what is the minimum viable product and ship it as fast as possible. Later you can spend some time refining the experience. Something hacky that works today is better than something perfect that works next week.</p><h4>6. Think at the Product Level</h4><p>Your job is not just to produce features as if you were a factory. Whenever you are asked to build a feature is always good to give it some thought and ask yourself how much value your work is adding to the product. Don’t be afraid to respectfully question management decisions. If you are not convinced on something, make sure you discuss it with your leads before going down that path.</p><p>I am sure they will find your opinions valuable or will light your way in case you are failing to see a broader scenario. Do it with respect and be flexible. Great managers are good listeners that will value different perspectives, and will try make the right decision based on the knowledge they have.</p><p>Think of the all the factors in play, whether it’s team velocity, complexity, or productivity. Make decisions considering all possible factors. Get involved with everyone else’s issues, don’t just do your job. Be informed about the context of the project and make decisions that add value.</p><h4>7. Don’t Design Systems Around Edge-Cases</h4><p>Don’t let edge cases rule your product decisions, but rather focus on what yields the most benefit. Consider first solving the problem for your core audience and work on refining the experience later for edge cases. In other words, don’t let the minority lead the majority, and don’t base an entire product based on statistical outliers. These rare cases where something does not work for a specific segment shouldn’t hold back the release of a product.</p><p>Think of your major user base and design for them not the rare anomalies. Build for the most common scenario first. Solve edge cases separately and later in the process. Define your ideal core user base and solve problems based on hard statistical data (for example browser usage). Sometimes we may spend a lot of time fixing a bug that affects only a minimal amount of users. If it’s not critical, you shouldn’t jeopardize the release of a product in the quest for perfection.</p><p>Everything is prone to have errors, and everything will be buggy, but know that releasing a product on time could yield to greater benefits than delaying the release for very uncommon situations. Have a release strategy and make sure you allocate time to fix those nasty errors but just don’t wait until those are fixed in order to start gathering data or even ROI.</p><h4>8. Don’t Make Decisions Based on Anecdotal Evidence</h4><p>Whenever someone tells you something is great, do you research before taking anything for granted. It’s easy to jump into judgment and conclusions too quickly if something does not fit our current mindset. Do your homework, try to make unbiased decisions and always look for different opinions on the matter.</p><p>In general, rare anomalies or strong opinions that don’t fit the common denominator are based on lack of understanding or deep introspection. If the later is the case, you should consider it. Make sure that those opinions are based on first-hand experience and careful analysis.</p><p>Don’t believe everything that everyone says, but rather draw your own conclusions based on factual data. Anecdotes are not always representative, and may lead you to wrong decisions. Never trust gossip, always trust data.</p><h4>9. Don’t Build it Until you’ve Been Asked for it</h4><p>It is really tempting to come up with a shiny new solution that wows everyone by how smart and innovative it is. But most of the times building something without everyone’s approval is disrespectful not only because your time is costly to your employer but also because everything that you build has a maintenance cost.</p><p>It’s really cool to over-deliver, but think twice before implementing things. Is it a requirement now? Are you 100% sure it will have a positive impact? And most important, is it approved by management? Maintaining things that nobody asked for is irresponsible. Solve every single problem whenever you encounter it, not before. Don’t do work ahead of time.</p><p>It is not smart to solve problems that nobody has now. Be smart about how you use your time and the next time you want to create something awesome discuss it with your leads before doing so. I am sure if its really good you will have an approval sign and support from stakeholders to execute. Remember that communication is key for proving yourself valuable. It shows you understand how things work and that you are aware how your work impacts the organization.</p><h4>10. Expect and Accommodate Change</h4><p>Worry about something that solves the problem right now. Tomorrow’s technology will most likely change, so you will need to adapt anyway. Focus on something that fixes the problem but be flexible enough to let the next developer easily adapt to your code. Make sure you can undo things.</p><p>Surely I’ve been bitten before for not following these principles, which is why these principles resonated a lot, I really wish I would have heard this before I started working with a team, since it could have made me so much more valuable. Now it’s time to apply them as much as possible. What do you think? Are there other principles that you think are important? I would love to hear your opinions!</p><p>Watch the video of Harry Roberts at dotCSS2014 below:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F8adsZeMQjGQ%3Ffeature%3Doembed&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D8adsZeMQjGQ&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F8adsZeMQjGQ%2Fhqdefault.jpg&amp;key=d04bfffea46d4aeda930ec88cc64b87c&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/0bfb39fa3c1511be1c1c2462bbe6a4a2/href">https://medium.com/media/0bfb39fa3c1511be1c1c2462bbe6a4a2/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=aa5df91d0f00" width="1" height="1" alt=""><hr><p><a href="https://medium.com/alphasights-engineering-blog/10-principles-for-effective-software-development-aa5df91d0f00">10 Principles for Effective Software Development</a> was originally published in <a href="https://medium.com/alphasights-engineering-blog">AlphaSights Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>