Computer programming: Difference between revisions
Jump to navigation
Jump to search
| [unchecked revision] | [unchecked revision] |
imported>Wikideas1 |
imported>Pyrrhic victor m Reverted edits by ~2026-28856-35 (talk): unexplained deletion (WS) |
||
| Line 3: | Line 3: | ||
{{Use American English|date=November 2020}} | {{Use American English|date=November 2020}} | ||
{{Software development process}} | {{Software development process}} | ||
'''Computer programming''' or '''coding''' is the composition of sequences of instructions, called [[computer program|programs]], that [[computer]]s can follow to perform tasks.<ref>{{cite web|url=http://yearofcodes.tumblr.com/what-is-coding|title=What is coding|last=Bebbington|first=Shaun|year=2014|website=Tumblr|url-status=live|archive-url=https://web.archive.org/web/20200429195646/https://yearofcodes.tumblr.com/what-is-coding|archive-date=2020-04-29|access-date=2014-03-03}}</ref><ref>{{cite web|url=http://yearofcodes.tumblr.com/what-is-programming|title=What is programming|last=Bebbington|first=Shaun|year=2014|website=Tumblr|url-status=live|archive-url=https://web.archive.org/web/20200429195958/https://yearofcodes.tumblr.com/what-is-programming|archive-date=2020-04-29|access-date=2014-03-03}}</ref> It involves designing and implementing [[algorithm]]s, step-by-step specifications of procedures, by writing [[source code|code]] in one or more [[programming language]]s. | '''Computer programming''' or '''coding''' is the composition of sequences of instructions, called [[computer program|programs]], that [[computer]]s can follow to perform tasks.<ref>{{cite web|url=http://yearofcodes.tumblr.com/what-is-coding|title=What is coding|last=Bebbington|first=Shaun|year=2014|website=Tumblr|url-status=live|archive-url=https://web.archive.org/web/20200429195646/https://yearofcodes.tumblr.com/what-is-coding|archive-date=2020-04-29|access-date=2014-03-03}}</ref><ref>{{cite web|url=http://yearofcodes.tumblr.com/what-is-programming|title=What is programming|last=Bebbington|first=Shaun|year=2014|website=Tumblr|url-status=live|archive-url=https://web.archive.org/web/20200429195958/https://yearofcodes.tumblr.com/what-is-programming|archive-date=2020-04-29|access-date=2014-03-03}}</ref> It involves designing and implementing [[algorithm]]s, step-by-step specifications of procedures, by writing [[source code|code]] in one or more [[programming language]]s. [[Programmer]]s typically use [[high-level programming language]]s that are more easily intelligible to humans than [[machine code]], which is directly executed by the [[central processing unit]]. Proficient programming usually requires expertise in several different subjects, including knowledge of the [[Domain (software engineering)|application domain]], details of programming languages and generic code [[library (computing)|libraries]], specialized algorithms, and [[Logic#Formal logic|formal logic]]. | ||
Auxiliary tasks accompanying and related to programming include [[Requirements analysis|analyzing requirements]], [[Software testing|testing]], [[debugging]] (investigating and fixing problems), implementation of [[Build automation|build systems]], and management of derived [[Artifact (software development)|artifacts]], such as programs' [[machine code]]. While these are sometimes considered programming, often the term ''[[software development]]'' is used for this larger overall process – with the terms ''programming'', ''implementation'', and ''coding'' reserved for the writing and editing of code per se. Sometimes software development is known as ''[[software engineering]]'', especially when it employs [[formal methods]] or follows an [[engineering design process]]. | Auxiliary tasks accompanying and related to programming include [[Requirements analysis|analyzing requirements]], [[Software testing|testing]], [[Debugging tool|debugging]] (investigating and fixing problems), implementation of [[Build automation|build systems]], and management of derived [[Artifact (software development)|artifacts]], such as programs' [[machine code]]. While these are sometimes considered programming, often the term ''[[software development]]'' is used for this larger overall process – with the terms ''programming'', ''implementation'', and ''coding'' reserved for the writing and editing of code per se. Sometimes software development is known as ''[[software engineering]]'', especially when it employs [[formal methods]] or follows an [[engineering design process]]. | ||
==History== | ==History== | ||
| Line 15: | Line 15: | ||
[[Code-breaking]] algorithms have also existed for centuries. In the 9th century, the [[Mathematics in medieval Islam|Arab mathematician]] [[Al-Kindi]] described a [[cryptographic]] algorithm for deciphering encrypted code, in ''A Manuscript on Deciphering Cryptographic Messages''. He gave the first description of [[cryptanalysis]] by [[frequency analysis]], the earliest code-breaking algorithm.<ref>{{cite book |last1=Dooley |first1=John F. |title=A Brief History of Cryptology and Cryptographic Algorithms |date=2013 |publisher=Springer Science & Business Media |isbn=9783319016283 |pages=12–3}}</ref> | [[Code-breaking]] algorithms have also existed for centuries. In the 9th century, the [[Mathematics in medieval Islam|Arab mathematician]] [[Al-Kindi]] described a [[cryptographic]] algorithm for deciphering encrypted code, in ''A Manuscript on Deciphering Cryptographic Messages''. He gave the first description of [[cryptanalysis]] by [[frequency analysis]], the earliest code-breaking algorithm.<ref>{{cite book |last1=Dooley |first1=John F. |title=A Brief History of Cryptology and Cryptographic Algorithms |date=2013 |publisher=Springer Science & Business Media |isbn=9783319016283 |pages=12–3}}</ref> | ||
The first [[computer program]] is generally dated to 1843 when mathematician [[Ada Lovelace]] published an [[algorithm]] to calculate a sequence of [[Bernoulli numbers]], intended to be carried out by [[Charles Babbage]]'s [[Analytical Engine]].<ref name="IEEE">{{Cite journal | last1 = Fuegi | first1 = J. | last2 = Francis | first2 = J. | title = Lovelace & Babbage and the Creation of the 1843 'notes' | journal = IEEE Annals of the History of Computing | volume = 25 | issue = 4 | pages = 16 | year = 2003 | doi = 10.1109/MAHC.2003.1253887}}</ref> The algorithm, which was conveyed through notes on a translation of Luigi Federico Menabrea's paper on the analytical engine was mainly conceived by Lovelace as can be discerned through her correspondence with Babbage. However, Charles Babbage himself had written a program for the AE in 1837.<ref name="IEEE2021">{{Cite journal | last1 = Rojas | first1 = R. | title = The Computer Programs of Charles Babbage | journal = IEEE Annals of the History of Computing | volume = 43 | issue = 1 | pages = 6–18 | year = 2021 | doi = 10.1109/MAHC.2020.3045717}}</ref><ref name="IEEE2024">{{Cite journal | last1 = Rojas | first1 = R. | title = The First Computer Program | journal = Communications of the ACM | volume = 67 | issue = 6 | pages = 78–81 | year = 2024 | doi = 10.1145/3624731| doi-access = free | url = https://refubium.fu-berlin.de/bitstream/fub188/44090/1/3624731.pdf }}</ref> Lovelace was also the first to see a broader application for the analytical engine beyond mathematical calculations. | The first [[computer program]] is generally dated to 1843 when mathematician [[Ada Lovelace]] published an [[algorithm]] to calculate a sequence of [[Bernoulli numbers]], intended to be carried out by [[Charles Babbage]]'s [[Analytical Engine]].<ref name="IEEE">{{Cite journal | last1 = Fuegi | first1 = J. | last2 = Francis | first2 = J. | title = Lovelace & Babbage and the Creation of the 1843 'notes' | journal = IEEE Annals of the History of Computing | volume = 25 | issue = 4 | pages = 16 | year = 2003 | doi = 10.1109/MAHC.2003.1253887 | bibcode = 2003IAHC...25d..16F }}</ref> The algorithm, which was conveyed through notes on a translation of Luigi Federico Menabrea's paper on the analytical engine was mainly conceived by Lovelace as can be discerned through her correspondence with Babbage. However, Charles Babbage himself had written a program for the AE in 1837.<ref name="IEEE2021">{{Cite journal | last1 = Rojas | first1 = R. | title = The Computer Programs of Charles Babbage | journal = IEEE Annals of the History of Computing | volume = 43 | issue = 1 | pages = 6–18 | year = 2021 | doi = 10.1109/MAHC.2020.3045717 | bibcode = 2021IAHC...43a...6R }}</ref><ref name="IEEE2024">{{Cite journal | last1 = Rojas | first1 = R. | title = The First Computer Program | journal = Communications of the ACM | volume = 67 | issue = 6 | pages = 78–81 | year = 2024 | doi = 10.1145/3624731| doi-access = free | url = https://refubium.fu-berlin.de/bitstream/fub188/44090/1/3624731.pdf }}</ref> Lovelace was also the first to see a broader application for the analytical engine beyond mathematical calculations. | ||
[[File:PunchCardDecks.agr.jpg|thumb|Data and instructions were once stored on external [[punched card]]s, which were kept in order and arranged in program decks.]] | [[File:PunchCardDecks.agr.jpg|thumb|Data and instructions were once stored on external [[punched card]]s, which were kept in order and arranged in program decks.]] | ||
In the 1880s, [[Herman Hollerith]] invented the concept of storing ''data'' in machine-readable form.<ref>{{cite web|url=http://www.columbia.edu/acis/history/hollerith.html|title=Columbia University Computing History – Herman Hollerith|last=da Cruz|first=Frank|date=2020-03-10|website=Columbia University|publisher=Columbia.edu|url-status=live|archive-url=https://web.archive.org/web/20200429210742/http://www.columbia.edu/cu/computinghistory/hollerith.html|archive-date=2020-04-29|access-date=2010-04-25}}</ref> Later a [[plugboard|control panel]] (plug board) added to his 1906 Type I Tabulator allowed it to be programmed for different jobs, and by the late 1940s, [[unit record equipment]] such as the [[IBM 602]] and [[IBM 604]], were programmed by control panels in a similar way, as were the first [[electronic computer]]s. However, with the concept of the [[stored-program computer]] introduced in 1949, both programs and data were stored and manipulated in the same way in [[computer memory]].<ref>{{cite web |title=Memory & Storage {{!}} Timeline of Computer History {{!}} Computer History Museum |url=https://www.computerhistory.org/timeline/memory-storage/ |website=www.computerhistory.org |access-date=3 June 2021 |archive-date=May 27, 2021 |archive-url=https://web.archive.org/web/20210527071533/https://www.computerhistory.org/timeline/memory-storage/ |url-status=live }}</ref> | In the 1880s, [[Herman Hollerith]] invented the concept of storing ''data'' in machine-readable form.<ref>{{cite web|url=http://www.columbia.edu/acis/history/hollerith.html|title=Columbia University Computing History – Herman Hollerith|last=da Cruz|first=Frank|date=2020-03-10|website=Columbia University|publisher=Columbia.edu|url-status=live|archive-url=https://web.archive.org/web/20200429210742/http://www.columbia.edu/cu/computinghistory/hollerith.html|archive-date=2020-04-29|access-date=2010-04-25}}</ref> Later a [[plugboard|control panel]] (plug board) added to his 1906 Type I Tabulator allowed it to be programmed for different jobs, and by the late 1940s, [[unit record equipment]] such as the [[IBM 602]] and [[IBM 604]], were programmed by control panels in a similar way, as were the first [[electronic computer]]s. However, with the concept of the [[stored-program computer]] introduced in 1949, both programs and data were stored and manipulated in the same way in [[computer memory]].<ref>{{cite web |title=Memory & Storage {{!}} Timeline of Computer History {{!}} Computer History Museum |url=https://www.computerhistory.org/timeline/memory-storage/ |website=www.computerhistory.org |access-date=3 June 2021 |archive-date=May 27, 2021 |archive-url=https://web.archive.org/web/20210527071533/https://www.computerhistory.org/timeline/memory-storage/ |url-status=live }}</ref> Hands-on programming courses that integrate hardware and software have been shown to improve retention and engagement among first-year engineering students.<ref>{{cite conference |last1=Lumpp |first1=Janet K. |last2=Lovely |first2=Jennifer |last3=Letellier |first3=Laura M.P.E. |title=Instructional use of computers in a hands-on programming course for first-year engineering students |conference=ASEE Annual Conference and Exposition |year=2019 |url=https://scholars.uky.edu/en/publications/instructional-use-of-computers-in-a-hands-on-programming-course-f/ }}</ref> | ||
===Machine language=== | ===Machine language=== | ||
[[Machine code]] was the language of early programs, written in the [[instruction set architecture|instruction set]] of the particular machine, often in [[binary numeral system|binary]] notation. [[ | [[Machine code]] was the language of early programs, written in the [[instruction set architecture|instruction set]] of the particular machine, often in [[binary numeral system|binary]] notation. Soon, [[assembly language]]s were developed, allowing programmers to write instructions in a textual format (e.g., ADD X, TOTAL), using abbreviations for operation codes and meaningful names for memory addresses. However, because an assembly language is little more than a different notation for a machine language, two machines with [[Comparison of instruction set architectures|different instruction sets]] also have different assembly languages. | ||
[[File:IBM402plugboard.Shrigley.wireside.jpg|thumb|Wired [[plugboard|control panel]] for an [[IBM 402 Accounting Machine]]. Wires connect pulse streams from the card reader to counters and other internal logic and ultimately to the printer.]] | [[File:IBM402plugboard.Shrigley.wireside.jpg|thumb|Wired [[plugboard|control panel]] for an [[IBM 402 Accounting Machine]]. Wires connect pulse streams from the card reader to counters and other internal logic and ultimately to the printer.]] | ||
| Line 53: | Line 53: | ||
*[[Maintainability]]: the ease with which a program can be modified by its present or future developers in order to make improvements or to customize, fix [[Software bug|bugs]] and [[Vulnerability (computing)|security holes]], or adapt it to new environments. Good practices<ref>{{Cite web |url=http://wisdomgeek.com/programming/tips-become-good-programmer |title=Programming 101: Tips to become a good programmer - Wisdom Geek |date=May 19, 2016 |website=Wisdom Geek |language=en-US |access-date=2016-05-23 |archive-date=May 23, 2016 |archive-url=https://web.archive.org/web/20160523063915/http://wisdomgeek.com/programming/tips-become-good-programmer |url-status=live }}</ref> during initial development make the difference in this regard. This quality may not be directly apparent to the end user but it can significantly affect the fate of a program over the long term. | *[[Maintainability]]: the ease with which a program can be modified by its present or future developers in order to make improvements or to customize, fix [[Software bug|bugs]] and [[Vulnerability (computing)|security holes]], or adapt it to new environments. Good practices<ref>{{Cite web |url=http://wisdomgeek.com/programming/tips-become-good-programmer |title=Programming 101: Tips to become a good programmer - Wisdom Geek |date=May 19, 2016 |website=Wisdom Geek |language=en-US |access-date=2016-05-23 |archive-date=May 23, 2016 |archive-url=https://web.archive.org/web/20160523063915/http://wisdomgeek.com/programming/tips-become-good-programmer |url-status=live }}</ref> during initial development make the difference in this regard. This quality may not be directly apparent to the end user but it can significantly affect the fate of a program over the long term. | ||
*[[Algorithmic efficiency|Efficiency]]/[[performance engineering|performance]]: Measure of system resources a program consumes (processor time, memory space, slow devices such as disks, network bandwidth and to some extent even user interaction): the less, the better. This also includes careful management of resources, for example cleaning up [[temporary file]]s and eliminating [[memory leak]]s. This is often discussed under the shadow of a chosen programming language. Although the language certainly affects performance, even slower languages, such as [[Python (programming language)|Python]], can execute programs instantly from a human perspective. Speed, resource usage, and performance are important for programs that [[Bottleneck (software)|bottleneck]] the system, but efficient use of programmer time is also important and is related to cost: more hardware may be cheaper. | *[[Algorithmic efficiency|Efficiency]]/[[performance engineering|performance]]: Measure of system resources a program consumes (processor time, memory space, slow devices such as disks, network bandwidth and to some extent even user interaction): the less, the better. This also includes careful management of resources, for example cleaning up [[temporary file]]s and eliminating [[memory leak]]s. This is often discussed under the shadow of a chosen programming language. Although the language certainly affects performance, even slower languages, such as [[Python (programming language)|Python]], can execute programs instantly from a human perspective. Speed, resource usage, and performance are important for programs that [[Bottleneck (software)|bottleneck]] the system, but efficient use of programmer time is also important and is related to cost: more hardware may be cheaper. | ||
Using [[Test automation|automated tests]] and [[ | Using [[Test automation|automated tests]] and [[fitness function]]s can help to maintain some of the aforementioned attributes.<ref>{{Cite book |title=Fundamentals of Software Architecture: An Engineering Approach |publisher=O'Reilly Media |year=2020 |isbn=978-1492043454}}</ref> | ||
===Readability of source code=== | ===Readability of source code=== | ||
In computer programming, [[readability]] refers to the ease with which a human reader can comprehend the purpose, [[control flow]], and operation of [[source code]]. It affects the aspects of quality above, including portability, usability and most importantly maintainability. | In computer programming, [[readability]] refers to the ease with which a human reader can comprehend the purpose, [[control flow]], and operation of [[source code]]. It affects the aspects of quality above, including portability, usability and most importantly maintainability. | ||
[[File:Eclipse 4.4.png|thumb|Source code in integrated development environment]] | |||
Readability is important because programmers spend the majority of their time reading, trying to understand, reusing, and modifying existing source code, rather than writing new source code. Unreadable code often leads to bugs, inefficiencies, and [[Code duplication|duplicated code]]. A study found that a few simple readability transformations made code shorter and drastically reduced the time to understand it.<ref>{{cite journal|doi=10.1145/358589.358596|title=Improving computer program readability to aid modification|journal=Communications of the ACM|volume=25|issue=8|pages=512–521|year=1982|last1=Elshoff|first1=James L.|last2=Marcotty|first2=Michael|s2cid=30026641|doi-access=free}}</ref> | Readability is important because programmers spend the majority of their time reading, trying to understand, reusing, and modifying existing source code, rather than writing new source code. Unreadable code often leads to bugs, inefficiencies, and [[Code duplication|duplicated code]]. A study found that a few simple readability transformations made code shorter and drastically reduced the time to understand it.<ref>{{cite journal|doi=10.1145/358589.358596|title=Improving computer program readability to aid modification|journal=Communications of the ACM|volume=25|issue=8|pages=512–521|year=1982|last1=Elshoff|first1=James L.|last2=Marcotty|first2=Michael|s2cid=30026641|doi-access=free}}</ref> | ||
| Line 89: | Line 90: | ||
===Debugging=== | ===Debugging=== | ||
{{main|Debugging}} | {{main|Debugging}} | ||
[[File:First Computer Bug, | [[File:First Computer Bug, 1947.jpg|thumb|The first known actual bug causing a problem in a computer was a moth, trapped inside a Harvard mainframe, recorded in a log book entry dated September 9, 1947.<ref>{{cite web| url = https://www.nationalgeographic.org/thisday/sep9/worlds-first-computer-bug| title = Photograph courtesy Naval Surface Warfare Center, Dahlgren, Virginia, from National Geographic Sept. 1947| date = July 15, 2020| access-date = November 10, 2020| archive-date = November 13, 2020| archive-url = https://web.archive.org/web/20201113163443/https://www.nationalgeographic.org/thisday/sep9/worlds-first-computer-bug/| url-status = live}}</ref> "Bug" was already a common term for a software defect when this insect was found.]] | ||
Debugging is a very important task in the software development process since having defects in a program can have significant consequences for its users. Some languages are more prone to some kinds of faults because their specification does not require compilers to perform as much checking as other languages. Use of a [[static code analysis]] tool can help detect some possible problems. Normally the first step in debugging is to attempt to reproduce the problem. This can be a non-trivial task, for example as with parallel processes or some unusual software bugs. Also, specific user environment and usage history can make it difficult to reproduce the problem. | Debugging is a very important task in the software development process since having defects in a program can have significant consequences for its users. Some languages are more prone to some kinds of faults because their specification does not require compilers to perform as much checking as other languages. Use of a [[static code analysis]] tool can help detect some possible problems. Normally the first step in debugging is to attempt to reproduce the problem. This can be a non-trivial task, for example as with parallel processes or some unusual software bugs. Also, specific user environment and usage history can make it difficult to reproduce the problem. | ||
After the bug is reproduced, the input of the program may need to be simplified to make it easier to debug. For example, when a bug in a compiler can make it crash when [[parsing]] some large source file, a simplification of the test case that results in only few lines from the original source file can be sufficient to reproduce the same crash. Trial-and-error/divide-and-conquer is needed: the programmer will try to remove some parts of the original test case and check if the problem still exists. When debugging the problem in a GUI, the programmer can try to skip some user interaction from the original problem description and check if the remaining actions are sufficient for bugs to appear. Scripting and [[breakpoint]]ing are also part of this process. | After the bug is reproduced, the input of the program may need to be simplified to make it easier to debug. For example, when a bug in a compiler can make it crash when [[parsing]] some large source file, a simplification of the test case that results in only few lines from the original source file can be sufficient to reproduce the same crash. Trial-and-error/divide-and-conquer is needed: the programmer will try to remove some parts of the original test case and check if the problem still exists. When debugging the problem in a GUI, the programmer can try to skip some user interaction from the original problem description and check if the remaining actions are sufficient for bugs to appear. Scripting and [[breakpoint]]ing are also part of this process. | ||
Debugging is often done with [[Integrated development environment|IDE]]s. Standalone debuggers like [[GDB]] are also used, and these often provide less of a visual environment, usually using a [[command line]]. Some text editors such as [[Emacs]] allow GDB to be invoked through them, to provide a visual environment. | Debugging is often done with [[Integrated development environment|IDE]]s. Standalone debuggers like [[GDB]] are also used, and these often provide less of a visual environment, usually using a [[command line]]. Some text editors such as [[Emacs]] allow GDB to be invoked through them, to provide a visual environment. One study found that teaching structured languages such as Pascal improved novice programmers’ debugging accuracy and overall comprehension.<ref>{{cite journal |last1=Stone |first1=Dan N. |last2=Jordan |first2=Eleanor W. |last3=Wright |first3=M. Keith |title=The impact of Pascal education on debugging skill |journal=International Journal of Man-Machine Studies |year=1990 |volume=33 |issue=1 |pages=81–95 |doi=10.1016/S0020-7373(05)80116-6 |url=https://scholars.uky.edu/en/publications/the-impact-of-pascal-education-on-debugging-skill/ }}</ref> | ||
==Programming languages{{anchor|Languages}}== | ==Programming languages{{anchor|Languages}}== | ||
| Line 112: | Line 113: | ||
:*Repetition: Perform some action repeatedly, usually with some variation. | :*Repetition: Perform some action repeatedly, usually with some variation. | ||
Many computer languages provide a mechanism to call functions provided by [[shared library|shared libraries]]. Provided the functions in a library follow the appropriate run-time conventions (e.g., method of passing [[argument (computer science)|arguments]]), then these functions may be written in any other language. | Many computer languages provide a mechanism to call functions provided by [[shared library|shared libraries]]. Provided the functions in a library follow the appropriate run-time conventions (e.g., method of passing [[argument (computer science)|arguments]]), then these functions may be written in any other language. Annual rankings by IEEE Spectrum analyze programming language popularity using metrics such as job postings, search trends, and developer activity.<ref>{{cite web |title=Top Programming Languages 2024 |url=https://spectrum.ieee.org/top-programming-languages-2024 |website=IEEE Spectrum |access-date=2025-01-20}}</ref> | ||
==Learning to program== | ==Learning to program== | ||
Learning to program has a long history related to professional standards and practices, academic initiatives and curriculum, and commercial books and materials for students, self-taught learners, hobbyists, and others who desire to create or customize software for personal use. Since the 1960s, learning to program has taken on the characteristics of a ''popular movement'', with the rise of academic disciplines, inspirational leaders, collective identities, and strategies to grow the movement and make institutionalize change.<ref>{{cite book |last1=Halvorson |first1=Michael J. |title=Code Nation: Personal Computing and the Learn to Program Movement in America |date=2020 |publisher=ACM Books |location=New York, NY |pages=3–6}}</ref> Through these social ideals and educational agendas, learning to code has become important not just for scientists and engineers, but for millions of citizens who have come to believe that creating software is beneficial to society and its members. | {{see also|Computing education|List of computer books}} | ||
Learning to program has a long history related to professional standards and practices, academic initiatives and curriculum, and commercial books and materials for students, self-taught learners, hobbyists, and others who desire to create or customize software for personal use. Since the 1960s, learning to program has taken on the characteristics of a ''popular movement'', with the rise of academic disciplines, inspirational leaders, collective identities, and strategies to grow the movement and make institutionalize change.<ref>{{cite book |last1=Halvorson |first1=Michael J. |title=Code Nation: Personal Computing and the Learn to Program Movement in America |date=2020 |publisher=ACM Books |location=New York, NY |pages=3–6}}</ref> Through these social ideals and educational agendas, learning to code has become important not just for scientists and engineers, but for millions of citizens who have come to believe that creating software is beneficial to society and its members. Computer science education participation has expanded significantly in recent years, with millions of students gaining introductory programming experience through schools and online platforms.<ref>{{cite web |title=2024 State of Computer Science Education |url=https://code.org/research |website=Code.org |access-date=2025-01-20}}</ref> | |||
===Context=== | ===Context=== | ||
| Line 139: | Line 141: | ||
The PC software industry spurred the creation of numerous book publishers that offered programming primers and tutorials, as well as books for advanced software developers.<ref>{{cite book |last1=Halvorson |first1=Michael J. |title=Code Nation: Personal Computing and the Learn to Program Movement in America |date=2020 |publisher=ACM Books |location=New York, NY |page=352}}</ref> These publishers included [[Addison-Wesley]], [[IDG]], [[Macmillan Inc.]], [[McGraw-Hill]], [[Microsoft Press]], [[O'Reilly Media]], [[Prentice Hall]], Sybex, Ventana Press, Waite Group Press, [[Wiley (publisher)|Wiley]], [[Wrox Press]], and [[Ziff-Davis]]. | The PC software industry spurred the creation of numerous book publishers that offered programming primers and tutorials, as well as books for advanced software developers.<ref>{{cite book |last1=Halvorson |first1=Michael J. |title=Code Nation: Personal Computing and the Learn to Program Movement in America |date=2020 |publisher=ACM Books |location=New York, NY |page=352}}</ref> These publishers included [[Addison-Wesley]], [[IDG]], [[Macmillan Inc.]], [[McGraw-Hill]], [[Microsoft Press]], [[O'Reilly Media]], [[Prentice Hall]], Sybex, Ventana Press, Waite Group Press, [[Wiley (publisher)|Wiley]], [[Wrox Press]], and [[Ziff-Davis]]. | ||
[[Computer magazine | [[Computer magazine]]s and journals also provided learning content for professional and hobbyist programmers. A partial list of these resources includes ''[[Amiga World]]'', ''[[Byte (magazine)]]'', ''[[Communications of the ACM]]'', ''[[Computer (magazine)]]'', ''[[Compute!]]'', ''Computer Language (magazine)'', ''[[Computers and Electronics]]'', ''[[Dr. Dobb's Journal]]'', ''[[IEEE Software]]'', ''[[Macworld]]'', ''[[PC Magazine]]'', ''[[PC/Computing]]'', and ''[[UnixWorld]]''. | ||
===Digital learning / online resources=== | ===Digital learning / online resources=== | ||
| Line 145: | Line 147: | ||
Between 2000 and 2010, computer book and magazine publishers declined significantly as providers of programming instruction, as programmers moved to Internet resources to expand their access to information. This shift brought forward new digital products and mechanisms to learn programming skills. During the transition, digital books from publishers transferred information that had traditionally been delivered in print to new and expanding audiences.<ref>{{cite book |last1=Halvorson |first1=Michael J. |title=Code Nation: Personal Computing and the Learn to Program Movement in America |date=2020 |publisher=ACM Books |location=New York, NY |pages=365–368}}</ref> | Between 2000 and 2010, computer book and magazine publishers declined significantly as providers of programming instruction, as programmers moved to Internet resources to expand their access to information. This shift brought forward new digital products and mechanisms to learn programming skills. During the transition, digital books from publishers transferred information that had traditionally been delivered in print to new and expanding audiences.<ref>{{cite book |last1=Halvorson |first1=Michael J. |title=Code Nation: Personal Computing and the Learn to Program Movement in America |date=2020 |publisher=ACM Books |location=New York, NY |pages=365–368}}</ref> | ||
Important Internet resources for learning to code included blogs, wikis, videos, online databases, subscription sites, and custom websites focused on coding skills. New commercial resources included [[YouTube]] videos, Lynda.com tutorials (later [[LinkedIn Learning]]), [[Khan Academy]], [[Codecademy]], [[GitHub]], [[W3Schools]], [[Codewars]], and numerous [[ | Important Internet resources for learning to code included blogs, books,<ref>{{cite book |last1=Stemkoski |first1=L., & Pascale, M. |title=Developing Graphics Frameworks with Python and OpenGL. Taylor & Francis |date=2021 |publisher=Taylor & Francis |isbn=978-0-367-72180-0 |url=https://directory.doabooks.org/handle/20.500.12854/70094}}</ref> wikis, videos, online databases, journals,<ref>{{cite journal |last1=Berssanette |first1=J. H., & de Francisco, A. C. |title=Cognitive Load Theory in the Context of Teaching and Learning Computer Programming: A Systematic Literature Review |journal=IEEE Transactions on Education |date=August 2022 |volume=65 |issue=3 |pages=440–449 |doi=10.1109/TE.2021.3127215 |bibcode=2022ITEdu..65..440B }}</ref><ref>{{cite journal |last1=Kinnett |first1=Seth J. |last2=Shinedling |first2=Tatum |last3=Sunset |first3=Ben |title=Adventure RPG: A Text Adventure Game for an Introductory Java Programming Course |journal=Journal of Information Systems Education |date=2025-07-01 |volume=36 |issue=3 |pages=209–223 |doi=10.62273/ASHE6341 |url=https://research.ebsco.com/linkprocessor/plink?id=b4dad981-a76d-30ca-b003-cb67298436eb}}</ref> subscription sites, conference papers.<ref>{{cite book |last1=Zaffalon |first1=F. |last2=Prisco |first2=A. |last3=De Souza |first3=R. |last4=Teixeira |first4=D. |last5=Paes |first5=W. |last6=Evald |first6=P. |last7=Tonin |first7=N. |last8=Devincenzi |first8=S. |last9=Botelho |first9=S. |title=A Recommender System of Computer Programming Exercises based on Student's Multiple Abilities and Skills Model |url=https://doi.org/10.1109/FIE56618.2022.9962646 |date=2022 |pages=1–8 |doi=10.1109/FIE56618.2022.9962646 |isbn=978-1-6654-6244-0 }}</ref> and custom websites focused on coding skills. In recent years, platforms like [https://leetcode.com/ LeetCode], [https://www.hackerrank.com/ HackerRank], and [https://www.freecodecamp.org/ freeCodeCamp] have become popular for learning programming, practicing coding challenges, and preparing for technical interviews. New commercial resources included [[YouTube]] videos, Lynda.com tutorials (later [[LinkedIn Learning]]), [[Khan Academy]], [[Codecademy]], [[GitHub]], [[W3Schools]], [[Codewars]], and numerous [[coding bootcamp]]s. | ||
Most software development systems and [[game engine | Most software development systems and [[game engine]]s included rich online help resources, including [[integrated development environment]]s (IDEs), [[context-sensitive help]], [[API]]s, and other digital resources. Commercial [[software development kit]]s (SDKs) also provided a collection of software development tools and documentation in one installable package. | ||
Commercial and non-profit organizations published learning websites for developers, created blogs, and established | Commercial and non-profit organizations published learning websites for developers, created blogs, and established news feeds and social media resources about programming. Corporations like [[Apple Inc.|Apple]], [[Microsoft]], [[Oracle Corporation|Oracle]], [[Google]], and [[Amazon (company)|Amazon]] built corporate websites providing support for programmers, including resources like the [[Microsoft Developer Network]] (MSDN). Contemporary movements like Hour of Code ([[Code.org]]) show how learning to program has become associated with digital learning strategies, education agendas, and corporate philanthropy. | ||
==Programmers== | ==Programmers== | ||
| Line 166: | Line 168: | ||
*Software testing | *Software testing | ||
*[[Specification]] | *[[Specification]] | ||
{{div col end}}Although programming has been presented in the media as a somewhat mathematical subject, some research shows that good programmers have strong skills in natural human languages, and that learning to code is similar to learning a | {{div col end}}Although programming has been presented in the media as a somewhat mathematical subject, some research shows that good programmers have strong skills in natural human languages, and that learning to code is similar to learning a foreign language.<ref>{{Cite journal|last1=Prat|first1=Chantel S.|last2=Madhyastha|first2=Tara M.|last3=Mottarella|first3=Malayka J.|last4=Kuo|first4=Chu-Hsuan|date=2020-03-02|title=Relating Natural Language Aptitude to Individual Differences in Learning Programming Languages|journal=Scientific Reports|language=en|volume=10|issue=1|pages=3817|doi=10.1038/s41598-020-60661-8|pmid=32123206|issn=2045-2322|pmc=7051953|bibcode=2020NatSR..10.3817P}}</ref><ref>{{Cite web |date=2020-12-15 |title=To the brain, reading computer code is not the same as reading language |url=https://news.mit.edu/2020/brain-reading-computer-code-1215 |access-date=2023-07-29 |website=MIT News {{!}} Massachusetts Institute of Technology |language=en}}</ref> | ||
==See also== | ==See also== | ||
| Line 176: | Line 178: | ||
*[[List of software programming journals]] | *[[List of software programming journals]] | ||
*[[List of free and open-source software packages#Programming language support|List of free and open-source software packages for programming]] | *[[List of free and open-source software packages#Programming language support|List of free and open-source software packages for programming]] | ||
*[[Lists of programming software development tools]] | |||
*[[Programming best practices]] | *[[Programming best practices]] | ||
*[[Systems programming]] | *[[Systems programming]] | ||
*[[:wikibooks:Category:Subject:Computer programming|Wikibooks computer programming resources]] | |||
==References== | ==References== | ||
| Line 183: | Line 187: | ||
=== Sources === | === Sources === | ||
* {{Cite book|url=https://archive.org/details/historyofmodernc00ceru|title=History of Computing|last=Ceruzzi|first=Paul E.|publisher=MIT Press|year=1998|isbn=9780262032551|location=Cambridge, Massachusetts|url-access=registration|via=EBSCOhost}} | * {{Cite book|url=https://archive.org/details/historyofmodernc00ceru|title=History of Computing|last=Ceruzzi|first=Paul E.|publisher=MIT Press|year=1998|isbn=9780262032551|location=Cambridge, Massachusetts|url-access=registration|via=EBSCOhost}} | ||
*{{Cite book|url=https://books.google.com/books?id=C8ouDwAAQBAJ&q=9780735211759&pg=PP1|title=Broad Band: The Untold Story of the Women Who Made the Internet|last=Evans|first=Claire L.|publisher=Portfolio/Penguin|year=2018|isbn=9780735211759|location=New York}} | *{{Cite book|url=https://books.google.com/books?id=C8ouDwAAQBAJ&q=9780735211759&pg=PP1|title=Broad Band: The Untold Story of the Women Who Made the Internet|last=Evans|first=Claire L.|publisher=Portfolio/Penguin|year=2018|isbn=9780735211759|location=New York}} | ||
*{{Cite journal|last=Gürer|first=Denise|s2cid=6626310|date=1995|title=Pioneering Women in Computer Science|url=https://courses.cs.washington.edu/courses/csep590/06au/readings/p175-gurer.pdf |archive-url=https://ghostarchive.org/archive/20221009/https://courses.cs.washington.edu/courses/csep590/06au/readings/p175-gurer.pdf |archive-date=2022-10-09 |url-status=live|journal=Communications of the ACM|volume=38|issue=1|pages=45–54|doi=10.1145/204865.204875}} | *{{Cite journal|last=Gürer|first=Denise|s2cid=6626310|date=1995|title=Pioneering Women in Computer Science|url=https://courses.cs.washington.edu/courses/csep590/06au/readings/p175-gurer.pdf |archive-url=https://ghostarchive.org/archive/20221009/https://courses.cs.washington.edu/courses/csep590/06au/readings/p175-gurer.pdf |archive-date=2022-10-09 |url-status=live|journal=Communications of the ACM|volume=38|issue=1|pages=45–54|doi=10.1145/204865.204875}} | ||
*{{Cite journal|last=Smith|first=Erika E.|date=2013|title=Recognizing a Collective Inheritance through the History of Women in Computing|journal=CLCWeb: Comparative Literature | *{{Cite journal|last=Smith|first=Erika E.|date=2013|title=Recognizing a Collective Inheritance through the History of Women in Computing|journal=CLCWeb: Comparative Literature and Culture |volume=15|issue=1|pages=1–9|doi=10.7771/1481-4374.1972 |doi-access=free}} | ||
*Essinger, J., & EBSCO Publishing (Firm). (2014). ''Ada's algorithm: How lord byron's daughter ada lovelace launched the digital age''. Melville House. | *Essinger, J., & EBSCO Publishing (Firm). (2014). ''Ada's algorithm: How lord byron's daughter ada lovelace launched the digital age''. Melville House. | ||