The ability to walk in somebody else's shoes for a while makes you a better developer. Why?
* You acquire the habit of imagining what it's like to use the stuff you develop.
* You have a feel for the daily experience of your colleagues, suppliers, executives and other stakeholders.
These things give you the sort of spidey-sense that lets you function independently. They also give you the ability to enlist other people to get things done.
How can you learn empathy? Like any skill, it takes practice.
--Listen to strangers. The question "what are you doing this afternoon" asked at lunch will usually get an interesting response. Interject "wow" - like sounds to keep them talking.
--Seek opportunities to meet end-users of your stuff. (Ask sales people to take you along on calls if that's appropriate). Observe their work.
--Ask your executives and project managers questions like, "what keeps you awake at night?" And listen to the answers.
--Teach. It doesn't matter whether you teach short courses or get a night job as an adjunct professor at your local CoCo. Your interactions with students will help develop your empathy.
People love to talk about themselves. You can take advantage of that to practice empathy.
Most of what I do can be classified as "work".
Well, the only time you'll get that out of me is when I'm angry.
Most of my weekends involve:
* Reading research papers
* Reviewing other peoples' source code
* Reporting security vulnerabilities to open source projects (usually with a patch)
* Improving these projects: https://github.com/paragonie
I never have any time to watch movies, play video games, or engage in creative hobbies.
You've probably had some bad experiences, but you'd be surprised to know many people are not out there to get you for being different.
Hmmm. Sounds to me like your profession, your hobby, and your passion are all aligned. I hope you know how rare and wonderful that is!
I don't know exactly why the other commenter said "you must be fun at parties," but I'd imagine it's because the parent commenter deflected from talking about things he actually wanted to talk about. Being fun doesn't have much to do with the content of what you talk about. It has more to do with you showing genuine interest and excitement for the things you do. If you don't like watching movies or playing video games, then it's very difficult to have a fun conversation about those things. CiPHPerCoder listed four things he enjoys doing over his weekends. Those topics are definitely not mainstream, but they do overlap with my interests. I would love to have a conversation about those things with him because it also adds to the variety of conversations I get to have.
Sorry, would have responded sooner but HN's rate-limits kicked in.
> If you don't like watching movies or playing video games, then it's very difficult to have a fun conversation about those things.
I do enjoy those activities, but I accepted a lot of responsibility (especially with making secure PHP code-- a feat some infosec folks claim is inherently impossible) and intend to finish what I started. That means missing out on a lot of great movies (Warcraft, Zootopia) and video games (OverWatch) that my friends are all able to enjoy.
Ultimately, I believe the work I'm doing today will make a difference tomorrow. Whether I'll be able to capture any of that value for myself remains to be seen.
But now I try to be as open as is practically reasonable about my interests and hobbies. You'd be surprised how receptive some people can be. And those who react negatively are filtering themselves out of further interaction.
Not all people are looking for their own words echoed back to them. Like the OP who suggested this advice in the beginning, some people are really interested in seeing things from different viewpoints.
(In spite of the stereotype, I'm always surprised to see how few genuine "introverted coders" there actually are in the industry and how unsympathetic the rest are.)
It's OK if you don't want to spend the time to explain the nuance of your personal existence, but do understand that there is nuance in everyones existence. Expecting that the other person you are talking to "won't get it" is just blatant egotism.
Taking time to express what's important to you, and why, can be a very constructive thing for those who want to listen. The OP advocates empathy, and this is where it comes from. In my personal pursuit of empathy, I've had to filter out responses from people like you, and try to see beyond the untruthful statements in an attempt to understand what they are really saying. Shyness is one thing, but a pattern of lies and deceit are indicative of fundamental imbalance.
If you're having a hard time expressing why it's important to you, consider introspection; is it really important to you? If you don't come away from a day, or week, or weekend with something to tout when prompted, I dare say "you're doing it wrong".
I'm certainly not saying that I have something to be proud of every day, but that I'm honest with myself when I don't, and will express to others that I likely accomplished less than them in a given period. No lies necessary, and the other humans around you are given an opportunity to see your similarities, instead of some false iron gate of awesomeness.
Or if I am bustling with joy because the wife and I managed to sneak in an evening of kinky sex between bringing the kids to bed and work on monday. THAT's what I am thinking about and THAT's not what I want to tell you. So I invent some stupid story just so you are satisfied.
It's OK if colleagues which I know well and with whom I have a kind of bond ask things like that. But not as a conversation starter or to create such a bond.
And the list of people who cannot stand questions like that goes on: those with depression for whom every weekend is just a period of grayness, those with social anxiety...
Inventing a story, rather than truthfully explaining that you "enjoyed spending time with your wife and daughters" sounds sick to me.
You have a bond with everyone else already: we are humans. There is no prerequisite.
As someone who identifies with both depression/anxiety and positivity toward my accomplishments, in addition to a definite introversion, I reiterate my last paragraph from above: stop lying to yourself and others. If you had a simple weekend, where is the shame in admitting it?
If it was bad enough that you can't admit it, use that to fuel your development instead of pacifying it.
Isn't that the problem? Weekends are for resting, or doing whatever you want to do, which doesn't have to be work.
But if someone complains they have too much work over the weekend.... well they should do less work then. Use the time for what it is designed for!
I see people doing all of that every weekend in my suburb. Definitely not something you should shy away from sharing.
If all you do is work work then I think you should probbably re-adjust a bit on the weekends or you'll narrow focus too or you're just working too hard. If you're doing side projects, I'm an engineer too, I LOVE to hear about that stuff. It's why I read hackaday and hacker news.
But if it's you trying to train it, the onus is on you to make it not awkward. Because everybody do default to this conversation.
Another tactic is to say "not much, what about you?" People love talking about themselves.
What do I mean? The person answering probably wonders whether his weekend adventures will compare favorably with yours. "I went to Tahoe!" "I caught a pop fly ball in Candlestick Park!" "I stayed home and binge-watched Gilligans Island." "Loser!"
Asking about the future is less competitive. Answers can range from "I'm going over to Sand Hill Road to get my investors to sign off on my IPO papers" to "StoopidCo sends this corrupt XML feed...I have to figure out how to ingest it" to "I'm going home sick, I feel terrible." In each case the answer is about the person speaking, not about you the questioner.
Do you see the difference? It's really important.
You really see the effects in the tech industry, as many of us were drawn to this line of work when we were undersocialized introverts in our teens and 20's. I know I was. I really resented social pressure in all forms, and was always pissed off that everyone else didn't see me for the genius that I thought I was at that age (which I was not, of course, but that belief was the only thing that got me out of bed some mornings). I loved the idea of a job where all that mattered were my technical skills, and never had to interact with other people, not realizing that any engineering job worth having would not fall into this category, if such jobs even existed.
I frequently see people get angry in forums when they think people are arguing with them based on the tone or wording of what they said rather than the content of their post. I frequently see people make comments in forums along the lines of, "99.9% of humanity is just too freaking sensitive and I refuse to change myself to adapt to them." More topically, you will occasionally see politicians or other public figures brush off outrage against some mind-numbingly hateful or stupid remark with excuses like, "I don't have time for political correctness", as if their lack of PC-approved verbiage was the reason people got angry. All of these things are indicators of people who not only don't have empathy but don't even realize what it is. They think empathy is like sympathy, or some other warm and fuzzy lets-share-our-feelings thing that they don't think they need to understand.
But really empathy is just the ability to have at least a shred of intuition for how things look from other people's perspectives. I think of it more as a neurological function than anything else, another high level input that our brains synthesize for us from lots of low level activity that we're not aware of, not unlike sight or hearing. It's a prerequisite for effectively communicating things to other people, and it becomes even more important when the people you are communicating with are predisposed to disagree with whatever you're saying. It's not schmoozing, it's not knowing how to sugar-coat what you say so as to not offend people (although that's often a pleasant side-effect in touchy situations!), it has nothing to do with political correctness, it's not even a social skill- it's literally just having the tiniest sense of how you come across to other people so you can communicate as effectively as possible. It also makes it much, much easier to design software that actually solves problems for other people, and to arrive at the best possible compromises in personal and business dealings. It also will aid in your awareness of problems that might not matter to you, but matter a lot to the people whose problems you want to solve.
Senior devs in each of these types of companies have some skills in common and some that are particular.
The common ones, in my opinion:
* Ability to communicate with non technical folks
* Ability to estimate relatively accurately
* Willingness to do grunt work to raise team productivity
* Ability to work self sufficiently, own a big chunk of work, possibly leading small team
* Knowing when to raise an issue to higher ups
* Willingness and ability to mentor folks more junior
* Knowledge of the general software landscape for your domain, including what is buyable vs requires building
How to acquire?
* Seek mentors
* Always be learning
* Seek out folks outside of your department and learn what problems they face
* Attend conferences, technical meetups, or other online learning opportunities
* Help out
* Focus on solving problems and not on being right
Disclaimer: I have spent some time in larger orgs, but mostly as a contractor so my advice may not be applicable for those.
No good deed goes unpunished. When you step up to be a team player and do that grunt work, you open yourself up to getting more and more of it. Next thing you know you have to stand up for yourself or become a door mat.
* Deal with difficult users or customers
* Write documentation
* Go back and forth between different stakeholders to make sure everybody is on the same page
* Make sure other developers have the right tools and equipment
Depending on the manager he could be doing this but if he doesn't the senior Dev has to do it or the project fails
In healthy environments (and yes, they do exists) good deeds are actually rewarded, not punished.
Furthermore, grunt work can be an excellent opportunity to shine. For example, you can figure out a way to automate it so that the next person who works on it (which may be you again) has to spend only a fraction of the time on it. Things like running reports or generating documents tend to lend themselves really well to automation, and a little programming ability can take you a long way.
So yeah... think twice before turning away grunt work, even if you believe that you may be given more of it in the future if you agree to take it on now.
http://www.daedtech.com/the-gravitational-force-of-wage-labo...
I find that my estimates are generally all over the place and multiple attempts at predicting how much time it will take to complete an assignment don't converge as time passes. Even though I had seen and been given diverse tasks over the course of my work, I can not really pick a previous item of similar magnitude for reference.
In those occasions where I'm asked to provide a WAG to an executive or salesperson, I always multiply my first thought by 150-200%. Maybe even 300% if there's an external stakeholder (3rd party integration, something for a specific client, etc).
Some things that you would want to start focusing on:
1) Figuring out what projects come next, and designing them.
2) Figuring out what your team wants to work on, so you can shape future projects to be exciting to them. (We always have an infinite number of things to do, so you might as well pick the things that are most interesting!)
3) Doing detailed designs, so that work can be parcelled out to people that are gaining experience.
As you might guess, at this point you are doing more than working alone or working on engineering tasks that someone else defined. You are defining the tasks, and are starting to define the bigger projects.
Your individual contributions should be setting the standards for others that work with you. Write that extra test, clean up that documentation, don't launch a new service without monitoring. What you value will become what your team values, by your example.
How to get to this point? Hopefully the more senior members of your team are setting you up for success; allowing you to do some of these tasks until you're good enough to do them without supervision.
Over the long-term though I found grit to be a more useful skill to cultivate. Patience and perseverance sound like cliche, but in the end whether in relationships or life, those count the most.
- Watch All the President's Men and emulate the reporters Woodward and Bernstein. They hustle. That's what I miss among people I work with. If something is not explicitly assigned, cut-and-dried, and easy to follow, they give up. You may not be fired, but good luck making a real dent in the universe, as Steve Jobs used to say (another person to emulate! well, in some ways).
Edit: I do not have grey hair.
The other comments are all relevant and very good, but they seem to overlook one important aspect: the company's attitude. What all those comments have in common is that they assume things work according to Tom DeMarco's book Peopleware. I have learnt on my own experience that they don't. I have had the chance to work with 1)poisonous, 2)negative, 3)defensive (see the psychological meaning), and 4)offensive (... no psychology needed here) senior developers. Some nicer/more experienced than others, no doubts, sometimes also due to the lack of communication skills (English is not everyone's first language, and I do understand it). However, these ones were senior due to the number of years spent in the company OR their age. That's why I think that the companies that value someone's skills (I like to see them like technical skills, IQ and EQ) for their promotions are the minority.
I think if you're in a small company things could be different.
This is a funny comment, since he keeps repeating through the entire book phrases that sound like "you probably won't be able to get this for your team", "you likely never seen it anywhere, but...", "when doing our research, we've seen this. You might doubt it, but trust me, this exist on some places."
Yeah, I know. Of course I meant "things work according to the advises given by the book ..." or something like that. I read the book, and everybody agrees that "it's a great book, but in reality...".
I literally though it was funny. Describing an organization type by the name of the book that claims everywhere that it doesn't exist.
On the contrary, smoke as many cigarettes as you can in a day, have a whole bottle of whiskey every day, only eat fried foods, and sleep on your face. Within just a few months, you should have the look of seniority! It's all about finding shortcuts up the corporate ladder.
When things inevitability go wrong, you'll also be the hero that powers through the weekend hacking a solution together. Be sure not to document or comment this code. It makes your memories critical to the operation of the business.
Eventually everyone else but people like you will move on. You'll be given a bigger say in the org by default AND you'll think exactly like all the other senior engineers. This will make you appear to be good at communication and working in teams since you can all say and do what you were already thinking.
Anyway, a company who puts that person on the phone as one of the first points of contact has serious communication issues. It was an easy pass for me (I already work in a company with broken communication).
I also usually ask "if someone has left the company in the last year" or so. However, they might lie, but most of the time they are not prepared for such a question. Reading micro-expressions (I am trying to learn...!) and the tone of the voice might help you with that, so that you can dig in and put some pressure to get some truth out of it.
That could be removing roadblocks by flushing out designs and specs like other people have mentioned, or finding better processes and practices to make the team more effective. Of course, there is also the proper introduction of new technology or techniques to raise the company forward as well.
* Search IQ - Nobody knows how to do everything in software development off the top of their head, but a major difference between a junior dev and a senior one is knowing what questions to ask and how to find the answers. I didn't used to have a name for this until one of my former mentees told me it's called "search IQ" in China.
* Understanding the big picture - At a junior level, you are generally able to understand your small task in the context of what behavior it should be producing. Senior devs should be able to grok development tasks in the context of the business use cases and within the wider system.
No, I'm not being snarky, so hear me out...
I've met and worked with many developers over the years and lots of them have become very good with technology and user domains, but still have struggled to "crack the digital ceiling". These are brilliant people who have achieved serious things, but are still not recognized by the big decision makers as "senior", whatever that means.
Then there are a select few who always get the big gigs, big money, and big reputations. Why? Because they make money for their customers. There are lots of non-technical skills that help them, but I think the biggest is their ability to separate the signal from the noise and zero in of the most important things to work on and to get them done. It's almost like they have "profitability radar". And this rarely requires any special technical or people skills. All they really have to learn is a good grasp of the technology, a deep understanding of the customer's domain and business, and the ability to get things done through others. And how did they develop them? By good old fashioned grunt work, whether digging into the bowels of the system or getting up off their butts and relentlessly going around finding out whatever they needed to know.
Once you've figured out the best thing(s) to work on to make money, got them onto the decision makers' radar, and found a way to get them done one way or the other, you are no longer a dev or even a senior dev. You're now a digital rainmaker, the most senior dev of all.
Both can effectively communicate with non-technical stakeholders. Product Management, sales, consulting/services, clients, etc. I wouldn't hesitate to include either in a discussion with executives (internal or client) when appropriate.
Both can do any job on the team, including mine (project manager). They might not be comfortable doing it. They might take longer on some tasks. But, if all else fails, I can safely ask either of them to do anything and they'll find a way to get it done.
Both have successfully managed special initiatives (in a "tech lead" role). These typically involve coordinating across teams, so require a higher level of time management and communication than developing for our primary project.
Both have successfully mentored junior developers, interns, or new (but not junior) employees.
And Both have earned the trust and respect of everybody else in our division. They are go-to resources, not only within my team, but across the division.
In my opinion a senior developer is someone who writes software that can be maintained without their presence. That means less clever, impressive code and more boring code that's simple and straightforward to understand that just does what it's supposed to do. It means reproducible deployments. It means tests which are up-to-date and working. It means everything is documented in a way that a junior developer, or even someone non-technical, can get value from.
In short, it means being organised.
I think what lets a developer graduate from one level to the next is realizing that your own knowledge, vision, etc. is limited and not always the right way to go. Being able to put your own desires aside and execute someone else's vision while still providing the benefit of your experience and knowledge when appropriate.
Despite being a senior dev for a while now it's something I sometimes still struggle with finding the balance on.
I don't recommend doing it too often (no-one wants a reputation for being precious or difficult), but used correctly it can be powerful.
To know the landscape and limitations thereof surrounding a product being developed. These skills can be learned formally through school or informally by continual pursuit, as many hackers find themselves doing who come from backgrounds other than hardcore computer science.
* Communication
With stakeholders, the business folk that green-light and also those who manage projects. This one is two part since it takes a good measure of both knowing how to cut through the red tape and get the jobs done, and also how to effectively communicate with them in the language they understand.
* Programming and devops
You need to know common idioms, a common framework or three, and the way web applications are deployed and hosted. If you have programmed a ton of projects over the years you will have seen firsthand enough of the wrong ways of doing things to spot it a mile away and be able to know when something should be refactored, rewritten, or not, and be able to review others code for the same.
I'm deliberately leaving off "people management skills" because I think #3 covers that -- managing the technical output of people is the most important part for managing technical subordinates, which you will likely be at least partially responsible for as a senior dev, even if it is for developers in a mostly flat org.
2) Proactiveness: Seeing issues before they happen, and acting on the right ones when needed.
3) Ask for and giving feedback: Both formal coaching, and informally with peers.
5) Starting with the End in Mind: Understanding why things are being done, and doing things with the end customer in mind.
6) Planning and Estimation: Much harder than it appears
7) Bias in Decision Making: Understanding the flaws in how people think (recency bias, overconfidence, anchoring, etc) and adjusting decision processes to handle them.
1-5 is mostly by practice. There are books that can provide guidance on 6 & 7, though there it's very much practice too.
It's also important to have good mentors every time one steps up in ability.
In your professional evolution you start with simple tasks, learning to accomplish them, first under supervision, then alone. Then you get larger assignments and learn to work without hand-holding. Finally you learn to solve all kinds of problems in your field of expertise with your chosen technology and you get entrusted with making the right decisions and doing the good job of it.
But then at some point it stops mattering what work to do, in what part of the technology stack it is located, or even what technology stack this is. It becomes a matter of simply learning what you need to know to perform the work, doing it, closing this issue and moving on. That's what seniority means (or should mean to provide a base of reference).
This is viewed from the technical side of things of course, and I believe this is what the question implied. Good communication abilities and developed soft skills are essential too but those transform a developer into somebody else to whom the title of a senior developer no longer applies. They're no longer just a developer but a higher-level product.
1. Do good work. 2. Don't be an asshole.
Knowledge of accounting principles is often helpful for in-house developers.
The one thing which in my mind make people juniors well into their 40's is the inability to take responsibility.
- The ability to communicate clearly
- The ability to understand team members with empathy
- A unique penchant for foresight
* Also be able to reach out to other teams to unblock issues.
Perhaps a better question is what non-technical skills do I need to work well in a team (as a senior or junior dev), every developer needs to know how to listen to people with different expierence and teach others about his own, whether he's junior or senior.
But thats really not the point I was trying to make. The point is that no senior dev is hired for or because of those qualities (at least from what I've seen)
- Owning the problem. Don't pass the buck when you see a problem and it's well within your realm to own and fix.
- Ownership and delivery. You have to deliver. You have to remove your own blockers. You have to be realistic about what you're biting off. When you say no, and you should, you need have a reason.
- Be a leader. Make those around you better by thinking of them when you build your system.
http://www.yacoset.com/Home/signs-that-you-re-a-bad-programm...
http://www.yacoset.com/Home/signs-that-you-re-a-good-program...
That includes identifying useful ideas from elsewhere - conferences, magazines, books, hn, etc - then adapting them to make sense on current project, convincing the rest of the team of their fitness, and then leading the rest of the team to understand and learn them. Not a manager, a leader.
For the record, "make sense" is not the same as "cram every shiny v0.1 toy into the next project."
Focus more on skill gaps, and less on titles, and you'll go where you want to go.
You don't need to be an expert but you do need to have a firm grasp of the basics.
https://www.amazon.com/Soft-Skills-software-developers-manua...
Grow old.