SlideShare a Scribd company logo
How Functional Programming
Made Me A Better Developer
Cameron Presley
@PCameronPresley
http://blog.TheSoftwareMentor.com
Thank The Sponsors!
Little About Me
 From Knoxville, TN
 Software Engineer at Pilot Flying J
 Musician, board gamer, and mentor
 Co-organizer of FunctionalKnox
Outline
 The Journey of Learning Functional Programming
 How My Style Has Evolved
 How I Think About Software
 Resources
The Journey
Link
Some SOLID Inspiration
 Mnemonic for software design coined by Robert C. Martin
 By following SOLID, we tend to write more maintainable code
 Teach and present on SOLID a lot
 Want to focus on the Single Responsibility Principle
Some SOLID Inspiration
“The single responsibility principle states that every module or class should have
responsibility over a single part of the functionality provided by the software, and that
responsibility should be entirely encapsulated by the class.”
-Wikipedia
Some SOLID Interpretation
What happens if you follow Single Responsibility to the extreme?
Lots of small classes with a single method
Felt like a lot of ceremony
Asking the Twitterverse
Twitter Responds!
Seems Like I Wasn’t The First With This
Idea…
http://blog.ploeh.dk/2014/03/10/solid-the-next-step-is-functional/
Mark’s Thoughts
 Extreme SRP and ISP, leads to a lot of fine grain classes
 An object can be thought of data with behavior
 What if we flipped that concept around?
 Behavior with data
 Sounds like a functional approach to the problem
Time to Learn Functional
 Chose F#
 Familiar with the .NET framework
 Comfortable with the .NET tooling
 Community resources
Steps Along The Journey
Link
First Attempt
Premise
 Decided to port a C# application (Task Snapper)
 Grabs a screenshot every so often
 Focus on the language, not the problem
 Dipping my toes into FP
Implementation
Reflection
 It’s F#!
 Wrote object-oriented in a functional language
 Definitely not idiomatic
 Didn’t really see the point
 Need to learn more about functional
Second Attempt
Premise
 Found out that card games tend to be a great exercise
 Want to use Love Letter as an example card game
 8 different kinds of cards, each with their own special rules
 Write more idiomatic functional
 No classes, no exceptions
Implementation
Reflection
 No exceptions!
 Learning more about data modeling
 Making illegal state unrepresentable
 Game rules a bit more complicated than expected
 Spending a lot of time learning the problem, not solving the problem
Third Attempt
Premise
 Modeling a card game still makes sense
 Something with easier business rules
 Able to solve a real problem without getting lost
 Decided on Blackjack
 Just enough business rules to do something
Making Illegal States Unrepresentable
Business Rules for How Many Points
a Card Is Worth
Business Rules For Adding Points Together
Calculating How Many Points For
A Hand
Reflection
 Comfortable with handling errors without exceptions
 Using pattern matching more effectively
 Working with built-in List operators
 Map and Reduce
 Starting to think about how to use these concepts in C#
At the End
 Worked on/off over the course of the year
 Got frustrated at times
 Spent time learning, asking questions on Twitter, StackOverflow
 Didn’t give up
 Starting to think about these concepts in OOP
Evolution of Style
Link
Writing Testable Code
Why Write Testable Code?
 If code is easy to test, it’s usually easy to maintain
 Implies that hard to test code may not be maintainable
 What defines easy to test code?
A Hypothetical
Pretend we were writing tests around a particular
method. Which one would you rather test?
A) A method that when given the same two inputs, it returns the same output
B) A method that when given the same two inputs, it returns different outputs
Thinking About Testability
 If a method always returns output solely based on inputs, we call that method
pure.
 No side effects or state involved
 Easiest types of test to write
 No mocking, no fake implementations to use
 Frameworks that use this concept
 Reducers (Redux)
 Elm architecture
How Functional Programming Made Me A Better Developer
Improved LINQ
Typical Approach
 When working with a list of data, I’d typically work with a for each loop.
A Different Approach
 In functional programming, typically work with multiples of data as lists
 Typically use built-in list functions (map, filter)
Leveraging LINQ
 Instead of Map and Filter, LINQ uses Select and Where
How Functional Programming Made Me A Better Developer
Useful Interfaces
How I Used Interfaces
What Is an Interface
 It’s a guarantee that a method with that signature exists
 Essentially a contract
 If the contract is not fulfilled, the compiler tells you
 Allows us to use the compiler to find errors
 “Leaning on the compiler”
Pop Quiz!
Given this interface, what should GetById return?
Anything that implements this interface
will always return a Record object, right?
How about this implementation?
Interfaces That Don’t Lie
 Interface says that a Record will always be returned
 If I handle the Record, then the compiler is happy
 However, the compiler can’t enforce that I handled the null condition
 Likely for me to introduce bugs into the system
The Functional Approach
 No concept of null, typically use something called Option or Maybe
 Has two values, either Some<‘a> or None
The Functional Approach
 If a function returns an Option, callers must deal with it.
 Otherwise, code fails to compile
How My Style Evolved
 Using purity to make business rules testable
 Reducing complexity by leveraging LINQ
 Think more about types and interfaces
How I Think About Software
Types of Components
 Boundary
 How data comes in or goes out of the system
 Business Rule
 How to work with data for our business needs
 Workflows
 Combines both boundary and business rule components
Boundary Components
 Anything that deals with getting data in/out of a system is a boundary
 Examples include databases, servers, file system, user input, etc.
 Makes sense to have these components implement an interface for testability
 Inspired by Hexagonal Architecture by Alistair Cockburn
Getting Data In
Getting Data Out
Business Rule Components
 Contain the rules for our application
 Will make up the bulk of your application
 Remember SOLID principles while implementing
 For testability, purity is key
Business Rules
Workflow Components
 Combines both Boundary and Business Rule components
 Can be described as
 Data comes in through the boundary
 Data is processed by the business rules
 Data goes out through the boundary
Bringing It All Together
Bringing It All Together
Bringing It All Together
Bringing It All Together
Wrapping Up
 Learning functional was hard for me
 Lots of failures, but improved incrementally
 Made me re-evaluate how I build software
 Still use functional concepts in my coding
 Even if I’m not using a functional language
Resources
 F Sharp for Fun and Profit (https://fsharpforfunandprofit.com)
 The Book of F#: Breaking Free with Managed Functional Programming by
Dave Fancher
 F# Jumpstart (Pluralsight Course) by Kit Eason
 Mark Seemann’s blog: (http://blog.ploeh.dk)
 Hexagonal Architecture (post) by Alistair Cockburn

More Related Content

Viewers also liked (17)

PDF
Boletín 30/03/2017
Openbank
 
PDF
Marshall hm poster_vra2015
Hannah Marshall
 
PDF
Recull de premsa #Figueres - 30/03/2017
Ajuntament de Figueres
 
DOC
VISTO BUENO AL PLIEGO PARA LA CONTRATACIÓN DE DIFERENTES SERVICIOS PARA LA FE...
Ayuntamiento de Málaga
 
PDF
How to actually get software build
Andreas - Creten
 
PPTX
Нетехническая ТРИЗ для ваших профи, продавца, исследователя
Tatiana Novoselova
 
PDF
The London Underground. Your 100 year old guide to website navigation
Peter Winchester
 
PDF
How to Increase Employee Participation in Social Good Programs
Workology
 
PPTX
Its all about the domain honey
Carola Lilienthal
 
PDF
Towards a software-defined programmable digital infrustructure
Dimension Data Asia Pacific
 
PDF
MeasureWorks - Online Tuesday - Time = Money
MeasureWorks
 
PDF
IL MOBBING ed il BURN OUT
Drughe .it
 
DOCX
Enmienda Conjunta Presupuestos 2017
Unión Progreso y Democracia Alcobendas
 
PDF
The Patterns of Distributed Logging and Containers
SATOSHI TAGOMORI
 
PDF
Top U.S. Imports: Apparel
AFC International
 
PDF
From pair programming to mob architecting
Carola Lilienthal
 
PPTX
Asynchronous micro-services and the unified log
Alexander Dean
 
Boletín 30/03/2017
Openbank
 
Marshall hm poster_vra2015
Hannah Marshall
 
Recull de premsa #Figueres - 30/03/2017
Ajuntament de Figueres
 
VISTO BUENO AL PLIEGO PARA LA CONTRATACIÓN DE DIFERENTES SERVICIOS PARA LA FE...
Ayuntamiento de Málaga
 
How to actually get software build
Andreas - Creten
 
Нетехническая ТРИЗ для ваших профи, продавца, исследователя
Tatiana Novoselova
 
The London Underground. Your 100 year old guide to website navigation
Peter Winchester
 
How to Increase Employee Participation in Social Good Programs
Workology
 
Its all about the domain honey
Carola Lilienthal
 
Towards a software-defined programmable digital infrustructure
Dimension Data Asia Pacific
 
MeasureWorks - Online Tuesday - Time = Money
MeasureWorks
 
IL MOBBING ed il BURN OUT
Drughe .it
 
Enmienda Conjunta Presupuestos 2017
Unión Progreso y Democracia Alcobendas
 
The Patterns of Distributed Logging and Containers
SATOSHI TAGOMORI
 
Top U.S. Imports: Apparel
AFC International
 
From pair programming to mob architecting
Carola Lilienthal
 
Asynchronous micro-services and the unified log
Alexander Dean
 

Similar to How Functional Programming Made Me A Better Developer (20)

PPTX
How Functional Programming Made Me a Better Developer
Cameron Presley
 
PPTX
Functional programming
PiumiPerera7
 
PPTX
Functional Programming
Ryan Riley
 
PPTX
Introduction to Functional Programming
Dave Fancher
 
PDF
Functional Programming in C#: How to write better C# code 1st Edition Enrico ...
tomaimaschjt
 
PPTX
Why functional programming in C# & F#
Riccardo Terrell
 
PPTX
Functional programming (Let's fall back in love with Programming)
Sudipta Mukherjee
 
PDF
Reinventing the Transaction Script (NDC London 2020)
Scott Wlaschin
 
PPTX
Cleaner Code - CodeStock 2019 Edition
Dave Fancher
 
PDF
Beyond PITS, Functional Principles for Software Architecture
Jayaram Sankaranarayanan
 
PPTX
Cleaner Code: How Clean Code is Functional Code
Dave Fancher
 
PPTX
Do you even Function? Guiding Through Functional Interfaces
Dmitry Vinnik
 
PPTX
TDD Best Practices
Attila Bertók
 
PDF
Functional Programming in C#
Giorgio Zoppi
 
PDF
Functional Design Patterns (DevTernity 2018)
Scott Wlaschin
 
PPTX
TechDaysNL 2015 - F# for C# Developers
Ronald Harmsen
 
PPTX
Yin Yangs of Software Development
Naveenkumar Muguda
 
PPTX
Code quality
saber tabatabaee
 
PPTX
Code Quality
Stephen Rodgers
 
ODP
Functional programming
S M Asaduzzaman
 
How Functional Programming Made Me a Better Developer
Cameron Presley
 
Functional programming
PiumiPerera7
 
Functional Programming
Ryan Riley
 
Introduction to Functional Programming
Dave Fancher
 
Functional Programming in C#: How to write better C# code 1st Edition Enrico ...
tomaimaschjt
 
Why functional programming in C# & F#
Riccardo Terrell
 
Functional programming (Let's fall back in love with Programming)
Sudipta Mukherjee
 
Reinventing the Transaction Script (NDC London 2020)
Scott Wlaschin
 
Cleaner Code - CodeStock 2019 Edition
Dave Fancher
 
Beyond PITS, Functional Principles for Software Architecture
Jayaram Sankaranarayanan
 
Cleaner Code: How Clean Code is Functional Code
Dave Fancher
 
Do you even Function? Guiding Through Functional Interfaces
Dmitry Vinnik
 
TDD Best Practices
Attila Bertók
 
Functional Programming in C#
Giorgio Zoppi
 
Functional Design Patterns (DevTernity 2018)
Scott Wlaschin
 
TechDaysNL 2015 - F# for C# Developers
Ronald Harmsen
 
Yin Yangs of Software Development
Naveenkumar Muguda
 
Code quality
saber tabatabaee
 
Code Quality
Stephen Rodgers
 
Functional programming
S M Asaduzzaman
 
Ad

More from Cameron Presley (8)

PPTX
The Engineer's Playbook: Starting a New Role
Cameron Presley
 
PPTX
Taking a Gamble with Functional Domain Modeling
Cameron Presley
 
PPTX
Level Up Your Functional Programming Skills with LINQ
Cameron Presley
 
PPTX
Functional Programming Through Construction : First Principles
Cameron Presley
 
PPTX
Establishing a SOLID Foundation
Cameron Presley
 
PPTX
How to Have Code Reviews That Developers Actually Want
Cameron Presley
 
PPTX
Making the Unstable Stable - An Intro To Testing
Cameron Presley
 
PPTX
Establishing a SOLID Foundation - An Intro to Software Design
Cameron Presley
 
The Engineer's Playbook: Starting a New Role
Cameron Presley
 
Taking a Gamble with Functional Domain Modeling
Cameron Presley
 
Level Up Your Functional Programming Skills with LINQ
Cameron Presley
 
Functional Programming Through Construction : First Principles
Cameron Presley
 
Establishing a SOLID Foundation
Cameron Presley
 
How to Have Code Reviews That Developers Actually Want
Cameron Presley
 
Making the Unstable Stable - An Intro To Testing
Cameron Presley
 
Establishing a SOLID Foundation - An Intro to Software Design
Cameron Presley
 
Ad

Recently uploaded (20)

PDF
How to Hire AI Developers_ Step-by-Step Guide in 2025.pdf
DianApps Technologies
 
PDF
vMix Pro 28.0.0.42 Download vMix Registration key Bundle
kulindacore
 
PDF
Open Chain Q2 Steering Committee Meeting - 2025-06-25
Shane Coughlan
 
PPTX
AEM User Group: India Chapter Kickoff Meeting
jennaf3
 
PPTX
ChiSquare Procedure in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PDF
MiniTool Partition Wizard Free Crack + Full Free Download 2025
bashirkhan333g
 
PPTX
Why Businesses Are Switching to Open Source Alternatives to Crystal Reports.pptx
Varsha Nayak
 
PPTX
Transforming Mining & Engineering Operations with Odoo ERP | Streamline Proje...
SatishKumar2651
 
PPTX
OpenChain @ OSS NA - In From the Cold: Open Source as Part of Mainstream Soft...
Shane Coughlan
 
PDF
Empower Your Tech Vision- Why Businesses Prefer to Hire Remote Developers fro...
logixshapers59
 
PDF
Odoo CRM vs Zoho CRM: Honest Comparison 2025
Odiware Technologies Private Limited
 
PDF
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
PPTX
Agentic Automation: Build & Deploy Your First UiPath Agent
klpathrudu
 
PPTX
Help for Correlations in IBM SPSS Statistics.pptx
Version 1 Analytics
 
PDF
The 5 Reasons for IT Maintenance - Arna Softech
Arna Softech
 
PDF
Top Agile Project Management Tools for Teams in 2025
Orangescrum
 
PDF
AI + DevOps = Smart Automation with devseccops.ai.pdf
Devseccops.ai
 
PDF
iTop VPN With Crack Lifetime Activation Key-CODE
utfefguu
 
PDF
SAP Firmaya İade ABAB Kodları - ABAB ile yazılmıl hazır kod örneği
Salih Küçük
 
PDF
Alexander Marshalov - How to use AI Assistants with your Monitoring system Q2...
VictoriaMetrics
 
How to Hire AI Developers_ Step-by-Step Guide in 2025.pdf
DianApps Technologies
 
vMix Pro 28.0.0.42 Download vMix Registration key Bundle
kulindacore
 
Open Chain Q2 Steering Committee Meeting - 2025-06-25
Shane Coughlan
 
AEM User Group: India Chapter Kickoff Meeting
jennaf3
 
ChiSquare Procedure in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
MiniTool Partition Wizard Free Crack + Full Free Download 2025
bashirkhan333g
 
Why Businesses Are Switching to Open Source Alternatives to Crystal Reports.pptx
Varsha Nayak
 
Transforming Mining & Engineering Operations with Odoo ERP | Streamline Proje...
SatishKumar2651
 
OpenChain @ OSS NA - In From the Cold: Open Source as Part of Mainstream Soft...
Shane Coughlan
 
Empower Your Tech Vision- Why Businesses Prefer to Hire Remote Developers fro...
logixshapers59
 
Odoo CRM vs Zoho CRM: Honest Comparison 2025
Odiware Technologies Private Limited
 
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
Agentic Automation: Build & Deploy Your First UiPath Agent
klpathrudu
 
Help for Correlations in IBM SPSS Statistics.pptx
Version 1 Analytics
 
The 5 Reasons for IT Maintenance - Arna Softech
Arna Softech
 
Top Agile Project Management Tools for Teams in 2025
Orangescrum
 
AI + DevOps = Smart Automation with devseccops.ai.pdf
Devseccops.ai
 
iTop VPN With Crack Lifetime Activation Key-CODE
utfefguu
 
SAP Firmaya İade ABAB Kodları - ABAB ile yazılmıl hazır kod örneği
Salih Küçük
 
Alexander Marshalov - How to use AI Assistants with your Monitoring system Q2...
VictoriaMetrics
 

How Functional Programming Made Me A Better Developer

  • 1. How Functional Programming Made Me A Better Developer Cameron Presley @PCameronPresley http://blog.TheSoftwareMentor.com
  • 3. Little About Me  From Knoxville, TN  Software Engineer at Pilot Flying J  Musician, board gamer, and mentor  Co-organizer of FunctionalKnox
  • 4. Outline  The Journey of Learning Functional Programming  How My Style Has Evolved  How I Think About Software  Resources
  • 6. Some SOLID Inspiration  Mnemonic for software design coined by Robert C. Martin  By following SOLID, we tend to write more maintainable code  Teach and present on SOLID a lot  Want to focus on the Single Responsibility Principle
  • 7. Some SOLID Inspiration “The single responsibility principle states that every module or class should have responsibility over a single part of the functionality provided by the software, and that responsibility should be entirely encapsulated by the class.” -Wikipedia
  • 8. Some SOLID Interpretation What happens if you follow Single Responsibility to the extreme? Lots of small classes with a single method Felt like a lot of ceremony
  • 11. Seems Like I Wasn’t The First With This Idea… http://blog.ploeh.dk/2014/03/10/solid-the-next-step-is-functional/
  • 12. Mark’s Thoughts  Extreme SRP and ISP, leads to a lot of fine grain classes  An object can be thought of data with behavior  What if we flipped that concept around?  Behavior with data  Sounds like a functional approach to the problem
  • 13. Time to Learn Functional  Chose F#  Familiar with the .NET framework  Comfortable with the .NET tooling  Community resources
  • 14. Steps Along The Journey Link
  • 16. Premise  Decided to port a C# application (Task Snapper)  Grabs a screenshot every so often  Focus on the language, not the problem  Dipping my toes into FP
  • 18. Reflection  It’s F#!  Wrote object-oriented in a functional language  Definitely not idiomatic  Didn’t really see the point  Need to learn more about functional
  • 20. Premise  Found out that card games tend to be a great exercise  Want to use Love Letter as an example card game  8 different kinds of cards, each with their own special rules  Write more idiomatic functional  No classes, no exceptions
  • 22. Reflection  No exceptions!  Learning more about data modeling  Making illegal state unrepresentable  Game rules a bit more complicated than expected  Spending a lot of time learning the problem, not solving the problem
  • 24. Premise  Modeling a card game still makes sense  Something with easier business rules  Able to solve a real problem without getting lost  Decided on Blackjack  Just enough business rules to do something
  • 25. Making Illegal States Unrepresentable
  • 26. Business Rules for How Many Points a Card Is Worth
  • 27. Business Rules For Adding Points Together
  • 28. Calculating How Many Points For A Hand
  • 29. Reflection  Comfortable with handling errors without exceptions  Using pattern matching more effectively  Working with built-in List operators  Map and Reduce  Starting to think about how to use these concepts in C#
  • 30. At the End  Worked on/off over the course of the year  Got frustrated at times  Spent time learning, asking questions on Twitter, StackOverflow  Didn’t give up  Starting to think about these concepts in OOP
  • 33. Why Write Testable Code?  If code is easy to test, it’s usually easy to maintain  Implies that hard to test code may not be maintainable  What defines easy to test code?
  • 34. A Hypothetical Pretend we were writing tests around a particular method. Which one would you rather test? A) A method that when given the same two inputs, it returns the same output B) A method that when given the same two inputs, it returns different outputs
  • 35. Thinking About Testability  If a method always returns output solely based on inputs, we call that method pure.  No side effects or state involved  Easiest types of test to write  No mocking, no fake implementations to use  Frameworks that use this concept  Reducers (Redux)  Elm architecture
  • 38. Typical Approach  When working with a list of data, I’d typically work with a for each loop.
  • 39. A Different Approach  In functional programming, typically work with multiples of data as lists  Typically use built-in list functions (map, filter)
  • 40. Leveraging LINQ  Instead of Map and Filter, LINQ uses Select and Where
  • 43. How I Used Interfaces
  • 44. What Is an Interface  It’s a guarantee that a method with that signature exists  Essentially a contract  If the contract is not fulfilled, the compiler tells you  Allows us to use the compiler to find errors  “Leaning on the compiler”
  • 45. Pop Quiz! Given this interface, what should GetById return? Anything that implements this interface will always return a Record object, right?
  • 46. How about this implementation?
  • 47. Interfaces That Don’t Lie  Interface says that a Record will always be returned  If I handle the Record, then the compiler is happy  However, the compiler can’t enforce that I handled the null condition  Likely for me to introduce bugs into the system
  • 48. The Functional Approach  No concept of null, typically use something called Option or Maybe  Has two values, either Some<‘a> or None
  • 49. The Functional Approach  If a function returns an Option, callers must deal with it.  Otherwise, code fails to compile
  • 50. How My Style Evolved  Using purity to make business rules testable  Reducing complexity by leveraging LINQ  Think more about types and interfaces
  • 51. How I Think About Software
  • 52. Types of Components  Boundary  How data comes in or goes out of the system  Business Rule  How to work with data for our business needs  Workflows  Combines both boundary and business rule components
  • 53. Boundary Components  Anything that deals with getting data in/out of a system is a boundary  Examples include databases, servers, file system, user input, etc.  Makes sense to have these components implement an interface for testability  Inspired by Hexagonal Architecture by Alistair Cockburn
  • 56. Business Rule Components  Contain the rules for our application  Will make up the bulk of your application  Remember SOLID principles while implementing  For testability, purity is key
  • 58. Workflow Components  Combines both Boundary and Business Rule components  Can be described as  Data comes in through the boundary  Data is processed by the business rules  Data goes out through the boundary
  • 59. Bringing It All Together
  • 60. Bringing It All Together
  • 61. Bringing It All Together
  • 62. Bringing It All Together
  • 63. Wrapping Up  Learning functional was hard for me  Lots of failures, but improved incrementally  Made me re-evaluate how I build software  Still use functional concepts in my coding  Even if I’m not using a functional language
  • 64. Resources  F Sharp for Fun and Profit (https://fsharpforfunandprofit.com)  The Book of F#: Breaking Free with Managed Functional Programming by Dave Fancher  F# Jumpstart (Pluralsight Course) by Kit Eason  Mark Seemann’s blog: (http://blog.ploeh.dk)  Hexagonal Architecture (post) by Alistair Cockburn

Editor's Notes

  • #15: I worked on/off with functional for a year Lots of heads down, then come up for air for a bit Rinse and repeat Took three attempts for me to really “get” it