Skip to content

Commit 08bc1c0

Browse files
committed
WIP
1 parent 1a472d1 commit 08bc1c0

File tree

4 files changed

+36
-36
lines changed

4 files changed

+36
-36
lines changed

content/001-preface.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
### Для кого предназначена эта книга
3131

3232
Предполагается, что читателем книги в первую очередь станет специалист начального уровня, уже принимавший участие хотя
33-
бы в одном коммерческом, личном или учебном проекте. Но и опытные специалисты найдут здесь полезные идеи — особенно если их профессиональный путь был связан с одной командой,
33+
бы в одном коммерческом, личном или учебном проекте. Но и опытные специалисты найдут здесь полезные идеи — особенно если их профессиональный путь был связан с одной командой,
3434
похожими задачами и устойчивыми привычками. Она поможет лучше понять, как работать в команде и избегать раздражения у коллег.
3535
Для руководителей она будет полезна как пособие для команды и как источник рекомендаций при ревью кода.
3636

content/014-exceptions.md

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Обработка ошибок
22

3-
Каждый раз, когда вы пишете код, вы должны помнить о том, что он может сломаться.
4-
Ошибки могут возникать по самым разным причинам: от неправильного ввода данных до сбоев в работе внешних сервисов.
3+
Каждый раз, когда вы пишете код, вы должны помнить о том, что он может сломаться.
4+
Ошибки могут возникать по самым разным причинам: от неправильного ввода данных до сбоев в работе внешних сервисов.
55
Поэтому важно правильно обрабатывать ошибки, чтобы ваш код не падал и не оставлял пользователей в недоумении.
66

77
<div style="page-break-after: always;"></div>
@@ -39,7 +39,7 @@ try {
3939
}
4040
```
4141

42-
Пример «смертельно» опасен: проблема произошла, но никто об этом не узнает.
42+
Пример «смертельно» опасен: проблема произошла, но никто об этом не узнает.
4343
Главное — не потерять факт ошибки. Так делать нельзя: ошибка уходит в тень, вы теряете информацию.
4444

4545

@@ -62,14 +62,14 @@ try {
6262
} catch (ExternalApiException $exception) {
6363
Log::warning('Не удалось получить приветствие', [
6464
'arguments' => ['time' => $time],
65-
'exception' => $exception
65+
'exception' => $exception,
6666
]);
6767

6868
$message = 'Добро пожаловать!';
6969
}
7070
```
7171

72-
### Ясные ошибки
72+
### Ясные ошибки
7373

7474
Сообщения об ошибках должны быть максимально информативными и конкретными.
7575
Вместо абстрактного «RuntimeException» нужно описывать, что именно произошло и где:
@@ -78,15 +78,15 @@ try {
7878
```php
7979
// Плохо [✗]
8080
foreach ($users => $user) {
81-
if($user->isActive()){
81+
if ($user->isActive()) {
8282
throw new Exception(
8383
'Пользователь должен быть неактивен для удаления'
8484
);
8585
}
8686
}
8787
```
8888

89-
Невозможно понять, какой именно пользователь вызвал ошибку.
89+
Невозможно понять, какой именно пользователь вызвал ошибку.
9090
Чтобы исправить, нужно добавить контекст:
9191

9292
```php
@@ -118,15 +118,15 @@ try {
118118

119119
<div style="page-break-after: always;"></div>
120120

121-
В другой месте:
121+
В другом месте:
122122

123123
```php
124124
try {
125125
// ...
126126
} catch (Throwable $e) {
127127
file_put_contents('log-user.txt', json_encode([
128128
'line' => $e->getLine(),
129-
'status' => 500
129+
'status' => 500,
130130
]));
131131
}
132132
```
@@ -157,25 +157,25 @@ function logException(Throwable $e): void
157157

158158
Важно также не писать всё бесконтрольно в один файл, так как его содержание будет расти.
159159
Это может вылиться в то, что любимая IDE или редактор не смогут открыть файл на 30 ГБ,
160-
не говоря уже о том, чтобы осуществить эффективный поиск по нему.
160+
не говоря уже о том, чтобы осуществить эффективный поиск по нему.
161161
Чтобы такого не произошло, можно настроить ротацию логов — например, чтобы каждый новый день старый лог переименовывался и архивировался, а спустя некоторое время удалялся.
162162
Так у вас будет меньше мусорных данных, которые не нужны в контексте.
163163

164-
Но просто собирать логи мало. Нужно, чтобы вы сразу узнавали о проблемах.
165-
Для этого подключают централизованные системы мониторинга: Sentry, Graylog, ELK или другие.
164+
Но просто собирать логи мало. Нужно, чтобы вы сразу узнавали о проблемах.
165+
Для этого подключают централизованные системы мониторинга: Sentry, Graylog, ELK или другие.
166166
Они собирают все ошибки в одном месте, позволяют группировать и отслеживать повторяющиеся баги, а при необходимости — шлют оповещения на почту или в мессенджеры.
167167

168168
### Отладка
169169

170-
Среди разработчиков распространено мнение, что пошаговая отладка, например, с помощью Xdebug, — признак хорошего специалиста.
170+
Среди разработчиков распространено мнение, что пошаговая отладка, например, с помощью Xdebug, — признак хорошего специалиста.
171171
Выглядит это следующим образом: разработчик ставит точку остановки, затем начинает "шагать" по коду, наблюдает за значениями переменных, отслеживает условные переходы — словно читает чужие мысли.
172172
Якобы именно так приходит понимание, «как всё устроено».
173173

174174
Но позвольте — если вам нужно так делать, значит, что-то пошло не так!
175175

176176
Это не норма. Значит, ваш код неочевиден, сложен и плохо структурирован.
177177

178-
Настоящая причина, по которой вам нужно пошагово проходить каждую строчку, в том, что вы не понимаете, что происходит в системе.
178+
Настоящая причина, по которой вам нужно пошагово проходить каждую строчку, в том, что вы не понимаете, что происходит в системе.
179179
И не потому что вы недостаточно умны, а потому что код запутан. В нём всё связано со всем, всё влияет на всё, и даже чтобы просто проверить, вам приходится запускать сервер, кликать через интерфейс и ставить точку остановки где-то внутри `shouldGoOutside()`.
180180

181181
Представим, что система должна вернуть рекомендацию пользователю — выходить ли на улицу:
@@ -209,7 +209,7 @@ function shouldGoOutside(array $weather): bool
209209
```
210210

211211
Здесь есть и вложенные блоки `try-catch`, и `if` внутри `if`, и цикл с ловлей исключений «внутри» функции.
212-
Без отладки трудно понять, за какой именно шаг «цепи» падает — внешняя обработка или внутренняя.
212+
Без отладки трудно понять, за какой именно шаг «цепи» падает — внешняя обработка или внутренняя.
213213

214214
<div style="page-break-after: always;"></div>
215215

@@ -228,7 +228,7 @@ final class DecisionEngine
228228
public function shouldGoOutside(array $weather): bool
229229
{
230230
foreach ($this->rules as $rule) {
231-
if (!$rule->passes($weather)) {
231+
if (! $rule->passes($weather)) {
232232
return false;
233233
}
234234
}

content/016-remove.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# Не бойся удалять код
22

3-
Удаление кода так же важно, как и его написание. Это акт заботы о проекте.
3+
Удаление кода так же важно, как и его написание. Это акт заботы о проекте.
44
Вы следите за его чистотой, избавляетесь от ненужного, делаете структуру понятнее и помогаете другим быстрее разобраться, как всё устроено.
5-
Это ни в коем случае не поражение, это не «зря писал».
5+
Это ни в коем случае не поражение, это не «зря писал».
66
Это развитие. Это значит, что вы переросли старое решение, нашли лучшее или поняли, что оно больше не нужно.
77

88

@@ -15,14 +15,14 @@
1515
И вот тут появляется важный момент: последовательность.
1616
Когда код меняется, названия устаревают. Логика перерастает своё оформление — нужно адаптироваться как можно быстрее и без страха.
1717

18-
Когда-то метод `validate()` проверял логин и пароль.
19-
Сегодня он уже проверяет два токена, куки и капчу.
20-
А называется всё ещё `validate()`. И это вводит в заблуждение.
18+
Когда-то метод `validate()` проверял логин и пароль.
19+
Сегодня он уже проверяет два токена, куки и капчу.
20+
А называется всё ещё `validate()`. И это вводит в заблуждение.
2121
Сегодняшнему разработчику нужно читать реализацию, потому что по названию уже ничего не понятно.
2222

2323

2424
Код меняется, и ему нужно давать возможность изменяться — в том числе через переименование и удаление.
25-
Не стоит оставлять старое имя «ради совместимости» или из лени. Это путь к путанице.
25+
Не стоит оставлять старое имя «ради совместимости» или из лени. Это путь к путанице.
2626
Пусть код выглядит так, как он работает сейчас, а не когда-то давно.
2727

2828

@@ -65,8 +65,8 @@ public function generateAccessToken(): string
6565
```
6666

6767
Во-первых, шум. Когда открываешь файл и видишь кучу закомментированного кода, начинаешь гадать: это ещё работает?
68-
Это было важно? А может, наоборот, это старая логика, которую уже заменили?
69-
Такой шум мешает сосредоточиться и понять, какой код сейчас «правильный».
68+
Это было важно? А может, наоборот, это старая логика, которую уже заменили?
69+
Такой шум мешает сосредоточиться и понять, какой код сейчас «правильный».
7070

7171
Во-вторых, портится дисциплина.
7272
Стоит один раз оставить закомментированный фрагмент — и понеслось. Один, второй...

content/020-copilot.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ LLM не откажет. Он скажет: «Да, командир!» — и
5959
приведёт к серьёзным проблемам.
6060

6161

62-
"Второй пилот" — помощник другого типа.
62+
"Второй пилот" — помощник другого типа.
6363

64-
Он не будет указывать на архитектурные проблемы или спорные решения, пока его об этом не попросите.
64+
Он не будет указывать на архитектурные проблемы или спорные решения, пока его об этом не попросите.
6565
Его задача — помогать вам как можно быстрее двигаться к результату, решать бизнес-проблемы здесь и сейчас.
6666
Но и большинство разработчиков настроены точно так же: задача должна быть закрыта, сроки — вчера, и мало кто будет
6767
тратить время, чтобы просить помощника подумать над более выразительными именами переменных, архитектурой или стилем.
@@ -80,7 +80,7 @@ LLM не откажет. Он скажет: «Да, командир!» — и
8080

8181
Появляется асимметрия. Поверхность кажется правильной, но под капотом — несовместимость.
8282

83-
Мы уже несколько раз в книге говорили о симметрии, но давайте повторим.
83+
Мы уже несколько раз в книге говорили о симметрии, но давайте повторим.
8484
И посмотрим на небольшой пример импортера исторических данных о погоде:
8585

8686
```php
@@ -92,7 +92,7 @@ $importer->import([
9292
]);
9393
```
9494

95-
Его мог бы написать любой и выглядит вполне разумно. Но этот класс — часть процесса импорта/экспорта.
95+
Его мог бы написать любой, и выглядит вполне разумно. Но этот класс — часть процесса импорта/экспорта.
9696
LLM может не знать о том, что класс экспорта выдаёт не набор XML-структур, а zip-архив:
9797

9898
```php
@@ -115,8 +115,8 @@ LLM не «ошибся». Он просто не увидел целиком в
115115
Именно контекст определяет смысл.
116116
И если ты его теряешь — модель его точно не найдёт.
117117

118-
Другой пример такой асимметрии — если мы попросим LLM, например, внести проверку на
119-
уникальность в базе данных:
118+
Другой пример такой асимметрии — если мы попросим LLM, например, внести проверку на
119+
уникальность в базе данных:
120120

121121
```php
122122
class TokenService
@@ -178,15 +178,15 @@ LLM не знает, как устроена твоя система. Он пр
178178
Сгенерированный код может выглядеть и работать правильно, но разработчик становится не уверен в его деталях, не понимает всех нюансов и не чувствует связи с ним.
179179
Он становится чем-то внешним — как инструмент, который решил задачу, но не передал опыт.
180180

181-
В результате со временем может очень сильно снизиться мотивация и вовлечённость разработчика.
181+
В результате со временем может очень сильно снизиться мотивация и вовлечённость разработчика.
182182
Чтобы такого не допускать, нужно не просто «принимать» результат от LLM, а делать его "своим".
183183

184-
* Понимать, откуда он взялся.
185-
* Переписывать под собственный стиль.
186-
* Встраивать в архитектуру осознанно.
184+
- Понимать, откуда он взялся.
185+
- Переписывать под собственный стиль.
186+
- Встраивать в архитектуру осознанно.
187187

188188
AI — это помощник. Он может ускорить работу.
189189
Но он не заменит твой выбор, твой стиль, твоё мышление.
190190

191-
Второй пилот не заменит твоё мышление — он просто помогает писать.
191+
Второй пилот не заменит твоё мышление — он просто помогает писать.
192192
А хороший код начинается с тебя!

0 commit comments

Comments
 (0)