Author: Sanjay Goel
This is an excerpt from: Sanjay Goel (2010), Design of Interventions for Instructional Reform in Software Development Education for Competency Enhancement, Section 4.1, pp 83-91, http://eric.ed.gov/?id=ED516414
Technical competence of professionals is manifested in the practical as well as intuitive understanding required for the executing various technical tasks of a profession. Mosby’s dental dictionary defines technical competence for dental care professional as “the ability of the practitioner, during the treatment phase of dental care and with respect to those procedures combining psychomotor and cognitive skills, consistently to provide services at a professionally acceptable level.” A professional’s technical competence requires a coherent and integrated understanding of factual, conceptual, and procedural knowledge in the subject area. It needs the ability to use tools, techniques, procedures, best practices, and standards to solve problems. Further, it requires an intuitive understanding of what is technically feasible, scalable, and reusable.
Engineering and design professionals need to understand the current state of the art, and emerging technologies. Further, they need to be able to use this understanding to assess tractability of the problems. They need to have the patience and wisdom to consider a restricted subset of the problems, till the technology advances to a level where a solution of the original unconstrained problem can be attempted. As experience and technology matures, the focus shifts from short term goals to higher long term goals which expand to encompass an entire class of problems. It is imperative for them to have a good understanding of the limitations and risks associated with each piece of work.
Curriculum designers continuously face and address the challenge of identifying the required technical competencies suitable for their respective industries. However, often this process gets disengaged from the real continuously evolving industrial requirements. With reference to professional courses like engineering, it is critical to continuously collect required inputs from relevant industry and update the curriculum. The computing industry is evolving faster than the academic discipline of computing. There is a continuous complaint from the industry about severe shortage of well prepared graduates. The continuously evolving work profile of computing engineers is not appropriately reflected in the educational programs. Most of large software companies have their own education wings to train and retrain their developers. Typically large companies have mandatory technical training for their staff every year. The training programs are focused on several aspects like core technologies, development methodologies, project management, etc.
Based on a long industry-academia consultative process, SWEBOK provided an excellent documentation of required technical competencies that software engineers with four years of experience should have.
Important Technical Activities in Software Development
I order to understand the full spectrum of required technical competencies from the perspective of real technical work profiles in the software industry; I catalogued the various technical and technically oriented activities through a consultative process .
Planning activities relate to project and risk planning. The design related activities encompass diverse design activities at various stages and multiple levels. The design activities are followed by realization activities. Realization refers to the class of activities that relate to implementation and maintenance. Evaluation activities relate to selection and evaluation of tools, technology, products, and process. Many activities require intense interfacing with the client. These client interface activities relate to requirements and support.
Some activities are embedded within almost every function. These ubiquitous activities include process support activities that apply across all phases of a project. The activities in abovementioned six categories need the support of certain overarching activities that are apples companywide across the projects.
Based on this catalogue of activities, I administered a survey among another group of software developers. In view of the respondents, the most important activities that must be included in the curriculum of software developers are given below:
- Algorithm/Computational Procedure/Component and Interface Design (79% respondents)
- Application/Product/System Design/Prototyping (75% respondents)
- Product/Requirement Definition and Specification/Requirement Engineering/Visualization/Consulting (75% respondents)
- Code Analysis, Program Comprehension, Re-documentation (68% respondents)
- Innovation and research (66% respondents)
- Application, Component Development/System Integration (65% respondents)
- Group work, people management, and leadership (65% respondents)
- Estimation and Costing, Project Scheduling (63% respondents)
- Product/Process Quality Assurance and Control (60% respondents)
- Validation and Verification (Testing) (58% respondents chose)
- Technical Documentation, Presenting Ideas and Insights (54% respondents)
- Test Design (52% respondents)
- User Interface Design (47% respondents)
- User Acceptance, End-user Documentation, Deployment and Roll-out, Customer support (45% respondents)
- Security Architecture Design, Architecting, Component Selection (42% respondents)
- Project Monitoring and Control (40% respondents)
- Tools and Technology Selection and Evaluation (40% respondents)
- Usability/Value/Impact Analysis (39% respondents)
- Resource Planning and Management, Staffing and Team Development (36% respondents)
- Risk Planning and Mitigation (36% respondents)
- Build and Release, Configuration Management (36% respondents)
Technical competence wrt software development includes skill, rules, knowledge related to various technical activities listed above. Education program needs to give students opportunities to acquire, apply, extend, refine, and integrate their technical competence.
In order to perform these activities, software developers need to have an integrated understanding that hardware and software are two extreme ends of the possible solution space, with the possibility of varying levels of interaction and exploitation between two. The correct identification of the system/environment boundary to define the system/environment interface is crucial to the ability to successfully define, design, and develop a functional system. This often requires a trade-off in decomposition and allocation of functionality to hardware and software sub-systems. The need to define interfaces early is critical in order to support modularity, multi-team development, and testability.
There is a distinction between a hierarchical decomposition for project management vis-à-vis decomposition for driving development. The managers and the developers need to understand this distinction, and also the corresponding mapping between the two views. They also need clarity about the system-environment boundary, interface, system metrics, constraints, and acceptance criteria.
Given the drastic reduction in the time to market a product, it is essential that the product is brought to the market the earliest. This forces a designer/developer to exploit all means possible, including third-party tools, libraries, and sub-systems. Today, software development does not only require logic building ability, but also hugely depends upon system/platform knowledge. Efficient development requires inclusion of available in-house source code, commercial off the shelf components (COTS), and also open source software. Hence, good awareness and ability to select, include, and modify, the available software components and subsystems into new systems are now imperative for software developers.
They also need to have theoretical, practical, and intuitive understanding of the entire programming stack that includes hardware (CPU, memory, cache, interrupts, microcode), operating system APIs, binary code, assembly, static and dynamic linking, libraries, compilation, interpretation, garbage collection, heap, stack, memory addressing, processes and threads, understanding of space-time trade-off, and data structures and algorithms.
They must have hands-on experience with at least two different instances of each of the following: architectures, operating systems, programming languages, programming paradigms, compilation systems, DBMSs, glue/scripting languages, IDEs and productivity tools like profiling, testing, CASE tools, version control systems, etc.
They need to learn code optimization, performance tuning, defensive programming, assertions, and mixed paradigm programming. The curriculum should address code organization within and across files, source code tree organization, source code version control, build automation, deployment, and roll out. Creating awareness and appreciation of upcoming technologies and standards is strongly recommended as an agenda for curriculum designers for software development education.
Pervasive Knowledge Areas
Today, web and multimedia (including graphics) nearly have omnipresence in computing systems. Hence, the students must learn multimedia and graphics programming, including use of special APIs for the purpose. All computing students must be given some practice with web-database architecture and programming.
Embedded systems place special requirements on interfacing peripheral and communication protocols. Exposure to peripheral interfacing and communication protocols is highly recommended. Security has emerged as a big concern for users and a challenge for computing professionals. The education program must give good experience with secure programming and security APIs. Use of mobile phones as a computing platform is growing exponentially. Students must be exposed to developing software for at least one such platform.
Use of open source for developing software has become very popular in recent years. Therefore students must be comfortable with identifying, evaluating, modifying, and integrating open source for their work.
Need for higher focus on debugging
Many characteristics like significant work in new development in every project, discrete abstractions, complex interactions among a very large of components, inherent invisibility, large groups of developers, continuous evolution, etc., make software highly vulnerable to errors. Software errors (bugs) result because of lack of attention and also because of misconceptions related to programming, operating systems, compiler, and tools, libraries, etc. Software errors can be reduced by developing proper technical competence. The students need to learn to avoid, anticipate, identify, track, and remove bugs that often arise due to their misconceptions in their as well as others’ source code.
Debugging activity is by and large ignored by curriculum. In my view computing curriculum need to address this issue much more seriously. Students need to be well versed in the use of tools and techniques for identifying and rectifying errors. The students also need to be exposed to common bugs, their consequences, and remedies. The computing curriculum and education programs need to give much more emphasis on debugging. They need to learn to use debugging tools for interactive debugging, static analysis, and dynamic analysis.
A catalogue of software bugs  lists and classifies bugs based on programmer’s misconceptions related to programming, operating systems, compiler, and software architecture. I recommend that students should be exposed to some of these bugs from each category.
Metzger’s book on software debugging  is an excellent resource strongly recommended for all software developers.
 Metzger, R.C., Debugging by Thinking: A multi-disciplinary approach, Hewlett Packard Development Company and Elsevier Digital Press, 2004.