Ответы пользователя по тегу Программирование
  • CTF. Как и где подгоьовиться?

    barmaley_exe
    @barmaley_exe
    Я уже отошёл от этих дел, поэтому мой ответ неполон и не совсем актуален, но все же.

    У нас было так: есть студенческий семинар, где члены команды рассказывают о всяких infosec штучках вроде криптографии, web безопасности, реверсинга и т.п. Так же команда регулярно участвует во всяких соревнованиях после которых (не сразу, а через пару дней) проводится разбор, где рассказывается, как решалось то или иное задание. Полезно почитать write-up'ы (зачастую ссылки на них можно найти на ctftime).

    А ещё есть Летняя школа «Развитие CTF в России», но я там ни разу не был, поэтому ничего сказать не могу.
    Ответ написан
    Комментировать
  • Какую выбрать тему для НПК, где используются нейронные сети?

    barmaley_exe
    @barmaley_exe
    Что вы понимаете под "обучающуюся играть в шахматы"? С нуля, не зная правил, имея лишь доску перед собой, как в эксперименте с играми Atari? Это вряд ли.

    А вот оценивать позиции с помощью нейросетей можно.
    Ответ написан
    Комментировать
  • Существует ли язык программирования для юристов?

    barmaley_exe
    @barmaley_exe
    Я думаю. что проблема тут в необъятности предметной базы. То есть, юристы оперируют большим количеством высокоуровневых (т.е. у каждого человека есть какое-то представление о том, что данное слово значит в контексте, но строго определения нет) понятий естественного языка ("лицо", "действие", "предумышленно", etc), порой весьма причудно взаимодействующих, что затрудняет строгую формализацию.

    С другой стороны, было бы очень интересно посмотреть на попытки приблизиться к решению этой проблемы. Законы, действующие в соответствие с формальной логикой, – это же круто!
    Ответ написан
    2 комментария
  • Что такое олимпиадное программирование?

    barmaley_exe
    @barmaley_exe
    Олимпиадное и спортивное программирование действительно два имени одной сущности.

    Обычное (промышленное) программирование нацелено на решение бизнес задач с использованием компьютеров. Такие задачи, как правило, характеризуются следующим:

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


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

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

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

      Например, однобуквенные переменные пишутся гораздо быстрее длинных и осмысленных, однако их предназначение понятно лишь самому автору и лишь в течение крайне небольшого срока после написания программы.
    • поскольку программа невелика, нет необходимости в разбиении её между несколькими программистами
    Ответ написан
    Комментировать
  • Что должен знать профессиональный программист без учета особенностей конкретных языков программирования?

    barmaley_exe
    @barmaley_exe
    Сильно зависит от области работы. Во многих областях будут полезны ещё и эти навыки:

    7. Сети
    8. Параллельное программирование
    9. Устройство операционных систем
    Ответ написан
    Комментировать
  • Какие ЯП не требуют кучу прикладнухи для устройства на работу?

    barmaley_exe
    @barmaley_exe
    Никакие.

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

    Вообще, в области server / desktop / mobile очень сложно уйти далеко без, как минимум, следующего:
    • Объектно-ориентированное программирование и проектирование — ведь код не должен быть говном
    • Параллельное программирование — ведь делать нужно много и быстро, а у нас уже 10 лет как многоядерные машины есть
    • Сети — ведь нельзя жить без интернета
    • Базы данных — ведь данные надо где-то хранить, и хранить надёжно


    hardware не комментирую, но там ещё хардкорнее.

    Собственно, для программиста не столько важно знать какой-либо конкретный ЯП, а важно владеть технологиями разработки. ЯП, конечно, входит в это множество, но им оно совсем не ограничивается.
    Ответ написан
    3 комментария
  • Каков необходимый минимум знаний для junior'а/стажера (с++) и где найти работу студенту?

    barmaley_exe
    @barmaley_exe
    EMC интересуется программистами с мат-меха. И позиции C++ стажёров у них бывают.

    Знать надо алгоритмы
    • Структуры данных: сбалансированные (и не только) деревья, хеш-таблицы, очереди с приоритетами и без, списки. Знать, конечно, не в теории, а уметь работать с ними
    • Графы: как минимум обходы в ширину и глубину. А так — поиск путей, минимальные остовные деревья,
    • Сортировки: quicksort, heapsort, mergesort, а так же какие-нибудь линейные вроде сортировки подсчётом и цифровой сортировки
    • Чем больше — тем лучше


    Для всех алгоритмов нужно знать и уметь обосновать их сложность (как по времени, так и по памяти) в терминах O-большого.

    C++, разумеется, предполагается знать прилично:
    • владение стандартной библиотекой (не будете же Вы raw pointer'ы в продуктовом коде использовать)
    • ООП
    • шаблонами
    • идиомами (RAII, pimpl, etc) в довесок к паттернам проектирования
    • Плюсом будет опыт работы с boost'ом.

    Помимо этого надо иметь представление о сетях и многопоточном программировании, а ещё уметь организовать процесс разработки, т.е. пользоваться системой контроля версий (SVN, GIT, Mercurial), инструментами для сборки (make / cmake / etc), отладчиками (gdb, lldb, например) и другими полезными тулами (valgrind, gprof, gconv, например), но это уже менее критично. Вообще, знакомство с Linux'ом и экосистемой разработки в нём будет плюсом.

    Ну и раньше третьего курса, как уже сказали, работать не рекомендуется.

    А ещё можно податься в Яндекс, Oracle (у них не только Java, но бывает и C++, не знаю, есть ли соответствующие позиции для студентов) и Intel (насколько я знаю, на текущий момент в Питере позиций нет, только в Нижнем и Москве). Гугл, как известно, из России уехал, а JetBrains, кажется, в C++ разработчиках не нуждается.
    Есть ещё куча других компаний поменьше, но их Вы найдёте сами.

    Ну и почитайте другие материалы на эту тему: [1], [2]

    P.S. Оценки в зачётке никого не волнуют. Если Вы только не собираетесь поступать в Computer Science Center, например. Или магистратуру СПбАУ.
    Ответ написан
    3 комментария
  • Оптимальный выбор ВУЗа в сфере IT?

    barmaley_exe
    @barmaley_exe
    Если хотите заниматься Машинным Обучением, то без ШАДа никуда. Есть, правда, ещё кафедра Математических Методов Прогнозирования на ВМК МГУ, некоторые преподаватели которой преподают, в том числе, и в ШАДе. Но в ШАДе интересного гораздо больше!

    Мой совет таков: идите в МГУ / ФизТех / Вышку, усердно учите математику первые 2-3 года (матан, дискретка (в т.ч. алгоритмы, много алгоритмов), алгебра (кажется, сверх линейной её части ничего не нужно), теорвер и матстат, методы оптимизации, функциональный анализ, численные методы и дифуры (довольно бесполезная в ML вещь, как мне кажется) ), а потом в ШАД. Там уже будут предметы вроде машинного обучения (много всякого), компьютерного зрения, алгоритмов работы с большими данными и другие, не менее интересные.
    Ответ написан
    Комментировать
  • Как вывести содержимое списка в виде одной строки?

    barmaley_exe
    @barmaley_exe
    print "".join(chart), если в chart уже строки. Иначе print "".join(map(str, chart))
    Ответ написан
    2 комментария
  • Какие языки помогут лучше всего понять указатели и рекурсии?

    barmaley_exe
    @barmaley_exe
    Для рекурсии советую какой-нибудь чистый функциональный язык. Циклов там нет вообще, так что разберётесь, как мыслить "рекурсивно".
    Ответ написан
  • На каком уровне нужно уже уметь программировать, поступая на "программную инженерию" в ВУЗе?

    barmaley_exe
    @barmaley_exe
    Чем больше алгоритмов — тем лучше. Возьмите какую-нибудь книжку вроде Алгоритмы. Дасгупта, Пападимитриу, Вазирани, Структуры данных и алгоритмы. Ахо, Хопкрофт, Ульман ну или Алгоритмы: построение и анализ. Кормен, Лейзерстон....

    Но книжки читать не так полезно, как применять это на практике. Решайте задачи на acmp.ru, timus, spoj, посмотрите на соревнования на codeforces.ru.

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

    barmaley_exe
    @barmaley_exe
    Как справедливо заметили выше, Python и Ruby существуют уже 20+ лет, так что популярность они набрали уже давно.

    Go, Dart, Rust, D, etc интересны для изучения в целях расширения кругозора, но "в продакшен" не годятся: за 5 лет обширным сообществом не обзаведёшься, а, значит, ни выбора в плане библиотек, ни профессиональных кадров. Конечно, могут существовать отдельные проекты, исповедующие эти языки, но таких меньшинство.

    В последнее время многие прыгают вокруг JavaScript'а: сначала его перенесли на сервер (на самом деле, это сделали задолго до Node.JS, но не взлетело), а потом стали использовать чуть ли всюду (в win8, например, или PhoneGap). Но JS'у повезло иметь довольно больше коммьюнити на момент разгара этого хайпа, потому и понеслось.

    Выберите что-то из Python, Ruby, JS и разберитесь в этом (не столько в самом языке, сколько в его экосистеме, т.е. библиотеках, фреймворках и паттернах). Будет нужно — разберётесь в другом языке с его экосистемой. Идеи везде одни и те же, отличается только синтаксический сахар.
    Ответ написан
    Комментировать
  • Где сейчас в IT применяется теория вероятности?

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

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

    Ещё существует множество рандомизирвованных алгоритмов. Например, в quicksort'е выбирать опорный элемент можно случайно. Тогда вероятность того, что глубина рекурсии будет порядка O(n) (а, следственно, и сложность сортировки O(n²)) будет мала.
    Ответ написан
    Комментировать
  • Что изучать веб-программисту самоучке, кроме самого языка?

    barmaley_exe
    @barmaley_exe
    Онлайн-курсы чем не угодили? Там и теория, и практика и с кровати вставать не надо.

    Если говорить предметно, то:
    1. Алгоритмы. Must have для программиста. Тут можно посоветовать известную книгу Кормена и Ко «Алгоритмы: Построение и анализ». Практиковаться можно на известных архивах вроде тимуса или площадках вроде codeforces.
    2. Дискретная математика. Тоже важная область. Сюда можно приписать теорию графов, логику, комбинаторику, основы теории вероятностей. Сильно пересекается с предыдущим пунктом.

    3. Что касается матана и теории чисел: особо углубляться без нужды не советую. Из матана хватит дифференциально-интегрального исчисления (с базой в виде пределов, конечно же). Обязательно линейную алгебру: матрицы, вектора, определители. Это следует изучать вместе с аналитической геометрией. Каких-то книг я, к сожалению, порекомендовать не могу.
    Есть ещё вычислительная математика (как решать задачи матанализа, дифуров, алгебры на компьютере), но, мне кажется, чем ближе компьютеры становятся к обычному человек, чем глубже проникают в нашу жизнь, тем менее важной становится эта область.

    Ну и что-нибудь про проектирование, ООП и паттерны. По паттернам библией считается книга банды четырёх, по ООП вроде прилична книга Гради Буча «Объектно-ориентированный анализ и проектирование». Но я не читал её.
    Ответ написан
    6 комментариев
  • Что не так с реализацией алгоритма Хаффмана?

    barmaley_exe
    @barmaley_exe
    Для последнего байта нужно знать количество значащих бит. Ведь разные символы, сжатые по Хаффману, имеют различную битовую длину, а писать можно только байты.
    Может быть, этот случай Вами уже учтён, но при поверхностном взгляде я этого не увидел.
    Ответ написан
    Комментировать
  • Какие есть web-проекты для обучения детей программированию/логики?

    barmaley_exe
    @barmaley_exe
    Англоязычные — это KhanAcademy (они недавно начали продвигаться в сторону Computer Science) и CodeAcademy (а тут, вроде как, даже немного русского есть).
    Ответ написан
    Комментировать
  • Курсы программирования в Краснодаре

    barmaley_exe
    @barmaley_exe
    А зачем Вам в эпоху интернетов курсы в городе %city_name%?

    См. www.codecademy.com/ и прочие.
    Ответ написан
    1 комментарий