«Программист» — это сверхобобщение

Original author: Erik McClure
  • Translation
В этом коде могут быть ошибки; я только доказал, что он правилен, а не проверял его.
Дональд Кнут

Сегодня я наткнулся на пост, в котором утверждалось, что использовать функцию C++ STL make_heap нельзя, потому что почти никто не умеет использовать ее правильно. Сначала я возмутился смехотворностью этой идеи — любой человек, имеющий хотя бы начальное представление об алгоритмах, должен знать, как правильно использовать make_heap. Но потом я задумался о том, сколько программистов не знают, что такое куча, более того, им это даже не нужно… А потом я понял, что все эти люди в равной степени зовутся программистами.

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

Термин «программист» покрывает колоссальный спектр способностей и умений. По вертикальной оси, программист может едва уметь писать на vbscript — или разрабатывать компиляторы для Intel или научный софт для авиакомпаний. По горизонтальной оси, он может быть экспертом в базах данных, улучшать производительность GPU, писать библиотеки параллельных вычислений, физические движки или драйвера для принтеров, заниматься обработкой изображений, генерацией 3D моделей или исследованиями в области искусственного интеллекта, использовать coffeescript, HTML5 и AJAX для разработки веб-приложений или nginx и PHP для разработки LAMP-стека, на котором веб-приложения работают… И это все — программисты.

Это безумие!

Наш мир поглощается программами. В будущем программирование будет базовым курсом, наряду с чтением, письмом и математикой. Говорить о ком-то «программист» будет бессмысленно, потому что 10% населения, а то и больше, будут программистами на том или ином уровне. У этого слова уже столько значений, что с равным успехом можно называть себя ученым вместо физика. Какие есть альтернативы? Лучшая попытка это исправить (Разница между разработчиком, программистом и ученым CS) дает всего три варианта и неспособна различить меня и выпускника колледжа со степенью в области искусственного интеллекта. Они занимаются многомерным математическим анализом и оценкой с использованием функциональных языков, на понимание которых мне придется потратить годы. Я пишу быстрый код на C++ и HLSL ассемблере и жонглирую матрицами сложных преобразований, чтобы рисовать на экране хорошенькие картинки. И то, и то — чертовски сложное занятие (по совершенно разным причинам), и ни один из нас не мог бы выполнять работу другого. Что для одного из нас — хорошая привычка, для другого — просто отвратительно. И оба мы — программисты.

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

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

Недостаточно спросить кого-то, программист ли он. «Программисты пишут программы» звучит почти как «ученые делают науку» — вот только ботаники не создают ядерные реакторы.
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 77

    +45
    Хорошее обобщение, но всё равно останется на долго ещё:
    — Вася, ты же программист — иди почини кофеварку.
      +2
      Предполагается, что программист обладает техническим складом ума, и с большей вероятностью может что-то починить, чем кто-то другой.
        +30
        Предполагается, что женщина веками эволюции подготовлена к готовке свежеубитого мамонта… ни какого шовинизма
          +2
          Мамонта может быть, а вот готовить «яичницу по холостяцки» это привилегия мужской половины.

          Рецепт: открыл холодильник, почесал яйца, закрыл холодильник. =)
            +7
            Настоящий холостяк прекрасно готовит, пельмени — стереотип, едят пельмени лишь лентяи и студенты, ито вторые тоже часто готовят.
              0
              Вообще-то я сам холостяк и сам прекрасно готовлю, но это всё ничуть не отменяет того что один из рецептов взятый кстати из анекдота, женщины обычно не готовят…

              Поражаюсь я людям, кто нибудь вообще читает на что отвечает?
                +2
                Потому что знание базовых алгоритмов обязательно для любого, кто считает себя программистом.
                  +2
                  А еще они не любят читать чужой код.
                  +2
                  Извините, разьясните мне пожалуйста какую смысловую нагрузку несет Ваш каментарий как ответ к предидущему, кроме намета на то что у женщин нет яиц и на то что у мужчин пустой холодильник?
                    0
                    Объясняю. Развиваю тему приспособленности видов к разному виду деятельности.

                    Ответе и вы, каким образом умение многих мужчин готовить, опровергает наличие у них яиц? (вы так активно пытались это оспорить, что я прям не знаю...)
                      0
                      Почитайте кменты на которые отвеали, потом почитайте в википедии что такое стереотипы, потом прочитайте каменты выше еще раз. Стереотипы они такие стереотипы. А мужчины да, только яйцами и могут трясти.
                        0
                        > А мужчины да, только яйцами и могут трясти.
                        замечательный пример стереотипа, который популярен среди некоторых категорий женщин) ничего личного
            +2
            Для технического склада ума уже есть множество: «физики». Программисты — подмножество физиков :)
            А что касается статьи, в ней очень простая и ясная мысль. И пусть эта мысль примирит почему-то вечно враждующие лагери.
            I hope some day you'll join us, and the world will be as one.
              0
              Да, судя по минусу это утопия
                +5
                Скорей инженеры, не? Я вот обладаю вполне техническим складом ума, хотя ни разу не физик.
              +2
              Вообще-то это совершенно нормально, что существуют огромные категории, которые в свою очередь делятся на небольшие группы. Менеджеры, вон, не жалуются, хотя у них разброс еще шире.

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

              Но если вам нужно провести операцию, то вы отлично различите хирургов от ветеринаров.
                +1
                Это тогда уже инженер. Человек, который, используя свои знания, может хорошо управляться с объектами физической вселенной. Поэтому микроволновку будет чинить вэб разработчик.
                  +3
                  -Кто-нибудь знает что-нибудь
                  о двигателях внутреннего сгорания?
                  -Конечно.
                  -Технология 19-го века.
                  -Примитив.
                  -Кто-нибудь знает, как починить
                  двигатель внутреннего сгорания?
                  — Нет.
                  — Нет.
                  — Без понятия.
                    +1
                    Зачем чинить этот примитив? Я прямо сейчас сделаю с нуля аналог с большим повторным использованием и эффективностью. Его можно будет поставить не только на вашу архаичную сенокосилку, но и на подпространственный антигравикоптер… Сейчас… Завтра… Ещё немного… Неделю где-то… Вот прототип, с вас 30% предоплаты, и фиг с ним что не косит, зато пытается уйти в подпространство! а у вас глаза в нашем пространсте, вы на логи посмотрите — ведь пытается… Ну 30% предоплаты не значит, что 30% работы сделано, это аванс…
                +5
                И сисадминов туда же — от умения настроить рисунок обложки карт в пасьянсе до администрирования чего-то действительно сложного (тут примеров просто столько, что не хочется обижать никого, выделяя). И все они называются «сисадмины».
                  +14
                  Просто ужас какой-то… От угрюмой бабки сидящей у подьезда с бигудями и до улыбчивой девушки с пружинистой походкой это все женщины! Как теперь найти себе спутницу жизни, если они все называются одинаково?
                  +5
                  В 1998 году, кажеться, случилось мне разрабатывать некий софт для некой компании с собственным «IT-отделом» в 2 штатные единицы. «Главного» представили мне так:
                  — А это — Миша. Наш программист. Программирует преимущественно в Ворде.
                  Т.е. парень просто набирал текст (да, кстати, не знал даже что такое макрос), но и по должности и в понимании начальства он тоже был программистом. На полном серьезе.
                  Сегодня, к счастью, есть уже народный термин «компьютерщик», а то и офисных «универсалов» когда-то тоже программистами называли.
                    +22
                    Мне кажется, что архитекторы, ботаники и программисты, все, могут заниматься различными вещами в своей предметной области. Профессор в области теории вероятности является таким же математиком, как и человек занимающийся функциональным анализом. Биолог, специалист в герпетологии такой же биолог как его коллега изучающий вирусы.

                    Программист который пишет на php такой же программист как и его коллега использующий С++. Ученый который занимается Сomputer Science и применяет свои знания на практике с помощью MatLab или Haskell то же программист.

                    Почему автору так сильно не нравится называть людей которые пишут программы программистами? Возможно ему обидно, что люди не знающие структур данных или алгоритмов сортировки могут называться программистами?
                    Мне кажется совершенно нормальным называть вещи своими именами. Когда тебя спросят: «кто ты», ты можешь спокойно отвечать — «программист». Если попросят уточнить, то можно уже придумывать всякие конкретные названия.
                      0
                      читал отличную статью о том, что вначале программисты был и физиками и математиками, но постепенно превратились в обычных инженеров, а скоро и пользователей, как когда то произошло с водителями.
                      Печально.
                        +8
                        Так а, что тут печального? Это же наоборот классно, это значит, что мы двигаемся в правильном направлении! Если взять аналогию с водителями, разве вам плохо от того, что вы можете водить машину не заканчивая при этом университет? А механики как были, так есть и будут.

                        А в будущем пользователи будут обладать навыками программирования, которые им помогут прежде всего упростить и автоматизировать свою работу. Я считаю это хорошо. А программисты никуда не денутся а все так же будут разрабатывать, чинить изучать и т.д.
                          +2
                          > А в будущем пользователи будут обладать навыками программирования…
                          Ой ли…
                          Личный опыт показывает, что даже для абсолютно минимального уровня программирования надо обладать логическим мышлением. Большинство людей его практически лишены. Имхо анаоргия с вождением несколько натаянута: зрение (можно откорректировать, кстати) и моторика у нас не настолько отличаються, насколько склад ума.
                            0
                            По-моему, в вождении самое сложное это не умение управлять движением автомобиля, вписываться в повороты и т. п., а умение взаимодействовать с остальным участниками движения, умение реагировать на постоянно изменяющуюся обстановку.

                            А логическое мышление есть у всех. ТАк или иначе сейчас многие занимаются хоть каким-нибудь да программированием на каком-нибудь DSL — например стиральную машинку запрограммировать на стирку :)
                              0
                              Наверное, вам не удалось увидеть много людей. Все не так плохо на самом деле. Просто неадекваты бросаются в глаза сильнее. :)
                            +1
                            Почему же печально? Наоборот хорошо, потому как ни один физик занимающийся преимущественно физикой никогда не сделает чего-то хотя бы отдалённо похожего на, например, Linux.
                              +4
                              Как раз с линуксом я бы не был так уверен — история знает случаи, когда врач-анестезиолог занимающийся преимущественно анестезией, раздасадованный тормозами линукса пишет планировщик, который работает лучше созданного гурями — ядерными программистами :)
                                0
                                У врача-анестезиолога нет заморочек физика-теоретика.
                              +1
                              Недавно таксист попался особенно говорливый, так он меня обвинял, что я в случае поломки авто поеду в сервис, а он, типа, сам под капот полезет =) Еле сдержался, чтобы не спросить, не смотрит ли он телевизор исключительно с паяльником в руках.
                                +2
                                Некорректное сравнение. Надо было спрашивать, а сможет ли он отрегулировать клапана на НОВОМ bmw mercedes benz audi etc. В принципе, даже если у него вдруг получится и оно потом еще вдруг поедет, то механик спец сервиса на него будет смотреть как админ на дуру из бухгалтерии.
                                И да я верю, что если айтишник ЗАХОЧЕТ, то и двигатель своего тазика переберет, только вот зачем, если можно взять пару халтур и потратив на них меньшее время заработать денег на ремонт?
                              0
                              если в теологии, то каббалисты скорее)
                              0
                              Современная наука и техника уже лет 300 идет по пути сужения специализации. В условиях, когда количество информации и разнообразие форм ее представления постоянно растет, от этого никуда не деться.
                              Встает вопрос координации смежных и не очень областей. Нужны некие философские взгляды и в нашей области.
                                0
                                Да в принципе всё давно есть — гуглите системную инженерию.
                                +21
                                > В будущем программирование будет базовым курсом, наряду с чтением, письмом и математикой.
                                кроме того, математика, (допустим) английский, физика, химия, физкультура, география и еще куча дисциплин также вхожи в список базовых предметов. но нас почему-то не заполонили математики и физики. пользователи, если и будут обладать навыками программирования, то только на уровне, достаточном для сдачи контрольной работы в университете. а то и на более низком.

                                а насчет сверхобобщения: если человек на вопрос о сфере деятельности отвечает «я спортсмен», то он одинаково может быть шахматистом, штангистом, гонщиком, профессионально играть в бильярд или быть асом в игре Го. но спортсмен — не сверхобобщение.

                                в любой сфере деятельности можно прийти к выводу, что профессия, которая занимается этой деятельностью — суперобобщение. у физиков — это могут быть какие-то элементарные частицы с одной стороны и какая-то гидро/аэродинамика с другой, у химиков — с одной стороны создание каких-то суперпластмасс, с другой — некие пищевые добавки или разработка батареек никель-металгидридно-кадмиево-водородно-стронциевых элементов питания. это не сверхобощение, а, как по мне, — минимально необходимая асбтракция. проблема, быть может, только в том, что некоторые люди считают уместным просить программистов отремонтировать чайник или подключить микроволновку.
                                  0
                                  немного путанно, извините :)
                                    0
                                    > в любой сфере деятельности можно прийти к выводу, что профессия, которая занимается этой деятельностью — суперобобщение.

                                    Так и есть. Хотя автору статьи кажется, что физик — это очень конкретная специальность, но на деле специализаций у физиков гораздо больше, чем у программистов. И точно так же представитель одной специализации не может сходу подменить представителя любой другой. Точно так же есть базовые знания, общие для всех специализаций. И точно так же при необходимости квалифицированный специалист может переквалифицироваться в другую специализацию за 1-2 года, если ему до пенсии ещё далеко ;-)
                                    В общем иерархия практически везде примерно такая: профессия — специальность — специализация.
                                      +1
                                      Насколько я понял, тезис статьи в том, что, учитывая эти специализации, надо помнить, что для другого программиста реальность может быть чуть ли не противоположна вашей — допустим, эмбедщик, пишущий прошивку для «таракана», который будет производиться сотнями миллионов экземпляров, имеет совсем другие взгляды на соотношение времени работы программиста и эффективности алгоритма, чем веб-разработчик, делающий сайт. Потому что любая дороговизна разработчика будет съедена парой центов разницы в стоимости чипа, а в случае веба чаще дешевле поставить ещё одну железку, да еще частенько временно.

                                      Или критерии надежности, у программиста пишущего какую-то мелкую игрушку для андроида сильно отличаются от критериев того, кто пишет финансовый софт. Для первого, в общем-то, вполне нормально, если у какой-то доли пользователей его приложение будет чудить, и он знает, что идеально сделать — под все версии андроида и все устройства — нельзя.
                                    +1
                                    С другой стороны, если ты способен мыслить алгоритмами или объектами, то ты можешь быть хорошим программистом, не зависимо от инструмента. Изучивший один язык программирования, может без особых усилий освоить другой, а специализация приходит с опытом.
                                      +1
                                      Как раз нет. Будешь хорошим программистом в вакууме. Не обязательно даже менять язык. Просто перейти из одной области применения в другую. Сразу потребуется изменить свое мышление, подход к написанию кода. То, что раньше было можно, сейчас уже нельзя и наоборот. То, что раньше было легко, сейчас сложно и наоборот. Похожие чувства я испытал, когда начал копать в сторону XNA, имея при этом опыт с WinForms, WPF и прочим.
                                        +1
                                        При этом то, что стало сложным, видишь сразу, а чтобы понять, как пользоваться новыми возможностями, нужно рвботать и работать…
                                          0
                                          Ну то, что вы говорите, это уже относится к специализации, о которой я писал, что приходит с опытом.
                                            +1
                                            Это всего касается… или Вы действительно считаете, что человек годами программировавший на C#, без особых усилий возьмёт и за пару месяцев перейдёт на Erlang или на Haskell или на Prolog или на C? Далеко не все языки программирования базируются на ОО-парадигме. Поэтому способность мыслить объектами легко может стать непробиваемым барьером для программирования на многих языках, если человек не сможет эту способность при необходимости полностью отключать.
                                              –1
                                              С С# на C — почему бы и нет. Только не забыть, что после malloc надо вызывать free, а функциям передавать this в качестве отдельного аргумента. Ну, и, в задачах, в которых нужен C (это в наше время в основном микроконтроллеры?) вряд ли так уж необходимо наследование с полным спектром использования виртуальных методов. В случае чего, можно и проимитировать с помощью указателей на функции.
                                              Насчет Haskell — сейчас пытаюсь его понять, но совершенно нет времени и свободной головы. Думаю, что если бы было надо, переключился бы без проблем (хотя и оказался бы там на довольно низком уровне).
                                                +2
                                                «Без проблем переключиться» — это значит придти на другое место работы и сразу работать наравне с теми, кто там работает. В данных примерах так не получится, придётся проходить практически полную переквалификацию, а потом ещё заново проходить всю иерархию, начиная с джуниора, если не со стажера.
                                                Итого переход с должности ведущего программиста на .NET на ведущего программиста на C займёт года 3 в лучшем случае, а в худшем человек вообще не сможет программировать на новом языке на столь же высоком уровне, какой у него был на привычном языке… Кстати, всё то же самое верно и при попытке перехода в другую сторону с C на C#.

                                                > Только не забыть, что после malloc надо вызывать free, а функциям передавать this в качестве отдельного аргумента.

                                                Ну конечно, это ж единственные отличия… А libc и .NET — просто близнецы-братья :-)
                                                  0
                                                  Ну, это если там будет libc. А то дадут h-файл с адресами портов и флагами — и радуйся.

                                                  А то, что Вы написали, верно не только при смене языка, но и при смене платформы, и вообще при смене предметной области. На то, чтобы освоить новые парадигмы, в любом случае уйдет немало времени, а переход C# на Lisp будет не больнее, чем переход с русского языка на китайский.
                                                    0
                                                    Так я не спорю, подобная ситуация наблюдается практически во всех профессиях, не только у программистов.
                                                      +1
                                                      Интересно было бы прочувствовать переход с Lisp на ассемблер. Должно быть что-то совершенно невероятное.
                                          +2
                                          Язык — можно освоить. Только не стоит забывать, что сегодня язык просто неотделим от фреймворка и кучи смежных библиотек. Голый синтаксис (язык) — никому не нужен. А изучить всю платформу — это иногда и несколько лет уйти может.
                                            –1
                                            Легко можно освоить и ЯП, и фреймворки с библиотеками (сужу на примере рейс и джемов, джанго и питона, асп нет мвс и си шарпа), но вот освоить развертывание среды их выполнения для продакшена куда сложнее, чем для лампа…
                                              +2
                                              Прочитать книжечку по ASP.NET MVC != освоить .net. Освоить платформу — значит писать со знанием ее особенностпей, плюсов и минусов. А не просо писать, например «как под Django только теперь на C# под aspnet mvc».
                                                0
                                                Писать без знания особенностей наверное не получится.
                                                  0
                                                  Поверьте, получится. И вы не поверите, как много людей пишут, без знания не то что особенностей, но даже иногда и базы.
                                                +1
                                                А почему все примеры для веб-разработки? Все ООП, да ещё и все на одних и тех же базовых паттернах. Так не интересно, по сути тут нет никакого перехода, всё в рамках одной специализации. Практического толку мало, но при этом есть серьёзная опасность начать в одном фреймворке искать что-то из другого, что грозит попаданием в патовую ситуацию «а мне всегда чего-то не хватает...» ;-)
                                                  0
                                                  Это то, что я осваивал лично :) Пытался ещё освоить Erlang+Nitrogen и Scala+SimplyLift, но дальше хелловорлдов дело не пошло.
                                                +1
                                                Тут ещё надо помнить, что освоить язык — это не то же самое что освоить синтаксис. Язык можно считать освоенным только когда вы можете на нём думать. В случае с языками одной парадигмы это не особо сложно, но если меняется парадигма, то это уже смена специальности, а не специализации.
                                                  +1
                                                  Опять же не вижу противоречий с моим утверждением, что программиста делает умение мыслить алгоритмами \ объектами, а специализация (изучение конкретной платформы) вопрос опыта (времени).
                                                    +1
                                                    Вы написали «без особых усилий». Но для полноценнгого «освоить» нужно несколько лет изучения. А теперь впишите это «осовоить» в 8и часовой рабочий день и получите, что очень даже не просто сменить специализацию, если вы конечно не о junior разработчиках.
                                              • UFO just landed and posted this here
                                                  –3
                                                  Все высказывают какие-то длинные умные мысли… А я просто скажу, что согласен на все 100%, только вряд ли что-то изменится в ближайшем будущем:)
                                                    0
                                                    Программист это как медик, может быть медбратом, а может нейрохирургом. Только разница между медиками народу кое-как понятна, а виды программистов находятся абсолютно за гранью. Еще хуже слово «компьютерщик». Добрая половина населения определяют им всех людей, которые делают что-то с вычислительной техникой, что им не понятно. При этом, совершенно не важно, эникейщик это, программист или системный архитектор.
                                                      0
                                                      Хуже, что эту разницу (а особенно — что она за собой влечёт) не опнимают и многие программисты. А потом начинаются удивления «как, ты пишешь на коболе/фортране/перле/хаскеле/подставить нужное» или «как, ты не заботишься об эффективности/заменяешь i++ на ++i»
                                                      0
                                                      Со всем согласен, кроме:

                                                      >>Говорить о ком-то «программист» будет бессмысленно, потому что 10% населения, а то и больше, будут программистами на том или ином уровне.

                                                        0
                                                        Да оно и сейчас недалеко ушло, если подумать. Вменяемый проектировщик спокойно ипшет макросы для автокада, вменяемый менеджер — может наваять макрос для excel (который сам по себе — та еще система функционального программирования), и так далее.
                                                          0
                                                          ну если с такой стороны посмотреть, может и верно, да.
                                                        0
                                                        Лучше бы Вы про make_heap рассказали. Впервые о ней услышал сегодня. Она выглядит так, как будто достаточно один раз увидеть код, который корректно с ней работает, чтобы разобраться раз и на всегда.
                                                          0
                                                          «Коля, ты же программист! Почему ты не умеешь программировать формулы в Word ?»

                                                            0
                                                            Фраза, которую я услышал неделю назад на работе. Даже как — то неловко себя почувствовал в этот момент.
                                                              0
                                                              А мне недавно про формуле в Ворде сказали, что «это просто, давай, я тебя научу» :D
                                                            0
                                                            >> «Программист» — это сверхобобщение.

                                                            То то я всегда считал, что я тыкокноппрограмописатель.
                                                              –1
                                                              Автор статьи — еще один асоциальный задрот-математик, которому то, что код на РНР/Pascal/HTML может приносить бизнесу такие же деньги, как код на Lisp/Haskell/C++ — мешает самовыражаться.
                                                              • UFO just landed and posted this here
                                                                  0
                                                                  > Так что, как ни крути, а начинающий писатель на vbscript и писатель программы рассчёта траектории полёта космического аппарата, оба они программисты.

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

                                                                Only users with full accounts can post comments. Log in, please.