Перейти к содержанию

Программирование - это практика? Правильный подход


VladimirS

Рекомендуемые сообщения

Всех приветствую!  :face:

 

Хочу обсудить с Вами следующую интересную мысль: так ли хорошо построена система образования по программированию в наших ведущих ВУЗах, как многие думают? Один мой знакомый недавно поступил в университет, и ему там предлагают факультатив "Введение в программирование". То есть теория программирования и общие понятия о нем.

 

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

 

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

 

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

 

Далее они понимают, что нужно как-то это значение сохранить. И изучают сведения о переменных, о потоках ввода-вывода и проч. 

 

И так далее, пока программа не будет написана. 

 

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

 

Что Вы думаете о таком подходе и насколько он, по-вашему, эффективен?

Сообщение от модератора Mark D. Pearlstone
Тема перемещена из раздела "Обсуждение компьютерных технологий"
Ссылка на сообщение
Поделиться на другие сайты

Можно вопрос? Вот что будет, если некоторого ответа вы не найдете в поиске?

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

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

 

 


Можно вопрос? Вот что будет, если некоторого ответа вы не найдете в поиске?

 

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

 

 

 


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

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

А в чем собственно вопрос?

теория vs практика?

 

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

  1. Придумать задачу, которая реализуется компьютерной программой (если эта задача еще не поставлена)
  2. Попытаться решить задачу, набросав несколько тестовых алгоритмов.
  3. Если алгоритмы грубы и убоги, начать искать решение в интернете/ в учебниках/ у других программистов.
  4. Найти решение, сравнить с исходными алгоритмами. При этом глубина понимания структуры найденных алгоритмов (теории) значительно усилится.

 

Или же придерживаться другого варианта изучения теории:

  1. Прочитать книжку/пройти курсы по программированию. Порешать типовые задачки.
  2. Получить на работе задание по программированию.
  3. Начать вспоминать и припоминать уже изученное, пытаясь в дебрях своей памяти разыскать эту информацию.
  4. Если не вспомнится и не припомнится, опять искать решение в интернете/в учебниках/у других программистов.
  5. Реализовать готовое решение, не имея под рукой "плохое решение", с которым можно было бы его сравнить и понять тонкости готового алгоритма.
Ссылка на сообщение
Поделиться на другие сайты

без въедливого изучения Кнута - общественность обычно считает "вон из профессии".

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

 

а примеров как не надо - полно. например http://govnokod.ru/

Ссылка на сообщение
Поделиться на другие сайты

 

 


потом пришлось судорожно эту самую теорию вспоминать и читать.

 

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

Ссылка на сообщение
Поделиться на другие сайты

В принципе, я уже ответил выше: "параллельно" (т.е. одновременно).

 

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

 

На сегодня это самая эффективная и универсальная методика. Книгу можно заменить/дополнить аудио или видео (т.е. мультимедийными средствами), но суть от этого не изменится.

 

Мудрость приходит только с годами.

 


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

 

А кто вам гарантирует, что вы поймете "алгоритм" не зная элементарной теории?

 

И раз уж зашла речь о Qt, прочитайте, сами разработчики рекомендуют сперва изучить C++, а затем прочитать книгу по Qt.

http://doc.crossplatform.ru/qt/4.5.0/how-to-learn-qt.html

 

Говоря простым языком: "нельзя решить интеграл, не понимая, что такое цифры"...

 

P.S. Исключение - люди с нестандартным мышлением (но их "единицы").

 

Добавлю еще несколько риторических вопросов в противовес вашему предложению:

- в какое место здесь можно вклинить понятие "эффективность"?

- сколько времени потребуется для решения задачи?

- является ли ваше решение оптимальным?

- какие инструменты вы будете использовать (почему именно Qt), кто проведет вариантный анализ?

- какой стиль программирования вы используете (смогут ли ваш код понять другие)?

- ...

- главное: зачем писать планировщик изобретать велосипед, если ими (в т. ч. бесплатными и с открытым кодом) уже весь интернет завален?

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

 

потом пришлось судорожно эту самую теорию вспоминать и читать.

 

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

 

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

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

Ссылка на сообщение
Поделиться на другие сайты

ACIK, более всего интересен Ваш ответ на вопрос: как изучать бесплатный открытый код?

 

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

 

Далеко не все алгоритмы описаны в учебниках с контрольными вопросами, упражнениями и самостоятельной работой. Как такой алгоритм изучить и понять? Нередко он дан де-факто, без подробнейших пояснений и описаний. А может быть его вообще не нужно понимать, а взять да сделать "Copy-Paste"?

 

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

 

P.S. Изучение фундаментальной (самой-самой базовой) теории таким способом, конечно, неэффективно  :mmm:  Признаю.


 

 


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

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

как изучать бесплатный открытый код?

 

Это еще сложнее, чем проприетарный... :)

Это уже, так скажем, уровень ближе к "гуру".

 

Отвечу словами одного довольно хорошего unix-админа...

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

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

 

Вот вам пожалуйста "бесплатный" софт!

 

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

 

Далеко не ко всем алгоритмам имеются учебники с контрольными вопросами

 

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

 

 

Вот в чем я пытаюсь разобраться

 

Зависит от конечной цели.

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

 

 


Это еще сложнее, чем проприетарный... Это уже, так скажем, уровень ближе к "гуру".

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

 

 

 

 


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

 

Он имел в виду: "Если хотите понять смысл скрипта, изучите его самостоятельно"?

 

 

А вы ищите книгу с ответами на все вопросы?

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

 

 

что в вашем понимании "правильное решение" (эталонный алгоритм)?

 

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

 

 

 


И какова ваша "конечная истинная" цель (знания, прибыль, слава...)?

 

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

Ссылка на сообщение
Поделиться на другие сайты

 

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

 

 

Быстро научиться писать правильный код в любом случае не получится, так как приходит это исключительно с опытом. Тем более что термин "правильный" изначально является неправильным :) Правильный с какой точки зрения ? Проиллюстрирую на примере из реальной практики - делалась много лет назад одна задача, предполагающая использование большой и сложной БД. Ее сделали правильно (соблюдены правила Кодда, БД  приведена к 3-й нормальной форме и т.п.), в общем ее хоть в качестве образца в учебники. И код был написан правильно, и отлажен - но на реальных условиях задача не работала вообще, поскольку "сшивка" по ключам десятков огромных таблиц на каждый чих отнимало очень много ресурсов, критически важные расчеты в итоге шли в лучшем случае часами, индексация и прочие классические методики не помогали. В итоге БД была денормализована, многие вещи сделаны совершенно неправильно, но скорость работы в итоге возросла на 6 порядков ! (т.е. то, что работало часами - стало работать секундами). А почувствовать такие тонкости можно только набив шишки, причем как в теории, так  и в практике.

 

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

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...