What’s most important to me in a job

This is in response to John Stockton’s post on To Code or not To Code. (The entries I mentioned about coding will come next week.)

Like John, my rankings change from time to time, usually depending on the situation and what’s making me really unhappy or super stressed out. There are also prior experiences that steered me away from certain places. So long before a company interviews me, I’ve already Googled it and talked with all of my contacts to find out more about them and whether I really want to go there.

So what is it that I look for in a job (and company)?

  • Employee satisfaction: Does the company take care of its employees? Are those employees truly happy or do they have to fake their happiness to maintain a public image?

    This is typically high on my list. When my current company contacted me, I had already known quite a lot about them, as a friend had been waiting for 4 years for me to join her there. They went through tough times, as expected of most small companies in this area at that time. But no matter how tough the times were, she raved about the place. Her excitement about the place told me that I had to be there. She knew that I’d be a good match for them, even though she knew me in my non-programmer (tech support/management) capacity. When I went to interview with them, I saw that same excitement in everyone there. And once I was hired, I knew for sure that it was genuine excitement and not just a front. When employees are well taken care of or at least surrounded by the right group of people, employee satisfaction can easily be seen.

  • Industry outlook: Is the company in an industry that interests me? Is the industry going well enough that the company will be around a few years?

    When I take a job, unless I know ahead of time that it’s a short term (like internships), I go into it hoping for a long-term commitment. So I need to commit to something I enjoy doing, to an industry I like working in.

    My last job was in manufacturing. I was there for almost 4 years, and I picked up all sorts of skills in the first couple years. When a co-worker moved on, I had the joys of stepping up and picking up database administration as I went. But my skillset went stagnant in my last year, as the demand for new technology wasn’t there. Manufacturing doesn’t always require new technology, sometimes it’s just a “keep it working” attitude rather than a “improve this process” attitude. Having a discussion with a co-worker about never learning C# since the job wouldn’t need it was probably my wake-up call that I needed to look into other options.

    The industry was taking some serious hits, so that also was a hint for me to move on. Once I left, they didn’t replace me – which was final confirmation that moving on was a good thing.

  • Projects: How challenging will they be? What kind of projects will they be?

    I don’t mind being pushed into learning new technology for projects. I like being challenged into expanding my skillset and into getting out of my comfort zone. But at the same time, there are certain projects that I will not take on because they are in my extremely uncomfortable zone. They get me stressed out, and no matter who I’m dealing with on the other end, I won’t take them on. It’s sad, though, as they are projects that I would truly excel in and that could make really good money. Until I can disassociate stress from that type of project, though, I stay away from them and stand my ground.

  • The team: What kind of people will I be working with? Will I be able to work with them?

    I typically get along with most people that I work with. As those who’ve met me can tell you, I tend to be fairly easygoing and easy to get along with. However, when I first got into computers (an internship right out of high school), I was met with dealing with a team out of my league. My boss knew I could get the job done, and the team lead knew that they needed me on board. But at the same time, some of my teammates couldn’t handle a young female programmer on the team. Ah yes, the joys of age and gender coming into play. I was half their age (literally) and breaking into a field that’s truly male-dominated. That was the one time where I was truly aware of my minority status. It was a very long two month internship, and I was glad when it was over. I owed it to the guys who looked after me – the consultant who took me under his wing and the programmer from another team who did breakfast with me every morning and encouraged me to stick with it.

    Since then, though, I’ve been on some awesome and exciting teams. I’ve learned that the guys on my first team who felt threatened by me, thankfully, are few and far between. But I need to be happy with my team or else my productivity will take a hit as my overall morale takes a hit.

These are just a few things I look into when I’m looking at jobs and companies.

Why I Code

I’m slowly working on entries related to coding itself, so if you’re reading this to see what kind of code I write or what it is about programming that
I’ve been into lately, hang in there. Those entries are in the works.

Last Monday, there was a discussion on these steel trusses would lead to this house was something I liked seeing come together. Demolishing a brick wall with sledge hammers for that same summer program was just as satisfying for my inner engineer, as I learned a lot behind demolition. Working with the masons and mortaring a foundation and getting trapped in the bottom really challenged my inner engineer. With the masons and my long time friends, we came up with the solution to build a makeshift staircase out of the remaining cinder blocks. Trying to build that and then trusting each other to get out safely just added to the experience.

Before my work with Greater Cleveland Habitat for Humanity, though, I knew about my inner engineer. Yes, like many of my guy friends (but none of my girl friends), I played with Legos while growing up. There was some satisfaction of taking the bricks and building them into something like a restaurant with a kitchen downstairs. (What? You didn’t have the Paradisa sets?) Even now, I can still play with legos on my computer.

But for me, the part that pushed me more into the computer engineering side rather than civil engineering (the building, the houses, etc.) was that I had realized at a young age that I picked up programming concepts long before they were formally introduced to me. We learned about programming in 8th grade, and my teacher had pointed it out to me that I really had a good grasp of it. Then again, I managed to work through the book in a short amount of time. Of course, doing the fun things – like programming graphics – really motivated me to get towards the end. Ah the memories…

20 GR

Having picked up the language and an innate understanding of how programming works, I knew that I might eventually end up doing something with it. A few years later, I met a guy who suggested I learn HTML, as it would be cleaner for me to write it straight rather than let Adobe PageMill do it. What was weird was that the guy had no idea that I even knew what programming was – I was just in charge of news content for the high school website and was taught to use PageMill. So on his recommendation, I picked up a book and learned HTML. Soon enough, I went from keeping track of the content in the news section to making sure all the code was simplified HTML. The head student in charge of the project didn’t go into programming – he’s a system and network administrator now, but he still encourages me to follow my inner programmer. From HTML to supporting me now as I work in C#, he’s been by my side through the various languages. We did end up teaming up together in college for a programming project, using PHP. But he mostly leaves the coding to me and rarely touches it.

As a programmer, I’m still putting together my love for building things and seeing them come together. Instead of physical buildings, my buildings are programs. And I still get the satisfaction in the end when I get a satisfied user.

Now you have a basic idea as to why I code. In the next few entries, I promise to finally get into coding concepts and code samples.

Geek Hero Worship…

While on Twitter last night, Ben Fulton mentioned that he was a stevenharman disciple (his words, not mine). I hadn’t heard of the guy so I figured I’d check his blog out.

I came across an entry on his blog titled “On Geek Hero Worship”, and I definitely could relate to that.

The first thing that came to mind was a song (“My Hero”) from Foo Fighters, with the following lyrics:

There goes my hero
Watch him as he goes
There goes my hero
He’s ordinary

It’s true though. The people we look up to in the industry and place on pedestals are most likely normal people too, with their own heroes.

I don’t typically admit to who my heroes are, but there are a few of them that I’ve had for quite a few years. The more I get back into programming, though, and the more I Twitter-surf, the more I find out and realize that yeah, they’re ordinary too.

On Twitter…

One of the more recent links that I’ve added to right hand side is a link to my Twitter feed. If you want to see what I’m up to, that’s definitely one way of tracking me down. The reason I mention Twitter in a programming blog is because you’re about to see just how the social programmer ends up meeting a bunch of other programmers and other interesting people along the way.

Long ago, my friend Nivex told me to check out Twitter, and I saw it and thought it was the stupidest idea ever. Seriously, answering the question “What are you doing?” just can’t go far, can it? I didn’t bother giving it a try then – I just couldn’t see it taking off or really going anywhere.

Fast forward to today… I’m on Twitter, and I’ve picked up a bunch of followers.

So what did it take to get me there? Well we had Jeff Blankenburg, the Microsoft Developer Evangelist for the OH/MI/KY/TN region, at the Bennett Adelson .NET SIG in December who decided to show us some really cool Microsoft projects. He managed to sneak Twitter in his presentation, and he made it seem pretty neat. So I figured I’d probably check it out.

After following Jeff and Nivex and seeing who they were following, I started to get a feel for Twitter. I realized that it’s yet another social networking tool out there, and it isn’t as stupid as I had originally thought.

So, who are the people following me and why are they following me? Now this one, I can’t always answer. I can tell you that I know only a handful of them in person – others, I have picked up along the way probably through random Twitter discussions or just Twitter-surfing in general.

The ones I know in person include the two who introduced me to Twitter plus a couple others who are down in North Carolina, who I met when we visited Nivex awhile back (like tarheelcoxn and jeremyp) or who came up here with Nivex last September (clubjuggler).

I’m sure some of them may be from the .NET SIG (like johnnystock and MichaelDotNet), but I’m not always good at putting faces with people after the fact. So if you know me from the SIG, say hi to me at the SIG so that I can maybe put two and two together.

Some have found me from other conversations – like the GoF discussion, which brought fhwrdh. Then there’re ones that I started following because of their random messages – like the World of Warcraft message posted by jfollas. Oh, and since I mentioned Jeff, I may as well mention our other awesome Microsoft regional contact, Josh Holmes, the Architect Evangelist for the same MI/OH/KY/TN region, who is also part of the Twitter people I follow.

I’ve met all sorts of people and have read so many different things on people I’ve looked up to in the industry. From programming related stuff to personal stuff, all sorts of information flies by in Twitter conversations. It’s a unique atmosphere to be in – you see conversations others are having, and they can see your conversations. But you can meet some of the most interesting people out there.

Check out Twitter if you haven’t already. You never know who you may cross paths with!

XNA Game Studio 2.0 Presentation – Cleveland .NET SIG

Last night, Reuben Ahmed of Bennett Adelson gave a presentation to the .NET SIG on XNA Game Studio 2.0. He took us through a simplified game creation process, creating a basic Invasion of Alien Lifeform (think “space invaders”) clone in a little over 2 hours.

Reuben kept relating the stages to Mario and the various Mario games, which got me excited, as I’ve always been a fan of Nintendo’s Mario games. From the old school NES days to Mario Kart on SNES and higher, I’ve always enjoyed a good Mario game. So this made his presentation even easier to relate to.

One of the first things he pointed was that XNA made games programming easy for the hobbyists. That means that those of us who didn’t get into hardcore Direct X programming and games programming actually could make our own games.

XNA, according to his presentation, stands for X-Platform Next Generation Architecture.  According to the XNA Frequently Asked Questions on MSDN, XNA is one of those recursive acronyms like GNU (GNU’s Not Unix) and PINE (PINE Is Not Elm), and it stands for XNA Not Acronymed. Either way, XNA is a really cool tool. It’s a game framework for C#, which is weird considering that a lot of game programming is done in C++ rather than C#.

To use XNA, you need at least Visual C# 2005 Express. It also can work with Visual Studio 2005, but due to the timing of its release, it does not currently work with Visual Studio 2008. The other key requirements are Direct X and Pixel Shader. You can tell which version of Direct X you have by running the command dxdiag from a Run prompt in Windows. There was uncertainty to how to tell if Pixel Shader is present. I found an XNA Requirements Checker Program while doing a search on XNA and Pixel Shader. XNA will work on Windows XP and Vista.

So what are some of the things that XNA has to offer?

  • Optimized game loop: A game loop is the sequence of sprites that are used for a jump or for moving forward or any other form of movement. XNA provides Update and Draw methods to handle this.
  • Content pipeline: This is an easy way to insert graphics, audio, and other assets for your game.
  • Can make games run on Windows and XBOX360: There’s a cost for XBOX360 that will get mentioned later.

At this point, Reuben put started the code portion of his demo. When you create a new game project in your development environment, you can run it with the default code and a windowed blue screen should show up. I find it funny that they use a blue screen by default – since when has a blue screen really been a good thing?

The next part of XNA that he got into is graphics and textures. Just like adding code files to App_Code, in XNA, your graphics and textures have their own special folder called Content. This folder is used with the built-in content pipeline, to make it extremely simple to use images in games programming. First, you add the assets to the Content folder. Then you need to load the graphic in a variable. Since his demonstration focused on jpg or gif files, he used the Texture2D class. Once a graphic is loaded into a variable, its position can be updated within the Update() method, and it can be drawn via the Draw() method.

There are certain factors that have to be taken into consideration with placing images. On a 2D level, graphics are placed based on the upper left corner. So keeping that in mind, it makes sense that when you are determining boundaries, you have to keep the image’s width and height in mind. If these are forgotten, then it’s very easy to place an image off the screen. Another thing to consider is something called overscan. When you are developing a game for the XBOX, you need to take this into consideration. Finally, keep in mind that the 2D vector system is a positive number system, where (0,0) is the upper left corner of the Viewport. Negative coordinates will render an object off the screen. Although the object wouldn’t be visible, it would still get loaded into memory.

After adding graphics, Reuben showed us how to tint images, so that player 1 could be a yellow ship and player 2 could be a different colored ship. For those of us who are Photoshop-challenged, this is actually a very simple, painless process.

From graphics and textures, he moved on to user input. With XNA programming, you can program for Keyboard input and XBOX Gamepad input at the same time, via enumerators. So for example, let’s go back to an old-school game – Wolfenstein 3D. There was a cheat code for it, where M-L-I had to be pressed simultaneously. Programming this in XNA, would look something like this:

if (Keyboard.GetState().IsKeyDown(Keys.M) && Keyboard.GetState().IsKeyDown(Keys.L) && Keyboard.GetState().IsKeyDown(Keys.I)){
// Give uber hacks here


In the demonstration, Reuben showed how to bind the left and right keys to move a ship (a graphic already displayed on the screen). The movement was done through simple vector addition and subtraction.

Another thing that can be controlled is the rumbling of the Gamepad. There are two motors in it – a low motor and a high motor. Through the Gamepad enumerator, you can call a SetVibration() method.

In the demonstration, an alien was added to the program, and this alien moved across the screen. Thanks to the MathHelper.Clamp() method, the alien was constrained to the Viewport. This particular method is used for setting boundaries, as it “clamps” a number within a range. So if you want a number to stay between 0 and 50, this would return 50 if the value exceeds 50.

Once the alien was added, it was time to add bullets and logic for hitting the alien.
As Reuben warned us at the beginning of the presentation, he was programming for the fun of it, not necessarily taking any best practices into consideration. So for his collision detection – determining whether two objects have collided – he used the rectangle method. Basically, draw rectangles around the objects that you want to test, and then use the Rectangle.Intersects() method to determine whether there’s a collision. The problem in doing this is that the rectangles also get loaded into memory. With games development, especially at a 3D level, you have to keep memory usage in mind. Other collision detection approaches that were suggested include per-pixel collision detection (determining collision detection at an exact pixel point) and color collision detection (based on a color map).

Writing text was included. From a simple “Hello World” to a hit counter, it was a simple call to write.

The last detail before packaging and distribution was adding audio to the game. In order to do this, you need to create an audio project with the Microsoft Cross Platform Audio Creation Tool (XACT). The interface allows the simple drag’n’drop familiarity for adding WAV files to wave banks and sound banks, in order to get played in the game. This tool creates an XAP file, which then can get added into the game code similarly to adding graphics. The MSDN Audio Overview explains how this works.

Now once everything is put together and you have a game that works, you definitely want to share it with your friends, right? If you’re doing a Windows game, you’re in luck. There are no fees for redistributing your game. Using a tool called XNA Pack, you can package your game into a redistributable executable file.

Writing games for the XBOX comes at a cost. In order to even debug your game for the XBOX, you need to have an XNA Creators Club license, which runs $49/4 months or $99/year (as of this posting). The other problem with writing games for the XBOX is that you need an active Internet connection, as the XBOX has to go out and validate the license. Reuben was not able to show us this part, as he could not get an Internet connection out for his XBOX.

The last thing he showed was a sample of what could be done with XNA. This particular program was written within 1 week. Here it is:

Whether it’s a space shooting game or some game to promote your business, XNA can be a useful tool. Even those of us with little to no game programming can get into using XNA!

Some links to check out include:

On Mentoring…

I’m at home today, thanks to this awful weather and my body not liking weather changes much. So being at home, I was twitter-surfing and came across the tweets of one of my favorite programming bloggers/authors. In one of his recent tweets, he mentions (in passing) that he has a mentor, which I find quite interesting.

I’ve been reading up on mentoring a lot lately. Being in a professional organization such as the Association for Computing Machinery, I’m exposed to some interesting benefits, including membership to MentorNet. So after receiving numerous emails on it, I figured I’d check it out. I’ve spent quite a bit of time reading through the MentorNet site to get a better idea of the way they work.

In many past experiences, I’ve been shadowed by younger students and younger programmers and techies. I’ve enjoyed being able to share my experiences and knowledge with them, and I especially enjoyed being able to take the step of instructing labs in college and working with students then. I love programming; I love what I do. The passion for programming compels me to share my talents when I can.

Getting where I am today, oddly enough, I haven’t really had a mentor. Sure there were professors I looked up to while I was in college, and there were the guys along the way who encouraged me to keep it up. That’s just how I’ve gotten to where I am – getting lucky by meeting the right people and networking with them. But there were never any mentoring programs at the college level, at least not in the programs I had been in.

So I have to ask – for those of you who have/had mentors, how has the mentoring situation helped you? Have there been any problems that you’ve run into? Sure, I can read sites about mentoring, but I’m curious about personal experiences as well.

Really Simple Syndication… RSS for short

Last week, as I looked at some sites, I kept noticing links to their RSS feeds. Being back in the public-facing web development arena, I figured that I should probably understand the technologies that are out there for me to use. So I contacted my friend Nivex, who I knew had dealt with RSS feeds in the past, as he had mentioned them to me in passing. He was able to explain it to me so that I could understand it.

RSS stands for Really Simple Syndication. They work on subscriptions, and whenever you subscribe to a site’s RSS “feed”, you can read the site’s updates automatically without having to go to the site. If you don’t want to see a site’s updates anymore, you can simply delete your subscription to the feed, without having to go to the site to unsubscribe.

RSS feeds are read through RSS readers. There are various types of software packages and websites out there to read RSS feeds. Here at home, I use Google Reader, and I use Mobipocket at work. Other readers can be found by searching for the terms “rss reader” or “rss aggregator” or “feed reader”.

When I wake up in the morning, there are a few sites that I visit consistently. Since I found the RSS feeds for them, I no longer open each site to see if they’ve updated or what they’ve changed to. I can just go to my RSS reader of choice and read the updates there. Granted, some RSS feeds are smaller than others, so I do have to go to the sites when the message is longer than the feed.

The night after I had the RSS conversation with Nivex, Jeff Blankenburg had messaged me, after realizing I had mentioned him here. He had some neat tools to show me, and so I checked them out. A couple tools he had me check out include Google Analytics and Google Alerts. I’ll save the details behind them for another entry. But the tool I’m going to focus on is Feedburner.

Whether you’ve got a blog, podcast, or commercial site, Feedburner can work for you. Feedburner can take your RSS feed and make it work for you. From statistics on how many people read your feed to what kind of reader they use to various statistics found in other web packages (site traffic, referrers, etc.), you can find out all sorts of details about your feed. You can see what search terms people are using to find your site. These are just site statistics and feed statistics.

But wait, there’s more! Feedburner can make sure that your feed is accessible to any feed reader application, using their SmartFeed feature. Whether you have mobile readers or people who just read from their desktop or laptop, SmartFeed makes sure their reader can read your feed.

There are various things that can be spliced into your feed – including pictures from Flickr, links to share the data on a variety of social networking sites, and links that are shared from a variety of social networking sites. There are also specialized feed handlers for feeds that deal with events and financial symbols.

Feedburner can work with the Google AdSense program, so if you’re making money from AdSense Ads, you can inject those into your feeds as well.

Getting the word out via Feedburner is fairly easy. Burn your feed, and then they have instructions on how to advertise your burned feed on your site, with instructions geared specifically for some common browser packages (including WordPress, Blogger, and TextPad).

My feed for this blog can now be accessed at http://feeds.feedburner.com/CodingGeekette.

Thanks to the talk of RSS and really neat tools with Nivex and Jeff, I’ve got some ideas as to how I can use them not only for my own advantage but for the company I work for as well. There are a few parts of our site that I can build feeds for that I could easily see as being beneficial. I have to pitch the idea to the company, but I think I could sell them on it.

Check it out – you may have a use for it too!

Microsoft, the Not-So-Evil Empire (Part 1) – CodePlex

This post is the first in many on Microsoft, the Not-So-Evil Empire, in relation to programming related topics and sites. Many years ago, I ran in circles with the Toledo Area Linux Users Group and later on with some of the guys here in Cleveland. One thing I noticed with those crews is the strong anti-Microsoft sentiment throughout. However, I was upfront with them about my playing the field – I prefer to be able to switch between platforms without playing favorites. They put up with me, but the president of TALUG at the time reminded them that I had volunteered for Microsoft (the Gaming Zone, but still…) and would tease me for not being a loyal Linux user. Every time I gave a presentation, I would hear a line about it.

One of the things that the Linux people complained about was that Microsoft didn’t deal with open source. Their operating system isn’t open source, the programs aren’t open source, and there’s no support for open source. Insert the rest of the Linux complaints against Microsoft and anti-open source here.

The Linux community has always looked towards SourceForge as its open source repository. There are many different categories of software available – including databases, sysadmin stuff, games, and desktop stuff. Some better known Linux packages on SourceForge include: phpmyadmin, PHP SysInfo, Squirrel Mail, and Licq.

Something I noticed while writing this blog though was that SourceForge has definitely changed. There are definitely more Windows packages available. Some packages worth checking out include GIMP for Windows (similar to Photoshop, but open source and free), GNUWin32 – GNU tools for Windows, and Tight VNC.

Now Microsoft isn’t anti-open source. It just took them a little longer to get there. Introducing CodePlex, Microsoft’s open source hosting site… live since June 2006, it’s their attempt at getting open source projects in the Microsoft world. Some projects to check out include Iron Python, 3D Tools for WPF, Power Toys Pack Installer, and a managed library for the Wiimote.

So how does this make Microsoft not-so-evil (as opposed to the Evil Empire that Linux people really see it as)? By promoting open source, they are also promoting community interaction with their users. Each project may be worked on by one developer or many devs. Version control can be handled by numerous CVS tools including Tortoise SVN and TFS. Yes, SourceForge was out first, but let’s give Microsoft some credit for taking this step.

One beaten dead horse addressed, with many more to come (but not necessarily right away)…

The GoF, My GoF Experience, and Design Patterns in General

Recently, the GoF came up in a discussion on Twitter. They were talking of design patterns, and Joel Ross actually had to refer to the book for some reason.

Now to a seasoned programmer, the GoF is well-known. But some programmers out there are not aware of the GoF or their book. They didn’t mention it in my data structures classes in college, and we never did look at it in programming paradigms either. For me, I learned about it firsthand at OOPSLA ’99.

The GoF was the Gang of Four, referring to the four authors of the book – Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. The GoF is also used in reference to the book, so take the abbreviation in context. The book came out in late 1994, and it was first made available at OOPSLA ’94. (Side note: I use the term “was” – sadly, John Vlissides died on Thanksgiving of 2004.)

At OOPSLA ’99, the GoF was on trial for crimes against computer science. The trial description can be found at The Show Trial of the Gang of Four For Crimes Against Computer Science panel description. After having spent some of the day coding in Java, a language I was cramming to learn on our off moments, I was glad to get a break and to witness this.

On Wednesday, November 3, 1999, the GoF was found guilty of their crimes. This was probably the best part of OOPSLA ’99, in terms of bringing in experts with a great sense of humor. Although I don’t remember all of the details of the trial, I do remember John Vlissides kept it interesting. That’s what made me curious about the GoF.

After seeing them at OOPSLA, I had to see what their story was. What is a design pattern and why was there such a big deal about it?

A design pattern is a reusable solution to a common software design problem.
Some pattern references can be found here:

The more I had read about it, the more I wished that they would teach as a followup to a data structures course. The data structures teach the basics – loops, clauses, classes, and other building blocks. A class on design patterns would show just how to use those building blocks in real world applications. Sometimes, you need that extra step to show just how everything comes together.

Then again, it could just be the engineer in me that likes to see building blocks being used to build something in the grand scheme of things.

Links for this entry were gathered via a collaborative search on Tafiti, which was recommended by Jeff Blankenburg.