The thought behind the phrase “Always be selling” is that you should constantly be marketing yourself to others, since you never know where the next customer will come from. What about new ideas/inspirations?
I propose that you should “always be hacking” as well - never stop learning, growing, and thinking about improving the world around you:
Keep aware of your surroundings at all times. At work. At home. Out in the world. Note situations that are frustrating or that slow you down - can they be improved in some way? Can that manual task be automated without a negative time cost?
Explore your ideas - Learn a bit about the subject matter around the idea. Table it, then come back with a fresh perspective. Build small insights bit by bit in order to eventually form a cohesive revelation.
Inspiration hits at random times - always write ideas down! I use mobile note-taking apps and a notebook for designs/sketches at home.
Don’t limit yourself to a small “work worldview”, i.e. your immediate day-to-day responsibilities. I won an innovation challenge at work by creating something that fell outside the normal scope of my team. As long as feedback is constructive, why not give input into other team’s processes or products? Everyone works for the same team, right?
Invest time in learning - seeing how others have changed the world, even in small ways, can lead to inspiration and new ideas.
Always be learning. growing. “hacking”.
FixMyQ Android app Post Mortem
Just over 2 years ago, I published my first smartphone application: a Netflix Android app that helped me solve the problem of losing track of expiring Instant Queue movies. This app was my first independent effort and by far my most successful to date. As of mid-April 2013, I’ve hit 1,300 active installs and 7,600 total installs.
Key Lessons Learned:
Build something useful/Solve a problem you’re interested in. If you are generally excited about the work, you’re more likely to stick with it over time and see it all the way through. Users/installs don’t happen over night, but will come over time if you build something useful. The rush of seeing that first download, then the fifth, then hitting 100+ downloads is incredible and the learning experience that comes with dealing with users is priceless!
Building an app around a popular product or company helps with traction. Spending some time searching the app stores can be very insightful -how many apps relate to my idea? How popular are they? When I started, there were only a handful of results for “netflix” - Netflix didn’t even have an official app yet! Getting in early was great; by the time the other apps showed up, I had significant download traction and was a top search result. Thus, if possible, get something out there before it becomes too saturated. If that isn’t possible, my next point can help.
Focus on differentiation. This is the first thing I focus on with designing new applications because of what I learned developing FixMyQ: figuring out how to provide a unique, compelling experience that is similar yet different from others. With FixMyQ, I noticed that others were simply copying the main Netflix features - searching for movies, showing instant/dvd queues, etc. I found a useful, unique twist: showing the user’s instant queue but instead of normal details (actors, release date, length) I solely showed title and expiration date with an option to sort the queue by movies that were expiring next (the idea being that if you see them at the top of the queue, you’re more likely to watch them before they expire).
Pick the right app platform for your goals: I originally chose Android over iPhone (even though iPhone was more popular) as it was more “open” than iPhone and I could develop on a PC (I still find the Mac requirement a big annoyance 3 years later). Now, Android has overtaken iPhone in terms of user install base and a new contender, Windows Phone, has emerged.
Monetization strategies: Currently in 2013, it has now well known that Android users tend to not buy apps vs. iPhone users that more consistently do. While I never got around to this, ads on Android and a fixed cost on iPhone seem to be the way to go.
Development tool issues: 3 years later, Eclipse/Android is still a major pain to work with. Granted, Google has made great strides to alleviate the pain of getting started, but even now I’ve recently had multiple friends almost give up on their apps because installing Eclipse/Android SDKs are mind-numbing. As my buddy Brandon Nelson told me, “I feel like I’ve gotten so much accomplished when all I’ve really done is open Eclipse, run my app, and see nothing crash.” Indeed, Brandon, indeed. :)
Beware relying on 3rd parties. Without a signed contract with a company, they can change their data/APIs that your app relies upon without notice. This happened to me a few months back - again, the purpose of my app is to notify users of instant movie expirations. With no notification, Netflix removed the main API endpoint that I was using - effectively rendering my app useless. Backlash was strong in the comment section, naturally. One month ago, they announced that no more public API developer keys would be handed out. This time, the comment section was closed. Twitter, Facebook, and other popular services are starting to tighten up their APIs as well, leading many to question the value in building apps that rely on these services.
Where do I go from here?
I released a small change to the app tonight in order to verify the current state of the Netflix API (I have used the app in many months). Depending on how that goes, I’m planning to either finish up the iPhone version of the app (been tabled for about a year now) or pivot and start a new project. Stay tuned!
Back to Basics with CloudSpokes and Meteor.js
I’m starting off 2013 by going back to basics re: my web development skills - attempting to master the core technologies - HTML, CSS and JavaScript. I’m focusing now on JavaScript, by far the most intricate and difficult of the three. I recently discovered the CloudSpokes Coding Challenges and thought it would be a good excuse to work hands-on with JS.
Exploring Meteor.js was a lot of fun - in the past I’ve only really used vanilla JavaScript and some JQuery. The neatest feature is definitely the live page updates (templates update automatically when database data changes). There is a definite productivity boost to updating HTML/CSS, saving, and instantly seeing your changes reflected in the browser automatically. In the future this could prove very useful for rapid prototyping web apps!
Interesting code implementation details:
My First Desktop PC Build
I built my first desktop PC over the past couple of months with the help of some of my coworker buddies. It was a fantastic experience - I was able to build a fast, powerful Desktop for less than the cost of a mid-range laptop (excluding the cost of monitors). I focused on 3 areas: software development (good CPU, lots of RAM and an SSD), gaming (2GB GPU), and media (1TB HDD for movies/tv/games).
I’ve come a long way in my 3.5 years with The SAVO Group - this year was certainly the busiest but also the most rewarding. Highlights include:
Leadership: I was placed in charge of the design/architecture of a bunch of our largest projects, which forced me to better the methods our team uses in designing and implementing reusable packaged solutions. On top of that, the biggest challenge of the year was being placed in charge of a team of outsourced developers that assisted with our larger projects. It has been a big success so far - we are delivering high quality software at a much faster rate!
Additional Projects: Winning the SAVO Innovation Challenge, creating an internal Google Chrome extension, and a strong focus on training/personal development (attending That Conference and ALM Chicago, DiSc/Leadership on-site training, Pluralsight, etc.)
Skills: More web development technologies (ASP.NET MVC, JavaScript, Salesforce.com), Office Automation (Excel, PowerPoint, OpenXml).
Personal Development Projects
Despite having a very busy personal life, I still managed some work on some neat side projects:
My Blog: My goal for 2011 was to write at least 1 blog post per month. I didn’t quite reach that, but am satisfied with my initial efforts. I have a lot of topics just waiting to be written about in 2013!
FixMyQ Android app and KinecTunes Kinect/iTunes mashup: I hardly worked on these at all, but still managed some great download numbers. Netflix pulled the plug on the movie availability APIs without warning, effectively killing FixMyQ. I’ve since lost interest in it but may come back to it this year - I had an almost fully working iPhone version right before the changes, it has hit 6,000 downloads in 2 years time, and I can’t help but still love Netflix’s service! Downloads: 6,000 and 1,000 respectively.
EverNoble: a Twilio/Windows Azure/Evernote mashup, this won 1st place at the That Conference Hackathon. Downloads: (n/a - not publicly released).
Amazon Wish List Extender (awe): a Google Chrome extension, available here. An ongoing effort created in late December as I attempted to better my HTML/JavaScript skills. Seeing some decent traction already - may pursue this further in Q1. Downloads: 40.
Paid Consulting Project: I completed my first paid side project for a friend/coworker. It was very rewarding and fun - I will look to continue this type of work in the future.
Life
This was a huge year for my personal life, as I married my best friend of 5 years in June. We were proud to host over 200 of our closest friends and family for what we dubbed “the biggest party of 2012!” Seriously though, it was a perfect day filled with lots of love and happiness. A fantastic honeymoon in Thailand was the perfect end to our wedding planning journey!
Goals for Next Year
I accomplished a lot this past year, extending my name/brand through a combination of software, leadership, and professionalism. As always, I look forward to working on:
Work/Life balance:I’m very passionate about software development, in and out of work. Between work and life events (marriage, grad school, kids) it’s becoming harder and harder to stay in touch with everyone. I’d like focus more on my personal relationships and less on work.
Health: I made great strides in the Fall of 2012 to improve my health - there is much more I need to do. This will be my biggest challenge/focus of the year!
Writing: I’ve really enjoyed blogging thus far - improving my writing and getting great feedback. I’d like to establish a consistent writing schedule.
Speaking: I’ve been working on this for years - in 2012 I had the most improvement yet. However, I still have a long way to go until I am a comfortable, professional speaker. My most ambitious goal this year would be to give a talk at a conference, such as That Conference in August.
Development skills: A larger focus on web projects and mobile.
“Hacking”: In addition to software, I’d like to create something cool via more hardware projects, such as the Arduino or Raspberry Pi boards (home automation, perhaps?).
Excel Add-in (Plugin) Development Tips
My current side project involves creating an Excel Add-in for Excel 2007 and 2010. Here are some useful tips and “gotchas” that I came across/experienced:
Incredibly helpful: Searching the web for Excel help can be a painful experience - follow the VSTO team’s advice! Enable the Developer ribbon, start recording a macro, complete an action, then view the resulting VBA code. It will get you most of the way!
Use .NET 4.0 for the Excel Add-in. An immediate benefit is not having to include a bunch of Type.Missing arguments - this is automatically handled for you.
When debugging, always close the Excel application instead of choosing “Stop Debugging” from Visual Studio.
As a result of many debugging sessions with Excel, it can decide to “hard disable” your Addin, which causes it not to load when debugging (with no error messages!). Here’s how to fix it.
Unit testing an Excel Add-in is very limited, so decouple your logic into separate class libraries wherever possible.
Use a for loop to iterate through collections of Excel objects (Ranges, Cells, Worksheets, etc.) instead of a foreach loop. Otherwise, the order of the elements can be incorrect or even skipped!
Across the Web (looking at you, MSDN!), Microsoft Office applications are often referred to by their version numbers instead of year numbers. Excel 2007 is “Excel 12.0”, Excel 2010 is “Excel 14.0”, and Excel 2013 is “Excel 15.0”.
To switch from debugging in Excel 2010 to 2007, see here.
If you do not use Excel 2010-specific features, your plugin will just work with Excel 2007.
“EverNoble” wins That Conference 2012’s Hackathon for “Best Use of Azure”!
I am currently at “That Conference”, a brand new 3 day software development conference located in the Wisconsin Dells. Last night, I participated in a 4 hour hackathon - my first ever! Categories included “Best Use of Twilio”, “Best Use of Windows Azure”, and “Best Summer Camp theme”. My app won first place for “Best use of Windows Azure”!
It’s easy to forget things if you don’t write them down, so I useEvernotefor organizing my thoughts, daily todo’s and projects. What if you have a thought/idea/note that you want to remember, but for some reason WIFI is not available? What if you don’t have a smart phone? My app allows you to send a text message to a special number, which then creates a new note in Evernote with the text message body.
Notable Details:
Built on multiple services: a Windows Azure-hosted ASP.NET MVC3 web application, Twilio (for text message/SMS capabilities), and the Evernote Web API (to create a new Evernote note)
4 hour sprint (7pm to 11pm, but judging/presentations took us to 12:30am!)
Famous (in tech) Microsoft community manager Scott Hanselman as a Guest Judge
Prize: free beer tickets for Happy Hour (ha!) and a Sphero device
Technical Implementation:
I set up a free phone number through Twilio that when texted, sent the SMS details to an Azure-hosted MVC web application via a POST request. The Azure app then creates a new Evernote note with the text message body.
What went wrong:
Using TFS for source control: I worked with another developer on the app, so since we needed to be able share/contribute code, I figured TFS would work well. We used tfspreview.com to create a TFS account; unfortunately we lost at least 45 mins to trying to configure it. TFS wouldn’t accept my email address and I had to install a patch in order to fix a Visual Studio bug.
Presentation nervousness: While I do admit that I’m still a rather weak speaker, I wasn’t nervous initially since only a small group of devs showed up to the event. However, once I noticed that Scott Hanselman was a judge, I did clam up a bit. I’m a big fan and follow all of his work, so to have him appear as a judge was a bit unreal.
Conference center Internet Wifi: While I am able to say that Wifi at That Conference was better than most, I lost my connection multiple times. I was trying to build an app where 90% of the parts relied on having a constant access to the web, so this hurt productivity.
What went right:
Project Scope: 4 hours is a very small amount of time to build anything useful, so I knew that I needed something basic yet interesting. I did some light preliminary research on the target platforms - luckily Twilio and Azure were very easy to set up - the real work was putting all the pieces together.
Project Idea: The judges noted that my app was quite useful and really liked the overall concept, proving that it really is a good idea to generate ideas ahead of time (I had about 5). We successfully defended any critical questions raised and had good ideas for “v2”. Additionally, we were complemented on our use of source control.
Platform Technologies: The platforms that we were designated to use were easy to set up and comprehend, which was especially great due to the very tight time frame. Windows Azure provided an easy-to-use cloud hosting solution; I could definitely see myself using it for future website projects. Twilio’s setup was the most impressive - obtain a phone number, give it the URL of the application to post data to and voila! No code to write. Lastly, Evernote provided a C# library with samples for connecting to their API; using the library saved a lot of time.
Summary
This was my first time participating in a hackathon. I certainly didn’t expect to win one of the prizes! Coming prepared with a variety of ideas and a competitive attitude are a must. It was a fantastic challenge that I hope to do again soon.
“SAVO Desktop” Wins SAVO’s Innovation Challenge!
I am pleased to announce that my team has won 1st place in the Q2 2012 SAVO Innovation Challenge!
Last week, my team presented our app to SAVO’s Senior Leadership Team, which includes the heads of all departments as well as the CEO. After a bit of a rocky start (my laptop could not connect to the Internet), the SLT was greatly impressed with our application. We were the only team with a cross-departmental team (two of us from Consulting and one from Sales) and combined our software development skills with sales/business knowledge to create a simple, elegant solution. The SLT will be supporting us as we work towards creating a Consulting offering for our clients.
Check out my post on “SAVO Desktop” to learn more about the application.
Introducing SAVO Desktop: Real-time SAVO Updates via Notifications
Last Fall, SAVO’s management team introduced the first of many Innovation Challenges - employee side projects whose goal is to “showcase innovations that are very focused… and address a specific business problem.” First, second, and third place cash prizes are handed out for top entries. Today, two of my coworkers and I submitted SAVO Desktop - a Windows desktop application designed to provide real-time notifications relating to SAVO content that the user has “subscribed” to (think “following” a la Twitter).
In the current SAVO system, users can “subscribe” to content that they find relevant and important to their work. When certain updates to the content occur (such as new comments, new versions, new editing, etc.) the user is notified via email instantly. My team chose to view the subscription feature in a different light: What if there was an easier way to digest the updates in a more robust manner?
SAVO Desktop is our solution. The application sits in the background, periodically checking for new updates to the User’s subscriptions. When a new action occurs, a pop-up notification is displayed:
Clicking on the notification opens up the Subscription Newsfeed - a list of all actions that have occurred appears. Clicking on the link opens up the browser and navigates to the asset in SAVO. Minimizing the application places it into the system tray.
The judges loved our application and gave tremendous feedback. In fact, they plan to assist us with turning it into an official SAVO product! We hope to find out soon how we fared against our peers. Stay tuned…
ALM Chicago 2012 Highlights
“It will get harder before it gets easier.”
Those parting words were spoken to me by Benjamin Day and Chad Albrecht, two speakers at last week’s ALM Chicago conference. The intent of attending the conference was to learn more about Agile Development methodologies in order to apply them towards improving my team’s development processes - it was a great success. Below are some key takeaways from various speakers combined with my own thoughts:
Motivation for hiring the best developers: In the opening keynote, Mike Gilpin explained that the best software developers constantly are learning new things and trying new technology - thus making them more creative and faster. The faster that we work and the better that we become, the more money we can charge!
On strategies for combining Waterfall and Agile methodologies: Gilpin suggested a “Water-Scrum-Fall” process: Planning (“Water”), Requirements, Development and Testing (“Scrum”), and Deployment (“Fall”). This approach tries to capitalize on the portions of the project lifecycle that Developers have the most control over (Requirements, Development and Testing) while maintaining a Waterfall approach to Planning and Deployment. I was happy to hear this, as it is a similar approach that my team already uses. The one question that still remains for me is, “How can we improve upon the heavy Client-facing portions given our lack of control over the speed of their processes?”. There may not be much we can do - as Gilpin said, “you can’t control everything.”
On strategies for combining Waterfall and Agile methodologies, again: Benjamin Day presented his approach - “Scrum under a Waterfall”. It is an attempt to leverage the strengths of each - the Agile portion utilizes Scrum for day-to-day activities with a focus on TDD and working software while maintaining Waterfall methods for releases and coordination among multiple teams. Similar to the “Water-Scrum-Fall” method, this approach makes sense as once again the focus is on being agile with processes that we control (development) vs. those that we do not (how other teams work/interact).
Upcoming Agile tools in Visual Studio 11: Many new features of Visual Studio were demoed. Among the most interesting was PowerPoint Storyboarding (quickly generate user stories in PowerPoint) - perhaps an alternative to boring, dry whitepapers? Continuous Test Runner (constantly runs unit tests in the background; akin to Intellisense) aims to increase development and testing speed. Finally, Code Reviews are being added to TFS. My team needs to commit to having more of them and this feature makes it quite easy - you choose the code to be reviewed and assign the person to review it. The person given the Task via TFS can quickly review the code and send it back to you, making for some great time savings.
Speeding up our software development processes while maintaining a high level of quality is a key focus of mine this year. Thanks to ALM Chicago, I feel confident that I will make it happen!