CIO vs CTO

One of the questions I always feel like speaking is “what’s the difference between a CIO and a CTO?”
Here is a very good small info which explains....
First.. what they have in common:
In both jobs, a key role is helping technologists understand what the business needs and helping the business understand what the technology can do for them.
Both roles require a strong technologist with a strong grasp of business (kind of a corollary to the last point, but slightly different).
Both should be strategic thinkers.
Both should be excellent leaders.
Now for their differences:
CTO is seen as primarily focused on the top line while the CIO is primarily focused on the bottom line. There’s some cross over, but I think this is a valid distinction.
A CTO is primarily concerned with external products and customers while a CIO is primarily concerned with running the business (internal products and customers).
In an ideal world, the CTO runs the product development organization while the CIO runs the IT organization.
If you have to choose, being a strong technologist is more important for the CTO, while being a good manager is more important for the CIO.
A CIO has to be operational and understand how to build repeatable processes, reliable systems, and the organization to run them. A CTO doesn’t necessarily have to have these skill if backed up by a strong operational person in the role of CIO.
A large technology oriented company (more than a few hundred employees) should have both. There’s too much to do for one person and the thinking can be very different. One of the big problems at Excite\@Home was they never had someone at the “C” level who was looking internally. “IT” was a division (not even a VP slot) inside the larger technology organization. There were four levesl between this director and the CEO. The result was real chaos in the internal systems and operations areas. The CTO was a brilliant technologist, but not very “operational” and consequently, repeatable processes were hard to find.

10 commandments for creating good code

1.- DRY: Don’t repeat yourself.

DRY is usually the easiest principle to understand, but it is quite harder to apply. It means that when finding similar code in two or more places, we should abstract them into a new method and change the previous code fragments so they will now call the new method with the appropriate parameters.

DRY is maybe the most universal coding principle, I have never found a developer who would argue that repeating code is good, but, I have found developers that forget about this principle when coding unit tests, as an example: imagine that you have changed the interface of a class which had lots of unit tests, if you haven’t used DRY, you will have to manually change the call to this class interface to match the new signatures to each test case.

2.- Write short methods.

There are three very good reasons for writing short methods.

  1. Your code will be easier to read.
  2. Your code will be easier to reuse (short methods are likely to produce loose coupling).
  3. Your code will be easier to test.

3.- Use good names for your classes, methods and variables.

There is nothing nicer than using some other developer code and not having to read its documentation because the names of the classes and the methods are telling us everything, so, make everyone’s life easier and take this approach, expend always a few seconds before naming any element in your code.

4.- Assign the right responsibility to each class.

One class, one responsibility, that will sound familiar to those who know about the SOLID principles, but not any responsibility, the right responsibility, so if we have the class Customer, we won’t assign to it the responsibility to create a new sales action, we will just assign it the responsibility to handle all the data related with a customer.

5.- Keep your code organized.

This organization is at two levels.

  • Physical organization: Whatever the structure you are using, packages, namespaces, folders… Organize your classes in such a way that is easy and intuitive to find where the code is stored.
  • Logical organization: Whatever belongs logically together should have access to each other members, but what belongs to a different logic structure has to access them by an interface. These logic groups are commonly implemented as layers, services…

6.- Create lots of unit tests.

The most tests you have, the better, they are our safety net for all the changes we will have to perform in the code in the future.

7.- Refactor often and sooner.

Software development is a continuous discovery process, in order to keep up to date with good code that matches the new/changing requirements is essential to refactor the code as we go. As this is a risky task there are 2 main preconditions to avoid entering new bugs into the system.

  1. Have lots of unit tests.
  2. Do small refactor steps at a time. In software development there are very few things more annoying than start refactoring 2000 lines of code to after 3 hours of work realize that is necessary to roll back to the original version because now nothing works and the track of which change is causing the problem is lost.

8.- Comments are evil.

This particular one is a bit controversial, most of us were taught that comments are good, and actually it’s better to have a comment in an obscure piece of code than just having the code by itself, what this point means is that: even better than having a comment for an obscure piece of code is to not to have that code at all, just refactor it until is a nice and readable piece of code. [EDIT] Please read this other post for a better explanation of what “comments are evil” means.

9.- Code to an interface, not to an implementation.

This is a classic one, coding to an interface will free us from the implementation details, we just define a contract and rely on calling the defined operations on the contract, expecting that the actual implementation will be passed to our code or decided at runtime.

10.- Have code reviews.

We all make mistakes, and there’s nothing better than asking some other person to have a quick and informal review in our code to find them, in order to make the reviews,  it’s better not to wait until the code is completed, it’s better to ask for reviews whenever some important part of the code has been completed or when a few days have passed from the previous review.

Written by Alberto G Posted in Software Development Theory