Thursday, August 2, 2012

50 characteristics of a great software developer

Belly flop
  1. Passionate; loves computers and programming, takes an interest and thinks about things even outside working hours.
  2. Curious; wants to understand new things, researches unfamiliar terms.
  3. Humble; recognizes that other people are smart and have great ideas and knowledge, respects relationships more than technology.
  4. Creative; sees ways to do things that others don’t see, comes up with better ways of doing things, goes beyond.
  5. Friendly; easy to get along with, does not sabotage or bring down team morale.
  6. Fast learner; can quickly research, understand and use unfamiliar software technologies, tools and languages.
  7. Focus; works towards completion of tasks with minimal distraction, avoids taking tangents.
  8. Comprehension; can make sense of software requirements and understand what it is that needs to be built, able to grasp the “mental model” of the internal structure of a software application.
  9. Logic skills; ability to devise logical solutions for programming problems.
  10. Pragmatic; able to make a value judgement about what is really important, values practical outcomes and getting the job done, avoids gold plating.
  11. Not dogmatic; willing to change their mind and see things from the perspective of someone else, values the intellect of others. Not a jerk.
  12. Workman like; willing to do the drudge work as well as the exciting work.
  13. Thorough; puts in the 10% more needed to do a great job rather than an adequate job.
  14. Intellect; able to grasp very complex computing concepts, able to develop very sophisticated code, able to do “the hard stuff”.
  15. Energy; productive, motivated, strong work ethic, gets a lot of work done in the available working time.
  16. Practices; writes lots of code, especially in the early years.
  17. Persistence; sticks at it, takes the time needed to get something done or to learn something new.
  18. Flexible; adaptable, happy to take new directions, happy to work with new technologies, happy to try new things, happy to change priorities.
  19. Thirst for knowledge; actively self educates, reads and researches, willing to learn from others, always believes there is always much more to learn.
  20. Expert knowledge; has superb knowledge of, and has thoroughly researched the primary programming languages (typically 3 or fewer), object models and frameworks that they do most of their day to day programming with.
  21. Deep knowledge; has an in-depth understanding and experience in some small number (typically fewer than 10) programming languages and related technologies.
  22. Broad knowledge; has passing familiarity with a very wide range of programming languages and related computer technologies.
  23. Ability to write; can string words together to communicate. Client emails, co-worker emails, documentation, emails, proposals, blog posts, tweets.
  24. Knowledge of computer science fundamentals; object oriented programming, design patterns, algorithms and data structures, how computers work at a low level, hardware, operating systems, networking, databases & much more stuff.
  25. Verbal communication; able to explain their own thought process, can explain complex concepts, can participate in discussions with team members, can communicate with customers/users and other non technical people.
  26. User oriented; can empathise with users, understands where the users are coming from and what is most important to them.
  27. Software design and architecture; can design class structures, can design API’s, can design subsystems within an application, or can design entire application architectures.
  28. Quality oriented; understands software testing, writes tests for their code where appropriate, understands the concept of test driven development, meets organisational expectations for testing & quality, feels satisfied by a job well done.
  29. Balances coding priorities; knows when code should be written primarily for robustness, maintainability, reusability, speed of development, execution performance, scalability, security, polish, presentation, usability or some other factor.
  30. Problem solving; knows how to attack a problem and has the tenacity to solve even very hard problems, uses appropriate debugging tools.
  31. Development tools; understands their development tools, compiler/IDE and knows how to get the most out of them.
  32. Seeks simplicity; understands the danger in complexity, prefers simple solutions.
  33. Interested in the field; Knowledge of the industry, trends, directions, history.
  34. Avoids re-inventing the wheel; able to look at a problem, analyse it, work out what class of problems it comes from, can find patterns, libraries, algorithms, data structures or other pre-existing solutions that might fit the problem well and reduce the need to write code.
  35. Honest; can admit mistakes, unafraid to admit they don’t know something.
  36. Detail oriented; pays close attention. Avoids missing things, not sloppy or half-baked.
  37. Understands the lifecycle of software development; the roles played by developers and other people in that process.
  38. Manages own workload; able to prioritise their own tasks, willing to adapt to change.
  39. Cares about maintainability.
  40. Uses source control.
  41. Appreciates peer review; does not feel threatened or insulted by peer feedback.
  42. Groks; is able to read source code and learn what it is doing.
  43. Understands performance; able to optimise and write fast code when appropriate, knows how to avoid common performance problems.
  44. Writes clean code; readable, well formatted, appropriately commented code.
  45. Understands requirements specifications; able to make sense of software requirements, knows how to resolve questions and ambiguities, understands the relationship between requirements and testing.
  46. Follows coding standards; where there is such an expectation.
  47. Wants to be working on this project, at this company; a programmer is unlikely to do a great job if they are working on a project they don’t enjoy, or working at a company they don’t like.
  48. Strong research skills; good at ferreting out information: digging through documentation, searching the web, reading reference guides, release notes, discussion forums, mailing lists. Knows how to find answers.
  49. This slot reserved for suggestions - anything I’ve missed?
  50. Goto 49.

No comments:

Post a Comment