Как стать автором
Обновить

Комментарии 35

На протяжении многих лет я часто слышу такие вопросы как:

Да когда ж вы уже, сцуко, закончитесь, а? Вы и ваши нейросетевые влажные истории, смысл которых заключается только в "А ещё вот моя телега, залазь - прокачу!".

Программирование нужно любить )

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

Опять про успешный успех?

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

давайте теперь каждый напишет свою историю,

А давайте лучше позовём chatgpt, у него этих историй как г@@на за баней, и все интересные /с

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

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

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

По хорошему, обучение надо начинать с азов.

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 строк кода.

И 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 минут? Особенно если его читаешь время от времени - то внести правки тоже не должно быть особой проблемой.

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

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

TCP/IP Illustrated, volume 1. The Protocols (2003)Автор: W. Richard Stevens
The C++ Programming Language [4th Edition] - Bjarne Stroustrup

Эти две отобьют любые хотелки влететь в IT

Ну так-то и с Кнута можно начать.

«Для программиста не нужны полгода для „изучения питона“, ему достаточно пары дней.»

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

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории