Skip to content

List of evergreen skills, based on software development best practices & cross-framework principles, that should serve as a fair assessment of skilled software engineers / developers

License

Notifications You must be signed in to change notification settings

mnhlt/evergreen-skills-developers

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Evergreen Skills for Software Developers

Codeship Status for romenrg/evergreen-skills-developers

This repository includes a list of "evergreen skills" that should serve as a fair assessment of skilled software engineers / developers.

The purpose of this work is to serve as an alternative resource for conducting technical interviews of software developers / engineers, when hiring. This document focuses on software development best practices, cross-framework principles and other portable skills; as opposed to the detrimental fixation on language trends and framework-specific knowledge that we often see in the industry.

Programming languages evolve constantly, companies change their tech stacks, frameworks quickly become outdated, and syntax-related questions can easily be looked up by skilled engineers in search engines in minutes, whenever they need it. So, does it make sense to focus on those aspects when interviewing candidates?

On the other hand, there are software development best practices, cross-framework technical principles and critical non-technical skills that cannot be easily googled, take time to learn, are "evergreen" and have a huge impact on engineer's performance. These are significantly better at reflecting the real value a software developer / engineer brings to an organization or team.

This repository is a derivative work of the following article: "What Makes a Great Software Engineer".

This is a work in progress. Important knowledge might be missing, existing bullets can probably be improved and better grouping strategies could be found. For those reasons, any contributions (i.e. PRs) are welcome. Please feel free to propose changes following the contributing guideline.

Table of contents

Non-technical skills

Core Skills (aka "soft" skills)

Communication

Teamwork

  • Practice empathy
  • Keep low egos
  • Be an active listener
  • Be a good mentor
  • Share knowledge
  • Engage in constructive decisions

Innovation & (self-)management skills

Development process

Problem solving skills

Mindset

  • Don't fear change
  • Dare to fail
  • Be a life-long learner
  • Critical Thinking (be rational, question decisions, "let the facts do the talking")

Technical skills

General technical knowledge

Principles

Data structures

  • Basic structures (basic types, array, matrix, object...)
  • Caching / memoization
  • Hash codes, tokens, encodings (e.g. Base64)
  • Stack vs heap memory

Clean code

  • Good naming is key to improve code understanding (for files, classes, variables / attributes, functions / methods...)
  • Avoid inline comments in your code
    • Inline comments are often considered a "code smell" since code comments usually lie and tend to be shortcuts used to make poor code understandable (there might be some exceptions)
  • Write self-explanatory code (i.e. "what" the code does should be clear when reading it)
  • Use lightweight documentation (e.g. markdown files within the project) to describe "whys" and "hows" (i.e. business needs being tackled and high-level architecture overview)
  • Follow conventions to organize project structure
  • Avoid long functions and classes, make sure to split responsibilities properly into methods/functions and/or classes/files
  • In OOP, favor composition over inheritance
  • Extract complex boolean conditions into well-named functions
  • Follow semantic versioning

Source Code Management

  • CVS (Control Version Systems) / SCM (Source Code Management) basics: branches, tags, centralized vs de-centralized,...
  • SCM vs repository management / hosting (i. e. difference between Git and GitHub)
  • Understand why versioning is important
  • Commit best practices (micro commits / atomic commits, good descriptions...)
  • Feature branches (short-lived)
  • Trunk-based development
  • Dependency management (the importance of package managers, the risks of dependency hell,...)

Technical collaboration

DevOps practices

  • Build automation
  • Write automated tests
  • Differences between unit, integration and system tests
  • Test pyramid
  • Continuous Integration
  • Continuous Delivery vs Deployment
  • Feature Flags / Feature Toggles

Other general technical knowledge

  • Regular expressions (regex)

Field-specific technical knowledge

Front-end development

  • API communication (different architecture standards, how data is transmitted...)
  • DOM (definition, understanding, virtual DOM...)
  • Browser events
  • Responsive design (purpose, advantages, progressive enhancement...)
  • Client-side rendering (CSR) vs server-side rendering (SSR)
  • Pagination
  • State management (associated problems, stateless approach...)
  • MVC and derivatives
  • WebSockets

Back-end development

  • API design (different architecture standards, how data is transmitted...)
  • Message brokers
  • Relational databases (how they work, basic concepts...)
  • Non-relational databases
  • Database design
  • ORM
  • Batch processes / Cron Jobs
  • Session handling
  • Error Handling, Auditing and Logging

Architecture

Infrastructure

  • Virtual machines vs Containers
  • Processes vs threads
  • Controller-agent / Primary-replica pattern
  • Client-server pattern
  • IAAS, PAAS, SASS
  • Web servers
  • Reverse proxies
  • Load balancers
  • Monitoring
  • Observability

Security

  • Public-key cryptosystems (e.g. RSA)
  • Cryptographic protocols (TLS, SSL)
  • Principle of least privilege
  • DoS / DDoS
  • SQL injection
  • Man-in-the-middle attack
  • XSS and CSRF
  • Authentication (JWT, SSO)
  • Authorization (RBAC, ABAC)

Scaling & optimization

  • Load balancing
  • Redundancy
  • Latency
  • Lazy loading

Concurrency

  • Race condition
  • Deadlock
  • Mutual exclusion

This work, by Romén Rodríguez-Gil, is released under the terms specified in this license file (based on the MIT License).

About

List of evergreen skills, based on software development best practices & cross-framework principles, that should serve as a fair assessment of skilled software engineers / developers

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published