OpenSource auf Clojure

Run Loop lädt diejenigen ein, die coole Produkte mit ihren eigenen Händen herstellen. Nikita Prokopov ( Tonsky ) - ein Mann und ein Schiff - hat es geschafft, mehrere OpenSource-Projekte zu realisieren, die andere gerne nutzen.

Lassen Sie uns zunächst über die FiraCode-Schriftart Clojure und völlig andere Projekte sprechen, z. B. den ClojureScript-Wrapper für React. Kommen wir dann zu allgemeineren Diskussionen über gute Schnittstellen, gesunden Menschenverstand und Schulungsmodelle für Programmierer.



Über den Gast : Nikita Prokopov zeichnet sich dadurch aus, dass er FiraCode erstellt, einen wesentlichen Beitrag zur Entwicklung der Clojure-Community geleistet und Projekte wie Datascript und Rum in OpenSource veröffentlicht hat. Außerdem schreibt er unter macOS über Objective-C: Das AnyBar-Programm informiert Sie über das Auftreten eines Ereignisses in der Statusleiste, oh, Menüleiste Ihres Computers.

Moderatoren : Roman Busygin (Entwickler von Yandex.Music für iOS) und Alexey Mileev (App in the Air).

Nikita : Ich bin ein Programmierer aus Nowosibirsk, aber jetzt lebe ich in Moskau. Er war hauptsächlich mit Webprojekten beschäftigt, ich mag Schnittstellen. Vor kurzem habe ich in Clojure programmiert.

Roman : Ich schlage vor, das heutige Gespräch um Ihre Open Source- und öffentlichen Projekte herum aufzubauen. Ich möchte mit dem ersten und interessantesten für mich beginnen - es ist die FiraCode- Schriftart. Es wird von vielen meiner Kollegen und mir verwendet. Ich war immer daran interessiert, wie ich meine eigene Schriftart erstellen kann, wie es passiert, ob es ein spezielles Programm gibt, welche Kenntnisse Sie benötigen, um Ihre eigene Schriftart zu erstellen. Bitte erzählen Sie davon.

Firacode


Nikita : Es ist nicht ganz richtig zu sagen, dass dies meine Schriftart ist. Ich nahm die fertige Monospace-Schrift und fertige Ligaturen, ich habe selbst keine Buchstaben gezeichnet. Um die Briefe selbst zu machen, braucht man viel Erfahrung und Ausdauer. Es ist sehr schwierig, es gibt eine Million subtiler Feinheiten. Es gibt Amateur-Schriftarten und man kann immer sehen, dass sie ungeschickt sind, aber es ist nicht immer klar, was diese ungeschickte Sache ist.

Ich habe eine gute FiraMono-Schrift von Mozilla genommen und dort Ligaturen gezeichnet, dafür gibt es mehrere Programme. Ich habe das ziemlich beliebte Glyphs-Programm verwendet. Ich bin kein Experte für Schriftdesign, also habe ich mir angesehen, was andere verwenden, und ich habe es auch verwendet. Es mag überraschen, dass es ziemlich teuer ist, aber sie gaben mir eine Lizenz zur Entwicklung von FiraCode. Glyphen sind wie ein Vektorgrafik-Editor. Sie öffnen, es gibt Buchstaben, Sie finden Zellen und zeichnen Bilder. Alle Arten von Feinheiten, die mit Schriftarten verbunden sind, z. B. dass Buchstaben eine Größe, Ankerpunkte und Übergänge von fett zu nicht fett haben. Alles ist ganz einfach.

Interessanterweise gibt es in der OpenType-Schriftart eine Programmiersprache, auf deren Grundlage diese Ligaturen ersetzt werden. Ursprünglich wurde es als Mittel zur Implementierung aller Arten von Tricks in Schriftarten entwickelt. Zum Beispiel werden Ligaturen, wenn fi, ffi und dergleichen in regulären Schriftarten durch Ligaturen ersetzt werden. Außerdem gibt es Variabilität und Endstile von Buchstaben: Wenn sich ein Buchstabe am Anfang und Ende eines Wortes befindet, wird ihm ein Schwanz hinzugefügt. Dies alles kann mit kniffligen Mustern und den von ihm erstellten Ligaturen programmiert werden.

Roman : Wie lange hat es gedauert, den FiraMono auf die Art von FiraCode fertigzustellen, die jetzt jeder verwendet?

Nikita : Es wird schwierig zu berechnen sein. Die erste Version war nicht sehr schwierig. Wie immer fing alles ziemlich schnell an, aber es dauerte einige Zeit, um herauszufinden, was los war und wie man es umsetzt: Es gab nicht viele Beispiele.

Roman : Das heißt, es gab auch mehrere Versionen. Wie haben sie sich unterschieden?

Nikita : Ja, und die Versionen werden aktualisiert. Erstens beende ich neue Ligaturen, entferne manchmal alte, wenn sie in etwas in Konflikt stehen. Irgendwann änderte sich dort der Mechanismus zum Zeichnen von Ligaturen. Im Inneren gibt es ein sehr interessantes algorithmisches Problem: Es gibt eine lange Folge von Zeichen. Daraus müssen Sie die Kombinationen isolieren, aus denen die Ligaturen bestehen. Wenn sie sich jedoch überschneiden, muss es einen anderen Ersatz geben. Ich habe sogar ein Clojure-Programm, das eine Reihe von Regeln generiert, die dann in die Schriftart eingefügt werden - ziemlich schwierig. Dieses Ding hat sich geändert, die Methode zum Rendern von Ligaturen hat sich geändert. Früher wurden sie durch ein Zeichen ersetzt, jetzt werden sie durch drei ersetzt. Tatsächlich wird es für den Benutzer besser, weniger Fehler, mehr Ligaturen.

Roman : Interessant. Ich hätte nie gedacht, dass es Fehler in Schriftarten geben könnte. Die Regeln, nach denen der Maler entscheidet, wann Ligaturen eingefügt werden sollen und wann nicht, werden in einer speziellen Programmiersprache oder einfach deklarativ beschrieben?

Nikita : Deklarativ und dann intern recht effizient in die Ersatztabelle übersetzt.

Stellen Sie für die erste Version der Ligaturen ein


Roman : Sagen Sie mir, wann haben Sie eine Reihe von Ligaturen entwickelt, haben Sie sich bestimmte Programmiersprachen angesehen oder gibt es eine mehr oder weniger allgemeine Liste der Bedürfnisse der Menschen im Alltag?

Nikita : Ich bin selbst nicht auf diese Idee gekommen. Ich habe gesehen, dass es eine Hasklig-Schrift gibt, die speziell für Haskell hergestellt wurde. Aber ich brauchte Haskell nicht, also dachte ich, ich müsste die gleiche Schriftart erstellen, aber erstens basierend auf der Schriftart, die ich mag, und zweitens für jede Sprache. Dann nahm ich einfach alles , was mir einfiel . Erste Dinge liegen auf der Hand: <=,> =, ->, <-. Sie schreiben wie in C, aber es wird durch einen Pfeil ersetzt. Meiner Meinung nach hat alles angefangen.

Clojure


Alexei : Ganz am Anfang haben Sie erwähnt, dass Sie jetzt über Clojure schreiben. Sag mir, wie du zu Clojure gekommen bist, wie alles begann, wie du zu dieser Sprache gekommen bist?

Nikita : Ich habe ein paar Vorträge von Rich Hickey gesehen (ich empfehle zum Beispiel dies und das ). Sie sind cool und vielseitig in Bezug auf die Funktionsweise des Kopfes eines Programmierers und das Entwerfen von Systemen. Die Vorträge eröffneten mir eine große Menge wichtiger neuer konzentrierter Informationen, und ich war ein Fan von Rich Hickey. Dann interessierte er sich für das, was er getan hatte. Es stellte sich heraus, dass er die Clojure-Sprache machte. Ich ging, um es zu lesen, fand alles heraus und los ging's.

Roman : Ich kann auch als Fan von Rich Hickey aufgenommen werden. Ich habe seine Auftritte gesehen: Sie sind beide lang und vor allem interessant. Das heißt, er schafft es, die Aufmerksamkeit der Zuhörer für eine lange Zeit zu behalten.

Alexei : Was genau magst du an Clojure?

Nikita : Auf der letzten Konferenz machte Rich Hickey folgende Bemerkung:

Clojure ist eine Sprache für ältere, müde Programmierer.

Sie kommen zu Beginn einer Karriere nicht zu ihm, aber er wird nach 10-15 Jahren interessant. Zuallererst haben Sie absolute Freiheit. Alles, was Sie brauchen, tun Sie selbst oder nehmen Sie es aus den Bibliotheken. In der Sprache selbst ist ein Minimum an Dingen vernäht . Alles andere, was Sie entwerfen, tun genau das, was Sie brauchen. Alles ist hausgemacht und kann geändert werden. Dies ist gefährlich, wenn Sie Anfänger sind, aber nützlich, wenn Sie bereits Experte sind und wissen, was Sie brauchen.

In dieser Sprache wird das Denken so klar und kompakt wie möglich ausgedrückt. Das heißt, die minimale Lücke zwischen der Komplexität dessen, was Sie auszudrücken versuchen, und der Komplexität dessen, wie es geschrieben wird. In Java können Sie zum Beispiel etwas völlig Triviales tun, aber es wird sich über 10 Zeilen erstrecken und Sie werden müde. Wenn in Clojure etwas trivial ist, wird es höchstwahrscheinlich trivial in ein oder zwei Zeilen geschrieben.

Roman : Mir wurde klar, dass Sie meine Frage beantwortet haben. Als ich hörte, dass Clojure Ihnen keine Einschränkungen auferlegt, erinnerte ich mich aus irgendeinem Grund sofort an C, der auch irgendwie auf seinen Ohren stand. Aber dann hörte ich die Antwort, dass es schließlich nicht nur syntaktischer Zucker ist, sondern auch eine praktische, kompakte Sprache, mit der Sie Ihre Gedanken mit weniger Code ausdrücken können.

Nikita : Ja, es ist sehr hoch und C ist niedrig.

Alexei : Ich frage mich, ob eine solche Sprachfreiheit die Arbeit in großen Projekten mit einer großen Anzahl von Menschen nicht beeinträchtigt. Oder in OpenSource, wo Sie jede Änderung sorgfältig überwachen müssen? Soweit ich gehört habe, sind in Clojure Dinge erlaubt, bis die Syntax der Sprache geändert wird. Stört dich das nicht?

Es erinnert mich an die Situation mit Scala, in der die Sprache viele Dinge weiß und in jedem großen Projekt jeder in eine Art eigenen Rechen gehüllt ist. Infolgedessen kommen sie zu einer gängigen Praxis, die wir verwenden, und dies nicht. Infolgedessen sind Scala in einem Projekt und Scala in einem anderen zwei verschiedene Scala . Gibt es so ein Problem in Clojure?

Nikita : Ich habe nicht in besonders großen Projekten gearbeitet. Bei denen, in denen er arbeitete, gab es leichte Abweichungen. In der Tat tritt aus irgendeinem Grund eine solche direkte Verwirrung nicht auf. Es scheint mir, dass dies daran liegt, dass es in Scala beispielsweise Fans gibt, die theoretisieren und darüber spekulieren können, wie man etwas am richtigsten macht. Wie Sie sagten, gibt es von allem viel - das können Sie nicht wählen. In Clojure hingegen gibt es nicht viel - man kann nicht das Falsche wählen. Dies ist eine sehr praktische Sprache. Clojure macht keine Abstraktionen für die Zukunft. Wenn Sie beispielsweise etwas drucken müssen, drucken Sie einfach so praktisch wie möglich und machen sich keine Gedanken darüber, woher der Drucker stammt, welche Schnittstelle und welches Protokoll Sie implementieren. Sie tun genau das, was Sie brauchen. Daher ist diese Praktikabilität wahrscheinlich ein gemeinsamer Nenner.

Projekte bei Clojure


Roman : Soweit ich sehen kann, haben Sie mehrere Projekte auf Clojure auf GitHub. Erzähl uns mehr über sie.

Datascript


Nikita : Mein erstes relativ erfolgreiches OpenSource-Projekt ist Datascript . Dies ist der Client-Speicher für den Browser. Dies ist wahrscheinlich nicht sehr nützlich für die Site. Wenn Sie eine interaktive Anwendung im Browser schreiben, müssen Sie die Status irgendwo speichern. Datascript ist nur ein Repository für Zustände. Seine Chips:

  • Er ist unveränderlich . Das heißt, frühere Versionen werden nicht zerstört, sondern es wird lediglich eine neue Kopie des Speichers sehr effizient erstellt.
  • Er ist sortiert . Es unterstützt automatisch Indizes für Attribute, für jede Entity_ID usw. So finden Sie schnell alles, was Sie brauchen. alles was du brauchst.
  • Es ist flach . Wenn Sie nicht wirklich darüber nachgedacht haben, wie Speicher auf dem Client implementiert werden soll, ist das erste, was Sie tun, die Struktur von verschachteltem JSON. In Datascript ist der Speicher flach. Sie können jederzeit an einen beliebigen Ort gehen und das finden, was Sie benötigen.

Im Allgemeinen ist dies ein relativ bequemer Zugriff auf Daten in beide Richtungen: Sie können von Elternteil zu Kind oder auch von Kind zu Elternteil wechseln.

Für die Clojure-Community hat dies einen weiteren Vorteil: Es wird mit derselben API wie Datomic erstellt. Datomic ist eine Clojure-Datenbank. Wenn Sie Datomic kennen, kennen Sie Datascript, da sie dieselbe Schnittstelle haben. Dort gibt es auch Abfragen. Sie können Datenabfragen in der Datalog-Sprache schreiben. Ich fand diese Funktion für die Benutzeroberfläche nicht besonders nützlich, aber es gibt Leute, die dies nützlich finden. Dies ist SQL-ähnlich. Sie können die Bedingungen festlegen und Ergebnisse aus dem Client-Repository abrufen.

Roman : Bitte sagen Sie uns, warum Datascript einzigartig ist. Die Aufgabe, den Status auf dem Client in einer interaktiven Anwendung zu speichern, ist weit verbreitet. Es scheint, dass es bereits irgendwo entweder in die Sprache selbst oder in eine Art Rahmen eingebettet sein sollte. Sie haben sich jedoch entschieden, Ihre Entscheidung zu treffen. Was hat dich dazu veranlasst?

Nikita : Ich habe mich gefragt, ob ich kleine Datomic-Tools herstellen kann. Es war ein Interesse, ein bestehendes System zu wiederholen. Dann stellte sich heraus, dass dies tatsächlich eine gute Idee ist und es sehr bequem ist, den Status auf diese Weise zu organisieren und darauf zuzugreifen. In der JavaScript-Welt gibt es wahrscheinlich ähnliche Lösungen. Es gibt so etwas wie Relais. Soweit ich mich erinnere, löst es das Problem der Synchronisation und Datenspeicherung. Sie ist etwas ähnlich, ist aber meiner Meinung nach später aufgetaucht.

Rum


Alexey : Es gibt noch eine Rum- Bibliothek. Erzähl mir bitte von ihr.

Nikita : Rum ist nur ein React-Wrapper für ClojureScript. Reagieren ist cool, großartig und jeder mag es. Ich möchte es b in ClojureScript verwenden, um es zu verwenden. Er ist ein Java-Skript, aber ich möchte es in Clojurescript verwenden. In der ClojureScript-Welt gab es mehrere Lösungen, die jedoch allzu konzeptionell waren. Sie boten ihr Modell an, das intern React verwendete. Das heißt, nicht rein, sondern ein eigenes Konzept, das React verwendet.

Die Idee zu Rum entstand aus der Tatsache, dass Sie Datascript mit diesen vorherigen Ordnern nicht verwenden konnten, aber ich wollte es verwenden. Als Ergebnis kam ich zu einem Design, bei dem Rum die transparenteste und trivialste Bindung zu React ist. Wir bieten alles wie in React an, nur in einer praktischen Oberfläche für die Verwendung von ClojureScript. Es verbirgt nichts, Sie können zu den nativen Komponenten von React gelangen. Er ist ein Agnostiker, wie Sie möchten, und organisiert die Anwendung und Architektur.

Roman : Nach den Geschichten bekannter Schriftsetzer und allgemein in Richtung React und React Native sehe ich, wie verrückt Ihr Projekt an Popularität gewinnt. Sie sagten, es sei eine Hülle um React. Aber React ist ein riesiges Projekt, und Sie haben es geschafft, Rum sehr klein zu machen, ohne Tonnen von React-Quellen zu studieren. Wie hast du das gemacht?

Nikita : React ist eigentlich kein so großes Projekt. Alle wichtigen Elemente in React befinden sich in der Preact-Bibliothek, die nur 3 KB belegt. React hat eine ziemlich kleine API sowie eine Reihe von Hacks für neue Browser. Es macht wenig Sinn, Hacks zu lernen. Sie befinden sich alle in React.

Roman : Ist G6 Teil von React oder nicht?

Nikita : Offiziell - nein, dies ist eine separate Komponente.

Roman : Hast du es portiert oder beiseite gelassen?

Nikita : Nein, ich habe es nicht portiert. Sie verwenden es nicht in ClojureScript. In ClojureScript sind Code Daten und alles, was Sie nicht einmal für G6 benötigen, Sie haben bereits Ihre eigene vektorbasierte Syntax, die in der Clojure-Community akzeptiert wird. Mit den Daten präsentieren wir dasselbe, was in G6 durch das Makro und die Vorverarbeitung der Quellen gemacht wird.

Roman : Wow! Jetzt schlage ich vor, zum nächsten Projekt zu wechseln. Ich war sehr überrascht und erfreut, als ich sah, dass Sie, Nikita, das AnyBar- Projekt geschrieben haben - eine Menüleistenanwendung, die verschiedene Indikatoren in der Nähe der Uhr anzeigt. Überraschenderweise war mein erstes MacOS-Projekt auch eine Menüleistenanwendung, die Benachrichtigungen über neue Briefe von Yandex.Mail zeigte. Ich habe mir die Quelle angesehen und bin direkt zu den letzten 8 Jahren zurückgekehrt.

Das Projekt ist sehr einfach und beliebt. Sicherlich verwenden sie es für einige angewandte Aufgaben. Bitte sagen Sie mir, wie das Projekt entstanden ist, wie Sie es selbst verwenden oder ob Sie vielleicht wissen, wie jemand es verwendet.

Anybar


Nikita : Das Projekt ist ganz zufällig entstanden. Sie wissen, Programmierer lieben es, etwas zu schreiben, und hier. Clojure-Code muss nicht kompiliert werden, ClojureScript-Code jedoch. Jedes Mal, wenn Sie die Quelle ändern, wird sie neu kompiliert. Dies dauert einige Zeit: Ein Kaltstart dauert beispielsweise 30 bis 40 Sekunden und ein inkrementeller Build von einer Sekunde auf zehn Sekunden. Sie haben die Quelle geändert, zum Browser gewechselt und wissen immer noch nicht, ob Sie bereits sehen können oder noch warten müssen, da die Quelle nicht kompiliert wurde. Um dies zu wissen, habe ich mir einen Indikator ausgedacht.

Alle arbeiten hauptsächlich auf Laptops, es gibt nicht viel Platz, wo man es bekommt. Sie müssen zum Terminal wechseln und warten, bis alles im Terminal kompiliert ist, und dann zum Browser wechseln. Um nicht wieder zum Terminal zu gehen, habe ich mir in der Menüleiste einen Indikator gemacht, der den Status des Builds anzeigt: Er wird kompiliert, kompiliert und mit einem Fehler kompiliert. Wenn ein Fehler auftritt, müssen Sie die Seite nicht hundertmal aktualisieren, es wird jedoch nichts angewendet.

Ich habe es nicht auf eine bestimmte Art und Weise gemacht, aber ich habe es so universell wie möglich gemacht. Um die Farbe des Indikators in AnyBar zu ändern, müssen Sie nur ein UDP-Paket senden. Dies ist die einfachste Art der gegenseitigen Kommunikation. Es stellt sich heraus, dass dies eine super flexible Sache ist, die für das Skript trivial ist. Ich habe hauptsächlich nur für den Build-Status verwendet.

Jemand hat zum Beispiel kürzlich getwittert, er habe einen Indikator für den Status von freien Plätzen in der Botschaft gemacht. Damit Sie sofort einen Termin vereinbaren können, wenn ein Platz frei ist. Es wurde auch in AnyBar angezeigt.

Roman : Nikita, funktioniert dieses Ding nur auf Localhost, oder kann meine virtuelle Maschine in Holland meinen Laptop anpingen und etwas in der Menüleiste anzeigen?

Nikita : Wenn Sie ein UDP-Paket von Ihrer virtuellen Maschine für einen Laptop senden können, dann ja.

Alexei : Nachdem ich von der Kaltbauzeit von 30-40 Sekunden und dem heißen Nachladen für ein oder zwei Sekunden gehört habe, kann ich natürlich nur die Android-Welt beneiden. Aber hier habe ich diese Frage: Wurde das Ganze mit einer Reihe von vorgefertigten Shell-Skripten überwachsen, vorgefertigten Plug-Ins, die Sie nicht einmal schreiben können, sondern einfach angeschlossen haben, damit alles sofort funktioniert?

Nikita : Es ist nicht überwachsen, weil ich es nicht sehr oft gemacht habe. Ich bin sogar überrascht, dass jemand anderes interessiert ist. Es gibt viele Dinge: viele Ideen, sogar viele Klone. Die Benutzer möchten Text oder mehrere Indikatoren usw. anzeigen. Ich wollte das alles tun, aber meine Hände reichten nicht.

grumpy.website


Alexei : Fahren wir mit Ihrem nächsten Projekt fort. Sag mir, was grumpy.website ist.

Nikita : grumpy.website ist ein Blog über Beispiele für schlechte Schnittstellen. Wir sammeln alle Pfosten in den Schnittstellen von Computer und Nicht-Computer, diskutieren, beschweren uns darüber.

Alexey : Wie lange ist diese Seite schon erschienen?

Nikita : Vor ungefähr einem Jahr.

Alexei : Wie viele Leute posten dort etwas?

Nikita : Dies ist ein Autorenprojekt, wir haben jetzt vier Autoren. Wir posten hauptsächlich, aber fünf weitere Personen senden regelmäßig ihre Vorschläge. Dies ist eine komplett benutzerdefinierte Engine, die auf Clojure live auf meinem YouTube-Kanal geschrieben wurde . Es wurden 13 bis 14 Ausgaben ausgestrahlt, deren vollständige Beschreibung in Gist enthalten ist . Wenn Sie daran interessiert sind, eine Webanwendung auf Clojure von Grund auf neu zu erstellen, können Sie sehen.

Roman : Wurde dieser Kurs bereits abgeschlossen oder wird das Projekt noch abgeschlossen? Veröffentlichen Sie die Notizen, während sie abgeschlossen werden?

Nikita: Es ist eher ein Videoblog. Es endete in dem Zustand, in dem sich grumpy.website jetzt befindet - in Echtzeit. Was ist jetzt auf der Website, dann auf dem Blog.

Design und Benutzerfreundlichkeit


Roman : Sie als die Person, die das Projekt über die Dummheiten des Interface-Designs angesprochen hat, kennen sich höchstwahrscheinlich mit Design und Benutzerfreundlichkeit aus. Wie bist du in dieses Gebiet gekommen? Wie sind Sie darauf aufmerksam geworden?

Nikita : Es ist ziemlich früh passiert, zu Beginn einer Karriere. Ich war an Webprojekten beteiligt, und es schien mir, dass ich verstehen musste, was wir taten, um die Schnittstellen gut zu machen. Es gab das Gefühl, dass mit Computerschnittstellen nicht alles in Ordnung war.

Ich habe mehrere berühmte Bücher gelesen und alles klang sehr vernünftig. Einerseits müssen Sie nach guten Schnittstellen Ausschau halten. Gesunder Menschenverstand dagegen. Um grumpy.website zu lesen, müssen Sie kein Experte für die Benutzeroberfläche sein. Der gesunde Menschenverstand reicht aus, um zu verstehen, dass dies Horror-Horror ist.

Roman : Ich erinnere mich, dass ich nach dem Lesen des Buches „Design vertrauter Dinge“ von Donald Norman wirklich mehr sah. Aber vorher habe ich diesen Unsinn benutzt, diese Fehler und meine Augen klebten nicht.

AppsConf-Bericht


Alexey : Nikita wird auf der AppsConf mit dem Bericht „ Skills Acquisition “ sprechen. Nikita, erzähl mir, wie ein solcher Bericht entstanden ist.

Nikita : Ich habe einen Bericht über das Driftfus-Modell gesehen. Dies ist ein Modell für den Erwerb von Fähigkeiten, nach dem jede Person, die ein neues Fach studiert, verschiedene Phasen durchläuft: Anfänger, kompetent, Spezialist, Experte, Meister. Ich ging zum Lesen, fand heraus, was diese Ebenen sind, wie sie sich unterscheiden, fand heraus, wie es auf die Programmierung ankommt und was ich rund um das Programmieren sehe: Kurse, Bücher, Diskussionen im Internet, die Programmiersprachen der Geräte. Das heißt, es bezieht sich auf verschiedene Ebenen des Programmierers oder der Programmierung. Es stellte sich heraus, dass dies ein interessantes Modell ist, das viele Dinge erklärt. , , .

, : , . — , — . . , , , .

: , , , , , . , . , .
AppsConf — 8 9 . . ( : , ), .

YouTube- , .

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


All Articles