Tech Articles

cover of post: Einstieg in NestJS: Schritt für Schritt Kompetenzen aufbauen

Einstieg in NestJS: Schritt für Schritt Kompetenzen aufbauen

Apr 04, 2025

Von dem nativen HTTP-Modul von Node.js über Express bis hin zu NestJS und Next.js haben wir die kontinuierliche Entwicklung der Webanwendungsentwicklungstechnologien erlebt. Mit seinen leistungsstarken architektonischen Designfähigkeiten bietet NestJS eine strukturierte Lösung für die Anwendungsentwicklung auf Unternehmensebene und ist damit eine ideale Wahl für den Umgang mit komplexen Projekten. Next.js hingegen zeigt einzigartige Vorteile in den Bereichen Full-Stack-Anwendungen und Front-End-Rendering. Obwohl Express in großen Projekten gewisse Einschränkungen aufweist, hat es immer noch einen unersetzlichen Wert, wenn es darum geht, schnell Lightweight-Webanwendungen zu erstellen. Entwickler sollten die am besten geeignete technische Lösung entsprechend den spezifischen Anforderungen des Projekts wählen. Nachfolgende Artikel werden sich eingehend mit den Kernkonzepten und praktischen Fähigkeiten von NestJS befassen, um Entwicklern zu helfen, dieses leistungsstarke Framework schnell zu beherrschen.

By Daniel Hayes#javascript
cover of post: Async/Await in Python: Eine vollständige Anleitung zu Coroutines

Async/Await in Python: Eine vollständige Anleitung zu Coroutines

Apr 03, 2025

Zusätzlich zu den oben genannten asynchronen Methoden gibt es in Python noch andere asynchrone Ansätze, wie z. B. die Verwendung von Callback-Funktionen oder Bibliotheken von Drittanbietern wie Gevent. Jede Methode hat ihre eigenen Vor- und Nachteile. Threads eignen sich beispielsweise für E/A-gebundene Aufgaben, sind aber durch den GIL (Global Interpreter Lock) begrenzt; Multiprocessing eignet sich für CPU-intensive Aufgaben, hat aber einen höheren Speicherbedarf; Bibliotheken von Drittanbietern bieten spezielle Funktionen und Optimierungen, können aber die Komplexität des Projekts erhöhen. Im Gegensatz dazu bietet die `async/await`-Syntax eine modernere und lesbarere Art der asynchronen Programmierung und ist derzeit die empfohlene Methode für die Behandlung asynchroner Operationen in Python.

By James Reed#python
cover of post: Wie HTTP-Caching funktioniert: Eine detaillierte Erklärung

Wie HTTP-Caching funktioniert: Eine detaillierte Erklärung

Apr 02, 2025

Dieser Artikel stellt umfassend den HTTP-Caching-Mechanismus vor und behandelt Cache-Typen, Antwortstatus, Cache-Kontrolle, Cache-Aktualisierung, Revving, Cache-Verifizierung und Vary-Antworten. In der Praxis kann ein tiefes Verständnis und eine vernünftige Anwendung des HTTP-Caching-Mechanismus dazu beitragen, die Website-Performance und die User Experience zu verbessern.

By Wenhao Wang#programming
cover of post: Einstieg in Prisma: Das beste ORM für Node.js

Einstieg in Prisma: Das beste ORM für Node.js

Apr 01, 2025

Prisma gilt als das ORM-Tool (Object Relational Mapping) der nächsten Generation, das auf Basis von TypeScript entwickelt wurde und eine leistungsstarke Typsicherheit bietet. In diesem Artikel wird Koa.js verwendet, um einen einfachen Webdienst zu erstellen und ihn mit einer MySQL-Datenbank zu kombinieren, um zu demonstrieren, wie die Operationen zum Erstellen, Lesen, Aktualisieren und Löschen (CRUD) von Daten mit Prisma implementiert werden.

By Emily Parker#javascript
cover of post: Rust Traits erklärt: Wie sie funktionieren und warum sie wichtig sind

Rust Traits erklärt: Wie sie funktionieren und warum sie wichtig sind

Mar 31, 2025

Eine tiefgehende Erläuterung von Rust Traits, die Anwendungsbeispiele und interne Implementierungsdetails behandelt.

By Ethan Miller#Engineering
cover of post: Wie Node.js Web-Frameworks wirklich funktionieren? (Inside Express.js & Next.js)

Wie Node.js Web-Frameworks wirklich funktionieren? (Inside Express.js & Next.js)

Mar 31, 2025

An diesem Punkt wurde eine Anfrage per TCP an den Client zurückgesendet. Dieser Artikel untersucht nur den Hauptverarbeitungsablauf. Tatsächlich berücksichtigt der Node.js-Quellcode auch weitere Situationen, wie z. B. die Behandlung von Timeouts, den Caching-Mechanismus, wenn der `Socket` belegt ist, die spezielle Header-Behandlung, Gegenmaßnahmen für Probleme Upstream und die effizientere Abfrage geschriebener Header usw. Diese Details sind alle einer eingehenden Untersuchung und des Lernens wert. Durch die Analyse des Quellcodes des `http`-Moduls können wir besser verstehen, wie wir damit leistungsstarke Web-Frameworks erstellen können.

By Grace Collins#javascript
cover of post: Traits und Trait-Grenzen in Rust: Eine umfassende Anleitung

Traits und Trait-Grenzen in Rust: Eine umfassende Anleitung

Mar 30, 2025

Überblick über Traits und Trait-Grenzen in Rust für Abstraktion und generische Einschränkungen.

By Olivia Novak#Engineering
cover of post: Erstellung eines Gin-ähnlichen Web-Frameworks in Go von Grund auf

Erstellung eines Gin-ähnlichen Web-Frameworks in Go von Grund auf

Mar 30, 2025

In der modernen Webentwicklung ist ein effizientes und flexibles Routing-System eine der Kernkomponenten beim Aufbau von Webanwendungen. Die Programmiersprache Go ist aufgrund ihrer hohen Leistung, Einfachheit und leistungsstarken Standardbibliothek im Bereich der Webentwicklung sehr beliebt. Das Paket `net/http` in Go ist die Implementierung eines HTTP-Servers in der Standardbibliothek. Obwohl es leistungsstark ist, ist es relativ Low-Level. Wenn Sie das Routing wie in Lightweight-Web-Frameworks wie Gin handhaben möchten, können wir selbst einen vereinfachten Router implementieren. Dieser Artikel bietet eine detaillierte Einführung in die Verwendung des `net`-Pakets in Go zur Implementierung eines HTTP-Servers ähnlich wie Gin. Gleichzeitig werden HTTP-bezogenes Wissen, gängige Routing-Implementierungsmethoden und die Implementierung von Middleware auf dieser Basis behandelt.

By Olivia Novak#golang
cover of post: Einführung in generische assoziierte Typen in Rust

Einführung in generische assoziierte Typen in Rust

Mar 29, 2025

Tauche ein in Generic Associated Types: Das Tor zu Higher-Kinded Types in Rust.

By Ethan Miller#Engineering
cover of post: Golang Metaprogrammierung: Warum Sie es 2025 versuchen sollten

Golang Metaprogrammierung: Warum Sie es 2025 versuchen sollten

Mar 29, 2025

Obwohl die Go-Sprache keine Metaprogrammierungsfunktionen direkt bereitstellt, können Entwickler mit Hilfe von Mechanismen und Werkzeugen wie Code-Generierung, Reflexion, Schnittstellen und Typzusicherungen Metaprogrammierungseffekte erzielen, den Code während des Programmierprozesses manipulieren, die Abstraktionsebene des Codes verbessern und die Verständlichkeit und Wartbarkeit des Codes verbessern. Bei der Verwendung dieser Techniken ist jedoch zu beachten, dass sie die Komplexität erhöhen und den Performance-Overhead zur Laufzeit erhöhen können. Bei Reflexionsoperationen sollten verschiedene potenzielle Fehler und Randbedingungen sorgfältig behandelt werden, um die Stabilität und Effizienz des Codes zu gewährleisten.

By Daniel Hayes#golang
cover of post: Generics in Rust verstehen: Ein vollständiger Leitfaden

Generics in Rust verstehen: Ein vollständiger Leitfaden

Mar 29, 2025

Ein umfassender Überblick über die Verwendung von Generics in Rust-Funktionen, -Strukturen, -Enums und -Methoden.

By Wenhao Wang#Engineering
cover of post: Deep Dive into Fastify: Das hochleistungsfähige Node.js Web-Framework

Deep Dive into Fastify: Das hochleistungsfähige Node.js Web-Framework

Mar 28, 2025

Fastify ist ein effizientes und schnelles Node.js Web-Framework, das auf optimale Leistung ausgelegt ist. Obwohl es relativ neu ist, hat es aufgrund seiner hohen Leistung und des geringen Overheads die Gunst vieler Entwickler gewonnen. Fastify bietet eine prägnante Entwicklungserfahrung, unterstützt schnelles Routing und eine Plugin-Architektur, wodurch es Entwicklern erleichtert wird, Anwendungen zu erstellen und zu erweitern.

By Olivia Novak#javascript
cover of post: Rust’s Atomics Explained: Die Unteilbarkeiten der Nebenläufigkeit

Rust’s Atomics Explained: Die Unteilbarkeiten der Nebenläufigkeit

Mar 27, 2025

Eine detaillierte Anleitung zu atomaren Typen, Operationen und Memory Ordering in Rust Concurrency.

By Emily Parker#Engineering
cover of post: Go vs Rust/C++: Eine Vergleich von Goroutinen und Coroutines

Go vs Rust/C++: Eine Vergleich von Goroutinen und Coroutines

Mar 27, 2025

Durch eine detaillierte Analyse von Stackful- und Stackless-Coroutinen haben wir ein klareres Verständnis ihrer zugrunde liegenden Implementierungen erhalten. Obwohl Stackful- und Stackless-Coroutinen nach dem Mechanismus der Kontextspeicherung benannt sind, liegt ihr wesentlicher Unterschied darin, ob sie in einer beliebigen verschachtelten Funktion unterbrochen werden können. Dieser Unterschied bestimmt, dass Stackful-Coroutinen eine höhere Freiheit beim Unterbrechen haben und bequemer in Bezug auf die Kompatibilität mit bestehendem synchronem Code sind; während Stackless-Coroutinen, obwohl sie in der Unterbrechungsfreiheit eingeschränkt sind, eine höhere Leistung und bessere Speichermanagementfunktionen aufweisen. In der Praxis sollte der geeignete Coroutine-Typ entsprechend den spezifischen Anforderungen ausgewählt werden.

By Takashi Yamamoto#golang
cover of post: Furchtlose Parallelität in Rust: Threads zähmen, ohne den Schlaf zu verlieren

Furchtlose Parallelität in Rust: Threads zähmen, ohne den Schlaf zu verlieren

Mar 26, 2025

Eine Einführung in Rusts furchtloses Parallelitätsmodell mit Threads, Kanälen und gemeinsam genutztem Zustand.

By James Reed#Engineering
cover of post: HTTP 1.0 vs 1.1 vs 2.0: Ein tiefer Vergleich

HTTP 1.0 vs 1.1 vs 2.0: Ein tiefer Vergleich

Mar 26, 2025

HTTP (HyperText Transfer Protocol) ist das am weitesten verbreitete Netzwerkprotokoll im Internet, und alle WWW-Dateien müssen diesem Standard folgen. Sein ursprüngliches Designziel war es, eine Methode zum Veröffentlichen und Empfangen von HTML-Seiten bereitzustellen, die zum Übertragen von Hypertext von einem WWW-Server zu einem lokalen Browser verwendet wird, und es verwendet standardmäßig Port 80. Wenn ein HTTP-Client eine Anfrage initiiert, stellt er eine TCP-Verbindung zum angegebenen Port des Servers her (standardmäßig Port 80).

By Emily Parker#programming
cover of post: Warum Sie Go’s Gleichheitsoperator falsch verwenden könnten

Warum Sie Go’s Gleichheitsoperator falsch verwenden könnten

Mar 25, 2025

Dieser Artikel führte umfassend und eingehend die detaillierten Details der `==` Operation in Go-Sprache ein und behandelte das Verhalten der `==` Operation unter verschiedenen Datentypen, die Vergleichsregeln für spezielle Typen und die Auswirkungen von unvergleichlichen Typen. Es wird gehofft, dass durch die Ausarbeitung dieses Artikels die Mehrheit der Entwickler die `==` Operation in Go-Sprache genauer und umfassender verstehen und anwenden und verschiedene Probleme vermeiden kann, die durch unzureichendes Verständnis in der tatsächlichen Programmierung verursacht werden.

By Wenhao Wang#golang
cover of post: Anleitung für Anfänger zur nebenläufigen Programmierung in Rust

Anleitung für Anfänger zur nebenläufigen Programmierung in Rust

Mar 24, 2025

Erste Schritte in die nebenläufige Programmierung in Rust mit Threads und Async

By Takashi Yamamoto#Engineering
cover of post: Erstelle eine Web App mit purem Python (Ohne Flask, kein Django, keine Frameworks!)

Erstelle eine Web App mit purem Python (Ohne Flask, kein Django, keine Frameworks!)

Mar 24, 2025

Wer Python Webanwendungen geschrieben hat, insbesondere wer Online-Deployments durchgeführt hat, muss vom WSGI-Protokoll gehört haben. Es definiert die Datenaustausch-Schnittstelle zwischen den Webservern von Python und den Webanwendungen. Diese Beschreibung mag etwas abstrakt sein, daher wollen wir sie anhand von praktischen Beispielen im Detail erläutern.

By Grace Collins#python
cover of post: Async Programmierung in Rust: Futures mit join!, try_join! und select! zusammensetzen

Async Programmierung in Rust: Futures mit join!, try_join! und select! zusammensetzen

Mar 23, 2025

Lernen Sie, mehrere Rust Futures gleichzeitig mit den Makros join!, try_join! und select! auszuführen.

By Olivia Novak#Engineering
cover of post: Die 5 beliebtesten Node.js Web-Frameworks im Jahr 2025

Die 5 beliebtesten Node.js Web-Frameworks im Jahr 2025

Mar 23, 2025

Im Jahr 2025 haben sich die oben genannten Backend-Frameworks fest auf dem Markt etabliert. Egal, ob Sie Express.js wegen seiner Einfachheit, Nest.js wegen seiner Struktur, Adonis.js wegen seiner Produktivität oder Koa.js wegen seiner Eleganz wählen, die Wahl des richtigen Frameworks ist entscheidend. Es hängt immer von Ihren Anforderungen ab. Es ist wichtig, Ihre Projektanforderungen zu verstehen und basierend darauf das geeignete Framework auszuwählen. Darüber hinaus ist es entscheidend für den Erfolg Ihrer Backend-Entwicklungsreise im Jahr 2025, die neuesten Trends, neue Funktionen bestehender Frameworks und neue Frameworks im Auge zu behalten.

By Lukas Schneider#javascript
cover of post: Async Programming in Rust: Stream Trait und sein Design

Async Programming in Rust: Stream Trait und sein Design

Mar 22, 2025

Erfahren Sie, wie Sie asynchrone Datenströme in Rust mithilfe des Stream-Traits verwenden und implementieren.

By Ethan Miller#Engineering
cover of post: Negroni vs. andere Go Middleware Lösungen: Was macht es einzigartig?

Negroni vs. andere Go Middleware Lösungen: Was macht es einzigartig?

Mar 22, 2025

Negroni ist eine sehr wertvolle Bibliothek in der Go-Sprache für die Entwicklung von HTTP-Diensten. Für diejenigen, die eine effiziente, flexible und einfach zu wartende Webanwendungsentwicklung anstreben, ist Negroni zweifellos ein hervorragendes Werkzeug, das ein tiefes Verständnis und eine breite Anwendung verdient.

By Ethan Miller#golang
cover of post: Asynchrone Programmierung in Rust: Futures, Executors und Task Scheduling

Asynchrone Programmierung in Rust: Futures, Executors und Task Scheduling

Mar 21, 2025

Erfahren Sie, wie Rust asynchrone Aufgaben mithilfe von Futures, Executors und dem Waker-Mechanismus ausführt.

By Daniel Hayes#Engineering
cover of post: Go & Gorilla/Mux: Alles, was Sie zum Erstellen einer Web-App benötigen

Go & Gorilla/Mux: Alles, was Sie zum Erstellen einer Web-App benötigen

Mar 21, 2025

Dieser Artikel stellt die leichtgewichtige und leistungsstarke Routing-Bibliothek `gorilla/mux` vor. Sie unterstützt eine Vielzahl von Methoden zur Anfrageübereinstimmung, und Sub-Routen erleichtern die Routenverwaltung erheblich. Da sie mit der Standardbibliothek `net/http` kompatibel ist, kann sie nahtlos in Programme integriert werden, die `net/http` verwenden, und die für `net/http` geschriebenen Middleware-Ressourcen nutzen. Im nächsten Artikel werden wir `gorilla/handlers` vorstellen – einige häufig verwendete Middleware.

By Takashi Yamamoto#golang
cover of post: Async/Await in Rust verstehen

Async/Await in Rust verstehen

Mar 20, 2025

Eine Einführung in Rusts async/await, die Futures, Executors und Concurrency mit praktischen Beispielen erklärt.

By James Reed#Engineering
cover of post: Validator: Erweiterte Struktur- und Feldvalidierung Für Go

Validator: Erweiterte Struktur- und Feldvalidierung Für Go

Mar 20, 2025

Die leapcell-Bibliothek (Validator) ist sehr reich an Funktionen und relativ einfach und bequem zu bedienen. Die in diesem Artikel vorgestellten Einschränkungsbedingungen sind nur die Spitze des Eisbergs ihrer leistungsstarken Funktionen. Diese Bibliothek hat ein breites Anwendungsspektrum im Bereich der Softwareentwicklung, insbesondere der Webentwicklung. Es wird empfohlen, dass Entwickler ein tiefes Verständnis und eine Beherrschung davon haben, um die Effizienz und Genauigkeit der Datenvalidierung zu verbessern und die Sicherheit und Stabilität des Systems zu gewährleisten.

By Lukas Schneider#golang
cover of post: Implementierung einer Regel-Engine in Go mit Govaluate

Implementierung einer Regel-Engine in Go mit Govaluate

Mar 19, 2025

Obwohl die von govaluate unterstützten Operationen und Typen begrenzt sind, kann es dennoch einige interessante Funktionen implementieren. Zum Beispiel können Sie einen Webdienst schreiben, der es Benutzern ermöglicht, ihre eigenen Ausdrücke zu schreiben, Parameter festzulegen und den Server die Ergebnisse berechnen zu lassen.

By Wenhao Wang#golang
cover of post: Wie man `json.MarshalIndent` in Golang verwendet

Wie man `json.MarshalIndent` in Golang verwendet

Mar 18, 2025

Formatiere JSON in Golang mit `json.MarshalIndent` für bessere Lesbarkeit.

By Emily Parker#Engineering
cover of post: Getters in Go verstehen

Getters in Go verstehen

Mar 18, 2025

Go ermutigt zum direkten Feldzugriff und verwendet Getter nur, wenn dies erforderlich ist.

By James Reed#Engineering
cover of post: Wie man eine Struktur in Golang kopiert

Wie man eine Struktur in Golang kopiert

Mar 18, 2025

Flache Kopie ist einfach, aber tiefe Kopie ist für Referenztypen notwendig.

By Min-jun Kim#Engineering
cover of post: Bitweise Operationen in Go verstehen

Bitweise Operationen in Go verstehen

Mar 18, 2025

Bitweise Operationen in Go verbessern die Effizienz bei Arithmetik, Maskierung und der Handhabung binärer Daten.

By Grace Collins#Engineering
cover of post: Iterieren Über Maps in Go: Methoden, Reihenfolge und Best Practices

Iterieren Über Maps in Go: Methoden, Reihenfolge und Best Practices

Mar 18, 2025

Effizientes Iterieren über Maps in Go mit `for`-`range`, Umgang mit ungeordneter Iteration und Sortierung bei Bedarf.

By Ethan Miller#Engineering
cover of post: Globales Variablen in Go verstehen

Globales Variablen in Go verstehen

Mar 18, 2025

Vermeiden Sie die übermäßige Verwendung globaler Variablen in Go, um Modularität und Testbarkeit zu erhalten.

By Olivia Novak#Engineering
cover of post: Warum die Verwendung von UUID als Primärschlüssel in MySQL die Leistung beeinträchtigen kann

Warum die Verwendung von UUID als Primärschlüssel in MySQL die Leistung beeinträchtigen kann

Mar 18, 2025

UUID-Primärschlüssel können in MySQL zu Indexfragmentierung, langsamen Abfragen und Speicher-Overhead führen.

By Grace Collins#Engineering
cover of post: Go Flag Bibliothek: Eine vollständige Anleitung zu CLI Argumenten

Go Flag Bibliothek: Eine vollständige Anleitung zu CLI Argumenten

Mar 18, 2025

`flag` wird verwendet, um Befehlszeilenoptionen zu parsen. Personen mit Erfahrung in Unix-ähnlichen Systemen sollten mit Befehlszeilenoptionen vertraut sein. Zum Beispiel listet der Befehl `ls -al` detaillierte Informationen über alle Dateien und Verzeichnisse im aktuellen Verzeichnis auf, wobei `-al` die Befehlszeilenoption ist.

By James Reed#golang
cover of post: Gopsutil: Effiziente Systemüberwachung in Go

Gopsutil: Effiziente Systemüberwachung in Go

Mar 17, 2025

Die gopsutil-Bibliothek bietet uns Komfort, um lokale Maschineninformationen zu erhalten, und sie behandelt die Kompatibilitätsprobleme zwischen verschiedenen Systemen gut und bietet eine einheitliche Schnittstelle. Es gibt auch mehrere Unterpakete wie `net` und `docker`, die hier aus Platzgründen nicht vorgestellt werden. Interessierte Benutzer können sie самостоятельно в дальнейшем самостоятельно ausprobiert.

By Grace Collins#golang
cover of post: Jemalloc verstehen: Ein Rust Performance Booster

Jemalloc verstehen: Ein Rust Performance Booster

Mar 16, 2025

Erfahren Sie, wie jemalloc die Speicherverwaltung optimiert

By Ethan Miller#Engineering
cover of post: So verwalten Sie Go Versionen mit ASDF

So verwalten Sie Go Versionen mit ASDF

Mar 16, 2025

Anleitung zur effizienten Installation und Verwaltung von Go-Versionen mit ASDF.

By Daniel Hayes#Engineering
cover of post: Erstellen eines effizienten Web Scrapers in Golang

Erstellen eines effizienten Web Scrapers in Golang

Mar 16, 2025

Effizientes Entwickeln von verantwortungsvollen Go-Web-Scrapern mit Colly, Concurrency und Richtlinienkonformität.

By Emily Parker#Engineering
cover of post: Understanding Constructors in Go

Understanding Constructors in Go

Mar 16, 2025

Go verwendet Factory-Funktionen für die Strukturinitialisierung und -validierung.

By James Reed#Engineering
cover of post: TUI-Bibliotheken in Go erkunden

TUI-Bibliotheken in Go erkunden

Mar 16, 2025

Überblick über wichtige Go-Bibliotheken für die Entwicklung robuster und interaktiver TUIs.

By Min-jun Kim#Engineering
cover of post: Warum Go gegenüber Ruby on Rails wählen?

Warum Go gegenüber Ruby on Rails wählen?

Mar 16, 2025

Go zeichnet sich durch Skalierbarkeit und Leistung aus, während Rails für schnelle Entwicklung geeignet ist.

By Ethan Miller#Engineering
cover of post: Implementierung von verketteten Listen in Go

Implementierung von verketteten Listen in Go

Mar 16, 2025

Anleitung zur Implementierung und Verwendung von verketteten Listen in Go.

By Daniel Hayes#Engineering
cover of post: Erkundung von Grafikbibliotheken in Go

Erkundung von Grafikbibliotheken in Go

Mar 16, 2025

Überblick über Go's Grafikbibliotheken für Zeichnung, Visualisierung und GUI-Entwicklung.

By Lukas Schneider#Engineering
cover of post: Wie man aus einer Map in Golang löscht

Wie man aus einer Map in Golang löscht

Mar 16, 2025

Effiziente Methoden zum Löschen von Elementen aus einer Golang-Map.

By Olivia Novak#Engineering
cover of post: Umgang mit Befehlszeilenargumenten in Golang

Umgang mit Befehlszeilenargumenten in Golang

Mar 16, 2025

Erfahren Sie, wie Sie Befehlszeilenargumente in Golang mit `os.Args`, `flag` und `pflag` verarbeiten.

By Olivia Novak#Engineering
cover of post: Effektives Lesen von Rust-Quellcode: Ein praktischer Ansatz

Effektives Lesen von Rust-Quellcode: Ein praktischer Ansatz

Mar 16, 2025

Ein unverzichtbarer Leitfaden zur Navigation im Quellcode von Rust

By Olivia Novak#Engineering