to be a Programmer
To be a good programmer is difficult and noble. The hardest part of making real a collective vision of a software project is dealing with one's coworkers and customers. Writing computer programs is important and takes great intelligence and skill. But it is really child's play compared to everything else that a good programmer must do to make a software system that succeeds for both the customer and myriad colleagues for whom she is partially responsible. In this essay I attempt to summarize as concisely as possible those things that I wish someone had explained to me when I was twenty-one.
This is very subjective and, therefore, this essay is doomed to be personal and somewhat opinionated. I confine myself to problems that a programmer is very likely to have to face in her work. Many of these problems and their solutions are so general to the human condition that I will probably seem preachy. I hope in spite of this that this essay will be useful.
Engineering for Internet Application
This is the textbook for the MIT course "Software Engineering for Internet Applications". The course is intended for juniors and seniors in computer science. We assume that they know how to write a computer program and debug it. We do not assume knowledge of any particular programming languages, standards, or protocols. The most concise statement of the course goal is that "The student finishes knowing how to build amazon.com by him or herself."
Other people who might find this book useful include the following:
professional software developers building online communities or other multi-user Internet applications
managers who are evaluating packaged software aimed at supporting online communities?various chapters contain criteria for judging the features of products such as Microsoft Sharepoint or Microsoft Content Management Server
Programmer's Guide to the Mind
This book is a Programmer?s Guide to the Mind. In it, we will attempt to do two things: We will try to explain how the mind works, and we will also show how a person can make it operate more effectively. If we compare the task of developing the mind to that of taking a journey, then this volume could be described as a combination road map and tourist guide.
While there are many similarities between a brain and an electronic computer, there are also several factors which make the human ?computer? unique: First of all, it is rather large. The electronic chips which are contained in the computers of the 1990s are constructed from flat little squares of silicon, no bigger than postage stamps. In contrast, the human thinking apparatus is a three pound, three-dimensional, solid chunk of neurons and interconnections. The average human brain contains about one hundred billion neurons and around one hundred trillion connections.
This book is an introduction to the study of programming languages. The material has evolved from lecture notes used in a programming languages course for juniors, seniors, and graduate students at Johns Hopkins University. The book treats programming language topics from a foundational, but not formal, perspective. It is foundational in that it focuses on core concepts in language design such as functions, records, objects, and types and not directly on applied languages such as C, C++, or Java. We show how the particular core concepts are realized in these modern languages, and so the reader should emerge from this book with a stronger sense of how they are structured.
Elements of Abstract and Linear Algebra
This is my textbook Elements of Abstract and Linear Algebra. It covers abstract algebra in general, but the focus is on linear algebra. Here is a brief outline of the six chapters.
Background: Equivalence relations, injective, surjective, and bijective functions, product of sets, unique prime factorization in the integers.
Groups: Normal subgroups, quotient groups, homomorphisms, permutations and symmetric groups, product of groups
Rings: Ideals and quotient rings, Zn, homomorphisms, polynomial rings, product of rings, Chinese remainder theorem, characteristic, Boolean rings
Build a Compiler, by Jack Crenshaw
This series of articles is a tutorial on the theory and practice
of developing language parsers and compilers. Before we are finished, we will have covered every aspect of compiler
construction, designed a new programming language, and built a working compiler.
Though I am not a computer scientist by education (my Ph.D. is in a different field, Physics), I have been interested in compilers
for many years. I have bought and tried to digest the contents of virtually every book on the subject ever written. I don't
mind telling you that it was slow going. Compiler texts are written for Computer Science majors, and are tough sledding for
the rest of us. But over the years a bit of it began to seep in.
Source Development With CVS
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
Complexity of Boolean Function
Research on the complexity of Boolean functions in non-uniform computation models is now part of one of the most interesting and important areas in theoretical computer science. It has a direct relevance to practical problems in the computer aided design of digital circuits.
In this book Professor Dr. Wegener presents a large number of recent research results for the first time. Initially he deals with the well known computation models (circuits and formulae), and he goes on to special types of circuits, parallel computers, and branching programs. Basic results are included as well as the most recent research results.
The Complexity of Boolean Functions assumes a basic knowledge of computer science and mathematics. It deals with both efficient algorithms and lower bounds. At the end of each chapter there are exercises with varying levels of difficulty to help students using the book.
- Creating Applications with Mozilla
Mozilla is not just a web browser. It is also a framework for building cross-platform applications using standards such as Cascading Style Sheets (CSS), XML languages such as the XML-based User-interface Language (XUL), eXtensible Binding Language (XBL), and Resource Description Framework
(IDL). The Mozilla framework is used to create Netscape's Mozilla-based browsers (Netscape 6.x and 7.x), other browsers such as Galeon and Camino, and chat clients like ChatZilla and JabberZilla. Developers also use Mozilla to create development tools, browser enhancements, games, and other types of add-ons and applications
- Dictionary of Algorithms and Data Structures
This is a dictionary of algorithms, algorithmic techniques, data structures, archetypical problems, and related definitions. Algorithms include common functions, such as Ackermann's function. Problems include traveling salesman and Byzantine generals. Some entries have links to implementations and more information. Index pages list entries by area and by type. The two-level index has a total download 1/20 as big as this page.
Don't use this site to cheat. Teachers, contact us if we can help. To define or correct terms, please contact Paul E. Black. We need help in automata theory, combinatorics, parallel or randomized algorithms, heuristics, and quantum computing. We do not include algorithms particular to business data processing, communications, operating systems or distributed algorithms, programming languages, AI, graphics, or numerical analysis: it is tough enough covering "general" algorithms and data structures. However, if you want to tackle one of these areas, we'll consider including them.
- Handbook of Applied Cryptography
Alfred Menezes is a professor of mathematics in the Department of Combinatorics and Optimization at the University of Waterloo (Canada), where he teaches courses in cryptography, coding theory, finite fields, and discrete mathematics. He is actively involved in cryptographic research, and consults for various information security companies.
He completed the Bachelor of Mathematics and M.Math degrees in 1987 and 1989 respectively, and a Ph.D. in Mathematics from the University of Waterloo in 1992.
- Open Sources: Voices from the Open Source Revolution
Linux creator Linus Torvalds reports that the name "Linus" was chosen for him because of his parents' admiration for Nobel laureate Linus Pauling. Pauling was the rarest of men: a scientist who won the Nobel Prize not once, but twice. We find a cautionary tale for the Open Source community in the story of Pauling's foundational work that made possible the discovery of the structure of DNA.
The actual discovery was made Francis Crick and James Watson, and is famously chronicled in Watson's book The Double Helix. Watson's book is a remarkably frank account of the way science is actually done. He recounts not just the brilliance and insight, but the politics, the competition, and the luck. The quest for the secret of DNA became a fierce competition between, among others, Watson and Crick's lab in Cambridge, and Pauling's lab at Cal Tech.
The K Desktop Environment (KDE) project is a worldwide collaboration of hundreds of software engineers and hobbyists who are working to create a free, modern desktop interface with a consistent graphical user interface (GUI) style across applications. The desktop is network transparent, meaning that remote and local files can all be viewed, edited, and managed in the same way; it has online hypertext help and features an integrated, full-featured Web browser. The purpose of this book is to teach you how to take advantage of all that the KDE libraries have to offer when you write your own applications.
and Optimizing Linux
Introduction to the Linux 2.4 kernel. The latest copy of this document can be always downloaded from: http://www.moses.uklinux.net/patches/lki.sgml This guide is now part of the Linux Documentation Project and can also be downloaded in various formats from: http://www.linuxdoc.org/guides.html or can be read online (latest version) at: http://www.moses.uklinux.net/patches/lki.html This documentation is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The author is working as senior Linux kernel engineer at VERITAS Software Ltd and wrote this book for the purpose of supporting the short training course/lectures he gave on this subject, internally at VERITAS.
Compact Guide Lex and Yacc
This document explains how to construct a compiler using lex and yacc. Lex and yacc are tools used to generate lexical analyzers and parsers. I assume you can program in C, and understand data structures such as linked-lists and trees.
The Overview describes the basic building blocks of a compiler and explains the interaction between lex and yacc. The next two sections describe lex and yacc in more detail. With this background, we construct a sophisticated calculator. Conventional arithmetic operations and control statements, such as if-else and while, are implemented. With minor changes, we convert the calculator into a compiler for a stack-based machine.
textbook on the design and analysis of algorithms. The author uses a careful selection of a few topics to illustrate the tools for algorithm analysis. Recursive algorithms are illustrated by Quicksort, FFT, fast matrix multiplications, and others.
Algorithms associated with the network flow problem are fundamental in many areas of graph connectivity, matching theory, etc. Algorithms in number theory are discussed with some applications to public key encryption.
This second edition will differ from the present edition mainly in that solutions to most of the exercises will be included.
Object-oriented (OO) programming has a growing number of converts. Many people believe that object orientation will put a dent in the software crisis. There is a glimmer of hope that OO software development will become more like engineering. Objects, whatever they are now, may become for software what nuts, bolts and beams are for construction design, what 2-by-4s and 2-by-6s are for home construction, and what chips are for computer hardware construction.
However, before making this quantum leap, object-oriented methods still have to prove themselves with respect to more established software development paradigms. True, for small tasks the war is over. Object-oriented programs are more compact than classic structured programs. It is easier to whip them together using powerful class libraries.
Techniques A Practical Guide
This book treats parsing in its own right, in greater depth than is found in most computer science and linguistics books. It offers a clear, accessible, and thorough discussion of many different parsing techniques with their interrelations and applicabilities, including error recovery techniques. Unlike most books, it treats (almost) all parsing methods, not just the popular ones. See Preface + Introduction and/or Table of Contents for a quick impression.
The book features a 48 page systematic bibliography containing over 400 entries. A general context-free parser is supplied
and discussed in detail. No advanced mathematical knowledge is required; the book is based on an intuitive and engineering-like understanding of the processes involved in parsing, rather than on the set manipulations used in practice.
A short list of errata is available. Additional Keywords: information technology, user-interface design, compiler construction, natural language processing, pattern matching, artificial intelligence.
- Structure and Interpretation of Computer Programs
Structure and Interpretation of Computer Programs has had a dramatic impact on computer science curricula over the past decade. This long-awaited revision contains changes throughout the
text. There are new implementations of most of the major programming systems in the book, including the interpreters and compilers, and the authors have incorporated many small changes that reflect their experience teaching the course at MIT since the first edition was
published. A new theme has been introduced that emphasizes the central role played by different approaches to dealing with time in computational models: objects with state, concurrent programming, functional programming and lazy evaluation, and
non deterministic programming. There are new example sections on higher-order procedures in graphics and on applications of stream processing in numerical programming, and many new exercises.
- GNU Autoconf, Automake, and Libtool
Autoconf, Automake and Libtool are packages for making your software more portable and to simplify building it--usually on someone else's system. Software portability and effective build systems are crucial aspects of modern software engineering practice. It is unlikely that a software project would be started today with the expectation that the software would run on only one platform. Hardware constraints may change the choice of platform, new customers with different kinds of systems may emerge or your vendor might introduce incompatible changes in newer versions of their operating system. In addition, tools that make building software easier and less error prone are valuable.
- Compiler Construction using Flex and Bison
A computer constructed from actual physical devices is termed an actual computer or hardware computer. From the programming point of view, it is the instruction set of the hardware that defines a machine. An operating system is built on top of a machine to manage access to the machine and to provide additional services. The services provided by the operating system constitute another machine, a virtual machine.
A programming language provides a set of operations. Thus, for example, it is possible to speak of a Java computer or a Haskell computer. For the programmer, the programming language is the computer; the programming language defines a virtual computer. The virtual machine for Simple consists of a data area which contains the association between variables and values and the program which manipulates the data area.
Script Language Guide
AppleScript is a scripting system that allows you to directly control Macintosh applications, including the Mac OS itself. Instead of using a mouse, keyboard, or other input device to manipulate menus, buttons, and other interface items, you can create sets of written
instructions known as scripts--to automate repetitive tasks, customize applications, and even control complex
workflows. This document is a complete guide to the AppleScript language. It is intended for use with AppleScript version 1.3.4 or later and Mac OS 8.5.1 or later, although some descriptions and examples may work with earlier versions.
This version of the AppleScript Language Guide has been revised to cover new features in AppleScript, to include examples from the Mac OS and the Finder, to improve formatting for online viewing, and to correct errors. For a detailed listing of the changes, see Document Revision History
- SQL Guide and Reference
SQL input consists of a sequence of commands. A command is composed of a sequence of tokens, terminated by a semicolon (";"). The end of the input stream also terminates a command. Which tokens are valid depends on the syntax of the particular
command. A token can be a key word, an identifier, a quoted identifier, a literal (or constant), or a special character symbol. Tokens are normally separated by whitespace (space, tab, newline), but need not be if there is no ambiguity (which is generally only the case if a special character is adjacent to some other token type).
Additionally, SQL input may include comments. These are not tokens; they are effectively equivalent to whitespace.
- Machine Language For Beginners
Sooner or later, many programmers find that they want to learn machine language. BASIC is a fine general-purpose tool, but it has its limitations. Machine language (often called assembly language) performs much faster. BASIC is fairly easy to learn, but most beginners do not realize that machine language can also be easy. And, just as learning Italian goes faster if you already know Spanish, if a programmer already knows BASIC, much of this knowledge will make learning machine language easier. There are many similarities.
This book is designed to teach machine language to those who have a working knowledge of BASIC. For example, Chapter 9 is a list of BASIC statements. Following each is a machine language routine which accomplishes the same task. In this way, if you know what you want to do in BASIC, you can find out how to do it in machine language.
- The Art of Assembly Language Programming
The Art of Assembly Language Programming (AoA), Randy Hyde's acclaimed text on assembly language programming, is the most-often recommended book on 80x86 assembly language programming in newsgroups, on web sites, and by word of mouth.
Well, here are a few reasons:
AoA is comprehensive,
AoA is easy to read and understand,
AoA has had over 10 years refinement,
AoA teaches the fundamentals one must know to be considered an assembly language programmer, and
AoA was written by a recognized expert in x86 assembly language programming.
- On Lisp
On Lisp is a comprehensive study of advanced Lisp techniques, with bottom-up programming as the unifying theme. It gives the first complete description of macros and macro applications. The book also covers important subjects related to bottom-up programming, including functional programming, rapid prototyping, interactive development, and embedded languages. The final chapter takes a deeper look at object-oriented programming than previous Lisp books, showing the step-by-step construction of a working model of the Common Lisp Object System
(CLOS).As well as an indispensable reference, On Lisp is a source of software. Its examples form a library of functions and macros that readers will be able to use in their own Lisp programs.
- The Second Book Of Machine Language
This book shows how to put together a large machine language program. All of the fundamentals were covered in my first book, Machine Language for Beginners. What remains is to put the rules to use by constructing a working program, to take the theory into the field and show how machine language is done.Showing how to construct an assembler-written entirely in machine language would serve two useful purposes. It would illustrate advanced programming technique and also provide the reader with a powerful assembler to use in other ML
programming. This book, then, offers the reader both a detailed description of a sophisticated machine language program (the LADS assembler) and an efficient tool, a complete language with which to write other machine language programs. Every line in the LADS assembler program is described. All the subroutines are picked apart and explained. Each major routine is examined in depth.
This book is a tutorial and reference for the Ruby programming language. Use Ruby, and you'll write better code, be more productive, and enjoy programming more.
These are bold claims, but we think that after reading this book you'll agree with them. And we have the experience to back up this belief.
As Pragmatic Programmers we've tried many, many languages in our search for tools to make our lives easier, for tools to help us do our jobs better. Until now, though, we'd always been frustrated by the languages we were using.
Our job is to solve problems, not spoonfeed compilers, so we like dynamic languages that adapt to us, without arbitrary, rigid rules. We need clarity so we can communicate using our code. We value conciseness and the ability to express a requirement in code accurately and efficiently. The less code we write, the less that can go wrong. (And our wrists and fingers are thankful, too.)
- Haskell 98: A Non-strict, Purely Functional Language
In September of 1987 a meeting was held at the conference on Functional Programming Languages and Computer Architecture (FPCA '87) in Portland, Oregon, to discuss an unfortunate situation in the functional programming community: there had come into being more than a dozen non-strict, purely functional programming languages, all similar in expressive power and semantic underpinnings. There was a strong consensus at this meeting that more widespread use of this class of functional languages was being hampered by the lack of a common language. It was decided that a committee should be formed to design such a language, providing faster communication of new ideas, a stable foundation for real applications development, and a vehicle through which others would be encouraged to use functional languages. This document describes the result of that committee's efforts: a purely functional programming language called Haskell , named after the logician Haskell B. Curry whose work provides the logical basis for much of ours.
- You Should Learn to Program
This all started in 1982 in Hong Kong, where I gave a lecture to several hundred people on the educational value of learning to program. I was so enamored of the lecture that I later wrote it up as an essay that was published in some magazine somewhere (Byte? Personal Computing?). That essay became Chapter one of this book. However, Chapter One cried out for additional material, so I wrote up the other stuff. However, my agent couldn't find a publisher for it, and it languished for four or five years before it was printed by a minor publisher. I don't think that he printed the appendix. It's use of BASIC is completely obsolete, but the ideas that it presents about programming are perfectly useful even now.