You are on page 1of 29

MARKET DEMAND for high-quality software is accelerating, and many rms are now challenged with nding and

retaining skilled workers who can deliver. Unfortunately, many recent university graduates are not adequately prepared to contribute to an organization without months, if not years, of post-graduation practical skills development and polishing. The iCarnegie Software Development Program, powered by the world-renowned Carnegie Mellon University, is designed to change that. This program provides students with the tools and skills needed to successfully enter the work place and immediately begin adding value to an organization. Carnegie Mellon University has a century-long history of academic innovation that has set the standard for its peers. Faculty members across all disciplines are known for cutting-edge research that yields real-world results. The universitys mission of global educational excellence has redened the role a university plays in the development and sustainability of a knowledge-based society. iCarnegie harnesses this world-class education and research knowledge, and delivers it in a scalable way to students around the globe. iCarnegie works with Carnegie Mellon schools and faculty members to develop and maintain exceptional curriculum and professional skill certications in technology, strategy and business. By making key components of the Carnegie Mellon education available to a broader audience, iCarnegie is enhancing how education is delivered.

AN INNOVATIVE CURRICULUM
The global, high-performance world in which we live requires levels of performance that can only be achieved by means of practice. Few of these outcomes can be achieved effectively within the constraints of stove-piped courses compartmentalized into blocks of a single semester. The iCarnegie solution is to provide a more robust program architecture and design that employs curricular threads that weave together the core and the remainder of the program into a powerful whole. The iCarnegie Software Development Program makes it possible for faculty to invest their precious time and resources more effectively by leveraging the work, insights and computer science/software engineering best practices from Carnegie Mellon University and iCarnegies partners. iCarnegie combines program architecture and design concepts from large and complex system development with the latest research results into how students learn, to create foundational elements upon which this program is built. Many university professors find themselves in a situation where keeping current with research trends, technology advancement, business developments and the latest advances in pedagogy all divert attention away from student learning. The Software Development Program makes it easier for educators to focus more time and effort on students and their needs, as well as the needs of the major employers for which the students will one day work. It starts with a careful focus on program objectives and outcomes, and a belief that students learn best when they are actively working in a context that is as close as possible to a real work experience. The next step is to identify those critical outcomes that can only be achieved over time through reflection-guided repetition. iCarnegie believes I understand knowledge is only meaningful when coupled with the ability to actually do quality work.

S O F T WA R E D E V E LO P M E N T P R O G R A M

LEARNING-BY-DOING APPROACH
A successful software development professional must be able to actually produce quality software. This requires practice and skill learned only through a learning-by-doing approach. While people do acquire knowledge by reading and listening to lectures, performance skills and quality are only developed through practice. To learn to do a professionals task well, it is best to simulate the task in an environment that is as similar as possible to the work place. For this reason, the Software Development Program core courses focus students on exercises and projects as opposed to lectures and tests. Textbooks, reading sets and lectures (by means of video) are made available, however these are employed as individual knowledge gathering tools as opposed to the centerpiece of the course. Performance assessments are done in controlled settings to ensure honest and fair results, but more emphasis is placed on working with and helping students develop personal, self-assessment skills, as these will be far more useful throughout their professional life. Learning-by-doing activities include individual and small group tasks where the resulting work product can be quickly evaluated against standards by the student, other students or the instructor, or can be used as the source for discussion by the whole class. Doing the work required to create such work-products requires both quality and speed, which can only be achieved when the basic individual skills have been properly learned. If students show speed or quality problems, the professor will suggest remedial activities. Superior speed, quality or other extraordinary performance will be rewarded by suggestions for more advanced work.

PROJECT-FOCUSED LEARNING
While the program employs, teaches and uses theoretical concepts and methods where appropriate, the bulk of the coursework is practical. The role of theory is to allow deeper insights and connections to be made, and provide predictive insights. Theory will not be the primary teaching vehicle, however. Students will participate in a number of real-world projects that require them to understand client issues, needs and constraints as well as the pros and cons of various potential solutions. Project work in a rich, real-world context provides opportunities for much more meaningful work to be done, and makes it possible to explore design choices that are difficult to do abstractly. The first course projects are small, with tasks accomplished individually. The size and complexity of course projects grows over the duration of the program. In all cases, the work will be realistic and students will be expected to gather data from Internet sources and provided materials. The quality of students work will be assessed the same way that commercial firms would assess the work contractors provide to them. (We recommend the school build close connections with local industry and strive to have their participation in the evaluation of class projects to provide feedback that is as real as is possible.)

S O F T WA R E D E V E LO P M E N T P R O G R A M

PROGRAM CORE
This Software Development Program is designed to produce professionals who are able to leverage, with quality, current best practices from computer science and software engineering on software development jobs. This core is specifically designed to facilitate this by providing students with a set of critical foundational and individual skills, before asking them to tackle more complex theoretical, practical and team-oriented topics. This core was designed to be augmented with other courses to provide students with a robust computer science or software engineering education in the context of an excellent liberal arts education, work-focused vocational program or technology/research program. The program architecture and design documentation reduces the effort required to integrate these core courses with courses in the sciences, mathematics, communication and the liberal arts.

CORE COURSES
Computation and Problem Solving Application Development Application Design Choices Performance, Data Structures and Algorithms Architecture and Design Database and Client/Server Applications Human/Computer Interaction and Communication Project Management Networking and Security Computer Systems Managing Technical People Personal and Team Processes

S O F T WA R E D E V E LO P M E N T P R O G R A M

COURSE DESIGN
Our courses employ insights and methods from the latest research into how students learn, and the best ways to facilitate that learning. Some key lessons must be memorized, but the bulk of modern knowledge and skill are more effectively understood and integrated into a professionals work ethic through more collaborative and experiential activities. Lectures can be inspiring, enlightening and even entertaining, however most professionals learn more over the course of their career than they do by listening to university lectures. For these reasons, the iCarnegie Software Development core focuses more precious class time on experiential activities - requiring student to actually do things - than on traditional lectures. Lectures, books and other information delivery sources are important, but new technologies allow us to shift them from shared classroom time to personal study time. This is a critical advancement, as it is nearly impossible for a professor to produce a lecture that addresses the needs of every student. iCarnegie believes class time should be spent on activities that bring value to as many of the students as possible. This belief is at the heart of our learning-by-doing approach to education. By switching from a traditional one-way lecture to a two-way collaboration, class time is invested doing real-world work in an environment that is as similar to the work world as is possible. Students produce useful work products, evaluate each others work and experiment with different tools, methods and techniques to improve the quality of their work. Teachers deliver just-in-time mini-lectures when they see common misunderstandings or difficulties. However the bulk of the professors time is spent quickly evaluating work processes and products and interacting with students in a coaching and mentoring role. When the workflows are smooth and the work products are high quality, students move forward to the next course topic. When there are problems, individual students are directed back to previous or ancillary knowledge and skill-building activities. The early courses in the program focus the student on individual knowledge and skills required across the various software development professions. Vocabularies, ways of thinking and working, standard problems and the recognized standard solutions must be mastered before it is possible for students to be able to work effectively with anyone else. Students must first become worthy of trust before they can move from solo activities to pair activities and then to team activities. To become trustworthy, students must develop knowledge and skills that are both technical and non-technical. That is because most problems in the real world are usually more about communication and frame-of-reference problems than technical issues. For this reason, the iCarnegies Software Development Program is best deployed with a collection of other courses to address the whole student and the breadth of each of their needs.
S O F T WA R E D E V E LO P M E N T P R O G R A M

COURSE OUTCOMES
Client Engagement Graduates will be able to engage with clients to understand their computing problems and what will be needed to produce a solution using one of the following: Web-based solutions with scripting and databases Stand-alone solutions using Java and C# with .net or C++ or Objective C Independent Thinking Graduates will be able to work individually and produce professional-looking work products including: User requirements document AS-IS and TO-BE documentation using UML Design documents using Object Oriented methods and UML Testing and acceptance plans and test scripts Readable code with excellent comment Teamwork Graduates will be able to work as effective members of development teams using protocols from Scrum, and be able to play the various roles. Research and Presentation Skills Graduates will be able to use written references and formalisms to research potential solutions. They will also be able to evaluate alternatives by means of establishing a decision rubric, and be able to present their work and their results, and make recommendation using professional presentations. Problem Solving Graduates will be able to outline approaches to address modest-sized, ill-defined problems; work in a small group to develop these outlines into plans; support the implementation and refinement of the plan using recognized protocols and tools; and communicate effectively with clients and leaders about the project risks, issues and resolution approaches. Lifelong Learners Graduates will develop knowledge and skill-acquisition abilities, as well as insights about the need for lifelong learning.

S O F T WA R E D E V E LO P M E N T P R O G R A M

KEY PROGRAM THREADS


To facilitate the integration of the Software Development Program core with the rest of the classes in the course of study, iCarnegie has produced a robust curricular architecture and program design. The program threads are the heart of the curricular architecture, for they organize critical learning outcomes and objectives across and among the courses. Each course must be designed to support the threads allocated to it, as well as achieve the specific course outcomes and objectives. Unlike traditional course pre-requisite chains, curricular threads employ a much finer-grained detail and fidelity in specification of what students knowledge and skill achievements must be. Taken together, the curricular architecture along with the program and course designs weave a much more robust educational experience for the student. The resulting integrated fabric of capabilities makes it easier for graduates to become quickly effective on the job, and enables more rapid professional advancement. The key program threads for the Software Development Program weave together a collection of familiar technical threads with critical non-technical threads. Computing thread. From simple World Wide Web searches, simple Web programming and standalone application programming to larger and more complex system solutions using data bases, networks, existing solution elements, etc. Design and Theory thread. How computing theory and models help us understand and predict, which then leads us to engineering a profitable business. Research Skills thread. How to find and then know what others have done, and how to leverage it wisely. Communication Skills thread. From foundational reading, listening, writing and presenting skills to effectively communication skills as both a consumer and producer. Professionalism and Ethics thread. What it takes to be able to make and then honor commitments. Interpersonal and Team Skills thread. What is takes to be successful in groups. Reflection, Self-assessment and Improvement thread. Reflecting in and on practice. Software Processes, Methods and Tools thread. From source code control to testing and debugging. Tactical and Strategic Problem Solving thread. Delivering value today and into the future. This program architecture is designed to deliver maximum capability in just four years by means of the careful weaving of these curricular threads. The first three courses provide students with the programming skills needed to produce real-word applications. These courses also provide students with enough insight about real work so that subsequent courses can meaningfully introduce pair projects then team programming projects, as well as more advanced development processes. These skills provide a solid foundation for a wide array of potential elective courses. Computing thread The first course in the sequence, Computation and Problem Solving, exposes students to the fundamental computation ideas of data, representations, operations, and data types, and how these things come together to solve real-world problems. The essence of this course is its practical nature. Students

S O F T WA R E D E V E LO P M E N T P R O G R A M

are given a set of real problems drawn from current industry, science and business, and are asked to solve the problems by hand while gathering data about time, effort and defects. Students are then shown how automation can - when done properly - improve all three. Students are also shown how a bad solution can actually do more harm than good. Students will be introduced to a set of key principles, such as thinking before coding and testing before developing. Concurrent with this first computing course, it is desirable to provide some form of communication course that focuses on establishing data gathering, evaluation, analysis and understanding skills using various information sources such as the library and the Internet. An optimal course would provide a real-world project and students should be asked to find information, determine whether it is credible, assess it along various dimensions (e.g. relevance, bias, supports or refutes an assertion) and use it properly. When students take such a communication course at the same time as the Computing and Problem Solving course, care must be taken in both courses to make it clear how each contributes to the total skill set students are expected to develop. The first course in the Computing thread also introduces students to information processing and how the Web, scripting, spreadsheets and simple databases bring value to people striving to solve problems. This computational thinking foundation is then used in subsequent courses to provide more vocabulary, principles, concepts and standard problems and solutions that move students toward the programs goal. The second course expands the complexity of the kinds of problems that can be solved by means of a computer through the use of an object-oriented programming language. Key to this expansion is the notion that there are many potential solutions. Without some way to capture the requirements and the solution choices, human foibles will lead to problems as these solutions get larger and more complex. The third course shows students that choices of representation and algorithm are important. The use of a concatenation operator in Java has significant performance problems, and knowing when to use and when not to use this built-in operation is critical. Similarly, choices of data structures and algorithms are equally critical. The notion of documenting design choices and rationale is emphasized along with considerable direct experience with performance trade-offs to build the case that these decisions can be important. The first three courses establish a solid foundation in a single programming language, Java, as this is one of the few type-safe languages that are widely used that also provides solid support for creating reusable libraries. It takes time to build the sophistication required to appreciate the rationale behind generics, interfaces and abstract classes, and experience has shown that a single class in this topic tends to just teach the syntax without really allowing students to appreciate the principle. The fourth course in the program leverages basic insights and understanding of computing in general and data structures in particular, and exposes students to other languages that may, in some cases, be more appropriate for providing significantly enhanced performance. Students will experiment with Java, C and assembly languages to more fully appreciate how computers work, how data structures are implemented and the trade-offs made between languages. Woven into this fourth class is the beginning of a more formal algorithm analysis approach. We recommend students take some form of computational discrete math course prior to taking this fourth course.

S O F T WA R E D E V E LO P M E N T P R O G R A M

From the four lower division foundational courses comes a number of potential specializations at the upper division level. For the software development program, the Database and Client/Server Applications, the Human/Computer Interactions and Communication and the Networking and Security courses establish a solid technical foundation for software developers. The Project Management course gives an additional set of key insights about the software development from another perspective, making it easier for developers and managers to work effectively together. As a result, the programs flexibility gives students both the breadth and depth to quickly become useful in just about any software-intensive domain. Design and Theory thread Successful software development requires students to be able to use the logic and mathematics of the real world as primary problem solving tools. The Design and Theory thread provides students with these capabilities. iCarnegie acknowledges the accomplishments of computer science educators who developed the foundational theories and developed curricula to teach them to undergraduates. In the early days of computing, not all theory was well understood and the theory that was understood was not taught adequately. Over time, some of the premiere schools developed excellent theory courses, but the design and structure of these courses made it difficult for average students to gain value from them. After more than a decade of experience with these courses, we are now able to tailor the teaching of theory to the specific educational goals and the learning outcomes of mainstream students. Pure theory courses have been a barrier to entry to software development. For this reason, this program offers an integrated theory as part of development approach. Students who desire more intense theory development have room in the curriculum to do that in their electives. Since the Design and Theory thread in this curriculum has been spread over a number of courses, it is critical that the faculty members implementing the curriculum fully appreciate this thread and ensure that each course contributes effectively to coverage of the entire thread. The Computation and Problem Solving course introduces one of several motivations for students to explore and become familiar with the theory. The course introduces students to a wide array of computing applications in modern society where quality and performance are critical. Being able to produce system applications is not just a matter of rote learning, memorizing and recalling a small set of standard answers to a set of standard questions. While we provide students with the basic building blocks of computing and problem solving, we are also helping them develop a more realistic vision for what computing is, why it is important and why solutions must be carefully designed, implemented, operated and maintained. Given this informal foundation from the Computation and Problem Solving course, we strongly believe that an applied Discrete Mathematics course in addition to a good sequence of Calculus courses is required to provide the foundational problem-solving tools students will need. Only individuals who fully appreciate applied mathematics and computer science theory, and are able to deliver these courses employing well-crafted, real-world problems and their solutions, should be hired to teach these crucial math courses.

10

S O F T WA R E D E V E LO P M E N T P R O G R A M

The second course in the Computing thread extends the informal and practical aspects of the theory by introducing and consistently using pre-conditions and post-conditions as a key part of the Java documentation required of the students. This course also introduces the notion of finite state machines, their role in scanners and how basic UML state charts bring value to the analysis of designs. The third course in the Computing thread, Application Design Choices, introduces the concepts of loop invariants and the basic and practical aspects of proof of correctness that are often overlooked by the approaches that many use to teach the topic. Regular expressions are introduced and are used in conjunction with the data structures that are developed in the class. Key elements of computer science theory are reinforced by means of their use in UML diagrams provided to the students in the early courses and produced by the students to explain their designs in the later courses. The fourth course, Performance, Data Structures and Algorithms, is a major expansion of this thread. Since the basic data structure concepts have already been introduced in the previous course, this course addresses this topic from a performance perspective, where we define performance in terms of correctness, speed and resource utilization. The basic ideas of proof of correctness are refined and reinforced in each assignment as it makes sense to do so. In addition, the notion of NP-completeness is introduced and the basic proof approach is used to evaluate various graph algorithms. The remaining courses in the thread provide additional practice with the foundational concepts as well as opportunities to dig more deeply in some specific topics, providing more insight into the use of theory and its application to real-world problems. The final course includes a major project that could be thought of as a mini-capstone. This course verifies and validates that these design and theory lessons have been properly learned and the student can compellingly demonstrate this accomplishment. Research Skills thread True research begins with the development of an understanding of what has already been done in order for new work to leverage the past work wisely. The totality of human knowledge and understanding and its expression in books, articles and other scholarly and professional forms is growing exponentially, so it is impossible for anyone to know it all. In the digital age, educated people must learn how to find and evaluate potential materials for suitability for the project, and determine the credibility of each source. Only when all of these things are positive is it time to understand the key insights from these works and apply them wisely. Developing these skills takes time and repeated practice.
S O F T WA R E D E V E LO P M E N T P R O G R A M

The core is specifically designed to transition students from an environment where everything needed is nicely packaged and provided to them, to the real world where there is a mountain of potentially useful materials hiding in a vast universe of useless trash. Communication Skills thread Students ability to effectively participate in all aspects of the communication process is crucial for success. In todays highly competitive world, being just technically correct is not enough. Professionals must also be able to properly understand both technical and contextual issues, and be able to compellingly explain how a proposed solution will bring both short-term and long-term value. The Communication thread is rooted in the lower division and covers the outcomes traditionally covered by language arts courses.

11

The programs core is most effective when coupled with a sequence of communication courses. The detailed design for each core course includes requirements for communication skills and capabilities. These requirements can be satisfied by stand-alone courses or by augmenting the core course with ancillary materials and support services for those students who are lacking the communication requirements. Professionalism and Ethics thread Technical lessons of software development are critical but are not, by themselves, sufficient. The Computing and Communication threads provide students with a wide array of problem-solving tools. Selecting the correct tools and methods typically requires a much deeper appreciation of the context, business issues and host of other issues that are not traditionally addressed in an undergraduate program. The purpose of the Professionalism and Ethics thread is to provide students with the required preparation so they are able to make these data-driven decisions, properly considering the short-term and long-term consequences as well as the impact of these decisions on society and the planet. The Professionalism and Ethics thread may be implemented in many ways. The detailed design of the core provides requirements for professional insights and capabilities. These can be satisfied by formal courses, properly mentored internships or co-ops, etc. Interpersonal and Team Skills thread From the beginning of the program, students are made aware of the importance of group work. Among their tasks during the first three semesters is to develop the personal knowledge and skills necessary to be a worthy team member. These ideas are then enhanced with actual pair programming experiences in the fourth semester and expanded more robustly in the remaining classes in the core. All of the upper-division courses in the core are team oriented and the foundations and primary skills developed in the first two years are further refined and extended in the courses in the junior year. Careful coordination among the faculty of these courses must ensure that the same processes and methods are applied in all of these courses. This will enhance student knowledge and skills, and avoid confusion that can occur when conflicting approaches are used or when skills are assumed but have not been developed. Reflection, Self-assessment and Improvement thread In the real world, it is important to realize that there is seldom a single right answer to any problem. It is also common for producers of solutions to have a difficult time understanding the real needs of their clients. Even when they do understand, it is easy to produce solutions that might work for some clients, but fail to align with others. It is only by means of engagement, and then reflection on what worked and what did not work, that these issues can be surfaced and resolved. When a client says no, the proper response is to understand why the client said no and what it will take to transform that no into a yes. This is the essence of reflection and improvement. Reflection and improvement are typically best learned by means of actual practice as opposed to traditional readings, lectures and tests. For actual practice to be meaningful, students must perform work

12

S O F T WA R E D E V E LO P M E N T P R O G R A M

that is complex enough to require that choices be made. Work must then be done based on these choices, and then the impact of these choices must be assessed. Without this complexity or mechanisms to relate performance to the choices made, students will not have the basis required to appreciate the result of improvement and the value of reflection. While students will be exposed to the ideas of choices and their consequences in the first three courses, it isnt until the fourth course, Performance, Data Structures and Algorithms, that students will work on assignments of adequate size to provide an opportunity for reflection and improvement. The diversity of the remaining four courses makes it critical to ensure that the designed projects for these courses are implemented carefully. The fourth, fifth and sixth courses are designed around a major project where there is the need for choices to be made. Time at the end of the course will be provided to perform the reflection along with enough additional time so students are able to assess, reflect, design an improvement, implement the improvement, assess again and then analyze the benefits of the improvement. During the final class in the core, students should be able to demonstrate this process and its potential benefit quite easily.

Software Processes, Methods and Tools thread A more formal focus on software processes, methods and tools is another topic best addressed in the context of larger, complex projects. The nature of the first three courses makes it difficult to meaningfully introduce this topic as an integral element of a class project. By the fourth class, complexity starts to become an issue; more and more work is best done as part of a team; and the need for processes, methods and tools becomes clearer. Each of the remaining four courses is team oriented with rather significant class projects. Giving adequate class time to the topics of project infrastructures, such as processes, methods and tools, is critical. Toward that end, we expose the students to the waterfall, spiral and SCRUM development methods, and have students practice each prior to the seventh course, Project Management. This provides significant material during the Project Management course to discuss and reflect on the benefits of these processes, methods and tools. The major project in the Networking and Security course also provides an opportunity for student to demonstrate their understanding and insight about which processes are critical; what development methods are useful for them and their project; and which tools are needed and must be mastered.
S O F T WA R E D E V E LO P M E N T P R O G R A M

Tactical and Strategic Problem Solving thread In addition to understanding the short-term and long-term consequences of technical and non-technical decisions, students must fully appreciate how they, their team and their work fit into their companys business, and how the company fits into the broader business and societal context. Even when the professional is focused on very technical aspects of a system, ethical and societal responsibilities remain. Project success at the expense of the current and future health of the team and the company is not ethical, yet many are not able to appreciate this due to an inadequate capacity to extrapolate beyond the small technical world in which they operate. It is for this reason the program includes a focus on this key issue.

13

COURSE SEQUENCING OPTIONS


The design of the Software Development Program is optimally deployed when the first four courses are taken sequentially, as many of the latter course depend considerably on earlier courses. From the fourth course on, it is possible to design the deployment of these courses in several ways. Linear sequencing is the easiest way to offer courses so the various threads that cross these courses optimally build students knowledge and capabilities. Especially when it comes to team skills and some of the more advanced technical concepts, it is difficult for students to master the knowledge and skill in a single semester, and within a single course. Introducing key concepts in the fifth course, extending and enhancing it on the sixth, providing concrete practice in the seventh and independent confirmation in the eighth gives the faculty confidence that students have indeed mastered the knowledge and skills. Flexible linear sequencing gives students and faculty flexibility, but makes it more difficult to build upon the basics of specific knowledge and skills for some of the threads. One approach to support this flexibility is to push up the initial exposure to these key concepts into the fourth course and establish a ninth capstone project course. Then use this capstone course as the place where many of the program outcome threads are completed and demonstrated. The fifth through eighth courses then could be delivered in various orderings, assuming a simplification of the deployment of the multiple-course threads so these courses extend and enhance key threads in the first half of each course, and provide concrete practice in the second half. For many outcomes, such a strategy may be made to work, as long as the activities are small and carefully designed. While this strategy may be made to work, it is not optimal. Parallel sequencing gives students and faculty the flexibility to compress the program duration into as little as two years, but this makes it even more difficult to build upon the basics of specific knowledge and skill. If compressing the program duration is a non-negotiable requirement, the first four courses may be compressed into one year by providing more time and support to students than just holding two classes each semester. Building upon these four courses from the first year, the second year could consist of two semesters of two courses each. Again, extra time and support would have to be provided to the students and careful refinement of the threads would be required during deployment.

14

S O F T WA R E D E V E LO P M E N T P R O G R A M

ASSESSMENTS AND CERTIFICATIONS


The Software Development Program is designed with two specific goals. The first goal is to develop students into lifelong learners who can fill current marketplace needs and anticipate future needs. The second goal is to provide assurance to potential employers and faculty in advanced academic programs that the students completing these courses have mastered the material and have met or exceeded the criteria set forth by iCarnegie. Each course is provided with a set of self-assessment and reflection tools to help students determine - on their own - how well they are doing in the class. Ancillary materials are provided to help students address some of the most common problems. These materials also assist students in learning how to master some of the tools that were used in the course, but are not considered part of the course (e.g. how to use the debugger). These tools are similar to the problem set solutions often found at the back of textbooks. In addition, each course comes with both knowledge and skill certification instruments. Both students and faculty use these tools to more formally assess what the student actually knows and can do at key points in the course. Similar to the earlier exams, the final certification exam is in two parts: comprehensive and practical. The goal of all of these assessment and certification tools is not just a grade. Both students and faculty need to know what the student knows and what the student can do with that knowledge. When we use the word know, we do not mean memorize. When we say, what the student knows and what the student can do with that knowledge, we mean the fullest extent of these words, including the ability to: remember, understand, apply, analyze, evaluate and create relevant and valuable work products based on the knowledge and skills that have been studied. Successfully completing an iCarnegie signature course certification (both comprehensive and practical) exam at the 80% level or better earns the student an iCarnegie certification and certificate, in addition to their regular university credit. A collection of these certificates will indicate a solid graduate worthy of special consideration for employment or further education.

15

S O F T WA R E D E V E LO P M E N T P R O G R A M

COURSE DESCRIPTIONS
1 COMPUTATION AND PROBLEM SOLVING
Objectives Computers play a critical role in just about everything humans do, and software professionals need to have a deep appreciation for the human and business aspects, as well as the theoretical. This gentle introduction to computing and problem solving provides students with realistic insights about the field of computing. At the heart of computing is a way of thinking and working that is more disciplined than many students have ever experienced, but the benefits of seeing, understanding and then developing those skills can be stunning. This course prepares and launches students down educational paths in all of the science and business domains, as well as in careers as software developers, software engineers and computer scientists. This story-centered course introduces students to standard problems people regularly face in science and business. Manual solutions are reviewed before automated solutions are considered. The concepts of data, data representation, data operators and types, and the limits of computer representations are explored. The vocabulary and uses of the key elements of computer systems, operating systems, application programs, networks, data storage, servers, browsers, client-side and server-side applications are introduced and used in hands-on projects. Basic business modeling is introduced and spreadsheets are used to answer typical what if questions, as well as many basic computational problems. Key Outcomes Students successfully completing this course will be able to produce simple static Web pages and basic interactive Web pages using simple applets and servlets. Students will be able to design simple standalone and server-side databases and simple spreadsheet models to address simple business problems. Students will learn how to use browsers to find information, employ Web page creation tools to create attractive static Web pages and use JavaScript to make Web pages more useful and interesting. Students will also be able to design spreadsheets to solve basic business problems, use basic diagrams and structured prose to express simple computational solutions and apply the basic tools of IDEs to perform simple development functions and activities. This course also teaches students how to knowledgably discuss how computers work and the reasons behind limitations faced by computers and applications. Students will gain a deep understanding of the notion that there are choices to be made, that some of these choices have consequences, and some consequences may not be realized until much later. Students will also learn about the costs and potential benefits of an automated solution, lifecycles of software development and ethical issues in building solutions and issues of professional responsibility Prerequisites: None (Algebra II, basic computer usage skill is desirable.)

16

S O F T WA R E D E V E LO P M E N T P R O G R A M

2 APPLICATION DEVELOPMENT
Objectives Software development is a blend of analysis, synthesis and the application of less formal rules. This course lays a solid foundation for the software development professional by elaborating and extending the basic computational thinking and problem solving of the Computation and Problem Solving course, and introducing crucial engineering concepts (e.g. interfaces, abstraction, generalization) required to enable reuse, tailoring and increase in scale. This course builds on the concepts from the first course to produce more useful client-side applets and standalone applications. Objects are introduced early as a key strategy to control complexity and support reuse in real world applications. Basic design concepts are introduced in parallel with programming language concepts and simple UML diagrams, and actual implementations are used to facilitate discussions and learning. Real-world applications are produced based on realistic materials from typical clients. Key Outcomes Students successfully completing this course will be able to produce basic dynamic applets and basic standalone object-oriented applications from informal specifications using OO principles. Students will be able to develop modest standalone object-oriented applications from correct UML specifications, create a string tokenizer from a state-machine description and devise useful JavaDoc documentation complete with pre and post conditions. Students will be able to successfully use basic UML designs to write modest-sized applications, apply common professional tools, use strings and numeric libraries to perform basic operations and employ Internet sources to find reference materials and relevant discussion groups. At the conclusion of this course, students will be able to knowledgeably discuss object-oriented design basics and how they bring value to software developers, articulate the role design plays and identify the reasons and excuses people use to avoid design as well as the role of testing and reviews and why both are needed Prerequisites: Course #1 - Computation and Problem Solving
S O F T WA R E D E V E LO P M E N T P R O G R A M

17

3 APPLICATION DESIGN CHOICES


Objectives This third programming class extends the students understanding of industrial software development by exploring basic design choices, experimenting with various data structure design choices and seeing the consequences of these choices. Students will study the tools that programmers use to partition applications into libraries and the applications that use them. This course introduces a set of basic data structures at the heart of software engineering and computer science, as well as the performance trade-offs these structures provide. The course extends the notion of thinking before coding and further expands the coverage of UML. Students successfully completing this course will be able to produce complex applications from designs, and appreciate the choices being made and the consequences that flow from these choices. This course serves as the conclusion of the programming core of the Computing thread. From this course, students may move in a number of different directions within computing. Key Outcomes Students successfully completing this course will be able to produce moderate dynamic applets and create designs for moderate-sized applications using basic UML diagrams and structured prose. Students will also be able to devise moderate-sized applications using OO principles derived from informal specifications and designs, and produce moderate to large standalone OO applications from correct UML specifications. Students will be skilled in creating graphical User Interface applications using the standard Swing components and simple animations, and producing well-structured implementations appropriate for team development, maintenance and reuse with careful attention to external and internal documentation. Students will be able to successfully create JavaDoc documentation complete with pre and post conditions and develop internal documentation that justifies assertion of correctness by means of useful loop invariants and other basic proof of correctness tools. Students will be able to use UML-based designs to write moderate to large applications and basic design patterns. Students will learn to employ interfaces to support partitioning of work across a team of developers and regular expressions to enhance applications. After completing this course, students will be able to knowledgeably discuss key choices an application developer makes, the consequences that flow from them and the need for interfaces in the development of larger applications and systems. Students will be able to discuss a set of design patterns and their uses, and be able to explain how Java threads operate and the basics of programming for multi-cored processor systems. Prerequisites: Course #2 - Application Development

18

S O F T WA R E D E V E LO P M E N T P R O G R A M

4 PERFORMANCE, DATA STRUCTURES & ALGORITHMS


Objectives This course builds upon the three previous Computing thread courses by exposing a number of real-world issues that are difficult, if not impossible, to consider in an object-oriented language such as Java. Issues of correctness and other key quality attributes are explored while more primitive procedural programming languages are introduced. Reasoning about quality and performance commitments and how the hardware provides useful tools and abstractions are covered in detail. This course also exposes students to several more primitive procedural-programming languages and clearly demonstrates the advantages and disadvantages of these languages. Students will also develop a working knowledge of the UNIX operating system for application development and the traditional tools. Students completing this course will be able to distinguish between solutions that would best be implemented in these more primitive languages and how some of the traditional problems of computing are implemented and what is required to make guarantees of performance. Key Outcomes Students successfully completing this course will be able to produce simple C and assembly language applications using the traditional UNIX commands and tools, and develop utility routines to perform time, space or correctness-critical functions and invoke them successfully from Java and other languages and environments. Students will also be able to construct files that properly capture dependencies that enable the successful creation of complex applications in realistic settings and create proofs of correctness for simple algorithms. Students will be able to use UNIX shells and common utilities in a software development process typically used by professionals, and employ UNIX editors, compilers, debuggers and testing tools in a manner consistent with common practice. Students will be able to successfully use standard UNIX libraries and frameworks to enhance development quality, speed and compatibility. Students will be able to knowledgeably discuss pointers, addresses, the pass-by-reference mechanism, malloc(), free() and the memory model presented by the C Language, as well as the differences between the C Language and a language further removed from the underlying hardware, such as Java. Students will be able to explain the halting problem and whether a problem is computable by means of reducing it to the halting problem, and be able to summarize the process of transforming source code into an executing process image. Students will be able to clearly describe the role played by each of the tools along the way and explain the design decisions presented in the development of reusable data structures in the C Language, and the trade-offs present in commonly used idioms. Students will have learned and be able to discuss the file I/O model presented by the commonly available C libraries, the model of a process presented by UNIX, and the libraries used to create and manage new processes from within a program. Students will be able to summarize the thought processes involved in debugging with debuggers and memory analyzers, and in their absence, as well as understanding a programs behavior both using profiling tools and in their absence. Prerequisites: Course #3 - Application Design Choice

19

S O F T WA R E D E V E LO P M E N T P R O G R A M

5 ARCHITECTURE AND DESIGN


Objectives It became clear in the 1960s and 1970s that the effort required to produce quality software grew far faster than the size of the application. Methods that worked for smaller applications did not seem to scale well. It was clear by the mid-1970s that there was a difference between the programming of smaller and larger applications, but there was little agreement about the best way to address these differences. It took nearly a quarter century and untold years of effort before a consensus started to form, far too long for anyone to discover on their own. This course lays a solid foundation upon which solutions for much larger and more important applications may be built. Students will study large systems and how they were partitioned into subsystems and components, as well as how the structuring of these elements into a solution and the interfaces used to join them together facilitates communication and control. Students will explore with various notations and formalisms as they learn the relationship between these structures and key quality attributes and their impact on system implementation. The differences between detailed design and architecture is explored, as well as notations used for both. Two major applications are analyzed and the impact of several well-known architectural styles is evaluated. The use of various notations is explored and the role of architecture and detailed design specifications are considered from the perspective of risk management. Key Outcomes Students successfully completing this course will be able to produce implementations consistent with specified architectures and detailed designs. Students will be able to create draft detailed design documents consistent with a specified architecture for moderate to small systems using UML and other standard notations, and develop draft architecture documents for moderate to small systems employing one or more views. Students will be able to use standard OO and other requirement notions to understand stakeholder requirements and express those requirements to others. Students will be skilled in using UML and other standard design notations to produce architecture and detailed design documents and understanding design intent required to implement modules, subsystems and systems. Students will be able to employ views to capture and communicate key aspects of a design element for a specific and targeted audience, and use architectural styles and design patterns. Students will also be able to use risk management processes, methods and techniques as the basis for deciding what to express and how best to express it, as well as what does not need documenting. Students will be able to knowledgeably discuss architectural choices, the short-term and long-term consequences associated with each choice and the rationale for selecting one choice over the others. Students will be able to discus architecture styles and the relationship each has with various standard quality attributes and design patterns, and the advantages and disadvantages of their use. Students will also be able to identify the flow of a system solution, from requirements to quality attributes and architectural structures to design patterns and detailed design, to implementation, testing, integration, sustainment and future reengineering as required to extend a systems life. Prerequisites: Course #4 - Performance, Data Structures & Algorithms

20

S O F T WA R E D E V E LO P M E N T P R O G R A M

6 DATABASES AND CLIENT/SERVER APPLICATIONS


Objectives Well-designed database systems are at the heart of the enabling and functionally rich, Web-based software applications that are revolutionizing businesses today. This course prepares students to build such systems, by providing them with the practice and experiences to master key concepts of database system design and implementation. This course builds upon the knowledge and skills developed in the Computation and Problem Solving course, the Java courses and usability design from the Human/ Computer Interaction and Communication course. The purpose of this course is for students to learn to use database management software to develop data-intensive applications. Students will learn to develop and manage medium-scale database projects, understand fundamental DBMS concepts and gain exposure to future trends in databases. Students develop client-server applications in Java and JSP, using database management systems. The course requires the creation of a real-world application by students grouped into small teams. Students gain the necessary skills to create data models appropriate for specific applications (relational data models are emphasized), tune the underlying database for fast response times and ensure the system is robust enough to handle failures. Key Outcomes Students successfully completing this course will be able to produce database designs that represent processes drawn from business and other real-world domains, create data models using E-R diagrams, develop sound schema designs using normalization and design Web-based database applications using SQL and JSP/Servlets. Students will be able to successfully use index structures of a DBMS to improve performance and the transaction features of a DBMS to achieve fault recovery and concurrency control. Students will be able to harness key relational operations to manipulate data and use SQL, DBMS and JDBC. Students will be able to use SQL DDL to model data, constraints and views, and use SQL DML to write complex queries. Students will be able to knowledgeably discuss basic concepts of object-relational and object-oriented database management systems, and basic concepts and applications of data warehousing and data mining (DataCubes, OLAP). Students will be able to discuss basic functions and application of multimedia databases, basic issues of database privacy and security and the DBMS offerings of the most important vendors. Prerequisites: Course #4 - Performance, Data Structures, and Algorithms

21

S O F T WA R E D E V E LO P M E N T P R O G R A M

7 HUMAN/COMPUTER INTERACTION AND COMMUNICATION


Objectives This course introduces students to the realities of having a human in a system, and the positive and negative lessons that have been learned. Students are exposed to the complexity of real business contexts and workflows to more fully appreciate the consequences of design choices. Students will practice data gathering using tools and methods professionals use to address complex problems that are rich with contradictions, ambiguity and human limitations. The course also provides students more opportunities to work in small teams to understand complex problems and practice using UML diagrams to model the problems and potential solutions as well as reason about both. Students will receive an introduction to the concept of designing systems that are able to interact effectively with humans, with a special focus on mobile applications. When implemented properly, automation can enhance workflows, improve quality, improve job satisfaction and enhance an organizations capability. Before it is possible to automate a workflow, it is critical to understand how humans interact with their environment; how work is currently done; who the involved actors are; what the work products are; and the processes, methods and tools used. It is critical to appreciate aspects that work well and must not change; aspects that work well but may be changed; aspects that do not work well and must be changed; and aspects that are not being accomplished at all. Coming to this understanding requires careful data gathering and analysis methods. Students will also explore the changes required by client organizations to implement a solution and gain lost value from its deployment, and feed these insights into the solution design process. Key Outcomes Students successfully completing this course will be able to produce useful data documenting work activities employing various interviewing methods and tools, develop AS-IS workflow models and documentation (i.e. UML diagrams) and create lists of issues and constraints from the analysis of gathered data. Students will be able to construct potential workflow designs integrating proven interface design methods with market needs and effectively express these designs for further analysis (i.e. UML diagrams). Students will be able to map out system prototypes and data-driven assessments of their effectiveness and produce system adoption recommendations and plans. Students will be able to successfully use a many data gathering tools and methods to produce highquality AS-IS data, and use contextual Inquiry methods and techniques to understand and document an organizations AS-IS workflow and appreciate issues that might suggest improvement through automation. Students will be able to employ descriptive and predictive modeling tools to understand, improve and communicate the details of workflows, and use standard reference models to guide redesign, improvement and deployment. Students will be able to knowledgeably discuss key human aspects and limitations and how they cause issues for system developers. Students will be able to discuss issues beginners, journeymen and masters have with automation and techniques for addressing them, and identify issues organizations experience implementing workflow and tool usage change and techniques for addressing them. Prerequisites: Course #6 - Database and Client/Server Applications

22

S O F T WA R E D E V E LO P M E N T P R O G R A M

8 PROJECT MANAGEMENT
Objectives This course introduces key project management concepts and terms. Students are given small assignments associated with key project management topics such as process, estimation, quality, change management and measurement, but do not yet deal with a simulated project. In many ways this course is like a tailor having his apprentice sew together a garment without the apprentice knowing anything about how the pieces of cloth were created, and learning about the pattern one step at a time. Students learn about the key software development processes, and much attention is given to the question of how much process is good process? with an emphasis placed on good process enabling and facilitating productive and quality work. Students are also introduced to the crucial differences between project management and software project management, and the differences between plan-driven software projects and agile projects. Key Outcomes Students successfully completing this course will be able to produce and use estimates, measurement options, risk management reports, schedules and budgets. They will also be able to create and use earned value reports, project status reports, and change management reports. Students will be able to knowledgeably discuss the project managers role, and identify project concepts and terminology. Students will have a deep understanding of processes and methodologies, and be able to explain the differences between project management and software project management, as well as the differences between traditional and agile project management. Prerequisites: Course #7 - Human/Computer Interaction and Communication

23

S O F T WA R E D E V E LO P M E N T P R O G R A M

9 NETWORKING AND SECURITY


Objectives This course provides students with a working vocabulary, as well as the knowledge and skills required to implement, debug and enhance basic networked applications. The course also provides students with insights about the kinds of defects that can be exploited to the systems detriment; how these attacks are carried out; and how they can be prevented, detected and stopped. This course explores networked communication from local area networks (LAN) up to the global Internet. The standard problems and a range of solutions for each are explored, with a special focus on the TCP/IP protocol suite. Students will be able to identify the benefits of networked communication, the protocols used, the problems that arise, the standard solutions and their advantages and disadvantages. Students will also learn to evaluate options, and design and implement many of these solutions. Key Outcomes Students successfully completing this course will be able to produce simple client-server and peer-to-peer applications from a blank page, create networked system designs given general systems requirements and implement basic SSL security. Students will be able to create assessment reports comparing the benefits of different distributed system implementations and develop proper hardware and software configurations establishing a secure and functioning networked application. Students will be able to use standard hardware and software tools to establish a distributed application, and apply performance analysis tools to assess network performance. Students will be able to employ standard networking diagnostic tools to debug standard network problems, and use standard protocols to address various communications issues. Students will be able to knowledgeably discuss different switching techniques and their benefits, and explain potential sources of errors and suggest appropriate corrective techniques. Students will be able to interpret uses of the various kinds of switches, hubs and routines, describe the OSI Reference Model and the purpose of the various layers, and discuss ways to ensure accurate end-to-end communication of data. Prerequisites: Course #4 - Performance, Data Structures and Algorithms, Course #7 - Human/Computer Interaction and Communication
S O F T WA R E D E V E LO P M E N T P R O G R A M

24

10 COMPUTER SYSTEMS
Objectives The limit of performance improvement that comes through size reduction of electronic elements has been reached, and performance gains must now come from other sources. The use of special purpose processors and system interfaces, as well as multiple CPUs and cores have transformed computers into complex computing systems made up of a complex blend of hardware, firmware and software. This course covers key characteristics, principles and trends in computing system design for undergraduates who have little formal background beyond basic assembly level language experience. This course makes the realities of computing hardware and software explicit. Up to this point, much of complexity of computing has been hidden behind interfaces, APIs, frameworks and operating systems. This course pierces these barriers and gives students a broad introduction to how computers work in the real world in enough detail that the true engineering design tradeoffs can now be seriously studied. This course builds upon key concepts from the Performance, Data Structures and Algorithms class as needed to cover complete systems built from hardware, firmware, operating systems, applications and frameworks and libraries. Key and foundational aspects of computers are used to develop the complex interactions between the multiple independent computing elements at the heart of machines today, with special focus on concurrency and parallelism required to properly leverage the rapidly growing number of CPUs/cores/threads in common machines. How these features bring value to application developers is explored in some detail. Additional topics such as cloud computing and mobile computing are introduced. Key Outcomes Students successfully completing this course will be able to produce solution modules optimized to maximize various performance characteristics of a system by leveraging the native hardware and fundamental sub-systems. Students will also be able to create excellent machine-level code tuned to accomplish specific high-performance computation goals, create solution modules to exercise the special functions of subsystem hardware (e.g. GPUs) and develop small applications written in languages specifically designed for parallel applications. Students will be able to leverage insights about CPU designs, pipelines and caching to create effective special purpose solutions, and use system performance specifications to make predictions about solution performance. Students will also be able to employ special purpose languages, tools and APIs to extract value from processors with multiple CPUs and cores not possible using generic programming languages. At the conclusion of this course, students will be able to knowledgably discuss which problems lend themselves to various programming languages, frameworks and systems with supporting evidence. Students will also be able to articulate RISC and CISC instruction set models and the consequences of these choices given the reality of computing today. Students will be able to discuss I/O subsystem standards, their costs/benefits and how to properly choose one for a system being developed, and discuss solving parallel problems with threads in Java and similar problems in other languages and the costs, benefits and consequences. Students will understand and be able to discuss advantages, disadvantages and risks of cloud computing and when it might make sense to employ, and challenges facing the rapid growth of personal mobile computing solutions. Prerequisites: Course #4 - Performance, Data Structures, and Algorithms

25

S O F T WA R E D E V E LO P M E N T P R O G R A M

11 MANAGING TECHNICAL PEOPLE


Objectives Managing technical people isnt only about the perfect team and how to build one; it is also about problem teams and how to fix them. The course will examine various levels of complexities in human interaction and deal with issues of leadership and teamwork; cultures and ethics; communications and negotiations; decision making; and conflict management. All aimed at managing people effectively through the software-development and employee life cycles. This course provides key insights into the major issues at the heart of managing software professionals, and how these issues tend to change across employee and project life cycles. Students investigate, analyze and recommend to management a good work environment for a fictional software development organization. To successfully complete this task, students must use principled decision-making techniques to prioritize their recommendations, and they must establish the cost and schedule for their recommended solutions. The lessons focus on understanding various human interactions and how to positively influence them. Classes are based on short lectures; story-based case studies and analysis and role-play activities where experimentation of specific techniques and strategies will take place. The course is about making effective decisions while working with people in tough situations, and learning to look creatively at problems and their formation. Key Outcomes Students successfully completing this course will be able to produce maps of influencing factors on human interactions and write recommendations for a good working environment. Students will be able to develop strategies, methods, processes, procedures and metrics for managing people during critical projects, and make recommendations for managing problem employees and workplace conflict. Students will create effective negotiation scripts and develop metrics describing and managing the cost of recruiting and training talent. Students will be able to successfully use decision-making principles, along with vocal, verbal and nonverbal communication tools. Students will be able to employ effective negotiation tactics and strategies and identify a framework for defining a good working environment. Students will develop their leadership tools and be able to hone a process for managing both good and problem employees. Students will be able to identify effective negotiation techniques, outline effective influencing techniques and develop a conflict management process. Students will be able to knowledgeably discuss the components of a communication process, as well as active listening and communication techniques. Students will be able to make intuitive decisions via a structured process and understand how leadership styles work with differing personalities. Students will be able to define good interview question and outline effective ways to prepare and conduct negotiations across cultures and genders. Prerequisites: Course #8 - Project Management

26

S O F T WA R E D E V E LO P M E N T P R O G R A M

12 PERSONAL AND TEAM PROCESSES


Objectives Delivering high-quality software on time and within budget is key to business success. The key pillars to achieve these goals depend upon discovering routine work in each new job; doing that work in a repeatable way; and gathering and leveraging performance and quality data. This course will provide considerable design and programming practice to the point that some stability in a simple development process may be established. From a relatively stable process, metrics can be gathered and used as the foundation for planning future work, and lead to quality improvement through reflection activities. This course introduces students to a realistic project and project artifacts, and asks them to implement the complete application by means of an agile-like incremental process. Initially, students focus on practicing the simple implementation process; understanding the application documentation; and gathering performance and defect data. In later iterations, students begin to predict effort and defects based on a growing baseline of data. As the size of the data set grows, reflection and improvement activities are introduced. Key Outcomes Students successfully completing this course will be able to produce software using a repeatable and documented process, and create effort and defect data appropriate for planning and improvement activities. Students will create detailed design documents in a style similar to provided examples and detailed design and implementation plans. Students will be able to devise reflection reports identifying defects and how they might be avoided or caught more quickly, and develop team quality and effort reports based on actual team data. Students will be able to use provided documentation from requirements through architecture and detailed design as well as exemplar code to produce high-quality results, and use rapid prototyping to understand design and development choices. Students will be able to employ historical effort data to predict the effort needed to complete future project iterations, and create risk management methods to identify opportunities to reduce the sources of variation and defects. Students will be able to knowledgably discuss actual project performance variation in terms of effort and defects, propose potential root causes for these variations, and how to avoid or catch more quickly. Students will have a deep understanding of issues and options in data gathering, various data gathering design alternatives and how to determine the best option for a given situation. Students will also be able to articulate UML modeling methods and diagrams, and how they can be used to express the key aspects of code to be implemented. Prerequisites: Course #5 - Architecture and Design

27

S O F T WA R E D E V E LO P M E N T P R O G R A M

iCARNEGIE
A subsidiary of Carnegie Mellon University, iCarnegie Inc. is a global leader in providing educational strategy to governments, businesses, universities and K-12 institutions. iCarnegies mission is to use high-quality, locally-delivered programs to help enhance market competitiveness and develop local workforces by building skills and abilities to help countries and organizations become more competitive. iCarnegie delivers top quality, highly scalable training and academic programs with a focus on job outcomes and a practical learning-by-doing, story-centered approach. iCarnegie has delivered more than 200,000 course enrollments in more than 20 countries. The company uses a delivery model that relies on local face-to-face instruction, and has trained more than 2,000 instructors to teach its courses globally. iCarnegie relies on Carnegie Mellon University faculty, staff, intellectual property and expertise, as well as other world-class experts, to develop and deliver its programs and train instructors in partner institutions. The company has developed academic and professional programs in various fields, including ICT (Information Communication Technology, such as software development, web development, robotics, front end engineering and information technology), applied science, mobile applications, telemedicine, and business and entertainment technology/game development. For more information, visit http://www.icarnegie.com.

28

S O F T WA R E D E V E LO P M E N T P R O G R A M

iCARNEGIE WORLD HEADQUARTERS 161 N. Dithridge Street, Pittsburgh, PA 15213 | P: 412.622.2150 | F: 412.621.2865 | W: www.icarnegie.com

You might also like