- PVSM.RU - https://www.pvsm.ru -
Если Вы настойчиво хотите попасть в команду разработчиков компилятора или в «мир Дикого Запада» — то смело выбирайте и учите топовый язык [1] программирования из TIOBE и лучше всего: на уровне его спецификации. А если серьезно, то сейчас в отрасли все так запутанно с логикой и выводами, столько маркетинга и воды, что самая выигрышная стратегия — включить свои собственные
Дети отличаются от взрослых пониманием слова «ответственность». К сожалению, далеко не все дети — взрослеют вовремя, а некоторые — так и умирают в памперсе. Ничего страшного тут нет — кроме одного: дети в команде программистов заставляют других очень сильно страдать, особенно когда сроки горят и релиз близко: либо внезапно обделываются посреди опенспейса, либо требуют соску во время мозгового штурма предметной области с представителями клиента.
Взрослые отличаются от детей пониманием ключевого принципа IT-менеджмента: «программирование — это привилегия». Среди опытных и успешных коллег-разработчиков наиболее адекватные и кодят хорошо и «двигают компанию вперед» одновременно.
Да, мы — люди и склонны к эмоциям. Но до сих пор никто не знает, как правильно нужно программировать, хотя прошло уже больше 50 лет с момента изобретения компьютера. Никто! Все только истерят и пытаются привлечь в свой лагерь все больше сторонников, одновременно соблазняя бизнес создать на «себе» проект :-) Поясню на примере.
Дело в том, что первые компьютеры работали действительно медленно, очень медленно, и были очень дорогими. Поэтому первые программы писали на очень низкоуровневых языках, а иногда прямо на машинном коде. Сейчас подобные «доисторические» технологии иногда применяются, но точечно: для создания операционных систем и их компонентов (близких к «железу»), для игровых движков, для высокопроизводительных библиотек и серверов [3], для криптовалют [4] и, конечно, для создания языков программирования [5].
И если C [6], несмотря на его тотальную дырявость и высокую опасность для разработчика, получился действительно хорошим и завоевал сердца ценителей, то C++ [7] получился на редкость уродливым и противоречивым созданием — но что делать, это жизнь. Может Rust [8], с правильными идеями относительно безопасной работы с памятью, повлияет на ситуацию в лучшую сторону, но по уродству синтаксиса и нечитаемости он, похоже, оставил C++ далеко позади.
Ситуацию еще больше усугубляет появление Golang [9]. С одной стороны — ничего нового в нем нет, дембельский аккорд великого Кена Томпсона [10]: лишь жалкие остатки от возможностей Java. С другой — стало действительно проще писать «относительно» системный и многопоточный софт и это факт, который оценили многие компании [11] :-)
В этом лагере Вы встретите преимущественно глубоко знающих низкоуровневые технологии и железо «настоящих» хардкорных бородатых программистов, которые учили, как правило, один язык программирования — зато всю жизнь и засыпают со спецификацией компилятора вместо жены. Воистину — в этом лагере крутые люди. И если Вы не знаете, на какие команды x86 процессора раскладывается yield в python [12] — стыд Вам и позор. Поэтому совет — избегайте этого лагеря, пока не дочитаете до конца поста.
Но есть и обратная сторона медали. Проекты тут делаются не то что долго, а… десятилетиями [13]. Низкоуровневые языки программирования не то, что помогают, а наоборот — мешают. Постоянно происходят нарушения в работе с памятью, требуются десятки и сотни тестировщиков (либо можно выложить на github и тестировать будем мы с вами коллективно) и тысячи unit и других видов тестов, чтобы «оно взлетело» [14]. Многие разработчики, которые влились в команду на старте проектов, не доживают до релиза и умирают от старости, помогая до последнего вздоха бета-тестерам. Но эти мужественные люди, до кровоточения из глаз, до появления стигматов делают все возможное и… рождаются шедевры [15].
Т.к. никто до сих пор не знает, как нужно правильно программировать, методом естественного отбора образовался лагерь «грамотного проектирования и надежности». Вы с ума сошли программировать на языках, допускающих небезопасные операции с памятью через указатели — так же можно мир довести до апокалипсиса: «segmentation fault в софте ядерного реактора». Как можно начинать вообще делать проект без поддержки строгой типизации в языке?? И придумали очередные правильные языки программирования: Java и C#. Но в Java забыли о вреде null-значений, а в C# — не до конца продумали обратную совместимость. В результате образовался огромный корпоративный, относительно безопасный и относительно обратно совместимый мир. В этом мире цель измеряется строками кода в день (обычно не больше нескольких десятков, ибо пальцы растираются в кровь) и толстыми философско-религиозными книжками про шаблоны проектирования и, о да, чуть не забыл, про способ зарыть себя, проект, клиента и окружающий мир в код и утонуть в нем, вспоминая в агонии 20 уровневую иерархию наследования — про ООП [16]. Один из основных девизов лагеря — «зачем делать просто, если можно… сложно и надежно, надолго, на века!». Причем некоторая часть умеет писать таки быстро и элегантно, стирая руки в кровь и собирая в голове каждое утро структуру проекта, смотря одновременно на 3 монитора. Но некоторые так увлекаются, что продолжают создавать иерархии иерархий внутри иерархий иерархий до бесконечности [17] — и цель уже давно потеряна, а глаза продолжают гореть и руки чесаться.
На самом деле, в областях, где предметная область хорошо устаканилась и укладывается в «объекты со статусом и сообщения между ними» — подобный подход работает очень хорошо.
Особенно радует при «строгой» (кавычки, потому-что дальше будет про haskell) статической типизации (это когда заранее известны типы сущностей, они проверяются компилятором и к числу нельзя прибавить строку) легкость и удовольствие при проведении рефакторинга и улучшения кода и высокое, если не сказать великолепное, качество сред разработки [18]. Коллеги в этом лагере часто очень образованы в архитектуре софта, много читают (порог входа — высок), разбираются в возможностях многочисленных библиотек платформ, шаблонах проектирования, техниках написания тонн документации и создания автоматизированных тестов, тестах этих тестов и могут месяцами писать mock, который окажется ненужен. Опять таки — часто проекты делаются и запускаются весьма долго, большими командами, требуются многочисленные тестировщики, но характер ошибок на порядок менее фатален, что вдохновляет. Попасть в эту «касту» энтерпрайз-разработки — очень непросто. Если вы продемонстрируете, как на PHP можно решить задачу в 5 строк, которую коллеги на java решат за 5 дней — вас заживо сожгут в микроволновке :-)
В академической среде образовался еще один, очень интересный и рекомендуемый к пониманию лагерь и набор функциональных языков программирования (Lisp, Haskell, Erlang и другие). Вы что, с ума сошли программировать с использованием переменных и циклов — так же можно натворить много ошибок! Программа это — набор вызовов функций, а вместо циклов — используйте рекурсию, господа! ООП? Нет, не слышали — typeclasses и алгебраические типы данных. Не знаете об аппликативных функторах [19]и не листали теорию категорий — да вы не развиваете собственный
На самом деле, по моему мнению, чтобы войти в этот лагерь и понять его ценности, нужно ооочень сильно напрячь
К черту архитектуру и ООП, брат! Ктулху любит тебя, а утиная типизация [21] — ключ к успеху! Строгая типизация? А кто в здравом уме будет присваивать к числу строку?? Статическая типизация и компиляция — трата времени, ибо код пишется один раз и если его не успеть написать к релизу, его выбросят (да и так выбросят, но чуть позже). Рефакторинг? Сразу пиши правильно :-) Инкапсуляция? Поставил черточку перед именем переменной и все дела [22]. ООП — переусложнение без нужды. Какая к черту компиляция — F5 и видишь результат. Шаблоны проектирования — нет, не слышали: скриптинг наше все… Хочешь «травки»?
Самое интересное, что когда вникаешь в языки с динамической типизацией (строгой в python, нестрогой в php и javascript) то постепенно открываются глаза на реальную картину вещей, ибо:
И черт с ним, с рефакторингом :-) Жить-то веселее стало (я надеюсь разработчик, поддерживающий мой код, не узнает, где я живу). В этом лагере вы часто встретите множество жизнерадостных людей совершенно разных специальностей, кроме «программирования на ассемблере», умеющих, тем не менее, очень быстро и эффективно, в 5 строк решать задачи и долго и успешно поддерживать код и веб-проекты.
Посмотрите на последние тенденции в этом лагере и проникнитесь этой философией счастья. Простая и понятная среда программирования в браузере [24], ну что может быть сексуальнее?
А как просто можно сейчас поднять неблокирующий веб-сервер, обслуживающий тысячи соединений в 10 строк на node.js [25] и комьюнити растет как на дрожжах?
И никаких «Eclipse XML Soap Entiny beans энтерпрайз ООП...» — json и csv и улыбка (и запах неизвестного растения). И код при этом читается, и помещается в
И оказывается, что «так» тоже можно успешно программировать и потраченные в «промышленных языках программирования» годы — прожиты зря (зато пальцы стали крепче).
Вы в шоке? Я тоже. А представьте в каком изумлении пребывают клиенты, выбирающие технологию для реализации бизнес-проекта! :-)
Я думаю Вы в данный момент хорошо поняли, что IT-мир действительно сошел с ума и потерялся (шутка). Некоторые языки программирования, типа Scala, пытаются усидеть на всех стульях, но это у них пока не очень получается — код становится сложно понимать простым смертным. А если серьезно, то конкуренция парадигм программирования будет только усиливаться ибо… задачи в проектах существуют совершенно разные и именно от задач и нужно «плясать»! В устаканенной предметной области (серверы, библиотеки) лучше подойдет номинальная типизация [26] (С++, Java, C#...), где-то лучше будет со структурной типизацией [27] (Golang, Haskell...), а в скриптинге веба или задачах машинного обучения придет настоящее счастье с утиной [28] (python, php, javascript...). Не нужно думать, что статическая типизация [29], особенно строгая, это прямо «must have» — вы провалите сроки и код с удовлетворенной параноидальной мыслью о «возможных ошибках» будет выброшен на помойку. В вебе, скриптинге и машинном обучении можно уверенно двигаться с большой скоростью вперед и с динамической утиной типизацией и php и python с огромным количеством прекрасных и мощных библиотек [30] этому хороший пример.
Поэтому забудьте про «какой выучить язык программирования в 2018 году» к чертовой матери:
Дальше, выберите область задач, которыми вам будет интересно заниматься, например веб или машинное обучение и:
Допустим, Вам интересно машинное обучение… Поздравляю! С одной стороны находится академическая теория — но из нее Вы должны вытащить суть по матстатистике и линейной алгебре и ни в коем случае не зависать на многомесячных курсах (сойдете, поверьте мне, с ума, если вы не математик, а гуманитарий — причем незаметно для себя). С другой стороны нужно научиться быстро писать полезный код и решать задачку в 5-15 строк. Да, можно все написать на C лет через 10 000, поэтому Вы смотрите на опыт коллег и выбираете, правильно, python, в котором на данную тему море библиотек и готовых решений. Вы посвящаете изучению python пару выходных — больше там нечего учить, язык очень прост (а в дебри мы договорились не лезть, ибо время-деньги). Дополнительно еще почитайте про суть numpy, pandas, scikit-learn и, если прямо глаза горят, то Keras и вперед, делать проекты. Но можно пойти по другому пути, долгому, трудному и ведущему к личной святости и социальной бедности (поймете через 3 года суть алгоритма, продавая газеты в электричке, но может это такой, особый путь) — начать реализовывать алгоритмы самостоятельно, с ручным управлением памятью, или внедрить более тяжеловесное [31] решение и зарыться в коде на месяцы. Неправильно выбранный инструмент — ключ к бессонным ночам и бесцельно потраченному времени — избегайте сложности всеми способами.
Неправильно выбранный инструмент, даже самый распиаренный, даже бесплатно в подарок, пускай даже теоретически все умеющий в перспективе — может угробить вам проект, провалив все сроки. Минимизируйте этот риск как только можете и не можете.
Итого, друзья, мы убедились с вами, что никто не знает, как программировать правильно и успешно, даже мы, разработчики :-) Конкуренция парадигм программирования и технологий все сильнее возрастает, голова пухнет, а свободного времени становится все меньше. Поэтому наиболее выигрышной стратегией начинающего свою карьеру разработчика является — выпить баночку прохладного пива, расслабиться и:
И всегда помните, что время, особенно свободное — ценный ресурс и от нас самих зависит, куда его инвестировать. Удачи всем и хорошего настроения!
Автор: AlexSerbul
Источник [32]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/286322
Ссылки в тексте:
[1] топовый язык: https://tiobe.com/tiobe-index/?a
[2] мозги: http://www.braintools.ru
[3] серверов: https://ru.wikipedia.org/wiki/Nginx
[4] криптовалют: https://eos.io/
[5] языков программирования: https://ru.wikipedia.org/wiki/PHP
[6] C: https://ru.wikipedia.org/wiki/%D0%A1%D0%B8_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)
[7] C++: https://ru.wikipedia.org/wiki/C%2B%2B
[8] Rust: https://ru.wikipedia.org/wiki/Rust_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)
[9] Golang: https://ru.wikipedia.org/wiki/Go
[10] Кена Томпсона: https://ru.wikipedia.org/wiki/%D0%A2%D0%BE%D0%BC%D0%BF%D1%81%D0%BE%D0%BD,_%D0%9A%D0%B5%D0%BD
[11] многие компании: https://www.influxdata.com/
[12] yield в python: https://docs.python.org/3/reference/expressions.html#yield-expressions
[13] десятилетиями: https://www.mysql.com/
[14] «оно взлетело»: https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BD%D0%B8%D0%B9_%D1%8D%D0%BA%D1%80%D0%B0%D0%BD_%D1%81%D0%BC%D0%B5%D1%80%D1%82%D0%B8
[15] шедевры: https://ru.wikipedia.org/wiki/Grand_Theft_Auto_(%D1%81%D0%B5%D1%80%D0%B8%D1%8F_%D0%B8%D0%B3%D1%80)
[16] ООП: https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5
[17] до бесконечности: https://ru.wikipedia.org/wiki/Spring_Framework
[18] сред разработки: http://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/marsr
[19] аппликативных функторах : https://habr.com/post/183150/
[20] криптовалютах: https://www.cardano.org/en/home/
[21] утиная типизация: https://ru.wikipedia.org/wiki/%D0%A3%D1%82%D0%B8%D0%BD%D0%B0%D1%8F_%D1%82%D0%B8%D0%BF%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F
[22] и все дела: https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0_Python
[23] REPL: https://ru.wikipedia.org/wiki/REPL
[24] среда программирования в браузере: http://jupyter.org/
[25] node.js: https://nodejs.org/en/
[26] номинальная типизация: https://en.wikipedia.org/wiki/Nominal_type_system
[27] структурной типизацией: https://en.wikipedia.org/wiki/Structural_type_system
[28] утиной: https://en.wikipedia.org/wiki/Duck_typing
[29] статическая типизация: https://en.wikipedia.org/wiki/Type_system#Static_type_checking
[30] мощных библиотек: http://www.numpy.org/
[31] тяжеловесное: https://deeplearning4j.org/
[32] Источник: https://habr.com/post/417397/?utm_campaign=417397
Нажмите здесь для печати.