podcast
details
.com
Print
Share
Look for any podcast host, guest or anyone
Search
Showing episodes and shows of
Christoph Neumann And Nate Jones
Shows
Functional Design in Clojure
Ep 114: Brand New, Again
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "what's old is new again". We find ourselves staring at code for the first time—even though we wrote some of it! Our discussion includes: Christoph re-opened his own code base after 14 months! Nate joined a software team with a large, legacy code base. Why do...
2024-05-02
16 min
Functional Design in Clojure
Ep 100: Thanks Overflow
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "thankfulness". We reflect on Clojure, the community, and how much we have to be thankful for. Our discussion includes: It's our 100th episode!!! Why we are thankful for Clojure and the community. The podcast origin story. Long haul programming. How Clojure keeps the mental burden...
2023-11-23
35 min
Functional Design in Clojure
Ep 098: Composed Learnings
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "composition is life". We reflect on keeping the necessary mess at the edges so our core can be composed together with beauty and simplicity. Our discussion includes: Our reflections on the episodes in this series. The best concepts from the episodes in this series. How...
2023-11-09
26 min
Functional Design in Clojure
Ep 097: Application of Composition
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "composing your application". We get a handle on bringing I/O resources together in an application. Our discussion includes: What is a "handle"? Why is it called that? More puns! How do you handle I/O handles? How do you keep the pure and side-effecting...
2023-11-02
28 min
Functional Design in Clojure
Ep 096: Gaming Data
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "playing games with data." We go back to start and play through a composition strategy to see where we land. Our discussion includes: The return of Tic Tac Toe. It's back! The biggest difference between object-oriented and functional composition. Can a game board play its...
2023-10-26
26 min
Functional Design in Clojure
Ep 095: Composing Core
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "core and composition." We venture toward the core of a solution. Our discussion includes: Why do functional programmers like to talk about composition? What composition means in object-oriented programming vs functional programming. Must simple be simplistic? What is idiomatic composition? Common kinds of functions. Why...
2023-10-19
17 min
Functional Design in Clojure
Ep 094: Concrete Composition
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "decomposition." We help our code through a breakup so it can find its true colors. Our discussion includes: How to process text and add color. When is it time to decompose? Return of the box mix! How to separate transformation from I/O. How to...
2023-10-12
15 min
Functional Design in Clojure
Ep 093: Waffle Cakes
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "effective composition." We search for that sweet spot between full-featured mixes and simple ingredients when crafting your software recipes. Our discussion includes: What makes code "composable"? What makes it "not composable"? What baking has in common with software design. What baking does not have in...
2023-10-05
14 min
Functional Design in Clojure
Ep 092: Freeing Limits
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "freedom through constraints." We bump into limiting constraints and learn to love their freedoms. Our discussion includes: Why expressiveness isn't everything. Causes of combinatorial complexity. The long-term benefits of decreased complexity. Problems Clojure eliminates with its language design. Why complexity feels so good when you're...
2023-09-28
17 min
Functional Design in Clojure
Ep 091: Combo Boost
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "effective expressiveness." We compose our thoughts on why Clojure expressiveness is so effective but can be so hard to learn. Our discussion includes: Why Clojure can give you a boost as a developer—in the short and long term. Our definition of expressiveness, and why it...
2023-09-22
12 min
Functional Design in Clojure
Ep 090: Conditional Results
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "cond-> and cond->>." We devote some time to two functions that are indispensable when computations require variation. Selected quotes: "Our love of Clojure is unconditional!" "These are all about conditional operations." "It's shorter and easier to understand, which is uncommon in development." "That gave me...
2020-12-18
25 min
Functional Design in Clojure
Ep 089: Branching Out
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "if, when, case, condp, and cond." We wander through the myriad ways of making decisions and listing choices in Clojure. Selected quotes: "Clojure is all about the practical." "Never be afraid of the in-line if." "We need to conserve parentheses, for future generations of lispers." "...
2020-11-20
38 min
Functional Design in Clojure
Ep 088: Do Dorun Run!
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "doall, dorun, doseq, and run!." We eagerly discuss the times we need to interact with the messy world from our nice clean language. Selected quotes: "We're going to talk about not being lazy, for once." "Laziness is a virtue." "Clojure loves immutability. The world loves...
2020-11-13
26 min
Functional Design in Clojure
Ep 087: Polymorphic Metal
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "multimethods." We discuss polymorphism and how we tackle dynamic data with families of functions. Selected quotes: "You don't have to reach for polymorphism as quickly in Clojure." "Polymorphism at its simplest." "A natural fit for processing a list of heterogeneous things." "Our natural tool of...
2020-10-23
29 min
Functional Design in Clojure
Ep 086: Let Tricks
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "let." Let us share some tricks to reduce nesting and make your code easier to understand. Selected quotes: "It's really about avoiding nesting." "Functions grow as a function of their nesting." "I don't want to start doing math on a nil!" "It's a clue that...
2020-10-20
32 min
Functional Design in Clojure
Ep 085: For for the When
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "for." We talk about this data generating macro, while we remember situations when it was useful. Selected quotes: "You are generating a new sequence in a declarative way." "In typical Clojure fashion, I looked up the definition." "Forgive us for our puns." "Where the while...
2020-09-25
29 min
Functional Design in Clojure
Ep 084: All Sorts
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "sort and sort-by." We lay out a list of ways to sort your data, ordered by their relative power. Selected quotes: "Clojure core is a shared vocabulary that we all can use." "I can't sort things in my mind, I'll just have the computer do...
2020-09-18
27 min
Functional Design in Clojure
Ep 083: Sift Sans Sort
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "partition-by and group-by." We get a handle on big buckets of data by sifting elements into smaller buckets. Selected quotes: "If you know the core toolbox better, you will use it more effectively." "Is there a group-by hiding in this code that uses filter?" "Be...
2020-09-04
24 min
Functional Design in Clojure
Ep 082: Filter and Friends
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "filter, filterv, remove, keep, and keep-indexed." We talk about sifting data and marvel at the simple function that can turn two steps into one. Selected quotes: "It's not just linguistic, it helps it make more sense." "We should be more positive about our intent." "Clojure's...
2020-08-07
27 min
Functional Design in Clojure
Ep 081: List No More
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "first, second, key, and val." We talk about positive nothing and the proliferation of tuples. Selected quotes: "Let our ramblings help your code ramblings." "First is the key." "Nil, the positive statement of nothing." "Key and val are a hint that the bit of data...
2020-07-31
26 min
Functional Design in Clojure
Ep 080: Apply as Needed
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "apply." We take time to unroll some examples of this function. Selected quotes: "If you go and read the code in core, which I would encourage." "And all the rest..." "Why is there no third function?" "If you're using reduce, you may be missing an...
2020-07-24
22 min
Functional Design in Clojure
Ep 079: Compose Thyself
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "comp." We create a whole episode by combining examples of useful uses of comp. Selected quotes: "It's the Voltron of functions." "Our only tool for the job is functions." "Getting your higher-order functional thinking going." "Not only is it concise, it's really easy to understand...
2020-07-03
27 min
Functional Design in Clojure
Ep 078: Impartial Thoughts
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "partial." We cover some of the ways we use partial, without getting too literal. Selected quotes: "We love punning so much, we pun in our code." "It didn't help that I encountered this in academia." "Not the function you have, but the function you need." "...
2020-06-19
25 min
Functional Design in Clojure
Ep 077: Thread Some
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "some-> and some->>." We spend some time going through how these macros help keep our code nil-safe. Selected quotes: "Keep trying till you hit a nil and then stop." "That seemed all well and good, and then I hit nil." "It ends up being just...
2020-06-12
23 min
Functional Design in Clojure
Ep 076: Multiple Views on Juxt
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "juxt." We take a turn with juxt, looking at all the ways it can help line up data. Selected quotes: "When it feels like core is missing something obvious, there's probably an idiom you need to learn." "The way you become an excellent writer of...
2020-06-05
30 min
Functional Design in Clojure
Ep 075: Merge With Fun
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "merge-with." We focus in on merge-with, a powerful function for aggregating data. Selected quotes: "We pick up idioms from other people." "What sounds insane at face value actually starts to make a lot of sense." "It's just a filter, you don't even have to write...
2020-05-22
26 min
Functional Design in Clojure
Ep 074: Deploy, They Said. It'll Be Fun, They Said.
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Deploying Clojure." We survey the myriad ways we've used to launch our code into production, and laugh about the various complexities we've found. Selected quotes: "How do you get closure on the development of your Clojure code?" "What do you mean by production?" "Tomcat goes...
2020-05-15
27 min
Functional Design in Clojure
Ep 073: Silent Sockets
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Checking websocket health." We worry about the health of our websockets and, after looking for help from the standards bodies, roll up our sleeves and handle it ourselves. Selected quotes: "It's the ghosting in the websocket world." "With polling, every request is a fresh opportunity...
2020-04-17
38 min
Functional Design in Clojure
Ep 072: Sea of Sockets
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Organizing our websocket code." We switch to using a component to manage our websockets, enabling ease of development and future growth. Selected quotes: "It feels like every time I use a global, a butterfly dies." "We don't want to leave the REPL!" "It's important to...
2020-04-03
32 min
Functional Design in Clojure
Ep 071: Socket Synergy
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Using websockets for notification." We wander into the weeds, jumping through the myriad hoops required to deliver a simple notification. Selected quotes: "It's like we're taking a regular series and upgrading it somehow." "Welcome to programming, where you'll spend hours diving into rabbit holes; and...
2020-03-20
29 min
Functional Design in Clojure
Ep 070: Socket Circus
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Websockets." We talk about spontaneously sending data from the server to the client to address our users' insecurities. Selected quotes: "Classic engineering solution, let's just bend a couple of assumptions." "Reloading the web page is 1995-style integration." "Poll every tenth of a second? Yeah, that'll...
2020-03-13
29 min
Functional Design in Clojure
Ep 069: Stuck in the Web
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Request handler pitfalls." We examine our history writing web handlers and talk about all the ways we've broken them. Selected quotes: "Doing a pitfalls episode is easy, because you just need to look at your scars." "Letting exceptions escape is TMI for the web." "Multiple...
2020-02-28
28 min
Functional Design in Clojure
Ep 068: Static on the Line
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Serving static assets." We tease apart the layers involved in serving static assets and are surprised by how many we find. Selected quotes: "You'd think that serving up plain old files would be nice and simple." "MIME types are an explosion of complexity." "Simplicity is...
2020-02-21
24 min
Functional Design in Clojure
Ep 067: Handling Handler's Handles
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Resource management for web handlers." We manage to find a way to get our handlers the resources they need to get real work done. Selected quotes: "Let's get some work done in these web handlers!" "The handler needs a handle." "Handlers do not live on...
2020-02-14
23 min
Functional Design in Clojure
Ep 066: Compose the Codec
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Making middleware to handle JSON." We reinvent the wheel, and along the way discover a few reasons why you might want to do so as well. Selected quotes: "Ring's choice: all of HTTP is a function." "Every concern is a function you compose in." "It's...
2020-01-31
28 min
Functional Design in Clojure
Ep 065: Stuck in the Middle
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Ring middleware." We find that the middle is a very good place to start when almost everything is composed functions. Selected quotes: "It's all fun from Ring on up!" "I want to have more than one handler." "We want to build up different scenarios declaratively." "...
2020-01-24
30 min
Functional Design in Clojure
Ep 064: Put Ring on It
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Ring, the foundation of Clojure HTTP" We focus on the bedrock abstraction for all Clojure web applications and marvel at its simplicity. Selected quotes: "Somebody wants to make a web app, and suddenly they're up against all these layers." "The law of leaky abstractions is...
2020-01-17
19 min
Functional Design in Clojure
Ep 063: Web of Complexity
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "HTTP and the Web of Complexity." We launch a new series and immediately get tangled in the many layers that make up the web. Selected quotes: "Clojure has several ways of getting to the web." "There really are a lot of layers." "There are a...
2020-01-10
22 min
Functional Design in Clojure
Ep 062: 2019 in Review
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "2019." We look back at the past year and highlight our favorite episodes. Selected quotes: "2020 is the year of perfect hindsight." "Even we are surprised at what we recorded." "Mutation is like weak bricks in your solution tower, they could fail you at any time." "The...
2020-01-03
36 min
Functional Design in Clojure
Ep 061: Transcendental Transformations
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Transducers." We unpack transducers and find a familiar pattern that enables freedom from collections. Selected quotes: "The humble sequence. It is a mighty abstraction." "Your reducing function can get more abstract by passing in the reducing function that handles producing the result." "This is mind-bending...
2019-12-27
28 min
Functional Design in Clojure
Ep 060: Reduce Done Quick
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Reducers." We look at clojure.core.reducers and how it extracts performance by composing reducing functions. Selected quotes: "The seq abstraction, it's rather lazy." "It's amazing how much work laziness requires." "It doesn't work out as well. That's a wonderful way of saying 'wrong'." "Because...
2019-12-20
26 min
Functional Design in Clojure
Ep 059: Lining It Up
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Sequences." We examine the sequence abstraction and then ponder how it helps and hinders our data transformation. Selected quotes: "There is only one filter, map, and reduce. They need to be able to interpret all collections." "Primitives only take you so far." "The first thing...
2019-12-13
32 min
Functional Design in Clojure
Ep 058: Reducing It Down
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Reduce and reducing functions" We take a long hard look at reduce and find the first of many generally useful nuggets inside. Selected quotes: "Parentheses are a joy, they are hugs around your code." "You want to boil it down into a result, so you...
2019-12-06
28 min
Functional Design in Clojure
Ep 057: Clojure/Conj 2019 Recap
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Clojure/Conj 2019 Recap" We go through our notes and recall the most memorable talks from the Conj last week. Selected quotes: "Cold climate, warm people." "Learn skills that transfer." "The future is about immutability and composability." "YAML! YAML! YAML! The names of an episode we...
2019-11-29
34 min
Functional Design in Clojure
Ep 056: Opt-in Complexity
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Opt-In Complexity" We discuss complexity and try to come up with a simple explanation for why Clojurians avoid it so ruthlessly. Selected quotes: "Abstraction: the thing that creates more complexity while making you feel like you have less." "Clojure people seem to be allergic to...
2019-11-22
28 min
Functional Design in Clojure
Ep 055: Sets! What Are They Good For?
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Sets! What are they good for?" We examine one of the lesser used data structures in Clojure and talk about its unique characteristics and uses. Selected quotes: "Sets aren't going to get top billing." "Sets are really about uniqueness." "Sets let us calculate differences cheaply." "...
2019-11-15
28 min
Functional Design in Clojure
Ep 054: The Forest in the Trees
Each week, we discuss a different topic about Clojure and functional programming. If you have a question or topic you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the topic is: "Working with heavily nested trees." We discuss three powerful libraries (Specter, Spectacles, and clojure.walk) and where they might fit into our Clojure programs. Selected quotes: "Tree manipulation is like surgery, you need to get down to the right level before you start making changes." "...
2019-11-08
21 min
Functional Design in Clojure
Ep 053: How Can I Save My Data From Serialization?
Each week, we answer a different question about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the question is: "How can I save my data from serialization?" We record our thoughts on the many trade-offs we have encountered preserving our data when it leaves our programs. Selected quotes: "Clojure has the best data structures on the planet." "One of the reasons why JSON is so popular...
2019-11-01
30 min
Functional Design in Clojure
Ep 052: Functions! Functions! Functions!
Each week, we discuss a different topic about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, our topic is: "Functions! Functions! Functions!" We wonder how we could function without these critical building blocks, so we catagorize their varied uses. Selected quotes: "Functions put the fun in functional." "Each function category has a different mindset." "Programming is more fun when you're only thinking about the problem in...
2019-10-25
37 min
Functional Design in Clojure
Ep 051: Maps! Maps! Maps!
Each week, we discuss a different topic about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, our topic is: "Maps! Maps! Maps!" We discuss maps and their useful features, including a key distinction that we couldn't live without. Selected quotes: "Working with Clojure makes you feel like you're living in the future!" "Maps are bags of dimensions." "The namespace of the key is the entity, the...
2019-10-18
28 min
Functional Design in Clojure
Ep 050: Parentheses! Parentheses! Parentheses!
Each week, we discuss a different topic about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, our topic is: "Parentheses! Parentheses! Parentheses!" We defend the lowly parentheses, and discuss the benefits of having this stalwart shepherd dutifully organizing our code. Selected quotes: "I'm converting my visual cues into audio information." "Parentheses are like dust bunnies that have stacked up over time." "Pounds of parentheses." "The parenthesis...
2019-10-11
27 min
Functional Design in Clojure
Ep 049: Keywords! Keywords! Keywords!
Each week, we discuss a different topic about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, our topic is: "Keywords! Keywords! Keywords!" We examine all the fascinating properties of keywords, how to use them, and why they're so much better than strings and enums. Selected quotes: "The question of the day is: Why is there no question of the day?" "Everything behind the scenes should get...
2019-10-04
25 min
Functional Design in Clojure
Ep 048: Help! How Do I Fix My REPL?
Each week, we answer a different question about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the question is: "Help! How do I fix my REPL?" We catalog the many ways we've broken our REPLs and talk through our strategies for getting back on track. Selected quotes: "The REPL is a wonderful, wonderful thing." "A cleansing restart." "What is my Clojure band name?" "tools.namespace will...
2019-09-27
27 min
Functional Design in Clojure
Ep 047: What Is "Nil Punning"?
Each week, we answer a different question about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the question is: "What is 'nil punning'?" We gaze into the nil and find a surprising number of things to talk about. Selected quotes: "The lowly, magnificent nil. Some people love it, some people hate it." "Null is the value you give your program if you want to see it...
2019-09-20
28 min
Functional Design in Clojure
Ep 046: When Is Clojure Not the Right Tool for the Job?
Each week, we answer a different question about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the question is: "When is Clojure not the right tool for the job?" We look at the varied forms that Clojure can assume and consider where it might not fit. Selected quotes: "Just reject all the jobs where Clojure is inappropriate and you'll always be able to use Clojure." "The...
2019-09-13
25 min
Functional Design in Clojure
Ep 045: Why Have Derived Fields in Data When I Can Just Calculate Derived Data as Needed With a Function?
Each week, we answer a different question about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the question is: "Why have derived fields in data when I can just calculate derived data as needed with a function?" We take a focused look at the balance of using functions or derived fields and where each is preferable. Selected quotes: "Clojure has a gravity toward using the built-in...
2019-09-06
20 min
Functional Design in Clojure
Ep 044: What's So Different About Clojure's REPL?
Each week, we answer a different question about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the question is: "What's so different about Clojure's REPL?" We evaluate what a REPL really is and show that it's much more about the developer experience than simply calculating values. Selected quotes: "The Clojure REPL is your window into the state of a running application." "It's a much larger, broader...
2019-08-30
28 min
Functional Design in Clojure
Ep 043: What Is 'Faking' a Resource?
Each week, we answer a different question about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the question is: "What is 'faking' a resource?" We talk about the virtues of faking and then outline several real techniques for getting work done. Selected quotes: "We like to mock mocking, so don't mock us if we mock mocking." "No object is an island, they always refer to each...
2019-08-23
23 min
Functional Design in Clojure
Ep 042: What Does It Mean to Be 'Data-Oriented'?
Each week, we answer a different question about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the question is: "What does it mean to be 'data-oriented'?" We merge together different aspects of Clojure's data orientation, and specify which of those help make development more pleasant. Selected quotes: "Clojure has the corner on data." "Other languages have data too, it's just locked in little cages." "Data is...
2019-08-16
26 min
Functional Design in Clojure
Ep 041: Why Do Clojurians Make Such a Big Deal About Immutability?
Each week, we answer a different question about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the question is: "Why do Clojurians make such a big deal about immutability?" We cover several practical side effects of immutability and why we've become such big fans of data that doesn't let us down. Selected quotes: "Well, we don't have Monads to talk about." "What good is a program...
2019-08-09
27 min
Functional Design in Clojure
Ep 040: Should I Use Lein, Boot, or Tools.deps?
Each week, we answer a different question about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the question is: "Should I use lein, boot, or tools.deps?" We assemble a list of build tool characteristics and talk about how each tool stacks up before giving our recommendations. Selected quotes: "The best thing about boot is that you can use all the flexibility of Clojure code. The...
2019-08-02
28 min
Functional Design in Clojure
Ep 039: Why Use Clojure Over Another Functional Language?
Each week, we answer a different question about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the question is: "Why use Clojure over another functional language?". We examine the different categories of functional programming languages and distill out what differentiates Clojure and why we prefer it. Selected quotes: "Running just one function when developing is not only allowed in Clojure, it's encouraged and celebrated." "You don't...
2019-07-26
25 min
Functional Design in Clojure
Ep 038: How Do I Convince My Coworkers to Use Clojure?
Each week, we answer a different question about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the question is: "How do I convince my coworkers to use Clojure?". We recall our own experiences evangelizing Clojure and give practical advice from the trenches. Selected quotes: "Don't assume someone is going to want to jump on the grenade." "There are actually two steps: 1. Convince people that Clojure is...
2019-07-19
24 min
Functional Design in Clojure
Ep 037: What Advice Would You Give to Someone Getting Started With Clojure?
Each week, we answer a different question about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to feedback@clojuredesign.club, or join the #clojuredesign-podcast channel on the Clojurians Slack. This week, the question is: "What advice would you give to someone getting started with Clojure?". We trade off giving practical tips for intrepid learners while we reminisce about our own paths into Clojure. Selected quotes: "Reading other people's code will change how you view the problem." "You're going to get stuck...
2019-07-12
25 min
Functional Design in Clojure
Ep 036: Why Do You Recommend Clojure?
It's summertime, and that means it's time for something new. Each week, we will answer a different question about Clojure and functional programming. If you have a question you'd like us to discuss, tweet @clojuredesign or send an email to feedback@clojuredesign.club. This week, we're starting off with "Why do you recommend Clojure?". We take turns sharing our favorite reasons, and we can't help but have fun riffing on how enjoyable Clojure is to use. Come along for the ride. Selected quotes: "Question everything else. Clojure is the answer." "Once you...
2019-07-05
19 min
Functional Design in Clojure
Ep 035: Lifted Learnings
Christoph and Nate lift concepts from the raw log-parsing series. Reflecting on the lessons learned in the log series. (01:15) Concept 1: We found Clojure to be useful for devops. Everything is a web application these days, "The only UIs in Devops are dashboards." For most of the series, our UI was our connected editor. We grabbed a chunk of the log file and were fiddling with the data in short order. We talk about connected editors in our REPL series, starting with Episode 12. Being able to iteratively work on the log parsing functions in our editor was key to...
2019-06-28
27 min
Functional Design in Clojure
Ep 034: Break the Mold
Christoph finds exceptional log lines and takes a more literal approach. Previously, we upgraded our log parsing to handle finding two errors instead of just one. "It's amazing what you don't find when you're not looking." We ended up with a set of functions that can parse out multiple errors. The result is a nice mixed sequence of errors that we can aggregate and pivot with Clojure core. "By the power of Clojure core, I will map and reduce!" (02:43) New Problem: there are exceptions in the log, and they span multiple lines! The exception continuation lines don't parse. ...
2019-06-21
26 min
Functional Design in Clojure
Ep 033: Cake or Ice Cream? Yes!
Nate needs to parse two different errors and takes some time to compose himself. Previously, we were able to parse out errors and give the parsing function the ability to search as far into the future as necessary. We did this by having the function take a sequence and return a sequence, managed by lazy-seq. (01:30) New Problem: We need to correlate two different kinds of errors. The developers looked at our list of sprinkle errors and they think that they're caused by the 357 errors. They have requested that we look at the entire log and generate a report...
2019-06-14
21 min
Functional Design in Clojure
Ep 032: Call Me Lazy
Christoph finds map doesn't let him be lazy enough. Last week, we were dealing with multi-line sprinkle errors. We were able to get more context using partition. (01:33) Problem: the component lines had to be adjacent. Solution last week was to create larger partitions to hopefully get the rest of the error. This became a magic number problem, guessing how far we had to look ahead. "If there's anything I've learned in my career, telling the future is one of the hardest things to do.' What number should be big enough? 100? 1000? (04:00) The other problem is that the function...
2019-06-07
27 min
Functional Design in Clojure
Ep 031: Eager Abstraction
Nate finds that trouble comes in pairs. Last week, we were able to make our parsing lazy. Each step was lazy, and we side-stepped the landmine of waiting to perform computation till after the file is closed. (02:00) There's a new error: Sprinkles are failing! Sprinkles are the "likes" of DonutGram, and are the metric by which all donuts are judged. Log lines are showing up, like failed to add sprinkle to donut 23948. Let's write another regexp and handler. This is easy! But wait, we notice that there is another log line right after: sprinkle fail reason: db timeout...
2019-05-31
22 min
Functional Design in Clojure
Ep 030: Lazy Does It
Christoph's eagerness to analyze the big production logs shows him the value of being lazy instead. Last time: going through the log file looking for the mysterious 'code 357'. "The error message that just made sense to the person who wrote it. At the time written. For a few days" Back and forth with the dev team, but our devops sense was tingling. Took a sample, fired up a REPL, Ended up with a list of tuples: First element: regexp to match Second element: handler to transform matches into data (02:00) It's running slower and slower, the bigger the...
2019-05-24
30 min
Functional Design in Clojure
Ep 029: Problem Unknown: Log Lines
Nate is dropped in the middle of a huge log file and hunts for the source of the errors. We dig into the world of DonutGram. "We are the devops." Problem: we start seeing errors in the log. "The kind of error that makes total sense to whoever wrote the log line." (04:10) We want to use Clojure to characterize the errors. Why not grep? Well...we grep out the lines, count them, and we get 10,351 times. Is that a lot? Hard to say. We need more info. (05:50) Developers think it's safe to ignore, but it's bugging us. We...
2019-05-17
35 min
Functional Design in Clojure
Ep 028: Fail Donut
Christoph has gigs of log data and he's looking to Clojure for some help. Introducing a new topic. The last few weeks we focused on Twitter and automatically posting to it. Surprised by how much there is to talk about in a focused problem. "There will always be more problems for the world to solve." (01:53) Imagine if you will, the world of DonutGram! A fictitious social network where people post their donut experiences. This series is not about making DonutGram, but living DonutGram. "Oh, the dark underbelly of application development: support." "Let's take the shiny rock and flip...
2019-05-10
16 min
Functional Design in Clojure
Ep 027: Collected Context
Nate and Christoph reflect on what they learned during the Twitter series. 6 months of podcast episodes! Situated programs: Part of the real world. Affect and affected by the world around it. (04:25) Concept 1: Was very helpful to focus on nailing down the algorithm before diving into the code. (06:00) Concept 2: Two kinds of data: operating data and forensic data Operating data: information you use for logic. Make it aggressively minimal. Forensic data: information you record, off to the side, to tell a story later. Record as much as feasible. Don't do logic on the forensic data! If you end up...
2019-05-03
33 min
Functional Design in Clojure
Ep 026: One Call to Rule Them All
Christoph thinks goals are data, not function names. We were talking about the twitter handle again. Last week, we talked about faking. It's not mocking. The magic that makes it possible is using a protocol. Switch out the real handle or the fake handle in component based on configuration. "Yes, I do want to speak to the log file." "Sometimes, the log file gets lonely." (02:43) Christoph wants to talk about the protocol. We made a function for each operation we did in Twitter. Post tweet Search Get timeline Each function took the information needed for that operation as...
2019-04-26
29 min
Functional Design in Clojure
Ep 025: Fake Results, Real Speed
Nate wants to experiment with the UI, but Twitter keeps getting the results. "This thing that we're making because we're lazy has now taken 4 or 5 weeks to implement." Last week: "worker" logic vs "decider" logic. Allowed us to flatten the logic. "You can spend months on the backend and people think you've barely got anything done. You can spend two days on the UI and then people think you're making progress." (04:20) Now we want to work on the UI, but we don't want data to post to real Twitter. "Why do you keep posting 'asdf asdf asdf' to...
2019-04-19
25 min
Functional Design in Clojure
Ep 024: You Are Here, but Why?
Christoph needs to test his logic, but he must pry it from the clutches of side effects. Last week we ended up with "imperative mud": lots of nested I/O and logic. (01:45) Difficult to test when all the I/O and logic are mixed together. Object-oriented programming advocates for "mocking" objects with side-effects Mocking reinforces and expands the complexity Complexity stems from all the different branches of execution: mainline, exceptions, corner cases, etc. With the imperative approach, no way to just "jump" to step 2 and test that in isolation. Have to setup all the mocks to tilt the...
2019-04-12
34 min
Functional Design in Clojure
Ep 023: Poster Child
Nate gets messy finding ingredients for his algorithm cake. Last week we focused on how to determine what to post. This week we focus on getting the data so we can compare it. (01:55) Once again, we'll use component to organize our app. What components should we have? Component 1: The worker that wakes up, checks the DB, checks Twitter, and posts as necessary. Debate: Do we need more than one component? Question: What does that worker need? Those should be components. (03:00) Component 2: The database connection. Needs to be threadsafe Allows all the DB logic in one place. start method...
2019-04-05
31 min
Functional Design in Clojure
Ep 022: Evidence of Attempted Posting
Christoph questions his attempts to post to Twitter. This week, continuing to dig into the "Twitter problem". We want to post to Twitter on a schedule. "Writing code to help out with laziness." Start with data to keep track of: inside (our data) and outside (Twitter data) "Data from a foreign land." We need to determine our "working view" of Twitter's data. What is in our data? For each "scheduled tweet": Text to post: the "status" Timestamp of when to post Timestamps are nice Milliseconds since the epoch Universal instant Allows the client to localize How do we...
2019-03-29
33 min
Functional Design in Clojure
Ep 021: Mutate the Internet
Nate wants to tweet regularly, so he asks Clojure for some help. Problem: pre-author tweets so they can get posted automatically. Want to make a "full stack" application this time. Sounds complicated, what do we need? Database of tweets: text to tweet and timestamp when it should be tweeted. Frontend is a single-page application (SPA) that makes XHR ("AJAX") requests to the backend. Needs to be able to wake up and post. Persistent process backend. We will not cover all these parts. "You have a problem, so you make a UI to solve your problem. Now you have 2...
2019-03-22
22 min
Functional Design in Clojure
Ep 020: Data Dessert
Christoph and Nate discuss the flavor of pure data. "The reduction of the good stuff." "We filter the points and reduce the good ones." Concept 1: To use the power of Clojure core, you give it functions as the "vocabulary" to describe your data. "predicate" function: produce truth values about your data "view" or "extractor" function: returns a subset or calculated value from your data "mapper" function: transforms your data into different data "reduction" (or "reducer") function: combines your data together Concept 2: Don't ignore the linguistic aspect of how you name your functions. Reading the code can describe what...
2019-03-15
28 min
Functional Design in Clojure
Ep 019: Dazed by Weak Weeks
Nate wants to see more than data structures in a REPL. Goal: see a text-based calendar of hours worked by day and week. "With the power of the predicate, I summon thee from the bag of data!" If data items share structure, you only need one predicate function, not separate functions per "type". Common pattern: filter then map, then reduce Output: Looks like a calendar with one line per week Show daily total for each day Show weekly total Problem: how do we split the days into weeks? "I don't remember split-weeks in the Clojure cheat sheet." "What...
2019-03-08
29 min
Functional Design in Clojure
Ep 018: Did I Work Late on Tuesday?
Christoph wants to teach filter some vocabulary. Continuing our discussion of rummaging through the big bag of data. Mental shift for solving the problem: Prior thinking: one function that has to look at all entries New thinking: filter out irrelevant entries then reduce on just those New mentality emphasizes the problem of "picking" over "combining". Once you have the right set of entries, the reduce becomes trivial. Idea: build up a "vocabulary" of picking. "You build up the language to the level you want to use it at." A "predicate" is simply a function that gives you a...
2019-03-01
28 min
Functional Design in Clojure
Ep 017: Data, at Your Service
Nate finds it easier to get a broad view without a microscope. After last week's diversion into time math, we are back to the core problem this week. Now we want a total by date. Need to refactor the function to return the date in addition to minutes. "We're letting the code grow up into the problem." "Let's let the problem pull the code out of us." First attempt Use map to track running totals by day As each new entry is encountered, update the total for that day in the map New complication: Now we want a...
2019-02-22
28 min
Functional Design in Clojure
Ep 016: When 8 - 1 = 6
Christoph discovers that time creates its own alternate universe. Continuing our exploration of "literate" time logs We want a function to turn the timestamps into minutes. Format: Fri Feb 08 2019 11:30-13:45 Keep it simple: extract times with a regex and use math minutes in day = hours * 60 + minutes total minutes = end minutes - starting minutes Problem: What happens when we work past midnight? Negative minutes! We decided to have only one date, so a time before the starting time must span midnight. Format only allows for an activity to be
2019-02-15
29 min
Functional Design in Clojure
Ep 015: Finding the Time
Nate spends some time figuring out how to track his time. New problem: Want to track time using a text file. Text files are great: Keyboard oriented: in terminal, in editor Something you can put under revision control Need: date and time range Format of the time stamp should be convenient for us to read and edit. Let the computer do the work to convert the convenient notation to something usable! Format: Fri Feb 08 2019 11:30-13:45 One timestamp per line. Oh wait, we need a description. Six minutes in and we're already changing the requirements! What are "literate" text...
2019-02-08
26 min
Functional Design in Clojure
Episode 014: Fiddle With the REPL
Christoph gets some work done by fiddling around. Editor integration is a massive change in how to use the REPL. Put a comment block right underneath a function you are working on, and invoke the function with test arguments. Can quickly make changes to code and try it out--all in the same place! Problem: comment blocks littering the code. "A good rule of thumb I've found is: when I have to use the world 'careful', it's a big red flag. I'm doing something I should be able to prevent without having to be careful." Code in comment blocks...
2019-02-01
29 min
Functional Design in Clojure
Episode 013: Connect the REPL
Nate continues to explore the REPL by gluing it to his editor to see what happens. We revisit Tic-Tac-Toe and change it using our new REPL superpowers. Let's add request logging to the play endpoint: /play?row=0&col=1. Need to add log/info calls in handler function for play endpoint: on-play. Naive Christoph would add logging to the function, recompile, and run the jar. Less naive Christoph would reload the namespace but still restart the web server. Crazy idea: paste the function definition into the REPL! Copy the whole defn for on-play Go to the REPL window Switch...
2019-01-25
32 min
Functional Design in Clojure
Episode 012: Embrace the REPL
Christoph complicated development by misunderstanding the REPL. We go back to the roots of Christoph's experience with Clojure... How do I run Clojure code? The REPL is fun for evaluation, but how do you run a "real" program? Experience in other languages: edit the file, compile, rerun the program Mentality: get through the edit, compile, run loop as fast as possible! Autobuilder is the logical end. "Where's my autobuilder in Clojure?!" The REPL model is fundamentally different. "[The REPL] is like cutting the Gordian Knot. You change the problem and that's how you solve it." "The reason why...
2019-01-18
25 min
Functional Design in Clojure
Episode 011: The Convention of Configuration
Nate is worried about the hardcoded credentials in the code. It's episode 011 on 01/11. It's binary! "As a developer, you quickly learn what's under your control and what's not. Very little is under your control." Don't accidentally check in the credentials. "We need a configuration management system. Oh wait! That's a totally different problem." What about putting the configuration into an EDN file? Let's call it config.edn Why EDN? Isn't JSON the "one, true format for config information"? Pros of EDN: native to Clojure can have comments is extensible Why not environment variables? Environment variables are great for...
2019-01-11
28 min
Functional Design in Clojure
Episode 010: From Mud to Bricks
Christoph can't stand the spaghetti mess in main. Time to refactor. Main function does too much. We want cohesive pieces that each have one job. Two part problem: Too much in the main loop. Main starts and then never stops. Have to exit the repl to restart. We need 1) separate parts that can be 2) started and stopped. Main should just focus on the code needed for command line invocation. Let's get the parts component-ized! "It's one thing that I've become more sure of in my career is that no application is actually done." "Useful apps only get more...
2019-01-04
28 min
Functional Design in Clojure
Episode 009: Channeling Re-Search
Nate can't decide what to watch on Twitter, and the app restarts are killing him. The Twitterthon continues. "It's an infinite stream of Twitter." Nate wants to watch #clojurescript too. Just change the search string to "#clojure OR #clojurescript"? Should avoid hardcoding the value so we don't have to recompile every time. Command line argument still requires a restart. Let's use a curl UI (like Ep 004)! Wait, what?! Why curl? Can send something into the running process Can separate out the client Builds on top of HTTP, so there are lots of tools for testing (like curl itself) ...
2018-12-28
26 min
Functional Design in Clojure
Episode 008: Twitter, Plated
Christoph tries to figure out why Twitter stopped talking about Clojure. "Are you twitterpated?" Building on where we left off last episode. Runs and just stops working. "I was pretty sure it stopped working because people on Twitter just stopped talking about Clojure. After about a day of that, I realized people were talking about Clojure, and I just wasn't seeing it." The auth token expired! What should we do? Why should the main loop have to deal with getting a new auth token? "The Twitter wrapper should be concerned with all of the warts and complexities of...
2018-12-21
23 min
Functional Design in Clojure
Episode 007: Input Overflow
Nate just wants to print the tweets, but the input wants to take over. Got tweet fetching working last time. Now we want to print out the tweets. API returns a lot information "We should probably not use pprint as our output mechanism." Using the uniqueness filtering from last time The goal is NOT to write a generic Twitter wrapper. Goal is to write a wrapper that just gives us what our application needs. "I don't want to spread the complexity of Twitter all over my app. I want to hide it inside of the wrapper." Clojure data...
2018-12-14
26 min
Functional Design in Clojure
Episode 006: All Wrapped Up in Twitter
Christoph tries to get a handle on his #clojure tweet-stream habit. NOT tic-tac-toe Follow #clojure tweet stream and see it print out in the terminal "We like reinventing things." "The terminal is the best UI out there." Does Twitter have an API? Websocket? Nope! Requires a big "E" plan: "enterprise". PubSub? Nope! Not from Twitter. Alas, we must poll the /search/tweets.json endpoint Problem: we're going to keep getting results we've already seen Avoid duplicates? Let's use core cache. Once again, we use loop and recur for our main loop Time for an API wrapper, but what...
2018-12-07
25 min
Functional Design in Clojure
Episode 005: Tracking, for the Win
Nate tries to figure out who actually won this never-ending game of tic-tac-toe. Tic-tac-toe is "just boring enough, just interesting enough." How do we know who won the game? Inspect the board. If you can track progress toward the win, you check for the win quickly "Tic-tac-toe at scale!" Tracer bullet: go simple, just examine the 8 options for winning "In that case, nil has won...which is nobody." Keep detection logic out of the high-level winner function--should read like a process description of steps. Make new "verbs" like row-winner and column-winner and use those. "You're just adding new...
2018-11-30
26 min
Functional Design in Clojure
Episode 004: Atomic Curls
Christoph tries to make tic-tac-toe work over the Internet and discovers the power of the atom. Let's get a web framework, build a UI, hook that up to an HTTP API, throw in some websockets for notifications! "We'd end up with our first 12 hour podcast episode." A "tracer bullet": get something functioning to see the important parts of the solution. Can choose when to replace important parts by something more "production worthy". "Let's just ditch all the complexity of having a UI and just use curl." curl will print the text response. We have a terminal UI! "We're...
2018-11-23
22 min
Functional Design in Clojure
Episode 003: Tic-Tac-REPL
Nate tries to turn the tic-tac-toe "game engine" into a real application he can play with a friend. Let's play the game! How do you keep track of the game state as it changes? Bucket brigade the reference to the future loop using recur The game loop: read input, evaluate, print out new board, loop. "It has occurred to me that we are basically writing a REPL." "We have the tic-tac-REPL" How do you get input from the user? How to you make sure it's right? "It keeps harassing the non-compliment user until they type the right thing...
2018-11-16
23 min
Functional Design in Clojure
Episode 002: Tic-Tac-Toe, State in a Row
Christoph tries to make tic-tac-toe and gets stuck on immutability. The REPL calculator Let's make a game! How do you keep track of the game board? How do you update the game board if you can't change anything? OO told me the "right" way to encapsulate, now what do I do? "Nine lines of let block, and one line of actual function." "The reference bucket brigade" reductions wants to blow your mind Multiple universes of tic-tac-toe, and they're all in a row! Time travel, for free! Clojure in this episode: assoc assoc-in -> reduce reductions
2018-11-09
20 min
Functional Design in Clojure
Episode 001: Why, Oh Why?
Nate and Christoph try to figure out how to make a podcast. Who are we? What are we doing? What will we talk about? Lots of (with-meta podcast ...) Clojure in this episode: nil
2018-11-02
13 min