Грехи и добродетели — в веб-разработке

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

    Вопрос «как достигнуть высокого уровня профессионального совершенства и что для этого нужно» мучил меня последние 20 лет. Помимо чтения-перечтения правильных книг, изучения исходников правильных программ и периодического ныряния в Computer Science — приходилось постоянно общаться с разными коллегами из разных подсфер разработки.

    С «чисто» разработчиками «головного мозга» становилось довольно быстро скучно, т.к. часто оказывалось, что движение к цели (проекта, ТЗ) является каким-то побочным, а главное — это процесс и нужно, уподобляясь бюрократам, религиозным сектантам и экспертам по багам русского языка — изучать тонкости работы интерпретатора-компилятора и чем больше ты знаешь всякой мусорной хрени, рожденной хаосом, тем круче. Ощущение, что нейроны мозга проросли друг в друга, запутались и отсохли, создав пульсирующее кольцо презрения к красоте и простоте — не покидало.

    С «чисто» менеджерами «головного мозга» было тоже не очень весело. Да да, конечно в данном случае основной целью было сделать проект в срок, но возникающие в момент технических и аналитических сложностей и преодоления рисков эмоции и психозы с желанием найти виноватых в багах и подсознательным шантажом, с целью взять на себя ответственность за сроки, навязываемые сверху и откровенным наплевательством на техническое совершенство — приводили к мысли, что настоящие менеджеры все таки должны быть такими же профессионально развитыми, как и разработчики, нередко решающие сложные головоломные задачи, дебажа код и ночами и выходными. Но от менеджера, конечно, требуется гораздо больше именно человеческих качеств: храбрости, ясности, уверенности и умения мотивировать.

    Но, к счастью, такие «чистые» случаи довольно редки, а в условиях потока проектов и дедлайна через довольно короткое время в командах остаются настоящие бойцы — и вот именно в коммуникациях с ними и в активной проектной работе таки начали постепенно формироваться правильные ответы на поставленные в начале поста ребром вопросы.

    И, как же полезно какое-то время посидеть на поддержке кода… особенно своего! Когда широко открытыми глазами видно, как горе от ума («зачем делать просто если можно сложно?») и попытки разработчика (возможно тебя) слышать только себя и самоутвердиться — рождают кровоточащие в поддержке и развитии чудовища, которые и пристрелить уже нельзя, и кормить — опасно для жизни.

    Итак, вот такие ответы на вопросы у меня сформировались и я готов ими поделиться.

    Вопрос: какие языки программирования изучать в первую очередь?

    Вопрос устарел! :) Если у вас нет цели получать удовольствие от процесса и зарплату за строки кода и троллить реальность, запутывая окружающих в глубине собственных знаний багов компиляторов/интерпретаторов, т.е. если вы не Чудак (лишнюю букву заменить) — то языки уже не нужно прямо сидеть и изучать. Сейчас существует плеяда языков, которые учатся буквально за несколько дней и позволяют быстро решать поставленные бизнес-задачи с хорошим качеством. Для веба тут несомненный лидер — PHP, для machine learning/deep learning тут прекрасно себя показывает лаконичный Python, а для бэкэнд-сервисов можно начать с быстрого решения задачи на том же PHP/Python/Ruby/Go/Node.js, а закончить (по опыту «заканчивать» приходится в 0.1% случаев) на более громоздких и низкоуровневых языках: Java/C#/C++.

    Вопрос: какие алгоритмы нужно изучать в первую очередь?

    Вы не поверите, но алгоритмы из Computer Science — часто являются контринтуитивными и разрушающими сознание и сколько бы вы их не изучали и не запоминали — вы их забудете после хорошего отпуска, только если вы не гений на пути к нобелевке. Максимум, что нужно знать для начала, так это то, что кроме встроенных в язык функций сортировки, есть еще, как там ее… сортировка «пузырьком» — но про нее нужно сразу забыть, т.к. есть более эффективные методы сортировки, описанные в книгах, которые можно прочитать на пенсии (я честно прочитал не один раз Сэджвика), но гораздо полезнее — знать, как называется библиотечная функция сортировки в языке и использовать ее.


    Не нужно знать принципы работы двигателя внутреннего сгорания, чтобы хорошо управлять автомобилем и получать наслаждение от жизни! Не нужно знать тонкости работы виртуальных деструкторов, чтобы эффективно использовать СУБД с HTML-мордой и быстро решать бизнес-задачи с коротким time2market.

    Аналогично следует подойти и к поиску и к деревьям и к теории графов и обработке строк. Скорее всего, это все уже реализовано в языке программирования оптимальным образом. А если вы до сих пор не знаете, что регулярные выражения это вершина айсберга теории конечных автоматов — забейте и расслабьтесь и учитесь лучше хорошо пользоваться регулярками. А если ВДРУХХХ нагрузочное тестирование после 10 лет успешной эксплуатации веб-проекта выявит неэффективность алгоритма — тогда и почитаете и заодно разберетесь с основами теории вычислительной сложности.

    Гораздо интереснее, если говорить по Science — это покопаться в матстатистике, тервере, линейке чтобы понимать, о чем сейчас говорят в контексте deep learning. Поверьте, это гораздо интереснее, чем бесконечное колупание внутри машины Тьюринга.

    Вопрос: стоит углубляться в реляционную алгебру и СУБД?

    Обязательно и как можно скорее. Но прежде всего, стоит ощутить простую и красивую философию реляционной алгебры и сразу просмотреть, чего делать нельзя. Скорее всего, вы будете использовать СУБД для хранения и агрегации данных и вам будет потом гораздо проще разобраться с различными современными и иногда весьма полезными недоСУБД, которые устроены гораздо проще и примитивнее классики как по возможностям, так и по архитектуре.

    Вопрос: стоит ли копаться в unix и операционной системе?

    Если вы нагоФнокодите 50 строк на javascript, то Ктулху этого, скорее всего и не заметит. Но если вы перепутаете фундаментальные сетевые протоколы, как иногда путают IP с TCP — беды не миновать. Я думаю, что на изучение архитектуры операционной системы, bash, системных вызовов и сетевых протоколов и стандартов стоит потратить максимум доступного времени и вы не пожалеете. Язык «С» тоже следует прочувствовать, ну чтобы было понимание, что под капотом происходит у вас. Дело в том, что современные, особенно веб-проекты, требуют очень тесного взаимодействия и понимания тонкостей работы операционки, умения мониторить и понимать процессы, потоки, системные вызовы, знать в деталях TCP/http — это позволит вашему проекту и взлететь быстро, и работать правильно и долго.
    Поэтому инвестируйте в изучение unix как можно больше времени — поверьте, это окупиться с лихвой и над вами перестанут смеяться бородатые дядьки, настраивающие nginx/apache/mysql с широко закрытыми глазами.


    Не нужно быть геологом, чтобы покорять вершины! Не нужно зазубривать сортировку Шелла, чтобы сортировать данные форм :)

    Вопрос: зачем писать модульные и интеграционные тесты к коду?

    Вас обманули. Раньше, в эпоху популярных техник разработки на гране садомазохизма, когда языки были дырявыми и программы создавались годами — нужно было все что можно и нельзя покрывать автоматизированными тестами с примесью шизофрении. Сейчас это очень дорого, программы, а особенно веб-проекты, создаются на порядки быстрее, требования постоянно меняются — и единственная возможность чтобы проект работал правильно и долго — это «сразу писать правильно и без ошибок» (С) :-) Я не шучу. Вот как обычно это делают:

    • Хорошенько думают, прежде чем писать код;
    • Пишут аккуратно, ясно, модульно;
    • Пишут на одном из лаконичных динамических языков со встроенными в синтаксис коллекциями и выразительными конструкциями (желательно функциональными), чтобы можно было визуально отследить поток выполнения программы на 99.99% (php, python, ruby, scala).

    Но если вы таки, несмотря на предупреждения выше, полезли без особой нужды в низкоуровневые языки типа java и C# (и, упаси Бог, в С/C++) — вам придется писать модульные тесты, ибо вы начнете быстро на третий день запутываться в собственном коде, уложив монитор на пол и ползая по нему с лупой на четвереньках и падать, иногда, на окруживших героя коллег :) Низкоуровневые языки хороши для отдельных сервисов и узких задач и в условиях достаточного количества времени и людей и департамента тестирования — показывают себя с лучшей стороны.

    Иногда, правда, в больших и сложных проектах, хорошо помогают функциональные тесты. В Битрикс24, автоматизированном изнутри исключительно на bash/php, у нас несколько сот таких вот тестов и они оправдывают потраченное на них время.

    Вопрос: а стоит ли писать ТЗ и углубленно проектировать?

    Это философский вопрос :) В веб-проектах его обычно пишут, но требования часто начинают сразу меняться, поэтому совет простой: пусть ТЗ пишут менеджеры и сами его и читают, а разработчикам следует выделить 2-3 дня на пытки с пристрастием экспертов в предметной области со стороны Заказчика. Проектирование в веб-разработке с желанием влезть в голову Клиенту и таки увидеть будущее развитие системы — это ключевой момент, влияющий на успех.

    Вопрос: если языки изучать есть смысл только создателям компиляторов, то что же изучать то с пристрастием?

    Изучайте стандартные библиотеки языка и возможности веб-технологий (например WebRTC). В PHP можно найти просто море коннекторов к стандартным и очень мощным оперсорсным библиотекам, в Python бонусом идут библиотеки для работы с тензорами и deep learning фреймворками, в java это библиотека коллекций и executor framework и т.п.

    Также инвестируйте время в изучение фреймворков. В java есть целая библиотека этого добра — Spring/EE. В php есть ряд интересных и популярных веб-фреймворков. У python появилось несколько прекрасных фреймворков для машинного обучения и т.д.

    Вопрос: так увлечение программированием это все таки добро или зло?

    Конечно зло! :) Нужно научиться увлекаться эффективным и лаконичным решением задач с помощью имеющегося сейчас в избытке инструментария. Если задачку можно решить на bash — пишите на bash, если сходить в СУБД можно из PHP — берите его и используйте. Если для создания сайта с админкой есть готовые фреймворки — берите их и не страдайте садомазохизмом.

    Написанный даже вами код, через 2-3 месяца, вы забудете и как бы вы не старались его хорошо запомнить, мозг будет сопротивляться и вы будете страдать. Поэтому самый простой способ получать удовольствие от разработки — использовать готовые и протестированные библиотеки и решать с их помощью задачи с МИНИМАЛЬНЫМ объемом своего, вылизанного по всем стандартам, кода.

    Важно понять, что программировать научиться можно быстро, а вот выражать свои мысли ясно, лаконично и красиво в коде, следуя принципу «дурака работа любит» — очень трудно и именно этому следует учиться большую часть времени. Гораздо полезнее изучать готовые библиотеки от корки до корки и строить свои проекты на базе готовой алгоритмической алгебры, чем писать «все с нуля». А современный тренд по созданию лаконичных и немногословных языков с встроенными в синтаксис коллекциями для выражения собственных мыслей (php, python, kotlin, scala), нередко в функциональном стиле, подавляющих когнитивный шум от тяжеловесных конструкций — еще больше убеждает меня в этом!

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

    Коллеги, надеюсь мне удалось ответить на часть мучающих каждого из нас вопросов и советы будут полезны не только начинающим веб-разработчикам, но и более опытным и экспертам, ищущим пути самореализации. Всем удачи и хорошего настроения!
    Метки:
    1С-Битрикс 67,31
    Компания
    Поделиться публикацией
    Комментарии 42
    • +14
      Не нужно знать принципы работы двигателя внутреннего сгорания, чтобы хорошо управлять автомобилем и получать наслаждение от жизни! Не нужно знать тонкости работы виртуальных деструкторов, чтобы эффективно использовать СУБД с HTML-мордой и быстро решать бизнес-задачи с коротким time2market.

      Так вот он главный принцип разработчиков системы 1С-Битрикс. /оффтоп
      • +2
        Чтобы управлять автомобилем как профессиональный пилот — надо знать принципы работы двигателя внутреннего сгорания )
        • 0
          Зачем? :-) Жми на газ и вперед.
          • +1
            Чтобы доехать до финиша )
            • 0
              Если это спринт по прямой то и так сойдет
              • +1
                Вы видели соревнования по Драгу? О чем спор ) Взорвете двигатель )
                • 0
                  Это если обороты не держать в пределе, тогда да.
                  • –8
                    Да я изучил ДВС вдоль и поперек, а на практике беру либо и использую в 99.9% случаев. И нахрена я несколько лет копал Somputer Science с пристрастием? :-)
            • +2
              Но больше принцип работы трансмиссии, подвески и тормозов. У мотора задача тупая и понятная по сравнению с перечисленными системами)
              • –1

                Вы, видимо, профессиональный пилот? Тогда почему в профессиональных гоночных командах куча профессиональных техников, помощников и пилоту остается задача только "рулить". Не такая уж и простая задача. Но пилоту важно знать какие обороты, какой крутящий момент у него, пик, минимум. Ему нужно знать развесовку и чувствовать ее. Но информация о принципе работы двигателе ему особо то и не нужна. Или, вы думаете, если профессиональный гонщик сядет за машину с роторным двигателем или с электродвигателем: он сразу будет хуже ехать без детального знания принципа работы привода? Ему достаточно знать как этот двигатель тянет, как едет. Т. е. внешние проявления, но не внутрянка.

                • 0
                  Чувствуете разницу между принципами и детальными знаниями?
                  • 0

                    И как в гонке поможет знание общих принципов?

            • +8
              > Если вы нагоФнокодите 50 строк на javascript, то Ктулху этого, скорее всего и не заметит.

              Битрикс должен сделать это девизом
              • +7
                низкоуровневые языки типа java и C# (и, упаси Бог, в С/C++)


                Ктулху забери автора к себе. / оффтоп
                • –8
                  я и так в аду :-)
                  • +4
                    нет серьезно, когда они стали низкоуровневыми?
                    • –4
                      Ну сравни python с java, разница то огромная пипец. Понятно, что C у нас низкоуровневый, а все остальное высокоуровневое — но как ты поставишь вместе PHP и C++?
                      • +1
                        Ну уровень у них одинаковый, место применения разное, собственно php и появился как развитие под специфические задачи

                        В 1994 году датский программист Расмус Лердорф создал набор скриптов на Perl/CGI для вывода и учёта посетителей его онлайн-резюме, обрабатывающий шаблоны HTML-документов. Лердорф назвал набор Personal Home Page (Личная Домашняя Страница). Вскоре функциональности и быстроты Perl — интерпретатора скриптов — перестало хватать, и Лердорф разработал с использованием языка C новый интерпретатор шаблонов PHP/FI (англ. Personal Home Page / Forms Interpreter — «персональная домашняя страница / интерпретатор форм»)
                        • –6
                          Сборщик мусора у них, в отличие от C++, встроенный. Но java работает в разы быстрее из-за строгой типизации и ООП головного мозга. Зато у php динамическая типизация, удобная часто при разработке и встроенные коллекции. Они очень разные. Тут грань что считать высокоуровневым, а что низкоуровневым — размытая.
                          • +2
                            Тут грань что считать высокоуровневым, а что низкоуровневым — размытая.

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


                            И вот —
                            Низкоуровневый язык программирования (язык программирования низкого уровня) — язык программирования, близкий к программированию непосредственно в машинных кодах


                            Критерии очень даже понятные
                            • 0
                              Cи на каком уровне, по твоему?
                              • +2

                                Коллега, а вы пробовали ассемблер? Попробуйте, и тогда вопрос с С у вас отпадет, а разница между python и Java перестанет быть "пипец огромной"

                                • –1

                                  Это понятно. Но кто-нибудь сейчас будет писать сайт на ассемблере? Его даже на СИ писать не будут. Даже такие высоконагруженные сервисы, как ВК, работают на PHP, почему-то их не пишут на СИ и тем более на ассемблере.

                                  • +1
                                    окститесь, у них немного разные сферы, никто и не просит сайты писать на си, для этого и придумали PHP чтоб жизнь упростить,
                                    НО от этого они высокоуровневые языки, те которые автор привел в статье не станут низкоуровневыми, и наоборот тоже чуда не случится.

                                    Так то попытка смешать мух и котлеты не очень удачная.

                                    Или по Вашему все что не используется в вебе сразу низкоуровневое? ИМХО, но так то есть совсем специфичные высокоуровневые языке вообще не используемые в вебе никоим образом, но хотя возможно и могли бы там использоваться, и что они тоже становятся высокоуровневыми?

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

                                    • –1

                                      Деление на самом деле условное. Когда был ассемблер и си (условно), то все было понятно, какой низкоуровневый, какой высокий. Сейчас же границы очень сильно размыты. А так как статья о веб-разработке, то не веб языки можно считать условно низкоуровневыми (но опять же, это не точная, "научная" формулировка). Понятно, что это не соответствует классическим представлениям.
                                      А написать сайт на си не представляет большой проблемы. И пишут какие-то специфичные вещи, с которыми не может справиться PHP.

                                      • –3
                                        Статья как раз для вас! Избегайте излишней формализации и цепляния к формулировкам, которые поросли паутиной еще 30 лет назад. Эти все вещи мне и не только мне давно известны, но мир меняется. Лучше размышлять уровнем абстракции/алгебры языков и тогда вы поймете, что Haskel с Erlang, частично, Scala, с, думаю Akka, вообще пипец на каком высоком уровне находятся. Раскрепостите сознание, не зацикливайтесь, прошу :-)
                                        • –3
                                          И, продолжая тему, выбирая правильный язык = алгебру = уровень абстракции и выразительности — вы меняете на порядок вероятность успешности проекта.

                                          А веб, уверен, это вершина сейчас в мире разработки. Почти все делается для него и он направляет индустрию, как бы нам не хотелось не признавать это и углубиться в совершенствование компилятора какого нить
                                • +2
                                  Сборщик мусора у них, в отличие от C++, встроенный.

                                  Вот не помню когда последний раз писал new/delete в C++ ))
                                  • –2
                                    Макс, ну потому что ты реально очень крут и делаешь сразу правильно. А я дальше учебников и Страуструпа C++ не видел и вот это выделение памяти и ошибки возможные — очень волнуют :-)
                                • –5
                                  наверно самое большое отличие у них в типизации. Если в php одна динамическая и нестрогая и интерпретатор, то в java — статическая и строгая и все сначала компилируется. Хотя потом да, выполняется и там и там в виртуальной машине.
                        • +9

                          Про тесты ты по-прежнему не прав :) Тесты пишут не для того, чтобы проверить, хорошо ли работает код. Тесты пишут для того, чтобы если через два года десятый по счету менеджер и пятнадцатый программист сломают какую-то фундаментальную штуку в бизнес-логике — это было бы видно СРАЗУ.

                          • +2
                            В дополнение скажу если еще писать нормальные комментарии, то и сам вернувшись через год-другой проекту есть шанс вспомнить что к чему.
                            • 0
                              согласен, комментарии и ясные идеи в коде очень важны
                            • –6
                              и ты продолжаешь верить, что тесты выявят СРАЗУ любую ошибку через 5 лет и для этого стоит их поддерживать все это время? :-)
                              • +1
                                Фундаментальная ошибка. Может быть, вместо того, чтобы убеждать их в том, что юниттесты не для идиотов, убедить, что и ремни безопасности в машине — тоже для дураков?
                                • 0
                                  А я еще тесты пишу, потому что лень прокликивать странички вручную.
                                  А потом еще и тест остается на случай регрессии. Двойная выгода…
                                  • 0

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

                                  • –3

                                    Учите jQuery, а не javascript.


                                    Но все же, кажется, это все добрая шутка, т.к. про тесты как-то толсто вышло.

                                    • –2
                                      ну разумеется, это стебная статья посмеяться и подумать :-)
                                    • +1
                                      Сначала отнёсся скептически, а потом узрел здоровый скепсис и легкое накидывание на вентилятор.

                                      В принципе, можно сказать, что для веба сейчас важнее не выбор языка программирования, а умение правильно писать. Или, возможно, правильно заниматься раскруткой/поддержкой.
                                      • –2

                                        Как хорошо, что я не веб-разработчик.

                                        • –1
                                          Я не знаю алгоритмы, хотя несколько раз предпринимал попытки их изучить и вообще не пишу тестов. Паттерны проектирования в лучшем случае могу объяснить на словах, и то с предварительной подготовкой.

                                          Но это не мешает мне зарабатывать на жизнь исключительно веб-разработкой. При всей косячности Битрикса, в статье прозвучали здравые мысли. В первую очередь я стремлюсь писать простой и поддерживаемый код — KISS, DRY, YAGNI для меня знакомые аббревиатуры. Также для меня важно подробно изучить инструменты и технологии, с которыми приходится работать, возможности стандартных библиотек.

                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                          Самое читаемое