Look for any podcast host, guest or anyone
Showing episodes and shows of

Christoph Neumann And Nate Jones

Shows

Functional Design in ClojureFunctional Design in ClojureEp 114: Brand New, AgainEach 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-0216 minFunctional Design in ClojureFunctional Design in ClojureEp 100: Thanks OverflowEach 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-2335 minFunctional Design in ClojureFunctional Design in ClojureEp 098: Composed LearningsEach 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-0926 minFunctional Design in ClojureFunctional Design in ClojureEp 097: Application of CompositionEach 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-0228 minFunctional Design in ClojureFunctional Design in ClojureEp 096: Gaming DataEach 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-2626 minFunctional Design in ClojureFunctional Design in ClojureEp 095: Composing CoreEach 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-1917 minFunctional Design in ClojureFunctional Design in ClojureEp 094: Concrete CompositionEach 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-1215 minFunctional Design in ClojureFunctional Design in ClojureEp 093: Waffle CakesEach 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-0514 minFunctional Design in ClojureFunctional Design in ClojureEp 092: Freeing LimitsEach 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-2817 minFunctional Design in ClojureFunctional Design in ClojureEp 091: Combo BoostEach 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-2212 minFunctional Design in ClojureFunctional Design in ClojureEp 090: Conditional ResultsEach 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-1825 minFunctional Design in ClojureFunctional Design in ClojureEp 089: Branching OutEach 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-2038 minFunctional Design in ClojureFunctional Design in ClojureEp 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-1326 minFunctional Design in ClojureFunctional Design in ClojureEp 087: Polymorphic MetalEach 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-2329 minFunctional Design in ClojureFunctional Design in ClojureEp 086: Let TricksEach 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-2032 minFunctional Design in ClojureFunctional Design in ClojureEp 085: For for the WhenEach 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-2529 minFunctional Design in ClojureFunctional Design in ClojureEp 084: All SortsEach 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-1827 minFunctional Design in ClojureFunctional Design in ClojureEp 083: Sift Sans SortEach 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-0424 minFunctional Design in ClojureFunctional Design in ClojureEp 082: Filter and FriendsEach 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-0727 minFunctional Design in ClojureFunctional Design in ClojureEp 081: List No MoreEach 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-3126 minFunctional Design in ClojureFunctional Design in ClojureEp 080: Apply as NeededEach 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-2422 minFunctional Design in ClojureFunctional Design in ClojureEp 079: Compose ThyselfEach 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-0327 minFunctional Design in ClojureFunctional Design in ClojureEp 078: Impartial ThoughtsEach 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-1925 minFunctional Design in ClojureFunctional Design in ClojureEp 077: Thread SomeEach 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-1223 minFunctional Design in ClojureFunctional Design in ClojureEp 076: Multiple Views on JuxtEach 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-0530 minFunctional Design in ClojureFunctional Design in ClojureEp 075: Merge With FunEach 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-2226 minFunctional Design in ClojureFunctional Design in ClojureEp 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-1527 minFunctional Design in ClojureFunctional Design in ClojureEp 073: Silent SocketsEach 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-1738 minFunctional Design in ClojureFunctional Design in ClojureEp 072: Sea of SocketsEach 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-0332 minFunctional Design in ClojureFunctional Design in ClojureEp 071: Socket SynergyEach 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-2029 minFunctional Design in ClojureFunctional Design in ClojureEp 070: Socket CircusEach 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-1329 minFunctional Design in ClojureFunctional Design in ClojureEp 069: Stuck in the WebEach 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-2828 minFunctional Design in ClojureFunctional Design in ClojureEp 068: Static on the LineEach 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-2124 minFunctional Design in ClojureFunctional Design in ClojureEp 067: Handling Handler's HandlesEach 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-1423 minFunctional Design in ClojureFunctional Design in ClojureEp 066: Compose the CodecEach 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-3128 minFunctional Design in ClojureFunctional Design in ClojureEp 065: Stuck in the MiddleEach 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-2430 minFunctional Design in ClojureFunctional Design in ClojureEp 064: Put Ring on ItEach 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-1719 minFunctional Design in ClojureFunctional Design in ClojureEp 063: Web of ComplexityEach 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-1022 minFunctional Design in ClojureFunctional Design in ClojureEp 062: 2019 in ReviewEach 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-0336 minFunctional Design in ClojureFunctional Design in ClojureEp 061: Transcendental TransformationsEach 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-2728 minFunctional Design in ClojureFunctional Design in ClojureEp 060: Reduce Done QuickEach 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-2026 minFunctional Design in ClojureFunctional Design in ClojureEp 059: Lining It UpEach 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-1332 minFunctional Design in ClojureFunctional Design in ClojureEp 058: Reducing It DownEach 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-0628 minFunctional Design in ClojureFunctional Design in ClojureEp 057: Clojure/Conj 2019 RecapEach 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-2934 minFunctional Design in ClojureFunctional Design in ClojureEp 056: Opt-in ComplexityEach 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-2228 minFunctional Design in ClojureFunctional Design in ClojureEp 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-1528 minFunctional Design in ClojureFunctional Design in ClojureEp 054: The Forest in the TreesEach 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-0821 minFunctional Design in ClojureFunctional Design in ClojureEp 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-0130 minFunctional Design in ClojureFunctional Design in ClojureEp 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-2537 minFunctional Design in ClojureFunctional Design in ClojureEp 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-1828 minFunctional Design in ClojureFunctional Design in ClojureEp 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-1127 minFunctional Design in ClojureFunctional Design in ClojureEp 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-0425 minFunctional Design in ClojureFunctional Design in ClojureEp 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-2727 minFunctional Design in ClojureFunctional Design in ClojureEp 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-2028 minFunctional Design in ClojureFunctional Design in ClojureEp 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-1325 minFunctional Design in ClojureFunctional Design in ClojureEp 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-0620 minFunctional Design in ClojureFunctional Design in ClojureEp 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-3028 minFunctional Design in ClojureFunctional Design in ClojureEp 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-2323 minFunctional Design in ClojureFunctional Design in ClojureEp 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-1626 minFunctional Design in ClojureFunctional Design in ClojureEp 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-0927 minFunctional Design in ClojureFunctional Design in ClojureEp 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-0228 minFunctional Design in ClojureFunctional Design in ClojureEp 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-2625 minFunctional Design in ClojureFunctional Design in ClojureEp 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-1924 minFunctional Design in ClojureFunctional Design in ClojureEp 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-1225 minFunctional Design in ClojureFunctional Design in ClojureEp 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-0519 minFunctional Design in ClojureFunctional Design in ClojureEp 035: Lifted LearningsChristoph 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-2827 minFunctional Design in ClojureFunctional Design in ClojureEp 034: Break the MoldChristoph 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-2126 minFunctional Design in ClojureFunctional Design in ClojureEp 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-1421 minFunctional Design in ClojureFunctional Design in ClojureEp 032: Call Me LazyChristoph 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-0727 minFunctional Design in ClojureFunctional Design in ClojureEp 031: Eager AbstractionNate 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-3122 minFunctional Design in ClojureFunctional Design in ClojureEp 030: Lazy Does ItChristoph'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-2430 minFunctional Design in ClojureFunctional Design in ClojureEp 029: Problem Unknown: Log LinesNate 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-1735 minFunctional Design in ClojureFunctional Design in ClojureEp 028: Fail DonutChristoph 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-1016 minFunctional Design in ClojureFunctional Design in ClojureEp 027: Collected ContextNate 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-0333 minFunctional Design in ClojureFunctional Design in ClojureEp 026: One Call to Rule Them AllChristoph 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-2629 minFunctional Design in ClojureFunctional Design in ClojureEp 025: Fake Results, Real SpeedNate 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-1925 minFunctional Design in ClojureFunctional Design in ClojureEp 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-1234 minFunctional Design in ClojureFunctional Design in ClojureEp 023: Poster ChildNate 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-0531 minFunctional Design in ClojureFunctional Design in ClojureEp 022: Evidence of Attempted PostingChristoph 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-2933 minFunctional Design in ClojureFunctional Design in ClojureEp 021: Mutate the InternetNate 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-2222 minFunctional Design in ClojureFunctional Design in ClojureEp 020: Data DessertChristoph 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-1528 minFunctional Design in ClojureFunctional Design in ClojureEp 019: Dazed by Weak WeeksNate 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-0829 minFunctional Design in ClojureFunctional Design in ClojureEp 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-0128 minFunctional Design in ClojureFunctional Design in ClojureEp 017: Data, at Your ServiceNate 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-2228 minFunctional Design in ClojureFunctional Design in ClojureEp 016: When 8 - 1 = 6Christoph 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-1529 minFunctional Design in ClojureFunctional Design in ClojureEp 015: Finding the TimeNate 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-0826 minFunctional Design in ClojureFunctional Design in ClojureEpisode 014: Fiddle With the REPLChristoph 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-0129 minFunctional Design in ClojureFunctional Design in ClojureEpisode 013: Connect the REPLNate 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-2532 minFunctional Design in ClojureFunctional Design in ClojureEpisode 012: Embrace the REPLChristoph 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-1825 minFunctional Design in ClojureFunctional Design in ClojureEpisode 011: The Convention of ConfigurationNate 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-1128 minFunctional Design in ClojureFunctional Design in ClojureEpisode 010: From Mud to BricksChristoph 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-0428 minFunctional Design in ClojureFunctional Design in ClojureEpisode 009: Channeling Re-SearchNate 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-2826 minFunctional Design in ClojureFunctional Design in ClojureEpisode 008: Twitter, PlatedChristoph 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-2123 minFunctional Design in ClojureFunctional Design in ClojureEpisode 007: Input OverflowNate 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-1426 minFunctional Design in ClojureFunctional Design in ClojureEpisode 006: All Wrapped Up in TwitterChristoph 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-0725 minFunctional Design in ClojureFunctional Design in ClojureEpisode 005: Tracking, for the WinNate 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-3026 minFunctional Design in ClojureFunctional Design in ClojureEpisode 004: Atomic CurlsChristoph 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-2322 minFunctional Design in ClojureFunctional Design in ClojureEpisode 003: Tic-Tac-REPLNate 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-1623 minFunctional Design in ClojureFunctional Design in ClojureEpisode 002: Tic-Tac-Toe, State in a RowChristoph 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-0920 minFunctional Design in ClojureFunctional Design in ClojureEpisode 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-0213 min