Системное мышление для программиста важно как никогда

Это перевод статьи Скотта Хансельмана, одного из ведущих разработчиков Web Platform Team в Microsoft.

На конференции Microsoft BUILD между докладами ко мне подошел один студент университета, с подготовленным для меня списком различных вопросов. Мы присели и обсудили вопросы из списка.

Одним из основных его вопросов был: стоит ли ему волноваться, что его курс в Южной Африке изучает .NET framework на Windows? Не лучше ли было изучать .NET Core и новую версию C#? Смогут ли выпускники в дальнейшем найти работу, если они сейчас не изучают новые инструменты разработки? Его это немного беспокоило.

Я задумался на минуту. Это не вопрос, на который стоит сразу отвечать и потом смотреть, куда приведет язык. Мне нужно было это обдумать.

Не имеет значения, 21-летний студент ли университета, изучающий С# по книге 2012 года, или 45-летний senior developer, работающий с WinForms в маленькой компании на среднем западе, - все хотят быть уверены, что они нужны, что их знания и навыки ценны и что они могут быть полезны в любой компании.

Я посоветовал этому студенту не фокусироваться на синтаксисе C# и деталях .NET Framework, а вместо этого подумать над проблемами, которые они решают, и над системой вокруг них.

Хотя этот совет и связан с .NET, он может быть дан человеку, который изучает Rails3. Такой же совет можно дать тому, кто изучал оригинальный Node, а теперь изучает современный JavaScript или Node 12.

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

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

Что в общем происходит в браузере, если вы набираете google.com? Если ваш тостер не работает, покупаете ли вы новый или проверяете электричество в розетке, потом предохранитель, потом проверяете, есть ли электричество у соседей? Думайте о системах и о том, как они взаимодействуют. Системное мышление важней написания кода

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

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

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

А молодому человеку, с которым я разговаривал, я могу сказать: да, .NET Core, может, немного отличается от .NET Framework, и они оба отличаются от Ruby и JavaScript, но строки - это строки, циклы - это циклы, память - это память, а I/O операции диска были, есть и будут. А еще мы используем одну и ту же сеть. Процессы и потоки (threads), TCP/IP и DNS – понимание базовых понятий важно.

Не имеет значения, водите ли вы Honda или Jeep, вам все равно необходимо менять шины и думать о дороге по пути в магазин.

А какие советы дали бы вы молодому человеку, который не уверен в том, что изучаемое в университете будет ему полезно следующие 10 лет?

Далее перевод некоторых комментариев к посту.

Martyn Lloyd-Kelly

Учитывая количество сегодняшних технологий, пытаться изучить их все – это уже проигранная битва.

...

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

Fotis Spatharakis

Отличный пост, Скот. Я хочу процитировать одного моего профессора. Он сказал это, когда я начинал как программист, и это меня очень впечатлило.

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

Так что изучайте то, что не зависит от языка или системы, – базовые знания. Потом будет легче со всем остальным.

Jeff

110% согласен с тем, что понимание системы важней, чем освоение синтаксиса.

...

Свои интервью я начинаю с вопроса «Опишите как можно подробней, что происходит с момента, когда вы набираете goоgle.com и нажимаете enter, и до того момента, когда браузер полностью прорисовывает страницу». И я подсказываю, что я ожидаю ответ, длиной в 5-10 минут.

Меньше, чем 10% веб девелоперов (включая тех, которые имеют architect в их текущей должности) с опытом 15-20 лет могут говорить дольше, чем одна минута. ОДНА.

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

Anit Shrestha Mananadhar

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

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

Я уже немало работаю, но до сих пор изучаю какие-то базовые понятия программирования.

Mark Levinson

Я думаю, что специфика любого языка программирования не так важна. То, что важно, не стареет.

Вот что я могу посоветовать:

  • Учитесь работать с другими людьми. Современная работа - это совместная работа

  • Учитесь понимать людей и их поведение - много времени в своей карьере вы потратите на обучение и менторство других людей

  • Учитесь писать код хорошо (скилл, который до сих пор не дается мне)

И важней всего - учитесь думать.