10 признаков того, что хороший программист из вас не получится

Привет, Хабр! Представляю вашему вниманию перевод статьи «10 Signs You Will Suck at Programming» автора Jonathan Bluks.



Очень часто на Reddit или Quora я вижу вопросы вида «Как понять, смогу ли я стать успешным программистом?» (На самом деле, эта статья является расширенным продолжением моего недавнего ответа на Quora.) Когда кто-то задумывается о смене карьеры или интересуется разработкой и хочет знать, что для этого требуется, неизбежно возникает этот самый вопрос.

Вообще, я думаю, что это главный барьер в умах людей, которые не получали фундаментального образования по программированию. Думать, что программист из вас так себе, совершенно естественно, и это мешает вам взяться за новое дело. Это как мечтать стать актером, но сомневаться, что вы вообще умеете играть.

Будучи преподавателем на курсе «Full-stack Web-development», я работал со многими программистами-новичками. Хорошая новость в том, что мне редко встречались студенты, которые вообще не могли научиться программировать. Я считаю, что умение программировать — такой же базовый навык, как умение читать, писать и считать. Это под силу любому, так как это одна из способностей человека, но этому действительно надо учиться.

За два года преподавания, я наблюдал мучения студентов в процессе обучения и видел у них несколько схожих проблем. Если вы взглянете на их список и почувствуете, что это все про вас, можете быть уверены — хороший программист из вас точно не получится и, возможно, вам стоит заняться чем-то другим. Однако, если вы останетесь верны своей цели стать разработчиком, вы сможете преодолеть все препятствия.

Этот список поможет вам понять, сможете ли вы стать хорошим программистом, а также что делать, если вы решите это изменить.


1 | Вам не хватает любознательности


Если вам не очень любопытно как работает компьютер и технологии в целом, вам ни за что не стать успешным программистом.

Основа любого обучения — это большой интерес к предмету изучения. Если ваш ум не питает особого интереса к технологиям, вам не хватит энергии и запала, чтобы глубоко и подробно изучить программирование и добиться успеха в этой области.

Напротив, мир технологий как огромный океан захватывающих областей, пересекающихся идей и будоражащих воображение возможностей. Потребуется внушительный запас внутренней мотивации, чтобы погрузиться в него и открыть для себя все, что только возможно.

Воспитывайте в себе любопытство: Спросите себя, на самом ли деле вам интересно программирование. Если ваш честный ответ — «нет», найдите что-то, что действительно вас увлекает. Не тратьте зря время и силы. Но если вы ответили «да», тогда заставьте себя найти нечто новое, с чем вы еще не сталкивались, признайте насколько обширен этот океан и ныряйте глубже.

2 | Вам не хватает самостоятельности и находчивости


Если вы не разовьете в себе умение решать проблемы самостоятельно, вам ни за что не стать успешным программистом.

Без сомнения, чтобы стать успешным разработчиком, вы должны быть уверены в ваших собственных способностях учиться. Это, кстати, один из самых важных жизненных навыков — если вам больше 18, никто не обязан вас учить. Такова реальность. Находить необходимую информацию и помощь, если она вам требуется, — это только ваша задача.

В мире разработки всю нужную вам информацию можно найти в волшебном месте, ранее известном как Information Super Highway. У этой гигантской библиотеки есть одна большая дверь — Google. Понять, что вы можете просто вбить в поиск все, что вам захочется, и получить доступ необходимой информации — это первый барьер на вашем пути к приобретению навыков, которые потребуются вам в мире IT.

Помимо умения гуглить, важно также научиться читать документацию и спецификации, которые есть у всех языков программирования и очень прозрачно объясняют, как работает язык. Это все равно, что использовать словарь: когда вы встречаете слово, которое вы не знаете, вы смотрите его в словаре. Самый быстрый и надежный способ развить и закрепить ваши навыки программирования — это просто читать документацию. Там есть буквально все.

Используйте все ресурсы: Поймите, что на все ваши вопросы уже есть ответы. Прежде, чем спрашивать кого-то, загуглите и почитайте документацию. Приберегите возможность потратить чье-то время на тот случай, когда вы действительно пытались найти ответ, но не смогли.


3 | Вам не хватает упорства перед лицом проблемы


Если вы сдаетесь, едва столкнувшись с проблемой, вам ни за что не стать успешным программистом.

Суть программирования есть решение проблем. Это и есть причина создания компьютеров! Всякий раз, когда вы начинаете работать над программой, вы сталкиваетесь с целой «стопкой» проблем. И как только вы находите решение одной проблеме, почти всегда возникает другая. Вы движетесь вперед, но всегда есть новые препятствия.

Надо признать, что этот ворох проблем бывает пугающим и обескураживающим. Если вы думаете, что все должно «просто работать», вам не хватит энергии и сил  настойчиво продолжать работу, пока проблемы появляются одна за другой и понемногу выбивают вас из эмоционального равновесия. Ваша работа заключается именно в том, чтобы понять, почему что-то не работает.

По моему преподавательскому опыту, в группе всегда есть один или два студента, у которых как будто есть какая-то врожденная способность находить больше неприятностей, чем другие, причем очень часто это случайные и непонятные проблемы. Таким студентам я напоминаю, что чем больше проблем они встречают, тем больше у них возможностей изучить что-то глубоко и тщательно. Если через эти проблемы они могут обрести полное понимание, они станут увереннее гораздо быстрее, именно потому что столкнулись и справились с бóльшим количеством проблем, чем другие.

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


4 | Вы не ощущаете радости от успеха в решении проблем


Если вы не испытываете чувство восторга и выполненного достижения, когда решили проблему, вам ни за что не стать успешным программистом.

С выше описанной ситуацией, когда вы легко сдаетесь, связано и отсутствие «приятных ощущений», когда вы находите успешное решение проблемы. Когда исправление ошибок превращается в однообразный механический труд, которому нет конца, вы теряете азарт, сопутствующий поиску и нахождению решения задачи.

Когда вы успешно решаете проблему, в мозг выбрасывается заряд дофамина. Это сродни прохождению уровня в видео игре или решению кроссворда или судоку. Всем известно это приятное чувство, когда вы упорно боретесь с трудной задачей и в конце-концов побеждаете. Но если вы теряете способность чувствовать этот восторг, или вас это просто никогда на волновало, вам не понять и не ощутить радость от программирования. Если для вас программирование — это однообразная скучная работа, где вы просто хотите получить результат, не напрягаясь, вы никогда не станете по-настоящему хорошим программистом.

Отмечайте ваши победы: Каждый раз, когда вы находите ответ на мучивший вас вопрос, не важно, насколько он незначителен, принимайте это как повод для гордости, отвлекитесь на минутку и поздравьте себя с успешно выполненным заданием. Позвольте чувству успеха охватить вас и зарядить энергией для последующих задач.


5  | Вам не хватает терпения в учебе


Если вы ощущаете нехватку терпения в учебе и ждете, что вы сможете все освоить легко и быстро, вам ни за что не стать успешным программистом.

Человек — создание весьма ограниченное. Несмотря на то, что все в нашем мире движется все быстрее, и компьютеры являются, пожалуй, главной причиной этого, мы не можем развиваться быстрее, чем позволяют наши способности. Наш мозг работает в определенном темпе, и в зависимости от нашего прошлого, наших убеждений, эмоционального состояния и здоровья мы все учимся и усваиваем информацию с разной скоростью.

Мир технологий похож на бескрайний океан. Вам не добраться до его края, вам никогда не стать таким профессионалом, который знает абсолютно все и которому больше нечего учить. Если вас это обескураживает, вы будете постоянно испытывать давление от необходимости «догонять» прогресс и чувствовать, что ваших знаний никогда не будет достаточно. Если вы не в силах принять то, что вы уже знаете, и затем выучить что-нибудь еще, вам будет казаться, что вы никуда не движетесь, и вы просто сдадитесь.

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

Награждайте себя за ваш прогресс: В программировании учить придется много, и это путешествие никогда не закончится. Но знания накапливаются, поэтому вам стоит гордиться тем, что вы уже знаете, и верить, что все ваши старания в учебе создают прочную базу для вашей карьеры, куда бы она вас не завела.


6 | Вы чувствуете скуку или усталость от долгих размышлений


Если вы ленитесь думать и вы считаете сконцентрированное размышление скучной рутинной обязанностью, вам не стать успешным программистом.

Программирование — это мыслительная деятельность. Человек, как вид, успешен в этом, однако реальность такова, что даже несмотря на то, что мы делаем это все время, мы ленимся по-настоящему размышлять. Способность поддерживать концентрацию при решении единственной проблемы в течение какого-то времени вызывает сложности, если вы к этому не привыкли.

Проявляется это по-разному. Вы можете долго сидеть, уставившись в экран, чувствовать, что на ваши мысли давит тяжелая туча, прокрастинировать, бесцельно переключаться между вкладками браузера, или отчаянно исследовать StackOverflow в поисках нужного «ответа». Все это означает, что вы столкнулись с ментальными ограничениями и нужно найти выход.
Программируя, вы, естественно, будете уставать, а мыслительная деятельность будет буквально сжигать энергию так же, как и физическая. Когда ваш организм не привык к такому расходу умственной энергии, вам будет сложно оставаться собранными. Но это как занятия в спортзале: чем больше вы это делаете, тем сильнее вы становитесь.

Ваш мозг — это мышца: Поверьте, ваш мозг — как мышца: чем больше вы его напрягаете, тем сильнее он становится, и тем более эффективно вы мыслите. Пока вы собираете воедино части головоломки, систематизируете, анализируете и развиваете идеи, находить решения становится все легче.


7 | Вы не способны думать самостоятельно


Если вы ждете, что кто-то будет думать за вас, и не хотите всматриваться в детали своего положения, вам ни за что не стать успешным программистом.

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

У всех нас есть этот внутренний страх быть неправым. И когда этот страх препятствует вашему исследовательскому любопытству, вы  подавляете в себе способность развивать реальные знания, знания, полученные из собственного опыта, побед и поражений. Если вы полагаетесь на мнение «гуру», популярного блогера, «лучшую практику» или ответ из учебника, это значит, что вы не разбираетесь в программировании полностью и глубоко.

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

Думайте сами: С помощью собственного опыта и умения мыслить критически формируйте свои собственные мнения. Делайте обдуманные предположения, занимайте сторону в споре и будьте готовы изменить ее, если появляется новая информация.


8 | Ваше мышление негибкое, узкое и/или неорганизованное


Если вы не очень гибки в своем мышлении и у вас сложности с организацией вашего кода, а также ваших мыслей, вам ни за что не стать успешным программистом.

Я иногда вижу в студентах две крайности. Первая — узкий и негибкий подход к мышлению. Такое отношение заставляет их отвергать помощь и, несмотря на фидбэк, не дает им меняться. Все видится только с одной стороны, все предложения игнорируются.

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

Когда оба эти образа мысли объединяются, результатом оказывается такой жесткий и напряженный подход к программированию, своего рода метод грубой силы, который приводит к многочисленным слоям исправлений багов и «костылей». Что действительно необходимо в такой ситуации, так это способность вернуться к началу, переосмыслить первоначальное решение, отказаться от него и реорганизовать код.

Неспособность увидеть другие возможности или получить фидбэк мешает вам расти и развиваться. Неорганизованность замедляет вас и не дает видеть шаблоны, которые в ином случае были бы очевидны. И общее качество вашей работы ухудшается.

Самокритика: Всегда следует сделать шаг назад, чтобы увидеть целиком всю картину того, как вы подходите к задачам. Как можно сделать это лучше? Есть ли что-то, что могло бы облегчить вашу жизнь? Чего вам не хватает и что могло бы вам помочь?


9 | Вы хотите знать один «правильный» ответ вместо признания спектра «хороших» и «плохих» ответов.


Если воспринимать конечную цель программирования как нахождение верного решения, а не спектра возможных решений, вам ни за что не стать успешным программистом.


В начале изучения навыкам программирования студенты часто хотят знать, является ли то, что они сделали, «правильным». Ответ на этот вопрос всегда — «зависит от обстоятельств».

Computer Science — это наука оценивания компромиссов. Получив различные комбинации обстоятельств, найдете ли вы лучшее решение? Все зависит от обстоятельств и целей. Когда вы воспринимаете программирование как тест с верными и неверными ответами, вы теряете возможность видеть всю картину и отказываетесь от творческого подхода. Любое решение может быть «верным», если оно оправдано в данных обстоятельствах.

В реальности программирование больше похоже на написание стихотворений или рассказов (или романов, если программы достаточно большие). В вашем коде есть своя эстетика и красота, иногда видимая лишь вам и другим программистам. Причины, по которым вы выбрали какое-либо решение и то, каким вы себе его представляете, гораздо важнее, чем «правильно» или «неправильно». Образ мысли художника позволяет играть с различными вариантами и возможностями, а не считать какое-либо решение единственным верным. В этом и есть красота программирования — есть много разных способов решения проблемы, и рассмотрение разных возможностей приводит к ощущению того, какой из них лучше подойдет в тех или иных условиях.

Будьте креативными: Поймите, что есть множество способов решить проблему, а опыт и выдержка помогут вам со временем развить отличное понимание того, какие решения больше подходят в данной ситуации, чем другие. Видеть полную картину, представлять себе различные возможности и доверять своей интуиции полезно для нахождения лучших решений, полностью удовлетворяющих вашей задаче.


10 | Вы не уделяете достаточно внимания деталям


Если вы пренебрегаете деталями и упускаете из вида мелочи, вам ни за что не стать успешным программистом.


Компьютеры любят точность. Когда дело касается программирования компьютера, необходимо предоставлять ему исключительно точные команды таким образом, как того ожидает компьютер. Если вы этого не делаете, ничего не сработает. Среднего не дано — код либо работает, либо нет.

Это означает, что программисту необходимо быть внимательным к деталям. Каждый пробел, скобка или точка с запятой важны. Если они не там, где надо, ничего не сработает. Когда компьютер выбрасывает сообщение об ошибке, вы должны уметь взглянуть на него и понять четко, о чем он вам сообщает. В реальной жизни, если вы упустите подобные детали, вы потратите часы на поиски проблемы, которая на самом деле является результатом простой опечатки.

Как говорится, дьявол кроется в деталях. И в программировании это действительно так.

Уделяйте внимание деталям: Мелочи важны и вам придется это принять. Как только вы это сделаете, вы начнете просматривать ваш код на наличие чего-то, что не на своем месте. Можно организовать свой код и использовать различные инструменты, помогающие идентифицировать проблемы быстрее.


Бонус: Вы сосредоточены на бизнесе


Вот, что я понял, наблюдая со стороны: студенты, имеющие предпринимательскую жилку, часто более сосредоточены на результате, чем на процессе. Они хотят получить «рабочее приложение», которое позволит им продвинуться дальше с их бизнес-идеей, они хотят «сначала выйти на рынок» и видят длительное обучение как барьер на пути к их цели — запуску их бизнеса.

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

Я также встречал студентов, которые желали начать работать сильнее, чем другие, и испытывали значительные сложности в обучении. Они часто торопились найти заказчиков, подписывались на работу, которую даже не в состоянии были выполнить самостоятельно! Они хватались за все найденные ресурсы/шаблоны чтобы только проект начал работать, или же отдавали часть работы на аутсорс кому-то еще. У них реально плохо получалось программировать, но потрясающе получалось убеждать людей платить им за это!

Я бы хотел добавить, что студенты, желающие начать бизнес, великолепно понимают в продажах, связях и развитии, но испытывают гораздо больше трудностей в самом программировании. Их естественное желание создать финансовые возможности и связать людей и решения делает их нетерпеливыми в разборе нудных деталей, что предполагает программирование.

Заключение


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

Если вы хотите научиться программировать, отправляйтесь в это путешествие! Помните об описанных мной проблемах и начинайте исследовать все множество ресурсов, доступных онлайн, это ускорит ваше продвижение вперед. Вы точно не пожалеете.

Дисклеймер: все сказанное выше — мое собственное мнение, основанное на профессиональном опыте преподавания веб-разработки. Оно может отличаться от мнения BrainStation.
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

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

    –20
    Вы хотите знать один «правильный» ответ вместо признания спектра «хороших» и «плохих» ответов.

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

    Интересное мнение. Однако, нельзя написать две точки входа в одной программе. Всегда есть реализованное решение и остальные. Если вам кажется, что существует целый спектр «хороших» решений, значит вы недостаточно глубоко изучили вашу конкретную задачу. Всегда есть обстоятельства, иногда даже не связанные с программированием, которые выделяют из хороших то самое единственно верное решение.
      +1

      Единственно верное решение — это "2 x 2 = 4".
      Все остальные решения — это компромиссы.

        +24
        С этим тоже можно поспорить. Гораздо быстрее будет.
        0010<<1
          +6

          Далеко не факт, плюс, на 0 в некоторых языках программирования начинаются восьмеричные числа.

            0
            Компьютеры бывают не только двоичные.
              +2
              А это — зависит от языка. В Python умножение быстрее, чем сдвиг, например.
                –4

                Надо будет по внимательней ознакомиться. На сколько помню, сдвиг бита выполняется за один такт, а умножение за 4. Это для x86. Почему в питоне по другому не понятно. Что там такого можно было накрутить?

                  +2
                  По ссылке ходить не пробовали? Там написано.
                    –4

                    Пробовал. С первого раза не осилил. Имею полное среднее. Дальше не учился. Только собираюсь. Для меня длинная арифметика — это филькина грамота. Сейчас понял так, что даже к целому числу в питоне сдвиг применяется как к максимально возможному поддерживаемому числу в питоне. Соответственно проц может предугадать ветвление и умножение, выполнится быстрее чем сдвиг. И теперь до меня начинает доходить мысль: Я ненавижу динамические ЯП. На входе вечно пишешь typeof. В переменную добавляешь её тип. И вечно ловишь непредсказуемый глюки. Правда только по своей вине. Почему столько холивара между статический типизацией и динамической? Чего я не понимаю в этом? Статика же во многом лучше?! Ни в одной статье не смог найти плюсы динамики. Может плохо искал?

                      +5
                      Скорее не там искали. Используя динамические языки сложнее написать код, который всегда работает корректно, но проще написать код, который иногда работает корректно.

                      Соответственно быстрее закрываются таски, проще получать премии и так далее.

                      А иногда 100% корректность не нужна в принципе: например вспомогательные скрипты, используемые для сборки программы — если они как-то отрабатывают на ваших данных, которые у вас есть и дают правильный результат… то вам же неважно что они сделают с другими данными, которых у вас нет!
                        +1
                        Лайфхак: зайти по ссылке и ввести в поиске по странице слово «сдвиг»)
                          –1

                          И что это даст. Я прочитал про сложную арифметику. В моем мире её нет. Есть 1С, которая меня от этого огораживает, и даже мешает понять. Есть ПЛК. Там все просто. Сдвиг это быстро, умножение требует ресурсов проца. Понять с лету я не могу.

                    +19
                    Правильнее говорить по другому: Питон на столько медленный и длинный, что в нём даже сдвиг медленнее, чем умножение.
                      +4

                      просто для сдвига используется два символа, а для умножения — один

                    0
                    Еще быстрее будет просто: 4
                    +2

                    В некоторых системах счисления может получиться не 4, а 10 или даже 11 :)

                      +11
                      А то и syntax error «operation 'x' is not defined» [:
                        +18
                        Здесь человек привык принимать Единственно Верные Решения ™ — а вы со своими троичным и четверичными системами…
                          +9
                          justhabrauser: Единственно верное решение — это «2 x 2 = 4».
                          Все остальные решения — это компромиссы.

                          justhabrauser: Здесь человек привык принимать Единственно Верные Решения ™ — а вы со своими троичным и четверичными системами…

                          Вы сами себе отвечаете?
                            0
                            Предлагаете использовать «единичную» систему?
                              0

                              Микросервисная архитектура. По сервису для каждой задачи:
                              2 х 2,
                              2 х 3,
                              2 х 4...

                                0

                                Математики так и делают. Вот это вот Z и S — это они.

                                  0
                                  зачем так примитивно? Система исчисления с основанием е — куда забавнее.
                                0

                                10 в любой системе счисления 10 ;)

                                  +2

                                  Кроме единичной, всех непозиционных и не использующих арабские цифры.
                                  Если уж на то пошло.

                                    0
                                    del
                                      0
                                      Позиционная система с основанием 1. Дробных чисел в ней нет, а целые — без проблем. Нуль == пустая строка.
                                    0
                                    10 в любой системе счисления — это ее основание.
                                      0
                                      кроме единичной :D
                                        –2

                                        единичной системы не бывает, поскольку в любой системе должен быть 0 и число от него отличающееся.


                                        соответственно минимальная система счисления — двоичная: состоит из 0 и 1


                                        единичная система состоит из одних нулей и бессмысленна

                                          0
                                          не спешите. вот она:
                                          0: _
                                          1: 1
                                          2: 11
                                          3: 111
                                          4: 1111
                                          5: 11111
                                          и т.д.
                                          вот что вики знает: Унарная система счисления
                                            –2

                                            нуля нет — практического смысла не имеет, о чем я и говорил


                                            обучение детей счету о котором упоминается: надо вспомнить что обучают на палочках счету в десятичной системе, а не единичной


                                            то есть похожесть != использование

                                              +2

                                              Вам там не совсем корректно сказали.


                                              0: Z
                                              1: SZ
                                              2: SSZ
                                              3: SSSZ
                                              и т. д.

                                                –1
                                                S и Z — два знака. а в единичной системе возможен только один знак.

                                                ни в какой другой системе счисления не используется «отсутствие цифры» как обозначение нуля. А тут натянуто за уши.

                                                использование «отсутствие цифры» для обозначения цифры говорит о неполноте «системы счисления» и следовательно её бессмысленности.

                                                так же в этой системе счисления невозможна (формализация) операция деления без перехода к другим системам счисления
                                                  +3
                                                  S и Z — два знака. а в единичной системе возможен только один знак.

                                                  Z может быть только в конце строки и имеет по большей части техническую роль. Значение числа зависит только и исключительно от количества S в строке.


                                                  Короче, можете выкинуть Z.


                                                  так же в этой системе счисления невозможна (формализация) операция деления без перехода к другим системам счисления

                                                  Почему?


                                                  Система счисления — это всего лишь представление.

                                        +2

                                        В любой системе счисления, имеющей основание и цифры 1 и 0, так точнее.

                                      0

                                      В перле 2 x 2 даст 22. Как и 2 . 2

                                      0
                                      найдите точное численное решение задачи X*X=2, без компромиссов пожалуйста.
                                        –1

                                        x = sqrt(2)

                                          +1
                                          одно?)
                                            0
                                            для любителей задача сложней, X*X*X=3
                                              +2

                                              public int X { get { if (!x) { x = true; return 3; } return 1; } }

                                                0
                                                ответом является «трижды обрезанный»… а уж почему его так порубали — загадка
                                            –4
                                            Все остальные решения — это компромиссы.

                                            Вы не поняли смысл моего сообщения. Я об этом и написал, что из множества решений, удовлетворяющих требованиям, всегда можно выделить одно, наиболее оптимальное в данной ситуации.

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

                                                  Как же скучно жить в черно-белом мире…
                                                  всегда есть не нулевая вероятность получить несколько оптимумов при конечном количестве параметров.

                                                    –3
                                                    В том и дело, что эта вероятность стремится к нулю. В теории она нулевая, на практике — зависит от глубины исследования (стремится к нулю).
                                                      0

                                                      С чего бы, даже в теории, стремиться к 0...? Насколько я помню, математически было показано, что вероятность нахождения нескольких оптимумов стремится к 0 только при бесконечном количестве параметров/критериев. В практике(реальной жизни) оптимумов вполне может быть несколько. Классический бытовоц пример у нас — выбор рейса Москва -Питер. Чтобы выбрать рейс, постоянно нужно увеличивать число параметров/критериев.что бы в итоге остался 1. Причём в зависимости от индивидуума, набор этих параметров разный…

                                                    +1

                                                    Назовите любой алгоритм сортировки и вам назовут мильйон причин, в чём оно не оптимально.

                                                      –1
                                                      Похоже на задачку буриданова осла, если честно. С сортировкой-то что не так? Если нет убедительных причин поступить иначе: берите sort из стандартной библиотеки, и не надо ничего выдумывать.
                                                        +3

                                                        С сортировкой не так то, что сортировать можно очень разные данные и в очень разных условиях. Массив из 10 элементов эффективнее будет сортировать вставками. Из 10 миллионов элементов — квиксорт (если массив упорядочен случайно). Для 3 элементов эффективнее будет нахардкодить дерево из ифов. Если подключить сюда еще размер данных для сортировки (просто инты или 10-мегабайтные структуры?), тип структуры контейнера (массив или односвязный список?), характер данных (почти отсортированные? Случайно упорядоченные? Отсортированные в почти-обратном порядке?), то количество оптимальных для каждого отдельного случая алгоритмов растет еще больше.


                                                        sort из стандартной библиотеки — это компромисс, который good enough для самых распространенных случаев. Но даже в каждом из них — далек от оптимальности. Не говоря уже об искусственно созданных "плохих" входных данных, которые есть у любого алгоритма сортировки.

                                                          +1
                                                          Он не просто good enough, у него еще и нулевая стоимость поддержки и реализации. Если, конечно, ваш продукт это не разработка и поддержка популярного фреймворка или этой самой стандартной библиотеки.
                                                            +1

                                                            "Нулевая стоимость поддержки и реализации" не равно "оптимально по всем параметрам". Помимо стоимости поддержки и реализации есть и другие параметры. Часть из них я упомянул в своем комментарии.

                                                              –2

                                                              А, у вас какое-то своё толкование задачи оптимизации. В классическом смысле это поиск минимума (или максимума) некоторой функции от этих самых параметров. Как правило, эта функция: полная стоимость решения с учетом ограничений. И в очень редких случаях sort не подходит, или не оптимален.

                                                                +2
                                                                А, у вас какое-то своё толкование задачи оптимизации. В классическом смысле это поиск минимума (или максимума) некоторой функции от этих самых параметров.

                                                                Нет, у меня толкование вполне классическое.


                                                                Как правило, эта функция: полная стоимость решения с учетом ограничений.

                                                                Что конкретно входит в "полную стоимость решения с учетом ограничений"? И с какими весами?


                                                                И в очень редких случаях sort не подходит, или не оптимален.

                                                                И, как сказал Prototik, можно назвать мильйон таких "редких случаев", в которых библиотечный sort будет неоптимальным.

                                                                  0
                                                                  Видимо без примеров тут не обойтись. Если таких редких случаев «мильйон» не должно составить труда найти кейсы когда библиотечный сорт не подошёл. В интернете куча исходников популярных проектов, не библиотек, с большим количеством контрибуторов.

                                                                  Найдёте хотя бы три?
                                                                    +1

                                                                    Труда действительно не составляет. Правда не могу понять, чем вам не угодили библиотеки. Но да ладно.


                                                                    https://github.com/git/git/blob/master/pack-revindex.c#L27
                                                                    https://github.com/torvalds/linux/blob/master/lib/sort.c#L199
                                                                    https://github.com/antirez/redis/blob/unstable/src/pqsort.c#L99


                                                                    А мой вопрос вы решили проигнорировать? Про количественный и качественный состав "полной стоимости решения с учетом ограничений".

                                                                      +1
                                                                      Спасибо за примеры. У каждого из них есть история и на фоне миллионов ссылок на стандартные функции они отлично иллюстрируют мой тезис
                                                                      Если нет убедительных причин поступить иначе: берите sort из стандартной библиотеки, и не надо ничего выдумывать.

                                                                      Особенно мне нравится вот этот коммит в гит. Тут и исследование, и обоснование, и видно как начали со стандартной сортировки.

                                                                      С ядром линукса тоже была увлекательная история. Только редис выбивается немного, сишный кусорт вполне способен посортировать в середине массива.

                                                                      Я не знаю, про какие критерии вы хотите узнать. Серебряной пули нет, и в каждом конкретном случае функция стоимости и набор критериев будет отличаться. Если у вас задача опубликовать статью про новый алгоритм сортировки, то очевидно что никакой существующий алгоритм не подойдёт.
                                                                        0

                                                                        Я немного утратил нить вашего тезиса.


                                                                        Все началось с сообщения о том, что в любом алгоритме сортировки (к слову, даже не в реализации, а именно в алгоритме) есть минусы и что для любого из них можно назвать множество примеров, где этот алгоритм не будет оптимальным. Вы в ответ стали возражать, зачем-то приводя в пример sort из стандартной библиотеки исходя из его превосходства по каким-то отдельным критериям, которые далеко не всегда имеют решающее значение и которые, вообще говоря, никак не относятся к алгоритму как таковому.


                                                                        Теперь вот оказывается, что вы все таки не считаете библиотечный sort той самой серебряной пулей, которая оптимальна всегда и везде. И для него тоже есть множество примеров, где он не оптимален.


                                                                        Можете тогда пожалуйста конкретнее прояснить, с чем именно вы не согласны и каков ваш посыл? Что зачастую можно написать std::sort и все будет хорошо? Ну да. Только с этим никто и не спорил и речь вообще о другом была.

                                                                          0
                                                                          Началось все с утверждения, что «для любой задачи существует оптимальное решение». Хочу заметить, что это не то же самое, что «существует оптимальное решение, подходящее к любой задаче». Первое утверждение я считаю верным, второе очевидно некорректно.

                                                                          Конкретно про сортировки. Я не спорю, что есть разные алгоритмы с разными характеристиками. Но считаю, что в среднем программист скорее выиграет сто миллионов в лотерею и перестанет программировать вообще нежели ему придётся решать задачу где встроенная сортировка не подойдёт. И считаю неправильным употреблять для описания таких случаев эпитеты: «множество», «зачастую», «мильены».
                                                            +1
                                                            Не говоря уже об искусственно созданных «плохих» входных данных, которые есть у любого алгоритма сортировки.


                                                            Это скорее для квиксорта характерно, там от способа выбора опорного элемента много зависит. Хипсорт и мержсорт к такому устойчивы вроде.
                                                              0

                                                              Да, вы правы. С "у любого" я слегка погорячился.
                                                              Но общий посыл от этого не меняется — не существует серебряной пули, которая будет одинаково эффективно сортировать любые данные в любых условиях. Даже если речь о sort-е из стандартной библиотеки (любого языка).

                                                        0

                                                        Мне нужно сложить 2 целых числа.
                                                        Можете назвать оптимальное решение, оптимизированное по всем параметрам сразу?

                                                          0
                                                          Подумайте, откуда взялась поговорка, что «лучшее — враг хорошего».
                                                          Всегда есть несколько оптимальных и удовлетворительных решений.
                                                          Потому что оптимизировать по всем параметрам невозможно. Мы не живем в статичном мире.
                                                        +3
                                                        Нам преподаватели в институте по рукам били за такое применение термина «оптимальный».
                                                        Не бывает абстрактно оптимальных решений. Решение может быть оптимальным только по определенному критерию оптимальности. При этом по другим критериям это решение зачастую не будет оптимальным (например, по времени решения задачи).
                                                        dic.academic.ru/dic.nsf/ruwiki/1587468

                                                        Выбор критериев, назначение весов критериям, путь до решения — всё это весьма субъективно. Каждый человек будет решать задачу по-разному. Каждое решение будет оптимально по одному критерию и минимально удовлетворять остальным критериям ТЗ. И все решения будут «хорошими», т.е. рабочими.
                                                          +3
                                                          Еще за применение термина «наиболее оптимальное» стоит бить. Оно либо оптимальное, либо нет. Нескольких оптимальных, из которых можно выбрать «наиболее» не существует.
                                                            –2
                                                            многокритериальная оптимизация

                                                            это весьма субъективно

                                                            Субъективно? Вы наверное забыли, что речь идёт о проблеме выбора для субъекта. Очевидно, что его выбор будет субъективным) Я говорю лишь о том, что этот выбор может и должен быть обоснованным, единственным. Всегда есть обстоятельства, которые склонят чашу весов в чью-то пользу. Невозможно существование двух разных, но равных по значениям критериев решений.
                                                              +2
                                                              Я говорю лишь о том, что этот выбор может и должен быть обоснованным, единственным.
                                                              Извините, но вы чушь пишите. Как может быть «обоснованным и единственным» выбор, когда речь идёт о задаче, точной постановки которой мы не знаем?

                                                              Мы не знаем как устроено железо, на котором это всё будет исполняться (потому что железо на котором мы начинаем всё это писать отличается от того, которое у нас будет к моменту, когда мы закончим), мы не знаем какие у нас будут данные к моменту, когда всё напишем (если бы знали всё в точности — то ничего писать было бы не нужно вообще) и так далее.

                                                              Невозможно существование двух разных, но равных по значениям критериев решений.
                                                              Знаете — тут так же, как с Колмогоровской сложностью. Торетически — она для любых данных существует. Практически — вычислить её нельзя.

                                                              Да, в одном случае невычислимость — фундаментальное математическое свойство, в другом — банальное следствие того, что мы не располагаем полной постановкой задачи в момент, когда начинаем её решать… но практически — следствие одно: нам приходится использовать какие-то другие методы.

                                                              P.S. Вообще вся эта дискуссия напомнила мне одну хорошо известную всем статью где говорится что, в сущности, от программиста требуется всего две вещи:
                                                              1. Толковый и
                                                              2. Доводит дело до конца

                                                              И там же был пример того, почему пункт #2 неверноятно важен: Толковые, но не доводящие дело до конца работники обычно просиживают ученую степень в больших компаниях, где их никто не слушает из-за их полной непрактичности. Они скорее станут думать об академическом подходе к проблеме, а не о выпуске продукта в срок. Их легко узнать по склонности к поиску теоретического сходства между двумя совершенно разными концепциями. Например, они могут заявить: «Таблицы — это, в сущности, частный случай языка программирования», а затем исчезнуть на неделю и написать потрясающую статью о теоретических атрибутах вычислительной лингвистики электронных таблиц как языка программирования. Круто, но бесполезно.

                                                              Вот ваше рассуждение про существование оптимального решения «для сферической задачи в вакууме» — оно из той же оперы. Формально — круто, чё… философы были бы довольны… а практически — совершенно бесполезно.
                                                                0
                                                                Так про то и речь. Если у вас куча неизвестных в задаче, и все решения кажутся на одно лицо — идите и изучайте ее подробней. Тогда выяснится, что одно решение не подходит по ограничениям, другое очень сложно реализовать, третье и вовсе не решает задачу. И у вас останется одно, то единственно лучшее, оптимальность которого вы сможете обосновать.
                                                                  –5
                                                                  Нет, вы ошибаетесь, это широко известная задача многокритериального выбора.

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

                                                                  Далее составляется матрица альтернатив, выставляются весовые коэффициенты критериям, выполняется свёртка, альтернативы ранжируются и выбирается лучшая.
                                                                  1. Матрица альтернатив содержит в столбцах альтернативы, в строках — критерии, а в пересечениях — значения каждой альтернативы по каждому критерию.
                                                                  2. Каждому критерию приписывается весовой коэффициент. Выбор весовых коэффициентов — отдельная известная задача, для которой придуманы 5-10 разных методов решения.
                                                                  3. Свёртка, в общем случае, может быть разной. В нечёткой логике обычно используется минимаксная, кто-то использует сумму и т.д. В данной задаче я бы использовал сумму.
                                                                  5. Ну и в качестве целевой функции выбора из ранжированного списка альтернатив я бы использовал [f(c1,c2,c3,...)=a]→min.

                                                                  Соответственно, я утверждаю, что всегда есть одна и только одна альтернатива, минимизирующая целевую функцию. Почему? Потому что в реальности критериев очень много, и мы может увеличивать их количество при надобности. Критериями выступают не только технические характеристики типа скорости, памяти, но и такие как: перспективы развития продукта, опыт, наличие инструментов разработки, шаблоны, целевая аудитория, знание языка/системы… Следовательно, вероятность совпадения значений целевых функций альтернатив для такого огромного количества критериев (на практике, начиная с 5) стремится к нулю.

                                                                  А вот что вы утверждаете, я понять не могу.
                                                                    0

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


                                                                    Взять тот же latency/throughput. Обычно они связаны обратной зависимостью и улучшая одно — неизбежно ухудшаешь другое.


                                                                    Из этого следует, что не существует универсального критерия на все случаи жизни, и программист уровня миддл должен уметь предложить разные варианты: с лучшим latency, с большим throughput, более дешевое в реализации и пр.

                                                                      +2
                                                                      Правильно — пока программист Петя будет составлять матрицу альтернатив и выбирать лучшее решение, задалбывая бизнес вопросами про весовые коеффициенты, программист Вася выбрал решение «примерно» и оно уже ушло в прод.
                                                                      Посмотрев на это, менеджер Коля замечает, что выбор оптимального решения это тоже задача сама по себе. И по его «матрице альтернатив» для сайта-визитки оптимальным способом решения этой задачи является выбор «шестым чуством по опыту», а потому Вася молодец а Петю уволить.
                                                                        –2

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

                                                                          –4
                                                                          А потом чуйка Васю подведёт его чуйка, прод упадёт, компания потеряет много денег, а Васю и Колю уволят.
                                                                          А Петя тем временем напишет инструмент для составления матриц за 5 минут.
                                                                            0
                                                                            Проблема не в инструменте для вычислении матрицы, а в выяснении весов, которые по определению может сказать только бизнес. Но при этом бизнес платит деньги Васе и Коле за опыт в принятии экспертных решений, и за то чтобы его спрашивали про веса только там, где бизнесу «важно». При этом чтобы они сами определяли, где именно «важно».
                                                                            А академически верный подход Пети для бизнеса выглядит как саботаж и нежелание решить задачу. Потому из Пети не получится ни хороший программист, ни хороший директор.
                                                                              0

                                                                              Что важно для бизнеса, а что нет как раз и определяет эти веса параметров. Как вы собрались выяснять, что важно для бизнеса не спрашивая при этом, что ему важно?

                                                                                0
                                                                                А можно я просто процитирую себя?
                                                                                … бизнес платит деньги Васе и Коле за опыт в принятии экспертных решений, и за то чтобы его спрашивали про веса только там, где бизнесу «важно». При этом чтобы они сами определяли, где именно «важно».
                                                                                  0
                                                                                  Если нам важен какой-то параметр, его вес будет больше чем у тех, которые не важны. Например, у параметра «научная новизна» при разработке сайта-визитки вес будет скорее отрицательный. При подготовке доклада на конференцию наоборот, больше многих остальных.

                                                                                  С параметром «стабильность в проде» ситуация противоположная, для доклада это не важно, и его вес равен нолю, а для визитки это критично.

                                                                                  Но определять, надо ли, и до каких пределов жертвовать параметром А в пользу параметра Б — это именно ответственность тех, кого мы тут называем «бизнес».

                                                                                  Иногда эти приоритеты долго не меняются и очевидны, тогда Коля может сэкономить пару минут на расспросах, но можно и спросить, никого никогда за это не увольняли. А вот истории, когда Вася сам попытался угадать что важно а что нет, но не спросил и в результате промахнулся — обычно заканчиваются очень печально.
                                                                                    +1
                                                                                    А вот истории, когда Вася сам попытался угадать что важно а что нет, но не спросил и в результате промахнулся — обычно заканчиваются очень печально.

                                                                                    Из моего опыта, истории когда «Вася» выяснял и выяснял требования до мельчайших деталей и строго бездумно им следовал, заканчивались куда плачевнее. Правда, как правило только для «Васи».
                                                                                    Понятно, что нужен баланс. И высооплачиваемые специалисты за то и получают много, что в рамках своих компетенций много и хорошо «угадывают» (я бы скорее назвал это принятием решений, основанном на здравом смысле и опыте вместо строгого расчёта. Но можно и так). И чем выше должность и зарплата, тем больше свобода решений.
                                                                                      +1
                                                                                      «Вася» выяснял и выяснял требования до мельчайших деталей и строго бездумно им следовал
                                                                                      Это скорее про soft skills, когда джун всех уже достал, но профита от него все равно как от джуна.

                                                                                      Мой опыт показывает, что если исполнитель здорово облажается с приоритетами, весом параметра в целевой функции, например ему скажут что прод критичен для бизнеса, а он там тестить начнёт потому что «а что такого-то?» то могут и уволить. Хотя такое случается редко, все же люди чаще склонны слушать что им говорят.

                                                                                      Если же он неверно предположит значение параметра целевой функции, например скажет что сделает за неделю, а провозится месяц — то обычно за это не наказывают вообще, просто не дают более ответственных задач.
                                                                        +1
                                                                        Дано несколько альтернатив (в нашем случае решений поставленной начальником задачи/проблемы), каждая из которых имеет значения по всем критериям. Необходимо выбрать одну альтернативу.

                                                                        А если альтернатив будет не несколько а несколько сотен, пока вы все пересчитаете, конкуренты уже уйдут вперед на не самом оптимальном решении, а лидер вообще на костыльном, но зато через год он скупит всех окружающих для рефакторинга.

                                                                        Такой критерий как «время принятия решения» очень сильно меняет приоритет практически всех других критериев, что порождает множество оптимальных решений, а не только одно.
                                                                          0
                                                                          Да, но все равно не понятно, как в дискретном пространстве решений может быть несколько глобальных минимумов целевой функции. Не всегда известно, как этого минимума достичь, где он находится, и даже что это за функция. Но минимум ∃!.
                                                                  +1
                                                                  в коробке два шарика — черный и белый.
                                                                  надо набрать максимальное количество шариков одного цвета.

                                                                  Какой цвет набирать наиболее оптимальнее?))

                                                                  –2
                                                                  Единственно верное решение — это «2 x 2 = 4».

                                                                  Не всегда. На поле
                                                                  Галуа это не так. Да и если вычислять во float, не в каждом языке программирования 2*2 точно равно 4
                                                                  Ну и про системы исчисления (двоичные, шестнадцатеричные, десятичные) выше уже написали. Так что таки спектр верных ответов, а не один ответ на все случаи жизни. Такие дела.
                                                                    0

                                                                    Можно реализовать через сложение :)

                                                                      0
                                                                      С определенной точностью вы правы

                                                                      image
                                                                      image
                                                                        +1

                                                                        Обожаю комментарии на хабре, под комментарием "2x2=4" — пара десятков комментариев с аргументированными возражениями и контр-примерами, где ещё такое встретишь?

                                                                          +1

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

                                                                            0
                                                                            И как же здорово, что теперь есть возможность сворачивать ветки комментариев!
                                                                          0

                                                                          Вы сами ответили на свой вопрос.


                                                                          которые выделяют из хороших то самое единственно верное решение.

                                                                          Только я б переформулировал, лучшее. Но решений, в большинстве случаев, больше чем одно.

                                                                            +2

                                                                            "Лучшее" — по каким критериям?
                                                                            "Мы делаем быстро, дешево и качественно. Выберите 2 из 3".
                                                                            Выберите "лучшее".

                                                                              –13

                                                                              Мы сейчас про программирование. Тут нету понятия быстро и дёшево. Есть проблема есть решения. Среди этих решений, есть лучшее, но не единственно верное. В моем понимании лучшее, это наиболее понятное и менее ресурсоемкое.

                                                                                +17
                                                                                Тут нету понятия быстро и дёшево

                                                                                Разве? Программирование — это активность, она занимает время. Следовательно, есть "быстро" и "медленно". Программирование так же требует ресурсов (и как активность, и как решения), и эти ресурсы могут стоить денег. Отсюда — "дорого" и "дешево".


                                                                                В моем понимании лучшее, это наиболее понятное и менее ресурсоемкое.

                                                                                Бывает так, что увеличение понятности приводит к увеличению потребляемых ресурсов. И как же выбирать "лучшее" в вашем понимании?

                                                                                  –4
                                                                                  В контексте статьи, не идет речи про быстро, качественно, не дорого. Если брать в размерах продукта, да. Есть быстро и медленно. Дорого и дешево. Если брать в контексте простейшей задачи, при это знать ЯП достаточно хорошо, то может сложиться так что: быстро и хорошо и дешево. А лучшее, это как правило всегда компромисс. Тут даже можно добавить, что и ресурсоемкоть не так легко померить. В одном случае повышенное потребление ОЗУ, в другом, повышенное потребление процессорного времени и HDD/SSD.
                                                                                    +2
                                                                                    В контексте статьи, не идет речи про быстро, качественно, не дорого

                                                                                    Почему? В статье речь идет об образовании, а в образовании тоже есть временные (и ресурсные) ограничения.

                                                                                    0
                                                                                    Это самое дешевое для заказчика при условии что оно хоть как-то работает
                                                                                      +3

                                                                                      Как вы меряете "самое дешевое для заказчика"? Самое дешевое в разработке, в работе или в поддержке? Что дешевле — сделанное за Х денег за год, или за 1.2X денег за месяц?

                                                                                    +3

                                                                                    Вы про просто хобби программирование? Хотя даже тут, можно вечно искать наиболее понятное и менее ресурсоемкое решение.


                                                                                    Я вот свой код 3 летней давности считал тогда простым и оптимальным. А сейчас смотрю и удивляюсь, как такая лажа в продукт шла? Но если бы я 3 года назад продолжил бы искать более оптимальное и понятное решение, то возможно, уже программистом и не был бы — уволили бы меня.

                                                                                      0
                                                                                      Вы про просто хобби программирование? Хотя даже тут, можно вечно искать наиболее понятное и менее ресурсоемкое решение.

                                                                                      Я даже про обучение. Встаю в ступор на каждом шагу. Есть гайд, пытаешься ему следовать. А тебе попадается необъяснимое поведение в ЯП. Приходится отходить от гайдов и городить костыли.
                                                                                        –1
                                                                                        А тебе попадается необъяснимое поведение в ЯП

                                                                                        Это странно, потому что обычно все объясняется стандартом ЯП, иногда бывает необъяснимое поведение компилятора, но тогда скорее всего надо просто прочитать Errata на него.

                                                                                          0
                                                                                          Я сейчас завяз в яве/котлине. И у меня появилось куча вопросов про implements Runnable для котлина. Говорят так делать нельзя. А мне надо. Там еще и c++. Еж с ужом для 1С мобильной платформы. И вот на Яве я легко расширяю класс в runnable, а в котлине это не работает. Готового решения не нашел. Но да, я только учусь. Может еще не пришло просветление. Errata это больше к хардварной части. Ловил веселые глюки в codesys. При прямом обращении к биту состояния в слове, получал всегда 0(false). И только через промежуточную переменную все работало как надо.
                                                                                            0

                                                                                            Что именно нельзя и не работает? Пример кода, плз.

                                                                                              0

                                                                                              Про codesys? Овновский контроллер. Опрос модуля ввода и модуля вывода. mdo1_1.4 = mdi11_1.5. Так не работает. С начало мы ложим значение бита mdi в переменную, а затем подаём на выход. Так работает корректно.

                                                                                                0
                                                                                                Я думаю, zagayevskiy спрашивал про Kotlin. Мне бы тоже было любопытно услышать, почему в Kotlin'е нельзя пользоваться Runnable — пользуюсь им часто и с удовольствием :)

                                                                                                Есть интересные случаи, на которые можно попасться, вроде описанного тут, но вообще никто не запрещает использовать Runnable так, как вздумается.
                                                                                            0
                                                                                            А вот в веб-разработке… честно говоря, не могу вспомнить, чтобы мне попадалась Errata на что-либо, с чем я имел дело…
                                                                                      +4
                                                                                      «менее ресурсоемкое» оно может быть в реализации, в поддержке или с точки зрения машинных ресурсов. Это уже три разных реализации. «Наиболее понятных» решений, если утрировать, тоже может быть несколько, в зависимости от бекграунда тех, кому они «понятнее».
                                                                                        –3
                                                                                        В реализации и в поддержке — это я называю наиболее понятным. Ресурсоемкое — соответственно — машинные ресурсы.
                                                                                          0

                                                                                          … ну то есть (периодически) весьма противоречащие друг другу вещи.

                                                                                            –2
                                                                                            В чем противоречие? Красивая реализация, легка в поддержке. Или не так?
                                                                                              +3

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

                                                                                                –3
                                                                                                Ну так на это я и написал. Компромисс. Всегда можно сложную реализацию обернуть в еще одну функцию/процедуру. С соответствующим комментарием. Что сюда нельзя, тут начинается магия. И не стоит это место трогать.
                                                                                                  +5
                                                                                                  Ну так на это я и написал. Компромисс

                                                                                                  Ну так компромис — это как раз когда вы балансируете между противоречащими друг другу вещами. Странно, что вы продолжаете спрашивать, "в чем противоречие".


                                                                                                  Всегда можно сложную реализацию обернуть в еще одну функцию/процедуру. С соответствующим комментарием. Что сюда нельзя, тут начинается магия. И не стоит это место трогать.

                                                                                                  Это как раз называется "сложно в поддержке".

                                                                                                    –2

                                                                                                    Может не было очень больших проектов у меня. А в чем сложность поддержки в этом? В таких функциях/процедурах действительно магия происходит, но как правило они железо бетонные. Менять в них что то не приходиться. Ну или их хоронят. Заметил тенденцию, все что ранее написано, не трогают. А пишут новое. Дабы ничего не сломать.

                                                                                                      +4
                                                                                                      Ну так и пишут иногда «почти такое же, но более другое», в итоге получается зоопарк «одинаковых, но разных» функций, которые не очень понятно, чем отличаются. Добавляется лишний слой, единственная задача которого — решить, в каком случае какую из этих волшебных функций вызывать. «Чтобы ничего не сломать» превращается в основной принцип разработки и добавление любой мелкой фичи на 90% состоит из изучения вопроса, может ли она что-то сломать, где она может это сломать и как проверить, сломает ли. Никто толком не понимает, что как работает и как модули зависят друг от друга. Никто точно не уверен, что можно выбросить, а что нет.
                                                                                                        0
                                                                                                        Вот с этим согласен на 147%. Когда пришло время переписать часть обработок, выяснилось что из 10к строк, требовалось всего строк 700-900, остальное мусор, годами копившийся. Но мне пришлось получить добро на такой шаг. И потом я 2 дня сидел на телефоне, на всякий случай. Но вот смотрю я на front-end и понимаю: такой фокус там не прокатит. А в back все еще хуже. Особенно если это api. Там всегда вопрос ставиться: хороним старый, пишем новый. К третьей итерации, получается что-то годное.
                                                                                                          0
                                                                                                          Бывает и такое. У меня на прошлом проекте использовалась куча сторонних библиотек. Когда начали пытаться оптимизировать, стало проясняться, что библиотечки используются процентов на 10 и это в лучшем случае. Особенно меня впечатлило использование одной из либ. Из всего ее многообразия мы использовали только одну директиву #define, то есть даже не код библиотеки, а всего навсего макрос.
                                                                                                        +1

                                                                                                        Значит это сложно в поддержке: вместо того, чтобы поменять одно место в коде, тебе надо разобраться в логике его работы и написать всё заново, но уже с новыми свойствами. На это может уйти много времнни

                                                                                                          +1
                                                                                                          А в чем сложность поддержки в этом?

                                                                                                          В том, что "сюда нельзя". Непонятно, что делать, если там проблема, или если маленькая проблема вокруг, или если надо переиспользовать с изменениями.


                                                                                                          Заметил тенденцию, все что ранее написано, не трогают. А пишут новое.

                                                                                                          Ну то есть ставим крест на переиспользовании.

                                                                                            +2
                                                                                            В моем понимании лучшее, это наиболее понятное и менее ресурсоемкое.

                                                                                            Вы точно программизмом занимаетесь?
                                                                                            Или нагуглили это всё?

                                                                                              +5
                                                                                              Да не. Я программист 1С. Не обращайте внимания. Я не занимаюсь программированием.
                                                                                                –1

                                                                                                Ну, если когда-нибудь займетесь программированием (не только 1С), то сами выведете, что:
                                                                                                "Лучшим решением является то, которое оптимально удовлетворяет требования заказчика".
                                                                                                На минуточку — "оптимально", а не "наилучшим образом".
                                                                                                Потому что удовлетворить наилучшим образом все требования — невозможно как класс.

                                                                                                  0

                                                                                                  Ещё одно спорное утверждение. Иногда заказчик не знает как ему лучше. И полагается на то, что я ему предложу. И я сам исхожу из того, что оптимально, а что нет.

                                                                                                    +6

                                                                                                    Для меня оптимально и наилучшим образом — синонимы.

                                                                                                      0
                                                                                                      В 1с это утверждение точно так же работает.
                                                                                                        0
                                                                                                        Термин «оптимальный» в технике как раз и означает «наилучший» по заданному критерию оптимальности.
                                                                                                        dic.academic.ru/dic.nsf/ruwiki/1587468

                                                                                                        Видимо в понятие «наилучшим образом» вы не закладываете все нужные заказчику критерии, оставшиеся в умолчаниях, такие как время и финансовые затраты.
                                                                                                    0
                                                                                                    Программирование — еще более многофакторное, чем просто быстро и дешево.
                                                                                                0
                                                                                                Вы, простите, ерунду написали. «Задача А реализована программистами М и Д через Ж...» — реализованное решение? Да. Работает? Да, в основном. Есть спектр лучших решений этой задачи? — Да, вагон! А вот «реализаторы через Ж» как раз «недостаточно глубоко изучили конкретную задачу». Как-то так.
                                                                                                  +2
                                                                                                  и «реализаторы через Ж» уже выпустили готовый продукт, а М и Д сидят ночами накануне дэдлайна
                                                                                                    0
                                                                                                    Не выпустили они ничего, потому как их велосипед CR не проехал :) Я к тому, что посыл «то, что реализовано — правильно» — неверный в корне. Можно реализовать аутентификацию с хранением открытых паролей в базе, и прочими creds в коде. Реализовано? Конечно! А это правильное/хорошее решение?
                                                                                                      –1

                                                                                                      Если в требованиях не было про то, как должны храниться пароли, то вполне себе нормальное решение. Может там защита не нужна… Например, какой-нить внутрикорпоративный сервис, для поиска общедоступной информации… Зачем городить огород, где он не нужен?


                                                                                                      Реализовано правильно, это когда по требованиям.

                                                                                                        0

                                                                                                        Кроме явных требований заказчика есть неявные у него же, есть требования регуляторов разных юрисдикций, есть лучшие практики (юридически я бы их отнёс к обычаям делового оборота). И может иск о ненадлежащем исполнении договора или служебных обязанностей и не выиграет в суде, но репутацию вам подмочит, если будете хранить пароли в открытом виде, когда даже на сайте ЯП указано, что так делать нельзя

                                                                                                          0

                                                                                                          Неявные требования тоже требования. Если есть закон о персональных данных, то это тоже требование…

                                                                                                          0
                                                                                                          А потом случайно порт оказывается открытым наружу, и мы читаем новость об очередной утечке данных. Есть здравый смысл и лучшие практики. Если есть пароли, то в открытом виде их быть не должно.
                                                                                                            –1

                                                                                                            И что? У нас, например внутренняя система учёта времени, там мой пароль 1. Ну утечет он, что с этого? Данные с этой системы чисто информативные для сотрудников…
                                                                                                            Зачем там сложная система аутентификации? 7

                                                                                                              +2

                                                                                                              А зачем тогда там вообще пароль?

                                                                                                                0

                                                                                                                Чтобы случайно под другим юзером не зайти..

                                                                                                                0
                                                                                                                А раньше был 111?
                                                                                                                Прогресс однако.
                                                                                                                0

                                                                                                                Смотря где в открыом виде. В дженкинсе есть защищённые переменные, но они отдаются приложению строкой, только в логах маскируются. Это, разве, плохая практика?

                                                                                                              +1
                                                                                                              Если внутренняя система, если по ТЗ и прочим требованиям удовлетворяет.
                                                                                                              Реализовано? Реализовано. Быстро. Дешево.
                                                                                                              Не нужно пилить фейсбук там, где достаточно 2 html страничек.
                                                                                                                0
                                                                                                                «то, что реализовано — правильно» — неверный в корне.

                                                                                                                Расскажите погроммистам 1С

                                                                                                                  +1

                                                                                                                  Ну вот мне и расскажите. На 1С можно тоже писать хорошо и правильно. А где не хватает производительности, задействовать другие механизмы.

                                                                                                                    0
                                                                                                                    Возможно, дело в том, что в 1С, как правило, идут программисты с заниженной планкой социальной ответственности?
                                                                                                                    Я сам (сдуру) заглядывал в исходники фреймворка от той же конторы (Битрикс) а от того, что я там увидел, меня трясет от каждого упоминания — такое впечатление, что его делали люди, которые только вчера научились включать комп, а сегодня ваяют на пхп.
                                                                                                                      0

                                                                                                                      Это совсем разные конторы. Но да. Иногда и там и там видишь хаос вместо кода.

                                                                                                              0
                                                                                                              А вот «реализаторы через Ж» как раз «недостаточно глубоко изучили конкретную задачу».
                                                                                                              Ну, если задача стояла «сделать максимально быстро и забыть», то «М и Д», наоборот — молодцы. Просто, возможно, ТЗ поменялось и «забыть» было вычеркнуто.
                                                                                                              0

                                                                                                              Речь скорее всего о том, что программных реализаций решений, позволяющих получить искомый результат — более одного. Кроме того, сам результат может быть гибкой функцией, если нет железобетонного ТЗ с эскизами форм, отчетов и т. п. Заказчик не всегда может внятно представлять автоматизацию глубже понятия "должно что-то стать быстрее и удобней".

                                                                                                                0
                                                                                                                Спектр — «ранжирование решений по корректности для данного конкретного случая», а не «набор одинаково хороших решений для всех случаев». Такое тоже бывает, но не так часто.
                                                                                                                  0

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

                                                                                                                    0

                                                                                                                    Согласен с вами, но это единственно верное решение будет меняться от каждого аспекта и в понимание каждого другого программиста. И в итоге у нас как раз и получается спектр — общий случай лучшего решения, который может быть применен к конкретной ситуации для получения того самого лучшего решения.

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

                                                                                                                      А риски и перспективы развития следует, конечно же, учитывать. Может программист знает не всё, но предусмотреть банальное масштабирование желательно.
                                                                                                                      0
                                                                                                                      Рискну предположить, что догадываюсь, что имел в виду комментатор.
                                                                                                                      Мне часто помогает представить как бы какая-то штука была реализована в идеальном мире. Типа, решение, повторяющее или моделирующее логику того, что нужно сделать как оно есть. А уже потом компромиссами превратить его в то, что можно сделать в конкретных условиях. А иногда, если костылей «вынужденных решений» накопилось еще не много, получается и без компромиссов.
                                                                                                                        +1
                                                                                                                        Однако, нельзя написать две точки входа в одной программе


                                                                                                                        Легко. У меня есть сервис (use-case) регистрации пользователя. Одна точка входа через web-морду, вторая — через CLI.
                                                                                                                          0

                                                                                                                          В этом и соль: есть реализация, но если ты не видишь её сильных или слабых сторон, то ты не станешь успешным программистом. Есть задача: вывести результат 2x2. Хороший программист обязан:


                                                                                                                          1. Вывести значение сразу. Тут нефиг думать.
                                                                                                                          2. Прогнать в голове все варианты контекста применения этой функции. Потому, что завтра заказчик скажет: ой, ну это чисто пример, там надо чтобы пользователь руками вводил формулу (любой сложности в рамках средней школы), вводил значение всех переменных и получал результат. И ты такой садишься на жопу и начинаешь писать за 1000 рублей калькулятор для алгебры и начала анализа.

                                                                                                                          Поэтому, ты обязан знать паттерны решения твоего вопроса. Полюбому, есть набор решений, которые подскажут тебе, что контекст использования может отличаться от ТЗ. Или было бы разумно реализовать паттерн, который отвечал бы ожиданиям большинства вариантов юзкейсов.

                                                                                                                            0

                                                                                                                            Но можно написать две точки входа для компиляции, если тебе нужен вариативный результат

                                                                                                                              0

                                                                                                                              Получается, не выйдет из вас хорошего программиста. Так?

                                                                                                                              +37

                                                                                                                              Кроме №9 все тезисы могут быть применены к любой профессии.
                                                                                                                              Вообще к любой.


                                                                                                                              Всю статью можно переписать так:
                                                                                                                              "Если будешь хорошим — то будешь хорошим. А если будешь плохим — то ничего у тебя не получится."

                                                                                                                                +1

                                                                                                                                Да и 9-й тезис, в принципе, тоже.

                                                                                                                                +15
                                                                                                                                Это всё про любую интеллектуальную деятельность можно сказать, а не только про программирование.
                                                                                                                                  –14

                                                                                                                                  Подставьте "дворник".

                                                                                                                                    +27
                                                                                                                                    «Дворник», вроде, к интеллектуальным профессиям не относится… Однако, если подразумевать нечто типа «специалист по клинингу» — там много разного интересного оборудования и целый мир всякой спецхимии, с этим всем можно разбираться, «придумывать нестандартные решения» и далее в том же духе, что делает тезис Suvitruf снова верным.
                                                                                                                                      –12
                                                                                                                                      «Дворник», вроде, к интеллектуальным профессиям не относится…

                                                                                                                                      Кто так решил?
                                                                                                                                      И что есть "интеллектуальная профессия"?
                                                                                                                                      Илита?


                                                                                                                                      PS. ну разве что под "интеллектуальной профессией" понимать вид деятельности, при котором больше работают головой меньше работают руками, и основная физическая нагрузка приходится на пятую точку.

                                                                                                                                        0
                                                                                                                                        Если брать в качестве критерия «хорошего дворника», то у него может оказаться немало «разного интересного оборудования».
                                                                                                                                        Ему потребуется интеллектуальная деятельность, например для расчёта расхода реагента с учётом температуры сейчас и ближайшим вечером. Или для оптимизации затрат на очистку стоянки с учётом непрекращающегося снегопада и времени приезда начальства :). Ну и т. п.
                                                                                                                                        0
                                                                                                                                        Вы думаете, дворнику не нужно принимать никаких решений?
                                                                                                                                          0

                                                                                                                                          Я думаю что выделять илиту интеллектуальную деятельность как нечто особенного немного неверно.
                                                                                                                                          Работа как работа. Ничего особенного. Дворником отнюдь не проще.

                                                                                                                                            +4
                                                                                                                                            Я могу делать работу любого дворника, а любой дворник мою не может.
                                                                                                                                              –2
                                                                                                                                              Вы уверены, что сдюжите 8 часов махать метлой, долбить лёд, посыпать дороги песком и кучу других обязанностей дворника?
                                                                                                                                                0

                                                                                                                                                Точнее не махать метлой, а мести.
                                                                                                                                                Махать-то сможет, мои дети в 2 года так могли. Именно махать метлой, не мести.

                                                                                                                                                  +4
                                                                                                                                                  Не просто уверен, я знаю, так как работал дворником.
                                                                                                                                                    0
                                                                                                                                                    Тогда вам очень повезло, ибо я разваливаюсь после подметания своей квартиры х)
                                                                                                                                                    0

                                                                                                                                                    Для этого требуются какие то особенные умственные способности, что вы дворника в интеллектуальную профессию записали?

                                                                                                                                                      +1
                                                                                                                                                      Я не записывал дворника в интеллектуальные профессии, просто не был уверен в
                                                                                                                                                      Я могу делать работу любого дворника

                                                                                                                                                      Я бы развалился через полчаса подметания улиц. То, что господин Hivemaster может подметать улицы и не умирать от этого — хвала ему во всех смыслах
                                                                                                                                                  +1

                                                                                                                                                  Но, например, любознательность или там терпение в учёбе явно не являются важным профессиональным качеством дворника. А для программиста — являются. Значит, совершенно одинаковыми эти две профессии не являются...

                                                                                                                                                    –3

                                                                                                                                                    Конечно не являются!
                                                                                                                                                    Чтобы быть нормальным дворником, надо чтобы руки нормально отросли.
                                                                                                                                                    А вот людям с проблемными руками альтернативной моторкой приходится идти в погроммисты и выкручиваться как получится.


                                                                                                                                                    PS. надеюсь понятно, что это просто взгляд с другой кочки зрения, а не повод для холивара :-)

                                                                                                                                                      +3

                                                                                                                                                      Но интелектуальной профессия "дворник" от смены точки зрения всё равно не становится.

                                                                                                                                                        –1

                                                                                                                                                        Конечно не становится!
                                                                                                                                                        Чтобы быть дворником, надо кроме головы еще и прямые руки иметь.
                                                                                                                                                        А с прямыми руками ту же Windows написать сложно (такой, какая она есть)


                                                                                                                                                        Так что нет, не становится.

                                                                                                                                                          0

                                                                                                                                                          То есть вы согласны, что дворник — не интелектуальная профессия? Тогда с чем вы спорите?

                                                                                                                                                            –3

                                                                                                                                                            Как только дадите четкое, явное и неоднозначное определение понятия "интеллектуальная профессия" — сразу же.
                                                                                                                                                            PS. насколько мой склероз подсказывает — в ОКПДТР ничего такого нет.

                                                                                                                                            +22
                                                                                                                                            TL;DR;:
                                                                                                                                            «Если вы несамостоятельный ленивый нелюбознательный хмыропуз, то из вас ничего не получится».
                                                                                                                                              +7
                                                                                                                                              Отнюдь — можно же в депутаты ГД пойти, идеальная будет кандидатура
                                                                                                                                                +4
                                                                                                                                                А вы попробуйте. Подобраться к такой кормушке намного сложнее, чем стать сеньором транснациональной корпорации.
                                                                                                                                                  +1

                                                                                                                                                  Тут дело в наборе навыков и характере, кому-то проще стать сеньором, кому-то депутатом. От человека зависит.

                                                                                                                                                    0
                                                                                                                                                    Я бы немного перефразировал: переступить через некоторые свои принципы, подбираясь к кормушке, да, сложнее, чем стать сеньором в IT.
                                                                                                                                                    Но с другой стороны, дефицит специалистов во многих (во всех?) отраслях довольно велик, как и в политике тоже.
                                                                                                                                                +20
                                                                                                                                                (на правах грустного юмора) Почему мне не быть хорошим программистом несмотря на 15 лет опыта:

                                                                                                                                                Если вам не очень любопытно как работает компьютер и технологии в целом, вам ни за что не стать успешным программистом.

                                                                                                                                                Мне интересно, как написан код библиотек\фреймворков и т.д., но мне всё равно, как устроен компьютер (знаю на уровне школьника и ладно)

                                                                                                                                                Если вы не разовьете в себе умение решать проблемы самостоятельно, вам ни за что не стать успешным программистом.

                                                                                                                                                Я не хочу потерять день на решение проблемы мучаясь дебагом, которое способен мгновенно выдать интернет\коллега\мануал.

                                                                                                                                                Если вы сдаетесь, едва столкнувшись с проблемой, вам ни за что не стать успешным программистом.

                                                                                                                                                Решит коллега. Поменяю саму задачу или способ решения.

                                                                                                                                                Если вы не испытываете чувство восторга и выполненного достижения, когда решили проблему, вам ни за что не стать успешным программистом.

                                                                                                                                                Нет, ведь самое трудное е