# Basic Code Literacy

These are the skill that everyone must have to be able to work as a professional in today's world of software engineering. If you're about to graduate with a computer science degree, you must be proficient with all of the following skills.

## General Skills:

### Git:

Git is the most popular version control system used across all of Aegion’s projects. Being a distributed version control system, it allow for one to locally manage, merge and track changes in the source code. Knowing Git is essential for being able to work in team projects.

Tutorial:

{% embed url="<https://learn.microsoft.com/en-us/training/modules/intro-to-git/>" %}

{% embed url="<https://learngitbranching.js.org/>" %}

Github Flow:

{% embed url="<https://docs.github.com/en/get-started/using-github/github-flow>" %}

{% embed url="<https://docs.github.com/en/pull-requests/collaborating-with-pull-requests>" %}

### Linux:

Most modern day software development is done on Linux, being comfortable using the command line, being able shell into remote servers and working on the code residing there, being able to debug complex installation problems are characteristics of competent engineers. The only way you get good at this is by using Linux full time for development.

How to get started:

1. Install an easy to use distro like Ubuntu (dual boot if you use windows)
2. Start doing Python development
3. Learn to manage multiple versions of Python, their libraries etc.

### Python:

In this day and age, not knowing python is the equivalent of a person with a driving license but not knowing how to shift gears in a manual transmission car but for software engineering. At aegion, we strive to automate aspects of our engineering workflow and the easiest way to prototype these systems is using python. Python is a versatile scripting language that lets people rapidly create and test ideas that they are working with. Additoinally, it is the most popular language for machine learning libraries and is a necessary requirement for working on in the field.

**Note: There are innumerable resources online for learning python. You should be able to learn Python within a day, but if you can't then your fundamentals for writing software need work**

#### Tutorials:

{% embed url="<https://www.coursera.org/learn/algorithmic-thinking-1/>" %}
Use this course if you're not able work in python easily:
{% endembed %}

{% embed url="<https://github.com/LinkedInLearning/algorithmic-thinking-with-python-foundations-2450259>" %}

#### Environment Setup:

As an intermediate user, you will start seeing challenges in managing dependencies and various versions of python environments. Here are some tools you need to use to start managing them better.

{% embed url="<https://realpython.com/intro-to-pyenv/>" %}

{% embed url="<https://realpython.com/dependency-management-python-poetry/>" %}

### Regular Expression:

While learning programming languages is super important, there are certain “logic expressions” software engineers need to learn to be productive and also ensure that they can implement complex string parsing and pattern matching capabilities.

Tutorial:

{% embed url="<https://regexone.com/>" %}

### Docker and DevContainers

Docker is the defacto standard in creating containerized software enviornments. While we do recommend everyone to install Ubuntu as the default operating system, we develop docker environments for each of the projects. Start with the following resources to get a basic understanding of docker, what it does and how to quickly check and see if docker is working.

**Note:** On ubuntu, follow these instructions to install docker.

Installation:

{% embed url="<https://docs.docker.com/engine/install/ubuntu/#installation-methods>" %}

Tutorial:

{% embed url="<https://docker-curriculum.com/>" %}

Dev Containers in vscode:

{% embed url="<https://code.visualstudio.com/docs/devcontainers/tutorial>" %}

{% embed url="<https://code.visualstudio.com/docs/devcontainers/containers>" %}

Reference Repo:

{% embed url="<https://github.com/0916dhkim/vscode-devcontainer-tutorial>" %}
