Как выжить в круговороте современного IT, или Зачем изучать основы
Современная IT-отрасль меняется и развивается настолько быстро, что просто физически не успеваешь за ней. Ограниченные в своих возможностях статические web-страницы были вытеснены Rich UI c функционалом сродни операционным системам. JavaScript вместе с CSS стали вездесущими. Все меньше и меньше людей пользуются стационарными компьютерами и предпочитают мобильные решения — приложения и сайты эволюционируют за потребностями пользователей. Если раньше сайты можно было крутить хоть на локальной машине, то сейчас все мигрирует в облако. Базы данных — и те с табличного вида все чаще принимают вид, эффективнее представляющий доменную область. Про waterfall уже ходят легенды, и все ведут Agile-разработку. И так куда не глянь.
Поэтому каждый хоть раз чувствовал себя как белка в колесе.
Вроде бы учишь и учишь новые технологии, а они все возникают как грибы после дождя. И с каким темпом они возникают, с таким же и уходят для большинства навсегда. А кто-то окунается в них долгие годы, ожидая шанса вдохнуть ветра перемен.
Это колесо крутится так быстро, что если остановиться передохнуть на пару минут, уже можно не догнать его, а если постоянно бежать — перегораешь или начинаешь пьянеть от передозировки IT-технологий, концепций и подходов. Как и при любом опьянении и впоследствии — головокружении, хочется нащупать твердую землю, так сказать заземлиться.
Начинаешь детальнее разглядывать весь этот зоопарк, а не отдельную приколяшку и задаешь себе еще больше вопросов.
Насколько новы подходы в этих технологиях?
Мне кажется или где-то я это уже видел?
Почему проблемы в этой технологии решаются введением нового уровня абстракции?
Почему эти абстракции загоняют нас в рамки, которые так сложно раздвинуть, чтобы что-то изменить?
Почему каждый раз, когда что-то идет не так или технология не позволяет решить проблему — вас бросает в холодный пот? Неужели нельзя найти ответ на Stack Overflow (не надо только говорить, что и вы там не ищете ответ в первую очередь), и придется тратить часы, а то и дни, чтобы понять, как это новое колесо, состоящее из десятков старых колес, все-таки едет вперед?
Похоже, что это риторические вопросы. Технологии усложняются и эволюционируют, чтобы отвечать требованиям времени, и с этим нужно смириться. Но так как технологии не делают концептуальный шаг вперед, то и успеть за этим всем абсолютно реально.
Так что там по поводу заземлиться или нащупать фундамент?
А фундамент — это и есть фундаментальные знания. Легко можно забыть API очередной технологии, но принципы и основы — нет. Так же, как научившись плавать одним стилем, вы сможете освоить любой стиль плавания при должной физической подготовке и желании.
И не то чтобы я был против изучения новинок, я против того, чтобы тратить на них 100 % времени. Малой части будет достаточно с головой. Главное, постигнуть основы.
Сразу хочу сказать, что основ очень много. Нельзя ограничивать себя только тем, что нужно кровь из носа: ваш серверный язык программирования, OOP, HTTP, SQL, JavaScript, HTML, CSS, ваша система версионирования, ваша IDE и т. д. Нужно учить то, чему учат только в университетах: высшую математику, алгоритмы, автоматы, теорию вероятности, матстатистику, мат. методы исследования операций и т. д.
Но пока это голые слова, и вы можете задать логичный вопрос. Нужно ли мне все это, чтобы заниматься той ежедневной рутиной? Пилить формочки, фиксить элементарные баги и писать простейшие запросы в базу данных? Как показывает практика — нет, оно не надо и подавно.
Дак почему же на собеседованиях спрашивают вещи с которыми, за редким исключением, вы никогда не встречаетесь? Зачем нужны логические задачи и вообще задачки, зачем нужны вопросы по математике, структурам данных или о вещах, скрытых от вашего повседневного взора? Почему такие мастодонты, как Google, Amazon и другие, делают на это упор?
Имею смелость предположить, что работодателя да и вас самих беспокоят не ваши умения запоминать ответы на вопросы, что с каждым собеседованием становится намного легче, и даже не знание всех новых API. А все же оценивается ваш ум: насколько он гибок; сможет ли он выучить новую приблуду и желательно быстро; сможет ли он отделять мух от котлет, что очень важно при таком количестве новых и старых технологий.
Что же нам дадут некоторые из основ?
Вот мое краткое видение:
Математика: алгебра и геометрия — это первые шаги в логическом мышлении. Еще Аристотель описал основы логики, что в дальнейшем повлияло на многих греческих философов/математиков. Это кажется дико, но не всегда легко понять, что было причиной того или иного бага или проблем с системой. А логика математики может помочь в развитии таких навыков.
Физика расширяет наши общие познания о Вселенной. Большинство нердов слышали о котане Шредингера и о том, что частица может оказаться в любой момент времени в любой части Вселенной, но мало кто понимает, что это значит. Физика учит нас критическому мышлению — отличать достижимое от недостижимого.
Теория вероятности и матстатистика: тяжело представить современные системы без огромного количества ивентов. Big data тут, big data там. А там, где есть куча ивентов, всегда есть и необходимость их анализа. Вид нормального распределения не тот — пора бить тревогу. Но если для вас это просто график, то в следующий раз вам его даже не покажут.
Структуры данных: данные везде, и их надо где-то хранить. Но у нас уже есть стандартные структуры наподобие list и map! Как показывает практика, их возможностей начинает не хватать в самый неподходящий момент, и чтобы это быстро устранить, нужно знать альтернативы, знать, где они уже используются, — все это может помочь в самый неожиданный момент.
Алгоритмы: это следующий шаг в логике. И если математические теоремы не предполагали особых вариантов, то алгоритмы вводят понятие сложности, проблемы выбора, оптимального именно для вашей задачи. Это поможет вам научиться сравнивать альтернативы, взвешивая все за и против.
Базы данных: писать запросы можно быстро научиться, но вот проектировать их — это уже другой уровень. Для этого нужно уметь анализировать предметную область, правильно компоновать сущности и создавать связи между ними. Может, на практике такой шанс просто не выпадет, если вы с этим не были знакомы раньше и не слышали про нормальные формы.
Компьютерные сети: нас уже не удивляет тот факт, что даже самая простая программа требует подключения к интернету, и вообще большая часть нашей жизни протекает там. Но в большинстве случаев мы не сможем объяснить, как наш браузер находит конкретный сайт, как компьютер подключается к другому и почему нам нужны другие протоколы помимо http/https.
Электротехника: мы привыкли принимать новую технику за само собой разумеющееся, но кто-то вообще задумывался, как она работает? Что такого интересного дают нам NPN- и PNP-переходы и что привносят в нашу цивилизацию транзисторы?
Математические методы исследования операций: уметь искать оптимальные решения — это то, чего не хватает многим, большинство принимает решения по чуйке. Но оказывается, существуют подходы, которые помогут вам в этом тяжелом деле.
Проектирование систем: все хоть раз слышали про GRASP-паттерны, о том, что Coupling должен быть low, а Cohesion — high. Но слышать — это одно, а понимать и даже делать — совсем другое.
Паттерны/антипаттерны: как любой дантист должен знать все типичные способы лечения зубов и также ошибки при этом процессе, так и вы должны знать подавляющее большинство паттернов и антипаттернов.
И тогда в следующий раз, когда будет необходимость разбираться с новинкой, вы посмотрите не только на API, но и в саму суть технологии. И впоследствии можете сказать себе, что у вас есть вариант оптимальнее, чем тратить на это свое время.
Лично я только в более позднем возрасте осознал, что зря поверхностно относился ко многим дисциплинам в университете. Не повторяйте моих ошибок и не бегите за длинным рублем в университетские годы, а познавайте основы, и это окупится с лихвой!