<?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: Jamie Livingstone</title>
    <description>The latest articles on Forem by Jamie Livingstone (@jamielivingstone).</description>
    <link>https://forem.com/jamielivingstone</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%2F141289%2Fa4a18c00-86a1-43fc-b5d6-598a21876035.png</url>
      <title>Forem: Jamie Livingstone</title>
      <link>https://forem.com/jamielivingstone</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jamielivingstone"/>
    <language>en</language>
    <item>
      <title>Tips to become a great software engineer</title>
      <dc:creator>Jamie Livingstone</dc:creator>
      <pubDate>Wed, 02 Nov 2022 10:35:20 +0000</pubDate>
      <link>https://forem.com/jamielivingstone/tips-to-become-a-great-software-engineer-10gf</link>
      <guid>https://forem.com/jamielivingstone/tips-to-become-a-great-software-engineer-10gf</guid>
      <description>&lt;p&gt;Becoming a great software engineer should be a goal that all professionals strive for, but what is the difference between somebody who can write code and a great software engineer?&lt;/p&gt;

&lt;p&gt;If you asked 100 hiring managers this question, you would likely get 100 different responses, and this is because the field is so vast, and every company prioritises specific skills.&lt;/p&gt;

&lt;p&gt;If you asked me this question, I would say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"A great engineer is a person who has excellent problem-solving skills, a breadth of technical knowledge, can communicate effectively, possesses strong business acumen and is empathetic".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Master the fundamentals
&lt;/h2&gt;

&lt;p&gt;The technology sector innovates at lightning speed, with this comes new programming languages, frameworks and tools. A common mistake people make is chasing their tail and constantly trying to be on trend, leading to burnout and enormous wasted hours.&lt;/p&gt;

&lt;p&gt;The fundamentals of software rarely change, and focusing on them allows you to develop an arsenal of timeless skills that will stand the test of time.&lt;/p&gt;

&lt;p&gt;It is easy to get caught up in the wave of hype-driven development that appears in every direction that you look, but if you take a moment to reflect and think of all the hours that you have spent learning trends that are no longer relevant, you could you have spent that time more wisely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fundamentals all software engineers should learn:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data structures and algorithms&lt;/li&gt;
&lt;li&gt;Programming paradigms (OOP and functional)&lt;/li&gt;
&lt;li&gt;Testing procedures (Unit, integration and functional testing)&lt;/li&gt;
&lt;li&gt;Security (OWASP top ten)&lt;/li&gt;
&lt;li&gt;Networking&lt;/li&gt;
&lt;li&gt;Operating systems&lt;/li&gt;
&lt;li&gt;System design&lt;/li&gt;
&lt;li&gt;Cloud computing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Create side projects
&lt;/h2&gt;

&lt;p&gt;Creating open-source side projects is one of the ultimate ways to level up your technical ability whilst showcasing your technical skills to prospective employers.&lt;/p&gt;

&lt;p&gt;When creating new projects, it is wise not to be overly ambitious and build something that you are confident you can see through until completion. It is better to have several smaller, well-built projects that showcase your best work rather than incomplete ambitious ones.&lt;/p&gt;

&lt;p&gt;Keep them fun, use them for experimenting and reap the benefits of learning in public.&lt;/p&gt;

&lt;p&gt;If you need inspiration, &lt;a href="https://github.com/florinpop17/app-ideas"&gt;here&lt;/a&gt; is an excellent repository that categorises ideas by difficulty.&lt;/p&gt;

&lt;h2&gt;
  
  
  Develop business acumen
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Business acumen, also known as business savviness, business sense and business understanding, is keenness and quickness in understanding and dealing with a business situation (risks and opportunities) in a manner that is likely to lead to a good outcome.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Developing strong business acumen is essential as you progress up the career ladder, as it helps you understand why products work and how your employer generates revenue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key skills to develop:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;See the "big picture" of the organisation, how the key drivers of the business relate to each other, work together to produce profitable growth, and relate to the job&lt;/li&gt;
&lt;li&gt;Understand critical company communications and data, including financial statements&lt;/li&gt;
&lt;li&gt;Use knowledge to make good decisions&lt;/li&gt;
&lt;li&gt;Understand how actions and decisions impact key company measures and leadership objectives&lt;/li&gt;
&lt;li&gt;Effectively communicate ideas to other employees, managers, executives, and the public&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Soft skills
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Personal attributes that enable someone to interact effectively and harmoniously with other people.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Soft skills are one of the most sought-after skills employers look for in engineers. Abilities such as empathy, critical thinking, and communication skills are integral to a company's culture and success.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Essential soft skills for software engineers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Communication&lt;/li&gt;
&lt;li&gt;Creativity&lt;/li&gt;
&lt;li&gt;Teamwork&lt;/li&gt;
&lt;li&gt;Problem-solving&lt;/li&gt;
&lt;li&gt;Openness to criticism&lt;/li&gt;
&lt;li&gt;Critical thinking&lt;/li&gt;
&lt;li&gt;Adaptability&lt;/li&gt;
&lt;li&gt;Resourcefulness&lt;/li&gt;
&lt;li&gt;Conflict management&lt;/li&gt;
&lt;li&gt;Leadership&lt;/li&gt;
&lt;li&gt;Time management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;To strengthen your soft skills, consider using the following techniques:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify areas that you need to improve&lt;/li&gt;
&lt;li&gt;Practice building your soft skills&lt;/li&gt;
&lt;li&gt;Ask for feedback from your manager and peers&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Well-being
&lt;/h2&gt;

&lt;p&gt;Working in a fast-paced sector with tight deadlines, sitting at a desk all day, trying to keep up with industry trends and having a social life in-between can be tiresome, damaging and lead to burnout.&lt;/p&gt;

&lt;p&gt;A job should never take control of your physical or mental well-being, as we should always be working to live and not living to work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here are some tips to help improve your well-being:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Take breaks&lt;/strong&gt; - Take frequent breaks that do not involve screen time, such as going for a walk, calling a friend, reading a book and disconnecting from technology&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diet&lt;/strong&gt; - Eat healthily and drink plenty of water&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workout&lt;/strong&gt; - Stay healthy and alleviate stress&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Develop hobbies&lt;/strong&gt; - Make time to do things that you enjoy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meditate&lt;/strong&gt; - Take some time to relax and breathe&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Socialise&lt;/strong&gt; - Spend as much time as possible with friends and family&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Career growth and targets
&lt;/h2&gt;

&lt;p&gt;Set yourself achievable goals and targets that align with your career path. A great time to do this is with your manager in a one-to-one. Always having goals is a great way to ensure that you are constantly progressing and are a great way to obtain promotions and bonuses.&lt;/p&gt;

&lt;p&gt;If your company has a skills matrix, aligning your goals can ensure guaranteed progression.&lt;/p&gt;

&lt;p&gt;It is also great to set goals outside of the work environment, always aim to combat your weakest areas, and put yourself out of your comfort zone.&lt;/p&gt;

</description>
      <category>career</category>
      <category>programming</category>
    </item>
    <item>
      <title>Node Clean Architecture Template</title>
      <dc:creator>Jamie Livingstone</dc:creator>
      <pubDate>Thu, 14 Apr 2022 13:04:04 +0000</pubDate>
      <link>https://forem.com/jamielivingstone/node-clean-architecture-template-2359</link>
      <guid>https://forem.com/jamielivingstone/node-clean-architecture-template-2359</guid>
      <description>&lt;h2&gt;
  
  
  Preface
&lt;/h2&gt;

&lt;p&gt;Writing highly scalable, testable codebases that are easy to maintain is the dream for most engineers and is some of the problems that software architectures aim to solve.&lt;/p&gt;

&lt;p&gt;Software architecture serves as a blueprint for a system. It provides an abstraction to manage the system complexity and establish a communication and coordination mechanism among components.&lt;/p&gt;

&lt;p&gt;Having worked in many JavaScript and TypeScript codebases throughout my career, I often find that they do not conform to an established architecture which is very different from more established languages such as C# and is why I decided to build this template.&lt;/p&gt;

&lt;h2&gt;
  
  
  The template
&lt;/h2&gt;

&lt;p&gt;The template conforms to the Clean Architecture principles and encourages established practices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;TypeScript first&lt;/li&gt;
&lt;li&gt;Dependency injection via Awilix&lt;/li&gt;
&lt;li&gt;CQRS (Command Query Responsibility Segregation)&lt;/li&gt;
&lt;li&gt;High test coverage (unit, integration and functional tests)&lt;/li&gt;
&lt;li&gt;Automatic error handling&lt;/li&gt;
&lt;li&gt;Logging&lt;/li&gt;
&lt;li&gt;Versioned APIs&lt;/li&gt;
&lt;li&gt;Swagger&lt;/li&gt;
&lt;li&gt;Prisma ORM&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/JamieLivingstone"&gt;
        JamieLivingstone
      &lt;/a&gt; / &lt;a href="https://github.com/JamieLivingstone/node-clean-architecture"&gt;
        node-clean-architecture
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A Node template that follows the Clean Architecture principles and encourages established practices.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Clean Architecture Template&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://github.com/JamieLivingstone/node-clean-architecture/blob/main/LICENSE"&gt;&lt;img src="https://camo.githubusercontent.com/fd551ba4b042d89480347a0e74e31af63b356b2cac1116c7b80038f41b04a581/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d677265656e2e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://codeclimate.com/github/JamieLivingstone/node-clean-architecture/test_coverage" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/b549aa1fd57f9572de6fcc46debf233a24da57cb9cddfe8f20da50ec3929fc40/68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f66323532306435373566653735346165373033322f746573745f636f766572616765" alt="Test Coverage"&gt;&lt;/a&gt;
&lt;a href="https://codeclimate.com/github/JamieLivingstone/node-clean-architecture/maintainability" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/9e11a73d667b6f26b361461f0ccd107cf2e199a478006dd011ee1493ce2cd83f/68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f66323532306435373566653735346165373033322f6d61696e7461696e6162696c697479" alt="Maintainability"&gt;&lt;/a&gt;
&lt;a href="https://snyk.io/test/github/JamieLivingstone/node-clean-architecture" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/3615ca65dab7814be0e31968878e8801b36b2fba7f34ac9b7be1a0225d077f9a/68747470733a2f2f736e796b2e696f2f746573742f6769746875622f4a616d69654c6976696e6773746f6e652f6e6f64652d636c65616e2d6172636869746563747572652f62616467652e737667" alt="Known Vulnerabilities"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A Node template that follows the Clean Architecture principles and encourages established practices.&lt;/p&gt;
&lt;h2&gt;
Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;TypeScript first&lt;/li&gt;
&lt;li&gt;Dependency injection via Awilix&lt;/li&gt;
&lt;li&gt;CQRS (Command Query Responsibility Segregation)&lt;/li&gt;
&lt;li&gt;High test coverage (unit, integration and functional tests)&lt;/li&gt;
&lt;li&gt;Automatic error handling&lt;/li&gt;
&lt;li&gt;Logging&lt;/li&gt;
&lt;li&gt;Versioned APIs&lt;/li&gt;
&lt;li&gt;Swagger&lt;/li&gt;
&lt;li&gt;Prisma ORM&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Getting Started&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Install the latest &lt;a href="https://nodejs.org/en/" rel="nofollow"&gt;Node.js LTS&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Install Docker and ensure that it is running&lt;/li&gt;
&lt;li&gt;Create .env file &lt;code&gt;cp .env.example .env&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Install project dependencies by running &lt;code&gt;yarn install&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Start Docker (local Postgres instance) &lt;code&gt;docker-compose up -d&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create database &lt;code&gt;npx prisma migrate deploy&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Start development server &lt;code&gt;yarn start&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Navigate to Swagger (&lt;a href="http://localhost:3000/api-docs" rel="nofollow"&gt; http://localhost:3000/api-docs&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
Scripts&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Build production bundle&lt;/strong&gt;&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;yarn build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Lint project (eslint)&lt;/strong&gt;&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;yarn lint
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Start development server&lt;/strong&gt;&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;yarn start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Run all tests&lt;/strong&gt;&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;yarn test
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Run unit tests&lt;/strong&gt;&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;yarn test:unit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Run functional tests (API tests)&lt;/strong&gt;&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;yarn test:functional
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
License&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/JamieLivingstone/node-clean-architecture/blob/main/LICENSE"&gt;This project is licensed with the MIT license.&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Credits&lt;/h2&gt;
&lt;p&gt;The project's inspiration is &lt;a href="https://github.com/jasontaylordev/CleanArchitecture"&gt;Jason Taylor's clean architecture template&lt;/a&gt;…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/JamieLivingstone/node-clean-architecture"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Why clean architecture
&lt;/h2&gt;

&lt;p&gt;Clean architecture is a battle-tested software architecture that offers many benefits.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Highly Testable&lt;/strong&gt;: Clean architecture is designed with testing in mind&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework Independent&lt;/strong&gt;: Doesn’t rely on tools from any specific framework (language agnostic too)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business logic is encapsulated&lt;/strong&gt;: Easy to add new entry points to the system (e.g. GraphQL)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database Independent&lt;/strong&gt;: The majority of your application will not know or need to know what database it’s drawing from. This means you can adopt a new database with no changes to the majority of the source code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible&lt;/strong&gt;: Refactoring and maintaining your code will become easier and will demand little effort&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Learn more about the architecture by reading &lt;a href="https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html"&gt;this&lt;/a&gt; blog post by Robert C. Martin (Uncle Bob). &lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
