0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Знаете ли вы разницу между словами "простой" и "лёгкий"? А какое из этих слов является антонимом слова "сложный"?</p>
1
<p>Знаете ли вы разницу между словами "простой" и "лёгкий"? А какое из этих слов является антонимом слова "сложный"?</p>
2
<p>Чтобы ответить на этот вопрос, обратимся к определению слова "сложность".</p>
2
<p>Чтобы ответить на этот вопрос, обратимся к определению слова "сложность".</p>
3
<blockquote><p>Сложность описывает поведение системы или модели, чьи компоненты взаимодействуют различными способами.</p>
3
<blockquote><p>Сложность описывает поведение системы или модели, чьи компоненты взаимодействуют различными способами.</p>
4
</blockquote><p>Получается, что "сложный" - это состоящий из большого числа элементов, взаимодействующих друг с другом. Причем, чем больше этого взаимодействия и чем более оно разнообразно, тем более сложная на выходе система.</p>
4
</blockquote><p>Получается, что "сложный" - это состоящий из большого числа элементов, взаимодействующих друг с другом. Причем, чем больше этого взаимодействия и чем более оно разнообразно, тем более сложная на выходе система.</p>
5
<p>Отсюда можно сделать вывод, что на обратной стороне находится понятие "простой". То есть состоящий из одного элемента. В общем случае, конечно, "простой-сложный" - это шкала. Какие-то вещи получаются проще, какие-то сложнее.</p>
5
<p>Отсюда можно сделать вывод, что на обратной стороне находится понятие "простой". То есть состоящий из одного элемента. В общем случае, конечно, "простой-сложный" - это шкала. Какие-то вещи получаются проще, какие-то сложнее.</p>
6
<p>Самое главное, что нужно вынести из этих определений: пара простой-сложный - это объективная оценка системы или модели.</p>
6
<p>Самое главное, что нужно вынести из этих определений: пара простой-сложный - это объективная оценка системы или модели.</p>
7
<p>С другой стороны, в своей жизни мы часто оперируем другой парой: "лёгкий-тяжелый". И вот эта пара уже представляет собой субъективную оценку. Для нас "лёгкий", почти всегда означает "привычный".</p>
7
<p>С другой стороны, в своей жизни мы часто оперируем другой парой: "лёгкий-тяжелый". И вот эта пара уже представляет собой субъективную оценку. Для нас "лёгкий", почти всегда означает "привычный".</p>
8
<p>Небезызвестный человек Rich Hickey, по совместительству создатель языка Clojure, сделал доклад с названием<a>Simple Made Easy</a>(<a>Видео с русскими субтитрами</a>), в котором подробно рассмотрел эти понятия и то, как ошибаются люди, в частности инженеры, принимая решения.</p>
8
<p>Небезызвестный человек Rich Hickey, по совместительству создатель языка Clojure, сделал доклад с названием<a>Simple Made Easy</a>(<a>Видео с русскими субтитрами</a>), в котором подробно рассмотрел эти понятия и то, как ошибаются люди, в частности инженеры, принимая решения.</p>
9
<p>Так уж устроен мозг, что чаще мы фиксируемся на лёгкости вместо простоты. Потому что простоту увидеть гораздо труднее, ведь это непривычно.</p>
9
<p>Так уж устроен мозг, что чаще мы фиксируемся на лёгкости вместо простоты. Потому что простоту увидеть гораздо труднее, ведь это непривычно.</p>
10
<p>Что дает нам<em>лёгкость</em>:</p>
10
<p>Что дает нам<em>лёгкость</em>:</p>
11
<ul><li>Простой старт</li>
11
<ul><li>Простой старт</li>
12
</ul><p>Чем мы за это платим:</p>
12
</ul><p>Чем мы за это платим:</p>
13
<ul><li>Резкое торможение после предела</li>
13
<ul><li>Резкое торможение после предела</li>
14
<li>Отсутствие нового опыта, а значит роста</li>
14
<li>Отсутствие нового опыта, а значит роста</li>
15
<li>Сложные решения и подходы</li>
15
<li>Сложные решения и подходы</li>
16
</ul><p>И некоторые примеры из жизни программистов:</p>
16
</ul><p>И некоторые примеры из жизни программистов:</p>
17
<p>Константы (значение) - это просто, переменные - сложно (значение, время). Данные (значения) - это просто, объекты - сложно (значение, поведение, идентификация).</p>
17
<p>Константы (значение) - это просто, переменные - сложно (значение, время). Данные (значения) - это просто, объекты - сложно (значение, поведение, идентификация).</p>
18
<p>Рекурсия, по сравнению с циклом, требует гораздо меньше компонентов и понятий - кроме самой функции не нужно больше ничего. При этом понять рекурсию не так легко. Справедливости ради отметим, что это касается больше тех людей, чей опыт до момента знакомства с рекурсией был сугубо императивный.</p>
18
<p>Рекурсия, по сравнению с циклом, требует гораздо меньше компонентов и понятий - кроме самой функции не нужно больше ничего. При этом понять рекурсию не так легко. Справедливости ради отметим, что это касается больше тех людей, чей опыт до момента знакомства с рекурсией был сугубо императивный.</p>
19
<p>Из сказанного можно сделать вывод, что всегда есть простая альтернатива, которой можно пользоваться. Но это не так, бывают сложные задачи, требующие непростых решений. И если упрощение идёт в одном месте, то в другом, скорее всего, нужно будет усложнить.</p>
19
<p>Из сказанного можно сделать вывод, что всегда есть простая альтернатива, которой можно пользоваться. Но это не так, бывают сложные задачи, требующие непростых решений. И если упрощение идёт в одном месте, то в другом, скорее всего, нужно будет усложнить.</p>
20
<p><strong>No Silver Bullet - Essence and Accidents of Software Engineering (Fred Brooks)</strong></p>
20
<p><strong>No Silver Bullet - Essence and Accidents of Software Engineering (Fred Brooks)</strong></p>
21
<p>Фредерик Брукс, создатель IBM/360 и автор книги "Мифический человеко-месяц", в своем эссе "No Silver Bullet" сформулировал два типа сложности, знание которых поможет вам лучше понимать свои системы.</p>
21
<p>Фредерик Брукс, создатель IBM/360 и автор книги "Мифический человеко-месяц", в своем эссе "No Silver Bullet" сформулировал два типа сложности, знание которых поможет вам лучше понимать свои системы.</p>
22
<h2>Необходимая сложность</h2>
22
<h2>Необходимая сложность</h2>
23
<blockquote><p>Определяется сложностью решаемой проблемы/предметной области.</p>
23
<blockquote><p>Определяется сложностью решаемой проблемы/предметной области.</p>
24
</blockquote><p>Если перед вами стоит задача реализовать программу, которая выполняет 20 действий, то вы не можете (с точки зрения программирования, а не бизнеса) реализовать меньше и при этом выполнить задачу. Если у вас есть 5 бизнес-правил, касающихся оформления заказа (например, у вас должно быть достаточно денег на счету), то вам нужно будет их все реализовать.</p>
24
</blockquote><p>Если перед вами стоит задача реализовать программу, которая выполняет 20 действий, то вы не можете (с точки зрения программирования, а не бизнеса) реализовать меньше и при этом выполнить задачу. Если у вас есть 5 бизнес-правил, касающихся оформления заказа (например, у вас должно быть достаточно денег на счету), то вам нужно будет их все реализовать.</p>
25
<p>Очень важно уметь выделять главное и видеть, где у вас та самая, необходимая, сложность.</p>
25
<p>Очень важно уметь выделять главное и видеть, где у вас та самая, необходимая, сложность.</p>
26
<h2>Случайная сложность</h2>
26
<h2>Случайная сложность</h2>
27
<blockquote><p>Определяется проблемами, которые создают сами программисты. Например, используют неправильные инструменты для данной задачи.</p>
27
<blockquote><p>Определяется проблемами, которые создают сами программисты. Например, используют неправильные инструменты для данной задачи.</p>
28
</blockquote><p>Именно этот тип сложности является опасным и ведущим к краху. Неправильные процессы, подходы, библиотеки, языки - всё это, как минимум, вас сильно замедляет, удорожает разработку. И, в конце концов, может стать причиной неудачи проекта.</p>
28
</blockquote><p>Именно этот тип сложности является опасным и ведущим к краху. Неправильные процессы, подходы, библиотеки, языки - всё это, как минимум, вас сильно замедляет, удорожает разработку. И, в конце концов, может стать причиной неудачи проекта.</p>
29
<p>От этой сложности нужно избавляться всеми способами. Главное, что я хотел бы донести до вас в этом уроке: понимание того, где у вас случайная сложность, приходит только с обогащением вас как профессионала. Многие разработчики смотрят на это так: я выучу ещё 10 новых библиотек и пару новых языков и стану круче. Да, вы станете чуть лучше, но это будет совсем чуть-чуть. Потому что эти библиотеки и языки будут использовать подходы, к которым вы привыкли, и вам будет легко, а значит роста почти не будет. Единственный способ расти по-настоящему быстро и качественно - это изучать то, что даётся тяжело: языки с новыми парадигмами, другие области программирования, такие как мобильные приложения, фронтенд вместо бэкенда и наоборот.</p>
29
<p>От этой сложности нужно избавляться всеми способами. Главное, что я хотел бы донести до вас в этом уроке: понимание того, где у вас случайная сложность, приходит только с обогащением вас как профессионала. Многие разработчики смотрят на это так: я выучу ещё 10 новых библиотек и пару новых языков и стану круче. Да, вы станете чуть лучше, но это будет совсем чуть-чуть. Потому что эти библиотеки и языки будут использовать подходы, к которым вы привыкли, и вам будет легко, а значит роста почти не будет. Единственный способ расти по-настоящему быстро и качественно - это изучать то, что даётся тяжело: языки с новыми парадигмами, другие области программирования, такие как мобильные приложения, фронтенд вместо бэкенда и наоборот.</p>
30
<p>Автоматное программирование, как раз, относится к одному из таких пунктов. Эта парадигма изменит вас (если вы позволите этому случиться) невероятно сильно и даст возможность лучше определять и искоренять случайную сложность в вашем коде.</p>
30
<p>Автоматное программирование, как раз, относится к одному из таких пунктов. Эта парадигма изменит вас (если вы позволите этому случиться) невероятно сильно и даст возможность лучше определять и искоренять случайную сложность в вашем коде.</p>
31
<p>P.S. Основные языки для роста: haskell, clojure, prolog, erlang, kotlin, c.</p>
31
<p>P.S. Основные языки для роста: haskell, clojure, prolog, erlang, kotlin, c.</p>