# Что такое программа и код

← [Раздел](README.md) · [Главная](../README.md)

## Цель

Понять, **из чего состоит программа**, что такое исходный код, как он превращается в работающее приложение — без написания сложного кода.

## Предварительно

- [02 — Минимум разработки](README.md)

## Время

**2–3 часа**

---

## Программа = инструкции для компьютера

**Программа** — набор **инструкций**, которые процессор выполняет по порядку. **Исходный код (source code)** — текст, понятный человеку, на языке программирования.

**Аналогия:** рецепт борща (исходник) → повар готовит (компилятор/интерпретатор) → борщ на столе (работающая программа).

---

## Языки: компилируемые vs интерпретируемые

| Тип | Как работает | Примеры |
|-----|--------------|---------|
| Компилируемый | Код → машинный/байткод **до** запуска | Go, Rust, Java (частично) |
| Интерпретируемый | Код читается **во время** выполнения | Python, JavaScript |
| Гибрид | Компиляция в промежуточный формат | Java → bytecode, C# → IL |

Для DevSecOps важно: **уязвимость может быть в исходнике и в зависимостях**, даже если вы не видите «.exe».

---

## Структура типичного проекта

```
my-app/
├── README.md          # описание
├── src/               # исходный код
│   └── main.py
├── tests/             # автотесты
├── Dockerfile         # как упаковать в контейнер
├── .gitlab-ci.yml     # pipeline
└── requirements.txt   # зависимости (Python)
```

| Файл | Зачем SecOps |
|------|--------------|
| `Dockerfile` | USER root? secrets COPY? |
| `requirements.txt` | SCA — список для CVE scan |
| `tests/` | pipeline gate |
| `.env.example` | шаблон без реальных секретов |

---

## Читаем код как текст (пример Python)

```python
# Учебный пример — НЕ production
password = "YOUR_PASSWORD"  # ❌ плохо: секрет в коде

def greet(name):
    return f"Hello, {name}!"

if __name__ == "__main__":
    print(greet("World"))
```

**Что видит SecOps:**

- Строка 2 — **hardcoded secret** → secret scanner сработает.
- Функция `greet` — безопасна.
- `f"Hello, {name}"` — если `name` от пользователя без проверки → возможен XSS в веб-контексте.

Не нужно писать Python — нужно **узнавать паттерны риска**.

---

## Зависимости (dependencies)

Почти no приложение не пишут «с нуля». Они **импортируют библиотеки**:

```python
import requests  # внешняя библиотека из PyPI
```

**SCA (Software Composition Analysis)** сканирует `requirements.txt`, `package-lock.json`, `go.mod` и сравнивает версии с базой CVE.

---

## Сборка (build)

**Build** — превращение исходников + зависимостей в **артефакт**:

| Артефакт | Пример |
|----------|--------|
| JAR/WAR | Java |
| Binary | Go |
| Docker image | Любой стек в контейнере |
| Static files | Frontend (HTML/JS/CSS) |

Pipeline часто: `git clone` → `npm install` → `npm test` → `docker build`.

---

## Окружения (environments)

| Окружение | Назначение |
|-----------|------------|
| dev | локально у разработчика |
| staging | копия prod для проверки |
| production | боевые пользователи |

**Правило:** конфиги и секреты **разные** per env. Один `.env` на все — частая ошибка.

---

## Типичные уязвимости на уровне кода (для узнавания)

| Название | Суть | OWASP |
|----------|------|-------|
| SQL Injection | SQL склеивается из строки пользователя | A03 |
| XSS | HTML/JS от пользователя в странице | A03 |
| Hardcoded secrets | Пароли в репозитории | A07 |
| Path traversal | `../../etc/passwd` в пути файла | A01 |

Подробнее — в [04 — OWASP](../04-fundament-bezopasnosti/owasp-top10-dlya-nachinayushih.md).

---

## Самопроверка

1. Чем исходный код отличается от Docker image?
2. Зачем файл `requirements.txt` для security scan?
3. Почему `password = "..."` в коде — проблема?
4. Назовите три файла в проекте, которые вы бы проверили первыми.

---

## Дальше

→ [Git без программирования](git-bez-programmirovaniya.md)
