<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Lorenzo Pasqualis</title>
    <description>The latest articles on DEV Community by Lorenzo Pasqualis (@lpasqualis).</description>
    <link>https://dev.to/lpasqualis</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F29859%2Ff32e4ab0-0542-434d-ad71-d3561017895b.jpg</url>
      <title>DEV Community: Lorenzo Pasqualis</title>
      <link>https://dev.to/lpasqualis</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lpasqualis"/>
    <language>en</language>
    <item>
      <title>Software Maintenance, Understanding the 4 Types</title>
      <dc:creator>Lorenzo Pasqualis</dc:creator>
      <pubDate>Mon, 14 Jan 2019 17:12:12 +0000</pubDate>
      <link>https://dev.to/lpasqualis/software-maintenance-understanding-the-4-types-53oo</link>
      <guid>https://dev.to/lpasqualis/software-maintenance-understanding-the-4-types-53oo</guid>
      <description>&lt;p&gt;This post was first published in its entirety on &lt;a href="https://coderhood.com" rel="noopener noreferrer"&gt;CoderHood&lt;/a&gt; as &lt;a href="https://www.coderhood.com/software-maintenance-understanding-the-4-types/" rel="noopener noreferrer"&gt;Software Maintenance, Understanding the 4 Types&lt;/a&gt;. CoderHood is a blog dedicated to the human dimension of software engineering.&lt;/p&gt;




&lt;p&gt;Software systems are a collection of bits recorded on a storage device. It might seem that once a software application works, as long as the hardware it runs on is functional, it should just keep working for eternity. So, why is "software maintenance" even a thing? There is no physical wear and tear, and there are no materials that can rot or rust away. Software systems are not affected by the atmosphere, pollution, the weather, and there isn't anything that can physically break. However, this argumentation doesn't take into consideration an essential aspect: the context.&lt;/p&gt;

&lt;p&gt;While software applications do not have moving parts that are subject to physical wear and tear, they most often have dependencies with their working environment. With very few exceptions, as the working environment inevitably changes, the assumptions the application was built upon crumble. Eventually, the app stops working or loses its value.&lt;/p&gt;

&lt;h3&gt;
  
  
  Examples of Context Changes
&lt;/h3&gt;

&lt;p&gt;Let me give you a few examples of context changes that can cause a software system to lose its value or break:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  A website that allows users to log-in using Google authentication stops working when Google changes its authentication protocol. (External dependencies change)&lt;/li&gt;
&lt;li&gt;  A weather prediction software system becomes outdated when the implemented mathematical weather models become outdated. (State-of-the-art knowledge change)&lt;/li&gt;
&lt;li&gt;  The navigation software of a car becomes obsolete when more recent navigation software products released by competitors are significantly better. (Market expectation change)&lt;/li&gt;
&lt;li&gt;  The software that manages bank accounts in a financial institution must be updated when the hardware it runs on breaks, and compatible hardware is no longer available. (Hardware change)&lt;/li&gt;
&lt;li&gt;  An application stops working when any one of the used third party libraries requires an update to a new version that is not backward compatible. (Software dependency change)&lt;/li&gt;
&lt;li&gt;  An application needs to be modified to comply with new laws and regulations. (Compliance change)&lt;/li&gt;
&lt;li&gt;  An application needs to be fixed because the definition of leap year changed. (External concepts and definitions change)&lt;/li&gt;
&lt;li&gt;  An application needs to integrate with a new and popular third-party system. (Market environment change)&lt;/li&gt;
&lt;li&gt;  Traffic is increasing on a website, and the website software needs to be rearchitected to be able to scale to the new traffic levels. (Usage patterns change)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, in principle, it is true that software applications don't withstand physical wear and tear. However, non-physical processes cause software applications to age and expire if they are not rigorously maintained.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Different Types of Software Maintenance
&lt;/h2&gt;

&lt;p&gt;Maintenance of software systems comes in four different flavors: adaptive, corrective, perfective and preventive. Please, note that I did not make up these names. If I did, I would have chosen something different. For example, I find the term "perfective" to be cringy, but I am going to stick with it for compatibility with the standard industry jargon.&lt;/p&gt;

&lt;p&gt;A maintenance action is always a software change, but its classification depends on the reasons that triggered it. Let's take a deep dive in the four types of maintenance, and how to recognize them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Corrective Software Maintenance
&lt;/h2&gt;

&lt;p&gt;A corrective maintenance action is a software change that you make because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; there is an acute issue that prevents the software to work as expected&lt;/li&gt;
&lt;li&gt; the problem is actively affecting users, or you suspect that it is.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, if you release a software system and your users ran into a bug, a corrective maintenance action is required to fix it. Note that, if the users were never affected by the bug and you resolve it before anybody noticed it, the maintenance action is preventive or adaptive. However, if even one single user might have been affected, then fixing the problem is a corrective maintenance action.&lt;/p&gt;

&lt;p&gt;If you spend the majority of the time dealing with corrective maintenance tasks, your engineering team is running in firefighting mode. Pay attention to that situation, as something might be wrong with your testing practices, your ability to anticipate problems, seniority and skill level of your team, the quality of your code or your engineering capacity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adaptive Software Maintenance
&lt;/h2&gt;

&lt;p&gt;Adaptive maintenance is something you do when you change a software system because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; you have definite information that the landscape in which your software operates is changing (i.e., market, technology, laws, etc.)&lt;/li&gt;
&lt;li&gt; you have a good understanding of the direction and timeline of the landscape change&lt;/li&gt;
&lt;li&gt; your customers will be affected at some predictable point in the future, or they are affected now but have trivial and inexpensive workarounds&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, let's say that you are running a website and you discover that it is not compatible with a new version of Safari that was pre-released by Apple in developer-only beta. Based on historical patterns, you know that Apple will release the incompatible version of Safari in the next few months. If you address the problem before the new version of Safari goes mainstream, then you are performing an adaptive maintenance task. That's because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Safari is changing&lt;/li&gt;
&lt;li&gt; you have a good guess on when it will be released&lt;/li&gt;
&lt;li&gt; your customers are not using the developer version of Safari; if they are, they are probably aware of the risks and can switch to the generally available release.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you wait for the new version of Safari to become generally available to the public, and your customers run into issues, then you have to take a corrective maintenance action. Knowingly delaying adaptive maintenance until it becomes necessary to perform corrective maintenance is costly and should always be avoided.&lt;/p&gt;

&lt;p&gt;A very famous example of massive worldwide adaptive maintenance rush was caused by the "&lt;a href="https://www.nationalgeographic.org/encyclopedia/Y2K-bug/" rel="noopener noreferrer"&gt;Y2K bug&lt;/a&gt;" in the late 1990s. The calendar year was guaranteed to change from 1999 to 2000 on 1/1/2000. Many software systems were clearly not ready for it, but customers of those systems were not affected yet. At exactly midnight on January 1st, 2000, any software maker who did not invest in the adaptive maintenance work to fix the Y2K flow was now dealing with a corrective maintenance emergency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perfective Software Maintenance
&lt;/h2&gt;

&lt;p&gt;You perform perfective maintenance when you change a software system because you decide to improve its value by improving something that is already working. Perfective maintenance includes things like speed optimizations, UI and usability improvements, etc. Perfective maintenance is often, but not always, initiated by customer feedback. Well-run software organizations listen carefully to their customers and invest in perfective maintenance tasks until just before they hit a point of diminishing returns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preventive Software Maintenance
&lt;/h2&gt;

&lt;p&gt;Preventive maintenance is a software change you make to avoid potential (but not guaranteed) future issues.&lt;/p&gt;

&lt;p&gt;The difference between adaptive and preventive maintenance can be fuzzy at times. In general, preventive maintenance is not bound to a trend that is sure to occur due to changing contextual conditions; instead, it is linked to an event that might or might not happen in the future. For example, if you are concerned about traffic spikes due to unforeseen and unpredictable future circumstances, and you decide to reinforce your software to deal with it, you are performing preventive maintenance. On the other hand, if your traffic growth patterns are somewhat predictable, and you have a good idea when your systems will start having scalability issues, any change you make to avoid those issues is adaptive maintenance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mindmap of the Key Concepts
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.coderhood.com/software-maintenance-understanding-the-4-types/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff7keyz0acgtxgk1pm14f.png" width="800" height="1103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is this important?
&lt;/h2&gt;

&lt;p&gt;Every time that you make changes to a software system, it is essential to identify the type of maintenance that you are performing. Keeping track of it gives excellent insights into your engineering practices. For example, the percentage of time that you spend in each of the four maintenance types gives you an idea of the maturity and skill level of your software engineering organization. It can also give you an idea of the maturity level of your product and codebase.&lt;/p&gt;

&lt;p&gt;How much time your engineering team should spend on each of the four types of maintenance depends on many factors. For example, immediately after a release, you should not be surprised to see a spike in corrective maintenance work. Despite your best attempts to release bug-free code, issues always crop up after a release. There are no hard and fast rules, but there are general considerations and principles to keep in mind.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Software systems age. Maintenance is part of a software system cost of ownership. You can somewhat keep it under control, but you cannot avoid it.&lt;/li&gt;
&lt;li&gt;  As your software systems become bigger and more sophisticated, or as your customer base grows, the amount of maintenance required increases proportionally (but not linearly). Without growth (AKA, more people), engineering teams that keep adding new features to a software system, or supporting a growing customer base, sooner or later end up spending 100% of their time on maintenance tasks. I call that the "&lt;a href="https://www.coderhood.com/7-strategies-to-avoid-software-growth-zero-aka-drowning-in-maintenance/" rel="noopener noreferrer"&gt;zero-growth&lt;/a&gt;" stage, and it is not a good place to be. How quickly you'll get there depends on many factors.&lt;/li&gt;
&lt;li&gt;  Investing in preventive maintenance is like taking a bet. To win you have to bet and be right more often than you are wrong.&lt;/li&gt;
&lt;li&gt;  Do not let issues go from "potential" to "predictable" to "acute." Most corrective maintenance tasks are very costly because they affect your brand. You can usually avoid them with less expensive adaptive or predictive maintenance work if you pay attention. Take bets, move quickly, don't ignore clear signals.&lt;/li&gt;
&lt;li&gt;  If you are not working on any adaptive or preventive maintenance task, you are probably not paying attention to the context in which your software operates.&lt;/li&gt;
&lt;li&gt;  There is a point of diminishing returns in perfective maintenance tasks. You can polish an apple only so much before it becomes a futile exercise.&lt;/li&gt;
&lt;li&gt;  There are always going to be parts of a software system that you prefer not to touch. That is not necessarily a bad thing; however, you should watch out for how much time you spend working around problems in those areas.&lt;/li&gt;
&lt;li&gt;  Sometimes it is not immediately obvious how to categorize maintenance work as it seems to fall into multiple buckets. That's ok. Take your best shot. The more you do it, the easier it gets.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  If you enjoyed this article, keep in touch!
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.coderhood.com" rel="noopener noreferrer"&gt;Find all my posts on CoderHood. Don't forget to Subscribe to receive notifications of new posts by Email.&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/lpasqualis/" rel="noopener noreferrer"&gt;Join my professional network on LinkedIn.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/lpasqualis" rel="noopener noreferrer"&gt;Follow me on Twitter.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/coderhood/" rel="noopener noreferrer"&gt;Join my Facebook page.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And finally, follow me here on dev.to!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>advice</category>
      <category>leadership</category>
      <category>maintenance</category>
    </item>
    <item>
      <title>Product Vision, Agile, and Going to the Moon</title>
      <dc:creator>Lorenzo Pasqualis</dc:creator>
      <pubDate>Thu, 12 Apr 2018 15:26:47 +0000</pubDate>
      <link>https://dev.to/lpasqualis/product-vision-agile-and-going-to-the-moon-1li2</link>
      <guid>https://dev.to/lpasqualis/product-vision-agile-and-going-to-the-moon-1li2</guid>
      <description>&lt;p&gt;This post was first published on &lt;a href="https://coderhood.com" rel="noopener noreferrer"&gt;CoderHood&lt;/a&gt; as &lt;a href="https://www.coderhood.com/product-vision-agile-going-to-the-moon/" rel="noopener noreferrer"&gt;Product Vision, Agile, and Going to the Moon&lt;/a&gt;. CoderHood is a blog dedicated to the human dimension of software engineering.&lt;/p&gt;

&lt;p&gt;Reading Time: 6 minutes&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Vision:&lt;/strong&gt;\&lt;br&gt;
(&lt;em&gt;noun&lt;/em&gt;)\&lt;br&gt;
a vivid mental image, especially a fanciful one of the future.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A Clear Vision
&lt;/h2&gt;

&lt;p&gt;Everyone who lived before witnessing the Apollo 11 mission on July 20th, 1969, could only dream of touching the Moon. In 1865, &lt;a href="https://en.wikipedia.org/wiki/Jules_Verne" rel="noopener noreferrer"&gt;Jules Verne&lt;/a&gt;, a French novelist, had that dream in the form of a novel that he titled "From the Earth to the Moon." He told a story of a group of gun enthusiasts and their attempts to build an enormous space gun to launch three people to the Moon.&lt;/p&gt;

&lt;p&gt;It took 104 more years for humanity to find a way to realize that dream. When it happened, it was one of humanity's proudest achievements; a glorious moment that required an immense amount of planning and work.&lt;/p&gt;

&lt;p&gt;Many small and significant scientific milestones needed to be realized before we could take that one enormous step. First, in 1609, Galileo discovered that the Moon was a world. That discovery was necessary for us to imagine that going to it was even a possibility. In 1687 Isaac Newton reasoned that a cannon powerful enough could put a shell in orbit. If the round were fired even faster, it would leave earth and go into space. In 1903 the Russian scientist Konstantin Tsiolkovsky defined the Rocket Equation, a mathematical basis for space propulsion. The list goes on and on.&lt;/p&gt;

&lt;p&gt;Each milestone by itself wasn't enough to get us to the destination but combined created the necessary critical mass.&lt;/p&gt;

&lt;p&gt;The vision that propelled us forward was simple: to put a human on the Moon. The engineering vision was more complicated, but still clear: to build the technology necessary to carry humans to space, keep them healthy, deposit them on the Moon, and bring them back to earth alive. That last part was a significant complication.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agile and Vision Are Not Enemies
&lt;/h2&gt;

&lt;p&gt;I admit it; space missions and software products are very different things. However, they do have commonalities. They both consist of complex engineering challenges that need to be overcome to reach a goal.&lt;/p&gt;

&lt;p&gt;The Apollo 11 mission was planned and driven mainly using waterfall processes. That's how we engineered most things at the time. Today, many engineering problems are approached in a more "agile" way. The agile manifesto lays the foundation for that way of thinking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Agile Manifesto
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Individuals and interactions over processes and tools.&lt;/li&gt;
&lt;li&gt;  Working software over comprehensive documentation.&lt;/li&gt;
&lt;li&gt;  Customer collaboration over contract negotiation.&lt;/li&gt;
&lt;li&gt;  Responding to change over following a plan.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Operating according to the manifesto is common in the software industry. Unfortunately, the manifesto is very vague and open to interpretation, and it is usually misinterpreted. The 12 principles of agile spell out that philosophy in greater detail, but still they leave (by design) much to the imagination:&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Agile Principles
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; Our highest priority is to satisfy the customer through the early and continuous delivery of valuable software.&lt;/li&gt;
&lt;li&gt; Welcome changing requirements, even late in development. Agile processes harness change for the customer's competitive advantage.&lt;/li&gt;
&lt;li&gt; Deliver working software frequently, from a couple of weeks to a couple of months, with a preference to the shorter timescale.&lt;/li&gt;
&lt;li&gt; Business people and developers must work together daily throughout the project.&lt;/li&gt;
&lt;li&gt; Build projects around motivated individuals. Give them the environment and support they need, and trust them to get the job done.&lt;/li&gt;
&lt;li&gt; The most efficient and effective method of conveying information to and within a development team is a face-to-face conversation.&lt;/li&gt;
&lt;li&gt; Working software is the primary measure of progress.&lt;/li&gt;
&lt;li&gt; Agile processes promote sustainable development. The sponsors, developers, and users should be able to maintain a constant pace indefinitely.&lt;/li&gt;
&lt;li&gt; Continuous attention to technical excellence and good design enhances agility.&lt;/li&gt;
&lt;li&gt;Simplicity--the art of maximizing the amount of work not done--is essential.&lt;/li&gt;
&lt;li&gt;The best architectures, requirements, and designs emerge from self-organizing teams.&lt;/li&gt;
&lt;li&gt;At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is no mention of product vision or engineering vision in either the manifesto or the principles. It more or less says that the vision needs to be realized in small functional releases and that plans can and will change along the way.&lt;/p&gt;

&lt;p&gt;Unfortunately, agile is often confused with "starting to do stuff without a plan." That is a fallacy that causes huge problems. The manifesto and the principles do not say that you should start writing code without having any idea where the product is going. In fact, beginning with a clear vision is a fundamental of "Agile Project Management 101," but it is also an often forgotten first step.&lt;/p&gt;

&lt;p&gt;From the product vision, an engineering team should create an engineering vision. That is a high-level idea of how a product vision is going to be realized.&lt;/p&gt;

&lt;p&gt;Taking the first step that comes to mind toward a goal is not the right approach, as it leads to many false starts and wrong paths. Let me give you an example.&lt;/p&gt;

&lt;h2&gt;
  
  
  Going to The Moon
&lt;/h2&gt;

&lt;p&gt;Let's say that the Apollo 11 mission didn't happen and that your goal is to travel to the Moon for the first time. The "product vision" is the idea of an astronaut planting a flag on the Moon. That is what you want to achieve, or the "what." It is a vision because you can see it in your head. From that idea, you need to imagine how you are going to achieve it; I call that an engineering vision.&lt;/p&gt;

&lt;p&gt;In an agile world, you might be tempted to make quick progress by rushing to take the very first action that comes to mind that brings you closer to achieving your goals. For example, you could start by walking in the general direction of the Moon. That might seem like a great thing to do as it gets you closer to the destination. However, while walking in the right direction reduces the physical distance between you and the Moon, it has no chance of success because you cannot walk to space.&lt;/p&gt;

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

&lt;p&gt;Walking is a misguided first step toward a dead-end. Taking a bunch of first steps toward dead-ends is not being agile; it is just lacking the ability or desire to imagine how you are going to reach your goals. In other words, it is lack of vision.&lt;/p&gt;

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

&lt;p&gt;A better first step is to think what it would take to get to the Moon. Imagining how you could do it, even without knowing the details, is the engineering vision that you need to have to reach the goal. That vision keeps you focused. For example, if you envision having to build a rocket, the next steps you take are going to be focused on that concrete goal.&lt;/p&gt;

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

&lt;p&gt;With the focus on a rocket (engineering vision), you can take steps that have a chance to get you to the destination.&lt;/p&gt;

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

&lt;p&gt;That vision is critical. If you envision the wrong thing (for example, walking to the moon), you are going to focus on taking steps in the wrong direction. That is where the agile philosophy comes into play. Applying agile methodologies once you have a vision, you achieve functional intermediate steps while keeping evaluating the course and the overall strategy along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Levels of Software Product Vision
&lt;/h2&gt;

&lt;p&gt;We have seen that the engineering vision depends on product vision. Similarly, the product vision depends on the company vision.&lt;/p&gt;

&lt;p&gt;That is because the company vision tells you &lt;strong&gt;WHY&lt;/strong&gt; a product should be built. The product vision tells you &lt;strong&gt;WHAT&lt;/strong&gt; product should be built and, finally, the engineering vision tells you &lt;strong&gt;HOW&lt;/strong&gt; the product will be developed.&lt;/p&gt;

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

&lt;p&gt;Together these three levels of vision give the entire narrative of a product. Having that narrative is necessary to describe the reality of the world after the product is built.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where Are Marketing and Sales in This Picture?
&lt;/h3&gt;

&lt;p&gt;If you don't know how you are going to market or sell a product (at least at a high-level), the product is going to struggle. Look at how long it took for Twitter to figure out how to monetize their services. For that reason, marketing and sales strategies should be part of the Product Vision.&lt;/p&gt;

&lt;p&gt;To expand on the MindMap above:&lt;/p&gt;

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

&lt;p&gt;To make this more concrete, at Amazon the vision of a product starts from a mock press-release. That forces product managers to think about all customer-facing facets of a product from the very beginning. Thinking about market and sale realities has profound implications on product design, and the product design has broad consequences on engineering direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;Agile methodologies have influenced the way software is built, but have also been applied in naive ways. Their goal is to eliminate unnecessary and costly over-formalizations to enable developers to make progress without having to spell out all the details ahead of time. That should not be confused with sloppily taking a step in a direction that appears somewhat right.&lt;/p&gt;

&lt;p&gt;Agile methodologies should not be an excuse to attempt to achieve results without planning or without knowing what we want to build or how we are going to do it. A clear product vision is still critical. Small-batch vision and incremental vision are both oxymorons.&lt;/p&gt;




&lt;h3&gt;
  
  
  If you enjoyed this article, keep in touch!
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.coderhood.com" rel="noopener noreferrer"&gt;Find all my posts on CoderHood. Don't forget to Subscribe to receive notifications of new posts by Email.&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/lpasqualis/" rel="noopener noreferrer"&gt;Join my professional network on LinkedIn.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/lpasqualis" rel="noopener noreferrer"&gt;Follow me on Twitter.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/coderhood/" rel="noopener noreferrer"&gt;Join my Facebook page.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And finally, follow me here on dev.to!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>advice</category>
      <category>agile</category>
      <category>leadership</category>
      <category>vision</category>
    </item>
    <item>
      <title>DreamBox Learning is hiring Senior Software Development Engineer</title>
      <dc:creator>Lorenzo Pasqualis</dc:creator>
      <pubDate>Wed, 04 Apr 2018 17:07:28 +0000</pubDate>
      <link>https://dev.to/lpasqualis/dreambox-learning-is-hiring-senior-software-development-engineer-24jg</link>
      <guid>https://dev.to/lpasqualis/dreambox-learning-is-hiring-senior-software-development-engineer-24jg</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmw6m2klysrvu56xislqr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmw6m2klysrvu56xislqr.jpg" width="464" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About Us
&lt;/h2&gt;

&lt;p&gt;For more than a decade we’ve been adapting, innovating and collaborating to shape new learning possibilities for over 2 million kids and 75,000 teachers. Our mission is to inspire all students to think differently about math and love it. We have a creative and fun office environment (foosball table, awesome coffee, dog and kid-friendly) and a work-life-balanced company culture that acknowledges hard work while encouraging innovation and professional growth.&lt;/p&gt;

&lt;p&gt;Our award-winning online math software is a pioneer in the EdTech space, and we continue to be at the forefront of the industry. Our adaptive technology, rigorous curriculum, and game-like environment work together to provide a unique learning experience that’s like no other.&lt;/p&gt;

&lt;h2&gt;
  
  
  About The Opportunity
&lt;/h2&gt;

&lt;p&gt;We are an Agile shop, and our team is made up of a diverse group of self-motivated, passionate, and adaptive software engineers. Our Interactive Software Development Engineers create and implement interactive designs for students to experience on desktops and tablets. We are seeking to add a new senior member to the team—someone with technical and people leadership skills, and strong desire to grow with the company and improve the lives of children and learning guardians.&lt;/p&gt;

&lt;p&gt;A typical day in this position involves working with engineers, artists, UI/UX designers, and teachers, to create, deliver and support high-quality software. You will be designing and building interactive components to provide a rich and engaging experience for students to explore and master mathematical concepts.&lt;/p&gt;

&lt;p&gt;We are seeking someone with a passion for learning, not afraid of challenges, and a knack for solving hard problems. We are changing the lives of students, teachers, and families with our software, and you will play a critical role in expanding and supporting the content and platform that are at the heart of our product offering.&lt;/p&gt;

&lt;p&gt;We work on the cutting edge of a lot of technologies. We need someone who is a creative problem solver, resourceful in getting things done, and productive working independently and collaboratively. Successful interactive software development engineers at DreamBox are highly-motivated and productive coders with a strong background in Object Oriented Programming and an appreciation for smooth animations, elegant UI, tasteful transitions, game mechanics, and steady frame rates. They also have experience with a variety of client-side platforms and technologies and have collaborated to ship software successfully.&lt;/p&gt;

&lt;p&gt;This person will take on the following responsibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create content for our DreamBox Learning experience.&lt;/li&gt;
&lt;li&gt;Help us improve our software platform.&lt;/li&gt;
&lt;li&gt;Operate in a collaborative development environment.&lt;/li&gt;
&lt;li&gt;Help us refine development processes and strategies.&lt;/li&gt;
&lt;li&gt;Deliver quality work to meet our deadlines.&lt;/li&gt;
&lt;li&gt;Support and maintain released software.&lt;/li&gt;
&lt;li&gt;Grow into a technical and people leader.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Skill &amp;amp; Qualifications
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;5+ years of professional programming experience.&lt;/li&gt;
&lt;li&gt;Recent and extensive working knowledge in designing and implementing interactive software.&lt;/li&gt;
&lt;li&gt;Expertise in writing and cross-browser web applications.&lt;/li&gt;
&lt;li&gt;Extensive working knowledge of JavaScript.&lt;/li&gt;
&lt;li&gt;Experience with client-server technologies, like REST, HTTP, JSON.&lt;/li&gt;
&lt;li&gt;Experience implementing designs for a user experience across desktop and tablet devices.&lt;/li&gt;
&lt;li&gt;Solid understanding of the DOM and Canvas.&lt;/li&gt;
&lt;li&gt;Front-end debugging experience using tools such as Charles Web Proxy, Firebug and - Chrome developer tools.&lt;/li&gt;
&lt;li&gt;Self-motivated and passionate about software engineering and technology.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How To Apply
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.thegravityapp.com/shared/job?u=1518201983&amp;amp;id=8a7883c65f99acc5015fc194ff73452d&amp;amp;clientId=8a7883c65f99acc5015fc174e1ea4318&amp;amp;v=9&amp;amp;token=eyJ0eXBlIjoiZW1haWwiLCJ1aWQiOjE1MzUzLCJwcm92aWRlciI6ImJvdW5jZSJ9.b0M9va549gI4oXeLrGYiFskytkE" rel="noopener noreferrer"&gt;Click here to apply&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Please feel free to leave questions in the comments section.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hiring</category>
      <category>typescript</category>
      <category>javascript</category>
      <category>career</category>
    </item>
    <item>
      <title>What is the most fun coding problem you resolved?</title>
      <dc:creator>Lorenzo Pasqualis</dc:creator>
      <pubDate>Tue, 03 Apr 2018 22:03:01 +0000</pubDate>
      <link>https://dev.to/lpasqualis/what-is-the-most-fun-coding-problem-you-resolved-2ep</link>
      <guid>https://dev.to/lpasqualis/what-is-the-most-fun-coding-problem-you-resolved-2ep</guid>
      <description>&lt;p&gt;I had a lot of fun coding throughout my career. There are a few problems, however, that I still remember fondly as particularly fun to resolve. They weren't the hardest ones I worked on or the most important ones. However, at the time, they gave me a great satisfaction that I can still remember today.&lt;/p&gt;

&lt;p&gt;Here are two examples:&lt;/p&gt;

&lt;h2&gt;
  
  
  Ads Probability
&lt;/h2&gt;

&lt;p&gt;I was working on an online advertisement system for a hosting company, back in 2000. I had a list of banners that needed to be displayed randomly anytime a web page was rendered. For each banner, I had a percentage associated with it. The percentage represented the probability of that particular banner to be shown on a website in the system. &lt;/p&gt;

&lt;p&gt;I had to write the code to show the ads with the correct frequency. The system was getting millions of requests per day (a huge number at the time), and it had to be highly performant. I had a blast working on that problem. The solution I implemented was simple and fast (at worst O(log n)). I used variations of it over the years for different problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fast Memory Allocation
&lt;/h2&gt;

&lt;p&gt;The second one is from 2003 when I was trying to optimize a virtual machine designed to run on a mobile device. Mobile devices were slow at the time. Very slow. The virtual machine was not performing well on a particular device, and I spent some time profiling it. The code was written in C++, and I realized that what was slowing things down was the memory allocation system on the device (not shocking).&lt;/p&gt;

&lt;p&gt;Any time an object was created with "new," the allocator took too long to do its job. I decided to create my own memory allocator, highly optimized for the particular application I was running, which happened to create many very small objects. The result was an immediate 95% performance boost across the board. &lt;/p&gt;

&lt;h2&gt;
  
  
  What about you?
&lt;/h2&gt;

&lt;p&gt;There are many others, but I'll stop here. What about you? Are there problems that you remember as particularly fun to resolve? What were they?&lt;/p&gt;




&lt;h3&gt;
  
  
  If you enjoyed this post, keep in touch!
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.coderhood.com" rel="noopener noreferrer"&gt;Find all my posts on CoderHood. Don't forget to Subscribe to receive notifications of new posts by Email.&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/lpasqualis/" rel="noopener noreferrer"&gt;Join my professional network on LinkedIn.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/lpasqualis" rel="noopener noreferrer"&gt;Follow me on Twitter.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/coderhood/" rel="noopener noreferrer"&gt;Join my Facebook page.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And finally, follow me here on dev.to!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>career</category>
      <category>coding</category>
    </item>
    <item>
      <title>Avoid Design by Committee: Generate Apart, Evaluate Together</title>
      <dc:creator>Lorenzo Pasqualis</dc:creator>
      <pubDate>Mon, 02 Apr 2018 15:35:27 +0000</pubDate>
      <link>https://dev.to/lpasqualis/avoid-design-by-committee-generate-apart-evaluate-together-2l00</link>
      <guid>https://dev.to/lpasqualis/avoid-design-by-committee-generate-apart-evaluate-together-2l00</guid>
      <description>&lt;p&gt;This post was first published in its entirety on &lt;a href="https://coderhood.com" rel="noopener noreferrer"&gt;CoderHood&lt;/a&gt; as &lt;a href="https://www.coderhood.com/avoid-design-by-committee-generate-apart-evaluate-together/" rel="noopener noreferrer"&gt;Avoid Design by Committee: Generate Apart, Evaluate Together&lt;/a&gt;. CoderHood is a blog dedicated to the human dimension of software engineering.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.coderhood.com/avoid-design-by-committee-generate-apart-evaluate-together/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd1j07vbmmvvum0ekhtz1.jpg" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The tech industry thrives on innovation. Building innovative software products requires constant design and architecture of creative solutions. In that context, I am not a fan of design by committee; in fact, I believe that it is more of a disease than a strategy. It afflicts teams with no leadership or unclear leadership; the process is painful, and the results are abysmal.&lt;/p&gt;

&lt;p&gt;Usability issues plague software products designed by committee. Such products look like collections of features stuck together without a unifying vision or a unique feeling; they are like onions, built as a series of loosely connected layers. They cannot bring emotions to the user because emotions are the product of individual passion.&lt;/p&gt;

&lt;p&gt;Decisions and design by committee feel safe because of the sense of shared accountability, which is no accountability at all. A group's desire to strive for unanimity overrides the motivation to consider and debate alternative views. It reduces creativity and ideation to an exercise of consensus building.&lt;/p&gt;

&lt;p&gt;Building consensus is the act of pushing a group of people to think alike. On that topic, &lt;a href="https://en.wikipedia.org/wiki/Walter_Lippmann" rel="noopener noreferrer"&gt;Walter Lippmann&lt;/a&gt; famously said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When all think alike, then no one is thinking.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In other words, building consensus is urging people to talk until they stop thinking and until they finally agree. Not many great ideas or designs come out that way.&lt;/p&gt;

&lt;p&gt;I am a believer that the seeds of great ideas are generated as part of a creative process that is unique to each person. If you force a process where all designs must be produced and evaluated on the spot in a group setting, you are not giving introverted creative minds the time to enter their best focused and creative state. On the other hand, if you force all ideas to be generated in isolation without group brainstorming, you miss the opportunity to harvest collective wisdom.&lt;/p&gt;

&lt;p&gt;That is why I like to implement a mixed model that I call "Generate apart, Evaluate Together." I am going to talk about this model in the context of software and architecture design, but you can easily expand it to anything that requires both individual creativity and group wisdom. Like most models, I am not suggesting that you should apply it to every design or decision. It is not a silver bullet. Look at it as another tool in your toolbelt. I recommend it mostly for medium to large undertakings, significant design challenges, medium to large shifts and foundational architecture choices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generate Apart, Evaluate Together
&lt;/h2&gt;

&lt;p&gt;I believe in the power of a creative process that starts with one or more group-brainstorms designed to frame a problem, evaluate requirements and bring-out and evaluate as many initial thoughts as possible. In that process, a technical leader guides the group to discuss viable alternatives but keeps the discussion at a "box and arrows" high-level. Imagine a data flow diagram on a whiteboard or a mindmap of the most important concepts. Groups of people discussing design and architecture should not get bogged down in the weeds.&lt;/p&gt;

&lt;p&gt;At some point during that high-level ideation session, the group selects one person to be an &lt;strong&gt;idea/proposal generation driver&lt;/strong&gt;. After the group session is over, that person is in charge of doing research, create, document and eventually present more ideas and detailed solution options. If the problem-space is vast, the group might select several drivers, one for each of the different areas.&lt;/p&gt;

&lt;p&gt;The proposal generation driver doesn't have to do all the work in isolation. He or she can collaborate with others to come up with proposals, but he or she needs to lead the conversation and idea generation.&lt;/p&gt;

&lt;p&gt;After the driver generated data, ideas, and proposals, the group meets again to &lt;strong&gt;brainstorm, evaluate and refine the material&lt;/strong&gt;. At that point, the group might identify new drivers (or maintain the old ones), and the process repeats iteratively.&lt;/p&gt;

&lt;p&gt;As mentioned, I refer to this iterative process with the catchphrase, "Generate Apart, Evaluate Together." Please, do not interpret that too literally and as an absolute. First of all, there is idea generation happening as a group, but it is mostly at a high-level. Also, there is an evaluation of ideas that happens outside of the group. "Generate apart, evaluate together" is a reminder to avoid design by committee, in-the-weeds group meetings, and isolated evaluation and selection of all ideas and solutions.&lt;/p&gt;

&lt;p&gt;I synthesized the process with this quick back-of-the-napkin sequence diagram:&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Evaluate
&lt;/h2&gt;

&lt;p&gt;The "evaluate" part of "Generate apart, evaluate together" refers to one of the two different phases of evaluation mentioned above.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Initial Evaluation&lt;/strong&gt; is a group assessment of the business requirements followed by one or more brainstorms. The primary goal is to frame the problem and create an initial list of possible high-level architectural and technical choices and issues. The secondary objective is to select a driver for idea generation.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Iterative Evaluation&lt;/strong&gt; is the periodic group evaluation and refinement of ideas and proposals generated by the driver in non-group settings.&lt;/p&gt;

&lt;p&gt;Some of the activities executed during both types of evaluation are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Brainstorm business requirements and solutions.&lt;/li&gt;
&lt;li&gt;  Identification of the proposal generation driver or drivers.&lt;/li&gt;
&lt;li&gt;  Identification of next steps.&lt;/li&gt;
&lt;li&gt;  Review proposals.&lt;/li&gt;
&lt;li&gt;  Debate pros and cons of proposed solutions.&lt;/li&gt;
&lt;li&gt;  Choose a high-level technical direction.&lt;/li&gt;
&lt;li&gt;  Argue.&lt;/li&gt;
&lt;li&gt;  Agree and commit or disagree and commit.&lt;/li&gt;
&lt;li&gt;  Establish communication strategy.&lt;/li&gt;
&lt;li&gt;  Estimate.&lt;/li&gt;
&lt;li&gt;  Report-in, meaning the driver reports and presents ideas and recommendations to the group.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that there is no attempt to generate consensus. The group evaluates and commits to a direction, regardless if there is unanimous agreement or not. Strong leadership is required to make this work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generate
&lt;/h2&gt;

&lt;p&gt;The "generate" part of "Generate apart, evaluate together" refers to the solitary or small group activities of an individual who works to drive the creation of proposals and detailed solutions to present to the larger group. Such activities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Study problems&lt;/li&gt;
&lt;li&gt;  Identify research strands and do research.&lt;/li&gt;
&lt;li&gt;  Collect information.&lt;/li&gt;
&lt;li&gt;  Identify solutions.&lt;/li&gt;
&lt;li&gt;  Write proposals, documentation, user stories.&lt;/li&gt;
&lt;li&gt;  Estimate user stories.&lt;/li&gt;
&lt;li&gt;  Write/test/maintain code.&lt;/li&gt;
&lt;li&gt;  Experiment.&lt;/li&gt;
&lt;li&gt;  Report-out (meaning the driver reports to the group the results of research, investigation, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  MindMap
&lt;/h2&gt;

&lt;p&gt;For future reference, you can remember the main ideas of this method with a MindMap:&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;I didn't invent the catchphrase "Generate apart, evaluate together," but I am not sure who did, where I heard it, or what was the original intent. I tried to find out, but Google didn't help much. Regardless, in this post, I described how I use it, what it means to me, and what kinds of problems it resolves. I used this model for a long time, and I only recently gave it a tagline that sticks to mind and can be used to describe the method without too much necessary explanation.&lt;/p&gt;




&lt;h3&gt;
  
  
  If you enjoyed this article, keep in touch!
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.coderhood.com" rel="noopener noreferrer"&gt;Find all my posts on CoderHood. Don't forget to Subscribe to receive notifications of new posts by Email.&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/lpasqualis/" rel="noopener noreferrer"&gt;Join my professional network on LinkedIn.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/lpasqualis" rel="noopener noreferrer"&gt;Follow me on Twitter.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/coderhood/" rel="noopener noreferrer"&gt;Join my Facebook page.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And finally, follow me here on dev.to!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>design</category>
      <category>advice</category>
      <category>leadership</category>
      <category>teamwork</category>
    </item>
    <item>
      <title>5 Reasons Why I Love Being Wrong</title>
      <dc:creator>Lorenzo Pasqualis</dc:creator>
      <pubDate>Tue, 13 Mar 2018 17:23:33 +0000</pubDate>
      <link>https://dev.to/lpasqualis/5-reason-why-i-love-being-wrong--4f58</link>
      <guid>https://dev.to/lpasqualis/5-reason-why-i-love-being-wrong--4f58</guid>
      <description>&lt;p&gt;This post was first published in its entirety on &lt;a href="https://coderhood.com" rel="noopener noreferrer"&gt;CoderHood&lt;/a&gt; as &lt;a href="https://www.coderhood.com/5-reason-why-i-love-being-wrong/" rel="noopener noreferrer"&gt;5 Reason Why I Love Being Wrong&lt;/a&gt;. CoderHood is a blog dedicated to the human dimension of software engineering.&lt;/p&gt;

&lt;p&gt;When I was programming 100% of my time, it was my job to write robust and maintainable code. My work needed to be well documented, designed with the proper level of abstraction and as bug-free and efficient as possible. I also had to come up with good ideas for how to resolve problems and create viable products.&lt;/p&gt;

&lt;p&gt;As a developer, I had to be right a lot of the time. Being wrong when writing code resulted in bugs and other issues. Regardless of code reviews and testing, dumb ideas in software code have a way of costing an ever-increasing tax.&lt;/p&gt;

&lt;p&gt;In my executive role, things are very different. It is an entirely different job. My primary responsibilities are to hire great people, create the best environment for them to thrive and be productive, make sure reality is well defined and make sure that we make good decisions.&lt;/p&gt;

&lt;p&gt;In my job, it helps if I have good ideas, but it does not mean that I have to come up with the best ones. It just means that I have to make sure the best ideas surface to the top, regardless where they are coming from or who is coming up with them. I am entirely responsible for my team's results. I am not responsible for putting a thumbprint on everything my team does.&lt;/p&gt;

&lt;h2&gt;
  
  
  On Being Wrong
&lt;/h2&gt;

&lt;p&gt;I don't deny it. Most of the time I have an opinion. It is part of my job to have informed opinions, but I don't expect them to be always right. I hire people way smarter than me to come up with better ideas than mine.&lt;/p&gt;

&lt;p&gt;When having discussions with my teams, I don't mind being wrong. In fact, I like it. I could even go as far as to say that I love being wrong, at least in hindsight.&lt;/p&gt;

&lt;p&gt;I don't try to be wrong; quite the opposite. I do my absolute best to be well informed, have good arguments and learn whatever I can to ensure that I am right as often as possible. If I were wrong every time I opened my mouth, eventually my team would lose confidence in my abilities, and that would make it impossible for me to lead.&lt;/p&gt;

&lt;p&gt;Despite trying hard, I am wrong a lot. That is the joy and the burden of hiring smart people. They don't let the boss get away with BS, and that is awesome! I would not want it in any other way.&lt;/p&gt;

&lt;p&gt;Most importantly, when I try to be right and I realize I am not and, as a result, the right decision is made, that's when I win. It might seem like an Alice in Wonderland upside-down logic, but let me explain what I mean by giving you five reasons.&lt;/p&gt;

&lt;h3&gt;
  
  
  #1 -- If I challenge a good idea with a bad one, the good one gets stronger
&lt;/h3&gt;

&lt;p&gt;If somebody in my team has an opinion and I test it, if it is a good idea then it grows and becomes stronger. If it is a bad idea, then it dies or takes a different direction. Either way, we made progress.&lt;/p&gt;

&lt;p&gt;To make progress, it almost doesn't matter if my challenge is right or wrong. For things that are important, it does matter that I don't let the first idea that sounds good take hold without some more in-depth scrutiny.&lt;/p&gt;

&lt;p&gt;I am not advocating that you should challenge everything anybody says 100% of the time. That's just annoying, and sometimes you just need to trust people. Extremes are never a good thing. I am suggesting that, when something matters, it should get scrutinized even if it sounds good.&lt;/p&gt;

&lt;h3&gt;
  
  
  #2 -- When I am wrong, somebody else in my team is right
&lt;/h3&gt;

&lt;p&gt;When I voice an opinion, I am convinced that it is right, unless I am playing devil's advocate, which sometimes I do. However, my job is not to be right; my job is to make sure the right decisions surface. Getting to the best idea is what counts. I do need to be careful to recognize when an idea is better than mine; but, as long as I listen and keep my eyes and ears open, that's usually not a problem.&lt;/p&gt;

&lt;p&gt;I am not THE judge of ideas either. Everybody in my team is a judge of ideas. My job is to listen to the many angles, including mine, and choose the one that passes scrutiny and is on the right path to achieving the company's high-level goals.&lt;/p&gt;

&lt;p&gt;When somebody proves my opinion to be wrong, we both made forward progress and everybody wins. It is crucial to abandon bad and distracting ideas for better ones, no matter who was the author. That is what leads to good decisions and outcomes. If I have a bad idea that helps someone come up with a better one, we made progress, and everyone wins, including me.&lt;/p&gt;

&lt;p&gt;The worse thing that can happen is not being wrong. The worse thing that can happen is when nobody can come up with something that can survive scrutiny. If that happens, it is on me as I apparently haven't hired the right people or I haven't provided my people the right opportunities or environment to do what they need to do.&lt;/p&gt;

&lt;h3&gt;
  
  
  #3 -- When I am wrong, I learn
&lt;/h3&gt;

&lt;p&gt;I don't deny it. Being right about something makes me feel good, and who doesn't like to feel good? I know I do. However, if I were right all the time, I wouldn't learn anything.&lt;/p&gt;

&lt;p&gt;As long as the team ends up making the right decision, I much prefer to be wrong and learn, than to be right and stay stagnant. Stagnation is my definition of hell.&lt;/p&gt;

&lt;h3&gt;
  
  
  #4 -- When I am wrong, I grow
&lt;/h3&gt;

&lt;p&gt;Whenever I am wrong, I learn something, but I also grow an inch. Realizing that I am wrong is a way to become more mature and resilient to the next challenge, and it thickens my skin. Next time in a similar situation I'll be able to apply what I learned and help the team make progress.&lt;/p&gt;

&lt;p&gt;Now, again, I am not talking about extremes. Being wrong most of the time would eventually destroy me. There is a sweet spot and a healthy ratio when it comes to "growth by being wrong." I have learned that everything in life is a &lt;a href="https://www.coderhood.com/5-reason-why-i-love-being-wrong/" rel="noopener noreferrer"&gt;bell curve&lt;/a&gt;, and extremes are rarely healthy.&lt;/p&gt;

&lt;h3&gt;
  
  
  #5 -- When I am wrong, progress is being made
&lt;/h3&gt;

&lt;p&gt;Imagine a totalitarian regime where the dictator must always be right by law. Nobody is allowed to question anything the dictator says, and everyone must defend his decisions no matter how outlandish they are.&lt;/p&gt;

&lt;p&gt;Do you think that regime would be successful, even if the dictator is a genius? It is just impossible for one person to see reality from all points of view. Everyone has blind spots, bias and a limited understanding of reality. Different ideas and a constant search for the best ones is what enables progress and innovation.&lt;/p&gt;

&lt;p&gt;As long as there is an open debate and the best ideas survive, progress is being made, regardless who had a good idea and who was wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some Final Thoughts
&lt;/h2&gt;

&lt;p&gt;In the software industry, everything is the result of teamwork. Every once in a while you need a genius to plant a fantastic and revolutionary seed, but the plant will not grow unless it is cultivated by open dialog, collaboration and an "idea meritocracy" environment.&lt;/p&gt;

&lt;p&gt;An idea meritocracy is a decision-making environment where the best ideas win. To create it, you must give an opportunity for people to put their thoughts on the table for everyone to see, have constructive disagreements, and have a protocol to get past any conflicts that remain. That protocol could be "the boss decides." It doesn't matter as long as a decision is made that has the best chance of being the right decision. No decision is the worst decision.&lt;/p&gt;

&lt;p&gt;In an idea meritocracy, it doesn't matter who is right or wrong. It only matters that the best ideas survive and thrive.&lt;/p&gt;




&lt;h3&gt;
  
  
  If you enjoyed this article, keep in touch!
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.coderhood.com" rel="noopener noreferrer"&gt;Find all my posts on CoderHood. Don't forget to Subscribe to receive notifications of new posts by Email.&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/lpasqualis/" rel="noopener noreferrer"&gt;Join my professional network on LinkedIn.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/lpasqualis" rel="noopener noreferrer"&gt;Follow me on Twitter.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/coderhood/" rel="noopener noreferrer"&gt;Join my Facebook page.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And finally, follow me here on dev.to!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>career</category>
      <category>advice</category>
      <category>leadership</category>
    </item>
    <item>
      <title>How to Lead Change, a Primer</title>
      <dc:creator>Lorenzo Pasqualis</dc:creator>
      <pubDate>Wed, 07 Feb 2018 20:47:24 +0000</pubDate>
      <link>https://dev.to/lpasqualis/how-to-lead-change-a-primer--7ee</link>
      <guid>https://dev.to/lpasqualis/how-to-lead-change-a-primer--7ee</guid>
      <description>&lt;p&gt;This post was first published (complete with images) on &lt;a href="https://coderhood.com" rel="noopener noreferrer"&gt;CoderHood&lt;/a&gt; as &lt;a href="https://www.coderhood.com/lead-change-primer/" rel="noopener noreferrer"&gt;How to Lead Change, a Primer&lt;/a&gt;. CoderHood is a blog dedicated to the human dimension of software engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  On Change
&lt;/h2&gt;

&lt;p&gt;Leo Tolstoy famously said, &lt;em&gt;"Everyone thinks of changing the world, but no one thinks of changing himself.&lt;/em&gt;" Tolstoy's words are true today as much as they were true in his time. Life in the 1800s was very different, but people were not.&lt;/p&gt;

&lt;p&gt;Today's tech industry, populated by smart people pushing hard to innovate one line of code at the time, is no exception. Intelligence comes with strong opinions and personalities. If you've worked in teams for a while, at some point, you probably wished that somebody could be more pleasant or reasonable.&lt;/p&gt;

&lt;p&gt;In this dissertation, I take you on a guided tour of my model of individual and team dynamics in relation to change. In particular, I visit what I believe are essential aspects of the human condition that affect the mechanics of change for people and teams working on challenging problems with common goals. Since my expertise is in software making, I wrote with software developers and software engineering teams in mind. However, the same concepts most likely apply to a broader spectrum of realities.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Defines An Individual
&lt;/h2&gt;

&lt;p&gt;Change involves people, and people follow patterns that are rooted in what you could call "internal programming," or human firmware. To define a model of understanding of players in a team of software makers, I like to think of human firmware as defined by three main components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Personality&lt;/strong&gt;. You can envision personality as a lens that people use to look at the world or a set of filters that trigger our responses. Personality forms very early in life as the result of a combination of biological, parental, and social influences.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Habits&lt;/strong&gt;. Habits are things that people repeatedly do, settled tendencies and practices.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Beliefs&lt;/strong&gt;. Beliefs are a combination of knowledge, experience, accepted models of reality, data, facts, plans and views that we came to trust and believe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The combination of personality, habits, and beliefs determine the &lt;strong&gt;behavior&lt;/strong&gt; of an individual. Personality, habits, and beliefs are not necessarily consistent. In fact, as we'll see later, sometimes they evolve to be at odds with each other. When they are inconsistent, you have a state of &lt;strong&gt;cognitive dissonance&lt;/strong&gt; which can create erratic behaviors, unhappiness, concerns, panic, and chaos.&lt;/p&gt;

&lt;h2&gt;
  
  
  People Resist Change
&lt;/h2&gt;

&lt;p&gt;Ironically, we humans tend to resist change despite a desire to build innovations and influence others. We push for change because we need to modify the world to align it with our beliefs, thus actually reducing change. In other words, we are driven to change the world so that we don't have to change who we are.&lt;/p&gt;

&lt;p&gt;Change erodes people's comfort zone, transforming familiar, known and understood realities into an unclear and potentially risky vacuum. Even though most things in life are unknown, unknowns are scary because they challenge our beliefs and habits; they are similar to shadows lurking in the dark that could jump out to get us.&lt;/p&gt;

&lt;p&gt;Despite our comfort with the familiar, we do not know what is going to happen tomorrow. We like to believe that it will be just like today. Given that we operate guided in large part by habits, more often than not we are right. We'll get up at the usual time, eat the usual food, commute to the usual workplace and work on the usual stuff. Sounds boring, but it is comforting and reassuring.&lt;/p&gt;

&lt;p&gt;We are well aware that something unexpected could happen anytime, but chances are it won't, so we like to look at the road ahead as well paved, stable and well known. We make bets on stability and inertia, and we are usually right until we aren't.&lt;/p&gt;

&lt;h2&gt;
  
  
  People Don't Change Easily
&lt;/h2&gt;

&lt;p&gt;Change is difficult because people, at their core, don't change quickly. Habits are hard to eradicate, and personalities have deep and strong roots. However, innovation requires constant change. Moreover, in the tech industry change is inevitable. The choices are to either deliberately design it and make it happen or to let it happen organically. Experience shows that a deliberate design brings better results, in most cases.&lt;/p&gt;

&lt;p&gt;When change is needed, leadership pops into the picture; change management is one of the fundamental reasons for leadership to exist. Since most people dislike change, it is a responsibility, privilege, and burden of leadership to push for it. It is critical for leaders, who need to stay one level above the weeds and the minute details, to learn how to make it happen without generating panic and chaos and before external or uncontrollable factors force it.&lt;/p&gt;

&lt;p&gt;The type of change that the tech industry push for is technological. However, leaders sometimes make the mistake of blurring the lines between technology, processes, and people. The risk is falling into the trap of wishing they could change people to make them fit a mold, plan or structure. That is a fallacy that, if unchecked, can have serious consequences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Changing People
&lt;/h2&gt;

&lt;p&gt;In general, you can't force people to change; they won't, and in most cases, you don't want them to. The unique prospectives and points of view that different people bring to the table are very valuable agents of innovation. Innovation without a diversity of ideas is like a meal without a variety of ingredients: bland and not very exciting.&lt;/p&gt;

&lt;p&gt;In some cases, changing people's way to operate is necessary for the health of an organization. However, it is essential to understand what kind of change is needed or even possible. As we have seen earlier, when it comes to people, three main aspects could be the focus of change: habits, personalities, and beliefs. Those are very different, and I am going to discuss them separately.&lt;/p&gt;

&lt;h3&gt;
  
  
  Changing People's Habits
&lt;/h3&gt;

&lt;p&gt;When somebody displays an undesirable habit, the temptation is to eliminate it. However, when you remove a habit, you leave a void. Our brain inevitably tries to resist change, and that void becomes subject to great inner-pressure. Without significant work, old habits tend to come back to fill the gap. As a result, eliminating a habit can be difficult. It is much easier to substitute bad old habits with good new ones, neutralizing the void and avoiding the pressure.&lt;/p&gt;

&lt;p&gt;As a specific example, a classic "bad habit" of software engineers is to sit in one-on-one meetings with an open laptop. While a computer might be necessary in some cases (for example, during working sessions), it doesn't help one-on-one meetings where a closer personal connection is more desirable than the ability to take or read notes (or emails, or who knows what else). The vertical screen creates a barrier between two people and introduces a significant distraction.&lt;/p&gt;

&lt;p&gt;If someone has the habit of taking or reading notes using a laptop during one-on-one meetings, a solution is to substitute the laptop with a traditional paper-notepad and a pen. Once you get used to it, it becomes a natural, healthy and beneficial habit. Personally, I take notes by hand, scan them (or take a picture with my phone) and upload the images on Evernote which has excellent OCR capabilities. Once in Evernote, I can do text-based searches, making it easy to find what I am looking for, anytime. If there is information I need during a one-on-one meeting, I write it down on my notepad before the meeting. That gives me what I need and also functions as meeting preparation.&lt;/p&gt;

&lt;p&gt;If you are helping someone to change a habit, suggesting a new one is an excellent way to make progress. However, since change is hard, the person you are helping must want it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Changing People's Personalities
&lt;/h3&gt;

&lt;p&gt;I fundamentally do not believe that changing somebody's personality is desirable or realistic. Personality is more than a habit. It is the signature of an individual, a representation of who somebody is.&lt;/p&gt;

&lt;p&gt;In theory, if somebody's specific personality-traits get in the way of their goals, it is possible for a good coach to help to make measurable progress over an extended period. However, for somebody to be coachable on a personality trait they need to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Understand the necessity of the change and the potential benefits, both professionally and personally.&lt;/li&gt;
&lt;li&gt; Seek help first (instead of being forced to seek help).&lt;/li&gt;
&lt;li&gt; Find a trusted coach.&lt;/li&gt;
&lt;li&gt; Be willing to work with the coach.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In other words, the coach can only be available to "support" the change and provide guidance and feedback, not force it.&lt;/p&gt;

&lt;h4&gt;
  
  
  Otherwise, Do Not Even Try
&lt;/h4&gt;

&lt;p&gt;Unless the situation satisfies the four conditions above, I do not believe in attempting to adjust somebody's personality. That is true in all situations, but especially in business. It is a questionable thing to consider for the following reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Even if you could (you can't), you would not want to create a team of people with the same personality traits. Lack of diversity reinforces bad habits, kills innovation, creates group-think and slows down progress.&lt;/li&gt;
&lt;li&gt;  The investment is too great; it would take years and is probably impossible.&lt;/li&gt;
&lt;li&gt;  Who said that "your way" is better? Even if it was better in the specific business context, people have a life outside of work, and their personality is what brought them there. They are who they are. Wanting to change them is arrogant and misguided.&lt;/li&gt;
&lt;li&gt;  If in some business context somebody's personality prevents them from being able to do their job, the organization should evaluate options. Attempting to change the person's personality should, in most cases, not be one of them. If there are no options, the organization should provide a generous severance package and cut ties. It is best for the organization and the individual.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Changing People's Beliefs
&lt;/h3&gt;

&lt;p&gt;Beliefs come in the form of knowledge, accepted models of reality, data, facts, and plans. Beliefs are the only aspect of people that you can genuinely influence as part of a healthy organization.&lt;/p&gt;

&lt;p&gt;In tech, reality changes all the time and beliefs need to be adjusted continuously to describe the world accurately. Changing somebody's beliefs can take the shape of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Education and training&lt;/strong&gt;. Often beliefs are rooted in ignorance. If there are existing knowledge and materials that explain something, education and training is by far the best way to change somebody's beliefs.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Brainstorming&lt;/strong&gt;. If there is not enough existing knowledge and material to study, brainstorming can be an excellent way to align the beliefs of a group of people.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Decision and commitment&lt;/strong&gt;. Sometimes there are many different ways to look at a particular issue, and no single belief or interpretation of the data seems to be perfect. Usually, that occurs when there is not enough information. In that case, if you can't gather more information, making a decision and a commitment to a specific approach and way of thinking might be necessary. Decisions and commitments eventually become new beliefs.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Logical arguments&lt;/strong&gt;. Most of the time there is not enough specific information to guide the formation of beliefs. However, often some logical arguments and deductions can be applied to available data in combination with observations and (shudder) some &lt;a href="https://www.coderhood.com/assumption-evil-mother-mistakes/" rel="noopener noreferrer"&gt;assumptions&lt;/a&gt;. For example, when you walk you don't know for sure that the ground in front of you will be able to hold your weight. You don't and can't have enough information to make that decision without the shadow of a doubt. However, if the ground looks stable, you can reasonably believe that it is stable. That belief, formed by the visual information you have, experience and a few low-risk assumptions, is what allows you to walk freely every day.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Changing People's Behaviors
&lt;/h3&gt;

&lt;p&gt;Behaviors are due to a combination of habit, personality, and beliefs. As mentioned above, I believe that it is possible to influence the habitual or the belief parts of behavior, but it is neither practical nor desirable to change the personality aspects of it.&lt;/p&gt;

&lt;p&gt;Leaders who need to influence somebody's behavior must be able to differentiate between those aspects. They can help morph unproductive habits into healthier ones, change incorrect beliefs into correct ones, but should avoid attempting to change people's personalities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Change Management in The Software Industry
&lt;/h2&gt;

&lt;p&gt;The software industry is, in many ways, no different from any situation where groups of smart people work together to resolve difficult problems. Intelligent people often have strong opinions, and strong opinions are usually associated with difficult personalities.&lt;/p&gt;

&lt;p&gt;Leaders must learn to analyze patterns of people and group behavior to discern what aspects of it is due to personalities, habits, and beliefs. Change management is a subtle art that takes years of deliberate practice to master but brings great rewards.&lt;/p&gt;

&lt;p&gt;Change is hard, but in the software industry, it is a fact of life.&lt;/p&gt;




&lt;h3&gt;
  
  
  If you enjoyed this article, keep in touch!
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.coderhood.com" rel="noopener noreferrer"&gt;Find all my posts on CoderHood. Don't forget to Subscribe to receive notifications of new posts by Email.&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/lpasqualis/" rel="noopener noreferrer"&gt;Join my professional network on LinkedIn.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/lpasqualis" rel="noopener noreferrer"&gt;Follow me on Twitter.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/coderhood/" rel="noopener noreferrer"&gt;Join my Facebook page.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And finally, follow me here on dev.to!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>career</category>
      <category>advice</category>
      <category>leadership</category>
    </item>
    <item>
      <title>10 Top Reasons To Have a Career in Tech</title>
      <dc:creator>Lorenzo Pasqualis</dc:creator>
      <pubDate>Mon, 08 Jan 2018 15:52:55 +0000</pubDate>
      <link>https://dev.to/lpasqualis/10-top-reasons-to-have-a-career-in-tech-44g7</link>
      <guid>https://dev.to/lpasqualis/10-top-reasons-to-have-a-career-in-tech-44g7</guid>
      <description>&lt;p&gt;This post was first published on &lt;a href="https://coderhood.com" rel="noopener noreferrer"&gt;CoderHood&lt;/a&gt; as &lt;a href="https://www.coderhood.com/10-top-reasons-to-have-a-career-in-tech/" rel="noopener noreferrer"&gt;10 Top Reasons To Have a Career in Tech&lt;/a&gt;. CoderHood is a blog dedicated to the human dimension of software engineering.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.coderhood.com/10-top-reasons-to-have-a-career-in-tech/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F03i5ymw15bdh84gj18u2.png" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you're exploring new professional opportunities, a career in tech may have caught your attention as a potential avenue. Even if you already have one, you might have reached a point where you wonder if it was the right decision.&lt;/p&gt;

&lt;p&gt;Having been in the software industry for 30+ years, I firmly believe that a career in tech, and especially programming and software engineering, is not only accessible to everyone, but it also represents a brilliant path to take in life. I am going to give you my top 10 reasons for this sentiment.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Tech jobs are not going anywhere.
&lt;/h2&gt;

&lt;p&gt;The world needs software engineers, desperately. There is not enough tech talent to satisfy the demand, and there are more ideas for software products than people to build them.&lt;/p&gt;

&lt;p&gt;Programming requires creative thinking, and machines will not easily replace it; not anytime soon, at least. It is true that today, &lt;a href="https://www.wired.com/story/googles-learning-software-learns-to-write-learning-software/" rel="noopener noreferrer"&gt;there are AIs able to generate code&lt;/a&gt;, but we are far from being to a point where programmers are going be automated out of existence.&lt;/p&gt;

&lt;p&gt;Programming requires creative thinking and a deep understanding of human needs. For this reason, I do not believe that software will be able to replace humans in the art of creating software for humans.&lt;/p&gt;

&lt;p&gt;Even if that were to happen, humans would move their focus to the next level. Instead of writing all the code, they'd write the code that is not yet possible to automatically generate, and they'd move their attention to where the human brain is required. I am actually looking forward to that kind of innovation. It will make coding even more interesting than it is today. Repetitive tasks, still very much a reality in software development, will be automated, and the most exciting parts of the work will be left to human creativity.&lt;/p&gt;

&lt;p&gt;For all of these reasons, taking computer science and programming as a career path is a very safe bet to make. You will most likely not see a world without programmers in your lifetime. On the other hand, you might see many other careers disappear out of existence.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. You can make good money while you learn.
&lt;/h2&gt;

&lt;p&gt;Many people work menial jobs while they are studying. Minimum wage jobs are popular among college students because they help pay the bills and are accessible without an education. However, programming brings "work as you study" to a whole new level. It opens up opportunities that are not available to most: well-paid activities while still in school.&lt;/p&gt;

&lt;p&gt;That has been the case for a while. When I was in college in the early '90s, I was making more money than my college professors selling my software online as &lt;a href="https://en.wikipedia.org/wiki/Shareware" rel="noopener noreferrer"&gt;shareware.&lt;/a&gt; While the term is now antiquated, the concept is very much alive. You write software, put it out there for free, and people can use it with some restriction. If somebody likes it and wants to activate all of the features, they can pay a small amount to unlock it. You might recognize that model as "demo-ware" or "freemium."&lt;/p&gt;

&lt;p&gt;Today things are easier than in the 90's. Even if you haven't completed your CS studies, it is not difficult to create software that can be distributed and sold for profit. For example, you can develop iOS applications and sell them on the App Store. With a minimal investment, Apple gives you all the tools you need to build applications and an amazing distribution channel that could make you a fortune.&lt;/p&gt;

&lt;p&gt;I am not claiming that it is easy to get rich that way; far from it. However, it is not difficult to make enough money to help pay for college tuition and living expenses for a while. If you are good, it might be the beginning of a future enterprise that could become your fulltime job when once you finish school. Ironically, if you are exceptionally good you might not even have to finish school (but, we all know that you should, right?).&lt;/p&gt;

&lt;h2&gt;
  
  
  3. You can integrate your passions with coding, whatever they are.
&lt;/h2&gt;

&lt;p&gt;When I was in middle school, I wanted to be either an artist or a software engineer. I couldn't decide until I realized that I could do both. I could take software engineering as a career, and art as a hobby. Even better, it was possible to &lt;a href="https://www.coderhood.com/generating-art-code-doodling-math-cornucopias/" rel="noopener noreferrer"&gt;integrate art and coding&lt;/a&gt;, killing two birds with one stone.&lt;/p&gt;

&lt;p&gt;No matter what your passion is, you can most likely find a way to integrate it with a career in tech. For example, if you love science, you can write software to aid scientific research. If you like writing, you can write code to help writers or a website for writers to share their work. If you love cooking, you can create applications to support cooks, or sites to share recipes. No matter what you are into, coding will integrate nicely and aid your passion.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Programmers are well paid.
&lt;/h2&gt;

&lt;p&gt;In the US, software developers median salary in 2015 was $98,260 according to Labor Department reports. The highest-paid 10% of the profession earned $153,710, and the lowest-paid earned $57,340.&lt;/p&gt;

&lt;p&gt;That was 2015, and numbers are going up. Today a talented junior developer with one year of experience can make as much as $80K, and even more. There are not many professions that pay that well from the beginning.&lt;/p&gt;

&lt;p&gt;While a CS degree helps, in the USA you can aim to a high salary without a degree. After a few years as a software engineer, if you are sharp and continue to challenge yourself, you can climb as high as your potential can push you.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Programming is like a gym for your brain.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi1.wp.com%2Fwww.coderhood.com%2Fwp-content%2Fuploads%2F2017%2F08%2Fconcept-1868728_640.jpg%3Fresize%3D640%252C426%26ssl%3D1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi1.wp.com%2Fwww.coderhood.com%2Fwp-content%2Fuploads%2F2017%2F08%2Fconcept-1868728_640.jpg%3Fresize%3D640%252C426%26ssl%3D1" alt="concept-1868728_640 10 Top Reasons To Have a Career in Tech people learning career advice   " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To build a healthy physique, you exercise by performing movements that challenge your body. Similarly, to keep your brain in shape, you need to exercise it by solving difficult mental problems. Coding is similar to lifting weights for the brain.&lt;/p&gt;

&lt;p&gt;Research has found that learning to perform challenging tasks can keep cognitive functions sharp as we age. However, to be effective, the tasks need to be new and stimulating. In other words, you can expect to keep your mind sharp by doing the same thing over and over your entire life.&lt;/p&gt;

&lt;p&gt;When developers work on challenging projects, they can push their brains to the limit on new and stimulating problems. Their mind has to stretch to create models and abstractions; such mental exercise makes developers very flexible thinkers.&lt;/p&gt;

&lt;p&gt;Moreover, developers operate in a virtual laboratory where they can make small changes to solutions, and observe the effects immediately. As a result, their brain is subject to a feedback loop that challenges and corrects their mental powers at once. It is like having a personal coach who observes and corrects mistakes, continuously and tirelessly.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Your career in tech can grow indefinitely; the sky is the limit.
&lt;/h2&gt;

&lt;p&gt;Software developers can code their entire career and never stop growing. Like &lt;a href="https://www.coderhood.com/7-ranks-coder-programmer-computer-scientist-developer-engineer-architect/" rel="noopener noreferrer"&gt;martial artists&lt;/a&gt;, age does not prevent them from making progress. One can continue learning and growing almost indefinitely through the corporate ranks. Mastery and wisdom come with practice, and practice keeps mental functions active, preparing you for the next challenge.&lt;/p&gt;

&lt;p&gt;Even if a developer doesn't want to code forever, there are career progressions that can lead to many different places. For example, developers often become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Executives.&lt;/li&gt;
&lt;li&gt;  Entrepreneurs.&lt;/li&gt;
&lt;li&gt;  Consultants, helping other companies achieve their goals.&lt;/li&gt;
&lt;li&gt;  Inventors.&lt;/li&gt;
&lt;li&gt;  Speakers.&lt;/li&gt;
&lt;li&gt;  Teachers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are no limits to the career growth possibilities that you can have as a developer. I've even seen developers easily change careers paths to become successful lawyers, scientists, musicians, artists, etc. The mental exercise that coding provides, and exposure to many industries and problems, is a perfect launching platform to bring your influence and expertise anywhere you desire.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. You'll never run out of things to learn.
&lt;/h2&gt;

&lt;p&gt;When I started coding, the languages to learn were mostly C, Pascal, Basic and Assembly (Cobol, Fortran, and Lisp if you were interested in more specialized areas). Today many more languages, frameworks, technologies, and environments exist and continue to evolve and improve.&lt;/p&gt;

&lt;p&gt;Evolution is faster than anyone's ability to keep up with everything, and it is accelerating at a rapid pace. Large software companies are developing specialized languages and framework designed to solve their problems more naturally, and the trend is continuing and expanding.&lt;/p&gt;

&lt;p&gt;There is no way you can learn everything and keep up with all tech trends and new technologies. The problem is not running out of things to learn. The problem, if anything, is to keep current in at least a few areas.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. You'll always be challenged.
&lt;/h2&gt;

&lt;p&gt;Since there is never a shortage of things to learn, there is also no shortage of challenges. As a developer, there are virtually infinite problems to resolve. For each problem, there are countless ways to solve it. If you want to challenge yourself, there is always something that will do it.&lt;/p&gt;

&lt;p&gt;In my 30 years in the industry, I have never met anyone who could claim to have mastered programming skills to the point of being bored. If people get bored, it happens because they are not looking for challenges or because they are interested in a career path change.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Programming is a lot of fun.
&lt;/h2&gt;

&lt;p&gt;If you like to keep your mind busy and resolve problems, programming is a lot of fun. There are always problems and technologies that can challenge and capture the attention of every personality type, aspiration, intelligence level and passion.&lt;/p&gt;

&lt;p&gt;When you get bored with a technology, you can change and move to something else. When you get tired of a company, you can move to the next one; there are countless organizations hiring developers, and most of them are desperately looking for talent. When you get bored with a particular industry, you can find a different one where you can apply your skills. In the process, you learn a lot about many different things.&lt;/p&gt;

&lt;p&gt;For example, I have been personally involved with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Embedded systems.&lt;/li&gt;
&lt;li&gt;  Telephone answering systems (back in the '80s)&lt;/li&gt;
&lt;li&gt;  Real estate.&lt;/li&gt;
&lt;li&gt;  Shareware.&lt;/li&gt;
&lt;li&gt;  Marketing.&lt;/li&gt;
&lt;li&gt;  Mobile applications.&lt;/li&gt;
&lt;li&gt;  Large-scale web hosting.&lt;/li&gt;
&lt;li&gt;  Web development.&lt;/li&gt;
&lt;li&gt;  Search.&lt;/li&gt;
&lt;li&gt;  Computer language design and development tools and platforms.&lt;/li&gt;
&lt;li&gt;  Virtual machines.&lt;/li&gt;
&lt;li&gt;  UI and UX.&lt;/li&gt;
&lt;li&gt;  Learning systems and narrow AI.&lt;/li&gt;
&lt;li&gt;  Big Data and reporting.&lt;/li&gt;
&lt;li&gt;  2D Image filtering and elaboration.&lt;/li&gt;
&lt;li&gt;  3D image rendering and raytracing.&lt;/li&gt;
&lt;li&gt;  Micro-controllers and IoT.&lt;/li&gt;
&lt;li&gt;  Education Technology.&lt;/li&gt;
&lt;li&gt;  Cloud computing.&lt;/li&gt;
&lt;li&gt;  SOA (Service Oriented Architectures)&lt;/li&gt;
&lt;li&gt;  SAS (Software as a Service)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each of these areas, I just scratched the surface. There is practically no end to the depth and breadth potentials in any field, and there are so many areas and industries to explore that the fun will never end.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. You can work everywhere in the world without having to re-learn everything.
&lt;/h2&gt;

&lt;p&gt;I studied CS in Italy and worked there for many years. At 26 I got married to my American wife and moved to the US. The skills that I acquired in Italy were the same skills I needed in the US. I didn't have to relearn anything. When I came to the States I made a few phone calls, showed up for an interview, did some familiar C coding on a whiteboard, and got hired. It took about two weeks to find a well-paid job, even if it was my first time in the states.&lt;/p&gt;

&lt;p&gt;Programming is like a lingua franca. No matter where you learn it, it stays the same everywhere you go. It is similar to a career passport for the world. It can bring you anywhere and everywhere.&lt;/p&gt;

&lt;p&gt;The same cannot be claimed for many other career paths. For example, if you study law, you usually only learn the law of a particular country or even state (unless you specialize in international law). If you are a doctor, your license needs to transfer if you want to change geographical area. If you study political science, your knowledge mostly applies directly to a particular government. In other words, many fields are localized, and they don't easily transfer to other places.&lt;/p&gt;

&lt;p&gt;With computer science and programming what you learn somewhere in the world is immediately applicable anywhere. There are no certifications or licenses that need to transfer, and there are no language barriers. Everything in technology is universally in English; you learn it once, and it follows you anywhere. How cool is that?&lt;/p&gt;

&lt;p&gt;Why does it matter? Let's say that you find love in a foreign country and you decide to move there. As a programmer, once you can legally work in the country, you can just go there and do it. No extra schooling is generally needed. Coding skills open the door to interviews and jobs without geographical obstacles. It is pretty amazing. If you have the skills, you can also work 100% remotely for any company in the world without having to move at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;A career in tech is fun, makes you a better thinker, keeps you mentally young, gives you a passport to companies everywhere in the world, keeps you challenged, is not going to be automated out of existence, pays well and is compatible with whatever passions you might have.&lt;/p&gt;

&lt;p&gt;Even if math is not your strength, there is much coding you can do without advanced math knowledge. You don't necessarily need a CS degree, and there are many informal ways to learn.&lt;/p&gt;

&lt;p&gt;If you are in tech, you made a great choice. If you are thinking about tech, I hope this list of reasons will give you a little more confidence in making that step. You won't regret it. I promise.&lt;/p&gt;




&lt;h3&gt;
  
  
  If you enjoyed this article, keep in touch!
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.coderhood.com" rel="noopener noreferrer"&gt;Find all my posts on CoderHood. Don't forget to Subscribe to receive notifications of new posts by Email.&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/lpasqualis/" rel="noopener noreferrer"&gt;Join my professional network on LinkedIn.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/lpasqualis" rel="noopener noreferrer"&gt;Follow me on Twitter.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/coderhood/" rel="noopener noreferrer"&gt;Join my Facebook page.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And finally, follow me here on dev.to!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>career</category>
      <category>advice</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Generating Art With Code: Doodling, Math And Cornucopias</title>
      <dc:creator>Lorenzo Pasqualis</dc:creator>
      <pubDate>Tue, 02 Jan 2018 20:15:53 +0000</pubDate>
      <link>https://dev.to/lpasqualis/generating-art-with-code-doodling-math-and-cornucopias-12j2</link>
      <guid>https://dev.to/lpasqualis/generating-art-with-code-doodling-math-and-cornucopias-12j2</guid>
      <description>&lt;p&gt;This post was first published on &lt;a href="https://coderhood.com" rel="noopener noreferrer"&gt;CoderHood&lt;/a&gt; as &lt;a href="https://www.coderhood.com/generating-art-code-doodling-math-cornucopias/" rel="noopener noreferrer"&gt;Generating Art With Code: Doodling, Math And Cornucopias&lt;/a&gt;. CoderHood is a blog dedicated to the human dimension of software engineering.&lt;/p&gt;




&lt;p&gt;I have a compulsive need to create art; I also have a lifelong love for coding. The two passions are compatible and interrelated. Coding and Math can generate artistic visions. In this post, I show how I created a program to draw doodles formed by tangles of "Cornucopias" swimming in space.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doodling for Life
&lt;/h2&gt;

&lt;p&gt;If you are a reader of my blog, you know that every Tuesday I publish a hand-drawn meeting doodle from my Moleskine. Recently I have been doodling an interesting shape that, for some reason, I enjoy looking at. I call it a cornucopia because it resembles an elongated and twisted goat horn. You can see an example &lt;a href="https://www.coderhood.com/doodle-tuesday-tangle-scrolls/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This week Doodle is based on that concept, but it is a bit different and much more elaborate. Here it is:&lt;/p&gt;

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

&lt;p&gt;As you can probably guess, I didn't draw this with a pen and paper. I wish I were that good. Instead, I "drew it" with code and math, and I am going to show you how I did it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doodle Generator
&lt;/h2&gt;

&lt;p&gt;During the holidays, in between eggnog and Christmas cookies, I decided to do a little side project to keep my coding skills sharp and satisfy my compulsive artistic urges. I created a &lt;a href="http://www.processing.org/" rel="noopener noreferrer"&gt;Processing&lt;/a&gt; (pretty much Java) sketch to automatically generate art pieces composed by cornucopias floating in 3D space.&lt;/p&gt;

&lt;p&gt;I started off with a clear vision of what the final result had to be. My intent was to convey a sense of motion and a sense of "entanglement." I also wanted to generate many random variations of the doodle to have material to make a selection for the most visually pleasing one. Additionally, I tried to make the code easily very configurable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cornucopia Theory
&lt;/h2&gt;

&lt;p&gt;A cornucopia as defined in this context is probably a bit different than what you'd expect. It is a 3D shape generated by extruding a spiral along a Bézier spline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Spiral
&lt;/h3&gt;

&lt;p&gt;A spiral is defined by the position of its center, a small radius r, a large radius R &amp;gt; r, an angle alpha, a number of FULL loops L &amp;gt;= 0 and an angle beta.&lt;/p&gt;

&lt;p&gt;Here is an example with r=1, R=2.5, alpha=-30°, beta=60° and L=3:&lt;/p&gt;

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

&lt;p&gt;You can also eliminate the need of having both L and beta by simply specifying an angle theta = (360*L)+beta. In the example above, theta = 1140°.&lt;/p&gt;

&lt;p&gt;A cornucopia is a 3D shape, and it needs some "thickness." To create it, I simply doubled the spiral by drawing two spirals with the same r (or close to the same), alpha, beta and L, but slightly different values for R. Here is an example:&lt;/p&gt;

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

&lt;p&gt;After removing the labels from the image, the shape of the spiral becomes clearer:&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Bézier Spline
&lt;/h3&gt;

&lt;p&gt;A cornucopia extends through a path following a Bézier Spline, that is a curve that intersects a given number of points in space. The following is a 2D example of a spline defined by 8 points:&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Spiral Radius Along The Spline
&lt;/h3&gt;

&lt;p&gt;The cornucopia starts with a large head and ends with a narrow tail; it kind of resembles a trumpet. After playing with various formulas, I settled for an exponential radius, which results in a shape with a section like this:&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Putting all together
&lt;/h3&gt;

&lt;p&gt;Finally, the cornucopia is formed as the result of an extrusion of a spiral along a spline in 3D space. Imagine stretching a spiral along a spline and creating a trumpet-like shape with an exponential radius from head to tail.&lt;/p&gt;

&lt;p&gt;Here an example rotated in various directions:&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Automatically Generated Doodle
&lt;/h3&gt;

&lt;p&gt;The Doodle Generator uses all of this "theory" to create an image with a large number of random cornucopias oriented with the head in the general direction of the observer. The program also allows the selection of a texture image to finalize the effect to a pleasant composition and the positioning of the lighting source.&lt;/p&gt;

&lt;p&gt;I showed you an example of the final product at the beginning of this post; let me show you a few more.&lt;/p&gt;

&lt;p&gt;Without texture:&lt;/p&gt;

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

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

&lt;p&gt;One with a single texture texture:&lt;/p&gt;

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

&lt;p&gt;And one with multiple textures:&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Show Me The Code!
&lt;/h2&gt;

&lt;p&gt;The source code of the result can be found &lt;a href="https://github.com/lpasqualis/CornucopiaArt" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Note: Processing sketches are generally not applications designed to be used by non-technical people. They are usually compact pieces of code built with the sole purpose of generating images or animations. My Cornucopia Art sketch is not an exception, and changing its parameters requires changing the code.&lt;/p&gt;

&lt;p&gt;This is a work in progress that I will continue to refine over time, especially if there is interest in the topic.&lt;/p&gt;




&lt;h3&gt;
  
  
  If you enjoyed this article, keep in touch!
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.coderhood.com" rel="noopener noreferrer"&gt;Find all my posts on CoderHood.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/lpasqualis/" rel="noopener noreferrer"&gt;Join my professional network on LinkedIn.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/lpasqualis" rel="noopener noreferrer"&gt;Follow me on Twitter.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/coderhood/" rel="noopener noreferrer"&gt;Join my Facebook page.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And finally, follow me here on dev.to!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>processing</category>
      <category>art</category>
      <category>coding</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Visualizing Company Culture And Cultural Change</title>
      <dc:creator>Lorenzo Pasqualis</dc:creator>
      <pubDate>Sat, 23 Dec 2017 23:47:17 +0000</pubDate>
      <link>https://dev.to/lpasqualis/visualizing-company-culture-and-cultural-change-407p</link>
      <guid>https://dev.to/lpasqualis/visualizing-company-culture-and-cultural-change-407p</guid>
      <description>&lt;p&gt;This post was first published on &lt;a href="https://coderhood.com" rel="noopener noreferrer"&gt;CoderHood&lt;/a&gt; as &lt;a href="https://www.coderhood.com/visualizing-company-culture-and-cultural-change/" rel="noopener noreferrer"&gt;Visualizing Company Culture And Cultural Change&lt;/a&gt;. CoderHood is a blog dedicated to the human dimension of software engineering.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/lpasqualis/CultureWaves" rel="noopener noreferrer"&gt;My Processing code used to generate the images and the animation on this post can be found clicking on this link.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.coderhood.com/visualizing-company-culture-and-cultural-change/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgfhygnn895fklf0vzhp.gif" width="8" height="4"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Company culture is an important parameter in the success of a business, especially in the tech space. It represents the environment and character where employees generate ideas and produce value. It is the personality of a company and it regulates the heartbeat of a functioning organization.&lt;/p&gt;

&lt;p&gt;Despite our desire to be in control of our environment, we are often unable to do so. Many things occur naturally, pushed by forces governed by the result of a myriad of factors that are too complex to study, understand and predict.&lt;/p&gt;

&lt;p&gt;As an example, &lt;a href="https://www.quora.com/Do-we-fully-understand-gravity" rel="noopener noreferrer"&gt;we don't fully understand gravity&lt;/a&gt;. We learned to work with it and developed mathematical models to describe the results of gravitational forces. However, we don't understand in details the mechanism that causes the gravitational pull. It might seem strange that the force that keeps us with our feet on the ground every day is still not well understood. However, that is just an example.&lt;/p&gt;

&lt;h2&gt;
  
  
  Group Interactions Are Complicated
&lt;/h2&gt;

&lt;p&gt;Another phenomenon that we struggle to understand in details is the interaction between people in a group. There are so many variables at play that it is difficult to have a clear view. We understand it at a high-level, and we learned to recognize common patterns, but we are far from having the equivalent of Newton Laws for people interactions. We only have observations and experience to guide our intuition.&lt;/p&gt;

&lt;p&gt;For example, any time that a group of people interacts for a prolonged period, it develops a personality that we call "culture." The culture of an organization is a fascinating subject that affects our lives profoundly. Cultures form in all kinds of groups: families, governments, nations, companies, institutions, schools, online communities, etc. It is hard to reconstruct with precision the events that lead to a group's culture, but we can quite clearly experience and describe it.&lt;/p&gt;

&lt;p&gt;For example, people tend to brag about daily little things on &lt;a href="http://www.facebook.com/" rel="noopener noreferrer"&gt;Facebook&lt;/a&gt;, complain on &lt;a href="http://www.twitter.com/" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;, act like annoying jerks on &lt;a href="http://www.reddit.com/" rel="noopener noreferrer"&gt;Reddit&lt;/a&gt;, be collaborative on &lt;a href="http://www.dev.to/"&gt;dev.to&lt;/a&gt;, one-up each other on &lt;a href="http://www.stackoverflow.com/" rel="noopener noreferrer"&gt;StackOverflow&lt;/a&gt;, bring out the professional side on &lt;a href="http://www.linkedin.com/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, reveal a wild-illicit side on &lt;a href="http://whisper.sh/" rel="noopener noreferrer"&gt;Whisper&lt;/a&gt; and &lt;a href="http://www.snapchat.com/" rel="noopener noreferrer"&gt;SnapChat&lt;/a&gt;, be self-centered on &lt;a href="http://www.instagram.com/" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt;, etc. Each group has a distinctive flavor and behavior, and people that are part of multiple groups tend to play the part depending on where they are interacting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Culture is Energy, Like Waves in a Body of Water
&lt;/h2&gt;

&lt;p&gt;Every person operating in a group modifies the group by broadcasting energy into the environment. People have different personalities that translate into different energy signatures. We are similar to wave generators immersed in an energy pool that both influences us and is influenced by us.&lt;/p&gt;

&lt;p&gt;In this wave model, company culture can be visualized as the result of the interaction of the effects that each employee has on the environment. Culture is the energy pattern that travels through the energy field in which the group is immersed.&lt;/p&gt;

&lt;p&gt;Since "energy field" is a concept difficult to visualize and sounds too abstract and "new agey," think of it as if it was water. Imagine that each person in a group is floating in a body of water. The movements, actions, and words of each person in the water broadcast waves with a distinctive pattern, unique to that person.&lt;/p&gt;

&lt;p&gt;A wave has many characteristics, but in this simplified analogy I'll use only three: amplitude, interval, and speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definitions And Clarifications
&lt;/h2&gt;

&lt;p&gt;Some of the terms that I use in this article are similar to terms used in physics. However, I am not attempting to make an exact parallel. In some cases, the words might have a different connotation. To avoid confusion, let me define the terms I use in this context, including their meaning in the analogy with culture.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgx4qchh8e0kohnvpoftw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgx4qchh8e0kohnvpoftw.png" alt="WaveGenNomenc Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Each &lt;strong&gt;wave generator&lt;/strong&gt; is a force immersed in the energy field that creates a unique wave. I will also use the term "&lt;strong&gt;signature&lt;/strong&gt;" as a synonymous with wave-generator. A signature is uniquely identified by its position, amplitude, interval, and speed (see below for definitions). &lt;em&gt;In the analogy:&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;  Each signature represents a member of a group.&lt;/li&gt;
&lt;li&gt;  The wave generated by the signature describes the effects that said signature has on the culture.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  A &lt;strong&gt;crest&lt;/strong&gt; is one of the high points of a wave, and a &lt;strong&gt;valley&lt;/strong&gt; is one of the low points.

&lt;ul&gt;
&lt;li&gt;  &lt;em&gt;In the analogy,&lt;/em&gt; crests and valleys represent the peaks of influence generated by a member of the group.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Amplitude&lt;/strong&gt; is the delta of the energy between a crest and a valley. A wave with a large amplitude is more intense than a wave with a small one.

&lt;ul&gt;
&lt;li&gt;  &lt;em&gt;In the analogy,&lt;/em&gt; the amplitude of a wave generated by a member of the group is proportional to the intensity of the influence that such person has on the culture of the organization. Greater amplitude means a higher degree of importance.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Speed&lt;/strong&gt; is the traveling speed of a crest (or valley). In other words, it is the quantity of energy per unit of time (velocity) pushed through the energy field.

&lt;ul&gt;
&lt;li&gt;  &lt;em&gt;In the analogy,&lt;/em&gt; the speed of a wave represents a unique characteristic of the influence of the signature generating it.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Interval&lt;/strong&gt; refers to the distance between two consecutive crests. Shorter distance results in more turbulence (irregular changes and movements).

&lt;ul&gt;
&lt;li&gt;  &lt;em&gt;In the analogy,&lt;/em&gt; a shorter interval represents higher cultural turbulence.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Waves expand radially from the wave generator. When different waves interact, they sum or cancel each other, forming an &lt;strong&gt;interference pattern&lt;/strong&gt;, or &lt;strong&gt;pattern&lt;/strong&gt;.

&lt;ul&gt;
&lt;li&gt;  &lt;em&gt;In my analogy,&lt;/em&gt; the interference pattern represents the culture of the group.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5fqqqznhto78dh6iptng.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5fqqqznhto78dh6iptng.jpg" alt="rain-65484_1280 Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="768" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Company Culture Patterns
&lt;/h1&gt;

&lt;p&gt;Using this analogy, company culture depends on the unique signature of each employee. If you introduce a new member to the team or modify an existing one, the pattern changes.&lt;/p&gt;

&lt;p&gt;To create a visual representation of the concepts described in this article, I wrote &lt;a href="https://github.com/lpasqualis/CultureWaves" rel="noopener noreferrer"&gt;a program to animate a 3D (or 2D) rendering of the interference patterns of waves&lt;/a&gt;. The program allows placing signatures, and change their characteristics in various ways. It also enables to rotate the view, zoom in and out, change color schemas, save and load the patterns, etc. The program is written in &lt;a href="http://www.processing.org/" rel="noopener noreferrer"&gt;Processing;&lt;/a&gt; I called it &lt;a href="https://github.com/lpasqualis/CultureWaves" rel="noopener noreferrer"&gt;CultureWaves and published it on GitHub under the MIT license&lt;/a&gt;. It is far from perfect at this point, and it has several known issues, but it is good enough to generate the visuals that I was looking for.&lt;/p&gt;

&lt;p&gt;In the visualizations created with CulturalWaves, each signature is represented as a sphere and is labeled with a name of a person, representing a member of a group. Each sphere changes size rhythmically, pulsating at the speed of the wave it generates. Also, its maximum size is directly proportional to the amplitude of the waves it produces. The waves generated by the signatures interact, making interference patterns that metaphorically represent the culture of the group.&lt;/p&gt;

&lt;p&gt;For example, if the spheres are employees of a company, the interference pattern represents the culture of that organization. The size of each sphere represents the influence level of each employee. You might imagine a large one as the CEO --- having lots of influence on the company culture --- and a small one as a junior employee with limited impact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Group of One
&lt;/h2&gt;

&lt;p&gt;Let's start with a group of one. Bill is an entrepreneur, and he works alone. The cultural wave pattern he generates represents a company culture of one: predictable and regular, only dependent on one personality. Here is a visualization of Bill --- the white sphere --- and the culture he generates:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjlf9ek1lo1l7v8j3rsvr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjlf9ek1lo1l7v8j3rsvr.png" alt="justBill Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From a higher altitude and a different angle you can appreciate the regular pattern that Bill generates:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6u7mpnmkr102tbvx7px.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6u7mpnmkr102tbvx7px.png" alt="billFromUpHigh Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Group of Two
&lt;/h2&gt;

&lt;p&gt;Let's imagine that the group that Bill started is a company and that the business at some point grows. Bill hires Julie. She joins the company and the effects on the company culture are dramatic. What was a regular pattern becomes much more complicated:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwgrd6kvj1o2u2947bh9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwgrd6kvj1o2u2947bh9.png" alt="BillAndJulie Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The difference of the interference patterns of Bill alone compared to Bill and Julie together is a visualization of how different a culture of one is from a culture of two. With two people things get a lot more interesting and nuanced. The difference is also noticeable from a distance, and shows the far-reaching influence of a partnership:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mpbat3pyu27ppmvcd0z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mpbat3pyu27ppmvcd0z.png" alt="BillAndJulieUpHigh Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Group of Three &amp;amp; Four
&lt;/h2&gt;

&lt;p&gt;If a third person --- Maggie --- joins the company, the interference changes once again acquiring a much more turbulent and irregular nature:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpwfuz253kk9b90o5ws3h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpwfuz253kk9b90o5ws3h.png" alt="ThreePeople Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this early stages of a company growth, small additions of influential people radically shape the culture. In the visualizations shown so far, Bill --- being the founder --- has a relative influence level of 200, Julie 130 and Maggie 120. Those values are a comparable measure of the amplitude of the waves generated by the members of the group.&lt;/p&gt;

&lt;p&gt;Adding Adam, a new junior employee with a relative influence level of 40, changes the company culture, but not by much:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff0anladtv809bxvstebf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff0anladtv809bxvstebf.png" alt="FourPeople Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As shown in this visuals, company cultures are shaped more by the most influential people. Also, the larger the group gets, the smaller is the impact of each person.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dominant Influencers
&lt;/h2&gt;

&lt;p&gt;A very dominant influencer can shape the company culture dramatically. For example, look what happens if Julie's relative influence level grows to 200, while Bill and Maggie drop to 30 and Adam to 20.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbyo50rnbnvwo14pzo6ed.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbyo50rnbnvwo14pzo6ed.png" alt="JulieDominates Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The effects are even more apparent when observed from a distance. Note how the culture is very Julie-centered:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2civkyhhtcpkwne6ld6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2civkyhhtcpkwne6ld6.png" alt="JulieDominatesUpHigh Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Growth
&lt;/h2&gt;

&lt;p&gt;Even with a dominant Julie and her influence level of 200, when the company grows, things start to become more homogeneous. For example, here is a visualization of the group with 50 people. Julie is colored in red, to show her position relative to everybody else. The other 49 employees have comparable influence levels around 40.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0h0w4x9of2glgaxvgefy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0h0w4x9of2glgaxvgefy.png" alt="LargeGroupJulieDominant Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note how the pattern is not Julie-centric anymore; she still has significant influence, but the people around her have the effect of generating a turbulent and nuanced company culture that is no longer centered on her. For clarity, here is a view of the same group without the name labels and the spheres:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn9i61yge3hjmn0rhfghg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn9i61yge3hjmn0rhfghg.png" alt="CleanGroup Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And look what happens when Julie is removed from the group:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl8yqb6ltx57bw7sgjgko.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl8yqb6ltx57bw7sgjgko.png" alt="CleanGroupNoJulie Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a difference, and it is noticeable, but it is not dramatic. The company culture seems to maintain a certain quality that it had before Julie was removed. The personality and energy of the people remaining maintain the culture of the organization somewhat similar to the original.&lt;/p&gt;

&lt;p&gt;However, if we increase the relative influence of one of the remaining 49 people --- April --- to 600, which is three times Julie and 15 times the average employee, this is what happens:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dbllqibt0dx9v8j5m82.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dbllqibt0dx9v8j5m82.png" alt="DominantOppressor Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once again, one single individual has a disproportionate influence on everyone else. From a closer point of view and including name labels:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyt79xcexn1o0n84z8gjn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyt79xcexn1o0n84z8gjn.png" alt="DominantOppressorClose Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cultural Changes Over-time
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Top Driven
&lt;/h3&gt;

&lt;p&gt;Since all members of a group are immersed in the culture, their behavior and personality change to conform to it. Left alone, each person both modifies the culture and conforms to it, creating a small shift and a larger consolidation effect. People join a group with a given signature, and after a while they change to conform, adding their voice to reinforce the existing culture.&lt;/p&gt;

&lt;p&gt;To induce a cultural shift, you need to get the strongest influencers to change their signature to something designed to move the company toward a predetermined direction. If the influencers continue to broadcast a consistent message, eventually everyone will shift and adapt making the resulting cultural pattern the new normal. This is why I am a firm believer that a company culture &lt;a href="https://www.coderhood.com/on-company-culture/" rel="noopener noreferrer"&gt;is shaped at the top and forms at the bottom&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For example, using the graphical visualization that I adopted, let's take a group of three people who start with their natural personalities and impact on the culture:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl3aoxa7h5xwmpdtsb1i4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl3aoxa7h5xwmpdtsb1i4.png" alt="original Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="576" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The pattern represents the original culture of this group, where there has not been a normalization shift yet. Angel is the leader. Maggie and Jason are junior employees.&lt;/p&gt;

&lt;p&gt;If Angel doesn't work on pushing a cultural shift toward her direction, the group might settle on this natural pattern:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwgs45g7ldgrjtyfmxzog.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwgs45g7ldgrjtyfmxzog.png" alt="naturalShift Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="576" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note how everybody's wave interval and speed converged around similar values. The resulting culture is mostly "accidental," and might or might not be what the company needs.&lt;/p&gt;

&lt;p&gt;However, if Angel tends to push for a cultural shift toward a strategic direction, this is where the group might converge to:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb12zcn5by7ryhtbkhpqq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb12zcn5by7ryhtbkhpqq.png" alt="topShift Visualizing Company Culture And Cultural Change work environment teams leadership hiring diversity culture   " width="576" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this case, speed and interval of the three members are closed to Angel's starting point, and the resulting pattern has a different look and feel, closer to Angel's natural preference. The difference might look subtle in this example, but it is very tangible when you are immersed in it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cultural Changes Driven by Hiring
&lt;/h3&gt;

&lt;p&gt;Another way to achieve cultural shifts is to hire a significant number of people at once --- or a few influential people --- that do not conform to the existing culture; this typically occurs accidentally during periods of fast growth in small companies. Cultural change driven by hiring can be so dramatic that, unless top leadership takes deliberate actions to guide it, can result in the creation of an entirely different company in a small span of time. I have seen this phenomenon a few times, and it is not always pretty.&lt;/p&gt;

&lt;p&gt;On the other hand, if a company lacks the strong leadership needed to shift the culture deliberately, and if more diversity seems to be what's required to get the company out of a rut, hiring new blood might resolve the problem. Strategic hiring to push a cultural shift can be an expensive proposition, but sometimes it can be the most effective one.&lt;/p&gt;




&lt;h3&gt;
  
  
  If you enjoyed this article, keep in touch!
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.coderhood.com" rel="noopener noreferrer"&gt;Find all my posts on CoderHood.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/lpasqualis/" rel="noopener noreferrer"&gt;Join my professional network on LinkedIn.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/lpasqualis" rel="noopener noreferrer"&gt;Follow me on Twitter.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/coderhood/" rel="noopener noreferrer"&gt;Join my Facebook page.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And finally, follow me here on dev.to!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>culture</category>
      <category>leadership</category>
      <category>processing</category>
    </item>
    <item>
      <title>Choosing The Proper Level of Abstraction</title>
      <dc:creator>Lorenzo Pasqualis</dc:creator>
      <pubDate>Tue, 05 Dec 2017 13:11:35 +0000</pubDate>
      <link>https://dev.to/lpasqualis/choosing-the-proper-level-of-abstraction-74c</link>
      <guid>https://dev.to/lpasqualis/choosing-the-proper-level-of-abstraction-74c</guid>
      <description>&lt;p&gt;This post was first published on &lt;a href="https://coderhood.com" rel="noopener noreferrer"&gt;CoderHood&lt;/a&gt; as &lt;a href="https://dev.toPOST-URL"&gt;Choosing The Proper Level of Abstraction&lt;/a&gt;. CoderHood is a blog dedicated to the human dimension of software engineering.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.coderhood.com/choosing-the-proper-level-of-abstraction/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwvhhj2kr5jezaefq5iyp.jpg" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Models of Reality &amp;amp; Level of Abstraction
&lt;/h2&gt;

&lt;p&gt;The physical world and the rules that regulate it are complicated and very difficult to grasp. To make sense of it, we --- humans --- attempt to explain it with mental models. Models are logical constructions defined with terms that we created and understand. We use those models as proxies for reality in an attempt to grasp and predict its complicated and multifaceted rules.&lt;/p&gt;

&lt;p&gt;Models are not an engineering-only concept; they are fundamental to everyday life and are natural simplifications of the world that we experience. We build models for everything, every day. For example, the memory we have of someone we met is a model of that person that we constructed in our mind. It is a description that is simple enough to store away in our memory, and sophisticated enough to be nuanced.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Model of a Rock
&lt;/h2&gt;

&lt;p&gt;Given the limitation of our brains, we create logical models of many aspects of reality. For example, we have models for objects based on their most prominent characteristics. A very efficient model of rock is the word "rock" itself.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ROCK&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A more nuanced model could be a simple shape, which gives us more information on what the rock looks like.&lt;/p&gt;

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

&lt;p&gt;But that is still very rough. It is hard to tell if that's a rock, or an egg or something else. Anything with that shape can be described as an oval, which makes the model unable to capture the distinctive characteristics of a rock. A more nuanced model could be visualized as a drawing of it.&lt;/p&gt;

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

&lt;p&gt;The drawing is not much more detailed than the circle, but it carries information to remind us that a rock does not have smooth contours, and shows some of the imperfection of the surface. Still, due to my poor artistic skills, that drawing could represent many different things.&lt;/p&gt;

&lt;p&gt;A picture of a round rock is a better and more detailed model, which includes color, texture and the surrounding context. Also, a photograph has the advantage of being captured by a machine without the filter of human interpretation.&lt;/p&gt;

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

&lt;p&gt;However, this model falls short of being a full description of the rock. For example, it is two dimensional and shows only a particular side. It does not contain any information about the weight, three-dimensional characteristics, internal composition, position in space, etc.&lt;/p&gt;

&lt;p&gt;A full description of the rock at a particular moment in time would require mapping every one of its atoms and their relative positions in space. Given that the stone changes over time, a complete description would require such a map for every instant of the rock existence. That would require defining when the rock started existing, and it would be done only when it is no longer recognizable as a rock.&lt;/p&gt;

&lt;p&gt;That's, clearly, an absurd model. Such a description would be infinitely complex and unusable with our limited mental processing powers. In other words, it would be vastly useless for most purposes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Models And Abstractions
&lt;/h2&gt;

&lt;p&gt;The terms "model" and "abstraction" are often overloaded; it is important to clarify their definition in the context of this document. &lt;strong&gt;Warning&lt;/strong&gt;: the following definitions are more formal than I'd like them to be; however, I find it necessary to define them precisely to avoid confusion.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Domain&lt;/strong&gt;: a specified sphere of concepts, objects, activities or knowledge.

&lt;ul&gt;
&lt;li&gt;  For example, "building" is a domain composed of all possible buildings.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Model&lt;/strong&gt;: a set of distinctive characteristics of a subset of a domain, including their constraints. The constraints are necessary, in a well-defined model, to limit the number of variations to a finite set.

&lt;ul&gt;
&lt;li&gt;  For example, a house model could contain a set of distinctive characteristics of a house: things like color (one of the 16,777,216 8-bit RGB values), size (integers from 50 ft2 to 10,000 ft2), # of rooms (from 1 to 10).&lt;/li&gt;
&lt;li&gt;  The subset of the building domain covered by the house model is the set of all houses that can be described by it. In the example, every possible combination of colors, sizes and # of rooms. That is a total of 1,669,332,992,000 possible houses.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Instance of a model&lt;/strong&gt;: One particular variation that can be described by a model.

&lt;ul&gt;
&lt;li&gt;  For example, an instance of the house model could be identified as being red (RGB #FF1010), 4000 ft2 and have 6 rooms.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Explosion of a model&lt;/strong&gt; is the set of all the possible instances of a model.

&lt;ul&gt;
&lt;li&gt;  In the house model example, all the 1,669,332,992,000 possible houses.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Model A is called an abstraction of model B&lt;/strong&gt; and &lt;strong&gt;B is a model abstracted by A&lt;/strong&gt; if the explosion of A is a superset of the explosion of B.

&lt;ul&gt;
&lt;li&gt;  For example, a house is an abstraction of a studio apartment. A studio apartment is a model in the house abstraction.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  One more example
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Carbon-Based Lifeform&lt;/em&gt; is an abstraction for many models, such as: &lt;em&gt;Plant&lt;/em&gt;, &lt;em&gt;Animal&lt;/em&gt;, &lt;em&gt;Microorganism&lt;/em&gt;, etc. &lt;em&gt;Animal&lt;/em&gt; is a model that can describe a set of distinctive characteristics of a, well, animal. One of the domains of &lt;em&gt;Animal&lt;/em&gt; is the &lt;em&gt;Carbon-Based Lifeform&lt;/em&gt; domain. &lt;em&gt;Animal&lt;/em&gt; is also an abstraction of a dog and &lt;em&gt;Dog*is a model in the *Animal&lt;/em&gt; abstraction. &lt;em&gt;Dog&lt;/em&gt; is also an abstraction of a &lt;em&gt;German Shepherd&lt;/em&gt; model. A particular German Shepherd named Cody is an instance of the German Sheppard model.&lt;/p&gt;

&lt;p&gt;If you made it this far, the rest is much more comfortable. I promise.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choosing a Level of Abstraction
&lt;/h3&gt;

&lt;p&gt;The level of abstraction that you should choose when modeling something depends on what you know about the context in which you are operating, and how things might change in the future.&lt;/p&gt;

&lt;p&gt;For example, if you wanted to create software to manage the participants of a "Best in Show" dog competition, modeling a dog would be sufficient. The chances that a dog-centric competition will expand to include other animals is so low that abstracting to all animals is not something you need to plan for.&lt;/p&gt;

&lt;p&gt;On the other hand, if you were writing software to manage guests of a pet shelter, &lt;em&gt;Dog&lt;/em&gt; is probably not the right abstraction, even if all the current guests are, indeed, dogs. You need to look a step ahead. Shortly the shelter might host cats, birds, lizards, and who knows what else. In this case, &lt;em&gt;Animal&lt;/em&gt; is probably a better abstraction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing an Abstraction in Software Development
&lt;/h2&gt;

&lt;p&gt;In software development, choosing the right abstraction can be tricky. If you make it too simple, it won't let you create a model to satisfy even the immediate requirements. If you make it restricted to the urgent needs, you might have to change it almost immediately to implement the next iteration of the model. However, if you make your abstraction too generic and all-encompassing, modeling solutions might get so complicated that you'll go out of business before you are finished.&lt;/p&gt;

&lt;p&gt;In my experience, the level of abstraction that engineers choose is determined --- good or bad --- by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Their skills and experience.&lt;/li&gt;
&lt;li&gt;  Their personality.&lt;/li&gt;
&lt;li&gt;  Data available about the domain.&lt;/li&gt;
&lt;li&gt;  Time and resources.&lt;/li&gt;
&lt;li&gt;  Accidental or deliberate assumptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the rest of this post, I use a concrete example and an analogy to visualize what it means to choose an abstraction.&lt;/p&gt;

&lt;h1&gt;
  
  
  Modeling A Calculator
&lt;/h1&gt;

&lt;p&gt;Imagine that a customer asks you to build a calculator application (like a pocket calculator); something that would satisfy the needs of grade-school students.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Ideal Model
&lt;/h2&gt;

&lt;p&gt;The customer has a high-level ideal in mind. They don't know it, and can't clearly describe all the details, but if they took the time to document the ideal model, it would look like this:&lt;/p&gt;

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

&lt;h2&gt;
  
  
  The Information You Have
&lt;/h2&gt;

&lt;p&gt;However, instead of a design document, the customer invites you for lunch and gives you a verbal description that you try to jot down as best as you can; as a result, your "spec" is a sketch on the back of a coffee-stained napkin.&lt;/p&gt;

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

&lt;p&gt;They tell you that they want to get something out soon, and it doesn't have to be perfect. You accept the challenge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Challenge
&lt;/h2&gt;

&lt;p&gt;Now you need to figure out everything else. The data you have, in this case, is a vague idea of what the goal is. Your rough sketch of the calculator gives you some information about the "reality" that you need to model, but not a complete description. You have more questions than answers.&lt;/p&gt;

&lt;p&gt;As a developer, you need to use the information you have to create the proper abstraction. A useful abstraction is one that allows implementing a simple model to satisfy the initial needs and gives space to refine that model until it approximates the ideal.&lt;/p&gt;

&lt;p&gt;To recap, your domain is the universe of Calculators. Your goal is to define and build the ideal model; however, you don't know what that looks like is. What you have is a vague sketch of a model scribbled on the back of a napkin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Goal Is a Jagged Ink Splatter
&lt;/h2&gt;

&lt;p&gt;To draw an analogy, imagine that the ideal model is this black ink splatter:&lt;/p&gt;

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

&lt;p&gt;The splatter represents the functionality, features, and behaviors of the perfect solution. The ideal solution is a model that uses all aspects of an abstraction to satisfy all the needs, present and future, of the problem that you are trying to solve.&lt;/p&gt;

&lt;p&gt;The jagged edges of the splatter represent the complications and details of the ideal abstraction. The shape is complex and has many aspects that are difficult to model correctly.&lt;/p&gt;

&lt;h3&gt;
  
  
  An Over-Simplification
&lt;/h3&gt;

&lt;p&gt;A first simple approximation could be an application that emulates a calculator that looks like this:&lt;/p&gt;

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

&lt;p&gt;That is a start, but it covers only a small part of the ideal target. The picture below shows that small part in the context of the black ink splatter analogy; visualized in blue:&lt;/p&gt;

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

&lt;p&gt;The customer is not going to be satisfied with it. The model is too simple, and it covers only a few of the features of the ideal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Simplification With Deviation
&lt;/h3&gt;

&lt;p&gt;A second attempt could expand on that idea, but in the process, you might make some choices that are a deviation from the ideal concept; for example, you could choose to add some new buttons and a usage workflow that is not quite what the customer wants. The result might look like the following model:&lt;/p&gt;

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

&lt;p&gt;This model covers more of the original black ink splatter compared to the over-simplification, but it also expands outside of the boundaries of the ideal.&lt;/p&gt;

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

&lt;p&gt;Overall, this model is not complete, and a little off.&lt;/p&gt;

&lt;h3&gt;
  
  
  An Acceptable Simplification
&lt;/h3&gt;

&lt;p&gt;After several iterations, a close study of the original sketch, and lots of conversations with the customer, you could come up with a better approximation of the ideal model; it is not perfect, but it captures most of the needed characteristics. It misses some of the buttons and functions, but it adds a larger screen which the customer likes.&lt;/p&gt;

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

&lt;p&gt;This approximation models the ideal solution much more closely than the previous iterations. Visualized in blue on top of the black ink splatter, this model coverage of the perfect abstraction looks like this:&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Over-Abstraction
&lt;/h3&gt;

&lt;p&gt;Over-simplification is not acceptable, but over-engineering and over-abstraction are even more dangerous. You fall into that trap when you make things much more complicated than the ideal solution, adding unnecessary cost and missing the spirit of the original target.&lt;/p&gt;

&lt;p&gt;As a result, if you were asked to create a calculator, you might end up with a super-computer.&lt;/p&gt;

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

&lt;p&gt;Which, in the ink analogy, covers the entire black splatter and a chunk of the observable universe around it.&lt;/p&gt;

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

&lt;p&gt;In this exaggerated example, the model grew much larger than the ideal abstraction, meaning that you over-abstracted the problem.&lt;/p&gt;

&lt;h1&gt;
  
  
  Choosing The Right Abstraction and Initial Model
&lt;/h1&gt;

&lt;p&gt;When you are presented with a problem, you need to think carefully about the right level of abstraction. The goal is to create one that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Can model an initial solution to satisfy the absolute minimum requirements.&lt;/li&gt;
&lt;li&gt;  Can be refined into new models to resolve known foreseeable future needs at an acceptable cost.&lt;/li&gt;
&lt;li&gt;  Does not attempt to solve problems that you'll never need to address.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To evaluate an abstraction and choose the initial model, you need to have two lists:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; List of the minimum requirements; this list is required to determine the proper initial model.&lt;/li&gt;
&lt;li&gt; List of all foreseeable future needs; this list is needed to choose the appropriate abstraction.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When evaluating an abstraction and an initial model based on it, ask yourself the following questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Does the model satisfy the minimum list of requirements? If not, the model is too simple and needs to be improved. That is, you need to expand the initial blue area on the black ink splatter.&lt;/li&gt;
&lt;li&gt; Does the abstraction allow for an eventual expansion of the model to cover the foreseeable future needs at a reasonable cost? If not, you might need to expand your abstraction. That is, you may need to enlarge the area that the black ink splatter covers in the domain.&lt;/li&gt;
&lt;li&gt; Is the model solving many more problems that are not in one of the two lists? If so, you might have created an over-abstraction. Consider reducing it. Over-abstraction increases long-term costs.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Choosing a proper level of abstraction is a science and art that you learn with experience. I hope that this dissertation will help you visualize the challenge, and give you some additional tools to improve your model abstraction skills.&lt;/p&gt;




&lt;h3&gt;
  
  
  If you enjoyed this article, keep in touch!
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.coderhood.com" rel="noopener noreferrer"&gt;Find all my posts on CoderHood. Don't forget to Subscribe to receive notifications of new posts by Email.&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/lpasqualis/" rel="noopener noreferrer"&gt;Join my professional network on LinkedIn.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/lpasqualis" rel="noopener noreferrer"&gt;Follow me on Twitter.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/coderhood/" rel="noopener noreferrer"&gt;Join my Facebook page.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And finally, follow me here on dev.to!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>advice</category>
      <category>abstraction</category>
      <category>model</category>
      <category>analogy</category>
    </item>
    <item>
      <title>7 Ranks of Coderhood: Coder, Programmer, Computer Scientist, Developer, Engineer, Architect</title>
      <dc:creator>Lorenzo Pasqualis</dc:creator>
      <pubDate>Thu, 30 Nov 2017 15:41:17 +0000</pubDate>
      <link>https://dev.to/lpasqualis/7-ranks-of-coderhood-coder-programmer-computer-scientist-developer-engineer-architect-eca</link>
      <guid>https://dev.to/lpasqualis/7-ranks-of-coderhood-coder-programmer-computer-scientist-developer-engineer-architect-eca</guid>
      <description>&lt;p&gt;This post was first published on &lt;a href="https://coderhood.com" rel="noopener noreferrer"&gt;CoderHood&lt;/a&gt; as &lt;a href="https://www.coderhood.com/7-ranks-coder-programmer-computer-scientist-developer-engineer-architect/" rel="noopener noreferrer"&gt;7 Ranks of Coderhood: Coder, Programmer, Computer Scientist, Developer, Engineer, Architect&lt;/a&gt;. CoderHood is a blog dedicated to the human dimension of software engineering.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.coderhood.com/7-ranks-coder-programmer-computer-scientist-developer-engineer-architect/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmlc1xt0a7vcg1vns3g41.jpg" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  The Many Names of a Software Builder
&lt;/h1&gt;

&lt;p&gt;In my &lt;a href="https://coderhood.com" rel="noopener noreferrer"&gt;blog&lt;/a&gt;, I have been using the terms coder, programmer, software developer and software engineer interchangeably. I do that mainly to avoid linguistic repetitions. However, I believe that there are differences between those words and similar others.&lt;/p&gt;

&lt;p&gt;In this article, I will discuss a set of nouns commonly used to refer to someone who writes code. I will also give my interpretation of how those terms relate to engineering skill levels. &lt;/p&gt;

&lt;h2&gt;
  
  
  Interpretation of the meaning
&lt;/h2&gt;

&lt;p&gt;The definitions that I will present here are not official. There are no formal definitions that I am aware of or trusted body to create such a thing. However, there are lots people with strong opinions on the matter. My understanding of what each of the terms implies is based on three decades spent in the software industry, but I fully expect that other people will disagree with my interpretation. &lt;/p&gt;

&lt;p&gt;My intent is not to start a debate or attempt to convince anyone who may have a strong opinion. I do not believe that there is a right or wrong at this time. However, if you have not yet formed a strong opinion on the matter, I hope that this guide will provide some clarity on a possible interpretation.&lt;/p&gt;

&lt;h2&gt;
  
  
  A three-pronged approach
&lt;/h2&gt;

&lt;p&gt;For the sake of clarity, for each of the nouns I will do three things:&lt;/p&gt;

&lt;h3&gt;
  
  
  #1 - Give a Description of the Skill Level
&lt;/h3&gt;

&lt;p&gt;I will provide a description of the skill level that, in my interpretation, is implied by the term. &lt;/p&gt;

&lt;h3&gt;
  
  
  #2 - Provide a Parallel With Martial Arts Ranks
&lt;/h3&gt;

&lt;p&gt;I will make an analogy with martial arts ranks. In particular, I will equate the technical software-making skill level implied by the term with martial arts belt colors.&lt;/p&gt;

&lt;h3&gt;
  
  
  #3 - Give a Code Example
&lt;/h3&gt;

&lt;p&gt;I will provide an example of how I expect that somebody at that level would choose to approach a simple programming problem. The definition that I will use is trivial and not intended to be a realistic example. Its purpose is to compare and discuss skill levels. The simplicity is designed to allow anyone, regardless of experience, to easily follow along. The problem that I will use is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Calculate the sum of a set of integers. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As you are reading my dissertation, please play along and imagine this as a proxy for a much more complicated case. In this make-belief universe, this task requires serious thought and has many potential solutions and design approaches. Imagine it to be a central piece of computation for a system that needs to scale and perform.&lt;/p&gt;

&lt;p&gt;I will use Ruby to show some trivial examples of implementation; the code is simple enough that it should be understandable even if you don't know Ruby. If you don't understand it, don't worry.&lt;/p&gt;

&lt;h2&gt;
  
  
  The List
&lt;/h2&gt;

&lt;p&gt;The nouns that I will be discussing are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Beginner.&lt;/li&gt;
&lt;li&gt;Coder.&lt;/li&gt;
&lt;li&gt;(Hacker)&lt;/li&gt;
&lt;li&gt;Programmer.&lt;/li&gt;
&lt;li&gt;Computer scientist.&lt;/li&gt;
&lt;li&gt;Software developer.&lt;/li&gt;
&lt;li&gt;Software engineer.&lt;/li&gt;
&lt;li&gt;Software architect. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ready to follow along? Let's get started.&lt;/p&gt;

&lt;h1&gt;
  
  
  Martial Arts Belts
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyv7ao94edhucn07tu541.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyv7ao94edhucn07tu541.jpg" width="800" height="457"&gt;&lt;/a&gt;&lt;br&gt;
When I was living in Italy in my teens and twenties -  about 40lbs ago - I spent years practicing Judo and Kung Fu. During that time I learned that in many martial arts, the color of the belt is a symbol of the skill level of the practitioner. A typical color pattern goes from white to black, where the darkness is proportional to the experience level.&lt;/p&gt;

&lt;p&gt;A beginner wears a white belt because they have no experience. The color white indicates "new and clean." As the martial artist trains, the belt gets darker to show progress. The color represents the grime accumulated with hard work and sweat. A martial artist with many years of experience eventually achieves a black belt rank to indicate high levels of expertise and skill.&lt;/p&gt;

&lt;p&gt;Traditionally belts were black or white only. In recent decades things have evolved to include more colors. Today, different martial arts schools have different belt color schemas. The schema depends on the style, the dojo, and the country. &lt;/p&gt;
&lt;h2&gt;
  
  
  Why Am I Talking About Martial Arts?
&lt;/h2&gt;

&lt;p&gt;I will use martial arts belt colors to draw a parallel between software building skills of a software professional and the fighting skills of a martial artist. For this purpose, I will use a belt color schema commonly used in Europe. In order: white, yellow, orange, green, blue, brown and black. &lt;/p&gt;

&lt;p&gt;The following table shows the engineering levels that I mentioned. For each of them, the table shows a corresponding belt color and a title that is commonly given to someone at that skill level:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Engineering Level&lt;/th&gt;
&lt;th&gt;Martial Art Level (Belt Color)&lt;/th&gt;
&lt;th&gt;Example of Job Title&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Beginner&lt;/td&gt;
&lt;td&gt;White&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hacker&lt;/td&gt;
&lt;td&gt;Street Fighter (No Belt)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coder&lt;/td&gt;
&lt;td&gt;Yellow&lt;/td&gt;
&lt;td&gt;Jr.Dev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Programmer&lt;/td&gt;
&lt;td&gt;Orange&lt;/td&gt;
&lt;td&gt;Software Dev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Computer Scientist&lt;/td&gt;
&lt;td&gt;Green&lt;/td&gt;
&lt;td&gt;Software Dev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Software Developer&lt;/td&gt;
&lt;td&gt;Blue&lt;/td&gt;
&lt;td&gt;Sr. Software Dev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Software Engineer&lt;/td&gt;
&lt;td&gt;Brown&lt;/td&gt;
&lt;td&gt;Principal Dev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Software Architect&lt;/td&gt;
&lt;td&gt;Black&lt;/td&gt;
&lt;td&gt;Software Architect&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The engineering skill level is related to the technical and teamwork abilities of the developer. The job title is an example of what the industry calls someone at that level (heavily dependent on the company and geographic area).&lt;/p&gt;
&lt;h2&gt;
  
  
  Beginner - White Belt
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa6iffx68jmwee30lc34x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa6iffx68jmwee30lc34x.png" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
You have to start somewhere, and that is usually "no experience at all." A beginner in software development is just that: someone who is new to coding and is in the early stages of learning. Beginners cannot yet reliably write or understand simple functioning programs without consulting books, tutorials, cookbooks, or getting help from somebody. &lt;/p&gt;

&lt;p&gt;Beginners might be able to write working code, but they often do not understand the details of why that code works. They commonly spend a lot of time searching for code snippets on StackOverflow or similar sites and stitching them together until something functions.&lt;/p&gt;
&lt;h3&gt;
  
  
  Powerful tools are not the same as robust skills
&lt;/h3&gt;

&lt;p&gt;To make things more confusing, many "modern" languages and frameworks allow anyone to generate the structure and some of the implementation of complex programs without the need to understand what's going on behind the scenes. For example, getting a simple Ruby on Rails application up and running and accepting HTTP requests is something that anybody can do with a few command-line commands and a tiny bit of determination. &lt;/p&gt;

&lt;p&gt;Here is how you do it on a *nix system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gem &lt;span class="nb"&gt;install &lt;/span&gt;rails
...
&lt;span class="nv"&gt;$ &lt;/span&gt;rails new website
...
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;website
&lt;span class="nv"&gt;$ &lt;/span&gt;bin/rails server
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done! That is all you need to get a server responding to HTTP requests generated by a web browser. If this were a martial art fight, it would be the equivalent of showing up with an armor and a gun. The armor might allow you to survive a little longer, and with the gun, you might win the match. However, winning a fight that way doesn't make you a skilled martial artist. It just gives you tools to do something challenging without traditional training, effort or study. &lt;/p&gt;

&lt;p&gt;Don't take me wrong. Tools like Ruby on Rails that allow a developer to get things done fast are great. In fact, I think that cutting down the time spent on any boiler-plate code is fantastic. It is an excellent start of a project, but it only requires the skill level of a white belt.&lt;/p&gt;

&lt;p&gt;The real fight starts when the tutorial ends and when tools do not automatically generate the application you are trying to implement. To move past that point, you need to become a coder.&lt;/p&gt;

&lt;h3&gt;
  
  
  An example
&lt;/h3&gt;

&lt;p&gt;If a beginner wanted to write a program that sums a set of numbers using Ruby, they might Google "How to sum array of numbers in Ruby?", and find &lt;a href="https://stackoverflow.com/questions/1538789/how-to-sum-array-of-numbers-in-ruby" rel="noopener noreferrer"&gt;this page&lt;/a&gt;. That's the first Google result at the time of the writing of this post. That page gives the following most voted answer, which got 524 upvotes on StackOverflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And sure enough it works. Here is an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ irb
2.4.2 :001 &amp;gt; array=[1,2,3]
 =&amp;gt; [1, 2, 3] 
2.4.2 :002 &amp;gt; array.inject(0){|sum,x| sum + x }
 =&amp;gt; 6 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The beginner might get that to work, but they don't understand the tradeoffs of that code. Is it readable? Is it fast compared to other ways of doing the same thing? Is it maintainable? Why does it work? What exactly happens when that line gets executed? How much CPU does it use? Are the variables "sum" and "x" defined after that line of code runs? &lt;/p&gt;

&lt;p&gt;A beginner Ruby developer is someone who does not know the answer to most of those questions. &lt;/p&gt;

&lt;h2&gt;
  
  
  Coder - Yellow Belt
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetxcwff4ytgj0g0l0281.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetxcwff4ytgj0g0l0281.png" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
A coder is someone who can put together many lines of computer code to resolve a range of simple problems without help. The result won't be beautiful, but a coder understands why it works and they get the job done.&lt;/p&gt;
&lt;h3&gt;
  
  
  The first necessary step
&lt;/h3&gt;

&lt;p&gt;I called my blog "CoderHood" because every person who writes code for living reached a "coder" level at some point. Coderhood is a word I made up to indicates a developer's life in tech, starting from that first yellow belt.&lt;/p&gt;

&lt;p&gt;The main difference between a beginner and a coder is that a coder can write code and understand it. They might not understand what's going on behind the scenes in great details, but they do know why they wrote the code they wrote. &lt;/p&gt;

&lt;p&gt;In the industry, the title associated with a coder is something like "jr. developer" or "developer in training."&lt;/p&gt;
&lt;h3&gt;
  
  
  An example
&lt;/h3&gt;

&lt;p&gt;I expect a "Ruby coder" to be able to come up with and know the difference between most of the following methods of calculating the sum of an array of integers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ irb
2.4.2 :001 &amp;gt; array=[1,2,3]
 =&amp;gt; [1, 2, 3] 
2.4.2 :002 &amp;gt; array.inject(0){|sum,x| sum + x }
 =&amp;gt; 6 
2.4.2 :003 &amp;gt; sum=0;array.each { |x| sum+= x };sum
=&amp;gt; 6 
2.4.2 :004 &amp;gt; array.sum
=&amp;gt; 6 
2.4.2 :005 &amp;gt; array.inject(0, :+)
 =&amp;gt; 6 
2.4.2 :006 &amp;gt; array.reduce(0, :+)
 =&amp;gt; 6 
2.4.2 :007 &amp;gt; eval array.join '+'
=&amp;gt; 6 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In case you are wondering, some of those are terrible solutions, but they are working solutions nonetheless. &lt;/p&gt;

&lt;h2&gt;
  
  
  Hacker - Jeans And No Belt
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0iu9ynds1jfec9r5blc0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0iu9ynds1jfec9r5blc0.jpg" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
I include "hacker" on the list because somebody will ask about it. However, it is not a great fit for this discussion. &lt;/p&gt;
&lt;h3&gt;
  
  
  Not a necessary skill
&lt;/h3&gt;

&lt;p&gt;I don't believe that "hacking" is a necessary skill in a software developer's growth path. White-hacking skills are useful to learn how to test and secure software applications and systems, but I don't see it as a word describing an overall "skill level." I'd categorized it as something some people do and not as something that gives an indication of technical proficiency. In fact, a hacker's skill level can be all over the place. Some are amazing, while others &lt;a href="https://www.youtube.com/watch?v=oJagxe-Gvpw" rel="noopener noreferrer"&gt;not so much&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Since being a hacker is not a necessary stepping stone in the software development progression, in my analogy, a hacker does not wear a traditional martial arts belt. They are more an equivalent of a street fighter, wearing Jeans without a belt. &lt;/p&gt;

&lt;p&gt;Some of them are angry thugs, others are survivalists, others are good guys defending people, and most are somewhere in between. &lt;/p&gt;
&lt;h3&gt;
  
  
  The many types of "hacker."
&lt;/h3&gt;

&lt;p&gt;There are many types of hackers. Some of them can code, others can't. The meaning of the word depends on the context and who is using it. Some common definitions are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A computer expert who adheres to the technology and programming subculture.&lt;/li&gt;
&lt;li&gt;An individual who can compromise computer security for malicious (black-hat) or security research (white-hat) purposes.&lt;/li&gt;
&lt;li&gt;A software developer who gets the work done in the quickest and dirtiest way possible.&lt;/li&gt;
&lt;li&gt;Someone who studies, experiments with, or explores telecommunication systems, equipment, and systems connected to telephone networks. This type of hacker is also called a phreaker. &lt;/li&gt;
&lt;li&gt;A skilled engineer who works very close to the metal to gain more control on a system for good reasons (i.e., to squeeze more performance out of the hardware) or malicious purposes (i.e., to exploit security holes and find ways around operating system defenses).&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Some examples
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Type 3
&lt;/h4&gt;

&lt;p&gt;A hacker of type 3 might choose to sum an array of integers with the following "ruby code":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ irb
2.4.2 :001 &amp;gt; `echo "1+2+3" | bc`.to_i
 =&amp;gt; 6 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works, on some systems at least, but it is a... "total hack." That's the type of thing that unskilled hackers-who-code do. They do things in dubious ways, usually executing unreadable command-line commands until they somehow get the result they want.&lt;/p&gt;

&lt;h4&gt;
  
  
  Type 5
&lt;/h4&gt;

&lt;p&gt;Hackers of type 5 operate at very low-level and close to the metal. There is something to be said for that skill; it is not easy to acquire and can be very valuable if you are trying to secure a software system or write extremely high-performance applications. I was never what you would call a "hacker," but I started coding very close to the metal (C and Assembly) and I still consider myself a low-level developer at heart.&lt;/p&gt;

&lt;p&gt;Type 5 hackers can be fantastic street fighters, with mad skills that would let many professional programmers in the dust on some very specialized tasks. That kind of "hacker" might choose to sum an array of integers using Assembly, &lt;a href="http://www.ee.nmt.edu/~rison/ee308_spr02/supp/020201.pdf" rel="noopener noreferrer"&gt;like this&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Programmer - Orange Belt
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F53brznc8wn0yk1w6ww5t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F53brznc8wn0yk1w6ww5t.png" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
A programmer is someone who can write functioning applications, understands basic algorithms and possesses some computer science rudiments. A programmer can get a product to work, even if it might not be very scalable or maintainable in the long-term. A programmer typically works well alone, and might or might not be a good team player.&lt;/p&gt;

&lt;p&gt;The majority of developers stop at this level, especially if they don't plan on studying computer science theory. Programmers can write decent code and work in the software industry at that level for their entire career.&lt;/p&gt;

&lt;p&gt;From an industry title standpoint, a programmer is often known with a title of "Software Engineer."&lt;/p&gt;

&lt;p&gt;In the simple "sum of an array of integers" example, a programmer is someone who might decide to write the code this way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env ruby&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;ARGV&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Usage: "&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"   sum [space separated list of integers]"&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="no"&gt;ARGV&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code implements a usable command-line command to sum a list of numbers. If you invoke it without parameters, it displays a helpful usage message. Otherwise, it prints the result on standard output. Here is an example of usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sum
Usage: 
   sum [space separated list of integers]
$ sum 1 2 3
6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is a "complete solution," it is self-documenting and is somewhat abstracted since you can call it as a command-line command.&lt;/p&gt;

&lt;h2&gt;
  
  
  Computer Scientist - Green Belt
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftpriipdxjw6p3yw2k4bk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftpriipdxjw6p3yw2k4bk.png" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
A computer scientist is someone who studied Computer Science, either in school or on the job and has a good understanding of concepts such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Base-N (N = 2, 10, 16)&lt;/li&gt;
&lt;li&gt;Binary operations&lt;/li&gt;
&lt;li&gt;Boolean logic&lt;/li&gt;
&lt;li&gt;Algorithmic complexity &amp;amp; big-O notation&lt;/li&gt;
&lt;li&gt;Data structures (arrays, linked lists, B-trees, red-black trees, queues, stacks, hash tables, heaps, sets, graphs)&lt;/li&gt;
&lt;li&gt;Sorting algorithms, and when to use them.&lt;/li&gt;
&lt;li&gt;- Basic understanding of NP-completeness&lt;/li&gt;
&lt;li&gt;Basic multithreaded algorithms&lt;/li&gt;
&lt;li&gt;Memory management &amp;amp; garbage collection (just because you code in a language that takes care of memory management for you, it doesn’t mean you can get away with not understanding it)&lt;/li&gt;
&lt;li&gt;Pointers (you need to understand the concept at least, even if you don’t code in C or C++ ), and the difference between passing parameters by value or reference.&lt;/li&gt;
&lt;li&gt;OOP concepts (interfaces, inheritance, constructors, destructors, classes, objects, abstractions, encapsulation, polyphormism, etc…)&lt;/li&gt;
&lt;li&gt;OO design and patterns&lt;/li&gt;
&lt;li&gt;Recursion&lt;/li&gt;
&lt;li&gt;Some basic understanding of dynamic programming, greedy algorithms and amortized analysis, string matching and approximation algorithms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A computer scientist has a CS degree or has worked as a developer for many years and studied applied CS theory on the job. As you know, &lt;a href="https://www.coderhood.com/5-cs-degree-myth-busting-software-engineering-fact/" rel="noopener noreferrer"&gt;I don't believe that it is necessary to have a CS degree&lt;/a&gt; to have a successful career in software engineering.&lt;/p&gt;

&lt;p&gt;Now, being a computer scientist alone doesn't make you a great programmer, which might seem to break the martial art analogy a little. However, it doesn't. Think it this way: even in the martial arts world, there are specialties. Some green belts are better than others at some things. The progression is non-linear. The belt color often represents a level of experience and the quantity of work that was put in the mastery of the martial art, not necessary a level of skill for every facet of it.&lt;/p&gt;

&lt;p&gt;A computer scientist would probably code the sum of integers solution like the programmer did. However, the difference is that a computer scientist would be able to tell you immediately that the complexity of that algorithm is O(n). As mentioned, this is an elementary example, but you get the idea.&lt;/p&gt;
&lt;h2&gt;
  
  
  Software Developer - Blue Belt
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg61o1ngrzgyzobdiuo78.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg61o1ngrzgyzobdiuo78.png" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
A software developer is someone who can get larger and more complex projects done. In comparison to a programmer and a computer scientist, a software developer: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writes code that is cleaner, better designed, more maintainable, documented and readable.&lt;/li&gt;
&lt;li&gt;Writes fewer bugs.&lt;/li&gt;
&lt;li&gt;Works faster.&lt;/li&gt;
&lt;li&gt;Works better in teams, and understand the value of development processes.&lt;/li&gt;
&lt;li&gt;Is stronger at finding and optimizing bottlenecks of code and software systems.&lt;/li&gt;
&lt;li&gt;Has more experience (has been there and done that).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  An example
&lt;/h3&gt;

&lt;p&gt;In the simple "sum of integers" example, a software developer is someone who might choose to solve the problem by building a service that exposes a Web API. The API would take a set of integers, and return the sum. &lt;/p&gt;

&lt;p&gt;I expect the application to be well documented and configurable, at least. It would also have tests, proper source code organization, and it would be easily maintainable by other developers.&lt;/p&gt;

&lt;p&gt;The main application might look something like this in Ruby, using Sinatra:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'sinatra'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;"sinatra/config_file"&lt;/span&gt;

&lt;span class="c1"&gt;# Load the server configuration from config.yml:&lt;/span&gt;
&lt;span class="n"&gt;config_file&lt;/span&gt; &lt;span class="s1"&gt;'config.yml'&lt;/span&gt;

&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# EndPoints:&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# /sum/n1+n2+n3+n4+...&lt;/span&gt;
&lt;span class="c1"&gt;# Return:&lt;/span&gt;
&lt;span class="c1"&gt;#     {result: [sum of n1,n2,n3,n4,...]}&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Example:&lt;/span&gt;
&lt;span class="c1"&gt;#    $ curl http://localhost:8080/sum/1+2+3+4&lt;/span&gt;
&lt;span class="c1"&gt;#    {"result":"10"}&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s1"&gt;'/sum/:numbers'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;result: &lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"+"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;to_json&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A good software developer would be well aware of the many limitations of this solution compared to other ones. For example, this solution is limited to performing the sum of a set of numbers that fits in the URI; it has no explicit error checking, it interprets as zeros strings that do not start with a number, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Software Engineer - Brown Belt
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F96o60xeh1tthehshee7q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F96o60xeh1tthehshee7q.png" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
The difference between software developer and software engineer is arguable; I admit it fully. The two terms are typically used interchangeably. However, I am going to suggest that a software engineer is someone who has the CS knowledge of a computer scientist and a lot of experience as a Software Developer. The major differences are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ability to create more scalable systems.&lt;/li&gt;
&lt;li&gt;Longevity of their work. Their work lasts for longer and has fewer problems.&lt;/li&gt;
&lt;li&gt;Fewer bugs, and better code quality.&lt;/li&gt;
&lt;li&gt;Ability to be a technical lead for projects and teams.&lt;/li&gt;
&lt;li&gt;Possesses excellent collaboration and communication skills.&lt;/li&gt;
&lt;li&gt;Enough software architecture skills to be able to get the job done.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the industry, you'd find this kind of developer with titles such as "Senior Developer" or "Principal Developer."&lt;/p&gt;

&lt;h3&gt;
  
  
  An example
&lt;/h3&gt;

&lt;p&gt;A software engineer is someone who might choose to write the "sum of integers" application by building a service and exposing an API to take a set of integers as a developer would. However, I’d expect the software engineer solution to include improvements such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Result Caching.&lt;/li&gt;
&lt;li&gt;Abstraction of the concept from a sum to any mathematical expression passed in the request.&lt;/li&gt;
&lt;li&gt;Include logging, authentication, monitoring hooks, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  This example gets silly
&lt;/h3&gt;

&lt;p&gt;As you can tell, the simplicity of the example I chose becomes problematic and even foolish. It morphs into a discussion of how to improve an already over-engineered solution for a trivial problem.&lt;/p&gt;

&lt;p&gt;For example, managing a cache of the results of simple operations performed on a small set of numbers is most likely heavier and slower than making the calculations in the first place. It would make sense only if the set of numbers you could pass to the API were huge; but in that case, however, the list would not fit in the URI of the request. &lt;/p&gt;

&lt;p&gt;You could move the list of numbers to the body of the request, but then it would no longer be a RESTFUL API, and the request would no longer be cacheable. At that point, you'd be tempted to change the request to be a POST, but that would make it never cacheable. Anyway, the discussion could go on and on.&lt;/p&gt;

&lt;h3&gt;
  
  
  The critical part
&lt;/h3&gt;

&lt;p&gt;Do you see what's going on here? As the skills of a developer improve and projects become more complex, a funny thing happens. The hard choices become less and less centered on the "core code." Instead, they become more and more centered on handling the context in which the core code operates. &lt;/p&gt;

&lt;p&gt;As a result, highly skilled software engineers spend the majority of their time refining aspects of a system such as scalability, performance, error checking, robustness, maintainability, abstraction, portability, handling of edge conditions, etc. &lt;/p&gt;

&lt;p&gt;Also, they learn ways to work more efficiently or improve how they interface with other developers and how they plan to approach the work to minimize risks, etc. Building software becomes less about coding and more about engineering systems and solving problems. &lt;/p&gt;

&lt;h2&gt;
  
  
  Software Architect - Black Belt
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh77b6iucd8y2vhwiic9p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh77b6iucd8y2vhwiic9p.png" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
All software developers and software engineers need to be able to design the parts of the systems and products they are going to build. A "software architect" brings that skill to a higher level, and needs to be able to make design choices on the high-level interactions of larger software systems developed by other engineers. &lt;/p&gt;

&lt;h3&gt;
  
  
  An example
&lt;/h3&gt;

&lt;p&gt;In our example, among other things an architect might draw this diagram to guide the implementation of the service to sum a set of integers:&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Muscle memory and leadership
&lt;/h3&gt;

&lt;p&gt;To be able to do so effectively, a software architect must have been trained by years and years of experience in the weeds, working at all levels. That hands-on experience must have become embedded in their muscle memory. That allows an architect to make right high-level decisions without getting stuck in details.&lt;/p&gt;

&lt;p&gt;That said, I do not believe in pure architects, that is engineers in charge of making high-level decisions full-time. Instead, I think that reliable architects need to jump in and out the details, staying at a high level when necessary, ready to dive into the code regularly and efficiently.&lt;/p&gt;

&lt;p&gt;In martial arts a black belt teaches and mentors. I think that teaching and mentoring is also one of the functions of a software architect. The teaching I am referring to is not direct (lectures), but is more done by example, showing the way and guiding people to make their decisions. &lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusions
&lt;/h1&gt;

&lt;p&gt;Serious martial artists study their art all of their life; serious software developers do the same. I hope that you found this discussion useful. Hopefully, it gave some context to some terms that are often poorly defined and ideally it explained how to use common terms in more precise ways.&lt;/p&gt;




&lt;h3&gt;
  
  
  If you enjoyed this article, keep in touch!
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.coderhood.com" rel="noopener noreferrer"&gt;Find all my posts on CoderHood. Don't forget to Subscribe to receive notifications of new posts by Email.&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/lpasqualis/" rel="noopener noreferrer"&gt;Join my professional network on LinkedIn.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/lpasqualis" rel="noopener noreferrer"&gt;Follow me on Twitter.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/coderhood/" rel="noopener noreferrer"&gt;Join my Facebook page.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And finally, follow me here on dev.to!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>career</category>
      <category>code</category>
      <category>programming</category>
      <category>skills</category>
    </item>
  </channel>
</rss>
