当您不知道某物如何实际工作时,该如何编码?[关闭]


14

我最近学习了C,并且想启动一个项目来巩固我的知识。我决定制作一个非常简单的文本编辑器,例如vim。我面临的问题是,我真的不知道文本编辑器的工作原理,也不知道可以从谷歌那里学到什么。

对其进行谷歌搜索导致了vim的GitHub回购,这对我来说毫无用处,因为代码库很大而且代码使我感到困惑。我还找到了使用C制作文本编辑器的教程,其功能类似于vim。

尽管我考虑过学习这些教程,但感觉却像在作弊。vim开发人员如何在没有特定教程的情况下弄清楚如何编码vim?还是从更简单的文本编辑器开始?他们如何仅从语言知识及其文档中找出答案?

在不直接遵循教程的情况下开始编写此文本编辑器到底需要什么?我想想到的另一个示例是:Dennis Ritchie和Ken Thompson如何编写Unix的代码?我对OS的功能有所了解,但对如何将其放入代码中一无所知。我想念的是什么?如何将这种语言知识转化为实际的实际使用?


14
您正在将自己与具有悠久历史和杰出人才的项目进行比较。Unix起源于一个具有多年系统级编程经验的研究小组,并从更复杂的Multics OS的经验中受益。Vim是基于vi的,而vi是基于ed的。这些程序并没有突然出现,它们是由数百人构建的演变。因此,当您发现很难跳过所有这些历史记录时,请不要感到沮丧。没有人可以。取而代之的是,尝试做您所理解的范围内的项目–就在您掌握的范围内,但仍然充满挑战。
阿蒙(Amon)

8
您刚刚学会了在木琴上演奏一些乐曲,现在您想在大型国际乐团中演奏吗?来吧,您期望太多了。编程就像弹奏乐器-您从小而简单的旋律开始,经过几年的练习,您学会了演奏交响曲。
布朗

3
同意 以此为契机,您可以学到许多新手很难学到的东西。从小开始。并且也要阅读vim的代码。阅读现有代码可以学到很多。
Laiv

17
您的根本问题是思维不够清晰。您说“像vim这样的简单文本编辑器”,然后立即注意到它的代码库巨大且令人困惑,从而立即进行跟进。这应该向您发出强烈的信号,表明没有什么比vim更简单的了。即使是经验丰富的程序员也会陷入您所陷入的心理陷阱。您尚未了解的事情并不简单。它们很复杂。计算机编程正在将思维逻辑变为现实。首先要更清楚地思考编程。
埃里克·利珀特

4
另外,不要担心“作弊”。这不是游戏。您有目标,而他们是好目标。做您需要实现这些目标的事情。您认为专业的计算机程序员在想要学习某些东西的工作原理时不会看源代码吗? 学习如何从您没有写的源中学习是最重要的编程技能之一,因此请开始练习。
埃里克·利珀特

Answers:


17

如果这是您的第一个编程项目,那么即使是简单的文本编辑器也可能过于复杂。vim或OS之类的东西完全是不可能的。

解决问题

通常,大多数项目的入门方法大致相同,但是:

  • 您收集了需求。什么确切地将软件吗?
  • 你开始用非常少的要求,然后由位添加功能位。
  • 您将当前需求带来的问题分解为子问题。
  • 您将不断分解子问题,直到您知道如何实现。

让我们以文本编辑器为例。

  • 您想在屏幕上显示一部分文本文件,插入和删除字符并保存当前版本。

  • 从仅读取文件并显示其内容开始。

  • 您将(其中包括)识别以下子问题:

    • 我怎么知道要显示的文件名?
    • 给定文件名,如何获取文件内容?
    • 给定文件的内容,如何显示它们?

一旦达到要求(加载文件并显示)的位置,就可以开始考虑如何仅显示适合屏幕的部分,浏览文件等。

下一步

随着时间的推移,当您处理越来越复杂的问题时,您会发现,找到合适的方法来分解问题变得越来越困难。您还会注意到,随着时间的推移,更改代码可能变得很乏味。

到那时,是时候学习一些基本的体系结构和设计概念了。


嘿,谢谢你的建议!我想我会采用这种方法。在改变主意方面,我有点固执,但是根据您的建议,我想我将尝试了解如何制作文件查看器。也许还可以添加某种方式来显示文件元数据?我大概可以自己弄清楚。非常感谢!
Faithlesss

2
除此之外,“如何显示它们”可以进一步分解为在屏幕上的特定位置写入特定字符(如果我们正在谈论命令行编辑器),这应该是可以做到的。轻松找到在线答案。
迪克林18'Feb

2
“即使是简单的文本编辑器也可能过于复杂”,文本编辑器异常复杂。想象编辑一个20 MB的文件。足够大,需要缓冲,但又不够大,无法对现代计算机增加负担。您需要能够滚动浏览,插入和删除文本,实时重新排列文本本身,滚动条标记会随着其背后的模型变化而实时更新。如果您有任何类型的格式设置,这将变得更加复杂。

15

你不知道

如果您甚至不知道如何做某事,则表明它超出了您当前的技能。因为如果您不知道如何开始,那么在应用程序最困难的部分肯定就不会有任何想法。


从那时开始,什么是一个好的项目?我已经制作了自己的子手游戏(在终端机中)以及井字游戏。我只是没有找到继续的方法,所以我认为文本编辑器将是一个好主意。
Faithlesss

3
@faithlesss-读取和写入文件的操作似乎是基本的中间步骤。
Telastyn

9
一个文件浏览器可能是一个很好的项目,然后,例如像寻呼机lessmoreview程序。它们共享编辑器的某些方面,而没有可变的编辑缓冲区的复杂性。
阿蒙(Amon)

@Telastyn我明白了。然后要制作一个文件查看器,可能是一个可以读取基本文本格式的简单文件查看器,然后继续研究如何读取类似json或csv文件的内容?解析它应该不难,只需要真正查看一下string.h文档即可。谢谢你的建议!
Faithlesss

2
@Faithlesss还可以看看行编辑器(文本编辑器程序的前身)的功能
Bergi,

2

你需要决定如何你的文本编辑器来工作。

这是从头到尾开发自己的项目中最令人沮丧和最有意义的经历之一。没有人向您发送构建要求。您需要开发自己的需求。

这意味着在编写第一行代码之前,您需要做大量的设计工作。您需要确定界面的外观。您需要确定要包括的功能。以上两个问题都将以您的能力为指导。如果您想到了“理想”的情况(您希望接口如何工作),但是您不觉得有能力对其进行编码,那么您需要开始研究替代方法:我如何才能使它工作?这有助于您将注意力集中在您可能想了解更多的编码方法上。

正如其他人所说,尝试复制vim并不是最佳方法,因为它是一个庞大而复杂的代码库。以我的拙见,您还否认自己所做的设计工作有助于您进一步发展为开发人员。

这并不意味着您在编写第一行代码之前就需要从头到尾设计整个应用程序。随着您了解更多,需求可以随时间变化。可以添加直到您正在测试/使用自己的应用程序时才想到的新功能,并且您会认为,“如果...这样会不会很好”,从简单开始就可以。


1

从头开始编写功能齐全的文本编辑器而没有编程经验是愚蠢的:您会灰心并且在学习之前放弃它。

我想到了几种选择:

  • 研究您熟悉的某些产品的代码。如果您精通vim,请仔细研究一下并尝试了解一些小而孤立的内容,例如它如何表示数据或搜索单个字符(f命令)。
  • 学习一个非常简单的程序的代码,cat然后从那里开始:先 执行命令,wc然后grepsed执行例如。
  • 尝试编写仅具有编辑器单个功能的程序。也许删除文件的每一行中的第二个字符(不回写),或者仅显示文件的第50至70行。

1
在不了解通用模式的情况下,我认为即使是对像vim这样的大型项目的很小一部分的了解,也是徒劳的。不过,查看很小的开源项目是一个好主意。我要补充一点,尝试对此类程序进行有针对性的更改将是一种学习的好方法。优势:您将学习实际程序中使用的一些模式。缺点:您可能也会学习反模式。
doubleYou '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.