Комментарии 35
На протяжении многих лет я часто слышу такие вопросы как:
Да когда ж вы уже, сцуко, закончитесь, а? Вы и ваши нейросетевые влажные истории, смысл которых заключается только в "А ещё вот моя телега, залазь - прокачу!".
Программирование нужно любить )
И не какой-нибудь Bredlin или Cofe, а просто любить, чтобы когда у тебя в голове появляется дурацкая идея "а сделаю-ка я сайт новостей, котоый будет сам новости отовсюду собирать" (ну да, новостной агрегатор) - то берешь в руки клавиатуру, бутылку пива, и делаешь. Просто так, потому что интересно и захотелось.
Опять про успешный успех?
А давайте теперь каждый напишет свою историю, и из интересного технического ресурса, которым он когда-то был, Хабр превратится в свалку историй "как я сделал это". И так уже манагеры и корпорасты своими манагерскими и заказными корпоративными статьями всё засрали...
Имхо, всё перевернуто с ног на голову. Плюс путаница в терминологии. По сути сейчас везде предлагается обучиться не на программиста, а на пользователя/оператора той или иной программы, высокоуровневого языка программирования или фреймворка.
Это как предлагать научиться стать врачом. Причем сразу стать, без базовых знаний анатомии, химии и прочего. И сейчас, кстати, это уже технически возможно. Анализы крови по сотням показателей, операции (например, на глазах) и пр. производятся с помощью роботов, в полностью автоматическом режиме. А что касается интерпретации результатов..., то на этот счет существует куча регламентов, что тоже автоматизируется. Но оператор такой системы - врач ли?
С программированием аналогично. В большинстве рекламных роликов "как стать программистом за полгода" речь идет не о программистах, а по сути об операторах той или иной системы. Для программиста не нужны полгода для "изучения питона", ему достаточно пары дней.
По хорошему, обучение надо начинать с азов.
1) Хотя бы на удовлетворительном уровне (понимания сути) освоить школьные предметы. Программирование осуществляется не в вакууме, программируются реальные процессы, суть которых программисту полезно понимать или хотя бы надо иметь способность в них разобраться.
2) Как минимум на пять баллов освоить школьную информатику.
3) Изучить основы высшей математики. Не глубоко, но что означает интегрирование и дифференцирование надо понимать. А также понимать математические обозначения.
4) Расширить знания (хотя бы поверхностно) в сторону: электроники, схемотехники, архитектур вычислительных систем, принципов работы сетей и баз данных. Изучить (слегка) как работают процессоры (регистры, алу и пр.), как взаимодействуют с памятью.
5) Изучить (хотя бы отчасти) язык С/С++. Это нужно для понимания, как работать с памятью и прочими достаточно низкоуровневыми вещами, что даст понимание работы других высокоуровневых языков. Изучить алгоритмы.
Это минимум. После которого можно уже серьезно смотреть в сторону любых языков, фреймворков и прочего.
Для программиста не нужны полгода для "изучения питона", ему достаточно пары дней.
Ну, преувеличиваете, но в целом с идеей согласен. Когда про себя пишут "X разработчик", сразу напрашивается вопрос - а что, на Y уже совсем никак-никак не можешь? Т.е. какая-то база у тебя вообще есть? Скажем, если ты веб приложения пишешь, то ты минимум в двух языках уже должен разбираться хотя бы на уровне чтения кода и способности вносить правки, не ломая ничего (хотя сегодня и на одном языке все пишут).
Ну и некоторые детали я бы все-же уточнил. Потому что на мой взгляд, во многих и многих применениях сегодня разработчику не нужно знание C/C++. И даже иногда вредно. Т.е. я бы скорее заменил это на специфические разделы математики типа теории категорий или лямбда исчисления - тоже чтобы понимать другие, более практически ориентированные языки, но с другой точки зрения.
То есть, ваш список - он валидный, просто не для всех специализаций (и да, специализацией я тоже не считаю знание лишь "питона"). Я бы назвал это теоретической базой.
Потому что на мой взгляд, во многих и многих применениях сегодня разработчику не нужно знание C/C++.
C/C++ нужен для понимания, что и как работает под капотом. Вообще хорошо бы еще и с ассемблером немного познакомиться, а лучше с машинными кодами.
Небольшой пример. Дочка пыталась питон освоить. Я ей предложил написать функцию вычисления медианы. Она прислала мне код:
def get_median_num(nums):
sorted_nums = sotred(nums)
mid = len(sorted_nums) // 2
return (sorted_nums[mid] + sorted_nums[~mid]) / 2
Спрашиваю, где взяла? Так как такой код "обычный" программист не напишет. Отвечает: "нагуглила", и что ей этот код показался самым простым.
А на самом деле, использование здесь этой штуки: "[~mid]" подразумевает весьма глубокие знания о том, как в компе в двоичном виде хранятся отрицательные числа - в виде дополнительного кода.
Это горе от ума какое-то. Человек проделывает трюки с отрицательными индексами через дополнительный код (кстати, а ему кто-нибудь обещал, что отрицательные числа будут представляться именно дополнительным кодом?), но для вычисления медианы использует сортировку массива, что неэффективно и по времени, и по памяти.
Итого, предложенный код: неясен для чтения и модификации; использует неявное предположение об архитектуре машины (или интерпретатора), которое теоретически может и не оправдаться; неэффективен по времени; неэффективен по памяти. Бинго, как говорится.
Автору этого алгоритма нужна теоретическая подготовка, а не язык C/C++.
Итого, предложенный код: неясен для чтения и модификации; использует неявное предположение об архитектуре машины (или интерпретатора), которое теоретически может и не оправдаться; неэффективен по времени; неэффективен по памяти. Бинго, как говорится.
Автору этого алгоритма нужна теоретическая подготовка, а не язык C/C++.
Вот как раз для возможности делать подобные выводы и нужна база, нужно понимание, как там что работает под капотом. Только в этом случае можно судить, уместен в конкретной ситуации выпендрёж или неуместен (иногда это необходимость).
ЗЫ
Кстати, не исключаю, что автор этой функции фанатично стремился уложиться в ПЯТЬ строк кода :). Ему это удалось...
Ну так-то и в одну бы мог:
get_median_num = lambda nums : (lambda s, m : (s[m]+s[~m]/2)) (sorted(nums), len(nums//2)
;)
А в НОЛЬ строк кода слабо уложиться? :)
Главное грамотно убедить заказчика, что ему эта ф-ция вообще не нужна :).
Это высший пилотаж, но обычно так делают бизнес-аналитики :)
Просто убеди клиента - не нужна тебе, Вася, такая программа... И фсё, 0 строк кода.
И что делает волшебная функция lambda? А если такой в языке нет, напишете ее?
Код с сортировкой хотя бы делает то что от него ожидают, особенно если без отрицательных индексов, которые могут и не работать в других языках.
Это ключевое слово языка Python. Просто тело безымянной функции.
Написать её невозможно, так как именно из неё всё в программировании и состоит, как из первичного кирпичика (ну и так как очень немногие языки позволяют писать специальные формы, к которым относится lambda, а не только функции). Другое дело, что не во всех языках она доступна пользователю.
C/C++ нужен для понимания, что и как работает под капотом.
Вы все равно до конца этого не понимаете скорее всего. Потому что C++ сильно выше уровнем, чем железо. И это уже так было скажем в 70-х годах прошлого века, потому что микропрограммы уже были в S/360. А сейчас этих уровней только становится с каждым годом больше.
А на самом деле, использование здесь этой штуки: "[~mid]" подразумевает весьма глубокие знания о том, как в компе в двоичном виде хранятся отрицательные числа - в виде дополнительного кода.
А кто вам сказал, что они реально так хранятся (и это устроено точно так же, как вы это видели в C++), а это не фича питона?
Ну т.е. еще раз - я совсем не против того, что хороший инженер должен знать, как оно там устроено внутри, просто в ряде случаев это самое "внутри" это например стековая виртуальная машина JVM, или еще что-то другое, что не имеет прямого отношения к системе команд (кстати, каких команд? вы же в курсе, что нынче засилье x86 закончилось, и в жизни уже куча скажем ARMов?).
Я скорее клоню к тому, что того что хотелось бы знать, становится слишком много для одного человека. И место C++ в вашей модели мира вполне может занимать какой-нибудь k8s, или там хадуп, как у меня, и от них до уровня железа и дополнительного кода - дохрена уровней, которые нельзя игнорировать.
Вы все равно до конца этого не понимаете скорее всего. Потому что C++ сильно выше уровнем, чем железо.
Ну, я не стал писать про ассемблер. В идеале надо ручками попробовать писать в машинных кодах. Но это в идеале. А Си - как компромисс: понять, что такое указатели, как работать с памятью, узнать, что такое компилируемый язык и т.д. Это всё же сильно отличается от Питона, где под капот спрятано практически всё, да еще обильно приправлено синтаксическим сахаром.
А кто вам сказал, что они реально так хранятся (и это устроено точно так же, как вы это видели в C++), а это не фича питона?
Думаю, они везде так хранятся. По крайней мере, в дополнительном коде хранились еще до языка С.
Ну т.е. еще раз - я совсем не против того, что хороший инженер должен знать, как оно там устроено внутри, просто в ряде случаев это самое "внутри" это например стековая виртуальная машина JVM, или еще что-то другое, что не имеет прямого отношения к системе команд (кстати, каких команд? вы же в курсе, что нынче засилье x86 закончилось, и в жизни уже куча скажем ARMов?).
По барабану. Поймите меня правильно. Я не предлагаю на глубоком уровне всё это изучать, я о том, что крайне желательно понимать суть и принципы. Знание принципов позволяет быстро разобраться в новой теме. С базовыми знаниями вы разберетесь. Без базовых знаний - тупик.
Я скорее клоню к тому, что того что хотелось бы знать, становится слишком много для одного человека. И место C++ в вашей модели мира вполне может занимать какой-нибудь k8s, или там хадуп, как у меня, и от них до уровня железа и дополнительного кода - дохрена уровней, которые нельзя игнорировать.
Как написал выше, достаточно понимания общих принципов и взаимосвязей. И вместо С/С++ конечно можно взять, что угодно другое, не надо мои слова воспринимать буквально, это я для примера привел.
Думаю, они везде так хранятся. По крайней мере, в дополнительном коде хранились еще до языка С.
Отрицательные вещественные числа, например, хранятся в прямом коде. А были и такие машины, на которых целые числа рассматривались как частный случай вещественных, и, как следствие, отрицательные целые числа тоже хранились в прямом коде. И, насколько я понимаю, ничто в стандарте Питона не мешает использовать и там такое решение.
Я не предлагаю на глубоком уровне всё это изучать, я о том, что крайне желательно понимать суть и принципы.
Ну тогда я не очень понимаю, про что мы спорим. Я ведь тоже самое предлагаю, просто с учетом специализации изучить немного другие основы и базу.
А спор не корректный, если мы смешиваем общее и частное. Поэтому предлагаю не вдаваться в частности. А в целом, как вижу, спора нет. Настоящий программист должен понимать, как работают вычислительные системы и сети, должен уметь разобраться в алгоритмах. Для этого нужна база. А вот насколько подробная/широкая/глубокая должна быть база - это вопрос дискуссионный. Я считаю, достаточно понимания сути, основных принципов, конкретные формулы помнить не надо, достаточно уметь пользоваться справочными материалами.
Ну, преувеличиваете, но в целом с идеей согласен.
Никогда не писал на питоне, но когда пришлось помогать нашему R&D с «горящей задачей» — переписал какой-то там наколеночный алгоритм за три часа с распараллеливанием по ядрам процессора и одним проходом по списку.
Потому что синтаксис — вообще не то место, в котором случается затык.
Конечно. Синтаксис можно освоить быстро (и нужно). В объеме, которого достаточно чтобы начать что-то писать - а дальше уже доучивать в процессе, читая код коллег (если такие есть), или фреймворков.
В моём случае — я дальше забыл про эти три часа с питоном, как про страшный сон.
Так тоже бывает. Но я скажем иногда читаю чужой код на питоне - приходится.
Читать и рожать работоспособный код — это всё-таки разные вещи :)
Я вон немецкий и каталанский понимаю, например, а как доходит до что-то вякнуть — вылитый Герасим из одноименного романа Толстого.
Мне кажется, с программированием чуть легче. Язык компактнее, проще, похож на другие. Что-то работающее... ну вы разве не напишете цикл на питоне, подумав/погуглив 5 минут? Особенно если его читаешь время от времени - то внести правки тоже не должно быть особой проблемой.
То есть покупаем школьный учебник по информатике, потом учебник по основам высшей математики, затем учебники по электронике, схемотехнике, архитектуре вычислительных систем, принципам работы сетей и баз данных? И все? Прочитав все это я уже могу называться программистом?) Конкретных авторов может посоветуете тогда?)
«Для программиста не нужны полгода для „изучения питона“, ему достаточно пары дней.»
Соглашусь. С некоторой базой в программировании (6-7 языков в разное время), смог написать достаточно сложную программу на Питоне, даже не зная его, пользовался только гуглом, stackoverflow, документацией Питона.
Что такое программирование? С чего начать? И кому это подходит