4.2 План обучения на первые 3 месяца

4.2 План обучения на первые 3 месяца #

🎯 Цели первого квартала #

Первые 3 месяца — это закладка фундамента. Цель не в том, чтобы стать экспертом, а в том, чтобы:

  • Освоить базовые инструменты DevOps workflow
  • Создать первые практические проекты для портфолио
  • Понять, как технологии связаны между собой
  • Развить привычку к постоянному обучению

Ожидаемые результаты через 3 месяца #

Ожидаемые результаты через 3 месяца:

Технические навыки:

  • Linux: Уверенная работа в командной строке
  • Git: Полный workflow от clone до merge
  • Docker: Контейнеризация простых приложений
  • CI/CD: Базовый pipeline с автотестами
  • Cloud: Развертывание в одном из облачных провайдеров

Практические результаты:

  • Проекты в портфолио: 3
  • GitHub репозитории: 10+
  • Статьи в блоге: 5+
  • Профессиональные связи: 20+

Карьерная подготовка:

  • LinkedIn профиль: Обновлен с новыми навыками
  • Резюме: Готово для junior DevOps позиций
  • Готовность к собеседованиям: Базовая подготовка завершена

📅 Месяц 1: Основы основ #

Неделя 1: Linux и командная строка #

Ежедневные задания (1-2 часа в день):

День 1: Навигация и файловая система

  • Создание структуры каталогов для проекта DevOps обучения
  • Изучение команд навигации (pwd, ls, cd)
  • Поиск файлов по маске и подсчет размера каталогов
  • Практика с базовыми командами файловой системы

День 2: Работа с текстом и конвейерами

  • Загрузка и обработка текстовых данных через curl
  • Фильтрация и подсчет строк с помощью grep и wc
  • Извлечение пользователей из системного файла /etc/passwd
  • Работа с процессами через awk и сортировка уникальных значений

День 3: Процессы и сервисы

  • Мониторинг запущенных процессов (ps aux, top)
  • Проверка статуса системных сервисов через systemctl
  • Анализ журналов служб с помощью journalctl
  • Изучение системных ресурсов в реальном времени

День 4: Права доступа и пользователи

  • Настройка прав доступа к файлам (chmod)
  • Изменение владельца файлов (chown)
  • Проверка sudo привилегий и групп пользователя
  • Понимание системы прав в Linux

День 5: Сеть и диагностика

  • Проверка сетевой связности через ping
  • Анализ открытых портов (netstat, ss)
  • Тестирование HTTP заголовков с curl
  • Базовая диагностика сетевых проблем

Проектное задание недели: Создание скрипта system-info.sh, который показывает:

  • Время работы системы (uptime)
  • Использование дискового пространства
  • Количество запущенных процессов
  • Активные сетевые подключения

Неделя 2: Git и GitHub #

# Изучение Git workflow

# День 1: Основы Git
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
mkdir my-first-repo && cd my-first-repo
git init
echo "# My DevOps Journey" > README.md
git add README.md
git commit -m "Initial commit"

# День 2: Работа с GitHub
# 1. Создать аккаунт на GitHub
# 2. Создать репозиторий my-devops-journey
# 3. Подключить SSH ключи
ssh-keygen -t rsa -b 4096 -C "your.email@example.com"
ssh-add ~/.ssh/id_rsa
# 4. Запушить локальный репозиторий
git remote add origin git@github.com:username/my-devops-journey.git
git push -u origin main

# День 3: Branching и merging
git checkout -b feature/add-learning-log
echo "## Week 1 Learning Log" >> learning-log.md
echo "- Learned basic Linux commands" >> learning-log.md
git add learning-log.md
git commit -m "Add learning log for week 1"
git checkout main
git merge feature/add-learning-log

# День 4: Collaboration workflow
# 1. Fork чужой репозиторий
# 2. Создать feature branch
# 3. Сделать Pull Request
# 4. Участвовать в code review

# День 5: GitHub Actions introduction
mkdir -p .github/workflows
cat > .github/workflows/hello.yml << 'EOF'
name: Hello World
on: [push]
jobs:
  hello:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: echo "Hello, DevOps World!"
EOF

# Проектное задание недели:
echo "Создать репозиторий с:"
echo "- README с описанием learning journey"
echo "- Learning log по дням/неделям"
echo "- Простой GitHub Action"
echo "- Минимум 10 commits с понятными сообщениями"

Неделя 3: Python/Bash скриптинг #

# Python для DevOps - базовые навыки

# День 1: Python основы
#!/usr/bin/env python3
import os
import sys
import subprocess

def get_system_info():
    """Получить основную информацию о системе"""
    info = {
        'hostname': os.uname().nodename,
        'os': os.uname().sysname,
        'python_version': sys.version.split()[0],
        'current_user': os.getenv('USER')
    }
    return info

if __name__ == "__main__":
    info = get_system_info()
    for key, value in info.items():
        print(f"{key}: {value}")

# День 2: Работа с файлами и JSON
import json
import requests

def fetch_github_user(username):
    """Получить информацию о пользователе GitHub"""
    url = f"https://api.github.com/users/{username}"
    response = requests.get(url)
    
    if response.status_code == 200:
        return response.json()
    else:
        return None

# Использование:
user_data = fetch_github_user("octocat")
if user_data:
    print(f"Name: {user_data['name']}")
    print(f"Public repos: {user_data['public_repos']}")

# День 3: Автоматизация с subprocess
import subprocess
import json

def docker_ps():
    """Получить список запущенных контейнеров"""
    try:
        result = subprocess.run(
            ['docker', 'ps', '--format', 'json'],
            capture_output=True,
            text=True,
            check=True
        )
        
        containers = []
        for line in result.stdout.strip().split('\n'):
            if line:
                containers.append(json.loads(line))
        
        return containers
    except subprocess.CalledProcessError as e:
        print(f"Error: {e}")
        return []

# День 4: Мониторинг скрипт
import psutil
import time

def monitor_system(duration=60):
    """Мониторинг системы в течение указанного времени"""
    print("Starting system monitoring...")
    
    start_time = time.time()
    while time.time() - start_time < duration:
        cpu_percent = psutil.cpu_percent(interval=1)
        memory = psutil.virtual_memory()
        disk = psutil.disk_usage('/')
        
        print(f"CPU: {cpu_percent}% | "
              f"Memory: {memory.percent}% | "
              f"Disk: {disk.percent}%")
        
        time.sleep(5)

# День 5: CLI инструмент с argparse
import argparse

def main():
    parser = argparse.ArgumentParser(description='DevOps utility tool')
    parser.add_argument('--check-disk', action='store_true', help='Check disk usage')
    parser.add_argument('--check-memory', action='store_true', help='Check memory usage')
    parser.add_argument('--docker-ps', action='store_true', help='List Docker containers')
    
    args = parser.parse_args()
    
    if args.check_disk:
        disk = psutil.disk_usage('/')
        print(f"Disk usage: {disk.percent}%")
    
    if args.check_memory:
        memory = psutil.virtual_memory()
        print(f"Memory usage: {memory.percent}%")
    
    if args.docker_ps:
        containers = docker_ps()
        print(f"Running containers: {len(containers)}")

if __name__ == "__main__":
    main()

Неделя 4: Первое знакомство с Docker #

# Практическое изучение Docker

# День 1: Docker basics
# Установка Docker (если не сделано ранее)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER

# Базовые команды
docker --version
docker run hello-world
docker images
docker ps -a

# День 2: Работа с контейнерами
# Интерактивная работа
docker run -it ubuntu:20.04 bash
# Внутри контейнера:
apt update && apt install -y curl
curl -I https://google.com
exit

# Запуск веб-сервера
docker run -d -p 8080:80 --name my-nginx nginx:latest
curl http://localhost:8080
docker logs my-nginx
docker stop my-nginx && docker rm my-nginx

# День 3: Создание собственных образов
mkdir docker-lab && cd docker-lab

# Простое Python приложение
cat > app.py << 'EOF'
from flask import Flask
import os

app = Flask(__name__)

@app.route('/')
def hello():
    return f"Hello from container! Hostname: {os.uname().nodename}"

@app.route('/health')
def health():
    return {'status': 'healthy'}

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
EOF

cat > requirements.txt << 'EOF'
Flask==2.0.1
EOF

# Dockerfile
cat > Dockerfile << 'EOF'
FROM python:3.9-alpine

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY app.py .

EXPOSE 5000

CMD ["python", "app.py"]
EOF

# Сборка и запуск
docker build -t my-python-app .
docker run -d -p 5000:5000 --name python-app my-python-app
curl http://localhost:5000

# День 4: Docker Compose
cat > docker-compose.yml << 'EOF'
version: '3.8'

services:
  web:
    build: .
    ports:
      - "5000:5000"
    environment:
      - FLASK_ENV=development
    depends_on:
      - redis

  redis:
    image: redis:6-alpine
    ports:
      - "6379:6379"

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - web
EOF

# Запуск multi-container приложения
docker-compose up -d
docker-compose ps
docker-compose logs web
docker-compose down

# День 5: Best practices и оптимизация
# Multi-stage build пример
cat > Dockerfile.optimized << 'EOF'
# Build stage
FROM python:3.9 as builder
WORKDIR /app
COPY requirements.txt .
RUN pip wheel --no-cache-dir --no-deps --wheel-dir /app/wheels -r requirements.txt

# Production stage
FROM python:3.9-alpine
RUN addgroup -g 1001 -S python && \
    adduser -S python -u 1001
COPY --from=builder /app/wheels /wheels
COPY --from=builder /app/requirements.txt .
RUN pip install --no-cache /wheels/*
USER python
WORKDIR /app
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
EOF

# Проектное задание месяца 1:
echo "Создать проект 'System Monitor Dashboard':"
echo "- Python скрипт для сбора метрик системы"
echo "- Веб-интерфейс на Flask для отображения метрик"
echo "- Dockerfile для контейнеризации"
echo "- Docker Compose для запуска с Redis/database"
echo "- GitHub репозиторий с документацией"

📅 Месяц 2: DevOps workflow #

Неделя 5-6: CI/CD с GitHub Actions #

# Изучение непрерывной интеграции и доставки

# Неделя 5: Основы CI/CD
# .github/workflows/ci.yml
name: Continuous Integration

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v2
    
    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: 3.9
        
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
        pip install pytest pytest-cov flake8
        
    - name: Lint with flake8
      run: |
        flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
        flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
        
    - name: Test with pytest
      run: |
        pytest --cov=./ --cov-report=xml
        
    - name: Upload coverage to Codecov
      uses: codecov/codecov-action@v1

  build:
    needs: test
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v2
    
    - name: Build Docker image
      run: |
        docker build -t my-app:${{ github.sha }} .
        docker tag my-app:${{ github.sha }} my-app:latest
        
    - name: Run container tests
      run: |
        docker run --rm my-app:latest python -c "import app; print('App imports successfully')"

# Неделя 6: Деплой и окружения
# .github/workflows/deploy.yml  
name: Deploy to Staging

on:
  push:
    branches: [ develop ]

jobs:
  deploy-staging:
    runs-on: ubuntu-latest
    environment: staging
    
    steps:
    - uses: actions/checkout@v2
    
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: us-east-1
        
    - name: Login to Amazon ECR
      id: login-ecr
      uses: aws-actions/amazon-ecr-login@v1
      
    - name: Build and push Docker image
      env:
        ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
        ECR_REPOSITORY: my-app
        IMAGE_TAG: ${{ github.sha }}
      run: |
        docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
        docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
        
    - name: Deploy to ECS
      run: |
        aws ecs update-service --cluster staging --service my-app --force-new-deployment

# Практические задания недель 5-6:
# 1. Настроить CI pipeline с тестами и линтингом
# 2. Добавить сборку Docker образов
# 3. Настроить деплой в staging окружение
# 4. Добавить уведомления в Slack при успешном/неудачном деплое
# 5. Создать production pipeline с manual approval

Неделя 7-8: Облачная инфраструктура #

# Неделя 7: AWS основы

# День 1: Настройка AWS CLI и основы
aws configure
aws sts get-caller-identity

# Создание EC2 инстанса
aws ec2 run-instances \
  --image-id ami-0c55b159cbfafe1d0 \
  --instance-type t2.micro \
  --key-name my-key \
  --security-group-ids sg-12345678 \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=DevOps-Learning}]'

# День 2: S3 и статические сайты
aws s3 mb s3://my-devops-portfolio-$(date +%s)
aws s3 website s3://my-devops-portfolio-$(date +%s) \
  --index-document index.html \
  --error-document error.html

# Загрузка простого сайта
echo "<h1>My DevOps Portfolio</h1>" > index.html
aws s3 cp index.html s3://my-devops-portfolio-$(date +%s)/

# День 3: RDS и базы данных
aws rds create-db-instance \
  --db-instance-identifier devops-db \
  --db-instance-class db.t3.micro \
  --engine mysql \
  --master-username admin \
  --master-user-password MyPassword123 \
  --allocated-storage 20

# День 4: Load Balancer и Auto Scaling
# Создание Application Load Balancer
aws elbv2 create-load-balancer \
  --name devops-alb \
  --subnets subnet-12345 subnet-67890 \
  --security-groups sg-12345678

# День 5: CloudWatch мониторинг
aws cloudwatch put-metric-alarm \
  --alarm-name cpu-mon \
  --alarm-description "Alarm when CPU exceeds 70%" \
  --metric-name CPUUtilization \
  --namespace AWS/EC2 \
  --statistic Average \
  --period 300 \
  --threshold 70 \
  --comparison-operator GreaterThanThreshold

# Неделя 8: Infrastructure as Code с Terraform
mkdir terraform-lab && cd terraform-lab

# main.tf - базовая инфраструктура
cat > main.tf << 'EOF'
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}

provider "aws" {
  region = "us-east-1"
}

# VPC
resource "aws_vpc" "main" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
  enable_dns_support   = true

  tags = {
    Name = "devops-vpc"
  }
}

# Internet Gateway
resource "aws_internet_gateway" "main" {
  vpc_id = aws_vpc.main.id

  tags = {
    Name = "devops-igw"
  }
}

# Public Subnet
resource "aws_subnet" "public" {
  vpc_id                  = aws_vpc.main.id
  cidr_block              = "10.0.1.0/24"
  availability_zone       = "us-east-1a"
  map_public_ip_on_launch = true

  tags = {
    Name = "devops-public-subnet"
  }
}

# Route Table
resource "aws_route_table" "public" {
  vpc_id = aws_vpc.main.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.main.id
  }

  tags = {
    Name = "devops-public-rt"
  }
}

resource "aws_route_table_association" "public" {
  subnet_id      = aws_subnet.public.id
  route_table_id = aws_route_table.public.id
}

# Security Group
resource "aws_security_group" "web" {
  name_prefix = "devops-web-"
  vpc_id      = aws_vpc.main.id

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]  # В продакшене ограничить!
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

# EC2 Instance
resource "aws_instance" "web" {
  ami                    = "ami-0c55b159cbfafe1d0"
  instance_type          = "t2.micro"
  key_name               = "my-key"  # Создать заранее
  vpc_security_group_ids = [aws_security_group.web.id]
  subnet_id              = aws_subnet.public.id

  user_data = <<-EOF
              #!/bin/bash
              yum update -y
              yum install -y httpd
              systemctl start httpd
              systemctl enable httpd
              echo "<h1>Hello from Terraform!</h1>" > /var/www/html/index.html
              EOF

  tags = {
    Name = "devops-web-server"
  }
}

# Outputs
output "instance_ip" {
  value = aws_instance.web.public_ip
}

output "instance_dns" {
  value = aws_instance.web.public_dns
}
EOF

# Применение конфигурации
terraform init
terraform plan
terraform apply

# Проверка результата
curl http://$(terraform output -raw instance_ip)

# Очистка ресурсов
terraform destroy

📅 Месяц 3: Интеграция и практика #

Неделя 9-10: Kubernetes основы #

# Неделя 9: Основы Kubernetes

# Установка и настройка
# Использовать minikube или kind для локального изучения
minikube start --driver=docker

# День 1: Pods и основные объекты
kubectl run nginx --image=nginx:latest --port=80
kubectl get pods
kubectl describe pod nginx
kubectl logs nginx
kubectl delete pod nginx

# Pod из YAML файла
cat > pod.yaml << 'EOF'
apiVersion: v1
kind: Pod
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  containers:
  - name: app
    image: nginx:alpine
    ports:
    - containerPort: 80
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
EOF

kubectl apply -f pod.yaml

# День 2: Services и networking
cat > service.yaml << 'EOF'
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: NodePort
EOF

kubectl apply -f service.yaml
kubectl get services
minikube service my-app-service --url

# День 3: Deployments
cat > deployment.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: app
        image: nginx:alpine
        ports:
        - containerPort: 80
EOF

kubectl apply -f deployment.yaml
kubectl get deployments
kubectl get pods

# Масштабирование
kubectl scale deployment my-app-deployment --replicas=5

# Rolling update
kubectl set image deployment/my-app-deployment app=nginx:latest
kubectl rollout status deployment/my-app-deployment

# День 4: ConfigMaps и Secrets
cat > configmap.yaml << 'EOF'
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  database_url: "mysql://localhost:3306/mydb"
  log_level: "info"
  config.properties: |
    server.port=8080
    server.host=0.0.0.0
EOF

kubectl apply -f configmap.yaml

# Secret
kubectl create secret generic app-secret \
  --from-literal=db-password='supersecret123' \
  --from-literal=api-key='abc123xyz'

# День 5: Volumes и persistence
cat > persistent-pod.yaml << 'EOF'
apiVersion: v1
kind: Pod
metadata:
  name: persistent-app
spec:
  containers:
  - name: app
    image: nginx:alpine
    volumeMounts:
    - name: html-volume
      mountPath: /usr/share/nginx/html
  volumes:
  - name: html-volume
    emptyDir: {}
EOF

# Неделя 10: Продвинутые концепции Kubernetes
# Ingress, Helm, мониторинг в K8s

Неделя 11-12: Итоговый проект #

# Финальный проект: Full-Stack DevOps Pipeline

## Цель проекта:
Создать complete end-to-end DevOps pipeline для веб-приложения

## Компоненты проекта:

### 1. Приложение (Неделя 11)
- **Frontend:** Simple React/Vue.js app или статический сайт
- **Backend:** REST API на Python/Node.js с базой данных
- **Database:** PostgreSQL или MySQL
- **Мониторинг:** Health checks, metrics endpoints

### 2. Инфраструктура (Неделя 11)
- **Containerization:** Docker и Docker Compose для локальной разработки
- **Cloud Infrastructure:** Terraform для provision AWS/Azure ресурсов
- **Kubernetes:** Деплой приложения в K8s кластер
- **Networking:** Load balancer, ingress, SSL certificates

### 3. CI/CD Pipeline (Неделя 12)
- **Source Control:** Git workflow с feature branches
- **Continuous Integration:** 
  - Automated tests (unit, integration)
  - Code quality checks (linting, security scanning)
  - Docker image building
- **Continuous Deployment:**
  - Staging environment автодеплой
  - Production деплой с manual approval
  - Rollback capabilities

### 4. Monitoring & Observability (Неделя 12)
- **Metrics:** Prometheus + Grafana
- **Logs:** Centralized logging (ELK или cloud-native)
- **Alerting:** Critical alerts setup
- **Health Checks:** Application и infrastructure monitoring

## Deliverables:
1. **GitHub Repository** с полным исходным кодом
2. **Documentation** в README с архитектурой и setup инструкциями
3. **Live Demo** - работающее приложение в облаке
4. **Presentation** - 10-минутная презентация проекта
5. **Blog Post** - техническая статья о том, что изучили

## Критерии успеха:
- [ ] Приложение доступно по HTTPS в интернете
- [ ] Автоматический деплой при push в main branch
- [ ] Мониторинг показывает key metrics
- [ ] Infrastructure полностью описана в коде
- [ ] Есть план disaster recovery
- [ ] Документация позволяет воспроизвести setup

📊 Система оценки прогресса #

Weekly Review Template #

# Week X Review - Month Y

## Technical Progress ⚙️
### Completed:
- [ ] All planned tutorials/courses
- [ ] Hands-on labs and exercises  
- [ ] Weekly project milestone

### Struggled with:
- Specific technical challenges
- Concepts that were difficult
- Time management issues

### Key learnings:
- Most important insights
- "Aha!" moments
- Connections between concepts

## Practical Outcomes 🛠️
- [ ] Code commits this week: ___
- [ ] New GitHub repositories: ___
- [ ] Blog posts/documentation: ___
- [ ] Community interactions: ___

## Skill Level Updates 📈
Rate your current level (1-10):
- Linux: ___/10 (previous: ___/10)
- Git: ___/10 (previous: ___/10)  
- Docker: ___/10 (previous: ___/10)
- Python/Bash: ___/10 (previous: ___/10)
- Cloud (AWS/Azure/GCP): ___/10 (previous: ___/10)

## Next Week Goals 🎯
1. Primary focus area: _______________
2. Specific learning objectives:
   - [ ] ________________________
   - [ ] ________________________  
   - [ ] ________________________
3. Practical deliverable: ___________

## Networking & Community 👥
- [ ] Participated in forums/Discord
- [ ] Connected with new DevOps professionals
- [ ] Shared knowledge or helped others
- [ ] Attended meetups/webinars

## Time Investment ⏰
- Structured learning: ___ hours
- Hands-on practice: ___ hours  
- Community engagement: ___ hours
- Project work: ___ hours
- **Total: ___ hours** (Target: 15-25 hours/week)

## Reflection Questions 🤔
1. What energized me most this week?
2. What frustrated me most?
3. What would I do differently?
4. How confident do I feel about DevOps concepts?
5. What support do I need for next week?

Monthly Assessment #

# Автоматизированная система трекинга прогресса

class LearningTracker:
    def __init__(self):
        self.skills = {
            'linux': {'current': 0, 'target': 7, 'evidence': []},
            'git': {'current': 0, 'target': 8, 'evidence': []},
            'docker': {'current': 0, 'target': 7, 'evidence': []},
            'kubernetes': {'current': 0, 'target': 6, 'evidence': []},
            'cloud': {'current': 0, 'target': 6, 'evidence': []},
            'ci_cd': {'current': 0, 'target': 7, 'evidence': []},
            'iac': {'current': 0, 'target': 6, 'evidence': []},
            'monitoring': {'current': 0, 'target': 5, 'evidence': []}
        }
        
    def update_skill(self, skill, level, evidence):
        """Обновить уровень навыка с доказательствами"""
        if skill in self.skills:
            self.skills[skill]['current'] = level
            self.skills[skill]['evidence'].append({
                'date': datetime.now(),
                'evidence': evidence,
                'level': level
            })
    
    def calculate_readiness(self):
        """Рассчитать готовность к job applications"""
        total_current = sum(skill['current'] for skill in self.skills.values())
        total_target = sum(skill['target'] for skill in self.skills.values())
        
        readiness = (total_current / total_target) * 100
        
        if readiness >= 70:
            return "Ready for junior positions"
        elif readiness >= 50:
            return "Continue building skills"
        else:
            return "Focus on fundamentals"
    
    def generate_focus_areas(self):
        """Определить области для приоритетного изучения"""
        gaps = []
        for skill, data in self.skills.items():
            gap = data['target'] - data['current']
            if gap > 2:
                gaps.append((skill, gap))
        
        return sorted(gaps, key=lambda x: x[1], reverse=True)

# Пример использования:
tracker = LearningTracker()
tracker.update_skill('docker', 6, 'Built multi-container app with docker-compose')
tracker.update_skill('linux', 7, 'Created system monitoring scripts')

print(tracker.calculate_readiness())
print("Focus on:", tracker.generate_focus_areas()[:3])

🎯 Заключение #

Первые 3 месяца — это интенсивный период закладки фундамента. Ключевые принципы успеха:

Последовательность важнее скорости — лучше изучать понемногу каждый день
Практика важнее теории — 70% времени hands-on, 30% изучение
Документируйте journey — это станет вашим портфолио
Подключайтесь к сообществу — не изучайте в изоляции
Измеряйте прогресс — еженедельные ретроспективы критичны
Не бойтесь сложности — DevOps сложен, но это нормально

Помните: Через 3 месяца вы не станете экспертом, но получите solid foundation для дальнейшего роста. Цель — не perfection, а continuous progress.


Следующий раздел: 4.3 План обучения на первый год