Раньше занимался теоретической физикой
С 2009 г. разрабатываю ПО
Языки, на которых писал существенные объемы production code, в порядке уровня владения:
Mathematica, Java, C, Python, javascript
Языки, с которыми знаком (писал код): Matlab, R, Fortran, Maple
Энтузиаст среды Wolfram Mathematica
Разработчик модуля RLink для связи среды Mathematica с языком R, входящего в состав среды Mathematica с версии 9.0
Автор ставшего популярным бесплатного учебника по программированию в Wolfram Mathematica (на англ. языке)
Активно работаю на форумах по Wolfram Mathematica (сейчас Mathematica at Stack Exchange, ранее StackOverflow и MathGroup google group)
Интересы: функциональное и символьное программирование, мета-программирование, веб - разработка, языки программирования, компиляторы, средства разработки.
Контакты

Достижения

Все достижения (2)

Наибольший вклад в теги

Все теги (8)

Лучшие ответы пользователя

Все ответы (5)
  • Помощь в изучении Python. Что дальше?

    @LeonidShifrin
    Разработчик, Wolfram Research Inc. PhD, Physics
    Учиться по книгам можно бесконечно. Судя по Вашим словам, Вы вполне подготовлены, чтобы начать работу над несложным проектом / задачей.

    Изучите какой-нибудь web framework на Python (Django, Flask, ... - лично я предпочитаю Django, но он довольно тяжелый как framework, хотя освоить его на начальном уровне нетрудно), и поднимите на нем простое web-приложение для личного использование (ну скажем, календарь, или планировщик задач, или учет личных финансов). Развивать можно бесконечно, и в процессе сможете самые разные задачи порешать. Чтобы не возиться с сервером дома, очень рекомендую сервис

    https://www.pythonanywhere.com/

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

    Ну и еще несколько советов:

    1. Ползуйтесь хорошим IDE (я использую PyCharm Pro, но в принципе и бесплатный PyCharm community edition прекрасно подойдет). Там можно настроить Python консоль, так что интерактивность не пострадает.
    2. Если возьметесь за что-либо, что можно назвать проектом, пользуйтесь системой контроля версий. Это не так страшно как кажется. Я бы советовал Git. Можно из командной строки (для изучения предпочтительна, лично я предпочитаю и для работы), либо UI клиент (я пользуюсь SourceTree). Изучить Git на начальном этапе можно за полдня. Вот хорошая книжка:

    https://git-scm.com/book/en/v2

    достаточно первые пару глав прочесть для начала

    3. Храните код в каком-нибудь распределенном репозитории (Github, Bitbucket). Если готовы его открыть для всех, то я бы советовал Github, если нет - BitBucket позволяет создавать бесплатно закрытые репозитории.

    4. При разработке в Python, пользуйтесь virtualenv. Это нужно для того, чтобы не замусоривать ваш основной дистрибутив Python установленными сторонними модулями и библиотеками.

    5. Это вопрос личного вкуса и удобства, но лично мне в работе сильно помогают системы project management. Я пользуюсь Blossom.io, но он платный. Из бесплатных, могу порекомендовать Trello.

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

    Собственно по Python, очень рекомендую вот это:

    docs.python-guide.org/en/latest

    куча реально полезной информации. По всем конкретным вопросам нет ничего лучше StackOverflow.

    Ну и уже когда практического опыта на реальном проекте поднаберетесь, вот тогда делайте upgrade, читайте еще книжки, код других проектов, участвуйте в других open source проектах, и т.д. В итоге гораздо быстрее все освоите, чем если прямолинейным чтением книг / прохождением курсов будете заниматься.
    Ответ написан
    4 комментария
  • Как лучше получить базовые знания по программированию?

    @LeonidShifrin
    Разработчик, Wolfram Research Inc. PhD, Physics
    Изучите один из функциональных языков. Проще всего начать со Scheme. Это поставит Вам мышление правильно, и даст общее понимание принципов программирования. Вам уже советовали SICP, я еще от себя добавлю HTDP (How to design programs) - как раз рассчитана на начинающих. Порешайте на нем алгоритмические задачи. Хороший источник - Project Euler. По более общим задачам посмотрите Rosetta Code. Не ставьте задачу сразу начать применять это к Вашим приложениям, просто спокойно развивайтесь.
    На первом этапе постарайтесь по минимуму использовать готовые библиотеки - разве что для проверки.

    Постепенно переходите к более сложным задачам. Не зацикливайтесь на чисто алгоритмических задачах - они хорошо ставят мышление, но в реальной жизни лишь часть кода полностью алгоритмизуется, и дизайн кода занимает большее место чем именно алгоритмы (если не брать более специализированные области вроде ML). Если не брать математические задачи, то хорошие задачи возникают в областях работы с текстами, преобразования данных. Скажем, упрощенный вариант HTML или XML парсера, или задачи по анализу текстов, или например перевод данных из одного формата в другой. Напишите пару простых интерпретаторов. Реализуйте парсер для какого-нибудь языка (возможно, его упрощенного варианта). Не стесняйтесь находить ресурсы с тем, что близко в Вашим задачам, и читать чужой код (это необходимо!) - но и не работайте по принципу copy - paste.

    Неплохой задачей будет например реализовать парсер и интерпретатор для какого-нибудь trading - языка, вроде metastock, с парой десятков основных финансовых индикаторов. И к нему в довесок - собственный упрощенный парсер скажем CSV формата - так что Вы сможете загружать данные по стокам и прогонять торговые стратегии целиком на собственном коде. Ну и например, генератор HTML - отчета с графиком и точками входа и выхода для данной стратегии, плюс отчетом о доходности. Можете потом поднять простое web-приложение, которое будет гонять торговые стратегии на исторических данных, хранящихся скажем как CSV файлы - и все это на Scheme. Потом можете перейти на использование реальной БД. Это уже будет в совокупности неплохой проект. Чем меньше будете использовать готовых библиотек - тем лучше, цель здесь - учеба, а не максимальная эффективность.

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

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

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

    @LeonidShifrin
    Разработчик, Wolfram Research Inc. PhD, Physics
    Disclaimer: у меня нет опыта командной работы именно в Python / Django. Но есть опыт одиночной работы в этом стеке, и опыт командной работы в других технологиях (J2EE).

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


    я бы попробовал. Для сколько-нибудь сложного проекта, Django в долговременной перспективе даст большие преимущества. Вашей компании в итоге проект весьма вероятно обойдется дешевле по ряду причин:

    • Легче найти компетентных разработчиков - пусть их меньше в Python, но средний уровень у них будет выше, чем в Php. Весьма вероятно также, что потребуется меньше разработчиков в команду.
    • Код гораздо лучше масштабируется, за счет средств как Python, так и Django
    • При правильной работе и развитии проекта, меньше шансов что он превратится в неподдерживаемую кашу. С кодом легче будет работать, отлаживать, добавлять новый функционал
    • Весьма вероятно, что багов и прочих косяков будет существенно меньше


    Вы тоже получите немало - сможете в рабочие часы вырасти как разработчик, и освоить современный язык / фреймворк / стек.

    Бояться разных проблем и граблей я бы не стал. Сейчас на Stack Overflow можно найти ответ практически на любой вопрос или возникшую проблему. Опыт быстро наберете в процессе, если работать на совесть. Есть прекрасные книги, где обсуждаются лучшие практики, тонкие места, и др. По личному опыту могу сказать - когда "наберете скорость", даже в одиночку можно работать в Python / Django очень быстро. У меня, правда, был уже большой опыт в других языках (в том числе функциональных), это сильно помогало с архитектурой. Я не сомневаюсь, что в Python при желании можно писать такой же код, как и в Php. Поэтому одним из самых больших препятствий может стать необходимость менять стиль мышления и отказываться от шаблонов, привычных по Php.

    Именно поэтому, в частности, требуется достаточное время, по крайней мере для начальной фазы проекта. Если у начальства есть понимание, что переход на новую технологию сопряжен с дополнительными затратами времени, и вначале могут быть сбои и ошибки, то я бы особо не раздумывал. Если же проект должен быть сделан в кратчайшие сроки и сразу начисто (т.е. у него не будет фазы "бета" или прототипа), то тогда да, нужно подумать. В общем, все сводится к тому, будет ли проект достаточно сложным по функционалу, настроено ли начальство на стратегию или на тактику, и настроены ли Вы и Ваша команда на весьма серьезные усилия, или нет.
    Ответ написан
    8 комментариев
  • Какую среду выбрать Matlab vs Mathematica vs Maple vs python?

    @LeonidShifrin
    Разработчик, Wolfram Research Inc. PhD, Physics
    Я бы посоветовал походить по профессиональным форумам и посмотреть, как решаются различные задачи разными средствами. Посмотрите, что Вам ближе.

    С моей сугубо пристрастной точки зрения (я работаю разработчиком в WRI), Mathematica даст фору большинству других средств, для широкого класса математических задач. Я это говорю и как программист и как человек, занимавшийся в прошлом наукой (Phd, теор. физика, квантовая теория поля).

    Заходите к нам на форум:

    mathematica.stackexchange.com

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

    И не слушайте тех, кто говорит про "упоротый язык" - это поверхностная и невежественная точка зрения. Вот что сказал по поводу Mathematica создатель языка Clojure (один из самых современных и элегантных языков программирования ) Rich Hickey: "Every developer should buy a copy of Mathematica, because it will expand their mind".
    Ответ написан
    1 комментарий
  • Какую хорошую книгу по Си для новичка почитать?

    @LeonidShifrin
    Разработчик, Wolfram Research Inc. PhD, Physics
    Когда я в свое время учил С, то перебрал массу книг. На мой взгляд, две самые лучшие книги по С для начинающего, это:

    C Programming - a modern approach (K.N.King)
    Pointers on C (Kenneth Reek)

    Вторая потруднее, но после первой читается легко. Если книга Кинга покажется тяжелой, есть также неплохая полегче:

    Teach Yourself C in 21 Days (Bradley Jones, Peter Aitken)

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

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

    Дейтелов брать бы не стал - они портят почти любой язык, о котором пишут (хотя формально у них все правильно). Про то, как они изуродовали обучение по Python, есть очень емкий отзыв Питера Норвига, программиста высочайшего класса и директора Google по R & D. Но это из общих соображений, с их творением по С лично не знаком, так что могу быть не прав.

    Да, и бегите от книг Шилдта по С как от чумы (если интересно, почитайте вот это или то, что пишут о его книгах профессионалы на comp.lang.c или accu reviews).
    Ответ написан
    Комментировать