Какие компьютерные концепции я должен знать? [закрыто]

Как вы думаете, какие концепции компьютерной науки сделали вас лучшим программистом?

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

Языковые функции

  • Указатели & Рекурсия (спасибо, Джоэл!)

Структуры данных

  • Связанные списки
  • Hashtables

Алгоритмы

  • Bubble Sorts

Очевидно, что список на данный момент немного короток, поэтому я надеялся на предложения относительно:

  1. Какие понятия я должен понимать,
  2. Любые хорошие ресурсы для их правильного понимания (так как Википедия может быть немного плотной и иногда академичной).
88 голосов | спросил 4 revs, 4 users 100%
Jon Artus
1 Jam1000000amThu, 01 Jan 1970 03:00:00 +030070 1970, 03:00:00

29 ответов


0

Посмотрите на это сообщение в блоге Стива Йегге (ранее из Amazon, сейчас в Google):

В нем подробно рассматриваются пять самых важных концепций, которые разработчики должны знать:

  1. Базовое программирование (включая рекурсию, файловый ввод /вывод, форматированный вывод, циклы и т. д.)
  2. Объектно-ориентированный дизайн (включая шаблоны проектирования и т. д.). Вы должны быть в состоянии создать разумный дизайн ОО, а также понять концепции.
  3. Сценарии и регулярные выражения.
  4. Структуры данных - списки, наборы, хеш-таблицы, деревья, графики и т. д., а также нотация Big O и сложность алгоритмов.
  5. Биты, байты и двоичные числа - как числа представлены в компьютере и как ими манипулировать.
ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Вы определенно должны понимать нотацию Big-O и оценки Big-O алгоритмов - что это такое, как оно используется, почему это важно, как вы сравниваете два алгоритма с учетом их оценок Big-O, как вы строите оценки Big-O для простых алгоритмов.

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Мне немного смешно, что вы ищете предметы по информатике , но википедия слишком академична: D

Во всяком случае, здесь идет, в произвольном порядке:

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Некоторые концепции, которые помогли моему развитию (интеллект и код):

  • Лексирование, синтаксический анализ, сопоставление строк, регулярное выражение
  • Заметки
    • инкапсуляция /обзорное /закрытия
    • кэширование
  • Рекурсия
  • итераторы /Генераторы
  • Функциональное программирование. В удивительной статье Джона Хьюза на "почему"

Это целые области дискретной математики, но для CS требуется серьезное введение:

  • Матрица /линейная алгебра
  • Теория графов

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

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

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

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

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Я вижу несколько хороших концепций CS, но мало говорю о математике.

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

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

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

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

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Матрица компетенций программиста подробно рассмотрела этот вопрос, но я выделю пару

  • Структуры данных
    • Расширенные структуры данных, такие как B-деревья, биномиальные кучи и кучи Фибоначчи, AVL /красные черные деревья, Splay-деревья, Skip Lists, попытки и т. д.
  • Алгоритмы
    • Tree, Graph, простые жадные алгоритмы и алгоритмы «разделяй и властвуй», способны понять актуальность уровней этой матрицы.
  • Системное программирование
    • Понимает весь стек программирования, аппаратное обеспечение (ЦП + память + кэш + прерывания + микрокод), двоичный код, сборку, статическое и динамическое связывание, компиляцию, интерпретацию, JIT-компиляцию, сборку мусора, кучу, стек, адресацию памяти… /li>
  • Контроль версий исходного кода
    • Знание распределенных систем VCS. Опробовал Bzr /Mercurial /Darcs /Git
  • Автоматизация сборки
    • Может настроить скрипт для сборки системы, а также документацию, установщики, сгенерировать заметки о выпуске и пометить код в системе контроля версий
  • Автоматизированное тестирование
    • Понимает и умеет настраивать автоматизированные тесты функциональности, нагрузки /производительности и пользовательского интерфейса
  • Разложение проблемы
    • Использование соответствующих структур данных и алгоритмов и разработка универсального /объектно-ориентированного кода, который инкапсулирует аспекты проблемы, которые могут быть изменены.
  • Разложение систем
    • Возможность визуализации и проектирования сложных систем с несколькими производственными линиями и интеграцией с внешними системами. Также должен уметь проектировать системы поддержки операций, такие как мониторинг, отчетность, отработки отказа и т. Д.
ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

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

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

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

Вы должны выучить несколько языков.

  • Язык программирования (Java, Python и т. д.)

  • Язык оболочки.

  • Язык базы данных (SQL)

  • Языки представления (HTML и CSS)

  • Другие языки представления данных (XML, JSON)

Вы должны изучить несколько структур данных.

  • Последовательности (списки, кортежи, файлы)

  • Иерархический (например, документы XML и HTML, а также базовая файловая система)

  • Реляционные (например, базы данных и файловая система с жесткими и программными ссылками)

  • Карты (или индексы или ассоциативные массивы), включая Hash Maps и Tree Maps

  • Множества

Плюс некоторый анализ алгоритмической сложности. Иногда называется "Большой О". Почему плохая сортировка пузырьков заключается в том, что она O ( n ^ 2), где быстрая сортировка O ( n ) > log n ).

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Для меня я многое получил от следующего курса в университете

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

Вещи, которые я хотел бы сделать в университете

  • Конструкция компилятора
  • Шаблоны дизайна
  • Теория автоматов
ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

ЛОГИКА . Я просто преувеличиваю важность логики в программировании. Вы сказали, что занимались машиностроением, поэтому вы должны знать, насколько математика может облегчить вашу жизнь.

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

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Я думаю, что хорошее понимание того, как работает компилятор, полезно знать. У Ахо есть классическая книга о концепциях, используемых при создании компилятора. Название «Компиляторы: принципы, методы и инструменты». Его прозвище - Книга Дракона. Чтобы по-настоящему понять эту книгу, вы должны понимать формальные языки. У Хопкрофта есть хорошая книга на эту тему - Введение в теорию автоматов, языки и вычисления.

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Здесь уже упоминалось много хороших ответов, но я хотел добавить подмножество того, что важно, но пока не освещено.

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

  • Общие концепции ОО и современные возможности языка программирования (классы, скрытие данных и т. д.).
  • Метрики производительности алгоритма (обозначение Big O). При разработке алгоритма, проведении анализа Big O для определения стоимости алгоритма и поиска более эффективных альтернатив в узких местах.
  • Связанные списки и другие сложные структуры данных.
  • Быстрая сортировка и различные концепции сортировки.
  • Деревья и быстрые манипуляции с деревьями.

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

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Я приветствую дискретную математику. Информатика - это абстракция. научиться думать как математик очень полезно.

Я также хотел добавить к тому, что сказал С.Лотт о языках. Изучение множества типов языков тоже важно. Не только скомпилированные против скриптов. Но функциональный (ML, Lisp, Haskell) логический (Prolog) объектно-ориентированный (C ++, Java, Smalltalk) императив (C, Pascal, даже FORTRAN).

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

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Некоторые концепции ОС

 ( memory, IO, Scheduling, process\Threads, multithreading )

[хорошая книга » Modern Операционные системы , 2-е издание, Эндрю С. Таненбаум "]

Базовые знания о компьютерных сетях

[хорошая книга Таненбаум

OOPS concept

Конечный автомет

Язык программирования (сначала я выучил C, а потом C ++)

Алгоритмы  (Сложность времени \ пространства, сортировка, поиск, деревья, связанный список, стек, очередь)

[хорошая книга Введение в алгоритмы ]

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Ну, червячная банка теперь открыта! :)
Я начал в электротехнике.

Дизайн реляционной базы данных: Отслеживание данных похоже на Арнольда в "Kindergarden Cop".
Это может быть полный хаос. Он должен контролироваться.
Как хранить ваши данные в наименьшем количестве мест с минимальным дублированием информации. Как сохранить ваши данные легкими и легкодоступными. Как контролировать рост и целостность данных.

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

Объектно-ориентированное программирование. Многие языки сводятся к этому формату.

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

Понимание бизнес-правил. Это поможет вам сделать большую часть своей логики на основе таблиц.
Многие условия IFblock могут находиться в таблицах бизнес-правил. Чтобы изменить логику, просто измените информацию в таблице. Мало /Нет перекодирования. Маленькая /Нет перекомпиляции.

События контролируют ... Методы выполняют свою работу:
Храните вещи в своем коде отдельно. Это позволяет другим делать обновления в будущем. Он также в некоторой степени параллелен структуре Model /View /Controller (MVC).

PJ

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0
ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

алгоритмы.

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

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

Чтобы подвести итог - взгляните на Введение в алгоритмы

Нет необходимости справляться с этим, просто знайте, что происходит ...

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Как недавний выпускник степени информатики, я бы порекомендовал следующее:

  • Как уже упоминалось в различных постах Big O нотация

    ОО Дизайн

    Структуры данных & Алгоритмы (не могу помните точное название книги Я использовал будет обновлять, если я помню)

    Операционные системы http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580

    Проблемы NP

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Это, безусловно, хорошее понимание объектно-ориентированного программирования, хорошие руководящие принципы, такие как Принципы SOLID и следуя установленным образцам и практикам.

Если вы посмотрите на SOA или DDD, все они в конечном итоге прибегнут к некоторой форме концепций ООП.

Я бы порекомендовал вам приобрести несколько хороших книг по ООП, а также выбрать богатый язык, такой как C # или Java, для начала

ООП от Грэди Буча

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

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

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

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Я не собираюсь рассказывать вам какие-либо конкретные концепции для изучения, но вместо этого рекомендую вам много читать по широкому кругу тем. Не беспокойтесь о том, чтобы получить глубокое понимание каждого предмета, о котором вы читаете, - сейчас важнее, чтобы вы могли распознать, какой вид проблемы вы ищете, поэтому что вы можете учиться точно в срок, когда на самом деле сталкиваетесь с этим. Другими словами, это нормально, если вы не знаете, как решить проблему комбинаторики, если вы знаете достаточно, чтобы найти «комбинаторику», когда вам нужно увидеть, сколько способов вы можете упорядочить набор объектов или выбрать подмножество. .

Википедия - довольно хороший ресурс для такого широкого обзора, особенно если вы только начинаете читать. Еще лучше, особенно если вы находите Википедию слишком академичной или недоступной, это C2 wiki . (Это, что интересно, оригинальная вики, изобретенная Уордом Каннингемом).

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

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

Семафоры, критические разделы и amp; события.

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Нет, не пузырьковая сортировка, быстрая сортировка. Это большая вещь - пузырьковая сортировка в среднем O (n ^ 2), быстрая сортировка O (n * log (n))

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Я бы сказал ниже, самые важные вещи

  • Объектно-ориентированное программирование
  • Концепции операционной системы
    • Процесс и нить
    • Алгоритмы планирования
  • Структура данных
    • Тип хранения и сбора данных, типы (связанный список, хэш, массив и т. д.)
    • Алгоритмы сортировки
    • Сложность алгоритмов

Затем перейдите к конкретным языковым материалам. Я надеюсь, что это полезно !!

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Я бы начал с цитаты:

  

"если единственный инструмент, который у вас есть, это   молот, ты относишься ко всему как   гвоздь ". (Авраам Маслоу)

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

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

Этот совет согласуется с современной тенденцией для многоязычных проектов (например, веб-приложений, которые могут включать несколько языков в одном приложении, например C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp ... и даже различные парадигмы программирования (например, C # недавно представил некоторые концепции из парадигм функционального программирования, лямбда-выражения).

Итак, основная вещь - это постоянное обучение, навсегда :)

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

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

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

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

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41
0

Поскольку машины с несколькими ядрами (как CPU, так и GPU) становятся стандартом, я бы сказал, чтобы включить Распределенные алгоритмы (из нескольких потоков на несколько машин). Очень важно понимать многопоточность и распределенную обработку. Извините, что эта ссылка не очень помогает.

ответил Salar 29 SatEurope/Moscow2018-12-29T12:42:41+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 12:42:41 +0300 2018, 12:42:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132