About Keith Brown

As the Chief Technology Officer for Pluralsight, it's my job to make sure that our content delivery platform doesn't get in the way of your learning! I'm striving for less friction and more consistent quality every day.

New Android player released to the Google Play store today: v1.1.151

This new release includes a modern look and features you’ve asked for:

  • Easier to use on tablets
  • Recently watched courses at your fingertips
  • Easy to find newly published courses
  • Plus members can now queue entire courses for download
  • All orientations supported on all form factors
  • Improved stability

Android player on the Google Play store – v1.1.151

Please if you like the app, take a moment and leave a rating and a review on the Google Play store. Thanks!

Playing a courseFull screen mode

Our Android player gets a face lift – v1.1.151

This beta build includes a modern look and features you’ve asked for:

  • Easier to use on tablets
  • Recently watched courses at your fingertips
  • Easy to find newly published courses
  • Plus members can now queue entire courses for download
  • All orientations supported on all form factors
  • Improved stability

Android player beta release – v1.1.151

Please leave a comment here and let us know how it works for you!Playing a courseFull screen mode

My Clojure Journey: Simple Expressive Tests

One thing my team has struggled with in enterprise C# development is the complexity of unit test setup. This is complicated by Domain Driven Design, which encourages the use of concrete classes for entities and values. Test setup often becomes nontrivial as you are often required to set up considerably more of the object graph than what’s really necessary for the test at hand, simply because of the constructor signature on, say, a value object that you want to test.

This is much less of a problem in a dynamic language like Clojure, where there are no hard and fast rules about constructing objects – you can just create a map with only the properties you need for the test. For example, here’s a test in my Hearts project that invokes a function named next-player-pos and passes it a game of Hearts, which here is simply represented as an empty map {}:

(deftest next-player-at-start-is-first-player
  (with-redefs [first-player (constantly {:pos 2})]
    (is (= 2 (next-player-pos {})))))

Continue reading

Now you can slow us down!

For many years we’ve had the ability to play back our courses at high speed, and that works great when you can understand the author very well. But what about that one course that you really want to watch, but the author speaks a little fast, or maybe English isn’t your first language?

Slow it down!

Now you can slow us down! Our HTML 5 player now allows you to adjust the speed not only up to 2x the speed, but down to 1/2 speed as well. Even if you don’t plan on using this regularly, it’s kind of funny to listen to some of us at half speed :-)

Continue reading

My Clojure journey: pure functions

PureIn my last blog post in this series, I pointed to 4clojure as a great tool to help you practice writing functions in Clojure. By its very nature, 4clojure only allows you to write pure functions. In this post, I’ll talk about the beauty that I see in pure functions, but also point out that you’ll typically need a little more than pure functions to build an app in Clojure.

It’s not so much what a pure function does that defines it. It’s more what it doesn’t do. A pure function doesn’t rely on any state beyond what’s passed to it via its argument list, and the only output from a pure function is its return value.

Continue reading

New feature: Course discussions via LiveFyre

LiveFyre logoI’m excited to announce that every course in our library now includes a new Discussion tab where you can discuss the course. After a lot of debate, we’ve settled on LiveFyre as our discussion provider, which gives you lots of options for signing in and sharing the discussion: you can use a Twitter account, Facebook, Google+, LinkedIn, or OpenId, or a combination so that you can easily share your discussion across multiple social networks.

To get started, simply visit the Discussion tab for any course and click Sign In.

New course discussion tab

You can sign in with any one of the listed social networks, or create a password directly with LiveFyre. As you write your post, you can use the pencil and @ buttons on the bottom left to add markup and references to friends on your social networks. Before you click “Post comment” on the right, be sure to select the social networks where you’d like to share your post. In the example here I’ve selected LinkedIn and Facebook.

Using LiveFyre

We’re hoping you’ll use this as a way to connect with other students of our courses, discussing the course, the technology that the course covers, or the materials of the course itself. We’ve already had one student leave a comment about a missing file in a new course and the author herself jumped right in and provided a link to her SkyDrive to quickly resolve the problem while we updated the Exercise Files for the course. While we can’t guarantee involvement from any particular author (many of them are industry luminaries and have busy schedules), we think you’ll find that most of our authors love to connect with students.

We’d also love to hear your feedback about the course – if like something about it, use LiveFyre to tell us and share it with your friends! If you find something you don’t like, tell us that too – we’re always working to raise our game, and our authors love detailed feedback.

As with any social feature, it’s tough to know how it’ll be used before it goes live, so we’re excited to see how our customer community will make use of this new feature. Give it a try today!

My Clojure journey: Hearts, koans, and 4clojure

HeartsI blogged recently that my boys and I have started learning Clojure. It’s been an incredibly fun journey so far, sans the challenges of cobbling together a Clojure dev environment (which I’ll talk about another day). I’ve come a long way, and I wanted to share my journey so far, which starts with a card game called Hearts.

My kids and I enjoy playing cards together, so I figured a great first project in Clojure would be one of our favorites, Hearts. Modeling a game of cards requires a bit of data modeling (a shuffled deck of cards, dealt hands and tricks as the game gets underway) along with some logic (computing who is the first to play any given trick, the winner of a trick, scoring, etc.) It felt like a great way to get started.

Continue reading

Share your Pluralsight achievements with a public profile

iStock_000017274401XSmallWe recently released a new feature that allows you to customize your Pluralsight profile and show it off to the world!

Simply sign into pluralsight.com and click your user name in the upper right corner to drop down the menu. Click “Your profile” and you’ll be taken to a page that lets you edit and share your profile with everyone. Just click the button below to make it public. Then you can share your Pluralsight URL with your friends and colleagues.

Right now we only include some basic information from your user profile and activity (read below) but over time we plan to incorporate quite a bit more.

Share your profile with the world! Continue reading

CTRL your CAPSLOCK key for great good

I’ve always had pretty good typing skills, but sometimes I’m not quite as accurate as I’d like. As a younger developer, I’d sometimes miss the Tab key and accidentally mash CAPSLOCK instead. If you work on a PC you’ve probably done the same with the Insert key. I’m pretty sure that’s what happened to this guy:

Continue reading

Learning a new language: Clojure

Software craftsmanship is very important to me and the dev team here at Pluralsight. And one aspect of that is continuous learning – improving yourself instead of remaining stagnant. As Bob Martin points out in The Clean Coder, if you have the luxury of working 40 hours a week as a programmer, you owe it to yourself and to your employer to spend a significant amount of your own time each week sharpening your skills as a craftsman. One way to do this is to stretch yourself and learn a new language – preferably one that stretches how you think about programming beyond your current paradigm.

I’ve personally started down that journey recently by learning Clojure.Clojure logo

There are several reasons why this makes sense for me personally, and I’ll share some of the main motivations in this article.

Continue reading