Ownership and Leadership

In Design, Code, Test, Repeat (which you’ve probably already read and if you haven’t, you should), a major theme in building a software career is “ownership and leadership”.  I’ve worked with many programmers over these many years and the one thing that seems to differentiate the excellent from the very good are these two qualities.

Let’s break them down as they’re different. Here’s a scenario: you get a new job.  You have a diverse range of technological skills and write code well, but even with that, you still have a new product or environment to learn.  It may take a while to get your footing in this environment and that’s okay.  But, after a while, you should have done a few projects and have some code in the system that you wrote.  If you haven’t, sign up for a project that will put you in this position.  Having code in the system that’s yours makes you the go-to person for that area of work.  It makes you an integral part of the organization.  Nothing can make you irreplaceable, but you still want to be recognized as a contributor – someone who can be given a project, complete it, and be willing to maintain it.  Once you’ve got an area that’s yours, go get another one.  Don’t become just a niche programmer, expand your knowledge and ownership.  Caution: you’re not doing this to be come a code hog or king of your own fiefdom, it’s because it will give you a higher-level perspective on the way everything works together.  It leads to leadership. It also looks better on a resume for your next position or when you want to make a case for a raise to say, “I designed and developed this feature or product” instead of “I worked on a, b, and c”.

It’s difficult when starting a new job to be a leader and even in a job where you’ve been for a while, there may be several leaders. Both situations are fine and normal. As I said earlier, you don’t want to become king of the fiefdom, you want to be a team player, but you want to be a top team player; a valuable one. Part of this comes from ownership. The more you know, the more you understand, and the more you see. At this point, you start seeing the bigger picture. Then comes the tough part: talking about it. I’ve worked in many places where the structure looked like a whack-a-mole game. Stand up to speak out, even when asked, and the next guy up the ladder would look at you like, “how dare you speak up”. This does nothing but keep your ship heading for the icebergs. If you work here, you might start sending out some feelers for a new place to work. I’m not known for my ability to keep quiet, however, so when I see things that I think need to be fixed or evasive maneuvers that need to be taken, I say something.  If there’s something I can do about it, I’ll offer to do it. Don’t be a pain in the butt about it, but I think that if you don’t say something, you’re just complicit in the disaster that you’re about to become a part of. In the end, sometimes these disasters can cost everyone their jobs (I’ve detailed a couple of these situations in the book, too).

Doing good work needs to involve trust. If you own something, and are willing to change it, maintain it, and speak up when you think you’re being asked to screw it up, you’ll become a trusted member of your team. You’ll have the chance to move up in the organization or move around. It’s a little more pressure than just being a code monkey, but it’s way more interesting, and probably way more lucrative.

Hunger in America

Some of you may know that September is hunger action month. I have (for some crazy reason) decided to take the SNAP Challenge. SNAP is the Supplemental Nutrition Assistance Program (i.e. the new name for food stamps). The idea is to eat for a week on the amount of money that someone on food stamps would – in New York state, this is $33.30. I usually spend more than that when I take my wife out for dinner, so this amount for a week of food is a bit daunting.

Many people are doing this to raise awareness of hunger in America. I’m not as big on raising awareness as doing something about it. So, I’m doing this as a fundraiser for the Food Bank of the Southern Tier (or FBST). They serve my area with mobile food bank trucks, food backpacks for kids, food banks and soup kitchens, and much more.

I also plan to put my money where my mouth is (since there won’t be much food going there) by matching your donations up to $2000. Here’s what you can do to help: make a donation to the FBST here:
http://www.foodbankst.org/index.asp?pageId=140 . If you write a check, put a note on your check that it’s in honor of Bill Myers’ SNAP Challenge.  If you make a donation online, at the bottom of the page, you can also make it in honor of my challenge. Since I’d like to know how the fundraising is going, I’d appreciate it if you’d also drop me an email letting me that you donated to wlmyers (at) aol.com, and if you want, you can also tell me how much. I’m hoping to get a full tally from the FBST, so I can match the amount. I’ve been in contact with the director of the FBST and it’s my hope to make this so monetarily compelling that the FBST has the incentive to turn this into yearly participatory fundraiser.

I’ll be updating my progress periodically on facebook and here at wandercoding.com. I’ll be starting this on Monday, September 30th and going until Sunday, October 6th. I hope you’ll support me in my efforts and make a donation, regardless of size as every bit helps.

Java and C# together

I’m writing this post to give people an answer to a problem that I had: embedding a C# control inside of a Java application. After searching for answers, I finally came upon the perfect combination.

1. Create an ActiveX control with the C# application using this:

http://code.msdn.microsoft.com/windowsdesktop/CSActiveX-b86194f8. Just start by downloading the whole project and modifying it from there.  Change the name of the control, change the guids, etc.  Also, make sure that you modify the Release version to register for COM Interoperability as that’s not set by default in the project.

2. Embed the control in your Java application using this:


and this:


The Standard Widget Toolkit lets you embed ActiveX controls in your Java applications.  You can then communicate with them directly using the Dispatch interface for the control without needing to create a JNI interface yourself or using another toolkit.

I have found this method both reliable and straightforward.  Good luck.

Just so people can have a chance at finding this article, I’m going to put a few phrases people might search for here at the bottom.

Embedding C# in Java. C# controls in Java. Creating a C# ActiveX control. Embedding ActiveX controls in Java. Putting C# and Java together.

Plugging away

Yes, here’s another shameless plug for my new site, checkitboard.com.  I created a simple sample page to illustrate how useful it can be to communicate and/or track what you’re working on or need to work on.

Coding Work

Example of how to track your coding work.


You can see from the sample that you can include checklists, notes, draw, and even add pictures (not shown in this example).  You can create static web pages with it for one-way communication, or give other users permission to view or edit the page directly.  I’ve tried other to do list sites on the web, but haven’t found any with the flexibility that I’ve built into CheckItBoard.  The real-time collaboration and public, searchable boards make the site even more powerful.

For to do lists, checklists, notes, drawings, communication, and collaboration, it’s a one-stop shopping site.  And it’s free (really)!  Not some limited subset of the features or a limited number of pages you can create.  Just plain free.  Give it a try and feel free to give some feedback, too.

Check It!

You may have noticed the silence on this blog for the past few months. It’s not because there’s nothing left to say, I assure you. I’ve just been immersed. Doing what? Making checkitboard.com, that’s what.

Ah, another website. Well not quite. It’s a web app and a versatile one at that. You see, I had a problem. I needed to communicate with a small team and some clients. I needed to build an online list of to-do items and assign them to different people. It needed to be visible and changeable by the parties involved. And I couldn’t find an online tool that did all this and let me build it once and copy it to reuse it. So, I decided to build it myself. While I was at it, I thought of some other useful tools that let me enhance what you could use the tool for. I built in real-time collaboration, drawing, ability to make public and private boards, and picture posting, too. What I ended up with is really useful, versatile, and fun.

When deciding on what tools to use to build it, I had a few ideas. I could use html5 with javascript, learn a bunch of new languages and utilities, etc. Or I could use the one tool that already lets you build interactive web applications: java. It’s made to run in a browser and run on multiple platforms. You can make it do amazing things without shoehorning it into a round hole. So, instead of working for a couple of years with a small team, I built it myself. CheckItBoard uses python scripts on the server for database access (mainly because my web hosting service won’t let me use java there), but that’s a small part of the work involved. The basics of the app are all in java. Will this change? Perhaps if people start using it, I’ll move over to some other technologies that don’t require the java virtual machine, which eliminates some platforms. Or, I may just build some specialized apps to handle this on the iPhone and other non-java devices. In the meantime, you can save a board as an html file and view it anywhere, share it on facebook, etc.

It still needs a little polish, but the functionality it supports is quite extensive. I’ll follow this post with some periodic examples of what you can use CheckItBoard for and why it’s so cool. Give it a try (it’s free!) and let me know what you think.

The Var Hungarian


I was reading a blog post from one of my favorite software bloggers, Joel Spolsky, and came upon the middle of the article (http://www.joelonsoftware.com/articles/Wrong.html) where he talks about Hungarian notation.  I was floored because I, too, had been brainwashed by what I thought was the intent of the notation.  It turns out that what everyone thinks it’s for (knowing what kind of variable something is or how a function might work) was not the original intent and use.  It was really for telling you what the variable DID and what it stood for, to make you less likely to make a mistake in coding.  Seriously, read the article, then come back here, I can wait a few minutes….  At the very least, go there and find the section marked “I’m Hungary” and read that.

So, you probably just learned that we’ve bastardized a pretty useful concept because of bad documentation (that’s a story for another day).  But, you’ve also probably gotten a seed in your brain that maybe you can help fix some of the insidious bugs that pop up in your own code.  Or, maybe just a way that you could write code to make it easier to return to sometime later and understand better, or how to train new coders in what your code does.

I’ve always been an advocate of straightforward code.  Nothing too clever (sometimes I do and sometimes it works, and sometimes it doesn’t), but the point is, someone should be able to come by, look at my code, my functions, and the data, and figure out how to muck with it or use it without needing therapy afterwards. 

The latest craze in C# programming is the use of the keyword “var”, which suddenly stands for “there’s no need to actually type ‘int’ even when that’s what a variable is.”  I understand that it’s necessary for queries and can eliminate some duplication of typing of complicated templated types, like Dictionary<List<int>, double>, but some people go too far.  Intellisense can help with the discovery of variable types, but nothing beats looking at code and being able to see what type something really is (especially when you actually know what it is) to be able to understand the code without having to highlight every variable and figure out (then remember what it is).

The same thing can be said of clever C or C++ macros which can just as easily be done with functions.  Seriously, this is what the “inline” keyword was made for and if that doesn’t work for you, then just incur the function call overhead unless you’re writing realtime software or something that’s so time critical that there’s no other way to do it.  Otherwise, every single person who looks at that code (including you six months later) is going to have to search all of the header files wondering where the code is because your IDE (or worse, linux’s gedit) sure as heck won’t tell you.

Simple, straightforward code – your New Year’s resolution.  And mine.

There is no U in team

In my book, I included a section with the above title.  It means that you’ve been fired, or maybe just laid off.  Note: If you like the phrase and want to reuse it, give me credit as I believe I’m the first to use it.

Losing your job isn’t easy.  OK, it sucks.  There are many situations that can get you there and many ways that it can actually happen, but either way, you find yourself unemployed.  The question now isn’t what happened, it’s what happens next.

First, don’t burn any bridges.  Seriously.  Don’t badmouth the company or the people in public.  You may find that years later, you have an opportunity to return under different circumstances and you don’t want to rule that out just because you’re angry now.

Next, negotiate the best severance package possible.  The default package from your employer isn’t set in stone.  You may be able to get more money by getting your vacation time added to your monetary package, or you may be able to talk them into extending your health care for an extra month or more.  It can’t hurt to ask.

Of course, apply for unemployment insurance.  Unless you’re positive that you’ll have another job in no time at all, start the process.  You may have to wait a month or two, but do the research and get started on the paperwork (or web forms).

Now comes the hard part: evaluating what happened.  This can happen in a variety of circumstances and they’re all different.  For example, let’s say your whole group was laid off from your company because they weren’t paying for themselves.  I used to work for a company that was notorious for creating “strategic” projects and products.  Unfortunately, those projects were often free to customers and that made the group a red line on someone’s budget.  Want to guess who might be the first group to go when the upper management needed to cut expenses?  Suddenly strategy wasn’t as important and making money.  If your company does this, think twice about being part of that group unless you can constantly justify its continued existence.

If you’ve been fired, you have a different set of problems.  The first thing to do is accept some responsibility for your own part.  Even if your boss was a complete jerk, you couldn’t find a way to work out the situation or keep your head down or manipulate him/her or get a transfer.  It takes two people to create a problem.  To be fair, sometimes your boss does have it in for you, but that’s life, unfortunately.  If you’re still alive and not physically or horribly emotionally scarred, then you’re going to have to get past it.  When emotional issues arise, take some time to write down your thoughts and feelings.  The book “59 seconds” says that research shows that writing down your feelings is better than talking with someone about them.  Either way, a little emotional healing will get you ready to get back to work.

Your job now is to find a job.  Treat it like that.  Start hitting the newspaper, internet, and personal network.  Get past the HR department and get the name of the hiring manager.  Remember that at some point (hopefully most of the time) you were and are a rock star developer.  Your experiences have made you who you are and you’ve learned from them.  Even if you lost your last job because you started to lose your passion, you can find it again with a new opportunity, in a new company, with new people and new challenges.  Now get going.


All day I’ve been seeing the same post from my friends on facebook: Please do me a favor, just hover over my name and click a few things so that you won’t see my comments to other posts in your ticker window.

I finally got the point where I realized how silly this whole thing is and came to a decision point: Am I really going to do this on all of my friends’ posts and ask them to do the same for me?  What if I had over 1000 friends like some people I know?  I seem to recall that before the latest changes, I might comments from my friends, just not on posts by people that aren’t my friends.

Anyway, the real point is that this whole thing is backwards.  What’s the point in my sending you a message, asking you to do something so you can’t see what I’m writing somewhere else?  Shouldn’t I have the control over this, not you?  This whole fiasco is pointing out a flaw in the user interface for facebook – at least as far as their users are concerned.  The people who run facebook are probably perfectly happy with how they set it up, but with all of the posts regarding this, they may be rethinking their decision.

So, how does this affect you and your decisions in your work?  The first question to ask yourself when producing something for public use, be it a software application, website, phone menu, ATM, etc., is to consider two things: proper default values and minimal interactions.

Choosing proper default values means that you decide, possibly with the input of your user test group, what the most likely choice will be for a particular option, then make that choice the default.  If done correctly, your users won’t even need to know there’s a choice, since you’re already doing the right thing in their minds.

Minimal interactions is what this facebook issue really brings up.  How many people are going to have to click on how many buttons to accomplish what they want to do?  The more clicks and the more people who have to worry about them, the more disgruntled your users become.  Of course, we always want to provide our users the most flexibility and that often means making multiple choices along the way, but if your users have to repeat the same operations or there’s a most likely path, either storing their preferences or providing a shortcut will make them happy.  And instead of complaining, they’ll tell others how easy it is to use your application.


Who’s Out First?

I’ve been involved with many projects and products over the years.  Some have been true innovations – the first product of its kind.  Most have been products created to compete in a market where there already is competition.  Let’s face it, the latter case is the more common.  How many times do you see a new product come out, hardware or software, that’s really different than its predecessors or defines a whole new category?

What made me think of this? I was perusing some software blogs and I ran into one where there was a picture of a Windows Phone.  I’ve never played with one before, but it hit me that the iPhone defines the category now.  It really shouldn’t have – Palm owned this market from the beginning (I used to carry a Palm Pilot, then they added phone capabilities to it), then Blackberries (RIM) came along.  The iPhone didn’t start it all, they just did it better – well integrated, great marketing, and sleek design.  The iPod was new and nobody has topped that yet.  My daughter bought a competitive product and it was ok, but using Windows Media Player instead of iTunes was a drag.  Again, much better integration and better design.

The iPad wasn’t the first tablet, but it was.  The Windows-based OS for tablet PC and the hardware that accompanied it wasn’t significantly better than a PC with a Wacom tablet for pen-based drawing.  The iPad started from the other direction, not by modifying what already existed, but starting over (having the iPhone’s OS certainly helped).

This brings me to software.  How long has facebook been around and how many users does it have?  Can Google+ just sweep in with some new functionality and take over?  Facebook stole the world from MySpace, so why not?

The question to ask is: Where is my product?  Is it the market leader?  If so, are we complacent or constantly improving?  Are we the start-up, making something to beat the current market leader?  If so, do we have the story that makes people want to switch?

Even if you’re a young software developer, you should start asking yourself these questions.  Not only will you learn something about your company, its goal, and its marketing, but you may also decide it’s time to look somewhere else for a future that has more potential.

Breaking iNews

July 21, 2011 Federal Court in Sacramento, CA.

After being sued over the use of the product name iCloud by an Arizona VoIP company, Apple Inc. fired back.Apple filed a trademark application in federal court for any word beginning with the letter i, including the word I.  Before a patent judge, Apple attorney Theodore Buttress argued, “Clearly, with the iPod, iPad, iPhone, we have established a precedent.  Other words beginning with i evoke Apple products.  Therefore, we believe that we are within our rights to trademark the letter, within reasonable limits.”  When the honorable Johnson N. Johnson asked what ordinary folks were supposed to do to avoid violating the trademark, Buttress suggested that people consider replacing the word with E, since that is unused in common English.

Buttress continued, “We have already contacted the Oxford English dictionary, which has already shown a propensity for allowing changes and additions to the language.  We suggested that they could move innovate, irregular, imagine, etc. also to the letter ‘e’.  While this seemed excessive to them, they agreed that it was doable.  They also readily agreed that irregardless was an abomination and that anyone who used it should be sued regardless [Buttress used finger quotes in court] of the ruling.”

Judge Johnson replied, “I’ll [he smiled when he said the word] take it under advisement.”  Johnson promised to return a decision “real soon now.”