Top Dozen Qualities

software_developmentThis past week I read a couple articles about what hiring managers are looking for. Having co-owned and managed a software development business for over a decade and worked for small, medium and large size companies, encouraged me to write this post.

First I am going to list what I consider the top dozen desirable qualities on engineers. Please note that most (if not all) items in the following list (in alphabetical order) would apply to different types of technically related jobs.

Ability
Commitment
Communication Skills
Cooperation
Criticism
Dedication
Education
Experience
Intelligence
Knowledge
Passion
Perfectionism

Let’s briefly (one could easily write an entire book on each entry) discuss each one. We should then be able to sort them in order of importance.love_what_you_do

Ability                                Technical ability encompasses the skills needed in order to apply knowledge to accomplish computer-related, engineering, mathematical, and scientific or duties, as well as other related tasks. Contrary to what many people might believe engineering ability does not exist in a vacuum. I do not follow sports. When I was growing up, I tried different sports. Soccer involved too much physical contact and speed. Basketball had less physical contact but required some height and of course a lot of speed. I then tried martial arts and crew rowing. I enjoyed martial arts to the point that with a couple friends we opened a school. That said; my sport of choice became crew rowing. I developed the ability and strength through dedication and training. After six years I became the captain and my team won the Peruvian and a South American championships.  In software development an individual needs to have the ability to understand what is needed, needs to be able to describe it and translate it to machine code using an adequate programming language.

In my case I have learned and use in different projects a diverse set of main stream programming languages (e.g., C, C++, C#, FORTRAN, BASIC, Java, JavaScript, Pascal, PL1, Python, and VB). Some languages are very similar to others and have enough differences that tend to make them the best choice for different projects and / or different parts of them. I constantly read and take courses on the currently used programming languages to learn details that I might have missed or not use and new features.

Commitment                 The Oxford Dictionaries define commitment as: The state or quality of being dedicated to a cause, activity, etc. This definition applies to the word itself. A team member should be committed to the success of the project, the team, the company and their customers. This is a quality hard to quantify by any test, resume or interviews.

When I was growing up and into my early twenties, I heard my mother (R.I.P.) refer to her marriage as “being committed to it”. I had and still today I have a bad feeling when someone refers to their work or relationships as commitments. It is important to be committed to tasks and relationships as long as they provide mutual satisfaction. Just being committed to a project or team by making an act of presence does not make the team more productive or increases the quality of the product being developed.

That said, every time that I have been part of an organization I have been committed to it. Being a morning person I tend to start work early and tend to leave the office after the end of the work day. In many occasions I stop by work early morning on weekends in order to be available to my family later in the day after they are up and had a chance to eat breakfast :o)

Communication Skills                      This one is also quite interesting. Communication skills are the ability to convey or share ideas effectively. In engineering it is very important to have verbal and most important written skills. This is a big one for all engineers and especially for me. Talking is OK, but putting expressing your thoughts on paper with a combination of diagrams (i.e., UML) and words is a lot more important. My parents were born in Italy. They moved to Peru when they were young adults. When I was born, at home, we spoke Italian. When I started kindergarten at age four, at home we completely switched to Spanish and at school we could only speak English. My sisters attended a French speaking K-12 school. While in college, I took for a few years of French. I have spent over 2/3 of my life in the USA. Since my wife and I arrived we have only spoken in English. Because of this background, my wife and I have an accent that is very hard to determine it origin. Now and then I might use a word incorrectly when I speak, but when I write technical materials which I always pay attention to the words and diagrams.

When someone says to start coding before documenting, I get shocked. Most people would never embark on a journey without a plan. For example, net workday, try getting in your vehicle and start driving hopping that you will accidentally reach your office. Many programmers tend to start coding before having a plan. How can a person find out if you are dealing with such type of individual during an interview?

Cooperation                   To act jointly; working together towards the same end. This is another skill hard to determine in a short period of time. If you ask most people, especially during a job interview, chances are you will get a positive answer. The problem is how can you get that from an individual or from the possible references they provide? That is the main reason why most technical companies no longer ask for references because they are a waste of time.

Cooperation to me is expressed by individuals in different forms. A daily status meeting (e.g., in Agile) should discuss progress, new tasks and problems. If a team member has the time to take care of their current tasks then they should volunteer to help with ideas or time to help out someone in need. If a team member runs across an issue with the design or implementation, then it should be made known (constructive criticism) for the team members to make the necessary changes. I have experienced so many times people that just want to do their jobs and do not care for the success of others or the project itself.  That is not the type of person you want on your team or company. So how do you find out if a person likes and cooperates with team members

Criticism                            Referred to the ability to accept positive criticism in order to address issues as soon as they are brought up. Changing direction, rewriting a method, function, application, sub system, system is very expensive when not done at an early stage in development. Many engineers ignore completely positive criticism leading to failure of projects.

No one is perfect. Each time I find out someone has an issue with something that I have been involved with, I tend to spend the time looking into it to determine if the problem exists and if I can do something to address it or provide additional information so if the issue recurs, it would be easier to detect and resolve.

For example, sometimes you have customers or Quality Assurance engineers that are testing a system that you architected, designed, implemented and conducted white box module testing. If an issue shows up, then an engineer should look into it if it is something that could be related to her past work. If I had nothing to do with the implementation of a GUI and the issue is related to validation of arguments, then it is clear that I will have no business in looking into it. Is this always the case? Well, if incorrect arguments collected by the GUI are passed to an API that I designed, implemented and tested, then it would make sense for me to check that at invocation time the arguments are properly checked, that the issue is logged into a file and that the information has a path to ripple to the user / customer / technical support specialist so it can be addressed as fast as possible. Acceptance of software depends on how happy and effective users are. When the software is not solid, chances for it to become a successful product diminish.

Dedication                       The quality of being devoted dedicated or committed to a task or purpose. This quality can easily become sword-of-two edges. It is a positive quality for an engineer to be dedicated to her work, but if the task, module, method is not correct; an individual should be able to realize it and consider different architecture, design and implementation.

A team member needs to be dedicated to the success of the customer, product, the team and company. Software development is primarily a mental activity. There are techniques, practices and tools that help convert some aspects to routines. Keep in mind that “There are no Silver Bullets”.

During my professional life, I have seen team members that they hand their work as soon as the code is completed not spending time in validation and testing. Some individuals keep their IDE open until the end of the day to keep happy team leaders and managers. I have seen engineers sandbag projects because they want the project to be delayed and not move to the next stage in the project or move to a new one.

In a large company, I had the opportunity to interview a person that came from a top school and had an advanced degree. His field of study and qualifications were no match for the type of work we did in the group or the company. After some worming up he mentioned that we wanted to put in his 30-years of service and retire comfortably. The manager of the laboratory was well known for only recognizing formal education as indications of accomplishments or success, disregarding what the person contributed to a project.

educated_peopleEducation                         This is also a very interesting item to evaluate. There are people who believe that if you have an advanced degree from a top notch school, then you are able to perform all tasks perfectly.

I received my BS and MS while I lived in Peru. I had very good grades and got a scholarship to the US. I attended Cornell University but due to external events had to leave and move on with my life. While working for a Fortune 500 company, I remotely attended classes at the University of Minnesota. I met a professor who became my advisor. During that process I started my own business and my advisor decided to move west in search for warmer weather (I do not blame him).

On the other hand, read books and take courses on different technical subjects in order to improve on what I know and acquire new skills. As we all know, user interfaces were on character base terminal. With time graphical user interfaces became popular. With the advent of the web, HTML interfaces represent the current state of the art. When working on small applications a software developer will have to take care of all development aspects which tend to include a UI.

It used to be that development was sequential and procedural. Now a day, most designs and implementations are object oriented. With time, I learned and became proficient in several object oriented languages. In the past couple years; there has been a lot of emphasis put on big data and specially on machine learning. Python and TensorFlow are becoming extremely popular with most companies that want to convert their data into knowledge and eventually revenue. I have become quite proficient in Python and am in the process of doing the same with TensorFlow (Google, please offer a native version for the Window platform).

Given that statistics show that about 40% of college graduates in the US never read a single book after they graduate from college, it seems that education is not given much emphasis in the workplace. I completely disagree. By knowing (studding) and having experience with different techniques, your architectures, designs and implementation will turn out to be of higher quality.

Experience                      The totality of characteristics, both past and present, that makes up the particular quality of a person. This is also a very interesting quality to evaluate. This is something extremely important which most people tend to ignore. The idea of knowledge of some popular toolkit and / or programming language is all that should be considered. It is great that an individual with no Computer Science formal education is able to learn a toolkit and a programming language in a few months. That is equivalent to a healthcare nurse who learns and develops a few skills (i.e., apply injections, taking blood pressure) and decides to operate on a patient. In case of a nurse versus a physician most (if not all) people will understand the difference. In software development few do.

I want to make clear, that time is not equivalent to experience. A nurse with decades of experience taking care of patients will never be equivalent to a trained physician out of school.

Intelligence                    As defined by a couple dictionaries are the ability to acquire and apply knowledge and skills; or the capacity for understanding; ability to perceive and comprehend meaning. This is a touchy point. People are not required to present an IQ score. So how do we measure who has the necessary intelligence to be able to handle the task at hand? For this I would answer that unless the job requires some unique research that needs highly intelligent individuals with high education in the subject matter, most (never say all) people with average intelligence should be able to handle most jobs.

Keep in mind that if a person is too intelligent for the job, chances are they will not care for the tasks at hand and will create more problems than what they solve.

Knowledge                      Facts, information, and skills acquired by a person through experience and / or education; the theoretical and / or practical understanding of a subject. Knowledge in software development is in to domains. The individual should be able to develop software in general. Unless one sees hundreds of thousands of lines produced by an individual and their associated documentation, such information is quite difficult to gather. The other aspect of knowledge, relates to the application domain. If the project has to do with banking, hardware interfaces, graphics, real-time systems, etc. knowledge on such fields should be taken into account. That said; domain knowledge tends to be gained in a few months as long as the individual has motivation to learn. Most programmers tend to avoid the domain of the application because if it is not general enough (e.g., business, on-line store) they tend to keep themselves outside by claiming they only develop the software. The domain logic is only for the matter experts, which is not the correct approach.passionate people

Passion                               Defined as a strong feeling or a strong belief. It is very difficult (not to say impossible) to chat with an individual for a few minutes and determine if she is a passionate person. Passion for something or another is something that few individuals have. Passionate people learn what needs to be learned in computer science or the domain of the application. They review and change their software and documentation to make it better. They care when an issue is found and try to help resolve it if it falls in their realm of responsibility. Passionate people put emphasis on what is important to the success of a project.

Perfectionism               Defined as the act of perfecting or the state or quality of being perfect. This is an interesting quality to look for. All projects need to aim for perfection knowing that with limited resources (time and money) the perfect state will never be achieved.  The problem is that most individuals believe that since perfection is not achievable, they work is mediocre at best.

If you do not believe me, take a look at web sites of many different organizations / companies (e.g., airlines, healthcare, store fronts, weather. utilities companies, etc). Most websites tend to work when the user follows some very specific path (logic). Real life is not that simple. As soon as one diverts for some reason or another, you end up using the phone and calling customer service or going to a different web site (if possible). That said; you can find on-line the requirements and loops that candidates need to jump to land a job in such organizations.

Most of us have heard the saying “analysis paralysis” when referring to software engineering. In an attempt to architect and / or design the perfect product, too much time is put up front in getting things close to perfection. The waterfall model is based on a sequential approach. The main issue with waterfall is that when the actual product is completed, customer changes and new technologies tend to be left out making the product less than perfect. On the other side of the coin, not thinking and starting to code with no documentation on the first day or a project seems to lead to disaster and low quality products that take longer than expected. Agile is a methodology that if not properly managed tends to produce low quality products.

So what do we do? Aim high but keep customer and project expectations realistic. Remember there are “no silver bullets” in software development.

steve_jobsAs discussed, here is the order in which I consider the top dozen skills for engineering team members:

Passion for your work
Experience in software development
Ability to address the unknown
Communication Skills (specially documentation)
Cooperation within the team and customers
Accept and act on positive Criticism
Average Intelligence
Formal Education
Computer Science and Software Engineering Knowledge
Dedication to the product, project and team
Commitment to success
Aim for Perfection

I would love to hear your comments (and / or criticisms :o).

John

Leave a Reply

Your email address will not be published. Required fields are marked *