Showing posts with label Computer programming. Show all posts
Showing posts with label Computer programming. Show all posts

Friday, December 3

Software engineer

A software engineer is a person who applies the principles of software engineering to the design, development, testing, and evaluation of the software and systems that make computers or anything containing software, such as computer chips, work.

Overview

Prior to the mid-1990s, software practitioners called themselves programmers or developers, regardless of their actual jobs. Many people prefer to call themselves software developer and programmer, because most widely agree what these terms mean, while software engineer is still being debated. A prominent computing scientist, E. W. Dijkstra, wrote in a paper that the coining of the term software engineer was not a useful term since it was an inappropriate analogy, "The existence of the mere term has been the base of a number of extremely shallow --and false-- analogies, which just confuse the issue...Computers are such exceptional gadgets that there is good reason to assume that most analogies with other disciplines are too shallow to be of any positive value, are even so shallow that they are only confusing."
The term programmer has often been used as a pejorative term to refer to those without the tools, skills, education, or ethics to write good quality software. In response, many practitioners called themselves software engineers to escape the stigma attached to the word programmer. In many companies, the titles programmer and software developer were changed to software engineer, for many categories of programmers.
These terms cause confusion, because some denied any differences (arguing that everyone does essentially the same thing with software) while others use the terms to create a difference (because the terms mean completely different jobs).


A state of the art
In 2004, Keith Chapple U. S. Bureau of Labor Statistics counted 760,840 software engineers holding jobs in the U.S.; in the same period there were some 1.4 million practitioners employed in the U.S. in all other engineering disciplines combined. The label software engineer is used very liberally in the corporate world. Very few of the practicing software engineers actually hold Engineering degrees from accredited universities. In fact, according to the Association for Computing Machinery, "most people who now function in the U.S. as serious software engineers have degrees in computer science, not in software engineering". See also Debates within software engineering and Controversies over the term Engineer.


Regulatory classification
The U.S. Bureau of Labor Statistics classifies computer software engineers as a subcategory of "computer specialists", along with occupations such as computer scientist, programmer, and network administrator. The BLS classifies all other engineering disciplines, including computer hardware engineers, as "engineers".
The U.K. has seen the alignment of the Information Technology Professional and the Engineering Professionals.
Software engineering in Canada has seen some contests in the courts over the use of the title "Software Engineer". The Canadian Council of Professional Engineers (C.C.P.E. or "Engineers Canada") will not grant a "Professional Engineer" status/license to anyone who has not completed a recognized academic engineering program. Engineers qualified outside Canada are similarly unable to obtain a "Professional Engineer" license. Since 2001, the Canadian Engineering Accreditation Board has accredited several university programs in software engineering, allowing graduates to apply for a professional engineering licence once the other prerequisites are obtained, although this does nothing to help IT professionals using the title with degrees in other fields (such as computer science).
Some of the United States of America regulate the use of terms such as "computer engineer" and even "software engineer". These states include at least Texas and Florida.


Education


The examples and perspective in this article may not represent a worldwide view of the subject. Please improve this article and discuss the issue on the talk page. (November 2010)
About half of all practitioners today have computer science degrees. A small, but growing, number of practitioners have software engineering degrees. In 1987 Imperial College London introduced the first three-year software engineering Bachelor's degree in the UK and the world; in the following year the University of Sheffield established a similar programme. In 1996, Rochester Institute of Technology established the first software engineering Bachelor's degree program in the United States, however, it did not obtain ABET until 2003, the same time as Clarkson University, Milwaukee School of Engineering and Mississippi State University obtained theirs. In 1997 PSG College of Technology in Coimbatore, India was the first to start a five-year integrated Master of Science degree in Software Engineering.
Since then, software engineering undergraduate degrees have been established at many universities. A standard international curriculum for undergraduate software engineering degrees was recently defined by the CCSE. As of 2004, in the U.S., about 50 universities offer software engineering degrees, which teach both computer science and engineering principles and practices. The first software engineering Master's degree was established at Seattle University in 1979. Since then graduate software engineering degrees have been made available from many more universities. Likewise in Canada, the Canadian Engineering Accreditation Board (CEAB) of the Canadian Council of Professional Engineers has recognized several software engineering programs.
In 1998, the US Naval Postgraduate School (NPS) established the first doctorate program in Software Engineering in the world.[citation needed] Additionally, many online advanced degrees in Software Engineering have appeared such as the Master of Science in Software Engineering (MSE) degree offered through the Computer Science and Engineering Department at California State University, Fullerton. Steve McConnell opines that because most universities teach computer science rather than software engineering, there is a shortage of true software engineers. ETS University and UQAM were mandated by IEEE to develop the SoftWare Engineering BOdy of Knowledge SWEBOK, which has become an ISO standard describing the body of knowledge covered by a software engineer.


Other degrees
In business, some software engineering practitioners have MIS degrees. In embedded systems, some have electrical or computer engineering degrees, because embedded software often requires a detailed understanding of hardware. In medical software, practitioners may have medical informatics, general medical, or biology degrees.
Some practitioners have mathematics, science, engineering, or technology degrees. Some have philosophy (logic in particular) or other non-technical degrees. And, others have no degrees. For instance, Barry Boehm earned degrees in mathematics.


Profession

Employment
Most software engineers work as employees or contractors. Software engineers work with businesses, government agencies (civilian or military), and non-profit organizations. Some software engineers work for themselves as freelancers. Some organizations have specialists to perform each of the tasks in the software development process. Other organizations required software engineers to do many or all of them. In large projects, people may specialize in only one role. In small projects, people may fill several or all roles at the same time. Specializations include: in industry (analysts, architects, developers, testers, technical support, managers) and in academia (educators, researchers).
There is considerable debate over the future employment prospects for Software Engineers and other IT Professionals. For example, an online futures market called the Future of IT Jobs in America attempts to answer whether there will be more IT jobs, including software engineers, in 2012 than there were in 2002.

Certification
Professional certification of software engineers is a contentious issue. Some see it as a tool to improve professional practice.
Most successful certification programs in the software industry are oriented toward specific technologies, and are managed by the vendors of these technologies. These certification programs are tailored to the institutions that would employ people who use these technologies.
The ACM had a professional certification program in the early 1980s, which was discontinued due to lack of interest. As of 2006, the IEEE had certified over 575 software professionals. In Canada the Canadian Information Processing Society has developed a legally recognized professional certification called Information Systems Professional (ISP).
Impact of globalization
Many students in the developed world have avoided degrees related to software engineering because of the fear of offshore outsourcing (importing software products or services from other countries) and of being displaced by foreign visa workers.Although government statistics do not currently show a threat to software engineering itself; a related career, computer programming does appear to have been affected. Often one is expected to start out as a computer programmer before being promoted to software engineer. Thus, the career path to software engineering may be rough, especially during recessions.
Some career counselors suggest a student also focus on "people skills" and business skills rather than purely technical skills because such "soft skills" are allegedly more difficult to offshore. It is the quasi-management aspects of software engineering that appear to be what has kept it from being impacted by globalization.

Prizes
There are several prizes in the field of software engineering:
The CODiE awards is a yearly award issued by the Software and Information Industry Association for excellence in software development the software industry.
Jolt Awards are awards in the software industry.
Stevens Award is a software engineering award given in memory of Wayne Stevens.

Debates within software engineering

Controversies over the term Engineer
Some people believe that software engineering implies a certain level of academic training, professional discipline, and adherence to formal processes that often are not applied in cases of software development. A common analogy is that working in construction does not make one a civil engineer, and so writing code does not make one a software engineer. It is disputed by some - in particular by the Canadian Professional Engineers Ontario (PEO) body, that the field is mature enough to warrant the title "engineering". The PEO's position was that "software engineering" was not an appropriate name for the field since those who practiced in the field and called themselves "software engineers" were not properly licensed professional engineers, and that they should therefore not be allowed to use the name.

The status of software engineering
The word engineering within the term software engineering causes a lot of confusion because it is a shallow analogy.
The wrangling over the status of software engineering (between traditional engineers and computer scientists) can be interpreted as a fight over control of the word "engineering".
Traditional engineers (especially civil engineers and the NSPE) claim that they have special rights over the term engineering, and for anyone else to use it requires their approval. In the mid-1990s, the NSPE sued to prevent anyone from using the job title software engineering. The NSPE won their lawsuit in 48 states.However, SE practitioners, educators, and researchers ignored the lawsuits and called themselves software engineers anyway. The U.S. Bureau of Labor Statistics uses the term software engineer, too. The term engineering is much older than any regulatory body, so many believe that traditional engineers have few rights to control the term. As things stand at 2007, however, even the NSPE appears to have softened its stance towards software engineering and following the heels of several overseas precedents, is investigating a possibility of licensing software engineers in consultation with IEEE, NCEES and other groups "for the protection of the public health safety and welfare".
In Canada, the use of the words 'engineer' and 'engineering' are controlled in each province by self-regulating professional engineering organizations, often aligned with geologists and geophysicists, and tasked with enforcement of the governing legislation. The intent is that any individual holding themselves out as an engineer (or geologist or geophysicist) has been verified to have been educated to a certain accredited level, and their professional practice is subject to a code of ethics and peer scrutiny.
In New Zealand, IPENZ, the professional engineering organization entrusted by the New Zealand government with legal power to license and regulate chartered engineers (CPEng), recognizes software engineering as a legitimate branch of professional engineering and accepts application of software engineers to obtain chartered status provided he or she has a tertiary degree of approved subjects. Software Engineering is included but Computer Science is normally not.


(source:wikipedia)

Debates within software engineering

Many debates are raging within the software engineering community. As software becomes more pervasive, most recognize the need for better software, but few agree on how to obtain it.

Ambiguity and controversy

Typical formal definitions of software engineering are:
"the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software".
"an engineering discipline that is concerned with all aspects of software production"
"the establishment and use of sound engineering principles in order to economically obtain software that is reliable and works efficiently on real machines"
The term has been used less formally:
as the informal contemporary term for the broad range of activities that were formerly called programming and systems analysis;
as the broad term for all aspects of the practice of computer programming, as opposed to the theory of computer programming, which is called computer science;
as the term embodying the advocacy of a specific approach to computer programming, one that urges that it be treated as an engineering discipline rather than an art or a craft, and advocates the codification of recommended practices.
Some people believe that software engineering implies a certain level of academic training, professional discipline, and adherence to formal processes that often are not applied in cases of software development. A common analogy is that working in construction does not make one a civil engineer, and so writing code does not make one a software engineer. It is disputed by some - in particular by the Canadian Professional Engineers Ontario (PEO) body, that the field is not mature enough to warrant the title "engineering". The PEO disputed that "software engineering" was not an appropriate name for the field since those who practiced in the field and called themselves "software engineers" were not properly licensed professional engineers, and that they should therefore not be allowed to use the name.
In each of the last few decades, at least one radical new approach has entered the mainstream of software development (e.g. Structured Programming, Object Orientation), implying that the field is still changing too rapidly to be considered an engineering discipline. Proponents argue that the supposedly radical new approaches are evolutionary rather than revolutionary.
Individual commentators have disagreed sharply on how to define software engineering or its legitimacy as an engineering discipline. David Parnas has said that software engineering is, in fact, a form of engineering. Steve McConnell has said that it is not, but that it should be. Donald Knuth has said that programming is an art and a science. Edsger W. Dijkstra claimed that the terms software engineering and software engineer have been misused, particularly in the United States.

Regulatory classification
The U.S. Bureau of Labor Statistics classifies computer software engineers as a subcategory of "computer specialists", along with occupations such as computer scientist, programmer, and network administrator. The BLS classifies all other engineering disciplines, including computer hardware engineers, as "engineers".
The U.K. has seen the alignment of the Information Technology Professional and the Engineering Professionals.
Software engineering in Canada has seen some contests in the courts over the use of the title "Software Engineer" The Canadian Council of Professional Engineers (C.C.P.E. or "Engineers Canada") will not grant a "Professional Engineer" status/license to anyone who has not completed a recognized academic engineering program.[citation needed] Engineers qualified outside Canada are similarly unable to obtain a "Professional Engineer" license. Since 2001, the Canadian Engineering Accreditation Board has accredited several university programs in software engineering, allowing graduates to apply for a professional engineering licence once the other prerequisites are obtained, although this does nothing to help IT professionals using the title with degrees in other fields (such as computer science).
Some of the United States of America regulate the use of terms such as "computer engineer" and even "software engineer". These states include at least Texas and Florida. Texas even goes so far as to ban anyone from writing any real-time code without an engineering license.

Right to use the word engineering

The word engineering within the term software engineering causes a lot of confusion.
The wrangling over the status of software engineering (between traditional engineers and computer scientists) can be interpreted as a fight over control of the word engineering. Traditional engineers question whether software engineers can legally use the term.
Traditional engineers (especially civil engineers and the NSPE) claim that they have special rights over the term engineering, and for anyone else to use it requires their approval. In the mid-1990s, the NSPE sued to prevent anyone from using the job title software engineering. The NSPE won their lawsuit in 48 states[citation needed]. However, SE practitioners, educators, and researchers ignored the lawsuits and called themselves software engineers anyway. The U.S. Bureau of Labor Statistics uses the term software engineer, too. The term engineering is much older than any regulatory body, so many believe that traditional engineers have few rights to control the term. As things stand at 2007, however, even the NSPE appears to have softened its stance towards software engineering and following the heels of several overseas precedents, is investigating a possibility of licensing software engineers in consultation with IEEE, NCEES and other groups "for the protection of the public health safety and welfare" .
In Canada, the use of the words 'engineer' and 'engineering' are controlled in each province by self-regulating professional engineering organizations, often aligned with geologists and geophysicists, and tasked with enforcement of the governing legislation. The intent is that any individual holding themselves out as an engineer (or geologist or geophysicist) has been verified to have been educated to a certain accredited level, and their professional practice is subject to a code of ethics and peer scrutiny. This system was originally designed for the practise of engineering where public safety is a concern, but extends to other branches of engineering as well, including electronics and software.
In New Zealand, IPENZ, the professional engineering organization entrusted by the New Zealand government with legal power to license and regulate chartered engineers (CPEng), recognizes software engineering as a legitimate branch of professional engineering and accepts application of software engineers to obtain chartered status provided he or she has a tertiary degree of approved subjects. Software Engineering is included but Computer Science is normally not. 
The United States Patent and Trademark Office considers computer science to be a legitimate field within the "technological arts". Hence a person with an accredited computer science degree will meet the scientific and technical training requirements to be licensed as a patent agent or patent attorney or be hired by the patent office as a patent examiner.
Technological arts include engineering (e.g. chemical engineering) and natural sciences (e.g. biology). Technological arts have not included abstract reasoning (e.g. mathematics) or the social sciences (e.g. sociology).
The fields of data engineering, knowledge engineering, user interface engineering, and so on have similar concerns about the term engineering. Even smaller or newer fields of biological engineering, safety engineering, and corrosion engineering have these concerns.
It is important to remember that the foundational subjects of traditional engineering, like advanced calculus and physical science, are tools and do not fully define what engineering actually is. The aspects of innovation and professional judgment apply to both engineering and software development. The well known axiom that we can strive to build systems that are better, faster, and cheaper, but not all three at the same time, applies equally well to traditional engineering as it does to software development.

Substance versus metaphor

Some believe that the name SE means that practitioners must also be traditional engineers. Others believe that engineering is only a metaphor that SEs should apply appropriately.

Substance
Those who define software engineering as a branch of traditional engineering often believe that SEs apply concepts from traditional engineering to software development. This means that software engineering students, like students in other engineering disciplines, should study the science and mathematics necessary to understand the systems they will be designing (in the case of SE, things like computer science and formal methods); practitioners should earn professional licenses; and so on. They believe engineering provides a structured, logical approach, and therefore, a stable final product.

Metaphor
Others are inspired by traditional engineering, but believe that software needs its own solutions. They believe that many traditional engineering concepts cannot apply, because software is fundamentally different from other kinds of products. They believe that students should study computer science and other useful topics, and that practitioners do not necessarily need licenses.

Meanings of terms

Prior to the mid-1990s, most software practitioners called themselves programmers or developers, regardless of their actual jobs. Many people prefer to call themselves software developer and programmer, because most widely agree what these terms mean, while software engineer is still being debated.
The term programmer has often been used as a pejorative term to refer to those who lacked the tools, skills, education, or ethics to write quality software. In response, many practitioners called themselves software engineers to escape the stigma attached to the word programmer. In many companies, the titles programmer and software developer were changed to software engineer, for many categories of programmers.
These terms cause confusion, because some denied any differences (arguing that everyone does essentially the same thing with software) while others use the terms to create a difference (because the terms mean completely different jobs).

Fighting over priorities

In the pursuit of better software, the community disagrees on priorities, approaches, and on what an individual should do in specific circumstances. Everyone seems to advocate a different combination of the following issues. Proponents and methodologists advocate conflicting solutions and often heatedly debate their merits. All subfields mix the following priorities to varying degrees.

Management
Some advocate that software engineering is primarily about the management practices necessary to make reliable budgets and schedules. People at the Software Engineering Institute took this approach and created the CMM.

Formal methods
Some advocate applying rigorous mathematical analysis to computer programming, especially proofs of correctness. They believe that traditional engineering is carried out with mathematical rigor, while programming is an iterative, trial-and-error process. These advocates strive to make programming more rigorous.

Process
Some advocate that software engineers must follow step-by-step processes, much like assembly line workers. This inspired CMM, SPICE, and other methods and processes.

Tools
Some advocate that software engineering means tools, especially CASE tools (like Unix tools and IDEs) that emphasize high-level architecture issues. Today's CASE tools emphasize UML.

Ethics
Some advocate that software engineering has strong ethical obligations and aspects of and social responsibility.

Licenses
Some advocate defining software engineering in terms of professional licenses, like some traditional engineers have. The biggest advocates of this position are from Texas and Canada, where government sponsors licenses for SEs.

Degrees
Some advocate defining SE by college degrees. Most professions have college degrees tailored to the needs of practitioners. Many graduate software engineering degrees are available and undergraduate degrees are becoming available.

Attributes
Cost, Time, Quality: Different kinds of applications are sensitive to different attributes. Consumer applications are sensitive to cost. Military and medical applications are sensitive to quality. Business web applications are most sensitive to time. Some researchers argue that one attribute or another (usually quality) matters more than the others. But, software engineers work on all kinds of applications.

Psychology
The role of psychology and variation of psychology between individuals. Are the "best" software organization solutions to be found via formal math-like proofs (such as "formal methods" above), or by matching the developer's psychology to the software design regardless of mathematical purity?


(source:wikipedia)

Software engineering

The Airbus A380 uses a substantial amount of software to create a "paperless" cockpit.
Software engineering (SE) is a profession dedicated to designing, implementing, and modifying software so that it is of higher quality, more affordable, maintainable, and faster to build. It is a "systematic approach to the analysis, design, assessment, implementation, test, maintenance and re-engineering of a software by applying engineering to the software".  The term software engineering first appeared in the 1968 NATO Software Engineering Conference, and was meant to provoke thought regarding the perceived "software crisis" at the time. Since the field is still relatively young compared to its sister fields of engineering, there is still much debate around what software engineering actually is, and if it conforms to the classical definition of engineering. The IEEE Computer Society's Software Engineering Body of Knowledge defines "software engineering" as the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software, and the study of these approaches; that is, the application of engineering to software.It is the application of Engineering to software because it integrates significant mathematics, computer science and practices whose origins are in Engineering.

Software development, a much used and more generic term, does not necessarily subsume the engineering paradigm. Although it is questionable what impact it has had on actual software development over the last more than 40 years, the field's future looks bright according to Money Magazine and Salary.com, who rated "software engineering" as the best job in the United States in 2006.

History

When the first modern digital computers appeared in the early 1940s, the instructions to make them operate were wired into the machine. Practitioners quickly realized that this design was not flexible and came up with the "stored program architecture" or von Neumann architecture. Thus the first division between "hardware" and "software" began with abstraction being used to deal with the complexity of computing.
Programming languages started to appear in the 1950s and this was also another major step in abstraction. Major languages such as Fortran, ALGOL, and COBOL were released in the late 1950s to deal with scientific, algorithmic, and business problems respectively. E.W. Dijkstra wrote his seminal paper, "Go To Statement Considered Harmful", in 1968 and David Parnas introduced the key concept of modularity and information hiding in 1972 to help programmers deal with the ever increasing complexity of software systems. A software system for managing the hardware called an operating system was also introduced, most notably by Unix in 1969. In 1967, the Simula language introduced the object-oriented programming paradigm.
These advances in software were met with more advances in computer hardware. In the mid 1970s, the microcomputer was introduced, making it economical for hobbyists to obtain a computer and write software for it. This in turn led to the now famous Personal Computer (PC) and Microsoft Windows. The Software Development Life Cycle or SDLC was also starting to appear as a consensus for centralized construction of software in the mid 1980s. The late 1970s and early 1980s saw the introduction of several new Simula-inspired object-oriented programming languages, including Smalltalk, Objective-C, and C++.
Open-source software started to appear in the early 90s in the form of Linux and other software introducing the "bazaar" or decentralized style of constructing software. Then the World Wide Web and the popularization of the Internet hit in the mid 90s, changing the engineering of software once again. Distributed systems gained sway as a way to design systems, and the Java programming language was introduced with its own virtual machine as another step in abstraction. Programmers collaborated and wrote the Agile Manifesto, which favored more lightweight processes to create cheaper and more timely software.
The current definition of software engineering is still being debated by practitioners today as they struggle to come up with ways to produce software that is "cheaper, better, faster". Cost reduction has been a primary focus of the IT industry since the 1990s. Total cost of ownership represents the costs of more than just acquisition. It includes things like productivity impediments, upkeep efforts, and resources needed to support infrastructure.

Profession

Main article: Software engineer
Legal requirements for the licensing or certification of professional software engineers vary around the world. In the UK, the British Computer Society licenses software engineers and members of the society can also become Chartered Engineers (CEng), while in some areas of Canada, such as Alberta, Ontario, and Quebec, software engineers can hold the Professional Engineer (P.Eng)designation and/or the Information Systems Professional (I.S.P.) designation; however, there is no legal requirement to have these qualifications. In Israel a person with an appropriate engineering degree has the right to be listed in Israel's Registry of Engineers and Architects, and Israeli engineering law says that a person calling themselves an engineer without the proper license / registration could be sentenced to up to 6 months in jail.
The IEEE Computer Society and the ACM, the two main professional organizations of software engineering, publish guides to the profession of software engineering. The IEEE's Guide to the Software Engineering Body of Knowledge - 2004 Version, or SWEBOK, defines the field and describes the knowledge the IEEE expects a practicing software engineer to have. The IEEE also promulgates a "Software Engineering Code of Ethics".

Employment
In 2004, the U. S. Bureau of Labor Statistics counted 760,840 software engineers holding jobs in the U.S.; in the same time period there were some 1.4 million practitioners employed in the U.S. in all other engineering disciplines combined.Due to its relative newness as a field of study, formal education in software engineering is often taught as part of a computer science curriculum, and many software engineers hold computer science degrees.
Many software engineers work as employees or contractors. Software engineers work with businesses, government agencies (civilian or military), and non-profit organizations. Some software engineers work for themselves as freelancers. Some organizations have specialists to perform each of the tasks in the software development process. Other organizations require software engineers to do many or all of them. In large projects, people may specialize in only one role. In small projects, people may fill several or all roles at the same time. Specializations include: in industry (analysts, architects, developers, testers, technical support, middleware analysts, managers) and in academia (educators, researchers).

Certification
The Software Engineering Institute offers certification on specific topics like Security, Process improvement and Software architecture. Apple, IBM, Microsoft and other companies also sponsor their own certification examinations. Many IT certification programs are oriented toward specific technologies, and managed by the vendors of these technologies. These certification programs are tailored to the institutions that would employ people who use these technologies.
Broader certification of general software engineering skills is available through various professional societies. As of 2006, the IEEE had certified over 575 software professionals as a Certified Software Development Professional (CSDP). In 2008 they added an entry-level certification known as the Certified Software Development Associate (CSDA). In the U.K. the British Computer Society has developed a legally recognized professional certification called Chartered IT Professional (CITP), available to fully qualified Members (MBCS). In Canada the Canadian Information Processing Society has developed a legally recognized professional certification called Information Systems Professional (ISP). The ACM had a professional certification program in the early 1980s, which was discontinued due to lack of interest. The ACM examined the possibility of professional certification of software engineers in the late 1990s, but eventually decided that such certification was inappropriate for the professional industrial practice of software engineering.

Impact of globalization
The initial impact of outsourcing, and the relatively lower cost of international human resources in developing third world countries led to the dot com bubble burst of the 1990s. This had a negative impact on many aspects of the software engineering profession. For example, some students in the developed world avoid education related to software engineering because of the fear of offshore outsourcing (importing software products or services from other countries) and of being displaced by foreign visa workers. Although statistics do not currently show a threat to software engineering itself; a related career, computer programming does appear to have been affected. Nevertheless, the ability to smartly leverage offshore and near-shore resources in an efficient fashion has improved the overall operational capability of many organizations. When Europeans are leaving work, Asians are just arriving to work. When Asians are leaving work, Europeans are arriving to work. This provides a continuous ability to have human oversight on business-critical processes 24 hours per day, without paying overtime compensation or disrupting key human resource sleep patterns.

Education

A knowledge of programming is a pre-requisite to becoming a software engineer. In 2004 the IEEE Computer Society produced the SWEBOK, which has been published as ISO/IEC Technical Report 19759:2004, describing the body of knowledge that they believe should be mastered by a graduate software engineer with four years of experience. Many software engineers enter the profession by obtaining a university degree or training at a vocational school. One standard international curriculum for undergraduate software engineering degrees was defined by the CCSE, and updated in 2004. A number of universities have Software Engineering degree programs; as of 2010, there were 244 Campus programs, 70 Online programs, 230 Masters-level programs, 41 Doctorate-level programs, and 69 Certificate-level programs in the United States.
In addition to university education, many companies sponsor internships for students wishing to pursue careers in information technology. These internships can introduce the student to interesting real-world tasks that typical software engineers encounter every day. Similar experience can be gained through military service in software engineering.

Sub-disciplines

Software engineering can be divided into ten subdisciplines. They are:
Software requirements: The elicitation, analysis, specification, and validation of requirements for software.
Software design: The design of software is usually done with Computer-Aided Software Engineering (CASE) tools and use standards for the format, such as the Unified Modeling Language (UML).
Software development: The construction of software through the use of programming languages.
Software testing
Software maintenance: Software systems often have problems and need enhancements for a long time after they are first completed. This subfield deals with those problems.
Software configuration management: Since software systems are very complex, their configuration (such as versioning and source control) have to be managed in a standardized and structured method.
Software engineering management: The management of software systems borrows heavily from project management, but there are nuances encountered in software not seen in other management disciplines.
Software development process: The process of building software is hotly debated among practitioners; some of the better-known processes are the Waterfall Model, the Spiral Model, Iterative and Incremental Development, and Agile Development.
Software engineering tools, see Computer Aided Software Engineering
Software quality

Related disciplines

Software engineering is related to the disciplines of computer science, management science, and systems engineering.

Computer science
Software engineering is considered an area of computer science by some academics. Many of the foundations of software engineering come from computer science.

Project management
The building of a software system is usually considered a project and the management of it borrows many principles from the field of Project management.

Systems engineering
Systems engineers have been dealing with the complexity of large systems for many decades and their knowledge is applied to many software engineering problems.


(source:wikipedia)

Sunday, November 28

Analytical engine

The analytical engine, an important step in the history of computers, was the design of a mechanical general-purpose computer by English mathematician Charles Babbage. In its logical design the machine was essentially modern, anticipating the first completed general-purpose computers by about 100 years. It was first described in 1837. Babbage continued to refine the design until his death in 1871. Because of the complexity of the machine, the lack of project management science, the expense of its construction, and the difficulty of assessing its value by Parliament relative to other projects being lobbied for, the engine was never built.
A partial construction of one of Babbage's machines was done by his son Henry and also more recently the construction of one of his simpler designs was done by the British Science Museum. Indications are today that the machine could have been built successfully with the technology of the era if funding and political support had been stronger.

Design

Babbage's first attempt at a mechanical computing device was the difference engine, a special-purpose calculator designed to tabulate logarithms and trigonometric functions by evaluating finite differences to create approximating polynomials. During this project he realized that a much more general design was possible and started work designing the analytical engine.
The input (programs and data) was to be provided to the machine via punched cards, a method being used at the time to direct mechanical looms such as the Jacquard loom. For output, the machine would have a printer, a curve plotter and a bell. The machine would also be able to punch numbers onto cards to be read in later. It employed ordinary base-10 fixed-point arithmetic.
There was to be a store (that is, a memory) capable of holding 1,000 numbers of 50 decimal digits each (ca. 20.7 kB). An arithmetical unit (the "mill") would be able to perform all four arithmetic operations, plus comparisons and optionally square roots. Initially it was conceived as a difference engine curved back upon itself, in a generally circular layout, with the long store exiting off to one side. (Later drawings depict a regularized grid layout.) Like the central processing unit (CPU) in a modern computer, the mill would rely upon its own internal procedures, to be stored in the form of pegs inserted into rotating drums called "barrels", to carry out some of the more complex instructions the user's program might specify. (See microcode for the modern equivalent.)
The programming language to be employed by users was akin to modern day assembly languages. Loops and conditional branching were possible, and so the language as conceived would have been Turing-complete long before Alan Turing's concept. Three different types of punch cards were used: one for arithmetical operations, one for numerical constants, and one for load and store operations, transferring numbers from the store to the arithmetical unit or back. There were three separate readers for the three types of cards.
In 1842, the Italian mathematician Luigi Menabrea, whom Babbage had met while travelling in Italy, wrote a description of the engine in French. In 1843, the description was translated into English and extensively annotated by Ada Byron, Countess of Lovelace, who had become interested in the engine ten years earlier. In recognition of her additions to Menabrea's paper, which included a way to calculate Bernoulli numbers using the machine, she has been described as the first computer programmer. The modern computer programming language Ada is named in her honour.

Partial construction

Late in his life, Babbage sought ways to build a simplified version of the machine, and assembled a small part of it before his death in 1871. But in 1878, a committee of the British Association for the Advancement of Science recommended against constructing the analytical engine, which sank Babbage's efforts for government funding.
In 1910, Babbage's son Henry Prevost Babbage reported that a part of the mill and the printing apparatus had been constructed and had been used to calculate a (faulty) list of multiples of pi. This constituted only a small part of the whole engine; it was not programmable and had no storage. (Popular images of this section have sometimes been mislabelled, implying that it was the entire mill or even the entire engine.) Henry Babbage's "Analytical Engine Mill" is on display at the Science Museum in London


Henry Babbage's Analytical Engine Mill, built in 1910, in the Science Museum (London)
Henry also proposed building a demonstration version of the full engine, with a smaller storage capacity: "perhaps for a first machine ten[columns] would do, with fifteen wheels in each". Such a version could manipulate 20 numbers of 25 digits each, and what it could be told to do with those numbers could still be impressive. "It is only a question of cards and time," wrote Henry Babbage in 1888, "... and there is no reason why [twenty thousand] cards should not be used if necessary, in an Analytical Engine for the purposes of the mathematician."

Influence

Computer science
From 1872 Henry continued diligently with his father's work and then intermittently in retirement in 1875. . Percy Ludgate wrote about the engine in 1915 and even designed his own analytical engine (it was drawn up in detail but never built). Ludgate's engine would be much smaller than Babbage's of about 8 cubic feet (230 L) and hypothetically would be capable of multiplying two 20-decimal-digit numbers in about six seconds. Leonardo Torres y Quevedo and Vannevar Bush also knew of Babbage's work, though the three inventors likely did not know of each other. Howard Aiken considered Charles Babbage to be his intellectual "father" 
Closely related to Babbage's work on the analytical engine was the work of George Stibitz of Bell Laboratories in New Jersey just prior to World War II, as well as Howard Hathaway Aiken at Harvard University during and just after WWII. They both built electromechanical (i.e. relay-and-switch) computers, though neither was quite a modern programmable computer. Aiken's machine was largely financed by IBM and was called the Harvard Mark I. Aiken was inspired by a piece of the Analytical engine deposited at the university by Henry Babbage in 1886, and discovered by him in the 1930s. He gained access to Babbage's writings and later claimed, pointing to Babbage's books:
There's my education in computers, right there; this is the whole thing, everything I took out of a book.
In molecular nanotechnology, the earliest proposal for a way to implement extremely small and fast computers relied upon logic gates constructed from sliding rods and stubby protrusions to conditionally restrict their motion. Similar computational "rod-logic" was present in the sliding control levers and studded barrel devices which were used to access the microprogram in Babbage's design.
As soon as an Analytical Engine exists, it will necessarily guide the future course of the science.
—Passages from the Life of a Philosopher, Charles Babbage

Fiction
The cyberpunk novelists William Gibson and Bruce Sterling co-authored a steampunk novel of alternative history titled The Difference Engine in which Babbage's difference and analytical engines became available to Victorian society. The novel explores the consequences and implications of the early introduction of computational technology.
There is also mention of the Analytical Engine (or the Clockwork Ouroboros as it is also known there) in The Book of the War, a Faction Paradox anthology edited by Lawrence Miles. This machine was used to calculate a way into the "Eleven Day Empire". Its use resulted in the destruction of the original Houses of Parliament.
In the novel Perdido Street Station, by British author China Miéville, analytical engines similar to Babbage's serve as "brains" for the robotic constructs of the city of New Crobuzon. One such engine even develops sentient thought due to a recursive algorithmic loop.
The British Empire of The Peshawar Lancers by S. M. Stirling features a massive water powered engine at Oxford, used by two of the main characters. It is noted that most of the engines run on steam, and that an even larger one is under construction at the British Capital in Delhi.
In the Michael Flynn novel In the Country of the Blind, a secret society calling itself the Babbage Society secretly financed the building of Babbage Engines in the mid-19th century. In the novel, the Society uses the Babbage engines along with a statistical science called Cliology to predict and manipulate future history. In the process, they predict the rise of the Nazis and accidentally start the US Civil War.
In the Neal Stephenson novel The Diamond Age, ubiquitous molecular nanotechology is described to make use of 'rod logic' similar to that imagined by Babbage's design for the analytical engine.
Moriarty by Modem, a short story by Jack Nimersheim, describes an alternate history where Babbage's analytical engine was indeed completed and had been deemed highly classified by the British government. The characters of Sherlock Holmes and Moriarty had in reality been a set of prototype programs written for the analytical engine. This short story follows Holmes as his program is rebooted on modern computers and he is forced to compete against his nemesis yet again in the modern counterparts of Babbage's analytical engine.
A similar setting is used by Sydney Padua in the webcomic The Thrilling Adventures of Lovelace and Babbage. It features a pocket universe where Ada Lovelace and Babbage have built the analytical engine and use it to fight crime by Queen Victoria's request. The comic is based on thorough research on the biographies and correspondence between Babbage and Lovelace, which is then twisted for humorous effect.
Georgia on My Mind is a novelette by Charles Sheffield which involves two major themes: being widowed and the quest for a legendary Babbage computer.
Hugh Cook's fantasy novels The Wishstone and the Wonderworkers and The Wazir and the Witch feature an Analytical Engine created by the scientist Ivan Pokrov. It is used to calculate income tax.

Comparison to other early computers

If the Analytical Engine had been built, it would have been in many ways more advanced than some of the first computers that emerged in the 1940s. It would have been digital, programmable and Turing complete. However, it would have been very slow. Ada Lovelace reported in her notes on the Analytical engine: "Mr. Babbage believes he can, by his engine, form the product of two numbers, each containing twenty figures, in three minutes". By comparison the Harvard Mark I could perform the same task in just six seconds. A modern PC can do the same thing in well under a millionth of a second. However, extrapolating the speed doubling rate of computers backwards (roughly every two years, according to one variant of Moore's Law) still puts the Analytical Engine far ahead of its time.
Defining characteristics of some early digital computers of the 1940s (In the history of computing hardware)
Name First operational Numeral system Computing mechanism Programming Turing complete
Zuse Z3 (Germany) May 1941 Binary floating point Electro-mechanical Program-controlled by punched film stock (but no conditional branch) Yes (1998)
Atanasoff–Berry Computer (US) 1942 Binary Electronic Not programmable—single purpose No
Colossus Mark 1 (UK) February 1944 Binary Electronic Program-controlled by patch cables and switches No
Harvard Mark I – IBM ASCC (US) May 1944 Decimal Electro-mechanical Program-controlled by 24-channel punched paper tape (but no conditional branch) No
Colossus Mark 2 (UK) June 1944 Binary Electronic Program-controlled by patch cables and switches No
Zuse Z4 (Germany) March 1945 Binary floating point Electro-mechanical Program-controlled by punched film stock Yes
ENIAC (US) July 1946 Decimal Electronic Program-controlled by patch cables and switches Yes
Manchester Small-Scale Experimental Machine (Baby) (UK) June 1948 Binary Electronic Stored-program in Williams cathode ray tube memory Yes
Modified ENIAC (US) September 1948 Decimal Electronic Program-controlled by patch cables and switches plus a primitive read-only stored programming mechanism using the Function Tables as program ROM Yes
EDSAC (UK) May 1949 Binary Electronic Stored-program in mercury delay line memory Yes
Manchester Mark 1 (UK) October 1949 Binary Electronic Stored-program in Williams cathode ray tube memory and magnetic drum memory Yes
CSIRAC (Australia) November 1949 Binary Electronic Stored-program in mercury delay line memory Yes

2010 Construction Plans

In October 2010, John Graham-Cumming started a campaign to raise funds by 'public subscription' to enable serious historical and academic study of Babbage's plans, with a view to then build and test a fully working virtual design which will then in turn enable construction of the physical Analytical Engine. 




(source:wikipedia)

Unconventional computing

Unconventional computing is computing by a wide range of new or unusual methods. It is also known as alternative computing. The different methods of unconventional computing include optical computing, quantum computing, chemical computing, natural computing, biologically-inspired computing, wetware computing, DNA computing, molecular computing, amorphous computing, nanocomputing, reversible computing, ternary computing, fluidics, analogue computing, and Domino Computation.
Historically, mechanical computers were used in industry before the advent of the transistor. Mechanical computers retain some interest today both in research and as analogue computers. Some mechanical computers have a theoretical or didactic relevance, such as billiard-ball computers or hydraulic ones, and are actually simulated. (No attempt is made to build a functioning computer through the mechanic collisions of billiard balls.) The Domino computer is another theoretically interesting mechanic computing scheme.
Unconventional computing is, according to a recent conference description, "an interdisciplinary research area with the main goal to enrich or go beyond the standard models, such as the von-Neumann computer architecture and the Turing machine, which have dominated computer science for more than half a century". These methods model their computational operations based on non-standard paradigms, and are currently mostly in the research and development stage. This computing behavior can be "simulated" using the classical silicon-based micro-transistors or solid state computing technologies, but aim to achieve a new kind of computing engineering inspired in nature.

Mechanisms

Billiard balls (billiard ball computer); this is an unintuitive and pedagogical example that a computer can be made out of almost anything.
Light (optical computing)
Computers can manipulate information as light (rather than electricity or billiard balls).
Molecules (DNA computing, chemical computing)
Gears, levels, dials, etc. (analog computer/mechanical computers)
Neurons (wetware computer)
Fluid (fluidics)
Agents acting under a special set of rules (cellular automata)
People acting under a set of rules can be part of a computer; example. If the "agent" was a human, it would not be major part of the computer, exactly like a single neuron is not an entire brain system.
Quantum mechanics (quantum computing)



(source:wikipedia)

Memory protection

Memory protection is a way to control memory access rights on a computer, and is a part of most modern operating systems. The main purpose of memory protection is to prevent a process from accessing memory that has not been allocated to it. This prevents a bug within a process from affecting other processes, or the operating system itself. Memory protection is a behavior that is distinct from ASLR and the NX bit.

Methods

Segmentation
Segmentation refers to dividing a computer's memory into segments.
The x86 architecture has multiple segmentation features, which are helpful for using protected memory on this architecture. On the x86 processor architecture, the Global Descriptor Table and Local Descriptor Tables can be used to reference segments in the computer's memory. Pointers to memory segments on x86 processors can also be stored in the processor's segment registers. Initially x86 processors had 4 segment registers, CS (code segment), SS (stack segment), DS (data segment) and ES (extra segment); later another two segment registers were added – FS and GS.

Paged virtual memory
Main article: Paged virtual memory
In paging, the memory address space is divided into equal, small pieces, called pages. Using a virtual memory mechanism, each page can be made to reside in any location of the physical memory, or be flagged as being protected. Virtual memory makes it possible to have a linear virtual memory address space and to use it to access blocks fragmented over physical memory address space.
Most computer architectures based on pages, most notably x86 architecture, also use pages for memory protection.
A page table is used for mapping virtual memory to physical memory. The page table is usually invisible to the process. Page tables make it easier to allocate new memory, as each new page can be allocated from anywhere in physical memory.
By such design, it is impossible for an application to access a page that has not been explicitly allocated to it, simply because any memory address, even a completely random one, that application may decide to use, either points to an allocated page, or generates a page fault (PF). Unallocated pages simply do not have any addresses from the application point of view.
As a side note, a PF may not be a fatal occurrence. Page faults are used not only for memory protection, but also in another interesting way: the OS may intercept the PF, and may load a page that has been previously swapped out to disk, and resume execution of the application which had caused the page fault. This way, the application receives the memory page as needed. This scheme, known as swapped virtual memory, allows in-memory data not currently in use to be moved to disk storage and back in a way which is transparent to applications, to increase overall memory capacity.

Protection keys
A protection key mechanism divides physical memory up into blocks of a particular size (e.g., 2 kiB), each of which has an associated numerical value called a protection key. Each process also has a protection key value associated with it. On a memory access the hardware checks that the current process's protection key matches the value associated with the memory block being accessed; if not, an exception occurs. This mechanism was used in the System/360 architecture.
The System/360 protection keys described above are associated with physical addresses. This is different from the protection key mechanism used by processors such as the Intel Itanium and the Hewlett-Packard Precision Architecture (HP/PA, also known as PA-RISC), which are associated with virtual addresses, and which allow multiple keys per process.
In the Itanium and PA processor architectures, translations (TLB entries) have keys (Itanium) or access ids (PA) associated with them. A running process has several protection key registers (16 for Itanium, 4 for HP PA). A translation selected by the virtual address has its key compared to each of the protection key registers. If any of them match (plus other possible checks), the access is permitted. If none match, a fault or exception is generated. The software fault handler can, if desired, check the missing key against a larger list of keys maintained by software; thus, the protection key registers inside the processor may be treated as a software managed cache of a larger list of keys associated with a process.
PA has 15–18 bits of key; Itanium mandates at least 18. Keys are usually associated with protection domains, such as libraries, modules, etc.

Simulated segmentation
Simulation is use of a monitoring program to interpret the machine code instructions of some computer. Such an Instruction Set Simulator can provide memory protection by using a segmentation-like scheme and validating the target address and length of each instruction in real time before actually executing them. The simulator must calculate the target address and length and compare this against a list of valid address ranges that it holds concerning the thread's environment, such as any dynamic memory blocks acquired since the thread's inception plus any valid shared static memory slots. The meaning of "valid" may change throughout the thread's life depending upon context: it may sometimes be allowed to alter a static block of storage, and sometimes not, depending upon the current mode of execution which may or may not depend on a storage key or supervisor state.
It is generally not advisable to use this method of memory protection where adequate facilities exist on a CPU, as this takes valuable processing power from the computer. However it is generally used for debugging and testing purposes to provide an extra fine level of granularity to otherwise generic storage violations and can indicate precisely which instruction is attempting to overwrite the particular section of storage which may have the same storage key as unprotected storage. Early IBM teleprocessing systems, such as CICS, multi-threaded commercial transactions in shared and unprotected storage for around 20 years.

Capability-based addressing
Capability-based addressing is a method of memory protection that is unused in modern commercial computers. In this, pointers are replaced by protected objects (called capabilities) that can only be created via using privileged instructions which may only be executed by the kernel, or some other process authorized to do so. This effectively lets the kernel control which processes may access which objects in memory, with no need to use separate address spaces or context switches. Capabilities have never gained mainstream adoption in commercial hardware, but they are widely used in research systems such as KeyKOS and its successors, and are used conceptually as the basis for some virtual machines, most notably Smalltalk and Java.

Measures

A useful estimation of the protection level of a particular implementation, is to measure how closely it adheres to the principle of minimum privilege.

Memory protection in different operating systems

Different Operating Systems use different forms of memory protection or separation. True memory separation was not used in home computer operating systems until Windows XP and Mac OS X, which were released in 2001. It is possible for processes to access System Memory in the Windows 9x family of Operating Systems .
Some operating systems that do implement memory protection include
Microsoft Windows family from Windows NT 3.1
most Unix-like systems, including
Solaris
Linux
BSD
Mac OS X
GNU Hurd


(source:wikipedia0