You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: content/001-preface.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -30,7 +30,7 @@
30
30
### Для кого предназначена эта книга
31
31
32
32
Предполагается, что читателем книги в первую очередь станет специалист начального уровня, уже принимавший участие хотя
33
-
бы в одном коммерческом, личном или учебном проекте. Но и опытные специалисты найдут здесь полезные идеи — особенно если их профессиональный путь был связан с одной командой,
33
+
бы в одном коммерческом, личном или учебном проекте. Но и опытные специалисты найдут здесь полезные идеи — особенно если их профессиональный путь был связан с одной командой,
34
34
похожими задачами и устойчивыми привычками. Она поможет лучше понять, как работать в команде и избегать раздражения у коллег.
35
35
Для руководителей она будет полезна как пособие для команды и как источник рекомендаций при ревью кода.
Copy file name to clipboardExpand all lines: content/014-exceptions.md
+16-16Lines changed: 16 additions & 16 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
1
# Обработка ошибок
2
2
3
-
Каждый раз, когда вы пишете код, вы должны помнить о том, что он может сломаться.
4
-
Ошибки могут возникать по самым разным причинам: от неправильного ввода данных до сбоев в работе внешних сервисов.
3
+
Каждый раз, когда вы пишете код, вы должны помнить о том, что он может сломаться.
4
+
Ошибки могут возникать по самым разным причинам: от неправильного ввода данных до сбоев в работе внешних сервисов.
5
5
Поэтому важно правильно обрабатывать ошибки, чтобы ваш код не падал и не оставлял пользователей в недоумении.
6
6
7
7
<divstyle="page-break-after: always;"></div>
@@ -39,7 +39,7 @@ try {
39
39
}
40
40
```
41
41
42
-
Пример – «смертельно» опасен: проблема произошла, но никто об этом не узнает.
42
+
Пример — «смертельно» опасен: проблема произошла, но никто об этом не узнает.
43
43
Главное — не потерять факт ошибки. Так делать нельзя: ошибка уходит в тень, вы теряете информацию.
44
44
45
45
@@ -62,14 +62,14 @@ try {
62
62
} catch (ExternalApiException $exception) {
63
63
Log::warning('Не удалось получить приветствие', [
64
64
'arguments' => ['time' => $time],
65
-
'exception' => $exception
65
+
'exception' => $exception,
66
66
]);
67
67
68
68
$message = 'Добро пожаловать!';
69
69
}
70
70
```
71
71
72
-
### Ясные ошибки
72
+
### Ясные ошибки
73
73
74
74
Сообщения об ошибках должны быть максимально информативными и конкретными.
75
75
Вместо абстрактного «RuntimeException» нужно описывать, что именно произошло и где:
@@ -78,15 +78,15 @@ try {
78
78
```php
79
79
// Плохо [✗]
80
80
foreach ($users => $user) {
81
-
if($user->isActive()){
81
+
if($user->isActive()){
82
82
throw new Exception(
83
83
'Пользователь должен быть неактивен для удаления'
84
84
);
85
85
}
86
86
}
87
87
```
88
88
89
-
Невозможно понять, какой именно пользователь вызвал ошибку.
89
+
Невозможно понять, какой именно пользователь вызвал ошибку.
90
90
Чтобы исправить, нужно добавить контекст:
91
91
92
92
```php
@@ -118,15 +118,15 @@ try {
118
118
119
119
<divstyle="page-break-after: always;"></div>
120
120
121
-
В другой месте:
121
+
В другом месте:
122
122
123
123
```php
124
124
try {
125
125
// ...
126
126
} catch (Throwable $e) {
127
127
file_put_contents('log-user.txt', json_encode([
128
128
'line' => $e->getLine(),
129
-
'status' => 500
129
+
'status' => 500,
130
130
]));
131
131
}
132
132
```
@@ -157,25 +157,25 @@ function logException(Throwable $e): void
157
157
158
158
Важно также не писать всё бесконтрольно в один файл, так как его содержание будет расти.
159
159
Это может вылиться в то, что любимая IDE или редактор не смогут открыть файл на 30 ГБ,
160
-
не говоря уже о том, чтобы осуществить эффективный поиск по нему.
160
+
не говоря уже о том, чтобы осуществить эффективный поиск по нему.
161
161
Чтобы такого не произошло, можно настроить ротацию логов — например, чтобы каждый новый день старый лог переименовывался и архивировался, а спустя некоторое время удалялся.
162
162
Так у вас будет меньше мусорных данных, которые не нужны в контексте.
163
163
164
-
Но просто собирать логи мало. Нужно, чтобы вы сразу узнавали о проблемах.
165
-
Для этого подключают централизованные системы мониторинга: Sentry, Graylog, ELK или другие.
164
+
Но просто собирать логи мало. Нужно, чтобы вы сразу узнавали о проблемах.
165
+
Для этого подключают централизованные системы мониторинга: Sentry, Graylog, ELK или другие.
166
166
Они собирают все ошибки в одном месте, позволяют группировать и отслеживать повторяющиеся баги, а при необходимости — шлют оповещения на почту или в мессенджеры.
167
167
168
168
### Отладка
169
169
170
-
Среди разработчиков распространено мнение, что пошаговая отладка, например, с помощью Xdebug, — признак хорошего специалиста.
170
+
Среди разработчиков распространено мнение, что пошаговая отладка, например, с помощью Xdebug, — признак хорошего специалиста.
171
171
Выглядит это следующим образом: разработчик ставит точку остановки, затем начинает "шагать" по коду, наблюдает за значениями переменных, отслеживает условные переходы — словно читает чужие мысли.
172
172
Якобы именно так приходит понимание, «как всё устроено».
173
173
174
174
Но позвольте — если вам нужно так делать, значит, что-то пошло не так!
175
175
176
176
Это не норма. Значит, ваш код неочевиден, сложен и плохо структурирован.
177
177
178
-
Настоящая причина, по которой вам нужно пошагово проходить каждую строчку, в том, что вы не понимаете, что происходит в системе.
178
+
Настоящая причина, по которой вам нужно пошагово проходить каждую строчку, в том, что вы не понимаете, что происходит в системе.
179
179
И не потому что вы недостаточно умны, а потому что код запутан. В нём всё связано со всем, всё влияет на всё, и даже чтобы просто проверить, вам приходится запускать сервер, кликать через интерфейс и ставить точку остановки где-то внутри `shouldGoOutside()`.
180
180
181
181
Представим, что система должна вернуть рекомендацию пользователю — выходить ли на улицу:
@@ -209,7 +209,7 @@ function shouldGoOutside(array $weather): bool
209
209
```
210
210
211
211
Здесь есть и вложенные блоки `try-catch`, и `if` внутри `if`, и цикл с ловлей исключений «внутри» функции.
212
-
Без отладки трудно понять, за какой именно шаг «цепи» падает — внешняя обработка или внутренняя.
212
+
Без отладки трудно понять, за какой именно шаг «цепи» падает — внешняя обработка или внутренняя.
213
213
214
214
<divstyle="page-break-after: always;"></div>
215
215
@@ -228,7 +228,7 @@ final class DecisionEngine
228
228
public function shouldGoOutside(array $weather): bool
Copy file name to clipboardExpand all lines: content/020-copilot.md
+11-11Lines changed: 11 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -59,9 +59,9 @@ LLM не откажет. Он скажет: «Да, командир!» — и
59
59
приведёт к серьёзным проблемам.
60
60
61
61
62
-
"Второй пилот" — помощник другого типа.
62
+
"Второй пилот" — помощник другого типа.
63
63
64
-
Он не будет указывать на архитектурные проблемы или спорные решения, пока его об этом не попросите.
64
+
Он не будет указывать на архитектурные проблемы или спорные решения, пока его об этом не попросите.
65
65
Его задача — помогать вам как можно быстрее двигаться к результату, решать бизнес-проблемы здесь и сейчас.
66
66
Но и большинство разработчиков настроены точно так же: задача должна быть закрыта, сроки — вчера, и мало кто будет
67
67
тратить время, чтобы просить помощника подумать над более выразительными именами переменных, архитектурой или стилем.
@@ -80,7 +80,7 @@ LLM не откажет. Он скажет: «Да, командир!» — и
80
80
81
81
Появляется асимметрия. Поверхность кажется правильной, но под капотом — несовместимость.
82
82
83
-
Мы уже несколько раз в книге говорили о симметрии, но давайте повторим.
83
+
Мы уже несколько раз в книге говорили о симметрии, но давайте повторим.
84
84
И посмотрим на небольшой пример импортера исторических данных о погоде:
85
85
86
86
```php
@@ -92,7 +92,7 @@ $importer->import([
92
92
]);
93
93
```
94
94
95
-
Его мог бы написать любой и выглядит вполне разумно. Но этот класс — часть процесса импорта/экспорта.
95
+
Его мог бы написать любой, и выглядит вполне разумно. Но этот класс — часть процесса импорта/экспорта.
96
96
LLM может не знать о том, что класс экспорта выдаёт не набор XML-структур, а zip-архив:
97
97
98
98
```php
@@ -115,8 +115,8 @@ LLM не «ошибся». Он просто не увидел целиком в
115
115
Именно контекст определяет смысл.
116
116
И если ты его теряешь — модель его точно не найдёт.
117
117
118
-
Другой пример такой асимметрии — если мы попросим LLM, например, внести проверку на
119
-
уникальность в базе данных:
118
+
Другой пример такой асимметрии — если мы попросим LLM, например, внести проверку на
119
+
уникальность в базе данных:
120
120
121
121
```php
122
122
class TokenService
@@ -178,15 +178,15 @@ LLM не знает, как устроена твоя система. Он пр
178
178
Сгенерированный код может выглядеть и работать правильно, но разработчик становится не уверен в его деталях, не понимает всех нюансов и не чувствует связи с ним.
179
179
Он становится чем-то внешним — как инструмент, который решил задачу, но не передал опыт.
180
180
181
-
В результате со временем может очень сильно снизиться мотивация и вовлечённость разработчика.
181
+
В результате со временем может очень сильно снизиться мотивация и вовлечённость разработчика.
182
182
Чтобы такого не допускать, нужно не просто «принимать» результат от LLM, а делать его "своим".
183
183
184
-
* Понимать, откуда он взялся.
185
-
* Переписывать под собственный стиль.
186
-
* Встраивать в архитектуру осознанно.
184
+
- Понимать, откуда он взялся.
185
+
- Переписывать под собственный стиль.
186
+
- Встраивать в архитектуру осознанно.
187
187
188
188
AI — это помощник. Он может ускорить работу.
189
189
Но он не заменит твой выбор, твой стиль, твоё мышление.
190
190
191
-
Второй пилот не заменит твоё мышление — он просто помогает писать.
191
+
Второй пилот не заменит твоё мышление — он просто помогает писать.
0 commit comments