Skip to content

Programming Languages

Comparative programming language notes covering syntax, paradigms, type systems, and concurrency models.

Intuition

Every programming language is a different way of thinking about problems: Python thinks in lists and dictionaries. Rust thinks in ownership and borrowing. Haskell thinks in pure functions and types. Learning multiple languages isn’t about memorising syntax — it’s about expanding your problem-solving toolkit. Each language teaches you a different way to approach challenges.

Why it matters: Understanding multiple languages makes you a better programmer in any language. You’ll recognise patterns, avoid anti-patterns, and choose the right tool for each job. The best programmers aren’t experts in one language — they’re fluent in many.

The key insight: Languages exist on spectrums: low-level (C, Rust) vs high-level (Python, Ruby), static (Java, Go) vs dynamic (Python, JavaScript), imperative (C, C++) vs functional (Haskell, Erlang). Understanding where a language sits on each spectrum tells you what it’s good at and what trade-offs it makes.

Dart

This resource is created as a aggregation of best practices in Dart and Flutter

Setup

My recommended IDE for Dart is modifying the text editor VSCode with Dart and Fl

Basics

When the project creates an executable, the entry point of the project is locate

Object Oriented

Dart is an . Every class implicitly extends . Unlike Java, Dart has no interfaces as a separate c…

Async

Dart runs on a with an isolated memory model. Unlike languages with Threads (Java, C++, Rust), Da…

Collections

Dart collections deep dive and hierarchy.

Dart3 Features

Pattern matching in Dart 3 is a compile-time mechanism for decomposing and inspecting values. A P…

Flutter Fundamentals

Navigation is the mechanism by which users move between different screens, pages, or views within…

State Management

Flutter renders UI by calling on widgets. The method returns a widget tree based On the current s…

Networking And Data

Flutter platform integration and native code access.

Testing

Testing is not a phase that comes after development. It is a structural property of the codebase …

Intro

This resource is created as a aggregation of best practices in Dart and Flutter

Best Practices

  • Always enable null safety (). - Avoid usage of and declaration, always use or explicit typing. …

Error Handling

Dart draws a sharp line between two families of throwable objects: and . This is not a stylistic …

Ffi And Advanced

Dart FFI and Advanced Topics notes covering key definitions, core concepts, worked examples, and …

Dependency Injection

Dependency Injection (DI) is a design pattern that implements : Instead of a class creating its o…

Code Generation

Code generation in Dart is the process of automatically producing Dart source code from annotatio…

Flashcards Dart Basics

20 interactive flashcards covering core Dart concepts from null safety to Dart 3 features and Flu…

Practice Dart Basics

10 auto-graded practice problems covering core Dart concepts. Select an answer,

Testing

Unit tests validate individual functions, methods, and classes in isolation. They are the fastest…

Elixir

Go

Go Introduction to Go notes covering key definitions, core concepts, worked examples, and practic…

Haskell

Java

Java Introduction to Java notes covering key definitions, core concepts, worked examples, and pra…

Kotlin

Kotlin Introduction to Kotlin notes covering key definitions, core concepts, worked examples, and…

Python

Python Introduction to Python notes covering key definitions, core concepts, worked examples, and…

Ruby

Rust

Rust Introduction to Rust notes covering key definitions, core concepts, worked examples, and pra…

Swift

Typescript

How to Use These Notes

  1. Start with the fundamentals — build a solid foundation before moving to advanced topics
  2. Work through examples — follow along with the worked examples to build intuition
  3. Test yourself — use the practice problems and flashcards to check your understanding
  4. Review regularly — spaced repetition helps retain what you have learned

Cross-References

  • Computer Science: Algorithms, data structures, and theory of computation foundations.
  • Mathematics: Linear algebra, calculus, and discrete mathematics for formal reasoning.
  • Physics: Classical mechanics, electromagnetism, and quantum physics.

Common Mistakes

Confusing pass-by-value with pass-by-reference across languages: Different languages handle parameter passing differently. Java passes object references by value; Python passes references by value; C++ has true pass-by-reference. Understanding each language’s semantics prevents confusion.

Assuming identical behavior across similar syntax: Languages like Java, C#, and Kotlin share similar syntax but differ in important ways (null safety, generics, concurrency). Don’t assume features transfer directly.

Ignoring language-specific idioms: Each language has preferred patterns. Using Java-style code in Python, or C-style code in Rust, produces functional but non-idiomatic code that misses the language’s strengths.