I had the honor of asking three of the world’s most famous software engineers six questions.
- Salvatore Sanfilippo is a well-known open-source contributor and creator of Redis and Disque.
- Jon Skeet is the most famous Stack Overflow user, and a senior software engineer at Google.
Question #1: What role has your university degree played in your professional career? Do you think you could become the person you are without a degree?
Jon Skeet: Well, my main degree was in maths, and then I did an MA-equivalent in computer science. I wouldn’t say I’ve used much of the theoretical side in day-to-day programming, but earning a degree is as much about honing how you think as about what you learn.
There are plenty of better programmers than me who don’t have degrees — but I think my time at university helped me a lot as a developer… partly in terms of people I met and things I did outside my official studies. Of course, if I hadn’t gone to university I’d have had a different four years which would no doubt have had other benefits.
Salvatore Sanfilippo: I’ve no university degree, so I’m pretty sure a degree didn’t contributed much to my career :-)
Misko Hevery: My degree is in Computer Engineering which is an equal mix of hardware and software. Typically, with CE, you either design the silicon, boards with chips, or you write low level firmware for those boards.
While at university, I have laid out silicon, then in my internships I designed firmware.
After graduation, I slowly transitioned from drivers, to libraries, to server side code, then databases, and finally to front end development with frameworks such as Angular.
I think having such background gives me a unique perspective to what is going on in the machine. Everything from HTML all the way down to individual ransitiors.
It is hard to say if I use my degree on daily basis. There are times when knowing what is going down in the machine helps, as is the case when trying to understand the performance of your code. But most of the time I draw on my knowledge of programming (which I learned before university) or skills I have learned in workplace.
I would say that having a degree in software is helpful, but not fully required. (The hardware world is different, there a formal education is a lot more valuable / required / essential.)
Software is a great deal about experience and discovery. It is more art than science, and for that reason what matters most in software is just the raw number of hours spent writing code, failing, rewriting, and reflecting.
Something which is driven by the number of hours spent on the problem, rather than a formal education. I think my success can be directly attributed to the number of hours I have spent coding. I have been coding since I was 10 years old, way before my university education. Which means, by now, I have accumulated about 30 years of writing code; and that is the real differentiator.
Question #2: What skill or field of study not directly related to computers, has helped you most as a developer? And what do you wish you knew more about?
Jon Skeet: Simply writing readable text is probably the most important non-computer-specific skill a developer can have. Programming involves communicating with both a computer and with other developers reading your code — I think too many people focus on the former and ignore the latter.
There are lots of things I wish I knew more about. I’m currently learning a huge amount about feminism (and other fights against inequality) — that’s opened my eyes a lot and will continue to do so, I’m sure. I don’t know that it’s helped me as a developer, but it’s helped me as a human being.
Salvatore Sanfilippo: Studying architecture for a couple of years I think gave me a sense of design, and of the sacrifice in the design needed in order to obtain certain goals, in the presence of tensions. I think I applied these ideas later while designing systems.
I wish I knew more about formal methods.
Misko Hevery: Empathy. I don’t think I even knew what the word meant until few years ago. Being socially awkward is almost a right of passage for software developers, but it should not be. And it does not have to be, if we would teach it in school along with literature, math, and sciences.
The reason why empathy is so important is that it is the glue which allows you to work in teams, and there are real limits of what you can achieve as an individual. Being empathetic allows you to build a great team. Empathy is contagious. Having an empathetic team means having a much more productive team.
Question #3: Many people have problems learning something new. How do you learn new things simply and effectively? What do you want to learn next?
Jon Skeet: Try to learn one thing at a time. If you’re learning a new language, work out the context in which that’s going to be simplest to try things out and debug — in many cases that means writing console apps. Any time you introduce a user interface into things, that introduces a lot of complexity which can be overwhelming if you’re not already comfortable with the basics.
As for what I want to learn next… I’m trying to keep up with .NET Core and the tooling around it, as I find that a tremendously exciting opportunity. One of these days I should really learn F#, Ruby or Python properly… but I’ve been saying that for years and not done anything about it, so I’m not expecting to find the time to do it soon…
Salvatore Sanfilippo: What I try to do is to refuse to learn something that is at the same time complex and whose purpose is not clear, or is just justified by a greater level of “organization”, or is considered best practice. If I
need to learn something it requires to make a real big different in my
day to day work. This is my filter.
Similarly I want to learn things that last decades, so I avoid hyped
technologies that are hard to learn as much as possible.
The next thing I want to learn better is how to work better with
threads, especially advanced lock-free data structures and abstraction
layers over the basic threaded model in order to avoid errors and
simplify implementations. I’ve used them a couple of times just for
fun, but I want to understand how to apply lock-free data structures
to real system programming in the best way.
Misko Hevery: Learning new things is hard. It pushes you out of comfort zone, and makes you feel dumb. Admitting that you don’t know something is hard to admit to yourself, and even harder to admit to others. I always tell my kids: Being frustrated is how you know that you are learning.
My secret weapon is realizing that frustration is part of learning and bulldozing through it. What I tell myself is that my future self will not remember the frustration, but will enjoy the fruits for a long time to come.
Question #4: For people who are beginners, what advice would you offer them? Did you compare yourself with other software engineers or programmers who were better than you when you were a beginner?
Jon Skeet: See my previous answer — start simple :) If you’ve got a big problem which will involve learning multiple new concepts, don’t start off trying to write the final code -start with throw-away code which will teach you about one of those concepts at a time.
I’ve compared myself with other engineers before, and will no doubt do so again. Even within topics where I’m supposedly knowledgeable, I can easily point to loads of other people with more expertise. It’s helpful to learn from more experienced engineers, but I think comparing yourself with them in a “trying to be more like them” way is unhelpful.
Salvatore Sanfilippo: My advice for people joining our field is that there is a lot of space to contribute interesting things, even without resorting to crazy ideas. New programmers should not consider them unable to contribute at the top level, our current systems are full of flaws and need a lot of improvements.
I also think that new programmers should try to reinvent the wheel in order to understand very well how things work. Also experimenting with ideas that are considered to be abandoned or too strange to work can be stimulating.
Also to be humble and to try to find the simplest solution that can
address a problem are two things I value a lot.
Misko Hevery: Try, practice, fail early and often, and learn from it. Make your own theories. Try to puzzle a problem through yourself before looking up an answer. A lot of times you will discover that you have a novel solution. Always explore new things. Don’t compare yourself to others, it will only lead to frustration. The grass is greener on the other side, and you only see a facade anyway.
Question #5: Some people think that being busy with a family, will hurt their career. Do you think your work has had an impact on your family life? Do you feel like you have to choose between work and family?
Jon Skeet: I think of it the other way round: that spending too much time on your career can hurt your family life. For me, life outside work is the baseline — some of that is still in software of course, but it’s not paid work.
I try very hard not to define myself by my career. I take pains to make my work/life balance reasonable for both my family and my colleagues. Now that sounds simple, but I’m very privileged to be in a job that I love, working for a company which also takes work/life balance seriously — and my wife also works very flexibly in a career she loves. Not everyone is as fortunate.
Salvatore Sanfilippo: It is definitely hard to be good parents and at the same time to have a demanding work. Honestly I think that overall I’m paying a bit in terms of family and free time what I do in my work. I try to minimize the impact of my work to my family, and I try to don’t work for crazy long hours, but still sometimes I feel that it is not possible to completely detach from the work for a long period, that is something that I used to do years ago.
I think that an approach that can work is to say, I can work these hours every week, no more, and I work these hours at the best of my abilities. However whatever happens will happen and I cannot do more than that. With such an attitude, you can stop working after 8 hours every day and go enjoy life.
Misko Hevery: There are only 24 hours in a day, and it is unreasonable to assume that having a family will not impact what you could achieve. But that is the wrong question. Not having a family is to miss out on a huge source of personal accomplishment. My family brings me a lot of joy. Work and family are on different axis and can’t really be traded one for the other. Having one without the other would leave emptiness in my heart.
Question #6. What is your favorite quote that has had an effect on your life?
Jon Skeet: I don’t think there have been any specific quotes that have had a profound effect. I do like this though: Never attribute to malice that which is adequately explained by stupidity.
Salvatore Sanfilippo: I’m not even sure this quote is correctly attributed to Alan Kay, but “the best way to predict the future is to invent it” is something that had an impact on me in the past.
Misko Hevery: I am not sure if it is a quote, but I subscribe to the idea of leaving things in a better state than I found them.
I hope these questions and answers help you and motivate you to be a better programmer and more successful software engineer. I believe if you want to be a successful person, you have to learn from people who are successful.