Системное мышление в IT

Системное мышление — это практический подход в восприятии мира, который улучшает скорость и качество анализа, обучения и принятия решений. Примечательно, что этот подход сформировался не из абстрактных математических теорий. На курсах DevEducation студентам постоянно приходится использовать и развивать системный подход на практике.

Системный подход позволяет нам не просто видеть события, а распознавать в них алгоритмы взаимосвязи и структуры, что дает одновременно более глубокое и широкое понимание происходящего.

Закономерно, что центральное понятие системного мышления занимает система.

Система — это то, что способно поддерживать свое существование и функционировать как единое целое через взаимодействие частей.

Пожалуй, идеальным примером будет человеческий организм: он состоит из разных частей и органов, каждый из которых функционирует отдельно, но в то же время все органы работают вместе и влияют друг на друга. Равновесие флоры и фауны, маленькая семья или целое государство — мы живем в мире систем. Какие еще примеры систем приходят вам в голову?

Бизнес, команда разработки, разрабатываемое приложение — это также системы.

Системное мышление в IT

Часто прежде всего нас учат мыслить логично и с помощью анализа. Но такой подход далеко не всегда работает с системами. Использование линейного мышления без разбора может принести больше проблем, чем решений, ведь люди и события не подвластны законам логики. Их не так легко предвидеть или решить, словно математическую задачку. Логическое мышление опирается на относительно простые причинно-следственные связи, которые ограничены во времени и пространстве, а не на группу факторов, которые могут быть разделены во времени и пространстве. И последствия такой группы факторов могут не проявиться дни, недели или даже годы.

Почему же системное мышление и системный подход к задачам так важны в работе программиста?

Задачи команды разработки начинаются прежде всего с идеи, для которой необходимо придумать едва ли не все:

  • как будет выглядеть программа;
  • как будет работать;
  • из каких элементов будет состоять.

Нужно как бы посмотреть на систему сверху, чтобы увидеть, как продумать и создать такую архитектуру приложения, которая не только реализует все задачи заказчика, но и позволит делать больше, чем нужно сейчас.

Понимаете ли вы, как ваше приложение общается с файловой системой? С сетью? Понимаете ли вы, что такое время задержки (latency) и как это может повлиять на вашу систему? Имеете ли вы понимание стека, в котором ваш сервер получает информацию из базы данных, обрабатывает ее и посылает по сети клиенту или браузеру? Есть ли у вас представление о том, когда для передачи лучше использовать протоколы TCP, а когда UDP, и почему? Есть ли у вас понимание, что потом происходит с данной информацией после получения?

Важно то, что вы не обязаны уметь строить машину с нуля или снова изобретать двигатель. Но, если уж проводить аналогию, то вы должны понимать, как работает двигатель внутреннего сгорания, как поменять шины или масло. Или хотя бы знать, что эти понятия существуют, чтобы вы могли погуглить их 🙂

Думайте о системах и о том, как они взаимодействуют. На уровне архитектуры системное мышление важнее написания кода.

Ваш язык программирования или ваша система не должны быть для вас магической черной коробкой. Старайтесь разобраться в ней. Взломать, покопаться и заполнить пробелы в знаниях. Сломайте её, а потом почините.

Какие артефакты создает ваша система и что необходимо для ее работы? Оцените, какие плюсы и минусы имеет система. Объективно и без предвзятости.

Но вы не обязаны знать полностью все. Вообще, вы можете полностью погрузиться и разобраться в устройстве машины, а потом решить, что вы всю жизнь будете ездить на общественном транспорте, но тогда вы будете знать, что под капотом и как это работает.

Часто случается так, что системы, которые состоят из абсолютно разных элементов, подчиняются универсальным правилам организации. Их деятельность зависит от связи между элементами, а не свойств непосредственно элементов. Это позволяет предвидеть поведение системы.

Например, размеры, до которых искусственно созданная система может расти, ограничены. Таким образом, в определенный момент система может стать слишком громоздкой и сложной в управлении. Поэтому быстро растущие системы рационально разбить на подсистемы. Например, чем больше становится бизнес, тем сложнее им управлять. Команда из шести-семи человек будет работать эффективно, а команда из шестидесяти человек будет ни на что не способна, если не разбить ее на подкоманды. Похожим принципом руководствуются в scrum of scrums.

В колледже DevEducation также используется системный подход: как в решении задач, так и в построении процессов разработки на учебных проектах или делении на команды. И даже в стремлении менторов объяснить, «как это работает под капотом» 🙂

Автор: Помогаева Альфия, выпускница курса QA/AT, ныне сотрудница компании.