Many years ago when I was a young programmer, I screwed up. It wasn’t a normal “I spilled coffee” type of screw up, it was the kind that makes you dizzy when you think about just how much money it cost the company. This is the story of that screw up, and how it changed my mentality as a software engineer.
My first job out of college was for one of America’s big financial institutions. I came on board in the Spring of 2007. For those who don’t recall the events of 2007, do you remember the boulder scene from Indiana Jones and the Raiders of the Lost Ark? That is a perfect metaphor for the economy at that time. Indiana Jones was your average financial institution, and the credit crunch, congressional bills, and share holders are traps that could trip you up and end you at any moment.
In my first year, I spent most of my time reacting to financial regulation bills. I was given tasks, and I dove right in. The systems varied wildly. Each project had its own technologies and tools. One day I would be working in COBOL, and then next in C# (and yes, in 2007 COBOL systems where still being developed!) I would make a change and I would kick it over to QA, who would of course tell me if anything didn’t work as expected.
The cowboy approach paid off. I was praised for my ability to get things done quickly. Perhaps worst of all, it worked; At least for a while.
About a year in, I was given a task to write a data import process for one of our new systems. The system used a proprietary language written by a small company, which I’m convinced must have had the best salespeople in the world. The language itself was derived from VB6, and used a Caché database. I completed the task with little thought, and moved on.
Days passed, then weeks, and months. One day I was called in to my VP’s office. The VP was there, along with my team lead, manager, one of our senior programmers, and several programmers from the company that wrote the proprietary language used for the system. The second I walked in the room I knew something was very, very wrong.
Apparently, the data import I wrote, which originally ran in about an hour, was now taking about 10 hours to run, getting slower each day! After much research by the external company’s programming team, they found the source… my import. For each record that I was updating in my data import, I was also creating a new empty record in the database, and this was slowing the system down to a crawl. My hastily thrown together program had created hundreds of millions of empty records in the production database.
While the company placed the blame at the feet of the language and its vague syntax, I knew that I should have caught it myself. My days of “conquering” a problem as fast as possible needed to be end. Code organization, architecture, readability, and testing needed to become my priorities if I wanted to continue to grow as a software engineer. I let books like “Code Complete”, “Clean Code”, and the Gang of Four’s “Design Patterns” help me redefine what being a good software engineer means to me.
So that’s my Getting Better Moment. What’s yours?
I’ve spent a lot of time driving in southern California, averaging over 35,000 miles per year for twenty years. Thankfully, I don’t drive quite that anymore, but I still drive quite a bit. One thing I’ve noticed over the years that’s become more and more prevalent is what I call the “me first” syndrome. There are no cars behind you for literally over a mile, but the driver next to you will speed up to move over in front of you (often requiring you to hit the brakes). When lanes merge, drivers will freely use the emergency lane or shoulder to get just a few more cars ahead, merging at the last second. The concept of taking turns appears to escape them completely. And while this is admittedly very annoying when driving, it’s the impact to organizations that’s more concerning.
The mindset of me first and the devil take everyone else is detrimental to an organization. Even in a company filled with individual contributors, interaction and resource allocation has to occur. If everyone prioritizes their wants and needs above those of everyone else, the end result is fighting over resources, strife-filled relationships, inefficiencies and even failure. Because sooner or later, compromise, whether as minor as letting a colleague “go first” so they can make a meeting, or as major as giving up or sharing resources, making your project more challenging to complete but supporting the collective success of multiple projects, has to happen. And a me first attitude precludes even the idea of compromise – negatively impacting you, your colleagues, and your organization. Compromise doesn’t mean losing, or giving up everything to someone else. Compromise is achieved by “…each side making concessions.”1 Give a little, get a little, and everyone succeeds.
One of our clients was going through their annual budgeting process. One manager suggested that they set the deadlines, send out budget templates, and “just hold the managers to the dates – it’s part of their job.” I’ve seen the results of that approach before – missed deadlines, inaccurate information, and more time following up. And the end result is often an inaccurate and poorly understood budget with no buy-in by the team – basically, a waste of time. Our suggestion was to make the choice to support the managers, by scheduling budget building sessions around their schedules and providing a guided walk-through of the process. Yes, this was painful for the finance team – we were already short on resources and this was going to be a major time commitment. The managers had to commit to living to the budget they built (no outs by saying it was built by finance, or they didn’t understand it). But the end result? A solid budget, understood by all of the management team, delivered on schedule – with the entire management team committed to living by it.
So the next time the lane you’re in on the freeway merges with another, why not let that car next to you merge in? You’ll both get to your destination more quickly, with less stress – and shouldn’t that be your goal?
Despite realizing how important it is to maintain balance in one’s life it has always been something that is a challenge for me to maintain. I find it way too easy to let work dominate my time and my life. After all I spend at a minimum 8 hours a day working and often times much longer.
If you look back at my past blog posts you can see that every so often I seem to come back to this topic. Like here or here. The reason for this is because it is so important not only from a personal perspective but also for your career. I have found that by maintaining balance I am happier, the people around me are happier, and this directly leads to me being more productive at work, enjoying my work more, and doing a better job at work. I think the key, at least for me, is in minimizing and managing stress levels in both work and life.
I am generally a very easy going person but I put a lot of effort and pride into my work and no matter how easy going I am that will lead to stress. Because of this I am always thinking about better ways to find balance and reduce the stress of work in my life.
A couple of years ago I tried an experiment. Rather than taking 1 or 2 longer vacations in a year I would instead take multiple smaller trips. I wanted to take 1-2 days off each month for a year and take a short trip somewhere. I was skeptical that this approach would work because in the past it seemed to take me 4-5 days to really fully unwind and let go of the day to day stresses of work.
At first that still seemed to be the case but as the year went on and I continued to take these short trips I noticed that it was taking me less time to unwind. I found that it became much easier for me to walk away from the projects, support, email, and the stress that went with it all. It seemed that I was onto something here. There were a few things I quickly learned:
- With these shorting vacations I didn’t have any of the normal work related stress that went with taking a longer vacation. When I take a week or two off at one time I have to make sure that all of my projects were 100% wrapped up. I needed to make sure that months worth of information and background on clients was handed off to the right people. And no matter how diligent and detailed i was there would always be something that came up that I had some specific knowledge on. The client couldn’t wait a week or two for me to come back from vacation so either someone else would have to struggle through the issue or reach out to me on my vacation. And regardless I would always feel terrible about it. However , being away for a day or two at a time rarely these types of situations come up and when they do waiting a day or two to have them resolved in usually very reasonable.
- Just knowing that I had some vacation time coming up would help keep all of my stress levels down. By taking one trip a month I always had an upcoming trip to look forward to.
- My productivity at work increased. In general I was happier and more relaxed. I had less on my mind and was able to focus on what i was doing better. Especially as a trip would get closer and I would push to get through my work.
- I would start to unwind before I even left on the trip. As a trip would get closer I would work to wrap up my projects and hand them off for testing and review. The result of this was that often times the day before my vacation was much less busy than a normal day allowing me to begin the unwinding process early.
All in all I feel that for me the experiment was a great success. and while I don’t rigidly take one short trip each month as I did that year I now incorporate several shorter trips into my vacation planing each year.
Because we are talking about taking vacations I figure I should share some pictures of the places I have gone on these mini trips:
- Yosemite National Park
- Yosemite National Park
- Mount Whitney
- Mono Lake
- Monument Valley
- San Francisco
- Bodie Ghost Town
In closing, find what works for you in maintaining a balanced live and then live it.
At its most basic level, a good user interface is easy to use, non-intrusive and has a high conversion rate. In other words, it plays nice with both the people using it and the business behind it. Here are a few ideas we’ve discovered during our time designing interfaces and experiences for clients. We continue to learn about what makes user interfaces (and user experiences, but that’s another story) good by applying them to our projects and observing the results. After all, you can only improve what you can observe and measure.
The samples below represent a very small section of what we’ve learned – we’re constantly adding to this list as new ideas present themselves and are tested.
- Use established conventions instead of reinventing the wheel.
Convention is the mother of consistency. If you keep things similar across an interface, people won’t have to struggle as hard and it decreases the learning curve. Because of established UI conventions we learn to close screen windows in the upper right hand corner (more often than not), or expect a certain look from our icons. Of course there will be times when a convention no longer serves its purpose or gives way to a newer pattern. If you do decide to break with convention, make sure it’s purposefully thought out and with good intention – not just to be different for difference sake.
- Use Consistency instead of making people relearn.
Since we’re talking about consistency…
Having a consistent UI or is a great way to decrease the amount of learning a user has to go through as they use an interface or product. As we press buttons and shift sliders, we learn to expect how these interaction elements look and behave. Consistency solidifies the way we learn to interact and as soon as it is taken away, we are then forced back into learning mode all over again. Consistent interfaces can be achieved through a wide range of things such as: colors, directions, behaviors, positioning, size, shape, and labeling.
- Use recognition instead of recall.
This is a classic principle of design tied strongly to the psychology that suggests that it is easier to recognize something existing, as opposed to having to recall it purely from one’s own memory. Recognition relies on some kind of cue or hint, which help us by recalling a past experience. Recall requires us mine the depths of our memory on our own. This is the reason multiple-choice questions on exams are faster to complete than open ended ones. Give your users the ability to recognize items that they have been exposed to before, instead of expecting them to remember everything on their own. For example, if you wanted to ask a customer which of the products they’ve purchased they enjoyed the most, don’t present them with a question “Which of our products have your most enjoyed recently?” and a blank text field. Instead, show them a sample of the products they’ve recently purchased and ask: “Which of these products you’ve recently purchased have you enjoyed the most?”
- Use icon labels instead of just icons open for interpretation.
This was a hard lesson for me to learn personally. I love the simplicity and elegance of a clean icon without the label. And while there are a few icons that have crossed the threshold into universal understanding, the fact remains that what may seem obvious to you or even many people can be completely misinterpreted by just as many others. Take a down arrow icon for example. Does it mean to move something down, lower its priority, or download? Or does an “x” icon mean to delete, disable, or close? To make the icons more understandable, they can be augmented with textual labels. By combining icons with text, you remove the ambiguity.
- Use “benefit buttons” instead of task based ones.
Here’s two simple buttons displayed on a webpage. One button tells you that it will “Save You Money”, while the other one asks you to “Sign Up”. I’d place my bets that the first one will have a higher chance of being acted on, as a “sign up” on its own has no inherent value to the user. Instead, a sign up process has the reputation of taking effort and is often associated with lengthy forms of some sort. Buttons that reinforce a benefit will lead to higher conversions. Alternatively, the benefit can also be placed in proximity to where the action button is located in order to remind users why they are about to take that action. Obviously, there is still a place for task based actions buttons, but those should be reserved for interface areas that require less convincing and are more recurring in use.
This list goes on an on, including even very simple ideas like using bigger clicking areas than smaller ones, using opt-out instead of opt-in, using fewer form fields, etcetera. In a future post I will talk about how elements of a good user interface like these, make up a good user experience.
Through the development of a few different companies, I’ve been involved in many networking groups. Admittedly, my objective in joining was business development – which is typically the purpose of such groups. However, rarely did they amount to anything productive. Over the years, my focus shifted from a typical sales approach, to that of focusing solely on relationships. Lo and behold, our business began to grow rapidly strictly through word of mouth.
Fast forward a few years. In 2012 I was lucky enough to be introduced to Vistage by a friend and colleague, Marc Emmer (www.optimizeinc.net). It was through Vistage that I learned what an “executive peer group” was, and how much it could bring to one’s expertise, personal and professional growth, and very importantly, to one’s network of quality professionals. The best peer groups provide access to non-organizational peers at similar stages in their careers, free of any conflicts of interest, or hidden agendas and harnesses the collective learnings and problem solving capabilities of the entire group as a resource to all.1
I was recently reminded of how significant an impact this has had in my career and the development of the two companies I currently run: Status Not Quo (www.statusnotquo.com) and Oddly Even Studios (www.oddlyevenstudios.com). I was very pleased to be invited to speak at an event jointly hosted by Executive Next Practices (www.enpinstitute.com) and Vistage (www.vistage.com) on the topic of “Growing your company,” with my portion focusing on technology. The other topics addressed were marketing, sales, human resources, and culture.
Being surrounded by over a 100 CEOs, C-level executives, owners, and key people is always an eye opening experience. Meetings like this are where you grow as an individual, a professional, and as a company. Relationships and connections are made based on a solid foundation of expertise, common interest, and respect. In my experience, this leads to the type of relationships where doing business together is a logical outcome. I wholeheartedly encourage professionals to explore both organizations – and experience the growth across all fronts.
Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work. And the only way to do great work is to love what you do. If you haven’t found it yet, keep looking. Don’t settle. As with all matters of the heart, you’ll know when you find it.
Microsoft has announced the death of the Windows Phone, replacing it with a new initiative to combine their desktop and mobile Operating Systems into one unified platform. This is great! Now I can install my favorite game or program on my phone. Right? Right!? No, unfortunately the marketing message and reality are far from the same. While Windows has begun to merge the code base of the two platforms, the reality is building apps for Windows Phone “Windows 10 for phones” is still its own process.
At a technical level, what Microsoft is providing is the framework to create a shared code base between Windows 10 and Windows 10 for Phones projects. Unless you plan on specifically leveraging their Universal App framework and their allowed programming languages (currently only C++ and C#), your program will not be supported on Windows 10 for Phones.
I applaud Microsoft for its efforts at created a unified Operating System, as well as offering free upgrades from Windows 7 and 8 to Windows 10. This is going to go a great way in creating a stable, modern environment for Windows developers going forward. Unfortunately, the strides they have made are not enough to make significant headway into the mobile market. True mobile-desktop cross platform apps remain Microsoft’s mobile Ace in the Hole. Unfortunately they have not yet figured out a way to make this happen (this would entail figuring out how to run programs written in x64/x86 architecture on an Arm chipset). Perhaps Windows 11 will deliver us true Universal Apps. If it does, Android might be in trouble.