What would you like your software developers to learn?
As a manager, what would you like the software developers under your management to learn? This might be knowledge of some specific technology, some software engineering skill, some other skill or knowledge, or what?
Your answer doesn't have to apply to all of your developers. Pick something that will make a noticeable difference in your organization's effectiveness. And please be as specific as possible.
Answers (38)
Design patterns.
With those applied, I believe, the product's quality and speed of development increase dramatically.
Links:
To write as concisely and as elegantly for a human audience as they do for their computer audience.
To fail loudly, just as they must teach their computers to report errors.
Victoria D
Consultant // Commercial RE Appraiser | LION strategiesandmarkets at gmail.com
Best Answers in: Positioning (1)
That the end users are humans and have human, practical needs. Like simplicity, ease of use, and speed.
Clarification added 6 months ago:
THE BEST software, most successful, that I have ever seen was developed with collaboration of variety of end users and their input. That means the front line, limiting management input to a minimum .
Without a doubt, unit testing and writing testable code. In fact, I started an initiative to this effect within my company but it got stalled due to various reasons.
Dependency Injection is also high on my list but I am not very clear on whether to favor the 800 pound Spring Framework or the neat little Guice.
I think I will eventually choose Guice as its all-java approach is clearer for people who are new to DI concept. Plus our reporting module is already using Guice.
The third on my priority list is Google Web Toolkit (already included in our latest release). AJAX features are high in demand in our user base, and I feel that it is high time to bring order the chaos created due to wide and varied AJAX implementations lurking in different corners of our code base.
But thats only the wish list. Most likely I will only be able to go ahead with GWT :(
The most important thing software developers need to learn is to work according to a clear software project plan. The purpose of a software project plan is to develop estimates for the work to be performed and to establish the necessary commitments. Good software planning begins with a detailed statement of the work to be performed and other constraints and goals that define and bound the project. The planning process includes steps to estimate the size of the working products and the resources needed. It must produce a schedule, identify and assess software risks, and communicate them among the developers.
Communication. They can't go very wrong on coding...after all its syntax and compilers point the mistakes out. And being developers they would be capable of writing logic but the edge that a developer can get is by having good communication and soft skills.
One of the things that most developers have a lot of trouble with is a long-term view. I think it is critical that there be a very good understanding of the impact of current decisions and design choices on the future of the project and the company. A lot of developers (and in my experience this is only worse with contractors and consultants) have the impression that once the code is written, the job is done. They frequently omit details such as sustainability of the overall system and how easy it will be to make future changes.
One good indicator of a developer's current level of understanding of this concept is to look at the following:
= Coding Practices =
Does the developer write idiomatic code that would be easy for any other developer to understand given a basic comprehension of the development environment? Are the interfaces to their objects clean, minimal and easily understood? Are the techniques used to modularize their code sparingly and appropriately applied? Do they consistently strive for high coherence and low coupling in the codebase? Do they understand the value of a properly written test suite?
= Source Management =
Does the developer understand more than the basics of their source control tool? Do they know how to do branching and merging properly? Do they leave clear, concise comments for each commit? Common errors when using SCM tools include incorrect spelling for changeset names (which makes searching for a particular changeset difficult), bundling of unrelated changes into a single changeset (which makes reverting only one of the changes difficult/impossible), linking changesets to the incorrect development task (which makes it difficult to assert that a particular task has been completed successfully) and fumbling with branch and merge (which causes problems when a developer needs to work on some separate task - how do I fork the codebase? how do I re-integrate my changes? etc.)
= Development Environment =
Is the development environment properly documented and easy to re-build? Can each developer work on any other developer's machine or do they need their "own setup"? Does the development style employed by the developer depend on a specific tool that may not be supported in the future (i.e. web developers who do everything in DreamWeaver, Java developers who are lost without Eclipse's auto-complete and refactoring tools, etc.)? Is the project neatly organized such that it's physical layout (on the filesystem) is easy to understand/explain?
Developers who have a good grasp of the above concepts also usually have a more complete understanding of the lifecycle of a software product (as a product and not as a project). By looking ahead, and by applying certain principles now, we can often have a huge impact on the future maintainability of a system. Maybe I'm just lucky to work with guys and gals that have the basics down pat but I would say that the above is what separates the "software developers" from the "coders". Obviously, there are a number of more basic items that come first but a long-term view of the evolution of a codebase is something that lifts developers from competence to excellence.
Raza I
Managing Partner at Adaptive Solutions, Inc. - Blogger at SoftwareSweatshop.com
Best Answers in: Blogging (2), Web Development (2)
I would show them the benefits of agile development. We're building a lot of consumer facing web apps so an agile-iterative mindset is crucial.
In terms of technology I'm pushing for Ruby on Rails. It's nimble and fun... and of course facilitates agile development. I handle the business development for my firm (I'm not a programmer) but I've taken an interest in RoR just because of it's ease of use. So we're encouraging our programmers to learn it.
Links:
Learning to Document the Work done, lessons learnt and to close loop with the development process is an important thing apart from learning the new methods/tools adopted in the industry for various phases of software development.
humility
or if you preffer, be non optimistic
I mean, there are something common to all the software developers, all of them are very very optimistic... if you ask them about the result of their work it's always perfect... and this is not only a testing issue (that it is) is that they only test what they know it works! and if we talk about estimations is better not ask to a dev. team. I preffer to ask my 10 years cousin instead.
A lot of tech. is also needed, but the humility, is my priority one.
I'm not a manager, but I think I can offer some thoughts from the perspective of a developer that is constantly trying to become a better developer and has had some success in that regard over the past couple years.
As a developer I strive to write code that has as few lines as possible, is easy for future developers to understand and extend, and is easy to unit test.
In my case, the best way to go about achieving those primary goals has been to break down\alter how I think about my work. Many developers, in my opinion, need to move from a simple programming frame of mind to a system architecture frame of mind. I've found the latter to be pretty rare, and often if you do run into a developer that claims to be concerned with system architecture you'll quickly find he/she breaks one of the above rules (writes overly-complex code, doesn't care about unit testing, etc.,).
So here would be my basic advice to managers:
1) Encourage your development team to be passionate about writing object oriented code, unit testing, refactoring, and design patterns.
2) Try to only hire developers who not only share the same passions from #1, but are also constant students of their trade, always studying how to make themselves better programmers.
3) Give the development team the resources they need (this includes time) to continue the practices from #1.
If you can achieve those goals your product will be much higher quality, and your customers AND developers will be happy.
Some books your developers should read if they haven't:
Head First Design Patterns
http://www.amazon.com/Head-First-Design-Patterns/dp/0596007124/ref=pd_bbs_sr_1?ie=UTF8&s=books&qid=1207237160&sr=1-1
Refactoring: Improving the Design of Existing Code
http://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Technology/dp/0201485672/ref=pd_bbs_sr_1?ie=UTF8&s=books&qid=1207237188&sr=1-1
Jerry W
Author, Teacher, Consultant
Best Answers in: Software Development (3), Freelancing and Contracting (1), Personnel Policies (1), Career Management (1)
I would like software developers to learn to truly finish their work before jumping into the next exciting project.
I believe that most of what we call "bugs" are simply the result of impatience to be rid of a development project before it is truly a product--throwing it over the wall to testers, maintainers, and support people. It's as if a surgeon refused to see a patient on a follow-up visit after a heart transplant--totally sophomoric and unprofessional.
In other words, I'd like (some) developers to grow up.
Links:
I want them to know all aspects of ***Software Engineering***, not just computer science. I want them to understand requirements (how to gather - how to make clear), high and low level design (BEFORE implementing), implementation, management (it's great when they have a concept of ROI and decide that maybe rewriting the code isn't a good idea), project planning and tracking (have you checked to see if you're on schedule lately?), various software life-cycles (should this project use a different one?), tools (IDE, source control, etc.), and so on. I don't expect them to have a great depth in all of these areas, but having some understanding of what it takes to develop software from end to end is a really good thing. This basic background is useful at any company for any product. All of the developers here have had a Masters level course in introductory software engineering as a training requirement.
I want them to remember that their users belong to many different cultural groups. Their software has to work anywhere in the world, (i.e. use culturally correct formatting, collation, etc.) and must be translatable.
I don't expect them all to be globalization experts, but they should know to use globalization libraries such as ICU to achieve the correct results.
Links:
Technologies come and go, dragging buzzwords in their wake.
I'd like the programmers to move on from pure programming and learn something about the problem domain. I've seen developers working on business systems who didn't understand the basics of debits and credits - and what's more they didn't want to know.
Richard Z
President at ZULTNER & COMPANY
Best Answers in: Project Management (8), Software Development (3), Planning (2), Quality Management and Standards (2), Organizational Development (1), Manufacturing (1), Market Research and Definition (1), Engineering (1), Product Design (1), Computers and Software (1)
The most important skill for anyone to learn, is how to learn effectively. That is, how to analyze your situation, your problems, and your role in the organization -- identify what you need to do better -- and then make improvements that matter. Ideally, as a manager, I want my software developers to come to ME with their analysis of what they need to learn now, in order to make the improvements that they see as needed now. My job is to review their analysis, discuss and revise it with them, and arrange for the training or resources necessary for them to make the improvements we both agree are needed. And then arrange for appropriate recognition and reward when they succeed.
So, specifically? They need to learn, master, and apply a personal improvement process. [And I don't care which one -- as long as they also apply their improvement process TO their improvement process.] Then they will be very good at learning whatever they need to learn, when they need to learn it. And that will be useful to them throughout their career.
P.S.: It is not useful to be "as specific as possible" about "something that will make a noticeable difference" in the effectiveness of an organization -- unless you know the details of that specific organization. What worked wonderfully in one case at one organization, may make no sense at all in another. The problems of one organizations are not the problems of all organizations. Only generic answers are applicable across unknown and unnamed organizations...
Having said that, what is a common area where many developers have a need and an opportunity to improve? In learning how to systematically (and thus efficiently) understand the needs of their customers better (and faster). Method exist to do this. Do your developers know them?
Mathew K
CTO, Seamless Development Inc
Best Answers in: Exporting/Importing (1), E-Commerce (1), Web Development (1), Using LinkedIn (1)
My developers are required to learn everything they can touch. We purposely incorporate new technologies into every project, just for the opportunity to learn. At some point aspects of technologies are all relative, and help you to understand how to better learn the next emerging technology.
Most development companies look at this theory and say "how can you manage it", or "how can you effectively meet timelines and be profitable if you are always learning what to do, rather than doing what you know". That is what makes me say “you as a developer have now been depreciated”.
The simple truth is, this industry is changing. I don't need programmers, they are too stale for my company. I need aggressive learning machines, that can solve problems by coming up with a creative solution. This removes the limits from my development team, there is nothing we cannot do, just problems we haven't solved.. yet.
Links:
Leon K
CEO of agileSEQUENT, Inc - Leon .at. kotovich .dot. net
Best Answers in: Telecommunications (1)
- Learn more about the market where the software is sold
- Learn more about the customers and their pain points (current and prospects)
- Choose to feel the customer's pain before they do or might experience
- Turn this pain into a relentless passion to build rich and reliable functionality
- Strive to correct one problem without creating several new ones
- Keep customer's delight in mind as the primary objective
... and ...
Read Steve McConnell's book "Code Complete", especially Chapter 8: Defensive Programming.
Links:
Kathy K
CTO, Technical Architect, Founder
Best Answers in: Planning (2), Mentoring (1), Customer Relationship Management (1), Business Analytics (1), Organizational Development (1), Enterprise Software (1), Software Development (1), Web Development (1)
I've run several big development organizations and and in looking back I always focussed on teaching (and rating) my developers the following skills:
1) Functional Design: Between "requirements" and "code" there is an "interpretation" that the developer makes, and that interpretation, if made too quickly, can be a disaster. It's critical that a developer can look beyond the requirements that come from a business user or customer. They need to think about the feature from all perspectives and design the feature so that it all functional flows through the feature are thought out in a comprehensive manner. Amazingly enough, this also gives you a more comprehensive test plan. This skill should be taught to developers at all levels and it applies to features of all types.
2) Effective Communication: Developers have a language of their own as do business owners. Even though everyone might be speaking English, they aren't necessarily saying the same thing or interpreting what they are hearing in the same manner. Communications need to follow a clear structure:
a) what is the problem.
b) what are the challenges
c) what is the options
d) what is the recommended option
e) what are the tradeoffs
3) Estimating: It's almost impossible to estimate how long it will take to develop something. There are so many unforeseen roadblocks that the developer could experience. Asking a developer for an estimate is like hearing fingernails on a chalk board. Given that, developers do need to know how to estimate accurately. They need to track to their estimates for each project, and determine how much over or under they were on each task. They will learn how to estimate more accurately only by all the times that they fail at it and learn from those mistakes. Agile development methodologies give developers more tools to be able to do this. The use of use cases and burn-down charts will tell them if they are on-track or off-track. And when used on a daily basis, they force the developer to adapt quickly to revise their estimates. After a few projects using these techniques developers get much better at estimating accurately.
Notice that none of my answers are about technology. Yes, developers need to stay current in their technology (object oriented, ajax, soap, databases, etc). The truth is, a developer will evolve these skills on their own and you cannot "teach" them these skills.
It's all the softer skills that make a truly great developer because they can better work within their environment.
(1) The spirit of team play
(2) Smooth communication vertically and horizontally
(3) Method of systematic problem resolution
(4) Basic computer science trainings to make them have a good understanding software development, not just one or two specific programming languages or platforms.
In answer to this question I would say over all growth not just in specific technology or skill set. But definitely most important ones are personality improvement and internal personal skills. This will lead to self motivation and increase zeal to learn there specific area of interest.
Cindy S
Interested and Involved (CSM, CSP, MBA)
Best Answers in: Project Management (1), Product Design (1), Computers and Software (1)
I have experieinced significant and tangible benefits from two areas of learning:
TDD. As a leader, it is a hard but critical skill to define the breadth and depth of knowledge needed to support and develop software. Systems can be very complex and expecting a developer to know the impacts of it all can set them up for failure. I have found TDD to be an excellent solution to keeping the focus on the delivered enhancments and decrease the time spent in researching. Therefore, for those applications where it makes sense, I place TDD on their personal development plans*.
One Layer Away. My simple term for the desire for developers to learn one step outside their application area. I use this with legacy systems where TDD is not the most efficient use of time and let the developers themselved identify what area they intend to cover (learn and keep current in). Where gaps in coverage exist, theoretically I could assign them, but to date, the developers have ensured those gaps didn't exist without my intervention.
*Personal Development Plans is my term for a matrix we keep to identify the needed skills to support our current system and any thing we are transitioning to. This is my bread and butter document to keep track for business continuity and planning purposes.
Links:
Patience. Personal detachment from the code. The ability to listen to requests and ideas without dismissing them, complaining or reacting. Take the information, let it incubate, discuss it among the technical team and then formulate responses, estimates, proposals and alternate solutions. If the users (technical or non-technical) don't expect a reaction, defensiveness is dropped and discussion flows more freely. In the end, everyone can contribute to coming up with a product, system or solution that's acceptable and reasonable for both sides.
David B
Software Architect - Software Development Manager at Siemens IT Solutions and Services
Best Answers in: Software Development (27), Web Development (7), Computers and Software (4), Career Management (2), Databases (2), Education and Schools (1), Business Analytics (1), Project Management (1), Professional Books and Resources (1), Enterprise Software (1), Information Storage (1)
Discipline.
How to think. I want people who can solve problems. Code monkie are a dime a dozen. Problem domains, except in very specific business domain situations, are easy to pick up. This includes patterns in software, data modeling and API writing. It's not about the code. It's about process.
Clarification added 6 months ago:
Now with better grammar: "How to think. I want people who can solve problems. Code monkies are a dime a dozen. Problem domains, except in very specific business domain situations, are easy to pick up. The problem thinking I desire includes patterns in software, data modeling and API writing. It's not about the code. It's about process."
Teresa W
"How to Build a PMO" Management Consultant
Best Answers in: Personnel Policies (1), Change Management (1), Ethics (1)
How to listen, think and communicate.
There are many subject matter experts with specific technology, however, the people that I rehire, and seach out when hiring new staff are those people with good technical skills that take the time to understand what is needed, and can discuss this at a level other technical and non-technical people can understand.
Generally, people with good skills in one language can transfer it to pick up another language, either with training, mentoring, or self-study.
These are great finds when you can locate them.
How to document their code!
Wayne M
Project Manager, PMP at Nortel Government Solutions
Best Answers in: Education and Schools (1), Government Contracts (1), Project Management (1), Computers and Software (1), Software Development (1)
I would focus on communication issues, namely how to actively listen and how to write a basic justification.
It is sometimes challenging for problem solvers to listen to a problem description without provding the solution. The issue, however, that the provided "solution" often doesn't cover the problem the user is trying to describe. Also, learn not to latch onto to specifics when the customer is talking in generalities. Learn to ask questions and delve into understanding the problem and the customer issues behind it.
When a developer comes up with a new idea, it would be nice if he could also provide a basic justification. I try to keep up with things, but sometimes I just don't get it. Why should we do this? If it is going to cost a noticeable amount of money or effort, how do I justify it up the food chain? Asking for a justification is not the same as saying no, it just means I need more information.
The technical skills are the easy ones and these are the ones developers practice 8 hours a day. The communications skills are the areas that really need to be built up.
Esteban A
Software Engineer at Interbank FX
Best Answers in: Ethics (1), E-Commerce (1), Computers and Software (1)
George,
All the advice given so far is sport on. However, first and foremost, developers must learn to care about their craft.
Obviously, this idea isn't mine; it comes from Andrew Hunt and David Thomas and their "Pragmatic Programmer" book.
Once the developer truly cares about his craft, we can add many other things that he needs to learn, but we must start with a developer that cares and wants to learn.
Links:
Clarification added 6 months ago:
Clearly, "sport" should have been spot. I apologize for not catching the typo before posting.
Andriy K
Software Design Engineer at Microsoft
Best Answers in: Software Development (2), Web Development (1)
I'd like to my developers will learn:
1. How to create innovations and drive them till the end
2. Deep knowledge of all Operating Systems including those from competitors.
3. Software Engineering and Design Patterns.