Blog

Categories: Life

Notes on “Transforming Team Communication” event from Slack

Taking place at restaurant in Toronto distillery district, cocktails and drinks, RSVP free event, first speaker is Slack VP of Eng, Michael Lopp. After that is showcase of Slack features, and then a customer panel. More networking afterwards.

Michael Lopp – Showing off Slack and how it’s managed day to day

Evolution of collaboration starting with email and it’s drawbacks. Slack in contrast has searchable history, “amazing from an onboarding perspective”. Moving on to intranets for documentation. Then evolving to wiki which allows people to update anything out of date. But the drawback is people leave, which means wiki pages don’t have champions for it. People were constantly maintaining and not realizing the value.

Social came along, micro transactions of thumbs up and thumbs down. In the business world we still are stuck on email.

Slack has learned from history of email, intranet, social. Slack gained broad product adoption from the builders (low level employees). Chart showing how slack adoption has completely outpaced competitors like hipchat, Yammer “most popular collaboration apps – messaging”, NPS.

Slacktualization: messaging is where it starts. The next inflection point is moving messaging into channels; giving context to the conversation. Record keeping and productivity is going on within the channel. The channel starts to organize all your people and projects. Integrations into slack to do quick approval of expenses. Then managing workflows within slack. At the top is “AI”.  All the conversations within slack have signals such as reactions and search. Using data to surface more value.

Measure engagement, not accounts. Stickiness, communication, workflow, power users.

Users recognize the benefits: 72% say slack reduced length of projects; 76% say slack is easier.

Adoption is amazing even during Christmas.

Slack described as operating system of business. You are able to use slack with as many existing systems as possible. They’re a platform company trying to be neutral even integrates with competitors.

Slide showing a lot of clients and brands using Slack.

Demo time / Slack Showcase

Slack is a set of communication primitives. Your configuration will be different, different users and companies will configure differently.

One workspace is easy then you later want to segment into others. Social channels, executive channels, project channels.

Starred messages are used as todos, starred channels are used for regular checks.

Easy to mark as read for everything, changing focus instead of worrying about information, you can use search instead.

2 weeks after he got to Slack, he emailed Stewart Butterfield CEO of Slack. Stepping back from learned behaviours with email, so many different ways to use slack.

Quick switcher feature is one of the coolest: command K, searches through contacts and channels.

Emojis are also a cool future, the sentiment analysis from the reactions, alternative to asking each person of the team what they think. Emoji for eyes used as reaction for unread messages to say “I’m looking at it”.

Slash command helpdesk opens a dialog for creating an IT ticket.

Go into the channel details, Slack has started to show highlights of the channel based on emoji reactions and other signals.

Customer Panel

Shopify

Communication density, email would not be effective. The alternative chat app was not effective. New employees and emails used to email realize how important slack is.

What drives adoption vs organic usage. Smaller company led to quick change. Larger company has to look at trajectory of the tool, how does it look at scale, chart out how the tool will grow with us.

Explored data decoding to figure out which integrations are useful what questions are being asked.

We could not have done the automation of information without Slack. Having information delivered to us rather than opening multiple tabs.

RBC

How are people adapting to Slack? Traditionalists have to be moved over to new concepts. Forward thinking people like new application development are using Slack. Predominantly IT departments using Slack.

How have you seen people react to open transparent communication? The tool markets itself, training is built into the tool, great for adoption.

How do you think about machine learning as a component of Slack? Starting with search and highlights and the usability is much better.

Bell

Any team can be spread across many different sites and offices. Using Slack to make up for lacking face to face communication. Slack wasn’t a mandate, it was a movement. The workers at Bell asked some startups what they’re using and wanted to try it out. 16 month trial period to try Slack. Organic adoption within the company. Lots of workflows depend on slack.

Examples of integrations: Built up a lookup bot to look up corporate directory for phone numbers. Tracking status with bots for JIRA. Single point to interact with multiple systems.

Weather information affects wireless systems.

We could not have done true community building across multiple site. If you search the word community, you will see many channels come up.

Takeaways

Good event to learn more about Slack and their plans for the future and mainly to see the advice that Michael Lopp / Rands In Repose gave on how he uses Slack, and to see how a good networking and promotional event is run.

Categories: Web Dev Training

One Easy Way To Speed up your Rails Tests and RSpec

There comes a time in the life of every Ruby on Rails project where you and your team will end up with long running tests. Rails tests can contain factories, fixtures and lots of setup procedures before tests are executed, and all of these can contribute to major slowness in the test runs.

I’ve seen four ways of dealing with slow running tests in Rails:

  1. start deleting tests (or mark them as skip-able): the drawback is your test coverage drops and you may end up with more bugs
  2. use more integration tests rather than unit tests: this exercises a lot of code paths so test coverage won’t drop too much but in the end most developers will write integration tests that exercise the “happy path”
  3. Run your tests in parallel
  4. Run only the tests that were most likely to be affected by recent code changes

The latter two methods are much better than the first two.

My favourite so far is #3 because it still runs all of the integration and unit tests that you have but makes use of the fact that you can offload the work of running tests to multiple machines. Everyone now has access to multiple machines through AWS (Amazon Web Services) or Microsoft Azure or RedHat’s cloud. You can even run tests in parallel on your local development machine.

Run Your Ruby on Rails Tests In Parallel

The idea is that each test file will be run in separate processes.

If you have 5 tests that have a duration 2 minutes, in sequential runs it will take 10 minutes to run the whole test suite. If you have 5 processes available for parallel runs, it will only take 2 minutes to run the whole test suite.

That’s a huge difference and means you can make 30 test runs in an hour rather than 6 test runs.

Splitting RSpec test files into multiple files

However, some of your Rails tests may take longer; within the spec you could have multiple test cases and contexts that are taking too long. For example, one test context with a few tests could be taking 1 minute while the rest of the test cases in that file only take 10 seconds. At that point, you can split the long-running test context into multiple files.

Here’s an example of how that might look like:

# spec/my_controller_spec.rb
describe MyController do
  context 'Slow tests' do
    it 'runs slowly #1' do
      # ...
    end
    it 'runs slowly #2' do
      # ...
    end
  end

  context 'Faster part of the test suite' do
    it 'runs in 10 seconds or less' do
      # ...
    end
  end
end

And now here’s how we could split that controller rspec test file into multiple files.

# spec/my_controller_spec.rb
describe MyController do
  context 'Faster part of the test suite' do
    it 'runs in 10 seconds or less' do
      # ...
    end
  end
end

# spec/my_controller_slow_1_spec.rb
describe :MyControllerSlow1 do
  def self.described_class
    MyController
  end

  include_context 'my controller helpers'

  it 'runs slowly #1' do
    # ...
  end
end

# spec/my_controller_slow_2_spec.rb
describe :MyControllerSlow2 do
  def self.described_class
    MyController
  end

  include_context 'my controller helpers'

  it 'runs slowly #2' do
    # ...
  end
end

The reason this works is because we override the class method described_class. This method is used by the rspec-rails extensions that make it easier to test Rails classes with RSpec.

By using shared contexts and helpers and by splitting files, you can optimize your Rails tests even further.

(If you liked this article, I have written about using mocks with Django and Python unit and integration tests and using Protractor with AngularJS and how you can take screenshots with Selenium during test runs.)

Categories: Web Dev Training

3 Great Videos about GraphQL

Since GraphQL is a hot topic and a new way of creating APIs for client devices and applications, it helps to learn what it is, how it’s used and why it’s becoming quickly adopted for new projects. So here are 3 great videos on YouTube that explain why your team should explore GraphQL and consider it as a viable technology for your next project.

Lessons From 4 Years Of GraphQL

A reflection on GraphQL’s successes and its evolution within Facebook, the company at which it originated.

Connect Your Angular App To Any GraphQL Backend

At Facebook they use React (it was created there too!) but a lot of companies use AngularJS and now are adopting Angular 2/4/5+. This video shows you how to use it with an Angular app. Angular offers a more complete framework in contrast to React; so if you’re already using it, it’s definitely possible to use it with APIs such as GitHub.

Implementing & Using GraphQL at GitHub

GitHub started to use it for their API in 2016 and revealed it at their yearly event GitHub Universe. They show how they implemented part of the API and then show the client-facing portion through the query explorer. The query explorer is a powerful way to construct and test different API queries.

Categories: Life

How NOT to do Social Media Marketing (and 5 ways to get better at it!)

Haven’t posted about marketing in a while so here’s a good one: Someone spent thousands of dollars on buying things just to be able to post about them on Instagram.

Invest in your business, consider the ROI

Calveiro would treat herself to monthly $200 shopping sprees so she wouldn’t be seen on Instagram wearing the same outfit twice.

Imagine spending $200 a month on Facebook ads, Google ads or a LinkedIn Premium Sales Navigator ($65/month for individual account, $100/month for a team of 10+) to get more sales leads for your business.

That’s more worthwhile than spending $200 on a shopping spree just to take a few photos on Instagram.

Collectible marketing, badges, gamification

Then there was the desire to look like a jet-setter, traveling to a new location — such as Las Vegas, the Bahamas and Los Angeles — every month for a year.

“Snapchat had these [geo-]filters [like digital passport stamps] and I wanted to collect at least 12,” Calveiro said.

It looks like the marketing around collecting badges and gamification works! If you run an ecommerce site, you could have your own set of collectibles such as t-shirts, cups, stickers, buttons or some other small bit of swag that’s part of a limited-time collection (for example: orders over $100 get a free t-shirt, each order gets you a different t-shirt, collect them all!)

Usually you’ll see this kind of gamification and collectibles marketing strategy work at lower price points where it’s easier to spend, things like branded cups that come with a fast food meal or Beanie Babies or trading cards in an exclusive, limited time set.

Accept when you’re doing things for your business versus just to have fun

Although she traveled some for work, Calveiro said, “If you break it down, a lot of the travel I was doing in 2016 was strictly for Instagram.”

This is what David Allen talks about in Getting Things Done. When you’re in the moment you want to be doing the right things and enjoying yourself and not feeling regretful later on. For example, working after hours instead of spending time with family. Plan your time and know that you’re doing the right things at the right moment.

In this case, it’s traveling with a focus on Instagram marketing instead of just traveling to have fun and see the world. Be clear about why you’re doing things and be in the moment.

Don’t have the resources for social media marketing?
Use your time instead & focus on impactful strategies.

1. Reply and converse on social networks to boost your brand’s visibility

If you’re a solopreneur or a one-person business, you may not have the resources to buy advertising on Instagram or Facebook to find leads. You may have more time than money to spend and that’s what you should do. Maximize and improve your social media skills to draw in more people to your product or services.

Simple actions such as replying to someone who asks a question related to your product on Twitter improves your brand recognition. That costs you time and a little bit of thought but it is free in terms of money and other resources. It can have a huge impact because you’ll be creating conversations with potential customers and potential business contacts.

2. Recycle your content, show your existing content to new audiences

“A lot of it was recycled content,” Calveiro said of her posts.

Another good option is to recycle your content. I mentioned it on the Rudolf Podcast; you can post content you wrote years ago on to a new platform such as Medium or Pinterest, or you can create new smaller pieces of content from a larger article or video or podcast. You can also easily automate this and have Buffer or HootSuite or MeetEdgar send out tweets, Facebook status updates, and more with your previous content. Remember, that the audience you have today may not have ever seen your back catalog of great content, they may not know you wrote an amazing article years ago that’s relevant to them today.

3. Considering rentals/subscriptions/leases instead of buying

In place of her old shopping sprees, she shells out $130 for a Rent the Runway monthly membership — so she can have a revolving door of new clothes for hire.

Instead of buying a car; rent one. Instead of buying a camera, rent one. Instead of building your own email servers, subscribe to GMail for Businesses; instead of buying Photoshop, subscribe to Canva.

There are a lot of ways for businesses to save money by going with a subscription or rental plan than outright buying something.

4. Entrepreneurs and small businesses: Watch your budget, there’s very little room for error

“I had a lot of opportunities to save,” she said. “I could’ve invested that money in something.”

Save and re-invest in your business when you’re starting out or growing your small business. Check the ROI.

5. Invest in Facebook Ads, Google Ads and LinkedIn Sales Navigator

The fifth way to get better at social media marketing is to invest in advertising on the dominant platforms. If your business is selling to consumers, use Facebook ads or Google ads. Their great tools and huge audiences make every dollar spent worthwhile, each dollar spent on Facebook or Google ads has far greater impact than the same dollar spent on TV, radio or billboards or leaflets. If your business is selling to businesses (or governments), consider LinkedIn Sales Navigator.

Here are some great guides on investing in advertising on Facebook, Google and LinkedIn:

Follow me on Twitter, Facebook, and connect on LinkedIn

If you think this advice is interesting and want to discuss it further or you would like to talk about web development training and workshops or digital marketing and ecommerce, follow me on all the social networks:

Categories: Portfolio, Web Dev Training

GraphQL with Node.js and Mongoose/MongoDB

In March 2016, as part of an exploratory project, I worked on an example implementation of GraphQL using MongoDB and Node.js: graphql-server.

While at the time, the company decided not to go with GraphQL, it was only a year later that they revisited the idea and started to make it part of their core technology strategy. They had multiple mobile apps and 3rd party clients that needed a more performant interface than the REST API, which had some performance issues.

My exploratory project turned out to be ahead of its time and a prototype and justification for moving to GraphQL.

Example of a GraphQL Schema

Here’s an example of how to define a schema. The advantage for clients/consumers is that they can select only the fields they need from the API.

import {
  GraphQLObjectType,
  GraphQLNonNull,
  GraphQLSchema,
  GraphQLString,
  GraphQLInt,
  GraphQLList,
  GraphQLID,
  GraphQLBoolean
} from 'graphql/type';
import co from 'co';
import mongoose from 'mongoose';

import models from './models';

var makeGQLString = function(desc) {
  return {
    type: GraphQLString,
    description: desc
  };
};

var makeNonNullGQLString = function(desc) {
  return {
    type: new GraphQLNonNull(GraphQLString),
    description: desc
  };
};

var makeGQLBoolean = function(desc) {
  return {
    type: GraphQLBoolean,
    description: desc
  };
};

var makeGQLInt = function(desc) {
  return {
    type: GraphQLInt,
    description: desc
  };
};

var listingType = new GraphQLObjectType({
  name: 'Listing',
  description: 'An event listing',
  fields: function() {
    return {
      id: makeNonNullGQLString('The id of the listing.'),
      slug: makeNonNullGQLString('slug'),
      title: makeGQLString('The title of the listing.'),
      description: makeGQLString('description'),
      description_html: makeGQLString('description_html'),
      category_id: GraphQLID,
      category_key: makeGQLString('category_key'),
      hashtag: makeGQLString('hashtag'),
      location: makeGQLString('location'),
      website: makeGQLString('website'),
      show_count: makeGQLInt('show count'),
      show_avatars_of_bookers: makeGQLBoolean('show_avatars_of_bookers'),
      show_tickets_sold_count: makeGQLBoolean('show_tickets_sold_count'),
      hide_date: makeGQLBoolean('hide_date'),
      capacity: makeGQLString('Capacity of the listing'),
      state: makeNonNullGQLString('State of the listing')
    };
  }
});

var eventType = new GraphQLObjectType({
  name: 'Event',
  description: 'An event',
  fields: function() {
    return {
      id: makeNonNullGQLString('Event id'),
      start_stamp: makeNonNullGQLString('Start of the event, timestamp'),
      end_stamp: makeNonNullGQLString('End of the event, timestamp'),
      city_name: makeGQLString('Event that the city is in')
    };
  }
});

var rootQueryType =  new GraphQLObjectType({
  name: 'RootQueryType',
  fields: {
    listings: {
      type: new GraphQLList(listingType),
      resolve: function(parent, args, ast) {
        return models.Listing.find().limit(10);
      }
    },
    listing: {
      type: listingType,
      args: {
        id: {
          name: 'id',
          type: new GraphQLNonNull(GraphQLString)
        }
      },
      resolve: function(parent, args, ast) {
        return models.Listing.findOne({ _id: args.id });
      }
    },
    events: {
      type: new GraphQLList(eventType),
      args: {
        listing_id: {
          name: 'listing_id',
          type: new GraphQLNonNull(GraphQLString)
        }
      },
      resolve: function(parent, args, ast) {
        return models.Event.find({ listing_id: args.listing_id });
      }
    }
  }
});

var schema = new GraphQLSchema({
  query: rootQueryType
});

export var getProjection;
export default schema;

We declare a root query that contains certain fields that are resolved by particular functions. The type of each field can be a list, non-null or other types. The resolve function is what fetches data from the database (or whatever caching layer(s) you have).

Within the GraphQLObjectType we can define a structured object with more fields and define the types of those fields. This is in contrast to most REST APIs which provide no schema.

It’s also possible, as you define the fields, to provide descriptions of them. These descriptions can appear in a GraphQL API explorer and since they are built-in and supported as part of the GraphQL specification, the descriptions can be supported by multiple libraries. In contrast, most REST APIs do not place descriptions near the fields within the code; they provide the descriptions (if at all) within separate documentation.

When building this prototype to provide a GraphQL interface to a MongoDB database, it was very easy to declare the schemas for the models and then to provide them as part of the interface.

Click here to see more code for a GraphQL server made with Node, Express and Mongoose.

Want to learn more about GraphQL?

Click here to see a list of 3 excellent videos explaining how GraphQL works.

Here are some questions on GraphQL at StackOverflow:

It is an exciting technology that promises to make it easier for clients to consume APIs and only receive exactly the data that they need.

Categories: AngularJS, Web Dev Training

How to use Local Storage for Caching in AngularJS 1.6

After we talk about window.localStorage and caching, I discuss the state of the Angular web framework with respect to AngularJS 1.6 and Angular 2/4/5+.

Local Storage and Caching in AngularJS 1.6

Let’s get to the fun stuff, Local storage in AngularJS 1.6!

Window Local Storage is an HTML5 web api that can be used to store data in the browser. The data is stored in a bucket for the current domain name (click here to view the Storage API).

An awesome developer created the angular-local-storage module for AngularJS 1.6 which gives you a nice API to work with in AngularJS for local storage.

What’s cool about is that you can listen for notifications whenever the local storage has been changed (with setItem or removeItem). It also lets you set the storage to use local storage or session storage. Session storage is great for quick caching while local storage is more long-term.

AngularJS API for Local Storage

The API for angular-local-storage is easy to use:

  • isSupported – whether the browser supports local storage
  • setPrefix – prefix used when setting keys
  • getStorageType – the type of storage used
  • set – set a value
  • get – get a value
  • keys – the list of keys that have been set in local storage (very very convenient!)
  • remove – remove a value
  • clearAll – remove all values set
  • bind – binds a value from local storage to a variable in the $scope

The most important API functions for angular local storage are: set, get, and bind.

AngularJS Local Storage Example Code

Here’s an example of how it’s used:

var myApp = angular.module('myApp', ['angular-local-storage']);
myApp.controller('HomeCtrl', ['$scope', 'localStorageService', 'someApiService', function($scope, localStorageService, someApiService) {
  
  function $onInit() {
    console.log('the keys! ' + localStorageService.join(', '));
    console.log('storing a value from an API call');
    someApiService.fetchValues(function(values) {
      localStorageService.set('valuesFetched', values);
    });
    localStorageService.set('formSubmitted', false);
  }

  function submitForm() {
    if (localStorageService.get('formSubmitted')) {
      console.log('form already submitted!');
    } else {
      localStorageService.set('formSubmitted', true);
    }
  }
}]);

In the example you can see that angular local storage is used to fetch values when the controller HomeCtrl is initialized with $onInit. After the value is fetched, we use the localStorage service to set the initial value for formSubmitted.

When the form is submitted through the submitForm method, we check the value of formSubmitted through localStorage and then set its value. The idea is to prevent resubmission of the form. Of course this is just for the frontend and it’s a good idea to check for resubmission on the server backend.

Angular local storage is simple to use and highly valuable as a cache for AngularJS web apps.

The State of Angular

After the last year of keeping up with Angular 2/4/5/6/7+ development, it seems that they’re still gearing up. In my eyes, they have taken on a lot of work and have shifted the ground underneath developers quite a bit. The full adoption and support for TypeScript is welcome news, but there are still many development shops that will use JavaScript and ES6 with Babel. The documentation and examples do not seem to support JavaScript as much as they support TypeScript. This is also true for Dart, which is used by Google for one of the larger Angular projects, but even they cannot count on full support from the Angular team.

There’s also the rapid rate of change. Angular has an upgrade path however it is not fun to upgrade dependencies and change code every few months because the API of the framework has changed.

The state of Angular at this point is similar to the state of the Django web framework before it was version 1.0. Before 1.0 of Django, every single week seemed to bring new changes in the codebase. It was fun to be on the cutting edge and the latest and greatest but Django before 1.0 was not ready for production. This cycle is happening to Angular. If you want to be on the cutting edge, use Angular and be careful when deploying and maintaining a production app.

When should you consider using Angular instead of AngularJS?

If you are starting a new project, you should consider Angular.

If you want to develop a mobile app using Angular, use NativeScript with Angular.

If your web development team has at least 3 developers, consider using Angular.

When should you consider using AngularJS 1.6 instead of Angular?

If you have an older AngularJS 1.x project, consider upgrading it to AngularJS 1.6 (don’t attempt a rewrite in Angular 2 until you do that!)

If your web development team has 1 to 3 developers, consider AngularJS 1.6 because you will find a lot of modules that have been production-ready and are well-tested. You will be able to ship the project into production and support it for years to come. As I pointed in the last Learning AngularJS issue about Siberian CMS, they are using AngularJS 1.3 for mobile apps and it still works just fine for them.

Thanks for reading!

Thanks for reading! If you’re still using AngularJS 1.6, don’t worry you are not alone, there are thousands of projects out there also using it and the modules are well-tested and production-ready! If you ever wanted to use local storage in AngularJS, now here’s your chance with angular-local-storage.

Click here to read more Learning AngularJS.

Categories: Leadership

Notes on “The New Manager Death Spiral”, a presentation from Michael Lopp/Rands In Repose

Here are some notes from the event that I attended where the VP of Engineering at Slack, and more famously, the writer behind the Rands In Repose blog (and author of three books), Michael Lopp presented on becoming a manager and the mistakes that will be made by new managers.

Some of the talk was based on the blog post written by Mr Lopp.

The Notes on the New Manager Death Spiral

Began with some questions about who’s a manager, designer, engineer, introvert or extrovert. Talk described as anti-advice. Walks through the manager journey, beginning with hey congrats you’re now a manager. Lopp asked how many people have formal managerial training. Personally started with “taking care” of a few team members, started with setting up one on ones.

When starting out as a new manager, you will assume that you are still an individual contributor. You will forget that you’re responsible for the team, forget to delegate tasks or you will be hesitant to give away some power. The first failure mode is that the quality of work drops, which leads to being behind schedule.

The overarching goal behind management and why it’s important

Your job as a manager is to get things done at scale.

Delegation and Delegating Tasks

Fake delegation is giving not enough context and not enough power to shape things. Successful delegation builds trust in the team. Saying, “Go figure it out….or else” is when the team starts talking to each other about the manager not being trusting of the team.

The manager’s job is to delegate aggressively.

Opinions become facts, and team is demoralized (within the new manager death spiral).

Management can be seen as a career restart. With our industry’s habit of not formally training people…

Lessons learned…let others shape your thinking…augment your obvious and non obvious weakness with a diverse team… delegate more than is comfortable.

Notes on the Q&A

How do you recognize management potential in software developers? Empathy tied into emotional intelligence, can the engineer read the room and being situationally aware, it’s a good leading indicator.

How to build trust with management above? Managing up is the same as managing team, clear communication and trust. During rapid growth, bad politics happens a lot within companies.

What’s the biggest management mistake you’ve made in the past year? Would assume data literacy of team but didn’t frame the narrative and shared too much data which led to drama, thought was doing right thing through transparency.

How do I get team to give critical feedback? Started with one on ones, always have an agenda. Dial it up and give feedback that is positive and negative. Slight increase every month and then ask whether they have feedback for you. At some point they will trust you enough to give feedback. Just listen, don’t try to understand, stop and say it back “what I heard was this”. Then they correct, and it builds trust. Anecdote it took a year to get this feedback and to build that trust. “Feedback is a gift.”

Recommendations for newly promoted to manager? What if you are promoted above your friends? First couple of months with friends, be explicit about friend hat and manager hat, same person just changing the context. Set boundaries. You can’t fire your friends but as manager you can fire them. You have to be deliberate about this.

Measure manager, 4 things to look for. Vision, can you describe a compelling future. Strategy, can you design the road signs and deconstruct the vision into road signs to guide the team. Tactics/execution…Judgement and decision making, you’re coming to crossroads all the time so why choose one path or another and how well do you explain it. Subjective and kinda objective.

Asks team leads about plans they have for growth of team.

Serial lack of training, where to get it? More important is getting company culture to train internally and usually first question he asks is how do we train managers. If small set up mentorship circles or use external resources.

How do you interview for judgment? My job is soup tasting (metaphor) what I’m looking for is how you explain path A or path B selection and need you to explain to me why did you choose that path. If you can explain it well and your strategy around that choice is explained well and you walk through it, is how he susses out judgment, was it a flip of a coin or decision with real consideration.

Do we need managers? Holacracy isn’t working out at Zappos or Medium. He thinks that managers serve a force multiplication function. Managers are there as information conduits and to lead growth of team. Self managing teams at scale need some form of management even if it isn’t called that.

From coaching and trust standpoint, how to build trust on remote team? It’s hard to do this, has bias to look face to face to know what’s really going on. Tries to travel a lot to meet the team. Depends on culture of team, how they answer questions and deference to managers. Moment when it blows up is if remote employees start to feel like second class citizens. Avoids remote, being able to see the whole team gives ability to read the room better.

Should managers be direct contributors? There are four roles to grow into, be CEO CTO VP of engineering or chief architect. Aspiration to be CEO moves to see other parts of business. VP of engineering is people and process. CTO is operations and still coding. Chief architect is still writing code. You need to be able to draw a clear path to each of those roles.

When you learn how well you’re doing is when there’s an emergency, it’s okay to fail and reflect and learn. Fail faster and make managers feel safe. Say what happened, and say it’s ok if you screw up, and work on the problem instead of worrying about the failure.

How do you efficiently delegate? At a small startup under 20 people you have the team and don’t need managers, but when you get past 20 to 50 or more, you need to start bringing in managers with good judgment to connect things together. They give the scaling function to the organization.

When you delegate, do you focus on delegating to people’s strengths? Sometimes things need to go fast and needs velocity, delegate to strength, tends towards growth mindset and will delegate based on learning/growth.

How do you improve reading the room as a skill? Advise extroverts to listen, introverts already listen more.

How do you manage people who don’t take feedback well? They need to have a safe environment of feedback, the manager needs to show that this is a valuable transaction and valuable communication.

Technical details…A minute a slide? Something like that. Slide text was at bottom and hard to see.

Categories: Portfolio, Software Development

Speaking at PyCon Canada 2017 on “Python as a Philosophy”

I’m going to be in Montreal this weekend for PyCon Canada to give a talk on “Python as a Philosophy”. It will explore some of the ideas that are part of Python, built into its core and affect its community and how those ideas have spread to other software and software developers:

A number of programming languages that have not been used quite as frequently as others contain “profound enlightenment” that a developer learns through their use. Languages such as Lisp and Smalltalk are in this category.

This presentation suggests that Python is also one of those languages. Python and PEP20 The Zen Of Python can affect how a developer writes code and then translates their practice into using other programming languages.

And more:

For example, my own hands-on programming in Python has allowed me to carry on a number of practices into JavaScript and Ruby. The talk will specifically cover “explicit rather than implicit” code and the value of documentation as a developer-user experience.

I will outline several examples and counter-examples of Python-inspired code practices within the context of JavaScript and Ruby.

Slides for the presentation:

Categories: Leadership

Scrum Methodology Diagram

For project managers who are training in SCRUM agile, here is a scrum methodology diagram for reference:

Diagram of SCRUM Agile Methodology with sprints, product owners, daily scrums
SCRUM Agile Methodology Diagram. [Click on the diagram to view the original size image.]

Scrum Agile Methodology

  1. User stories (and tasks, features, etc.) are written and added to the product backlog. These can be written by the team, the project manager, project owner, or any other stakeholder.
  2. The Product Owner (or project manager) organizes the product backlog.
  3. During a sprint planning meeting, user stories are selected for design and development and implementation and prioritized into the sprint backlog by the product owner.
  4. The team works on the items in the sprint backlog with the Scrum Master helping to unblock team members.
  5. Every day the team meets for a daily scrum meeting where they discuss what they are working on and if they are blocked or stuck on anything.
  6. At the end of a sprint, there is a retrospective to see what went well and what needs to change.
  7. Then the cycle begins again with new user stories added, existing user stories selected for development and so on.

What is the Product Backlog?

The product backlog is the list of potential user stories that can be worked on. The list can contain tasks bugs and features as well.

It can be organized by priority, by estimated dollar value, by urgency, by number of customers who would be happy, or by some other criteria.

What is a User Story?

In contrast to traditional project management where work packages are worked on, in agile you have a user story. Each user story includes the user persona or actor. It also includes what they would like to be able to do in the system.

Examples of user stories

  • As an author, I would like to write a book (for a word processor)
  • As the system administrator, I would like to view all performance metrics of our active systems
  • As an educator, I want to create a course outline
  • As an teacher, when creating a course outline, I want to include PDF presentation files and images
Categories: Portfolio

Participated in a Hackathon: ArthritisHack 2017

On the weekend of October 13th to 15th, the #ArthritisHack hackathon took place at the Mars Discover District. It was a cool event and I haven’t attended a hackathon in ages. The last hackathon I attended was a hackathon sponsored by LinkedIn in the same place and before that it was a kind of catch-all hackathon with multiple APIs in the west end of Toronto where people used the Yellow Pages API and Soundcloud API.

At this event, with a team of five, we built a small automated marketing platform for arthritis-focused charity events and built a chatbot to engage people and raise awareness about arthritis.

Continue reading “Participated in a Hackathon: ArthritisHack 2017”