Как вы что-то кодируете, когда понятия не имеете, как это на самом деле работает? [закрыто]

14

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

Погугление по этому поводу привело к репозиторию Vim GitHub, который для меня бесполезен, потому что кодовая база огромна, а код сбивает меня с толку. Я также нашел учебники по созданию текстового редактора на C, который работает как vim.

Хотя я думал о том, чтобы следовать учебным пособиям, это похоже на обман. Как разработчики vim выяснили, как кодировать vim без специальных руководств? Или они начинались с более простых текстовых редакторов? Как они поняли это только благодаря знанию языков и их документации?

Что именно мне нужно, чтобы начать писать этот текстовый редактор, не следуя непосредственно руководству? Еще один пример, который мне нравится думать: как Деннис Ритчи и Кен Томпсон создали Unix? У меня есть представление о том, как функционирует ОС, но я не знаю, как поместить это в код. Что мне не хватает? Как я могу передать эти знания языка для практического использования?

Faithlesss
источник
14
Вы сравниваете себя с проектами с долгой историей и исключительными людьми. Unix возникла в исследовательской группе с многолетним опытом программирования на системном уровне и извлекла выгоду из опыта работы с более сложной ОС Multics. Vim был основан на vi, который был основан на ред. Эти программы не появились внезапно, они были эволюцией, созданной сотнями людей. Так что не расстраивайтесь, когда вам трудно пропустить всю эту историю. Никто не может. Вместо этого попробуйте сделать проекты, которые находятся на грани вашего понимания - просто в пределах вашей досягаемости, но все же сложные.
Амон
8
Вы только что научились играть некоторые мелодии на ксилофоне, и теперь вы хотите играть в большом международном оркестре? Давай, ты ожидаешь слишком многого. Программирование похоже на игру на инструменте - вы начинаете с маленьких простых мелодий и после нескольких лет практики вы учитесь играть на симфонии.
Док Браун
3
Согласовано. Воспользуйтесь возможностью узнать что-то, что многие начинающие усваивают на собственном опыте. Начните немного . И читать код Vim тоже. Вы можете многому научиться, читая существующий код.
Laiv
17
Ваша основная проблема - отсутствие ясности в вашем мышлении. Вы говорите «простой текстовый редактор, такой как vim», а затем сразу же следите за этим, отмечая, что его кодовая база огромна и запутана. Это должно быть сильным сигналом для вас, что ничто, что близко напоминает vim, не является простым . Даже опытные программисты попадают в ментальную ловушку, в которую вы попали. Вещи, которые вы еще не понимаете, не просты . Они сложны . Компьютерное программирование превращает ментальную логику в реальность; начать думать более четко о программировании.
Эрик Липперт
4
Кроме того, перестаньте беспокоиться о «мошенничестве». Это не игра У вас есть цели, и они хорошие цели. Делайте то, что вам нужно сделать для достижения этих целей . Вы думаете, профессиональные программисты не смотрят на источник, когда хотят узнать, как что-то работает? Обучение тому, как учиться на источнике, который вы не написали, является одним из самых важных навыков программирования, поэтому начните практиковать его.
Эрик Липперт

Ответы:

17

Если это ваш первый программный проект, даже простой текстовый редактор может оказаться слишком сложным. Что-то вроде vim или ОС полностью исключено.

Подход к проблеме

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

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

пример

Давайте возьмем пример текстового редактора.

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

  • Начните с простого чтения файла и отображения его содержимого.

  • Вы обнаружите (среди прочего) следующие подзадачи:

    • Как узнать имя файла для отображения?
    • Учитывая имя файла, как я могу получить содержимое файла?
    • Учитывая содержимое файла, как их отобразить?

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

Следующий шаг

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

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

doubleYou
источник
Эй, парень, спасибо за совет! Я думаю, что я приму этот подход. Я немного упрям, когда дело доходит до изменения своего мнения, но из того, что вы предложили, я думаю, что я попытаюсь увидеть, как сделать просмотрщик файлов. Может также добавить способ показать метаданные файла каким-то образом? Я, наверное, могу понять это сам. Большое спасибо!
Faithlesss
2
Чтобы добавить к этому, «как мне их отобразить», вероятно, можно далее разбить на запись конкретного символа в определенную позицию на экране (если мы говорим о редакторе командной строки), что должно быть чем-то, что можно легко найти ответ на сайте.
Dukeling
2
«даже простой текстовый редактор может быть слишком сложным» текстовые редакторы удивительно сложны. Представьте себе редактирование файла размером 20 МБ. Достаточно большой, чтобы требовать буферизации, но недостаточно большой, чтобы облагать налогом современный компьютер. Вы должны иметь возможность прокручивать его, вставлять и удалять текст, изменять текст в реальном времени, маркер полосы прокрутки обновляться в реальном времени по мере изменения модели, лежащей в основе. Если у вас есть какой-либо тип форматирования, это становится еще сложнее.
15

Вы не

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

Telastyn
источник
С чего бы начать хороший проект? Я уже сделал свою собственную игру палача (в терминале), а также игру в крестики-нолики. Я просто не вижу способа продолжить, поэтому я подумал, что текстовый редактор будет хорошей идеей.
Faithlesss
3
@faithlesss - что-то, что читает и пишет файлы, похоже на основной промежуточный шаг.
Теластин
9
Файл зритель может быть хороший проект , то, например , пейджер вроде less, moreили viewпрограмм. Они разделяют некоторые аспекты редакторов без сложности изменяемых буферов редактирования.
Амон
@Telastyn Я получил тебя. Собираетесь тогда сделать просмотрщик файлов, возможно, простой, который может читать основные текстовые форматы, а затем перейти к выяснению, как читать что-то вроде, может быть, json или csv файл? Не должно быть так сложно разобрать его, просто надо посмотреть документацию по string.h, я думаю. Спасибо за совет!
Faithlesss
2
@Faithlesss Также взгляните на особенности линейного редактора , предшественника программ текстового редактора
Bergi
2

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

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

Это означает, что вам нужно будет выполнить большую работу по проектированию, прежде чем вы начнете писать свою первую строку кода. Вам нужно будет решить, как выглядит интерфейс. Вам нужно будет решить, какие функции включить. Оба вышеперечисленных вопроса будут основаны на том, на что вы способны. Если вы думаете об «идеальной» ситуации (как вы хотели бы, чтобы интерфейс работал), но вы не чувствуете, что способны ее кодировать, тогда вам нужно начать искать альтернативные подходы: как я могу заставить это работать? Это поможет вам сосредоточиться на подходах к кодированию, о которых вы, возможно, захотите узнать больше.

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

Это не значит, что вам нужно, чтобы все приложение разрабатывалось от начала до конца, прежде чем вы напишете свою первую строку кода. Вполне нормально, что требования меняются со временем, когда вы узнаете больше. Можно добавлять новые функции, о которых вы не думаете, пока не протестируете / не используете свое собственное приложение и не подумаете: «Не было бы неплохо, если бы ...» Можно начать с простого.

Рэндалл Стюарт
источник
1

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

На ум приходят несколько альтернатив:

  • Изучите код продукта, с которым вы знакомы. Если вы опытный vim, посмотрите на это и попытайтесь понять что-то маленькое и изолированное, например, как оно представляет данные, или ищет один символ ( fкоманду).
  • Изучите код очень простой программы и работать ваш путь оттуда: catкоманда затем wcзатем grepзатем sed, например.
  • Попробуйте написать программу, которая выполняет только одну функцию редактора. Возможно, удалите второй символ в каждой строке файла (без обратной записи) или отобразите только строки с 50 по 70 файла.
wallyk
источник
1
Не зная об общих шаблонах, я думаю, что понимание даже крошечного кусочка большого проекта, такого как vim, будет бесполезным. Впрочем, смотреть на очень маленькие проекты с открытым исходным кодом - хорошая идея. Я бы добавил, что попытка внести целенаправленные изменения в такую ​​программу была бы отличным способом обучения. Преимущество: вы изучите некоторые шаблоны, используемые в реальных программах. Недостаток: вы также можете выучить анти-паттерн.
doubleYou