sonyps4.ru

Конспект лекций программирование. Гарвардские лекции по основам программирования CS50 — теперь на русском

22 июня 2016 в 10:42

Гарвардский курс по основам программирования CS50 теперь на русском

  • Блог компании JavaRush ,
  • Учебный процесс в IT

Предыстория: кто мы и как дошли до жизни такой

Мы - команда проекта JavaRush . А JavaRush, кто еще не в курсе, - это полностью автоматизированный обучающий онлайн-курс по Java. Когда-то давно, именно благодаря и , JavaRush и появился. В то время мы собирались переучить на программистов миллион человек.

Очень амбициозно, не так ли? Но, как говорится, «проект, который можно сделать за две недели, мы делали три месяца. Потому что ничего нельзя сделать за две недели».

В нашу миссию - переучить на Java-программистов миллион - мы по-прежнему верим, но также решили поставить себе тактическую цель поскромнее: сделать офигенный онлайн-курс по Java. Считаю, нам это удалось. Мы продолжаем успешно пилить и допиливать наш JavaRush, обросли успешными «выпускниками»… Но сейчас немного о другом.

К сути

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

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

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

Курс настолько крут, что Йельский университет отказался от собственного введения в программирование в пользу CS50. Более того, уже несколько лет CS50 могут проходить не только студенты Гарварда, но и все желающие, на сайте edX , причем, абсолютно бесплатно. Единственное «но»: курс на английском…

Короче говоря, CS50 нас настолько впечатлил, что мы решили перевести его на русский, хотя там нет ни слова о Java. Мы нашли классных ребят - студию переводов Vert Dider - и совместно принялись за адаптацию лекций.

А теперь подробнее о CS50

На кого рассчитан

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

CS50 подойдет любому человеку, кто решил стать «айтишником». Пожалуй, его можно рекомендовать и способным 12-летним, и умудренным опытом «перебежчикам» из других профессий. Идеально - старшеклассникам и студентам.

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

Кто ведет

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

Что изучают на CS50

  • Основы компьютерных наук и программирования. Системы счисления, работа с командной строкой в Linux, циклы, условные переходы и прочие радости.
  • Концепции алгоритмов и алгоритмичности мышления. Вы узнаете о том, какие задачи можно решать с помощью программирования и каким образом. О бинарном поиске, простом по сути, но очень эффективном и требующем тщательности в реализации, Дэвид Малан расскажет сходу, прямо на нулевой лекции. И попробуйте потом забыть сцену с разрывом телефонного справочника, а вместе с ней - и полученные знания! Вообще, курс охватывает все основные алгоритмы, которые нужно знать и понимать «айтишникам».
  • Концепции абстракции, структуры данных, инкапсуляции, управления памятью. Основы компьютерной безопасности. Процесс разработки ПО и веб-разработка.
  • Основы языка программирования C и визуального языка Scratch. Собственно, все основные примеры и задания студенты делают на языке C.
  • Основы баз данных и SQL.
  • Веб-разработка: основы CSS, HTML, JavaScript и PHP. Естественно, только самые азы.
  • Основы подготовки презентации проектов по программированию.
  • Курс CS50 появился в Гарварде в 80е годы прошлого столетия.
  • В 2014 году Йельский университет решил отказаться от собственного курса по основам компьютерных наук в пользу CS50. В осеннем семестре 2015 года Дэвид Малан на каждой неделе проводил одну лекцию в аудитории Гарварда, вторую - в аудитории Йельского университета.
  • Да, CS50 сразу же стал самым популярным курсом Йеля: в осеннем семестре 2015 года на него записалось 510 студентов, больше, чем на любой другой курс любой специальности.
  • В Гарварде в 2012 году CS50 был вторым по популярности с 691 зарегистрированным студентом, однако в этом же году курс стартовал на образовательной платформе edX, что расширило его аудиторию еще на 53 000 слушателей со всего мира.
  • Осенью 2014 года CS50 выбился в лидеры в родном Гарварде с 818 записавшимися студентами. Это 12% всех учащихся колледжа.
  • Однажды лекцию CS50 вёл экс-CEO Microsoft Стив Балмер . В своем неповторимом и запоминающемся стиле;).
  • В 2005 году Марк Цукерберг вел одну из лекций CS50 в качестве приглашенного гостя. Его пришло послушать… 15 человек.
  • Курс выбирают не только профильные студенты, но и те, кто хотят расширить кругозор, узнать что-то о компьютерах. Порой это кардинально меняет жизнь этих «непрофильных» студентов. Например, выпускница факультета истории и литературы Сьюзен Войчицки (Susan Wojcicki) прослушала CS50 на последнем курсе. А затем переехала в Кремниевую Долину. Сегодня она - исполнительный директор YouTube.

Где найти переведенные лекции

Страница, на которой будут размещены лекции курса на русском языке: javarush.ru/cs50.html . Они будут доступны совершенно бесплатно всем пользователям интернета. Перевод первой лекции 20 июня уже был опубликован на ресурсе. Следующую лекцию ждите 27 июня, и далее они будут появляться по мере их готовности.

Следите за обновлениями на страничках JavaRush в социальных сетях.

Введение.

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

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

Классификация языков программирования:

    Неструктурный (преобразование машинных кодов на языке Assembler);

    Модульные (задачи→подзадачи →алгоритмы→функции);

    Логический подход;

    Объектно-ориентированный подход;

    Функциональный подход;

    Смешанный подход;

    Компонентно-ориентированный подход;

Транслятор – программа для перевода программы понятных человеку символов в программу машинных кодов.

Понятие формального алгоритма.

Формальный алгоритм – заранее заданная последовательность чётко определённых правил или команд для получения решения задач за конечное число шагов.

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

Эффективность алгоритма – алгоритм или функция эффективно вычислима, если существует алгоритм правильно её вычисляющий и удовлетворяющий следующим требованиям:

    Состоит из конечного множества простых команд, для которых однозначно определён порядок исполнения;

    Вычисления должны закончиться и дать результат в конечное число шагов;

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

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

20-е года ХХв. – машина Тьюринга (Гильберт, Черч (основа понятий рекурсивной функции), Клини, Пост, Тьюринг (описание алгоритмического процесса))

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

Абстрактная машина.

∆Фон Неймана (1945-ЭДВАК 3-хкомпонентная архитектура).

Такая ЭВМ выполняет программу, которая должна храниться в памяти, где хранятся и данные этой программы.

ЗУ и УВВ – прямой доступ в памяти.

Переменная – область в памяти.

Память – последовательность ячеек для хранения порции информации. Доступ к информации осуществляется в соответствии с адресом этой ячейки или в порядке очереди.

Классификация памяти:

    постоянная;

    оперативная = временная (v )

УУ – для считывания команд данных из памяти и общая координация команд.

АЛУ – для выполнения простейших арифметических и логических операций.

Основные этапы решения задач на ЭВМ.

    Осознание проблемы, формулировка задачи ;

    Формальная постановка задачи (формируется цель, описывается её содержание), что будет делать программа, не указывая как), анализируется характер, сущность всех величин, используемых в задаче, определяется условие, при которых она решается, результатом данного этапа является спецификация программы);

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

    Выбор или разработка метода решения задач (с учетом особенностей, метод должен привести задачу к конкретным машинным операциям);

    Разработка алгоритма решения задач (процесс обработки разбивается на отдельные относительно самостоятельные блоки);

    Разработка структур данных и архитектуры программы (начиная с проектирования архитектуры, общих структур данных);

    Перевод алгоритма на язык программирования (требуются языки высокого уровня с соответствующим транслятором в машинный код);

    Разработка системы теста, отладка и тестирование программы (поиск и устранение синтаксических и логических ошибок в программе). Синтаксический контроль выполняет транслятор, который выявляет конструкции и сочетания символов, недопустимые с точки зрения языка программирования. После устранения синтаксических ошибок проверяется логика работы в процессе её выполнения с конкретными исходными данными);

    Решение поставленной задачи и анализ результатов (выполняется многократное решение задач на ЭВМ для различных наборов исходных данных. Получаемый результат интерпретируется специалистом или пользователем, составившим задачу).

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

Критерии качества ПО.

    Функциональные возможности . (Описывает свойства ПО в части полноты удовлетворения требований пользователя. Оценка качества ПО должна начинаться с точного и формального установления предъявляемых требований и поверки соответствия ПО данным требованиям.)

    Надежность ПО – характеристика его способностей выполнять возложенные функции при поступлении запросов на их выполнение. В отличие от надежностиправильность ПО – соответствие предъявляемым требованиям, то есть различие в том, что правильность – некоторое статическое свойство, которым в соответствии со спецификацией должна обладать программа. Надежность – динамические требования к работоспособностям системы.

    Практичность:

    Простота использования;

    Модифицируемость (характер трудоемкости внесения изменений в программу при ошибках и др.)

    Сопровождаемость

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

    Мобильность - набор атрибутов, относящихся к соотношению между уровнем качества функций ПО и объемом используемых ресурсов при установленных условиях. Характеризуется 2 способами: с учетом vиспользуемой памяти, быстродействия программы.

Диалоговые программы.

По способу общения программ использования прикладные программы делятся на:

    Функционирующие в автоматическом режиме;

    Диалоговые программы.

Диалог с программой может осуществляться в 2 режимах:

          Пакетном (получает все исходные данные до начала работы)

          Интерактивном (режим вопрос-ответ)

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

Взаимодействие в интерактивном режиме по следующей схеме:

    Режим командной строки (получает параметры работы с помощью ввода команд)

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

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

Требования:

    Естественный интерфейс;

    Последовательный интерфейс (каждое текущее действие пользователя должно определяться результатом предыдущего действия)

    Не избыточный интерфейс

    Интерфейс должен обеспечивать поддержку пользователя;

    Интерфейс должен быть гибким (включение функций настройки интерфейса)

Жизненный цикл программы.

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

Жизненный цикл включает следующие этапы:

    Выработка требований к системе;

    Разработка требований ПО;

    Общее проектирование;

    Детальное проектирование;

    Создание отдельных модулей;

    Тестирование отдельных модулей;

    Объединение модулей в системы;

    Выпуск системы;

    Эксплуатация сопровождения системы;

Модели создания систем.

    Каскадная (водопадная)

Возврат предыдущего этапа невозможен.

    Модель развития системы.

    Циклическая.

Способы представления алгоритма.

Свойства определённости алгоритма требуют исполнения при описании его формальных языков. Однако, степень формализации (то, насколько строгим должен быть синтаксис языка), а также представление алгоритма определяются тем, что предполагается в качестве исполнения. Формальный исполнитель субъекта или устройства, способный воспринимать и анализировать указание алгоритма, изменить в соответствии с ним своё состояние и обладающий механизмом управления, способный производить по-маловую обработку информации.

В программировании есть определенные представления алгоритмов, рассчитанные на разных исполнителей:

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

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

Формы представления алгоритмов:

    Символьная (последовательность строк, каждая из которых содержит описание 1-го или нескольких элементарных действий). Порядок выполнения алгоритма задаётся:

    1. В явном виде (указание метки последовательности);

      В неявном виде (элементарность действия определяется возможностями исполнителя).

Символьный способ основный: понятен и человеку, и ЭВМ.

    Помагословесная форма - пронумерованная последовательность строк, каждая из которых содержит описание конкретных действий на естественном языке (для человека) – алгоритмы математических вычислений над конечными числами;

Алгоритм Евклида:

        If a=b, результат a;

        If a>b, ?(a-b), a=a-b → 1) ;

        If a

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

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

Направляющие структуры псевдокода:

      Внешние направляющие алгоритма;

      Ветвление (если, то, иначе, всё)

      Цикл (пока – повторять – конец - пока)

Алгоритм Евклида:

Пока a≠b повтор

Если a>b то

Конец если

Конец пока

D.Язык программирования – искусственно-формализованный язык для ЭВМ

    Графическая (для представления отдельных элементов, используя некоторый набор геометрических фигур). Только для человека.

Наглядность

Трудоемкость

→ соединительная линия

Структурное программирование.

До середины 60-х годов теории разработки алгоритмов не существовало, а процесс разработки определялся опытом и искусством программиста. Однако по мере роста сложности программ возникла необходимость создания методологии разработки программы, которая воплотилась в виде структурного программирования. Идеи такого программирования были высказаны Дейкстрой (1965г.) В том же году итальянские математики Бом, Джакопини сформулировали теорему о структурности, лежащую в основе этого программирования.

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

В структурном программировании 3 варианта организации потока управления:

    Линейный поток (несколько функциональных блоков выполняются последовательно;

    Ветвление;

    Циклический.

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

Особенности структурных алгоритмов.

    Понятность и простота восприятия;

    Проверяемость;

    Модифицируемость.

Структурная теорема:

Любому неструктурному алгоритму может быть поставлен ему в соответствие эквивалентный ему структурный алгоритм, любая программа может быть написана только с использованием конструкций условий и цикла.

Информация, подготовленная для определенных целей, при этом часто подразумевается определенный формат. В вычислительной технике рассматриваются 3 различных значения этого термина:

    Это объекты, отличные от команд, то есть операнды, обрабатываемые программой. Значения констант и переменных файлы данных, противоположных файлам программ. Значение термина зависит от контекста. Команды на исходном языке являются данными для компилятора. Объектный код, получаемый в результате работы компилятора, является исходными данными для загрузчика после начала исполнения. Объектный код становится программой.

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

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

Значение переменной – данные.

Информация.

Применительно к терминам обработка информации, информационные технологии (ИТ), теория информации.

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

    с поведенческой (создание порции информации осуществляется по некоторой причине, а получение этой информации моет привести к некоторому результату, наблюдаемому действию или мыслительной операции);

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

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

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

Программа на языке высокого уровня.

Этапы существования ПО (не жизненный цикл программы):

Подвергается трансляции (процедура перевода с языка высокого уровня на машинный язык.) В ходе трансляции может использоваться переход на промежуточный язык – кросстрансляции. в качестве промежуточного языка может использоваться язык Ассемблера.

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

Машинный язык – язык, использующий машинные команды, записанные в формате воспринимаемом конкретным вычислительным устройством.

Язык ассемблера представляет собой мнемонимическую запись машинного языка (add-сложить).

Транслятор – программа, выполняющая процедуру трансляции. 2 вида:

    компилятор;

    интерпретатор.

    1. Компилятор – осуществляет перевод текста программы на машинный язык целиком.

Результат работы – объектный файл, содержащий программу на машинном языке и информацию о данных, используемых программой. Объектный файл обрабатывается компоновщиком (линкером) или редактором связи.

Компоновщик обрабатывает объектные файлы, разрешает внешние ссылки (делает доступным вызовы объектов функций или данных из других объектных файлов или стандартных библиотек), осуществляет необходимую подготовительную работу для последующей загрузки программы на исполнение. В случае сBorlandCмы получаем исполняемый файл (.exe).

Загрузчик программ, осуществляющих размещение исполняемого кода и данных в памяти ЭВМ и передающий управление первой исполняемой команде программы.

В случае персональных ЭВМ функции загрузчика распределены между ОС и кодом, включаемым в исполняемый файл.

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

Устройство управления считывает по этому адресу код команды, в соответствии с ним считывает значения операндов (если они есть), передает код и операнды АЛУ, которое выполняет необходимые операции.

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

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

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

Входом является программа на языке программирования. Результат – построчно выполняемая команда.

Пример машинной команды, языка высокого уровня.

Оператор goto– безусловного перехода.

Goto_«метка»;

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

А=В+С; после компиляции

М:А=Д+Е; gotoбудет переведен вjump. В качестве операнда из программы должен быть адрес. Метка М после компиляции получит свое значение как адрес относительно начала исполняемого кода, начиная с которого после перевода на машинный язык будут записаны команды, соответствующие А=Д+Е. (М на относительную ссылку). При загрузке размещения в памяти относительная ссылка будет заменена действительным адресом (абсолютной ссылкой в каком-либо формате). После того, как в счетчик команд попадет адрес командыjump, то произойдет загрузка значения абсолютного адреса метки М в регистр счетчика команд, представляет собой безусловный переход

На оператор А=Д+Е. собственно оператор А=Д+Е приведет к появлению машинных команд: сложения, пересылке.

Интерпретатор языка командной строки.

Идентификатор строка символов, используемая для идентификации или именования некоторого элемента программы. Вид именуемого элемента зависит от языка программирования (это может быть переменная, структура данных, процедура, оператор, конструкция высокого уровня или сама программа).

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

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

В рассмотренном примере (с goto) идентификатор используется для именования адреса, по которому размещаться оператор, который будет выполняться сразу после оператора безусловного перехода «goto».

Критерии качества программы.

Для определения качества используются следующие свойства:

    Правильность;

    Эффективность;

    Тиражируемость;

    Модифицируемость;

    Стиль программирования.

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

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

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

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

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

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

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

При доказательстве правильности типичных последовательных программ, написанных на некотором императивном процедурном языке, описание программы представляют в форме двух простых утверждений: входного и выходного. Утверждения выражают свойства определенных элементов программы и отношения между ними. Доказательство состоит в формальной демонстрации того, что семантика программы совместима с входным и выходным утверждениями. Программа решения квадратного уравнения: а,в,с – входные; х1,х2 – выходные.

Императивные и декларативные языки.

Императивные (процедурные) языки. Класс языков программирования.

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

Императивным противопоставляют декларативные языки (Prolog).

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

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

    Надежность ПО.

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

Правильность – некоторое статическое свойство, которым в соответствие со спецификациями должна обладать программа.

Надежность относится к динамическим требованиям, предъявляемым системе удовлетворять требованиям.

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

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

Обеспечение качества ПО.

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

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

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

    Эффективность – с точки зрения качества ПО эффективной программа будет в соответствии с 2 взаимоисключающими критериями:

    Время выполнения;

    Объем использованной памяти;

(Даны переменные а и в. результат а=в, а в=а)

    Стиль программирования.

В открытый доступ уже несколько лет назад, но переводится на русский впервые. За основу взяли самую свежую версию - ту, что стартовала в самом Гарварде осенью 2015 года.

Передаём слово ребятам из JavaRush.

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

Однажды Zapp, глава JavaRush (о JavaRush будет в конце статьи), рылся в интернете, пытаясь найти такие вот алмазы для новичков в программировании - студентов JavaRush - и наткнулся на CS50. Под этой аббревиатурой скрывается вводный курс по основам компьютерных наук и искусства программирования. Его читают студентам Гарвардского университета, с недавнего времени - еще и в Йеле. И «заочно» во всем мире, посредством образовательной интернет-платформы edX. Причем совершенно бесплатно!

Признаться, курс зацепил Zapp’а, хотя обычно он не слишком (мягко говоря) жалует университеты, пичкающие студентов технологиями, утратившими актуальность ещё во времена бурной юности их родителей. Вузовские «айтишные» лекции еще и скучные чаще всего. Настолько, что скулы сводит. Но нет, CS50 - не такой, даже близко! Он прогрессивный (постоянно обновляется), лекции можно смотреть как крутой сериал (а не засыпать на задней парте или заниматься своими делами), задания подобраны со смыслом. Курс хочется смотреть, изучать и… продолжать вливаться в ИТ.

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

Но теперь даже английский учить не придется. Хотя нет, конечно, но уже для работы, а не для учёбы. Потому что мы - JavaRush и студия VertDider - перевели лекции CS50 на русский.

Чему учат на CS50

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

С программированием как таковым CS50 начинает знакомить на «нулевой» неделе. Вероятно, чтобы не пугать даже самых неуверенных гуманитариев, профессура Гарварда первым делом показывает студентам визуальный язык Scratch, на котором можно составлять программы простым перетягиванием графических элементов. Эта разработка Массачусетского Технологического Института (MIT) предназначена для обучения школьников, но основные концепции процедурного программирования - всякие циклы и условия - понять помогает очень быстро. Однако на Scratch никто долго не останавливается, а сразу же переходят на «великий и прекрасный» язык C, и большинство практических заданий студенты CS50 решают именно на нем. Очень неплохой выбор хотя бы потому, что C - чуть более низкоуровневый, чем большинство других ходовых языков, то есть хорош для понимания работы компьютера. К тому же знание основ С не помешает «линуксоидам» и прочим админам. Кстати, Linux’у и его командам также уделено внимание в курсе.

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

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

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

Счастливые слушатели CS50 получат представление о такой науке, как криптография, и поймут, в чем сила самых известных шифров - Цезаря, Виженера, DES.

Точно так же - поверхностно, но в самый раз для первого знакомства - в курсе поведают о веб-разработке, основах CSS, HTML, JavaScript и PHP. И немного о SQL с базами данных.

Если очень кратко, то CS50 вот о чём:

  • Алгоритмы и алгоритмизация задач.
  • Абстракции, структуры данных, инкапсуляция, управления памятью.
  • Основы языка программирования C и программирования в целом.
  • Понятие о веб-разработке и базам данных: CSS, HTML, JavaScript, PHP, Ajax SQL.
  • «Правильная разработка». Что такое MVC.
  • Искусственный интеллект.
  • Понятие о шифровании.

Кто учит, как давно и кого

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

Впервые Дэвид прочёл CS50 в 2007 году, а уже в 2014 году 12% студентов Гарварда всех специализаций, то есть более восьми сотен человек, записались на «Основы программирования», загнав его в топ популярности среди всех курсов колледжа. До этого все было не так весело и многолюдно. Скажем, на лекции создателя Facebook Марка Цукерберга в 2005 году присутствовало аж 15 студентов. Правда, тогда эта социальная сеть только-только набирала обороты. Каждый год Дэвиду ассистируют множество человек - как другие преподаватели, так и недавние студенты CS50. И еще пара-тройка Muppet’ов=).

Вы, возможно, слышали о Сьюзен Войчицки (Susan Wojcicki), исполнительном директоре Youtube. Так вот, в 1990 году она заканчивала Гарвард. Факультет истории и литературы, как ни странно. На последнем курсе девушку перемкнуло, и она решила узнать побольше о компьютерах, посему - выбрала CS50. Затем была Кремниевая долина, дружба с Ларри и Сергеем (теми самыми Ларри и Сергеем), свой луна-парк, все дела. Вот как CS50 может изменить жизнь.

А вы кто такие, господа переводчики?

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

Где найти переведенные лекции

Вот страница , на которой появляются лекции курса на русском языке. Они будут доступны совершенно бесплатно всем пользователям интернета. Перевод первой лекции появился 20 июня, следующая будет 27 июня, дальше - по мере их готовности.

Следите за обновлениями на страничках JavaRush в социальных сетях.

Товарищи инженеры, уже четвертый год пошел, как я взялся преподавать в . За это время у меня накопилось огромное количество примеров кода и материалов, примерно на 90 лекций . Должен сказать, что за весь период своей профессиональной деятельности (а это 24 года почти ежедневного написания кода), я никогда не подымал свой уровень программирования, как за последние годы, работая со студентами. Если раньше мне казалось, что написать кратко, сложно и внушительно - это верх мастерства, то теперь я осознал, что мой код должны понимать студенты после минимальных объяснений, иначе он никуда не годится. Я пришел к выводу, что способность эту можно и нужно распространить не только на обучающий код, но и на весь рабочий код. Более того, обучающий код не должен существенно отличаться от рабочего кода, потому, что мы учим будущих инженеров делать настоящие системы, а не учебные. А после многочисленных просьб, я решил записывать все лекции в виде скринкастов, которые сразу после завершения лекции отправляются на ютюб. За этот учебный год я планирую записать 100 лекций, из которых уже опубликованы 23 , готовы материалы еще для 67 лекций и новых 10 лекций еще в процессе подготовки.

Концепция курса

Все вы знаете, что у нас в отрасли есть существенные проблемы с фундаментальным инженерным образованием:

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

Построить курс на базе JavaScript - это конечно экспериментальная затея, но этот язык уж точно не будет лишним ни для кого в современном ИТ. У самих же JavaScript разработчиков очень часто наблюдается плохая базовая инженерная подготовка и нехватка фундаментальных знаний по структурам данных, алгоритмам, базовым абстракциям, паттернам, архитектуре, парадигмам и приемам программирования. Большинство кода, что пишется сейчас в индустрии, просто выбрасывается вскоре после создания, потом опять переписывается и опять выбрасывается. В общем, качество и знания редко требуются, разве что на собеседованиях. Выгоднее всего делать некачественный код и обслуживать его или выбрасывать код и продавать больше времени на его повторное написание. Кроме того, наша отрасль совершенно оторвалась от науки, в этом есть существенные заслуги маркетологов, потому что мы уже программируем не на языках программирования и не на абстракциях, а мы программируем на фреймворках и библиотеках, которые нам "втюхали" в красивой обертке. Мы собираем все из кубиков, часто без всякого научного осмысления и редко можем ответить на вопрос, почему мы делаем так а не иначе. Все по частям уже давным-давно написано, все можно найти в интернете, но оказалось, что одно с другим не лепится, то есть по частям оно есть, а вместе это не работает. Связывать разобщенные кусочки кода гораздо сложнее чем поодиночке их сделать. Происходит это именно из-за отсутствия системного подхода, терминологического раскола и понятийной рассинхронизации специалистов. Вместе будет работать только то, что идеологически совместимо, что базируется на общей теории и выведенных из этой теории общих стандартах. Я надеюсь, что этим курсом я сделаю хоть небольшой шаг к достижению такого важного для отрасли консенсуса.


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

Структура курса

  • Базовые понятия : программные абстракции, переменные, операторы, типы данных, массивы, структуры, скалярные и ссылочные типы, отображения;
  • Основные понятия : функции, контексты и область видимости, классы и объекты, прототипы, методы, лямбды, чистые функции, побочные эффекты, замыкания, частичное применение, каррирование, композиция, функции высшего порядка, колбэки, враперы, декораторы, примеси, события, интерфейс, синглтон, итераторы, функциональные объекты, функторы, монады, работа с файлами, потоки, сокеты, мемоизация, наследование, генераторы, асинхронное программирование, чеининг, модули и зависимости, обработка ошибок, фабрики и пулы, таймеры, регулярные выражения;
  • Вспомогательные материалы : git, системы контроля версий и менеджеры пакетов, работа с консолью, тестирование, непрерывная интеграция, логирование, линтеры, оптимизация и производительность, борьба с утечками памяти, скрытые классы, мономорфные функции, дженерики, сборка мусора, управление памятью;
  • Структуры данных : коллекции, массивы и типизированные массивы, буферы, списки, стек, очередь, дек, деревья двоичные и иерархические, многомерные деревья, повороты и балансировка ветвей, множества, хешмапы, графы, развернутые списки, асинхронная очередь, автоматы, итерирование структур данных и поиск;
  • Расширенные понятия : символы, прокси, диферы, фьючеры и промисы, линзы, трансдьюсеры, async/await, коллекторы данных, асинхронная композиция, адаптеры асинхронности, асинхронные итераторы, интроспекция, рефлексия, скаффолдинг, инверсия управления и внедрение зависимостей, песочницы, слоистая архитектура, компонентный подход, слой доступа к данным, проекции данных, мониторинг файловой системы, клиент-серверная и трехзвенная архитектура, кластеризация и балансировка, проектирование протоколов, динамическая перегрузка модулей, метаданные, динамическое связывание, межпроцессовое взаимодействие;
  • Примеры кода и комплексного использования технологий: живые электронные таблицы, чат на вебсокетах, реализация языка запросов к графам, альтернативная библиотека асинхронных абстракций metasync, сравнение реализации одинаковых задач на разных парадигмах, сравнение стилей функционального программирования, примеры структуры приложений, маршрутизация обработчиков в node.js приложениях, изоляция кода в песочницах, транзакционные объекты;
  • Парадигмы программирования : императивное, структурное и неструктурное, процедурное, объектно-ориентированное, прототипное, функциональное, логическое, декларативное, асинхронное, реактивное, событийное, автоматное, обобщенное, программирование управляемое потоками данных, мультипарадигменное, метапрограммирование.


Загрузка...