Як ви кодуєте щось, коли не маєте уявлення про те, як це насправді працює? [зачинено]


14

Я нещодавно вивчив С і хочу запустити проект, щоб закріпити свої знання. Я вирішив створити дуже простий текстовий редактор, щось на кшталт vim. Проблема, з якою я стикаюся, полягає в тому, що я справді не розумію, як працює навіть текстовий редактор, і я не знаю, для чого шукати в Google, щоб дізнатися про це.

Гуглінг з приводу цього призвів до репоту GitHub від Vim, що для мене марно, оскільки база даних величезна, і код мене бентежить. Я також знайшов підручники для створення текстового редактора на C, який функціонує як vim.

Хоча я думав про те, щоб дотримуватися навчальних посібників, це відчувається як обман. Як розробники vim з'ясували, як кодувати vim без конкретних навчальних посібників? Або вони почали з більш простих редакторів тексту? Як вони це зрозуміли лише з знання мов та їх документації?

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


14
Ви порівнюєте себе з проектами з довгою історією та винятковими людьми. Unix виникла в дослідницькій групі з багаторічним досвідом програмування на системному рівні та отримала прибуток від досвіду більш складної ОС Multics. Vim базувався на vi, який базувався на ред. Ці програми не з’явилися раптово, вони були еволюцією, побудованою сотнями людей. Тому не засмучуйтесь, коли вам важко пропустити всю цю історію. Ніхто не може. Натомість намагайтеся робити проекти, які знаходяться на межі вашого розуміння - просто в межах вашого розуміння, але все ж складних.
амон

8
Ви щойно навчилися грати деякі мелодії на ксилофон, а тепер хочете грати у великому міжнародному оркестрі? Давай, ти очікуєш занадто багато. Програмування - це як грати на інструменті - починаєш з маленьких, простих мелодій і після кількох років практики вчишся грати на симфонії.
Doc Brown

3
Домовились. Візьміть це як шанс, щоб ви дізналися щось, чого багато початківців навчаються на важкому шляху. Почніть мало . І читайте код Vim теж. Ви можете багато чого навчитися читати існуючий код.
Лаїв

17
Ваша основна проблема - недостатня ясність у вашому мисленні. Ви говорите "простий маленький текстовий редактор, як vim", а потім негайно дотримуєтесь цього, зазначивши, що його база коду величезна і заплутана. Це має бути сильним сигналом для вас, що нічого, що дуже нагадує vim, не є простим . Навіть досвідчені програмісти потрапляють у ментальну пастку, в яку ви потрапили. Речі, які ви ще не розумієте, не прості . Вони складні . Комп'ютерне програмування перетворює психічну логіку в реальність; почніть з більш чіткого роздуму над програмуванням.
Ерік Ліпперт

4
Також перестаньте турбуватися про "обман". Це не гра. У вас є цілі, і вони хороші цілі. Робіть те, що вам потрібно зробити для досягнення цих цілей . Ви думаєте, що професійні комп'ютерні програмісти не дивляться на джерело, коли хочуть дізнатися, як щось працює? Навчитися вчитися з джерела, яке ви не писали, - одна з найважливіших навичок програмування, тому починайте її практикувати.
Ерік Ліпперт

Відповіді:


17

Якщо це ваш перший проект програмування, навіть простий текстовий редактор може бути занадто складним. Щось на кшталт vim чи ОС зовсім не підлягає сумніву.

Підхід до проблеми

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

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

Приклад

Візьмемо приклад текстового редактора.

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

  • Почніть із простого читання файлу та показу його вмісту.

  • Ви виявите (серед інших) такі підпроблеми:

    • Як дізнатись ім'я файлу для відображення?
    • Як отримати ім'я файлу, як я можу отримати вміст файлу?
    • Як вказати вміст файлу, як їх відобразити?

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

Наступний крок

З часом, коли ви приймете все більш складні проблеми, ви зрозумієте, що стає все складніше знайти підходящі способи розв'язати свої проблеми. Ви також помітите, що зміна коду з часом може стати втомливою.

Тоді саме час вивчити основні концепції архітектури та дизайну.


Гей, дякую за пораду! Я думаю, я прийму такий підхід. Я трохи впертий, коли йдеться про передумки, але з того, що ви запропонували, я думаю, я спробую зрозуміти, як зробити переглядач файлів. Може також додати спосіб відображення метаданих файлів якимось чином? Я, мабуть, можу це зрозуміти сам. Дуже дякую!
Faithlesss

2
Щоб додати до цього, "як їх відобразити", ймовірно, можна додатково розбити до написання конкретного символу на певну позицію на екрані (якщо ми говоримо про редактор командного рядка), що має бути чимось легко знайти відповідь в Інтернеті.
Герцогство

2
"навіть простий текстовий редактор може бути занадто складним" текстові редактори напрочуд складні. Уявіть, що ви редагуєте файл розміром 20 Мб. Досить великий, щоб вимагати буферизації, але недостатньо великий, щоб оподатковувати сучасний комп'ютер. Потрібно мати змогу прокручувати його, вставляти та вилучати текст, переставляти текст у режимі реального часу, маркер смуги прокрутки оновлюватись у режимі реального часу, коли змінюється модель за ним. Якщо у вас є будь-який тип форматування, це стає ще складнішим.

15

Ви цього не робите.

Якщо ви навіть не маєте туманного уявлення, як щось робити, це знак того, що це виходить за рамки ваших нинішніх навичок. Тому що якщо ви не маєте уявлення про те, як його почати, ви, звичайно, не матимете ідеї, якщо мова йде про найскладнішу частину програми.


З чого було б тоді добре розпочати проект? Я вже власноруч влаштував гру на підйомника (у терміналі), а також гру з тик-так. Я просто не бачу способу продовжувати, тому я вважав, що редактор тексту буде гарною ідеєю.
Faithlesss

3
@faithlesss - те, що читає і записує файли, здається основним проміжним кроком.
Теластин

9
Файл глядач може бути хороший проект , то, наприклад , пейджер на кшталт less, moreчи viewпрограм. Вони поділяють деякі аспекти редакторів без складності змінних буферів редагування.
амон

@Telastyn Я отримав тебе. Подивіться на те, щоб зробити переглядач файлів тоді, мабуть, простим, який може прочитати основні текстові формати, а потім перейти до з'ясування, як прочитати щось на кшталт, можливо, json чи файл csv? Це не повинно бути таким важким для розбору, просто треба по-справжньому переглянути документацію string.h, я думаю. Дякую за пораду!
Faithlesss

2
@Faithlesss Також погляньте на особливості редактора рядків , попередника текстових редакторів програм
Бергі

2

Ви повинні вирішити , як ви хочете ваш текстовий редактор для роботи.

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

Це означає, що вам потрібно буде виконати надзвичайно багато дизайнерських робіт, перш ніж писати свій перший рядок коду. Вам потрібно буде вирішити, як виглядає інтерфейс. Вам потрібно буде визначити, яку функціональність включити. Обидва вищезазначені питання будуть керуватися тим, що ви відчуваєте, що можете зробити. Якщо ви думаєте про "ідеальну" ситуацію (як би ви хотіли, щоб інтерфейс працював), але ви не відчуваєте себе здатним кодувати його, тоді вам потрібно почати дивитись на альтернативні підходи: як я можу змусити це працювати? Це допомагає зосередити вас на підходах до кодування, про які ви можете дізнатися більше.

Як говорили інші, намагання скопіювати vim не може бути найкращим підходом, оскільки це велика і складна база коду. Ви також заперечуєте себе проектними роботами, які, на мою скромну думку, допомагають округлити вас як розробника.

Це не означає, що вам потрібно буде розробити всю програму від початку до кінця, перш ніж написати перший рядок коду. Це нормально, щоб вимоги змінювалися з часом, коли ви дізнаєтесь більше. Добре додати нові функції, про які ти не думаєш, поки не тестуєш / не використаєш власний додаток, і ти не подумаєш: «Не було б непогано, якщо ...» Починати просто.


1

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

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

  • Вивчіть код якогось знайомого вам продукту. Якщо ви досвідчені vim, перегляньте це і спробуйте зрозуміти щось невелике та ізольоване, наприклад, як вони представляють дані, або шукайте один символ ( fкоманда).
  • Вивчіть код дуже простий програми і працювати ваш шлях звідти: catкоманда потім wcпотім grepпотім sed, наприклад.
  • Спробуйте написати програму, яка виконує лише одну функцію редактора. Може видалити другий символ у кожному рядку файлу (не записуючи його назад) або відобразити лише рядки від 50 до 70 файлу.

1
Не знаючи трохи про загальні зразки, я думаю, що зрозуміти навіть крихітний фрагмент такого великого проекту, як vim, буде марним. Хоча, дивлячись на дуже маленькі проекти з відкритим кодом, це гарна ідея. Я додам, що спроба зробити цілеспрямовану зміну такої програми була б чудовим способом навчитися. Перевага: ви дізнаєтесь деякі зразки, які використовуються в реальних програмах. Недолік: ви можете навчитися анти-шаблону так само добре.
подвійнеВи
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.