People, Process and Products: Can Software Be Engineered?

Programming is the art of Function, Form, Logic, and Balance.

Utility of the working program provides Function.

Organization and good abstraction creates Form.

The correctness is established with Logic.

Limitations and tradeoffs require harmonious Balance.

-by Jeremy Kun


What separates good hackers from great ones? Is it all about coding skills? Are great hackers coding ninjas who can implement dijkstra algorithm while blindfolded? What does top talent look like? or if you are Google, and you have the freedom to (almost) hire anyone, who would you hire? I think these are interesting questions.

Everyone knows that in any field you have to be really good at what you do to get to the top. But is specialisation enough for top companies to hire you? Is the equation that simple?

For starters, there are some obvious qualities:

  • Be good at systematic debugging
  • Ability to break down large problems, architect solutions
  • Comfortable Learning on the fly
  • Good Communicator
  • Good intuition

But dig deeper and it's more complicated than that.

One way to think about improving as a hacker(maker) is to think in terms of the value that you can produce for a company that you maybe working for. The value that you can produce may depend on the combination of the following factors:

  • Your knowledge, which is the useful information you have that you can use to produce value of some sort(I would like to avoid the word ‘skill’, which is I think limited in scope).
  • Your wisdom (which mostly comes from knowing what not do)
  • Your soft skills(communication, dealing with other people, coming up with new ideas that the company can potentially work and sell in the future).

As programmers we can ask ourselves, What are some of the practical steps that the experienced guy did so that he can now able produce more value?

Two things come to mind: ‘Doing more Practice and acquiring the right Knowledge/Wisdom’.If you are programmer/hacker, you should have the plan to improve yourself daily. Simply passing time working on your projects that your company assigns you, is not going to help the cause of learning/improving that much. You have to do it in your own time. This is because, the company cannot simply provide you the amount of exposure needed to grow exponentially (yes with skills like programming that involve mental activities, its possible to grow exponentially) in a short period of time.

If you are a programmer, having a mix of engineering and artistic characteristics can help. Programming is mostly the art of solving problems by breaking them down into smaller pieces (and since there can sometimes be infinitely possible ways to do that…we use the word ‘art’, when describing the processes).

Here are some of the characteristics that Good programmers have:

1) Good problem-solving skills.

2) Good practical skills. (i.e not afraid to your hands dirty).

3) Appreciation of theoretical (computer)Science and mathematics.

4) A good amount of discipline so that one can persist while working on tough/large problems that require patience and time.

Below I have compiled some thoughts by famous people in our industry that may help guide you to become a well-rounded individual.

T— Shaped individuals

Let's start with the general concept of ‘T’ — Shaped individuals which is relatively well known. It states:

“The concept of T-shaped skills, or T-shaped persons is a metaphor used in job recruitment to describe the abilities of persons in the workforce. The vertical bar on the T represents the depth of related skills and expertise in a single field, whereas the horizontal bar is the ability to collaborate across disciplines with experts in other areas and to apply knowledge in areas of expertise other than one’s own.”

Over the years, I came to realize that my best work has always involved subjects that interested me, or — even better — subjects about which I’ve become interested, and even passionate about, through the very process of doing design work. I believe I’m still passionate about graphic design. But the great thing about graphic design is that it is almost always about something else. Corporate law. Professional football. Art. Politics. Robert Wilson. And if I can’t get excited about whatever that something else is, I really have trouble doing a good work as a designer. To me, the conclusion is inexcapable: the more things you’re interested in, the better your work will be. — Design Observer article

Consider this, Leonardo da Vinci was famous for his paintings. But he wasn’t just a painter, he was also a sculptor, architect, musician, mathematician, engineer, inventor, anatomist, geologist, cartographer ,botanist, and a writer. He was undoubtedly a genius. But I think it wasn't his genius rather his curiosity that must have drived him to learn about all those fields. So yes, T-shaped philosophy might have a grain of truth in it. But up-till this point the discussion has been more philosophical rather than logical. I think Steve Job’s take on this topic might sound a bit more logical.

Try to gain a set diverse experiences

Creativity is just connecting things. When you ask creative people how they did something, they feel a little guilty because they didn’t really do it, they just saw something. It seemed obvious to them after a while. That’s because they were able to connect experiences they’ve had and synthesize new things. And the reason they were able to do that was that they’ve had more experiences or they have thought more about their experiences than other people.
Unfortunately, that’s too rare a commodity. A lot of people in our industry haven’t had very diverse experiences. So they don’t have enough dots to connect, and they end up with very linear solutions without a broad perspective on the problem. The broader one’s understanding of the human experience, the better design we will have. — Steve Jobs

This makes more sense. But again is curiosity and having more diverse experiences enough to to put you in the top talent pool?

adding on to the discussion. Here are some interesting remarks by paul graham and bill gates on what separates great engineers/hackers from good ones:

Ability to Empathise

Like painting, most software is intended for a human audience. And so hackers, like painters, must have empathy to do really great work. You have to be able to see things from the user’s point of view.
When I was a kid I was always being told to look at things from someone else’s point of view. What this always meant in practice was to do what someone else wanted, instead of what I wanted. This of course gave empathy a bad name, and I made a point of not cultivating it.
Boy, was I wrong. It turns out that looking at things from other people’s point of view is practically the secret of success. It doesn’t necessarily mean being self-sacrificing. Far from it. Understanding how someone else sees things doesn’t imply that you’ll act in his interest; in some situations— in war, for example— you want to do exactly the opposite.
Most makers make things for a human audience. And to engage an audience you have to understand what they need. Nearly all the greatest paintings are paintings of people, for example, because people are what people are interested in.
Empathy is probably the single most important difference between a good hacker and a great one. Some hackers are quite smart, but when it comes to empathy are practically solipsists. It’s hard for such people to design great software [5], because they can’t see things from the user’s point of view.
One way to tell how good people are at empathy is to watch them explain a technical question to someone without a technical background. We probably all know people who, though otherwise smart, are just comically bad at this. If someone asks them at a dinner party what a programming language is, they’ll say something like ``Oh, a high-level language is what the compiler uses as input to generate object code.’’ High-level language? Compiler? Object code? Someone who doesn’t know what a programming language is obviously doesn’t know what these things are, either. — Paul Graham:

His whole article is worth reading reference: http://paulgraham.com/gh.html

People Skills

Bill Gates’s on considering your job as an exercise in people management and people dynamics, as well as the basic engineering skills:

The nature of these jobs is not just closing your door and doing coding, and it’s easy to get that fact out. The greatest missing skill is somebody who’s both good at understanding the engineering and who has good relationships with the hard-core engineers, and bridges that to working with the customers and the marketing and things like that. And so that sort of engineering management career track, even amongst all the people we have, we still fall short of finding people who want to do that, and so we often have to push people into it.
I’d love to have people who come to these jobs wanting to think of it as an exercise in people management and people dynamics, as well as the basic engineering skills. That would be absolutely amazing.
And we can promise those people within two years of starting that career most of what they’re doing won’t be coding, because there are many career paths, say, within that Microsoft Office group where you’re part of creating this amazing product, you get to see how people use it, you get to then spend two years, build another version, and really change the productivity in this very deep way, take some big bets on what you’re doing and do some things that are just responsive to what that customer wants.

and if this hasn’t made things complicated yet, here is what we know about Google’s approach of hiring(Taken From Lifehacker articles):

“There are five hiring attributes we have across the company,” explained Bock. “If it’s a technical role, we assess your coding ability, and half the roles in the company are technical roles. For every job, though, the No. 1 thing we look for is general cognitive ability, and it’s not I.Q. It’s learning ability. It’s the ability to process on the fly. It’s the ability to pull together disparate bits of information. We assess that using structured behavioral interviews that we validate to make sure they’re predictive.”
The second, he added, “is leadership — in particular emergent leadership as opposed to traditional leadership. Traditional leadership is, were you president of the chess club? Were you vice president of sales? How quickly did you get there? We don’t care. What we care about is, when faced with a problem and you’re a member of a team, do you, at the appropriate time, step in and lead. And just as critically, do you step back and stop leading, do you let someone else? Because what’s critical to be an effective leader in this environment is you have to be willing to relinquish power.”

But why go through this pain and suffering ? I think Jessica McKellar in her talk “Breaking The Rules”, PyBay2016 summarised it well:

“Programming changes the way you think about and debug and interact with the world. Programers master a system they know they can change.
Everything important and worth fighting for is a system, even if nobody told you the rules or that you can change them.

Learn About abstractions:

Abstractions is a beautiful idea in computer science that lets us manage all the inherent complexity:

“People who discover the power and beauty of high-level, abstract ideas often make the mistake of believing that concrete ideas at lower levels are relatively worthless and might as well be forgotten. (…) on the contrary, the best computer scientists are thoroughly grounded in basic concepts of how computers actually work, and indeed that the essence of computer science is an ability to understand many levels of abstraction simultaneously”.

Similarly, the principle of separation of concerns(SOC) first coined by Edsger W. Dijkstra in his 1974 paper “On the role of scientific thought” :

Let me try to explain to you, what to my taste is characteristic for all intelligent thinking. It is, that one is willing to study in depth an aspect of one’s subject matter in isolation for the sake of its own consistency, all the time knowing that one is occupying oneself only with one of the aspects. We know that a program must be correct and we can study it from that viewpoint only; we also know that it should be efficient and we can study its efficiency on another day, so to speak. In another mood we may ask ourselves whether, and if so: why, the program is desirable. But nothing is gained — on the contrary! — by tackling these various aspects simultaneously. It is what I sometimes have called “the separation of concerns”, which, even if not perfectly possible, is yet the only available technique for effective ordering of one’s thoughts, that I know of. This is what I mean by “focusing one’s attention upon some aspect”: it does not mean ignoring the other aspects, it is just doing justice to the fact that from this aspect’s point of view, the other is irrelevant. It is being one- and multiple-track minded simultaneously.

To Summarize, the important lessons that I think we can take away from the above discussion/excerpts are:

  1. reading lots of code, solving lots of hard problems and generally putting in lots of hours for starters.
  2. Have a blog and a public portfolio
  3. Then Being Curious about everything. (“I have no special talent. I am only passionately curious. — Albert Einstein.)
  4. Always be willing to get out of your comfort zone and try out new things. Such experiences accumulated over time will become dots that you connect in future to build other great stuff.
  5. Learn to put away the shyness and lead when you need to(which often times doesn’t mean mean giving orders rather has to do with coming up with a plan/strategy to tackle the problem in hand so that your team can continue to move forward).
  6. Learn to Market your ideas/thoughts by improving your communication. If you do it well, people will join you. Think of your team/company as a connected network. The corporate hierarchies defined by the companies often times come in the path of creativity. If you think something can be improved, then speak-up and you’ll notice that most people will listen, if you sound convincing.
  7. If it is possible to make yourself into a great hacker, the way to do it may be to make the following deal with yourself: you never have to work on boring projects (unless your family will starve otherwise), and in return, you’ll never allow yourself to do a half-assed job. All the great hackers I know seem to have made that deal, though perhaps none of them had any choice in the matter.
  8. Taking a look at other people’s work.
  9. Practicing more.
‘If people knew how hard I had to work to gain my mastery, it would not seem so wonderful at all. ~ Michelangelo Quotes )

10. Getting your work critiqued.

Lastly, it is about realizing that most of your work will suck initially. But if you keep on going, you will one day get to the point where you can build something that you can be really proud of(and that is all that matters).

Having knowledge of just ‘programming’ in ‘your favorite’ language is not enough. Here are some points to ensure success in a practical world.

Build a solid foundation, if you don’t have one its never too late, to build one. If you think you have it, continue to strengthen it by revisiting and not forgetting the fundamentals. By solid foundation I mean learn about the fundamentals. Fundamentals are those principles that have stood the test of time(e.g if you are a programmer, becoming good at algorithm design is a good bet.) or fundamentals are the base layers of the many multiple layers of abstractions that programmers deal with everyday.

People who discover the power and beauty of high-level, abstract ideas often make the mistake of believing that concrete ideas at lower levels are relatively worthless and might as well be forgotten. (…) on the contrary, the best computer scientists are thoroughly grounded in basic concepts of how computers actually work, and indeed that the essence of computer science is an ability to understand many levels of abstraction simultaneously” ~DON KNUTH

All of it requires a tremendous amount of time, effort, and patience. You have to have a love for the game.

Be original and find your inner voice. The rest will follow.

If you want more inspiration and tips, I recommend watching this fantastic talk by Jessica Mckellar https://vimeo.com/71763919.

“Nobody tells this to people who are beginners, I wish someone told me. All of us who do creative work, we get into it because we have good taste. But there is this gap. For the first couple years you make stuff, it’s just not that good. It’s trying to be good, it has potential, but it’s not. But your taste, the thing that got you into the game, is still killer. And your taste is why your work disappoints you. A lot of people never get past this phase, they quit. Most people I know who do interesting, creative work went through years of this. We know our work doesn’t have this special thing that we want it to have. We all go through this. And if you are just starting out or you are still in this phase, you gotta know its normal and the most important thing you can do is do a lot of work. Put yourself on a deadline so that every week you will finish one story. It is only by going through a volume of work that you will close that gap, and your work will be as good as your ambitions. And I took longer to figure out how to do this than anyone I’ve ever met. It’s gonna take awhile. It’s normal to take awhile. You’ve just gotta fight your way through.”― Ira Glass

We end with this:

“Let me try to explain to you, what to my taste is characteristic for all
intelligent thinking. It is, that one is willing to study in depth an aspect
of one’s subject matter in isolation for the sake of its own consistency,
all the time knowing that one is occupying oneself only with one of
the aspects… It is what I sometimes have called “the separation of
concerns”, which, even if not perfectly possible, is yet the only
available technique for effective ordering of one’s thoughts, that I
know of.”

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

read more:

How to become a Hacker by Eric. S. Raymond:

The Art of programming

http://www.quora.com/Software-Engineering/What-distinguishes-a-good-software-engineer-from-a-great-one

http://www.quora.com/What-are-the-attributes-that-make-a-great-programmer

How to feel engaged at work: a software engineer's guide

references:

http://blog.codinghorror.com/how-to-become-a-better-programmer-by-not-programming/

http://lifehacker.com/the-most-valuable-traits-in-a-potential-employee-accor-1551055279

http://lifehacker.com/improve-your-resume-with-this-simple-formula-recommende-1566107526

http://www.paulgraham.com/hp.html

http://archive.wired.com/wired/archive/4.02/jobs_pr.html