Минимальные знания CompSci, необходимые для написания настольных приложений

Проработав 3 года программистом-любителем (в основном на Python и C) и никогда не создавая приложений длиной более 500 строк кода, я столкнулся с двумя вариантами:

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

(2) Изучите Qt, который поможет мне создавать проекты, которые я жаждал строить в течение долгого времени.

Для изучения (1) все, кажется, рекомендуют прочитать CLRS. К сожалению, чтение CLRS заняло бы у меня как минимум год обучения (или больше, я не Питер Круминьш). Я также понимаю, что для выполнения любой умеренно сложной задачи с использованием (2) мне нужно нужно понимать, по крайней мере, основы (1), что подводит меня к моему вопросу: предполагая, что я использую C ++ в качестве программирования выбранный язык, какие части CLRS дадут мне достаточно знаний об алгоритмах и структурах данных для работы над большими проектами с использованием (2)?

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

Не поймите меня неправильно. Дискретная математика и теоретические основы CompSci были в моем списке «TODO: URGENT» уже около 6 месяцев, но у меня просто не хватает времени из-за работы в колледже. Спустя долгое время у меня есть 15 выходных, чтобы делать все, что мне нравится, и я хочу потратить эти 15 дней на создание приложений, которые я действительно хочу, вместо того, чтобы сидеть за столом с ручкой и бумагой. в руке, пытаясь записать решение задачи из учебника.

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

Спасибо :)


person Ankur Sethi    schedule 17.12.2008    source источник
comment
Мне кажется, что это, по сути, дубликат stackoverflow.com/ вопросы / 360542 /. Кто-нибудь думает иначе?   -  person EBGreen    schedule 17.12.2008
comment
Эээ ... не знаю, стоит ли закрывать сейчас. В значительной степени ответил.   -  person EBGreen    schedule 17.12.2008
comment
может кто-нибудь осветить аббревиатуру CLRS?   -  person Dónal    schedule 17.12.2008
comment
Введение в алгоритмы Томаса Х. Кормена, Чарльза Э. Лейзерсона, Рональда Л. Ривеста и Клиффа Стейна.   -  person EBGreen    schedule 17.12.2008


Ответы (8)


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

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

person Dónal    schedule 17.12.2008
comment
В самом деле, вам редко придется писать дерево AVL (и, судя по недавним вопросам SO, в любом случае ответ заключается в использовании хеш-таблицы) - person Jimmy; 17.12.2008
comment
Обычно вам не нужно разбираться в теории, лежащей в основе их работы, просто используйте их! - Я думаю, вам НЕОБХОДИМО разбираться в теории, чтобы знать, какую из них выбрать! К счастью, требуемая теория минимальна: сложность манипулирования структурой данных. - person JeeBee; 17.12.2008

Чтобы получить меньше математических ресурсов, больше кода для алгоритмов, чем CLRS, ознакомьтесь с Об алгоритмах в двух словах. Если вы собираетесь писать настольные приложения, я не считаю, что чтение CLRS является обязательным. Если вы используете C ++, я думаю, что Sedgewick - это более подходящий выбор.

person Bill the Lizard    schedule 17.12.2008

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

См. Также эти вопросы:

Какие ресурсы по информатике могут пригодиться слепому программисту? https://stackoverflow.com/questions/360542/plumber-programmers-vs-computer-scientists#360554

person Tim    schedule 17.12.2008
comment
Я думал, что вопрос в том, как мне избежать изучения как можно большего количества компьютерных наук в пользу изучения ремесла? - person Jimmy; 17.12.2008
comment
Некоторым людям полезно слушать, а не сидеть с открытой книгой. Похоже, он не хочет слишком много работать над этим, но чувствует, что есть некоторые знания, которые могут помочь ... - person Tim; 17.12.2008

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

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

person Steven A. Lowe    schedule 17.12.2008

Перейти с 500 loc на реальное (даже небольшое) приложение не так-то просто. Как указывал Дон, вам нужно много узнать о коде (гибкость, повторное использование и т. Д.), Вам также нужно изучить некоторые основы управления конфигурацией (безопасность визуального источника, svn?)

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

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

Удачи и дайте нам знать

person dario minonne    schedule 17.12.2008
comment
О боже, не используйте Visual Source Safe - person dancavallaro; 17.12.2008

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

Что касается структур данных - узнайте, какая из них подходит для любой ситуации, которую вы себе представляете: наборы (отсортированные и несортированные), списки (ArrayList, LinkedList), карты (HashMap, TreeMap). Сложность выполнения основных операций - добавления, удаления, поиска, сортировки и т. Д. Это поможет вам выбрать подходящую структуру данных библиотеки для использования в вашем приложении.

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

Удачи!

person JeeBee    schedule 17.12.2008

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

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

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

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

person frankodwyer    schedule 17.12.2008

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

Затем я перейду к одному или обоим классическим урокам о ремесле программирования, а именно

Вы также можете ознакомиться со списком рекомендованных книг на Stack Overflow.

person Hamish Downer    schedule 17.12.2008