<?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>Forem: Mohammed Osman</title>
    <description>The latest articles on Forem by Mohammed Osman (@smartercode).</description>
    <link>https://forem.com/smartercode</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%2F327909%2F91fbfc87-5d0d-431a-87af-79276d3f4fe1.jpg</url>
      <title>Forem: Mohammed Osman</title>
      <link>https://forem.com/smartercode</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/smartercode"/>
    <language>en</language>
    <item>
      <title>Write a code that endures endless business requirements: Part-3 On Designing Software Properly!</title>
      <dc:creator>Mohammed Osman</dc:creator>
      <pubDate>Thu, 12 Mar 2020 21:19:30 +0000</pubDate>
      <link>https://forem.com/pluralsight/write-a-code-that-endures-endless-business-requirements-part-3-on-design-software-properly-48d8</link>
      <guid>https://forem.com/pluralsight/write-a-code-that-endures-endless-business-requirements-part-3-on-design-software-properly-48d8</guid>
      <description>&lt;p&gt;Hello everyone!&lt;/p&gt;

&lt;p&gt;We've been spending a lot of time in the last blog posts
understanding &lt;a href="https://www.smartercode.io/19-why-you-should-aggressively-invest-in-your-coding-skills/"&gt;what
bad code is&lt;/a&gt;, how to &lt;a href="https://www.smartercode.io/write-a-code-that-endures-business-endless-requirements-part-1-on-code-quality-metrics/"&gt;objectively
measure it&lt;/a&gt;, and even more, how to &lt;a href="https://www.smartercode.io/write-a-code-that-endures-endless-business-requirements-part-1-on-code-refactoring/"&gt;refactor
a committed crime&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And now, the time comes to understand how we can brilliantly
craft a well-designed (hopefully?) &lt;a href="https://en.wikipedia.org/wiki/Greenfield_project"&gt;greenfield project&lt;/a&gt; that
is easy to maintain, to read, and to extend in the future.&lt;/p&gt;

&lt;p&gt;The purpose of software engineering is to control complexity
not to create it&lt;/p&gt;

&lt;p&gt;When developing software, the complexity lies in many areas,
such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understanding the business
requirements and using unified communication language. That is, what are the different
players we have across various business domains? What is, do our customers
speak? Why team A and team B have different names to the same things? &lt;/li&gt;
&lt;li&gt;How are we going to
architect and separate different application layers? How should each project
reference the other?&lt;/li&gt;
&lt;li&gt;How to make our code more
object-oriented, clean, and reusable?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To resolve the previously mentioned challenges, we are going
to discuss three things that aim to face them, respectively:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understanding the
application domain using Domain-Driven Design&lt;/li&gt;
&lt;li&gt;Understanding how to
architect and distinguish different parts of the application&lt;/li&gt;
&lt;li&gt;Doing the actual work and
crafting a well-designed code based on best practices&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Welcome to domain-driven design&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oo5iXEx5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i1.wp.com/www.smartercode.io/wp-content/uploads/2020/03/DDDpng.png%3Ffit%3D1024%252C595%26ssl%3D1" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oo5iXEx5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i1.wp.com/www.smartercode.io/wp-content/uploads/2020/03/DDDpng.png%3Ffit%3D1024%252C595%26ssl%3D1" alt="" class="wp-image-502" width="530" height="308"&gt;&lt;/a&gt; Figure 1 DDD bridges the business domain jargon and technology domain jargon by introducing ubiquitous language &lt;/p&gt;

&lt;p&gt;Briding the business jargon and technical jargon are already
discussed in a well-established methodology called Domain-Driven Design (DDD).
In his book (&lt;a href="https://www.smartercode.io/domain-driven-design-book"&gt;Domain-Driven
Design: Tackling Complexity in the Heart of Software&lt;/a&gt;), Eric Evans defines
Domain-Driven Design as a software approach to &lt;em&gt;complex&lt;/em&gt; needs by
connecting the implementation to an &lt;em&gt;evolving&lt;/em&gt; model. The words &lt;strong&gt;complex&lt;/strong&gt;
and &lt;strong&gt;evolving&lt;/strong&gt; are vital traits that we see in our daily software
requirements.&lt;/p&gt;

&lt;p&gt;The main objective of DDD is to set the focus on the domain
logic, which is considered the core logic. It also aims to base the software
design on the business domain. And most importantly, it seeks to bridge the gap
between the business domain jargon and the technology domain jargon by introducing
ubiquitous language. &lt;/p&gt;

&lt;p&gt;If you feel too lazy to read Eric Evan's book, I would like
to point you to &lt;a href="https://app.pluralsight.com/library/courses/domain-driven-design-fundamentals"&gt;this&lt;/a&gt;
fantastic Pluralsight course by Steve Smith and Julie Lerman.&lt;/p&gt;

&lt;h1&gt;Architecting Your Application&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aSDq0fo6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.smartercode.io/wp-content/uploads/2020/03/2010s-layered-architecture.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aSDq0fo6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.smartercode.io/wp-content/uploads/2020/03/2010s-layered-architecture.png" alt="" class="wp-image-501" width="505" height="381"&gt;&lt;/a&gt; Figure 2 A diagram showing an example of layered software architecture &lt;/p&gt;

&lt;p&gt;Another aspect that profoundly influences the
maintainability and extendability of our software solution is how do we
architect different decoupled layers of our application.&lt;/p&gt;

&lt;p&gt;By saying different layers, I mean different parts of
the software that have particular responsibilities. For example, the &lt;strong&gt;UI
layer&lt;/strong&gt; is used to designate what the user sees (Web Pages, Desktop Forms, or
Mobile App). In contrast, the &lt;strong&gt;Infrastructure layer&lt;/strong&gt; is used to designated
external dependencies to the software such as File Systems and Drivers. &lt;/p&gt;

&lt;p&gt;You will hear the term &lt;strong&gt;abstractions&lt;/strong&gt; to refer to the
fact that a specific piece of the software introduces a general level of
separation that makes it possible to replace it with other components. For
example, when we say that the user interface should be abstracted, that means
it should be easy to replace a web page interface with a mobile interface without
much changes to other parts of the code. The antonym of &lt;strong&gt;abstract &lt;/strong&gt;is&lt;strong&gt;
concrete &lt;/strong&gt;and is used to describe a piece of software that is highly
specialized in doing only one thing.&lt;/p&gt;

&lt;p&gt;A well-architected software is &lt;strong&gt;abstracted&lt;/strong&gt; just
enough to be general to all foreseen business scenarios. Yet, it is &lt;strong&gt;concrete&lt;/strong&gt;
enough to be understandable and fast to develop. An excellent architect is
always striking a balance between abstraction and concretion to develop the
software according to the business strategy and forecasted product demands.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.pluralsight.com/library/courses/architecting-applications-dotnet/table-of-contents"&gt;Architecting
Applications for the Real World in .NET&lt;/a&gt; is an excellent course by Cory
House that teaches how to think about your application layering. He discusses
different architectural styles and presents common software layers. I would
highly recommend it.&lt;/p&gt;

&lt;h1&gt;Writing well-designed code&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zjU_ETjq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.smartercode.io/wp-content/uploads/2020/03/java-oops.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zjU_ETjq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.smartercode.io/wp-content/uploads/2020/03/java-oops.png" alt="" class="wp-image-500" width="425" height="327"&gt;&lt;/a&gt; Figure 3 Components of OOP &lt;/p&gt;

&lt;p&gt;After we knew how to understand the business jargon and map
it to the technical jargon using DDD and how to architect our application to
different layers, now comes the time to get into the details and learn how to design
our code correctly. And by code, I do not mean application layers but
rather how to ensure proper OOP (object-oriented programming) and, most
importantly, adequate OOD (object-oriented design).&lt;/p&gt;

&lt;p&gt;I would recommend two courses by Zoran Horvat to develop
object programming skills&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.pluralsight.com/library/courses/c-sharp-code-more-object-oriented/table-of-contents"&gt;Making
Your C# Code More Object-oriented by Zoran Horvat&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.smartercode.io/master-iterative-oop"&gt;Mastering
Iterative Object-oriented Development in C#&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is it! This concludes our series on Code Quality, tell
me what do you think!&lt;/p&gt;

</description>
      <category>programming</category>
    </item>
    <item>
      <title>Write a code that endures endless business requirements: Part-2 On Code Refactoring!</title>
      <dc:creator>Mohammed Osman</dc:creator>
      <pubDate>Sun, 16 Feb 2020 15:11:00 +0000</pubDate>
      <link>https://forem.com/pluralsight/write-a-code-that-endures-endless-business-requirements-part-2-on-code-refactoring-19m3</link>
      <guid>https://forem.com/pluralsight/write-a-code-that-endures-endless-business-requirements-part-2-on-code-refactoring-19m3</guid>
      <description>&lt;p&gt;So, you got to know
what are the consequences of bad code (&lt;a href="https://www.smartercode.io/19-why-you-should-aggressively-invest-in-your-coding-skills/"&gt;here&lt;/a&gt;
&amp;amp; &lt;a href="https://www.smartercode.io/19-why-you-should-aggressively-invest-in-your-coding-skills/"&gt;here&lt;/a&gt;).
You also got to understand how you can objectively decide if a particular piece
of code is horrible or not (&lt;a href="https://www.smartercode.io/write-a-code-that-endures-business-endless-requirements-part-1-on-code-quality-metrics/"&gt;here&lt;/a&gt;).
Then comes the question:&lt;/p&gt;

&lt;p&gt;Ok, I have inherited this devilish system. What should I do
to improve it aside from nagging to my manager?&lt;/p&gt;

&lt;p&gt;Luckily, again, the software industry is experienced in dealing with such &lt;a href="https://en.wikipedia.org/wiki/Brownfield_(software_development)"&gt;Brownfield&lt;/a&gt; projects. But before discussing how we can improve a brownfield project, let us explain why I believe it is a &lt;strong&gt;must skill &lt;/strong&gt;to able to fix and refactor legacy projects. Let’s discuss what refactoring is, and then we make a case for it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--50pIdqZo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.smartercode.io/wp-content/uploads/2020/02/why-refactoring.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--50pIdqZo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.smartercode.io/wp-content/uploads/2020/02/why-refactoring.jpg" alt="" class="wp-image-479" width="392" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;What is Refactoring?&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Refactoring&lt;/strong&gt; is the process of restructuring existing
computer code—changing the factoring—without changing its external behavior&lt;/p&gt;

&lt;p&gt;Simply put, make my code easier to understand and change without
changing its business behavior. &lt;a href="https://en.wikipedia.org/wiki/Robert_C._Martin"&gt;Uncle Bob&lt;/a&gt; made it on
the spot!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--76Khvf3y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.smartercode.io/wp-content/uploads/2020/02/bob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--76Khvf3y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.smartercode.io/wp-content/uploads/2020/02/bob.png" alt="" class="wp-image-480" width="431" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;Why Refactoring? &lt;/h1&gt;

&lt;p&gt;Since I love philosophy and theoretical discussions, I
always find it interesting -and also useful- to start with the why question.
Let us discuss why we need refactoring in the first place. From WHY questions,
we build wisdom!&lt;/p&gt;

&lt;h2&gt;Being a good citizen&lt;/h2&gt;

&lt;p&gt;I always believe in “&lt;strong&gt;Make Your Code Cleaner than Your
Found&lt;/strong&gt; &lt;strong&gt;It&lt;/strong&gt;.” Refactoring and cleaning code is a healthy sign of a
professional developer; it tells that you care about the product, your employer,
and, most importantly, your work quality and professional standards. Not only
that, it will put you in a position to be a leader by doing, which is a way
stronger position than leading by fluffing or talking all day about quality and
so. Remember: Actions are louder than words.&lt;/p&gt;

&lt;h2&gt;You will work with legacy systems MOST of your careers&lt;/h2&gt;

&lt;p&gt;Software systems are expensive; we all know. And when they
are developed, they are meant to stay for years to come until they recover
their &lt;a href="https://en.wikipedia.org/wiki/Return_on_investment"&gt;ROI&lt;/a&gt;. If
it is an HR system, the company wants to make sure that they save money on
automating manual processes, having fewer errors, and obtaining a better
experience. If it is integration, the company wants to save time on less data
quality errors, centralized management, and quicker processes. At the end of
the day, business is just a simple math game, and every software system must
comply with it; otherwise, it does not worth it!&lt;/p&gt;

&lt;p&gt;So, if you read studies about the total cost of ownership (&lt;a href="https://en.wikipedia.org/wiki/Total_cost_of_ownership"&gt;TCO&lt;/a&gt;), you will
find that research suggests that 80% of the software life cycle costs are
actually maintenance costs, while the 20% is the development or acquisition
cost. Dump math will tell you that out of each five projects you work on, only
one will be a &lt;a href="https://en.wikipedia.org/wiki/Greenfield_project"&gt;Greenfield
project&lt;/a&gt;. If you managed to find such a project, believe me, you are fortunate!&lt;/p&gt;

&lt;p&gt;Therefore, the fact that you will most probably work on a
legacy project simply means that you need to learn how to read a lousy code
someone else wrote, and most importantly, how to improve it!&lt;/p&gt;

&lt;h2&gt;Reducing technical debt&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Technical_debt"&gt;Technical
debt&lt;/a&gt; is one of the most dangerous things that the business is usually
unaware of. The more complex and rigid the code is, the more expensive it is to
change. We have discussed that extensively in 
(&lt;a href="https://www.smartercode.io/19-why-you-should-aggressively-invest-in-your-coding-skills/"&gt;here&lt;/a&gt;
&amp;amp; &lt;a href="https://www.smartercode.io/19-why-you-should-aggressively-invest-in-your-coding-skills/"&gt;here&lt;/a&gt;).
So, if you refactor and optimize your code so that it becomes easier to change
and extend, you are doing a big favor for the business! It means better growth
opportunities, better customer reaction, and better time to market.&lt;/p&gt;

&lt;h1&gt;What are the common Refactoring techniques?&lt;/h1&gt;

&lt;h2&gt;Red-Green-Refactor&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WbvNAlWn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i2.wp.com/www.smartercode.io/wp-content/uploads/2020/02/Refactoring.png%3Ffit%3D1024%252C538%26ssl%3D1" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WbvNAlWn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i2.wp.com/www.smartercode.io/wp-content/uploads/2020/02/Refactoring.png%3Ffit%3D1024%252C538%26ssl%3D1" alt="" class="wp-image-482" width="366" height="191"&gt;&lt;/a&gt; Figure 1 Source &lt;a href="http://bit.ly/31ZIGB1"&gt;&lt;/a&gt;&lt;a href="http://bit.ly/31ZIGB1"&gt;http://bit.ly/31ZIGB1&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;One common refactoring technique is inspired from the test-driven
development approach (&lt;a href="https://technologyconversations.com/2013/12/20/test-driven-development-tdd-example-walkthrough/"&gt;TDD&lt;/a&gt;)
and follows three simple steps. It can be thought of as a general refactoring
guideline.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Green: Write just
enough unit tests to make a small piece of the current code passes. This will
give you the confidence in your code so that if something breaks, you can
detect it.&lt;/li&gt;
&lt;li&gt;Refactor: Since you
have backed-up yourself, refactor your code with confidence. If you break your
code, your unit tests will hopefully fail (given that you have good enough &lt;a href="https://en.wikipedia.org/wiki/Code_coverage"&gt;code coverage&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Red: The changes you
introduced during the refactoring phase will likely break your currently
working code, thanks to unit tests. You can repeat the cycle from here to fix
the code and go again to the green state.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This process continues iteratively through the code base
until we reach an acceptable level of code quality.&lt;/p&gt;

&lt;h2&gt;Composing Methods&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5UjJLyfu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.smartercode.io/wp-content/uploads/2020/02/extract-code-scope-selection1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5UjJLyfu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.smartercode.io/wp-content/uploads/2020/02/extract-code-scope-selection1.png" alt="" class="wp-image-483" width="330" height="246"&gt;&lt;/a&gt; Figure 2 Source &lt;a href="http://bit.ly/2SueSJA"&gt;&lt;/a&gt;&lt;a href="http://bit.ly/2SueSJA"&gt;http://bit.ly/2SueSJA&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;A simple and conventional way to do abstraction is by
composing methods, that is, by identifying repetitive pieces of logic and
extract them to separate methods. Common pieces of logic I have seen that need
to be refactored are logging logic, file reading logic, and printing logic. &lt;/p&gt;

&lt;h2&gt;Abstraction&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qki8oam_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i1.wp.com/www.smartercode.io/wp-content/uploads/2020/02/by-abstraction.png%3Ffit%3D1024%252C538%26ssl%3D1" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qki8oam_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i1.wp.com/www.smartercode.io/wp-content/uploads/2020/02/by-abstraction.png%3Ffit%3D1024%252C538%26ssl%3D1" alt="" class="wp-image-484" width="426" height="223"&gt;&lt;/a&gt; Figure 3 Source &lt;a href="http://bit.ly/31ZIGB1"&gt;&lt;/a&gt;&lt;a href="http://bit.ly/31ZIGB1"&gt;http://bit.ly/31ZIGB1&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;A common way to do refactoring by introducing a refactoring
layer. Either in cross-systems integration scenarios or even within the same
code base. A refactoring layer is typically introduced to protect developers
against ugly, yet necessary code bases. A common scenario I have seen across
systems is when integrating with banking systems. Most banks have introduced an
API wrapper against complex mainframe interfaces that almost no one understands
how it works. Other ways to do abstraction within the same code base is through
class inheritance and extraction.&lt;/p&gt;

&lt;h2&gt;Moving Features Between Objects&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t1cFHPFg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.smartercode.io/wp-content/uploads/2020/02/moving-objects-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t1cFHPFg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.smartercode.io/wp-content/uploads/2020/02/moving-objects-1.jpg" alt="" class="wp-image-485" width="428" height="208"&gt;&lt;/a&gt; Figure 4 Source &lt;a href="http://bit.ly/2vFKe6N"&gt;&lt;/a&gt;&lt;a href="http://bit.ly/2vFKe6N"&gt;http://bit.ly/2vFKe6N&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;An essential principle in object-oriented design is the
single responsibility principle: That is, a specific class, method, or piece of
logic should be responsible for the only thing. Therefore, having classes that
do too many different things (e.g., calculating employee salary and printing
it) is considered against ODD. There are a strong case and reason why this is
unacceptable: Simply because it introduces unnecessary dependencies across the
code and makes it difficult to change. &lt;/p&gt;

&lt;h2&gt;Simplifying conditionals&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---E4J1wxQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i1.wp.com/www.smartercode.io/wp-content/uploads/2020/02/Simplified-illustration-of-the-main-conditional-expressions-controlling-the-life-death.png%3Ffit%3D697%252C1024%26ssl%3D1" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---E4J1wxQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i1.wp.com/www.smartercode.io/wp-content/uploads/2020/02/Simplified-illustration-of-the-main-conditional-expressions-controlling-the-life-death.png%3Ffit%3D697%252C1024%26ssl%3D1" alt="" class="wp-image-486" width="249" height="365"&gt;&lt;/a&gt; Figure 5 Source &lt;a href="http://bit.ly/3bGSXGq"&gt;&lt;/a&gt;&lt;a href="http://bit.ly/3bGSXGq"&gt;http://bit.ly/3bGSXGq&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Is this image very confusing to understand right? Hhhh, yes,
this is on purpose! Do not spend your time digesting it. We won’t go through
it. The complexity you are facing to understand this diagram is too excessive
conditional complexity. Many techniques help in reducing conditional complexity,
such as replacing nested conditions with guard clauses and replacing conditions
with polymorphism.&lt;/p&gt;

&lt;h1&gt;Convincing business to refactor?&lt;/h1&gt;

&lt;p&gt;Justifying refactoring to business is one of the most challenging
tasks I have been into. The thing is that the business perception is that they are
paying for something that does not deliver a “tangible” functional requirement
from their point of view of course. The trick to this situation is to convince
businesses with the language they understand, NUMBERS. Try to make a comparison
on how long it takes to modify a specific feature with well-written code and
another feature with ugly code and show them the percentage of productivity
improvement. Yes, a tough and detailed task, but this is what it takes to
convince non-technical people.&lt;/p&gt;

&lt;p&gt;Moreover, I would like to ask to use refactoring
responsibility not to overengineer your solution (have you heard of &lt;a href="https://en.wikipedia.org/wiki/Analysis_paralysis"&gt;analysis-paralysis&lt;/a&gt;?)
and focus only on refactoring critical, and most moving parts in your codebase.
One excellent candidate for that would be an invoicing engine logic that
requires to be adapted a lot to the market needs. Avoid refactoring
non-changing parts such as CRUD logic areas unless you have a clear business
justification. At the end of the day, remember, we are at dollars business!&lt;/p&gt;

&lt;h1&gt;Important Resources&lt;/h1&gt;

&lt;p&gt;Finally, I would like to conclude this post by sharing some
resources that I believe help a lot in improving your refactoring skills.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://amzn.to/325ei8b"&gt;&lt;strong&gt;https://amzn.to/325ei8b&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; The well-known refactoring book by
Martin Fowler, highly recommended&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sourcemaking.com/"&gt;&lt;strong&gt;https://sourcemaking.com/&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; Excellent website that teaches
refactoring in an interactive way&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.udemy.com/course/refactoring-to-patterns/"&gt;&lt;strong&gt;https://www.udemy.com/course/refactoring-to-patterns/&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; Excellent course that teaches you
design pattern by doing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.pluralsight.com/library/courses/refactoring-csharp-developers/table-of-contents"&gt;&lt;strong&gt;https://app.pluralsight.com/library/courses/refactoring-csharp-developers/table-of-contents&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; A good course that teaches basic
concepts of refactoring&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>codequality</category>
      <category>refactorit</category>
      <category>productivity</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Write a code that endures endless business requirements: Part-1 On Code Quality Metrics!</title>
      <dc:creator>Mohammed Osman</dc:creator>
      <pubDate>Mon, 03 Feb 2020 19:00:36 +0000</pubDate>
      <link>https://forem.com/pluralsight/write-a-code-that-endures-endless-business-requirements-part-1-on-code-quality-metrics-4gn4</link>
      <guid>https://forem.com/pluralsight/write-a-code-that-endures-endless-business-requirements-part-1-on-code-quality-metrics-4gn4</guid>
      <description>&lt;p&gt;Hi everyone!&lt;/p&gt;

&lt;p&gt;Here I am back after a long vacation (one month and a half!)
in my home country, Sudan. It was an amazing vacation where I met many old
friends, relatives and enjoyed our local food!&lt;/p&gt;

&lt;p&gt;Returning to blogging. I discussed why you should
aggressively invest in your coding skills in &lt;a href="https://www.smartercode.io/19-why-you-should-aggressively-invest-in-your-coding-skills/"&gt;Part-1&lt;/a&gt;
and &lt;a href="Why%20you%20should%20aggressively%20invest%20on%20your%20clean%20coding%20skills-Part%202"&gt;Part-2&lt;/a&gt;.
I hope that I made a clear case and convinced you that writing good code is not
a luxury but rather a necessity in a world full of &lt;a href="https://en.wikipedia.org/wiki/Cowboy_coding"&gt;coding cowboys&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now, I will shift the focus from the problem to the solution.
We will take a three parts series that will give some insights on how to write better
code. In the first post, we will learn how we can measure our code complexity.
In the second post, we will learn how can we design a proper greenfield
solution. Finally, in the last part, we will learn how to refactor a brownfield
solution.&lt;/p&gt;

&lt;p&gt;Ready? Let us start our storytelling in the first part.&lt;/p&gt;

&lt;h1&gt;Oops, it is another incident!&lt;/h1&gt;

&lt;p&gt;Usually, you start your day as a developer with a cup of
coffee after having your standup meeting. Then, you run into your computer
fully energized and ready to implement a new future the business requested. But
unfortunately, it does not always go smoothly!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hAhBxaR9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.smartercode.io/wp-content/uploads/2020/02/incident-800.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hAhBxaR9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.smartercode.io/wp-content/uploads/2020/02/incident-800.jpg" alt="" class="wp-image-467" width="326" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You get an email from an operation manager that there is a
critical application feature that is down and he requests your urgent
intervention to fix it. There is no other option, as this critical system is a
money cow for the company and the incident is affecting thousands of users who
pay your collogues payroll! You are asked straight away to prioritize new
developments down and focus on this incident. Even worse, the feature has been
developed by a friend who left the company years ago in a codebase you are not
familiar with 😊 Sounds familiar, huh?&lt;/p&gt;

&lt;h1&gt;The curse is coming …&lt;/h1&gt;

&lt;p&gt;You got the heat and decided to navigate the codebase and
understand what is going on. You open your Visual Studio (Read IntelliJ,
PyCharm, whatever!). You found the code area that you suspect is the root cause
of the issue and decide to troubleshoot. And here is how it looks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z96q_3jk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.smartercode.io/wp-content/uploads/2020/02/Picture1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z96q_3jk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.smartercode.io/wp-content/uploads/2020/02/Picture1.png" alt="" class="wp-image-468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Trrrrra!!! This ladder-style coding is well recognized for
us since the early days we started learning how to program. It is called &lt;a href="https://en.wikipedia.org/wiki/Spaghetti_code"&gt;Spaghetti Code&lt;/a&gt;; it is a horrible, disgusting, foolish and terrible
coding style!&lt;/p&gt;

&lt;p&gt;You curse the developer who wrote the code as you are
receiving huge pressure from the project manager and the business stakeholders
to fix the issue and restore the normal application operation.&lt;/p&gt;

&lt;p&gt;Away from the emotional reaction towards a spaghetti code,
let us try and analyze the objective disasters with it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Would you feel safe
modifying this code?&lt;/li&gt;
&lt;li&gt;Can you make it readable?&lt;/li&gt;
&lt;li&gt;Can you write unit tests
against this code?&lt;/li&gt;
&lt;li&gt;Do you think it would be
flexible against future business requirements?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For an organization, such code means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Low time to Market&lt;/li&gt;
&lt;li&gt;High maintenance cost&lt;/li&gt;
&lt;li&gt;Lower system availability&lt;/li&gt;
&lt;li&gt;Less business agility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thus, Decreased overall organization competitiveness.
Therefore, such a coding style is a business threat, and we should have the
proper forensic measures to deal with it.&lt;/p&gt;

&lt;h1&gt;Introducing Code Complexity Metrics&lt;/h1&gt;

&lt;blockquote class="wp-block-quote"&gt;&lt;p&gt;What gets measured gets done&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Fortunately, our understanding of software development
methodologies has developed to the extent that it made us develop some
objective metrics to measure the code quality. These metrics serve as a vehicle
to assess different aspects of code quality, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Depth of Inheritance:
This metric tells us how deep a certain class goes in the inheritance tree.&lt;/li&gt;
&lt;li&gt;Cyclomatic Complexity
(CC): My favorite metric! It tells us how difficult it is to test our code;
it relies mainly on measuring the number of branching we have on our code.
Industry recommendations are to make it below 10; it only matters on the method
level.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refer to this &lt;a href="http://bit.ly/2YhtAVx"&gt;academic paper&lt;/a&gt; for a more in-depth analysis of
Cyclomatic Complexity.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maintainability Index:
A percentage indicating how difficult it is to maintain a certain piece of code.&lt;/li&gt;
&lt;li&gt;Class Coupling: According
to &lt;a href="https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-values?view=vs-2019"&gt;MSDN&lt;/a&gt;,
“Measures the coupling to unique classes through parameters, local variables,
return types, method calls, generic or template instantiations, base classes,
interface implementations, fields defined on external types, and attribute
decoration.” This metric works best to assess the code from an OOP point of
view.&lt;/li&gt;
&lt;li&gt;Cognitive Complexity:
A new measure introduced by Sonar Source in their &lt;a href="https://www.sonarsource.com/docs/CognitiveComplexity.pdf"&gt;White Paper&lt;/a&gt;.
Unlike the Cyclomatic Complexity, which aims to tell how difficult the code is
to test, cognitive complexity aims to tell how difficult the code is to
understand. However, not many tools support cognitive complexity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depth of Inheritance, Cyclomatic Complexity,
Class Coupling, and Maintainability index are the most common metrics in the
industry.&lt;/p&gt;

&lt;h2&gt;Why do we have very bad programming experience?&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---ZbCkdiz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i0.wp.com/www.smartercode.io/wp-content/uploads/2020/02/Picture2.png%3Ffit%3D1024%252C407%26ssl%3D1" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---ZbCkdiz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i0.wp.com/www.smartercode.io/wp-content/uploads/2020/02/Picture2.png%3Ffit%3D1024%252C407%26ssl%3D1" alt="" class="wp-image-469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we look at the code quality metrics in Visual Studio (&lt;a href="https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-values?view=vs-2019"&gt;Click
to learn how to do it&lt;/a&gt;), we will end up with the image shown above. The
arrows point clearly on the metrics for the method “&lt;strong&gt;VeryComplexCode&lt;/strong&gt;” we
see that it has Maintainability Index of 60 and Cyclomatic Complexity of 8. The
numbers tell us we have some problematic parts in the code. Such metrics are
extremely useful to quickly analyze big projects and decide on critical parts,
which, if fixed, will result in the greatest ROI on the project.&lt;/p&gt;

&lt;p&gt;So, the conclusion I would like to draw here is:&lt;/p&gt;

&lt;p&gt;The more
nesting we have in our code, the more complex it will be. Therefore, we should
strive to minimize nesting.&lt;/p&gt;

&lt;h2&gt;More reads around improving Cyclomatic Complexity &lt;/h2&gt;

&lt;p&gt;Attaining the skill to write an excellent code takes time,
effort and education. However, it is a long term strategic skill I would highly
recommend learning. Here are some resources I would recommend based on my
experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.codinghelmet.com/articles"&gt;15 Articles
series by Zoran Horvat on how to reduce Cyclomatic Complexity&lt;/a&gt;: An extremely
useful blog posts series by Zoran Horvat on how to improve code complexity, he
starts from a dirty, ugly code and reasons towards better-refactored design.
Useful post to understand the thought process behind design patterns.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.pluralsight.com/library/courses/patterns-library/table-of-contents"&gt;Design
Patterns Library&lt;/a&gt;: A must to have skill for any decently developed code is
the proper usage of design patterns. Pluralsight has an extensive course that
covers a wide range of design patterns by many world-class authors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ardalis.com/measuring-aggregate-complexity-in-software-applications"&gt;Aggregate
Complexity&lt;/a&gt;: Cyclomatic Complexity has certain limitations when it comes to
large codebases, Steve Smith, has developed a unique metric called aggregate
complexity to overcome that; it will be interesting to read on that.&lt;/p&gt;

&lt;p&gt;If the guy who developed the previously presented
problematic code has read the previous courses and applied them, the business application
would be in better shape in terms of agility, maintainability, and stability!
Your life as a succeeding developer will be easier too!&lt;/p&gt;

&lt;h1&gt;Final Words&lt;/h1&gt;

&lt;blockquote class="wp-block-quote"&gt;
&lt;p&gt;No matter how good and recent your platform/infrastructure stack is (e.g., Kubernetes, clustering, HA, etc.), bad code will always beat good hardware.&lt;/p&gt;
&lt;p&gt;A bad code for me is like a careless student you sent to MIT (1st world-ranked engineering school), they will never learn, not because of MIT, but because of the student. Good code is like a hardworking student from very underprivileged school; he succeeds at the end (e.g., Google CEO)&lt;/p&gt;
&lt;cite&gt; Mohammed Osman &lt;/cite&gt;
&lt;/blockquote&gt;

</description>
      <category>programming</category>
      <category>codequality</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Software is eating the world: Why you need to question your current career!
</title>
      <dc:creator>Mohammed Osman</dc:creator>
      <pubDate>Fri, 31 Jan 2020 20:24:59 +0000</pubDate>
      <link>https://forem.com/pluralsight/software-is-eating-the-world-why-you-need-to-question-your-current-career-16f5</link>
      <guid>https://forem.com/pluralsight/software-is-eating-the-world-why-you-need-to-question-your-current-career-16f5</guid>
      <description>&lt;h1&gt;
  
  
  Background
&lt;/h1&gt;

&lt;p&gt;"Software is eating the world" This is the most expressive statement I have ever read which describes the current craziness and hastiness in the software industry. Starting from IoT, self-driving cars, AI/ML, cryptocurrencies, automation to continuous innovation from startups and industry giants, and any buzzword that you have heard.&lt;/p&gt;

&lt;p&gt;Under the stress of this nasty wave, a pressing question always pops-up to all technology field workers: What should I do about it? Should I just jump on any technology boat I see and go with the flow? Should I be a little bit critical and set some criteria before deciding on investing time on it? Or should I just drop the whole technical track and seek a managerial one with less learning hassle?&lt;/p&gt;

&lt;p&gt;In this articles series, I will try to answer some of these tough questions. However, I need everyone to contribute to and discuss this critical topic. I will start the series by sharing an experience I had that I believe will help on framing our minds and clarifying the current status quo on how fast the IT market is going. Afterward, we can deduce some lessons out of it to prepare the path to our future articles.&lt;/p&gt;

&lt;h1&gt;
  
  
  Recalling
&lt;/h1&gt;

&lt;p&gt;Some time ago, we got a project from a client who needed to modernize their IT to newer technology that is more supported in the market and which the engineers are willing to learn. Their critical system was based on a mainframe, yes, the big ugly computer which you probably only seen in computer architecture textbooks during undergrad studies!&lt;/p&gt;

&lt;p&gt;I met the system owner who seemed to be quite experienced with the Mainframe ins and outs, and of course, way older than me. I collected the requirements, ended the meeting and thanked him for his help. However, that stumbled something in my head …&lt;/p&gt;

&lt;p&gt;When I returned home, I started to think: Ummm… How would the technology world look like after 30 or 40 years? Is it possible that I will just be stuck to a particular technology and continue using it until I get to the pension? Is it possible that the current technologies I work with which has ample market demand will be a statue in the technology museum? Should I just keep reading and reading forever? It would be impossible for me to compete with all "cool kids" knowing the latest and greatest in the field and have more energy and time than I do, hmmm, &lt;em&gt;it does not look good&lt;/em&gt;!&lt;/p&gt;

&lt;p&gt;I started recalling in 2002 when I learned Visual Basic 6.0 after one year and a half, Microsoft released Visual Basic .NET and I knew that I must learn it over again! I remembered my graduation project when we planned to use OpenCV for specific image processing task (because I had some experience on it at that time), I checked the documentation and, BOOM new versions were released! Oh, I have to update my knowledge! You cannot rely on 2+ years knowledge my friend!&lt;/p&gt;

&lt;p&gt;To make things even worse; Once before, I implemented some reports using PowerBI, just a couple of months later I got some requests to do some changes on them – Simple it will take few minutes since I already know it! So, I went to start menu, launch PowerBI and ooooops! It is requesting an update, I updated it, few features were changed and added, and I have to learn them to the required changes correctly! What on earth?! PowerBI has a monthly release cycle, I had to set up a monthly reminder to read their blog.&lt;/p&gt;

&lt;p&gt;The conclusion I would like to convey reach here is that: Technology is not changing on constant velocity, it is changing on accelerated velocity! These tiny technology cycles can put you on a pension very quickly if you do not keep up with them!&lt;/p&gt;

&lt;h1&gt;
  
  
  Reflection
&lt;/h1&gt;

&lt;p&gt;Why it is going SO FAST ?! Well, the variety of different platforms which developers can target such as mobiles, wearables, and tablets have put extra demands on technologists as businesses are trying to be more pervasive. Moreover, our user experience expectations became really high, we no longer tolerate slow apps, unresponsive pages, the static layout which is on the other side pushing performant JavaScript frameworks such as NodeJS, Angular, and ReactJS and causing them what is called &lt;a href="https://www.quora.com/What-is-JavaScript-fatigue"&gt;JavaScript Fatigue&lt;/a&gt;. On the relevant side, the recent development in telecommunication/electronics field made both mobiles and internet cheaper which created ample supply of internet-enabled terminals. Therefore, many companies implemented distributed/cloud computing philosophies possibly backed by a functional programming language to meet the enormous demand, this has also added an extra burden on developers to build distributed computing and security competences. Even more, economic cycles and market competition are pushing firms to automate everything to save costs, reduce labor and respond to client demands quickly which gave the raise to DevOps skill. Inevitably, big companies such as Microsoft started shortening their certifications validity from two years to a single year. The extended-release cycles of 1 year or 6 months are no-longer affordable; it is the market pressure and business agility that is pushing the software industry to behave so.&lt;/p&gt;

&lt;p&gt;Enough hard news :). Let us analyze and think what this means in practice and what impact does it have on businesses and employment opportunities.&lt;/p&gt;

&lt;h1&gt;
  
  
  Lessons Learned
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;For developers:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Effective and smart learning techniques and strategies are required. By effective learning techniques, I mean methods that will help you to identify hot markets, hot technologies, trends, learning how to focus on what matters, learning things quickly and so. The learning topics is a big topic and deserve a fully dense article on its own.&lt;/li&gt;
&lt;li&gt;Specialization became more valuable, as the platforms are becoming more sophisticated and " Jack of all trades" is no longer acceptable for many companies since mastering a particular track is a non-trivial time and effort investment (well, this is subject to debate!)&lt;/li&gt;
&lt;li&gt;The software engineering field is becoming a well-paid field, in particular for renowned experts since it is not easy to become a well-versed engineer.&lt;/li&gt;
&lt;li&gt;Soft-skills such as negotiation skills, requirements engineering, time planning, public speaking are timeless valuable skills that will boost career opportunities.&lt;/li&gt;
&lt;li&gt;Domain knowledge is always valuable, it worth it to spend time understanding the business rules, domain language and concepts on a specific business area you are working in such as health, HR, banking, etc. The domain knowledge deprecates slowly which makes its ROI high, it will help you to easily communicate with the business people and be " close to their hearts!".&lt;/li&gt;
&lt;li&gt;Facing imposter syndrome is normal (feeling that you are incompetent), however, be aware of Dunning Kruger effect (feeling that you are superior). I'd just refer you to &lt;a href="https://ardalis.com/the-more-you-know-the-more-you-realize-you-dont-know"&gt;this&lt;/a&gt; cool article by Ardalis for more details.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;For managers:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The managers need to be less aggressive on deadlines, unexpected deliveries, and issues. The technology is really becoming volatile and irregular, the most senior developer in your team will doubt his knowledge.&lt;/li&gt;
&lt;li&gt;I know that many managers who were technical for a long time are quite confident that they can fully understand and follow technical conversations based on their previous understanding. A typical manager would say: "&lt;em&gt;I know that the new changes of technologies are just new features and syntactical improvements, in the end, it is just classes, components, servers, integration, and protocols. I do not really need to know the nitty details or learn something more, I will just build on what I know and focus on improving my managerial skills.&lt;/em&gt;" Well, I would say Yes and No. Yes, at the fact that it is true you should not focus on details. And No on that you are planning to only reuse your previous knowledge. Unfortunately, no my friend, it is not enough because the software philosophy itself started to change. Things such as reactive programming, serverless functions, and GraphQL emerged and has an entirely different perspective from previous programming approaches. You need to have exposure to recent technology trends and directions to properly keep up.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;For companies:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Do not be shortsighted, investment in recent and modern technologies could be cumbersome on the beginning, but they will be very rewarding in forms of higher support, better UX and productivity. More importantly, in talent retention, as top-performers are always worried about their careers and prefer working with new tech stacks.&lt;/li&gt;
&lt;li&gt;The companies started to adopt " Hire for attitude and train for skills." Academic research has found that attitude is extremely difficult to change while technical skills are easy to each to the right person. The interviews focus shifted more to validate understanding of general concepts, quick learning ability, problem-solving skills and critical thinking – traits which are considered timeless in nature.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Enough for today, in the upcoming articles I will share some tips and techniques on how to learn and to keep yourself updated, stay tuned do not forget to subscribe to the newsletter to get the LASTEST and GREATEST to make your code smart and your career smarter (&lt;a href="https://www.smartercode.io"&gt;https://www.smartercode.io&lt;/a&gt;)!&lt;/p&gt;

</description>
      <category>career</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
