15 самых сложных вещей в профессии разработчика
Думаете, самая большая проблема — выучить новый язык? Опытные разработчики рассказывают, что действительно трудно в профессии.
Общение
Андрей Черабаев, разработчик в IT-компании MediaSoft:
— Никто не предупреждал, что здесь нужно так много разговаривать с людьми! Обмен мнениями, знаниями и просто постоянные обсуждения оказались основой этой профессии. А сколько времени занимают митинги, на которых ты объясняешь заказчику, что ты сделал, что еще предстоит выполнить, как это будет реализовано, в чем заказчик неправ, где есть ошибки проектирования…
И при этом нужно быть очень терпеливым, помнить, что люди разные: одни не понимают вас с первого раза, а другие любят объяснять по десять раз одно и то же. Сам этим страдаю.
Хаос из-за множества языков и фреймворков
— Появляется множество языков программирования и фреймворков, которые применяют повсеместно, как таблетки от всех болезней. И разработчику часто приходится сталкиваться с тем, что он должен хорошо знать слишком многое. Это и скриптовые языки на стороне фронта: HTML/CSS, JS, включая набор современных фреймворков BackBone.JS, AngularJS, ReactJS. Вместе с тем — языки С#, Java, Python и спецификации типа .Net Framework, JavaEE для серверной стороны. Добавим сюда знание баз данных и языка манипуляции с данными, стандартов сервисного взаимодействия. Этот огромный бум порождает хаос, и зачастую разработчики не усваивают тонкости языков или технологий.
Огромная нагрузка
— Сегодня в разработке приложений фичи продукта поставляются быстро, чтобы не заставлять пользователя ждать. Это порождает колоссальную нагрузку на программистов: то, что 10 лет назад разрабатывалось месяцами, сейчас реализуется в 2, а то и в 4 раза быстрее. Специалист, не умеющий применять паттерны проектирования (прототипирование, синглтон, адаптер, фасад, декоратор, архитектурный паттерн MVC), не сможет построить правильное веб-ориентированное приложение для широкой аудитории.
Не тратить драгоценные ресурсы на ненужные задачи
Юрий Пономарев, консультант центра технической поддержки компании «РДТЕХ»:
— Вот история из жизни разработчика. Запрос от клиента: «Уважаемые члены проекта, у нас есть файл, который хочется открыть вашей программой. Мы предполагаем, что в нем содержится, но не знаем, как с этим дальше поступить. Считаем информацию из файла полезной. Просим оценить трудоемкость обработки таких файлов вашей программой».
Бизнес-аналитики говорят, что исполнить запрос нельзя. Менеджер обещает премию тому, кто это откроет. Гугление по заголовкам файла каждый день приносит разный результат. Средства Windows не помогают понять содержимое. Средства сортировки падают при попытке его отсортировать. Средства распознавания форматов говорят, что там минимум 15 различных файлов. При передаче по сети корпоративный антивирус сходит с ума. На архив файла ругаются все почтовые системы, но он сжимается в 10 раз легко.
Старый разработчик пишет:
public static void main(String[] s) throws Exception VTDGenHuge vgh = new VTDGenHuge(); if (vgh.parseFile("C://TEMP//file_big",true,VTDGenHuge.MEM_MAPPED)) VTDNavHuge vn = vgh.getNav(); AutoPilotHuge aph = new AutoPilotHuge(vn); aph.selectXPath("//company/@Name"); int i = 0; while ((i=aph.evalXPath())!=-1) System.out.println(" element name is "+vn.toString(i)); > > >
По имени компании разработчик находит ее почту, пишет письмо и выясняет, что это — вордовый файл с корпоративной отчетностью, который почему-то поместили в виде слайд-шоу в jpeg, а потом — несколько раз скопировали в XAML.
Вот поэтому трудность не в том, чтобы скачать файл, отключить антивирус или даже придумать применение данным. Самое сложное — не тратить на ненужные задачи драгоценные ресурсы. А если и тратить, то с умом.
Смешанные принципы современных языков программирования
Юлиана Науменко, руководитель департамента развития софтверных решений ГК «Авилекс
— Яркий пример — язык программирования JavaScript. Центральное ядро в части организации строительных блоков — функции.
Но, если внимательно на это взглянуть, все не так просто:
- функция — элемент парадигмы функционального программирования;
- функция — классический элемент процедурного программирования;
- функция — объект.
Такой симбиоз порождает короткие, цепные и гибкие реализации, понимание которых порой приходит не сразу. Это замыкания, колбэки, применение анонимных функций (в C# — применение делегатов в событиях, таски и так далее).
Тесты, названия переменных, общение с коллегами
Кирилл Меженцев, программист группы разработки карты рассрочки «Совесть»:
— Новому языку или фреймворку можно обучиться. Открываешь книгу или курс на YouTube и через какое-то время можешь писать код — это не так сложно. Трудности чаще возникают с тестами, названиями переменных, общением с коллегами.
Оценка задач
— Важная часть работы, которой многие пренебрегают — оценка задач. Если рассчитывать, сколько времени займет то, что ты никогда раньше не делал, или ставить приоритетность тикетам на основе описания в одно-два предложения — в результате придется тратить кучу времени на проблемы, которые не предугадал, а они «всплыли» уже в конце спринта.
Оптимальный вариант — попробовать оценить новую задачу на основе похожих и предсказать, сколько задач поместится в спринт. Поэтому иногда приходится пренебрегать грумингом, созданием подзадач и оценкой. Сложность заключается не в том, успеваем ли мы сделать все в спринт, а в том, насколько мы ошибаемся в своей собственной оценке — на часы, дни, месяцы или годы. И это действительно трудный процесс.
Сроки
Константин Коногорский, руководитель отдела разработки ПО в «ВИСТ Групп»:
— Очень часто приходят менеджеры и говорят: «Этот БелАз должен летать на высоте 10 метров над землей, достигая скорости в 10 узлов при идеальных погодных условиях. У тебя три дня. Мы уже всё продали, подписали контракты, получили деньги и премии. Теперь во всем виноват ты». Как правило, продажникам плевать, возможно это или нет, сколько реально потребуется времени, что у тебя пять дедлайнов на неделе. Программист, по их мнению, всемогущ и имеет 1024 часа в сутках. Как справляться? Берешь и делаешь.
Проблемы с документацией сторонних библиотек
— Я часто сталкивался с тем, что в документации видел все необходимые мне функции инструмента, а на деле оказывалось, что они есть только на бумаге. Когда связываешься с производителем или авторами, в ответ получаешь: «Упс, спасибо за отзыв. Ваш звонок очень важен для нас. Идите с миром». Подбор нужных библиотек занимает много времени, а если речь идет об оборудовании — то и денег. В итоге приходится колдовать с тем, что есть.
Находить баланс
Евгений Ким, руководитель отдела разработки платформы RU-CENTER:
— Баланс между разработкой и изучением новых технологий, между скучными однотипными задачами и прорывными фичами. Справляться с этим одновременно и сложно, и просто. Надо для себя выстроить стратегические цели на среднесрочную перспективу, и тогда баланс найдется сам собой.
Богатство выбора
— Выбор сейчас действительно огромный. Можно пойти в backend-разработку, в тестирование, в мобильную разработку. В каждом направлении десятки технологий, и это может вскружить голову. Тут нужно брать и пробовать. И читать профильные ресурсы, такие как geekbrains.ru.
Переделывать
Елисей Самретов, разработчик мобильных продуктов FL.ru:
— Для меня самый ненавистный момент наступает, когда приходит менеджер с суперважной задачей «переделай это срочно». Как справляюсь? Закидываюсь таблетками. Шутка. Музыкой в айфоне и дедукцией Шерлока Холмса: разбиваю задачи на итерации, слежу за синхронизацией дизайна, логикой написания программы.
Рутина
Стас Жеребчук, frontend developer в Weblium:
— Сложнее всего просыпаться по утрам и начинать работать.
Что помогает? Смузи-машина. Что мотивирует? Осознание, что меня могут выгнать, если я не буду ничего делать.
А что для вас самое сложное?
Самое сложное в программировании это…
Мне очень понравилась ветка обсуждений на Quora.com: What is the hardest part about learning to program? Все 87 ответов я так и не прочитал, но понравившиеся, выделил в отдельную статью из 10 пунктов. Это вольный пересказ мнений многих разных людей. Если читателям будет интересно, я продолжу.
1. Разница между высокими стандартами и своими низкими умениями
В статье «Никто не говорит об этом новичкам» рассказывается об общей проблеме людей, занятых творческим или интеллектуальным трудом. Программирование — сложный предмет, и обычно за него берутся способные, амбициозные и склонные к перфекционизму люди. На начальном этапе у них не будет хорошо получаться. Привыкшие к высокой планке, они будут расстраиваться. Внутренний голос будет постоянно нашептывать: “У тебя никогда и не получится, лучше оставь это дело”. В такие моменты думайте о том, что ваша самокритичность — это признак вашей экстраординарности, и верьте, что преодолеете этот “неумелый период”.
Что касается необычайных преимуществ программирования, то вот они:
- Проблемы в коде в корне отличаются от проблем в физическом мире. Починить неисправный код можно одной лишь силой ума, в отличии от, например, сломанной машины, которая требует покупки дорогих запчастей.
- Профессионально расти можно только на границе зоны комфорта. Занимаясь незнакомыми вещами вы сделаете кучу ошибок, но зато и получите настоящие знания.
- Ошибки в программировании — это не закрывающиеся двери перед вами, а ключи к обучению.
2. Примите факт, что компьютер всегда прав, а вы — нет
Если что-то пошло не так, не надо винить компьютер или программу. Не выясняйте с ними отношения. Просто задайтесь целью: “как это исправить”. Если вы хотите выяснять отношения с языками программирования, почему они такие глючные и ваша программа дает сбой — то вы выбрали не ту специальность.
3. Готовьтесь к худшим сценариям
Ждите от пользователей программ самых неожиданных вещей. Они будут вводить цифры где им не место, вставлять абзацы текста в поле для имени и делать кучу других несуразных вещей. Не создавайте формы где можно указать возраст человека в тысячи лет. Будьте готовы ко всему, не доверяйтесь пользователям, предугадывайте худшие сценарии и стройте защиту от них.
4. Контроль за эмоциями
Программирование, зачастую, это долгий, трудный и расстраивающий опыт. Бывает, месяцами изучаешь какую-то тему, потом много дней пишешь сложный запутанный код, который, наконец-то, делает то, что тебе нужно. А потом опытный программист берет и переписывает его за 3 минуты в 5 строчек. И ты чувствуешь себя раздавленным. Что бы ни случилось, не надо расстраиваться.
5. Самостоятельность
Многие новички легко проходят разные курсы по программированию, но стоит им взяться за самостоятельную задачу, они впадают в транс. Или нет идей для написания, или есть идеи, но нет понимания как их реализовывать, с чего начать. Всё дело в том, что курсы дают вам синтаксическую грамотность, вы вроде бы помните разные команды типа len(), но не можете написать свою программу. И вам начинает казаться, что учебный курс был разводкой для лохов, где вас научили поверхностной ерунде, а саму суть оставили в секрете. И эта суть — это навык программно мыслить.
Логика программирования заключается в том, чтобы разбить большую задачу на маленькие подзадачи и последовательно реализовать их, а потом связать воедино. Программист — не тот кто на перегонки печатает текст кода со знанием всех команд, а тот, кто мыслит в логике программы. И когда у вас наконец получается сделать что-то самому, самостоятельно, этот момент невероятно вдохновляет и вы вспоминаете свою грандиозную идею, которая недавно казалась невыполнимой и думаете: “О-хо, теперь я смогу реализовать её!” Хотя, конечно, вам еще расти и расти до её реализации, но момент всё равно приятный.
6. Незнание, с чего начать
- Вы не знаете, какой язык начать изучать: C, Python, Java, PHP, C++, Ruby и еще миллион других языков.
- Вы не знаете, где изучать: по книге, онлайн материалам, или записаться на курсы.
- Вы не знаете, что изучать: мобильные приложения, Android, iOS, веб, фронтенд, бекенд, операционные системы, искусственный интеллект, машинное обучение, DevOps?
- Вы не знаете как учиться: читать книги, чужой код, взять кого-нибудь для совместного обучения, программировать соревновательно, напару, устроиться стажером?
Проблема при изучении программирования в том, что по теме слишком много информации. И вам надо научиться пробираться через дебри этого шума. Выбирать только то, что необходимо очень непросто, но от этого навыка зависит ваше будущее.
Чтобы справиться с этим, следуйте этим советам:
- Найдите ментора (наставника), опытного и владеющего современными технологиями программиста, который поможет вам составить план обучения.
- Получайте отзывы на ваш код. Есть много путей как сделать что-то, и ещё больше путей, как сделать это неправильно. Хотя в интернете много замечательных ресурсов, всё же он не идеален. Поэтому, время от времени, показывайте свой код ментору, чтобы он подтвердил, что вы идёте по верному пути.
- Практикуйтесь, реализуя свои идеи. Следование обучающим руководствам быстро надоедает, поэтому, как только почувствуете, что достаточно познакомились с технологией, начинайте вместе с ней реализовывать что-то интересное для вас. Это повышает мотивацию и самооценку. Помните, что вы можете это сделать, вопрос только во времени и настойчивости.
- Изучайте весь стек. Со временем, осваивайте весь стек технологий. Например, если вы веб-программист, не ограничивайтесь только фронтендом. Имейте представление о бекенде, базе данных, сервере, сети. Имея цельное представление о разрабатываемом продукте, вы сможете стать продвинутым инженером, принимающим правильные решения.
- Будьте самообучаемыми. Программная разработка одна из самых динамично развивающихся отраслей во всём мире. Если фундаментальные принципы меняются редко, то инструменты — чуть ли не каждый день. Важно следить за всеми новинками и уметь самостоятельно осваивать необходимые для вас.
- Учитесь общаться и сотрудничать. Если вы умеете что-то хорошо делать, то для вашей компании вы полезная единица = 1. Но если при этом вы поддерживаете и вдохновляете ещё 10 человек, то вы превращаетесь в глазах руководства в = 11.
7. Много всего, вокруг самого программирования
Нередко программист в одиночку пытается создать и выпустить на рынок свой продукт. Вот тут и начинается самое сложное.
Выбор и поддержка разных шаблонов, создание иконок, логотипов, баннеров.
Регистрация в play-market, app-store, настройка платежных систем, заполнение нудных бланков. Потом они пишут, что ты что-то сделал не так и приходится все заново переделывать.
Заказ рекламы в google-ads и поиск лучших вариантов, налаживание каналов сбыта, а ещё эта ограниченность бюджета, которая связывает тебя по рукам и ногам…
Само по себе программирование в чистом виде уже кажется легкотнёй, когда тебе не приходится влезать в изматывающие задачи дизайна и маркетинга.
8. Невозможно всё знать
Каждый раз, когда ты в идеале овладел какими-то навыками, ты узнаешь, что появилось что-то новое, намного лучше. И возникает парадокс Сократа: “я знаю, что ничего не знаю”. Постоянно нужно тратить много времени на изучение нового, а так как невозможно знать всё и быть специалистом во всём, то постоянно надо выбирать приоритеты — что для тебя первостепенней в данный момент, какая технология, какой подход.
Да, вы можете выбрать какую-то одну вещь и стать специалистом в ней, но тогда вы очень рискуете, что в это же время появилось что-то новое, многократно превосходящее вашу технологию и это нечто завоюет рынок, в то время как вы держитесь за старьё обеими руками.
Поэтому, если вы любите учиться и постоянно узнавать что-то новое, то выбрав программирование, не будете разочарованы ни на секунду.
9. В реальной жизни не всё так идеально, как на учёбе
Во время учёбы вы играетесь с лёгкими программами из нескольких сотен, максимум — тысячи строк кода. Даже в университете, на факультете компьютерных наук.
Когда вы приходите на предприятие вы можете столкнуться с базой кода в сотни тысяч строк и даже миллионы. Там много ошибок, нелепые названия переменных, замудреные подпрограммы без документации, используются разные проектировочные шаблоны, многоуровневое кэширование и т.д.
Когда всё это надо понять и изучить за сжатые сроки — вы получаете самую вертикальную кривую обучения, с которой сталкиваются многие программные инженеры.
10. Балансирование между теорией и практикой
С одной стороны, можно много изучать теорию, годами читать что-то и думать что ты мало знаешь и ничего не делать. Это надоедает и перестаёт приносить пользу в какой-то момент.
С другой стороны, можно начать делать что-то, без знания теории, и быстро застрять или заблудиться в своём коде и его ошибках. Многие начинают делать что-то, опираясь только на обрывистые ответы с форумов, не понимая целой картины своего приложения и куда их приведет работа в конечном итоге (например, к неподдерживаемому, необновляемому коду).
Так вот, очень важно прочувствовать этот баланс минимальной теории и последующей за ней практики. Тогда и то, что вы пишете будет грамотным, и теория будет усваиваться в разы быстрее и интереснее, и будете гармонично обучаться во время работы.
UPD
11. Борьба с багами
Баги (жуки), это ошибки в программе. Если продолжить метафору с жуками и человеком, то для новичков это скорее что-то подкожное, зудящее, вызывающее ужас, потому что невидимо и трудно устранимо.
Самое обидное, что они появляются когда вы вроде бы всё сделали правильно, и можно приступать к дальнейшим свершениям. Но вдруг программа перестает работать без видимых причин, или работает не так, как задумано. И приходится всё бросить и тратить несколько часов, а то и дней на поиск этой ошибки. Кажется, будто это время тратится впустую (ведь вы не занимаетесь созданием «нового», а ковыряетесь в «старом»). Чтобы пережить этот период нужно титаническое терпение.
Вы должны понимать, что, на самом деле, за это время вы узнаете очень много нового, и делаете это с большей мотивацией и степенью запоминаемости, чем в спокойных условиях изучения теории. Исправление каждого бага — это в первую очередь устранение своего невежества во многих вопросах, о существовании которых вы раньше и не задумывались. Происходит переход от неосознанного незнания — к осознанному и его превращение в знание. Со временем вы будете и допускать меньше багов и наловчитесь работать с инструментами по их устранению.
12. Идти быстро и ломать вещи
Нужно развивать в себе особый склад характера, когда вы не боитесь идти вперед, не будучи заранее готовыми к этому. Старый девиз Фейсбука: «Идите быстро, ломайте вещи. Если вы ничего не ломаете, значит движетесь медленно».
- программирование
- обучение программированию
- логика мышления
- эмоции программиста
Какой самый сложный навык в программировании?
Какому навыку в программировании обучить сложнее всего? На этот вопрос постарались ответить пользователи сайта Quora. Самые интересные ответы перевел и опубликовал сайт KV.BY.
Стив Гэринг, технический директор Easil (2017-н.в.)
Есть пара вещей, которые кажутся мне особенно сложными и по-моему именно они отличают разработчика от программиста. Недостаточно сделать, необходимо проверить.
Нередко можно услышать: «Задача X выполнена, осталось только протестировать программу и можно переходить к задаче Y». Однако на следующий же день можно услышать от разработчика: «Я все еще работаю над задачей X, в ней обнаружилось несколько багов и мне придется исправлять их весь день».
Большинство разработчиков не считает тестирование частью своей работы. Для них это обременительная обязанность, которой должны заниматься тестировщики. То, что выполнено с точки зрения разработчика, как правило проваливается на стадии тестирования. Однако если задачу выполнял программист, проблем на стадии тестирования возникнуть не должно.
Один мой бывший коллега ненавидел тестирование, но я настаивал на том, чтобы он проводил более тщательную проверку продукта на стадии разработки. В конце концов коллега ушел и стал руководителем собственной команды и проекта. Несколько месяцев спустя он сказал мне: «Теперь я понимаю, почему ты заставлял меня заниматься тестированием, ведь оно действительно полезно и приносит значительные плоды». Ваш код должен читаться легко, как книга.
Код не должен выглядеть, как сложное алгебраическое уравнение, он должен легко читаться. Каждый его отрывок должен быть понятен без необходимости обращаться к ссылкам и подсказкам. Переменные и идентификаторы метода должны быть наглядными, а операторы – лаконичными.
Я видел функции с именем `codeToRun (id)`. Можете ли вы догадаться, что делала эта функция? Блокировала 60 строк кода, ожидая загрузки изображений в документе. Поэтому, когда я столкнулся с этим, мне пришлось залезть в код, найти эту функцию и прочитать те 60 строк кода, чтобы понять, какого черта происходит. Если бы функция называлась `blockForImages`, я мог бы избежать этих манипуляций.
Жаль, что у меня не сохранился пример этого кода, но просто скажу, что самое худшее, что я когда-либо видел, это одна строка JavaScript, на которую у меня ушло примерно 15 минут, просто чтобы ее понять. Это была одна строка, 7 одиночных символьных переменных и 3 функции. Имя функции не дало мне никаких указаний на ее цель, код внутри был невероятно запутанным, и когда я посмотрел ссылки на функцию, входы и выходы также были одиночными символьными переменными. Я должен был прочитать примерно 50 строк кода, чтобы понять эту единственную строчку.
Причесанный, читабельный код сэкономит вашей команде и всей компании сотни часов в год, а также серьезную денежную сумму, если придется заниматься отладкой уже функционирующего продукта.
Райан Гедвилл, сооснователь компании (2016-н.в.)
Умению абстрактно мыслить. В конце концов все ПО выражено в двоичном коде. А сам по себе двоичный код – эта абстракция, созданная людьми для моделирования схем. Языки программирования, которые вы используете, являются частью программного обеспечения с багами, написанные на языках программирования, состоящих из ПО и багов.
Некоторые языки программирования написаны сами на себе – например, Smalltalk. Это приложение рекурсии, которая является результатом чистого объектно-ориентированного программирования.
Объектно-ориентированное программирование – это абстракция, и программные языки изо всех сил стараются вплести эту абстракцию в свою структуру.
Мой опыт показывает: если в долгосрочной перспективе ориентироваться на эти абстракции, довольно быстро можно стать хорошим программистом. В действительности написание кода подобно складыванию мозаики у себя в голове с последующим внедрением синтаксиса. Если язык вам знаком, уложить его в рамки синтаксиса довольно просто.
Переписывайте программное обеспечение на разных языках. Попробуйте функциональное программирование, попробуйте C, попробуйте распространять свое программное обеспечение через сеть серверов. Одна и та же задача выполняется с помощью кода, но мыслительные процессы при этом сильно различаются.
Это позволит вам улавливать связи и постепенно развиваться как инженеру, и это одна из самых трудных вещей для изучения, которую к тому же очень трудно объяснить. В любом случае, чем больше вы пишете кодов, тем лучшим специалистом становитесь. Но всегда думайте о том, насколько это будет полезно для решения задач в будущем.
Джонас Меллин, преподаю программирование с 1990
Работать как настоящая команда, то быть частью команды, оставаясь при этом личностью со своей позицией и ценностями. Это подразумевает действовать сообща, помогая друг другу и принимая совместные решения по выполнению задач.
Создавать достаточно комфортную среду для стимулирования творчества. В этом каждый должен вносить свой вклад.
Расставлять приоритеты. Особенно важно принимать взвешенные решения, принимая во внимание все аспекты, что особенно успешно удается делать в команде.
Анализировать влияние тех или иных изменений на существующее положение дел.
Джейсон Русс, программист, сертифицированный педагог, начинающий писатель
Любому навыку, подразумевающему использование естественного языка, включая умение правильно называть абстракции и грамотное составление встроенной документации.
Очень часто комментарии к коду и идентификаторы, с которыми я сталкиваюсь, избыточны, неопределенны, неоднозначны, чрезмерно конкретны (например, излишние данные о внедрении или ориентация только на одного клиента) или просто семантически неточны.
К сожалению, последний пункт в этом списке является не только самым опасным и вопиющим нарушением, но и самой частотной ошибкой, которую к тому же нелегко исправить. Не считая варианта отправить разработчиков обратно на школьную скамью, чтобы они подтянули английский, я не знаю, как еще справиться со всеми недопониманиями и потерей времени, связанными с банальной безграмотностью.
Имейте в виду, это не проблема конкретной организации, занимающейся программированием, это проблема всей отрасли. Вероятнее всего она возникает в следствие естественной дихотомии между правым и левым полушариями мозга и между учебными планами инженерных и гуманитарных учебных заведений.
И действительно, разработчики, способные создать идеальный алгоритм, идеальное регулярное выражение или идеальную структуру данных, кажутся неконкурентоспособными по сравнению с теми немногими, способными подобрать слово или составить предложение, которое идеально передавало бы весь объем информации.
Что самое сложное в программировании? Без шуток. Правда ли, что самое сложное — выучить все программы/теги?
Если вы знаете все буквы и можете составлять слова и читать, то это вовсе не значит что вы можете писать стихотворения, романы и другие произведения литературы. Так же и там.
Остальные ответы
сложнее правильно их все совмещать в программе без ошибок
Вызубрить — не проблема. Сложно научиться понимать, зачем каждый из элементов нужен и как правильно его использовать.
Программы не учат, их пишут. А вот самое сложное — это составление алгоритма. Написание кода по заданному алгоритму — это уже во многом дело техники
Правильная идея самое сложное, т. е. архитектура, алгоритмы. Остальное дело техники
>Что самое сложное в программировании?
Формализация произвольной задачи.
>Без шуток.
Да какое там.
>Правда ли, что самое сложное — выучить все программы/теги?
Неправда.
Самое сложное в программировании то читать чужой код. В второе по сложности это читать свой собственный код написанный в торопях и незадокумментированный. Всё остальное относительно просто.
Самое сложное это правлиьно выстроить архитектуру, если проeбался с архитуктурой то тебе пиздeц постоянный будет пока не закончится поддержка либо не отрефакторишь код.
Знание Алфавита не гарантирует вам Пулитцеровской премии.
Учить все теги и тем более программы совершенно незачем.
Самое сложное — это скачать, установить и настроить среду разработки или локальный сервер и написать хэллоуворлд так, чтобы работало.
Дальше все легче.