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


Идея фикс — знать все


Я изучил C# и .NET с разными областями применения (asp.net, wpf, xamarin), js/ts (react/redux, node) и убедил себя, что теперь-то могу действительно всё. Я абстрагировался, мыслю в нескольких парадигмах программирования одновременно и обладаю практическими знаниями во всех аспектах профессиональной разработки ПО. Можно смело начинать высмеивать этих сорокалетних сеньоров одной технологии, которые потратили полжизни на то, что я могу постигнуть за неделю. Можно утверждать что погружение в предметную область — для болванов, которые хотят всю жизнь проработать на одном месте, тогда как я — абстрагирован от неё.


Всё вокруг одинаковое, и я увидел закономерность. Теперь, когда мне нужно поработать на каком-нибудь нелепом питоне, я говорю: «дайте немного времени на беглое чтение спеки, и я готов работать с этим говном на уровне senior. Ну что, в конце концов, там может быть такого сложного, чего я еще не видел?» Так я создал себе культ пренебрежения деталями. Пусть в деталях копошатся джуны, которые не могут в абстракции.


Пробелы в знаниях неочевидны и незаметны


Однажды я зафигачил дизайн на абстрактных классах в typeScript, и меня высмеяли. Потому что в тайпскрипте так не делают. Я, конечно же, сделал вид, что просто мои коллеги — бездарные идиоты. Обычно это помогало, но в этот раз остался осадок.


Репутация хорошего разраба скрывает твои пробелы как от коллег, так и от тебя самого. Ты не знаешь огромное количество критичных специфичных штук, но не видишь этого, как раз потому, что не знаешь.


Затем началась черная полоса. Фигак! Я не знаю, что там за типы индексов в SQL. Бам! Забыл, когда вызывается статический конструктор в шарпах. Упс! Я не могу правильно реализовать IDisposable без гугла. Пытаюсь мутировать стейт в реакт компоненте.


Я заподозрил, что моя абстрагированность не работает. Что технологии все-таки разные, а детали — важны. В каждой технологической экосистеме свои уникальные лучшие практики. Опыт в .NET не помешает при работе с jvm, но и не заменит его. Мой самоприсвоенный скилл «Я научился быстро учиться» оказался неправдой. Я учился не быстрее, чем все остальные. И мне потребовалось слишком много времени, чтобы это понять.


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


И тут начинается самобичевание


Проблема в том, что бизнесу нужны фулстеки. Только не такие, как я, а синьоры во всём, ребята, у которых за плечами по пять лет опыта в каждой из фулстечных технологий.


Но таких не бывает, и бизнес идёт на самообман. Они берут слабого мидла в трех крупных технологиях, и называют его senior full-stack developer. Этот титул превращает человека в самозванца и становится неиссякаемым источником комплекса неполноценности. Любой обычный разраб, который шарит в одной технологии — шарит в ней лучше. И сейчас я хорошо понимаю, что не готов на равных правах работать в команде с людьми, которые шарят намного лучше меня. Иначе уже через неделю умру от самобичевания.


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


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


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


Учить вширь vs учить вглубь


Здесь старый конфликт: ты можешь изучать в глубь, а можешь вширь, но не то и другое одновременно. Я заметил такой эффект — когда начинаешь изучать новую технологию, старая становиться неинтересной. Но в IT если ты не обновляешь свои знания о технологии в течение года, ты уже не актуален.


Если хочешь оставаться фулстеком, тебе придётся заставлять себя читать релиз-ноуты какого-нибудь TypeScript, заодно ещё и пробуя их в деле — даже если не хочется. Причём ты всё ещё будешь недосягаемо хуже разраба, который каждый день пишет исключительно на тайпскрипте.


Главная проблема этого конфликта в том, что мы не знаем, как лучше. Мы-то, и особенно бизнес, хотим и так, и так. Что бы все шарили во всём, и шарили достаточно глубоко.


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


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


Ты станешь вечным мидлом.


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

Комментарии (486)


  1. serginho
    12.11.2018 16:56
    +1

    Можно писать исключительно на typescript и быть fullstack


    1. pawlo16
      13.11.2018 07:24

      Это не правда. Во-1, Nodejs не всея руси, отнюдь не везде эта технология считается приемлемой. Во-2, сеньор бэкенд программист обязан знать как минимум sqlb ещё одну технологию, например, java или python.


      1. serginho
        13.11.2018 08:06

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


        1. pawlo16
          13.11.2018 10:28

          1. Python, Go, раньше java была.

          2. В статье же об этом речь. И, пожалуй, требование знать sql ко всем бэкендщикам относится.


          1. serginho
            13.11.2018 11:30

            1. Python, Go, Java отличные технологии, но тоже не всея руси.
            2. Я не спорю, что чем больше технологий знаешь, тем лучше. Но использование SQL тоже не обязательно. Есть ORM, есть NoSQL базы данных.

            Мой первый комментарий не ставит под вопрос другие технологии, но NodeJS + TypeScript (JavaScript) впервые дали возможность быть FullStack и писать только на одном ЯП. Тем самым упрощая процесс профессионального роста.


            1. Simplevolk
              13.11.2018 13:32

              C# -asp.core +Razor тоже даст вам такую возможность.


              1. serginho
                13.11.2018 13:40

                Поправьте меня если я неправ, но Razor — это по сути шаблонизатор. На нем клиентскую логику вы не напишете.


                1. Fesor
                  13.11.2018 13:52

                  Чего только в наше время не выдумают: Blazor — Full-stack web development with C# and WebAssembly


                  1. Flaksirus
                    13.11.2018 15:32

                    Blazor — это конечно клево, но я бы лучше сразу писал на фронтовом языке вместо того чтобы постоянно огребать) Ну и blazor опять никак не решит проблему того, что сеньором во фронте не станешь, тонкости C# окажутся совсем не применимыми к фронту.


                    1. Fesor
                      13.11.2018 15:42

                      сеньором во фронте не станешь

                      А каким критериям должен удовлетворять уровень человека что бы можно было именовать его сеньором?


                      1. faiwer
                        13.11.2018 15:45

                        Наверно, надо уметь писать асемблерные вставки :)


                      1. Flaksirus
                        13.11.2018 16:54

                        Про это пишет автор статьи и я с ним в какой-то степени согласен.


                      1. mclander
                        13.11.2018 17:13
                        +2

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

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

                        Мидл же может наворотить пачку костылей. Просто потому, что хуже знает систему и предметку, плюс часто хочет показать что «я вот так умею».

                        Ну и сеньор менее заметен в офисе, но более заметен в баг-трекере)


                        1. MonoStas
                          14.11.2018 20:24
                          +1

                          Наверное наоборот:
                          «Ну и сеньор более заметен в офисе, но менее в баг-трекере»


                          1. mclander
                            14.11.2018 23:36

                            Сеньоры разные бывают. Одни тащат задачи, другие любят потрындеть и покрасоваться. Я наверно 50 на 50. Хотя почти искренне верю, что первый тип)


                1. mayorovp
                  15.11.2018 11:43
                  -1

                  Если вся клиентская часть — это набор формочек, то помогут библиотеки jquery-ajax-unobtrusive и jquery-validation-unobtrusive, они настраиваются исключительно атрибутами.

                  Хотя фулстеком того кто пользуется только ими назвать сложно.


              1. alexr64
                14.11.2018 08:00

                Если взять bridge.net — тогда да, фуллстек на одном языке.


      1. Druu
        13.11.2018 10:29

        Во-2, сеньор бэкенд программист обязан знать как минимум sqlb ещё одну технологию, например, java или python.

        Зачем сеньору-то знать другую технологию? Он же не джун.


    1. kuber
      13.11.2018 07:41

      Очень интересное утверждение. А можете привести пример триггера в какой-нибудь СУБД (SQL Server, MySQL, PosgreSQL, Oracle Database) на TypeScript?


      1. serginho
        13.11.2018 08:01

        Не все приложения требуют использования триггеров. Я и не писал, что typescript на все случаи жизни.


        1. kuber
          13.11.2018 09:22

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


          1. serginho
            13.11.2018 09:28

            Любой триггер можно реализовать программно вне СУБД. Естественно будут потери.


            Так можно до бесконечности продолжать. Например у вас в проекте должен быть ИИ, а нейросеть вы строить не умеете. Вы уже не fullstack.


            1. kuber
              13.11.2018 10:34

              >> Любой триггер можно реализовать программно вне СУБД. Естественно будут потери.
              Насколько я понял статья именно об этом. Что люди которые считают себя всемогущими FullStack разработчиками в большинстве случаев просто не знают, что данную задачу (например, триггер) грамотнее реализовать при помощи СУБД, а не «программно» наступая на все грабли. Или я неправильно понял суть статьи?


              1. VolCh
                13.11.2018 10:40

                Что значит «грамотней»? По каким критериям?


                1. kuber
                  13.11.2018 10:42

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


                  1. VolCh
                    13.11.2018 10:44

                    Подходит лучше технически или как?


                    1. kuber
                      13.11.2018 10:59

                      Любите вы поспорить. :)
                      При решении любой задачи можно использовать различные подходы. Можно использовать решение проверенное временем от профессионалов (например, реализация триггеров Oracle Database), а можно взять и реализовать их самостоятельно. Можно и Web-серверы и СУБД реализовывать самостоятельно.


                      1. VolCh
                        13.11.2018 11:13
                        +1

                        Люблю, да. Особенно вижу категоричные суждения или оперирование общими оценочными категориями типа "грамотней" без указания критериев :)


                      1. noktigula
                        13.11.2018 11:34

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


                        1. mclander
                          13.11.2018 12:18

                          Скорее не так. Использование триггеров, обеспечивает нам некоторую консистентность данных средствами DB (некоторую, потому что в триггере можно много чего сломать). И это круто — встроенное, надежное и известное решение.

                          Но всё решают зависимости. В триггере мы можем обработать данные из той же БД, довольно шустро и без особых рисков.

                          Но если, при изменении записи, нам надо взять данные не из DB, и как-то их по хитрому обработать… Тут возможно имеет смысл спроектировать слой над базой данных, а консистентность сохранить за счёт транзакционности и прямых рук. Это может оказаться, быстрее, надёжнее и даже проще реализовать.

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


                          1. VolCh
                            13.11.2018 16:52
                            +1

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


                          1. Druu
                            14.11.2018 20:01
                            +2

                            В триггере мы можем обработать данные из той же БД, довольно шустро и без особых рисков.

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


                            1. mclander
                              14.11.2018 23:26

                              Ну тут есть вариант: бизнес логика собрана в триггерах и хранимках. И на это может быть много причин. До сих пор.


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


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


                              1. Druu
                                14.11.2018 23:33

                                Но это не значит, что от триггеров надо отказываться принципиально.

                                Об этом вроде никто и не говорил.


                                1. mclander
                                  14.11.2018 23:38

                                  Ну значит мы друг-друга не поняли… в начале


                            1. mclander
                              14.11.2018 23:33

                              PS. Sql в богатых расширениях(транзакт sql, pl/sql) это отличный язык для промышленного программирования. Просто нужно понимать какие, задачи решать на нём. Вы же не будете для построения статистики тащить 50 таблиц по миллиону записей на клиент) И пре и, пост обработку данных для некоторых операций проще делать хранимкой


                1. roscomtheend
                  13.11.2018 15:08
                  -1

                  По критерию стабильности. Если есть два продукта (заливка в базу и редактирование с сайта) и недотриггер реализован програмно, то есть вероятность что только в одном месте (или неодинаково) и могут быть разные последствия. Просто один из вариантов.
                  Можно ведь и не в СУБД хранить, а в файлах и всю логику держать на клиенте (вообще всю базу сразу отправлять на клиента, включая данные всех пользователей, а уж клиент будет делать выборку). Вполне можно реализовать, но мало кто назовёт это правильным.


                  1. mayorovp
                    15.11.2018 11:51

                    Для этих целей существуют подпрограммы :-)


                    1. roscomtheend
                      15.11.2018 17:48

                      Для каких? Для замены триггеров? Не поможет при запросе в консоли или в программе, где этой подпрограммы нет (потому как не написали — сначала функция не планировалась, а потом реализовали).


              1. Neikist
                13.11.2018 10:40

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


                1. kuber
                  13.11.2018 10:44

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


                  1. Neikist
                    13.11.2018 10:52

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


              1. serginho
                13.11.2018 10:53

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


                А статья, если честно, ни о чем. Типа, если вы будете изучать технологии А, Б, В, то никогда не изучите технологию А также глубоко, как человек, который изучает только технологию А. Это очевидно.


                1. kuber
                  13.11.2018 11:01

                  >> Типа, если вы будете изучать технологии А, Б, В, то никогда не изучите технологию А также глубоко, как человек, который изучает только технологию А.
                  Вот с этим абсолютно согласен. Уверен, что множество разработчиков в принципе никогда не станут Senior разработчиками даже если будут изучать хоть всю жизнь одну технологию.


                1. FieryCat
                  14.11.2018 13:17
                  +1

                  FullStack хорош не только для запуска, но и последующего контроля. Эволюция FullStack — это архитектор проекта.


          1. VolCh
            13.11.2018 10:22

            Что значит «нужны»? Вот в бизнес-задаче декларируется «нужны триггеры»?


      1. f0rk
        13.11.2018 08:16

        > А можете привести пример
        pgxn.org/dist/plv8/doc/plv8.html
        не совсем ts, но можно его при желании сбоку прикрутить :)


      1. VolCh
        13.11.2018 10:21

        deleted


      1. Druu
        13.11.2018 10:30
        +1

        А можете привести пример триггера в какой-нибудь СУБД (SQL Server, MySQL, PosgreSQL, Oracle Database) на TypeScript?

        Есть же достаточно распространенное мнение, что использование триггеров (и вообще дергание скл руками) — code smell. В такой парадигме неумение использовать тригеры — конкурентное преимущество.


        1. kuber
          13.11.2018 10:37

          Триггеры в данной ситуации лишь пример, а не предложение повсеместно их использовать т.е. вместо них можно придумать любой другой подходящий.


          1. Druu
            13.11.2018 10:52

            (и вообще дергание скл руками)


        1. anprs
          13.11.2018 11:20

          Уметь в SQL проще и продуктивнее чем уметь в ORM, разве нет?


          1. Druu
            13.11.2018 11:26

            Уметь в SQL проще и продуктивнее чем уметь в ORM, разве нет?

            Зависит от ситуации.
            SQL, конечно, хорош в плане перформанса, но:


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

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


            1. BigDflz
              13.11.2018 11:57

              код на SQL, мягко говоря, не слишком удобен в плане поддержки.
              просто надо использовать нужные инструменты для его поддержки. Если использовать хранимки, то в коде не будет запросов, все запросы в хранимках на сервере, к примеру для mysql есть интсрумент как DbForge, который позволяет писать, отлаживать, сопровождать хранимки. делать рефакторинг, и много ещё чего.
              не всегда в принципе скорость запросов — бутылочное горлышко.
              трудно не согласиться, но если есть возможность — надо ей пользоваться — к примеру поля даты можно уже в запросе привести у нужному виду, числа сформировать с нужными разделителями разрядов.


              1. cyberly
                13.11.2018 12:57

                Если использовать хранимки...

                Если она будет ровно одна, то, возможно, не стоит.

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

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

                ИМХО, спор про то, на чем правильно делать то или это в абстрактном проекте — беспредметный.


              1. Quilin
                13.11.2018 15:17
                +2

                А как например писать юнит-тесты на хранимки?


                1. pawlo16
                  13.11.2018 15:49
                  +2

                  Трудно, но можно. В postgresql, mysql и оракле такая возможность есть. Суть такова:

                  • Как язык SQL плох, но без него никак. Он динамический, имеет громоздкий синтаксис и на 90% состоит из весьма нудного бойлерплейта. Читать — легче. Понимать — ещё легче.
                  • Переписывать всю БЛ на хранимки, как предлагают некоторые горячие головы, равносильно отстреливанию себе в упор всех конечностей.
                  • Хорошие ОРМ значительно удешевляют разработку. Но чтобы уметь ими пользоваться, нужно по мимо ОРМ знать SQL.
                  • Даже с самой хорошей ОРМ писать SQL всё равно придётся.
                  • Использовать nosql только потому, что лень учить SQL или разбираться с ОРМ — такая же дичь, как и писать всё на хранимках, чтобы не учить условную java. Нужно учить CAP теорему и разбираться, когда использовать nosql 1) допустимо 2) приемемо 3) оправдано. Вопросы не тривиальные практически всегда.


                  1. Quilin
                    13.11.2018 17:38
                    +1

                    А есть ли возможность гонять эти тесты без непосредственно базы данных? Потому что для бэкенда как бы это практически всегда запросто. Более того, в моем родном дотнете скоро обещают возможность запуска owin-based-приложух прямо в памяти. Типа можно писать интеграционные тесты на ваш API вообще не запуская сервер.

                    Я сам вообще стараюсь хранимки использовать по минимуму. Понятное дело, что иногда они дают важный буст производительности, особенно учитывая, что ORM не серебрянная пуля и часто генерят диковатые запросы. Спросил не с целью «о, если мне еще юнит-тестов там подвезут, все буду на скулях писать», а с вопросом в духе «а чо, в мире есть проекты, где хорошо уживаются CI/CD, TDD и хранимки?» Потому что у меня на проекте они уживаются, но с очевидностью первое берет верх.


              1. nsinreal
                13.11.2018 16:54
                +2

                просто надо использовать нужные инструменты для его поддержки. Если использовать хранимки, то в коде не будет запросов, все запросы в хранимках на сервере, к примеру для mysql есть интсрумент как DbForge, который позволяет писать, отлаживать, сопровождать хранимки. делать рефакторинг, и много ещё чего.

                Я в эти сказки не верю после того, как столкнулся с развитием продукта построенного в основном на SQL. Боль заключается в том, что если на типичном бекендском языке можно разбить 2000 строк на 40 групп по 50 строк с дополнительным оверхедом в 200 строк, то на sql оверхед составляет ближе к 500-1000 строк. И это делает нецелесообразным попытки написать хороший код. Соблюдать DRY почти невозможно. Увы, SQL не имеет средств для нормального реюза кода. Т.е. развивать код на SQL можно только до определенных пределов.

                В другой продукте использовались хранимки на SQL, но гораздо меньшие и более конкретные. И это было счастьем. За исключением того, что все хранимки стали выглядеть автоматизируемыми. Туда явно напрашивалась абстракция. Но существующие инструменты (ORM) слишком сильно были заточены под паттерн «хуяк-хуяк» и были малопроизводительными. Хранимки оказались наименьшим злом на тот момент.


              1. mayorovp
                15.11.2018 11:53
                +1

                Угу. Все запросы — в хранимках на сервере, а история и blame — в гите. Вот и выросла цена сопровождения кода на пустом месте.


          1. VolCh
            13.11.2018 11:33
            +1

            В целом зависит от задачи. И ОРМ придумали как раз для упрощения и увеличения продуктивности.


            1. zmeykas
              13.11.2018 11:46

              и еще видимо для абстрагирования от движка СУБД


              1. VolCh
                13.11.2018 16:53
                +1

                Не у всех ОРМ есть DBAL на самом деле.


      1. nsinreal
        13.11.2018 16:59

        Например, некоторые современные NoSQL-решения имеют возможность исполнять код на JS. Транспиляция TS->JS банальна.
        Конкретно по триггерам: blog.kloud.com.au/2018/01/30/cosmos-db-server-side-programming-with-typescript-part-4-triggers


    1. CheatEx
      13.11.2018 11:49

      Node.JS научился в потоки?


      1. serginho
        13.11.2018 11:59

        Вы об этом?


        1. CheatEx
          13.11.2018 12:51

          Не совсем, но для некоторых целей уже пойдёт.


  1. Aquahawk
    12.11.2018 17:02
    +1

    Имхо хорошая концепция быть крутым в одном и примерно понимать и немного практиковать окружение.


    1. neit_kas
      13.11.2018 11:16
      +1

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


      1. float64
        13.11.2018 16:04
        +3

        У музыкантов на эту тему есть поговорка «сегодня ты играешь фьюжен а завтра никому не нужен».


  1. irbis_al
    12.11.2018 17:04
    +13

    могу попробовать уйти в управление

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


    1. areht
      12.11.2018 19:00
      +2

      Только управление — это прораб/PM, а не архитектор. Совсем разные компетенции.


      1. x67
        13.11.2018 01:27
        +1

        Только в крупных проектах есть и прораб и архитектор, в небольших все таки стараются совмещать (оттуда ноги и растут). И это не только в IT


        1. areht
          13.11.2018 01:54

          То есть мидл фулстек дев станет ещё и мидл архитектором и мидл PM?

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

          И ведь его даже на смех то поднять нельзя.


  1. NLO
    00.00.0000 00:00

    НЛО прилетело и опубликовало эту надпись здесь


    1. Milein
      12.11.2018 17:34
      +13

      А надо было учиться программировать.


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

      Вот что вы за занудством занимаетесь? Это как на галерные лычки наяривать: «я не программист, я сениор эксперт мастер рокстар девелопер».


      1. argamidon
        12.11.2018 22:02
        +4

        Понавыдумывали понятий — разработчик, девелопер, программист, кодер, инженер… и никто разницу понять не может


        1. Stas911
          12.11.2018 22:09
          +5

          Мало того — они еще и внутри этих классов норовят поделить на сеньоров-миддлов-джуниоров. Никак людям не живется без цветовой дифференциации штанов


          1. samodum
            13.11.2018 03:48
            +1

            Там есть ещё экземпляры, со своими «гуру», «джедаями» и прочими «рокстарами» от которых хочется блевать


          1. HanryCase
            13.11.2018 13:03
            +2

            Понравилось, вчера кто то из хабарожителей написал комент:

            Мне нравится разделение по уровню ответственности:

            Джуниор — тот, кого нельзя оставить без присмотра. Задачу надо разжевать, код придирчиво отревьюить, время от времени узнавать, как дела и поправлять на ходу. Выхлопа от работы джуна ожидать не стоит (т.е. времени он не сэкономит, скорее потратит), но на него можно сгрузить рутину и через некоторое время он подтянется и выхлоп будет.
            Миддл — работает работу сам. В задачах тоже разбирается сам, где не может, сам задаёт релевантные вопросы. Кроме ревью кода пригляда за ним не требуется, но и помощи в определении курса тоже не ожидается.
            Сеньёр — автономная боевая единица. Если в него кинуть размытой формулировкой проекта, то он её сам уточнит, ещё и укажет на слабые места и покритикует, подберёт рабочий стек технологий (без оглядки на хайп) и сам в одиночку всё запрограммирует (и за джунами присмотрит). Ещё и заказчика пнёт (возможно, через прокладку-менеджера, если таковая зачем-то есть), что тот ему ещё вчера обещал уточнения к ТЗ прислать.


        1. onegreyonewhite
          13.11.2018 01:42
          +1

          Беда в том, что есть очень много людей в ИТ сфере, которые даже не поняли вашу игру слов.


        1. beatstream
          13.11.2018 16:05
          +2

          Ханин мягко улыбнулся. — Творцы нам тут на ххх не нужны, — сказал он. — Криэйтором, Вава, криэйтором.


    1. Whuthering
      12.11.2018 18:37
      +2

      Навешивание ярлыков и ваше деление людей на «кодеров» и «программистов» устарело уже лет на 20. Не смешно уже.


  1. jehy
    12.11.2018 17:24
    +3

    Да да, в какой-то момент каждый задумывается об этом.

    Насчёт «бизнесу нужны фуллстеки» — здесь есть нюанс. Бизнес разный бывает. И именно фуллстеки нужны обычно там, где человек по факту занимает несколько вакансий. То есть, в небольшом бизнесе или в стартапах. Не говорю, что там работать это плохо — это тоже может быть интересно, в особенности на начальных этапах, когда ты только познаёшь, чем хочешь заниматься.

    Но если бизнес большой, а продукт сложный — здесь нужны достаточно узкие специалисты. И, к сожалению, просто нельзя одновременно быть сениор разработчиком фронта, бэка, мобилки, девопсом и архитектором СУБД (у меня был такой опыт, но я не могу покривить душой и сказать, что я был хотя бы миддлом сразу во всех областях сразу). Просто потому что технологии сейчас развиваются с большей скоростью, чем человек может их освоить. Опять же, «освоить» это не значит «прочитать анонсы». Это значит — попробовать вживую. Да, можно хорошо разбираться в 2-3 технологиях, но дальше начинается деградация знаний, и ты действительно становишься универсальным миддлом. Я от этого в какой-то момент устал и ушёл. И очень доволен таким решением.
    Хотя я не говорю, что соседние стеки знать не нужно. Я считаю, что сениор должен обладать как минимум полноценным пониманием взаимодействия компонентов своего продукта и умением его отладки — хотя бы чтобы знать, где возникают проблемы, а не вопить, что они «на другом конце». Но понимать тонкости — уже излишне и слишком трудоёмко. Нужно честно признать, что ты развиваешься в конкретном направлении, а в остальных ты в лучшем случае миддл. Затем принять это и не комплексовать. Всегда найдутся люди, которые в чём-то разбираются лучше — поэтому мы и работаем не в одиночку, а командой.


    1. Jef239
      12.11.2018 22:43
      +2

      У Райкина была хорошая юмореска про узких специалистов: У нас узкая специализация. Один пришивает карман, один - проймочку, я лично пришиваю пуговицы. К пуговицам претензии есть? И они — не портные, они — подмастерья.

      Узкие специалисты нужны редко и ненадолго. Если нужен человек по конкретному интерфейсу SoС — его можно позвать на конкретную задачу. А нужны именно full-stack — спроектировать схему, развести её, спаять, отладить электрически, запустить SoC, потом RTOS, потом приложение.

      Это должна быть очень крупная фирма, чтобы позволить себе держать специалиста по RS-485 или RS-232. И очень много разных платформ, чтобы у него был фронт работы.

      Ну и потом, узкий специалист не может нормально отлаживаться. Ио работу кода мы отлаживаем осциллографом, а проблемы в железе ищем кодом.

      Так что сеньор — это full stack, а «мастера по пришивке пуговиц» — джуны. Для того и было придумано разделение труда и узкая специализация — чтобы заменить десяток сеньоров сотней джунов.


      1. buldo
        12.11.2018 23:06
        +3

        По мне вы описали слегка расширенного, но довольно специализированного разработчика встроенных систем. Когда для созданной железяки понадобится мобильное приложение или сервер сбора данных — это окажется за пределами компетенций описанного специалиста.
        А ещё у меня сложилось предвзятое мнение, что чем лучше человек понимает схемотехнику и внутренности МК, тем хуже у него код для этих самых МК


        1. Jef239
          12.11.2018 23:12

          Угу, любой нормальный embedчик — это fullstack. А для редких задач мы привлекаем узких специалистов. Например, привлекали спецов по CAN и по MIL-STD-1553B. Мобильное приложение, сайтик, сервер — это все из другого мира. Того, где linux — достоинство, а не недостаток.

          Хуже — это по каким параметрам? По количеству ошибок, по читаемости, по стабильности кода за 10 лет? Когда у вас для отладки только светодиод и осциллограф — есть смысл писать надежно и просто. То есть весьма-весьма дубово. Но это достоинство, а не недостаток.


          1. buldo
            12.11.2018 23:35
            +2

            Кажется вы меня не до конца поняли. Описанный вами embedчик-fullstack — для меня выглядит, как узкий специалист. Хотя, возможно я лукавлю и задним умом считаю логичным разделять разработку железа и его программирование примерно также, как front-end и back-end.

            Хуже — по поддерживаемости. В основном я видел спагетти код. При этом после двухмесячного перерыва в работе автор кода не мог понять что, как работает. SOLID, DDD, что это такое?
            Если код надёжный и просто — то это замечательно, вот только для меня простота — это не отсутствие работы с указателями или каких-то хитрых вещей, а возможность прочитать совершенно незнакомый код и понять, как он работает. И в этом как раз помогает и SOLID, и другие идеи.


            1. Jef239
              13.11.2018 00:13

              Узкие специалисты это: «элементщик» (тот, кто компоненты выбирает), закупщик, проектировщик схем, разводчик, оформитель схемы по ГОСТ (приглашали разок), технолог производства печатных плат (консультировались), монтажник, технолог пайки… Это только по стороне железа.

              А на стороне софта… у RS-485 есть терминаторные резисторы. Ну как настраивает резисторы обычный программист? Посмотрел осциллографом, поставил — и тест на сутки. Если больше одного сбойного байта за сутки — менять номинал. А узкий специалист сразу ставит нужный резистор.

              SOLID — это все-таки С++. Простой и читаемый код — это обычный Си, близкий к ассемблеру. См. драйвера linux — они довольно хорошо написаны.

              P.S. У нас в конторе есть всего один узкий специалист — это технический писатель по ГОСТ.


              1. zagayevskiy
                13.11.2018 12:25

                Зачем вы в каждое обсуждение пихаете свою предметную область с отсылкой к "а у нас вот так, и поэтому весь мир должен думать так же"?


                BTW, SOLID — это не про С++ и принципы можно и нужно использовать и в не ОО-языках тоже.


                1. Jef239
                  14.11.2018 11:02

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

                  А про SOLID в не ОО-языках — расскажите или ссылку дайте.


                  1. zagayevskiy
                    14.11.2018 11:16

                    Все принципы, кроме подстановки Лисков можно применять к процедурным и функциональным языкам, просто надо думать в чуть более широком смысле. Например, SRP — функция должна иметь конкретную зону ответственности. Interface segregation — подразумеваем интерфейс в широком смысле, не ключевое слово, а API. И так далее.


                    1. Jef239
                      14.11.2018 11:30

                      Ну как раз что-то вроде принципа подстановки Лисков мы применяем в Cи-коде. Делается указатель на процедуру — и вперед. Примерно как onexit в Си.

                      Просто нафига очевидные вещи называть громкими словами?


                      1. zagayevskiy
                        14.11.2018 12:46

                        Принцип подставки Лисков говорит об отношениях между типами и подтипами, как это вы его используете в Си?
                        onexit — это обычные коллбеки.
                        Очевидные вещи:
                        1) очевидны не всем;
                        2) очевидны по-разному;
                        Что и демонстрирует ваше непонимание очевидных другим вещей.


                        1. Jef239
                          14.11.2018 13:18
                          +1

                          Читаем определение:

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

                          Вот на callback и на weak-функциях оно и делается. Базовый тип — вывести информацию Специализации — вывести на RS32, на RS32 через ПЛИС, на CAN, на MIL-STD-1443b…

                          onexit — как раз нормальный пример. Базовый тип — выполнить финализацию. А специфические подтипы делают конкретные вещи.

                          В принципе группа weak-функций или callback дает вполне функциональную замену ООП. Даже с наследованием (можно выставить свою функцию на callback и в ней вызвать то, что было на callback раньше.


                          1. zagayevskiy
                            14.11.2018 13:38
                            +2

                            Короче вы спорите со мной непонятно о чём. Если вы сделали в Си псевдо-наследование — честь вам и хвала. И это даже больше подтверждает моё утверждение. Если вам просто хочется поговорить, так и скажите, а не прыгайте с темы на тему.
                            JFYI, постоянные упоминания деталей ваших реализаций не делает вас круче, равно как и не даёт дополнительной информации собеседнику.


              1. Scrayer
                13.11.2018 13:03

                Мое видение таково

                Инженер: Если работает так как надо, то дальнейшие улучшения не требуются.
                Программист: Если результат не оптимален, то не будет работать как надо.

                У первого цель — рабочая программа.
                Цель второго — не ломающаяся программа.


          1. moncruist
            13.11.2018 13:03

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

            Другое дело когда проект большой, сложный и массовый. Вот у меня сейчас проект — это кодовая база на несколько миллионов строк для МК и сотни людей. Попробуйте это поотлаживать светодиодом и осциллографом. Поэтому тут и SOLID, и юнит тесты, и blackbox тесты, Software-In-the-Loop, Hardware-In-the-Loop, Continuous Integration и т.д. Скажи такие слова человеку из мира железа, он и не поймет что это.

            Все-таки разделение труда — это главное достижение человечества.


            1. Jef239
              14.11.2018 10:48
              -3

              Миллион строк? Гм, простите, какой объем ПЗУ это занимает? И почему бы при таком объеме кода не использовать linux? А linux — это по моим понятиям уже не совсем embed. Ну или совсем не embed.

              Разделение труда (в пределе — конвейер) придумано, чтобы привлечь к работе низкоквалифицированный персонал. Брукс хорошо доказал, что увеличение численности не ускоряет разработку (если 9 беременных женщин собрать вместе, ребенок через месяц не родится), наоборот, в его конкретном случае, увеличение численности в 10 раз разработку замедлило.

              Поэтому вопрос в экономике. Нужна эффективность производства — делаете конвейер с сотней программистов. Нужно качество — обходитесь всего несколькими сеньорами.

              несколько миллионов строк для МК и сотни людей. Попробуйте это поотлаживать светодиодом и осциллографом.
              Поржал. Зачем это отлаживать на МК? Разработка и отладка 99.9% идет на windows. Да, приходится делать имитаторы и писать переносимый код. Но на windows отлаживается все, кроме очень специфичного для МК кода. Потом перенос на linux, потом — на МК.

              У меня был проект с доступным временем на отладку на реальном стане — 2 часа в месяц (130 тысяч строк кода). Ничего, справился без отладки.

              Software-In-the-Loop, Hardware-In-the-Loop, Continuous Integration и т.д. Скажи такие слова человеку из мира железа, он и не поймет что это.
              Ну и я таких терминов как SIL и HIL не знал. Но мы их применяли почти 20 лет назад. Как-то не сложно было независимо их изобрести.


        1. Int_13h
          13.11.2018 07:55

          Был у нас на прошлой работе яжпрограммист, начальник отдела программных средств АСУ, а я, соответственно, был сеньором ведущим инженегром в отделе технических средств АСУ. Граница раздела компетенций отделов проходила по клеммникам подключения проводов к контроллерам. Ну вот исторически так сложилось и усиленно поддерживалось руководством. Техник — не лезь в дела программеров, без тебя разберутся, а твоя задача ТЗ написать, железо подобрать, чертежи начертить, процесс сборки проконтроллировать, протестировать, смонтировать, пусконаладить и сдать. А программистам — программистово, код напишут, зальют, посидят за ноутом на пусконаладке, а ты бегай, выполняй их указания, какой датчик попинать, чтобы заработало.
          Так вот этот товарищ усиленно не хотел разбираться в том, чем будет управлять програмирумый им ПЛК и как этот ПЛК, собственно, функционирует. Типа, мое дело писать код, ваше дело предоставить мне алгоритмы и заставить железо работать, либо алгоритмы вытрясайте у технологов.
          И вот настал тот последний проект, который мне в той фирме посчасливилось доводить до конца, от конструкторской документации и почти до пусконаладки. Система ответственная, для нефтехимпрома, контроллеры отказоустойчивые, вероятность отказа 0.(0)1%. Нарисовал схемы, собрали шкафы на сборочном участке, собрали стендики-эмуляторы сигналов, закупили калибратор за бешенные бабки для настройки аналоговых каналов. Начался этап тестирования софта, я подаю сигнал 4...20 мА, имитируя работу датчика, программист смотрит, что пришло, подгоняет единицы измерения — ток в паскали, мм, кубометры и прочее. Подаю я, значится, сигнал, яжпрограммист ждет, что там будет уровень в емкости 1 метр, а уровень то скачет немного, шумит младшими битами 12-битный АЦП в ПЛК. И тут возникает «шум АЦП» со стороны яжпрограммиста: ты что это, подлец и диверсант, делаешь, я ж прошу выставить уровень в емкости 1 м, а ты какого рожна выставляешь то 0.99, то 1.01 м, ты мне вынь да положь 1.000м, как я с буду программу отстраивать на работу с такими данными? Чуть я заикнуля про необходимость фильтрации, аппартаной или программной, как «шум АЦП» начал усиливаться, что это я лезу не в свое дело, мое дело должно быть маленькое, обеспечить нормальное функционирование техники, а не учить программистов работать, что это за препирания с начальством, да и вообще таким специалистам тут не место.


          1. Nalivai
            13.11.2018 16:00
            +2

            Мне кажется что человеку который не знает что АЦП шумит не место в области.


            1. Int_13h
              13.11.2018 19:46

              Это аппаратная проблема, программисты этим не занимаются (с) анекдот.


          1. Whuthering
            13.11.2018 16:08
            +2

            Типа, мое дело писать код, ваше дело предоставить мне алгоритмы и заставить железо работать

            Чуть я заикнуля про необходимость фильтрации, аппартаной или программной

            Тут всплывает весьма важный вопрос: а почему в предоставленном разработчику ТЗ и описании алгоритмов ни слова не было сказано про фильтрацию или сглаживание входных сигналов?
            На тему «это же очевидно» и «это же надо знать» — увы, нет, как минимум потому, что нередко можно встретить модули AIn с включенным по-умолчанию фильтром, и, следовательно, если его нет по ТТХ изделия, стоит явно сформулировать требование о наличии фильтрации, а не махать руками во время пусконаладочных работ, мол, «ты должен был знать».
            Так что, как говорится, «без подробного ТЗ результат ХЗ».


            1. Int_13h
              13.11.2018 19:44
              +2

              Согласен, но как обычно есть несколько тонкостей.
              1. В ТЗ учесть всех нюансов невозможно, много интересных моментов вылазит на следующих этапах, а ТЗ уже утверждено заказчиком и переделке не подлежит.
              2. ТЗ пишется исполнителем (да, те самые отделы технических и программных средств), поэтому относятся к нему, как к формальности — отдельному пункту бюджета поекта. Таким образом, утвержденное заказчиком ТЗ является, прежде всего, документом, который в дальнейшем отсеивает необоснованные притязания заказчика к исполнителю по функциям и задачам системы. И уж во вторую очереди исполнитель обращается к собственноручно составленному ТЗ, чтобы посмортеть, а как же на самом деле надо реализовать ту или иную вещь. Возможно, в других отраслях заказчик приходит к исполнителю с готовым ТЗ, но у нас все наоборот.
              3. Фильтрация сигналов таки была прописана, это стандартный шаблонный пункт (да, мы используем предыдущие наработки в дальнеших проектах, не пишем «код» каждый раз с нуля).
              4. В модулях AI фильтр встроенный есть, на этапе работы с железом (в момент испытаний же!) стало ясно, что его возможности не удоволетворяют требованиям точности. Если железячники о причинах проблемы догадались сразу и тут же предложили метод решения, то яжпрограммист пошел по пути наименьшего сопротивления. Зачем создавать себе работу, если можно свалить проблемы на соседний отдел?
              Да черт с ним, с АЦП, это одна из историй, создавшая проблемы ровно на 2 рабочих дня, с учетом совещания у начальства (любую незначительную проблему выноси на повестку дня на планерке — n-ое правило ватокатства).
              Еще одна история из этого же проекта. Алгоритмы, по которым должна функционировать система, разрабатывались в одном ЭнскГИПроКакойтотампромышленности, разрабатывались в виде, так сказать функциональных диаграмм (дикая смесь FBD и LAD), но в отрыве от соответствующих стандартов. Возможно, авторы листали лет 30 назад справочную литературу по Ремиконтам. Ну не суть, в принципах работы создаваемой системы разобраться можно — что контролировать, что, когда и с какими задержками и блокировками включать. На изучение этой документации техотдел потратил 2 месяца, и потом все на пальцах объяснил программистам, описав алгоритмы в текстовом виде, заодно нашел множество нестыковок, косяков и прочего. Но, в ходе общения с Заказчиком, представителями ЭнскГИПроКакойтотампромышленности пришли к заключению, что «проект уже давно утвержден (лет 6 назад как), переделывать его никто не будет, это деньги и время, делайте как есть, на месте разберемся». ОК, раз есть такой приказ, яжпрограммист использует алгоритмы как руководство к действию, пишет программу.
              Тут поджидает засада. Проектировщики алгоритма знать не знали о стандартах IEC, о том, какие контроллеры будут использваться, какие там есть билиотечные функции. Напоминаю, что в IEC имеются таймеры, типа TON, TOF, TP. Проектировщики алгоритма предполагали одно поведение таймера, стандарт предполагает другое поведение. Яжпрограммист реализует структуру программы в точном соответствии с алгоритмом (проект же утвержден, что я буду отходить от него?), в итоге программа не работает. ОК, копья ломаются, АЦП шумит, проблема решается не без крови (потребовалось добавить к таймеру дополнительно RS-триггер, но в алгоритмах, хоть и предполагается такое поведение, явно это не указано!).
              Поехали дальше, следующая засада. Используются ПЛК двух типов, стандартные, для неответственной системы РСУ, и Safety для системы ПАЗ. Если стандартные контроллеры имеют широкую библиотеку функций, то Safety не дадут вам выстрелить в ногу, даже если очень нужно, поэтому библиотека функций урезана по самое небалуй. Проектировщики алгоритма этих тонкостей учесть не могли, т.к. им все равно, на каком железе это все будет работать. Программист об этом знает, но алгоритмы же утверждены! Итог? Опять неработающая программа.
              И все это в условиях вяло текущего дедлайна, со спецификой особо опасного производства, где любое нарушение технологии — катастрофа.


              1. alsii
                14.11.2018 20:32
                +2

                > 1. В ТЗ учесть всех нюансов невозможно, много интересных моментов вылазит на следующих этапах, а ТЗ уже утверждено заказчиком и переделке не подлежит.

                Вообще-то у же на этапе реализации проекта может выпускаться т.н. «Исполнительная документация», которая отражает согласованные с заказчиком изменения проекта, которые были внесены на стадии его реализации. Ну то есть в проекте: «Язык программирования: BASIC, Система хранения: перфокарты», в исполнительной документации: «Язык программирования: Ocaml, Система хранения: Amazon S3» :)


      1. jehy
        12.11.2018 23:12
        +2

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

        А насчёт необходимости узких специалистов «редко и ненадолго» — это просто неправда с потолка.
        Где-то ненадолго нужен администратор Oracle 11g? Или, может, Java разработчик? Может, SQL аналитиков нанимают на месяц? Или где-то ищут одноразовых специалистов по машинному обучению?


        1. Jef239
          12.11.2018 23:18

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


        1. boblenin
          12.11.2018 23:27
          +4

          Сейчас поискал гуглом определение — вот вылезло:
          «A Full-Stack Web Developer is someone who is able to work on both the front-end and back-end portions of an application»

          Фулстэк — это тот, кто может работать как над бэкэндом так и над фронтэндом. Просто сейчас масса разработчиков, которые могут только angular, или только мобильные формы лепить, или только сервисы пишут последние 20 лет. Проблема с такими разработчиками, что комманду из таких невозможно нормально нагрузить работой. Всегда кто-то простаивает.


          1. Neikist
            12.11.2018 23:31

            Вообще статья несколько шире, она не только о вебе судя по всему.


      1. MacIn
        13.11.2018 02:03
        +1

        отладить электрически, запустить SoC, потом RTOS, потом приложение.

        Вполне допускаю, что у вас не так, но из моего личного опыта разработчики такого широкого спектра «и железо и программы и жнец и на дуде игрец» пишут такой отвратительный код, что жалко глаза. Наблюдается какой-то поразительный шовинизм вида «мы тут Железку создали, что там какой-то код», из чего следует некоторая узость взглядов в сфере разработки ПО и отвратительный нечитаемый и неподдерживаемый код.


        1. Jef239
          13.11.2018 03:33

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


        1. Whuthering
          13.11.2018 12:15

          Вот в точку. Самый адовый, запутанный и кривой говнокод почему-то встречается именно у микроконтроллерщиков и ПЛКшников, причем часто в проектах для очень серьезных применений. И отговорки везде одинаковые: «тут своя специфика», «работает — не трогай», «доделывали на пусконаладке и нет времени переписать нормально» и подобное.


          1. cyberly
            13.11.2018 13:08

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


            1. Whuthering
              13.11.2018 13:14

              Я полагаю, схемы, сделанные программистами, тоже не без недостатков :)
              Безусловно. Поэтому я и топлю за четкое разделение обязанностей. Каждый должен заниматься своим делом. Анализом предметной области, технологии процессов, формулированием ТЗ — технолог/аналитик, проектированием схем, разводкой плат, подбором компонентов — инженер-электроник, разработкой архитектуры ПО, написанием кода и тестов — программист. И налаженное взаимодействие между ними. Это, кстати, к вопросу про «фулл-стеков», да :)
              Скажем, кому-то сделать что-то с помощью побитовых операций — это правильное, изящное, эффективное решение. А в другом языке это будет порицаться как нечитаемое и неподдерживаемое.
              Тоже верно. Поэтому я обо всем и рассуждаю немного свысока, как человек, учившийся на специальности «промышленная электроника», большую часть своей карьеры копавшийся с микроконтроллерами, ПЛК и системами автоматики, а потом увлекшийся веб-разработкой и высоконагруженными сервисами :)


            1. MacIn
              13.11.2018 20:39

              Я полагаю, схемы, сделанные программистами, тоже не без недостатков :)

              Разумеется. Так о том и речь, что универсальная вещь делает всё, но делает всё хуже, чем специализированные по отдельности. Так и со специалистами — к вопросу о fullstack.
              Конкретно с «железячниками» не раз сталкивался с отношением к вопросу — см. выше — «мы сделали железку, это 99% успеха, осталось только программку накидать, это фигня, за вечер управимся». Получается так себе. Лучше, конечно, чем если наоборот — написать программу, а потом «за вечер» накидать плату, но тем не менее. Т.е. здесь раз за разом встречаю отношение к программированию, как к игровой области, где нет никаких профессиональных стандартов, неважен опыт и навык, нет технологий разработки и этим может заниматься каждый с улицы. Да, порог вхождения, пожалуй, ниже, чем в «железо», но проблема остается.


    1. EpeTuK
      13.11.2018 08:22

      Не только бизнес накладывает ограничения, но и рынок труда. Я бы и рад нанять сеньор реакт дева, и одобрение сверху есть, но в моём городе (850к жителей) спецов в поиске просто нету. А переучивать джейэсников из веб-студий времени нет, быстрее самому написать.


      1. f0rk
        13.11.2018 08:48

        Если есть не только одобрение, но еще и деньги, то можно с москвы релокейтнуть


  1. maxzh83
    12.11.2018 17:33

    Можно попробовать компромисс. Смотрим «в ширину», что есть на рынке. Находим «вкусное», интересное, перспективное и изучаем именно это вглубь. После нескольких лет повторяем. Правда, простым это кажется только на словах.


    1. usego
      12.11.2018 19:45
      +2

      А в 40+ проводить итерацию «Находим «вкусное», интересное, перспективное и изучаем именно это вглубь» становится уже ни разу не интересно. Молодёжь всё равно сделает это лучше.


      1. Stas911
        12.11.2018 20:18

        Да вот не всегда, тк покопавшись в очередной «новейшей, перспективнейшей bleeding-edge technology» часто обнаруживаешь там решения, про которые тебе рассказывали седые профессора в универе лет 20 назад, а в литературе так вообще лет 50 описано.

        Например, тут вон недавно механический map-reduce на перфокартах пролетал…


        1. usego
          12.11.2018 20:25

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


          1. VolCh
            12.11.2018 22:22
            +1

            Работу делать, пока они писают )


          1. Simplevolk
            13.11.2018 17:01

            Android-разработчики недавно открыли для себя MVVM, хотя в WPF было это еще очень давно. Технологии развиваются и проходят один и тот же цикл…


      1. Imrahil
        13.11.2018 09:19

        не согласен) Судя по конфам седые дяденьки уделывают школьников которые только за бесплатными обедами туда и ходят на раз-два тольно на одном практическом опыте).
        А уж багаж знаний творит и вовсе чудеса).
        Программиста может погубить только возрастная болезнь мозга, все остальное трудно но преодолимо (даже отстуствие зрения к примеру =) )


  1. ArsenAbakarov
    12.11.2018 17:36
    +2

    да, но будучи фуллстеком вы сможете в каску поднять проект, не программный продукт конечно, но все же…


  1. Master255
    12.11.2018 17:44
    +2

    вместо того что бы рассуждать фулстак или сеньёр, лучше бы накодили, что-то толковое.


    1. evil_random
      13.11.2018 00:03
      +3

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


      1. Nalivai
        13.11.2018 16:07
        +4

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


  1. ibKpoxa
    12.11.2018 17:50
    +2

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


    1. Stas911
      12.11.2018 20:44
      +6

      Правильно — сразу мерить все деньгами и зовите хоть подмастерьем!


      1. feyd12
        13.11.2018 07:53

        Темную сторону я в тебе ощущаю:)


      1. ibKpoxa
        13.11.2018 15:57
        +1

        Хочу стать долларовым миллионером… чтобы говорить, что не в деньгах счастье…


  1. Max2UP
    12.11.2018 17:53

    Стою ровно на такой же развилке. Fullstack это самообман, которые не так очевиден пока работаешь в одиночку или в непрофессиональной команде. Но роста тут никакого. Так что путь в что-нибудь вроде Technical Project Manager.


  1. AGARTY
    12.11.2018 17:56
    +1

    Все верно. Это как RPG, если ты качаешь перса во все одинаково, то ты к концу игры будешь плох во всем. Я года 3 назад тоже схватился за голову, присел и сам себе сказал: «вот чего ты достиг, что ты умеешь?». И пошли ответы. Оказывается достаточно много, ведь 8 лет просто так без опыта не могут быть. А рас получил ответы, то задался вопросом: «что можно изменить или дополнить, что бы больше зарабатывать?». С тех пор по утрам я учусь. Всему. Старые знания я несколько раз переповторял, заново открывал книги, и уже в них находил ошибки. Я сейчас взял курс на руководителя. Это значит я должен знать все, что мне приносит прибыль, на 30% минимум. Что-то больше, что-то меньше. Но управление и маркетинг обязан знать минимум на 4-ку, т.к. там нельзя брать в процентном соотношении. И сейчас целенаправленно иду к этому.


    1. indestructable
      12.11.2018 21:15
      +1

      Все хорошо, только учить разные технологии — это не «как в РПГ». Если, конечно, не ставить целью овладение технологией ради технологии (а не ради решения бизнес-задачи).


  1. Stas911
    12.11.2018 18:02
    +4

    Быть «сорокалетним синьором одной технологии» — это тоже опасно, тк со временем начинает теряться кругозор (а так же отрастать борода и свитер). Опять же диверсификация важна как в финансах, так и в карьере. К тому же технологии имеют тенденцию наскучивать (мне по крайней мере) и редко кто, как мне кажется, хочет копаться 20 лет в одном и том же. Ну да, за 20 лет можно стать мегаджедаем Джавы или Оракла и затыкать всех за пояс на собесах, но в этом ли цель?


  1. BigDflz
    12.11.2018 18:18
    +3

    Я fullstack, я могу построить систему от 0 до акта. Когда я вижу системы написанные «частичниками» — у меня волосы дыбом встают, сколько глупого кода, лишнего… То что можно сделать в субд, делается в коде языка софта бэка. Насколько это затратно и по коду и по времени выполнения… что можно эффективно сделать на языке софта бэка — перекладывается на язык клиента… Как минимум в команде должен быть руководитель fullstack, а лучшие — вся команда из fullstack. В такой команде всегда найдутся те, кому нравится больше фронт, кому бэк, кому субд. Но такая команда сможет грамотно организовать распределение задачи на нужную область выполнения.


    1. jehy
      12.11.2018 19:10
      +3

      У вас тут подмена понятий происходит.

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

      Плохой разработчик сделает и то и то и другое вне зависимости от того, узкий он специалист или fullstack.


      1. BigDflz
        12.11.2018 19:18

        Нормальный бэкендер знает и свой язык и SQL, и не сделает указанной вами ошибки.
        Ключевое слово — Нормальный. Но таких ужасающе мало, и к сожалению, я таких не встречал. Хотя в своей «частной» области сеньёры…


        1. f0rk
          13.11.2018 07:20

          Откуда вы такие беретесь? Умные, красивые, дартаньяны, все прям могут и при этом «нормальных» бэкендеров не встречали? Я конечно могу жестко заблуждаться, но что-то мне подсказывает, что если вы не работали с крутыми, умными коллегами и в том числе специалистами в узких областях — то вы врядли настолько офигенные, как вы о себе думаете.


          1. BigDflz
            13.11.2018 07:37

            К сожалению — не встречал. Наверное такие есть, не отрицаю, но практика вещь серьёзная… На моей практике людей разбирающихся в субд — мало, зато остальные считают себя спецами и городят функции субд на языке софта системы… — да, в своей области они спецы, но они не понимают, что их труд по реализации функций субд полная фигня… Ладно бы они это признавали и просили о содействии, а то ведь считают себя в этом вопросе истиной в первой инстанции. Придумывают тысячу отговорок, чтоб не использовать возможности субд.
            Да и в своей области не всегда красиво выглядят. Есть примеры когда ругают код, а предлагают такое, что добавляет и кучу кода и время выполнения. Как яркий пример использование шаблонизации — да, чисто внешне вроде красиво, как копнёшь… нужно сделать то, сё, пятое, десятое… а в итоге за всем этим скрыто простое построение строки, которое можно сделать просто и наглядно в в несколько строк кода, а не в нескольких файлах. и будет работать а разы быстрее.


            1. f0rk
              13.11.2018 07:51

              Можно уточнить, что подразумевается под «простым построением строки», конкатенация?


              1. BigDflz
                13.11.2018 08:00

                по большому счёту — конкатенация, только в java это, если в лоб, очень затратная операция, поэтому используется StringBuilder. В любом случае, и серверный рендеринг, и json, и шаблонизация — это построение строки.


                1. Tsimur_S
                  13.11.2018 12:50

                  Отлично, сегодня вы сделали конкатенацию строки в процедуре а завтра туда мигрирует вся логика. После этого саппорт подобного «солюшена» превращается в муки ада. Я не спорю что иногда лучше посчитать там где данные обитают чем гонять их по сети, но конкатенировать несколько строк возможностями бд это уже выше моего понимания.


            1. VolCh
              13.11.2018 10:30

              Вот по каким критериям полная фигня? Эти критерии важны для кого? У этих кого нет более важных критериев?

              Если код работает, отвечает функциональным требованиям к системе — он уже не фигня объективно.


              1. BigDflz
                13.11.2018 10:38

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


                1. VolCh
                  13.11.2018 10:44

                  Выбор не за мной, а за людьми, создающими требования. Если в требованиях «время ответа 100 мс в такой-то конфигурации железа и софта», я выберу технологии, позволяющие написать поддерживаемый код как можно быстрее и надежней без превышения этого предела. И я не буду затягивать время разработки в разы, а стоимость поддержки на порядки ради того, чтобы код работал не 70 мс, а 7.


      1. masterspline
        12.11.2018 21:30

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


        1. BigDflz
          13.11.2018 07:07

          по этому поводу есть старый вопрос: "… К пуговицам претензии есть?..."


      1. boblenin
        12.11.2018 23:31

        А кто нормального бэкэндера и фронтэндера заинтегрирует? Нормальный интегрендер? А если нормальных бэкэндеров отдел из 20 человек и столько же фронтэндеров (реальный пример из жизни — 2 отдела, один UI другой бэкэнд), то как выкатывать функциональность? Кто для кого является зависимостью? Кто определяет структуры данных? Кто определяет типы сообщений и шаблоны коммуникации? А если бизнес выдал новых требований и все, что написали в требованиях — это куча новых формочек, то что делать с бэкэндерами — увольнять? А если на следующий раз выдали кучу отчетности или биллинг переделывать — увольнять фротэндеров?


    1. bogolt
      12.11.2018 23:41
      +4

      > То что можно сделать в субд, делается в коде языка софта бэка.
      Порой вполне оправданно. То что в бд делается через 9 джойнов на коде бэка можно сделать простым кодом — намного дешевле и по времени выполнения и по оперативке, даже на не самом быстром яп бэка.
      Другой пример — когда для улучшения скорости бэк хранит часть данных базы в своих структурах данных чтобы не бегать в нее за каждым чихом. Очень важно если нам нужно отвечать на запросы не медленнее икс миллисекунд. В этом случае кстати бэк плюсовым.


      1. algotrader2013
        13.11.2018 01:29

        Есть еще нюанс. Да, на стороне sql многое делается сильно проще и эффективнее (даже, когда надо 9 джойнов, то почему бы не задействовать кеши СУБД с отполированным годами кодом, написанным суровыми системными программистами вместо своих велосипедов, к тому же, можно materialized view или триггеры и поддержание +1 таблицы устроить).
        Проблема как правило лежит в другой плоскости. Код бека легко покрыть тестами, он будет в рамках паттернов и ооп, он версионируется без костылей, он не требует миграционных скриптов, его проще переиспользовать. Кроме того, вариант "одна субд с мин нагрузкой + куча стейтлес воркеров" идеально масштабируется. Версии воркеров тоже можно обновлять нода за нодой. Также, если речь идет о лицензионном mssql/oracle, которые лицензиуются за ядра cpu, то может быть дешевле нагрузить 3 ядра на сервис хосте, чем одно на машине с субд;)


        1. BigDflz
          13.11.2018 06:40

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


          1. VolCh
            13.11.2018 10:33

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


            1. BigDflz
              13.11.2018 10:44

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


              1. VolCh
                13.11.2018 10:49

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


        1. anprs
          13.11.2018 11:39

          Плюс миграция с условного оракла на условный постгрес в первом случае будет значительно больнее


      1. BigDflz
        13.11.2018 06:34

        Глубокое заблуждение, те же 9 джойнов выполнятся намного быстрее, чем код. Есть очень хороший пример в области jsva — Hibernate. Его любители не понимающие в субд. Это такой тормоз, такое количество лишнего кода, огромное потребление памяти. и эта прокладка использует только поверхностные возможности субд. Такие спецы, не зная субд, ытаются реализовать функции субд в своём коде, хотя всё уже реализовано в субд. А их реализация выглядит жалким подобием субд, с добавлением тормозов и ошибок. Такая реализация плохо читаема, плохо сопровождаема…


        1. bogolt
          13.11.2018 10:13

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


          1. hatari90
            13.11.2018 11:45

            План выполнения запроса с 9 джойнами изучали?


          1. BigDflz
            13.11.2018 11:48

            очень сомнительно


          1. transcengopher
            13.11.2018 12:55

            Честно говоря, звучит как рассказ про встречу с единорогами.

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

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


            1. bogolt
              13.11.2018 13:10

              Хм, запрос время от времени писал в лог, что ему не хватило оперативки на выполнение и фэйлился. План не изучал.


              1. Daemon_Hell
                13.11.2018 13:54
                +1

                Так может традиционная ситуация что индексы забыли и бд поехала вычитывать все таблицы полностью?


              1. nsinreal
                15.11.2018 19:58

                А у вас был join по ключу или более хитрый?


            1. VolCh
              13.11.2018 16:58

              Это ведь один из достаточно логичных постулатов: работу с данными следует производить как можно ближе к данным.

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


              1. transcengopher
                14.11.2018 20:22
                +1

                Никакая не демагогия, вот отсюда беру, обратите внимание на пункт “Moving Computation is Cheaper than Moving Data”:
                hadoop.apache.org/docs/r1.2.1/hdfs_design.html

                Уж поверьте, как кодер я был бы только рад унести логику обработки данных из «холодной, безразличной» и требующей многословных запросов базы данных (где, например, попытки переиспользовать код обычно натыкаются на ощутимые тормоза ввиду переключения контекстов между SQL и PL) в уютный для меня любимый язык программирования. Но сетевой доступ к хранилищу не может происходить по путям бесконечной ёмкости, а значит, чем больше работы я сделал вдали от данных, тем больше данных было передано по сети. А это вещь ненадёжная и медленная.

                Я не исключаю что в каких-то системах такой подход может не работать и сервер базы загружен на 98%, но с другой стороны, если мы можем поднять сотню аппсерверов (для чего, кстати? вручную делать join'ы и закат солнца до кучи?), то почему мы не можем поднять «клон» для чтения, к примеру? Или поделить данные между несколькими базами, для начала, а склеивать уже результат от полученный от одинакового запроса к разным базам?


                1. Druu
                  14.11.2018 22:08
                  +1

                  Никакая не демагогия, вот отсюда беру, обратите внимание на пункт “Moving Computation is Cheaper than Moving Data”:

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


                  Пример: рендер изображения в сетевой игре происходит на клиенте, а не на сервере


                  1. transcengopher
                    15.11.2018 11:26

                    > Пример: рендер изображения в сетевой игре происходит на клиенте, а не на сервере

                    Плохой пример: если изображение это данные, то их совершенно правильно не передают с сервера, вместо этого клиенту передаётся описание вычислений, необходимых для получения правильных данных (поток событий в матче).
                    С другой стороны, в ММО, опять, же не передают все данные из базы на клиента, дабы клиент сам определился, какие из них ему действительно нужны и сделал необходимые вычисления. Переводя на язык СУБД, в таком случае вся фильтрация и join'ы произведены на сервере (в базе данных), клиенту приходит только проекция. Когда такая схема нарушается по любой причине, появляется возможность сжульничать — например, убрать «туман войны» в стратегии (применимо только для стратегий с сервером-арбитром правда, обойтись без дупликатов данных в P2P играх, насколько я знаю, пока не получалось ни у кого).


                1. VolCh
                  14.11.2018 22:47

                  Что интересно, хотя в заглавии пункта «Cheaper», в самом пункте «much more efficient… when the size of the data set is huge». Может поэтому в кавычках? О технической оптимизации, о скорости, я уже говорил, но бизнесу нужны экономические обоснования. А ваше «был бы только рад» намекает на то, что отсутствие радости на работе нужно чем-то компенсировать, обычно деньгами :)


                  1. transcengopher
                    15.11.2018 11:32

                    Так мы вроде и обсуждаем здесь случай, когда данных много? Иначе зачем для их хранения нужна база данных? Малые объёмы можно держать и в оперативной памяти где-нибудь.


                    А ваше «был бы только рад» намекает на то

                    … что я уже взвешивал несколько раз возможность "вытянуть всё и на месте разобраться в коде". И ни разу это не оказалось приемлемой стратегией. Более того — несколько раз мне приходилось такие подходы из кода вычищать калёным железом, так как в раунде PSR-тестирования выявлялось сильное падение отзывчивости системы, и причиной были именно, закаты солнца вручную на сервере вместо написания нормального запроса в базу данных.


                    1. VolCh
                      15.11.2018 16:46

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


            1. mayorovp
              15.11.2018 12:07

              Этот постулат верен только когда идет работа с большими или «средними» данными. Для мелких данных (порядка сотни записей) могут проявляться обратные эффекты.


        1. VolCh
          13.11.2018 10:39

          Hibernate и прочие ORM сделаны как раз чтобы улучшить читаемость и сопровождаемость кода, обычного ООП-кода. И использование ORM вовсе не значит «неумение в субд», может быть просто принято решение не использовать всю мощь конкретной СУБД, ради увеличения скорости разработки, улучшения читаемости и сопровождаемости. А если где-то вылезет нарушение нефункциональных требований по производительности, то отпрофилируют и перепишут точечно на SQL и ко критически важные части.


          1. BigDflz
            13.11.2018 11:18

            конечно, против административного решения не попрёшь, но цена такого решения — очень огромна. О читаемости и сопровождаемости хибера — вопрос спорный, потому как для него надо много классов/файлов для простого изменения. И опять таки для меня нет проблемы прочитать и понять запрос/хранимку. За неиспользованием все мощи субд придется заплатить масштабированием, приобретением нового, дорогого железа. Конечно это всё можно обосновать красивыми словами, но с точки зрения кода это глупо.


            1. VolCh
              13.11.2018 16:49

              Я не об административном, когда решил заказчик или начальник. Собрались разработчики и решили, что c ОРМ проект быстрее запустится и проще его будет поддерживать и развивать. Ну или единственный разработчик, который хоть знает об альтернативах так решил :) А за использование всей мощи СУБД придётся заплатить усложнением поддержки, замедлением (ну или удорожанием) разработки, усложнением развёртывания. Конечно это всё можно обосновать красивыми словами, но с точки зрения кода (а не его эффективности) это глупо :)


            1. BoberCoder
              13.11.2018 18:13
              +2

              За неиспользованием все мощи субд придется заплатить масштабированием

              Можети привести пример как вы платите масштабированием за хабирнейт? Хабернейт это всего лишь дополнительная нашлепка, которая помогает замапить данные в объекты. Т.е. если у вас бэкэнд на жаве, с большой вероятностью вам и так придется это делать, а с хабернейтом код просто будет чище.
              потому как для него надо много классов/файлов для простого изменения

              Ну как бы нет, если у вас много кассов/файлов в изменении, то значит это уже не простое изменение. Т.е. опять если вы мапите результат квери в жава объекты без хабернейта, то изменения в базе спровоцируют изменения в коде, причем изменения как в коде мапинга так и в объектах, а с использованием хабернейта только в объектах.
              P.S.
              Понятное дело, что за использование универсальной библиотеки вы всегда немного платите производительностью, но если на этом зацикливаться так можно и на с++ все писать. Когда я только начинал с хабернейтом, я тоже от него плевался по началу. Но после того как я в нем разобрался он оказался не так уж и плох.


              1. transcengopher
                14.11.2018 20:29

                ORM сияет обычно при записи, потому что не нужно думать, какие сущности сохранять первыми, какие вторыми и так далее. Очень сильно помогает если в схеме присутствуют циклические связи.

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


                1. alsii
                  14.11.2018 20:53
                  +1

                  Хм… Кто вам запрещает строить запросы используя поддерживаемые ORM аггрегатные функции?
                  И с чтением/записью как раз все наоборот. ORM здорово тормозит на операциях bulk import, и редко умеет делать partial write объектов. Еще проблема в том, что persistent manager перед тем как сформировать update-запрос должен понят, какие именно объекты изменились, а это при большом их количестве занимает много времени даже в RAM.
                  А вот как раз с чтением данных проблем как раз никаких. Потому, что запросы на чтение вы формируете сами и такие, какие считаете нужными. На этом этапе фактически работает только DBAL. А уж субстантизация полученных результатов запроса тоже зависит только от того, что вы понаписали в конструкторы и какие навешали на ваши объектв ORM-хуки. Собственно забота ORM — это сделать new, да заполнить свойства объекта.

                  Что же до курсоров и бегущих сумм, то это уже вообще говоря за рамками реляционной модели. Стоит ли такие вещи класть в СУБД? Не знаю… Может оказаться, что вам нужна сумма по страницам, а размер страницы зависит вообще говоря от устройства вывода.
                  Если у вас на все ВЦ одно АЦПУ, тогда почему бы и нет. А если у вас размер страницы зависит от размера окна браузера пользователя, то наверно это будет несколько затруднительно.
                  Вообще гуру учат отделять представление от модели, но может быть вы не верите во все это новомодные (для 1970-х годов) штучки…


                  1. Fesor
                    14.11.2018 22:33

                    > ORM здорово тормозит на операциях bulk import

                    bulk import благо не самая распространенная задача. Да и для конкретного кейса можно придумать что-то поинтереснее.

                    В целом ORM нужны там где у вас OLTP (OnLine Transaction Processing). То есть берем чуть-чуть данных (агрегат, границы бизнес транзакции, DDD), делаем с ними что-то и записываем.

                    Чтение и т.д. — для этого проще делать отдельно выборки через SQL. Тут не только с точки зрения производительности сколько с той точки зрения, что модели данных для чтения и записи нужны обычно разные.

                    Собственно вы сами в конце про разделение представлений говорите.


                    1. alsii
                      15.11.2018 14:25

                      bulk import благо не самая распространенная задача. Да и для конкретного кейса можно придумать что-то поинтереснее.

                      Whom how. У меня информация от контрагентов поступает в виде файлов в разных форматах, с нетривиальной структурой, и что самое ужасное непостоянной структурой и часто неконсистентными данными (опечатки, вручную сформированные записи, проблемы с кодировками и т.п.), и все это нужно целый день импортировать, импортировать, импортировать.


                      Неконсистентность помянута потому, что в случае неконсистентных данных приходится применять всякие нечеткие критерии поиска, которые часто базируются на заведомо консистентных данных уже находящихся в БД. И это одно из самых нелюбимых мной мест в коде. Пререписывать все это на SQL… Боже упаси!


                      1. Fesor
                        15.11.2018 18:42

                        > У меня информация от контрагентов…

                        Сейчас бы по одному кейсу статистику по индустрии проэцировать. Импорт данных может быть, но чаще всего это импорт части данных а не всех. Да, есть исключения, как и проекты где вообще нет bulk import.


          1. tgregory
            13.11.2018 16:06

            ORM скорее сделаны для того чтобы объектную модель натянуть на реляционную, при некотором сходстве двух моделей они всё же разные, так получилось, что реляционные БД намного более популярны чем объектные, а в языках программирования у нас объектная модель.


        1. Crandel
          13.11.2018 12:51

          База данных не всегда одна на приложение, может быть микс из sql и какой-то монги для метрик.


        1. alsii
          13.11.2018 18:12
          +2

          Использование ORM — это прежде всего избегание vendor lock. От СУБД в этом случае требуется только стандартный SQL, без всяких «фирменных» дополнений. И менять их (СУБД) можно практически на ходу.
          Плюс хранимые процедуры и особенно триггеры усложняют такие вещи, как версионирование и развертывание. Плюс требуют от разработчика дополнительных компетенций, что автоматически сужает количество кандидатов и увеличивает их зарплату.
          Я думаю, что с точки зрения бизнеса такое оправдано только как последнее средство в каких-то весьма высоконагруженных приложениях.


          1. Fesor
            13.11.2018 20:38
            +3

            прежде всего избегание vendor lock

            то есть мы избегаем лока от одного вендора за счет лока на другого вендора (Надеюсь вы не пишите свои ORM).


            Задача ORM не абстракцию от базы вам предоставить, а мэппинг данных организовать, из реляционной модели в ваши in-memory структуры. При этом у вас может быть тотальная завязка на нюансы конкретной СУБД. Дальше все больше про разделение ответственности (изменения персистенса не должны влиять на бизнес логику, но думать что при смене СУБД вам код не придется писать — глупо).


            как версионирование и развертывание.

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


            Плюс требуют от разработчика дополнительных компетенций

            Если подумать то объем знаний необходимых для работы с каким-нибудь nhibernate сопоставим с объемом знаний для работы с процедурами. Да, это сильно разный опыт, и стоит ориентироваться на рынок труда (а он такой что я ни тот ни другой вариант бы не доверил большинству)


            в каких-то весьма высоконагруженных приложениях.

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


            p.s. Если что — принципиально не использую процедуры/тригеры для бизнес логики и пока не встречался с юзкейсами где это все дает очевидные преимущества. Но полагаю такие кейсы есть. Не подумайте что я там фанат таких вещей.


            1. alsii
              14.11.2018 19:25
              +1

              > то есть мы избегаем лока от одного вендора за счет лока на другого вендора (Надеюсь вы не пишите свои ORM).

              ORM — это все же библиотека. Она — часть разрабатываемого вами продукта. Вряд ли заказчик будет самомстоятельно пересобирать ваш продукт. СУБД — это тоже часть проекта, но это внешний компонент, и нет причин, кроме тех, что я упоминал к нему привязываться. Vendor Lock — не абсолютное зло, но все же зло. И причины, которые его оправдывают должны быть достаточно серьезными.

              > Задача ORM не абстракцию от базы вам предоставить, а мэппинг данных организовать, из реляционной модели в ваши in-memory структуры.

              Задача ORM — реализовать слой абстракции в виде хранилища объектов с реляционными отношениями между ними.

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

              Хм… я могу одновременно задеплоить разные версии воркеров, которые будут реализовывать разние версии API. Я не слишком глубоко знаю SQL, но я не вижу способа задеплоить одновременно несколько разных версий SQL-триггрер.

              > Обычно оправдание — тотальное разделение ответственности и контроль за данными, секьюрити политики и т.д.

              А в чем тут проблемы с ORM? Вовсе не обязательно, чтобы все пользователи ходили к СУБД под одним пользователем.

              > Но полагаю такие кейсы есть.

              Да есть конечно. Тысячи их. Тот же Highload, когда приходится вылизывать планы исполнения запросов и играться с тонкими настройками СУБД. Или когда это голый CRUD.

              Вообще, для меня использование хранимых процедур для бизнес-логики это примерно как ассемблерные вставки в высокоуровневом языке. Можно, но если других способов нет.


              1. Fesor
                14.11.2018 20:09

                но это внешний компонент

                Почему? Можно ли воспринимать скажем версию JVM как "внешний компонент"?


                У меня вещи типа база данных это внутренний компонент. Я поставляю код как готовую инфраструктуру (предположим через докер). И я регламентирую что нужно для того что бы код работал.


                У меня был один кейс когда мне была выгодна смена субд прозрачная — у заказчика был тот самый вендор лок на оракл, и ничего другого они юзать не могли. И выяснилось это через 3 недели посте старта проекта. Но там и проект примитивный.


                Так что нет, сегодня завязка на конкретную СУБД это данность на хоть сколько нибудь серьезном проекте.


                Вы же не переживаете что выбрав определенный язык программирования вы как бы тоже создали себе вендор лок?


                Задача ORM — реализовать слой абстракции в виде хранилища объектов с реляционными отношениями между ними.

                Тогда было бы не O/RM (Object-relational mapping) а Object-Relation Abstraction какой. Задача ORM — исключительно мэппинг одного в другое. И при том что две эти модели данных (основанная на реляциях и ваши in memory структуры) сильно различаются, то и мэппинг мы можем сделать в ограниченном наборе сценариев (всему виной такая вещи как референсы, которые выражены сильно по разному)


                Хм… я могу одновременно задеплоить разные версии воркеров, которые будут реализовывать разние версии API

                это как UI, попробуйте такое с бизнес логикой провернуть. И не важно будет в тригерах она или в коде. Ну либо ваши две версии воркеров должны реализовывать совместимость на уровне бизнес процессов. Что как бы… можно провернуть и с тригерами.


                но я не вижу способа задеплоить одновременно несколько разных версий SQL-триггрер.

                Я не вижу необходимости в этом. Но вообще зависит от вашей СУБД. В PostgreSQL подобное можно хитро замутить со схемами.


                А в чем тут проблемы с ORM? Вовсе не обязательно, чтобы все пользователи ходили к СУБД под одним пользователем.

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


                Такое можно и с кодом провернуть (здрасте микросервисы).


                Тот же Highload

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


                1. alsii
                  14.11.2018 21:28

                  Можно ли воспринимать скажем версию JVM как "внешний компонент"?

                  Почему нет? Можно и ОС, и веб-сервер рассматирвать как внешний компонет, и все остальное. Чем меньше зафиксированных зависимостей пришлось затащить в проект — тем лучше.


                  Так что нет, сегодня завязка на конкретную СУБД это данность на хоть сколько нибудь серьезном проекте.

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


                  всему виной такая вещи как референсы, которые выражены сильно по разному

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


                  это как UI, попробуйте такое с бизнес логикой провернуть.

                  Воркеры это про UI? С чего бы вдруг? Хотя что считать UI? Если у меня воркеры e-mail формируют, и я шаблон поменял. И для нового шаблона требуются данные, которые не нужны были для старого. Что мешает работать и тем и другим параллельно? Или e-mail — это тоже UI?
                  Или если у меня с определенного месяца алгоритм расчета комиссий поменялся. Что мне мешает запустить комплект новых воркеров, которые будут это делать для нового месяца и параллелльно использовать старые, для предыдущих месяцев?


                  можно хитро замутить со схемами.

                  Можно. Но зачем? Ради суперзадачи "использовать триггеры во что бы то ни стало?"


                  Это больше про загоны с отслеживанием изменений.

                  Вот как раз тут через ORM все чудесно решается. Через Entity lifecycle events. Или вы полагаете, что "триггеры" бывают только в СУБД? Кстати, довольно "дешево" реализуется, т.к. отслеживание изменений в ORM обычно из коробки. и сторонние сервисы подцепляются легко. Я в последнем проекте просто кидал сообщение в менеджер очередей: "Пользователь IvanovAA поменял зарплату сотруднику Иванов А.А.". А там его уже логировали, кому следует на проверку отправляли и "завертелась карусель". Кстати, вопрос… в PostgreSQL в триггкре доступна информация о пользователе, выполнившем транзакцию, и можно ли к каким-то внешним службам обратиться, типа RabbitMQ или Redis? И желательно асинхронно, дабы не тормозить процесс.


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

                  Тут не стану с вами спорить, ибо не специалист по триггерам и процедурам. Но они что, правда не работают в кластерах и при шардинге?


                  1. Fesor
                    14.11.2018 23:02

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


                    Чем меньше зафиксированных зависимостей пришлось затащить в проект — тем лучше.

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


                    Вы согласны что зависимость все равно есть? А это значит что мы не можем просто поставить "другую субд" и все будет гарантировано работать, то есть может потребоваться дополнительная работа.


                    Ну или расскажите про свои проекты. Ибо я не могу вспомнить ни одного проекта где мы гарантировали бы стабильность работы софта при смене скажем postgres на mysql.


                    У вас вообще нет контроля за окружением? Коробочные решения? Десктоп? Просто это довольно важно понимать, ибо задачи могут быть чуть другие.


                    Я просто не очень верю в волшебное "зависимости есть но я могу махнуть палочкой и вжух уже имплементация другая". То есть да, изолировать зависимость — понимаю и согласен. Но ORM — это не про "устранение зависимости от конкретной базы", это не ее первоочередная задача. Абстракцию вы уже сами делаете (шаблон Repository например).


                    Что мешает работать и тем и другим параллельно?

                    ничего, просто два процесса. И да — формирование email-а это представление. Независимый процесс. Запускайте сколько хотите. А вот если ваш "коркер" бизнес процессы будет разруливать, то вам уже важно что бы бизнес процессы реализованные в версии 1 и версии 2 были совместимы.


                    Что мне мешает запустить комплект новых воркеров

                    А что мешает добавить код в имеющийся воркер что бы тот сам стал считать в нужный момент по другому? У вас же по любому будет какой-то код который будет принимать решение какому из воркеров трудиться когда. Или вы руками планируете переключать?


                    Ради суперзадачи "использовать триггеры во что бы то ни стало?"

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


                    Пример со схемами — просто говорю что есть механизмы. Если говорить не про тригеры и процедуры, а просто про схему базы, то оно вам и с ORM поможет (удобно при zero downtime. Как пример можете глянуть как вот тут делают).


                    Вот как раз тут через ORM все чудесно решается.

                    речь идет не о тех изменениях. Это про изменения логики/кода.


                    Через Entity lifecycle events.

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


                    т.к. отслеживание изменений в ORM обычно из коробки

                    Только если ваша ORM имеет внутри unit of work. Это маленький процент ORM и в целом они обычно очень сложные. Не ну как, если понимать что магии там нету и разбираться как оно работает)


                    Я в последнем проекте просто кидал сообщение в менеджер очередей

                    А у меня вообще event sourcing


                    в PostgreSQL в триггкре доступна информация о пользователе, выполнившем транзакцию

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


                    Скажем у меня на проекте HIPAA и мне нужно не только трекать кто чего подправил, но и кто чего посмотрел. Настолько что мол мне надо трекать кто в какое время в результате поиска каких пользователей увидел.


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


                    и можно ли к каким-то внешним службам обратиться, типа RabbitMQ или Redis?

                    Там есть notify через который можно замутить pub/sub. Например — штуки типа postgraphile используют для того что бы апдейты на клиент в сокеты пихать.


                    Но они что, правда не работают в кластерах и при шардинге?

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


                    Опять же, у меня опыта такого тоже нет, просто из всех проектов которые приходилось видеть основной юзкейс был именно в том что бы жестко ограничивать доступ к данным (когда самое критически важное лежит процедурами, все данные жестко разбиты какими-нибудь row based security и т.д.). Ну и те же микросервисы, где можно ввести те же ограничения, уже могут выйти дороже. Но опять же всякое бывает. Иногда критически важную подсистему можно выделить отдельно и будет как бы монолит + внешняя система которая не меняется без согласования с контролирующими органами (какие-нибудь PCI DSS)


                    1. alsii
                      15.11.2018 14:12
                      +1

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


                      1. Наши подходы в принципе совпадают.


                        • Я не отрицаю, что иногда триггеры и хранимые процедуры могут быть полезны. Вы привели много примеров этого.
                        • Вы утверждаете, что ORM не панацея и не серебряная пуля. Я согласен с вами на 100%. Я вообще думаю, что "серебряных пуль не бывает".
                        • Мы расходимся в оценках того, какие именно особенности ORM являются их сильными и слабыми сторонами, но это во-первых все же вторично, а во-вторых сильно зависит от конкретной задачи. Можно рассмотреть 100 сферических ТЗ в вакууме, но это явно выходит за рамки дискуссии в комментариях.

                      2. Очевидно разное понимание роли ORM в проекте, сложилось скорее всего по моей вине. Мой опыт как раз ограничен "очень сложными" ORM с DBAL, UoW, Lifeсycle Events, Query Builder, Repository Pattern, Entity Collections, Criteria, блэкджеком и всем остальным. В результате у меня в коде проекта не бывает не то что хранимых процедур, а SQL вообще. Или lazy loading, или Query Builder, или Criteria.
                        Глупо с моей стороны было упускать из виду существование ORM as is, без всего этого "богатства". Прошу простить мне мою профессиональную деформацию.


                      3. Насчет зависимости от СУБД. На ранних стадиях предпоследнего проекта (около 15% кодовой базы) я пробовал интереса ради запуститься с PostrgeSQL вместо MariaDB. После некоторой пляски с настройками ORM все получилось. Код менять не пришлось.



                      1. Fesor
                        15.11.2018 18:46

                        > Глупо с моей стороны было упускать из виду существование ORM as is

                        Подозреваю что вы пользуетесь либо Доктриной либо Чем-то вроде гибернейта, ну тогда в целом мы используем одни и те же инструменты.

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

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


          1. VolCh
            14.11.2018 15:53
            +1

            ORM и DBAL не синонимы и не вложенные множества. Отсутствие vendor lock в случае универсальной ORM лишь бесплатній бонус, если вам нужен маппинг, и огромній оверхид если нужна абстракция от диалекта SQL.


        1. usego
          13.11.2018 20:58
          +3

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


          1. Stas911
            14.11.2018 00:44

            Ну и выстрелить себе в ногу там пара путяков — одно неловкое движение и он загружает в память тьму данных (по крайней мере лет 10 назад так было)


            1. VolCh
              14.11.2018 16:00
              +1

              Что опять же подразумевает сеньорские знания в случаях отличных от самых тривиальных :)


            1. alsii
              14.11.2018 19:35

              Хм. Вы думаете на SQL невозможно написать что-то подобное? Ошибка в условии в UPDATE… JOIN может давать очень интересные эффекты. Но гораздо более частая проблема неправильного использования ORM — это N+1 запрос.

              ORM — она (он?) такая же реляционная как СУБД под ней. Поэтому использование ORM не отменяет необходимости понимания того, как работает реляционная модель данных. Должен ли это понимать джун? Я думаю да.


              1. Fesor
                14.11.2018 20:11

                ORM — она (он?) такая же реляционная как СУБД под ней.

                реляционная в смысле орудует реляционной алгеброй (ну там картежи данных, предикаты) или в каком смысле вы употребляете это слово?


                Должен ли это понимать джун? Я думаю да.

                Понимают ли? думаю нет. Для подавляющего большинства джунов ORM это волшебная коробка которая просто работает. Более того — это довольно распространенное мнение. Вот выше тоже вещают про то что ORM это абстракция от базы. А если оно абстракция — значит про базу знать не обязательно.


                1. alsii
                  14.11.2018 21:39

                  реляционная в смысле орудует реляционной алгеброй (ну там картежи данных, предикаты)

                  В том смысле, что она орудует сущностями связанными отношениями. Если пожелаете, то можно и с предикатами. Есть например забавные штуки, которые позволяют строить запросы, которые отрабатываются по уже загруженным данным, вообще не обращаясь с СУБД, если все что нужно уже имееется. а если нет, то будет запрошено. Есть разумеется, некоторые ограничения, но иногда очень полезно.


                  Для подавляющего большинства джунов ORM это волшебная коробка которая просто работает.

                  Для подавляющего большинства джунов RDBMS — это волшебная коробка которая просто работает. Более того — это довольно распространенное мнение. "Оптимизация индексов? План исполнения? Нет, не слышали! Там есть какой-то оптимизатор внутре, вот он пусть и оптимизирует. А мы умеем в SELECT и UPDATE".


                  1. Fesor
                    14.11.2018 23:08

                    которые отрабатываются по уже загруженным данным

                    и джойны там есть? Или чисто проверка условий? Ну мол реляционная алгебра это все ж чуть интереснее чем фильтрация коллекции.


                    Опять же — главное пожалуй отличие — отсутствие ссылок и возможности однонаправленные one-to-many связи делать (у вас на стороне many fk что делает его зависимым от one)


                    Ну и за счет всех этих нюансов и появляются кучи плюшек по оптимизации. А так можно просто key-value хранилище сделать и индексы строить, никто не мешает. Объектно-ориентированные базы были, сейчас вот есть документно ориентированные (или мой любимый объектно/реляционный постгресс)


                    1. alsii
                      15.11.2018 16:25

                      и джойны там есть? Или чисто проверка условий? Ну мол реляционная алгебра это все ж чуть интереснее чем фильтрация коллекции.

                      Тут начинаются тонкости реализации.
                      Джойны есть в том смысле, что вы можете фильтровать по свойствам вложенных объектов. Ну и естественно получив объект(ы) вы получите доступ ко всему "дереву зависимостей". Но в общем да, это все же просто фильтрация. И если есть lazy loading, вы рискуете получить x*N+1, если cвязанные сущности не подгружены. Тут уж вам решать надо оно вам или нет. Ну и иногда (при больших объемах данных) быстрее будет выполнить запрос к СУБД, чем копаться в памяти.


                      у вас на стороне many fk что делает его зависимым от one

                      Нет, ну ORM — это все же не RDBMS, но связи между объектами и некоторые реляционно-ориентированные операции поддерживаются могут поддерживаться.


                  1. transcengopher
                    15.11.2018 11:50

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

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


                    Просто если здесь только фильтрация по PrimaryKey, то такие штуки по факту являются банальным кэшем, и ввиду этого абсолютно не забавны. А вот если там поддержка произвольных запросов (и не просто кэширование результатов) — то это да, интересно неимоверно.


                    1. alsii
                      15.11.2018 16:34

                      Если произвольные запросы, то чем обеспечивается доказательство, что из базы уже всё прочитано в память, и в базу лезть не требуется?

                      Со стороны ORM ничем и никак. Любая коллекция итерируется так, как она есть. Рассматривайте это просто как кэш с некоторыми дополнительными фишками. Волшебного решения инвалидации кэша из коробки нет. Можно просто выкинуть все или часть загруженных сущностей. Тогда при следующем обращении они будут вытянуты. Плюс — lazy loading, который иногда удобен, но при неправильном использовании даст вам N+1.
                      Фильтрация в принципе произвольная, но с учетом оговорок выше.


                    1. VolCh
                      15.11.2018 16:51

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


    1. Virviil
      13.11.2018 01:05
      +1

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


      Пример с БД и бэком может быть обусловлен тысячей причин, начиная с "спроектировали БД, потом появились новые требования" заканчивая "для возможности будущей миграции с SQL на NoSQL (или наоборот) принято решение вынести логику на уровень Бэка".


      То же самое с фронтом: ВК например отправляет через AJAX на фронт сразу куски готового HTML, в то время как стандарт — это JSON. Даже если условия изменились, и сейчас какое-то решение выглядит глупым, вполне возможно что оно принято в других условиях и сейчас это тупо ДОРОГО переделывать.


      Глупость кода, таким образом, в 95% случаев не глупость, а стечение обстоятельств, недостаток рефакторинга и ошибки в архитектурных решениях, принятых в условиях дефицита информации, которых было невозможно избежать. А в оставшихся 5% случаев допускаются как "фулстеками" так и "частичниками".


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


      1. BigDflz
        13.11.2018 07:02

        Я не говорю о проблемах возникших при сопровождении, я говорю о стадии разработки — это видно, когда возникла эта глупость…
        Когда знаешь свои границы…, но чаще бывает важнее знать что и где выгоднее выполнить. Это важно ещё на стадии разработки.
        Вот упоминание json… все считают стандарт… но это лишняя, как минимум двойная работа. Ajax — даже на новые разработки его втыкают, когда уже есть websocket.
        Дорого переделывать — а кто оценивает? фуллстек? или «узкий специалист»?


        1. Virviil
          13.11.2018 08:29
          +1

          Судя по вашему комментарию вы очень далеки от процессов разработки софта, я уж не знаю как:


          1. В любом Agile окружение "разработка" и "поддержка" трудно отличимы после первого же цикла, а после MVP это вообще уже одно и то же.


          2. Никогда не "выгоднее" выполнить что-то не там где надо, потому что с кодом работают люди, и им надо писать его так, чтобы можно было его поддерживать. Иначе бы все в мире писали на ассемблере, потому что это "очень выгодно".


          3. json — лишняя, двойная работа? Вы о чем вообще??? Ajax заменяется веб-сокетом? Серьезно?? Наверное именно поэтому в GraphQL спецификации есть И Ajax И websocket? Я уже молчу о том, что по вебсокету обычно все передают json...


          4. Дорого переделывать — обычно оценивает бизнес. Потому что он платит деньги. И это важно понимать любому разработчику… Если говорить про конкретных людей — CTO, Архитектор, ТехЛид, ТимЛид. Люди с кругозором на весь используемый стек.



          1. BigDflz
            13.11.2018 09:01

            Достаточно 3 пункта, чтоб понять, что дальнейший спор бесполезен.

            json — лишняя, двойная работа

            1 Преобразование данный в json
            2 Пребразование json в html (рассматриваем веб проекты)
            все это можно заменить на сервере простым «серверным рендерингом» преобразованием данных а hyml. на клиенте html строка вставляется в дом 1 строкой кода.
            Ajax заменяется веб-сокетом? Серьезно??
            элементарно на все 146%, без всяких проблем, что и делаю с момента появления websocket, без использования ajax.
            Я уже молчу о том, что по вебсокету обычно все передают json...
            Очень важное слово «обычно»,(раньше обычно ездили на телегах...) можно просто передать html, будет просто и наглядно и быстро. Я видел как запаковывают html в json вместе с другими с другими данными, но это отрыжка из прошлого, когда использование ajax требовало режима запрос-ответ, т.е. на один запрос только один ответ. Технология websocket позволяет отойти от этого. Чем я и пользуюсь.
            Мало того, websocket позволяет снизить нагрузку на сервер. позволяет отображать данные в реальном масштабе времени. Есть проекты где по ws предаются данные с arduino, пишутся в базу и отображаются в виде бегущего графика у клиента, и все это в реальном времени с минимальной нагрузкой на сервер…


            1. VolCh
              13.11.2018 10:47

              2 Пребразование json в html (рассматриваем веб проекты)

              В большинстве новых проектах на "хайповых" технологиях преобразования в html нет, преобразование идёт в DOM


              1. BigDflz
                13.11.2018 11:27

                есть, конечно варианты, но все равно это строка не json, в той или иной форме это строка из элементов html. Если мне надо вставить в див таблицу, я сформирую на сервере html строку таблицы. отправлю её клиенту и вставлю в дом простой командой .innerHTML='html_строка_таблицы'. есть вариации типа DocumentFragment., но это сути не меняет.

                В большинстве новых проектах на «хайповых» технологиях преобразования в html нет, преобразование идёт в DOM
                не будь голословным приведи варианты этих хайповых технологий


                1. faiwer
                  13.11.2018 12:04
                  +1

                  не будь голословным приведи варианты этих хайповых технологий

                  React, Angular, Vue, KnockoutJS, Svelte, Ember… Честно говоря практически всё, что вы только сможете найти в области SPA. При этом oldschool подход формирования кусочков HTML на стороне backend продолжает использоваться в более простых задачах. Чем проще продукт, тем меньше ему нужно заморочек с frontend. Большая часть вебсайтов в сети будут себя прекрасно чувствовать вовсе без JS, используя только HTTP + HTML + CSS + JS.


                  .innerHTML='html_строка_таблицы'

                  Очень странно, что вы умудряетесь совмещать в своих проектах такие вещи как WebSocket (штука крутая, но нужна оооочень ограниченному числу проектов) и .innerHTML=. Это примерно как летать на флайборде по торговому центру с каменным зубилом.


                  1. BigDflz
                    13.11.2018 12:10
                    -2

                    React, Angular, Vue, KnockoutJS, Svelte, Ember
                    это всё фантики, я же просил код, пример.
                    штука крутая, но нужна оооочень ограниченному числу проектов
                    это просто потому что многие не умеют её готовить. проще по-старинке ajax…
                    .innerHTML=. Это примерно как летать на флайборде по торговому центру с каменным зубилом.
                    а что тут такого? на сервере готовлю html строку и на клиенте вставляю, просто, быстро, наглядно. Есть что-то более проще — воспользуюсь.


                    1. faiwer
                      13.11.2018 12:19

                      это всё фантики, я же просил код, пример.

                      Что именно вас интересует? Внутри этих библиотек используется DOMAPI (appendChild, createElement, setAttribute & etc...). Вам ссылку на MDN? Или ссылку на те места где эти методы используются в недрах этих библиотек? Или ссылку на те места где вы их руками в своём коде пишете? Если последнее, то в том то и суть, что руками вы это пишете только совсем уж в исключительных случаях. Библиотека\фреймворк делает это за вас в оставшихся 99%. Вы работаете над данными и взаимодействиями между ними.


                      это просто потому что многие не умеют её готовить. проще по-старинке ajax…

                      Нет. Полным полно людей умеющих готовить WS. Да и библиотек хватает (socket io, atmosphere, ...). Просто не нужно оно в 95+% случаев. Это один из множества инструментов, который вы приняли за серебряную пулю.


                      а что тут такого?

                      Ничего плохого в использовании каменного зубила нет. Просто непродуктивно это для больших и сложных frontend-проектов. Поэтому уже больше 5-и лет для сложных задач используют различные реактивные вещи. Правда более простыми я бы их не назвал, погружаться в эти технологии придётся долго и трудно. Это существенный пласт знаний, без которых сегодняшняя разработка серьёзных фронтенд приложений просто немыслима (ооочень дорого).


                      По сути это всё настолько объёмный пласт знаний, что по первой это может вызвать кровоизлияние в мозг. Шучу. Все эти webpack-и, babel-и, JSX-ы, React-ы, PostCSS-ы и тысячи других баззвордов — это реалия современного фронтенд рынка.


                      1. BigDflz
                        13.11.2018 12:28

                        (appendChild, createElement, setAttribute & etc...)
                        это всё теже перепевы innerHTML, и конечно я их использую в тех местах где нужно, innerHTML я привел как самый элементарный, показательный вариант.
                        Нет. Полным полно людей умеющих готовить WS. Да и библиотек хватает (socket io, atmosphere, ...). Просто не нужно оно в 95+% случаев. Это один из множества инструментов, который вы приняли за серебряную пулю
                        .это хорошая новость., что есть люди, умеющие их готовить, но для меня это не серебрянная пуля, просто это универсальная технология позволяющая полностью заменить ajax, и отказаться от множества поддерживаемых технологий.
                        Для меня это элементарный механизм, как и хранимки, поэтому я считаю это одним из простейший кирпичиков для построения систем.


                        1. faiwer
                          13.11.2018 12:32

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

                          Вы их используете. А мы нет. В этом суть. Мы не орудуем каменным зубилом. Им орудуют используемые нами инструменты. Это сложно объяснить в двух словах.


                          P.S. Ну и есть огромная разница между innerHTML= и производительной работой с DOM.


                        1. VolCh
                          13.11.2018 17:02
                          +2

                          это всё теже перепевы innerHTML,

                          Это не перепевы, это прямой способ формировать DOM. А innerHTML — это способ запустить парсер, который распарсит строку и сделает из неё DOM. Концептуально ничем не отличается от json, разве что парсер куда-то проще.


                          1. eugene_bb
                            13.11.2018 19:09
                            +2

                            innerHTML это прямой путь чтобы получить XSS, не думаю что кто либо в библиотеках это использует


                            1. f0rk
                              14.11.2018 07:10
                              +3

                              > innerHTML это прямой путь чтобы получить XSS

                              Особенно учитывая то, что шаблонизаторы BigDflz тоже не использует и рендерит html конкатенацией :) Ну тут сильно запущенный случай, я не думаю что есть смысл что-то объяснять.


                              1. BigDflz
                                14.11.2018 07:47
                                -3

                                не думаю что кто либо в библиотеках это использует
                                если не думаешь, не стоит об эом писать. innerHTML такой же метод как и appendChild, createElement, setAttribute & etc..., только он меняет полностью содержимое родителя, а не часть его. то что я делаю из кода — можно элементарно сделать и из консоли браузера. Если посмотришь внимательно что делают известные fw — то увидишь, что они так же используют «серверный рендеринг», только из-за свойст ajax посылать один ответ на запрос пакуют в json сформированную (отрендеренную) на сервере html строку и дополнительный (при необходимости ) набор данных.
                                что шаблонизаторы BigDflz тоже не использует и рендерит html конкатенацией :)
                                да будет известно, что под фантиком шаблонизации скрывается та же самая конкатенация. А так называемый рендеринг html (серверный рендеринг) ни что иное, как формирование html строки путем конкатенация строк, содержащих тэги html и пользовательских данных.
                                Для ознакомления что может javasript делать прошу ознакомиться learn.javascript.ru/search/?query=%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0&type=article
                                Если послать клиенту json с данными, то необходимо преобразовать сначала в в какой-либо массив/объект, а потом из него в цикле произвести вставку поэлементно в dom, либо сформировать туже строку html и её вставить через innerHTML.
                                Ваши ангуляры и прочие фантики ничего другого не делают.
                                По быстродействию — для сервера равносильно что формировать json или html — и то и другое работа со строками, их конкатенацией, скрытой под фантиком шаблонизации или простым сложением строк.
                                На клиенте же есть разница — простая вставка inerHTML(или ей подобные) или преобразование из json в объект, а потом уже из объекта в inerHTML(или ей подобные)


                                1. faiwer
                                  14.11.2018 08:35
                                  +3

                                  Ваши ангуляры и прочие фантики ничего другого не делают.

                                  Вы несёте полнейшую чепуху, и похоже не имеете ни малейшего представления о том, как работают все эти "фантики". Ей богу, ну прекратите. Это ж даже не смешно. На дворе 2018г.


                                  1. BigDflz
                                    14.11.2018 08:42

                                    перечисли что может ангуляр, и не может js?


                                    1. faiwer
                                      14.11.2018 08:50
                                      -1

                                      перечисли что может ангуляр, и не может js?

                                      Я с вами на "ты"? С каких пор?


                                      Вопрос в высшей степени нелепый. Angular это JS фреймворк. Он на нём написан. Вопрос просто не имеет смысла.


                                      Комментарий выше был про то, что все эти фантики работают на стороне клиента и никаких строчек в HTML не склеивают. На стороне JS нет необходимости формировать HTML из строк. Работа происходит на уровне объектов.


                                      Серверный же рендеринг этих фантиков — явление достаточно редкое. Там тоже работа внутри "фантиков" происходит с объектами, а не строками. Строка собирается уже из объектов на самой самой финальной стадии. И это всё скрыто от разработчика в недрах библиотек.


                                1. faiwer
                                  14.11.2018 08:45
                                  +3

                                  А так называемый рендеринг html (серверный рендеринг) ни что иное, как формирование html строки путем конкатенация строк, содержащих тэги html и пользовательских данных.

                                  В конечном счёте, если речь идёт именно о серверном рендеринге (который зачастую отсутствует как класс), то да, сборка итогового HTML это сборка строки, которая отправляется клиенту назад по HTTP.


                                  Однако, имеет существенное значение, как эта строка была сформирована. Если вы эти, пардон, руками формируете, склеивая строки в вашем коде явным образом… пример:


                                  <div class="<?= htmlspecialchars($type.$some) ?>"><?= $title ?></div>

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


                                  Шаблонизаторы внутри себя эти самые строчки и склеивают, да.


                                  Правда я ещё раз сделаю акцент на том, что раз уж мы говорим про AJAX, WS и прочее, то у нас, как правило, почти всегда, нет никакого серверного рендеринга. Совсем. Вот прямо ни строки. Сервер передаёт нам только данные. А с HTMLDOM работает уже клиент (JS). И клиент никаких строчек не склеивает, т.к. незачем. У нас ведь есть DOM и полноценное API к нему. И даже этими методами мы не пользуемся почти, т.к. это делает дополнительная прослойка — фреймворк.


                                  1. VolCh
                                    14.11.2018 16:07

                                    Более того, может отсутствовать классический шаблонизатор типа PHP :), а на стороне сервера собираться поэлементно полноценный DOM (или virtual DOM), который рендерится в "outer/innerHtml"


                                    1. faiwer
                                      14.11.2018 16:26
                                      +2

                                      Оказалось, что наш друг вовсе не PHP-ер, он JAVA-ер, и конкатенирует HTML "руками", за счёт огромной портянки цепочек .append(anything). Код вида:


                                      StringBuilder s = new StringBuilder();
                                      s.append("<div ").append(" id='").append(id).append("'><span>").append(/* и так далее */);

                                      Собирает такие кусочки HTML на сервере по любому поводу (по сути любое изменение DOM) и отправляет на клиент через webSocket-ы (прямо как есть, строкой), а на той стороне jQuery-like портянка с innerHTML. Мотивация: все эти фреймворки очень медленные, а у меня вот как всё быстро и удобно. о_О. И это на задачах в стиле "вывести редактируемую табличку на корпоротивном сайте" (не какой-нибудь hyper-high-load).


                                      1. Nookie-Grey
                                        15.11.2018 18:23

                                        BigDflz очень интересный уникум, он и в моей статье пытался доказать, что вся отрасль front-end глупцы, используют лишнюю абстракцию json и что нужно гонять html через ws


                                        1. BigDflz
                                          15.11.2018 18:43

                                          Да, получается что я уникум, да, я гоняю всё через ws. Это всё намного проще и производительнее, чем гонять через ajax. в начале появления ws, я наслышался такого про эту технологию… а теперь оказывается что все wf её используют. А насчет гоняния html через ws, могу сказать, что вы просто имеете поверхностные знания о работе ваши wf, которые по тихому вставляют собранную на сервере html строку в поле того же json. И называют это красиво — серверный рендеринг
                                          habr.com/company/ruvds/blog/339148
                                          medium.com/devschacht/peter-chang-break-down-isomorphic-and-universal-boilerplate-react-redux-server-rendering-8fd0ec4a8512
                                          ru.stackoverflow.com/questions/528390/%D0%97%D0%B0%D1%87%D0%B5%D0%BC-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D1%8B%D0%B9-%D1%80%D0%B5%D0%BD%D0%B4%D0%B5%D1%80%D0%B8%D0%BD%D0%B3-react-js-%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D0%BE%D0%B2


                                1. VolCh
                                  14.11.2018 16:02
                                  +2

                                  Чем для вас отличается конкатенация строк, их сложение и шаблонизация? простой сишный printf("Hello %s", name); для вас что?


            1. cyberly
              13.11.2018 13:31

              … позволяет снизить нагрузку на сервер ...


              Как раз генерация HTML на клиенте очень-очень здорово позволяет ее снизить. Генерация HTML вообще может быть самой дорогой операцией в приложении. А если притянуть сюда, скажем, генерацию изображений, то еще и основным потребителем сети. Ну например, масштабирование/обрезка изображения перед загрузкой на сервер. Или построения графика по табличке с данными. Arduino застрелится такое сделать. И «нормальный» сервер застрелится при определенном (не очень большом) числе пользователей.

              И вы почему-то смешали отчуждение уровня отрисовки (что делается, в том числе, c помощью AJAX/json) и решение проблемы большого числа запросов к серверу (websockets).


            1. pawlo16
              13.11.2018 13:33
              +1

              Ajax заменяется веб-сокетом? Серьезно??

              элементарно на все 146%, без всяких проблем, что и делаю с момента появления websocket, без использования ajax.


              Похоже на одурманенность хайпом, уж не знаю каким. Вебсокет или шмебсмокет, json или неджсон — какая половая разница, если это всего лишь транспортный протокол и текстовый формат? Когда инструмент становится фетишем — смешно же. в идеале ни фронт- ни бэк- программист вообще не должен думать о транспорте и сериализации, а должен думать о задачах бизнеса. Из ваши комментариев видно, что вы понятия не имеете об rpc фреймворках Thrift и grpc — а зря. В серьёзных проектах либо они, либо им подобные решения, которые выбирает тех.лид, затем вся команда использует явочным порядком. А вы тут втираете сказки про websocket vs ajax, тот ещё bubble effect.

              Вебсокет между прочим в большинстве задач гораздо хуже ajax хотя бы уже тем, что он сложнее. А где именно и что рендерить — html на сервере или dom в браузере — это совсем уже зависит от задачи, и тут ещё более смешно кому то навязывать что-то в качестве универсального решения.


          1. BigDflz
            13.11.2018 09:11

            Наверное именно поэтому в GraphQL спецификации есть И Ajax И websocket?
            Просто для любителей старины и для совместимости со старыми наработками.


            1. faiwer
              13.11.2018 11:18
              +1

              У вас очень специфическое представление как о частностях (Ajax, WebSocket, data-flow), так и в целом об front- & backend разработке.


              1. BigDflz
                13.11.2018 11:41
                -1

                может просто это Ваше мнение? У меня большой опыт (с начала появления ) websocket, я наслышался о не нужности и пагубности ws, но время показывает, что все переходят на них. И нет ни одного аргумента, чтоб перейти на ajax и его производные велосипеды. Одно то, что это фулдуплекс, говорит о многом. Я могу из любого места серверного кода отправить данные нужному клиенту. это просто. Приведи пример что может ajax и неможет ws, обратного же куча.
                И да использование ws меняет подход к веб проектам, тем кто привык к ajax это кажется не привычным, не правильным. Но это раскрывает огромные перспективы если понять и научиться работать с ws. У меня есть свои наработки, свои решения, которые позволяют использовать ws широко, просто, удобно.


                1. faiwer
                  13.11.2018 12:08

                  Кажется у вас просто большой опыт с websocket, но очень специфический опыт с web в целом. Использовать webSocket вместо AJAX для большинства проектов, это как стрелять из пушки по воробьям. Воробья подстрелить можно, но зачем? Рекомендую вам ещё serviceWorkers тогда подключить, очень гармонично впишется ;) А ещё можно всё перевести на webAssembly. И не забыть сделать offlne-версию всех своих продуктов.


                  У меня тоже есть опыт с WS. Но мне бы и в голову не пришло тащить его в те проекты, где нет нужны в persistance connection.


                  1. BigDflz
                    13.11.2018 12:19

                    Использовать webSocket вместо AJAX для большинства проектов, это как стрелять из пушки по воробьям
                    это заблуждение, на самом деле это намного проще чем ajax.
                    Рекомендую вам ещё serviceWorkers тогда подключить, очень гармонично впишется ;) А ещё можно всё перевести на webAssembly.
                    я к этому стремлюсь. Если есть опыт — прошу поделиться.
                    У меня тоже есть опыт с WS. Но мне бы и в голову не пришло тащить его в те проекты, где нет нужны в persistance connection.
                    могу согласиться, но у меня корпоративные порталы, где persistance connection как основа. С другой стороны если есть проверенные наработки с ws, почему не заменить ими ajax? и клиентская сторона и серверная получаются простыми, ни чуть не сложнее чем с ajax.


                    1. faiwer
                      13.11.2018 12:23

                      Я не буду вас переубеждать. Скажу проще вы очень сильно заблудились в своём познании web-а. Вероятно вы на 99%+ самоучка. Вам стоило бы рассмотреть возможность очной работы в крупной продуктовой компании, в команде более опытных коллег.


                      1. Whuthering
                        13.11.2018 13:01
                        +1

                        Скажу проще вы очень сильно заблудились в своём познании web-а. Вероятно вы на 99%+ самоучка.
                        Такое же впечатление, да. «Синдром самозванца» наоборот :)


                    1. indestructable
                      13.11.2018 15:45
                      +4

                      Хм, а вебсокеты умеют в request-response flow? Понятно, что эмулировать можно, но по дефолту?


                      А перестраивать всю архитектуру под двунаправленные серверные потоки данных — это намного сложнее, чем AJAX.


                      1. mayorovp
                        15.11.2018 12:22

                        И главное — придется забыть про хранимки в СУБД, ибо они не умеют в нормальные двунаправленные потоки данных :-)


  1. HerrDirektor
    12.11.2018 18:19
    +5

    А мне нравится фуллстек. Да, я точно так же осознаю, что нельзя «объять необъятное», но меня это никак не смущает. Ровно как и «не помню про IDisposable без гугла» (кстати, не помню, ага). Я вообще много времени провожу в гугле при разработке чего-либо. Мне нравится учиться. Нравится смотреть, как программируют другие, нравится думать и сравнивать, почему вот этот подход лучше вот этого.
    Никогда не считал зазорным спросить совета у более опытного разработчика в текущей технологии, не испытываю по этому поводу никаких комплексов.

    Я тащусь от того, что в общем-то не ограничен языком или платформой. Ннннада .NET? Не вопрос (asp, xamarin, wpf). Запилить бэкенд на PHP? Легко. CSS к сайтику? И это тоже! Что здесь? Си и Linux? Давайте сюда, сделаем. Что это? Делфи? Воу, какой раритет! Ну ОК, давай в Делфи.
    И так далее и тому подобное.

    Да, я совершенно точно уступаю синьору в любой из этих платформ, в некоторых областях даже с натяжкой могу назвать себя «миддл» (а скорее «продвинутый джун»), но черт возьми… Это настолько удобно и комфортно, что даже не знаю с чем сравнить!

    Можно в одиночку ненапряжно тащить некрупные проекты, не завися от других людей (и получать все деньги тоже в одного, что весьма приятно).


    1. BigDflz
      12.11.2018 18:49

      могу только отказаться от второго абзаца, просто не было необходимости, а остальное как с меня писано :)


    1. akryukov
      12.11.2018 21:16

      Ннннада .NET? Не вопрос (asp, xamarin, wpf). Запилить бэкенд на PHP? Легко. CSS к сайтику? И это тоже! Что здесь? Си и Linux? Давайте сюда, сделаем. Что это? Делфи? Воу, какой раритет! Ну ОК, давай в Делфи.

      Что у вас за место работы, если приходится вот так вот скакать по технологиям? Или вы фрилансер?


      1. VolCh
        12.11.2018 22:25
        +3

        А почему обязательно «приходится»? :)


      1. HerrDirektor
        13.11.2018 05:31

        Не совсем фрилансер. Просто за 20+ лет кодинга за деньги я наработал весьма солидную базу клиентов и (самое главное) — некий авторитет («широко известен в узких кругах»), благодаря которому не мне нужно искать клиентов на свои поделки, а наоборот, всегда стоит очередь на мои услуги. Уже закрытые и сданные как правило ничего не требуют, но есть десятка полтора, которые время от времени обновляются («на обслуживании»). За деньги конечно.

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

        Кому-то нужен специфичный сайтик (не визитка, не интернет-магазин, и не шаблон WP/Drupal/итп, такое я не беру, неинтересно). Здесь как правило PHP/JS/CSS/HTML. Если нужен специфичный дизайн, то я привлекаю стороннего покемона (с художественным развитием у меня не очень).

        Иногда приходится делать продукт для интранета (с подъемом серверов, блэкджеком и прочим).

        И в чужих древних разработках (пресловутые Делфи/VB/CBuilder лохматых годов) приходится покопаться — ПО написано 20 лет назад, поддержки уже давно нет, а поменять что-то нужно (чаще прикрутить что-то к чужому коду быстрее и дешевле, чем переписать заново, проекты попадаются далеко не уровня «hello, world»).

        Linux — это больше хобби, но случалось несколько раз писать за деньги и под него.

        Почему я, а не «команда проф. разработчиков»? Потому что малый и средний бизнес как правило не понимает 90% того, что лидеры/«эффективные менеджеры» этих команд им говорят, и (главное) не тянут по финансам.

        Скажем, переговоры по «микро-CADу» с разными командами заняли в итоге 4 месяца(!) и цены на готовый продукт начинались от 5 млн (в рублях разумеется), со временем разработки в 4-6 месяцев.

        Я не особо напрягаясь сделал чуть больше, чем за квартал и за миллион. При этом вечерами ведя пару мелких проектов.
        Не потому, что я круче упомянутых команд, а потому, что я мог по 2-3 дня подряд ничего не писать, а ходить хвостом за инженерами, для которых этот продукт делался.
        Узнавать, что им нужно, помимо унылого ТЗ, как будет удобно, как вообще это работает с их точки зрения.
        В результате, как минимум треть ТЗ ушла в помойку, а процесс разработки ускорился невероятно из-за того, что отпала необходимость реализовывать ненужные фичи, которые «вроде как нужны», но на самом деле никто их никогда бы и не использовал.

        В общем, такой подход к разработке — это еще один очень важный скилл в жизни fullstack :)


        1. Quilin
          13.11.2018 17:55
          +2

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


        1. Nookie-Grey
          15.11.2018 18:32

          Напишите публикацию, хочу поднять вам карму (а без публикаций +4 это максимум)


          1. HerrDirektor
            15.11.2018 19:34

            Публикацию «Почему быть фуллстеком клево»? :)
            Если народу будет интересно, почему бы и нет? :)


    1. boblenin
      12.11.2018 23:44
      +1

      Вот такой подход — идеальный для найма.

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

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

      В целом не знаю как там насчет синьора, но эти навыки по крайней мере по моей субъективной шкале стоят выше чем доскональное знание всех стандартных хранимых процедур того же Sql Server. Приоритет — это сделать софтину, а не родить инженерный шедевр.


      1. HanryCase
        13.11.2018 13:53

        Согласен. Если ты занимаешься беком, то и в фронте должен хоть немного, но соображать и наоборот. Хороший инженер должен хоть немного но разбираться в смежных технологиях.
        Я не встречал спецов которые знают только Java.Обычно спец идет под стек, кругозор и умение мыслить нужными категориями — определяют.
        Страшно представить сферического Java кодера который 10 лет занимается только чистой Java и Spring_ом не зная ничего о фронте.


        1. boblenin
          13.11.2018 17:27
          +2

          Увы, такое не редкость. Доводилось работать с людьми 15 лет занимающимися postgresql и ничем больше (не потрудившимися даже выяснить, что существуют системы контроля версий), с теми кто 10 лет пишет одно приложение на ASP.NET и не замчает то, что мир несколько изменился за это время. Недавно с проекта у нас ушел человек, толковый но вбивший себе в голову, что хочет работать только с CRM Dynamics, не хотел смотреть ни в сторону SalesForce ни в сторону разработки ни devops.


      1. HerrDirektor
        13.11.2018 19:26
        +3

        Приоритет — это сделать софтину, а не родить инженерный шедевр.

        Именно так.

        Кстати, когда я начинал свой путь (это когда за деньги), то разумеется смотрел, как это делают другие корифеи.
        Поначалу меня всегда удивляло, что узкоспециализированное ПО (для одного человека или небольшой группы/команды) имеет «убогий дизайн».
        Ну реально, вместо лаконичного и «уже вроде как привычного» от билгейца — какое-то малопонятное со стороны нагромождение UI-элементов, хоткеев и вообще, без бутылки не разберешься (под DOS вообще были шедевры почище vi).

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

        Первым проектом после осознания факта, что узкоспециализированное ПО должно быть в первую очередь функциональным и удобным, а только потом «красивым», была система учета/управления библиотекой (заведение с бумажными книгами) под винду (год 98й однако был).
        После изменения «красивенько» на «удобненько», приложение приобрело несколько страшноватый вид, но скорость работы трех девчонок повысилось где-то в 5 раз.
        Т.е. UI было сделано так, как им было удобно. Хоткеи такие, какие им были удобны. Каждое движение, каждое нажатие было максимально функциональным — от автодобавления строк, до сортировок и сохранения.

        Скажем, ну кто бы мог подумать, что девчонкам удобно нажать Ctrl+T n раз (режимы сортировок) и чтобы она (сортировка) не менялась в основном окне, а всплывало поверх формы, не загораживая основной список и висело там до тех пор, пока хоткей зажат?
        Да в жизни бы до такого не догадался, а девкам, подсказавшим, как им было бы удобно ну очень нравилось — кинули взгляд, ага, здесь то, а здесь то; отпустили хоткей и дальше работать. На все про все уходило в пределах 1-2с, когда при «обычной» сортировке (когда все в одном списке) приходилось листать по 10 (а то и 30с), да еще запоминать большие объемы данных, т.к. перед глазами не было предыдущих данных.

        И таких нюансов при плотном контакте с будущими пользователями — вагон и две тележки сверху.
        ИМХО, только такой подход реализует тезис «вам шашечки или ехать» :)


        1. Estee
          14.11.2018 17:53

          До такого действительно невозможно додуматься самостоятельно. А как сами девочки к такому решению пришли? Из какого-то старого ПО приползло?


          1. HerrDirektor
            14.11.2018 18:57

            Нет, это сугубо их идея. Простая как три рубля, внезапная, как понос :)
            Что-то вроде того:

            — Слух, а можно сразу две сортировки делать?
            — Это как и зачем?
            — Ну я вот тут смотрю, а когда переключаю, нифига не понимаю, что и откуда. Как-нить можно сразу и такую и такую?
            — [сразу начинаешь думать, как перекроить UI, чтобы еще что-то влезало, на 14" с 1024х768 особо не разбежишься, а один из трех мониторов вообще в 800х600 только умеет] Ээээ… Нууу… А куда ее вставить-то тут, без того экран занят?!
            — Да не надо вставлять, пусть тут [тык в экран пальцем] квадрат вылазит с ней, пока держу клавиши и все.
            — Бинго!


            Ровно как и перенести режимы сортировок на одну клавишу (слепым методом печати они не владели, т.е. куча хоткеев для одного и того же было для них не очень удобным решением).
            А в таком виде (Ctrl+T) — клац = одна сортировка, клац-клац = другая, клац-клац-клац = третья…

            А уж сколько денег было поднято на простецкой проге для сдачи данных/отчетов в налоговую до прихода в массы «1С Налогоплательщик» (да и после тоже, т.к. скорость внесения данных в мою поделку была без преувеличения на пару порядков выше)…
            И все это благодаря тому, что кривенький и косонький UI был на самом деле выверен до последнего тыка в клавиатуру, все заточено под максимальную скорость ввода.
            Закончилась лафа с этим ПО только после внедрения на предприятия и частникам всевозможных «Бухгалтерий», «Кадров», где эти отчеты формировались на автомате.


  1. vsapronov
    12.11.2018 18:26

    Все смешалось в доме Облонских: стеки, языки программирования, доменные области. Не понятно на счет чего именно из этого вы пишите.


    Во взять, например, только языки.
    Есть, условно говоря, три класса языков: нативные (c и c++) — очень близко к профессору, высокоуровневые ОО (java, c#, scala, kotlin), высокоуровневые функциональные (f#, haskel). Можно еще, скажем выделить высокоуровневые небезопасные (python, javascript).
    Внутри класса языки очень легко менять. Основное время должно уходить не на чтение спеки, а на познавание тулов окружающих язык (они то точно сильно разные). Но это все при условии, что вы пробовали писать на этом языке уже когда-то. Переключение между языками из разных парадигм больно и дорого. Мозгу нужно выстроить синоптические дорожки...


    Вообще работать одновременно на разных языках — это очень интересно. Это расширяет кругозор невероятно. Никогда не интересовались, как получилось, что Java стала таким говном? А мне это очевидно (как и то, что Java — говно, как язык) — программисты, создатели языка и пользователи, не смотрели по сторонам и не увидели что происходит в C#, когда они поняли что надо пилить фичи, то уже было слишком поздно — народ разошёлся по Scala'ам, Kotlin'ам и Clojure'ам.
    И много такого. Обладая таким опытом можно предсказать куда идет развитие. Тот, что в Scala и C# появится enforced null safety, тем кто пробовал на F# было понятно очень давно. В C# уже объявили и в Scala тоже будет.


    1. springimport
      12.11.2018 18:57

      А что вы думаете на счет php и php 7.2?


      1. vsapronov
        12.11.2018 20:05

        На сколько знаю он ОО, точно высокоуровневый — нет управления памятью. Как там с контролем типов во время компиляции? Раньше не было и это делало его небезопасным языком — без отрицательной коннотации, просто надо другие практики использовать — тотальное покрытие тестами… А как в современном PHP даже и не знаю.


        1. VolCh
          12.11.2018 22:28

          Контроля типов практически не было кроме ручного, сейчас есть времени исполнения на уровне сигнатур функций/методов, обещают завезти на уровне свойств.


          1. vsapronov
            13.11.2018 06:19

            Ну как бы тогда небезопасный. Нужно тотальное модульное тестирование. Это не хорошо и не плохо, но требует от мозга изменения подхода скорее всего на test first, потому как иначе не выжить. Поэтому переключения скажем C# <-> PHP не будут гладкими. В C# мы доверяемся компилятору и забиваем тестировать автоматизированными модульными тестами очень часто, зато больше тратим времени на проектирование системы типов в явном или неявном виде.


            1. Druu
              13.11.2018 10:39
              -1

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

              Замена типизации тестами — самое глупое решение, которое вообще можно себе представить. Лучше на динамике вообще не писать в таких случаях.


            1. VolCh
              13.11.2018 11:11
              +1

              Всё зависит от требований. Я предпочитаю тестировать логику, а не что будет, если в метод передадут целое вместо строки.


              1. vsapronov
                13.11.2018 17:25

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


                1. Fesor
                  13.11.2018 20:41
                  +2

                  функциональные модульные тесты, чем просто формальные модульные.

                  ммм… не поделитесь определением? Что есть что?


    1. i0000
      12.11.2018 19:23
      -3

      Все смешалось в доме Облонских: стеки, языки программирования, доменные области. Не понятно на счет чего именно из этого вы пишите.


      Вот только одно не смешалось — неизменно неправильное написание программистами слова «пишИте».


      1. vsapronov
        12.11.2018 20:01

        Каюсь — абсолютно безграмотен.


    1. maxzh83
      12.11.2018 20:10

      народ разошёлся по Scala'ам, Kotlin'ам и Clojure'ам

      Никто никуда не разошелся, основная масса как сидела на Java, так и сидит. Посмотрите на вакансии, все станет понятно. Из перечисленного только Котлин пока имеет перспективу и держится на хайпе. И тут тоже в основном из-за Андроида, где до недавнего времени была Java 6. Пик интереса к Scala уже прошел и по сути осталась только одна область (big data), где Scala — почти стандарт. Надеюсь, что с выходом версии 3, интерес к ней снова появится. Ну, а на clojure как сидели энтузиасты, которых немного, так и сидят.
      К слову, пример со Scala очень показательный. Язык очень интересный сам по себе (в вашей терминологии «не говно»), но, в то же время, его очень сложно использовать в большом проекте. Во-первых, на нем одно и то же можно написать сильно по разному (в стиле Java+ и в стиле Haskel с линзами и монадами), во-вторых, создатели языка периодически кладут прибор на обратную совместимость и все ломают. Вот и получается, что когда в проекте более десятка разработчиков, то выбирают старую многословную и тупую Java.


      1. vsapronov
        12.11.2018 20:34
        -6

        Посмотреть вакансии где?
        Я смотрю на вакансии регулярно. Более того, ровно год назад я менял работу и получил 4 оффера в New York City. На Java пишут бэкенды только убогие дебильные подобные индо боди шопам банки. И даже из них далеко не все. Все нормальные конторы уже какое-то время назад ушли на Scala. А все нормальные девелоперы ушли в которые, где можно писать на нормальных языках. Ни один из известных мне хороших программистов не пишет на Java. А я поработал тут и в банках и не в банках.


        Не поймите меня неправильно — я хорошо вижу косяки в Scala. И, честно говоря, думаю что они не будут пофикшены. Так что ждем нового языка. Ну или Kotlin прямо станет очень крут. Это только касаясь JVM. Не говоря о других.


        1. mkshma
          12.11.2018 21:25

          Зайдите на Glassdoor, вбейте Java в NYC. Увидите около 8800 вакансий. Вбейте Scala. Увидите примерно 1400, из которых в 2/3 случаев Scala упоминается в контексте «будет конкурентным преимуществом, но не более». У вас рассинхрон с реальностью.


          1. vsapronov
            12.11.2018 21:45
            +1

            У меня рассинхрон только с вашей метрикой: кол-во вакансий на Glassdoor. Не средняя з.п., не перспективность компании умноженная на кол-во предложенных стоков. Нет — это все фигня, нам нужно больше вакансий. На Glassdoor — не на LinkedIn — LinkedIn тоже фигня, тем более в России запрещен.
            Рассинхрон с реальностью говорите, ну ну…


            1. mkshma
              12.11.2018 22:26

              LinkedIn — онда большая спам-помойка. Не знаю кто там в здравом уме ищет работу.


              1. vsapronov
                12.11.2018 22:30
                +2

                У меня было 4 оффера в декабре 2017 по результатам примерно 20 начатых собеседован й. Все через LinkedIn. Могу показать список компаний. Единственное, что я платил за premium аккаунт, пока искал работу.


              1. irsick
                13.11.2018 03:19

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


              1. Stas911
                13.11.2018 05:34

                Я там бывает ищу, а что не так?


        1. Milein
          12.11.2018 22:14

          Если в вашем сообщении заменить «писать на Java» на «пользоваться Windows», то из первого обзаца получится классический вендекапец.

          Не знаю откуда у вас такая ненависть к Java (под дулом пистолета писать на ней заставляли что ли?), но пророчить ей смерть пока преждевременно рано.
          И да, на LinkedIn джавистов тоже ищут. А что-то там перемножать на стоки я не хочу, вам это нужно, вы и доказывайте что джава мертва.


          1. vsapronov
            12.11.2018 22:27
            +1

            Я не доказываю, что она мертва. Где я такое говорил?
            Я говорю язык Java — говно.
            Существует много вещей которые говно, но они при этом живее всех живых. Чувствуете как вы манипулируете и подменяете понятия?

            Даже если углубиться в разговор о том, что Джава жива, то первое что я слышу это не про хороший дизайн языка а вполне такой рыночный аргумент — вакансии. Даже этот аргумент не могут нормально приготовить:
            — Вакансии! — Что вакансии? — 8800. — Что 8800? — Java жив, Java будет жить!
            Дискуссия на уровне анекдота про Петьку. Если мы говорим про рынок, то приведем и другие метрики, более важные, чем кол-во требуемых визовых рабов в одном конкретном городе.

            Опять же ^ это все оффтоп. Это никак не влияет на тот факт, что дизайн языка — серьезно устарел и в общем-то говно в 2018.


            1. Milein
              12.11.2018 22:42
              +1

              Вы написали «посмотреть вакансии где» — вам написали конкретные цифры, где эти самые вакансии есть и их дофига и больше.

              А вот вы ж тоже нифига не доказываете. «Все ушли на Scala».
              Где цифры, где метрики о которых вы говорите? Где те самые оценки перспективности компаний и стоков? Шума много, фактов ноль, а цифры которые приводят оппоненты в споре это анекдот теперь.

              Пока что анекдот это россказни о том что все с Java куда-то ушли.


              1. vsapronov
                12.11.2018 22:44

                Я не думаю, что вот прямо должен доказывать что-то.
                Хорошо, не ушли — все прекрасно.

                Еще раз, дизайн языка Java — говно.


                1. Milein
                  12.11.2018 23:03
                  +1

                  А я не зря сравнил с вендекапцом. Один и тот же детский сад.
                  -Java Винда говно! Все с неё уходят! Только тупым бодишопам домохозяйкам она нужна! Все нормальные люди уже ушли!
                  -Пруфы, Билли! Пруфы в студии!
                  -Да ничего я не буду показывать! Но Java винда всё равно говно!


                  1. vsapronov
                    12.11.2018 23:51

                    Еще раз, вы смешиваете понятия «смерти» и «говна». Я не говорю, что умерла, я говорю, что говно. То, что люди уходят на Scala и на Kotlin — это и ежу понятно, но если вдруг вы — не ёж, то компании Twitter, Amazon, Google (Android) отказываются (или уже отказались) от Java. Все эти программисты перешли с Java на другие jvm языки. Даже эти 3 компании — это очень много.
                    А вот то, что дизайн языка — говно не хотите обсудить? Будет много пруфоф, с фактами, метриками как Java добавляет фичи на 10 лет позднее, чем их просили и добавили в другие языки.


                    1. anprs
                      13.11.2018 11:59

                      Как человек только переходящий от нативного к высокоуровневым — реквестирую подробный ответ почему говно


                    1. guai
                      13.11.2018 21:13

                      так скала с котлином тоже говно, разве нет?


                    1. pawlo16
                      13.11.2018 21:41

                      Вот только Google и Amazon перешли не на «другие jvm языки», а на Go. Потому что, внезапно, сервисы, написанные на Go, обходятся в 10 раз дешевле аналогичных сервисов на Java-подобных языках


                  1. zagayevskiy
                    13.11.2018 14:20
                    +2

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


            1. maxzh83
              12.11.2018 22:48
              +2

              Я не доказываю, что она мертва. Где я такое говорил?

              Хм, смотрите
              когда они поняли что надо пилить фичи, то уже было слишком поздно — народ разошёлся по Scala'ам, Kotlin'ам и Clojure'ам.

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


              1. vsapronov
                12.11.2018 23:16
                -1

                Ну давайте чуть поясню, чтобы у вас не возникало умозаключений.
                Народ — не в смысле вся нация или население все страны. Ведь вся нация не умеет программировать.
                Народ — не в смысле все программисты вообще, ведь не все из них в принципе пишут для jvm.
                Народ в смысле — программисты с которыми я знаком и поддерживаю отношения. И я наблюдаю, что ни один сеньерный из них не остался на Java. И я думаю, что серьезные контрибьюторы сбежали также как и мое окружение и дерьмовость языка+отсутствие развития — главная причина.
                Вот даже такой пример могу привести — на чем пишет свои сервера Twitter? Они не только сами сервера пишут на Scala, но также сделали платформу для создания серверов для всеобщей пользы. Это значит, что Java сообщество потеряло не только всех программистов Twitter, но и серьезных контрибьюторов, которые могут сами запилить http framework. И таких примеров много: Android еще одна экосистема с целой армией сбежавших программистов среди которых безусловно есть крутаны, но увы — контрибьютить они будут не в Java.


                1. maxzh83
                  12.11.2018 23:33
                  -1

                  Народ в смысле — программисты с которыми я знаком и поддерживаю отношения.

                  Ясно, так себе статистика.
                  на чем пишет свои сервера Twitter?

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


                  1. vsapronov
                    12.11.2018 23:38

                    Статистика лучше, чем 8800 на Glassdoor.

                    Первый и последний раз работаю для вас гуглом: github.com/twitter/finatra


                    1. maxzh83
                      13.11.2018 00:00

                      За ссылку спасибо, думал там что-то серьезное. На деле очередная поделка с хреновой документацией и без коммьюнити, которая интересна только твиттеру и то непонятно в каком объеме. Не законтрибьютил твиттер на Java, ну ничего-ничего.


                      1. vsapronov
                        13.11.2018 01:26

                        Я читаю документацию. У вас все нормально с гуглом?

                        Я не работаю на Twitter. Finatra очень популярен вне Twitter'а.

                        Не до конца понимаю ваш посыл: все, кто работаю в Twitter'а — не программисты? Или очень плохие? Что ж вы тогда про Android разрабов думаете?


                        1. maxzh83
                          13.11.2018 10:13

                          Не до конца понимаю ваш посыл: все, кто работаю в Twitter'а — не программисты? Или очень плохие?

                          Вы его вообще не поняли. Посыл такой. В твиттере как и в других больших компаниях есть зоопарк технологий. Кроме этого, есть проекты, которые пилятся под свои нужды по разным причинам. Грубо говоря, нужна админка для чего-то, в которую будут ходить десяток человек в день. Людям дали свободу, люди запилили фреймворк на коленках и выложили в github. При этом тут же на этом фреймворке появляется штамп «ого, он используется в Твиттер», как именно обычно не уточняется. Дальше этот проект может быть и правда успешным и уйти в массы, а может так и остаться проектом под конкретные нужды. Посмотрите на Google, они открывают и хоронят проекты постоянно.


                1. fcoder
                  13.11.2018 18:05
                  +2

                  Ну давай сравним твиттер с 3000 сотрудников и, например, дойче банк, со 100000. Не все они, конечно разработчики, но де-факто весь финансовый сектор использует джаву и усиленно в неё вкладывается. Три миллиарда устройств опять же, не могут ошибаться. Да и большая часть техноэнтерпрайзов вроде IBM со слоганом «ни один менеджер не был уволен за выбор Java» — тоже.
                  Поэтому, с точки зрения количественного сравнения — по вакансиям, по количеству денег в индустрии, скала-стартапы выглядят не просто маргинальными нищебродами по сравнению с джава-миром, а находятся где-то на границе погрешности измерений.

                  Теперь поговорим за качество. Ну и зачем мне технология, где минорный апдейт случается раз в три года и при этом ломает обратную совместимость? Тулов по сравнения с джавой… обнять и плакать. Зачем искать редких сложно-заменяемых специалистов с зарплатой на 30% выше рынка, если за эти же деньги можно нанять 3 легко заменяемых аутсорсера из индии/восточной европы, которые (под присмотром тимлида/архитектора) будут перформить как минимум не хуже? А код при этом будет написан со всем известными со школьной скамьи паттернами, в которых элементарно разобраться, вместо этой скала-зауми с ФП и с кастомными операторами «ЖОПА», для которых нужно phd, чтобы разобраться.

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


      1. JuniorIL
        13.11.2018 11:21

        +1
        Скала хороша только если жить где-то в Тель Авиве, Нидерландах или Берлине, где реально есть выбор работы на Скале. 3 года писал на Скале, захотел работать по удаленке и уехать из богатого на хайтек района — пришлось вернуться на Джаву. А теперь как ответственный за проект я тоже буду бояться выбрать Скалу; я то на ней быстро напишу, а вот людей в команду не найду.


    1. tuxi
      12.11.2018 20:30

      "Java сидит на берегу реки и с философским прищуром смотрит как мимо проплывают трупы всяких #"


      1. vsapronov
        12.11.2018 20:41
        +2

        Ну да, ну да. Главное никогда не признавать ошибок. Продолжаем упорно говорить, что "interface methods вот прямо ноу хау, вот прямо на острие дизайна яп, ни один язык такого не делал раньше".
        Ждем null safety в течении следующих 40 лет.
        Ну а всякие там records и pattern matching — это внукам, надо еще чтобы наука это придумала.


        1. tuxi
          12.11.2018 21:21
          +1

          «Счет на табло» тем не менее. А хоронить java начали давно между прочим. А она сидит и смотрит как проплывают мимо… :) Потому что Java — это удачный баланс для энтерпрайза (да и не только для него) между строгостью и фривольностью.


          1. vsapronov
            12.11.2018 21:48
            +3

            Мой счет у меня в банке. Программирую на Scala, C# и F#. На Java не пишу более двух лет.

            А вы про какое табло?


            1. maxzh83
              12.11.2018 22:36

              Программирую на Scala, C# и F#. На Java не пишу более двух лет.

              После этого люди в круге начали аплодировать. А если серьезно, то и что? Я не пишу на C# уже лет 7-8 и ни разу не пожалел, но это тоже ничего не доказывает.
              когда они поняли что надо пилить фичи, то уже было слишком поздно.

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

              Язык это же не только синтаксис, а еще инфраструктура, коммьюнити, инструменты и т.д.


              1. vsapronov
                12.11.2018 22:42

                Ни с чем не спорю из того, что вы сказали. Все правильно.
                Я вообще ни разу не за МС. Они вообще знатные умельцы профукать все и еще и другим жизнь испортить.
                Так вот я и говорю: хорошие программисты не хотят писать на Java — они увидели, что можно в Scala и в Kotlin и всё — они потеряны для Java. И все коммьюнити не может ничего без основных контрибьюторов.


                1. tuxi
                  12.11.2018 22:55

                  Так вот я и говорю: хорошие программисты не хотят писать на Java — они увидели, что можно в Scala и в Kotlin и всё — они потеряны для Java. И все коммьюнити не может ничего без основных контрибьюторов.

                  это как то… как то уж очень категорично


                  1. vsapronov
                    12.11.2018 23:23

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


                1. maxzh83
                  12.11.2018 22:56

                  хорошие программисты не хотят писать на Java — они увидели, что можно в Scala и в Kotlin и всё — они потеряны для Java

                  Года 3-4 назад прошел два курса Одерского по Scala, написал на ней домашний проектик, который до сих пор работает, хотел было устроиться на Скалу по работе, но не получилось. Спустя несколько лет успокоился и теперь от предложений на Scala отказываюсь, пишу на Java. От Scala осталось одно разочарование, о котором писал выше. Котлин тоже немного попробовал. Да, неплохо, но и не настолько хорошо, чтобы ради синтаксических плюшек менять работу (тем более вакансий на котлине совсем мало пока). Может, правда, я не очень хороший программист, поэтому не потерян для Java.


                  1. vsapronov
                    12.11.2018 23:27

                    Какой город — страна? Этим многое определяется. До некоторых уголков планеты то, чт о пишут в интернатах доходит с задержкой. Вангую правильную потребность в Kotlin через год-два по всей России. Сейчас все конторы в NYC нанимают, чтобы совладать со своей Андроид кодовой базой. Но уже и звучит Kotlin for micro services, потому что корутины и потому что люди хотят писать на одном языке все (сомнительное желание). Так вот, этот тренд обязательно дойдёт до российских боди шопов и все…


                    1. Druu
                      13.11.2018 03:13

                      Вангую правильную потребность в Kotlin через год-два по всей России.

                      Котлин — говно. Много косяков в дизайне. Не взлетит, даже не надейтесь. Ни в России, ни где-либо еще.


                      1. vsapronov
                        13.11.2018 03:15

                        А какие? Я не говорю, что их нет — скорее интересно узнать.
                        Я слышал, что они там сознательно отказались от pattern matching. А где еще накосясили?


                      1. AnutaU
                        13.11.2018 10:17

                        Много косяков в дизайне. Не взлетит, даже не надейтесь.

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

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


                        1. Druu
                          13.11.2018 10:40

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

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


                          1. AnutaU
                            13.11.2018 10:58

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


                          1. BingoBongo
                            13.11.2018 12:57

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


                            1. Whuthering
                              13.11.2018 13:05
                              +1

                              Rust?


                              1. BingoBongo
                                13.11.2018 13:30

                                А как же ООП?


                                1. Fesor
                                  13.11.2018 20:47

                                  Когда я придумал термин ООП я не имел ввиду C++ (с) Алан Кей.


                                  Ну и если мы говорим про провославное ООП и Rust: https://github.com/actix/actix


                                  1. BingoBongo
                                    13.11.2018 21:45

                                    Наследование данных, виртуальные деструкторы?


                                    1. Fesor
                                      13.11.2018 23:44

                                      Наследование данных

                                      composition over inheritance и все в таком духе.


                                      Интересный момент — даже Страуступ признает что добавление protected в плюсы было ошибкой (очень легко неявное поведение организовать, всякие LSP нарушить, контракты сломать)


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


                                      Опять же, идеям "ооп" в плюсах лет больше чем это самое ООП существует (Хоар классы описывал задолго до того как Алан Кей сказал кому то что он "ООП делает")


                                      Lisp более ОО чем C++.


                                      виртуальные деструкторы

                                      Именно деструкторы? И именно виртуальные?


                                      Зачем вам деструкторы, если за вас компилятор расставит где почистить ресурсы, высвободить память и т.д.


                                      1. BingoBongo
                                        14.11.2018 01:06

                                        composition over inheritance и все в таком духе.
                                        Не знаю, я нашел обсуждение на хабре, из него вытекает, что в rust'е есть наследование поведения, но не данных: habr.com/post/309968/#comment_9805712
                                        Зачем вам деструкторы, если за вас компилятор расставит где почистить ресурсы, высвободить память и т.д.
                                        А как же неуправляемая память? Возьмите OpenGL: текстуры, буферы, шейдеры — все они создаются в видео-памяти — вряд ли rust будет ее разруливать сам. Ну и опять же, чтобы не вызывать всякие file.close(), socket.close() и т.д. Или как там дела с этим обстоят?


                                        1. Fesor
                                          14.11.2018 13:21

                                          но не данных

                                          поясните что вы имеете ввиду. Мне кажется что для вас "расширение данных" это просто расширение структуры. Что-то типа сишного варианта:


                                          typedef struct foo {
                                            int a;
                                          } foo;
                                          
                                          typedef struct bar {
                                            struct foo;
                                            int b;
                                          } bar;

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


                                          А как же неуправляемая память?

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


                                          Ну и да — деструкторы в rust все же есть


                          1. Nalivai
                            13.11.2018 17:17

                            Мне кажется что вы не очень понимаете зачем нужны плюсы, почему они такие, и в чем их кайф.


                            1. pawlo16
                              13.11.2018 17:50
                              -1

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


                      1. zagayevskiy
                        13.11.2018 14:24

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


            1. tuxi
              12.11.2018 22:59

              А вы про какое табло?

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


              1. vsapronov
                12.11.2018 23:30
                -2

                А я про реальные счета. Моя з.п. как Scala специалиста на 27% выше з.п. как Java-специалиста. И еще я могу приходить в офис с собакой (ее надо завести еще) и у меня неограниченное кол-во дней отпуска.


                1. tuxi
                  12.11.2018 23:34

                  На зарплаты Java разработчиков тратится прилично больше денег нежели чем на зарплаты Scala разработчиков. Поэтому это нифига не аргумент. Но если что, лично я рад за Вас :)


                  1. vsapronov
                    12.11.2018 23:41
                    +1

                    Ну что там где тратиться — я на своем счету не почувствовал. А почувствовал то, что сказал.

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


                    1. tuxi
                      13.11.2018 00:19

                      Никогда не интересовались, как получилось, что Java стала таким говном? А мне это очевидно (как и то, что Java — говно, как язык)

                      «Начали за здравие, закончили за упокой».


                      1. vsapronov
                        13.11.2018 01:37

                        Не понял, вы к чему? Я думаю, я последовательно говорю, что Java как язык говно в 2018. Думаю, что тема: разработка на более чем одном языке играет существенную роль в приобретении этого понимания.
                        И еще есть уход программистов с Java на сколько он велик, можно судить по-разному, но то, что он есть — это ясно всем неидиотам.


                        1. tuxi
                          13.11.2018 10:15

                          Вы знаете, сколько я видел настоящих разработчиков на java, практически ни один из них не хэйтил другие языки. При этом любой из них по факту «фуллстек», так как «если припрет» он сможет на java сделать все. И фронт и бэк, и параллельные вычисления, и просто большие вычисления. И дескопную программу написать. Это самодостаточная система, понимаете?

                          Вот Вы обвиняете Java в том, что к ней не так быстро прикручивают новые идеи. Легко обвинять экосистему которая плодотворно развивается с конца 90-х годов, на которой написаны сотни тысяч _ПО НАСТОЯЩЕМУ_ больших бизнес приложений. Это уже часть мира, без которй не прожить. Большая «Экосистема» должна быть обратно совместимой как минимум. Новые ЯП с новой семантикой как раз и появляются по причине того, что ЯП ставшие стандартами отрасли не могут позволить себе менять кардинально свой стандарт на каждый новомодный чих и пых.

                          Я использую java с 2002...03 года. Я использовал реализацию comet уже тогда, когда слово «web-socket» еще не слышал практически ни один фронтендщик, да собсно говоря и node.js еще не было. Я уже делал реальные проекты и бэка и фронта только на java и они до сих пор работают. Представьте себе на сервере с 2гигами памяти, 1 ядром и db на нем же.

                          Поэтому, когда я писал про берег реки, поверьте, я писал о личном опыте. Много воды утекло с тех, а java есть и еще очень долго будет. Просто потому, что это реально удачный ЯП. Просто потому, что она заставляет соблюдать высокий стандарт разработки. Просто потому, что выстрелить себе в ногу на java достаточно проблематично. Даже если какому нибудь джуну очень захочется.

                          А новые языки всегда будут. И адепты нового языка будут говорить, что Scala это прошлый век, что она не реализует новые идеи.

                          Хайп всегда проходит, остается сухой остаток. Вопрос его количества. И у java он один из самых больших за последние 20..30 лет.


                1. Stas911
                  13.11.2018 05:38

                  Про неограниченное количество дней отпуска слышал, что такое декларируется некоторыми компаниями. Мне просто интересно — зачем вообще нужен бизнесу человек, без которого можно легко обойтись больше пары недель?


                  1. vsapronov
                    13.11.2018 06:12

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

                    Кроме того, как вы себе представляете работу программиста? Собственными руками на продакшн серверах запускает только что написанный код ежеминутно? В нормальном процессе разработки отсутствие одного человека = отсутствие новых фич в какой-то области в течении этого времени, и то только в том случае если он обладает уникальными знаниями.

                    Многие бизнесы на западе уже поняли, что программист должен быть счастлив и доволен и именно тогда он будет наиболее продуктивен. Работа от «забора до обеда» не приносила ничего хорошего ни в одном интеллектуальном виде деятельности. Немного забавно, правда, что в основном компании которые это осознали в полной мере — это своего рода стартапы или успешные постстартапы этого десятилетия, и как раз в такого рода стартапах в основном новые нормальные яп, а не Java — ну вы поняли…


                    1. Stas911
                      13.11.2018 06:27

                      А разве такие условия только программистам полагаются? Кроме них еще полно всякого разного народу в компаниях.

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


                      1. vsapronov
                        13.11.2018 06:54

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

                        По месяцу четыре раза в год (31% от full time) — может быть и уволят. Здесь employment at will. Но с другой стороны я стараюсь работать 4 дня (20% от full time) и никаких проблем с этим нет. Правда у меня рваный рабочий темп — не имею работать с одинаковой скоростью.


    1. Nalivai
      13.11.2018 17:02

      Эк вы как легко С++ и С в одну кучу сбросили.


  1. Whuthering
    12.11.2018 18:39
    +4

    Когда я слышу старых мудрых засранцев с их мантрой «язык программирования не важен», сразу же вспоминаю не менее старую цитату:

    «Человек, владеющий фортраном, может писать на любом языке, но делать это он будет как на фортране».


    1. yokotoka
      12.11.2018 19:00

      Я лично смотрел код GRPC клиента на пайтоне… настолько уродливо, неидиоматично и бездарно написанного кода я ещё не видел. Видимо его писал чувак, которому «все равно на чем», но он писал только на java или плюсах, что и отразилось на результате. С тех пор я не воспринимаю серьёзно гуггл как передовую технологическую компанию и их истории про «найм лучших» вижу скорее как фейк и самообман.


      1. shiru8bit
        12.11.2018 19:11

        Отразилось на результате — не работает как надо, или просто код выглядит непривычно?


        1. yokotoka
          12.11.2018 19:21

          Ну, написать на питоне write-only код и закатывать солнце вручную, не ознакомившись с базовыми возможностями стандартной библиотеки— это не просто «непривычно», это даже автоматический линтер не должен пропускать, не говоря что это идёт вразрез с дзеном питона. Скорее похоже что код сгенерели из плюсовых исходников автоматически и заинлайнили кучу всего. Но нет, вроде, реальные люди писали. К слову, работает он так же как и выглядит — через раз. Это 2 года назад было, может сейчас уже лучше.


          1. zagayevskiy
            13.11.2018 00:03

            Сталкивался с такой же херней, только вместо питона были джава и андроидовый фреймворк .


            1. Stas911
              13.11.2018 05:40

              Те же слова слышал от Скалистов, когда они видели код на Scala, написанный Java-программистами. Вот прямо слово в слово.


  1. KYKYH
    12.11.2018 18:55
    +1

    Однажды я зафигачил дизайн на абстрактных классах в typeScript, и меня высмеяли. Потому что в тайпскрипте» так не делают.


    А зачем в тайпскрипте абстрактные классы если ими нельзя пользоваться? В чём сакральный смысл понятия
    Потому что в тайпскрипте» так не делают.
    ?

    (Простите за профанство, сам не тайпскриптер)


    1. indestructable
      12.11.2018 21:20

      Можно пользоваться, но пользуются редко (тк на джаваскрипте так тоже никто не делает).


      Однако, называть это профанством я бы не стал. И прям выносить приговор квалификации разработчика — тоже не стал бы.


    1. VolCh
      12.11.2018 22:32

      Что значит «нельзя пользоваться»?


      1. KYKYH
        12.11.2018 22:57
        +1

        Ну по формальной логике, если

        Однажды я зафигачил дизайн на абстрактных классах в typeScript ...


        А существует парадигма

        … в тайпскрипте» так не делают.


        Соответственно нет условий, в которых данную фичу дозволяется использовать. Следует закономерный вопрос: зачем фича?


        1. Fesor
          12.11.2018 23:35

          Не все проблемы в мире выгодно решать структурным тайпингом. Абстрактные классы бывают полезны (особенно если интерфейсы не могут содержать дефолтной реализации как в Java).

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


    1. Fesor
      12.11.2018 23:32

      В TS в основном все юзают структурный тайпинг (опять же можно порассуждать на тему оверюза фич).

      Вот есть у вас 2 модуля, A и B, один зависит от другого. Как сделать инверсию зависимостей в какой-нибудь Java? Добавим интерфейс в модуль A и B его будет имплементить, направление зависимостей уже меняется. Как это делать в TS? Примерно так же, только имплементить интерфейс не нужно. Типы либо сходятся либо нет.

      И в целом как и в случае с Java необходимости в абстрактных классах практически нет (опять же после появления возможности объявлять дефолтное поведение в интерфейсах). И в целом в java как по мне абстрактные классы представляют ценность только для обратной совместимости.


      1. 0xd34df00d
        13.11.2018 00:44

        И это типа хорошо?

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

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


        1. Fesor
          13.11.2018 01:08

          И это типа хорошо?

          хорошо или плохо — не очень то инженерные понятия.


          то надо пересобрать все клиенты, чтобы проверить, что типы сходятся. Не так ли?

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


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


          1. 0xd34df00d
            13.11.2018 01:40
            +2

            хорошо или плохо — не очень то инженерные понятия.

            Но на практике все не столь уж плохо

            :]

            Хз, как в этом тайпскрипте всё, но я утиной типизации уже по уши наелся в темплейтах C++ и не отказался бы от тайпчекинга до мономорфизации, а не после, например.

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


            1. Druu
              13.11.2018 03:19

              Хз, как в этом тайпскрипте всё, но я утиной типизации уже по уши наелся в темплейтах C++ и не отказался бы от тайпчекинга до мономорфизации, а не после, например.

              В TS если делать полный тайпчек сразу, то не будут нормально работать mapped и conditional types, т.к. чтобы тип проверить, его надо сперва сконструировать, если конструкции выражать сразу в исходном типе то для простых вещей, котоыре сейчас делаются в две строки, придется писать тонны type-level кода. Так что в итоге там процесс мономорфизации с процессом чека сильно перемешаны, по сути это один процесс.


        1. roman_kashitsyn
          13.11.2018 01:12

          Не, поймите, я сам иногда мечтаю об анонимных неявных тайпклассах в хаскеле.

          Наверное, вы хотите просто записи с Row Polymorphism.


          1. 0xd34df00d
            13.11.2018 01:42

            Но его-то в хаскеле тоже нет, есть только какое-то нытьё про classy-линзы.


        1. Druu
          13.11.2018 03:15

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

          А жалко что ли? Пусть пересобирается, я пека покупал не для того, чтобы он стоял.


          В данном случае, класс с реализацией — и есть контракт.
          Но и интерфейс отдельно выделить не мешает никто, если хочется.


          1. 0xd34df00d
            13.11.2018 03:31

            Ну, у меня есть некоторые возражения организационного толку (ответственность за изменения, владение кодом, объём зависимого кода) против такого подхода, но это уже частности и надо смотреть по ситуации.


        1. mayorovp
          13.11.2018 12:29

          Если вам важно заранее проверить что ваш класс удовлетворяет интерфейсу — то ключевое слово implements никто не отменял.


  1. alatushkin
    12.11.2018 18:57
    +6

    Предположу, что на самом деле причина всех этих проблем с самобичиванием и проим вот в этом:

    «дайте немного времени на беглое чтение спеки, и я готов работать с этим говном

    Я, конечно же, сделал вид, что просто мои коллеги — бездарные идиоты. Обычно это помогало, но в этот раз остался осадок.


    Чем сильнее человек ведет себя как высокомерна задница по отношению к другим людям — тем тяжелее ему потом признавать свою не правоту.
    Часто такое встречал у свежеиспеченных «молодых» CTO и архитекторов (знаете, такие типажи, которые во всех публичных местах добавляют себе подпись CTO?) )

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

    Осознай и прими что ты «не самый умный» и как писали выше: это всё ерунда — «плюнуть и растереть».


  1. amaksr
    12.11.2018 19:00
    +1

    Однажды я зафигачил дизайн на абстрактных классах в typeScript, и меня высмеяли. Потому что в тайпскрипте» так не делают.
    Можно подробнее? Что не так с абстрактными классами тайпскрипта?
    Мой самоприсвоенный скилл «Я научился быстро учиться» оказался неправдой.
    Не согласен. Многие сразу отказываются что-то там делать на основании, что они этого не знают. Я вот не отказываюсь, даже наоборот. Но сразу предупреждаю о том, сколько времени понадобится на изучение, и что именно я смогу после этого сделать.
    Да и вообще, когда переходишь на новое место, с языком и технологией обычно разобраться проще всего. Сложнее — с фреймворками, если их не видел. А больше всего занимает понять то, что написано до тебя. Тут как раз сеньерность и помогает больше всего, т.к. если уж видел какой-нибудь хитрый паттерн, даже на другом языке, то сразу его узнаешь и время на дебаг и понимание сэкономишь.


    1. DarkGenius
      12.11.2018 20:38

      При переходе на «новое место с новым языком» самое сложное, как мне кажется, перейти так, чтобы не сильно потерять в зп (а лучше не потерять вообще). Вряд ли senior .NET разработчика возьмут на аналогичную позицию по Java, если у него нет достаточного опыта в Java. Получается, что даже фуллстек ограничен рамками своего «фулл стека».


  1. Hzpriezz
    12.11.2018 19:03
    +1

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

    И еще, очень важно уметь признавать свои ошибки, а не винить всех в «непонимании».
    Автору спасибо, статья понравилась)


  1. Dimash2
    12.11.2018 19:17

    Узкий взгляд на жизнь и плохой совет. Люди разные и хотят разного. Если вы хотите всю жизнь работать на галере — учите одно и живите на галере.

    Я Full Stack и, наверное, вы правы, что я не очень глубоко знают каждую технологию в отдельности, но это касается больше фреймворков, чем самих языков, так как языков очень мало и их спецификация не так сильно меняется. Мои проф языки: php и javascript, вспомогательные: nodeJS, C#

    Как видите проф языка, только 2, если вы считаете, что это много — то это грустно, надо больше кушать Омега 3 ;-)

    Так как я не ориентируюсь на галеры, то я не изучаю все фреймворки, конкретно сегодня я работаю исключительно с Angular и PhalconPHP. То есть по одному фреймворку на язык. То есть всего 2 фреймворка, что тоже очень мало.

    Базы данных — только Mysql и больше ничего. Я не говорю, что другие базы плохие, это просто мой выбор.

    Получается, я Full Stack, но я не стремлюсь знать все, я ограничиваю себя и не расширяю навыки по инструментам, если мне нужен будет Java специалист — я его найму, если Python — тоже могу нанять, но в своих технологиях я эксперт. Конечно, всегда есть кто-то лучше.

    То что я Full Stack помогает мне консультировать клиента и решать его бизнес процессы, вы думаете Менеджер может это с легкостью сделать? А кто будет решать какие технологии использовать?

    Более того, на массовом рынке Back end очень простой, это по сути разработка API, подключиться к mysql и отдать json — что тут сложного?

    — Более того, будучи Full Stack, что вам мешает улучшать одну технологию, а другие технологии для базовых вещей? Вы же понимаете, что 80% рынка просит самый простой функционал, на беке — это REST API и это уже на столько избитая тема, что она уже просто автоматизирована.

    Например, так как я Full Stack, я смог написать Sprite генератор для SVG файлов на NodeJs, чтобы запускать из под Gulp. Кидаешь все SVG в одну папку и код генерирует html c очищенным от стилей svg и так же генерирует отдельную страницу, которая предлагает copy/paste svg use — теперь можно svg спрайтить недумая без рутины. Front End так не может ) и много таких вещей.

    Своим подчиненным я всегда говорю, что веб разработка — это не Rocket Science и хватить ныть )

    — Хотел бы заметить, что шкала навыков очень широкая, и один специалист узкого направления может проработать так лет 10 и быть хуже Full Stack в своей же спецификации, а может и лучше раз в 10, все это частные случаи.

    Утверждать, что Full Stack сразу хуже узких спецов — ошибочно, у меня вот по тестам Upwork — top 10% в PHP Advanced, интересно, остальные 80% это кто? А кто те, кто круче меня? Full Stack или Back end )

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


    1. Max2UP
      12.11.2018 19:31

      «Front End так не может» — У меня так могут middel Front End. И я считаю это нормальным требование к современному Front End. И джунов обучаем в том же направлении. Похоже проблема в том, что вам похоже не встречались нормальные FrontEnd.


  1. Alex_ME
    12.11.2018 19:27
    +2

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


    • C# (WinForms, MVC, немного WPF).
    • Сюда же к вебу классическое: HTML, CSS, JS. На всякие реакты посмотрел одним глазом, но опыта практического нет
    • C++ неплохо, но знаний и опыта в разной хардкорной и не очень темплейт-магии не достает
    • Android (Java и один маааленький проект на Kotlin)
    • Микроконтроллеры ArduinoAVR ATmega и STM32
    • Околоробототехническое: ROS, компьютерное зрение (посредственно) и что-то в этом духе.


    1. Max2UP
      12.11.2018 19:32
      +1

      А чем вы хотели удивить???


      1. Alex_ME
        12.11.2018 20:03
        +2

        Абсолютно ничем. Как раз наоборот. Автор статьи переживает, что раз он выучил «C# и .NET (asp.net, wpf, xamarin), js/ts (react/redux, node)», то он крайне сильно распылился, и всё, гроб-гроб-кладбище.


  1. snuk182
    12.11.2018 19:28
    +2

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


    1. indestructable
      12.11.2018 21:24
      +7

      Быть синьор фулл стеком и не считать мнение автора из интернета абсолютной истиной.


      1. snuk182
        13.11.2018 12:38

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


    1. Fesor
      12.11.2018 23:40

      специализация не отменяет необходимости диверсификации навыков.


    1. 0xd34df00d
      13.11.2018 00:47

      По каким критериям? По карьере, по деньгам или по удовлетворению от жизни?

      Я стараюсь гипер-сеньорить в C++ и развиваться в этой всей хаскельной идрисне, второй диплом второе синьорство там получать. Первое — потому что интересно и так получилось, второе — потому что интересно. Мне норм.

      Ну и плюсы вряд ли сдохнут в обозримом будущем.


  1. retran
    12.11.2018 19:31
    +2

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

    Учите фундаменталку, «нинужные» алгоритмы и вот это вот все — и будет вам счастье.


  1. Samouvazhektra
    12.11.2018 19:36
    +2

    По моему проблема просто в этом


    и убедил себя, что теперь-то могу действительно всё. Я абстрагировался, мыслю в нескольких парадигмах программирования одновременно и обладаю практическими знаниями во всех аспектах профессиональной разработки ПО

    вы просто застряли в развитии, а потом вынырнули и осознали жестокую реальность


  1. terantul
    12.11.2018 19:39

    Не скажу что я фуллстек, но не пхп единым…
    В чём удобство знаний (и опыта) в нескольких направлениях — без работы никогда не останешся.
    Бичевать себя что знаешь меньше чем коллега посвятивший технологии(языку) 10 лет? пффф. Не смешите.
    Каждому своё (так было написано на одних воротах). Делайте то что Вам нравится и получайте от этого удовольствие. IT сфера хороша в том, что может быть хобби, за которое платят неплохие деньги. Ведь айтишниками не становятся, ими рождаются.



  1. Nomad1
    12.11.2018 20:01

    Люди, живущие в селе, обычно «фулл-стек» мидлы: они могут и трактор починить, и проводку сделать, и дом построить, и корову подоить. Правда, это не делает их специалистами в какой-то отрасли, но жить помогает. А уже узкая специализация у каждого своя: кто 40 лет на комбайне сениорит, кто самогон варит, а кто-то вообще сомилье на филансе — к полудню уже три сорта напитков опробует и философствует под забором.
    И вы не страдайте напрасно, найдите для себя новое направления и изучите его, раз это приносит вам удовольствие и доход )


  1. Arris
    12.11.2018 20:04
    +1

    Язык программирования неважен, когда ты знаешь их 5 или 10 и кодишь на коленке в троллейбусе и проектируешь код во сне.

    … если ты не знаешь ни одного — еще как важен. См. Синдром Утёнка.


  1. Skykharkov
    12.11.2018 20:05

    Мне кажется что тут налицо простая подмена понятий. Фуллстек — не объем знаний в разных (условно говоря) языках программирования. Фуллстек означает, что я знаю как оно все устроено внутри. Надо SQL базу — запросто, фронтэнд — не проблема, REST сервис — как два пальца. Desktop GUI — ой как хорошо, вообще запросто. Микросервисы на отдельных инстансах с отказоустойчивостью — легко. На асме вставочку — ну если десяток строк… С железякой какой-то нестандартной поговорить надо — запросто… Фуллстек это когда понимаешь как оно все работает отдельно и в связке. Фуллстек это знание всей внутренней кухни. А на чем все это делать (фреймвоки, языки и т.д.) — вопрос даже не второй. Если это работает быстро, стабильно и легко поддерживается. Да хоть на бейсике. Какая разница то?


  1. SirEdvin
    12.11.2018 20:08

    А давайте зададимся вопросом, а кто такие синьоры? В нормальном мире разницы между синьором и фуллстеком вполне может не быть, вы просто будете знать одну часть своего стека лучше, чем другие.

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


  1. dempfi
    12.11.2018 20:36
    +3

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


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


    Наверное программирование можно сравнить с бухгалтерией, а языки/технологии с бухгалтерским софтом. Если компания нанимает бухгалтера для работы с определенным софтом, то она нанимает просто оператора этого конкретного бухгалтерского софта, а не бухгалтера. Точно также если компания нанимает фронтэнд разработчика. Только в отличии от бухгалтеров, программисты мало кому нужны — чаще нужны те самые операторы.


    Я верю что название Fullstack разработчик появилось лишь как способ сказать что нужен просто разработчик ведь в IT так много названий.


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


  1. tuxi
    12.11.2018 20:36

    del


  1. tuxi
    12.11.2018 20:41
    +1

    Наверное я мало видел проектов, но точно скажу, из тех проектов, что я видел, успешными стали только те, в которых разработчик(и) не пренебрегали предметной областью. Причем один такой неуспешный проект делался одновременно с другим. В итоге после полутора лет и трат выраженных 7ми значными числами в рублях, этот неуспешный проект был поглощен тем вторым, который делался, имея в своем базисе крепкое знание и понимание предметной области. При этом команда второго проекта постоянно проводила консультации для первой команды. И поглощение выглядело как "просто 301-й редирект" (это вебпроекты были). Взять и переюзать что-либо было просто нереально.


    Разобраться грамотно в предметной области — это половина успеха и половина проекта. Даже для "кодера" джуна.


  1. ZXZs
    12.11.2018 20:51

    В моём понимании senior — это не тот программист, который до дыр обсосал выбранную им технологию. Senior — это такой дядька, который, вместо разведения холиваров на форумах по поводу и без, занимается внедрением в уже созданные проекты новых технологий, aka Deep Learning, машинное обучение, компьютерное зрение, ВебАссемблер в конце концов, и так далее.

    Junior — исполняет идеи
    Middle — делегирует джунам и участвует в исполнении идеи
    Senior — генерирует идеи, делегирует мидлам и участвует в исполнении

    Можно быть и сеньёром-фуллстеком, почему бы и нет?


    1. AEP
      12.11.2018 21:22

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


  1. Moxa
    12.11.2018 20:52

    фулстек и мидл это разные понятия, никто не мешает копать в в одном направлении достаточно долго, чтобы стать сеньором. Жаве больше 20 лет, синтаксис за это время менялся не сильно, фреймворки тоже медленно эволюционируют. Любой жаваскриптовый фреймворк можно выучить полностью за пару месяцев, если не недель, было бы желание. Чтобы быть синьором, нужно постоянно развиваться, пробовать новое, а не сидеть на жопе и рисовать одни и теже формочки каждый день


  1. imouseR
    12.11.2018 20:54
    -1

    Спасибо автору, сам стою на распутье. И комментарии очень хороши, отчасти))) Все время лезу не в свой выбор (js/react) и потом понимаю, что только зря трачу бесценное время. Но каков же искусс! Например Ocaml/Reason — выглядит как пирожок, но заглотишь — проблем не оберёшься. Слава богу и таким авторам: постепенно приходит видение пути.


  1. StroboNights
    12.11.2018 20:56
    +1

    Когда я только начал учиться кодить, я поверил старым мудрым засранцам с их мантрой «язык программирования не важен».

    Все правильно, так оно и есть: когда Вы только-только начинаете учиться программировать, сам по себе язык программирования, с которого начинаете, не так важен. Именно это Вам и сказали когда Вы начинали. Та же Arduino была создана как платформа для обучения с пониженным порогом вхождения для новичков. Способности у каждого человека очень разные, так уж природа распорядилась, поэтому, по аналогии, русский язык может освоить любой житель планеты, но вот Александр Сергеевич Пушкин, Достоевский, Толстой, Булгаков — единственные в своем роде.


  1. AlexMal
    12.11.2018 21:19
    +1

    Но в IT если ты не обновляешь свои знания о технологии в течение года, ты уже не актуален.

    С C++ Это тоже работает?)


    1. 0xd34df00d
      13.11.2018 00:49

      Там нужно обновлять раз в три года, но зато каждое обновление как раз пару-тройку лет займёт.

      Ъ плюсисты уже знают про модули, концепты и вот это вот всё, поигрались со свежими срезами clang и gcc прямиком из транка/мастера и представлят, как C++20 изменит написание кода.


      1. Gorthauer87
        13.11.2018 12:59

        А потом оно еще кучу лет в дикую природу будет проникать, ведь не перепишут же сию минуту все на модули.


    1. Whuthering
      13.11.2018 12:40

      Там этот промежуток по времени растянут немного, но суть та же.
      Код на C++98 ощутимо отличается от кода на C++11 (причем не только синтаксически, но и в плане подводных камней), далее пара минорных обновлений, но с C++20 снова довольно много чего может перевернуться.
      Плюс еще где-то между всем этим появились Core Guidelines и GSL, тоже требующие изучения и «перестроения» себя, и во многих компаниях/проектах их вполне серьезно используют.

      Другая проблема в том, что некоторые люди рассуждают так же, мол, «в плюсах все происходит медленно и резко ничего не меняется», из-за этого расслабляются, а потом при переходе в новое место, даже если пройдут собеседование, то очень больно и неприятно получают на первом же code-review :)


  1. impwx
    12.11.2018 21:23
    +1

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


  1. Dywar
    12.11.2018 21:26
    +1

    Каждому свое.

    Есть успеные люди, которые каждые пару лет перепрыгивают на хайповые языки и снимают сливки.
    Есть фуллстеки, которые просто не могут изучить все, но в 99% этого и не требуется.
    Есть экперты по направлениям, но они тоже смотрят по сторонам. Доклады по продуктам MS читают эксперты, но при этом они тыкают соседние технологии.

    Правильного пути нет, есть баланс между желанием, возможностью и потребностями.


    1. Dywar
      13.11.2018 20:57

      В тему, поток мыслей (имхо), может кому интересно.

      Схема:


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

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


      1. VolCh
        13.11.2018 21:55
        +1

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


  1. Lexicon
    12.11.2018 21:27
    +3

    Единственный контекст, в котором я бы согласился с заголовком — фуллстек — не источник денег.


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


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


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


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


    Фуллстек — элементарное стремление человека к созданию чего-то большого своими силами


  1. amarao
    12.11.2018 21:31
    +5

    Я могу рассказать про такого, но в контексте системного администрирования. Он получает много денег именно за «многомодальность». Потому что я, перед тем, как настроить IPSec, пойду и прочитаю. Если не всё, то хотя бы первые 5-7 тысяч страниц. А он идёт и настраивает IPSec между солярисом и циской через два ната за 4 часа.

    Нужно сделать репликацию для оракла? Да. Поправить отчёт SAP'е? Да. Починить потерю пакетов в SDN с онлайн-интроспекцией? Да. Кривая метрика виртуалки в openstack'е? Да. Падают тесты в maven'е при сборке deb-пакета на jenkins'е? Да.

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


    1. ksil
      13.11.2018 17:16
      +2

      Человек из Кемерово.


  1. Dark_Scorpion
    12.11.2018 22:00
    +1

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

    Может стоит меньше слушать «знатоков» языка и заниматься тем, что тебе нравится?



  1. BalinTomsk
    12.11.2018 22:36

    — по пять лет опыта в каждой из фулстечных технологий.
    Если между технологиями перерыв 5 лет — то забывается многое и остается пробел в знании когда выходит новая редакция языка.

    Особенно если после С++ ныряешь в TSQL через несколько лет в памяти только общие детали.


  1. sentyaev
    12.11.2018 22:42

    Я изучил C# и .NET с разными областями применения (asp.net, wpf, xamarin), js/ts (react/redux, node) и убедил себя, что теперь-то могу действительно всё.

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


  1. Fedorkov
    12.11.2018 22:46

    Cамые лучшие программисты — те, кто понимают, насколько ограничены их возможности. Они скромны. Худшие программисты отказываются признать, что их способности не соответствуют задаче. Характер не позволяет им стать отличными программистами. Чем усерднее вы работаете над компенсацией ограниченных возможностей своего разума, тем лучше будете программировать. Быстрота вашего развития напрямую зависит от вашей скромности.
    — Св. Евангелие от Макконнелла


  1. datacompboy
    12.11.2018 22:50
    -1

    Фуллстек это не «учи всё». Фуллстек это инвестированные те самые 10к часов во множество технологий. Абстракция не сводит к нулю их, но снижает на порядки.

    Абстрактные классы в JS? Глупость. Надо ли для этого знания тратить 10к часов на JS? Нет.

    То есть в первую было вложено 10к. Во вторую — 8к. В третью 5к. В четвертую, пятую шестую — хватит 1-2к.

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

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

    Не «идиоматично»? Зато O(N) вместо O(N^2), потому что «я пол бака и ты пол бака, вместе оно полюбому бак будет, да?» (ц) день радио.


  1. boblenin
    12.11.2018 23:19

    Про фулстеков хорошо походит: «Every Marine a rifleman» ©. Каждый разработчик в комманде должен уметь разобраться в коде любого компонента, что-то дописать, что-то подправить (в противоположность тому, что если Вася-DBA находится в отпуске, то все задачи затрагивающие базу — стоят заблокированными). Но один будет гораздо сильнее в бэкэнде и сделает все эффективней, другой лучше выполнит UI, третий базу данных.

    А насчет того, что нужно бизнесу. Бизнесу нужны разработчики, которые понимают бизнес. И способность осмыслить задачу, а не просто переложить ее на циклы и условные ветвления; задать корректные вопросы, уточнить моменты — которые могут быть либо пропущенными аналистом либо вообще некорректно проанализироваными — вот что надо бизнесу.


  1. evil_random
    13.11.2018 00:18

    Редко когда фулстек разбирается и в фронтенде и в бекенде одинаково. Где-то лучше, где-то хуже. Но это не повод гнушаться поправить пару строчек на Яваскрипте, Питоне или ПХП, если не нужно ничего глобально менять.

    Обширные знания в смежных областях нужны и важны (если вы только не с ЕПАМа), хотя бы для того чтобы быстро переквалифицироваться если вдруг загнётся абстрактный Яваскрипт.
    Меня всегда удивляли фронтенд-разработчики, которые не знают как работает чистый Яваскрипт, как написан тот же Реакт и что он из себя представляет внутри, что надо писать в консоль сервера на Дебиане, каким образом клиент с сервером обмениваются данными, как работают браузеры, ДНС и интернет в целом и т.д.


    1. onborodin
      13.11.2018 12:57
      +1

      >Меня всегда удивляли фронтенд-разработчики

      Вы еще не работали с 1С разработчиками.
      Вас бы перестали удивляться вообще.


  1. roman_kashitsyn
    13.11.2018 01:02

    Программисты нужны не для того, чтобы хорошо знать «TypeScript», а чтобы уметь эффективно решать проблемы. Этот навык приходит исключительно с опытом и изучением фундаментальных наук (математика, логика, алгоритмы).


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


    Я изучил C# и .NET с разными областями применения (asp.net, wpf, xamarin), js/ts (react/redux, node) и убедил себя, что теперь-то могу действительно всё.

    Это что ли много?


    Learn at least a half dozen programming languages. Include one language that emphasizes class abstractions (like Java or C++), one that emphasizes functional abstraction (like Lisp or ML or Haskell), one that supports syntactic abstraction (like Lisp), one that supports declarative specifications (like Prolog or C++ templates), and one that emphasizes parallelism (like Clojure or Go).
    http://norvig.com/21-days.html

    Я бы добавил к этому списку языки, которые обладают выразительной модульной системой (OCaml, Standard ML) и языки, которые помогают осознать соответствие Карри—Ховарда: Coq, Agda, Idris или F*.


    Однажды я зафигачил дизайн на абстрактных классах в typeScript, и меня высмеяли. Потому что в тайпскрипте» так не делают.

    А кого волнует, что там кто делает или не делает в «TypeScript»? Надо уметь обосновать выбор дизайна. Идиоматичность дизайна является одним из факторов (к примеру, в математике никто не будет обозначать целое число буквой большой буквой S), но если преимущества (простота в поддержке, эффективное использование ресурсов, лёгкость в отладке) «неидеоматичного» решения перевешивает недостатки, аргумент «так никто не делает» выглядит довольно нелепо.


    1. 0xd34df00d
      13.11.2018 01:45
      -1

      Agda и Idris полезны ещё и потому, что после них куда лучше понимаешь все эти семейства типов, DataKinds, TypeInType и вот это вот всё, короче. И зачем оно нужно.

      Так что исключительно практическая польза.


  1. phoenixweiss
    13.11.2018 01:26
    +2

    Давайте так — а везде ли нужны сеньоры? Какая разница кем работать — главное чтобы на жизнь хватало и работа была в радость, а если есть перспектива развития (не обязательно только карьерного роста), так вообще замечательно!
    Тут все от человека зависит, кто-то упарывается в то чтобы быть лучшим специалистом по левой ноздре, но абсолютно не хочет лезть в правую, считая это не его компетенцией, а кого-то больше интересует как работает организм вцелом. Это из детства идет — одни выбирают кружок для досуга и спортивную секцию (или родители чаще всего выбирают) и ходят до победного, а другим интересно попробовать себя в разных сферах. Я вот с детства например занятий 20 точно сменил, и танцы, и автомодельный кружок, и плавание, и рисование, и литературный кружок, и много-много чего еще, а потом отучившись в одном институте понял что не мое, и совсем в другой сфере защитил кандидатскую, потратив дополнительно 7 лет. Мне интересно очень многое, и последнее что будет меня в жизни сдерживать — это какая-то классификация разработчиков. Если даже придется начинать с нуля, менять стек или даже профессию, ничего страшного нет в том чтобы не быть «сеньором» в чем-либо, главное чтобы было интересно (ну конечно если условия позволяют на эти деньги выживать). Очередной вон кризис грянет — и половина сеньоров под сокращения попадут или просто конторы обанкротятся. Меня 2 раза в жизни заставало такое дело, в 2008 (правда тогда не было никаких финансовых обязательств, и за душой тоже ничего, и терять особо нечего) и в 2014 (когда на пару лет пришлось вообще сменить профессию, чтобы тупо выжить и уже было что терять). В общем, каждый решает для себя сам чего ему нужно. Я с основной мыслью статьи не согласен совершенно категорически, однако это не означает что я ее не понимаю, просто не мое. Всестороннее развитие и возможность выбирать его вектор в каждый момент времени — это настоящая свобода для живого мыслящего человека.


    1. lxsmkv
      13.11.2018 04:17
      +1

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

      С бытовой точки зрения удобнее иметь широкие пусть и не глубокие познания. Чтобы можно было адаптироваться и переориентироваться в любой момент. Динамика спроса на рынке растет.

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


  1. sotnikdv
    13.11.2018 02:27
    +4

    Продублирую.
    — > посмешищем для сорокалетних сеньоров одной технологии

    Мне почти сорок. Программить начал в 14. Профессионально — с 2000 года, т.е. 18 лет.

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

    Те, кто прилипли к одной технологии — давно остались позади. Работают за копейки. Посмешише и мастодонты для нас.

    Технология устаревает за 3 года, умирает за 5. Нет, зомби на ней копошатся еще лет 10, но суть ясна.

    Да, фулл-стек — полон проблем, это ИМХО ложный путь.

    Поэтому разделяй навыки на primary и secondary. Primary — то, в чем ты крут, на чем фокусируешься, от чего у тебя на коже проступает свитер, а на свитере ростет борода. Secondary — это навыки, которые ушли из фокуса (outdated) или которые еще не вошли в фокус (upcoming). Таким образом — ты всегда на острие, ты всегда эксперт, ты всегда учишь новое и у тебя всегда за плечами куча знаний.


    1. Stas911
      13.11.2018 05:44

      Кончились плюсы — плюсану текстом!


  1. lxsmkv
    13.11.2018 03:10

    Причём ты всё ещё будешь недосягаемо хуже разраба, который каждый день пишет исключительно на тайпскрипте
    Согласен, вот мой основной язык питон, я на нем пишу тестовые скрипты для сквозного тестирования. Я понимаю общую архитектуру нашего приложения, которое написано на яве. Я могу читать код приложения на яве, могу по стектрейсу определить где программа выкидывает ошибку, запустить дебаггер. И даже выяснить источник ошибки.
    Но! Решить этот баг я просто не осмелюсь, потому что не знаком с устройством этого конкретного кода. Я не знаю какие побочные эффекты вызовет присвоение переменной в методе, я не знаю из каких разных мест этот метод вызывается и т.д. и т.п. Не имея полной картины устройства этого кода лезть в него глупо и даже, я бы сказал, безответственно.
    Т.е. даже знания языка не сделают тебя автоматически разработчиком конкретного приложения. А ведь именно на это надеются кадровики? Что можно будет перекинуть человека с одного проекта на другой. Но сложность-то не во владении языком, а в продукте который разрабатывается. Конечно человек разберется со временем, но далеко не вдруг и не без посторонней помощи.

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


  1. gt8one
    13.11.2018 07:13

    Не иди путём Фулстека.
    Не иди путём Спеца.
    Иди Своим путём.


  1. artiom_n
    13.11.2018 08:57

    Как всегда: ещё один, считающий, что Web-разработкой и написанием "бизнес-логики интерфейса", разработка ограничивается.


    Теперь, когда мне нужно поработать на каком-нибудь нелепом питоне

    Что?


    Причём, человек на полном серьёзе рассуждает о том, что "нужно бизнесу" и как подстроиться.
    Зачем тогда идти в разработку? Ради бизнеса или "потому что IT — модно"? Так лучше идти в бизнес: солиднее и денег больше заработать возможно.


  1. Berkof
    13.11.2018 09:10

    Знавал я одного чувака, который в качестве решения этой проблемы сказал — «а я выкачу один ЯП, годный для всего»… ждём.


  1. vladoos
    13.11.2018 09:26

    Фулстеки это мидл программисты и одновременно джунер архитекторы. Карьерная лесница для Фулстека не так печальна, но она будет все больше абстрагироваться от кодинга. Если же нет сил или желания становиться манагером или архитектором, то на самом деле никогда не поздно закрыться в любимой технологии и набивать руку в течении двух трех лет и сознательно игнорируя все остально. Не смотря ни на какие ухищрения манагеров заставить вас делать, что-то из всего остального. Два года для мидла более чем достаточно чтобы стать синьером. Мы становимся лучше в том чем занимаемся каждый день. Или как говорил, кажется, Брюс Ли — я не боюсь человека, который знает тысячу приемов, я боюсь того кто тысячу раз учил один единственный прием.


    1. DelphiCowboy
      13.11.2018 12:09

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

      Технологии за годы устаревают.
      И потому, если не хотите потом заниматься легаси, имейте запасной вариант.
      Для меня, когда Delphi сдох, запасным вариантом стал PL/SQL.
      worldmind
      текущая трактовка термина фуллстэк противоречит всей логике развития цивилизации, которая всегда шла по пути спеуиализации, разделения труда и получала на это профит.
      А человек, который по-вашему, worldmind, видит и понимает всю картину совсем не нужен?
      Причина необходимости фуллстэка в том, что типичный проджект-менеджер управляющий сложным проектом со множеством узких специалистов, может их просто не понимать.


      1. worldmind
        13.11.2018 12:11

        Конечно нужен, только он совсем другой и нужен в других случаях, я вроде подробно описал.


      1. ktulhu
        14.11.2018 06:16

        когда Delphi сдох

        Что вы имеете ввиду?


        1. Whuthering
          14.11.2018 11:08
          +2

          Если вам самому лень, поискал по Hh.ru

          Delphi — 143 вакансии
          Java — 2098 вакансий
          Python — 2126 вакансий
          Go — 472 вакансии
          Результаты опросов пользователей StackOverflow, статистику Github и рейтинг TIOBE, думаю, сами нагуглить сможете.
          С учётом тенденции Делфи к падению спроса думаю вывод очевиден.

          И да, давайте не будем устраивать здесь очередной делфисрач и скатываться в занудство, ну честно, надоело уже.


          1. pawlo16
            14.11.2018 12:13
            -2

            рейтинг TIOBE, думаю, сами нагуглить сможете.

            Вы бы сами сперва погуглили прежде чем вот так вот взять и сесть в лужу. В tiobe дельфя на 13 месте, обычно в первую десятку входит. и работы на ней более чем достаточно. Рейтинг hh отражает всего то навсего текучку кадров и количество стартапов, связанных с веб. Программисты для десктопа тоже — внезапно — нужны. А на десктопе к вашему сведению дельфя как присовывала всю жизнь java/C# по стоимости разработки и производительности (а с++-у по стоимости разработки), так и присовывает

            давайте не будем устраивать здесь очередной делфисрач
            Так не делайте необоснованных утверждений впредь, и признайте, что сказали про delphi не подумав.


            1. Whuthering
              14.11.2018 16:29
              +2

              В tiobe дельфя на 13 месте,
              Вы так говорите, как будто 13 место — это отличный результат, особенно для технологии, существующей уже пару десятков лет. И особенно учитывая, что...
              обычно в первую десятку входит.
              Не «обычно входит», а «раньше входил» (вполне заслуженно в те года, надо отметить). Сейчас же тренд налицо.
              Рейтинг hh отражает всего то навсего текучку кадров
              Количество вакансий означает востребованность специалистов, владеющей этой технологией. И, соответственно, перспективы для этих самых специалистов при поиске работы. Одной «текучкой» это обосновать невозможно, поскольку во многих случаях происходит найм сотрудников не для замены ушедших, а для расширения команды или при старте новых проектов. И количество вакансий тут о многом говорит.
              и количество стартапов, связанных с веб.
              Что, кстати, тоже примечательно показывает спад спроса на десктопную разработку по сравнению с вебом. Вплоть до того, что очень многие современные информационные системы (банковское дело, медицина и т.д.) сейчас по умолчанию имеют веб-морду как интерфейс, а не десктопное GUI-приложение.
              А на десктопе к вашему сведению дельфя как присовывала всю жизнь java/C# по стоимости разработки и производительности (а с++-у по стоимости разработки), так и присовывает
              И этот человек мне говорит «не делайте необоснованных утверждений». Смешно.
              присовывает
              Термины уровня чотких дворовых пацанчиков на хабре. Внушает.

              и признайте, что сказали про delphi не подумав
              Изначально про «сдох» сказал не я, а хабраюзер DelphiCowboy, судя по нику, в прошлом сам заядлый дельфист (как и я, кстати говоря).

              За сим откланиваюсь и перестаю отвечать в этой ветке. Не вижу смысла замусоривать Хабр холиварами. Я все-таки просил не разводить срач, а вы его упорно пытаетесь начать.


              1. pawlo16
                14.11.2018 18:31
                -1

                Вы так говорите, как будто 13 место — это отличный результат
                Это значит что утверждение «Delphi сдох» — брехня

                Не «обычно входит», а «раньше входил» (вполне заслуженно в те года, надо отметить)
                Год назад был на 9-м месте. Стало быть, за год всё круто изменилось. Когда рейтинг тиобе стал двузначным — делфи взял и сдох.

                сейчас по умолчанию имеют веб-морду как интерфейс, а не десктопное GUI-приложение.

                К чему здесь эти рассуждения и что именно вы сейчас доказывали?

                И этот человек мне говорит «не делайте необоснованных утверждений». Смешно.

                Истинность моего утверждения ни кто и не оспаривал чтобы мене его обосновывать

                Термины уровня чотких дворовых пацанчиков на хабре. Внушает.
                У дворовых поцанчиков меньше бреда и каши в головах, чем у некоторых хабровчан

                Изначально про «сдох» сказал не я, а хабраюзер DelphiCowboy, судя по нику, в прошлом сам заядлый дельфист (как и я, кстати говоря).
                То есть вы с ним не согласны? в таком случае не понятно к чему был ваш комментарий про Hh.ru и tiobe

                Я все-таки просил не разводить срач, а вы его упорно пытаетесь начать.
                Вы что, вахтёр, бегающий по веткам комментариев в поисках срача? В таком случае поясните, по каким признакам вы его обнаружили у меня. Я отнюдь не дельфист как могло бы показаться. Но с дельфями сталкивался, и бонусы, которые они дают, знаю. В частности, про вещи, типа «treeview с данными», которые в дельфи сделаны идеально, в гопнете как-то «так». Просто кое у кого вечная паника при слове Delphi/Pascal. Меня это слегка коробит, потому и тригернуло высказывание про дельфи сдох. А вы тут же — срач…


          1. ktulhu
            14.11.2018 20:04

            Если вам самому лень, поискал по Hh.ru

            Вам другой юзернейм, в принципе, уже ответил.

            От себя добавлю:

            1. Измерять что-то количеством ваканский, конечно же, можно, только выводы оно в реальности даст не те, которые вы хотели бы видеть. Т.е. можно сказать, что «по Delphi количество вакансий в Х раз меньше, чем по Y». Да и это будет ерундой, потому что нужно учитывать время, сезонность (да-да! отчеты финансовые никто не отменял), срезы и т.п. И уж точно говорить, что Delphi умер — это, мягко говоря, малограмотно.

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

            3. Исходя из п.2, в той же Северной Америке часто хотят секретарей и прочих непрямых ИТ-работников со знаниями Делфи от секретарш до сейлзов. Индустрии, где любят Делфи: retail, hospitality и пр., связанное с конечным потребителем.

            Ну и confirmation bias никто не отменял.

            не будем устраивать здесь очередной делфисрач

            А что вы хотите, чтобы было если кто-то пишет космических масштабов глупость, опираясь на собственные ощущения и российский портал hh.ru? Или, что одна технология лучше другой, например, тот же Ruby хуже Delphi, потому что он на несколько позиций ниже в рейтинге популярности языков программирования.


            1. Whuthering
              15.11.2018 11:19

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


      1. vladoos
        14.11.2018 20:53

        Технологии за годы устаревают.
        Смотря какие технологии. Специализация это конечно же риск, но не всегда. Например Java и С++ намного старее, но они до сих пор актуальнее всех прочих. И да, конечно, нынешняя Java и то что было 20 лет назад это совершено разные вещи. Но ведь никто не говорит, что нужно перестать изучать новое. Просто если ты развиваешься вместе с технологией, то ты всегда будешь оставаться актуальным, и при этом не выпадать статуса сеньера. Поэтому не все так печально. Не нужно делать вид, что технологии это битва на вылет, где одна технология убивает другую. Иногда такое происходит, но не потому, что кто-то кого-то убил, а потому, что технология не смогла эволюционировать достаточно быстро под новые условия, и умерла своей смертью. Пример с Delphi как раз самый яркий. Они застряли на вершине своего развития в своем славном прошлом где-то в середине нулевых, и до сих пор там топчутся. Но пока они полностью не умерли то никто не исключает вероятности их новой инкарнации. Но очевидно, что если это произойдет, то это будет совершенно новая Delphi в которой старый опыт будет уже не актуальным, и все придется начинать с начала.


  1. Sad_Bro
    13.11.2018 10:14

    Согласен с автором. Сейчас есть тенденция на человек оркестр, но какая будет эффективность такого разработчика не думают.
    Автоматизатор, ок, будь добр настрой CI, подучи Ansible, и не важно что на реализацию этой задачи ты потратишь на пару недель больше чем нормальный девопс и скорее всего родишь не поддерживаемого уродца.


  1. enjoykaz
    13.11.2018 10:23

    Фулстечности программиста будет достаточно для менеджера? Ну что же, это будет неплохим стартом и можно даже получить титул Middl Project manager и уважение в лице разработчиков команды. Но дальше разобраться еще как минимум придется в маркетинге (PPC, SEO, SMM, копирайтинг), продажах, дизайне (UX/UI), аналитике (GA, Unit-экономика), HR и методологиях управления проектами. Разобраться естественно будет мало и нужно будет уметь ручками это делать самому и делать регулярно, как минимум для того чтобы дизайнеры, маркетологи, аналитики, продажники не закатывали глазки, когда получают свои задания от менеджера, а как максимум потому что людей с этими ролями в команде нет и делать нужно все самому. Еще скорее всего придется стать экспертом в предметной области, которой работает компания. Что еще? Еще зависит от компании. Возможно потребуется время пройти разные гавнообучения и сдать экзамен на PMbok или упаси Господи вступить в секту Agile и через 10 лет плясок тамадой стать Agile коучем.
    Все ли менеджеры такие? Конечно нет, но я же не думаю, что автора устроит быть гавноменеджером с узкими и поверхностными знаниями и нормально разбираться только в разработке, при этом пойти сходу на понижение ЗП, а для всех других ролей в команде оставаться вечным неучем и безруким, который даже не может настроить рекламную кампанию за пару часов.

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


  1. greabock
    13.11.2018 10:34

    Мужик явно запутался.


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


    • Фрилансер клепающий сайты "под ключ" — фуллстэк.
    • Вебстудия делающая тоже самое — фуллстэк.
    • Отделочник по найму, который делает полный ремонт квартиры — фуллстэк.
    • Сторительная компания, которая делает тоже самое — фуллстэк.

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


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


    А теперь что касается, Junior, Middle(?) Senior.


    Понятия Junior, Middle, Senior отражают уровень компетенций (нет).
    То есть: они отражают, но не совсем так как многим кажется.


    Стоит ли удивляться, что джуны, которых набирают в какой ни будь гугл, хотя и не имеют практического опыта* (или имеют но мало) разработки, способны запросто заткнуть за пояс в вопросах computer scince** любого "синьора-помидора" работающего в мелкой конторе.


    Это скорее ранг внутри команды, чем уровень "крутости" специалиста.


    Что же касается самой статьи… Если называть вещи своими именами, то всю ее можно свести к вот такому выражению :


    Стать профессионалом широкого профиля — легко, специалистом узкого профиля — сложнее, специалистом широкого профиля — почти невозможно.



    * Или имеют но мало.


    ** Я не говорю "информатика", потому что это слово вывернула на изнанку российская система образования.


  1. Ungla
    13.11.2018 10:46

    А что пост заплюсованный такой? Человек изобразил своё виденье себя же самого. Обобщив всех под одну гребёнку.


  1. dididididi
    13.11.2018 10:53

    Люди, которые ковыряют самое дно ЯП, и люди, которые каждые полгода меняют технологию одинаково печальны.

    Фуллстек — это человек который знает js+фреймворк(react, sencha ...)+css и какой-то из языков backend(java, python...)+ БД+общее знакомство c devops.

    Естественно, у каждого уклон свой, у меня умный java-бэк, тупой фронт; другие поднимают graph ql+ круд-плагин для постгрес, а весь код пишут на js, потому что js им удобней, БДшники все на процедурах и триггерах напишут.

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

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


    1. Neikist
      13.11.2018 10:54
      +1

      И вы туда-же… Кроме веба вообще то и другая разработка есть. И подразумевается что фуллстек может еще и мобилку написать нативную например, и десктоп приложение, и под мк что то набросать…


      1. VolCh
        13.11.2018 11:31

        Это, по-моему, уже не фуллстэк, а универсал. Фуллстэк предполагает полный стэк от клиента до СУБД, если брать трехзвенку. Он не предполагает, например, написание пяти различных видов клиентов, включая МК. Полный стэк не означе все стэки.


  1. biilsun
    13.11.2018 10:56

    Большинству не крупных компаний сеньоры не нужны тем более если их несколько штук необходимо по разным технологиям, им достаточно адекватный мидл full-stack который порешает конкретные задачи пускай даже не самым эффективным способом и без использования самых последних модных технологий.


  1. worldmind
    13.11.2018 10:59

    На самом деле, в стародавние времена, когда появился термин full-stack разработчик, под ним подразмевался не человек-оркестр, который фигарит на всём, что нужно в данную секунду, а человек, который понимает весь стек технологий начиная от своего языка программирования и далее вглубь до самого процессора.
    Такое понимание нужно, чтобы решать нестандартные проблемы, которые возникают, когда абстракции начинают протекать.
    А потом, всякие бестолковые конторки испортили термин.


    1. worldmind
      13.11.2018 11:01

      И понятно, что текущая трактовка термина фуллстэк противоречит всей логике развития цивилизации, которая всегда шла по пути спеуиализации, разделения труда и получала на это профит.


  1. ZAMnoTEX
    13.11.2018 11:17

    Проблема в том, что бизнесу нужны фулстеки
    — Это российскому мелко-среднему бизнесу нужны фуллстеки (почему зачеркнул? потому что в крупных не-IT компаниях так же). Попробуйте поработать в зарубежной IT-компании. Там четкое разделение ролей, нужны узкие специалисты с глубокими знаниями. Может быть, не везде. Но я ушел из такой компании в том числе и потому, что надоело заниматься одной очень узкой вещью.


  1. Zoolander
    13.11.2018 11:34

    Спасибо за статью, но теперь очень хочется увидеть статью про тот самый "дизайн на абстрактных классах в typeScript", чтобы понять, что произошло. В комментариях выше уже обсудили, но непонятно, что имеет в виду автор. Может быть, выложите хотя бы код на Гитхабе, чтобы можно было посмотреть? А лучше статью, чтобы можно было уютно посидеть в комментариях и ознакомиться со взглядами всех экспертов )


  1. Mabusius
    13.11.2018 11:43

    Все фуллстакеры, которых я встречал, были на самом деле фронтами, которые просто не ссали лезть в бекенд. По вакансиям, что я рассматривал, тоже самое — под «фуллстак» всегда подразумевался фронтенд, просто в компании как класса не было бекендеров и брать их они принципиально не хотели, используя на беке только типовые решения. ИМХО фулстакеры это миф. Уверен какойнибудь ушлый рекрутер и меня бы в фуллстакеры записал, ведь я тоже могу, в случае конца света, и фронт собрать из говна и палок.


  1. jee
    13.11.2018 11:47

    Прекраснейшие мысли, спасибо за статью!


  1. aensidhe
    13.11.2018 11:50

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

    Быть сеньором != знать спецификацию языка наизусть.


  1. javamain
    13.11.2018 12:10

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


  1. inf
    13.11.2018 12:13

    Что страдать… учись просто паралельно у узкопрофильных спецов.


  1. ekubyshin
    13.11.2018 12:14

    Мне кажется автор рассказывает о своем неудачном опыте быть крутым разработчиком. В моей жизни я видел несколько примеров успешных разработчиков, которые хорошо могли кодить на разных языках и при необходимости решать задачи на разных рубежах.
    Как один из примеров — senior android developer несколько лет кодил под андройд и довольно успешно, потом переехал в Европу и сменил род деятельности на бэкенд разработчика на java, при этом время от времени может еще писать вещи на js, android.

    Другой пример, это вообще уникум — кодил на java, потом на scala несколько лет. После этого ушел попробовать себя в роботосроении на c++, где он написал аналог монад на с++. После этого он понял, что все это не то и ушел в анализ данных, запилил стартап, закончил школу анализа данных и успешно работает в этой области.

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

    Я изначально начинал как html/css верстальщик, через 1.5 года верстки сайтов различной сложности, понял, что пора бы подключать всемогущий js и вот я набрал опыта в районе 5 лет на html/css/js со всеми этими react, angular, backbone, typescript, babel и подобными приблудами. Начал пописывать на nodejs и понял, что меня уже просто тошнит от фронта и от js в целом. Далее чудом мне повезло и я перешел в ios разработчики. Сначала перенял код на objective-c, а потом полностью переписал проект на swift + rx. В итоге уже более 2х лет на ios разрабатываю. Сейчас я понимаю, что после 8 лет кодинга, я прокачался по алгоритмам, дискретке и в целом в кодинге и понимаю, что мои знания можно применять в более интересных проектах, а не просто брать дизайн, заверстать, накидать кода с анимациями и сдать проект. И да, несмотря на 2 года без js, я взял проект на фрилансе по SPA приложению и успешно его сделал от html/css с модными flex-box, postcss и cssmodules, до react+mobx. И на воспоминания скилов ушло неделя.

    Как итог: через 3-5 лет у некоторых сениоров в голове возникает мысль, что он получил достаточно опыта и знаний в конкретной области и языке и появились новые знания и силы, чтобы попробовать себя в чем-то другом. Все это конечно при условии того, что разработчик постоянно развивается и познает новые вещи в мире программирования, а не просто пишет код на одном и том же и делает однотипные задачи на своей постоянной работе.


  1. olegfil
    13.11.2018 12:27

    Не отчаивайтесь — вы еще так попрыгаете по технологиям, потом поймете что у разработки ПО есть тоже свой уровень абстракции, слабо зависящий от технологий, заинтересуетесь им и станете архитектором :)


  1. HellWalk
    13.11.2018 12:36

    Работаю с сайтами с 2007 года, прошел путь от недоспециалиста на все руки под названием «веб-мастер» (который не только фулл стек, но еще и в дизайн, и в SEO, и в контент может), затем перешел в чистые программисты (фулл стек), затем, в чистый бек — каждый раз моя зарплата вырастала, а работа становилась комфортней.

    Полностью согласен с автором — на рынке труда ценятся специалисты высшего уровня. А чтобы стать таким специалистом нужно долгие годы сидеть в одной узкой сферы. Хотя, какой узкой, даже бек часто совмещает в себе несколько специалистом — программист, спец по БД, админа по поддержке серверов.

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


  1. Mycolaos
    13.11.2018 12:39

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

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


  1. deepmind7
    13.11.2018 12:55

    Jack of all trades, master of none.


  1. prokubyshin
    13.11.2018 12:55

    Мне кажется автор рассказывает о своем неудачном опыте быть крутым разработчиком. В моей жизни я видел несколько примеров успешных разработчиков, которые хорошо могли кодить на разных языках и при необходимости решать задачи на разных рубежах.
    Как один из примеров — senior android developer несколько лет кодил под андройд и довольно успешно, потом переехал в Европу и сменил род деятельности на бэкенд разработчика на java, при этом время от времени может еще писать вещи на js, android.

    Другой пример, это вообще уникум — кодил на java, потом на scala несколько лет. После этого ушел попробовать себя в роботосроении на c++, где он написал аналог монад на с++. После этого он понял, что все это не то и ушел в анализ данных, запилил стартап, закончил школу анализа данных и успешно работает в этой области.

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

    Я изначально начинал как html/css верстальщик, через 1.5 года верстки сайтов различной сложности, понял, что пора бы подключать всемогущий js и вот я набрал опыта в раойне 5 лет на html/css/js со всеми этими react, angular, backbone, typescript, babel и подобными приблудами. Начал пописывать на nodejs и понял, что меня уже просто тошнит от фронта и от js в целом. Далее чудом мне повезло и я перешел в ios разработчики. Сначала перенял код на objective-c, а потом полностью переписал проект на swift + rx. В итоге уже более 2х лет на ios разрабатываю. Сейчас я понимаю, что прокачался 7 лет кодинга, я прокачался по алгоритмам, дискретке и в целом в кодинге и понимаю, что мои знания можно применять в более интересных проектах, а не просто брать дизайн, заверстать, накидать кода с анимациями и сдать проект. И да, несмотря на 2 года без js, я взял проект на фрилансе по SPA приложению и успешно его сделал от html/css с модными flex-box, postcss и cssmodules, до react+mobx. И на воспоминания скилов ушло неделя.

    Как итог: через 3-5 лет у некоторых сениоров в голове возникает мысль, что он получил достаточно опыта и знаний в конкретной области и языке и появились новые знания и силы, чтобы попробовать себя в чем-то другом. Все это конечно при условии того, что разработчик постоянно развивается и познает новые вещи в мире программирования, а не просто пишет код на одном и том же и делает однотипные задачи на своей постоянной работе.

    К сожалению, автор, видимо пошел по другому пути.


  1. 1Tiger1
    13.11.2018 13:18
    +1

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

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

    «Бам! Забыл, когда вызывается статический конструктор в шарпах.» — о ужас, и что? провалите экзамен или собеседование где вас спросят «когда вызывается статический конструктор в шарпах»? Как это повлияет на реальную разработку на реальном проекте, одноминутной задержкой, одним запросом к гуглу или к мануалу?
    «Упс! Я не могу правильно реализовать IDisposable без гугла» — та же ерунда, ну зачем без гугла, главное что вы знаете зачем это и что за собой потянет, а как реализовать можно и почитать.
    «Пытаюсь мутировать стейт в реакт компоненте.» — вот это уже плохо. Хотя насколько плохо я не знаю, с реактом плохо, по нулям, но судя по контексту вы используете паттерн не по назначению и применяете его там где технологически не нужно или невозможно. Вот как раз знания чем что лучше делать и понимание как это лучше делать и определяют синьора. Архитектор поднимается на уровень абстракции выше и ему уже точно детали языка не нужны.

    Простите за аналогию:
    Джуниор умеет держать молоток и бить по гвоздю (иногда надсаженному).

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

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

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

    Тим лид задает настроение чтобы всем было комфортно делать этот скворечник, периодически извиняясь и обьясняя что требования к скворечнику поменялись и теперь вход нужен не круглый а прямоугольный и меньше чем был, и птичкам нужно остекление в пол. А так же ругаясь на запоротые доски и гвозди и потерянное время, и за то что крышу не успели доделать. Гвозди или шурупы не самая главная его задача но он все же был синьором и частично совмещает и сейчас, так что может то же что и синьор (но не факт что то же что и архитектор), хотя может про суперклей и не слышал, не хватило времени.

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

    Еще раз извиняюсь за аналогию.


    1. hardmodebitch
      13.11.2018 14:05

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


      1. 1Tiger1
        13.11.2018 15:51
        +2

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


      1. alsii
        14.11.2018 17:10

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

        Тем хуже для них. Они не пройдут собеседования.


  1. hippoage
    13.11.2018 13:21

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

    На каждой платформе (нечто более узкое, чем просто яп) нужно писать в соответствии с практиками платформы. Это да, важно осознавать. Так же важно понимать, что ментально работа на UI и бекенд разная: разные вещи важны. Нужно осознанно перестраиваться. Внутри одной недели делать разное с качеством сеньора не получится.

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

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

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

    Важно так же понимать, что 90% сеньоров в одной технологии особо много не знают, т.к. чем дальше учишься, тем прогресс слабее, а большинство вообще бросает это дело. Так что с точки зрения работодателя в среднем человек, который владеет несколькими технологиями гораздо лучше обучен (будет писать более поддерживаемый протестированный код с меньшим количеством багов, хотя и может что-то редко упустить в особенностях платформы), чем человек в одной технологии. Но ещё не все так считают: обычно отбрасывается «в среднем» и пытаются найти исключение.


  1. gotz
    13.11.2018 13:42
    +2

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

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

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

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


  1. norlin
    13.11.2018 14:16

    Фуллстек – это про область применения, а «миддл/сеньёр» — это про уровень знаний. Намешали тёплое с мягким, приправили личным мнением… Не делайте так, пожалуйста.

    Фуллстек может быть и джуном, и миддлом, и сеньёром. Очевидно, чтобы стать честным фуллстек-сеньёром, надо уметь каждую из входящих в «фуллстек» технологий на уровне сеньёра.


    1. VolCh
      13.11.2018 18:15

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


      1. norlin
        13.11.2018 18:24
        +1

        Это уже вообще что-то крайне субъективное и личное.

        Я вот считаю наоборот – «фуллстек» лычка не может превосходить минимальную «среднюю» лычку по технологиям. Но это всё сильно расплывчато, нет же никаких точных критериев оценки скиллов.


        1. Fesor
          13.11.2018 20:54
          +1

          фулстэк подразумевает более широкий но менее глубокий скоуп знаний. Банально в силу того что за всем уследить вы не сможете. Да и "фулстэк фулстэку" рознь. Ну и даже если вы носите гордое звание фулстэка это не отменяет специализацию.


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


          Ну то есть я вижу проблему с тем что понятие "фулстэка" у всех разное. Знать все невозможно. Но оно и не нужно обычно. Достаточно знать много, а копать вглубь только при необходимости.


          1. norlin
            13.11.2018 23:44

            О том и речь, да.


  1. weiser
    13.11.2018 15:52

    Работал я как-то с фулстеками.
    Один (тимлид) не знал где находится в проекте папка node_modules.
    Второй — задевелопил фичу, изменив исходный код пакета в локальном node_modules и закоммитил всё это (проапдейтив .gitignore конечно же).
    Случаи смешные, а ситуация страшная.


    1. kubk
      13.11.2018 23:37
      +3

      Это не фуллстеки, а некомпетентные разработчики.


      1. weiser
        14.11.2018 08:46

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


        1. VolCh
          14.11.2018 16:14

          Легко.


          1. weiser
            14.11.2018 16:36

            По себе судите?


            1. VolCh
              14.11.2018 17:12
              +1

              Наоборот. Как бэкендер с концепцией пакетных менеджеров стал знаком задолго до появления ноды. И даже с самой нодой познакомился раньше, чем она начала просачиваться на фронтенд. Если фронтендер не работал с пакетными менеджерами вообще, и с npm в частности (а это вполне реально в нескольких сценариях), то я, как фуллстэк девелопер с уклоном в бэкенд, по вашим меркам, получается «сеньористей» фронтендера, который наизусть помнит все WebAPI's и, до кучи, почти не ошибается, когда говорит с какой версии IE тот или иной поддерживается и есть ли полифилл для более ранних. А это явно не так.


        1. Fesor
          14.11.2018 19:06

          сложно представить разработчика который с node работает (а на нем можно и бэк писать, и просто юзать тулы написанные и дистрибьютящиеся через npm) не знать что такое node_modules.

          Ну а на тему изменения серд парти — это может намекать только на то что ваши разработчики никогда не работали с менеджерами пакетов. Что странно в наши дни.

          Так что нет, это вопрос не в фулстэк/не фулстэк. Знания необходимые что бы не творить такой черни на 90% проэцируются из любых других языков.


  1. math_coder
    13.11.2018 18:03
    +1

    > Упс! Я не могу правильно реализовать IDisposable без гугла.

    Реализовывать IDisposable без гугла — это уровень джуниора. Миддлу неплохо бы понимать, что IDisposable реализовывать вообще не надо.


    1. Ivanus_1
      13.11.2018 23:37

      Что значит не надо, или я уже скатился до уровня джуниора. а если у меня в классе private переменная которая требует удаления сразу после использования?


      1. math_coder
        14.11.2018 09:12

        Что это антипаттерн, и что в современном C# есть средства получше. Конечно, в public API нужно использовать хотя бы и антипаттерн, если это именно то, чего ждут пользователи этого API.


        Но за исключением указанной выше ситуации вместо IDisposable лучше просто сделать метод Dispose(), а лучше метод с более конкретным названием. Не знаю, стоит ли такое упоминать, но класс должен быть sealed.


        Конечно, раз уж мы сделали класс sealed и всегда зовём Dispose() явно, не полагаясь на финалайзер, то можно и : IDisposable подписать — просто чтобы использовать using. Но тогда появляется соблазн прикастить его где-нибудь к IDisposable, вернувшись таким образом к антипаттерну, а using на самом деле прекрасно заменяется на статический метод вроде T With<T>(Func<MyDisposableClass, T>), причём в некоторых случаях можно даже скрыть конструктор класса, оставив только этот метод.


        А в некоторых случаях можно пойти ещё дальше, и вообще избавиться от класса, оставив только функцию With, которая будет выглядеть как-то так: T With<T>(Func<Resource1, Resource2, Resource3, T>)


  1. riky
    13.11.2018 21:24
    +1

    зато будучи фуллстеком классно свои проекты поднимать (или с партнерами).


    1. VolCh
      13.11.2018 22:17

      Или обучать, хоть фуллстеку, хоть какой-то одной или нескольким технологиям из стэка. Грубо говоря, пока фронтендер будет учить своих учеников на статических сайтах, фуллстэк сервачок какой-то поднимет, чтоб динамика была.


  1. rznELVIS
    13.11.2018 23:42

    Ну по моим наблюдениям — опытные фул-стэк девелоперы уходят потом в тим лиды и ПМы. Если считать фул-стеком — .NET/Java-ка с навыками SQL + JS.


    1. toruk0109
      15.11.2018 12:38
      -1

      То есть [ PHP, Java/Kotlin, SQL, JS, HTML, CSS] не считается уже fullstack'ом?


  1. toruk0109
    14.11.2018 07:58

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


    1. adiletmurzaliev
      14.11.2018 13:28

      test


  1. WeltRogg
    14.11.2018 10:00

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


    1. Neikist
      14.11.2018 10:26

      Так как разработка сама по себе нуднятина

      рисование иллюстраций
      когда нибудь тоже хочу заняться, когда программирование и математику подтяну, не зря в детстве почти год в художку ходил XD.
      А пока хватает и программирования с двумя языками иностранными, даже математикой заняться не выходит)) Правда я сейчас в процессе спрыгивания на другую технологию, и это занимает от 2 до 6 часов свободного времени каждый день, когда по новой технологии на работу устроюсь может получше будет)


      1. Neikist
        14.11.2018 14:04

        Кстати, обнаружил что не дописал

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


    1. SmilePic
      14.11.2018 13:29

      Вы полагаете, среди специалистов в конкретной области это реже встречается? Интересно было бы собрать статистику. У меня в соседнем окне на это же ругается адовец со стажем…


  1. Sergei_Erjemin
    14.11.2018 12:00
    +1

    Все это хорошо, и возможно, правильно… Но только если вы планируете всю жизнь работать в найме!

    А вот если фонтанируете бизнес-идеями, запускаете собственные проекты и т.п., то и фулстек-разраба маловато будет! Захочется изучать журналистику, дизайн, маркетинг, экономику и еще тонну всего. И вот представляете какая депрессияи аут, когда ваш проект «не полетел»??? Вы ж не то что там, мидл! Вы вообще ноль во всем!

    Вроде и портал-ценовой-агрегатор-с-биллингом-и-блекджеком полностью закодить можете, и статью можете на уровне Эксперт/Коммерсантъ, и дизайн, и экономику проекта рассчитать со всеми сопутствующими исследованиями, кеш-флоу, дисконтированием, IRR, P/E и P/B на пятилетку… Да только PM, таких порталов штук пять одновременно волочёт… Кодер его запилит за месяц, а не за год… Штатный корреспондент из Ъ таких как ваша статья по две в неделю сдаёт, а ты одну со скрипом за полмесяц… Дизайнер по пять логотипов в день стругает и по пять вариантов каждого… Аналитик венчурного фонда по 20 проектов в неделю дьюти-дилинжит… А ты. по сравнению с ними, вообще детсадовец против Крепкого Орешка! Что ж теперь, такому широкопрофилю?.. Стреляться? Нет уж! Лучше ощущать себя д'Артаньяном… просто пока у вас всего 20 пистолей в кармане, странная лошадь из Мэнга над которой все ржут, и в добавок вообще не земляк де-Тревиля и про него даже и не слышали. :))


  1. yakovenkoroman1993
    14.11.2018 13:29
    -1

    «Я, конечно же, сделал вид, что просто мои коллеги — бездарные идиоты» — не много смущает такое отношение к команде, но дело Ваше. А что касается, фулл или не фулл, то для проекта лучше, если человек на старте знает какую-нибудь технологию, нежели только одну и глубоко. Компании будет проще зарядить такого фуллстэк разработчика на новую задачу, чем искать нового узкого специалиста для этой конкретной задачи. При том, что не факт, что такие задачи еще возникнут в ближайщем будущем. Касаемо, мутаций в реакте, то уверен, что разработчик даже поверхностно не смотрел документацию и рекомендации. Так даже и фуллстэк не делают.


    1. k06a
      14.11.2018 14:14
      +1

      Это называется гипербола — художественное преувеличение


  1. k06a
    14.11.2018 14:13
    +1

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


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


  1. bro-dev0
    14.11.2018 21:01

    Знать несколько яп на высоком уровне это не быть фулстком, есть бизнес задачи которые требуют стек специалистов и если 1 чел способен решить их всё в 1 лицо он называется фулстеком.
    Термин набрал популярность с развитием фриланса, когда 1 чел мог заменить студию и сам сделать бриф дизайн сверстать и интегрировать на кмс, и поддерживать дальше сайт, но в целом можно не только к ит применить, если челу заказывают шкаф, он сам приедет измерит спроектирует начертит выпилит и смонтирует то он тоже будет фулстек.
    Ими выгодно быть, и бизнесу выгодно их нанимать когда задача условно занимает 1 человеко месяц, связано это с тем что человек в команде будет работать заведомо медление, так устроена жизнь, будут тратить время на коммуникации и максимум при гении менеджере-тимлиде можно достичь 0,9 эффективности от человека, а может быть и 0,5, то есть 2 будут работать как 1.
    С другой стороны если задача будет на 10 человеко лет, то смысла заказывать её у 1 человека нет, тогда и нужны команды.


    1. VolCh
      14.11.2018 22:59

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


  1. paratagas
    14.11.2018 23:43

    Работодателю, особенно если это маленькая студия, очень выгодно держать фуллстэков. Он и бэкенд напишет и фронтенд. Часто еще и функции devops'а выполняет: сервак на облаке развернуть, настроить, БД, роли, все дела. Если разработчику это интересно, то все ОК. А если нет? Если ему нужно постоянно читать по выходным доки (ну что тебе стоит? пару вечеров же!). На бэкенде развиваются фрэймворки, по крайней мере, экосистема PHP и Python точно шустро идет вперед. На фронтенде их вообще зоопарк, и каждый день новый. Вчера новый VueJS, сегодня хуки и профайлеры в React, завтра новый Angular. А еще БД. Только SQL джойны и транзакции освоил, давай-ка NoSQL почитай. Вот тебе MongoDB, вот тебе Cassandra. А еще давай-ка репликации подучи, Linux, HTTP, естественно. Итого 5 языков (например, PHP, Javascript, SQL, HTML, CSS); 2 фрэймворка или библиотеки (например, Laravel и React). Немного Bash и HTTP. Немного дизайна и общения с заказчиком. Если нет UX- дизайнера (а в аутсорсе их почти нигде нет), то еще и это. Если нет тестировщика, то еще и потестить. А если на выходные упал сервак или база данных, то придется еще и отказаться от личных планов, чтобы восстановить работу приложения. В каждой из этих сфер каждый день создаётся что-то новое. Чтобы быть в теме, нужно задротствовать и не вылезать из мануалов. Но если такой путь утомил, можно ведь вполне за ту же ЗП только фронт или бэк готовить. Объем необходимых знаний, ответственности и головной боли в 2 раза меньше, и есть время хоть иногда просто поваляться вечером перед телеком и не пилить себе, что вышла очередная библиотека, а я тут лежу и не изучаю ее


  1. kovalexius
    15.11.2018 12:42
    -1

    Синьор — это специалист со знанием широкостекового мидла, который занимается неким режиссированием проекта — то есть продумывает архитектуру, концепцию, формализует и распараллеливает задачу от заказчика на несколько подзадач для разработчиков, ведет чейнджлог, просматривает merge request'ы, порой сам мёржит.


    1. Frimko
      15.11.2018 14:16

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


      1. VolCh
        15.11.2018 16:56

        Всё зависит от организации команды. Он может быть иерархическая: лид или ПМ ставит задачи паре сеньоров, те их декомпозируют и часть делегирует миддлам, те тоже декомпозируют и часть делегируют джунам.


        1. Frimko
          15.11.2018 17:37

          очень плохая иерархия. Так люди будут тасками швыряться, а не проект пилить. Думаю подобная иерархия в какой нить галере сойдет, где постоянная текучка, низкая безграмотность в профессии и зп такая-же. В любом другом случае… есть пул тасков, есть лид, ПМ и остальные, которые разгребают эти таски по принципу — «я хочу», остальные неурядицы устраняются средствами лида и ПМ. В подобных случаях, работа лида просто в кайф, когда народ в команде собирается нормальный.