A note to recent graduates


Tuesday, April 24, 2018
I've been interviewing a few new college graduates for a junior developer position recently.  We've had a few good people that seem smart, communicative, and trainable, but they have much different experience.  I've seen people from a few different schools and there's a lot of diversity among education programs in my area.  There's a baseline for what you need to be employed as a first time developer.  Here's my opinions, in no particular order.

You should have a significantly complicated project that you created to talk about.  Bonus points if you can show it off - either the code or the final result.  It's okay if this is a school project.  If it's a group project, be prepared to talk about your role within the group.  Be prepared to talk about the decisions you made and why.  Be prepared to talk about what troubles or issues you encountered.

Be ready to draw your project with lines and boxes.  There should be at least three boxes.  Here's some example drawings of what you might make:



If you don't have a project, make one.  Besides preparing you for an interview, this will help you hone your craft.  If you don't know what to make and you need an idea, make a Todo web app.  Here's your requirements: it needs to let the user create lists, add items to a list, remove items from a list, and then mark items completed.  Feel free to take it as far as you want:

  • Use a responsive design
  • Allow editing of items
  • Have it auto update when a change is made in another window
  • Create logins and user accounts
  • Build a native mobile app version so a user can use it on their phone
  • Make it work offline
  • Have predictive suggestions
You should have used a database.  It doesn't matter what type of database it is.  Also, you should know what a join is and why to use it, if not exactly how to do it.

Software development is a big field.  You will probably get asked what you want to do.  Employers want some idea that the work they have will interest you and that you'll stick around for a while.  If you're not interested in the work, then after you've had some experience, you're going to leave and go find a different job.  So have some idea of what you want to do, in terms of technology.  Concentrations here may include:  Web, AI, front-end development, big data, mobile apps, game development, back-end development, algorithms, etc.  NB: you don't have to just pick one area and most likely your interests will change over time.  That's OK.

Also, it's beneficial to have some idea of what you want to do as a mission.  Sometimes work can be technically dull, but rewarding because it's a mission.  If you have a mission, then this is a good addition when you get the "what do you want to do" question.  You may want to solve people's everyday problems and make their lives easier.  You may want to help create a moonshot product.  This may not yet be clear, so don't worry if you don't know exactly what to do.

You should have used a few different programming languages.  Strive for at least four.  Be ready to talk about why you liked one over another, or what you learned from using one over another.  Put them on your resume.  If you don't have enough, make your TODO project in a new language - time to learn Python to use Django or C# to use ASP MVC or Object C for that iOS app or Java for Android or Ruby on Rails, or PHP.  It doesn't matter, just learn a few different languages.

You should understand basic OO concepts.  What's an object vs class vs interface?  Know what inheritance is.

Even if you've never used it (and you should).  Know what version control is.  Put your sample project in Github.  Put your Github URL on your resume & web site.

As a bonus, be familiar with at least one cloud hosting provider - AWS, Google Cloud, Azure, it doesn't matter.  Almost all dev jobs have some component of dev ops.  Knowing how to use these will most likely be part of your responsibility.

What to do when there’s nothing to do


Sunday, January 17, 2016

At work (doolli.com), we’re doing a big (2-3 months worth of work) UX overhaul of our front end for the core portion of the website.  As somebody that primarily focuses on the back end, there isn’t a whole lot of development for me to do for this.  Because of this, the workload isn’t very balanced across the team.  Theoretically, i can jump into the front end code base and start helping, as any good developer can do.  However, not being familiar with it, we determined that the back end guys would be a burden to the existing front end developers having to field questions or explain this or that, or having to check to see if something that we did was already built in a utility somewhere.  So we’ve been spending some time doing a little bit of work and refactoring the back end code, but then there’s not much else to do in terms of cleanup.

 

Here’s three things that i have taken up doing during this time.

 

Analysis

There’s a lot of work to be done with figuring out and defining what’s coming up next.  I’ve spent time talking with our product team and help generate a runway of ready work.  I’m and talking to people that have ideas of how things should behave, asking lots of questions, and writing up requirements.  Since we have a relatively small team, doing this helps alleviate some of the workload that would be coming up for some of the other guys.  Hopefully it’ll mean that the front end developers can focus on the current work and don’t have to get distracted with questions about upcoming work.  It should also help during our upcoming sprint planning meetings – we should be able to be a bit more efficient during them so that we can get the meeting over with and get back to work.

 

Extensions and Plugins

There’s not much functionality changing with our product, but we’ve been tossing around ideas about “wouldn’t it be cool if we integrated with X”.  This period of not being inundated with work to do is a great opportunity to explore these things.  So far i’ve mostly completed a Google Forms add-on (create a form that mimics the fields in your database and capture all responses in the database), and explored what a Zapier app might look like.  Being able to have these things add credibility and maturity to our product.

 

When in doubt, QA

It was a while along in the effort when we were finally ready to hand off a deployment for the QA team to verify.  But as things have been progressing, our QA guys are getting swamped.  We have an automated test suite that they have to update and maintain.  Helping our with the manual QA verification of new features is something anybody can help with.  And, it happens to be that i am the only one doing QA that has a windows touchscreen computer.  Most of the rest of the team uses Macs.  So i’ve found a slew of bugs where things don’t work on windows or specifically with a touch interface.  Also, i’m able to jump on a few other devices, utilizing the in-office ipad and android tablets.

Woodworking


Saturday, April 4, 2015

Off and on for about 3 years, i've been working on this shelf.  It's not a complicated piece of work by any stretch of the imagination, it's essentially just a 5 foot long piece of oak.  But it's something that i address in my down time between other projects.

Since i've starting sharing my time with Utica, when i'm back home, sometimes i'll go down into the basement and throw a coat of poly on it - i want many coats so it's nice and shiny, and easy to clean.

Today, i decided it had enough coats, so i was going to screw on the mounting brackets for it.  Excited to make progress on my 3 year long project.

I did my measuring, two or three times.  I marked the holes on the shelf where i need to pre-drill.  The brackets are going to go into studs, so i space them out 16" apart.  I realized that my combination square wasn't screwed in tight, so the markings weren't at the proper angle.  No big deal, didn't do anything yet, so i cleaned off the old marks and then re-marked where the brackets are supposed to be. 

Things are looking good, so i screw the brackets into the shelf.  I got to use all three of my drills/drivers, and the new little right angle driver attachment that my dad got me recently, so i was feeling real excited about all this.

I then step back to admire my work, and they're totally, utterly, and completely wrong.

The space between the edge and the first bracket is 16".  Then a foot or so.  Then another bracket.  Then, for some reason i can't quite explain, the next bracket is about 20" away.  Then a foot to the end of the board.  Not a single thing is in the right spot.

I stared at it for a very long moment.

And that's when i walked away.

Toast notifications on Windows 8


Wednesday, October 15, 2014

In our chat at work, we have it set up so that whenever somebody does a deploy, it will mention who did the deploy and when.  Usually, i don’t care about it.  I only care when i’m at my computer, so i disabled all those notifications to reduce the noise.  However, the chat app has this backlog of messages that are marked unread for me.  It bothered me that they i had to go in and actively acknowledge reading them to get my “needs your attention” count down to zero.

So i created a little app (two actually) that displayed toast native Windows 8 notifications when these events happened.  If i was at my computer, i’d see them; if i wasn’t around, then they didn’t affect me at all and i don’t care.  The result looks something like this:

toast example

I created a super simple WebAPI / SignalR service that sits out in the cloud.  When it receives a POST, it shoots that back out to all those connected via SignalR.  Then i have a little app that runs as a windows service, connects to the SignalR hub, and generates a toast when something happens.  Since a notification is just a person performing some action, the class is pretty straightforward:

public class NotificationMessage
{
/// <summary> The person that did something </summary>
public string Person { get; private set; }

/// <summary> The event that happened </summary>
public string Action { get; private set; }

public NotificationMessage(String person, String action)
{
this.Person = person;
this.Action = action;
}

public override string ToString()
{
return this.Person + " " + this.Action;
}
}


The WebAPI / SignalR service



First, the cloud service.  It has among the simplest WebAPI controllers around:



public class NotificationsController : ApiController
{
// when a notification is posted to this endpoint,
// fire it off to any that might be listening on the hub
public void Post([FromBody] NotificationMessage notification)
{
if (notification == null)
return;

IHubContext notificationHub = GlobalHost.ConnectionManager.GetHubContext();
notificationHub.Clients.All.notify(notification);
}

}


So all this controller does is take a notification and, as long as it’s not null, calls notify on all those connected to the hub.  Here’s the hub:



public class NotificationsHub : Hub
{
/// <summary> Called by the client to ensure connectivity </summary>
public void Heartbeat() { }
}


Because no client ever calls notify, i don't even need to have a method for it. There is one though, Heartbeat, which i'll get to later.



That’s it for the cloud service – just those two main things.



The Windows Service



Fortunately to get started, there’s a good really sample that does notifications from a desktop app here.  Toast notifications are just XML and they have predefined templates.  Some templates have pictures and they specify how the text will be displayed.  I’m using ToastText02 because it has one main line that’s bold and then subsequent lines are just one string that wraps – without a picture displayed alongside.  Dissecting the sample, i got the core functionality of showing a toast of one of the NotificationMessages:



// Get a toast XML template
XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);

// Fill in the text elements
XmlNodeList stringElements = toastXml.GetElementsByTagName("text");
if (newNotification.Person != null)
stringElements[0].AppendChild(toastXml.CreateTextNode(newNotification.Person));
if (newNotification.Action != null)
stringElements[1].AppendChild(toastXml.CreateTextNode(newNotification.Action));

// Create the toast and show it
ToastNotification toast = new ToastNotification(toastXml);
ToastNotificationManager.CreateToastNotifier(_appID).Show(toast);


There’s two tricky bits here.  One is that you have to have a shortcut to your app on your start screen (not necessarily pinned though), and the other is that you need to reference some library named Windows.winmd.  The sample includes code to add the shortcut automatically, so that shouldn’t be an issue.  But to add the reference to that library, i had to edit the project file manually and add in the reference:



<reference include="Windows">
<hintpath>C:\Program Files (x86)\Windows Kits\8.0\References\CommonConfiguration\Neutral\Windows.winmd</hintpath>
</reference>


After that it was as simple as wiring it up to a the SignalR hub and listening for messages:



public async Task StartConnection()
{
try
{
//create the connection
_hubConnection = new HubConnection("http://<my_webapi_site_url>/");
_proxy = _hubConnection.CreateHubProxy("NotificationsHub");

//when we get "notify", call AddNotification
_proxy.On<NotificationMessage>("notify", AddNotification);

//connect
await _hubConnection.Start();

//start the timer if it's not started
if (!_heartbeatTimer.Enabled)
_heartbeatTimer.Start();

Logger.Log("Connection started");
}
catch (Exception) { }
}


If you notice, i have something called _heartbeatTimer. I had an issue where the client wouldn’t detect a loss of connection to the SignalR hub.  I would turn off my wireless antenna and the service would still think it was connected.  Because of that, once i turned my antenna back on, it wouldn’t attempt a reconnect.  After spending too much time on it, i got around this in an incredibly hacky way.  Every thirty seconds or so, the service calls the Heartbeat method on the hub.  If it fails or times out for any reason, i attempt to reconnect.  It will continue to do reconnect attemps every thirty seconds as long as the call to the hub fails.



private async void CheckHeartbeat(object sender, ElapsedEventArgs e)
{
//don't do anything if we're attempting to connect
if (_hubConnection.State == ConnectionState.Connecting ||
_hubConnection.State == ConnectionState.Reconnecting)
return;

try
{
//try to contact the server
await _proxy.Invoke("Heartbeat");
}
catch (Exception)
{
//failure, so toss the current connection in the garbage
_hubConnection.Dispose();

//try to reconnect
this.StartConnection();
}
}


After that, i just had to wire up the code to use it as a windows service, install it, and then i can invoke notifications via a simple curl.



curl -d '{person:"sam",action:"ate all my potato chips"}' -H Content-Type:application/json -s http://<my_webapi_site_url>/Notifications



We modified our build script at work to do invoke the curl when somebody triggers an action, and then if i’m around, i’ll see the notification on my computer.



WebAPI / SignalR service available on github.


Windows service available on github.

What Scrum isn’t


Wednesday, May 21, 2014

 

I’ve “done” scrum at my last job.  I even led the implementation of it for a project.  We sorta figured out what we were doing and got into a productive rhythm.  But only recently, when starting it at my current job, did i actually read the official Scrum Guide.  I was surprised to find out some of the things i thought were required were not mentioned at all.

  1. Scrum does not require have user stories.  It does make you have a backlog of work to be done
  2. Scrum does not make you use points as estimation.  It does make you have all items in the backlog be sized
  3. Scrum does not make you do estimation poker.  It does require the backlog to be "well groomed"
  4. Scrum does not mention velocity.  It does mention that you should pick tasks from the product backlog and do those tasks in an increment (what is commonly referred to as a sprint)
  5. Scrum does not mention the cone of uncertainty.  It does define how long an increment should be, and that all work should be completed within the timeframe of the increment
  6. Scrum does not differentiate between bugs and features.  It does require a definition of done, and everything must meet the team’s definition for it to be included in the increment
  7. Scrum does not use a task board of "not started, doing, done".  It does define all the meetings, who is in them, and what should happen in them

The most surprising things to me were number 3 and 7 – those are artifacts that are commonly associated with the development methodology, but can be completely omitted if you’d like.

Three things a developer needs to be happy


Monday, May 12, 2014

My first job out of college was a lot of fun.  This is surprising given that it was at a health insurance company.  It was fun because of the environment that management and the team of developers i worked with.  Gradually, changes in the upper level of the organization eroded the environment and as good team members left, the place became less and less enjoyable.  I started thinking about my situation and evaluating why the job wasn’t fun anymore.  I was wondering what it would take to make me happy.

I’ve been in a lot of interviews.  Mostly on the side that asks questions.  One question that i like to ask anybody that is interviewing for a development manager gig is “What does it take to make a developer happy?”.  I like hearing people’s take on the question, and, over the years, have developed my own answer.

A developer wants to make a product people enjoy

You ever work at a company and are forced to use some application that everybody hates?  I’ve seen it materialize as such things as change management systems, ticketing systems, and expense reports.  Nobody wants to use the application because it has a bad user experience, has odd quirky bugs that never got fixed, or isn’t exactly the right solution to the problem.

Agile software development tries to solve this by collaborating directly with the customer.  However, it’s amazing how many products are made (and purchased!) that users don’t like.

A developer wants challenges

Software development is a very creative trade.  It’s fun to create different solutions to a problem.  Developers should be given opportunities to come up with great solutions on their own.  I still remember fondly the first time i was given a task at work that i had no idea how to do and somebody said “just figure it out”.  Further, if there’s a potential to improve on an existing solution, then a good developer will want to spend time on those enhancements.  This is true for behind the scenes architecture or refactoring as well as improvements to the behavior or functionality.

A developer wants to develop

One of the things that amazes me is, in many organizations, how much time a developer spends not developing.  They’ll get sucked into meetings, or the requirements change and are told not to work on that yet, causing wasted time.  So many times, i’ve been a part of an organization where an effort has not started due to the bureaucracy of the organization.  Even worse is when there’s already work in flight and then the project gets abruptly stalled or cancelled with no replacement ready.  The drain on productivity, morale, and work ethics are hard to make up once things get going again.

Karate Board


Sunday, March 30, 2014

In another life, i was a student of martial arts.  I ended up with a lot of souvenirs from that experience.  Among the more notable items are a pair of nunchucks, sais, and tonfa; as well as a variety of belts and, of course, a cliché headband.  I’ve wanted to do something with them for a while, but only recently figured out what to do.

I wanted to be super cheap about it, so i found a sheet of half inch plywood that i had in my basement.  I cut it to be 2’ x 4’ and then put loads of varnish on it.  I ended up putting on 3 or 4 coats of semi gloss polyurethane, then 3 coats of gloss wipe on poly (because that’s what i had laying around).  That took the majority of the time for this project – sanding, wiping with a tack rag, applying the next coat, and then letting it dry for at least a day.  I then wouldn’t come back for the next coat until i got around to it days or weeks later.  So this board spent a lot of time just taking up space on my basement workbench.

2014-03-30 17.28.58With the last coat applied, i was ready to place the items on it.  I just used some strategically placed small nails to hold up the weapons.  I put the tonfa near the top, framing where the belts would go.  Then the sais were near the bottom, crossed in the required manner, with the nunchucks on either side.

Then i didn’t quite know how to hold the belts in place.  After some random google searches for different types of hooks, i found that there’s something called shoulder hooks that would probably work.  I didn’t understand the dimensions from the descriptions, so i just drove to home depot and checked if they had them there.  They only had 3 sizes, but one of them was what i needed.  I bought a bunch of them, and it only cost 10$.  Each belts is 1.75” thick, so i put 2” of space in between the hooks and each belt is spaced 0.5” apart.

It was then time to affix the headband near the top of the board.  For this, i used some safety pins to hold the headband at a specific circumference.  Then i flattened it out and laid it on the board.  In the four corners, i drilled a little hold and put a zip tie through the middle of the headband and around the back.

I had some hardware that is intended to go on the back of paintings or mirrors for hanging on the wall.  I put those on the back and then was able to put it up on the wall.

It didn’t look quite right – it was too tall and there was too much vertical space between the weapons.  I brought it back to the basement and trimmed off 4.5” from the bottom.  Then i had to move up the nails for the weapons on the bottom.  Finally, i applied a one last quick coat of wipe on poly on the freshly cut bottom edge.

A few hours later, i put all the items back in place and hung it on the wall in my office.  I think it came out looking, as my dad would say, sharp.