Chapter 39: Beyond Smalltalk - Taking Your Skills Further
You’ve mastered Smalltalk! You understand objects, messages, blocks, classes, tools, and the community. But your programming journey doesn’t end here. The concepts you’ve learned in Smalltalk will make you a better programmer in any language.
This chapter explores how Smalltalk concepts apply elsewhere, which languages to learn next, and how to translate your Smalltalk thinking to other paradigms. Smalltalk taught you to think differently - now use that superpower everywhere!
What Smalltalk Taught You
Core Concepts (Universal)
- Everything is an object
- Object-oriented thinking
- Encapsulation and abstraction
- Message passing vs function calls
- Polymorphism
- Duck typing
- Protocol-based programming
- Flexible, composable code
- Blocks and closures
- First-class functions
- Functional programming concepts
- Higher-order functions
- Live programming
- REPL-driven development
- Interactive exploration
- Fast feedback loops
- Design patterns
- Strategy, Command, Observer
- Template Method, Composite
- Elegant solutions to common problems
- Test-driven development
- Write tests first
- Red-green-refactor
- Confidence in changes
- Refactoring
- Continuous improvement
- Small, safe changes
- Code as living document
These concepts transcend languages!
Smalltalk’s Influence
Smalltalk influenced almost every modern language:
Direct Influence
Ruby - Borrows heavily from Smalltalk:
# Ruby
5.times { puts "Hello" }
[1, 2, 3].each { |n| puts n }
Very Smalltalk-like!
Python - List comprehensions, readability:
# Python
squares = [x**2 for x in range(10)]
Swift - Optional chaining, protocols:
// Swift
let length = person?.address?.street?.length
JavaScript - First-class functions, prototypes:
// JavaScript
[1, 2, 3].map(x => x * 2)
Indirect Influence
- Java - Borrowed OOP, but made it verbose
- C# - Improved on Java, added features
- Kotlin - More Smalltalk-like than Java
- Scala - Functional + OOP hybrid
Even languages that don’t look like Smalltalk borrowed its ideas!
Translating Smalltalk to Other Languages
Python
Smalltalk:
collection select: [ :each | each even ]
Python:
[x for x in collection if x % 2 == 0]
# or
list(filter(lambda x: x % 2 == 0, collection))
Smalltalk:
collection collect: [ :each | each * 2 ]
Python:
[x * 2 for x in collection]
# or
list(map(lambda x: x * 2, collection))
Smalltalk classes:
Object subclass: #Person
instanceVariableNames: 'name age'
Python:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
Ruby
Smalltalk:
collection do: [ :each | Transcript show: each ]
Ruby:
collection.each { |item| puts item }
Smalltalk:
collection select: [ :each | each > 10 ]
Ruby:
collection.select { |item| item > 10 }
Ruby is closest to Smalltalk syntax-wise!
JavaScript
Smalltalk:
collection collect: [ :each | each * 2 ]
JavaScript:
collection.map(x => x * 2)
Smalltalk:
[ answer := 42 ] value
JavaScript:
(() => { return 42; })()
Smalltalk objects:
person := Person new name: 'Alice'.
JavaScript:
const person = new Person('Alice');
// or
const person = { name: 'Alice' };
Java
Smalltalk:
Object subclass: #BankAccount
instanceVariableNames: 'balance'
Java:
public class BankAccount {
private double balance;
public BankAccount() {
this.balance = 0.0;
}
}
Smalltalk blocks:
list select: [ :item | item > 10 ]
Java (modern):
list.stream()
.filter(item -> item > 10)
.collect(Collectors.toList());
Java is verbose but getting better (lambdas since Java 8).
Swift
Smalltalk:
collection select: [ :each | each even ]
Swift:
collection.filter { $0 % 2 == 0 }
Smalltalk:
object ifNil: [ 'default' ] ifNotNil: [ object value ]
Swift:
object ?? "default"
Swift has excellent Smalltalk-inspired features!
Languages Smalltalkers Should Try
Ruby
Why:
- Most similar syntax
- Dynamic, expressive
- Great community
- Rails web framework
Learn it if:
- You want to build web apps
- You love Smalltalk syntax
- You need more job opportunities
Get started:
# Install: ruby-lang.org
# Try:
puts "Hello, World!"
5.times { puts "Ruby!" }
Python
Why:
- Readable, clean
- Huge ecosystem
- Data science, ML, AI
- Beginner-friendly
Learn it if:
- You want to do data science
- You need scientific computing
- You like simple syntax
Get started:
# Install: python.org
# Try:
print("Hello, World!")
for i in range(5):
print("Python!")
JavaScript/TypeScript
Why:
- Frontend and backend (Node.js)
- Unavoidable for web development
- Large job market
- TypeScript adds types
Learn it if:
- You want to build web applications
- You need frontend skills
- You like functional programming
Get started:
// Install: nodejs.org
// Try:
console.log("Hello, World!");
[1, 2, 3].forEach(n => console.log(n));
Elixir
Why:
- Functional programming
- Smalltalk-inspired syntax
- Concurrent, distributed
- Phoenix web framework
Learn it if:
- You’re curious about functional programming
- You need concurrency
- You like the BEAM VM
Get started:
# Install: elixir-lang.org
# Try:
IO.puts "Hello, World!"
Enum.each([1, 2, 3], fn n -> IO.puts(n) end)
Lisp/Scheme/Clojure
Why:
- Simple, powerful
- Homoiconicity (code as data)
- Different perspective
- Functional purity (Clojure)
Learn it if:
- You want to expand your mind
- You’re interested in metaprogramming
- You like minimalism
Get started:
; Install: clojure.org
; Try:
(println "Hello, World!")
(map #(* % 2) [1 2 3 4 5])
Rust
Why:
- Systems programming
- Memory safety without GC
- Modern features
- Growing popularity
Learn it if:
- You want to understand low-level programming
- You need performance
- You like strong type systems
Get started:
// Install: rust-lang.org
// Try:
fn main() {
println!("Hello, World!");
}
Paradigms to Explore
Functional Programming
What:
- Immutable data
- Pure functions (no side effects)
- Function composition
- Recursion over loops
Languages:
- Haskell (pure functional)
- Clojure (functional Lisp)
- Elixir (functional Erlang)
- Scala (functional + OOP)
Smalltalk already taught you:
- Blocks as first-class functions
- Higher-order functions (select:, collect:)
- Closures
Next step:
-- Haskell
double x = x * 2
map double [1, 2, 3, 4, 5]
Logic Programming
What:
- Declare relationships
- Let computer find solutions
- Pattern matching
Languages:
- Prolog
- Datalog
Example:
% Prolog
parent(tom, bob).
parent(bob, pat).
grandparent(X, Z) :- parent(X, Y), parent(Y, Z).
?- grandparent(tom, pat).
true.
Very different from Smalltalk - expands thinking!
Concurrent Programming
What:
- Multiple things happening at once
- Actor model
- Message passing between processes
Languages:
- Erlang/Elixir (actor model)
- Go (goroutines)
- Rust (fearless concurrency)
Elixir example:
# Actor model - similar to Smalltalk message passing!
send(pid, {:message, "Hello"})
receive do
{:message, content} -> IO.puts(content)
end
Systems Programming
What:
- Low-level control
- Memory management
- Hardware access
- Performance-critical code
Languages:
- C (the classic)
- Rust (modern alternative)
- Zig (newer option)
C example:
// C
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
Very different from Smalltalk - teaches fundamentals!
Concepts That Don’t Translate
Some Smalltalk features are unique:
Image-Based Development
Smalltalk:
- Save entire running system
- Objects persist between sessions
- No restart needed
Most languages:
- File-based
- Restart to see changes
- State doesn’t persist
Closest alternatives:
- Jupyter notebooks (Python)
- REPLs (many languages)
- Hot reloading (React, etc.)
Live Debugging
Smalltalk:
- Fix code in the debugger
- Resume execution
- No restart
Most languages:
- Stop, edit, recompile, restart
- Some have limited hot reload
Everything is an Object
Smalltalk:
3 + 4 "Message to object 3"
true ifTrue: [ ... ] "Message to object true"
Most languages:
- Primitives aren’t objects
- Special syntax for control flow
Ruby comes close:
3 + 4 # Message to object 3
5.times { puts "Hi" } # Message to object 5
Message Syntax
Smalltalk:
object doSomethingWith: arg1 and: arg2
Most languages:
object.doSomethingWith(arg1, arg2)
Keyword messages are rare outside Smalltalk!
Transferable Skills
What works everywhere:
Object-Oriented Design
- Encapsulation - Hide implementation
- Polymorphism - Same interface, different behavior
- Inheritance - Build on existing code
- Composition - Combine objects
Every OO language uses these!
Test-Driven Development
Red (failing test) → Green (make it pass) → Refactor
Works in:
- JUnit (Java)
- pytest (Python)
- RSpec (Ruby)
- Jest (JavaScript)
- Any language with a test framework!
Design Patterns
Strategy, Observer, Command, etc.
Same patterns, slightly different implementations!
SOLID Principles
- Single Responsibility
- Open/Closed
- Liskov Substitution
- Interface Segregation
- Dependency Inversion
Universal good design!
Clean Code
- Meaningful names
- Small methods
- Single responsibility
- DRY (Don’t Repeat Yourself)
- Comments when needed
Every language benefits!
Learning Strategy
For Your Next Language
- Understand the paradigm
- Object-oriented?
- Functional?
- Mixed?
- Learn the syntax
- Variables and types
- Control flow
- Function/method definitions
- Grasp the ecosystem
- Package manager
- Build tools
- Popular libraries
- Build something
- Todo list
- Simple game
- Web scraper
- Read others’ code
- GitHub repositories
- Open source projects
- Learn idioms
- Compare to Smalltalk
- How do blocks work here?
- How do collections work?
- What’s similar? Different?
Recommended Path
Beginner → Intermediate:
- Python (practical, popular)
- JavaScript (web development)
- Ruby (similar to Smalltalk)
Intermediate → Advanced:
- A functional language (Elixir or Clojure)
- A systems language (Rust or Go)
- A statically-typed language (TypeScript or Kotlin)
Advanced → Expert:
- Haskell (pure functional)
- Lisp (code as data)
- Something weird (Prolog, Forth, APL)
Variety makes you versatile!
Appreciating Smalltalk More
After learning other languages, you’ll appreciate:
Smalltalk’s Simplicity
Smalltalk:
- 6 keywords total
- Everything is uniform
- No special syntax
Most languages:
- Dozens of keywords
- Special cases everywhere
- Complex syntax
Smalltalk’s Interactivity
Smalltalk:
- Modify running system
- Inspect everything
- No restart needed
Most languages:
- Edit-compile-run cycle
- Limited introspection
- Restart frequently
Smalltalk’s Elegance
Smalltalk:
collection
select: [ :each | each > 10 ]
thenCollect: [ :each | each squared ]
Java:
collection.stream()
.filter(each -> each > 10)
.map(each -> each * each)
.collect(Collectors.toList());
Smalltalk is cleaner!
When to Use Smalltalk
Despite learning other languages, use Smalltalk when:
Best Fit
- Rapid prototyping - Fast development
- Complex domains - Need live exploration
- Research projects - Experiment freely
- Teaching OOP - Best learning environment
- Data visualization - Roassal is excellent
- Personal projects - Enjoy the elegance
Consider Alternatives
- Mobile apps - Limited Smalltalk support
- Machine learning - Python has better libraries
- Frontend web - JavaScript unavoidable
- Game engines - C#/C++ dominate
- Enterprise Java - Required by company
- iOS/macOS apps - Swift required
Right tool for the job!
Contributing Your Skills
Bring Smalltalk Ideas Elsewhere
In Python projects:
- Use list comprehensions (like collect:)
- Write small, focused functions
- Embrace duck typing
- Test-driven development
In Ruby projects:
- Use blocks extensively
- Write expressive DSLs
- Keep methods small
- Favor composition
In Java projects:
- Use streams (Java 8+)
- Write unit tests
- Refactor mercilessly
- Apply design patterns
In JavaScript projects:
- Use functional methods (map, filter)
- Write pure functions
- Test everything
- Embrace prototypes
Be the Smalltalk evangelist!
Teaching Others
Share what you learned:
- Object-oriented thinking
- Test-driven development
- Refactoring techniques
- Design patterns
- Clean code principles
Smalltalk made you a better teacher!
The Polyglot Programmer
Don’t be monolingual!
Benefits of knowing multiple languages:
- Better problem-solving - More tools
- Improved design - Broader perspective
- Career flexibility - More opportunities
- Deeper understanding - See patterns across languages
- Cross-pollination - Bring ideas between languages
Smalltalk + Python + JavaScript = Well-rounded!
Try This!
Expand your horizons:
- Pick a Language
- Choose from recommendations
- One that interests you
- Rewrite a Smalltalk Project
- Todo list from Chapter 31
- Compare implementation
- Note differences
- Learn a New Paradigm
- Try functional programming
- Or logic programming
- Expand your thinking
- Contribute to Open Source
- Find project in new language
- Fix a small bug
- Learn by doing
- Read Classic Books
- “Structure and Interpretation of Computer Programs” (Scheme)
- “The Pragmatic Programmer” (language-agnostic)
- “Clean Code” (Java, but applicable everywhere)
- Join New Communities
- Reddit r/python, r/ruby, etc.
- Discord servers
- Learn community culture
- Build Something Cross-Language
- Smalltalk backend + JavaScript frontend
- Python for ML + Smalltalk for visualization
- Experiment with integration
What You Learned
Looking beyond Smalltalk, you’ve discovered:
- Smalltalk’s Influence
- Shaped modern languages
- Contributed key concepts
- Design patterns originated here
- Translation Skills
- How to map Smalltalk to others
- Similar concepts, different syntax
- Finding equivalents
- Language Recommendations
- Python (practical)
- Ruby (similar)
- JavaScript (web)
- Elixir (functional)
- Rust (systems)
- Paradigms to Explore
- Functional programming
- Logic programming
- Concurrent programming
- Systems programming
- Universal Concepts
- OOP principles
- TDD
- Design patterns
- Clean code
- SOLID principles
- Learning Strategy
- Understand paradigm
- Learn syntax
- Build projects
- Read code
- Compare to Smalltalk
- When to Use What
- Smalltalk for prototyping, teaching
- Python for data science
- JavaScript for web
- Right tool for job
The Journey Continues
You learned Smalltalk, but the adventure doesn’t end!
Keep learning:
- New languages
- New paradigms
- New techniques
- New tools
Keep building:
- Personal projects
- Open source contributions
- Professional work
- Teaching materials
Keep sharing:
- Blog posts
- Tutorials
- Conference talks
- Mentoring
Programming is a lifelong journey!
Looking Ahead
You now understand how to take Smalltalk skills elsewhere! You know:
- What Smalltalk taught you
- How to translate concepts to other languages
- Which languages to learn next
- What paradigms to explore
- How your skills transfer
In Chapter 40, the final chapter, we’ll reflect on Your Smalltalk Journey and discuss where to go from here!
You’ve come so far - let’s celebrate your achievement!
Key Takeaways:
- Smalltalk concepts are universal - Apply everywhere
- Smalltalk influenced most modern languages
- Ruby is syntactically closest to Smalltalk
- Python great for practical work, data science
- JavaScript essential for web development
- Blocks = lambdas in other languages
- OOP principles transfer completely
- TDD works everywhere - same red-green-refactor
- Design patterns originated in Smalltalk
- Learn multiple paradigms - functional, logic, systems
- Each language has trade-offs - no perfect one
- Polyglot programmers are more valuable
- Bring Smalltalk thinking to other languages
- Image-based development unique to Smalltalk
- Live debugging rare outside Smalltalk
- Keep learning, building, sharing throughout your career
| Previous: Chapter 38 - The Smalltalk Community | Next: Chapter 40 - Your Smalltalk Journey |