Editor: Michael Swaine
PragPub on Medium
Articles from the Archives
PragPub was a monthly magazine by and for software developers started in 2009 by Michael Swaine, former editor of Dr. Dobb’s Journal. The magazine began as a showcase for authors and their books and evolved into an independent publication about web and mobile development and the latest languages and tools for programmers. Check back frequently — we’ll be adding articles every week.
Articles by Issue
December 2019
The Knee-Jerk Else Clause: The Case Against Else
Automate the Boring Stuff: Antonio on Books
Small Change: The PragPub Puzzle
October 2019
It’s Just Artificial Intelligence: The Kobayashi Maru
Swarm Algorithms: Programming Your Way Out of a Paper Bag
September 2019
The Smartphone Revolution: Making Everything Accessible
It’s Just Artificial Intelligence: What’s Different Now?
Vaping Venture: The PragPub Puzzle
August 2019
It’s Just Artificial Intelligence: History and Modern Applications
Geographically Distributed Agile Teams, Part IV: Equal Access
June 2019
Geographically Distributed Agile Teams, Part III: Serendipitous Communications
May 2019
Geographically Distributed Agile Teams, Part II: Communications Technology
April 2019
Brie as Kree: The PragPub Puzzle
March 2019
Still Test-Driving After All These Years
Principles for Large Organizations: An Invitation to Brainstorm
I Bless the Rains Down in Cupertino: The PragPub Puzzle
February 2019
Does Machine Learning Really Involve Data? Refining Our Terms
The Post-PC Era — A Moment in the History of the Computer: Everywhere and Nowhere
January 2019
From The Pragmatic Bookshelf, Hot off the Presses: Systems Programming in the Twenty-First Century
December 2018
There’s Only One Everything … Or Is There? To Infinity — and Beyond!
The Big Boys Move In — A Moment in the History of the Computer: the Coming of the IBM PC
Dark Stories: The PragPub Puzzle
November 2018
Planning Your Tech Book: The Value of Brain Dumps and Outlines
October 2018
Watching Too Much: The PragPub Puzzle
September 2018
Genetic Algorithms: A Facet of Machine Learning
June 2018
The Soirée: A Moment in the History of the Computer, with Digressions
Auto Layout, Playgrounds, and Xcode: When to Leave the Playground
October 2017
June 2017
TDD Guided by ZOMBIES: Zombies to the Rescue by James Grenning
July 2017
Chris Crawford vs. the Dragon: One Man’s Quest to Remake Gaming
December 2016
April 2016
Analyzing Cultural Domains with Python
March 2016
When Co-Workers Are Fired or Laid Off
September 2014
When TDD Doesn’t Matter: What Do You Value?
February 2014
Don’t Make Me Think (and Other Excellent Advice): Antonio on Books
June 2013
Programming Elixir: A Gentle Introduction
April 2013
Estimation: The Best We Can Do
Dependent Types: A New Paradigm?
March 2013
Being the Geek Who Fits: Don’t Forget That You’re Interviewing Them, Too
Finding the Geek Who Fits: Five Tips for Hiring as an Agile Team
February 2013
Estimation is Evil: Overcoming the Estimation Obsession
Deploying with JRuby in the Cloud: Adjusting the Settings on Your Java Machine
January 2013
Functional Programming Basics: What’s It All About?
Web Programming in Haskell: Part Two
December 2012
Web Programming in Haskell: Part One
Choice Bits: Hot Books and The Talk of the Tech
October 2012
Thinking Functionally with Haskell: Playing with Haskell
September 2012
Thinking Functionally with Haskell
August 2012
Functional Thinking for the Imperative Mind: Getting Your Feet Wet
Thinking Functionally with Haskell: A Deep Dive into the Functional Pool
June 2012
The Beauty of Concurrency in Go: Beyond “Hello World”
May 2012
Scala for the Intrigued: Recursions and Tail Call Optimization
March 2012
The NOR Machine: Build a CPU with Only One Instruction
April 2012
Technical Blogging: An Interview with Antonio Cangiano
January 2012
Unit Tests Are FIRST: Fast, Isolated, Repeatable, Self-Verifying, and Timely
Meet the Team: Development Editor Brian Hogan
October 2011
Up Front: It’s PragProWriMo Time!
But We Have These Distributed Folks: Can Distributed Teams Be Effective?
September 2011
The Only Agile Tools You’ll Ever Need: A Sanity Check on the Use of Tools
August 2011
July 2011
Growing a DSL with Clojure: Clojure Makes DSL Writing Straightforward
April 2011
Testing Arduino Code: An Everyday JRuby Adventure
February 2011
Abstraction: How to Tell a Cat from a Dog
January 2011
Code Coupling: Reducing Dependency in Your Code
Grokking Pattern Matching and List Comprehensions: Two Language Features that Rock
Everyday JRuby Part 2: Sharing Your Software
December 2010
Cohesive Software Design: Cohesion Makes Code Easier to Understand, Debug, and Test
Chad Fowler on Ruby: An Interview with a Ruby Pioneer
Everyday JRuby Part 1: Writing a Plugin
August 2010
Page Objects in Python: Automating Page Checking without Brittleness
April 2010
Tangled Up in Tools: What’s Wrong with Libraries, and What to Do About It
March 2010
JavaScript: It’s Not Just for Browsers Any More
December 2009
Choice Bits: Overheard on the Intertubes
September 2009
Responsive Design: Coming to Grips with the Chaos That Is Software Design
August 2009
iPhone, Meet Cucumber: Testing Your iPhone Apps with Cucumber
Articles by Author
Kent Beck
Responsive Design: Coming to Grips with the Chaos That Is Software Design
When TDD Doesn’t Matter: What Do You Value?
Michael Bevilacqua-Linn
Functional Thinking for the Imperative Mind: Getting Your Feet Wet
Frances Buontempo
Genetic Algorithms: A Facet of Machine Learning
Swarm Algorithms: Programming Your Way Out of a Paper Bag
Does Machine Learning Really Involve Data? Refining Our Terms
Paul Callaghan
Thinking Functionally with Haskell: Playing with Haskell
Thinking Functionally with Haskell: Types? Tests? We Need a New Word
Thinking Functionally with Haskell: A Deep Dive into the Functional Pool
Web Programming in Haskell: Part One
Web Programming in Haskell: Part Two
Dependent Types: A New Paradigm?
Antonio Cangiano
Automate the Boring Stuff: Antonio on Books
Don’t Make Me Think (and Other Excellent Advice): Antonio on Books
Erin Dees
There’s Only One Everything … Or Is There? To Infinity — and Beyond!
iPhone, Meet Cucumber: Testing Your iPhone Apps with Cucumber
Everyday JRuby Part 1: Writing a Plugin
Everyday JRuby Part 2: Sharing Your Software
Testing Arduino Code: An Everyday JRuby Adventure
Alexander Demin
The Beauty of Concurrency in Go: Beyond “Hello World”
The NOR Machine: Build a CPU with Only One Instruction
Tim Ottinger and Jeff Langr
Unit Tests Are FIRST: Fast, Isolated, Repeatable, Self-Verifying, and Timely
Cohesive Software Design: Cohesion Makes Code Easier to Understand, Debug, and Test
Abstraction: How to Tell a Cat from a Dog
Code Coupling: Reducing Dependency in Your Code
Pair Programming Benefits: Two Heads Are Better than One
The Only Agile Tools You’ll Ever Need: A Sanity Check on the Use of Tools
But We Have These Distributed Folks: Can Distributed Teams Be Effective?
Principles for Large Organizations: An Invitation to Brainstorm (Tim Ottinger)
Adam Goucher
Page Objects in Python: Automating Page Checking without Brittleness
James Grenning
TDD Guided by ZOMBIES: Zombies to the Rescue
Still Test-Driving After All These Years
Jason Huggins
JavaScript: It’s Not Just for Browsers Any More
Ron Jeffries
Estimation is Evil: Overcoming the Estimation Obsession
Estimation: The Best We Can Do
Joe Kutner
Deploying with JRuby in the Cloud: Adjusting the Settings on Your Java Machine
Andy Lester
Being the Geek Who Fits: Don’t Forget That You’re Interviewing Them, Too
Brian MacDonald
Planning Your Tech Book: The Value of Brain Dumps and Outlines
Robert C. Martin (“Uncle Bob”)
Functional Programming Basics: What’s It All About?
Eric Redmond
It’s Just Artificial Intelligence: History and Modern Applications
It’s Just Artificial Intelligence: What’s Different Now?
It’s Just Artificial Intelligence: The Kobayashi Maru
Johanna Rothman and Mark Kilby
Geographically Distributed Agile Teams, Part II: Communications Technology
Geographically Distributed Agile Teams, Part III: Serendipitous Communications
Geographically Distributed Agile Teams, Part IV: Equal Access
Johanna Rothman
Finding the Geek Who Fits: Five Tips for Hiring as an Agile Team
Johanna Rothman and Andy Lester
When Co-Workers Are Fired or Laid Off
Erica Sadun
Auto Layout, Playgrounds, and Xcode: When to Leave the Playground
The Knee-Jerk Else Clause: The Case Against Else
Ambrose Bonnaire-Sergeant
Growing a DSL with Clojure: Clojure Makes DSL Writing Straightforward
Maik Schmidt
Venkat Subramaniam
Scala for the Intrigued: Recursions and Tail Call Optimization
Michael Swaine
Chris Crawford vs. the Dragon: One Man’s Quest to Remake Gaming
The Soirée: A Moment in the History of the Computer, with Digressions
The Big Boys Move In — A Moment in the History of the Computer: the Coming of the IBM PC
Up Front: It’s PragProWriMo Time!
Meet the Team: Development Editor Brian Hogan
Choice Bits: Overheard on the Intertubes
From The Pragmatic Bookshelf, Hot off the Presses: Systems Programming in the Twenty-First Century
The Post-PC Era — A Moment in the History of the Computer: Everywhere and Nowhere
Technical Blogging: An Interview with Antonio Cangiano
Chad Fowler on Ruby: An Interview with a Ruby Pioneer
Watching Too Much: The PragPub Puzzle
Vaping Venture: The PragPub Puzzle
Dark Stories: The PragPub Puzzle
Small Change: The PragPub Puzzle
I Bless the Rains Down in Cupertino: The PragPub Puzzle
Brie as Kree: The PragPub Puzzle
Choice Bits: Hot Books and The Talk of the Tech
Bruce Tate
Grokking Pattern Matching and List Comprehensions: Two Language Features that Rock
Mike Taylor
Tangled Up in Tools: What’s Wrong with Libraries, and What to Do About It
Dave Thomas
Programming Elixir: A Gentle Introduction
Carmine Zaccagnino
The Smartphone Revolution: Making Everything Accessible
Dmitry Zinoviev
Articles by Topic
Agile, People, Project Management, Leadership, and Teams
The Only Agile Tools You’ll Ever Need: A Sanity Check on the Use of Tools
Pair Programming Benefits: Two Heads Are Better than One
But We Have These Distributed Folks: Can Distributed Teams Be Effective?
Principles for Large Organizations: An Invitation to Brainstorm
Geographically Distributed Agile Teams, Part II: Communications Technology
Geographically Distributed Agile Teams, Part III: Serendipitous Communications
Geographically Distributed Agile Teams, Part IV: Equal Access
Being the Geek Who Fits: Don’t Forget That You’re Interviewing Them, Too
Finding the Geek Who Fits: Five Tips for Hiring as an Agile Team
When Co-Workers Are Fired or Laid Off
Computer History
Chris Crawford vs. the Dragon: One Man’s Quest to Remake Gaming
The Big Boys Move In — A Moment in the History of the Computer: the Coming of the IBM PC
The Smartphone Revolution: Making Everything Accessible
The Soirée: A Moment in the History of the Computer, with Digressions
From The Pragmatic Bookshelf, Hot off the Presses: Systems Programming in the Twenty-First Century
Choice Bits: Overheard on the Intertubes
The Post-PC Era — A Moment in the History of the Computer: Everywhere and Nowhere
Chad Fowler on Ruby: An Interview with a Ruby Pioneer
Choice Bits: Hot Books and The Talk of the Tech
Data Science and Artificial Intelligence
Analyzing Cultural Domains with Python
Genetic Algorithms: A Facet of Machine Learning
It’s Just Artificial Intelligence: History and Modern Applications
It’s Just Artificial Intelligence: What’s Different Now?
It’s Just Artificial Intelligence: The Kobayashi Maru
Swarm Algorithms: Programming Your Way Out of a Paper Bag
Does Machine Learning Really Involve Data? Refining Our Terms
Fun and Puzzles
Watching Too Much: The PragPub Puzzle
Vaping Venture: The PragPub Puzzle
Dark Stories: The PragPub Puzzle
Small Change: The PragPub Puzzle
I Bless the Rains Down in Cupertino: The PragPub Puzzle
Brie as Kree: The PragPub Puzzle
Mathematics
There’s Only One Everything … Or Is There? To Infinity — and Beyond!
Programming
Auto Layout, Playgrounds, and Xcode: When to Leave the Playground
The Knee-Jerk Else Clause: The Case Against Else
Growing a DSL with Clojure: Clojure Makes DSL Writing Straightforward
The Beauty of Concurrency in Go: Beyond “Hello World”
Thinking Functionally with Haskell: Types? Tests? We Need a New Word
Thinking Functionally with Haskell: Playing with Haskell
Thinking Functionally with Haskell: A Deep Dive into the Functional Pool
Web Programming in Haskell: Part One
Web Programming in Haskell: Part Two
Functional Thinking for the Imperative Mind: Getting Your Feet Wet
Functional Programming Basics: What’s It All About?
The NOR Machine: Build a CPU with Only One Instruction
Page Objects in Python: Automating Page Checking without Brittleness
Grokking Pattern Matching and List Comprehensions: Two Language Features that Rock
Programming Elixir: A Gentle Introduction
Deploying with JRuby in the Cloud: Adjusting the Settings on Your Java Machine
Dependent Types: A New Paradigm?
JavaScript: It’s Not Just for Browsers Any More
Software Architecture and Design
Estimation is Evil: Overcoming the Estimation Obsession
Estimation: The Best We Can Do
Responsive Design: Coming to Grips with the Chaos That Is Software Design
Abstraction: How to Tell a Cat from a Dog
Code Coupling: Reducing Dependency in Your Code
Scala for the Intrigued: Recursions and Tail Call Optimization
Tangled Up in Tools: What’s Wrong with Libraries, and What to Do About It
Technical Writing and Books
Planning Your Tech Book: The Value of Brain Dumps and Outlines
Up Front: It’s PragProWriMo Time!
Meet the Team: Development Editor Brian Hogan
Automate the Boring Stuff: Antonio on Books
Don’t Make Me Think (and Other Excellent Advice): Antonio on Books
Technical Blogging: An Interview with Antonio Cangiano
Testing
TDD Guided by ZOMBIES: Zombies to the Rescue by James Grenning
Unit Tests Are FIRST: Fast, Isolated, Repeatable, Self-Verifying, and Timely
Cohesive Software Design: Cohesion Makes Code Easier to Understand, Debug, and Test
Still Test-Driving After All These Years
iPhone, Meet Cucumber: Testing Your iPhone Apps with Cucumber
Everyday JRuby Part 1: Writing a Plugin
Everyday JRuby Part 2: Sharing Your Software