Fantasy Football Playoffs – A Toastmasters Speech
January 1, 2012 Leave a comment
Enjoy this speech I gave about Fantasy Football Playoff time. In this speech, I focus on using body language and gestures during the presentation.
Lessons Learned Building Enterprise Software
January 1, 2012 Leave a comment
Enjoy this speech I gave about Fantasy Football Playoff time. In this speech, I focus on using body language and gestures during the presentation.
November 29, 2011 Leave a comment
Do you remember being taught math when you were young? If you were anything like me you hated word problems. That was the only time during math class that we could not just use mechanical processes. Instead, we had to think about how to apply those processes to real world problems.
The natural evolution of word problems in the adult world is Brain Teasers, those pesky puzzles that are supposed to be fun but, more often, are frustrating. For most people, the skill of solving riddles and impossible estimation problems has never had much use. That was until clever software companies, such as Microsoft and Google, famously began asking these types of questions during job interviews. The legends of these companies’ interview tactics are so predominant that they have essentially become their own category of technical interview questions.
How many golf balls can fit in a school bus?
Unprepared candidates confront brain teasers with shock and horror. A feeling of futility drapes over them like a giant rain cloud. Fortunately, all the candidate needs to understand is that he or she does not necessarily have to answer the puzzle correctly to “pass” the test.
Brain Teasers are great because when they work, they are a simple way to lighten the tone of an interview. They are also great at unearthing important traits of the interview candidate:
“A hunter sets up camp, walks 10 miles south and 10 miles east. He shoots a bear and drags it 10 miles north back to his camp. What color is the bear?”
Through years of practice, I became comfortable with the word problems in math class. It was a required step in progressing in mathematics. Likewise, Brain Teasers become conquerable with practice.
Personally, I love Brain Teasers now. I enjoy when a friend sends me one I have not before heard. I find it worthwhile to stretch my mind by thinking about different types of problems.
Still, Brain Teasers are rather overused in interviews. As stated above, they can be useful when they work but, when they do not work, they often fluster an otherwise good candidate. Some puzzles require a certain basis of knowledge that can lend itself to bias. Consider the puzzle about the hunter above, the answer is “White.” Why? Because the only place on Earth that someone can walk X distance South, X distance East or West, X distance North and then arrive at the same point again is at the North Pole. Polar bears are the only type of bears that live there. Polar bears are white. The candidate may be able to logically reason through the problem, but sometimes a small piece of “common knowledge” becomes a roadblock.
Lastly, Brain Teasers take too much precious time during an interview to not uncover anything of import. They test the “A-Ha moment” of the candidate, a long period of silence followed by the sudden discovery of the answer in the candidate’s mind. In cases where the candidate solves the problem right away, it usually does not mean that the candidate is brilliant but that he or she has heard it before.
As I mentioned, it is not required of the candidate to solve the problem. In most cases, the interviewer is trying to gain insight into how the candidate thinks and describes his or her thoughts. Therefore, the #1 suggestion for approaching these problems is to communicate your thoughts while you are reasoning through them. Talk aloud about alternative solutions you are considering. Ask questions of the interviewer about the constraints of the problem. If you cannot come up with a solution, explain some option that would get you close. Going back to the polar bear problem, it would probably be enough to understand that the hunter is at the North Pole.
For more tips and great job interview Brain Teaser examples, I recommend the book How to Ace the Brain Teaser Interview.
Some of the most fun Brain Teasers to discuss with friends are those from movies. It’s interesting when someone has seen the movie and remembers the solution, but when you propose it again after some time, he or she does not remember it. Below are some examples of the best movie Brain Teasers (hopefully YouTube won’t remove them).
Post your favorite Brain Teasers in the comments and good luck on your interview!
November 1, 2011 Leave a comment
Recently, I dove back into XAML-based development to create some Silverlight plugins for a large web application. Most of my experience in XAML came from writing a WPF application from 2008 to 2009, so I had much to learn about the asynchronous data retrieval paradigm used in Silverlight. I had questions about UI Design Patterns, Service-Oriented Architecture (SOA), and how to reuse class libraries, so I asked Brad Himelstein, from CinCom, if I could pick his brain while we hit a few golf balls. Brad has continued working with Silverlight and WPF for a few years, since we worked together on the aforementioned WPF application.
Below is a summary of his tips as well as some quotes from our conversation.
Me: “Do you ever use any sort of patterns for the UI?”
Brad: “MVVM”
Me: “I am just now getting introduced to that. What are the benefits?”
Brad: “It is great, because you just setup the data context and do all your databinding, and it just magically works. Two-way binding works as well.”
Brad identified additional benefits during other parts of the conversation. MVVM’s primary purpose is to separate the concern of the behavior of an application from that of the user-interface design. It is a practical implementation that is cleaner to understand and easier to pass back and forth between designers and developers versus the default approach of placing logic in code-behind files. He provides sample MVVM source code here.
In my application, I use WCF RIA Services to query server objects and return them to the Silverlight client. This technique simplifies the process of retrieving service data and populating local objects because a local proxy object is created and populated automatically. In Brad’s words, “If the web service returns an object of class ‘Foo’, we don’t need to redefine ‘Foo’ in the Silverlight app.”
Unfortunately, I had a great deal of logic included with the retrieved classes that I also wanted to be able to use in the client. I asked Brad how to elegantly work around this limitation of Service-Oriented Architecture.
Me: “What I was hoping to get with RIA Services was, say I’ve got some class I’m returning from the service. I can load it with data easily but I have additional calculation properties on this class, such as FullName, which is just a property that returns FirstName and LastName concatenated. A local proxy object is created automatically for use in Silverlight, with data populated for FirstName and LastName, but the proxy does not retain calculation logic. Since I have a server-side object that has calculation properties defined, how can I share that code for use with the Silverlight client and the proxy object?”
Brad: “If you know you’re going to use FullName, then just create another string called FullName and set the property on the server so it is passed down to the client in the object, because it is not going to take those calculated properties and bring them down.”
Me: “But then that FullName would have a state when it returns.”
Brad: “Remember, you can extend everything. So on the client side, you can alternatively have your own Foo class, which can be used to extend the partial Foo class that is returned from the server.”
Brad’s suggestion was enough to help me come to a solution that fit my needs.
Let’s use the sample Class “User” to continue our example from above. In such a class, I can place fields of the User, such as FirstName and LastName in one file named User.cs. User class should be defined as a partial class, so we can combine definitions of the class from 2 separate files. Hence, in another file, named UserCalcs.cs, we should define calculated properties, such as FullName. At this point, the server behavior will work as it always would have if we had just implemented all properties and fields in the one file. However, the Silverlight client would not yet know about the FullName property.
An important limitation of Silverlight is that it can only reference projects that are compiled as Silverlight projects. In other words, Silverlight cannot natively reuse definitions from standard .NET class libraries. What it can do is recompile normal .cs files into a Silverlight assembly.
To do this, right-click on the Silverlight project in your Visual Studio solution and click Add Existing Item. Navigate to the file that contains the calculated properties, UserCalcs.cs. Click the file, and then click the down arrow next to the Add button. Choose Add As Link.
The Silverlight project will now compile this partial class definition. It will extend the proxy class as well as the server side class from the same file. Therefore, maintenance of those calculated properties can be shared between the client and the server side code from one file.
Ok, Brad didn’t actually say this so bluntly, but it was a recurring theme of our discussion. Based on recent information about upcoming Windows (8) releases, Silverlight’s future is unclear. From what I have heard, Microsoft is committed to version 5 of Silverlight (current release is 4) but has made no guarantees beyond that. Windows 8 will have 2 versions of its Internet Explorer 10 browser: tablet and desktop. The tablet version will not allow plugins, like Flash and Silverlight. Some have summarized the decision by stating that from Microsoft’s standpoint, Silverlight is “no longer strategic.”
Still, the death of Silverlight development, especially in corporate environments, is distant. Here is a great Microsoft client decision workflow about the correct technology to leverage based on your needs. I believe it reinforces the idea that even after Windows 8 is released, new Silverlight applications will have their place.
Lastly, even though Windows 8 tablets will not allow Silverlight plugins to be loaded within its browsers, native Windows 8 tablet apps will be developed using WinRT. As Brad informs us, this gives us Silverlight developers hope, as WinRT is still “just C# and XAML.”
October 4, 2011 1 Comment
As technical co-commissioner of my Keeper Fantasy Football league, I perform a good deal of administrative duties during the offseason. I have to sort through all the player transactions from the season to determine which NFL players are eligible to be kept within our league rules. One year, at the end of the 2010 season, I waited too long to gather this data. I normally click through the Yahoo Website to see all the historical transaction data necessary. However, after a certain point in the year, Yahoo removes access to the year’s information.
Luckily, in late 2009, Yahoo opened up their Fantasy Football API. Therefore, I was able to implement a .NET solution to retrieve the data I needed. Below are the steps I took.
The goal of our solution will be to create a simple ASP.NET Web Forms application that authenticates to Yahoo and then enables us to query the API.
Perhaps the most difficult hurdle to overcome is authentication. Yahoo uses a web standard called OAuth, which is a “simple, secure, and quick way to publish and access protected data”. You can find out more about it here, as I do not plan to delve into the low-level details of this protocol. The difficulty I found was that there are not many examples of .NET applications using this technology on the web.
To help us authenticate, we will leverage a .NET library called DevDefined OAuth.
In our next step, we will create a simple button (named AuthenticateButton) in the Default.aspx page to kick off the authentication process.
string requestUrl = “https://api.login.yahoo.com/oauth/v2/get_request_token”;
string userAuthorizeUrl = “https://api.login.yahoo.com/oauth/v2/request_auth”;
string accessUrl = “https://api.login.yahoo.com/oauth/v2/get_token”;
string callBackUrl = “http://domain.com/Query.aspx”;
protected void AuthenticateButton_Click(object sender, EventArgs e)
{
var consumerContext = new OAuthConsumerContext
{
ConsumerKey = “[provided by yahoo]”,
SignatureMethod = SignatureMethod.HmacSha1,
ConsumerSecret = “[provided by yahoo]”
};
var session = new OAuthSession(consumerContext, requestUrl, userAuthorizeUrl, accessUrl, callBackUrl);
// get a request token from the provider
IToken requestToken = session.GetRequestToken();
// generate a user authorize url for this token (which you can use in a redirect from the current site)
string authorizationLink = session.GetUserAuthorizationUrlForToken(requestToken, callBackUrl);
Session[“oAuthSession”] = session;
Session[“oAuthToken”] = requestToken;
Response.Redirect(authorizationLink);
}
To obtain your ConsumerKey and ConsumerSecret strings to place into the above code, go Yahoo’s Developer Projects Site and create a project. When creating your project, enter the Application URL (e.g. http://domain.com) and App Domain (e.g. domain.com) of the deployed location of your web site. Also, make sure to enable access to the Yahoo Fantasy Football API.
Take a look at the value in the callBackUrl string above. This needs to be edited to be an address on your web site. As part of the authentication process, Yahoo calls back to a URL on your site and therefore requires your site to be accessible from the public web.
protected void Page_Load(object sender, EventArgs e)
{
OAuthSession session = (OAuthSession)Session[“oAuthSession”];
IToken requestToken = (IToken)Session[“oAuthToken”];
// exchange a request token for an access token
string oauth_verifier = Request.QueryString[“oauth_verifier”];
if (!String.IsNullOrEmpty(oauth_verifier))
{
IToken accessToken = session.ExchangeRequestTokenForAccessToken(requestToken, oauth_verifier);
Session[“oAuthSession”] = session;
}
}
Now that we are finished implementing the authentication code we can write the query submission logic.
protected void QueryButton_Click(object sender, EventArgs e)
{
string query = QueryTextBox.Text;
IConsumerRequest responseText = ((OAuthSession)Session[“oAuthSession”]).Request().Get().ForUrl(“http://fantasysports.yahooapis.com/fantasy/v2/” + query);
ResultsLabel.Text = responseText.ToString();
}
You are now ready to query the Yahoo Fantasy Football API. Here is how you use it.
There are definitely improvements that can be made to our sample application. For instance, the results output from our query are not easily readable, but they can be simply output to an xml document or some other format for reading.
The amount of data that can be extracted from the API is huge and can be leveraged for some very creative purposes. For more information about the query syntax as well as available data, see the Fantasy Sports API Documentation.
You can download the code for the sample application.
Lastly, below are some resourceful links:
http://github.com/buildmaster/oauth-mvc.net
http://oauth.googlecode.com/svn/code/csharp/
http://blog.techcle.com/2010/03/20/simple-oauth-integration-for-twitter-in-asp-net-mvc/
http://www.codeproject.com/KB/cs/Delicious-OAuth-API.aspx
http://code.google.com/p/devdefined-tools/w/list
http://developer.yahoo.com/fantasysports/
http://developer.yahoo.net/forum/index.php?showforum=122
May 8, 2011 Leave a comment
It seems common for software developers to question their career direction after several years of experience. I have gathered through my own feelings and conversations with others that there is a point in one’s career, usually after about 4 years, at which one wonders how long he or she can continue to build business application after business application. What once was challenging and exciting has become repetitive and mundane because the pace of learning has greatly decreased. The motivation to create yet another CRUD application (one that is categorized because it only involves the most typical business functions: Create, Read, Update, Delete) has been lost, resulting in many introspective hours staring out the window thinking about greener pastures.
What can be done to renew the sense of excitement and urgency that comes from developing something new? Myself, I thought that working in a “cool” industry that I was already interested in would solve the issue. I figured I already loved sports and casinos. If I got a development job in those industries it would make the dull tasks less dull. I would be able to tell myself, “Well, I hate clicking through smoke tests again but at least everything is sports-related!”
Having worked at an Information Technology (IT) department for a professional baseball team before, I figured I would be able to leverage my experience and professional network to get an interesting new job. Granted, my work there was more of an internship than anything, but a role in such high demand serves as a recognizable selection process and it has been a great conversation topic during job interviews. It was a wonderful overall experience and I appreciated the opportunity. Therefore, I focused on new jobs with professional sports teams, video game development companies, and casinos.
Casino – For someone going to school in the middle of Ohio, I spent a lot of weekend time in college at casinos. I enjoyed Black Jack and was constantly searching for the perfect system to make money. I even wanted to be a professional poker player for a little while. I also toyed with the idea of taking a winter off to learn to be a Black Jack dealer. There is something about fiddling with those heavy clay chips that is both riveting and relaxing at the same time.
Sabermetrics – Growing up I was obsessed with baseball and individual player statistics. I played on a baseball team and played board games like Strat-o-matic. I made my own scoring sheets and even used to make my own player cards to represent my friends in the board game. During my job search, I joined SABR, the Society for American Baseball Research, and immersed myself into baseball statistics again thinking I could become a full-time statistician or statistical application developer.
At this particular time in my life, I knew I was moving out of state, so I figured it was a perfect time to make an industry change. However, at the time I was not comfortable with the prospect of not getting paid so I took one of the first jobs that was offered to me until something else presented itself. A funny thing happened at that company. As it was a small software product company, I learned that the environment there was close to what I had wanted all along. It was an old company by software standards, but it still had a “startup feel.” I learned what I wanted and what would keep me motivated:
Although the company had its share of problems, it showed me what I was looking for in a long term position. I wanted the growth potential and commitment to progressive technology that comes from a software product startup.
While working in a “cool industry” does come with perks, fringe benefits, interesting subject matter, and it may turn out to be generally awesome for some, I caution software developers to think about some of the hidden drawbacks to these types of positions.
Positions in interesting industries are both scarce and in high demand. If you are interested in a professional sport, does the city you live in even have a team at the highest level? If not, that’s scarcity. If you are lucky enough to see a job opening you are interested in, you must realize that there will be hundreds, if not thousands, of other applications. That’s demand.
As a result, salaries tend to be lower and expectations of working hours are much longer, especially during busy seasons or big events. Additionally, people hired into these jobs stay around for a long time. Because of the low turnover, it can be difficult to gain more responsibility by moving into someone’s role that has just left, limiting opportunities for promotion.
By definition, the interesting industries mentioned do not focus on technology. They are generating revenue through entertainment. Therefore, it may make the job more entertaining but it changes the perspective of technology throughout the organization. Employees outside of the IT department view technology as cumbersome, productivity-restricting, and expensive. Any time there is a trivial bug in internal software, it will be treated as an urgent support request. Did I mention developers will be doing technical support?
To summarize, the key problem here is that the organization does not exist for the sake of progressing in technology. The IT department is a cost center. Any mistakes that cost money for the company were not budgeted for and get escalated quickly, making for a stressful environment for technologists.
There are smaller drawbacks to consider too. Working somewhere that garners the awe of family and friends comes with requests to trade favors (e.g. introductions or getting event tickets). Additionally, sports teams and casinos are highly competitive with one another, so they are protective of advantageous processes and knowledge. I prefer to be able to learn from peers both inside and outside of my company as opposed to being a slave to competitive information silos.
In reviewing the pros and cons of working for a professional sports team for this post, I have almost talked myself back into trying to work for one. The fringe benefits are great (e.g. free game tickets and meeting athletes), it helps build a resume, and colleagues are all intelligent and ambitious. However, it is my intention to bring up these drawbacks to shed light on the entire package that comes with the job and to remind myself that I really want to work for a software company. To marry the two concepts would be the “Genius of the and.” By working for or creating a web retailer like Zappos, who needs technology to thrive, one can work in an interesting industry, like fashion, AND be a crucial cog in building revenue for the company.
May 4, 2011 2 Comments
Since October I have been attending Toastmasters meetings and occasionally giving speeches to improve my public speaking ability.
Below is my 4th speech:
- Ask your boss & peers which certifications are valuable.
You don’t want to waste time obtaining a certification that will not ultimately help you to achieve your goals. Ask your boss to find out about certifications that would aide in advancement within your current job. Ask peers to find out which would provide opportunity outside of your current employer. Ideally, you should choose a certification about which you have some relevant knowledge already. Otherwise, the preparation process will be significantly elongated.- Research the governing body’s website or magazine to determine what is required. Find out:
a. The format of the test (e.g. multiple choice, essay, etc.)
b. Recommended training materials (e.g. text books, practice tests, etc.)
c. Additional requirements (e.g. years experience, a verbal presentation, etc.)- Study
a. Obtain the recommended training materials
b. Review fundamentals
c. Spend extra time learning new concepts- Practice Tests
a. Take practice tests to get familiar with the testing environment
b. Write down notes about surprising answers and concepts with which you struggled
c. Schedule the official exam when ready and confident. In many cases, your company will pay for the exam fee.- Cram: study for an hour or two right before the test.
Focus on those concepts you struggled with as well as facts & formulas that will be beneficial to have memorized. No matter how much you study before-hand, always cram. It’s important to have that information in short-term memory going into the test. Trust me, you don’t want to fail a test because of something trivial that you would have known if you had just done a quick review of the material before the test.- Pass the Test
a. Many certifications last a lifetime
b. Update your resume
c. Now you can add those letters after your name on your business card
I have only been attending for 7 months, so I have plenty of room for continual improvement. However, I have already been helped by the members of my Toastmasters club to use fewer filler words and display fewer nervous ticks. I hope to become more comfortable, so that I can focus on my message while on stage instead of being so nervous my mind goes blank.
Toastmasters is useful because of the feedback given at the end of a meeting. It is helping me develop a sense for how long (in time) someone is speaking (including myself). I get to learn what I did well and what are areas for improvement. In the specific video above, I received the suggestion to not look back at the PowerPoint presentation but instead to create speaker’s notes to keep in front of me. My presentation could also have been helped with a personal, specific example.
I am looking forward to improving my public speaking by giving more speeches, receiving the feedback of others, videotaping, and personally reviewing my speeches. In fact, I look forward to improving the quality of my videos. I apologize for the poor video quality this time (I used a digital camera from 2004). To record my voice, the best option I brainstormed (that was mobile and not very distracting for the audience) was to use a blue tooth headset with my iPhone, call into a Free Conference Call number, and record the call. I later merged the audio and video. If anyone has any cheap, wireless recommendations for microphones that will work with my iPhone I am open to trying them.
April 14, 2011 Leave a comment
I realized leading up to my wedding 2 years ago that I have grown up dreading being the center of attention. Throughout my engagement, I held a heavy fear of the wedding weekend because I was nervous about all the attention. I did not feel comfortable giving a speech (the night of the rehearsal dinner) nor tossing the garter. I’d lived my life until then blending in. I wouldn’t say I am a conformist, but definitely someone who avoids confrontation.
Is it possible to be successful with such tendencies? I say no. Well, not unless you’re a rare exception, one who has a mentor that teaches you all the tricks so that you’re never facing an unknown challenge.
The more stories I hear or books I read, the more I realize that folks get ahead in life and business by being consistently more effective than others. What is the best way to be consistently better? By looking for shortcuts, seizing opportunities, and doing the important things that others hate to do.
Apparently, the normal person is like I was. He or she shrinks away from conflict, hides from uncomfortable situations, and refuses to communicate the whole truth. Exceptional people have bucked the trend of fitting in. They challenge assumptions and find that there are often easier ways to accomplish great things.
A number of authors that I’ve recently read use this as their primary thesis. As Timothy Ferriss says in The 4 Hour Workweek, “What we fear doing most is usually what we MOST NEED TO DO!”
The advice from these books is completely logical, so why are Computer Programmers so conflicted when trying to apply it?
Most computer programmers chose the profession because it does not require interaction with other people, allowing them to continue to avoid difficult social situations. On the other hand, most programmers are skilled at seeing shortcut solutions to problems, optimizing processes, and reducing unnecessary tasks. They just won’t do anything that could be potentially embarrassing.
I think back to my childhood, when I socialized with some children like me and some who were drama queens, those who captured all the attention by whining that nothing ever went their way. Did the drama queens grow up with an advantage? They are used to asking people for things, do not take no for an answer, and shine with the spotlight. I contend that as long as a drama queen is not completely unlikeable, it is a great way to grow up with an advantage in our culture.
To those programmers who fit into the above personality, I say to become dissatisfied with the status quo. Learn to do things differently and opportunities will present themselves. Then seize them.
Carpe Diem