Category Archives: Yes, I Know Komputors!

It’s my job. I’m good at it. No, I mean really good at it. I also spend huge amounts of my personal time learning new computer technologies. Did I mention I’m a geek?

My home network

Last week was my birthday. From my eldest son, Timmy, I received a new wireless router! Yay! This upgrade will allow me to improve the wireless network in my home by increasing the bandwidth, increasing the range, and also beefing up the security.

So why didn’t I upgrade sooner? To put it simply, my home network has become so complicated as to make it somewhat scary to make any changes to it. Let me elaborate.

Wireless devices

The following devices have access to and use my home wireless network on a regular basis:

  • 2 cell phones: Marlene’s and mine
  • My laptop (both the Ubuntu and the Windows OS; I dual-boot)
  • Marlene’s chromebook
  • Marlene’s old laptop
  • 4 security cameras
  • 2 Android devices for Timmy and Nora
  • The Wii
  • The XBox 360
  • Marlene’s Kindle
  • The downstairs TV

And then there are various devices that access the wireless network less frequently:

  • My old laptop
  • Nora’s (somewhat dead) Kindle Fire
  • The Android device for our TV
  • Jacob’s Nintendo 2DS
  • Nora’s Nintendo 3DS
  • My Dad’s laptop
  • My sister’s laptop and phone
  • Various devices (phones, tablets, and laptops) that the Skidmores have configured to use our network when they visit us

Not including “guest” devices, I count 21 devices that will need to be reconfigured before I can say “goodbye” to the old wireless network. Have I forgotten anything? That’s the tricky thing with wireless networks. You tend to forget about all the devices that are using it until the network goes away and things stop working properly.

Wired devices

The wired devices aren’t typically as much of a problem. I can find them all. Just follow the patch cables from the cable modem to each device, and keep a list of what I encounter.  However, due to the complex workings of my LAN, my wired devices may actually require more reconfiguration than my wireless ones if the basic structure of my wired network were ever to change. More on that later. For now, here is a list of the devices that make up my wired network.

  • The cable modem (a router in its own right)
  • 5 routers, including the new one I just got for my birthday
  • 2 switches
  • My server with 6 virtual machines running on it
  • The server IPMI controller
  • My main PC with 2 virtual machines running on it
  • Our “home” phone system
  • Marlene’s “Purple” video phone
  • The Roku
  • The Blu-Ray player
  • 2 media player PCs, one for each TV
  • The HD-Homerun (a TV recording device)
  • The upstairs TV
  • The laser printer

That’s 26 devices (including virtual machines) that rely on the current configuration of our wired network. So how do they all talk to each other?

Network structure

network3

A picture is worth a thousand words. This diagram shows how my home network is structured. The green box labeled “Modem” is my cable modem, and is the connection between my entire house and the outside world. As I mentioned before, this modem is actually a wireless router, but I have disabled all the capabilities of the box, and it is now just operating strictly as a modem.

I consider the blue box labeled “Router 1” to be the “brain” of my network. It is the DHCP server for the entire house, and also handles routing all traffic between my LAN and the internet. The other blue “Routers” are all configured to be simple 100 Mb/s switches, and perform no actual logic, though Router 2 is also configured to host my old wireless network until I can switch all my wireless devices over to the new wireless router: the orange box labeled “Router 5”.

The blue lines in the diagram represent 100 Mb/s connections, and the red lines represent 1000 Mb/s connections. The two red “Switch” boxes are both 1000 Mb/s switches. I consider the long red line between the basement and ground floor to be the “backbone” of my LAN. Most devices (other than my server and main computer) access the Internet over this line. This is also the only means of access to the server for most devices on the LAN.

Network functions

So I mentioned that my network harbors enough complexity to make me wary about making configuration changes. What services do all these various devices provide? Here is a list of some of the functions:

  • Host all our media:
    • More than 700 home videos
    • More than 3,500 anime episodes
    • More than 3,000 TV show episodes
    • More than 800 movies
    • More than 30,000 photos
    • More than 10,000 music tracks
  • Host our web site (in fact, this blog is hosted from the server in my basement)
  • Provide instant access to all that media on both TVs
  • Host our family photo album
  • Provide access to Netflix, Hulu, and Amazon Prime on both TVs
  • Provide access to all our documents on all PCs in our house
  • Keep a history of all past versions of our documents and files (including all media) so they can be retrieved in the event of an undesired change or deletion
  • Backup all documents and files (including all media) to “the cloud”
  • Filter all internet access from all devices connected through my network to prevent connections to undesirable web sites
  • Host two phone systems, with two separate phone numbers: our main home phone, and Marlene’s video phone
  • Provide access to 4 video surveillance cameras on 2 TVs, and 4 Android devices
  • Record all 4 surveillance cameras 24×7 and provide access to the recorded video on both TVs
  • Synchronize all 4 Android devices with our server so that any pictures taken with any device are instantly and automatically added to our family photo album
  • Record specific broadcast TV shows on a specified schedule and make the recordings available on both TVs
  • Provide me access to the server, main PC, and two media PCs from any computer in the house (or from any computer outside the house via the internet) so that I can perform maintenance when necessary

That’s quite the busy network, with quite an array of custom capabilities. It can be a bit challenging sometimes to keep all that in flight, hence my resistance to making arbitrary changes.

– danBhentschel

 

Interviewing strategies

I’ve conducted my share of interviews over the years. Early on, I didn’t have much of a strategy for interviewing candidates. Interviewing without a strategy didn’t work out too well for me, though. On a few occasions I recommended a candidate only to find out after working with them for a little while that they were not really as good a fit for the position as I had originally anticipated.

So, based on my past failures I have devised an interview strategy that I think works pretty well for me today. Apologies ahead-of-time for those of you non-computer peoples who may have inadvertently stumbled into this post. I am a computer software developer, and a lot of my strategy revolves around interviewing candidates for software development positions.

High level strategy

My interviews all use the following basic outline:

  1. Introduce myself – This includes a brief overview of my own employment history, followed by a short description of my current duties and responsibilities. (about 5 minutes)
  2. Ask questions of the candidate – This is the real meat of the interview, and where I plan to spend the most time. (as much time as I have available)
  3. Allow the candidate to ask me questions – I try to be as open and candid as possible. If I tell them something that scares them away, then perhaps they weren’t right for the job to begin with. (allow about 10 minutes at the end of the interview)

Goal-oriented questions

I’m very interested in a candidate’s goals. If my organization is going to invest time in training a new hire, I don’t want it to be someone who sees the job as a temporary stepping-stone to a different position.

Where do you see yourself in 5 years?

No, nothing ground-breaking here. It’s a pretty standard interview question, and yet it’s funny how many people are unprepared to answer this one. I may follow up with:

  • What will you be doing in 5 years?
  • What will be different from today?
  • How about 10 years?

What kind of developer are you?

This is a multiple-choice question. I once heard (or read, I don’t remember which) that all developers fall into one (or some combination) of four categories. The four categories are:

  • Clock puncher – This person is a competent, professional developer. They show up every day, sit at their computer, produce code, and go home at the end of the day. They receive a paycheck that adequately compensates them for their contribution, and they look forward to the day when they retire.
  • Ladder climber – This person is also very competent and professional. They perform their duties diligently and to the best of their ability, frequently going above-and-beyond expectations. They have a constant eye to the next step. What’s after software development? Team lead? MBA? Program manager? Development manger? Higher?
  • Artisan – This person sees software development as an art form. They look at an empty screen as a blank canvas on which to craft their masterpiece. Every function and every class must conform to some internal aesthetic that they have developed over years of study and practice. They will repeatedly refactor the same section of code until they are satisfied. They will post up their favorite creations to forums of like-minded individuals for others to “ooh” and “ahh” over.
  • Scientist – This person is motivated by the problem. Each feature they work on is a puzzle to be solved, and this is their driving factor. The software is simply a means to a solution.

There really isn’t a wrong answer to this question. All roles are actually useful parts of a well-rounded development team. In fact, they are roughly analogous to the more detailed Belbin team roles.

Theory-oriented questions

I consider a firm grounding in theoretical software development practices to be very important. Good software development principles and practices are universal, and apply to almost every software language in existence. A strong theoretical understanding is what allows the good developers to learn new languages and technologies.

Design patterns

To get a general idea of a candidate’s knowledge of design patterns, I will usually open up the discussion with:

What design patterns have you used?

The answer to this question quickly and efficiently addresses a whole host of other questions:

  • Are you familiar with the concept of design patterns?
  • What patterns do you know about?
  • Do you know how and when to apply them?

Assuming that their answer is acceptable, I will usually follow up on one or more of their responses to get more details:

  • When did you use this pattern?
  • Why did you select this pattern?
  • What other patterns did you consider?
What, in your opinion, is the most important purpose for design patterns?

This is sort of a trick question. I ask them “in your opinion,” but I already have the “correct” answer to the question in mind. The most important purpose for design patterns is to assist in communication. I don’t even consider this debatable.

According to Wikipedia:

The usefulness of speaking of patterns is to have a common terminology for discussing the situations designers already see over and over.

The venerable Gang of Four book states in the introduction:

The pattern name is a handle we can use to describe a design problem, its solutions, and consequences in a word or two. Naming a pattern immediately increases our design vocabulary.

To date, no candidate has answered this question 100% correctly to my satisfaction, and I’ve asked it many times. Is it a useless question then? I don’t think so. How the candidate tackles the question is useful.

Bonus question: What’s the difference between applying design patterns vs. applying the DRY principle?

Language concepts

These questions focus on the concepts behind how languages work.

What is your favorite programming language?

I want to drive this next section of the interview towards a language that the candidate feels comfortable with. Followups include:

  • What do you like about this language?
  • What don’t you like?
  • Compare / contrast with <some other language from their resume>

Design principles

I usually skip this part of the interview, or at least breeze through it. Most candidates don’t know much in this section.

Are you familiar with SOLID design principles?

Do any of the following sound familiar to you:

  • Single Responsibility Principle (SRP)
  • Open Closed Principle (OCP)
  • Liskov Substitution Principle (LSP)
  • Interface Segregation Principle (ISP)
  • Dependency Inversion Principle (DIP)
Have you heard of the saying “Prefer composition over inheritance?”

Can you explain that recommendation?

Practice-oriented questions

These questions are geared more towards actual development practices.

Refactoring

What’s the purpose of refactoring code?

Some points I’m looking for here:

  • Remove duplication (DRY)
  • Improve readability / ease of comprehension
  • Enhance testability
  • Isolate bugs or problem areas
  • Improve performance
  • Prepare for the addition of new functionality
What are some of the risks of refactoring? How can they be mitigated?

Refactoring means changing the structure of code without changing the behavior. The risk is that in the process of changing the structure, you inadvertently change the behavior. Mitigation strategies that I am hoping to hear include:

  • Testing (unit tests)
  • Utilize refactoring tools
  • Refactor code in small steps
  • Know the common refactorings and how and when to use them

Testing

Can you describe the differences between unit tests, component tests, and feature tests?

This one is somewhat controversial in the development community. Is the candidate aware of the different camps in the debate? Can they describe the various points of view? It opens up the possibility of follow-on questions:

  • What is the purpose for each type of test?
  • Have you ever used any of these testing techniques?
  • What are some methods of implementing each type of test?

Language-oriented questions

If I am familiar with the candidate’s language of choice (and I almost always am) then I like to ask them some specific questions about that language. I have a standard list of questions that I pick from. I don’t usually ask all the questions under a given language, but I like to have several prepared.

Java questions

  • What’s the difference between the Integer object and the int primitive?
  • What is an anonymous class?
  • What is a nested class? Why would you use nested instead of anonymous?
  • What’s the difference between checked and unchecked exceptions?
  • What are generics?
  • What are annotations? What are some things they can be used for?

C++ questions

  • What is a virtual method?
  • What is the C++ equivalent of an interface in other languages?
  • What is a pure virtual class?
  • What is multiple inheritance? What is the danger of using multiple inheritance?
  • Are you familiar with the boost libraries? How about the new C++11 standard (previously called Technical Report 1)?
  • What is the difference between a pointer and a reference?
  • What are templates?

C# questions

  • Can you explain the concept of a delegate?
  • What is a partial class?
  • Are you familiar with LINQ expressions?
  • What are generics?
  • What is a nullable primitive type? How is it represented in code?
  • What is a property? How is it different from a member variable?

– danBhentschel