Friday, June 17, 2022

Code & Coffee - 6/17/2022

 

Code & Coffee - 6/17/2022

  1. Fun with load testing and garbage collection
  2. Code camp next weekend
    1. Blockster cars
      1. https://www.dexterindustries.com/gopigo3/
    2. Target middle school kids (12-16)
    3. Give them a car and some basics and watch them go
  3. Getting the nursery ready for the next little one due in February
  4. New puppies!!!
    1. lot of work
    2. but they are cute


Friday, June 3, 2022

Code & Coffee - 6/3/2022

 Code & Coffee - 6/3/2022

  1. Observability
  2. Customer tracking architecture
  3. GraalVM
    1. for Async batch jobs
    2. Trying to get faster startup for lambda functions
      1. startup was dominating run time
      2. when running many per day the economics break
    3. HotSpot vs Growl
      1. mostly competitive except when it isn't.
  4. Test data generation project
    1. Part of an at work "innovation week"

Friday, May 27, 2022

Code & Coffee - 5/27/2022

 Code & Coffee - 5/27/2022

  1. Ceiling fans and Z-Waves and Zigbees
  2. Internships
    1. What makes a good project
    2. Database change management
    3. One first project was a survey engine in MS Access
      1. Say what,  a shared access db on sharepoint?
    4. Birds in ceilings
    5. Hand coded sorting because didn't know about sql sort
  3. Big Query
    1. Partitions and clustering
    2. Querying for a specific field in 13 terabytes took under 2 seconds.
    3. PubSub and implementing CDC and pseudo transaction ish things.
  4. SSIS Upgrade woes
    1. And general database woes causing prod outages
    2. Lets let the new guy fiddle with prod data, sounds like a great idea.
  5. Miss Dig and cable and gas marking.
    1. Fire trucks and Gas trucks show up pretty fast
  6. SAP is going live
  7. Mental health days
    1. Preemptive mental health days may be even better than reactive days.
    2. Preserve instead of chase mental health
  8. Having fun with Cloujure
    1. What does #?@: <some variable name> mean???
    2. Context: [1 2 #?@(:clj [3 4] :cljs [5 6])]
    3. Its a vector with reader conditionals
    4. https://clojure.org/reference/reader#_reader_conditionals
    5. Immutability Changes Everything:
      1. https://queue.acm.org/detail.cfm?id=2884038
      2. http://www.cidrdb.org/cidr2015/Papers/CIDR15_Paper16.pdf
    6. REPLing is fun
      1. Kinda like changing a tire will the car is rolling except without the crashing bit (usually)
    7. qotw: "99% of the code is not sideffectful"
      1. just be careful of the rest
  9. Bitcoin whirlpools and chains and other stuff
      1. Sparrow, samurai, tors and mores
      2. ¯\_(ツ)_/¯

Friday, May 20, 2022

Code & Coffee - 4/29/2022

Code & Coffee - 4/29/2022

 Topic: "Git Tips & Tricks"


  • The first tip came even before we started:
    • "I won't be able to make it tomorrow but I'm sure Dave will bring up many of my favorites, but in case he doesn't, git worktree, git restore, patch mode, git add -N/--intent-to-add ........"
    • git worktree:
    • git restore:
    • Patch mode:
    • git add -N/--intent-to-add ......
      • Inform git that you will be adding a path in the future, this allows you to see the files in the directory when running git status and seeing diffs with git diff.
      • Docs: https://git-scm.com/docs/git-add#Documentation/git-add.txt--N
  • Squashing commits
    • it is part of git merge, dig up docs
  • Signing commits
    • why and how
  • git bisect
    • use case and how to use it
    • it has a mode where you can pass in a script and it will automatically find the issue
  • "Arlo's git notation"
    • find a link
    • commit message prefix indicates the nature of the commit
  • Git log
    • show only merges
  • Git garbage collection
    • what it is for and how it works
    • oops checked in node_modules again
    • oops that password shouldn't have been in there.
  • Pre-commit hooks/hooks in general
    • vulgarity checker.... or maybe just runs the tests and linter
  • Interactive add
    • see git add -N
    • -P will get straight to patch mode without the menu
    • many commands that change the index support patch mode 
  • git reset -tests
  • git diff
  • dave's rebase strategy... 
    • heard only part of it, was in the other meeting already
    • git rerere - setting to help with repeated rebase resolution



Code & Coffee 5/20/2022

 Code & Coffee 5/20/2022


The goal is to drive out good test naming in a group setting using "isLeapYear" as a sample problem.

  1. Work as a group to derive 


Topic: Having fun with isLeapYear

  1. Had a bit of fun with the exercise
    1. Noticed that people liked to try to optimize it
    2. Was mentioned that isLeapYear looks a lot like FizzBuzz
    3. replit is not as good as real vim.
  2. Talked a bunch about logging and interpolation penalties for unlogged messages (not logged because of logging level)
  3. Talked about interesting stuff in the hiring space.
  4. Talked about COBOL for a little bit.
  5. What is a Senior Developer?
    1. Capable of mentoring more than putting out code
    2. Interviewing skills
  6. Flex box 
    1. And overflow interact in an interesting way
    2. overflow hidden and visible are part of the weird interaction.
  7. REPL driven development
    1. Sooo good

The code we came up with:


/*

Every year that is exactly divisible by four is a leap year,

except for years that are exactly divisible by 100,

but these centurial years are leap years if they are exactly divisible by 400. 

For example, 

the years 1700, 1800, and 1900 are not leap years,

but the years 1600 and 2000 are.[14]

*/


//logger.warn("Something {}").mdc("one", () -> "two").log();


function isLeapYear(year) {

  return (year & 3) == 0 && (

    (year % 25) != 0 || (year & 15) == 0

  );

}


function isLeapYearDate(year) {

  return new Date(year, 1, 29).getDate() === 29;

}


function isLeapYearBad(year) {

  const modYear = year % 400;


  if(year === 0) return true;

  if(year % 100 === 0) return false;

  return false;

}

function isLeapYear3(year) {

  if (year % 4 == 0) {

    if (year % 100 == 0) {

      if (year % 400 == 0) {

        return true

      }

      return false;

    }

    return true;

  }

  return false;

}


function oldIsLeapYear(year) {

  if (year % 400 == 0) {

    return true;

  } else if (year % 100 == 0) {

    return false;

  } else if (year % 4 == 0) {

    return true;

  }

  return false;

}




group('leap year tests', () => {

  ok('0 is not a leap year', !isLeapYear(0));

  ok('negative numbers dont blow up', !isLeapYear(-1));

  

  group('Year not divisible by 4', () => {

    ok('1601 is not a leap year', !isLeapYear(1601));

  });

  

  group('Years divisible by 400', () => {

    ok('1600 is a leap year', isLeapYear(1600));

    ok('2000 is a leap year', isLeapYear(2000));

  });

  

  group('Years divisible by 100', () => {

    ok('1700 is not a leap year', !isLeapYear(1700));

    ok('1800 is not a leap year', !isLeapYear(1800));

    ok('1900 is not a leap year', !isLeapYear(1800));

  });

});


// This is another potential style:

group('A year is a leap year', () => {

  ok('if it is divisible by 4 but not 100 (2020)', isLeapYear(2020));

  ok('if it is divisible by 4 but not 100 (1984)', isLeapYear(1984));

  ok('if it is divisible by 4 but not 100 (4)', isLeapYear(4));


  ok('if it is divisible by 400 (400)', isLeapYear(400));

  ok('if it is divisible by 400 (2400)', isLeapYear(2400));

});


group('A year is not a leap year', () => {

  ok('if it is not divisible by 4 (2018)', !isLeapYear(2018));

  ok('if it is not divisible by 4 (2017)', !isLeapYear(2017));


  ok('if it is not divisible by 100 but not by 400 (2100)', !isLeapYear(2100));

});



// test "framework", just enough of one to play with anyway.

function ok(message, result) {

  const GREEN = 32;

  const RED = 31;

  if (result) {

    log(`OK - ${message}`, GREEN);

    return;

  }

  log(`FAIL - ${message}`, RED);

}


function group(description, fn) {

  log(description);

  indentMore();

  fn();

  indentLess();

}


function indenter() {

  if (typeof indenter.indent !== 'undefined' && Number.isInteger(indenter.indent)) 

    return ' '.repeat(indenter.indent);

  return '';

}

function indentMore() {

  if (typeof indenter.indent === 'undefined' || !Number.isInteger(indenter.indent)) 

    indenter.indent = 0;

  indenter.indent += 2;

}

function indentLess() {

  if (typeof indenter.indent === 'undefined' || !Number.isInteger(indenter.indent))

    indenter.indent = 0;

  indenter.indent -= 2;

  indenter.indent = Math.max(0, indenter.indent);

}


function log(message, color) {

  const prefix = indenter() + (color ? `\x1b[${color}m` : '');

  const suffix = color ? '\033[0m' : '';

  console.log(prefix + message + suffix);

}




Resources:

  1. Hoare Triple
    1. Preconditions and postconditions defining a program.
    2. https://wiki.c2.com/?HoareTriple
    3. https://softwarefoundations.cis.upenn.edu/plf-current/Hoare.html
    4. Tony himself expounding upon it:
      1. https://www.youtube.com/watch?v=czzp8gMESSY
    5. Hoar's paper:
      1. https://dl.acm.org/doi/pdf/10.1145/363235.363259
      2. the less exciting page pointing to it: https://dl.acm.org/doi/10.1145/363235.363259
  2. Kevlin Henney presenting on GUTs
    1. https://www.youtube.com/watch?v=tWn8RA_DEic
    2. https://www.youtube.com/watch?v=azoucC_fwzw
    3. https://www.theregister.com/2007/07/28/what_are_your_units/

Friday, April 22, 2022

Code & Coffee 4/8/2022

 Code & Coffee 4/8/2022


  • Meetings!
    • Why so many
    • Looking for 
    • Example
      • Meeting about a service
      • Dev team was attempting to create an unauthenticated service with no ssl
      • Meeting was to discuss that
      • How did that come to be?
  • Meetings turned into Authentication and security
    • Why is it acceptable to create an unauthenticated unsecure service?
    • Is there training needed?
      • Oauth and JWT?
    • JWT / jot what are you talking about?
      • it is suggested in rfc7519 to pronounce JWT as "jot"
      • https://datatracker.ietf.org/doc/html/rfc7519


Is it safe to store JWT in memory?
To reiterate, whatever you do, don't store a JWT in local storage (or session storage). If any of the third-party scripts you include in your page is compromised, it can access all your users' tokens. To keep them secure, you should always store JWTs inside an httpOnly cookie

Code & Coffee - 4/15/2022

 Code & Coffee - 4/15/2022

  • Slack hacks and tools
    • Organize channels into groups
    • Google calendar integrations
  • What happens when a Saas goes down
    • Risk assessment
    • -- insert link from Derek
    • Jira
      • use a spreadsheet for a couple days?
    • Git
      • It is distributed, don't panic
      • Might want more than an "accidental strategy" though
        • Regular mirroring of code repository
        • Mirror the pipeline enough to do an emergency build
    • AWS
      • panic!
    • CI server
      • What happens when the pipeline provider zonks out?
      • Can you do a local build and deploy?
      • What parts can be skipped?
  • Soft deletes
    • Safer removal of data by soft delete first
    • Soft deletes and right to be forgotten laws
  • Don't recognize me list
    • how to store the list?
    • Wouldn't the list turn into a high value target
    • Or do would it be stored as a sort of fingerprint




Code & Coffee - 4/22/2022

 Code & Coffee 4/22/2022


  • Office upgrades
    • Warming up the floor 
      • Heated floor
      • Or a nice thick rug!
        • what about the rolly chair?
          • Hang it from the ceiling
          • Random stories
          • It's a good thing our dads didn't present a bull for the damages we caused
  • Working in Clojure
  • Catching up on who is where and how things are going
    • Worked with so-n-so for a couple years and saw him once even though we worked 20 ft apart.
      • different floors
  • Interview with a javascript developer:
  • Great Adventure dating book:
  • How to feel old
    • The new intern was born after I got married
    • The 20th anniversary edition of Tron is now 20 years old.
  • Coding challenge
    • Simulated PR in Github
      • How does the candidate respond to critical and positive feedback?
      • Unlimited time (days)
    • Differentiating developer level
      • Juniors talk about what happened around them
      • Mids talk about what happened in the project
      • Seniors talk about their contribution and the value to the business
      • Super Seniors talk about everything
  • Thomas wore a tie
  • How much cloud development/serverless can be done locally
    • Quite a bit but it gets complex
  • Cross cloud portability

Friday, April 1, 2022

Code & Coffee - 4/1/2022

 Code & Coffee - 4/1/2022

  • Looking for moar developers - writing the job description
  • Checked out some code and talked about Java Optional for a bit.
    • fiddled with the code and made it betterer
    • Code review is a view into the heart and soul.... or at least thought process of how other developers think
  • Ahh yes, today is the day to be a little extra careful on the internet
    • What is your favorite April Fools internet thing?

Friday, March 25, 2022

Code & Coffee - 3/18/2022

 Code & Coffee - 3/18/2022

  • Data migrations
    • Learning about your data
    • What database to use
      • Datastore vs. CloudSQL vs. Spanner
      • advantages, disadvantages and differences
    • Bringing data over and comparing to make sure the data is ok
    • Streaming data
      • 30 minute migration vs 2 weeks
      • 1000 vs 400 million records
  • Unit tests
    • Why
      • Independent/Isolated
      • Descriptive
        • Using good method names
    • "networkchuck"
      • makes it fun to watch.

Code & Coffee - 3/25/2022

 Code & Coffee - 3/25/2022


  • Weekend plans
    • Epic pillow fort in the living room
    • Helping with ham radio test session
  • Kids and cars
    • Some are less interesting in driving
    • But get there eventually
    • Picking a car for kids
    • Learning by fixing
  • Are we in the middle?
    • Grandma and Grandpa didn't know how to program a vcr
    • The kids don't either
    • Is that really a problem
    • They need to know how to mop, or use a broom
    • The generational oscillation effect of skills
      • Diy - do it yourself - has the skill to do
      • difm - do it for me - someone else will to it for me
      • skilled trade - but cobblers kids don't have shoes
      • repeat
    • Balancing diy and difm
  • Pulumi vs Terraform
    • Terraform vs Terraform Cloud & Enterprise
    • https://www.pulumi.com/docs/intro/vs/terraform/
  • Thermal pad replacement 108 to 96 degrees

Friday, March 4, 2022

Code & Coffee - 3/4/2022

 Code & Coffee - 3/4/2022

  • How to properly spectate at a cross country event
    • Cheating is ok for parents ;-)
  • Topic of the week: Spring cleaning
    • Cleaning out the tech debt
      • CI/CD betterization
      • Better deployments with Ansible
      • Better branching strategy
        • Tag the production branch
        • First admit that there is a problem
      • Checking with the sr engineers about what problems there are
      • Roadmapping the items - seeking funding for low hanging fruit
        • Maintenance
        • Documentation
    • Database change management
    • Tagging git repos as things are deployed
    • The batman will answer the call
      • Retraining the production support requesters to use the bat-signal
      • Developers are happier not
    • Watch out for the Velociraptors
      • They sneak in and eat your velocity
    • Over optimization
    • What is success for the tech debt exercise?
      • Response:
        • Better automation
        • Sonar runs against the code
        • unit tests with some coverage
      • Challenge:
        • Inspire the team members to:
          • Identify tech debt
          • Start taking steps to remediate the tech debt
        • This is an indication of growth of the members of the team
    • Time to clean up the passwords in the source files
      • -- anonymous
      • It ain't easy to nuke passwords from github, change the password and don't commit any more passwords to github
    • "I need you to fail, so that things get better"
      • Oh and no more working until 4am
    • Cleaning up the home theater after the raid failure
Good stuff as usual, thank you to all for stopping by.

Friday, February 25, 2022

Code & Coffee - 2/25/2022

 Code & Coffee - 2/25/2022

  • Work wear
    •  Fun way to be part of a remote team together
  • Intentional Practice
    • Codewars/leetcode/hackerrank etc
      • https://www.codewars.com/dashboard
      • https://leetcode.com/
      • https://www.hackerrank.com/
      • These a fun to keep sharp and may even be fun to try as a group project 
      • Commonly used as recruiter tools so watch out how they use your email address.
    • Make a reference app
      • the ref app is a base for further learning and experiments.
    • Use a leetcode/hackerrank/codewars problem as a weekly team exercise
      • Make a team convention to get together at a certain time each week and solve a problem
    • Trying to prepare for a lot of scenarios for ingesting data.
      • Sort of a data kata.
    • What else can be practiced:
      • Story sizing
      • Writing
        • Documentation writing
        • Get it reviewed
    • Do something hard
      • Used a bunch of esp32 devices and had to work with C to get the project done
      • It was good to have a deadline
      • And a purpose
      • Learn how to (appropriately) cut some corners.
    • Paperclips + Selenium
      • https://www.decisionproblem.com/paperclips/index2.html
    • Gamification of Practice
      • Find something fun that you can also practice on.
      • Robo code
        • https://robocode.sourceforge.io/
  • Email switchover
    • IP warming
    • Load testing
  • Weekend plans
    • https://www.michigannordicfirefestival.com/
    • https://lpcarc.org/hamfest/
    • Fun with Gradle dependencies

Friday, February 18, 2022

Code & Coffee - 2/18/2022

 Code & Coffee - 2/18/2022

  • Quastor had an article on the architecture of databases
    • Listened to a related podcast: Analytics Engineering
      • Had a good episode about "real time database"
      • It might be this one: https://podcasts.apple.com/us/podcast/the-analytics-engineering-podcast/id1574755368
  • Talked about IoT
    • in Hotels
    • on Air Compressors
  • Fun plan ideas:
    • Heading to VGM Con: 
      • https://vgmcon.org/
      • Hope the weather holds
      • Video Game music Con
    • Vegas in March
      • for March Madness
  • Design docs
    • Matt has used them to complement processes
      • Has run the gamut from hig process to lean process
      • Lets not measure code lines/hr
    • Elements
      • Sequence diagrams
      • Caveats
      • Architecture diagrams
    • Spread it around to get feedback
      • This is a tool to present a light design pre-implementation to see if ideas from multiple head match. Sync up
      • Can also be a tool for splitting the work into parallelizable units.
    • There should be levels of this
      • 50,000 ft view - this can be consumable by business
      • and several iterations lower
      • down to nitty gritty technical details. - consumed by the developer.
    • These designs feed into documentation.
      • documentation should agree with the tech design
    • Documentation is a leading indicator
      • better docs => better product
      • better isn't always more
    • Woodworking is a great way to learn design
      • Lots of parts that need to come together 
      • You can swag it but the result looks meh
      • Planning a little ahead will turn out a better product.

Friday, February 4, 2022

Code & Coffee - 2/4/2022

 Notes from Code & Coffee 2/4/2022

Friday, January 28, 2022

Code & Coffee - 1/28/2022

 

Notes for Code & Coffee: 1/28/2022

  • Replacing the six year old mouse
  • SICP for javascript is available for pre-order
    • link
  • Found this out from hacker newsletter
  • x Driven x
  • Coupling question
    • Building an interface just for the sake of building an interface
    • Talked about the usefulness and when to use and not use an interface
    • It is cheap to extract so what is the reason to make them unnessecarily
  • Stringly typed interfaces
    • Open API contract first
    • Contract is outside the code so does not get accidently changed
    • Service POJO is generated from Open API
    • First thing that happens is a conversion from the POJO to a Domain Object
    • (Immutable) Domain Object has the validation
    • Each Domain Object has invariants and will throw and exception if attempting to construct an invalid object
    • Validation code is concentrated into the Domain Objects, not strewn about
    • Disadvantages
      • Changing the rules can expose issues with previously stored data
      • Example changing a business rule that will make a newly required field
        • There will be a problem loading the previously saved fields.
      • Just be careful ;-)
  • DRY 
    • What is too dry
    • Rule of three
    • Is code that looks the same really the same?
      • maybe/maybe not
    • Summing the budget and the audience is not the same.
      • How do you round the audience members?
  • Splitting the domain object
    • In three parts
      • ID - invented key or perhaps multi-part 
        • guid
        • or guid + userId
        • validated at ID construction time
        • don't cross the streams ;-)
      • Data - User controllable data
      • MetaData - System created data
    • Insert - xData comes in and is validated - return ID
    • Update - .... something something something.
    • Only need the parts you need.
  • Immutable grass is what I need
    • it doesn't grow so I don't need to waste time cutting it.

Friday, January 21, 2022

Code & Coffee 1/21/2022

Topic:  Book Review: Code that fits in your head

  1. Intro
  2. Book review: Code that fits in your head:
    1. Slides: https://docs.google.com/presentation/d/1zIvPQo_h_w168xCE2fS4J4OYqHylvH6kSZGw8IQsm5I/edit?usp=sharing
    2. O'Reilly: https://learning.oreilly.com/library/view/code-that-fits/9780137464302/
    3. Amazon: https://www.amazon.com/Code-That-Fits-Your-Head-ebook/dp/B09D2X43VX
  3. Talked a bit about state
    1. How to mutate 
    2. Functional stuff
    3. Grokking Simplicity
      1. Deconstruct programs into:
        1. Data
        2. Computations
        3. Actions
      2. Links to book:
        1. https://learning.oreilly.com/library/view/grokking-simplicity/9781617296208/
        2. https://www.manning.com/books/grokking-simplicity
        3. https://www.amazon.com/Grokking-Simplicity-software-functional-thinking/dp/1617296201
      3. this pairs well with the book:
        1. "Solving Problems the Clojure way"
        2. This aligns well with the data/calculation/actions of Grokking Simplicity
        3. https://www.youtube.com/watch?v=vK1DazRK_a0
  4. Matt's book recommendation:   "How not to be wrong"
      1. Using math to be righter
      2. https://www.jordanellenberg.com/how-not-to-be-wrong
      3. https://www.amazon.com/How-Not-Be-Wrong-Mathematical/dp/0143127535
      4. https://en.wikipedia.org/wiki/How_Not_to_Be_Wrong

    1. Things started getting crazy around here and I couldn't keep up typing as much ;-) and my outline numbering is broken beyond comprehension.
  1. "97 things every programmer should know" - Kevlin Henney
    1. O'Reilly: https://learning.oreilly.com/library/view/97-things-every/9780596809515/
    2. Also look for other "97 things every X should know" books
  2. Refactoring - Martin Fowler
    1. Learn what the work REALLY means.
    2. Changing the shape of code without changing external behavior.
    3. O'Reilly: https://learning.oreilly.com/library/view/refactoring-improving-the/9780134757681/
    4. Amazon: https://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Signature-ebook/dp/B07LCM8RG2/
  3. Pheonix Project - 
    1. Accelerate - Building and Scaling High Performing Technology Organizations"
      1. This is a data and case study driven book separated into two parts, the first part tells about the findings and the second part presents the backing data.  It may be possible to get most of what you want with just the first part if you suspend caring about the backing data.
      2. O'Reilly: https://learning.oreilly.com/library/view/accelerate/9781457191435/
      3. Amazon: https://www.amazon.com/Accelerate-Software-Performing-Technology-Organizations-ebook/dp/B07B9F83WM
    2. The Devops handbook - Gene Kim/Jez Humble
      1. May be hard to just read
      2. Amazon https://www.amazon.com/DevOps-Handbook-World-Class-Reliability-Organizations-ebook/dp/B09G2GS39R
      3. O'Reilly: https://learning.oreilly.com/library/view/the-devops-handbook/9781457191381/
    3. The Unicorn project
      1. https://www.amazon.com/Unicorn-Project-Developers-Disruption-Thriving-ebook/dp/B07QT9QR41
  4. The mythical man month
    1. https://en.wikipedia.org/wiki/The_Mythical_Man-Month
    2. Classic that everyone should read.
  5. Unlimited book budget for the kids
    1. Go pick out any book you want
    2. Would rather have them read low quality stuff than not read at all.
  6. Quastor.org
    1. Daily email with quick hits for learning
    2. https://quastor.org/
  7. Hardcore History - podcast by Dan Carlin
    1. https://www.dancarlin.com/hardcore-history-series/
Good stuff today!
Thank you everyone.

Friday, January 7, 2022

Code & Coffee 1/7/2022

 Topic of the day:  What is an "Expert"?

  • The Expert: https://youtu.be/BKorP55Aqvg
  • The name on the frame is Expert: https://www.youtube.com/watch?v=B2XQN-Yz9EM
  • If someone else says you are good at something you may be an expert
  • If you think you are good: https://www.britannica.com/science/Dunning-Kruger-effect
  • Finding 3 BILLION unnecessary queries might mean you are an expert.
    • Added a cache in front of the db
    • Saved a week of cpu time every 24 hours
    • This was about 1/3rd of the queries
  • Shadow ops are easier when nobody is looking.
  • regexing for xml tags means you probably an expert (at causing yourself pain)
    • Oh by the way, intellij has regex tester (a la regex101) built in
  • Using string interpolation to insert comments making conditionals in your sql query might mean your an expert
    • or it might mean you like pain
  • March is not far from January
    • learning to estimate
    • nobody is an expert at estimation