Was ich verstanden habe und auf welche Probleme ich beim Erstellen eines Hacker News-Klons gestoßen bin



Von einem Übersetzer: Dieser Artikel ist eine gekürzte Übersetzung des ursprünglichen Beitrags des Webentwicklers Jesse Horne. Sein Job und gleichzeitig sein Hobby ist Webdesign. Jesse teilt ihre Best Practices und gewonnenen Erkenntnisse oft mit anderen erfahrenen Programmierern und Anfängern.

Vor einiger Zeit schrieb ich einen ziemlich umfangreichen Beitrag über Hacker News, der von den Lesern solide Unterstützung erhielt. Ich machte auf die Fähigkeiten dieser Ressource aufmerksam und beschloss , einen Klon davon zu erstellen , um neue Erfahrungen und Kenntnisse zu sammeln.

Skillbox empfiehlt: Einen praktischen einjährigen PHP-Entwicklerkurs .
Wir erinnern Sie daran: Für alle Leser von „Habr“ - ein Rabatt von 10.000 Rubel bei der Anmeldung für einen Skillbox-Kurs mit dem Aktionscode „Habr“.

Anfangs schien mir dies ein großes Ziel zu sein, bei dem die Werkzeuge und Taktiken der Arbeit vorgegeben waren. Zuvor habe ich an kleineren Aufgaben mit verschiedenen Sprachen und Frameworks gearbeitet. Das einzige, was es nicht gab, war ein großes Projekt, das es ermöglichen würde, all dies zusammenzubringen.

Ich habe mich entschlossen, mit der Crystal-Sprache von Grund auf an einem neuen Projekt zu arbeiten. Dies ist ein praktisches Werkzeug, das auch neu ist. Es ist schnell, die Prinzipien der Arbeit damit sind ähnlich wie bei Ruby. Es ist statistisch typisiert und ist Open Source. Aber nur eine neue Sprache reicht auch nicht aus, deshalb habe ich beschlossen, meine Aufgabe zu verkomplizieren und keinen Klon von Hacker News zu erstellen, sondern eine verbesserte Version dieser Ressource.

Übrigens dachte ich, das Erstellen eines regulären Klons wäre eine einfache Aufgabe. Und die Tatsache, dass dies nicht so ist, wurde mir etwas später klar, als ich mit der Arbeit begann.

Fegen Sie nicht zu hoch

Ich möchte nicht sagen, dass Sie sich keine ehrgeizigen Ziele setzen sollten. Versuche die Sterne mit oder ohne Dornen zu erreichen. Träumen ist nützlich. Der Versuch, das zu erreichen, was ich vorher nicht konnte, ist notwendig, um auf der professionellen Leiter erfolgreich voranzukommen.

Ich sagte, dass Sie nicht versuchen sollten, sofort in die Embrasur einer komplexen und großen Aufgabe zu stürzen . Wählen Sie aus, was Sie zu einem bestimmten Zeitpunkt benötigen, um die Idee umzusetzen. Außerdem empfehle ich, wichtige Ziele in kleinere zu zerlegen. Wenn Sie zu viel Code haben, in dem sich viel „Müll“ befindet, versuchen Sie, alles zu vereinfachen und zu strukturieren.

Ich kann nicht einmal in Worte fassen, wie wichtig es ist, eine große Aufgabe in mehrere kleinere aufzuteilen.

In meinem Fall stieß ich auf verschiedene neue Probleme, auf die ich zuvor noch nicht gestoßen war. Erstens habe ich Crystal nur einmal bearbeitet - als ich eine Anwendung erstellt habe, deren Komplexität nicht viel höher war als die Komplexität eines Programms wie „Hallo Welt!“. In der Vergangenheit habe ich Python, Lua, PHP verwendet. Die neue Sprache war das erste Hindernis für die Umsetzung des Projekts.

Der zweite war der Rahmen . Crystal ist eine neue Sprache und verfügt immer noch nicht über zu viele Frameworks und Dokumentationen. Ich habe beschlossen, Kemal für meinen Klon zu verwenden. Ich hatte gehofft, dass das Framework intuitiv ist, da ich genau das in meiner Arbeit getroffen habe. Aber hier war ein anderer Fall - einzelne Dinge waren nicht leicht zu verstehen. Zum Beispiel sahen einige Abschnitte des Codes ganz normal aus, funktionierten aber aus irgendeinem Grund nicht. Aus demselben Grund war es schwierig, die Ursache des Problems im Internet zu finden - der Neuheit der Sprache und des Frameworks selbst. In einigen Fällen musste ich lange innehalten und mich mit der Ursache des Problems befassen. Bis jetzt habe ich mir noch nie die Quelle angesehen, zum Beispiel dieselbe Flasche.

Das dritte Hindernis sind die spezifischen Ziele, die ich für das Projekt ausgewählt habe. Um meinen Klon nützlicher zu machen, habe ich beschlossen, eine Reihe von Funktionsmerkmalen hinzuzufügen. Ich habe früher mit Hacker News gearbeitet, daher weiß ich viel über die Vor- und Nachteile dieser Ressource. Mir kam der Gedanke, dass es gut wäre, die von GitHub bereitgestellten Analysen zu nutzen. Mit ihnen konnte ich Statistiken über die Anzahl der Ansichten und Benutzeraktivitäten auf der Site hinzufügen.

Daher habe ich beschlossen, dass mein Klon mindestens Ansichten und Klicks für jeden Beitrag anzeigen soll. Eine solche Funktion wäre wahrscheinlich für Benutzer nützlich, und ihre Implementierung wäre für mich eine gute Praxis. Aber ich hätte nicht gedacht, dass es so lange dauern würde! Jetzt ist das Projekt eher ein Proof-of-Concept als eine fertige Ressource. Zusätzlich zu Ansichten und Klicks habe ich beschlossen, eine Anzeige der angezeigten Kommentare hinzuzufügen, damit sie in Echtzeit angezeigt werden. Ohne diese zusätzliche Aufgabe wäre das Projekt viel schneller abgeschlossen worden.

Jetzt unterstützt das Projekt die Autorisierung, Veröffentlichung und Sortierung von Beiträgen, die Interaktion mit anderen Benutzern durch Kommentieren und Anzeigen von Profilen usw.

Das vierte Problem, mit dem ich konfrontiert bin, ist das Chaos. Migrationen, Modelle, Ansichten, API-Controller, CSS- und JavaScript-Code häufen sich sehr schnell an. Und das alles wird zu einem Chaos. Ich habe versucht, das Problem zu lösen, und es ist mir fast gelungen. Aber teilweise problematische Stellen im Code meines Projekts treten immer noch auf - Sie können es leicht bemerken. An vielen Stellen wird der Code wiederholt, Endpunkte sind nicht organisiert, die Benennung ist kompliziert, was zu einer Erhöhung der Codemenge und einer großen Anzahl von Abfragen an die Datenbank führt. Allmählich löse ich dieses Problem.

An vielen Stellen wird der Code wiederholt

Als das Projekt begann, löste ich Probleme, wie sie auftraten. Zum Beispiel musste überprüft werden, ob der Benutzer authentifiziert ist - und ich fand eine ursprüngliche Lösung, die je nach Route etwa drei Zeilen dauerte. Ich hatte es eilig, die gefundenen Lösungen umzusetzen.



Im Allgemeinen musste ich von Anfang an den Prinzipien von DRY folgen. Wiederhole dich nicht! Ich musste ein Zwischenprogramm schreiben, das das Notwendige tat, und dann einfach die Lösung anwenden, die in den Fällen gefunden wurde, in denen es erforderlich war. In Zukunft werde ich mein Projekt nach diesem Prinzip anpassen.

Benennung und Organisation von Endpunkten

Ich habe die API im Pioneer-Team entwickelt. Wir haben REST verwendet , einen Architekturstil, den ich als neues Mitglied des Pioneer-Teams geschworen habe. In diesem Team habe ich an den kleinen Elementen einer großen Anwendung gearbeitet. Aber in meinem neuen Projekt musste ich alles von Grund auf neu schreiben.

Eine "RESTful API" muss eine einheitliche Schnittstelle haben, wie das Wiki sagt. In meinem Projekt habe ich alles so organisiert, dass die Endpunkte in Quelldateien definiert wurden, die nach Funktion oder Zweck aufgerufen wurden. Die Registrierung und das Verlassen der Anwendung wurden in "auth.cr" registriert. Der Benutzername wurde in "user.cr" registriert.

Zweifellos muss dieser Teil bearbeitet werden. In Zukunft werde ich alles so organisieren, dass sich die Aktionen auf den Endpunkt "/ user" beziehen, einfach weil dies alles mit "User" zusammenhängt. Um beispielsweise die Struktur des Projekts zu verbessern, werde ich den Code in bequemere und verwaltbarere Teile mit einer großen Anzahl von Dateien aufteilen. Ich werde den Ordner "src / user / auth /" erstellen, der die Funktionen Login, Registrierung und User-Exit aus der Anwendung enthält.

1_6dy_OCE7_Cjj_Df7_A0s_Aj_3i_Q

Zu viele Anfragen

In diesem Projekt versuche ich meine Ideen zu skalieren. Derzeit werden zu viele Abfragen an die Datenbank gestellt. Wenn die Anwendung also hundert Benutzer hätte, würde ich einfach verrückt werden und herausfinden, wie viele Datenbankabfragen alle paar Sekunden ausgeführt werden. Jetzt aktualisiert der Client den Status von Nachrichten alle 10 Minuten. Darüber hinaus bestimmt der Beitrag zyklisch, ob er vom Benutzer angezeigt wurde. Bei jeder Überprüfung erfolgt eine Anforderung an die Datenbank, die gemäß dem aktuellen Filter ausgeführt wird. Und das alles belastet den Server erheblich.



Alles, was oben beschrieben wurde, sind nur Beispiele für Probleme, auf die ich ständig stoße. Ich kann sie nicht vollständig beschreiben. Jetzt denke ich jedoch darüber nach, meine Probleme und Lösungen zu dokumentieren. Ich hoffe, dass all dies anderen Programmierern hilft, meine Fehler zu sehen und zu verstehen und ihre eigenen zu vermeiden. Ich weiß, dass ich die Ausführung von Abfragen beschleunigen kann, wenn ich eine Kombination aus Redis und MySQL oder Postgres verwende. Aber jetzt werde ich darauf eingehen.

Ich hoffe, Ihnen hat der Artikel gefallen und Sie konnten etwas Nützliches für sich selbst lernen.

Skillbox empfiehlt:

Source: https://habr.com/ru/post/de425099/


All Articles