apitable-Interview-Erfahrung

Hintergrundeinführung: Vika ist ein auf Internetprodukte spezialisiertes Unternehmen und apitable ist ihr Unternehmen für Open-Source-Online-Bürotools für die Zusammenarbeit. Alle Mitarbeiter des Unternehmens arbeiten remote, und die Rekrutierung umfasst React-Front-End, Java-Back-End und andere Positionen Ich dachte darüber nach, es mit einem Vorstellungsgespräch zu versuchen

Herkunft

In letzter Zeit war ich auf der Suche nach verschiedenen Remote-Jobs und habe gesehen, dass das Unternehmen Leute auf der Direktrekrutierungsplattform rekrutiert, also habe ich mich beworben.

Erstrundenspiel

Nach der Kommunikation mit der Personalabteilung war es der anderen Partei egal, was passierte, sie kopierte einfach einen großen Absatz und fügte ihn ein, was ungefähr bedeutete: „Unser Produkt ist Open Source auf Github. Wenn Sie sich für eine Stelle bewerben möchten, müssen Sie den Quellcode herunterladen.“ „Sie können es selbst erstellen und entwickeln. Führen Sie das gesamte Projekt in der Umgebung aus“, und es wird behauptet, dass erfahrene Ingenieure es in einer Minute erledigen können.
Als Person, die sich für eine Position in der Front-End-Entwicklung bewarb, musste ich eine Reihe mehrsprachiger Full-Stack-Entwicklungsumgebungen gemäß den Anweisungen herunterladen und viel Zeit damit verbringen, verschiedene Probleme zu lösen, die in den Anweisungen nicht erwähnt wurden Es hat einen Tag gedauert, bis es endlich fertig war.
Wenn ich an den vorherigen Absatz zurückdenke, weiß ich nicht, welcher Meister damit geprahlt hat, dass Haikou in einer Minute erledigt werden kann. Ich möchte nur lachen. Lassen Sie mich ihnen entsprechend den Anforderungen dieses Projekts eine grundlegende Umgebung zur Verfügung stellen und dann lassen Ihre Mitarbeiter in der Entwicklungsabteilung bauen es. Wenn die Netzwerkgeschwindigkeit garantiert ausreichend ist, ist garantiert, dass es nicht in einer Stunde erledigt ist.
Nachdem die Entwicklungsumgebung ausgeführt und bei Bedarf erfolgreiche Screenshots gesendet worden waren, schickte die Personalabteilung einen weiteren Link mit der Aufforderung, hineinzuklicken, ihn auszufüllen und es ihr mitzuteilen.

seltsame Form

Das Ausfüllen dieser Formularinformationen, die als Formular bezeichnet werden, ähnelt eigentlich eher einem schriftlichen Test, da die beiden wichtigsten darin enthaltenen Fragen darin bestehen, dass ich die Funktion eines benutzerdefinierten Formularfelds direkt in meinem Projekt entsprechend dem bereitgestellten Problem implementieren kann andere und senden den Code, und die andere besteht darin, mich zu bitten, ein Problem anzusprechen und schließlich die Zeit zu melden, die zum Ausfüllen des Formulars benötigt wurde. Die Optionen sind nur „innerhalb von 5 Minuten/30 Minuten/innerhalb von 1 Stunde/mehr als“. 1 Stunde". Im Ernst, die Ergebnisse dieser Art von kostenloser Prostitution zu sehen ist dasselbe. Ich wollte den schriftlichen Test ein wenig aufgeben, aber ich habe ihn mir trotzdem mit einer Forschermentalität angeschaut, aber er war noch nicht abgeschlossen. I Ich habe gerade die Idee aus der Perspektive des halben Produkts und der halben Entwicklung erläutert und auch die während des Forschungsprozesses entdeckten Probleme als Probleme eingereicht.
Ich dachte ursprünglich, dass der Implementierungscode nicht bereitgestellt wurde, und die Bewerbung endete hier. Wer wusste, dass die Personalabteilung nach ein paar Tagen tatsächlich sagte, dass er den schriftlichen Test bestanden habe und für die nächste Runde formeller Videointerviews bereit sei.

formelles Vorstellungsgespräch

In der ersten Interviewrunde schickte die Gegenpartei einen Mitarbeiter der Front-End-Entwicklungsposition als Interviewer. Nach meinem weiteren Verständnis wird es insgesamt drei Runden Videointerviews geben. Die erste Runde ist die Person mit derselben Position, und die zweite Runde ist die Person, die für das Produkt verantwortlich ist (mein Verständnis ist der Produktmanager), und die dritte Runde ist der technische Leiter.
Diese Abfolge von Interviews gibt mir das Gefühl, dass die grundlegende Nachbereitung ungehindert sein wird, wenn die erste Interviewrunde bestanden wird? Schließlich verfüge ich möglicherweise über mehr Erfahrung als der derzeitige Verantwortliche, was die Zeitspanne und die Fülle der Inhalte betrifft, die für das Produkt verantwortlich sind. Schließlich umfasste mein ursprünglicher Job einen Teil der Verantwortung eines Produktmanagers.
Und in dieser ersten Runde dachte ich, dass Xiao Luo definitiv gewinnen würde, aber natürlich wurde ich hart getroffen und verlor die Wahl.
Ursprünglich dachte ich im Allgemeinen, dass erfahrene Leute die Kombination von Theorie und Praxis schätzen, insbesondere nach einer langen Zeit mit Interviews. Im Allgemeinen wird Partei A, die ihre eigenen Produkte herstellt, auf Algorithmen, Datenstrukturen, Computerprinzipien und dann auf tatsächliche Parallelität achten und Rendering. und andere praktische Fragen.
Wer weiß, dass dieser Interviewer davon besessen ist, verschiedene Theorien zu rezitieren, und wenn er zur Sprache kommt, ist er nicht mit allen Arten von Theorien vertraut, sodass er sich nicht daran erinnert, wie man die Prinzipien rezitiert, oder er hat keine Theorien verwendet, die es nicht sind Sehr nützlich. Natürlich kann dies meine persönliche Gewalttheorie sein, daher leihe ich sie mir trotzdem aus. Dieser Artikel ist begradigt und dient auch als Referenz für alle.
Der Inhalt des Interviews ist wie folgt:

Sprechen Sie über die Ereignisschleife von js

Ich weiß fast nicht, was das auf Englisch ist. Ich verstehe es als NodeJS-Ereignisabfrage (der eigentliche Interviewer scheint mich über die Ereignisschleife sprechen zu hören, die die Benutzeroberfläche im Frontend enthält). Obwohl ich weiß, wie es funktioniert Ich weiß nicht, was es ist. Um es ganz klar auszudrücken, kann man nur sagen, dass es eine Ereigniswarteschlange gibt und jeder Rückruf oder asynchrone Rückruf in diese Warteschlange gestellt wird. Wenn das Programm inaktiv ist, liest es diese Warteschlange und führen Sie die entsprechende Verarbeitungsmethode für die abgeschlossenen Ereignisse aus.
Nach dieser Einführung schien der Interviewer unzufrieden zu sein und hatte das Gefühl, dass ich es überhaupt nicht verstanden hatte. Deshalb schrieb er direkt einen Codeabschnitt, einschließlich Verzögerungsereignissen, E / A-Rückrufen und dem Drucken des Hauptthreads, und fragte mich, in welcher Reihenfolge diese ausgeführt wurden Es sind Druckereignisse aufgetreten. Der Code lautet ungefähr wie folgt:

fs.readFile("/path/to/file", () => console.log("readFile"))
setTimeout(() => console.log("setTimeout"))
console.log("main")

Meine Antwort ist, dass sowohl readFile als auch setTimeout zuerst in die Ereigniswarteschlange gestellt werden und dann weiter ausgeführt werden, bis sie frei sind. Anschließend wird die Ereigniswarteschlange abgefragt, um festzustellen, welches Ereignis abgeschlossen ist, und die Rückrufverarbeitung ausgeführt, sodass die Ausgabesequenz lautet :

main
setTimeout
readFile

Die interviewte Person hat nichts dazu gesagt. Nehmen wir es einfach als Pass. Wenn Sie interessiert sind, können Sie sich diese detaillierte Erklärung des Event-Loop-Mechanismus (Ereignisschleife) in JavaScript ansehen .

Sprechen Sie über verschiedene moderne Schreibmethoden von CSS

  • Sass, Less, CSS-Precompiler, der leistungsstärkste Teil ist natürlich die Unterstützung von Verschachtelungen im Eltern-Kind-Stil, Variablen, Berechnungen, dem Aufruf benutzerdefinierter Funktionen usw. Ich bevorzuge Leute, die gut in CSS sind, und es wird auch am häufigsten verwendet eins.
  • Css-in-Js wie Styled usw. Denken Sie daran, dass Sie Stile in jsx-Tags definieren können, indem Sie Objekte definieren und Funktionen aufrufen. Ich weiß es, habe es aber noch nicht verwendet.
  • TailWindCSS definiert, ähnlich wie Boostrap.css des Jahres, nur verschiedene Stilnamen und kombiniert direkt verschiedene Stilnamen, um Layout, Komponentenstil, Farbe, Schriftgröße usw. zu definieren. Dies ist eine relativ umstrittene Methode, da dies häufig erforderlich ist Schreiben Sie eine große Anzahl von Stilen. Um eine gewünschte Beschriftung oder ein gewünschtes Layout zu definieren, müssen Sie zur Wiederverwendung zunächst eine Komponente mit einer großen Anzahl von Stilen definieren und diese Komponente dann verwenden. Sie können das prägnante und abstrakte Objekt nicht verwenden und Attributdefinitionsmethode des Stylesheets selbst.

Tatsächlich gibt es eine andere Art der Komponentisierung, wie z. B. ElementUI und Antdesign, die Komponenten direkt verwenden, ohne zu viel darüber nachzudenken, wie man CSS schreibt, aber der Freiheitsgrad ist relativ gering. Der Vorteil ist natürlich, dass das Erscheinungsbild aller Schriften ist absolut stimmig.

Lebenszyklus reagieren

Als ich nach dem Lebenszyklus fragte, war ich völlig verwirrt und wusste nicht, was ich sagen sollte.
Insbesondere nach React17 werden Hooks und Funktionskomponenten vollständig übernommen. Der sogenannte Lebenszyklus ist derselbe, als ob er nicht existierte, und nur die gesamte Funktionskomponente wird kontinuierlich ausgeführt.
Damals hatten meine Lieblingsklassenkomponenten eine klare Struktur, und verschiedene Bühnenereignisse existierten auch nacheinander als Methoden, wie Konstruktor, ComponentDidMount, ComponentDidUpdate, Render, GetDerivedStateFromProps usw., die gut organisiert waren. Damals auch den gesamten Lebenszyklus ernsthaft verstanden.
Da die Funktionskomponente nun jedoch zu einer Reihe von Funktionen geworden ist, spürt der sogenannte Zyklus überhaupt keinen Sinn mehr und ist daher längst in Vergessenheit geraten.
Gerade als ich über die Reihenfolge des gesamten Zyklus nachdachte, sah der Interviewer, dass ich nicht sprach, also änderte er die Frage und bat mich, über die Hook-Funktionen in React zu sprechen.
Deshalb habe ich kurz über die Funktionen wie useState, useEffect, useDispatch, useMemo, useCallback und die allgemeinen Funktionen gesprochen, die übrigens vorstellten, welcher Phase des Lebenszyklus der zweite Parameter von useEffect und der Rückgabewert im Callback entsprechen.
An diesem Punkt habe ich das Gefühl, dass das Interview möglicherweise schmutzig ist. Schließlich mag diese Person die Theorie zu sehr. Ich habe wiederum das Gefühl, dass die andere Partei möglicherweise nicht in der Lage sein wird, darauf zu antworten, wenn ich ein paar Theorien frage. Warum ist es schwierig, einen Arbeiter zu schlagen? Sie können ihm keine praktischen Fragen stellen?

Benutzerdefinierten Hook reagieren

Dann scheint der Interviewer nach der Kompetenz im Umgang mit verschiedenen vorhandenen Hook-Bibliotheken fragen zu wollen. Ich habe beispielsweise useIntervalnoch nie die Hook-Bibliotheken anderer Leute verwendet. Ich setze meine eigenen nur bei Bedarf anhand von Online-Beispielen um useMousePosition. useScrollDer Interviewer war ursprünglich interessiert. Chong Chong, nachdem er sich meine Aussage angehört hatte, verstummte er.
Ich schäme mich auch ein wenig. Muss ich die Bibliotheken anderer Leute verwenden, damit es großartig aussieht? Diese nicht wesentlichen Bibliotheken von Drittanbietern werden jedoch wahrscheinlich von jedem Unternehmen unterschiedlich verwendet. Die Beherrschung der grundlegenden Frameworks von React und Vue sowie das Verständnis der globalen Zustandsverwaltung sind bereits die effektivste Fähigkeit, die Bibliotheken von Drittanbietern erlernen können Meiner Meinung nach. , ganz zu schweigen davon, dass HTML, CSS, JS, WASM tatsächlich nützlich sind. Diese Frameworks und Bibliotheken sind Dinge, die im Laufe der Zeit jederzeit aufgegeben werden können, und weitere Forschung wird ohne Sie nicht viel nützen Möchte selbst eines umsetzen. .

Fragen zur Typoskript-Übung

Dann kam ich plötzlich zum Übungsfragen-Link (obwohl die vorherige React-Hook-Bibliothek auch als Übung angesehen wurde, aber weil ich zu nutzlos war, wurde sie übersprungen), der Interviewer hat den folgenden Code für mich abgelegt, eine Funktion, die erkannt wurde die Funktion, aber es fehlt der Typ Constraints, weshalb ich die Constraints vervollständigen muss:

//  缺少类型约束的函数
function getItem(args: any) {
    
    
    return Array.isArray(args) ? args[0] : args
}

const result = getItem([1, 2, 3])

Als ich dieses Thema sah, dachte ich als Erstes daran, Infer Infer zu verwenden, um den Typ des ersten Werts gemäß der Funktionsfunktion abzuleiten, aber ich verwende Infer selten. Normalerweise beende ich es, während ich mir die Notizen ansehe, die ich geschrieben habe. Jetzt Es ist mir peinlich zu sagen, dass ich im Interview zuerst die Notizen gelesen habe, sodass ich Generika nur auf andere Weise verwenden kann. Der Code lautet wie folgt:

//  注意使用了泛型与or的语法来实现
function getItem<T = any>(args: T[] | T): T {
    
    
    return Array.isArray(args) ? args[0] : args
}

const result = getItem([1, 2, 3])

Der obige Code beurteilt und beschränkt den Ausgabetyp automatisch auf T entsprechend dem Eingabeparameter T[]
. Der Interviewer schien ein wenig überrascht zu sein, als er diese Antwort sah, und als ich ihn fragte, ob ich sie mit Infer implementieren solle, betonte er Dies noch einmal: Es ist ein offenes Thema und jede Art von Implementierung ist in Ordnung, aber ich denke, er ist etwas unwillig, also werde ich die Situation ausnutzen und ihn fragen, wie es implementiert werden würde, wenn Sie Infer oder etwas anderes verwenden würden. Ich nicht Ich erinnere mich nicht an den eigentlichen Code, aber ich erinnere mich ungefähr daran, Infer zu verwenden, um auf den Typ des Array-Elements zu schließen:

// 使用infer判断是否为数组并返回数组项类型
function getItem<T = any>(args: T): T extends (infer U)[] ? U : T {
    
    
    return Array.isArray(args) ? args[0] : args
}

const result = getItem([1, 2, 3])

Diese Methode löst jedoch kein wirkliches Problem, das heißt, die Funktion besteht darin, das erste Element des Arrays zurückzugeben, und das Array in js kann für jedes Element einen unterschiedlichen Typ haben. Sowohl er als auch ich leiten nur den Wert ab aller Elemente im Array. Typ anstelle des Typs des ersten Elements.
Wenn ich beispielsweise eine Funktion aufrufe [1, "2", 3], sollte der Typ des erwarteten Urteils lauten number, aber meine beiden Schreibmethoden können nur schließen, number | string
dass es sich um ein Typurteil handelt, das nicht mit der Funktion der Funktion übereinstimmt.
Und ich habe von Anfang an über diese Frage nachgedacht, und ich habe auch über die Funktion nachgedacht, mit der Infer auf das erste Element des Arrays schließen kann, aber ich habe vergessen, wie man es schreibt.
Nachdem ich gesehen hatte, dass die Implementierung des Interviewers diesen Punkt nicht berücksichtigte, stellte ich ihm diese Frage, und er schien nicht zu wissen, wie er sie lösen sollte. Er sagte einfach, dass es ausreichte, diese Art von intelligentem Urteil zu verwenden, bis ich ihn daran erinnerte dass die Infer-Grammatik auch ist. Er konnte auf das erste Element des Arrays schließen, also wollte er versuchen, es aufzuschreiben, konnte sich aber leider nicht erinnern, wie man es schreibt, also gab er auf.
Danach habe ich absichtlich versucht, nur den Wert des ersten Elements des Arrays gemäß der Infer-Syntax in meinen Notizen abzuleiten, aber leider ist diese Methode nutzlos, da in der formalen Parameterphase die Typen aller Elemente im Array festgelegt werden Aufgrund der Typdefinition wird es zusammengeführt, z. B. [1, "2", true]
wird zu einem Typ number|string|boolean, sodass es nicht mehr möglich ist, den Typ des ersten Elements anhand der tatsächlichen Parameter zu beurteilen. Insbesondere können Sie anhand meines folgenden Fehlercodes experimentieren und ihn verbessern:

Bei der ersten Methode verwenden Sie „infer“, um den Typ des ersten Elements abzuleiten:

function getItem<T = any>(args: T): T extends [infer FirstItem, ...infer Others] ? FirstItem : T {
    
    
    return Array.isArray(args) ? args[0] : args
}

const result = getItem([1, "2", true])

Die zweite Möglichkeit besteht darin, den Typ des ersten Elements direkt über den Index anzugeben:

function getItem<T = any>(args: T): T extends unknown[] ? T[0] : T {
    
    
    return Array.isArray(args) ? args[0] : args
}

const result = getItem([1, "2", true])

Die von den beiden oben genannten Methoden abgeleiteten Typen sind die Typsammlungen aller Elemente number|string|boolean. Da bei der Definition des formalen Parametertyps args: T
die Typen aller Elemente kombiniert wurden und nicht mehr unterschieden werden können, gibt es bisher keine Lösung. Willkommen fähig Menschen sollen eine Nachricht hinterlassen. Wie die Situation gelöst wird.

Codeüberprüfung und -tests

Dann stellte der Interviewer ein weiteres Stück Code zur Verfügung, bei dem es sich um eine Funktionsimplementierung handelt, und bat darum, die darin enthaltenen Probleme herauszusuchen:

function getSId() {
    
    
    if (window["_option_data"]) {
    
    
        if (window["_option_data"].SID) {
    
    
            return window["_option_data"].SID
        } else {
    
    
            return 100;
        }
    } else if (window.SID) {
    
    
        return window.SID;
    } else {
    
    
        return 100;
    }
}

Mein Punkt ist:

  • Auf die globale Variable window wird intern direkt verwiesen. Da es sich um eine reine Funktion handelt, sollte die Ausgabe entsprechend der Eingabe bestimmt werden, daher ist es besser, das Fenster als Parameter statt als direkte Referenz zu übergeben
  • Für das Fenster wird die Literalsyntax zum einmaligen Aufrufen verwendet, und der Attributwert wird für eine Weile aufgerufen, was nicht einheitlich genug ist
  • Die Art der Beurteilung bietet die Möglichkeit einer Optimierung, ist aber jetzt zu kompliziert
  • Da die zurückgegebene 100 keine klare Bedeutung hat, sollte sie als Konstante definiert und dann referenziert werden, zconst DEFAULT_ID = 100

Wenn ich jetzt darüber nachdenke, weiß ich nicht, was der Funktionsname selbst bedeutet. SId hat überhaupt nicht erklärt, was es ist, aber ich dachte unbewusst, dass ihre Gewohnheiten während des Interviews so waren, also habe ich nichts gesagt.

Dann fragte der Interviewer, wie man Testfälle basierend auf dieser Funktionsimplementierung schreibt. Ich habe einfach zwei Typen geschrieben:

  • getSId(), um festzustellen, ob der Wert meinen Wünschen entspricht
  • getSId.bind(_myWindow) Bestimmen Sie, ob der Wert derselbe ist wie zuvor

Ich bin hier ein bisschen imaginär, hauptsächlich obwohl ich verschiedene Tests wie Unit-Tests, Integrationstests, Komponententests und E2E-Tests durchgeführt habe, aber die tatsächliche Erfahrung ist ziemlich gering, und ich habe mir plötzlich eine so scheinbar primitive Funktionsimplementierung gegeben. Bevor die Optimierung abgeschlossen war, kannte ich wirklich keine Testfälle, die es wert wären, geschrieben zu werden, also habe ich es schnell gemacht.

Sprechen Sie über die Probleme, auf die Prisma gestoßen ist

Da in meinem Lebenslauf stand, dass Prisma im Nodejs-Projekt verwendet wurde, fragte mich der Interviewer nur, auf welche Probleme ich gestoßen sei. Die wenigen Fragen, die ich erwähnte, schienen dem Interviewer jedoch noch nie begegnet zu sein, sodass er keine Fragen dazu stellte. :

  1. Die Schritte der Modellausführung, -konstruktion und -generierung können auf dem Linux-System nicht ausgeführt werden und es wird ein Fehler gemeldet. Es kann nur von Docker gepackt oder von Windows generiert und dann zur Bereitstellung auf dem Linux-System bereitgestellt werden.
  2. Es unterstützt keine SQL-Feldanmerkungen, sondern nur Modellanmerkungen. Dies bedeutet, dass einige Betriebs- und Wartungsmitarbeiter, Führungskräfte, Dritte usw. nicht auf den Quellcode zugreifen, sondern die Datenbank direkt betreiben können und die Bedeutung der Felder nicht kennen ;
  3. Bei nicht unterstützten Feldtypen wie MySQLs TEXT (wird für lange Artikeltexte verwendet) kann die Verwendung zwar erzwungen werden, führt jedoch dazu, dass die Prisma/Client entsprechende Tabellenoperationsfunktion nicht generiert werden kann. Wenn Sie die Tabelle abfragen müssen oder Wenn Sie der Tabelle beitreten, können Sie nur die originellste SQL-Anweisung verwenden.

Erzählen Sie mir von Ihren jüngsten Herausforderungen

Zu diesem Zeitpunkt habe ich tatsächlich das Gefühl, dass ich das Vorstellungsgespräch möglicherweise nicht bestehen kann. Schließlich mag ich die Theorie so sehr. Auch wenn ich kaum bestehe, gibt es andere Theorien, die ich genug auswendig lerne und einen hohen Bildungsgrad habe. Das habe ich noch nie zuvor damit in Berührung gekommen und viele der dadurch verursachten Probleme sind nicht gut verstanden.
Wenn Sie prahlen möchten, werde ich auf jeden Fall die Audio- und Video-Live-Übertragung und den Compiler verwenden, die ich kürzlich gelernt habe, aber es wird viel Speichel erfordern, damit ich damit umgehen kann.

Stellen Sie dem Interviewer Fragen

Nach dem Interview fragte mich der Interviewer routinemäßig, welche Fragen ich stellen könne. Ich wurde lange Zeit gefoltert, also stellte ich fast eine Stunde lang Fragen, ungefähr:

  • Wie viele Interviewrunden gibt es insgesamt?
  • Wie ist die Arbeitsorganisation und der Arbeitsablauf?
  • So definieren Sie den Zeitaufwand für Aufgaben
  • Was ist der konkrete Arbeitsinhalt?
  • An wen Sie sich wenden können, wenn Sie Fragen zur Gestaltung oder Planung haben
  • Wie man eine gute Nachfrageidee vorbringt
  • Wenn Sie einen Full-Stack durchführen möchten, müssen Sie dann noch ein Back-End-Interview durchführen (hier ist die Antwort der anderen Partei ziemlich erstaunlich, die sagt, dass Sie das nicht brauchen, und diejenigen, die zum Front-End-Interview kommen). und das Back-End machen möchte, kann auch loslegen)
  • Front-End- und Back-End-Arbeitsverteilung und Zusammenarbeit
  • Beschränkt sich die übliche Zusammenarbeit auf den Eins-zu-eins-Sprach- und Text-Gruppenchat oder gibt es eine spezielle Online-Kollaborationssoftware wie Metaverse für die Echtzeitkommunikation?

Ich werde die konkrete Antwort nicht veröffentlichen. Wenn Sie interessiert sind, können Sie eine Nachricht hinterlassen und mich fragen.

Interviewergebnis

Das Vorstellungsgespräch fand am Dienstag statt, aber bis Donnerstag gab es kein Feedback, also musste ich die Initiative ergreifen und die Personalabteilung fragen, und bekam sie schließlich, und ich wurde eliminiert~
Obwohl ich dachte, ich könnte gut antworten, wurde ich trotzdem abgelehnt. Es ist ein Nitpick. Viele von ihnen verfolgen offensichtlich die Praxis, aber sie rezitieren gerne verschiedene Theorien. Wenn ich Theorie wirklich mag, betreibe ich immer noch C/C++-Low-Level-Forschung und -Entwicklung. Warum diese Art von Internetanwendung? Das offensichtlichste ist, dass der Algorithmus in den letzten Jahren alle 211/985 Master- und Doktorgrade erforderte und Sie dann eine Menge theoretisches Wissen erlernen ließen. Tatsächlich umfasst der Unterricht drei Stunden Angeln und drei Minuten Arbeit.

Ich bin stark und möchte mich auch anmelden!

Wenn Sie auch diese Art der Fernarbeit ausprobieren möchten, können Sie apitable und andere fortschrittliche Unternehmen ausprobieren, die Fernarbeit unterstützen:
offizielle Website des apitable-Produkts
Homepage des Boss-Direktbeschäftigungsunternehmens (das Unternehmen, das hinter der Operation steht)

Guess you like

Origin blog.csdn.net/u013102711/article/details/131154265