Java vs Python? Что выбрать для backend-разработки?
Всем привет. Хочу внутри своей компании перейти в разработку. Хочу заниматься backend-разработкой на Java. Начальник дал контакт человека, с которым можно пообщаться на эту тему. Он посоветовал изучать Python, т.к. он лучше подходит для тех, кто только начинает свой путь в программировании и на нём легче научиться программировать. Он заявил, следующее (цитирую): "Зачем сразу Java? Валера посоветовал? Зачем сразу хоронить людей в понятиях полиморфизма, инкапсуляции и наследований? Прикольно он придумал для тех, кто за функции еще даже не шарит". В общем, вопросы:
1) Как вы считаете, стоит ли учить сначала Python, чтобы научиться программировать?
2) Периодически натыкаюсь на утверждения о том, что после Python будет сложно перейти на другой язык (ту же Java). Так ли это?
Заранее благодарю за ответы.
Эх... всё не так. Если серьезно, то...
1) Сначала изучаете математику на школьном базовом уровне. Хорошо! изучаете, с пониманием.
2) Потом изучаете немного высшую математику: производные, интегралы, комплексные числа и т.д. С пониманием, что такое интегрирование, дифференцирование, как работать в разнызных системах счисления и пр.
3) Далее хорошо изучаете дискретную математику, теорию множеств, алгоритмы...
4) Изучаете немного электротехнику и электронику, чтобы понимать закон ома, как работает транзистор, диод, резистор и т.д.
5) Переходите к схемотехнике: как работают элементы "И", "ИЛИ", счетчики, регистры и т.д. Сильно глубоко углубляться не надо, но понимание принципов необходимо.
6) Изучаете архитектуры компьютеров. Как работает микропроцессор, оперативная память (как адресуется, каких типов бывает), контроллеры и пр.
7) Немного окунаетесь в программирование в машинных кодах и на ассемблере - это нужно для понимания работы микропроцессора и памяти.
8) Потом переходите к языку Си. Глубоко изучать не обязательно, но пощупать крайне желательно.
9) Поверхностно пробегаетесь по разным языкам и движкам на их базе.
10) Останавливаетесь на желаемом языке и осваиваете его за месяц.
Вот собственно и всё. Это если по нормальному.
Комментарий недоступен
Троллинг тоньше чем человеческий волос
На самом деле, вышеизложенное - это только вершина айсберга. Там еще идет изучение операционных систем, баз данных и многое другое.
Не получится изучать всё планово по порядку. Сначала всё изучается поверхностно, каждая интересующая область, а потом идёт изучение мелочей. Какой смысл становиться доктором наук по математике, если ты хочешь программировать?
Во-первых, не о докторе наук речь. А во-вторых, что именно собрались программировать, не обладая никакими знаниями и умениями, кроме знания синтаксиса питона?
Банальный пример: сейчас сына учу программированию, пишем простую игру на питоне (на движке Arcade) - летит бомбардировщик и по нажатию пробела сбрасывает на цель боеприпас. Вроде плевое дело, но... необходимо понимать, как должен лететь боеприпас - какие силы на него действуют и в каком направлении. Это уже необходимо знать физику, вектора, производные. Смещение боеприпаса происходит каждый тик на несколько точек, количество которых задает мгновенную скорость. А это и есть производная.
Но спорить не буду можно всего этого не знать и не понимать, а просто взять готовый модуль, с готовой физикой падений, столкновений и пр. Но это будет уже не то...
Одних Производных маловато. Надо бы ещё аэродинамику накинуть. А то тема смещения пикселя полностью не раскроется.
И решить уравнение Навье-Стокса, иначе какая аэродинамика без симуляции потоков топлива в турбине?
Почему он уже программирует? Ему сначала нужно высшую математику - по Вашему собственному плану, представленному выше - выучить, затем резисторы, транзисторы, операционные системы, и только потом можно выбирать язык. Вы просто мучаете сына какими-то непонятными штуками!
Всё это изучаем, не волнуйтесь.
И как у вас дела с машинными кодами?
Всё ок. Знание, как работает процессор на низком уровне, весьма полезно, даже необходимо для программиста. О реальном программировании в машинных кодах речи не идет, речь о понимании.
Лет двадцать программирую web-приложения. Ни разу с подобной задачей не столкнулся. Но я никогда не писал программ для игровой индустрии.
Ты шо, программирование это математика!
Комментарий недоступен
Вы всерьез думаете, что в рамках комментария уместно с максимальной детализацией излагать все требования к образованию программиста?
>> Потом получаются программисты, которые корутину от потока отличить не могутВот это как раз сущая мелочь. Для нормального программиста - это (если еще не знает) пара дней на изучение и всё.
Комментарий недоступен
Почему ж странные? Ваш текст далее сам поясняет, что не странные, а необходимые.
>> теория операционных систем это основа, вместе с алгоритмами, это базовая вещь для любого программистаА всё это базируется на математике, причем зачастую не школьного уровня. Как можно изучать нормально алгоритмы без знания математики, систем счисления и пр., мне не понятно. Так что ничего странного нет, математика нужна.
>> В машинных кодах никто не программируетНу, так речь и не о реальном программировании в машинных кодах, а о понимании, как это всё работает. Достаточно на нескольких примерах разобраться: как процессор получает данные/команды по шине данных из памяти, как осуществляется адресация, как в АЛУ с регистрами происходят вычисления и т.д.
В общем, речь не о глубоком изучении этих предметов, речь об изучении, достаточном для понимания принципов. Ну и в процессе обучения, да, хорошо бы руками прям в машинных кодах/ассемблере какой-нибудь простой примерчик сделать своими руками.
Чтобы сложить числа и двигать биты не нужна математика, уж точно не та, о которой Вы написали. Процессору нафиг не сдались интегралы, он делает простейшие операции
Скажу так, если попроще и побыстрее то питон, c# и т.д. языки сложные и есть вещи которые не каждый поймет. Я троечник, нефига ничего вышеперечисленное незнаю, но за 2 недели основы питона изучил и понял циклы, переменные, функции, ооп, мультипроцессы, создание клиента и сервера для чата, правдо без интерфейса, чисто в командной строке. Тут главное желание
Так и есть, питон, делфи и прочие - это языки для быстрого решения задачи, создания прототипа. А когда нужно что-то серьёзное, крупное - то конечно придётся учиться разбираться с памятью и переходить к сложным языкам. Чаще всего, конечно, эти языки используются для создания небольших приложений, не требующих ручного контроля ресурсов, так что они, в общем-то, подходят для не меньшего набора задач
Проще говоря, вопрос некорректный. Это как вы бы спросили: "Хочу стать плотником. Чем мне научиться работать - молотком или пилой?". И даже если вас научат забивать молотком гвозди, и даже пилить доски научат, вы станете плотником? Очевидно, что нет. Это же просто инструмент. Спец подберет инструмент под задачу. Если надо, освоит работу с ним. Главное - уметь задачу решать.
Питон сильно разрекламирован, но подходит к очень узкому кругу задач. По началу он простой, но дальше начинается ад: если у тебя в институте были проблемы с вышматом и математический аппарат в мозгу не развит, то пиши пропало. Не въедешь. Да там еще масса костылей, которые нужно пихать во всякие дыры, чтобы все это работало... Ява вообще другая история и по логике и по коду. Она больше связана с проектами, а просто так работать смысла не будет, бабло не поднимешь. Даже не знаю что и посоветовать. В эти сферы войти не так просто, пообщавшись там с дядей не ничего не получится.
Тут дело не в круге задач. Python может вообще все языки заменить, как и любой другой Тьюринг-полный (сейчас даже Excel такой). Вопрос в скорости: в скорости разработки, в скорости изучения, в скорости работы итогового решения. Он разрекламирован, потому что позволяет одной строчкой начать программировать, не изучая точки входа, работу с памятью, проверку ввода-вывода, операторные скобки и т.п., что хорошо подходит детям (на кого, собственно, и рассчитана, в основном, реклама). Всё, что им нужно знать, это то, что подчинённые блоки кода располагаются с отступом - это и визуально понятно, и ничего лишнего не нужно учить. Только по мере необходимости программа обрастает библиотеками.
А Java - совсем другой уровень, начиная с того, что это компилируемый язык, и тут порог вхождения сравнится с C++.
Комментарий недоступен
Сколько сталкивался с "разработчиками на питоне" - всех приходится переучивать с нуля. Т.е. не учить новому языку, а учить нормальным подходам к разработке.
На мой взгляд, питон вообще не для разработчиков. Это инструмент для тех, для кого разработка не является основным занятием. Например, научные, инженерные расчеты.
В свое время таким языком был бейсик - хорош для того, чтобы что-то быстро посчитать, но писать на нем что-то серьезное не получалось.
Ну и правильно сказали выше - разработка, это не знание языка. Язык всего лишь инструмент. А разработка - это умение выбрать во-первых, наилучший алгоритм для решения поставленной задачи, и, во-вторых, выбрать наилучший инструмент для реализации этого алгоритма.
Все идет от задачи к алгоритму. А потом уже язык. Может так оказаться, что Ваши задачи вообще наиболее эффективно решаются на чем-то другом, нежели джава. Возможно, там лучше что-то специализированное использовать. Все-таки джава - язык слишком "широкого профиля", слишком универсальный. И многие вещи, которые в специализированном языке просты и естественны, в джаве решаются путем включения сложных зависимостей, а местами просто костылей.
Сколькими языками программирования вы владеете хорошо, коллега? У меня проблема в том, что в голове одномоментно хорошо сидит только один язык программирования. Сначала это был LotusScript, затем Java, PHP, JavaScript. Я коммерчески писал программы на C/C++, VisualBasic, Clarion, Perl, Python. В институте - на Pascal и Prolog. Из всего этого выбивается только Prolog. Остальные языки плюс/минус похожие. Если пройти "от задачи к алгоритму", то любой из вышеупомянутых языков, за исключением Prolog'а, более-менее успешно реализует "алгоритм". Но при этом у каждого языка есть своя "заточка" - область наилучшего применения. Я всегда пытался не лезть со "своим" языком на "чужое" для него поле. Ну, т.е. не программировать нейросети на JavaScript'е. Хотя у меня был опыт программирования для браузера на Java (GWT). Ну то такое себе - сначала "Вау!", а потом куча проблем там, где их не должно быть.
В общем, у меня другой подход - от языка к задаче. Сначала я овладеваю каким-то языком на достаточно хорошем уровне, осознаю границы его применимости, а затем уже решаю задачи, которые подходят под этот язык. Т.е., язык определяет те задачи, которые я решаю, а не задачи - язык, который я использую.
Вполне допускаю, что есть профессионалы, которые одинаково хорошо (не одинаково плохо, а одинаково хорошо!) владеют сразу несколькими языками и без проблем переключаются между ними. На web'е долгое время считалось нормальным программировать сразу и на PHP, и на JS. Но лично меня всегда клинило на одну сторону. Если я начинал активно использовать какой-то язык, то предыдущий постепенно вымывался из головы.
Конкретно сейчас работаю на платформе (IBM i), которая поддерживает концепцию "интегрированной языковой среды" (ILE) в которую входят CL (командный язык системы, но с типизированными переменными, компилируемый), RPG (очень старый, но вполне еще развивающийся язык для бизнес-логики - типы с фиксированной точкой, удобная работа с датами и временем, строками и т.п.), С/С++, COBOL. Концепция ILE подразумевает возможность написания модулей на любом из поддерживаемых языков с последующим объединением нескольких модулей в один программный объект (модуль - аналог объектного файла, объединение - binding - тоже самое что линковка)
Ну то такое себе - сначала "Вау!", а потом куча проблем там, где их не должно быть.Из этих всех не знаю только Кобол.
Бизнес-логику пишем на RPG. Всю работу с БД - на RPG. Там дополнительно еще если два способа работы с БД - прямое обращение к таблицам (чтение-запись, позиционирование...) встроенными средствами языка или же использование SQL выражений непосредственно в коде (exec SQL ....) - тут по ситуации - небольшая выборка по одной индексированной таблице эффективнее встроенными средствами, без накладных расходов (построение плана запроса и т.п.), сложные выборки по многим таблицам - тут, конечно, уже SQL.
Если требуется низкоуровневая работа (те же сокеты, пайпы, работа с регулярками и т.п.) - С/С++
Высокоуровневая работа с системными объектами (создать объект, копировать, проверить существование и т.п.) - CL. Но его похуже знаю т.к. мало использую.
Так что основных - два - RPG и C/C++. Плюс SQL где он эффективнее. Большая часть кода на RPG.
Если сравнивать RPG и тот же С - оба процедурные ЯВУ. Но со своими особенностями. Есть вещи, которые на С писать проще и как-то естественнее. Но есть то, что на RPG реализовано проще. Тот же аналог union в С в RPG реализован изящнее - там возможно произвольное полное или частичное перекрытие полей внутри структуры (в RPG struct - называется ds). Например вот такое:
dcl-ds myDs qualified;
field1 char(20);
field2 char(20) pos(10);
end-ds;
описывает структуру с двумя полями по 20 символов, которые перекрываются между собой - последние 10 символов первого поля перекрываются с первыми 10-ю второго поля. При этом в той же структуре могут быть еще и другие, не перекрывающиеся поля.
Два типа данных с фиксированной точкой (отличаются способом хранения в памяти. При том, если есть одна переменная с двумя (например) знаками после запятой и вторя с тремя, то присвоение может быть как обычное, с отбросом последнего знака, так и с округлением (добавление 5 единиц к последнему знаку и затем присвоение с отбросом последнего знака).
Типы даты, времени, таймштамп (дата+время). При этом есть возможность преобразования из даты в строку или число и обратно в любом из поддерживаемых форматов (ISO, EUR, CYMD и т.п.). Аналогично для времени.
Все это на уровне языка.
Но некоторые низкоуровневые вещи на RPG хоть и возможны, но выглядят "тяжеловесно" и на С/С++ их писать проще и естественнее. Посему удобно совмещать.
Поэтому и говорю - есть задача - строим алгоритм. Дальше смотрим какую его часть на чем удобнее реализовать. В целом ничего особо сложного тут нет. Дело привычки, не более.
Комментарий недоступен
php
Комментарий недоступен
Ну Ява конечно. Как Ява разработчик пишу.
Такие советы хорошо давать когда владеете несколькими языками и можете их сравнивать какой где лучше.
Я вот могу сказать, что в том бекенде, где работаем мы (это очень глубокий бекенд, на уровне ядра автоматизированной банковской системы где хранятся все данные и выполняются все бизнес-операции), джава не применима от слова совсем - она не может напрямую работать с БД. Она не может нативно работать с системными типами дат, времени, фиксированной точкой. Она слишком неэффективна т.к. требует накладных расходов для JVM. Ну и далее по списку.
Как писал уже выше тут - для задач нашего бека есть специализированный язык, интегрированный в систему и напрямую работающий с системными объектами и типами данных.
Но это у нас так. В других местах все может быть иначе. И прежде чем что-то советовать, нужно понимать конкретику места и требования к системе.
И да, джава у нас тоже есть. Но на других уровнях и других системах. Например, она широко используется в вебсервисах, которые есть один из способов взаимодействия ядра АБС со внешними системами. Также она (точнее, JMS) используется для работы с MQ на стороне внешних систем (на нашей стороне используется MQ API для C/C++ или RPG)
И да, там (для внешних систем) это тоже своего рода бекенд. Но, так сказать, промежуточный - там нет особой бизнес-логики, только трансляция фронтовых запросов в АБС и интерпретация полученных ответов.
Точнее говоря у вас низкоуровневый язык для ядра, который вообще не релевантные в обычной жизни. Что-то типа cobol в реальном мире.
А что такое "обычная жизнь"? Для нас вот (и не только для нас - на этой платформе в РФ еще как минимум несколько банков работает, может еще какие структуры, а уже в мире подавно - коммерческие сервера на этой платформе достаточно распостранены и рейты разработчиков там вполне на уровне) это вполне обычная жизнь.
Просто это то, чему на ускоренных курсах не научить - слишком сложно будет, слишком много особенностей, которые нужно иметь ввиду разработчику чтобы писать эффективный код.
И да. "Что-то типа КОБОЛ". Примерно современник ему, но развивается и эвалюционизировал до нормального синтаксиса и нормального процедурного языка.
КОБОЛ, кстати, на этой платформе тоже поддерживатеся.
Javascript/TypeScript. Если говорить за web-разработку. На фронте ему пока что достойных альтернатив нет, а на бэк он проникает медленно, но верно. Ни Python, ни Java на фронт так и не проникли. Google пытался (GWT), но даже у него не получилось.
Подобный вопрос волнует каждого, кто начинает задумываться о сфере IT. При выборе языка необходимо отталкиваться от будущих задач.
Если в планах: анализ данных, машинное обучение, построение ботов, то логично выбрать Python.
Касательно Java ничего не могу сказать. Был опыт именно с Python, и синтаксис языка действительно не сложный для понимания основ. Как и у любой язык, Python имеет свои фишки, тонкости, закономерности.
И конечно, отличным бонусом станет помощь со стороны наставника (если такой имеется в вашей компании), который поможет освоить язык, ответить на вопросы, укажет на ошибки. Даже если такого человека нет рядом, то полно сообществ (например, чатов в телеграм), где можно получить ответы.
P.s. Мое изучение Python завершилось тем, что не было той области, где я мог применить язык. Т.е для 98% задач мне хватает экселя.
Однозначно - учить именно Java. Питон берёт хоршим набором готового "из коробки", но чуть в сторону - будет сложно. Зачем вам учить набор из коробки питона, если в Java есть свой набор, который тоже придётся учить? Вы выучите два набора и один из них будет бесполезным хламом в работе на Java.
Другое дело - как учить.
В плане "как" могу порекомендовать курсы до уровня "уверенный middle". Самостоятельно вы будете долго шарахаться по разным темам, не понимая, какая из них реально полезна в будущей работе, и какая практически никогда не понадобится. Курс даёт не только знания "вообще", но он даёт систему, которая помогает учащемуся самим своим наличием. Бессистемно самостоятельно научившиеся очень долго входят в серьёзную разработку, потому что набор знаний у них дырявый. Ну разве что вы будете исключением из правил )
Благодарю Вас за развёрнутый ответ. Тоже всё-таки больше склоняюсь к Java. Да, был бы рад если бы Вы порекомендовали какие-нибудь курсы. Обучаться самому, конечно, можно, но уж слишком долго)
На хороших курсах тоже не быстро. Нужно напрягаться, читать тексты, делать задания, самому что-то писать "для души". И нормальный уровень будет вряд ли раньше чем через год. Если для вас год - это много, то тогда ваш путь будет пролегать через очень долгий перебор вакансий, на которых вас сразу развернут. Поэтому нужно быть морально готовым к приличному сроку обучения.
Порекомендовать могу наш курс https://vmeste.social/?type=Blog&case=Text&id=26, но он ещё не запущен, первый поток будем собирать где-то к концу лета, может к середине августа. Знакомство с текстами на сайте по ссылке даст вам в некотором смысле рекомендации за наш проект. Но повторюсь - он начнётся не прямо сейчас.
На всякий случай - ссылку лучше нажимать, а если копировать, то без запятой в конце, иначе не попадёте куда надо
Ява мертвый язык, я не слышал в последнее время чтобы на нем что то новое писали. Все знакомые кто работает с ява не пишут нового, а просто правят старый код. Я бы выбрал пайтон, он намного проще. К стати по поводу математики, я бы не сказал что для джуна нужо углубленно изучать высшую математику, для обучения вполне достаточно школьной программы.
Ежегодный опрос говорит об обратном
А новое это что?
Сначала научитесь самостоятельно писать код, неважно, на Java или Python. Синтаксис в Python очень лайтовые по сравнению с Java. Поэтому, как говорят, на Python вы мозгуете только над задачей, а на других ЯП - еще и над тем, как решить ее не перегружая кодом.