42 Computing Science and Software Engineering
Agent-Based Evolutionary Game Dynamics
Authors: Luis R. Izquierdo, Segismundo S. Izquierdo, and William H. Sandholm
Description: This book is a guide to implement simple agent-based evolutionary models using NetLogo.
All the models we implement are agent-based, i.e. individual agents and their interactions are explicitly represented in the models. To formalise agents’ interactions we use the basic framework of Evolutionary Game Theory.
NetLogo is a multi-agent programmable modeling environment used by hundreds of thousands of students, teachers and researchers all around the globe. No coding experience is necessary to fully understand the contents of this book.
Book of Proof
Approved by the American Institute of Mathematics and adopted widely by other universities, this textbook is an introduction to the standard methods of proving mathematical theorems.
Includes: instructor resources, workbook.
May suit: COMP 232.
Blueprints: Creating, Describing, and Implementing Designs for Larger-Scale Software Projects – version 2.3
Author: Stephen Davies
Description: Blueprints is a concise yet comprehensive coverage of Object-Oriented Analysis and Design concepts, suitable for a second programming course in Computer Science. It introduces and teaches application development in a command-line environment, and assumes basic expertise with the Java programming language.
Includes: LaTeX source code
A Brief Introduction to Engineering Computation with MATLAB
Specifically designed for students with no programming experience, the strategic goal of the course and book is to provide learners with an appreciation for the role computation plays in solving engineering problems.
Includes: study guide, problem sets.
Computer Networks: A Systems Approach
Authors: Larry Peterson and Bruce Davie
Description: Suppose you want to build a computer network, one that has the potential to grow to global proportions and to support applications as diverse as teleconferencing, video on demand, electronic commerce, distributed computing, and digital libraries. What available technologies would serve as the underlying building blocks, and what kind of software architecture would you design to integrate these building blocks into an effective communication service? Answering this question is the overriding goal of this book—to describe the available building materials and then to show how they can be used to construct a network from the ground up.
Includes: Source text
Computer Science I – Version 1.3.7
Author: Chris Bourke
Description: This textbook covers the traditional introductory Computer Science I topics but takes a unique approach. Topics are covered in a language-agnostic manner in the first part with supplemental parts that cover the same concepts in a specific language. The current version covers C, Java, and PHP. This textbook as been used in several Computer Science I sections over multiple years at the University of Nebraska-Lincoln
Includes: Download complete Latex source code.
Computer Science 20 – Saskatoon
Through its text and videos, this resource provides an interactive experience on learning to write and execute Python code. In addition to simply executing code, there is a unique feature called codelens that allows control of the flow of execution in order to gain a better understanding of how the program works.
Includes: videos, quizzes, exercises.
The Crystal Ball Instruction Manual – version 1.1 Volume One: Introduction to Data Science
Author: Stephen Davies
Description: A perfect introduction to the exploding field of Data Science for the curious, first-time student. The author brings his trademark conversational tone to the important pillars of the discipline: exploratory data analysis, choices for structuring data, causality, machine learning principles, and introductory Python programming using open-source Jupyter Notebooks. This engaging read will allow any dedicated learner to build the skills necessary to contribute to the Data Science revolution, regardless of background.
Includes: LaTeX source code
Database Design
An introductory textbook that covers database systems and database design concepts.
Includes: end-of-chapter exercises, sample ERD exercises, SQL lab with solution.
May suit: COMP 353.
Defend Dissent
Author: Glencora Borradaile
Description: Defend Dissent is an introduction to cryptography paired with the social impacts of surveillance and the protective potential of encryption, with a focus on US social movements. Each chapter ends with a story that brings social context to the material—from surveillance used against contemporary US protests to the African National Congress’s use of partially manual encryption in fighting apartheid in South Africa in the 80s.
This book can be read linearly, or you can pick and choose what you would like to learn about. Each chapter is prefaced with what you should read first (for background) and concludes with what you might want to read next.
Delftse Foundations of Computation
The textbook is designed for an introductory course in theoretical computer science. It includes topics from propositional and predicate logic, proof techniques, set theory and the theory of computation, along with practical applications to computer science.
May suit: COMP 335.
The Discipline of Organizing: 4th Professional Edition
Author: Robert J. Glushko
Description: We organize things, we organize information, we organize information about things, and we organize information about information. But even though “organizing” is a fundamental and ubiquitous challenge, when we compare these activities their contrasts are more apparent than their commonalities. We propose to unify many perspectives about organizing with the concept of an Organizing System, defined as an intentionally arranged collection of resources and the interactions they support. Every Organizing System involves a collection of resources, a choice of properties or principles used to describe and arrange resources, and ways of supporting interactions with resources. By comparing and contrasting how these activities take place in different contexts and domains, we can identify patterns of organizing. We can create a discipline of organizing in a disciplined way.
The 4th edition builds a bridge between organizing and data science. It reframes descriptive statistics as organizing techniques, expands the treatment of classification to include computational methods, and incorporates many new examples of data-driven resource selection, organization, maintenance, and personalization. It introduces a new “data science” category of discipline-specific content, both in the chapter text and in endnotes, marked with [DS] in editions that contain endnotes.
Discrete Mathematics: An Open Introduction
Approved by the American Institute of Mathematics, this textbook grew out of a discrete mathematics course at the University of Northern Colorado.
Includes: questions, answers, instructor resources upon request.
May suit: COEN 231.
Eloquent JavaScript: A Modern Introduction to Programming
This book covers the principles of programming and introduces JavaScript. It is written by a programming language enthusiast.
Includes: Code sandbox and exercise solutions.
May suit: SOEN 287.
Foundations of Computation
The textbook is designed for a one-semester course in theoretical computer science.
May suit: COMP 335.
Introduction to Computer Graphics
Author: David J. Eck
Description: Introduction to Computer Graphics is a free, on-line textbook covering the fundamentals of computer graphics and computer graphics programming. This book is meant for use as a textbook in a one-semester course that would typically be taken by undergraduate computer science majors in their third or fourth year of college.
Includes: Source code files, copy of book website
An Introduction to Computer Networks – Second Edition
Author: Peter Lars Dorda
Description: An Introduction to Computer Networksis a free and open general-purpose computer-networking textbook, complete with diagrams and exercises.It covers the LAN, internetworking and transport layers, focusing primarily on TCP/IP. Particular attention is paid to congestion; other special topics include queuing, real-time traffic, network management, security and the ns simulator.
The book is suitable as the primary text for an undergraduate or introductory graduate course in computer networking, as a supplemental text for a wide variety of network-related courses, and as a reference work.
Introduction to Probability
The textbook is intended for use in a standard one-term course, in which both discrete and continuous probability is covered.
Includes: exercises and solutions.
May suit: COMP 233.
Introduction to Probability, Statistics and Random Processes
This textbook is intended for undergraduate and first-year graduate-level courses in probability, statistics, and random processes.
Includes: exercises, solutions, code.
May suit: COMP 233.
Introduction to Programming Using Java, Eighth Edition
Author: David J. Eck
Description: Welcome to the Eighth Edition of Introduction to Programming Using Java, a free, on-line textbook on introductory programming, which uses Java as the language of instruction. This book is directed mainly towards beginning programmers, although it might also be useful for experienced programmers who want to learn something about Java. It is not meant to provide complete coverage of the Java language.
The eighth edition requires Java 8 or later, and it uses JavaFX for GUI programming. Version 8.1 is a small update of Version 8.0. This version briefly covers some of the new features in Java 11 and makes it clearer how to use this book with Java 11 and later.
Includes: Source code, exercise solutions, Source files for the book
Java, Java, Java: Object-Oriented Problem Solving
Authors: Ralph Morelli, Ralph Walde
Description: We have designed this third edition of Java, Java, Java to be suitable for a typical Introduction to Computer Science (CS1) course or for a slightly more advanced Java as a Second Language course. This edition retains the “objects first” approach to programming and problem solving that was characteristic of the first two editions. Throughout the text we emphasize careful coverage of Java language features, introductory programming concepts, and object-oriented design principles.
The third edition retains many of the features of the first two editions, including:
- Early Introduction of Objects
- Emphasis on Object Oriented Design (OOD)
- Unified Modeling Language (UML) Diagrams
- Self-study Exercises with Answers
- Programming, Debugging, and Design Tips.
- From the Java Library Sections
- Object-Oriented Design Sections
- End-of-Chapter Exercises
- Companion Web Site, with Power Points and other Resources
The In the Laboratory sections from the first two editions have been moved onto the book’s Companion Web Site.
Includes: self-study exercises with answers, end-of-chapter exercises, and a companion website with instructor resources upon request
Mathematical Reasoning: Writing and Proof
This textbook is designed for the ﬁrst course in a mathematics curriculum that introduces students to the processes of constructing and writing proofs. It focuses on the formal development of mathematics.
Includes: questions, answers, instructor resources upon request.
May suit: COMP 232.
The Missing Link: An Introduction to Web Development and Programming
This textbook provides the developer with an understanding of the various elements of web development by focusing on the concepts and fundamentals through the examples within, providing a foundation that allows easier transition to other languages and a better understanding of how to approach their work.
Includes: questions, discussions, solutions.
May suit: SOEN 287.
A Person-Centered Guide to Demystifying Technology
Editor: Martin Wolske
Contributors: Betty Bayer, Henry Grob, Sara Rasmussen, Dinesh Rathi, Stephanie Shallcross, and Vandana Singh
Description: Digital technologies old and new are not objects that can be packed inside a box. They are a seamless, indivisible combination of people, organizations, policies, economies, histories, cultures, knowledge, and material things that are continuously shaped and reshaped. Every one of us innovates-in-use our everyday technologies, we just do not always know it. Not only are we shaped by the networked information tools in our midst, but we shape them and thereby shape others. For us to advance individual agency across diverse community knowledge and cultural wealth within the fabric of communities, we need to nurture our cognitive, socio-emotional, information, and progressive community engagement skills along with, and sometimes in advance of, our technical skills which then serve as just-in-time in-fill learning. This is the call placed by Rev. Dr. Martin Luther King, Jr. – to rapidly shift from a ‘thing-oriented’ society to a ‘person-oriented’ society. In support of this shift, each session of the book begins first with a social chapter with background knowledge probe, conceptual introductions, and a lesson plan for the session. A technical chapter follows with technical introductions and hands-on activities, and a concluding wrap up and comprehension check. The technical of the Orange Unit especially focuses on electronics and physical computer components; the Blue Unit highlights software through a series of introductory programming activities, with possibilities for alternate pathways for those who bring in some existing programming experience; the Rainbow Unit then brings the hardware and software together into networked systems, concluding with a final design adventure. The general learning outcome objectives of this book are to help readers: • Develop a clear hands-on working understanding of the physical and software layers of computers and networks; • Evolve a more holistic and nuanced understanding of the sociotechnical artifacts we use as a daily part of our professional lives; • Develop a critical approach to sociotechnical artifacts to counter systemic injustices related to race, class/caste, gender, and other cultural dynamics; and • Advance community agency in appropriating technology to achieve our individual and community development goals through a reconsidered digital literacy learning and practice.
Programming Fundamentals – A Modular Structured Approach, 2nd Edition
This is the second edition to Programming Fundamentals – A Modular Structured Approach using C++. The goal is to make it programming-language neutral, so that it may serve as an introductory programming textbook for students using any of a variety of programming languages, including C++, C#, Java, JavaScript, Python, and Swift.
Includes: pseudocode, flowcharts, and example code in C++, C#, Java, JavaScript, Python, and Swift.
May suit: COMP 348
Programming Fundamentals – A Modular Structured Approach using C++
This reviewed open textbook covers content normally found in an introductory C++ programming course, including decisions, loops, functions, arrays and file I/O.
Includes: instructor and student resources.
May suit: COMP 348
Programming Languages: Application and Interpretation
Written by a computer science professor at Brown University, this textbook takes a non-linear approach to the subject matter.
Includes: exercises and activities.
May suit: COMP 348
Project Management: A Strategic Approach
Author: Associate Professor Carmen Reaiche
Description: Project management is becoming a core competence and not just about managing processes to ensure that the strategic goals of a business are delivered on time, within budget and specification. These days, project management is more about managing strategic goals while adapting to change and responding to ongoing disruptions. The pandemic, rapid urbanisation, digital transformation and environmental challenges are only some of the types of disruption faced by contemporary businesses. It is up to the project manager to ensure that the project management processes, as well as the projects and/or services themselves, are part of the readjustment required for business to survive these new challenges. This freely available ebook introduces some of the core values, concepts and tools as recognised by the Project Management Institute (PMI). This book will be of value to both students and practitioners in Australia and overseas seeking professional development in the field of project management.
Python for Everybody: Exploring Data Using Python 3
Author: Charles Severance
Description: I never seemed to find the perfect data-oriented Python book for my course, so I set out to write just such a book. Luckily at a faculty meeting three weeks before I was about to start my new book from scratch over the holiday break, Dr. Atul Prakash showed me the Think Python book which he had used to teach his Python course that semester. It is a well-written Computer Science text with a focus on short, direct explanations and ease of learning.The overall book structure has been changed to get to doing data analysis problems as quickly as possible and have a series of running examples and exercises about data analysis from the very beginning.
Chapters 2–10 are similar to the Think Python book, but there have been major changes. Number-oriented examples and exercises have been replaced with data- oriented exercises. Topics are presented in the order needed to build increasingly sophisticated data analysis solutions. Some topics like try and except are pulled forward and presented as part of the chapter on conditionals. Functions are given very light treatment until they are needed to handle program complexity rather than introduced as an early lesson in abstraction. Nearly all user-defined functions have been removed from the example code and exercises outside of Chapter 4. The word “recursion”1 does not appear in the book at all.
In chapters 1 and 11–16, all of the material is brand new, focusing on real-world uses and simple examples of Python for data analysis including regular expressions for searching and parsing, automating tasks on your computer, retrieving data across the network, scraping web pages for data, object-oriented programming, using web services, parsing XML and JSON data, creating and using databases using Structured Query Language, and visualizing data.
The ultimate goal of all of these changes is a shift from a Computer Science to an Informatics focus is to only include topics into a first technology class that can be useful even if one chooses not to become a professional programmer.
Includes: YouTube Playlist, Audio lectures, lectures slides and handouts, sample code, lessons
Squeak by Example
Authors: Andrew P. Black, Stéphane Ducasse, Oscar Nierstrasz, Damien Pollet.
Description: Squeak is a modern open-source development environment for the classic Smalltalk-80 programming language. Despite being the first purely object-oriented language and environment, Smalltalk is in many ways still far ahead of its successors in promoting a vision of an environment where everything is an object, and anything can change at run-time.
Squeak by Example, intended for both students and developers, will guide you gently through the Squeak language and environment by means of a series of examples and exercises. The book helps you get started with A Quick Tour of Squeak and guides you through A First Application. The Smalltalk language is introduced in three chapters on Syntax in a Nutshell, Understanding Message Syntax and The Smalltalk Object Model.
Development with Squeak is covered in The Squeak Programming Environment and SUnit. Several of the key classes are presented in chapters on Basic Classes, Collections, Streams and Morphic.
The first edition of the book concludes with chapters on Classes and Metaclasses and Frequently Asked Questions.
Includes: LaTeX source code
A Tale of Two Systems
Authors: René Reitsma and Kevin Krueger
Description: This text is meant as a case study and companion text to many Systems Analysis & Design textbooks used in undergraduate Management Information Systems (MIS), Business Information Systems (BIS) and Computer Information Systems (CIS) programs. The US counts about 1,300 (undergraduate + graduate) such programs (Mandiwalla et al., 2016). These texts typically contain short descriptions of technologies which give students some sense of what these technologies are used for, but do not provide much context or reflection on why these technologies might or might not be applied and what such applications actually amount to in real life. As a consequence, students, having worked their way through these textbooks and associated courses will have had little exposure to the reasoning which must take place when making choices between these technologies and to what goes into combining them into working and successful system architectures. It is our hope that this Tale of Two Systems (pun very much intended) will help mitigate this problem a little.
Think Data Structures
Author: Allen B. Downey
Description: Data structures and algorithms are among the most important inventions of the last 50 years, and they are fundamental tools software engineers need to know. But in my opinion, most of the books on these topics are too theoretical, too big, and too bottom-up:
- Too theoretical: Mathematical analysis of algorithms is based on simplifying assumptions that limit its usefulness in practice. Many presentations of this topic gloss over the simplifications and focus on the math. In this book I present the most practical subset of this material and eliminate the rest.
- Too big: Most books on these topics are at least 500 pages, and some are more than 1000. By focusing on the topics I think are most useful for software engineers, I kept this book under 250 pages.
- Too bottom-up: Many data structures books focus on how data structures work (the implementations), with less about how to use them (the interfaces). In this book, I go “top down”, starting with the interfaces. Readers learn to use the structures in the Java Collections Framework before getting into the details of how they work.
Finally, many present this material out of context and without motivation: it’s just one damn data structure after another!
I try to alleviate the boredom by organizing the topics around an application—web search—that uses data structures extensively, and is an interesting and important topic in its own right.
This application also motivates some topics that are not usually covered in an introductory data structures class, including persistent data structures, with Redis, and streaming algorithms.
I have made difficult decisions about what to leave out, but I have made some compromises. I include a few topics that most readers will never use, but that they might be expected to know, possibly in a technical interview. For these topics, I present both the conventional wisdom as well as my reasons to be skeptical.
This book also presents basic aspects of software engineering practice, including version control and unit testing. Each chapter ends with an exercise that allows readers to apply what they have learned. Each exercise includes automated tests that check the solution. And for most exercises, I present my solution at the beginning of the next chapter.
This book is intended for college students in computer science and related fields, as well as professional software engineers, people training in software engineering, and people preparing for technical interviews.
I assume that the reader knows Java at an intermediate level, but I explain some Java features along the way, and provide pointers to supplementary material.
People who have read Think Java or Head First Java are prepared for this book.
This book is available under a Creative Commons license, which means that you are free to copy, distribute, and modify it, as long as you attribute the source and don’t use it for commercial purposes.
Includes: LaTeX source code
Think OS
Author: Allen B. Downey
Description: Think OS is an introduction to Operating Systems for programmers.
In many computer science programs, Operating Systems is an advanced topic. By the time students take it, they usually know how to program in C, and they have probably taken a class in Computer Architecture. Usually the goal of the class is to expose students to the design and implementation of operating systems, with the implied assumption that some of them will do research in this area, or write part of an OS.
This book is intended for a different audience, and it has different goals. I developed it for a class at Olin College called Software Systems.
Most students taking this class learned to program in Python, so one of the goals is to help them learn C. For that part of the class, I use Griffiths and Griffiths, Head First C, from O’Reilly Media. This book is meant to complement that one.
Few of my students will ever write an operating system, but many of them will write low-level applications in C, and some of them will work on embedded systems. My class includes material from operating systems, networks, databases, and embedded systems, but it emphasizes the topics programmers need to know.
This book does not assume that you have studied Computer Architecture. As we go along, I will explain what we need.
If this book is successful, it should give you a better understanding of what is happening when programs run, and what you can do to make them run better and faster.
The current version of this book is a draft. While I am working on the text, I have not yet included the figures. So there are a few places where, I’m sure, the explanation will be greatly improved when the figures are ready.
Think OS is a Free Book. It is available under the Creative Commons Attribution-NonCommercial 3.0 Unported License, which means that you are free to copy, distribute, and modify it, as long as you attribute the work and don’t use it for commercial purposes.
Includes: Source code
Think Python 2e
Author: Allen B. Downey
Description: Think Python is an introduction to Python programming for beginners. It starts with basic concepts of programming, and is carefully designed to define all terms when they are first used and to develop each new concept in a logical progression. Larger pieces, like recursion and object-oriented programming are divided into a sequence of smaller steps and introduced over the course of several chapters.
What’s new in the second edition?
- We’ve upgraded to Python 3: All examples in the book are now Python 3, and the supporting code has been updated to run in both Python 2 and 3.
- We’ve removed the roadblocks: Based on reader feedback, we know where people had problems, so we’ve fixed or removed the pain points.
- Python in the browser: For beginners, one of the challenges of getting started is installing Python. For readers who don’t want to install Python right away, we provide instructions for running Python in a browser using PythonAnywhere, a free online programming environment.
- More Python goodies: We’ve added a chapter to cover some powerful Python features that didn’t make it into the first edition, including list comprehensions and additional data structures.
Think Python 2e is a Free Book. It is available under the Creative Commons Attribution-NonCommercial 3.0 Unported License, which means that you are free to copy, distribute, and modify it, as long as you attribute the work and don’t use it for commercial purposes.
Includes: LaTeX source code, code examples and exercise solutions.
Think Raku: How to Think Like a Computer Scientist – 2nd edition
Authors: Laurent Rosenfeld and Allen Downey
Description: Think Raku is an introduction to computer science and programming intended for people with little or no experience.
This aim of this book is not primarily to teach Raku, but instead to teach the art of programming, using the Raku language. After having completed this book, you should hopefully be able to write programs to solve relatively difficult problems in Raku, but my main aim is to teach computer science, software programming, and problem solving rather than solely to teach the Raku language itself.
Think Raku is a free book available under a Creative Commons license. Readers are free to copy and distribute the text; they are also free to modify it, which allows them to adapt the book to different needs, and to help develop new material.
Includes: LaTeX source code
Think Stats: Probability and Statistics for Programmers
The book is an introduction to the practical tools of exploratory data analysis, especially for Python programmers.
Includes: exercises, experiments, code.