Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
9fe1ab4
Added my user info to config
scottrippey Aug 11, 2020
50cbbbe
[config] Disqus
scottrippey Aug 11, 2020
ed2db9f
Creating a testing culture
scottrippey Aug 11, 2020
45d57d1
Changed title
scottrippey Aug 11, 2020
f6cbdfa
Create draft-2020-8-10-why-you-should-stop-using-promises.md
scottrippey Aug 11, 2020
1902583
Create draft-2020-8-11-typescript-is-just-tests.md
scottrippey Aug 11, 2020
a76cb69
[async-functions] Started article
scottrippey Aug 11, 2020
76b061b
[async-functions] Finished Promise post
scottrippey Aug 12, 2020
e2f4027
[about] Added About page
scottrippey Aug 16, 2020
b7f3cd5
[my-projects] Initial post
scottrippey Aug 16, 2020
b410486
Rename 2020-8-10-how-to-create-a-testing-culture.md to 2020-08-10-how…
scottrippey Aug 16, 2020
66d928a
Rename 2020-8-12-why-you-should-stop-using-promises.md to 2020-08-12-…
scottrippey Aug 16, 2020
85a5ac1
Update 2020-08-01-my-projects.md
scottrippey Aug 16, 2020
2504fa7
Update about.md
scottrippey Aug 16, 2020
5d123dc
Update about.md
scottrippey Aug 16, 2020
7522870
Added TailwindCSS blog
scottrippey Sep 3, 2020
99a1184
Added RippeyEats sample, and some screenshots
scottrippey Sep 3, 2020
fdd1752
Added xquest image
scottrippey Sep 3, 2020
a292ecf
More screenshots
scottrippey Sep 3, 2020
0b4d1be
Merge pull request #1 from scottrippey/projects-rippey-eats
scottrippey Sep 3, 2020
6496d63
Update 2020-08-01-my-projects.md
scottrippey Sep 3, 2020
3c341e1
Update 2020-09-02-tailwindcss.md
scottrippey Sep 3, 2020
7b49687
Updated wording
scottrippey Sep 3, 2020
88dafbd
Analytics
scottrippey Sep 3, 2020
cafac5a
Unlocking the power of Storybook
scottrippey Oct 17, 2023
fe14335
blogs: imported all content I wrote for Formidable
scottrippey Apr 24, 2025
035f55b
Added citations to original published url
scottrippey Sep 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
_site
.DS_Store
.idea
.jekyll
.jekyll-metadata
.bundle
Expand Down
20 changes: 10 additions & 10 deletions _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
#

# Name of your site (displayed in the header)
name: Your Name
name: Scott Rippey

# Short bio or description (displayed in the header)
description: Web Developer from Somewhere
description: Full-Stack Engineer, Visual Designer

# URL of your avatar or profile pic (you could use your GitHub profile pic)
avatar: https://raw.githubusercontent.com/barryclark/jekyll-now/master/images/jekyll-logo.png
avatar: https://avatars3.githubusercontent.com/u/430608

#
# Flags below are optional
Expand All @@ -21,27 +21,27 @@ footer-links:
email:
facebook:
flickr:
github: barryclark/jekyll-now
github: scottrippey
instagram:
linkedin:
linkedin: scottrippey
pinterest:
rss: # just type anything here for a working RSS icon
twitter: jekyllrb
stackoverflow: # your stackoverflow profile, e.g. "users/50476/bart-kiers"
twitter:
stackoverflow: users/272072/scott-rippey # your stackoverflow profile, e.g. "users/50476/bart-kiers"
youtube: # channel/<your_long_string> or user/<user-name>
googleplus: # anything in your profile username that comes after plus.google.com/


# Enter your Disqus shortname (not your username) to enable commenting on posts
# You can find your shortname on the Settings page of your Disqus account
disqus:
disqus: scottrippeyblog

# Enter your Google Analytics web tracking code (e.g. UA-2110908-2) to activate tracking
google_analytics:
google_analytics: UA-177199022-1

# Your website URL (e.g. http://barryclark.github.io or http://www.barryclark.co)
# Used for Sitemap.xml and your RSS feed
url:
url: https://scottrippey.github.io/

# If you're hosting your site at a Project repository on GitHub pages
# (http://yourusername.github.io/repository-name)
Expand Down
10 changes: 0 additions & 10 deletions _posts/2014-3-3-Hello-World.md

This file was deleted.

79 changes: 79 additions & 0 deletions _posts/2020-08-01-my-projects.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
---
layout: post
title: Scott Rippey's Projects
---

Here's a showcase of my open source projects, and a few stories about my past work projects. Enjoy!

## My Open Source projects

### [SmartFormat.NET](https://github.com/axuno/SmartFormat)
This is a really simple project that I worked on for fun. It's a string-template engine for .NET, which I wrote many years ago.
However, as I moved away from .NET development, a kind user, @axuno, became a major contributor, and eventually took ownership and maintenance of the repo.
To my surprise, it has nearly 1 million downloads in NuGet now!

### [XQuestJS](http://scottrippey.github.io/xquestjs/)
A fun little "space shooter" game that you can play in your browser, phone, or tablet!

![xQuest 1 Heat of the Battle](https://user-images.githubusercontent.com/430608/92063687-fade5080-ed58-11ea-89e5-d133f7a72c17.png)

### [RippeyEats](http://scottrippey.github.io/sample-RippeyEats/)
This was done as a little "interview exercise". It's a nice little demonstration of a React, TypeScript, TailwindCSS, and Parcel development stack, and should showcase some of my coding skills.

![RippeyEats Sample](https://user-images.githubusercontent.com/430608/91997404-4a8c3000-ecf7-11ea-8068-d63ab8f34a84.gif)



## My Work Projects

I've written a LOT of code in my career, but as is common, most of it lies in the hands of my employers! Here's a couple of the interesting projects I've worked on, and some stories behind them.

### [InVision Studio](https://www.invisionapp.com/studio)

![InVision Studio](https://user-images.githubusercontent.com/430608/92064206-41807a80-ed5a-11ea-8f45-e43354e64938.gif)

#### The Beginning
I was drawn to InVision by the tagline "made for designers, by designers". I love designers! I actually wish I was one, but my technical skills have always outweighed my artistic skills. Gotta pay the bills! But I've always loved working as the middle-man, between the design team and the engineering team. Like a Front-FRONT-end engineer.
So, I was excited to work on design software. And InVision's designers are awesome ... really the best of the best. After a few months into my employment, I caught wind of a "top secret" project ... something to do with a canvas and animation ... so I had to get in on that! And sure enough, I found myself working on the most interesting project I could think of! Creating an actual Design Tool!

#### The Project
InVision Studio was my dream project. An opportunity to not only build a design tool, but to master using it, and to even make it better.

It was all built on web technologies, too, which I loved. That kept me up-to-date with my skill set, and taught me a lot of new things I wanted to learn. React, TypeScript, and Electron are all very interesting technologies, and are skills that are in top demand. I'm happy to have those on my resume!

#### A Funny Story
When I first started working on Studio, it was a top-secret project. I signed an NDA, and couldn't even talk about the project to most coworkers.
I was in a video call with a few managers, and we were discussing a 3rd party tool that we needed to authorize with our Purchasing department.
So the Purchasing department head, Shalom, asked me to add him to the project. Sharing my screen, I typed his name, autocomplete showed suggestions, and I quickly hit Enter.
He tells me "I still don't have access" ...

A few quiet seconds go by, as I slowly realize that the "Shalom" I selected was not the "Shalom" on the call. He wasn't even part of our company.
So I had just given some stranger admin access to our top-secret application. With all of my managers watching.

Flushed, I removed him, and we all kinda chuckled at my mistake. But, how bad could it really be? Some random guy named Shalom will get an email, revealing the fact that InVision was working on something called `studio-app` ... he'll just delete it, and everything will be fine, right?

Still sharing my screen, I go to Shalom's profile. And he's the lead developer for a product called Pixate. A design tool. A direct competitor. Who now knows that InVision is entering the ring.

We all kept chuckling, as my manager asked me where they should send my last check. I didn't actually lose my job that day, but I did spend the next week renaming all our repos with codenames, to make sure I didn't leak that info again. And they took away my keys.


### Xbox One App for AT&T Uverse

![ATT Xbox 2 Movies](https://user-images.githubusercontent.com/430608/92063875-77712f00-ed59-11ea-85a5-7fa1cfca5426.jpg)


#### The Beginning
I worked for AT&T's Uverse cable service (through a company called Piksel), and worked initially on their website, streaming TV and Movies, a lot like Netflix.
Before the Xbox One was announced, our company was commissioned to develop an Xbox One app for AT&T. I was super excited, to actually develop a media app for a video game console! Plus I felt all special, because this was all "top secret" before the console was released. I called my best friend and bragged that night.

#### The Project
I got to work with a 50" TV on my desk, and a controller next to my keyboard, so I felt pretty special. The development console didn't actually play games, so I wasn't really that special, but it felt cool!
The app went live, and as a Thank You gift, I received my own Xbox One console. It was a really fun project.

#### A Funny Story
Well, I was pretty bummed that my development console couldn't play games. However, I was in the middle of developing my own JavaScript game for fun ... so I actually bundled my own video game as an easter egg inside the Uverse App! I didn't want ANYONE to know, since I was afraid that the easter egg would invalidate the Certification process, so I hid it really well. I didn't even test it -- because it was pretty hard to hide a video game on a 50" screen!
One night, I had to work super late, and was the last in the office. I finally used that chance to launch the game, and worked out a few bugs, and that was all the testing I could really do! I successfully shipped the game in the app.

Unfortunately, last I checked, AT&T has discontinued their Xbox One app support, so my app no longer sees the light of day. At least [the game I wrote](http://scottrippey.github.io/xquestjs/) still lives on!

[last updated Sept 2, 2020]
39 changes: 39 additions & 0 deletions _posts/2020-08-10-how-to-create-a-testing-culture.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
---
layout: post
title: How To Create a "Testing Culture"
---

I love writing unit tests. I evangelize their value to teammates, and I'm always cultivating "testing culture" within my teams. I've developed several projects that have very high coverage (~95%), and those projects are my absolute favorite to work in.

However, I've also seen many testing attempts fail. And it's always the same reasons:
- Deadlines - not enough time/resources to add tests
- Maintenance - Tests become outdated and obsolete
- Agility - specs aren't know ahead of time, so TDD doesn't really work
- Value - adding tests to existing code doesn't provide much value

**These failures are due to a common misunderstanding!** There is a core testing concept that developers need to understand:

## Tests are not a finishing tool. They're a building tool.
If you're not using tests for building, you're missing the vast majority of their value!

Imagine you're building a **house of cards**. The tests are like "scaffolding" built up, behind the cards, holding things securely in place.
If you try to build the house first, and then add the scaffolding second, you're wasting your time! The house is built; the scaffolding isn't critical. It might add ridgidity, but it becomes a hinderance as the house constantly changes.
Instead, imagine you add the scaffolding as you build each section of the card house. Each section will be secure, and building on top of other sections is stable. The scaffolding holds the little sections securely, and allows you to build faster on top. It allows you to move sections around, as the shape of the house changes.

So, to cultivate a "testing culture", **the tests need to be a development tool**. In many cases, it could be your PRIMARY development tool! Tests run fast, they can address every use case, they don't require user intervention or following instructions.
So once you've started writing code, make it your top priority to run that code in a test runner. You don't need assertions, you don't need to define all the specs just yet. Just `console.log` something to the screen, so that you now have a **unit-test development environment**.

When you have a unit-test development environment, the aforementioned problems are solved!
- Deadlines - tests speed up the development process
- Maintenance - tests are updated during development
- Agility - specs are changed when the code changes
- Value - not only do the tests speed up development, but they also provide stability

When you see a codebase with a high test coverage, I can almost guarantee it's because the tests are the development environment. That's how you maximize the value of tests, and how you cultivate a "testing culture".

# Real World Examples

Here are a few of the projects that I worked on that truly benefitted from unit-test development environments. Hopefully these demonstrate the value of the "unit-test development environment".

1. A deployment workflow chatbot. Manual testing was extremely difficult and time-consuming, due to many interconnected systems. So I mocked them all out, and isolated the chatbot logic. That allowed us to do 95% of our development from within unit tests, and only needed to manually test once ready to go into production.
2. A text-layout algorithm. Manual testing involved running the entire application, getting text into the correct state, and visually inspecting it. Instead, the unit tests rendered the results directly to an image for inspection. This allowed us to develop and test against 100s of scenarios and edge cases.
34 changes: 34 additions & 0 deletions _posts/2020-08-12-why-you-should-stop-using-promises.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
layout: post
title: Why you should STOP using Promises!
---

Four years ago, I wrote some articles explaining how and why you should use JavaScript Promises: [Understanding JavaScript Promises](https://engineering.invisionapp.com/post/understanding-promises/) and [8 Tips for Mastering JavaScript Promises](https://engineering.invisionapp.com/post/mastering-promises/).
Well, times have changed, and I'm here to say: you should STOP using Promises!

## Use async functions instead!

Let me get straight to the point. For async code, you should be using an `async function` (and its `await` syntax).

Async functions allow us to use the same **language features** as our sync code, instead of using the Promise APIs.
- `await` instead of `.then`
- `catch` instead of `.catch`
- `return` instead of `Promise.resolve`
- `throw` instead of `Promise.reject`
This results in cleaner, more consistent code.


## Promises are just _implementation details_

You might say "async functions are just syntax sugar for Promises". But I disagree! I'd argue that **async functions** were actually the end goal from the start. Promises just bridged the gap, as a way to achieve some of the benefits of async programming before the language supported it. Now that we have async function support, we've arrived. Promises got us here, but now they're fading into an _implementation detail_. I like to think of Promises like an async callstack; something you should be aware of, but for all intents and purposes, something you forget about.


## Promises are only needed for 2 scenarios

I think there's only 2 scenarios where you should use a `Promise` in your code.
1. Converting a callback API into Promise API, so it can be `await`ed. For example, you might want to wrap `setTimeout`, or perhaps wrap a library that only supplies a callback API. It is your responsibility, then, to promisify that API, typically using a utility or simply `new Promise(...)`.
2. `Promise.all` is a useful utility that should be used for waiting for results in parallel.

## Conclusion
The more you write async functions, the less you think about Promises. They fade away into the background, and you get used to the clean, flat structure of `async` code.
So if someone you know uses the Promise syntax, and it makes you cringe, please send them to this article.
Loading