
来自翻译:本文是Web开发人员Jesse Horne原始
帖子的节选翻译。 他的工作和业余爱好是网页设计。 杰西经常与其他经验丰富和初学者的程序员分享她的最佳实践和经验教训。
不久前,我在Hacker News上写了一篇相当多的文章,得到了读者的大力支持。 我提请注意此资源的功能,并决定尝试
创建该资源
的副本,以获得新的经验和知识。
Skillbox建议:一门实用的一年期PHP开发人员课程。
我们提醒您: 对于所有“ Habr”读者来说,使用“ Habr”促销代码注册任何Skillbox课程时均可享受10,000卢布的折扣。
最初,在我看来,这是一个伟大的目标,其中预先确定了一套工具和工作策略。 以前,我使用不同的语言和框架从事较小的任务。 唯一没有的是,有一个大型项目可以将所有这些整合在一起。
我决定使用Crystal语言从头开始一个新项目。 这是一个方便的工具,也是一个新工具。 它很快,使用它的原理类似于Ruby。 统计类型是加号,而且是开源的。 但是仅仅使用一种新的语言也是不够的,因此我决定使我的任务复杂化,并且不仿制Hacker News,而是改进此资源。
顺便说一句,我认为创建常规克隆将是一件容易的事。 事实并非如此,后来我意识到,开始工作了。
不要扫得太高我不想说你不应该设定宏伟的目标。 尝试到达有或没有刺的星星。 做梦是有用的,要想达到我以前无法做到的目标,对于在职业阶梯上取得成功是必要的。
我说过,您不应该立即着手
处理一项复杂而又艰巨的任务。 选择在特定时刻实施此想法所需的内容。 此外,我建议将重要目标分解为较小的目标。 如果您的代码太多,其中包含大量的“垃圾”,请尝试简化和构造所有内容。
我什至无法说出将一个大任务分成几个小任务有多么重要。
就我而言,我遇到了以前从未遇到过的各种新问题。 首先,我只能使用Crystal一次-创建一个应用程序时,其复杂度不会比“ Hello,world!”之类的程序的复杂度高很多。 过去,我使用Python,Lua,PHP。 新语言是项目实施的第一个障碍。
第二个是框架 。 作为一种新语言,Crystal仍然没有太多的框架和文档。 我决定将Kemal用于克隆。 我希望框架是直观的,因为我在工作中遇到了这种情况。 但是这是另一种情况-个人的事情不容易理解。 例如,代码的某些部分看上去很正常,但是由于某些原因却无法正常工作。 由于相同的原因-语言和框架本身的新颖性,很难在Internet上找到问题的原因。 在某些情况下,我不得不停下很长时间来处理问题的原因。 直到现在,我还没有研究过源代码,例如同一瓶烧瓶。
第三个障碍是我为该项目选择的具体目标。 为了使克隆更有用,我决定添加一些功能。 我之前曾与Hacker News合作,所以我对该资源的优缺点了解很多。 在我看来,最好利用GitHub提供的分析。 使用它们,我可以添加有关站点上的视图数量和用户活动的统计信息。
因此,我决定我的克隆应至少显示每个帖子的视图和点击次数。 这样的功能可能对用户有用,并且它的实现对我来说是一个好习惯。 但是我没想到会花这么长时间! 现在,该项目更多是概念验证,而不是现成的资源。 除了查看和单击之外,我还决定添加显示的注释的显示,以便它们实时显示。 如果不执行这项额外任务,该项目将更快完成。
现在,该项目支持授权,帖子的发布和排序,通过评论和查看配置文件与其他用户进行交互等。
我面临
的第四个问题是混乱。 迁移,模型,视图,API控制器,CSS和JavaScript代码积累得非常快。 所有这一切都变成一团糟。 我试图解决问题,但我几乎成功了。 但是在我的项目代码中仍然存在部分问题的地方-您可以轻松地注意到它。 因此,在许多地方重复代码,端点没有组织,命名很复杂,这导致代码数量增加和对数据库的大量查询。 我逐渐解决了这个问题。
在很多地方重复代码当项目开始时,我解决了出现的问题。 例如,有必要检查用户是否已通过身份验证-我找到了一个原始解决方案,该路线花费了三行左右的路线。 我急于实施找到的解决方案。

总的来说,我从一开始就必须遵循
DRY的原理。 不要重复自己! 我需要编写一个中间程序来执行必要的工作,然后在需要时简单地应用在那些情况下发现的解决方案。 将来,我将根据此原则调整项目。
端点命名和组织我曾经在先锋团队中开发API。 我们使用了
REST ,这是我作为先锋团队的新成员真正发誓的一种架构风格。 在这个团队中,我研究了大型应用程序的小部分。 但是在我的新项目中,我不得不从头开始编写所有内容。
如Wiki所述,“ RESTful API”必须具有统一接口。 在我的项目中,我组织了所有工作,以便在源文件中定义端点,并根据功能或目的对其进行调用。 注册和退出应用程序已在“ auth.cr”中注册。 用户名已在“ user.cr”中注册。
无疑,这部分需要处理。 将来,我将整理所有内容,使操作与“ /用户”端点相关,仅因为所有这些都与“用户”相关。 例如,为了改善项目的结构,我将代码分为带有大量文件的更方便和更易于管理的部分。 我将创建文件夹“ src / user / auth /”,其中包含登录,注册和从应用程序退出的功能。
请求太多在这个项目中,我正在尝试扩展我的想法。 当前正在对数据库进行太多查询。 因此,如果该应用程序有一百个用户,我将疯狂地尝试找出每几秒钟执行多少个数据库查询。 现在,客户端每10分钟更新一次消息状态。 另外,帖子周期性地确定用户是否已查看它。 在每次检查期间,都会发生对数据库的请求;这是根据当前过滤器执行的。 所有这些都极大地加载了服务器。

上面描述的所有内容只是我一直遇到的问题的示例。 我无法完整描述它们。 但是,我现在正在考虑记录问题和解决方案。 我希望所有这些都将帮助其他程序员看到并理解我的错误并避免自己的错误。 我知道,如果我结合使用Redis和MySQL或Postgres,则可以加快查询的执行速度。 但是现在我将对此进行详细介绍。
我希望您喜欢这篇文章,并且能够学习一些对自己有用的东西。
Skillbox建议: